@konce-pt/angular 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konce-pt/angular",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Open-source Angular 22 component library on Signals & Signal Forms — 70+ components, rich data table, zoneless, fully tokenized. Selektory kpt-*, klasy Kpt*.",
5
5
  "license": "MIT",
6
6
  "author": "konce.pt",
@@ -5,6 +5,8 @@ Import: `import { KptAccordion, KptAccordionPanel } from '@konce-pt/angular';`
5
5
 
6
6
  ## KptAccordion
7
7
  - `multi`: boolean — pozwala otworzyć wiele naraz (domyślnie: tylko jeden)
8
+ - `animated`: boolean (domyślnie true) — animacja rozwijania paneli (CSS grid, czysty CSS)
9
+ - `animationDuration`: number (domyślnie 500) — czas animacji w ms (dziedziczone przez panele)
8
10
 
9
11
  ## KptAccordionPanel
10
12
  - `title`: string (wymagane); `disabled`: boolean; `expanded`: model<boolean>
@@ -9,16 +9,37 @@ Import: `import { KptCard } from '@konce-pt/angular';`
9
9
  ## Wejścia
10
10
  - `variant`: 'elevated' | 'outlined' (domyślnie 'elevated')
11
11
  - `header`: string — opcjonalny tekst nagłówka
12
+ - `flush`: boolean — body bez paddingu (dla bogatych układów zarządzających sekcjami)
12
13
 
13
14
  ## Projekcja
14
15
  - treść domyślna → body karty
15
16
  - element z atrybutem `kptCardFooter` (bezpośrednie dziecko `kpt-card`) → stopka
16
17
 
18
+ ## Reużywalne klasy układu (media / profil)
19
+ - `kpt-card__media` — obraz na całą szerokość (przycięty do promienia; ustaw `aspect-ratio`/`height` inline)
20
+ - `kpt-card__lead` — wiersz nagłówka (awatar + tytuły), padding
21
+ - `kpt-card__title`, `kpt-card__subtitle` — typografia tytułu/podtytułu
22
+ - `kpt-card__section` — sekcja z paddingiem (kolumna z odstępami)
23
+ - `kpt-card__tags` — wiersz chipów; `kpt-card__meta` — wiersz ikona+tekst (ocena/lokalizacja)
24
+ - `kpt-card__avatar` — nachodzący awatar z ringiem (na okładce)
25
+ - `kpt-card__actions` — wiersz przycisków (równe szerokości)
26
+
17
27
  ## Przykład
18
28
  <kpt-card header="Ustawienia" variant="outlined">
19
29
  <p>Treść…</p>
20
30
  <div kptCardFooter><kpt-button>Zapisz</kpt-button></div>
21
31
  </kpt-card>
22
32
 
33
+ <!-- media card -->
34
+ <kpt-card variant="outlined" flush>
35
+ <div class="kpt-card__lead">
36
+ <kpt-avatar src="/u.jpg" />
37
+ <div><div class="kpt-card__title">Shiba Inu</div><div class="kpt-card__subtitle">Dog Breed</div></div>
38
+ </div>
39
+ <img class="kpt-card__media" src="/foto.jpg" alt="" style="aspect-ratio: 4/3" />
40
+ <div class="kpt-card__section">Opis…</div>
41
+ <div kptCardFooter><kpt-button variant="text" size="sm">LIKE</kpt-button></div>
42
+ </kpt-card>
43
+
23
44
  ## Tokeny
24
45
  `--kpt-card-{bg,fg,border,radius,padding,shadow}`.
