@konce-pt/angular 0.8.3 → 0.9.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/CHANGELOG.md +533 -0
- package/chat/src/lib/llms.txt +160 -0
- package/fesm2022/konce-pt-angular-chat.mjs +1270 -0
- package/fesm2022/konce-pt-angular-chat.mjs.map +1 -0
- package/fesm2022/konce-pt-angular-roadmap.mjs +2 -2
- package/fesm2022/konce-pt-angular.mjs +2154 -600
- package/fesm2022/konce-pt-angular.mjs.map +1 -1
- package/package.json +15 -8
- package/src/lib/backdrop/llms.txt +163 -0
- package/src/lib/button/llms.txt +53 -9
- package/src/lib/button-group/llms.txt +17 -1
- package/src/lib/chip/llms.txt +8 -0
- package/src/lib/data-view/llms.txt +18 -2
- package/src/lib/dialog/llms.txt +10 -0
- package/src/lib/icon-button/llms.txt +1 -0
- package/src/lib/mention/llms.txt +60 -0
- package/src/lib/order-list/llms.txt +13 -2
- package/src/lib/peek/llms.txt +45 -0
- package/src/lib/pick-list/llms.txt +18 -2
- package/src/lib/progress/llms.txt +81 -5
- package/src/lib/rich-text/llms.txt +15 -0
- package/types/konce-pt-angular-chat.d.ts +334 -0
- package/types/konce-pt-angular-chat.d.ts.map +1 -0
- package/types/konce-pt-angular.d.ts +550 -38
- package/types/konce-pt-angular.d.ts.map +1 -1
|
@@ -1,16 +1,92 @@
|
|
|
1
1
|
# KptProgress (kpt-progress)
|
|
2
2
|
|
|
3
|
-
A progress indicator — linear or circular, determinate (
|
|
3
|
+
A progress indicator — linear or circular, determinate (`min`–`max`) or indeterminate (`value` = null).
|
|
4
4
|
Import: `import { KptProgress } from '@konce-pt/angular';`
|
|
5
5
|
|
|
6
|
+
## DOM
|
|
7
|
+
<!-- linear, with a label, a buffer and a value -->
|
|
8
|
+
<kpt-progress class="kpt-progress-host" data-type="linear" data-size="md" data-variant="primary" data-label-position="top">
|
|
9
|
+
<span class="kpt-progress__label">Loading…</span>
|
|
10
|
+
<div class="kpt-progress__linear" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="80">
|
|
11
|
+
<div class="kpt-progress__buffer" style="width: 92%"></div>
|
|
12
|
+
<div class="kpt-progress__bar" style="width: 80%"></div>
|
|
13
|
+
</div>
|
|
14
|
+
<span class="kpt-progress__value" aria-hidden="true">80%</span>
|
|
15
|
+
</kpt-progress>
|
|
16
|
+
|
|
17
|
+
<!-- circular -->
|
|
18
|
+
<kpt-progress class="kpt-progress-host" data-type="circular" data-size="md" data-variant="success">
|
|
19
|
+
<svg class="kpt-progress__circular" viewBox="0 0 40 40" role="progressbar" aria-valuenow="75">
|
|
20
|
+
<circle class="kpt-progress__track" cx="20" cy="20" r="16"></circle>
|
|
21
|
+
<circle class="kpt-progress__bar" cx="20" cy="20" r="16" style="stroke-dasharray: 100.531; stroke-dashoffset: 25.1327"></circle>
|
|
22
|
+
</svg>
|
|
23
|
+
<span class="kpt-progress__value" aria-hidden="true">75%</span>
|
|
24
|
+
</kpt-progress>
|
|
25
|
+
|
|
26
|
+
The label, the track and the value are siblings straight under the host — there is no wrapper element.
|
|
27
|
+
`data-variant`, `data-type`, `data-size` and `data-label-position` all sit on the host, which is also
|
|
28
|
+
where the private `--_color` and `--_thickness` are resolved.
|
|
29
|
+
|
|
6
30
|
## Inputs
|
|
7
|
-
- `value`: number|null (null
|
|
8
|
-
- `
|
|
31
|
+
- `value`: number|null (default null) — a value on the `min`–`max` scale, or null for indeterminate
|
|
32
|
+
- `min`: number (default 0); `max`: number (default 100)
|
|
33
|
+
- `variant`: 'primary'|'success'|'danger'|'warning'|'info' (default 'primary')
|
|
34
|
+
- `type`: 'linear'|'circular' (default 'linear')
|
|
35
|
+
- `size`: 'sm'|'md'|'lg' (default 'md') — track thickness, and arc width on the circular variant
|
|
36
|
+
- `diameter`: number (default 40) — the circular variant's size in pixels
|
|
37
|
+
- `bufferValue`: number|null (default null) — a second, dimmed bar behind the main one; linear only
|
|
38
|
+
- `showValue`: boolean (default false) — turns the value area on; projected content needs it too
|
|
39
|
+
- `valueFormat`: 'percent'|'fraction'|'none' (default 'percent')
|
|
40
|
+
- `label`: string — descriptive text next to the bar; it also becomes the `aria-label`
|
|
41
|
+
- `labelPosition`: 'top'|'bottom'|'end' (default 'top') — ignored by the circular variant
|
|
42
|
+
|
|
43
|
+
## Value label
|
|
44
|
+
`showValue` opens the value area; `valueFormat` decides what goes in it — `percent` renders `80%`,
|
|
45
|
+
`fraction` renders `152 / 160` from `value` and `max`, `none` leaves it empty. Both strings come from
|
|
46
|
+
the `KptMessages` dictionary (`progress.percent`, `progress.fraction`), so a new locale can reshape them.
|
|
47
|
+
|
|
48
|
+
Projected content replaces the formatted value instead of adding to it, which is how a circle shows
|
|
49
|
+
a headline number over a caption. Projection still requires `showValue`, because that input is what
|
|
50
|
+
renders the element the content lands in.
|
|
51
|
+
|
|
52
|
+
The circular variant always centres the value over the arc; `label` is not drawn there, it only feeds
|
|
53
|
+
the accessible name.
|
|
54
|
+
|
|
55
|
+
## How the arc is drawn
|
|
56
|
+
The circle lives in a fixed `viewBox="0 0 40 40"` with `r=16`, so the circumference is computed from
|
|
57
|
+
that radius, not from `diameter` — the SVG scales, the maths does not change. The arc is the dash
|
|
58
|
+
offset: full circumference means empty, zero means complete. `size` only changes `stroke-width`, and
|
|
59
|
+
the widest step still fits inside the box, so no arc is ever clipped.
|
|
60
|
+
|
|
61
|
+
Values outside the range are clamped rather than rejected, `max` ≤ `min` collapses to zero, and the
|
|
62
|
+
buffer is never allowed behind the main bar — a computed percentage that briefly overshoots cannot
|
|
63
|
+
break the drawing.
|
|
9
64
|
|
|
10
65
|
## Examples
|
|
11
66
|
<kpt-progress [value]="60" />
|
|
12
|
-
<kpt-progress
|
|
67
|
+
<kpt-progress [value]="80" label="Loading…" showValue />
|
|
68
|
+
<kpt-progress [value]="152" [max]="160" size="lg" showValue valueFormat="fraction" labelPosition="bottom" />
|
|
69
|
+
<kpt-progress [value]="65" showValue labelPosition="end" />
|
|
70
|
+
<kpt-progress [value]="38" [bufferValue]="62" />
|
|
71
|
+
<kpt-progress type="circular" [value]="80" showValue />
|
|
72
|
+
<kpt-progress type="circular" [value]="72" [diameter]="140" size="lg" showValue>
|
|
73
|
+
<strong>29</strong>
|
|
74
|
+
<small>Excellent</small>
|
|
75
|
+
</kpt-progress>
|
|
13
76
|
<kpt-progress [value]="null" />
|
|
14
77
|
|
|
15
78
|
## Tokens
|
|
16
|
-
`--kpt-color-
|
|
79
|
+
The semantic colour of each variant (`--kpt-color-primary` / `-success` / `-danger` / `-warning` /
|
|
80
|
+
`-info`), plus the component layer: `--kpt-progress-track-bg`, `--kpt-progress-thickness-sm`,
|
|
81
|
+
`--kpt-progress-thickness-md`, `--kpt-progress-thickness-lg`, `--kpt-progress-buffer-opacity`,
|
|
82
|
+
`--kpt-progress-label-fg`, `--kpt-progress-value-fg`, `--kpt-progress-gap`.
|
|
83
|
+
|
|
84
|
+
## Accessibility
|
|
85
|
+
`role="progressbar"` with `aria-valuemin`, `aria-valuemax` and `aria-valuenow`; an indeterminate bar
|
|
86
|
+
leaves the value out, which is how a screen reader learns the progress is unknown rather than zero.
|
|
87
|
+
`valueFormat="fraction"` also sets `aria-valuetext`, so the reader says "152 / 160" instead of
|
|
88
|
+
announcing the raw number as a percentage. The visible value is `aria-hidden`, so it is never read
|
|
89
|
+
twice. The accessible name comes from `label`, or from the dictionary when there is none.
|
|
90
|
+
|
|
91
|
+
Under `prefers-reduced-motion: reduce` the indeterminate animation slows down instead of stopping —
|
|
92
|
+
a frozen progress indicator reads as a hung application.
|
|
@@ -12,6 +12,21 @@ Import: `import { KptRichText, KptRichTool, KptRichToolbar } from '@konce-pt/ang
|
|
|
12
12
|
- `placeholder`: string; `disabled`/`invalid`/`touched`: boolean; `touch`: output
|
|
13
13
|
- `maxListLevel`: number = 6 — the maximum list nesting depth. The limit applies to interaction
|
|
14
14
|
(Tab and the `indent`/`outdent` tools); pasted content is not flattened, so that no data is lost.
|
|
15
|
+
- `mentions`: `readonly KptMentionItem[]` — suggestions for `@`; an empty list turns the mechanism
|
|
16
|
+
off, so `@` stays an ordinary character. `mentionLimit`: number = 8; `(mentioned)` fires with the
|
|
17
|
+
inserted entry — the moment to notify a person or attach a link.
|
|
18
|
+
|
|
19
|
+
## Mentions (`@`)
|
|
20
|
+
With `mentions` set, typing `@` opens a suggestion list anchored at the caret: arrows move through
|
|
21
|
+
it, Enter or Tab inserts, Escape closes. The query is read from the **text node** at the caret, not
|
|
22
|
+
from the HTML, and recognised by `mentionQuery()` from `@konce-pt/mention` — the same rules as in a
|
|
23
|
+
plain text field.
|
|
24
|
+
|
|
25
|
+
An inserted mention is `<span class="kpt-mention" data-mention="id" contenteditable="false">@Name`
|
|
26
|
+
plus a non-breaking space. The id survives a rename and the round trip through the value;
|
|
27
|
+
`contenteditable="false"` keeps the mention in one piece, and the space is what gives the caret a
|
|
28
|
+
place to stand after a block it cannot enter. Both attributes are on the sanitizer's allowlist —
|
|
29
|
+
they are inert, so they open no new door.
|
|
15
30
|
|
|
16
31
|
## Tools (KptRichTool)
|
|
17
32
|
- Clipboard: `copy`, `paste` (with formatting, sanitized), `pasteText` (without formatting)
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef } from '@angular/core';
|
|
3
|
+
import { KptI18n } from '@konce-pt/angular';
|
|
4
|
+
import { KptChatMessage as KptChatMessage$1, KptChatAuthor, KptChatReactionOption, KptChatReplyRef, KptChatRow, KptChatDateLabel, KptChatAttachment, KptChatReaction, KptChatStatus, KptChatGroupPosition } from '@konce-pt/chat';
|
|
5
|
+
export { KPT_CHAT_GROUP_GAP_MS, KPT_CHAT_REACTIONS, KptChatAttachment, KptChatAuthor, KptChatDateLabel, KptChatDateRow, KptChatGroupOptions, KptChatGroupPosition, KptChatMessage as KptChatMessageModel, KptChatMessageRow, KptChatReaction, KptChatReactionKind, KptChatReactionOption, KptChatReplyRef, KptChatRow, KptChatStatus, KptChatUnreadRow, buildChatRows, canRetry, chatDayIndicator, dateLabel, diffInDays, isSameDay, mergeStatus, pendingCount, replyRefFrom, startOfDay, statusRank, toDate, toggleReaction } from '@konce-pt/chat';
|
|
6
|
+
|
|
7
|
+
/** Wybór reakcji na wiadomości — komponent mówi, w co kliknięto, dopisanie należy do aplikacji. */
|
|
8
|
+
interface KptChatReactEvent<T = unknown> {
|
|
9
|
+
message: KptChatMessage$1<T>;
|
|
10
|
+
emoji: string;
|
|
11
|
+
}
|
|
12
|
+
/** Wiersz separatora daty z gotową etykietą — tłumaczenie robi komponent, nie rdzeń. */
|
|
13
|
+
type KptChatDateViewRow = {
|
|
14
|
+
kind: 'date';
|
|
15
|
+
key: string;
|
|
16
|
+
date: Date;
|
|
17
|
+
label: KptChatDateLabel;
|
|
18
|
+
text: string;
|
|
19
|
+
};
|
|
20
|
+
type KptChatViewRow<T> = KptChatDateViewRow | Exclude<KptChatRow<T>, {
|
|
21
|
+
kind: 'date';
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Lista rozmowy — grupuje wiadomości, wstawia separatory dni i dzielnik nieprzeczytanych,
|
|
25
|
+
* trzyma widok przy dole i pokazuje pasek offline z liczbą wiadomości czekających na wysłanie.
|
|
26
|
+
*
|
|
27
|
+
* Sama logika wierszy mieszka w `@konce-pt/chat` (`buildChatRows`), więc port Reacta liczy ją
|
|
28
|
+
* tak samo. Komponent nie ma nic wspólnego z transportem: wiadomości dostaje, a `(retry)`
|
|
29
|
+
* i `(loadMore)` tylko zgłasza — ponowieniem wysyłki i dociąganiem historii zajmuje się aplikacja.
|
|
30
|
+
*
|
|
31
|
+
* Treść bąbla można podmienić własnym `<ng-template>`; kontekst dostaje wiadomość jako
|
|
32
|
+
* `$implicit` i cały wiersz jako `row`.
|
|
33
|
+
*
|
|
34
|
+
* Kompozytor (`kpt-chat-composer`) jest osobnym komponentem i stoi obok listy — dzięki temu
|
|
35
|
+
* czat bez pola wpisywania (podgląd, archiwum) nie wozi go ze sobą.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* <kpt-chat [messages]="messages()" currentUser="me" [typing]="typing()" (retry)="resend($event)" />
|
|
39
|
+
*/
|
|
40
|
+
declare class KptChat<T = unknown> {
|
|
41
|
+
/** Wiadomości w kolejności chronologicznej — komponent ich nie sortuje. */
|
|
42
|
+
readonly messages: _angular_core.InputSignal<readonly KptChatMessage$1<T>[]>;
|
|
43
|
+
/** `id` nadawcy uznawanego za „mnie": jego wiadomości idą na prawo i mają status. */
|
|
44
|
+
readonly currentUser: _angular_core.InputSignal<string>;
|
|
45
|
+
/** Przerwa łamiąca grupę wiadomości jednego nadawcy. */
|
|
46
|
+
readonly groupGapMs: _angular_core.InputSignal<number>;
|
|
47
|
+
/** `id` pierwszej nieprzeczytanej wiadomości — nad nią stanie dzielnik. */
|
|
48
|
+
readonly unreadFrom: _angular_core.InputSignal<string | null>;
|
|
49
|
+
/** Brak połączenia: pasek u góry listy z liczbą wiadomości czekających na wysłanie. */
|
|
50
|
+
readonly offline: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
51
|
+
/** Osoby piszące w tej chwili. */
|
|
52
|
+
readonly typing: _angular_core.InputSignal<readonly KptChatAuthor[]>;
|
|
53
|
+
/** Dosuwanie widoku do najnowszej wiadomości, dopóki użytkownik nie odjedzie w górę. */
|
|
54
|
+
readonly autoScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
55
|
+
/** Akcje bąbla pod kursorem: odpowiedz i zareaguj. */
|
|
56
|
+
readonly actions: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
57
|
+
/** Zestaw wybieraka reakcji, przekazywany bąblom. Domyślnie pięć wbudowanych. */
|
|
58
|
+
readonly reactionOptions: _angular_core.InputSignal<readonly KptChatReactionOption[]>;
|
|
59
|
+
/** Własny komunikat pustej rozmowy. */
|
|
60
|
+
readonly emptyLabel: _angular_core.InputSignal<string>;
|
|
61
|
+
readonly retry: _angular_core.OutputEmitterRef<KptChatMessage$1<T>>;
|
|
62
|
+
readonly reply: _angular_core.OutputEmitterRef<KptChatMessage$1<T>>;
|
|
63
|
+
/** Kliknięcie w reakcję w wybieraku: wiadomość i wybrane emoji. */
|
|
64
|
+
readonly react: _angular_core.OutputEmitterRef<KptChatReactEvent<T>>;
|
|
65
|
+
readonly quoted: _angular_core.OutputEmitterRef<KptChatReplyRef>;
|
|
66
|
+
/** Przewinięcie na sam szczyt — moment na dociągnięcie starszych wiadomości. */
|
|
67
|
+
readonly loadMore: _angular_core.OutputEmitterRef<void>;
|
|
68
|
+
protected readonly i18n: KptI18n;
|
|
69
|
+
protected readonly messageTpl: _angular_core.Signal<TemplateRef<any> | undefined>;
|
|
70
|
+
private readonly viewport;
|
|
71
|
+
private readonly day;
|
|
72
|
+
private readonly destroyRef;
|
|
73
|
+
/** Czy widok stoi przy dole listy. Odjazd w górę wyłącza dosuwanie. */
|
|
74
|
+
protected readonly pinned: _angular_core.WritableSignal<boolean>;
|
|
75
|
+
/** Ile wiadomości przyszło, odkąd użytkownik odjechał w górę. */
|
|
76
|
+
protected readonly newCount: _angular_core.WritableSignal<number>;
|
|
77
|
+
/** Tekst pływającej pigułki dnia — zostaje po zgaszeniu, żeby jej pas nie zmieniał wysokości. */
|
|
78
|
+
protected readonly dayLabel: _angular_core.WritableSignal<string>;
|
|
79
|
+
/** Czy pigułka dnia jest widoczna. */
|
|
80
|
+
protected readonly dayVisible: _angular_core.WritableSignal<boolean>;
|
|
81
|
+
private lastCount;
|
|
82
|
+
private wasAtTop;
|
|
83
|
+
protected readonly rows: _angular_core.Signal<KptChatRow<T>[]>;
|
|
84
|
+
protected readonly viewRows: _angular_core.Signal<KptChatViewRow<T>[]>;
|
|
85
|
+
protected readonly pending: _angular_core.Signal<number>;
|
|
86
|
+
constructor();
|
|
87
|
+
/** Przewija do najnowszej wiadomości i kasuje licznik nowych. */
|
|
88
|
+
jumpToLatest(): void;
|
|
89
|
+
protected onScroll(element: HTMLElement): void;
|
|
90
|
+
/**
|
|
91
|
+
* Ustawia tekst pływającej pigułki dnia — co ma na niej być, liczy `chatDayIndicator`
|
|
92
|
+
* z `@konce-pt/chat`, tutaj zostaje czytanie prostokątów i przepisanie etykiety.
|
|
93
|
+
*
|
|
94
|
+
* Wszystkie pomiary idą przed zapisem sygnału, więc przeglądarka przelicza układ raz
|
|
95
|
+
* na klatkę zamiast przy każdym wierszu.
|
|
96
|
+
*/
|
|
97
|
+
private syncDay;
|
|
98
|
+
private scrollToBottom;
|
|
99
|
+
/**
|
|
100
|
+
* Etykieta separatora dnia. Rdzeń zwraca rodzaj, słownik daje „dziś"/„wczoraj",
|
|
101
|
+
* a nazwę dnia i pełną datę — `Intl`, żeby nie trzymać w słowniku kalendarza.
|
|
102
|
+
*/
|
|
103
|
+
private dateText;
|
|
104
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptChat<any>, never>;
|
|
105
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptChat<any>, "kpt-chat", never, { "messages": { "alias": "messages"; "required": false; "isSignal": true; }; "currentUser": { "alias": "currentUser"; "required": false; "isSignal": true; }; "groupGapMs": { "alias": "groupGapMs"; "required": false; "isSignal": true; }; "unreadFrom": { "alias": "unreadFrom"; "required": false; "isSignal": true; }; "offline": { "alias": "offline"; "required": false; "isSignal": true; }; "typing": { "alias": "typing"; "required": false; "isSignal": true; }; "autoScroll": { "alias": "autoScroll"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "reactionOptions": { "alias": "reactionOptions"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; }, { "retry": "retry"; "reply": "reply"; "react": "react"; "quoted": "quoted"; "loadMore": "loadMore"; }, ["messageTpl"], never, true, never>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Wygląd bąbla. `system` nie rysuje bąbla w ogóle — to komunikat, nie wypowiedź. */
|
|
109
|
+
type KptChatMessageVariant = 'neutral' | 'primary' | 'solid' | 'ghost' | 'system';
|
|
110
|
+
/**
|
|
111
|
+
* Pojedyncza wiadomość czatu — bąbel z treścią, godziną, statusem wysyłki i opcjonalnym
|
|
112
|
+
* awatarem, cytatem, załącznikami i reakcjami.
|
|
113
|
+
*
|
|
114
|
+
* Działa na dwa sposoby: dostaje gotowy obiekt przez `[message]` (tak używa go `kpt-chat`)
|
|
115
|
+
* albo pojedyncze inputy, gdy budujesz listę samodzielnie. Treść można też wrzucić
|
|
116
|
+
* przez `<ng-content />` — projekcja wygrywa z `text`, więc bąbel przyjmuje cokolwiek.
|
|
117
|
+
*
|
|
118
|
+
* Wygląd wewnątrz grupy steruje `position`: zapadnięty narożnik od strony nadawcy i ogonek
|
|
119
|
+
* tylko przy ostatnim bąblu. Wylicza to `buildChatRows()` z `@konce-pt/chat`.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* <kpt-chat-message [message]="msg" align="end" position="last" />
|
|
123
|
+
* <kpt-chat-message align="end" status="failed" (retry)="resend()">Nie poszło</kpt-chat-message>
|
|
124
|
+
*/
|
|
125
|
+
declare class KptChatMessage {
|
|
126
|
+
/** Cała wiadomość naraz. Pojedyncze inputy poniżej mają nad nią priorytet. */
|
|
127
|
+
readonly message: _angular_core.InputSignal<KptChatMessage$1<unknown> | null>;
|
|
128
|
+
readonly author: _angular_core.InputSignal<KptChatAuthor | null>;
|
|
129
|
+
readonly text: _angular_core.InputSignal<string | null>;
|
|
130
|
+
readonly time: _angular_core.InputSignal<string | number | Date | null>;
|
|
131
|
+
readonly attachments: _angular_core.InputSignal<readonly KptChatAttachment[] | null>;
|
|
132
|
+
readonly reactions: _angular_core.InputSignal<readonly KptChatReaction[] | null>;
|
|
133
|
+
readonly replyTo: _angular_core.InputSignal<KptChatReplyRef | null>;
|
|
134
|
+
readonly status: _angular_core.InputSignal<KptChatStatus | null>;
|
|
135
|
+
/** Strona listy: `start` to cudza wiadomość, `end` własna. */
|
|
136
|
+
readonly align: _angular_core.InputSignal<"start" | "end">;
|
|
137
|
+
/** Wariant kolorystyczny; bez niego wynika z `align` (własna = `primary`). */
|
|
138
|
+
readonly variant: _angular_core.InputSignal<KptChatMessageVariant | null>;
|
|
139
|
+
readonly position: _angular_core.InputSignal<KptChatGroupPosition>;
|
|
140
|
+
readonly system: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
141
|
+
readonly showAuthor: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
142
|
+
readonly showAvatar: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
143
|
+
readonly showMeta: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
144
|
+
readonly tail: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
145
|
+
/** Akcje pod kursorem: odpowiedz i zareaguj. Domyślnie wyłączone. */
|
|
146
|
+
readonly actions: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
147
|
+
/** Zestaw wybieraka reakcji. Domyślnie pięć wbudowanych; można go skrócić lub przestawić. */
|
|
148
|
+
readonly reactionOptions: _angular_core.InputSignal<readonly KptChatReactionOption[]>;
|
|
149
|
+
readonly retry: _angular_core.OutputEmitterRef<void>;
|
|
150
|
+
readonly reply: _angular_core.OutputEmitterRef<void>;
|
|
151
|
+
/** Wybrana reakcja (emoji). Biblioteka niczego nie dopisuje do modelu — robi to aplikacja. */
|
|
152
|
+
readonly react: _angular_core.OutputEmitterRef<string>;
|
|
153
|
+
/** Kliknięcie w cytat — aplikacja może przewinąć listę do oryginału. */
|
|
154
|
+
readonly quoted: _angular_core.OutputEmitterRef<KptChatReplyRef>;
|
|
155
|
+
protected readonly i18n: KptI18n;
|
|
156
|
+
private readonly host;
|
|
157
|
+
/** Czy wybierak reakcji jest otwarty. */
|
|
158
|
+
protected readonly pickerOpen: _angular_core.WritableSignal<boolean>;
|
|
159
|
+
constructor();
|
|
160
|
+
protected readonly isSystem: _angular_core.Signal<boolean>;
|
|
161
|
+
protected readonly resolvedAuthor: _angular_core.Signal<KptChatAuthor | null>;
|
|
162
|
+
protected readonly resolvedText: _angular_core.Signal<string>;
|
|
163
|
+
protected readonly resolvedStatus: _angular_core.Signal<KptChatStatus | null>;
|
|
164
|
+
protected readonly resolvedReplyTo: _angular_core.Signal<KptChatReplyRef | null>;
|
|
165
|
+
protected readonly resolvedAttachments: _angular_core.Signal<readonly KptChatAttachment[]>;
|
|
166
|
+
protected readonly resolvedReactions: _angular_core.Signal<readonly KptChatReaction[]>;
|
|
167
|
+
protected readonly sentAt: _angular_core.Signal<Date | null>;
|
|
168
|
+
/**
|
|
169
|
+
* Wariant domyślny bierze się z wyrównania. Własna wiadomość dostaje pełny `solid`,
|
|
170
|
+
* bo motyw biblioteki jest monochromatyczny: pastelowy `primary-subtle` ma tę samą
|
|
171
|
+
* jasność co `muted`, więc własny i cudzy bąbel byłyby nie do odróżnienia. Kto woli
|
|
172
|
+
* ciszej, ustawia `variant="primary"` ręcznie.
|
|
173
|
+
*/
|
|
174
|
+
protected readonly resolvedVariant: _angular_core.Signal<KptChatMessageVariant>;
|
|
175
|
+
/** Ogonek tylko na końcu grupy i tylko tam, gdzie bąbel ma tło, z którego da się go wyciąć. */
|
|
176
|
+
protected readonly hasTail: _angular_core.Signal<boolean>;
|
|
177
|
+
protected readonly canRetry: _angular_core.Signal<boolean>;
|
|
178
|
+
protected readonly statusIcon: _angular_core.Signal<string | null>;
|
|
179
|
+
protected readonly timeLabel: _angular_core.Signal<string>;
|
|
180
|
+
protected readonly isoTime: _angular_core.Signal<string | null>;
|
|
181
|
+
/**
|
|
182
|
+
* Etykieta dla czytnika ekranu. Bez niej z bąbla płynie sama treść — bez nadawcy,
|
|
183
|
+
* godziny i informacji, że wiadomość się nie wysłała.
|
|
184
|
+
*/
|
|
185
|
+
protected readonly ariaLabel: _angular_core.Signal<string>;
|
|
186
|
+
protected readonly statusLabel: _angular_core.Signal<string>;
|
|
187
|
+
/** Etykieta opcji wybieraka — `like` → `chat.reactLike`. */
|
|
188
|
+
protected reactionLabel(option: KptChatReactionOption): string;
|
|
189
|
+
/** Czy bieżący użytkownik dał już tę reakcję — opcja wybieraka pokazuje to przez `aria-pressed`. */
|
|
190
|
+
protected hasReacted(emoji: string): boolean;
|
|
191
|
+
protected pick(emoji: string): void;
|
|
192
|
+
/** Wyjście fokusu poza wybierak zamyka go — przechodzenie Tabem między opcjami nie. */
|
|
193
|
+
protected onPickerFocusOut(event: FocusEvent): void;
|
|
194
|
+
/** Rozmiar załącznika w kB/MB — surowe bajty nic nie mówią przy pliku obok nazwy. */
|
|
195
|
+
protected fileSize(bytes?: number): string;
|
|
196
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptChatMessage, never>;
|
|
197
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptChatMessage, "kpt-chat-message", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "author": { "alias": "author"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "time": { "alias": "time"; "required": false; "isSignal": true; }; "attachments": { "alias": "attachments"; "required": false; "isSignal": true; }; "reactions": { "alias": "reactions"; "required": false; "isSignal": true; }; "replyTo": { "alias": "replyTo"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "system": { "alias": "system"; "required": false; "isSignal": true; }; "showAuthor": { "alias": "showAuthor"; "required": false; "isSignal": true; }; "showAvatar": { "alias": "showAvatar"; "required": false; "isSignal": true; }; "showMeta": { "alias": "showMeta"; "required": false; "isSignal": true; }; "tail": { "alias": "tail"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "reactionOptions": { "alias": "reactionOptions"; "required": false; "isSignal": true; }; }, { "retry": "retry"; "reply": "reply"; "react": "react"; "quoted": "quoted"; }, never, ["*"], true, never>;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Wskaźnik pisania — trzy kropki i informacja, kto pisze.
|
|
202
|
+
*
|
|
203
|
+
* Pusta lista autorów nie renderuje niczego, więc można go trzymać w szablonie na stałe
|
|
204
|
+
* i sterować wyłącznie danymi.
|
|
205
|
+
*
|
|
206
|
+
* Element jest `role="status"` z `aria-live="polite"`: czytnik ogłasza wejście i zniknięcie
|
|
207
|
+
* wskaźnika, ale nie przerywa czytania wiadomości. Sama animacja kropek nic nie mówi —
|
|
208
|
+
* informację niesie etykieta.
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* <kpt-chat-typing [authors]="typing()" />
|
|
212
|
+
*/
|
|
213
|
+
declare class KptChatTyping {
|
|
214
|
+
/** Osoby piszące w tej chwili. Pusta lista chowa wskaźnik. */
|
|
215
|
+
readonly authors: _angular_core.InputSignal<readonly KptChatAuthor[]>;
|
|
216
|
+
/** Własna etykieta zamiast tej ze słownika. */
|
|
217
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
218
|
+
protected readonly i18n: KptI18n;
|
|
219
|
+
protected readonly visible: _angular_core.Signal<boolean>;
|
|
220
|
+
/**
|
|
221
|
+
* Jedna osoba jest wymieniona z imienia, przy większej liczbie liczy się głowy —
|
|
222
|
+
* lista nazwisk rozjeżdża wiersz i i tak nikt jej nie czyta.
|
|
223
|
+
*/
|
|
224
|
+
protected readonly text: _angular_core.Signal<string>;
|
|
225
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptChatTyping, never>;
|
|
226
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptChatTyping, "kpt-chat-typing", never, { "authors": { "alias": "authors"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Ładunek wysyłki. Kompozytor niczego nie wysyła — pakuje dane i oddaje aplikacji. */
|
|
230
|
+
interface KptChatComposerSubmit {
|
|
231
|
+
text: string;
|
|
232
|
+
files: readonly File[];
|
|
233
|
+
replyTo: KptChatReplyRef | null;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Pole pisania wiadomości — autorosnące, z załącznikami i paskiem cytatu.
|
|
237
|
+
*
|
|
238
|
+
* Nie jest kontrolką Signal Forms i celowo nią nie będzie: nie wchodzi do formularza, nie ma
|
|
239
|
+
* stanu `touched`/`invalid`, a jego wartość znika po wysłaniu. `model('')` opisuje to wiernie.
|
|
240
|
+
*
|
|
241
|
+
* `Enter` wysyła, `Shift+Enter` łamie linię (`[enterToSend]="false"` odwraca układ).
|
|
242
|
+
* Przy `[offline]` przycisk zmienia etykietę na kolejkowanie — wiadomość dalej da się napisać
|
|
243
|
+
* i oddać aplikacji, bo to ona decyduje, co zrobić z kolejką.
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* <kpt-chat-composer [(value)]="draft" allowAttachments (send)="onSend($event)" />
|
|
247
|
+
*/
|
|
248
|
+
declare class KptChatComposer {
|
|
249
|
+
readonly value: _angular_core.ModelSignal<string>;
|
|
250
|
+
/** Podpowiedź w pustym polu; bez niej etykieta ze słownika. */
|
|
251
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
252
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
253
|
+
/** Brak połączenia — przycisk mówi o kolejkowaniu, nie o wysyłce. */
|
|
254
|
+
readonly offline: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
255
|
+
readonly allowAttachments: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
256
|
+
/** Ile wierszy pole może urosnąć, zanim zacznie się przewijać. */
|
|
257
|
+
readonly maxRows: _angular_core.InputSignal<number>;
|
|
258
|
+
readonly enterToSend: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
259
|
+
/** Wiadomość, na którą odpowiadamy. Po wysłaniu czyści się razem z treścią. */
|
|
260
|
+
readonly replyTo: _angular_core.ModelSignal<KptChatReplyRef | null>;
|
|
261
|
+
readonly send: _angular_core.OutputEmitterRef<KptChatComposerSubmit>;
|
|
262
|
+
/** Pierwsze uderzenie w klawiaturę — sygnał „piszę" dla drugiej strony. */
|
|
263
|
+
readonly typing: _angular_core.OutputEmitterRef<void>;
|
|
264
|
+
protected readonly i18n: KptI18n;
|
|
265
|
+
protected readonly files: _angular_core.WritableSignal<readonly File[]>;
|
|
266
|
+
protected readonly canSend: _angular_core.Signal<boolean>;
|
|
267
|
+
protected readonly sendLabel: _angular_core.Signal<string>;
|
|
268
|
+
protected onInput(element: HTMLTextAreaElement): void;
|
|
269
|
+
protected onKeydown(event: KeyboardEvent, element: HTMLTextAreaElement): void;
|
|
270
|
+
protected submit(element?: HTMLTextAreaElement): void;
|
|
271
|
+
protected onFiles(input: HTMLInputElement): void;
|
|
272
|
+
protected removeFile(file: File): void;
|
|
273
|
+
/**
|
|
274
|
+
* Wysokość liczona od treści. Zerowanie przed odczytem `scrollHeight` jest konieczne:
|
|
275
|
+
* bez niego pole potrafi tylko rosnąć, bo `scrollHeight` nigdy nie zejdzie poniżej
|
|
276
|
+
* ustawionej wcześniej wysokości. Górny limit trzyma CSS (`--_max-rows`).
|
|
277
|
+
*/
|
|
278
|
+
private grow;
|
|
279
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptChatComposer, never>;
|
|
280
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptChatComposer, "kpt-chat-composer", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "offline": { "alias": "offline"; "required": false; "isSignal": true; }; "allowAttachments": { "alias": "allowAttachments"; "required": false; "isSignal": true; }; "maxRows": { "alias": "maxRows"; "required": false; "isSignal": true; }; "enterToSend": { "alias": "enterToSend"; "required": false; "isSignal": true; }; "replyTo": { "alias": "replyTo"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "replyTo": "replyToChange"; "send": "send"; "typing": "typing"; }, never, never, true, never>;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
type KptChatDockPosition = 'bottom-end' | 'bottom-start';
|
|
284
|
+
/**
|
|
285
|
+
* Pływający czat w rogu ekranu — FAB z licznikiem nieprzeczytanych i panel z rozmową.
|
|
286
|
+
*
|
|
287
|
+
* Zawartość panelu jest rzutowana, więc dock nie wie nic o wiadomościach: wkłada się do niego
|
|
288
|
+
* `kpt-chat` i `kpt-chat-composer` (albo cokolwiek innego). Sam FAB to `kpt-fab` — dock go
|
|
289
|
+
* używa, nie zastępuje.
|
|
290
|
+
*
|
|
291
|
+
* Poniżej `--kpt-breakpoint-sm` panel wchodzi na pełny ekran: 22,5 cm szerokości na telefonie
|
|
292
|
+
* to nie panel, tylko szpara.
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* <kpt-chat-dock [(open)]="chatOpen" [unread]="unread()" header="Wsparcie">
|
|
296
|
+
* <kpt-chat [messages]="messages()" currentUser="me" />
|
|
297
|
+
* <kpt-chat-composer (send)="onSend($event)" />
|
|
298
|
+
* </kpt-chat-dock>
|
|
299
|
+
*/
|
|
300
|
+
declare class KptChatDock {
|
|
301
|
+
readonly open: _angular_core.ModelSignal<boolean>;
|
|
302
|
+
readonly position: _angular_core.InputSignal<KptChatDockPosition>;
|
|
303
|
+
/** Licznik na plakietce FAB-a. Zero chowa plakietkę. */
|
|
304
|
+
readonly unread: _angular_core.InputSignal<number>;
|
|
305
|
+
readonly header: _angular_core.InputSignal<string>;
|
|
306
|
+
/** Ikona zamkniętego FAB-a; otwarty zawsze pokazuje krzyżyk. */
|
|
307
|
+
readonly icon: _angular_core.InputSignal<string>;
|
|
308
|
+
/** Szerokość panelu na ekranach powyżej `--kpt-breakpoint-sm`. */
|
|
309
|
+
readonly width: _angular_core.InputSignal<string>;
|
|
310
|
+
/**
|
|
311
|
+
* Odsunięcie od rogu ekranu (dowolna długość CSS), wspólne dla obu osi.
|
|
312
|
+
* Domyślnie `--kpt-space-6`. Przydaje się, gdy w tym samym rogu stoi już inny widget —
|
|
313
|
+
* `kpt-scroll-top` przykleja się dokładnie tam samo i bez tego oba się nakładają.
|
|
314
|
+
*/
|
|
315
|
+
readonly offset: _angular_core.InputSignal<string>;
|
|
316
|
+
protected readonly i18n: KptI18n;
|
|
317
|
+
private readonly panel;
|
|
318
|
+
private readonly trigger;
|
|
319
|
+
protected readonly triggerLabel: _angular_core.Signal<string>;
|
|
320
|
+
constructor();
|
|
321
|
+
protected toggle(): void;
|
|
322
|
+
close(): void;
|
|
323
|
+
/**
|
|
324
|
+
* Fokus ląduje na polu pisania, jeśli w panelu jest — po to się czat otwiera.
|
|
325
|
+
* Bez pola bierze pierwszy element interaktywny, a w ostateczności sam panel.
|
|
326
|
+
*/
|
|
327
|
+
private focusPanel;
|
|
328
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptChatDock, never>;
|
|
329
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptChatDock, "kpt-chat-dock", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "unread": { "alias": "unread"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*"], true, never>;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export { KptChat, KptChatComposer, KptChatDock, KptChatMessage, KptChatTyping };
|
|
333
|
+
export type { KptChatComposerSubmit, KptChatDockPosition, KptChatMessageVariant, KptChatReactEvent };
|
|
334
|
+
//# sourceMappingURL=konce-pt-angular-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"konce-pt-angular-chat.d.ts","sources":["../../chat/src/lib/chat.component.ts","../../chat/src/lib/chat-message.component.ts","../../chat/src/lib/chat-typing.component.ts","../../chat/src/lib/chat-composer.component.ts","../../chat/src/lib/chat-dock.component.ts"],"mappings":"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","names":["KptChatMessageModel"]}
|