@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/README.md +60 -1
- package/dist/README.md +60 -1
- package/dist/fesm2022/konce-pt-angular.mjs +3081 -482
- package/dist/fesm2022/konce-pt-angular.mjs.map +1 -1
- package/dist/package.json +1 -1
- package/dist/src/lib/accordion/llms.txt +2 -0
- package/dist/src/lib/card/llms.txt +21 -0
- package/dist/src/lib/confirm/llms.txt +4 -0
- package/dist/src/lib/data-table/llms.txt +40 -6
- package/dist/src/lib/date-range/llms.txt +14 -5
- package/dist/src/lib/datepicker/llms.txt +22 -4
- package/dist/src/lib/fieldset/llms.txt +2 -0
- package/dist/src/lib/form-field/llms.txt +20 -0
- package/dist/src/lib/i18n/llms.txt +35 -0
- package/dist/src/lib/icon/llms.txt +3 -1
- package/dist/src/lib/megamenu/llms.txt +2 -0
- package/dist/src/lib/menubar/llms.txt +2 -0
- package/dist/src/lib/paginator/llms.txt +4 -0
- package/dist/src/lib/panel/llms.txt +2 -0
- package/dist/src/lib/rich-text/llms.txt +31 -5
- package/dist/src/lib/select/llms.txt +4 -0
- package/dist/src/lib/slider/llms.txt +8 -1
- package/dist/src/lib/stepper/llms.txt +2 -0
- package/dist/src/lib/switch/llms.txt +5 -1
- package/dist/src/lib/switch-group/llms.txt +24 -0
- package/dist/src/lib/tabs/llms.txt +2 -0
- package/dist/types/konce-pt-angular.d.ts +780 -41
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konce-pt/angular",
|
|
3
|
-
"version": "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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
- `
|
|
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ść
|
|
15
|
-
|
|
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.
|
|
4
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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[] =
|
|
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"
|
|
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
|
|
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
|
|
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
|