@@ -11,6 +11,10 @@ Import: `import { KptConfirmService, KptConfirmContainer } from '@konce-pt/angul
11
11
  - `message`: string (wymagane); `header?`: string
12
12
  - `acceptLabel?`/`rejectLabel?`: string; `variant?`: 'filled' | 'danger'; `icon?`: string
13
13
 
14
+ ## i18n
15
+ Domyślne etykiety (nagłówek, Potwierdź, Anuluj) z i18n (namespace `confirm`); pola opcji mają priorytet.
16
+ Domyślnie EN; konfiguracja przez `provideKptI18n` — patrz `i18n/llms.txt`.
17
+
14
18
  ## Przykład
15
19
  const ok = await this.confirm.confirm({
16
20
  message: 'Usunąć rekord?', variant: 'danger', acceptLabel: 'Usuń', icon: 'alert-triangle',
@@ -2,26 +2,39 @@
2
2
 
3
3
  Flagowa tabela danych: kolumny konfiguracją, sortowanie, filtr globalny,
4
4
  paginacja, zaznaczanie wierszy i własne szablony komórek. Sygnałowa, OnPush.
5
- Import: `import { KptDataTable, KptColumn, KptCellDef } from '@konce-pt/angular';`
5
+ Import: `import { KptDataTable, KptColumn, KptCellDef, KptRowDetailDef } from '@konce-pt/angular';`
6
6
 
7
7
  ## Selektor
8
8
  `kpt-data-table`
9
9
 
10
10
  ## Model kolumny (KptColumn)
11
- `{ field: string; header: string; sortable?: boolean; align?: 'start'|'center'|'end'; width?: string; frozen?: boolean }`
11
+ `{ field: string; header: string; sortable?: boolean; align?: 'start'|'center'|'end'; width?: string; frozen?: boolean; filter?: KptColumnFilter }`
12
12
  Kolumny `frozen` (wiodące, sąsiadujące) przyklejają się przy poziomym przewijaniu — wymagają `width`.
13
13
 
14
+ ### Filtr kolumny (KptColumnFilter)
15
+ `{ type: 'text'|'number'|'select'|'dateRange'|'numberRange'|'slider'; options?: KptOption[]; multiple?: boolean; placeholder?: string; min?: number; max?: number; step?: number }`
16
+ Gdy którakolwiek kolumna ma `filter`, w nagłówku renderuje się wiersz filtrów:
17
+ - `text` — input tekstowy (dopasowanie „zawiera"), `number` — input tylko cyfry (dopasowanie po cyfrach),
18
+ - `select` — lista wyboru (z `multiple` = wiele; dopasowanie OR). Gdy wartość pola jest **tablicą** (np. lista tagów/członków), dopasowuje, gdy tablica zawiera dowolną z wybranych wartości,
19
+ - `numberRange` — dwa pola (min–max); dopasowuje, gdy liczbowa wartość pola mieści się w zakresie (puste ograniczenie = otwarte),
20
+ - `slider` — suwak zakresu (dwa uchwyty; `min`/`max`/`step`); wartość filtra to `[lo, hi]`, dopasowuje liczbę w `[lo, hi]`,
21
+ - `dateRange` — zakres dat (pole ISO/Date w `[start,end]`).
22
+ Filtry kolumn łączą się AND ze sobą i z filtrem globalnym; zmiana resetuje stronę.
23
+ Filtry działają na **surowej wartości pola** (`row[field]`), niezależnie od własnego szablonu `kptCell` — można filtrować także kolumny z custom cell (np. status-badge).
24
+ Filtry `select`/`dateRange` wymagają `import '@angular/cdk/overlay-prebuilt.css';`.
25
+
14
26
  ## Wejścia
15
27
  - `columns`: KptColumn[] (wymagane)
16
28
  - `data`: T[] (domyślnie [])
17
29
  - `filterable`: boolean — pole filtra globalnego
30
+ - `filterRowPosition`: 'top' | 'bottom' (domyślnie 'bottom') — wiersz filtrów kolumn nad/pod etykietami
18
31
  - `pageSize`: number — 0 wyłącza paginację
19
32
  - `pageSizeOptions`: number[] (domyślnie [5,10,20,50])
20
33
  - `selectable`: 'none' | 'single' | 'multiple'
21
34
  - `loading`: boolean — wiersz „Ładowanie…"
22
- - `emptyMessage`: string (domyślnie „Brak danych")
35
+ - `emptyMessage`: string — bez wartości używa i18n (`dataTable.empty`); input ma priorytet
23
36
  - `rowKey`: string | null — pole identyfikujące wiersz (dla zaznaczania); bez niego porównanie po referencji
24
- - `reorderable`: boolean — przestawianie kolumn przeciągnij-i-upuść (natywny HTML5 DnD)
37
+ - `reorderable`: boolean — przestawianie kolumn przeciągnij-i-upuść (natywny HTML5 DnD); kolumny `frozen` są wyłączone z przenoszenia (pozostają wiodące) i nie można upuszczać innych kolumn przed nie
25
38
  - `exportable`: boolean — przycisk „Eksport CSV" w toolbarze
26
39
  - `exportFilename`: string (domyślnie 'export.csv')
27
40
  - `lazy`: boolean — tryb serwerowy (bez filtr/sort/paginacji po stronie klienta)
@@ -29,11 +42,14 @@ Kolumny `frozen` (wiodące, sąsiadujące) przyklejają się przy poziomym przew
29
42
  - `scrollHeight`: string | null — wysokość przewijalnego obszaru (np. '400px'); sticky header pozostaje
30
43
  - `virtualScroll`: boolean — wirtualizacja wierszy (renderuje tylko widoczne); wymaga `scrollHeight`
31
44
  - `rowHeight`: number — stała wysokość wiersza w px (domyślnie 41), potrzebna przy virtualScroll
45
+ - `expandable`: boolean — kolumna z przełącznikiem rozwijającym wiersz (renderuje szablon `kptRowDetail`)
46
+ - `multiExpand`: boolean (domyślnie true) — pozwala rozwinąć wiele wierszy naraz; false = tylko jeden
32
47
 
33
48
  ## Model / zdarzenia
34
49
  - `selection`: model<T[]> — dwukierunkowe `[(selection)]`
50
+ - `expandedRows`: model<T[]> — dwukierunkowe `[(expandedRows)]` (rozwinięte wiersze)
35
51
  - `rowClick`: output<T>
36
- - `lazyLoad`: output<KptTableLazyState> — { pageIndex, pageSize, sortField, sortDir, filter }; emitowane w trybie lazy przy każdej zmianie stanu
52
+ - `lazyLoad`: output<KptTableLazyState> — { pageIndex, pageSize, sortField, sortDir, filter, columnFilters }; emitowane w trybie lazy przy każdej zmianie stanu
37
53
 
38
54
  ## Eksport / metody
39
55
  - `exportCsv()`: publiczna metoda — eksportuje bieżące (filtr+sort) dane do CSV (separator `;`, BOM dla Excela).
@@ -48,15 +64,33 @@ Kontekst: `$implicit` = wiersz, `value` = wartość pola.
48
64
  </ng-template>
49
65
  </kpt-data-table>
50
66
 
67
+ ## Rozwijane wiersze (dyrektywa kptRowDetail)
68
+ Włącz `expandable` i podaj szablon `kptRowDetail` (kontekst: `$implicit` = wiersz).
69
+ Dodaje wiodącą kolumnę z przełącznikiem; rozwinięty wiersz renderuje szablon w pełnej szerokości pod wierszem.
70
+ Stan przez `[(expandedRows)]`; `multiExpand=false` ogranicza do jednego otwartego naraz.
71
+ Niezależne od `selectable` (można łączyć z zaznaczaniem). Nieaktywne przy `virtualScroll`.
72
+
73
+ <kpt-data-table [columns]="cols" [data]="rows" expandable rowKey="id" [(expandedRows)]="open">
74
+ <ng-template kptRowDetail let-row>
75
+ <div class="detale">{{ row.opis }}</div>
76
+ </ng-template>
77
+ </kpt-data-table>
78
+
51
79
  ## Zachowanie
52
80
  - Sortowanie: klik w nagłówek sortowalnej kolumny cyklicznie asc → desc → brak.
53
81
  - Filtr: dopasowanie tekstu we wszystkich polach kolumn; reset strony do 0.
54
82
  - Zaznaczanie 'multiple': nagłówkowy checkbox zaznacza/odznacza bieżącą stronę.
55
83
  - Sticky header, stany pusty/ładowanie, wyrównanie i szerokości per kolumna.
56
84
 
85
+ ## i18n
86
+ Etykiety toolbaru/stanów/aria (Szukaj, Eksport CSV, Ładowanie, Brak danych, zaznaczanie, filtry kolumn:
87
+ Filtr/Filtr min/Filtr max z `{column}`, Wszystkie, min, max, Zakres dat) pochodzą z i18n (namespace `dataTable`).
88
+ Domyślnie EN; konfiguracja przez `provideKptI18n` — patrz `i18n/llms.txt`.
89
+
57
90
  ## Tokeny
58
91
  `--kpt-table-{bg,fg,border,radius,header-bg,header-fg,row-hover,row-selected,cell-padding}`.
92
+ Rozwijany wiersz: `--kpt-table-detail-bg` (fallback: surface-variant → row-hover).
59
93
  Paginacja: komponent `kpt-paginator`.
60
94
 
61
95
  ## Do zrobienia (roadmap)
62
- Kolumny grupowane, edycja komórek inline, wiersze rozwijane.
96
+ Kolumny grupowane, edycja komórek inline.
@@ -1,18 +1,23 @@
1
1
  # KptDateRange (kpt-date-range)
2
2
 
3
- Wybór zakresu dat z kalendarzem (CDK Overlay) na Signal Forms.
4
- Wartość: `{ start: 'RRRR-MM-DD', end: 'RRRR-MM-DD' }` (KptDateRangeValue).
3
+ Wybór zakresu dat/godzin z kalendarzem (CDK Overlay) na Signal Forms.
4
+ `mode`: 'date' (domyślnie), 'datetime' (data+godzina, tarcza zegara `kpt-clock`), 'time' (sama godzina).
5
+ Wartość `{ start, end }` (KptDateRangeValue): daty 'RRRR-MM-DD', datetime 'RRRR-MM-DDTHH:mm', godziny 'HH:mm'.
5
6
  Import: `import { KptDateRange, KptDateRangeValue } from '@konce-pt/angular';`
6
7
  Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
7
8
 
8
9
  ## Wejścia / model
9
10
  - `value`: model<KptDateRangeValue> (lub `formField`)
10
- - `placeholder`: string (domyślnie 'Wybierz zakres')
11
+ - `mode`: 'date' | 'datetime' | 'time' (domyślnie 'date')
12
+ - `hourFormat`: 12 | 24 (domyślnie 24) — tarcza z AM/PM lub 24h; czas zawsze 24h w wartości
13
+ - `minuteStep`: number (domyślnie 1) — snap minut na tarczy
14
+ - `placeholder`: string — bez wartości używa i18n (`dateRange.placeholder`); input ma priorytet
15
+ - `displayFormat`: 'pl' | 'iso' (domyślnie 'pl') — format wyświetlania start/end
11
16
  - `disabled`/`invalid`/`touched`: boolean; `touch`: output
12
17
 
13
18
  ## Zachowanie
14
- Pierwszy klik ustawia `start`, drugi `end` (kolejność jest normalizowana). Zakres podświetlany;
15
- przycisk „×" czyści wartość.
19
+ Pierwszy klik ustawia `start`, drugi `end` (kolejność normalizowana). Zakres podświetlany; „×" czyści.
20
+ Tryby datetime/time: przełącznik „Od / Koniec" + tarcza zegara, zatwierdzenie przyciskiem „Gotowe".
16
21
 
17
22
  ## Przykład
18
23
  <kpt-date-range [formField]="f.period" />
@@ -20,5 +25,9 @@ przycisk „×" czyści wartość.
20
25
 
21
26
  period = signal<KptDateRangeValue>({ start: '', end: '' });
22
27
 
28
+ ## i18n
29
+ Nazwy dni/miesięcy z `Intl` wg locale; etykiety („Od/Koniec", nawigacja, „Gotowe", placeholder) z i18n
30
+ (namespace `dateRange` + `datepicker`/`common`). Domyślnie EN — patrz `i18n/llms.txt`.
31
+
23
32
  ## Tokeny
24
33
  Pole `--kpt-form-field-*`; kalendarz `--kpt-color-surface-raised`, zakres `--kpt-color-primary`.
@@ -1,17 +1,35 @@
1
1
  # KptDatepicker (kpt-datepicker)
2
2
 
3
- Wybór daty z własnym kalendarzem (CDK Overlay), Signal Forms. Wartość ISO 'RRRR-MM-DD',
4
- wyświetlana jako 'DD.MM.RRRR'. Tydzień od poniedziałku, dziś zaznaczone, zakres min/max.
3
+ Wybór daty/godziny z własnym kalendarzem (CDK Overlay), Signal Forms. Granulacja przez
4
+ `selectionMode`: data (domyślnie), miesiąc+rok, rok, miesiąc, data+godzina, sama godzina.
5
+ Godzina na tarczy zegara (dwa etapy: godziny → minuty, klik lub przeciąganie), format 12/24h.
6
+ Wyświetlanie wg `displayFormat` ('pl'/'iso'). Tydzień od poniedziałku, dziś zaznaczone, zakres min/max.
5
7
  Wymaga stylów overlay CDK: `import '@angular/cdk/overlay-prebuilt.css';`
6
8
  Import: `import { KptDatepicker } from '@konce-pt/angular';`
7
9
 
8
10
  ## Użycie
9
11
  <kpt-datepicker [formField]="f.birthDate" minDate="1900-01-01" maxDate="2030-12-31" />
12
+ <kpt-datepicker selectionMode="monthYear" [(value)]="period" />
13
+ <kpt-datepicker selectionMode="month" monthDisplay="long" [(value)]="month" />
14
+ <kpt-datepicker selectionMode="datetime" [hourFormat]="12" [(value)]="meetingAt" />
15
+ <kpt-datepicker selectionMode="time" [(value)]="alarm" />
10
16
 
11
17
  ## Wejścia
12
- - `value`: model<string> (ISO); `minDate`/`maxDate`: string|null; `placeholder`: string
18
+ - `value`: model<string>; `minDate`/`maxDate`: string|null; `placeholder`: string
19
+ - `selectionMode`: 'date' | 'monthYear' | 'year' | 'month' | 'datetime' | 'time' (domyślnie 'date').
20
+ Format wartości zależny od trybu: 'RRRR-MM-DD' / 'RRRR-MM' / 'RRRR' / 'MM' / 'RRRR-MM-DDTHH:mm' (datetime) / 'HH:mm' (time).
21
+ - `hourFormat`: 12 | 24 (domyślnie 24) — tarcza z AM/PM (12) lub pierścieniem 13–00 (24); wartość zawsze 24h.
22
+ - `minuteStep`: number (domyślnie 1) — snap minut na tarczy.
23
+ - `monthDisplay`: 'long' | 'number' (domyślnie 'long') — w trybie 'month' i etykietach miesięcy: słownie (styczeń) lub liczbą (01)
24
+ - `displayFormat`: 'pl' | 'iso' (domyślnie 'pl') — format wyświetlania i domyślnego placeholdera
13
25
  - `disabled`/`invalid`/`touched`: boolean; output `touch`.
14
- - Panel: nawigacja miesięcy (‹ ›), przycisk czyszczenia (×).
26
+ - Panel: nawigacja (‹ ›) miesięcy/lat/dekad wg trybu; tarcza zegara z „Gotowe"; przycisk czyszczenia (×).
27
+
28
+ ## i18n
29
+ Nazwy dni tygodnia i miesięcy są wyliczane z `Intl` wg aktywnego locale i18n (nie ze słownika).
30
+ Etykiety nawigacji/aria i „Gotowe" z i18n (namespace `datepicker` + `common`). Domyślnie EN;
31
+ konfiguracja przez `provideKptI18n` — patrz `i18n/llms.txt`. Uwaga: `displayFormat` ('pl'/'iso')
32
+ steruje wyłącznie formatem daty i jest niezależny od języka etykiet.
15
33
 
16
34
  ## Tokeny
17
35
  `--kpt-form-field-{bg,text,border,border-focus,border-error,radius}`.
@@ -6,6 +6,8 @@ Import: `import { KptFieldset } from '@konce-pt/angular';`
6
6
  ## Wejścia / model
7
7
  - `legend`: string
8
8
  - `toggleable`: boolean; `collapsed`: model<boolean>
9
+ - `animated`: boolean (domyślnie true) — animacja zwijania (CSS grid, czysty CSS)
10
+ - `animationDuration`: number (domyślnie 500) — czas animacji w ms
9
11
  - Treść: `<ng-content>`.
10
12
 
11
13
  ## Przykład
@@ -13,6 +13,22 @@ Import: `import { KptFormField } from '@konce-pt/angular';`
13
13
  - `error`: string | null — komunikat błędu; gdy niepusty, pole jest oznaczone jako nieprawidłowe
14
14
  - `required`: boolean — gwiazdka przy etykiecie
15
15
  - `controlId`: string — id kontrolki dla powiązania `label[for]`
16
+ - `labelType`: 'fixed' | 'over' | 'in' | 'on' — wariant etykiety (domyślnie `fixed`)
17
+
18
+ ## Warianty etykiety (labelType)
19
+ - `fixed` (domyślny) — statyczna etykieta nad kontrolką (jak dotychczas).
20
+ - `over` — Float Label: etykieta unosi się nad obramowanie pola.
21
+ - `in` — Float Label: etykieta unosi się do górnej części wewnątrz pola (pole wyższe, styl „filled").
22
+ - `on` — Float Label: etykieta siada na górnym obramowaniu (notch, styl „outlined").
23
+
24
+ Warianty float mają animowane przejście etykiety (pozycja spoczynkowa w miejscu placeholdera →
25
+ uniesiona). Uniesienie następuje przy focusie kontrolki **lub** gdy pole ma wartość. Wykrywanie
26
+ wypełnienia jest po stronie komponentu (zdarzenia `input`/`change` + wartość początkowa) — **nie**
27
+ wymaga ustawiania placeholdera na kontrolce. Uwaga: wzorzec działa dla kontrolek `input`/`textarea`.
28
+
29
+ <kpt-form-field label="E-mail" labelType="over">
30
+ <kpt-input />
31
+ </kpt-form-field>
16
32
 
17
33
  ## Projekcja
18
34
  Kontrolkę umieszcza się w treści (ng-content):
@@ -31,6 +47,10 @@ Kontrolkę umieszcza się w treści (ng-content):
31
47
 
32
48
  ## Tokeny
33
49
  `--kpt-form-field-label`, `--kpt-form-field-hint`, `--kpt-form-field-error`, `--kpt-color-danger`.
50
+ Warianty float dodatkowo: `--kpt-form-field-placeholder` (etykieta spoczynkowa),
51
+ `--kpt-form-field-border-focus` (uniesiona), `--kpt-form-field-border-error` (stan błędu),
52
+ `--kpt-form-field-bg` (maska notcha w `on`). Animacja: `--kpt-motion-duration-fast`,
53
+ `--kpt-motion-easing-standard`; respektuje `prefers-reduced-motion`.
34
54
 
35
55
  ## Dostępność
36
56
  - Komunikat błędu ma `role="alert"`.
@@ -0,0 +1,35 @@
1
+ # i18n (provideKptI18n / KptI18n)
2
+
3
+ Tłumaczenia etykiet komponentów. Języki bazowe: EN (domyślny), PL. Oparte o sygnały (zoneless-friendly), bez zależności zewnętrznych.
4
+ Import: `import { provideKptI18n, KptI18n } from '@konce-pt/angular';`
5
+
6
+ ## Konfiguracja (provider)
7
+ - `provideKptI18n({ locale?, messages? }): EnvironmentProviders` — w `bootstrapApplication`.
8
+ - `locale`: 'en' | 'pl' | dowolny string (domyślnie 'en').
9
+ - `messages`: `Record<locale, DeepPartial<KptMessages>>` — rejestruje nowy język lub nadpisuje istniejący (deep-merge, brakujące klucze → EN).
10
+
11
+ ## Serwis KptI18n (providedIn: 'root')
12
+ - `locale: Signal<KptLocale>` — bieżący język.
13
+ - `setLocale(locale)` — zmiana w runtime (reaktywna dla wszystkich komponentów).
14
+ - `registerMessages(locale, patch)` — dodaje/nadpisuje słownik w runtime.
15
+ - `t(key, params?)` — tłumaczy klucz w notacji kropkowej (`'paginator.range'`) z interpolacją `{name}`.
16
+
17
+ ## Dodanie własnego języka (jeden plik JSON)
18
+ import de from './i18n/de.json'; // kształt = interfejs KptMessages
19
+ provideKptI18n({ locale: 'de', messages: { de } });
20
+ // runtime: inject(KptI18n).registerMessages('de', de); inject(KptI18n).setLocale('de');
21
+
22
+ ## Przełączanie języka w runtime
23
+ const i18n = inject(KptI18n);
24
+ i18n.setLocale('pl');
25
+
26
+ ## Kontrakt kluczy (KptMessages)
27
+ Namespace'y: `common` (close/remove/previous/next/clear/done/all), `paginator` (rowsPerPage/range/prevPage/nextPage),
28
+ `select`, `listbox`, `dataView`, `dataTable`, `confirm`, `fileUpload`, `chipsInput`, `dateRange`, `datepicker`,
29
+ `pickList`, `orderList`, `inputNumber`, `password`, `spinner`, `speedDial`, `scrollTop`, `splitButton`, `panel`,
30
+ `breadcrumb`, `richText`. Interpolacje: `paginator.range` ({start},{end},{total}), `dataTable.filter*` ({column}),
31
+ `richText.styleHeading` ({level}). Nazwy dni/miesięcy w kalendarzach są wyliczane z `Intl` wg locale (nie ze słownika).
32
+
33
+ ## Uwaga
34
+ Pojedyncze etykiety można też nadpisać per-komponent przez odpowiedni `input()` (np. `emptyMessage`, `acceptLabel`) —
35
+ input ma priorytet nad słownikiem i18n.
@@ -12,7 +12,9 @@ kolor z `currentColor`. Import: `import { KptIcon } from '@konce-pt/angular';`
12
12
 
13
13
  ## Dostępne nazwy (wbudowane)
14
14
  menu, x, chevron-up, chevron-down, chevron-left, chevron-right, check, search,
15
- grip-vertical, info, alert-triangle, circle-check, circle-x, calendar, copy, link, code.
15
+ grip-vertical, info, alert-triangle, circle-check, circle-x, calendar, copy, link, code,
16
+ star, phone, map-pin, world, clock, align-left, align-center, align-right, align-justified,
17
+ palette, highlight, clipboard, clipboard-text, table (pełna lista w `icons.ts`).
16
18
 
17
19
  ## Pełny zestaw (5130 ikon Tabler)
18
20
  Opcjonalny entry point `@konce-pt/angular/icons` (pobierany tylko przy imporcie):
@@ -2,6 +2,8 @@
2
2
 
3
3
  Mega-menu — pozioma belka z szerokim, wielokolumnowym panelem.
4
4
  Struktura: pozycja górna → `items` (kolumny) → każda kolumna `items` (odnośniki).
5
+ Panel na CDK Overlay (doczepiany do `body`, nieprzycinany przez `overflow: hidden`).
6
+ Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
5
7
  Import: `import { KptMegamenu } from '@konce-pt/angular';`
6
8
 
7
9
  ## Wejścia / wyjścia
@@ -1,6 +1,8 @@
1
1
  # KptMenubar (kpt-menubar)
2
2
 
3
3
  Pozioma belka menu z rozwijanymi pod-menu. Pozycje bez `items` działają jak akcje.
4
+ Pod-menu na CDK Overlay (doczepiane do `body`, nieprzycinane przez `overflow: hidden`).
5
+ Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
4
6
  Import: `import { KptMenubar } from '@konce-pt/angular';`
5
7
 
6
8
  ## Wejścia / wyjścia
@@ -16,3 +16,7 @@ Paginator sterowany sygnałami. Import: `import { KptPaginator } from '@konce-pt
16
16
 
