← luna

Commit 34b681d

0
files
+0
added
-0
deleted
@@ -1,89 +0,0 @@
1 -# Architektura libLuny
2 -
3 -Nazewnictwo projektu (analogia do GTK / GNOME / Mutter):
4 -
5 -| Warstwa | Odpowiednik GNOME | Odpowiednik KDE | Nasza nazwa |
6 -|---|---|---|---|
7 -| Toolkit (biblioteka) | GTK | Qt | **libLuna** |
8 -| Środowisko / powłoka | GNOME | KDE Plasma | **Luna** |
9 -| Kompozytor Wayland | Mutter | KWin | **Selene** |
10 -
11 -## 1. Warstwy (mapowanie pojęć GTK/GDK/Gsk/libadwaita → libLuna)
12 -
13 -| Rola | Odpowiednik w GTK/Adw | Moduł libLuny | Stan |
14 -|---|---|---|---|
15 -| Prymitywy: geometria, kolor, skala, zdarzenia, tokeny | grunt/pango types | `libluna-core` | ✅ M0 |
16 -| Rysowanie 2D, buforowanie, clip | Gsk (+Cairo) | `libluna-render` | ✅ M0 |
17 -| Tekst: shaping, metryki, rasteryzacja | Pango | `libluna-render::text` (fontdue) | ✅ M0 (docelowo cosmic-text) |
18 -| Warstwa platformy / okna / wejście | GDK | `libluna-platform` | ✅ M0 |
19 -| Silnik układu (measure/allocate) | GtkLayoutManager | `libluna-layout` | ⏳ M2 |
20 -| Widgety bazowe | Gtk* | `libluna-widgets` | ⏳ M2–M3 |
21 -| Zestaw „libadwaita” (Card, HeaderBar, Sidebar…) | libadwaita | `libluna-adwaita` | ⏳ M4–M5 |
22 -| Pętla zdarzeń i aplikacja | GtkApplication / GMainLoop | `libluna-app` | ⏳ M4 |
23 -
24 -Fasada `libluna` (crate `crates/libluna`) zbiera warstwy w jedno wejście dla aplikacji.
25 -
26 -## 2. Decyzja (podjęta): czysty Rust
27 -
28 -Wybraliśmy **czysty Rust**, bez GObject/glib i bez GTK/Qt. Uzasadnienie:
29 -
30 -- **Lekkość**: brak runtime glib/gobject; statycznie linkowany, mały zestaw zależności.
31 -- **Bezpieczeństwo**: zarządzanie pamięcią przez kompilator zamiast ręcznego refcountingu.
32 -- **Nowoczesny toolchain**: `cargo` + `clippy` + `rustfmt`.
33 -- **Integracja**: kompozytor Selene jest zwykłym serwerem Wayland, więc wystarczy standardowy
34 - protokół (`xdg-shell`, a dla paneli `wlr-layer-shell`).
35 -
36 -Rozważane, odrzucone alternatywy:
37 -
38 -- **C + GObject + Cairo/Pango** — natywne dla obecnego KartONDE i najtańsze w migracji, ale
39 - zostaje w świecie glib i wciąga ciężki GObject.
40 -- **Rust + C ABI / mostek GObject** — daje nowoczesny rdzeń, lecz dodaje dwie granice FFI.
41 -
42 -## 3. Rysowanie i tekst
43 -
44 -- **Graf sceny** (`libluna-render::scene`) jest niezależny od backendu; budują go widgety.
45 -- **Backend M0**: CPU (`tiny-skia`) z antyaliasingiem — kształty, zaokrąglenia, obramowania,
46 - linie, clip. Bufor RGBA8888 trafia w `wl_shm` (konwersja do BGRA/`Argb8888`).
47 -- **Tekst M0**: `fontdue` (font Adwaita Sans z systemu). To świadome uproszczenie — bez
48 - kerningu i pism złożonych. Docelowo `cosmic-text` (shaping, fallback fontów), bez zmiany
49 - kontraktu `measure`/`draw`.
50 -- Później: opcjonalny backend GPU i śledzenie uszkodzeń (damage) do minimalizacji odświeżeń.
51 -
52 -## 4. Model widgetu (wspólny dla wszystkich warstw)
53 -
54 -```
55 -Widget:
56 - measure(constraints) -> Size // faza 1: ile chce
57 - allocate(rect) // faza 2: gdzie trafia
58 - draw(scene, theme) // rysowanie sceny
59 - handle(event) -> Handled | Propagate // wejście
60 - focus/grab/hover state
61 -```
62 -
63 -- Layout: dwuprzebiegowy **measure/allocate** (jak GTK/Flutter) — przewidywalny i prosty.
64 -- Wejście: jedno drzewo zdarzeń, propagacja od liści wzwyż, fokus klawiatury, grab wskaźnika.
65 -
66 -## 5. Komunikacja z kompozytorem (Selene)
67 -
68 -- Okna aplikacji: `xdg-shell` z dekoracjami po stronie klienta (CSD) — sami rysujemy HeaderBar.
69 -- Panele/powłoka: `wlr-layer-shell` (jak `karton-shell`).
70 -- Do rozważenia później: `xdg-decoration`, `fractional-scale-v1`, `viewporter`,
71 - `foreign-toplevel-management` (integracja z panelem zadań), `idle-inhibit`.
72 -- Buforowanie: start od `wl_shm` (CPU), później opcjonalny backend EGL/`wl_drm`.
73 -
74 -## 6. Motywowanie
75 -
76 -- Tokeny: `spacing` (3/6/12/18/24), `radius` (6/9/12/pill), `typography`
77 - (title/heading/body/caption), **metryki kontrolek** (`Metrics`) oraz palety `light`/`dark` + `accent`.
78 -- Warstwa „adwaita-look”: karty, listy, nagłówki, przyciski, przełączniki — zgodne
79 - wizualnie z makietami.
80 -- Geometria kontrolek nie jest już stałą w widgetach — wynika z `Theme::metrics`, więc styl
81 - steruje też rozmiarami (HeaderBar, Switch, Button…).
82 -- Opcjonalnie później: mini-podzbiór CSS po klasach stylu; tokeny mają pierwszeństwo.
83 -
84 -## 7. Świadomie odłożone (poza MVP)
85 -
86 -- Dostępność: AT-SPI (przez D-Bus) — niezbędna dla realnego pulpitu, ale faza późniejsza.
87 -- IME / `text-input-v3`, klawiatura wirtualna.
88 -- Schowek (`wl_data_device`), drag & drop.
89 -- Animacje i easing, backend GPU.
90 0 deleted file mode 100644
@@ -1,55 +0,0 @@
1 -# Selene — protokoły i droga do pełnego kompozytora
2 -
3 -Selene nie używa Smithery: protokół obsługujemy własną warstwą na `wayland-server`.
4 -Ten plik jest **żywą listą** tego, co już działa, i tego, co jeszcze dzieli nas od
5 -kompozytora, na którym codzienna praca nie wymaga obejść.
6 -
7 -## Działa
8 -
9 -| Protokół / funkcja | Uwagi |
10 -|---|---|
11 -| `wl_compositor` v4 | `wl_surface`, regiony, damage, frame-callbacki |
12 -| `wl_subcompositor` v1 | powierzchnie potomne: `sync`/`desync`, pozycja, kolejność stosu, składanie z alfą |
13 -| `wl_shm` v1 | ARGB/XRGB/ABGR/XBGR → RGBA, pula z `resize` |
14 -| `wl_output` v4 | geometria, tryb, skala 1×, nazwa, `done` |
15 -| `wl_seat` v5 | pointer + keyboard, `frame`, powtórzenia klawiszy, XKB (pl/en/de) |
16 -| `wl_data_device_manager` v3 | schowek i drag & drop wewnątrz sesji |
17 -| `xdg_wm_base` v1 | toplevel, popup, pełny `xdg_positioner` (kotwica, grawitacja, flip/slide) |
18 -| `zxdg_decoration_manager_v1` | polityka: zawsze SSD (albo `LUNA_CLIENT_DECORATIONS=1`) |
19 -| `zwlr_layer_shell_v1` v4 | panele, tło, OSD; region wejścia z alfy |
20 -| `zwlr_foreign_toplevel_manager_v1` v3 | pasek zadań: tytuł, stan, aktywacja, zamknięcie |
21 -| `ext_workspace_manager_v1` | przestrzenie robocze |
22 -| `xwayland_shell_v1` + XWM | okna X11, `_NET_WM_STATE`, ramki, menu X11 |
23 -| `xdg_surface.set_window_geometry` | widoczny prostokąt vs bufor z cieniami CSD |
24 -| multi-monitor | obszary robocze per wyjście, panel rezerwuje miejsce tylko u siebie |
25 -
26 -## Braki — kolejność wg wpływu na codzienną pracę
27 -
28 -1. **`xdg_activation_v1`** — przenoszenie fokusu przy uruchamianiu z portali/paska.
29 - Bez tego nowe okno bywa za innym i trzeba go szukać.
30 -2. **`wl_pointer.set_cursor` + `wp_cursor_shape_v1`** — własne kursory klienta
31 - (I-beam, łapka, strzałki resize). Dziś zawsze rysujemy kursor systemowy.
32 -3. **`zwp_primary_selection_v1`** — wklejanie środkowym przyciskiem (terminale).
33 -4. **`zwp_pointer_constraints_v1` + `zwp_relative_pointer_v1`** — gry, mouselook,
34 - blokada kursora.
35 -5. **`zwp_text_input_v3` + input-method** — IME (CJK, kompozycja znaków).
36 -6. **`wp_viewporter` + `wp_fractional_scale_v1`** — skalowanie 1,25/1,5× bez rozmycia.
37 -7. **`zwp_linux_dmabuf_v1`** — zero-copy z GPU. **Największa luka:** klienty Vulkan/EGL
38 - (Zed natywnie na Waylandzie, hardware video) potrzebują importu dmabuf (GBM/EGL),
39 - a nasz renderer jest CPU. Do zaplanowania razem z back-endem GPU.
40 -8. **`zwp_idle_inhibit_v1`** — odtwarzacze wideo i prezentacje nie pozwalają wygasić ekranu.
41 -9. **`wp_tearing_control_v1`** — brak vsync dla gier (opcjonalnie).
42 -10. **`xdg_toplevel` v2+** — `wm_capabilities`, `configure_bounds`, stan `tiled`;
43 - dziś ogłaszamy v1, więc klienty nie dostają pełnej informacji o kafelkowaniu.
44 -11. **`buffer_scale` / `buffer_transform`** — całkowite HiDPI i obrót ekranu.
45 -12. **`ext_session_lock` / screencopy** — blokada sesji i zrzuty ekranu aplikacji.
46 -
47 -## Znane problemy do zbadania
48 -
49 -- **Zed przez XWayland potrafi „zjeść” cały rdzeń** (97% CPU, kilka GB RAM) mimo
50 - poprawnego UI. Podejrzenie: pętla `ConfigureNotify`/expose w XWM albo brak
51 - `_NET_WM_SYNC_REQUEST`. Do reprodukcji na izolowanej sesji z `DISPLAY` Xwaylanda.
52 -- X11: model okna używa rozmiaru bufora (z 2 px obramowaniem X11), więc po
53 - maksymalizacji szerokość bywa o 2 px większa niż ekran. Kosmetyczne.
54 -- `xdg_popup` nie obsługuje jeszcze `reposition`/`reactive` (przestawianie już
55 - otwartego menu przy zmianie rozmiaru rodzica).
56 0 deleted file mode 100644
57 1 Binary files a/docs/images/demo-montage.png and /dev/null differ
58 2 deleted file mode 100644
59 3 Binary files a/docs/images/demo-step-1.png and /dev/null differ
60 4 deleted file mode 100644
61 5 Binary files a/docs/images/demo-step-10.png and /dev/null differ
62 6 deleted file mode 100644
63 7 Binary files a/docs/images/demo-step-11.png and /dev/null differ
64 8 deleted file mode 100644
65 9 Binary files a/docs/images/demo-step-12.png and /dev/null differ
66 10 deleted file mode 100644
67 11 Binary files a/docs/images/demo-step-13.png and /dev/null differ
68 12 deleted file mode 100644
69 13 Binary files a/docs/images/demo-step-14.png and /dev/null differ
70 14 deleted file mode 100644
71 15 Binary files a/docs/images/demo-step-15.png and /dev/null differ
72 16 deleted file mode 100644
73 17 Binary files a/docs/images/demo-step-16.png and /dev/null differ
74 18 deleted file mode 100644
75 19 Binary files a/docs/images/demo-step-2.png and /dev/null differ
76 20 deleted file mode 100644
77 21 Binary files a/docs/images/demo-step-3.png and /dev/null differ
78 22 deleted file mode 100644
79 23 Binary files a/docs/images/demo-step-4.png and /dev/null differ
80 24 deleted file mode 100644
81 25 Binary files a/docs/images/demo-step-5.png and /dev/null differ
82 26 deleted file mode 100644
83 27 Binary files a/docs/images/demo-step-6.png and /dev/null differ
84 28 deleted file mode 100644
85 29 Binary files a/docs/images/demo-step-7.png and /dev/null differ
86 30 deleted file mode 100644
87 31 Binary files a/docs/images/demo-step-8.png and /dev/null differ
88 32 deleted file mode 100644
89 33 Binary files a/docs/images/demo-step-9.png and /dev/null differ
90 34 deleted file mode 100644
91 35 Binary files a/docs/images/gallery.png and /dev/null differ
92 36 deleted file mode 100644
93 37 Binary files a/docs/images/icons.png and /dev/null differ
94 38 deleted file mode 100644
95 39 Binary files a/docs/images/layout-nord.png and /dev/null differ
96 40 deleted file mode 100644
97 41 Binary files a/docs/images/layout.png and /dev/null differ
98 42 deleted file mode 100644
99 43 Binary files a/docs/images/luna-desktop.png and /dev/null differ
100 44 deleted file mode 100644
101 45 Binary files a/docs/images/luna-launcher-carousel.png and /dev/null differ
102 46 deleted file mode 100644
103 47 Binary files a/docs/images/luna-launcher-grid.png and /dev/null differ
104 48 deleted file mode 100644
105 49 Binary files a/docs/images/luna-launcher-list.png and /dev/null differ
106 50 deleted file mode 100644
107 51 Binary files a/docs/images/luna-logo.png and /dev/null differ
108 52 deleted file mode 100644
109 53 Binary files a/docs/images/luna-osd.png and /dev/null differ
110 54 deleted file mode 100644
111 55 Binary files a/docs/images/luna-panel-idle.png and /dev/null differ
112 56 deleted file mode 100644
113 57 Binary files a/docs/images/luna-popup-calendar.png and /dev/null differ
114 58 deleted file mode 100644
115 59 Binary files a/docs/images/luna-popup-session.png and /dev/null differ
116 60 deleted file mode 100644
117 61 Binary files a/docs/images/luna-popup-volume.png and /dev/null differ
118 62 deleted file mode 100644
119 63 Binary files a/docs/images/luna-popup-wifi.png and /dev/null differ
120 64 deleted file mode 100644
121 65 Binary files a/docs/images/new-widgets.png and /dev/null differ
122 66 deleted file mode 100644
123 67 Binary files a/docs/images/quick-panel.png and /dev/null differ
124 68 deleted file mode 100644
125 69 Binary files a/docs/images/settings-dark.png and /dev/null differ
126 70 deleted file mode 100644
127 71 Binary files a/docs/images/settings-de-dark.png and /dev/null differ
128 72 deleted file mode 100644
129 73 Binary files a/docs/images/settings-fr.png and /dev/null differ
130 74 deleted file mode 100644
131 75 Binary files a/docs/images/settings-light.png and /dev/null differ
132 76 deleted file mode 100644
133 77 Binary files a/docs/images/settings-nord.png and /dev/null differ
134 78 deleted file mode 100644
135 79 Binary files a/docs/images/settings-paper.png and /dev/null differ
136 80 deleted file mode 100644
137 81 Binary files a/docs/images/styles.png and /dev/null differ
138 82 deleted file mode 100644
139 83 Binary files a/docs/images/widgets.png and /dev/null differ
140 84 deleted file mode 100644
@@ -1,246 +0,0 @@
1 -# Roadmap libLuny
2 -
3 -Kamienie milowe są ułożone tak, aby **każdy kolejny etap dał się uruchomić i zobaczyć**,
4 -a na końcu odtworzył realne aplikacje środowiska Luna z makiet.
5 -
6 -## M0 — Fundament (szkielet + pierwsze okno) — ✅ UKOŃCZONE
7 -- Struktura workspace (cargo), build, `clippy`, `rustfmt`, testy.
8 -- `libluna-core`: geometria (`Point/Size/Rect/Insets`), kolor, skala ekranu, typy zdarzeń,
9 - tokeny stylu (spacing/radius/typografia/paleta light+dark).
10 -- `libluna-render`: graf sceny + backend CPU (`tiny-skia`), tekst (`fontdue`), clip, linie.
11 -- `libluna-platform`: połączenie Wayland, `xdg-shell` (CSD), bufor `wl_shm`, `calloop`,
12 - wejście (`seat`, `xkbcommon`), resize/skala, zamknięcie okna.
13 -- **Efekt:** okno z HeaderBar-em (tytuł + `[—] [□] [✕]` + „burger”), rysowane CSD, oraz scena
14 - makiety Ustawień. Render offline do PNG w obu motywach: `docs/images/settings-*.png`.
15 -- Do weryfikacji na żywo: uruchomienie na kompozytorze Selene (`cargo run -p luna-demo`).
16 -
17 -## M0.5 — Wielojęzyczność i wygląd — ✅ UKOŃCZONE
18 -- `libluna-i18n`: system tłumaczeń bez gettext (klucz = angielski napis). **Każdy język w osobnym
19 - pliku** `i18n/<kod>.lang` (wbudowane pl/en/de przez `include_str!`) oraz doładowywanie
20 - w runtime z `~/.config/luna/i18n`, `~/.local/share/luna/i18n`, `/usr/share/luna/i18n`;
21 - wykrywanie z `LANG`/`LC_*`, globalne przełączanie, `languages()`/`language_name()`, makro `t!`.
22 -- `libluna-core`: `ThemePreference` (Auto/Jasny/Ciemny), `Accent` (9 kolorów), `ThemeSettings`
23 - z rozwiązywaniem motywu i zapisem do `~/.config/luna/theme.conf`.
24 -- `libluna-platform`: zdarzenia wejścia (wskaźnik, klawiatura, scroll) przekazywane do `Frame`;
25 - sterowanie motywem z aplikacji (`set_preference`/`set_accent`) z natychmiastowym przerysowaniem.
26 -- `luna-demo`: interaktywny panel wyglądu (segmenty trybu, paleta akcentów, wybór języka),
27 - chowanie **paska dolnego** i **paska bocznego** oraz przeciąganie jego krawędzi (drag, 150–460 px);
28 - skróty `l`/`a`/`g`/`b`/`s`; zrzuty w kilku językach/motywach w `docs/images/`.
29 -
30 -## M1 — Render
31 -- Graf sceny: prostokąty, zaokrąglone prostokąty, obcinanie (clip), cień, obrazy/ikony SVG.
32 -- `libluna-text`: shaping/układanie (Pango albo cosmic-text), fallback fontów, ellipsis.
33 -- `damage`/częściowe odświeżanie.
34 -
35 -## M2.5 — Widgety (start) — ⏳ W TOKU
36 -- `libluna-widgets`: widgety wielokrotnego użytku w modelu immediate — `ViewSwitcher`, `NavList`,
37 - `Menu` (popover `☰`), `Button` (warianty + chevron), `Switch`, `Slider`, `DropDown`
38 - (rozwijany przez `Menu`), `HeaderBar` (pasek tytułu z kontrolkami okna), `TabBar`/`TabView`
39 - (zakładki: pasek + model stron), `BottomSheet` (dolny panel modalny), `Pager` (karuzela stron),
40 - `PathBar` (okruszki), `Entry` (pole tekstowe) i `SearchEntry` (wyszukiwanie na jego bazie),
41 - `ItemView` (pliki/katalogi: siatka
42 - lub lista) i `ScrollView` (przewijanie), oraz `Stepper`, `CheckButton` i `RadioGroup`
43 - (krokowiec, checkbox, wybór jednokrotny); do tego `Card` i `ActionRow` (karty i wiersze
44 - ustawień), `Toast` (powiadomienie nakładkowe z akcją), `StatusPage` (ekran stanu: ikona,
45 - tytuł, opis, akcja — np. „pusty stan” listy), `Spinner` (wskaźnik zajętości), `Tooltip`
46 - (dymek podpowiedzi) i `Banner` (pasek komunikatu z akcjami); wspólny `PaintCtx`; testy
47 - hit-testingu bez okna.
48 -- **Galeria libadwaita pokryta**: `Avatar`, `ShortcutLabel`, `ToggleGroup`, `SplitButton`, `Bin`;
49 - `Row` (switch/combo/expander/entry/password/spin/slider/button/nav) + `PreferencesGroup`/
50 - `PreferencesPage`; `Dialog` + `AlertDialog`/`AboutDialog`/`ShortcutsDialog`/`PreferencesDialog`;
51 - `NavigationView`/`NavigationSplitView`/`OverlaySplitView`/`Sidebar` (`Carousel` = `Pager`);
52 - `ToolbarView`, `WindowTitle`, `Clamp`, `WrapBox`, `BreakpointBin`, `ButtonContent`.
53 -- **Galeria GTK4 pokrywana partiami** (partia 5–10): prezentacja `Label`, `Separator`,
54 - `ProgressBar`, `LevelBar`, `Frame`, `Revealer`, `Overlay`, `AspectFrame`; przyciski
55 - `ToggleButton`, `LinkButton`, `ColorButton`; pola specjalne `PasswordEntry` (maskowanie +
56 - „oko”) i `EditableLabel`; kontenery `CenterBox`, `Grid`, `Fixed`, `Paned`, `Stack`,
57 - `ActionBar`, `PopoverMenuBar`; dalej `MenuButton`, `SearchBar`, `Expander`, `Statusbar`,
58 - `Calendar`, `Image`, `TextView`, `Popover`, `ColumnView`, `Assistant`, `Scrollbar`/
59 - `Adjustment`, `ColorChooser`, `FlowBox`, `SpinButton`, `EmojiChooser`, `NavigationRail`,
60 - `Viewport`, `WindowHandle`; aliasy GTK4 `ScrolledWindow` = `ScrollView`,
61 - `StackSwitcher` = `ViewSwitcher`, `Notebook` = `TabView`, `ListBox` = `NavList`.
62 - Doszły odpowiedniki GTK4: `InfoBar` (4 rodzaje + zamknięcie), `Picture` (`ContentFit`:
63 - contain/cover/fill/fit-width/fit-height) i `MediaControls` (play/pauza + pasek postępu +
64 - czasy); podgląd: `cargo run -p luna-demo --bin new-widgets` → `docs/images/new-widgets.png`.
65 -- **Pakiet ikon symbolicznych** (`libluna-widgets::icon`): `IconName` + `paint_icon`,
66 - 28 ikon rysowanych wektorowo w naszym stylu (Menu/Search/Files/Settings/Terminal/Music/
67 - Star/Clock/Store/Edit/Wifi/Volume/Battery/Power/Grid/List/Carousel/…). Zestaw jest
68 - **wyliczalny** (`IconName::ALL` + `IconName::name()`), a cały pakiet ma galerię-podgląd:
69 - `cargo run -p luna-demo --bin icons` → `docs/images/icons.png` (motyw jasny i ciemny).
70 - Renderer zyskał prymitywy: `fill_circle`, `stroke_circle`, `stroke_polyline`, `fill_polygon`
71 - (z zaokrąglonymi końcami). Ikony użyte w panelu, launcherze oraz w OSD i powiadomieniach
72 - Luny (zamiast glifów fontu).
73 - Tokeny metryk kontenerów: `Theme::metrics.container`. Animacje: `libluna-core` `motion`
74 - (`Easing`, `lerp`, `Animation`), użyte w `Stack` (przejścia `StackTransition`), `Revealer`,
75 - `Toast`, `BottomSheet` i `Pager` (sterowane `advance(dt, …)`).
76 -- **Edycja tekstu**: `Entry`/`SearchEntry`/`PasswordEntry`/`TextView` mają **zaznaczanie**
77 - (`set_selection`, `select_all`, zakres, Shift+strzałki/Ctrl+A) oraz operacje schowka
78 - (`copy`/`cut`/`paste`); `TextInput` rozszerzono o metody zaznaczania.
79 -- `libluna-platform`: realne akcje okna z `Frame` (`close`/`minimize`/`toggle_maximize`).
80 - **Klatki animacji**: `Frame::delta_time()` + `Frame::request_frame()` (płynne ~60 Hz, gdy trwa
81 - animacja; bez tego okno odświeża się tylko na zdarzenia).
82 -- Demo używa widgetów zamiast ręcznego rysowania (pasek boczny, wybór motywu/widoku, menu `☰`,
83 - przycisk „Opcje”, przełączniki, suwak, wybór języka, pasek tytułu, zakładki `TabBar`/`TabView`).
84 - Powiadomienie (`Toast`) w demo animuje się (wjazd + fade), zmiana zakładki
85 - to animowane przejście (`Stack` slide), a dolny panel wysuwa się i karuzela „przyciąga”.
86 -- **Galeria widgetów** headless: `cargo run -p luna-demo --bin gallery` → `docs/images/gallery.png`
87 - (kontenery, tabela, kalendarz, chooser’y, kreator kroków, pasek stanu z cz. 5–12).
88 -- Motywy: wariant (light/dark/auto) + akcent, z trwałością. **Component metrics**: rozmiary
89 - i paddingi kontrolek wyniesione z widgetów do tokenów (`Theme::metrics`), więc styl steruje
90 - też geometrią (README, „Własny wygląd”).
91 -- Układ: **retencyjne drzewo `measure`/`allocate`** (`libluna-widgets::layout`) — `Node`
92 - (`VBox`/`HBox`, `Padding`, `Expanded`, `Center`, `Spacer`, `Label`, `Fixed`), `Constraints`,
93 - `Layout::fit`; przykład karty złożonej z drzewa (`bin/layout.rs` → `docs/images/layout.png`).
94 -- **Style instalowane z plików**: `libluna-core::theme_file` (`ThemePatch`, klucze kropkowe,
95 - `available_themes()`, nakładanie na bazę), trwały wybór stylu w `ThemeSettings` (`theme.conf`),
96 - przykłady `examples/luna/themes/*.theme`, podgląd przez `render/layout --theme`.
97 -- Wybór stylu w UI: menu `☰` → „Styl” (lista `available_themes()`, „Domyślny” + style z plików),
98 - stosowany na żywo i zapisywany w `theme.conf`; `LUNA_THEMES_DIR` dla dev/testów.
99 -- Podgląd motywów (headless): `bin/styles` renderuje realny interfejs w kilku stylach i składa
100 - montaż (`docs/images/styles.png`) — odpowiednik „okna podglądu”.
101 -- `TabBar`: przewijanie przy przepełnieniu (scroll + przyciski chevron na krawędziach, wybór
102 - zawsze widoczny).
103 -- `luna-demo` używa drzewa układu: karty i ich wiersze liczy `measure`/`allocate`.
104 -- Dalej: **okno podglądu na żywo w aplikacji**, stany (disabled/focus/pierścień fokusu),
105 - `Separator`/`Spacer` jako widżety, kolejne kamienie (M1 render, M3 listy).
106 -
107 -## M2 — Układ + widgety bazowe
108 -- Dwuprzebiegowy silnik measure/allocate — ✅ **częściowo** (silnik + kontenery `VBox`/`HBox`,
109 - `Padding`, `Expanded`, `Center`, `Spacer`, `Label`; do zrobienia: migracja demo i zaokrąglenia API).
110 -- `Box` (h/v), `Label`, `Icon`, `Button`, `Separator`, `Spacer`.
111 -- Stany: hover/pressed/disabled/focus + pierścień fokusu klawiatury.
112 -
113 -## M3 — Sterowanie i listy
114 -- `Switch`, `Slider`, `CheckButton`, `RadioButton`, `Entry`, `DropDown`, `Stepper`.
115 -- `ScrollView`, `ListView`, `GridView` (siatka kafelków) z zaznaczaniem i aktywacją.
116 -- `Sidebar` (sekcje + wiersze z ikonami, grupy rozwijane).
117 -
118 -## M4 — „Chrome” okna
119 -- `Window`, `HeaderBar` (slot start/center/end), `WindowControls` (`— □ ✕`).
120 -- `MenuButton` + `Popover` (menu „burger”: pozycje, separatory, skróty, podmenu).
121 -- `TabBar` / `ViewSwitcher` (segmentowy: Lista | Siatka).
122 -- `PathBar` (okruszki z `>` i `▾`), `SearchBar`/`SearchEntry`.
123 -- Bottom bar / pasek statusu.
124 -
125 -## M5 — Zestaw „adwaita”
126 -- `Card` (nagłówek sekcji + wiersze), `ActionRow` (tytuł/podtytuł + suffix).
127 -- `PreferencesGroup`, `Banner`, `Toast`, `StatusPage`.
128 -- `Spinner`, `Tooltip`, ikony symboliczne motywowane.
129 -
130 -## M6 — Odtworzenie makiet (cel!)
131 -- **Luna Settings** — panel boczny (Przegląd/Zaawansowane), karty z `Switch`/`DropDown`/
132 - `Slider`, pasek akcji, pasek statusu.
133 -- **Luna Files** — HeaderBar z `PathBar` + wyszukiwarką + przełącznikiem widoku + kontrolkami
134 - okna, panel boczny (Miejsca/Urządzenia/Sieć), widok siatki, popover opcji/sortowania,
135 - bottom bar z wolnym miejscem.
136 -
137 -## M7 — Migracja z GTK4
138 -- Najpierw `karton-settings` (mniejszy, `window.c` ~590 linii + strony) — strona po stronie.
139 -- Potem `karton-files` (`window.c` ~5100 linii) — etapami.
140 -- Opcjonalnie ujednolicenie `karton-shell` na libLunę (dziś cairo/pango bezpośrednio).
141 -
142 -## M8 — Kompozytor Selene + środowisko Luna (`de/`)
143 -- **Selene** (`de/selene`) — kompozytor Wayland w czystym Rust, **bez smithay**: własna warstwa
144 - na `wayland-server` (rdzeń + xdg-shell) i bezpośrednia pętla `poll` po gnieździe i backendzie.
145 - ✅ M-K0: globale `wl_compositor`, `wl_shm`, `xdg_wm_base`, `wl_seat`; cykl życia powierzchni
146 - + frame-callbacki, `xdg_surface.configure`, i18n, profil release z LTO.
147 - ✅ M-K1: **wyjście nested** (`libluna-platform`) + kompozycja okien klientów (`wl_shm` →
148 - piksele → `libluna-render`); nowy prymityw `Scene::image`/`ImageData` w rendererze.
149 - ✅ M-K2: **wejście** — `wl_output`, `wl_seat` z wskaźnikiem i klawiaturą (`wl_pointer`,
150 - `wl_keyboard` z mapą XKB i syntezą modyfikatorów), magistrala wejścia z wybudzaniem,
151 - oraz **pływające okna** (fokus, podnoszenie, przeciąganie).
152 - ✅ M-K3: **dekoracje po stronie serwera** (pasek tytułu, przyciski minimalizacji/maksymalizacji/
153 - zamknięcia, uchwyt przeskalowania) + operacje okna (przeciąganie, `xdg_toplevel.configure`/
154 - `close`, **zmiana rozmiaru za wszystkie krawędzie i narożniki**, **maksymalizacja**, **pełny
155 - ekran**, `xdg-decoration` z trybem `server_side`; skróty `Super+M`/`Super+F`/`Super+↑`/
156 - `Super+↓`/`Super+Tab`).
157 - ✅ M-K4: **`xdg_popup`** (menu/kontekstowe z kotwiczeniem do pozycjonera i zamykaniem poza)
158 - oraz **`wlr-layer-shell`** (panele/docki: kotwice, marginesy, strefa wyłączna, warstwy,
159 - wybór monitora) — fundament pulpitu Luna.
160 - ✅ M-K5: **wiele monitorów** — model `OutputInfo` z pozycją, global `wl_output` per monitor,
161 - przenośne **wykrywanie DRM/KMS** (`de/selene/src/drm.rs`, ioctl `GETRESOURCES`/`GETCONNECTOR`)
162 - z fallbackiem na wyjście nested; okna maksymalizują się na swoim monitorze.
163 - ✅ M-K6: **schowek** (`wl_data_device_manager`: `data_source`/`data_offer`/`selection`,
164 - kopiuj/wklej między klientami) oraz **układy klawiatury** z otoczenia
165 - (`LUNA_KEYBOARD_LAYOUT`/`LUNA_KEYBOARD_VARIANT`) i `wl_keyboard.repeat_info`.
166 - ✅ M-K7: **drag & drop** (`start_drag`, `enter`/`motion`/`leave`/`drop`, `dnd_finished`)
167 - oraz **realne wyjście DRM/KMS** (`SELENE_BACKEND=drm`, opcjonalne): master, bufor dumb,
168 - `ADDFB2`, `SETCRTC`, podwójne buforowanie i **page-flip**; bezpieczny fallback do nested,
169 - gdy master trzyma inna sesja.
170 - ✅ M-K8: **wejście evdev** (`SELENE_INPUT=evdev`): własne czytanie `/dev/input/event*`
171 - (wskaźnik względny z wirtualnym kursorem, przyciski, kółko, klawiatura) — rodzime wejście
172 - dla trybu DRM. Wymaga grupy `input`/root.
173 - ✅ Optymalizacje: cache `mmap` puli `wl_shm` i zero-copy w rendererze (`PixmapRef::from_bytes`).
174 - Uruchomienie: `cargo run -p selene` (szczegóły: `de/README.md`).
175 -- Dalej: GLES/akceleracja, hotplug monitorów (`zwlr_output_manager`), `libinput` (gesty),
176 - selekcja pierwotna, IME (`text-input`).
177 -- **Luna** (`de/luna`) — powłoka środowiska na `libluna-widgets`. ✅ start: **panel górny**
178 - (sam **burger** — bez etykiety, który otwiera launcher; tytuł okna, zegar/data,
179 - przełączniki, przestrzenie, użytkownik) i **launcher** w trzech widokach
180 - (**Lista / Siatka / Karuzela** z segmentowym przełącznikiem); render headless do
181 - `docs/images/luna-panel-idle.png`, `docs/images/luna-launcher-{list,grid,carousel}.png`
182 - i `docs/images/luna-popup-*.png` (`cargo run -p luna --bin luna-panel`).
183 - Dane (`PanelState`, `App`, `Launcher`) oddzielone od rysowania (`PaintCtx`) — ten sam kod do
184 - podglądów i sesji na żywo. ✅ **Prawdziwe aplikacje**: `apps.rs` skanuje pliki `.desktop`
185 - (XDG), parsuje `[Desktop Entry]` z lokalizacją nazw i filtrowaniem `NoDisplay`/`Hidden`;
186 - klik w pozycję uruchamia polecenie. Podgląd listy: `cargo run -p luna --bin luna-apps`.
187 - ✅ **Przewijanie** listy/siatki (scroll + klip zawartości). ✅ **Nawigacja klawiaturą**:
188 - strzałki (lista ±1, siatka kolumny/wiersze, karuzela karty), `Enter` uruchamia zaznaczoną
189 - pozycję, `Esc` zamyka; zaznaczenie automatycznie przewija się do widoku
190 - (`Launcher::navigate` + `ensure_selection_visible`).
191 - ✅ **`luna-shell`** (bin) uruchamia panel jako prawdziwą **powierzchnię
192 - warstwową** (`wlr-layer-shell` po stronie klienta w `libluna-platform`); bez kompozytora
193 - kończy się czytelnym `NoCompositor`. ✅ **OSD** (`osd.rs`) i **powiadomienia** (`notifications.rs`)
194 - — pokazywane pod paskiem na powierzchni „chrome”; oba korzystają z pakietu ikon
195 - (`IconName`) zamiast glifów tekstowych. Dalej: usługa D-Bus
196 - `org.freedesktop.Notifications`, centrum powiadomień, menu kontekstowe.
197 -
198 -## Później (poza MVP)
199 -- Dostępność AT-SPI, IME, schowek, drag & drop, animacje, backend GPU, mini-CSS dla motywów.
200 -- Renderer: ✅ **klip obejmuje tekst** (`DrawCommand::Text` respektuje `ClipRect`) — naprawione,
201 - `ScrollView` i inne przewijane widoki przycinają też napisy.
202 -
203 -## Inwentarz widgetów (z makiet → moduł docelowy)
204 -
205 -| Widget | Moduł | Makieta |
206 -|---|---|---|
207 -| Window + CSD HeaderBar | `libluna-adwaita` | obie |
208 -| WindowControls `— □ ✕` | `libluna-adwaita` | obie |
209 -| MenuButton + Popover (burger) | `libluna-widgets` | obie |
210 -| TabBar / ViewSwitcher | `libluna-widgets` | Settings, Files |
211 -| BottomSheet | `libluna-widgets` | Settings, Files |
212 -| Pager (karuzela stron) | `libluna-widgets` | (przeglądarka, onboarding) |
213 -| Sidebar (sekcje, wiersze) | `libluna-adwaita` | obie |
214 -| PathBar (okruszki) | `libluna-widgets` | Files |
215 -| Entry (pole tekstowe) | `libluna-widgets` | Settings, Files |
216 -| SearchEntry / SearchBar | `libluna-widgets` | Files |
217 -| GridView / ListView | `libluna-widgets` (`ItemView`) | Files |
218 -| ScrollView | `libluna-widgets` | obie |
219 -| Card + ActionRow | `libluna-widgets` | Settings |
220 -| Switch | `libluna-widgets` | Settings |
221 -| Slider (+ etykieta %) | `libluna-widgets` | Settings |
222 -| DropDown | `libluna-widgets` | Settings |
223 -| Button (pill/suggested/flat) | `libluna-widgets` | Settings |
224 -| Stepper / Check / Radio | `libluna-widgets` | Files (popover) |
225 -| Toast | `libluna-widgets` | Settings, Files |
226 -| Avatar / ShortcutLabel | `libluna-widgets` | Settings |
227 -| ToggleGroup / SplitButton | `libluna-widgets` | Settings, Files |
228 -| Row (switch/combo/expander/entry/spin/button) | `libluna-widgets` | Settings, Files |
229 -| PreferencesGroup / PreferencesPage | `libluna-widgets` | Settings |
230 -| Dialog / AlertDialog / AboutDialog / ShortcutsDialog / PreferencesDialog | `libluna-widgets` | obie |
231 -| NavigationView / NavigationSplitView / OverlaySplitView / Sidebar | `libluna-widgets` | Files |
232 -| ToolbarView / WindowTitle / Clamp / WrapBox / BreakpointBin / Bin | `libluna-widgets` | obie |
233 -| Banner | `libluna-widgets` | Files, Settings |
234 -| Spinner / Tooltip | `libluna-widgets` | obie |
235 -| StatusBar / bottom info | `libluna-widgets` | obie |
236 -| StatusPage (pusty stan) | `libluna-widgets` | Files |
237 -
238 -## Kompozytor (Selene)
239 -
240 -Status protokołów Waylanda (co działa, czego brakuje i w jakiej kolejności dodajemy)
241 -opisuje **[`docs/compositor.md`](compositor.md)**.
242 -
243 -## Kryterium „gotowca” (Definition of Done dla MVP)
244 -Odtworzenie **obu makiet** (Settings i Files) wyłącznie na libLunie, bez GTK4, z jasnym i
245 -ciemnym motywem, uruchamialne na kompozytorze Selene, w rozsądnym rozmiarze binarki
246 -i zużyciu pamięci względem odpowiedników GTK4.