@kraft.stitch/angular 0.0.0-stage → 0.0.2

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.
@@ -0,0 +1,2247 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
3
+ import { KsVariant, KsBaseSize, KsBaseVariant, KsSize, Palette, ThemeMode, KsPosition, LoaderStateEnum, KsToastPosition } from '@kraft.stitch/core';
4
+ export { KsToast, KsToastPosition, toastStore } from '@kraft.stitch/core';
5
+ import { ControlValueAccessor } from '@angular/forms';
6
+
7
+ /** DOM shape of the real `<ks-button>` custom element, typed for the wrapper. */
8
+ type KsButtonElement = HTMLElement & {
9
+ icon: string;
10
+ name: string;
11
+ variant: KsVariant;
12
+ size: KsBaseSize;
13
+ isRounded: boolean;
14
+ disabled: boolean;
15
+ };
16
+ /**
17
+ * Angular wrapper around the `<ks-button>` Stencil custom element.
18
+ *
19
+ * ## How this actually renders a button (no markup lives in this file)
20
+ *
21
+ * 1. A parent template writes `<ks-button name="Save" (ksClick)="save()">`.
22
+ * 2. Angular's renderer creates that host node with
23
+ * `document.createElement('ks-button')`. Because the side-effect import
24
+ * above already ran `customElements.define('ks-button', ...)`, the
25
+ * **browser itself** immediately upgrades that node into an instance of
26
+ * Stencil's compiled `KsButton` class — this is standard Custom Elements
27
+ * behavior, nothing Angular-specific.
28
+ * 3. That upgrade runs Stencil's `connectedCallback` → `render()`, which
29
+ * injects the real `<button>…</button>` markup as children of the host
30
+ * node. This happens **regardless of Angular** — it's the same thing
31
+ * that would happen if you dropped `<ks-button>` in a plain HTML file.
32
+ * 4. `KsButtonComponent` (this class) is a *second, independent* thing
33
+ * attached to that same host node — Angular doesn't care that the node
34
+ * is also a custom element instance. Its only job is translation:
35
+ * push signal-input values onto the element's real DOM properties, and
36
+ * re-emit the native `clicked` DOM event as an Angular `output()`.
37
+ *
38
+ * `template: ''` (no `<ng-content>`) is intentional: `ks-button`'s Stencil
39
+ * `render()` has no `<slot>`, so there is nothing to project — content
40
+ * written between `<ks-button>` tags wouldn't be displayed by the real
41
+ * component anyway. Content projection would only make sense here if the
42
+ * wrapped Stencil component actually declared a `<slot>`.
43
+ *
44
+ * ## Why the output is called `ksClick`, NOT `clicked`
45
+ *
46
+ * `<ks-button>` (the Stencil element) dispatches a **native** DOM
47
+ * `CustomEvent` literally named `clicked` on the host node. It is tempting
48
+ * to expose the wrapper's own output using that exact same name so the
49
+ * public API "mirrors" the native event — but doing so creates a **name
50
+ * collision** that makes the event fire twice from a parent template such
51
+ * as `<ks-button (clicked)="log($event)">`:
52
+ *
53
+ * For *any* event binding in a template, Ivy's `ɵɵlistener` instruction
54
+ * does two things whenever the bound name also happens to match a
55
+ * directive/component **output** on that element (`tNode.outputs[name]`):
56
+ * 1. It subscribes the template's handler to that output (`output.emit()`
57
+ * calls it).
58
+ * 2. It **also** attaches a genuine `addEventListener(name, …)` straight
59
+ * onto the host DOM node for that same literal name, independent of
60
+ * step 1 — Ivy can't know whether the name is "just" an output or also
61
+ * a real DOM event some element in the tree might dispatch, so it wires
62
+ * both to be safe.
63
+ *
64
+ * If the output were named `clicked`, both of those fire for the *same*
65
+ * underlying interaction here: (1) our own `this.ksClick.emit(...)` call
66
+ * below invokes the template handler once, and (2) the raw native
67
+ * `clicked` `CustomEvent` that `<ks-button>` dispatches on the host node
68
+ * is picked up by Ivy's own native listener from step 2 and invokes the
69
+ * *same* template handler a second time — with a different, unwrapped
70
+ * event object. (An earlier attempt at fixing this used
71
+ * `@HostListener('clicked', ['$event'])`, which hits the same
72
+ * `tNode.outputs['clicked']` check and instead causes *infinite emit
73
+ * recursion*, since the host listener itself becomes a subscriber of the
74
+ * output it emits on.)
75
+ *
76
+ * Naming the output `ksClick` (no relation to any real DOM event name)
77
+ * removes the collision entirely: a parent writes
78
+ * `<ks-button (ksClick)="log($event)">`, Ivy subscribes that to our
79
+ * output, and the phantom native `addEventListener('ksClick', …)` it also
80
+ * attaches never fires because no such DOM event exists. Only the manual
81
+ * `addEventListener('clicked', …)` below — on the *internal* native event
82
+ * name, never referenced in any template — observes the real click and
83
+ * re-emits it once through `ksClick`. (This mirrors how libraries like
84
+ * Ionic prefix outputs, e.g. `ionChange` instead of `change`, for exactly
85
+ * this reason.)
86
+ */
87
+ declare class KsButtonComponent {
88
+ private readonly el;
89
+ /** Icon class string (e.g. Material Icon or Font Awesome class) */
90
+ readonly icon: _angular_core.InputSignal<string>;
91
+ /** Button label text */
92
+ readonly name: _angular_core.InputSignal<string>;
93
+ /** Visual style variant */
94
+ readonly variant: _angular_core.InputSignal<KsVariant>;
95
+ /** Size */
96
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
97
+ /** Renders the button with fully-rounded pill corners */
98
+ readonly isRounded: _angular_core.InputSignal<boolean>;
99
+ /** Disables the button */
100
+ readonly disabled: _angular_core.InputSignal<boolean>;
101
+ /**
102
+ * Emits the `MouseEvent` from the native `clicked` `CustomEvent`
103
+ * dispatched by `<ks-button>`. Deliberately NOT named `clicked` — see
104
+ * the class doc comment above for why that would fire this event twice.
105
+ */
106
+ readonly ksClick: _angular_core.OutputEmitterRef<MouseEvent>;
107
+ constructor(ref: ElementRef<KsButtonElement>);
108
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsButtonComponent, never>;
109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsButtonComponent, "ks-button", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "isRounded": { "alias": "isRounded"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "ksClick": "ksClick"; }, never, never, true, never>;
110
+ }
111
+
112
+ /**
113
+ * Mirrors `KsButtonGroupItem` exported by
114
+ * `core/src/components/Buttons/button-group/button-group.tsx`.
115
+ *
116
+ * Duplicated here (instead of importing it from `@kraft.stitch/core`) because that
117
+ * package's root barrel (`core/src/index.ts`) is still being assembled and
118
+ * does not yet reliably re-export every per-component type — only the
119
+ * shared enums in `ks-ui.types` (`KsBaseSize`, `KsBaseVariant`, `KsVariant`,
120
+ * imported below) are stable to depend on today. Keep this in sync with the
121
+ * Stencil source if its shape changes.
122
+ */
123
+ interface KsButtonGroupItem {
124
+ key: string;
125
+ label?: string;
126
+ icon?: string;
127
+ disabled?: boolean;
128
+ }
129
+ type KsButtonGroupDisplayStyle = 'default' | 'switch';
130
+ /** DOM shape of the real `<ks-button-group>` custom element, typed for the wrapper. */
131
+ type KsButtonGroupElement = HTMLElement & {
132
+ buttons: KsButtonGroupItem[];
133
+ variant: KsBaseVariant;
134
+ size: KsBaseSize;
135
+ displayStyle: KsButtonGroupDisplayStyle;
136
+ multi: boolean;
137
+ selectable: boolean;
138
+ disabled: boolean;
139
+ };
140
+ /**
141
+ * Angular wrapper around the `<ks-button-group>` Stencil custom element.
142
+ *
143
+ * `template: ''` — the Stencil `render()` for this element has no `<slot>`,
144
+ * so there is nothing for this wrapper to project; every button is
145
+ * generated from the `buttons` input.
146
+ *
147
+ * ## Output naming
148
+ * The native element dispatches DOM `CustomEvent`s named `clicked` and
149
+ * `selectionChanged`. Both outputs below are renamed with a `ks` prefix
150
+ * (`ksClick`, `ksSelectionChange`) rather than reusing those exact strings.
151
+ * Doing so is required, not just cosmetic: for a template binding such as
152
+ * `<ks-button-group (clicked)="...">`, Angular's `ɵɵlistener` instruction
153
+ * *always* attaches a raw `addEventListener('clicked', …)` to the host
154
+ * element in addition to subscribing to a same-named component output —
155
+ * this is unconditional for element nodes (see
156
+ * `packages/core/src/render3/instructions/listener.ts` →
157
+ * `listenerInternal`), not something a custom-elements schema can opt out
158
+ * of. With a same-named output, the parent handler would therefore run
159
+ * *twice* per interaction — once via our own unwrapped `.emit()` call, once
160
+ * via Angular's own raw listener receiving the untouched `CustomEvent`
161
+ * (defeating the "no `event.detail`" requirement). Prefixing every output
162
+ * with `ks` guarantees the literal name never matches a real DOM event, so
163
+ * only our manual listener (below) ever observes it. See `button/button.ts`
164
+ * for the original write-up of this same issue.
165
+ */
166
+ declare class KsButtonGroupComponent {
167
+ private readonly el;
168
+ /** The buttons to render */
169
+ readonly buttons: _angular_core.InputSignal<KsButtonGroupItem[]>;
170
+ /** Visual variant */
171
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
172
+ /** Size */
173
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
174
+ /** Display style: 'default' (filled/outlined) or 'switch' (pill toggle) */
175
+ readonly displayStyle: _angular_core.InputSignal<KsButtonGroupDisplayStyle>;
176
+ /** Allow multiple selected buttons (toggle mode) */
177
+ readonly multi: _angular_core.InputSignal<boolean>;
178
+ /** Toggle/selection mode — shows active state on click */
179
+ readonly selectable: _angular_core.InputSignal<boolean>;
180
+ /** Disables the entire group */
181
+ readonly disabled: _angular_core.InputSignal<boolean>;
182
+ /** Emits the clicked button's `key`. From the native `clicked` event. */
183
+ readonly ksClick: _angular_core.OutputEmitterRef<string>;
184
+ /** Emits the current selection when `selectable`. From the native `selectionChanged` event. */
185
+ readonly ksSelectionChange: _angular_core.OutputEmitterRef<string[]>;
186
+ constructor(ref: ElementRef<KsButtonGroupElement>);
187
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsButtonGroupComponent, never>;
188
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsButtonGroupComponent, "ks-button-group", never, { "buttons": { "alias": "buttons"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "displayStyle": { "alias": "displayStyle"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "ksClick": "ksClick"; "ksSelectionChange": "ksSelectionChange"; }, never, never, true, never>;
189
+ }
190
+
191
+ /**
192
+ * Mirrors `KsChipOption` exported by
193
+ * `core/src/components/Buttons/chips/chips.tsx`. Duplicated locally — see
194
+ * the note in `button-group/button-group.ts` on why component-specific
195
+ * shapes aren't imported from `@kraft.stitch/core`'s root barrel yet.
196
+ */
197
+ interface KsChipOption {
198
+ value: string | number;
199
+ label: string;
200
+ icon?: string;
201
+ disabled?: boolean;
202
+ }
203
+ type KsChipsValue = (string | number) | (string | number)[] | null;
204
+ /** DOM shape of the real `<ks-chips>` custom element, typed for the wrapper. */
205
+ type KsChipsElement = HTMLElement & {
206
+ options: KsChipOption[];
207
+ multi: boolean;
208
+ label: string;
209
+ size: KsBaseSize;
210
+ isRounded: boolean;
211
+ disabled: boolean;
212
+ value: KsChipsValue;
213
+ writeValue(val: KsChipsValue): Promise<void>;
214
+ };
215
+ /**
216
+ * Angular wrapper around the `<ks-chips>` Stencil custom element.
217
+ *
218
+ * ## Two-way binding
219
+ * The Stencil source's own doc comment says Angular forms integration
220
+ * (`ngModel`/`formControl`) would be "provided later by the generated
221
+ * output-target wrappers" — this is that wrapper. Rather than trying to
222
+ * reuse Angular's `[(value)]` banana-box sugar (which would require an
223
+ * output literally named `valueChange`, colliding with the native
224
+ * `valueChange` `CustomEvent` the element already dispatches — see
225
+ * `button/button.ts` for why that double-fires), two-way binding is
226
+ * implemented the idiomatic Angular way: `ControlValueAccessor`. Bind with
227
+ * `[(ngModel)]="fruit"` or `formControlName="fruit"` and it Just Works,
228
+ * because `NgModel`/`FormControlDirective` talk to `writeValue` /
229
+ * `registerOnChange` directly through DI — no template event-name matching
230
+ * involved, so there's no collision to worry about.
231
+ *
232
+ * For plain (non-forms) two-way use, bind explicitly instead:
233
+ * `[value]="fruit" (ksValueChange)="fruit = $event"`.
234
+ *
235
+ * `template: ''` — no `<slot>` in the wrapped Stencil render, nothing to project.
236
+ */
237
+ declare class KsChipsComponent implements ControlValueAccessor {
238
+ private readonly el;
239
+ private onChange;
240
+ private onTouched;
241
+ /** Full list of chip options */
242
+ readonly options: _angular_core.InputSignal<KsChipOption[]>;
243
+ /** Allow selecting multiple chips */
244
+ readonly multi: _angular_core.InputSignal<boolean>;
245
+ /** Field label */
246
+ readonly label: _angular_core.InputSignal<string>;
247
+ /** Size */
248
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
249
+ /** Renders chips with fully-rounded pill corners */
250
+ readonly isRounded: _angular_core.InputSignal<boolean>;
251
+ /** Disabled state */
252
+ readonly disabled: _angular_core.InputSignal<boolean>;
253
+ /** Initial/controlled value for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
254
+ readonly value: _angular_core.InputSignal<KsChipsValue>;
255
+ /** Emits the newly-selected value(s). From the native `valueChange` event. */
256
+ readonly ksValueChange: _angular_core.OutputEmitterRef<KsChipsValue>;
257
+ constructor(ref: ElementRef<KsChipsElement>);
258
+ /** `ControlValueAccessor` — called by `ngModel`/`formControl` to push a value in. */
259
+ writeValue(value: KsChipsValue): void;
260
+ registerOnChange(fn: (value: KsChipsValue) => void): void;
261
+ registerOnTouched(fn: () => void): void;
262
+ setDisabledState(isDisabled: boolean): void;
263
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsChipsComponent, never>;
264
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsChipsComponent, "ks-chips", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "isRounded": { "alias": "isRounded"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; }, never, never, true, never>;
265
+ }
266
+
267
+ /**
268
+ * Mirrors `KsFabAction` / `KsFabPosition` exported by
269
+ * `core/src/components/Buttons/fab/fab.tsx`. Duplicated locally — see the
270
+ * note in `button-group/button-group.ts` for why.
271
+ */
272
+ interface KsFabAction {
273
+ key: string;
274
+ icon: string;
275
+ label?: string;
276
+ variant?: KsBaseVariant;
277
+ }
278
+ type KsFabPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
279
+ /** DOM shape of the real `<ks-fab>` custom element, typed for the wrapper. */
280
+ type KsFabElement = HTMLElement & {
281
+ icon: string;
282
+ label: string;
283
+ variant: KsBaseVariant;
284
+ size: KsBaseSize;
285
+ actions: KsFabAction[];
286
+ disabled: boolean;
287
+ position: KsFabPosition;
288
+ appendToParent: boolean;
289
+ };
290
+ /**
291
+ * Angular wrapper around the `<ks-fab>` Stencil custom element.
292
+ *
293
+ * `ksClick` is renamed away from the native `clicked` event name for the
294
+ * same double-fire reason documented in `button/button.ts` and
295
+ * `button-group/button-group.ts`. `template: ''` — no `<slot>` in the
296
+ * wrapped Stencil render.
297
+ */
298
+ declare class KsFabComponent {
299
+ private readonly el;
300
+ /** Icon for the main FAB button */
301
+ readonly icon: _angular_core.InputSignal<string>;
302
+ /** Accessible label / tooltip */
303
+ readonly label: _angular_core.InputSignal<string>;
304
+ /** Variant */
305
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
306
+ /** Size */
307
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
308
+ /** Speed-dial actions shown on expand */
309
+ readonly actions: _angular_core.InputSignal<KsFabAction[]>;
310
+ /** Disabled */
311
+ readonly disabled: _angular_core.InputSignal<boolean>;
312
+ /** Corner to anchor the FAB inside its nearest positioned container */
313
+ readonly position: _angular_core.InputSignal<KsFabPosition>;
314
+ /** When true (default), positions `absolute` inside the nearest positioned ancestor; when false, `fixed` to the viewport */
315
+ readonly appendToParent: _angular_core.InputSignal<boolean>;
316
+ /** Emits `'main'` for the main button, or a speed-dial action's `key`. From the native `clicked` event. */
317
+ readonly ksClick: _angular_core.OutputEmitterRef<string>;
318
+ constructor(ref: ElementRef<KsFabElement>);
319
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsFabComponent, never>;
320
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsFabComponent, "ks-fab", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "appendToParent": { "alias": "appendToParent"; "required": false; "isSignal": true; }; }, { "ksClick": "ksClick"; }, never, never, true, never>;
321
+ }
322
+
323
+ /** DOM shape of the real `<ks-datepicker>` custom element, typed for the wrapper. */
324
+ type KsDatepickerElement = HTMLElement & {
325
+ label: string;
326
+ placeholder: string;
327
+ minDate: Date | null;
328
+ maxDate: Date | null;
329
+ disabled: boolean;
330
+ selectedDate: Date | null;
331
+ writeValue(val: Date | null): Promise<void>;
332
+ };
333
+ /**
334
+ * Angular wrapper around the `<ks-datepicker>` Stencil custom element.
335
+ *
336
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
337
+ * `formControlName` and it works through DI (`writeValue` /
338
+ * `registerOnChange`), with no template event-name collision to worry
339
+ * about. See `chips/chips.ts` for the full rationale (same pattern, same
340
+ * reason the native `selectedDateChange` event can't be reused verbatim as
341
+ * an Angular output name).
342
+ *
343
+ * For plain (non-forms) two-way use, bind explicitly instead:
344
+ * `[selectedDate]="d" (ksSelectedDateChange)="d = $event"`.
345
+ *
346
+ * `template: ''` — the projected panel content in the Stencil render is
347
+ * internal (calendar grid projected into the shared `<ks-overlay-field>`
348
+ * default slot); there is no slot exposed on `<ks-datepicker>` itself for
349
+ * a consumer to project into.
350
+ */
351
+ declare class KsDatepickerComponent implements ControlValueAccessor {
352
+ private readonly el;
353
+ private onChange;
354
+ private onTouched;
355
+ /** Field label */
356
+ readonly label: _angular_core.InputSignal<string>;
357
+ /** Placeholder text */
358
+ readonly placeholder: _angular_core.InputSignal<string>;
359
+ /** Min selectable date */
360
+ readonly minDate: _angular_core.InputSignal<Date>;
361
+ /** Max selectable date */
362
+ readonly maxDate: _angular_core.InputSignal<Date>;
363
+ /** Disabled state */
364
+ readonly disabled: _angular_core.InputSignal<boolean>;
365
+ /** Initial/controlled value for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
366
+ readonly selectedDate: _angular_core.InputSignal<Date>;
367
+ /** Emits the newly-picked date. From the native `selectedDateChange` event. */
368
+ readonly ksSelectedDateChange: _angular_core.OutputEmitterRef<Date>;
369
+ constructor(ref: ElementRef<KsDatepickerElement>);
370
+ writeValue(value: Date | null): void;
371
+ registerOnChange(fn: (value: Date | null) => void): void;
372
+ registerOnTouched(fn: () => void): void;
373
+ setDisabledState(isDisabled: boolean): void;
374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsDatepickerComponent, never>;
375
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsDatepickerComponent, "ks-datepicker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectedDate": { "alias": "selectedDate"; "required": false; "isSignal": true; }; }, { "ksSelectedDateChange": "ksSelectedDateChange"; }, never, never, true, never>;
376
+ }
377
+
378
+ /**
379
+ * Mirrors `KsDateRange` / `KsPresetRange` exported by
380
+ * `core/src/components/Calendars/daterange/daterange.types.ts`. Duplicated
381
+ * locally — see the note in `button-group/button-group.ts` for why.
382
+ */
383
+ interface KsDateRange {
384
+ start: Date | null;
385
+ end: Date | null;
386
+ }
387
+ interface KsPresetRange {
388
+ label: string;
389
+ range: () => KsDateRange;
390
+ }
391
+ /** DOM shape of the real `<ks-daterange>` custom element, typed for the wrapper. */
392
+ type KsDaterangeElement = HTMLElement & {
393
+ label: string;
394
+ placeholder: string;
395
+ minDate: Date | null;
396
+ maxDate: Date | null;
397
+ presets: KsPresetRange[];
398
+ showPresets: boolean;
399
+ disabled: boolean;
400
+ range: KsDateRange;
401
+ writeValue(val: KsDateRange | null): Promise<void>;
402
+ };
403
+ /**
404
+ * Angular wrapper around the `<ks-daterange>` Stencil custom element.
405
+ *
406
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
407
+ * `formControlName`. See `chips/chips.ts` for the full rationale (the
408
+ * native `rangeChange` event can't be reused verbatim as an Angular output
409
+ * name without a double-fire risk).
410
+ *
411
+ * For plain (non-forms) two-way use, bind explicitly instead:
412
+ * `[range]="r" (ksRangeChange)="r = $event"`.
413
+ *
414
+ * `template: ''` — no slot is exposed on `<ks-daterange>` itself.
415
+ */
416
+ declare class KsDaterangeComponent implements ControlValueAccessor {
417
+ private readonly el;
418
+ private onChange;
419
+ private onTouched;
420
+ readonly label: _angular_core.InputSignal<string>;
421
+ readonly placeholder: _angular_core.InputSignal<string>;
422
+ readonly minDate: _angular_core.InputSignal<Date>;
423
+ readonly maxDate: _angular_core.InputSignal<Date>;
424
+ readonly presets: _angular_core.InputSignal<KsPresetRange[]>;
425
+ readonly showPresets: _angular_core.InputSignal<boolean>;
426
+ readonly disabled: _angular_core.InputSignal<boolean>;
427
+ /** Initial/controlled value for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
428
+ readonly range: _angular_core.InputSignal<KsDateRange>;
429
+ /** Emits the newly-picked range. From the native `rangeChange` event. */
430
+ readonly ksRangeChange: _angular_core.OutputEmitterRef<KsDateRange>;
431
+ constructor(ref: ElementRef<KsDaterangeElement>);
432
+ writeValue(value: KsDateRange | null): void;
433
+ registerOnChange(fn: (value: KsDateRange) => void): void;
434
+ registerOnTouched(fn: () => void): void;
435
+ setDisabledState(isDisabled: boolean): void;
436
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsDaterangeComponent, never>;
437
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsDaterangeComponent, "ks-daterange", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "showPresets": { "alias": "showPresets"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; }, { "ksRangeChange": "ksRangeChange"; }, never, never, true, never>;
438
+ }
439
+
440
+ /**
441
+ * Mirrors `KsTimeValue` exported by
442
+ * `core/src/components/Calendars/timepicker/timepicker.tsx`. Duplicated
443
+ * locally — see the note in `button-group/button-group.ts` for why.
444
+ */
445
+ interface KsTimeValue {
446
+ hours: number;
447
+ minutes: number;
448
+ seconds?: number;
449
+ period?: 'AM' | 'PM';
450
+ }
451
+ /** DOM shape of the real `<ks-timepicker>` custom element, typed for the wrapper. */
452
+ type KsTimepickerElement = HTMLElement & {
453
+ label: string;
454
+ placeholder: string;
455
+ use12Hour: boolean;
456
+ showSeconds: boolean;
457
+ disabled: boolean;
458
+ error: string;
459
+ value: KsTimeValue | null;
460
+ writeValue(val: KsTimeValue | null): Promise<void>;
461
+ };
462
+ /**
463
+ * Angular wrapper around the `<ks-timepicker>` Stencil custom element.
464
+ *
465
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
466
+ * `formControlName`. See `chips/chips.ts` for the full rationale (the
467
+ * native `valueChange` event can't be reused verbatim as an Angular output
468
+ * name without a double-fire risk).
469
+ *
470
+ * For plain (non-forms) two-way use, bind explicitly instead:
471
+ * `[value]="t" (ksValueChange)="t = $event"`.
472
+ *
473
+ * `template: ''` — no slot is exposed on `<ks-timepicker>` itself.
474
+ */
475
+ declare class KsTimepickerComponent implements ControlValueAccessor {
476
+ private readonly el;
477
+ private onChange;
478
+ private onTouched;
479
+ /** Field label */
480
+ readonly label: _angular_core.InputSignal<string>;
481
+ /** Placeholder */
482
+ readonly placeholder: _angular_core.InputSignal<string>;
483
+ /** Use 12-hour clock (AM/PM) */
484
+ readonly use12Hour: _angular_core.InputSignal<boolean>;
485
+ /** Show seconds */
486
+ readonly showSeconds: _angular_core.InputSignal<boolean>;
487
+ /** Disabled */
488
+ readonly disabled: _angular_core.InputSignal<boolean>;
489
+ /** Error message */
490
+ readonly error: _angular_core.InputSignal<string>;
491
+ /** Initial/controlled value for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
492
+ readonly value: _angular_core.ModelSignal<KsTimeValue>;
493
+ /** Emits the confirmed time. From the native `valueChange` event. */
494
+ readonly ksValueChange: _angular_core.OutputEmitterRef<KsTimeValue>;
495
+ constructor(ref: ElementRef<KsTimepickerElement>);
496
+ writeValue(value: KsTimeValue | null): void;
497
+ registerOnChange(fn: (value: KsTimeValue) => void): void;
498
+ registerOnTouched(fn: () => void): void;
499
+ setDisabledState(isDisabled: boolean): void;
500
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTimepickerComponent, never>;
501
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTimepickerComponent, "ks-timepicker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "use12Hour": { "alias": "use12Hour"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "ksValueChange": "ksValueChange"; }, never, never, true, never>;
502
+ }
503
+
504
+ /**
505
+ * Mirrors `KsDropdownOption` exported by
506
+ * `core/src/components/Dropdowns/dropdown/dropdown.tsx`. Duplicated
507
+ * locally — see the note in `button-group/button-group.ts` for why.
508
+ */
509
+ interface KsDropdownOption {
510
+ value: string | number;
511
+ label: string;
512
+ icon?: string;
513
+ disabled?: boolean;
514
+ }
515
+ type KsDropdownValue = (string | number)[] | string | number;
516
+ /** DOM shape of the real `<ks-dropdown>` custom element, typed for the wrapper. */
517
+ type KsDropdownElement = HTMLElement & {
518
+ options: KsDropdownOption[];
519
+ placeholder: string;
520
+ multi: boolean;
521
+ searchable: boolean;
522
+ label: string;
523
+ disabled: boolean;
524
+ selectedValues: (string | number)[];
525
+ writeValue(val: (string | number) | (string | number)[] | null): Promise<void>;
526
+ };
527
+ /**
528
+ * Angular wrapper around the `<ks-dropdown>` Stencil custom element.
529
+ *
530
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
531
+ * `formControlName`. See `chips/chips.ts` for the full rationale (the
532
+ * native `selectedValuesChange` event can't be reused verbatim as an
533
+ * Angular output name without a double-fire risk).
534
+ *
535
+ * For plain (non-forms) two-way use, bind explicitly instead:
536
+ * `[selectedValues]="v" (ksSelectedValuesChange)="v = $event"`.
537
+ *
538
+ * `template: ''` — the option list / search box in the Stencil render are
539
+ * projected into the shared, internal `<ks-overlay-field>` slot; there is
540
+ * no slot exposed on `<ks-dropdown>` itself for a consumer to project into.
541
+ */
542
+ declare class KsDropdownComponent implements ControlValueAccessor {
543
+ private readonly el;
544
+ private onChange;
545
+ private onTouched;
546
+ /** Full list of options */
547
+ readonly options: _angular_core.InputSignal<KsDropdownOption[]>;
548
+ /** Placeholder text shown when nothing is selected */
549
+ readonly placeholder: _angular_core.InputSignal<string>;
550
+ /** Allow selecting multiple options */
551
+ readonly multi: _angular_core.InputSignal<boolean>;
552
+ /** Show a search box inside the dropdown */
553
+ readonly searchable: _angular_core.InputSignal<boolean>;
554
+ /** Field label */
555
+ readonly label: _angular_core.InputSignal<string>;
556
+ /** Disabled state */
557
+ readonly disabled: _angular_core.InputSignal<boolean>;
558
+ /** Initial/controlled selected value(s) for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
559
+ readonly selectedValues: _angular_core.InputSignal<(string | number)[]>;
560
+ /** Emits the new selection — an array when `multi`, otherwise a single value. From the native `selectedValuesChange` event. */
561
+ readonly ksSelectedValuesChange: _angular_core.OutputEmitterRef<KsDropdownValue>;
562
+ constructor(ref: ElementRef<KsDropdownElement>);
563
+ writeValue(value: KsDropdownValue | null): void;
564
+ registerOnChange(fn: (value: KsDropdownValue) => void): void;
565
+ registerOnTouched(fn: () => void): void;
566
+ setDisabledState(isDisabled: boolean): void;
567
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsDropdownComponent, never>;
568
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsDropdownComponent, "ks-dropdown", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectedValues": { "alias": "selectedValues"; "required": false; "isSignal": true; }; }, { "ksSelectedValuesChange": "ksSelectedValuesChange"; }, never, never, true, never>;
569
+ }
570
+
571
+ /**
572
+ * Mirrors `KsListBoxOption` exported by
573
+ * `core/src/components/Dropdowns/listbox/listbox.tsx`. Duplicated locally
574
+ * — see the note in `button-group/button-group.ts` for why.
575
+ */
576
+ interface KsListBoxOption {
577
+ value: string | number;
578
+ label: string;
579
+ icon?: string;
580
+ disabled?: boolean;
581
+ /** Optional group key — used when `groupBy` is enabled */
582
+ group?: string;
583
+ }
584
+ type KsListBoxValue = (string | number)[] | string | number;
585
+ /** DOM shape of the real `<ks-listbox>` custom element, typed for the wrapper. */
586
+ type KsListBoxElement = HTMLElement & {
587
+ options: KsListBoxOption[];
588
+ multi: boolean;
589
+ searchable: boolean;
590
+ disabled: boolean;
591
+ selected: (string | number)[];
592
+ groupBy: boolean;
593
+ writeValue(val: (string | number) | (string | number)[] | null): Promise<void>;
594
+ };
595
+ /**
596
+ * Angular wrapper around the `<ks-listbox>` Stencil custom element.
597
+ *
598
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
599
+ * `formControlName`. See `chips/chips.ts` for the full rationale (the
600
+ * native `selectedChange` event can't be reused verbatim as an Angular
601
+ * output name without a double-fire risk).
602
+ *
603
+ * For plain (non-forms) two-way use, bind explicitly instead:
604
+ * `[selected]="v" (ksSelectedChange)="v = $event"`.
605
+ *
606
+ * `template: ''` — no slot is exposed on `<ks-listbox>` itself.
607
+ */
608
+ declare class KsListBoxComponent implements ControlValueAccessor {
609
+ private readonly el;
610
+ private onChange;
611
+ private onTouched;
612
+ /** Options list */
613
+ readonly options: _angular_core.InputSignal<KsListBoxOption[]>;
614
+ /** Allow multi-select */
615
+ readonly multi: _angular_core.InputSignal<boolean>;
616
+ /** Show search box */
617
+ readonly searchable: _angular_core.InputSignal<boolean>;
618
+ /** Disabled */
619
+ readonly disabled: _angular_core.InputSignal<boolean>;
620
+ /** Enable group headers using the `group` field on each option */
621
+ readonly groupBy: _angular_core.InputSignal<boolean>;
622
+ /** Initial/controlled selected value(s) for plain (non-forms) usage. Prefer `[(ngModel)]` / `formControlName` when inside a form. */
623
+ readonly selected: _angular_core.InputSignal<(string | number)[]>;
624
+ /** Emits the new selection — an array when `multi`, otherwise a single value. From the native `selectedChange` event. */
625
+ readonly ksSelectedChange: _angular_core.OutputEmitterRef<KsListBoxValue>;
626
+ constructor(ref: ElementRef<KsListBoxElement>);
627
+ writeValue(value: KsListBoxValue | null): void;
628
+ registerOnChange(fn: (value: KsListBoxValue) => void): void;
629
+ registerOnTouched(fn: () => void): void;
630
+ setDisabledState(isDisabled: boolean): void;
631
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsListBoxComponent, never>;
632
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsListBoxComponent, "ks-listbox", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, { "ksSelectedChange": "ksSelectedChange"; }, never, never, true, never>;
633
+ }
634
+
635
+ /**
636
+ * Mirrors `KsCheckboxOption` exported by
637
+ * `core/src/components/Inputs/checkbox/checkbox.tsx`. Duplicated locally
638
+ * — see the note in `Buttons/button-group/button-group.ts` for why.
639
+ */
640
+ interface KsCheckboxOption {
641
+ value: string;
642
+ label?: string;
643
+ disabled?: boolean;
644
+ checked?: boolean;
645
+ }
646
+ /** DOM shape of the real `<ks-checkbox>` custom element, typed for the wrapper. */
647
+ type KsCheckboxElement = HTMLElement & {
648
+ label: string;
649
+ options: KsCheckboxOption[];
650
+ disabled: boolean;
651
+ checked: boolean;
652
+ selected: string[];
653
+ writeValue(val: unknown): Promise<void>;
654
+ };
655
+ /**
656
+ * Angular wrapper around the `<ks-checkbox>` Stencil custom element.
657
+ *
658
+ * Supports two modes, mirroring the Stencil source:
659
+ * - **Single** mode (no `options`): two-way bind `checked` (boolean).
660
+ * - **Group** mode (`options` set): two-way bind `selected` (string[]).
661
+ *
662
+ * Two-way binding for either mode is via `ControlValueAccessor` — use
663
+ * `[(ngModel)]`/`formControlName` and it works for whichever mode is
664
+ * active (see `Buttons/chips/chips.ts` for the full rationale on why CVA
665
+ * is used instead of reusing a native event name as an Angular output).
666
+ *
667
+ * For plain (non-forms) two-way use, bind explicitly instead:
668
+ * `[checked]="c" (ksCheckedChange)="c = $event"` or
669
+ * `[selected]="s" (ksSelectedChange)="s = $event"`.
670
+ *
671
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
672
+ */
673
+ declare class KsCheckboxComponent implements ControlValueAccessor {
674
+ private readonly el;
675
+ private onChange;
676
+ private onTouched;
677
+ /** Label shown next to the control (single mode) */
678
+ readonly label: _angular_core.InputSignal<string>;
679
+ /** Optional set of multiple options (multi-select / group mode) */
680
+ readonly options: _angular_core.InputSignal<KsCheckboxOption[]>;
681
+ /** Disabled state */
682
+ readonly disabled: _angular_core.InputSignal<boolean>;
683
+ /** Single mode: initial/controlled checked value. Prefer `[(ngModel)]` / `formControlName`. */
684
+ readonly checked: _angular_core.InputSignal<boolean>;
685
+ /** Group mode: initial/controlled selected values. Prefer `[(ngModel)]` / `formControlName`. */
686
+ readonly selected: _angular_core.InputSignal<string[]>;
687
+ /** Emits whenever `checked` changes (single mode). From the native `checkedChange` event. */
688
+ readonly ksCheckedChange: _angular_core.OutputEmitterRef<boolean>;
689
+ /** Emits whenever `selected` changes (group mode). From the native `selectedChange` event. */
690
+ readonly ksSelectedChange: _angular_core.OutputEmitterRef<string[]>;
691
+ constructor(ref: ElementRef<KsCheckboxElement>);
692
+ /** `ControlValueAccessor` — called by `ngModel`/`formControl` to push a value in (either mode). */
693
+ writeValue(value: unknown): void;
694
+ registerOnChange(fn: (value: unknown) => void): void;
695
+ registerOnTouched(fn: () => void): void;
696
+ setDisabledState(isDisabled: boolean): void;
697
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsCheckboxComponent, never>;
698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsCheckboxComponent, "ks-checkbox", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, { "ksCheckedChange": "ksCheckedChange"; "ksSelectedChange": "ksSelectedChange"; }, never, never, true, never>;
699
+ }
700
+
701
+ /** Mirrors the inline union used by `core/src/components/Inputs/colour-picker/colour-picker.tsx`. */
702
+ type KsColourPickerVariant = 'input' | 'swatch';
703
+ /** DOM shape of the real `<ks-colour-picker>` custom element, typed for the wrapper. */
704
+ type KsColourPickerElement = HTMLElement & {
705
+ label: string;
706
+ variant: KsColourPickerVariant;
707
+ swatches: string[];
708
+ disabled: boolean;
709
+ value: string;
710
+ writeValue(val: string): Promise<void>;
711
+ };
712
+ /**
713
+ * Angular wrapper around the `<ks-colour-picker>` Stencil custom element.
714
+ *
715
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
716
+ * `formControlName`. See `Buttons/chips/chips.ts` for the full rationale
717
+ * (the native `valueChange` event can't be reused verbatim as an Angular
718
+ * output name without a double-fire risk).
719
+ *
720
+ * For plain (non-forms) two-way use, bind explicitly instead:
721
+ * `[value]="hex" (ksValueChange)="hex = $event"`.
722
+ *
723
+ * `template: ''` — the panel is rendered into the internal
724
+ * `<ks-overlay-field>`; there is no slot on `<ks-colour-picker>` itself.
725
+ */
726
+ declare class KsColourPickerComponent implements ControlValueAccessor {
727
+ private readonly el;
728
+ private onChange;
729
+ private onTouched;
730
+ /** Field label */
731
+ readonly label: _angular_core.InputSignal<string>;
732
+ /** Picker UI variant */
733
+ readonly variant: _angular_core.InputSignal<KsColourPickerVariant>;
734
+ /** Preset swatch colours */
735
+ readonly swatches: _angular_core.InputSignal<string[]>;
736
+ /** Disabled */
737
+ readonly disabled: _angular_core.InputSignal<boolean>;
738
+ /** Initial/controlled hex value. Prefer `[(ngModel)]` / `formControlName`. */
739
+ readonly value: _angular_core.InputSignal<string>;
740
+ /** Emits the newly-picked hex colour. From the native `valueChange` event. */
741
+ readonly ksValueChange: _angular_core.OutputEmitterRef<string>;
742
+ constructor(ref: ElementRef<KsColourPickerElement>);
743
+ writeValue(value: string): void;
744
+ registerOnChange(fn: (value: string) => void): void;
745
+ registerOnTouched(fn: () => void): void;
746
+ setDisabledState(isDisabled: boolean): void;
747
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsColourPickerComponent, never>;
748
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsColourPickerComponent, "ks-colour-picker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "swatches": { "alias": "swatches"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; }, never, never, true, never>;
749
+ }
750
+
751
+ /** Mirrors `KsInputType` exported by `core/src/components/Inputs/input/input.tsx`. */
752
+ type KsInputType = 'text' | 'password' | 'email' | 'number' | 'search' | 'tel' | 'url';
753
+ /** DOM shape of the real `<ks-input>` custom element, typed for the wrapper. */
754
+ type KsInputElement = HTMLElement & {
755
+ type: KsInputType;
756
+ placeholder: string;
757
+ label: string;
758
+ hint: string;
759
+ error: string;
760
+ prefixIcon: string;
761
+ suffixIcon: string;
762
+ size: KsSize;
763
+ value: string;
764
+ disabled: boolean;
765
+ };
766
+ /**
767
+ * Angular wrapper around the `<ks-input>` Stencil custom element.
768
+ *
769
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
770
+ * `formControlName`. `<ks-input>` has no `@Method() writeValue()` of its
771
+ * own (unlike `chips`/`dropdown`/…), so this wrapper's `writeValue` sets
772
+ * `el.value` directly instead of delegating to a Stencil method.
773
+ *
774
+ * The native `ksBlur` event is already prefixed `ks` by the Stencil
775
+ * author, so re-using that exact name here as the Angular output would
776
+ * still hit the double-fire collision described in `Buttons/button.ts`
777
+ * (Ivy's `tNode.outputs` match is purely by literal name, `ks`-prefix or
778
+ * not) — hence `ksBlurred` (distinct spelling) instead.
779
+ *
780
+ * For plain (non-forms) two-way use, bind explicitly instead:
781
+ * `[value]="v" (ksValueChange)="v = $event"`.
782
+ *
783
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
784
+ */
785
+ declare class KsInputComponent implements ControlValueAccessor {
786
+ private readonly el;
787
+ private onChange;
788
+ private onTouched;
789
+ /** HTML input type */
790
+ readonly type: _angular_core.InputSignal<KsInputType>;
791
+ /** Placeholder text */
792
+ readonly placeholder: _angular_core.InputSignal<string>;
793
+ /** Field label */
794
+ readonly label: _angular_core.InputSignal<string>;
795
+ /** Helper / hint text shown below the input */
796
+ readonly hint: _angular_core.InputSignal<string>;
797
+ /** Error message — also triggers the error state */
798
+ readonly error: _angular_core.InputSignal<string>;
799
+ /** Leading icon class (e.g. Material Symbol name) */
800
+ readonly prefixIcon: _angular_core.InputSignal<string>;
801
+ /** Trailing icon class */
802
+ readonly suffixIcon: _angular_core.InputSignal<string>;
803
+ /** Size variant */
804
+ readonly size: _angular_core.InputSignal<KsSize>;
805
+ /** Initial/controlled value. Prefer `[(ngModel)]` / `formControlName`. */
806
+ readonly value: _angular_core.ModelSignal<string>;
807
+ /** Disabled state */
808
+ readonly disabled: _angular_core.InputSignal<boolean>;
809
+ /** Emits the newly-typed value. From the native `valueChange` event. */
810
+ readonly ksValueChange: _angular_core.OutputEmitterRef<string>;
811
+ /** Emitted on native blur (mirrors Angular's onTouched callback). From the native `ksBlur` event. */
812
+ readonly ksBlurred: _angular_core.OutputEmitterRef<void>;
813
+ constructor(ref: ElementRef<KsInputElement>);
814
+ writeValue(value: string): void;
815
+ registerOnChange(fn: (value: string) => void): void;
816
+ registerOnTouched(fn: () => void): void;
817
+ setDisabledState(isDisabled: boolean): void;
818
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsInputComponent, never>;
819
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsInputComponent, "ks-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "ksValueChange": "ksValueChange"; "ksBlurred": "ksBlurred"; }, never, never, true, never>;
820
+ }
821
+
822
+ /** DOM shape of the real `<ks-otp-input>` custom element, typed for the wrapper. */
823
+ type KsOtpInputElement = HTMLElement & {
824
+ length: number;
825
+ inputType: 'number' | 'text';
826
+ label: string;
827
+ error: string;
828
+ masked: boolean;
829
+ disabled: boolean;
830
+ value: string;
831
+ writeValue(val: string): Promise<void>;
832
+ };
833
+ /**
834
+ * Angular wrapper around the `<ks-otp-input>` Stencil custom element.
835
+ *
836
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
837
+ * `formControlName`. See `Buttons/chips/chips.ts` for the full rationale.
838
+ *
839
+ * For plain (non-forms) two-way use, bind explicitly instead:
840
+ * `[value]="v" (ksValueChange)="v = $event"`.
841
+ *
842
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
843
+ */
844
+ declare class KsOtpInputComponent implements ControlValueAccessor {
845
+ private readonly el;
846
+ private onChange;
847
+ private onTouched;
848
+ /** Number of digits */
849
+ readonly length: _angular_core.InputSignal<number>;
850
+ /** Input type: 'number' | 'text' */
851
+ readonly inputType: _angular_core.InputSignal<"number" | "text">;
852
+ /** Field label */
853
+ readonly label: _angular_core.InputSignal<string>;
854
+ /** Error message */
855
+ readonly error: _angular_core.InputSignal<string>;
856
+ /** Mask the input (like a password) */
857
+ readonly masked: _angular_core.InputSignal<boolean>;
858
+ /** Disabled */
859
+ readonly disabled: _angular_core.InputSignal<boolean>;
860
+ /** Initial/controlled value. Prefer `[(ngModel)]` / `formControlName`. */
861
+ readonly value: _angular_core.InputSignal<string>;
862
+ /** Emits whenever `value` changes. From the native `valueChange` event. */
863
+ readonly ksValueChange: _angular_core.OutputEmitterRef<string>;
864
+ /** Emits the full OTP string when all digits are filled. From the native `completed` event. */
865
+ readonly ksCompleted: _angular_core.OutputEmitterRef<string>;
866
+ constructor(ref: ElementRef<KsOtpInputElement>);
867
+ writeValue(value: string): void;
868
+ registerOnChange(fn: (value: string) => void): void;
869
+ registerOnTouched(fn: () => void): void;
870
+ setDisabledState(isDisabled: boolean): void;
871
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsOtpInputComponent, never>;
872
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsOtpInputComponent, "ks-otp-input", never, { "length": { "alias": "length"; "required": false; "isSignal": true; }; "inputType": { "alias": "inputType"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "masked": { "alias": "masked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; "ksCompleted": "ksCompleted"; }, never, never, true, never>;
873
+ }
874
+
875
+ /**
876
+ * Mirrors `KsRadioOption` exported by
877
+ * `core/src/components/Inputs/radio/radio.tsx`. Duplicated locally — see
878
+ * the note in `Buttons/button-group/button-group.ts` for why.
879
+ */
880
+ interface KsRadioOption {
881
+ value: string;
882
+ label?: string;
883
+ disabled?: boolean;
884
+ }
885
+ /** DOM shape of the real `<ks-radio>` custom element, typed for the wrapper. */
886
+ type KsRadioElement = HTMLElement & {
887
+ options: KsRadioOption[];
888
+ label: string;
889
+ name: string;
890
+ variant: KsBaseVariant;
891
+ size: KsSize;
892
+ disabled: boolean;
893
+ value: string;
894
+ writeValue(val: string): Promise<void>;
895
+ };
896
+ /**
897
+ * Angular wrapper around the `<ks-radio>` Stencil custom element.
898
+ *
899
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
900
+ * `formControlName`. See `Buttons/chips/chips.ts` for the full rationale.
901
+ *
902
+ * For plain (non-forms) two-way use, bind explicitly instead:
903
+ * `[value]="v" (ksValueChange)="v = $event"`.
904
+ *
905
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
906
+ */
907
+ declare class KsRadioComponent implements ControlValueAccessor {
908
+ private readonly el;
909
+ private onChange;
910
+ private onTouched;
911
+ /** List of options — the component renders a radio group */
912
+ readonly options: _angular_core.InputSignal<KsRadioOption[]>;
913
+ /** Label shown above the group */
914
+ readonly label: _angular_core.InputSignal<string>;
915
+ /** Name attribute shared across all radio inputs in the group */
916
+ readonly name: _angular_core.InputSignal<string>;
917
+ /** Colour variant applied to the selected indicator */
918
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
919
+ /** Size variant — affects label text size */
920
+ readonly size: _angular_core.InputSignal<KsSize>;
921
+ /** Disabled state */
922
+ readonly disabled: _angular_core.InputSignal<boolean>;
923
+ /** Initial/controlled selected value. Prefer `[(ngModel)]` / `formControlName`. */
924
+ readonly value: _angular_core.InputSignal<string>;
925
+ /** Emits the selected value on every change. From the native `valueChange` event. */
926
+ readonly ksValueChange: _angular_core.OutputEmitterRef<string>;
927
+ constructor(ref: ElementRef<KsRadioElement>);
928
+ writeValue(value: string): void;
929
+ registerOnChange(fn: (value: string) => void): void;
930
+ registerOnTouched(fn: () => void): void;
931
+ setDisabledState(isDisabled: boolean): void;
932
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsRadioComponent, never>;
933
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsRadioComponent, "ks-radio", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; }, never, never, true, never>;
934
+ }
935
+
936
+ /** DOM shape of the real `<ks-rating>` custom element, typed for the wrapper. */
937
+ type KsRatingElement = HTMLElement & {
938
+ max: number;
939
+ size: KsBaseSize;
940
+ readOnly: boolean;
941
+ showLabel: boolean;
942
+ label: string;
943
+ disabled: boolean;
944
+ value: number;
945
+ writeValue(val: number): Promise<void>;
946
+ };
947
+ /**
948
+ * Angular wrapper around the `<ks-rating>` Stencil custom element.
949
+ *
950
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
951
+ * `formControlName`. See `Buttons/chips/chips.ts` for the full rationale.
952
+ *
953
+ * For plain (non-forms) two-way use, bind explicitly instead:
954
+ * `[value]="v" (ksValueChange)="v = $event"`.
955
+ *
956
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
957
+ */
958
+ declare class KsRatingComponent implements ControlValueAccessor {
959
+ private readonly el;
960
+ private onChange;
961
+ private onTouched;
962
+ /** Total number of stars */
963
+ readonly max: _angular_core.InputSignal<number>;
964
+ /** Size */
965
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
966
+ /** Read-only / non-interactive */
967
+ readonly readOnly: _angular_core.InputSignal<boolean>;
968
+ /** Show numeric label */
969
+ readonly showLabel: _angular_core.InputSignal<boolean>;
970
+ /** Field label */
971
+ readonly label: _angular_core.InputSignal<string>;
972
+ /** Disabled */
973
+ readonly disabled: _angular_core.InputSignal<boolean>;
974
+ /** Initial/controlled value. Prefer `[(ngModel)]` / `formControlName`. */
975
+ readonly value: _angular_core.InputSignal<number>;
976
+ /** Emits the newly-picked rating. From the native `valueChange` event. */
977
+ readonly ksValueChange: _angular_core.OutputEmitterRef<number>;
978
+ constructor(ref: ElementRef<KsRatingElement>);
979
+ writeValue(value: number): void;
980
+ registerOnChange(fn: (value: number) => void): void;
981
+ registerOnTouched(fn: () => void): void;
982
+ setDisabledState(isDisabled: boolean): void;
983
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsRatingComponent, never>;
984
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsRatingComponent, "ks-rating", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; }, never, never, true, never>;
985
+ }
986
+
987
+ /** DOM shape of the real `<ks-slider>` custom element, typed for the wrapper. */
988
+ type KsSliderElement = HTMLElement & {
989
+ min: number;
990
+ max: number;
991
+ step: number;
992
+ showTooltip: boolean;
993
+ showLabels: boolean;
994
+ label: string;
995
+ disabled: boolean;
996
+ value: number;
997
+ writeValue(val: number): Promise<void>;
998
+ };
999
+ /**
1000
+ * Angular wrapper around the `<ks-slider>` Stencil custom element.
1001
+ *
1002
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
1003
+ * `formControlName`. See `Buttons/chips/chips.ts` for the full rationale.
1004
+ * The native `ksBlur` event (already `ks`-prefixed by the Stencil author)
1005
+ * is re-exposed as `ksBlurred` — see `Inputs/input/input.ts` for why the
1006
+ * literal name can't be reused.
1007
+ *
1008
+ * For plain (non-forms) two-way use, bind explicitly instead:
1009
+ * `[value]="v" (ksValueChange)="v = $event"`.
1010
+ *
1011
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
1012
+ */
1013
+ declare class KsSliderComponent implements ControlValueAccessor {
1014
+ private readonly el;
1015
+ private onChange;
1016
+ private onTouched;
1017
+ /** Minimum value */
1018
+ readonly min: _angular_core.InputSignal<number>;
1019
+ /** Maximum value */
1020
+ readonly max: _angular_core.InputSignal<number>;
1021
+ /** Step increment */
1022
+ readonly step: _angular_core.InputSignal<number>;
1023
+ /** Show value tooltip */
1024
+ readonly showTooltip: _angular_core.InputSignal<boolean>;
1025
+ /** Show min/max labels */
1026
+ readonly showLabels: _angular_core.InputSignal<boolean>;
1027
+ /** Field label */
1028
+ readonly label: _angular_core.InputSignal<string>;
1029
+ /** Disabled state */
1030
+ readonly disabled: _angular_core.InputSignal<boolean>;
1031
+ /** Initial/controlled value. Prefer `[(ngModel)]` / `formControlName`. */
1032
+ readonly value: _angular_core.InputSignal<number>;
1033
+ /** Emits the newly-picked value. From the native `valueChange` event. */
1034
+ readonly ksValueChange: _angular_core.OutputEmitterRef<number>;
1035
+ /** Emitted on native blur. From the native `ksBlur` event. */
1036
+ readonly ksBlurred: _angular_core.OutputEmitterRef<void>;
1037
+ constructor(ref: ElementRef<KsSliderElement>);
1038
+ writeValue(value: number): void;
1039
+ registerOnChange(fn: (value: number) => void): void;
1040
+ registerOnTouched(fn: () => void): void;
1041
+ setDisabledState(isDisabled: boolean): void;
1042
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsSliderComponent, never>;
1043
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsSliderComponent, "ks-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "showTooltip": { "alias": "showTooltip"; "required": false; "isSignal": true; }; "showLabels": { "alias": "showLabels"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; "ksBlurred": "ksBlurred"; }, never, never, true, never>;
1044
+ }
1045
+
1046
+ /** DOM shape of the real `<ks-switch>` custom element, typed for the wrapper. */
1047
+ type KsSwitchElement = HTMLElement & {
1048
+ label: string;
1049
+ variant: KsBaseVariant;
1050
+ disabled: boolean;
1051
+ checked: boolean;
1052
+ labelPosition: 'left' | 'right';
1053
+ formDisabled: boolean;
1054
+ setDisabledState(isDisabled: boolean): Promise<void>;
1055
+ };
1056
+ /**
1057
+ * Angular wrapper around the `<ks-switch>` Stencil custom element.
1058
+ *
1059
+ * Two-way binding is via `ControlValueAccessor` — use `[(ngModel)]` or
1060
+ * `formControlName`. Unlike most other form-control wrappers here,
1061
+ * `<ks-switch>` has no `@Method() writeValue()`, so `writeValue` below
1062
+ * sets `el.checked` directly; it DOES expose a real
1063
+ * `@Method() setDisabledState()` (mirroring CVA exactly), which
1064
+ * `setDisabledState` below delegates to instead of setting a plain prop.
1065
+ *
1066
+ * For plain (non-forms) two-way use, bind explicitly instead:
1067
+ * `[checked]="c" (ksCheckedChange)="c = $event"`.
1068
+ *
1069
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
1070
+ */
1071
+ declare class KsSwitchComponent implements ControlValueAccessor {
1072
+ private readonly el;
1073
+ private onChange;
1074
+ private onTouched;
1075
+ /** Label text */
1076
+ readonly label: _angular_core.InputSignal<string>;
1077
+ /** Colour variant */
1078
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
1079
+ /** Disabled */
1080
+ readonly disabled: _angular_core.InputSignal<boolean>;
1081
+ /** Initial/controlled checked value. Prefer `[(ngModel)]` / `formControlName`. */
1082
+ readonly checked: _angular_core.InputSignal<boolean>;
1083
+ /** Label position relative to the switch track */
1084
+ readonly labelPosition: _angular_core.InputSignal<"left" | "right">;
1085
+ /** Emits whenever `checked` changes. From the native `checkedChange` event. */
1086
+ readonly ksCheckedChange: _angular_core.OutputEmitterRef<boolean>;
1087
+ constructor(ref: ElementRef<KsSwitchElement>);
1088
+ writeValue(value: boolean): void;
1089
+ registerOnChange(fn: (value: boolean) => void): void;
1090
+ registerOnTouched(fn: () => void): void;
1091
+ /** Delegates to `<ks-switch>`'s own `@Method() setDisabledState()`. */
1092
+ setDisabledState(isDisabled: boolean): void;
1093
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsSwitchComponent, never>;
1094
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsSwitchComponent, "ks-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; }, { "ksCheckedChange": "ksCheckedChange"; }, never, never, true, never>;
1095
+ }
1096
+
1097
+ /** DOM shape of the real `<ks-textarea>` custom element, typed for the wrapper. */
1098
+ type KsTextareaElement = HTMLElement & {
1099
+ label: string;
1100
+ placeholder: string;
1101
+ rows: number;
1102
+ maxLength: number;
1103
+ showCounter: boolean;
1104
+ autoResize: boolean;
1105
+ disabled: boolean;
1106
+ error: string;
1107
+ hint: string;
1108
+ value: string;
1109
+ };
1110
+ /**
1111
+ * Angular wrapper around the `<ks-textarea>` Stencil custom element.
1112
+ *
1113
+ * Two-way binding is via `ControlValueAccessor` (see `Inputs/input/input.ts`
1114
+ * for the equivalent no-`writeValue()`-method pattern this follows —
1115
+ * `writeValue` here sets `el.value` directly). The native `ksBlur` event
1116
+ * is re-exposed as `ksBlurred` for the same reason.
1117
+ *
1118
+ * For plain (non-forms) two-way use, bind explicitly instead:
1119
+ * `[value]="v" (ksValueChange)="v = $event"`.
1120
+ *
1121
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
1122
+ */
1123
+ declare class KsTextareaComponent implements ControlValueAccessor {
1124
+ private readonly el;
1125
+ private onChange;
1126
+ private onTouched;
1127
+ /** Textarea label */
1128
+ readonly label: _angular_core.InputSignal<string>;
1129
+ /** Placeholder text */
1130
+ readonly placeholder: _angular_core.InputSignal<string>;
1131
+ /** Number of visible rows */
1132
+ readonly rows: _angular_core.InputSignal<number>;
1133
+ /** Maximum character count */
1134
+ readonly maxLength: _angular_core.InputSignal<number>;
1135
+ /** Show character counter */
1136
+ readonly showCounter: _angular_core.InputSignal<boolean>;
1137
+ /** Auto-resize based on content */
1138
+ readonly autoResize: _angular_core.InputSignal<boolean>;
1139
+ /** Disabled state */
1140
+ readonly disabled: _angular_core.InputSignal<boolean>;
1141
+ /** Error state */
1142
+ readonly error: _angular_core.InputSignal<string>;
1143
+ /** Helper/error text */
1144
+ readonly hint: _angular_core.InputSignal<string>;
1145
+ /** Initial/controlled value. Prefer `[(ngModel)]` / `formControlName`. */
1146
+ readonly value: _angular_core.InputSignal<string>;
1147
+ /** Emits the newly-typed value. From the native `valueChange` event. */
1148
+ readonly ksValueChange: _angular_core.OutputEmitterRef<string>;
1149
+ /** Emitted on native blur. From the native `ksBlur` event. */
1150
+ readonly ksBlurred: _angular_core.OutputEmitterRef<void>;
1151
+ constructor(ref: ElementRef<KsTextareaElement>);
1152
+ writeValue(value: string): void;
1153
+ registerOnChange(fn: (value: string) => void): void;
1154
+ registerOnTouched(fn: () => void): void;
1155
+ setDisabledState(isDisabled: boolean): void;
1156
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTextareaComponent, never>;
1157
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTextareaComponent, "ks-textarea", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "showCounter": { "alias": "showCounter"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "ksValueChange": "ksValueChange"; "ksBlurred": "ksBlurred"; }, never, never, true, never>;
1158
+ }
1159
+
1160
+ /** DOM shape of the real `<ks-theme-switch>` custom element, typed for the wrapper. */
1161
+ type KsThemeSwitchElement = HTMLElement & {
1162
+ includeSystem: boolean;
1163
+ includePalette: boolean;
1164
+ onlyIcon: boolean;
1165
+ palette: Palette;
1166
+ mode: ThemeMode;
1167
+ };
1168
+ /**
1169
+ * Angular wrapper around the `<ks-theme-switch>` Stencil custom element.
1170
+ *
1171
+ * Purely presentational — it drives the shared `themeService` singleton
1172
+ * (see `core/src/utils/ks-theme.util.ts`) directly and dispatches no
1173
+ * events of its own, so this wrapper has plain inputs only, no outputs
1174
+ * and no `ControlValueAccessor`.
1175
+ *
1176
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
1177
+ */
1178
+ declare class KsThemeSwitchComponent {
1179
+ private readonly el;
1180
+ /** When true the mode-toggle shows three options: System | Light | Dark. */
1181
+ readonly includeSystem: _angular_core.InputSignal<boolean>;
1182
+ /** When true the colour-palette switcher is shown. */
1183
+ readonly includePalette: _angular_core.InputSignal<boolean>;
1184
+ /** When true only icons are shown in the mode-toggle switch. */
1185
+ readonly onlyIcon: _angular_core.InputSignal<boolean>;
1186
+ /** The palette that should be active on init. */
1187
+ readonly palette: _angular_core.InputSignal<Palette>;
1188
+ /** The mode that should be active on init. */
1189
+ readonly mode: _angular_core.InputSignal<ThemeMode>;
1190
+ constructor(ref: ElementRef<KsThemeSwitchElement>);
1191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsThemeSwitchComponent, never>;
1192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsThemeSwitchComponent, "ks-theme-switch", never, { "includeSystem": { "alias": "includeSystem"; "required": false; "isSignal": true; }; "includePalette": { "alias": "includePalette"; "required": false; "isSignal": true; }; "onlyIcon": { "alias": "onlyIcon"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1193
+ }
1194
+
1195
+ /**
1196
+ * Mirrors `KsUploadedFile` exported by
1197
+ * `core/src/components/Inputs/uploader/uploader.tsx`. Duplicated locally
1198
+ * — see the note in `Buttons/button-group/button-group.ts` for why.
1199
+ */
1200
+ interface KsUploadedFile {
1201
+ file: File;
1202
+ name: string;
1203
+ size: number;
1204
+ type: string;
1205
+ /** Data-URL preview (images only, when previewImages is true) */
1206
+ preview?: string;
1207
+ }
1208
+ /** DOM shape of the real `<ks-uploader>` custom element, typed for the wrapper. */
1209
+ type KsUploaderElement = HTMLElement & {
1210
+ accept: string;
1211
+ multiple: boolean;
1212
+ maxSize: number;
1213
+ previewImages: boolean;
1214
+ label: string;
1215
+ disabled: boolean;
1216
+ };
1217
+ /**
1218
+ * Angular wrapper around the `<ks-uploader>` Stencil custom element.
1219
+ *
1220
+ * No two-way "value" here — the Stencil source has no `writeValue()`
1221
+ * method and no single controlled prop, just a plain `filesChange`/
1222
+ * `filesRejected` event pair, so no `ControlValueAccessor` is implemented
1223
+ * (unlike the other `Inputs/*` wrappers).
1224
+ *
1225
+ * `template: ''` — no `<slot>` in the wrapped Stencil render.
1226
+ */
1227
+ declare class KsUploaderComponent {
1228
+ private readonly el;
1229
+ /** Accepted MIME types / extensions, e.g. "image/*,.pdf" */
1230
+ readonly accept: _angular_core.InputSignal<string>;
1231
+ /** Allow selecting multiple files */
1232
+ readonly multiple: _angular_core.InputSignal<boolean>;
1233
+ /** Maximum file size in bytes (0 = no limit) */
1234
+ readonly maxSize: _angular_core.InputSignal<number>;
1235
+ /** Show image thumbnails for image/* files */
1236
+ readonly previewImages: _angular_core.InputSignal<boolean>;
1237
+ /** Custom drop-zone label */
1238
+ readonly label: _angular_core.InputSignal<string>;
1239
+ /** Disabled state */
1240
+ readonly disabled: _angular_core.InputSignal<boolean>;
1241
+ /** Emits the accepted files whenever the selection changes. From the native `filesChange` event. */
1242
+ readonly ksFilesChange: _angular_core.OutputEmitterRef<KsUploadedFile[]>;
1243
+ /** Emits rejected files (wrong type / over size limit). From the native `filesRejected` event. */
1244
+ readonly ksFilesRejected: _angular_core.OutputEmitterRef<File[]>;
1245
+ constructor(ref: ElementRef<KsUploaderElement>);
1246
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsUploaderComponent, never>;
1247
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsUploaderComponent, "ks-uploader", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "previewImages": { "alias": "previewImages"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "ksFilesChange": "ksFilesChange"; "ksFilesRejected": "ksFilesRejected"; }, never, never, true, never>;
1248
+ }
1249
+
1250
+ /** DOM shape of the real `<ks-avatar>` custom element, typed for the wrapper. */
1251
+ type KsAvatarElement = HTMLElement & {
1252
+ src: string;
1253
+ alt: string;
1254
+ initials: string;
1255
+ icon: string;
1256
+ size: KsSize;
1257
+ variant: KsBaseVariant;
1258
+ square: boolean;
1259
+ };
1260
+ /**
1261
+ * Angular wrapper around the `<ks-avatar>` Stencil custom element.
1262
+ *
1263
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
1264
+ * render, plain inputs only (same shape as `Inputs/theme-switch/theme-switch.ts`).
1265
+ */
1266
+ declare class KsAvatarComponent {
1267
+ private readonly el;
1268
+ /** Image URL — takes priority over initials */
1269
+ readonly src: _angular_core.InputSignal<string>;
1270
+ /** Alt text for the image */
1271
+ readonly alt: _angular_core.InputSignal<string>;
1272
+ /** Initials shown when no image (e.g. "KS") */
1273
+ readonly initials: _angular_core.InputSignal<string>;
1274
+ /** Icon class shown when neither src nor initials */
1275
+ readonly icon: _angular_core.InputSignal<string>;
1276
+ /** Size */
1277
+ readonly size: _angular_core.InputSignal<KsSize>;
1278
+ /** Colour variant — used when showing initials or icon */
1279
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
1280
+ /** Circular (default) or rounded-square */
1281
+ readonly square: _angular_core.InputSignal<boolean>;
1282
+ constructor(ref: ElementRef<KsAvatarElement>);
1283
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsAvatarComponent, never>;
1284
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsAvatarComponent, "ks-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "square": { "alias": "square"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1285
+ }
1286
+
1287
+ /** Mirrors the inline union used by `core/src/components/Layout/card/card.tsx`. */
1288
+ type KsCardVariant = 'default' | 'outlined' | 'elevated' | 'flat';
1289
+ /** DOM shape of the real `<ks-card>` custom element, typed for the wrapper. */
1290
+ type KsCardElement = HTMLElement & {
1291
+ label: string;
1292
+ cardTitle: string;
1293
+ subtitle: string;
1294
+ imageUrl: string;
1295
+ imageAlt: string;
1296
+ iconClass: string;
1297
+ variant: KsCardVariant;
1298
+ };
1299
+ /**
1300
+ * Angular wrapper around the `<ks-card>` Stencil custom element.
1301
+ *
1302
+ * ## Slots
1303
+ * Unlike the Buttons/Calendars/Dropdowns wrappers, `<ks-card>` renders
1304
+ * real, consumer-facing `<slot name="header" />`, `<slot />` (default) and
1305
+ * `<slot name="footer" />` in its scoped (non-shadow) Stencil `render()`.
1306
+ * `template: '<ng-content></ng-content>'` (a single unfiltered pass-through,
1307
+ * not per-slot `<ng-content select="...">`) projects ALL of this Angular
1308
+ * component's content as real light-DOM children of the `<ks-card>` host
1309
+ * node; Stencil's own scoped-slot relocation logic (see `shadow: false,
1310
+ * scoped: true` on the Stencil class) then places each child into the
1311
+ * right native `<slot>` based on that child's own `slot="header"` /
1312
+ * `slot="footer"` attribute — same as plain HTML, nothing Angular-specific
1313
+ * needed beyond forwarding the projected content through untouched.
1314
+ * Usage: `<ks-card><ks-header slot="header">…</ks-header>Body<ks-footer slot="footer">…</ks-footer></ks-card>`.
1315
+ */
1316
+ declare class KsCardComponent {
1317
+ private readonly el;
1318
+ /** Card title */
1319
+ readonly label: _angular_core.InputSignal<string>;
1320
+ /** Card title (Angular input name was `title`; aliased to avoid clashing with the native `title` attribute/tooltip). */
1321
+ readonly cardTitle: _angular_core.InputSignal<string>;
1322
+ /** Subtitle / subheading */
1323
+ readonly subtitle: _angular_core.InputSignal<string>;
1324
+ /** URL for header image */
1325
+ readonly imageUrl: _angular_core.InputSignal<string>;
1326
+ /** Alt text for image */
1327
+ readonly imageAlt: _angular_core.InputSignal<string>;
1328
+ /** SVG icon class */
1329
+ readonly iconClass: _angular_core.InputSignal<string>;
1330
+ /** Card visual variant */
1331
+ readonly variant: _angular_core.InputSignal<KsCardVariant>;
1332
+ /** Emits when clicked (only when clickable). From the native `cardClick` event. */
1333
+ readonly ksCardClick: _angular_core.OutputEmitterRef<MouseEvent>;
1334
+ constructor(ref: ElementRef<KsCardElement>);
1335
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsCardComponent, never>;
1336
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsCardComponent, "ks-card", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "cardTitle": { "alias": "cardTitle"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "imageAlt": { "alias": "imageAlt"; "required": false; "isSignal": true; }; "iconClass": { "alias": "iconClass"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "ksCardClick": "ksCardClick"; }, never, ["*"], true, never>;
1337
+ }
1338
+
1339
+ /** Mirrors the inline union used by `core/src/components/Layout/code-view/code-view.tsx`. */
1340
+ type KsCodeViewLanguage = 'html' | 'css' | 'typescript' | 'javascript' | 'json' | 'bash' | 'text';
1341
+ /**
1342
+ * Mirrors `ActionButtonsConfig` exported by
1343
+ * `core/src/components/Layout/code-view/code-view.tsx`. Duplicated
1344
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1345
+ */
1346
+ interface ActionButtonsConfig {
1347
+ expand?: boolean;
1348
+ code?: boolean;
1349
+ }
1350
+ /** DOM shape of the real `<ks-code-view>` custom element, typed for the wrapper. */
1351
+ type KsCodeViewElement = HTMLElement & {
1352
+ code: string;
1353
+ language: KsCodeViewLanguage;
1354
+ label: string;
1355
+ maxHeight: string;
1356
+ showHeader: boolean;
1357
+ collapsed: boolean;
1358
+ actionButtonConfig: ActionButtonsConfig;
1359
+ };
1360
+ /**
1361
+ * Angular wrapper around the `<ks-code-view>` Stencil custom element.
1362
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
1363
+ * render, plain inputs only.
1364
+ */
1365
+ declare class KsCodeViewComponent {
1366
+ private readonly el;
1367
+ /** The source code string to display */
1368
+ readonly code: _angular_core.InputSignal<string>;
1369
+ /** Language hint shown in the header badge */
1370
+ readonly language: _angular_core.InputSignal<KsCodeViewLanguage>;
1371
+ /** Optional title shown in the header */
1372
+ readonly label: _angular_core.InputSignal<string>;
1373
+ /** Max visible height before scroll kicks in (CSS value, e.g. '20rem') */
1374
+ readonly maxHeight: _angular_core.InputSignal<string>;
1375
+ /** Show the header bar with language badge & copy button */
1376
+ readonly showHeader: _angular_core.InputSignal<boolean>;
1377
+ /** Whether the code block is currently collapsed */
1378
+ readonly collapsed: _angular_core.InputSignal<boolean>;
1379
+ /** Whether the code block is to show and hide buttons */
1380
+ readonly actionButtonConfig: _angular_core.InputSignal<ActionButtonsConfig>;
1381
+ constructor(ref: ElementRef<KsCodeViewElement>);
1382
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsCodeViewComponent, never>;
1383
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsCodeViewComponent, "ks-code-view", never, { "code": { "alias": "code"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "actionButtonConfig": { "alias": "actionButtonConfig"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1384
+ }
1385
+
1386
+ /** Mirrors the inline union used by `core/src/components/Layout/dialog/dialog.tsx`. */
1387
+ type KsDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
1388
+ /** DOM shape of the real `<ks-dialog>` custom element, typed for the wrapper. */
1389
+ type KsDialogElement = HTMLElement & {
1390
+ open: boolean;
1391
+ label: string;
1392
+ hideClose: boolean;
1393
+ persistent: boolean;
1394
+ size: KsDialogSize;
1395
+ target: string;
1396
+ };
1397
+ /**
1398
+ * Angular wrapper around the `<ks-dialog>` Stencil custom element.
1399
+ *
1400
+ * `open` is a plain input, not `ControlValueAccessor` — a dialog's open
1401
+ * state isn't form data. For the same reason described throughout this
1402
+ * repo, the output can't be named `openChange` (it would collide with the
1403
+ * native `openChange`-style close event — see below), so bind explicitly:
1404
+ * `[open]="isOpen" (ksCloseDialog)="isOpen = false"`.
1405
+ *
1406
+ * ## Slots
1407
+ * `<ks-dialog>` renders real, consumer-facing `<slot />` (default) and
1408
+ * `<slot name="footer" />`. Same single unfiltered `<ng-content>`
1409
+ * pass-through as `Layout/card/card.ts` — see that file's doc comment for
1410
+ * the full explanation of how native `slot="footer"` attributes on
1411
+ * projected children route into the right Stencil `<slot>`.
1412
+ */
1413
+ declare class KsDialogComponent {
1414
+ private readonly el;
1415
+ /** Whether the dialog is open */
1416
+ readonly open: _angular_core.InputSignal<boolean>;
1417
+ /** Dialog title */
1418
+ readonly label: _angular_core.InputSignal<string>;
1419
+ /** Hide the built-in close (✕) button */
1420
+ readonly hideClose: _angular_core.InputSignal<boolean>;
1421
+ /** Prevent closing by clicking the backdrop */
1422
+ readonly persistent: _angular_core.InputSignal<boolean>;
1423
+ /** Panel size */
1424
+ readonly size: _angular_core.InputSignal<KsDialogSize>;
1425
+ /** Target element id (without #), or '' to use `<body>`. When set, the overlay covers only that element and the dialog is centred inside it. */
1426
+ readonly target: _angular_core.InputSignal<string>;
1427
+ /** Emits when the dialog requests close. From the native `closeDialog` event. */
1428
+ readonly ksCloseDialog: _angular_core.OutputEmitterRef<void>;
1429
+ constructor(ref: ElementRef<KsDialogElement>);
1430
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsDialogComponent, never>;
1431
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsDialogComponent, "ks-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hideClose": { "alias": "hideClose"; "required": false; "isSignal": true; }; "persistent": { "alias": "persistent"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "ksCloseDialog": "ksCloseDialog"; }, never, ["*"], true, never>;
1432
+ }
1433
+
1434
+ /** DOM shape of the real `<ks-not-found>` custom element, typed for the wrapper. */
1435
+ type KsNotFoundElement = HTMLElement & {
1436
+ buttonLabel: string;
1437
+ homeHref: string;
1438
+ countdown: number;
1439
+ showActionButtons: boolean;
1440
+ code: string;
1441
+ message: string;
1442
+ description: string;
1443
+ };
1444
+ /**
1445
+ * Angular wrapper around the `<ks-not-found>` Stencil custom element.
1446
+ *
1447
+ * `<ks-not-found>` renders a real, consumer-facing default `<slot />`.
1448
+ * Same single unfiltered `<ng-content>` pass-through as
1449
+ * `Layout/card/card.ts` — see that file's doc comment for the full
1450
+ * explanation of how projected content routes into the Stencil `<slot>`.
1451
+ */
1452
+ declare class KsNotFoundComponent {
1453
+ private readonly el;
1454
+ /** Label shown on the redirect button (default: "Go to Home") */
1455
+ readonly buttonLabel: _angular_core.InputSignal<string>;
1456
+ /** href the button and auto-redirect navigate to (default: "./") */
1457
+ readonly homeHref: _angular_core.InputSignal<string>;
1458
+ /** Seconds before auto-redirect fires. Set to `0` to disable the countdown. */
1459
+ readonly countdown: _angular_core.InputSignal<number>;
1460
+ readonly showActionButtons: _angular_core.InputSignal<boolean>;
1461
+ /** Custom heading (default: "404") */
1462
+ readonly code: _angular_core.InputSignal<string>;
1463
+ /** Custom sub-heading (default: "Page not found") */
1464
+ readonly message: _angular_core.InputSignal<string>;
1465
+ /** Custom description below the heading */
1466
+ readonly description: _angular_core.InputSignal<string>;
1467
+ /** Emitted just before the auto-redirect navigates away. From the native `redirecting` event. */
1468
+ readonly ksRedirecting: _angular_core.OutputEmitterRef<void>;
1469
+ constructor(ref: ElementRef<KsNotFoundElement>);
1470
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsNotFoundComponent, never>;
1471
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsNotFoundComponent, "ks-not-found", never, { "buttonLabel": { "alias": "buttonLabel"; "required": false; "isSignal": true; }; "homeHref": { "alias": "homeHref"; "required": false; "isSignal": true; }; "countdown": { "alias": "countdown"; "required": false; "isSignal": true; }; "showActionButtons": { "alias": "showActionButtons"; "required": false; "isSignal": true; }; "code": { "alias": "code"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, { "ksRedirecting": "ksRedirecting"; }, never, ["*"], true, never>;
1472
+ }
1473
+
1474
+ type KsSidebarPosition = 'left' | 'right';
1475
+ type KsSidebarType = 'over' | 'push';
1476
+ /** DOM shape of the real `<ks-sidebar>` custom element, typed for the wrapper. */
1477
+ type KsSidebarElement = HTMLElement & {
1478
+ position: KsSidebarPosition;
1479
+ type: KsSidebarType;
1480
+ open: boolean;
1481
+ width: string;
1482
+ target: string;
1483
+ openPanel(): Promise<void>;
1484
+ close(): Promise<void>;
1485
+ toggle(): Promise<void>;
1486
+ };
1487
+ /**
1488
+ * Angular wrapper around the `<ks-sidebar>` Stencil custom element.
1489
+ *
1490
+ * `open` is a plain input/output pair, not `ControlValueAccessor` — panel
1491
+ * open state isn't form data. The native event is literally `openChange`,
1492
+ * so (per the double-fire rule in `Buttons/button.ts`) the Angular output
1493
+ * can't reuse that name; bind explicitly instead:
1494
+ * `[open]="isOpen" (ksOpenChange)="isOpen = $event"`.
1495
+ *
1496
+ * `<ks-sidebar>`'s own `@Method()`s (`openPanel`/`close`/`toggle`) are
1497
+ * exposed here as real passthrough methods — grab the component instance
1498
+ * with `@ViewChild(KsSidebarComponent)` and call them directly.
1499
+ *
1500
+ * ## Slots
1501
+ * Renders real `<slot name="header" />`, `<slot />` (default) and
1502
+ * `<slot name="footer" />`. Same single unfiltered `<ng-content>`
1503
+ * pass-through as `Layout/card/card.ts`.
1504
+ */
1505
+ declare class KsSidebarComponent {
1506
+ private readonly el;
1507
+ /** Which side the panel appears on */
1508
+ readonly position: _angular_core.InputSignal<KsSidebarPosition>;
1509
+ /** Behaviour type */
1510
+ readonly type: _angular_core.InputSignal<KsSidebarType>;
1511
+ /** Initial/controlled open state. Bind explicitly: `[open]="isOpen" (ksOpenChange)="isOpen = $event"`. */
1512
+ readonly open: _angular_core.ModelSignal<boolean>;
1513
+ /** Width of the sidebar panel */
1514
+ readonly width: _angular_core.InputSignal<string>;
1515
+ /** Target element id (without #) or '' to use the page. */
1516
+ readonly target: _angular_core.InputSignal<string>;
1517
+ /** Fires whenever `open` changes. From the native `openChange` event. */
1518
+ readonly ksOpenChange: _angular_core.OutputEmitterRef<boolean>;
1519
+ constructor(ref: ElementRef<KsSidebarElement>);
1520
+ /** Passthrough to `<ks-sidebar>`'s own `@Method() openPanel()`. */
1521
+ openPanel(): Promise<void>;
1522
+ /** Passthrough to `<ks-sidebar>`'s own `@Method() close()`. */
1523
+ close(): Promise<void>;
1524
+ /** Passthrough to `<ks-sidebar>`'s own `@Method() toggle()`. */
1525
+ toggle(): Promise<void>;
1526
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsSidebarComponent, never>;
1527
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsSidebarComponent, "ks-sidebar", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "ksOpenChange": "ksOpenChange"; }, never, ["*"], true, never>;
1528
+ }
1529
+
1530
+ /** Mirrors the inline unions used by `core/src/components/Layout/table/table.tsx`. */
1531
+ type KsTableVariant = 'default' | 'striped' | 'bordered' | 'compact';
1532
+ type KsTableSize = 'sm' | 'md' | 'lg';
1533
+ /** DOM shape of the real `<ks-table>` custom element, typed for the wrapper. */
1534
+ type KsTableElement = HTMLElement & {
1535
+ data: Record<string, unknown>[];
1536
+ columns: string[];
1537
+ columnLabels: Record<string, string>;
1538
+ variant: KsTableVariant;
1539
+ size: KsTableSize;
1540
+ caption: string;
1541
+ scrollable: boolean;
1542
+ hoverable: boolean;
1543
+ };
1544
+ /**
1545
+ * Angular wrapper around the `<ks-table>` Stencil custom element.
1546
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
1547
+ */
1548
+ declare class KsTableComponent {
1549
+ private readonly el;
1550
+ /** Array of objects to render as table rows */
1551
+ readonly data: _angular_core.InputSignal<Record<string, unknown>[]>;
1552
+ /** Optional explicit column order; defaults to keys of the first row */
1553
+ readonly columns: _angular_core.InputSignal<string[]>;
1554
+ /** Optional custom column header labels: { key: 'Display Label' } */
1555
+ readonly columnLabels: _angular_core.InputSignal<Record<string, string>>;
1556
+ /** Visual variant */
1557
+ readonly variant: _angular_core.InputSignal<KsTableVariant>;
1558
+ /** Row size */
1559
+ readonly size: _angular_core.InputSignal<KsTableSize>;
1560
+ /** Show a caption / title above the table */
1561
+ readonly caption: _angular_core.InputSignal<string>;
1562
+ /** Make the table horizontally scrollable on overflow */
1563
+ readonly scrollable: _angular_core.InputSignal<boolean>;
1564
+ /** Highlight row on hover */
1565
+ readonly hoverable: _angular_core.InputSignal<boolean>;
1566
+ /** Emits the clicked row's data. From the native `rowClick` event. */
1567
+ readonly ksRowClick: _angular_core.OutputEmitterRef<Record<string, unknown>>;
1568
+ constructor(ref: ElementRef<KsTableElement>);
1569
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTableComponent, never>;
1570
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTableComponent, "ks-table", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "columnLabels": { "alias": "columnLabels"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "scrollable": { "alias": "scrollable"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; }, { "ksRowClick": "ksRowClick"; }, never, never, true, never>;
1571
+ }
1572
+
1573
+ /** DOM shape of the real `<ks-tooltip>` custom element, typed for the wrapper. */
1574
+ type KsTooltipElement = HTMLElement & {
1575
+ text: string;
1576
+ position: KsPosition;
1577
+ visible: boolean;
1578
+ };
1579
+ /**
1580
+ * Angular wrapper around the `<ks-tooltip>` Stencil custom element.
1581
+ *
1582
+ * `<ks-tooltip>` renders a real, consumer-facing default `<slot />` for
1583
+ * the element the tooltip is attached to. Same single unfiltered
1584
+ * `<ng-content>` pass-through as `Layout/card/card.ts` — wrap the
1585
+ * trigger element as `<ks-tooltip text="Hi"><button>Hover me</button></ks-tooltip>`.
1586
+ */
1587
+ declare class KsTooltipComponent {
1588
+ private readonly el;
1589
+ /** Tooltip text */
1590
+ readonly text: _angular_core.InputSignal<string>;
1591
+ /** Preferred placement */
1592
+ readonly position: _angular_core.InputSignal<KsPosition>;
1593
+ /** Show tooltip on demand (true = always visible) — leave false for hover behaviour */
1594
+ readonly visible: _angular_core.InputSignal<boolean>;
1595
+ constructor(ref: ElementRef<KsTooltipElement>);
1596
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTooltipComponent, never>;
1597
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTooltipComponent, "ks-tooltip", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1598
+ }
1599
+
1600
+ /**
1601
+ * Mirrors `KsAccordionItem` exported by
1602
+ * `core/src/components/Navigation/accordion/accordion.tsx`. Duplicated
1603
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1604
+ */
1605
+ interface KsAccordionItem {
1606
+ key: string;
1607
+ label: string;
1608
+ icon?: string;
1609
+ disabled?: boolean;
1610
+ }
1611
+ /** DOM shape of the real `<ks-accordion>` custom element, typed for the wrapper. */
1612
+ type KsAccordionElement = HTMLElement & {
1613
+ items: KsAccordionItem[];
1614
+ multi: boolean;
1615
+ openKeys: string[];
1616
+ };
1617
+ /**
1618
+ * Angular wrapper around the `<ks-accordion>` Stencil custom element.
1619
+ *
1620
+ * ## Panel content — `ksPanel`, NOT a native `slot` attribute
1621
+ * The Stencil source maps each light-DOM child carrying a `ksPanel="key"`
1622
+ * attribute to a matching named `<slot>` internally (see
1623
+ * `core/src/utils/ks-slots.util.ts`'s `getKsPanelMap()`) — it does NOT use
1624
+ * the browser-native `slot="..."` attribute consumers would use for
1625
+ * `Layout/card/card.ts`-style components. `template: '<ng-content></ng-content>'`
1626
+ * still applies the same way: it's a single, unfiltered pass-through of
1627
+ * whatever this Angular component's own template projects, as real
1628
+ * light-DOM children of the `<ks-accordion>` host — the wrapper does no
1629
+ * filtering itself, it just needs to exist so the projected content
1630
+ * becomes real children for Stencil's `getKsPanelMap()` scan to find.
1631
+ * Usage:
1632
+ * `<ks-accordion [items]="items">
1633
+ * <div ksPanel="profile">Profile body…</div>
1634
+ * <div ksPanel="settings">Settings body…</div>
1635
+ * </ks-accordion>`
1636
+ */
1637
+ declare class KsAccordionComponent {
1638
+ private readonly el;
1639
+ /** List of accordion panel definitions */
1640
+ readonly items: _angular_core.InputSignal<KsAccordionItem[]>;
1641
+ /** Allow multiple panels open simultaneously */
1642
+ readonly multi: _angular_core.InputSignal<boolean>;
1643
+ /** Keys that should be open by default */
1644
+ readonly openKeys: _angular_core.InputSignal<string[]>;
1645
+ /** Emits the key that was toggled. From the native `toggled` event. */
1646
+ readonly ksToggled: _angular_core.OutputEmitterRef<string>;
1647
+ constructor(ref: ElementRef<KsAccordionElement>);
1648
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsAccordionComponent, never>;
1649
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsAccordionComponent, "ks-accordion", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "openKeys": { "alias": "openKeys"; "required": false; "isSignal": true; }; }, { "ksToggled": "ksToggled"; }, never, ["*"], true, never>;
1650
+ }
1651
+
1652
+ /**
1653
+ * Mirrors `KsBreadcrumbItem` exported by
1654
+ * `core/src/components/Navigation/breadcrumb/breadcrumb.tsx`. Duplicated
1655
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1656
+ */
1657
+ interface KsBreadcrumbItem {
1658
+ label: string;
1659
+ /** Route path or href — omit for the active (last) item */
1660
+ href?: string;
1661
+ /** Optional icon class */
1662
+ icon?: string;
1663
+ }
1664
+ /** DOM shape of the real `<ks-breadcrumb>` custom element, typed for the wrapper. */
1665
+ type KsBreadcrumbElement = HTMLElement & {
1666
+ items: KsBreadcrumbItem[];
1667
+ separator: string;
1668
+ size: KsBaseSize;
1669
+ };
1670
+ /**
1671
+ * Angular wrapper around the `<ks-breadcrumb>` Stencil custom element.
1672
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
1673
+ * render, plain inputs only.
1674
+ */
1675
+ declare class KsBreadcrumbComponent {
1676
+ private readonly el;
1677
+ /** Ordered list of breadcrumb items */
1678
+ readonly items: _angular_core.InputSignal<KsBreadcrumbItem[]>;
1679
+ /** Separator character or symbol */
1680
+ readonly separator: _angular_core.InputSignal<string>;
1681
+ /** Size */
1682
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
1683
+ constructor(ref: ElementRef<KsBreadcrumbElement>);
1684
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsBreadcrumbComponent, never>;
1685
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsBreadcrumbComponent, "ks-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1686
+ }
1687
+
1688
+ /**
1689
+ * Mirrors `KsCarouselSlide` exported by
1690
+ * `core/src/components/Navigation/carousel/carousel.tsx`. Duplicated
1691
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1692
+ */
1693
+ interface KsCarouselSlide {
1694
+ key: string;
1695
+ imageUrl?: string;
1696
+ alt?: string;
1697
+ label?: string;
1698
+ caption?: string;
1699
+ }
1700
+ /** DOM shape of the real `<ks-carousel>` custom element, typed for the wrapper. */
1701
+ type KsCarouselElement = HTMLElement & {
1702
+ slides: KsCarouselSlide[];
1703
+ autoPlay: number;
1704
+ showControls: boolean;
1705
+ showDots: boolean;
1706
+ };
1707
+ /**
1708
+ * Angular wrapper around the `<ks-carousel>` Stencil custom element.
1709
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
1710
+ */
1711
+ declare class KsCarouselComponent {
1712
+ private readonly el;
1713
+ /** Slides to display */
1714
+ readonly slides: _angular_core.InputSignal<KsCarouselSlide[]>;
1715
+ /** Auto-play interval in ms (0 = disabled) */
1716
+ readonly autoPlay: _angular_core.InputSignal<number>;
1717
+ /** Show prev/next arrow controls */
1718
+ readonly showControls: _angular_core.InputSignal<boolean>;
1719
+ /** Show dot indicators */
1720
+ readonly showDots: _angular_core.InputSignal<boolean>;
1721
+ /** Emits the current slide index on change. From the native `slideChange` event. */
1722
+ readonly ksSlideChange: _angular_core.OutputEmitterRef<number>;
1723
+ constructor(ref: ElementRef<KsCarouselElement>);
1724
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsCarouselComponent, never>;
1725
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsCarouselComponent, "ks-carousel", never, { "slides": { "alias": "slides"; "required": false; "isSignal": true; }; "autoPlay": { "alias": "autoPlay"; "required": false; "isSignal": true; }; "showControls": { "alias": "showControls"; "required": false; "isSignal": true; }; "showDots": { "alias": "showDots"; "required": false; "isSignal": true; }; }, { "ksSlideChange": "ksSlideChange"; }, never, never, true, never>;
1726
+ }
1727
+
1728
+ /**
1729
+ * Mirrors `KsContextMenuItem` / `KsContextMenuPosition` exported by
1730
+ * `core/src/components/Navigation/context-menu/context-menu.tsx`.
1731
+ * Duplicated locally — see the note in `Buttons/button-group/button-group.ts` for why.
1732
+ */
1733
+ interface KsContextMenuItem {
1734
+ key: string;
1735
+ label?: string;
1736
+ icon?: string;
1737
+ divider?: boolean;
1738
+ disabled?: boolean;
1739
+ danger?: boolean;
1740
+ }
1741
+ interface KsContextMenuPosition {
1742
+ x: number;
1743
+ y: number;
1744
+ }
1745
+ /** DOM shape of the real `<ks-context-menu>` custom element, typed for the wrapper. */
1746
+ type KsContextMenuElement = HTMLElement & {
1747
+ items: KsContextMenuItem[];
1748
+ open(pos: KsContextMenuPosition): Promise<void>;
1749
+ close(): Promise<void>;
1750
+ };
1751
+ /**
1752
+ * Angular wrapper around the `<ks-context-menu>` Stencil custom element.
1753
+ *
1754
+ * `<ks-context-menu>`'s own `@Method()`s (`open(pos)`/`close()`) are
1755
+ * exposed here as real passthrough methods — grab the component instance
1756
+ * with `@ViewChild(KsContextMenuComponent)` and call them directly, e.g.
1757
+ * `onContextMenu(e: MouseEvent) { menu.open({ x: e.clientX, y: e.clientY }); }`.
1758
+ *
1759
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
1760
+ */
1761
+ declare class KsContextMenuComponent {
1762
+ private readonly el;
1763
+ /** Menu items */
1764
+ readonly items: _angular_core.InputSignal<KsContextMenuItem[]>;
1765
+ /** Emits the clicked item key. From the native `itemClicked` event. */
1766
+ readonly ksItemClicked: _angular_core.OutputEmitterRef<string>;
1767
+ constructor(ref: ElementRef<KsContextMenuElement>);
1768
+ /** Passthrough to `<ks-context-menu>`'s own `@Method() open(pos)`. */
1769
+ open(pos: KsContextMenuPosition): Promise<void>;
1770
+ /** Passthrough to `<ks-context-menu>`'s own `@Method() close()`. */
1771
+ close(): Promise<void>;
1772
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsContextMenuComponent, never>;
1773
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsContextMenuComponent, "ks-context-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "ksItemClicked": "ksItemClicked"; }, never, never, true, never>;
1774
+ }
1775
+
1776
+ /**
1777
+ * Mirrors the types exported by
1778
+ * `core/src/components/Navigation/nav-bar/nav-bar.tsx`. Duplicated
1779
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1780
+ */
1781
+ interface KsNavBarItem {
1782
+ key: string;
1783
+ name: string;
1784
+ iconClass: string;
1785
+ /** href to navigate to */
1786
+ redirectLink: string;
1787
+ activationFragment?: string;
1788
+ disabled?: boolean;
1789
+ }
1790
+ type KsNavBarSection = 'top' | 'mid' | 'bottom';
1791
+ interface KsNavBarSectionItem extends KsNavBarItem {
1792
+ section: KsNavBarSection;
1793
+ }
1794
+ type KsNavBarMode = 'iconOnly' | 'hoverToExpand' | 'alwaysOpen';
1795
+ /** DOM shape of the real `<ks-nav-bar>` custom element, typed for the wrapper. */
1796
+ type KsNavBarElement = HTMLElement & {
1797
+ items: KsNavBarSectionItem[];
1798
+ mode: KsNavBarMode;
1799
+ iconWidth: string;
1800
+ expandedWidth: string;
1801
+ };
1802
+ /**
1803
+ * Angular wrapper around the `<ks-nav-bar>` Stencil custom element.
1804
+ * Renders a real, consumer-facing default `<slot />` — same single
1805
+ * unfiltered `<ng-content>` pass-through as `Layout/card/card.ts`.
1806
+ */
1807
+ declare class KsNavBarComponent {
1808
+ private readonly el;
1809
+ /** All nav items with their section assignment */
1810
+ readonly items: _angular_core.InputSignal<KsNavBarSectionItem[]>;
1811
+ /** Expansion mode */
1812
+ readonly mode: _angular_core.InputSignal<KsNavBarMode>;
1813
+ /** Width of the icon-only rail */
1814
+ readonly iconWidth: _angular_core.InputSignal<string>;
1815
+ /** Width of the expanded label panel */
1816
+ readonly expandedWidth: _angular_core.InputSignal<string>;
1817
+ constructor(ref: ElementRef<KsNavBarElement>);
1818
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsNavBarComponent, never>;
1819
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsNavBarComponent, "ks-nav-bar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "iconWidth": { "alias": "iconWidth"; "required": false; "isSignal": true; }; "expandedWidth": { "alias": "expandedWidth"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1820
+ }
1821
+
1822
+ /** DOM shape of the real `<ks-pagination>` custom element, typed for the wrapper. */
1823
+ type KsPaginationElement = HTMLElement & {
1824
+ total: number;
1825
+ pageSize: number;
1826
+ currentPage: number;
1827
+ showPageSize: boolean;
1828
+ pageSizeOptions: number[];
1829
+ showQuickJumper: boolean;
1830
+ maxPageButtons: number;
1831
+ };
1832
+ /**
1833
+ * Angular wrapper around the `<ks-pagination>` Stencil custom element.
1834
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
1835
+ */
1836
+ declare class KsPaginationComponent {
1837
+ private readonly el;
1838
+ /** Total number of items */
1839
+ readonly total: _angular_core.InputSignal<number>;
1840
+ /** Items per page */
1841
+ readonly pageSize: _angular_core.InputSignal<number>;
1842
+ /** Current page (1-indexed) */
1843
+ readonly currentPage: _angular_core.InputSignal<number>;
1844
+ /** Show page size selector */
1845
+ readonly showPageSize: _angular_core.InputSignal<boolean>;
1846
+ /** Available page sizes */
1847
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
1848
+ /** Show quick jumper */
1849
+ readonly showQuickJumper: _angular_core.InputSignal<boolean>;
1850
+ /** Maximum number of page buttons to show */
1851
+ readonly maxPageButtons: _angular_core.InputSignal<number>;
1852
+ /** Emits when page changes. From the native `pageChange` event. */
1853
+ readonly ksPageChange: _angular_core.OutputEmitterRef<number>;
1854
+ /** Emits when page size changes. From the native `pageSizeChange` event. */
1855
+ readonly ksPageSizeChange: _angular_core.OutputEmitterRef<number>;
1856
+ constructor(ref: ElementRef<KsPaginationElement>);
1857
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsPaginationComponent, never>;
1858
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsPaginationComponent, "ks-pagination", never, { "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "showPageSize": { "alias": "showPageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "showQuickJumper": { "alias": "showQuickJumper"; "required": false; "isSignal": true; }; "maxPageButtons": { "alias": "maxPageButtons"; "required": false; "isSignal": true; }; }, { "ksPageChange": "ksPageChange"; "ksPageSizeChange": "ksPageSizeChange"; }, never, never, true, never>;
1859
+ }
1860
+
1861
+ /**
1862
+ * Mirrors `KsStepItem` / `KsStepperOrientation` exported by
1863
+ * `core/src/components/Navigation/stepper/stepper.tsx`. Duplicated
1864
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1865
+ */
1866
+ interface KsStepItem {
1867
+ key: string;
1868
+ label: string;
1869
+ description?: string;
1870
+ icon?: string;
1871
+ optional?: boolean;
1872
+ }
1873
+ type KsStepperOrientation = 'horizontal' | 'vertical';
1874
+ /** DOM shape of the real `<ks-stepper>` custom element, typed for the wrapper. */
1875
+ type KsStepperElement = HTMLElement & {
1876
+ steps: KsStepItem[];
1877
+ activeStep: number;
1878
+ orientation: KsStepperOrientation;
1879
+ clickable: boolean;
1880
+ completedSteps: number[];
1881
+ };
1882
+ /**
1883
+ * Angular wrapper around the `<ks-stepper>` Stencil custom element.
1884
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
1885
+ */
1886
+ declare class KsStepperComponent {
1887
+ private readonly el;
1888
+ /** Step definitions */
1889
+ readonly steps: _angular_core.InputSignal<KsStepItem[]>;
1890
+ /** Currently active step index (0-based) */
1891
+ readonly activeStep: _angular_core.InputSignal<number>;
1892
+ /** Layout orientation */
1893
+ readonly orientation: _angular_core.InputSignal<KsStepperOrientation>;
1894
+ /** Allow clicking steps to navigate */
1895
+ readonly clickable: _angular_core.InputSignal<boolean>;
1896
+ /** Marks completed steps */
1897
+ readonly completedSteps: _angular_core.InputSignal<number[]>;
1898
+ /** Emits the new step index. From the native `stepChange` event. */
1899
+ readonly ksStepChange: _angular_core.OutputEmitterRef<number>;
1900
+ constructor(ref: ElementRef<KsStepperElement>);
1901
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsStepperComponent, never>;
1902
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsStepperComponent, "ks-stepper", never, { "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "activeStep": { "alias": "activeStep"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "completedSteps": { "alias": "completedSteps"; "required": false; "isSignal": true; }; }, { "ksStepChange": "ksStepChange"; }, never, never, true, never>;
1903
+ }
1904
+
1905
+ /**
1906
+ * Mirrors `KsTabItem` exported by
1907
+ * `core/src/components/Navigation/tab/tab.tsx`. Duplicated locally — see
1908
+ * the note in `Buttons/button-group/button-group.ts` for why.
1909
+ */
1910
+ interface KsTabItem {
1911
+ key: string;
1912
+ label: string;
1913
+ icon?: string;
1914
+ disabled?: boolean;
1915
+ }
1916
+ /** DOM shape of the real `<ks-tab>` custom element, typed for the wrapper. */
1917
+ type KsTabElement = HTMLElement & {
1918
+ tabs: KsTabItem[];
1919
+ activeKey: string;
1920
+ tabHeaderStyle: 'default' | 'expanded' | 'card' | 'button';
1921
+ };
1922
+ /**
1923
+ * Angular wrapper around the `<ks-tab>` Stencil custom element.
1924
+ *
1925
+ * Same `ksPanel="key"` → named-`<slot>` strategy as
1926
+ * `Navigation/accordion/accordion.ts` (NOT the native `slot="..."`
1927
+ * attribute) — see that file's doc comment for the full explanation.
1928
+ * Usage:
1929
+ * `<ks-tab [tabs]="tabs" activeKey="tab1">
1930
+ * <div ksPanel="tab1">Tab 1 content</div>
1931
+ * <div ksPanel="tab2">Tab 2 content</div>
1932
+ * </ks-tab>`
1933
+ */
1934
+ declare class KsTabComponent {
1935
+ private readonly el;
1936
+ /** List of tab definitions */
1937
+ readonly tabs: _angular_core.InputSignal<KsTabItem[]>;
1938
+ /** Key of the initially active tab */
1939
+ readonly activeKey: _angular_core.InputSignal<string>;
1940
+ readonly tabHeaderStyle: _angular_core.InputSignal<"button" | "default" | "expanded" | "card">;
1941
+ /** Emits the key of the newly selected tab. From the native `tabChange` event. */
1942
+ readonly ksTabChange: _angular_core.OutputEmitterRef<string>;
1943
+ constructor(ref: ElementRef<KsTabElement>);
1944
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTabComponent, never>;
1945
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTabComponent, "ks-tab", never, { "tabs": { "alias": "tabs"; "required": false; "isSignal": true; }; "activeKey": { "alias": "activeKey"; "required": false; "isSignal": true; }; "tabHeaderStyle": { "alias": "tabHeaderStyle"; "required": false; "isSignal": true; }; }, { "ksTabChange": "ksTabChange"; }, never, ["*"], true, never>;
1946
+ }
1947
+
1948
+ /**
1949
+ * Mirrors `KsToolbarItem` exported by
1950
+ * `core/src/components/Navigation/toolbar/toolbar.tsx`. Duplicated
1951
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
1952
+ */
1953
+ interface KsToolbarItem {
1954
+ key: string;
1955
+ icon?: string;
1956
+ label?: string;
1957
+ divider?: boolean;
1958
+ disabled?: boolean;
1959
+ active?: boolean;
1960
+ variant?: KsVariant;
1961
+ }
1962
+ /** DOM shape of the real `<ks-toolbar>` custom element, typed for the wrapper. */
1963
+ type KsToolbarElement = HTMLElement & {
1964
+ items: KsToolbarItem[];
1965
+ };
1966
+ /**
1967
+ * Angular wrapper around the `<ks-toolbar>` Stencil custom element.
1968
+ * Renders a real, consumer-facing default `<slot />` for extra trailing
1969
+ * content — same single unfiltered `<ng-content>` pass-through as
1970
+ * `Layout/card/card.ts`.
1971
+ */
1972
+ declare class KsToolbarComponent {
1973
+ private readonly el;
1974
+ /** Toolbar items */
1975
+ readonly items: _angular_core.InputSignal<KsToolbarItem[]>;
1976
+ /** Emits the clicked item key. From the native `itemClicked` event. */
1977
+ readonly ksItemClicked: _angular_core.OutputEmitterRef<string>;
1978
+ constructor(ref: ElementRef<KsToolbarElement>);
1979
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsToolbarComponent, never>;
1980
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsToolbarComponent, "ks-toolbar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "ksItemClicked": "ksItemClicked"; }, never, ["*"], true, never>;
1981
+ }
1982
+
1983
+ /**
1984
+ * Mirrors the types exported by
1985
+ * `core/src/components/Navigation/top-nav-bar/top-nav-bar.tsx`.
1986
+ * Duplicated locally — see the note in `Buttons/button-group/button-group.ts` for why.
1987
+ */
1988
+ type KsTopNavBarVariant = 'default' | 'underline' | 'pill';
1989
+ interface KsTopNavBarItem {
1990
+ key: string;
1991
+ name: string;
1992
+ iconClass?: string;
1993
+ /** href to navigate to */
1994
+ redirectLink: string;
1995
+ activationFragment?: string;
1996
+ disabled?: boolean;
1997
+ }
1998
+ /** DOM shape of the real `<ks-top-nav-bar>` custom element, typed for the wrapper. */
1999
+ type KsTopNavBarElement = HTMLElement & {
2000
+ items: KsTopNavBarItem[];
2001
+ variant: KsTopNavBarVariant;
2002
+ showIcons: boolean;
2003
+ showLabels: boolean;
2004
+ label: string;
2005
+ };
2006
+ /**
2007
+ * Angular wrapper around the `<ks-top-nav-bar>` Stencil custom element.
2008
+ * Renders a real, consumer-facing default `<slot />` — same single
2009
+ * unfiltered `<ng-content>` pass-through as `Layout/card/card.ts`.
2010
+ */
2011
+ declare class KsTopNavBarComponent {
2012
+ private readonly el;
2013
+ /** Navigation items */
2014
+ readonly items: _angular_core.InputSignal<KsTopNavBarItem[]>;
2015
+ /** Visual style of the active indicator */
2016
+ readonly variant: _angular_core.InputSignal<KsTopNavBarVariant>;
2017
+ /** Show icon alongside label */
2018
+ readonly showIcons: _angular_core.InputSignal<boolean>;
2019
+ /** Show label text */
2020
+ readonly showLabels: _angular_core.InputSignal<boolean>;
2021
+ /** Aria label for the nav element */
2022
+ readonly label: _angular_core.InputSignal<string>;
2023
+ constructor(ref: ElementRef<KsTopNavBarElement>);
2024
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTopNavBarComponent, never>;
2025
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTopNavBarComponent, "ks-top-nav-bar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "showIcons": { "alias": "showIcons"; "required": false; "isSignal": true; }; "showLabels": { "alias": "showLabels"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2026
+ }
2027
+
2028
+ /**
2029
+ * Mirrors `KsTreeNode` exported by
2030
+ * `core/src/components/Navigation/tree-view/tree-view.tsx`. Duplicated
2031
+ * locally — see the note in `Buttons/button-group/button-group.ts` for why.
2032
+ */
2033
+ interface KsTreeNode {
2034
+ key: string;
2035
+ label: string;
2036
+ icon?: string;
2037
+ disabled?: boolean;
2038
+ children?: KsTreeNode[];
2039
+ }
2040
+ /** DOM shape of the real `<ks-tree-view>` custom element, typed for the wrapper. */
2041
+ type KsTreeViewElement = HTMLElement & {
2042
+ nodes: KsTreeNode[];
2043
+ expandedKeys: string[];
2044
+ multi: boolean;
2045
+ };
2046
+ /**
2047
+ * Angular wrapper around the `<ks-tree-view>` Stencil custom element.
2048
+ * No `<slot>` in the wrapped Stencil render — data-driven only.
2049
+ */
2050
+ declare class KsTreeViewComponent {
2051
+ private readonly el;
2052
+ /** Tree data */
2053
+ readonly nodes: _angular_core.InputSignal<KsTreeNode[]>;
2054
+ /** Keys of nodes that start expanded */
2055
+ readonly expandedKeys: _angular_core.InputSignal<string[]>;
2056
+ /** Allow selecting multiple nodes */
2057
+ readonly multi: _angular_core.InputSignal<boolean>;
2058
+ /** Emits key(s) when selection changes. From the native `selectionChanged` event. */
2059
+ readonly ksSelectionChanged: _angular_core.OutputEmitterRef<string | string[]>;
2060
+ /** Emits when a node is expanded/collapsed. From the native `expandChange` event. */
2061
+ readonly ksExpandChange: _angular_core.OutputEmitterRef<{
2062
+ key: string;
2063
+ expanded: boolean;
2064
+ }>;
2065
+ constructor(ref: ElementRef<KsTreeViewElement>);
2066
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsTreeViewComponent, never>;
2067
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsTreeViewComponent, "ks-tree-view", never, { "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, { "ksSelectionChanged": "ksSelectionChanged"; "ksExpandChange": "ksExpandChange"; }, never, never, true, never>;
2068
+ }
2069
+
2070
+ /** DOM shape of the real `<ks-badge>` custom element, typed for the wrapper. */
2071
+ type KsBadgeElement = HTMLElement & {
2072
+ label: string;
2073
+ variant: KsBaseVariant;
2074
+ size: KsBaseSize;
2075
+ dot: boolean;
2076
+ pill: boolean;
2077
+ };
2078
+ /**
2079
+ * Angular wrapper around the `<ks-badge>` Stencil custom element.
2080
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
2081
+ * render, plain inputs only.
2082
+ */
2083
+ declare class KsBadgeComponent {
2084
+ private readonly el;
2085
+ /** Display text */
2086
+ readonly label: _angular_core.InputSignal<string>;
2087
+ /** Colour variant */
2088
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
2089
+ /** Size */
2090
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
2091
+ /** Show a dot instead of text */
2092
+ readonly dot: _angular_core.InputSignal<boolean>;
2093
+ /** Pill (fully rounded) shape */
2094
+ readonly pill: _angular_core.InputSignal<boolean>;
2095
+ constructor(ref: ElementRef<KsBadgeElement>);
2096
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsBadgeComponent, never>;
2097
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsBadgeComponent, "ks-badge", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "pill": { "alias": "pill"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2098
+ }
2099
+
2100
+ /** DOM shape of the real `<ks-loader>` custom element, typed for the wrapper. */
2101
+ type KsLoaderElement = HTMLElement & {
2102
+ state: LoaderStateEnum;
2103
+ };
2104
+ /**
2105
+ * Angular wrapper around the `<ks-loader>` Stencil custom element.
2106
+ *
2107
+ * Renders real, consumer-facing named slots — `loading`, `empty`,
2108
+ * `empty-action`, `error`, `error-action` — plus a default (unnamed)
2109
+ * slot for the `Success` state. Same single unfiltered
2110
+ * `<ng-content>` pass-through as `Layout/card/card.ts`: give each
2111
+ * projected child its own native `slot="loading"` / `slot="empty"` /
2112
+ * `slot="empty-action"` / `slot="error"` / `slot="error-action"`
2113
+ * attribute (or none, for the default/success slot).
2114
+ */
2115
+ declare class KsLoaderComponent {
2116
+ private readonly el;
2117
+ /** Current state */
2118
+ readonly state: _angular_core.InputSignal<LoaderStateEnum>;
2119
+ constructor(ref: ElementRef<KsLoaderElement>);
2120
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsLoaderComponent, never>;
2121
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsLoaderComponent, "ks-loader", never, { "state": { "alias": "state"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2122
+ }
2123
+
2124
+ /** DOM shape of the real `<ks-message>` custom element, typed for the wrapper. */
2125
+ type KsMessageElement = HTMLElement & {
2126
+ text: string;
2127
+ icon: string;
2128
+ variant: KsBaseVariant;
2129
+ dismissible: boolean;
2130
+ };
2131
+ /**
2132
+ * Angular wrapper around the `<ks-message>` Stencil custom element.
2133
+ *
2134
+ * `<ks-message>` renders a default `<slot />` only as a fallback when
2135
+ * `text` is empty — same single unfiltered `<ng-content>` pass-through as
2136
+ * `Layout/card/card.ts`; omit `text` and project content instead if
2137
+ * richer markup is needed.
2138
+ */
2139
+ declare class KsMessageComponent {
2140
+ private readonly el;
2141
+ /** Main message text */
2142
+ readonly text: _angular_core.InputSignal<string>;
2143
+ /** Optional icon class (e.g. Material Icon or Font Awesome) */
2144
+ readonly icon: _angular_core.InputSignal<string>;
2145
+ /** Colour variant */
2146
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
2147
+ /** Show a dismiss (×) button */
2148
+ readonly dismissible: _angular_core.InputSignal<boolean>;
2149
+ /** Emits when the message is dismissed. From the native `dismissed` event. */
2150
+ readonly ksDismissed: _angular_core.OutputEmitterRef<void>;
2151
+ constructor(ref: ElementRef<KsMessageElement>);
2152
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsMessageComponent, never>;
2153
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsMessageComponent, "ks-message", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "ksDismissed": "ksDismissed"; }, never, ["*"], true, never>;
2154
+ }
2155
+
2156
+ /** DOM shape of the real `<ks-progress>` custom element, typed for the wrapper. */
2157
+ type KsProgressElement = HTMLElement & {
2158
+ value: number;
2159
+ max: number;
2160
+ showLabel: boolean;
2161
+ variant: KsBaseVariant;
2162
+ size: KsBaseSize;
2163
+ indeterminate: boolean;
2164
+ label: string;
2165
+ };
2166
+ /**
2167
+ * Angular wrapper around the `<ks-progress>` Stencil custom element.
2168
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
2169
+ * render, plain inputs only.
2170
+ */
2171
+ declare class KsProgressComponent {
2172
+ private readonly el;
2173
+ /** Progress value (0-100) */
2174
+ readonly value: _angular_core.InputSignal<number>;
2175
+ /** Maximum value */
2176
+ readonly max: _angular_core.InputSignal<number>;
2177
+ /** Show percentage label */
2178
+ readonly showLabel: _angular_core.InputSignal<boolean>;
2179
+ /** Progress variant */
2180
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
2181
+ /** Progress size */
2182
+ readonly size: _angular_core.InputSignal<KsBaseSize>;
2183
+ /** Indeterminate/loading state */
2184
+ readonly indeterminate: _angular_core.InputSignal<boolean>;
2185
+ /** Optional label text */
2186
+ readonly label: _angular_core.InputSignal<string>;
2187
+ constructor(ref: ElementRef<KsProgressElement>);
2188
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsProgressComponent, never>;
2189
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsProgressComponent, "ks-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2190
+ }
2191
+
2192
+ /** DOM shape of the real `<ks-spinner>` custom element, typed for the wrapper. */
2193
+ type KsSpinnerElement = HTMLElement & {
2194
+ size: KsSize;
2195
+ variant: KsBaseVariant;
2196
+ text: string;
2197
+ centered: boolean;
2198
+ };
2199
+ /**
2200
+ * Angular wrapper around the `<ks-spinner>` Stencil custom element.
2201
+ * Purely presentational — no events, no `<slot>` in the wrapped Stencil
2202
+ * render, plain inputs only.
2203
+ */
2204
+ declare class KsSpinnerComponent {
2205
+ private readonly el;
2206
+ /** Spinner size */
2207
+ readonly size: _angular_core.InputSignal<KsSize>;
2208
+ /** Spinner variant/color */
2209
+ readonly variant: _angular_core.InputSignal<KsBaseVariant>;
2210
+ /** Optional text to display */
2211
+ readonly text: _angular_core.InputSignal<string>;
2212
+ /** Center the spinner in container */
2213
+ readonly centered: _angular_core.InputSignal<boolean>;
2214
+ constructor(ref: ElementRef<KsSpinnerElement>);
2215
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsSpinnerComponent, never>;
2216
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsSpinnerComponent, "ks-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "centered": { "alias": "centered"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2217
+ }
2218
+
2219
+ /** DOM shape of the real `<ks-toast-outlet>` custom element, typed for the wrapper. */
2220
+ type KsToastOutletElement = HTMLElement & {
2221
+ position: KsToastPosition;
2222
+ };
2223
+ /**
2224
+ * Angular wrapper around the `<ks-toast-outlet>` Stencil custom element.
2225
+ * Named `KsToastOutletComponent` (matching the literal tag, not just
2226
+ * `KsToastComponent`) for consistency with the React wrapper, which must
2227
+ * avoid colliding with the re-exported `KsToast` *data* interface above
2228
+ * (TypeScript disallows a value and a type export sharing one identifier
2229
+ * from the same module) — see `react/src/components/Notification/toast/toast.tsx`.
2230
+ * `<ks-toast-outlet position="top-right" />` is all a consumer needs; add
2231
+ * one per screen corner they want to stack toasts in.
2232
+ *
2233
+ * No `<slot>`, no events — it purely subscribes to the shared
2234
+ * `toastStore` singleton (re-exported above) and renders whatever's
2235
+ * enqueued.
2236
+ */
2237
+ declare class KsToastOutletComponent {
2238
+ private readonly el;
2239
+ /** Where on screen to stack toasts */
2240
+ readonly position: _angular_core.InputSignal<KsToastPosition>;
2241
+ constructor(ref: ElementRef<KsToastOutletElement>);
2242
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KsToastOutletComponent, never>;
2243
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KsToastOutletComponent, "ks-toast-outlet", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2244
+ }
2245
+
2246
+ export { KsAccordionComponent, KsAvatarComponent, KsBadgeComponent, KsBreadcrumbComponent, KsButtonComponent, KsButtonGroupComponent, KsCardComponent, KsCarouselComponent, KsCheckboxComponent, KsChipsComponent, KsCodeViewComponent, KsColourPickerComponent, KsContextMenuComponent, KsDatepickerComponent, KsDaterangeComponent, KsDialogComponent, KsDropdownComponent, KsFabComponent, KsInputComponent, KsListBoxComponent, KsLoaderComponent, KsMessageComponent, KsNavBarComponent, KsNotFoundComponent, KsOtpInputComponent, KsPaginationComponent, KsProgressComponent, KsRadioComponent, KsRatingComponent, KsSidebarComponent, KsSliderComponent, KsSpinnerComponent, KsStepperComponent, KsSwitchComponent, KsTabComponent, KsTableComponent, KsTextareaComponent, KsThemeSwitchComponent, KsTimepickerComponent, KsToastOutletComponent, KsToolbarComponent, KsTooltipComponent, KsTopNavBarComponent, KsTreeViewComponent, KsUploaderComponent };
2247
+ export type { ActionButtonsConfig, KsAccordionItem, KsBreadcrumbItem, KsButtonGroupDisplayStyle, KsButtonGroupItem, KsCardVariant, KsCarouselSlide, KsCheckboxOption, KsChipOption, KsChipsValue, KsCodeViewLanguage, KsColourPickerVariant, KsContextMenuItem, KsContextMenuPosition, KsDateRange, KsDialogSize, KsDropdownOption, KsDropdownValue, KsFabAction, KsFabPosition, KsInputType, KsListBoxOption, KsListBoxValue, KsNavBarItem, KsNavBarMode, KsNavBarSection, KsNavBarSectionItem, KsPresetRange, KsRadioOption, KsSidebarPosition, KsSidebarType, KsStepItem, KsStepperOrientation, KsTabItem, KsTableSize, KsTableVariant, KsTimeValue, KsToolbarItem, KsTopNavBarItem, KsTopNavBarVariant, KsTreeNode, KsUploadedFile };