17
17
  Pokazuje „X–Y z Z", wybór rozmiaru strony oraz przyciski poprzednia/następna.
18
18
  Przy zmianie długości/rozmiaru samoczynnie koryguje `pageIndex` (effect).
19
+
20
+ ## i18n
21
+ Etykiety („Wierszy:", separator zakresu, aria stron) pochodzą z i18n (namespace `paginator`).
22
+ Domyślny język EN; przełączenie/nadpisanie przez `provideKptI18n` — patrz `i18n/llms.txt`.
@@ -6,6 +6,8 @@ Panel z nagłówkiem i opcjonalnym zwijaniem. Import: `import { KptPanel } from
6
6
  - `header`: string
7
7
  - `toggleable`: boolean — pokazuje przycisk zwijania
8
8
  - `collapsed`: model<boolean> (dwukierunkowe)
9
+ - `animated`: boolean (domyślnie true) — animacja zwijania (CSS grid, czysty CSS)
10
+ - `animationDuration`: number (domyślnie 500) — czas animacji w ms
9
11
  - Akcje nagłówka: projekcja `[kptPanelActions]`. Treść: `<ng-content>`.
10
12
 
11
13
  ## Przykład
@@ -1,16 +1,42 @@
1
1
  # KptRichText (kpt-rich-text)
2
2
 
3
- Lekki edytor tekstu sformatowanego (contenteditable) z konfigurowalnym paskiem.
3
+ Lekki edytor tekstu sformatowanego (contenteditable) z konfigurowalnym paskiem sekcji.
4
4
  Wartość = HTML. Bez zależności zewnętrznych. Signal Forms.
5
- Import: `import { KptRichText, KptRichTool } from '@konce-pt/angular';`
5
+ Popover kolorów na CDK Overlay — wymaga `import '@angular/cdk/overlay-prebuilt.css';`
6
+ Import: `import { KptRichText, KptRichTool, KptRichToolbar } from '@konce-pt/angular';`
6
7
 
7
8
  ## Wejścia
8
9
  - `value`: model<string> (HTML)
9
- - `toolbar`: KptRichTool[] = 'bold'|'italic'|'underline'|'strike'|'ul'|'ol'|'link'|'clear'
10
+ - `toolbar`: KptRichToolbar = KptRichTool[] | KptRichTool[][] (płaska lista lub grupy=sekcje).
11
+ Pominięcie narzędzia/grupy je wyłącza; między grupami separator. Domyślnie pełny pasek w 5 sekcjach.
10
12
  - `placeholder`: string; `disabled`/`invalid`/`touched`: boolean; `touch`: output
11
13
 
14
+ ## Narzędzia (KptRichTool)
15
+ - Schowek: `copy`, `paste` (z formatowaniem, oczyszczone), `pasteText` (bez formatowania)
16
+ - Styl: `heading` (select: Normalny/paragraf + Nagłówek 1–6)
17
+ - Format: `bold`, `italic`, `underline`, `strike`, `ul`, `ol`
18
+ - Kolory: `foreColor` (kolor tekstu), `backColor` (kolor tła) — popover z próbkami + `input type=color`
19
+ - Wyrównanie: `alignLeft`, `alignCenter`, `alignRight`, `alignJustify`
20
+ - `table` (wstaw tabelę: popover z siatką NxM). W komórce prawy klik = menu kontekstowe
21
+ (wstaw/usuń wiersz i kolumnę, nagłówek wiersza/kolumny — przełącza td↔th, kolor tła i wyrównanie
22
+ komórki, obramowanie tabeli/komórki — kolor + grubość (cienkie/średnie/grube) lub bez, usuń tabelę).
23
+ Przeciąganie po komórkach = prostokątne zaznaczenie (podświetlone); scalanie/dzielenie komórek
24
+ (colspan/rowspan) z menu; operacje komórki (tło, wyrównanie, obramowanie) działają na całym zaznaczeniu.
25
+ Przeciąganie prawej krawędzi kolumny zmienia jej szerokość.
26
+ Odłożone: selekcja nieregularna, Ctrl+Backspace, zbiorcze formatowanie z górnego paska.
27
+ - `link` (prompt URL), `clear` (usuń formatowanie), `html` (przełącznik podglądu źródła HTML — edycja surowego HTML)
28
+
12
29
  ## Przykład
13
- <kpt-rich-text [formField]="f.body" [toolbar]="['bold','italic','ul','link']" />
30
+ <kpt-rich-text [formField]="f.body" /> <!-- pełny pasek -->
31
+ <kpt-rich-text [(value)]="v" [toolbar]="[['bold','italic'],['ul','ol'],['link']]" />
32
+
33
+ ## i18n
34
+ Wszystkie etykiety (aria narzędzi, style „Normalny/Nagłówek N", prompt linku, menu kontekstowe tabeli,
35
+ popover obramowania, „Własny…") pochodzą z i18n (namespace `richText`, w tym `richText.menu.*`,
36
+ `richText.border.*`). Domyślnie EN — patrz `i18n/llms.txt`.
14
37
 
15
38
  ## Uwagi
16
- Formatowanie przez document.execCommand (przeglądarkowe). Ikony paska z wbudowanego rejestru.
39
+ Formatowanie przez document.execCommand; aktywne narzędzia podświetlane (queryCommandState).
40
+ Wklejanie (natywne i przyciskami) jest sanityzowane (allowlista tagów/stylów; usuwa script/on*/javascript:).
41
+ Schowek „wklej"/„wklej bez formatowania" używa async Clipboard API (wymaga uprawnień przeglądarki).
42
+ Tabele: odłożone na osobne zadanie.
@@ -18,5 +18,9 @@ Wymaga stylów overlay CDK w aplikacji: `import '@angular/cdk/overlay-prebuilt.c
18
18
  - `disabled`/`invalid`/`touched`: boolean; output `touch`.
19
19
  - Klawiatura: Enter/↓ otwiera, ↑/↓ nawigacja, Enter wybiera, Esc zamyka.
20
20
 
21
+ ## i18n
22
+ Etykiety „Szukaj…", „Brak wyników" i aria usuwania chipa z i18n (namespace `select`).
23
+ Domyślnie EN; konfiguracja przez `provideKptI18n` — patrz `i18n/llms.txt`.
24
+
21
25
  ## Tokeny
22
26
  `--kpt-form-field-{bg,text,border,border-hover,border-focus,border-error,radius}`.
@@ -3,11 +3,18 @@
3
3
  Suwak wartości na Signal Forms. Import: `import { KptSlider } from '@konce-pt/angular';`
4
4
 
5
5
  ## Wejścia
6
- - `value`: model<number>; `min`/`max`: number (zgodne z FormValueControl); `step`: number
6
+ - `value`: model<number | [number, number]> — w trybie `range` para `[min, max]`, inaczej pojedyncza liczba
7
+ - `range`: boolean — dwa uchwyty (zakres); `min`/`max`: number (zgodne z FormValueControl); `step`: number
7
8
  - `showValue`: boolean; `disabled`/`invalid`/`touched`; `touch`
8
9
 
9
10
  ## Przykład
10
11
  <kpt-slider [formField]="f.volume" [min]="0" [max]="100" [step]="5" showValue />
12
+ <!-- zakres: wartość jest tablicą [min, max] -->
13
+ <kpt-slider range [(value)]="zakres" [min]="0" [max]="100" showValue />
14
+
15
+ ## Uwagi
16
+ - Tryb `range` używa dwóch nałożonych `input[type=range]`; `pointer-events` aktywne tylko na uchwytach (szyna nie przechwytuje).
17
+ - Uchwyty nie mogą się „minąć” — dolny jest klampowany do górnego i odwrotnie.
11
18
 
12
19
  ## Tokeny
13
20
  Track wypełniany `--kpt-color-primary`, tło `--kpt-color-surface-variant`.
@@ -5,6 +5,8 @@ Import: `import { KptStepper, KptStep } from '@konce-pt/angular';`
5
5
 
6
6
  ## KptStepper
7
7
  - `activeIndex`: model<number>; metody publiczne: `next()`, `prev()`, `goTo(i)`
8
+ - `animated`: boolean (domyślnie true) — animacja przejścia (fade+slide, czysty CSS)
9
+ - `animationDuration`: number (domyślnie 500) — czas animacji w ms
8
10
 
9
11
  ## KptStep
10
12
  - `label`: string (wymagane)
@@ -5,9 +5,13 @@ Import: `import { KptSwitch } from '@konce-pt/angular';`
5
5
 
6
6
  ## Użycie
7
7
  <kpt-switch [formField]="f.notifications" label="Powiadomienia" />
8
+ <!-- tekst stanu zmienia się przy przełączaniu -->
9
+ <kpt-switch [(checked)]="on" onLabel="Włączony" offLabel="Wyłączony" />
8
10
 
9
11
  ## Wejścia
10
- - `checked`: model<boolean>; `label`: string; `disabled`/`invalid`/`touched`: boolean; output `touch`.
12
+ - `checked`: model<boolean>; `label`: string (statyczny); `disabled`/`invalid`/`touched`: boolean; output `touch`.
13
+ - `labelPosition`: 'start' | 'end' (domyślnie 'end') — etykieta `label` z lewej lub z prawej przełącznika.
14
+ - `onLabel`/`offLabel`: string — tekst stanu; wyświetlany wg `checked` (włączony podświetlony `--kpt-color-primary`). Można łączyć ze statycznym `label`.
11
15
 
12
16
  ## Tokeny
13
17
  `--kpt-color-primary`, `--kpt-color-border-strong`, `--kpt-color-surface`, `--kpt-elevation-1`.
@@ -0,0 +1,24 @@
1
+ # KptSwitchGroup (kpt-switch-group)
2
+
3
+ Grupa przełączników. Domyślnie pojedynczy wybór (wzajemnie wykluczające się) — włączenie jednego wyłącza pozostałe.
4
+ Z `multiple` przechodzi w tryb wielokrotny (wartość to tablica zaznaczonych opcji).
5
+ Na Signal Forms (`FormValueControl<T | T[] | null>`, model `value`). Import: `import { KptSwitchGroup } from '@konce-pt/angular';`
6
+
7
+ ## Użycie
8
+ <kpt-switch-group [(value)]="plan" [options]="plans" />
9
+ <!-- wielokrotny wybór: value = T[] -->
10
+ <kpt-switch-group multiple [(value)]="tags" [options]="tagOptions" />
11
+ <!-- plans: KptOption<T>[] = [{ label, value, disabled? }, …] -->
12
+
13
+ ## Wejścia
14
+ - `value`: model<T | T[] | null> — pojedynczy: wartość opcji lub `null`; multiple: tablica wartości zaznaczonych opcji.
15
+ - `options`: KptOption<T>[] — lista opcji.
16
+ - `multiple`: boolean (domyślnie false) — tryb wielokrotnego wyboru; wartość staje się tablicą `T[]`.
17
+ - `orientation`: 'vertical' (domyślnie) | 'horizontal'.
18
+ - `allowDeselect`: boolean (domyślnie true) — czy kliknięcie aktywnej opcji ją odznacza (tylko tryb pojedynczy; w multiple odznaczanie zawsze dozwolone).
19
+ - `disabled`/`invalid`/`touched`: boolean; output `touch`.
20
+
21
+ ## Zasada działania
22
+ Każdy element to `kpt-switch` z jednokierunkowym `[checked]`. W trybie pojedynczym włączenie ustawia `value` na daną
23
+ opcję, co automatycznie gasi pozostałe. W trybie `multiple` wartość jest normalizowana do tablicy — włączenie dodaje
24
+ wartość opcji, wyłączenie ją usuwa. Renderuje `kpt-switch`, więc dziedziczy jego wygląd/tokeny.
@@ -5,6 +5,8 @@ Import: `import { KptTabs, KptTab } from '@konce-pt/angular';`
5
5
 
6
6
  ## KptTabs
7
7
  - `activeIndex`: model<number> (dwukierunkowe)
8
+ - `animated`: boolean (domyślnie true) — animacja przejścia (fade+slide, czysty CSS)
9
+ - `animationDuration`: number (domyślnie 500) — czas animacji w ms
8
10
 
9
11
  ## KptTab
10
12
  - `label`: string (wymagane); `disabled`: boolean