@mk-kit/ui 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/block-editor/README.md +254 -0
  4. package/fesm2022/mk-kit-ui-block-editor.mjs +2158 -0
  5. package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -0
  6. package/fesm2022/mk-kit-ui-button.mjs +81 -0
  7. package/fesm2022/mk-kit-ui-button.mjs.map +1 -0
  8. package/fesm2022/mk-kit-ui-checkbox.mjs +136 -0
  9. package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -0
  10. package/fesm2022/mk-kit-ui-chip.mjs +122 -0
  11. package/fesm2022/mk-kit-ui-chip.mjs.map +1 -0
  12. package/fesm2022/mk-kit-ui-context-menu.mjs +144 -0
  13. package/fesm2022/mk-kit-ui-context-menu.mjs.map +1 -0
  14. package/fesm2022/mk-kit-ui-core.mjs +1576 -0
  15. package/fesm2022/mk-kit-ui-core.mjs.map +1 -0
  16. package/fesm2022/mk-kit-ui-data.mjs +6055 -0
  17. package/fesm2022/mk-kit-ui-data.mjs.map +1 -0
  18. package/fesm2022/mk-kit-ui-datetime.mjs +3409 -0
  19. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -0
  20. package/fesm2022/mk-kit-ui-directives.mjs +1779 -0
  21. package/fesm2022/mk-kit-ui-directives.mjs.map +1 -0
  22. package/fesm2022/mk-kit-ui-dnd.mjs +1073 -0
  23. package/fesm2022/mk-kit-ui-dnd.mjs.map +1 -0
  24. package/fesm2022/mk-kit-ui-feedback.mjs +2426 -0
  25. package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -0
  26. package/fesm2022/mk-kit-ui-forms.mjs +9208 -0
  27. package/fesm2022/mk-kit-ui-forms.mjs.map +1 -0
  28. package/fesm2022/mk-kit-ui-icon.mjs +470 -0
  29. package/fesm2022/mk-kit-ui-icon.mjs.map +1 -0
  30. package/fesm2022/mk-kit-ui-media.mjs +896 -0
  31. package/fesm2022/mk-kit-ui-media.mjs.map +1 -0
  32. package/fesm2022/mk-kit-ui-navigation.mjs +2542 -0
  33. package/fesm2022/mk-kit-ui-navigation.mjs.map +1 -0
  34. package/fesm2022/mk-kit-ui-rich-text.mjs +565 -0
  35. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -0
  36. package/fesm2022/mk-kit-ui-table.mjs +1378 -0
  37. package/fesm2022/mk-kit-ui-table.mjs.map +1 -0
  38. package/fesm2022/mk-kit-ui.mjs +32 -0
  39. package/fesm2022/mk-kit-ui.mjs.map +1 -0
  40. package/package.json +130 -0
  41. package/schematics/collection.json +10 -0
  42. package/schematics/ng-add/index.js +113 -0
  43. package/schematics/ng-add/schema.json +22 -0
  44. package/schematics/package.json +3 -0
  45. package/styles/mk-kit.css +750 -0
  46. package/types/mk-kit-ui-block-editor.d.ts +292 -0
  47. package/types/mk-kit-ui-button.d.ts +40 -0
  48. package/types/mk-kit-ui-checkbox.d.ts +62 -0
  49. package/types/mk-kit-ui-chip.d.ts +59 -0
  50. package/types/mk-kit-ui-context-menu.d.ts +57 -0
  51. package/types/mk-kit-ui-core.d.ts +1105 -0
  52. package/types/mk-kit-ui-data.d.ts +2580 -0
  53. package/types/mk-kit-ui-datetime.d.ts +1171 -0
  54. package/types/mk-kit-ui-directives.d.ts +807 -0
  55. package/types/mk-kit-ui-dnd.d.ts +423 -0
  56. package/types/mk-kit-ui-feedback.d.ts +1270 -0
  57. package/types/mk-kit-ui-forms.d.ts +3586 -0
  58. package/types/mk-kit-ui-icon.d.ts +108 -0
  59. package/types/mk-kit-ui-media.d.ts +549 -0
  60. package/types/mk-kit-ui-navigation.d.ts +1169 -0
  61. package/types/mk-kit-ui-rich-text.d.ts +187 -0
  62. package/types/mk-kit-ui-table.d.ts +739 -0
  63. package/types/mk-kit-ui.d.ts +17 -0
@@ -0,0 +1,2580 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TemplateRef, ElementRef } from '@angular/core';
3
+ import * as _mk_kit_ui_core from '@mk-kit/ui/core';
4
+ import { MkTone, MkSize, MkCodeLanguage } from '@mk-kit/ui/core';
5
+ import { ControlValueAccessor } from '@angular/forms';
6
+ import * as _mk_kit_ui_data from '@mk-kit/ui/data';
7
+ import { MkDropEvent } from '@mk-kit/ui/dnd';
8
+
9
+ /** Surface treatment for a {@link MkCard}. */
10
+ type MkCardVariant = 'elevated' | 'outlined' | 'filled';
11
+ /** Internal padding scale for a {@link MkCard}. */
12
+ type MkCardPadding = 'none' | 'sm' | 'md' | 'lg';
13
+ /**
14
+ * Card — a themed surface container that groups related content. Compose it
15
+ * with the projected `mk-card-header`, `mk-card-title` and `mk-card-footer`
16
+ * parts, or drop plain content straight into the body.
17
+ *
18
+ * ```html
19
+ * <mk-card variant="elevated">
20
+ * <mk-card-header>
21
+ * <mk-card-title>Monthly revenue</mk-card-title>
22
+ * </mk-card-header>
23
+ * Body content goes here.
24
+ * <mk-card-footer>
25
+ * <button mkButton variant="ghost">Details</button>
26
+ * </mk-card-footer>
27
+ * </mk-card>
28
+ * ```
29
+ */
30
+ declare class MkCard {
31
+ /** Surface treatment: raised shadow, hairline border, or tinted fill. */
32
+ readonly variant: _angular_core.InputSignal<MkCardVariant>;
33
+ /** Internal spacing applied to the body, header and footer. */
34
+ readonly padding: _angular_core.InputSignal<MkCardPadding>;
35
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCard, never>;
36
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCard, "mk-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["mk-card-header, [mkCardHeader]", "*", "mk-card-footer, [mkCardFooter]"], true, never>;
37
+ }
38
+
39
+ /**
40
+ * Card header region — a padded band separated from the body by a hairline
41
+ * border. Typically wraps a {@link MkCardTitle} and optional actions.
42
+ */
43
+ declare class MkCardHeader {
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCardHeader, never>;
45
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCardHeader, "mk-card-header, [mkCardHeader]", never, {}, {}, never, ["*"], true, never>;
46
+ }
47
+ /**
48
+ * Card title — semantic heading text for a card header. Renders as bold,
49
+ * emphasised text; wrap the projected content in your own heading element if a
50
+ * specific heading level is required for the document outline.
51
+ */
52
+ declare class MkCardTitle {
53
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCardTitle, never>;
54
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCardTitle, "mk-card-title", never, {}, {}, never, ["*"], true, never>;
55
+ }
56
+ /**
57
+ * Card footer region — a padded band separated from the body by a hairline
58
+ * border, usually holding actions aligned to the end.
59
+ */
60
+ declare class MkCardFooter {
61
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCardFooter, never>;
62
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCardFooter, "mk-card-footer, [mkCardFooter]", never, {}, {}, never, ["*"], true, never>;
63
+ }
64
+
65
+ /** Axis a {@link MkDivider} is drawn along. */
66
+ type MkDividerOrientation = 'horizontal' | 'vertical';
67
+ /**
68
+ * Divider — a themed separator rule. Renders horizontally by default; set
69
+ * `orientation="vertical"` for an inline vertical rule. Project content to
70
+ * label a horizontal divider (the label sits centred between two rules).
71
+ *
72
+ * ```html
73
+ * <mk-divider />
74
+ * <mk-divider>OR</mk-divider>
75
+ * <mk-divider orientation="vertical" />
76
+ * ```
77
+ */
78
+ declare class MkDivider {
79
+ /** Axis the rule is drawn along. */
80
+ readonly orientation: _angular_core.InputSignal<MkDividerOrientation>;
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDivider, never>;
82
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDivider, "mk-divider", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
83
+ }
84
+
85
+ /** Visual treatment for a {@link MkBadge}. */
86
+ type MkBadgeVariant = 'solid' | 'soft' | 'outline';
87
+ /**
88
+ * Badge — a compact status pill, typically for counts or short state labels.
89
+ * Set `dot` for a minimal notification indicator with no text.
90
+ *
91
+ * ```html
92
+ * <mk-badge tone="success">Active</mk-badge>
93
+ * <mk-badge tone="danger" variant="solid">3</mk-badge>
94
+ * <mk-badge tone="danger" dot aria-label="Unread messages" />
95
+ * ```
96
+ */
97
+ declare class MkBadge {
98
+ /** Semantic color tone. */
99
+ readonly tone: _angular_core.InputSignal<MkTone>;
100
+ /** Visual treatment. */
101
+ readonly variant: _angular_core.InputSignal<MkBadgeVariant>;
102
+ /** Size scale. */
103
+ readonly size: _angular_core.InputSignal<MkSize>;
104
+ /** Render as a tiny dot (no text) for notification indicators. */
105
+ readonly dot: _angular_core.InputSignalWithTransform<boolean, unknown>;
106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkBadge, never>;
107
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkBadge, "mk-badge", never, { "tone": { "alias": "tone"; "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; }; }, {}, never, ["*"], true, never>;
108
+ }
109
+
110
+ /** Visual treatment for a {@link MkTag}. */
111
+ type MkTagVariant = 'solid' | 'soft' | 'outline';
112
+ /**
113
+ * Tag — a non-interactive label for categories, keywords or metadata. Unlike
114
+ * {@link MkChip} it carries no interaction; use it purely for display.
115
+ *
116
+ * ```html
117
+ * <mk-tag>Design</mk-tag>
118
+ * <mk-tag tone="info" variant="outline">Beta</mk-tag>
119
+ * ```
120
+ */
121
+ declare class MkTag {
122
+ /** Semantic color tone. */
123
+ readonly tone: _angular_core.InputSignal<MkTone>;
124
+ /** Visual treatment. */
125
+ readonly variant: _angular_core.InputSignal<MkTagVariant>;
126
+ /** Size scale. */
127
+ readonly size: _angular_core.InputSignal<MkSize>;
128
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkTag, never>;
129
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTag, "mk-tag", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
130
+ }
131
+
132
+ /** Outline shape of an {@link MkAvatar}. */
133
+ type MkAvatarShape = 'circle' | 'rounded';
134
+ /** Presence status shown as a corner dot on an {@link MkAvatar}. */
135
+ type MkAvatarStatus = 'online' | 'offline' | 'away' | 'busy';
136
+ /**
137
+ * Avatar — a user/entity image that gracefully falls back to initials derived
138
+ * from `name`, or to a projected icon. The whole avatar is exposed as a single
139
+ * labelled image to assistive tech.
140
+ *
141
+ * ```html
142
+ * <mk-avatar name="Ada Lovelace" src="/ada.jpg" status="online" />
143
+ * <mk-avatar name="Grace Hopper" /> <!-- initials fallback -->
144
+ * <mk-avatar><svg>…</svg></mk-avatar> <!-- icon fallback -->
145
+ * ```
146
+ */
147
+ declare class MkAvatar {
148
+ /** Image URL. When it fails to load the avatar falls back automatically. */
149
+ readonly src: _angular_core.InputSignal<string | undefined>;
150
+ /** Display name; drives the initials fallback and the default alt text. */
151
+ readonly name: _angular_core.InputSignal<string | undefined>;
152
+ /** Explicit accessible label. Defaults to `name`, else "Avatar". */
153
+ readonly alt: _angular_core.InputSignal<string | undefined>;
154
+ /** Size scale. */
155
+ readonly size: _angular_core.InputSignal<MkSize>;
156
+ /** Outline shape. */
157
+ readonly shape: _angular_core.InputSignal<MkAvatarShape>;
158
+ /** Presence indicator dot; omit for none. */
159
+ readonly status: _angular_core.InputSignal<MkAvatarStatus | undefined>;
160
+ /** True once the provided image has failed to load. */
161
+ private readonly imgFailed;
162
+ protected readonly showImage: _angular_core.Signal<boolean>;
163
+ /** Up-to-two-letter initials derived from `name`. */
164
+ protected readonly initials: _angular_core.Signal<string>;
165
+ protected readonly label: _angular_core.Signal<string>;
166
+ protected onError(): void;
167
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkAvatar, never>;
168
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkAvatar, "mk-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
169
+ }
170
+
171
+ /**
172
+ * Avatar group — overlaps a set of {@link MkAvatar} children and, when `max`
173
+ * is set, collapses the overflow into a trailing "+N" bubble.
174
+ *
175
+ * ```html
176
+ * <mk-avatar-group [max]="3">
177
+ * <mk-avatar name="Ada Lovelace" />
178
+ * <mk-avatar name="Grace Hopper" />
179
+ * <mk-avatar name="Alan Turing" />
180
+ * <mk-avatar name="Katherine Johnson" />
181
+ * </mk-avatar-group>
182
+ * ```
183
+ */
184
+ declare class MkAvatarGroup {
185
+ /** Maximum avatars to show before collapsing the rest into "+N". */
186
+ readonly max: _angular_core.InputSignalWithTransform<number | undefined, unknown>;
187
+ /** Size of the overflow bubble (match your avatars' size). */
188
+ readonly size: _angular_core.InputSignal<MkSize>;
189
+ private readonly items;
190
+ protected readonly overflowCount: _angular_core.Signal<number>;
191
+ constructor();
192
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkAvatarGroup, never>;
193
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkAvatarGroup, "mk-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, ["items"], ["*"], true, never>;
194
+ }
195
+
196
+ /**
197
+ * List — a vertical stack of {@link MkListItem}s with `role="list"` semantics.
198
+ *
199
+ * ```html
200
+ * <mk-list>
201
+ * <mk-list-item>Dashboard</mk-list-item>
202
+ * <mk-list-item interactive (activated)="open()">Settings</mk-list-item>
203
+ * </mk-list>
204
+ * ```
205
+ */
206
+ declare class MkList {
207
+ /** Draw hairline separators between items. */
208
+ readonly bordered: _angular_core.InputSignalWithTransform<boolean, unknown>;
209
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkList, never>;
210
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkList, "mk-list", never, { "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
211
+ }
212
+
213
+ /**
214
+ * List item — a row inside {@link MkList}. Project leading/trailing adornments
215
+ * with the `mkListLeading` / `mkListTrailing` attributes. Set `interactive`
216
+ * to make the row focusable and clickable (Enter/Space activate it).
217
+ *
218
+ * ```html
219
+ * <mk-list-item interactive [selected]="active()" (activated)="pick()">
220
+ * <mk-avatar mkListLeading name="Ada" />
221
+ * Ada Lovelace
222
+ * <mk-badge mkListTrailing tone="success">New</mk-badge>
223
+ * </mk-list-item>
224
+ * ```
225
+ */
226
+ declare class MkListItem {
227
+ /** Make the row focusable/clickable with hover + keyboard activation. */
228
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
229
+ /** Highlight the row as the current selection. */
230
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
231
+ /** Disable interaction and dim the row. */
232
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
233
+ /** Emitted on click / Enter / Space when `interactive`. */
234
+ readonly activated: _angular_core.OutputEmitterRef<void>;
235
+ protected onClick(): void;
236
+ protected onKeydown(event: Event): void;
237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkListItem, never>;
238
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkListItem, "mk-list-item", never, { "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "activated": "activated"; }, never, ["[mkListLeading]", "*", "[mkListTrailing]"], true, never>;
239
+ }
240
+
241
+ /**
242
+ * EmptyState — a centered placeholder for "nothing here yet" situations: empty
243
+ * tables, no search results, a fresh dashboard, a cleared inbox. Provide a
244
+ * `title` (and usually a `description`), an `icon` or projected media, and
245
+ * call-to-action buttons via the actions slot.
246
+ *
247
+ * Slots: `[mkEmptyStateMedia]` (custom illustration, overrides `icon`), default
248
+ * content (extra body), `[mkEmptyStateActions]` (buttons).
249
+ *
250
+ * ```html
251
+ * <mk-empty-state icon="search" title="No results"
252
+ * description="Try adjusting your filters.">
253
+ * <button mkButton mkEmptyStateActions variant="outline">Clear filters</button>
254
+ * </mk-empty-state>
255
+ * ```
256
+ */
257
+ declare class MkEmptyState {
258
+ /** Name of a registered icon shown above the title (ignored if media is projected). */
259
+ readonly icon: _angular_core.InputSignal<string>;
260
+ /** Main heading, e.g. "No invoices yet". */
261
+ readonly title: _angular_core.InputSignal<string>;
262
+ /** Supporting sentence under the title. */
263
+ readonly description: _angular_core.InputSignal<string>;
264
+ /** Overall scale of the block. */
265
+ readonly size: _angular_core.InputSignal<MkSize>;
266
+ protected readonly iconSize: () => 28 | 48 | 36;
267
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkEmptyState, never>;
268
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkEmptyState, "mk-empty-state", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["[mkEmptyStateMedia]", "*", "[mkEmptyStateActions]"], true, never>;
269
+ }
270
+
271
+ /**
272
+ * Timeline — a vertical sequence of chronological events (activity feeds, order
273
+ * status, audit logs). A container for `<mk-timeline-item>`s that draws the
274
+ * connecting rail; exposed to assistive tech as a list.
275
+ *
276
+ * ```html
277
+ * <mk-timeline>
278
+ * <mk-timeline-item tone="success" time="09:30" heading="Order placed">
279
+ * Payment confirmed.
280
+ * </mk-timeline-item>
281
+ * <mk-timeline-item time="10:15" heading="Packed">In the warehouse.</mk-timeline-item>
282
+ * </mk-timeline>
283
+ * ```
284
+ */
285
+ declare class MkTimeline {
286
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkTimeline, never>;
287
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTimeline, "mk-timeline", never, {}, {}, never, ["*"], true, never>;
288
+ }
289
+
290
+ /**
291
+ * A single event in an `<mk-timeline>`: a tone-coloured marker (optionally an
292
+ * icon), an optional time/label and heading, and projected body content.
293
+ *
294
+ * ```html
295
+ * <mk-timeline-item tone="danger" icon="error" time="2m ago" heading="Build failed">
296
+ * 3 tests failed on <code>main</code>.
297
+ * </mk-timeline-item>
298
+ * ```
299
+ */
300
+ declare class MkTimelineItem {
301
+ /** Semantic colour of the marker dot. */
302
+ readonly tone: _angular_core.InputSignal<MkTone>;
303
+ /** Name of a registered icon rendered inside the marker. */
304
+ readonly icon: _angular_core.InputSignal<string>;
305
+ /** Time or label shown above the heading (e.g. "09:30", "2m ago"). */
306
+ readonly time: _angular_core.InputSignal<string>;
307
+ /** Event title. */
308
+ readonly heading: _angular_core.InputSignal<string>;
309
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkTimelineItem, never>;
310
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTimelineItem, "mk-timeline-item", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "time": { "alias": "time"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
311
+ }
312
+
313
+ /** Direction of a {@link MkStatCard} delta. */
314
+ type MkStatTrend = 'up' | 'down' | 'neutral';
315
+ /**
316
+ * Stat card — a compact KPI tile for dashboards. Shows a label, a primary
317
+ * value and an optional trend delta. The trend is conveyed by an arrow glyph
318
+ * and a screen-reader phrase in addition to colour, so it never relies on
319
+ * colour alone.
320
+ *
321
+ * ```html
322
+ * <mk-stat-card
323
+ * label="Revenue"
324
+ * value="$48.2k"
325
+ * [delta]="'+12%'"
326
+ * deltaTrend="up"
327
+ * hint="vs. last month">
328
+ * <svg mkStatIcon>…</svg>
329
+ * </mk-stat-card>
330
+ * ```
331
+ */
332
+ declare class MkStatCard {
333
+ /** Metric name shown above the value. */
334
+ readonly label: _angular_core.InputSignal<string>;
335
+ /** The primary metric value. */
336
+ readonly value: _angular_core.InputSignal<string | number>;
337
+ /** Change indicator (e.g. `'+12%'` or `-4`). Omit to hide the delta row. */
338
+ readonly delta: _angular_core.InputSignal<string | number | undefined>;
339
+ /** Trend direction; colourises the delta and picks the arrow glyph. */
340
+ readonly deltaTrend: _angular_core.InputSignal<MkStatTrend>;
341
+ /** Small supporting note under the delta (e.g. "vs. last month"). */
342
+ readonly hint: _angular_core.InputSignal<string | undefined>;
343
+ protected readonly labelId: string;
344
+ protected readonly hasDelta: _angular_core.Signal<boolean>;
345
+ /** Arrow glyph for the current trend. */
346
+ protected readonly arrow: _angular_core.Signal<"↑" | "↓" | "→">;
347
+ /** Screen-reader phrase describing the trend. */
348
+ protected readonly trendLabel: _angular_core.Signal<"Trending up" | "Trending down" | "No change">;
349
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkStatCard, never>;
350
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkStatCard, "mk-stat-card", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "deltaTrend": { "alias": "deltaTrend"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; }, {}, never, ["[mkStatIcon]"], true, never>;
351
+ }
352
+
353
+ /** Layout direction of a {@link MkProfileCard}. */
354
+ type MkProfileCardOrientation = 'vertical' | 'horizontal';
355
+ /**
356
+ * Profile meta row — a stats strip projected into a {@link MkProfileCard}
357
+ * between the body and the actions. Direct children are laid out as
358
+ * evenly-spaced, centre-aligned cells with subtle separators between them.
359
+ *
360
+ * ```html
361
+ * <div mkProfileMeta>
362
+ * <div><strong>128</strong> posts</div>
363
+ * <div><strong>2.4k</strong> followers</div>
364
+ * </div>
365
+ * ```
366
+ */
367
+ declare class MkProfileMeta {
368
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkProfileMeta, never>;
369
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkProfileMeta, "[mkProfileMeta]", never, {}, {}, never, ["*"], true, never>;
370
+ }
371
+ /**
372
+ * Profile actions row — buttons projected into the footer area of a
373
+ * {@link MkProfileCard}. Centred in vertical orientation; pinned to the end
374
+ * in horizontal orientation.
375
+ *
376
+ * ```html
377
+ * <div mkProfileActions>
378
+ * <button mkButton>Follow</button>
379
+ * <button mkButton variant="outline">Message</button>
380
+ * </div>
381
+ * ```
382
+ */
383
+ declare class MkProfileActions {
384
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkProfileActions, never>;
385
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkProfileActions, "[mkProfileActions]", never, {}, {}, never, ["*"], true, never>;
386
+ }
387
+ /**
388
+ * Profile card — a person/entity summary on a bordered surface: an optional
389
+ * cover banner, an {@link MkAvatar} (with automatic initials fallback derived
390
+ * from `name`), the display name, a muted subtitle, free-form body content and
391
+ * two optional slots for a meta/stats row and an actions row.
392
+ *
393
+ * Orientations:
394
+ * - `vertical` (default) — centred column; when `coverSrc` is set a 3:1 banner
395
+ * spans the card top and the avatar overlaps its bottom edge with a
396
+ * surface-coloured ring.
397
+ * - `horizontal` — avatar on the left, text in the middle, actions pinned to
398
+ * the end. The cover banner is intentionally NOT rendered in this
399
+ * orientation (a side-by-side row has no top edge for it to crown).
400
+ *
401
+ * The name renders as emphasised generic text (like `mk-card-title`, no
402
+ * hard-coded heading level) so the card never disrupts the document outline.
403
+ *
404
+ * ```html
405
+ * <mk-profile-card
406
+ * name="Ada Lovelace"
407
+ * subtitle="Analytical Engine Programmer"
408
+ * avatarSrc="/ada.jpg"
409
+ * coverSrc="/cover.jpg">
410
+ * First programmer. Wrote notes G through... well, all of them.
411
+ * <div mkProfileMeta>
412
+ * <div><strong>128</strong> posts</div>
413
+ * <div><strong>2.4k</strong> followers</div>
414
+ * <div><strong>310</strong> following</div>
415
+ * </div>
416
+ * <div mkProfileActions>
417
+ * <button mkButton>Follow</button>
418
+ * <button mkButton variant="outline">Message</button>
419
+ * </div>
420
+ * </mk-profile-card>
421
+ * ```
422
+ */
423
+ declare class MkProfileCard {
424
+ /** Display name. Also drives the avatar's initials fallback and alt text. */
425
+ readonly name: _angular_core.InputSignal<string>;
426
+ /** Muted supporting line under the name (role, handle, email…). */
427
+ readonly subtitle: _angular_core.InputSignal<string>;
428
+ /** Avatar image URL; when empty the avatar falls back to initials. */
429
+ readonly avatarSrc: _angular_core.InputSignal<string>;
430
+ /**
431
+ * Cover banner image URL rendered as a ~3:1 band across the card top
432
+ * (vertical orientation only). When set, the avatar overlaps the banner's
433
+ * bottom edge with a surface-coloured ring.
434
+ */
435
+ readonly coverSrc: _angular_core.InputSignal<string>;
436
+ /** Layout: centred column (`vertical`) or avatar-left row (`horizontal`). */
437
+ readonly orientation: _angular_core.InputSignal<MkProfileCardOrientation>;
438
+ /** Avatar size scale, forwarded to {@link MkAvatar}. */
439
+ readonly avatarSize: _angular_core.InputSignal<MkSize>;
440
+ /** Id of the name element, wired to the host's `aria-labelledby`. */
441
+ protected readonly nameId: string;
442
+ /** Cover renders only in vertical orientation. */
443
+ protected readonly showCover: _angular_core.Signal<boolean>;
444
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkProfileCard, never>;
445
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkProfileCard, "mk-profile-card", ["mkProfileCard"], { "name": { "alias": "name"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "coverSrc": { "alias": "coverSrc"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "avatarSize": { "alias": "avatarSize"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[mkProfileMeta]", "[mkProfileActions]"], true, never>;
446
+ }
447
+
448
+ /**
449
+ * Progress bar — a determinate (0–100) or indeterminate progress indicator
450
+ * with `role="progressbar"`. `aria-valuenow` is omitted while indeterminate.
451
+ * The indeterminate animation respects `prefers-reduced-motion`.
452
+ *
453
+ * ```html
454
+ * <mk-progress-bar [value]="uploaded()" label="Uploading" showValue />
455
+ * <mk-progress-bar indeterminate label="Loading" />
456
+ * ```
457
+ */
458
+ declare class MkProgressBar {
459
+ /** Completion percentage 0–100 (ignored while indeterminate). */
460
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
461
+ /** Show an animated indeterminate bar with no known completion. */
462
+ readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
463
+ /** Semantic color tone of the fill. */
464
+ readonly tone: _angular_core.InputSignal<MkTone>;
465
+ /** Track thickness. */
466
+ readonly size: _angular_core.InputSignal<MkSize>;
467
+ /** Optional visible caption; also labels the bar for assistive tech. */
468
+ readonly label: _angular_core.InputSignal<string | undefined>;
469
+ /** Show the numeric percentage next to the label (determinate only). */
470
+ readonly showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
471
+ protected readonly labelId: string;
472
+ /** Value clamped into the valid 0–100 range and rounded. */
473
+ protected readonly clamped: _angular_core.Signal<number>;
474
+ /**
475
+ * Inline transform for the determinate fill. Scaling instead of animating
476
+ * `width` keeps the transition compositor-only (no layout per frame).
477
+ */
478
+ protected readonly fillTransform: _angular_core.Signal<string>;
479
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkProgressBar, never>;
480
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkProgressBar, "mk-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
481
+ }
482
+
483
+ /**
484
+ * ProgressRing — a circular progress indicator. Determinate by default (an arc
485
+ * proportional to `value`); set `indeterminate` for a spinner-style preloader
486
+ * when progress is unknown. Themed by `tone`, sized by `size`.
487
+ *
488
+ * ```html
489
+ * <mk-progress-ring [value]="uploaded()" showLabel />
490
+ * <mk-progress-ring indeterminate tone="neutral" [size]="24" />
491
+ * <mk-progress-ring [value]="72" tone="success"><mk-icon name="check" /></mk-progress-ring>
492
+ * ```
493
+ */
494
+ declare class MkProgressRing {
495
+ /** Current progress value (clamped to `[0, max]`). Ignored when indeterminate. */
496
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
497
+ /** Maximum value. Default `100`. */
498
+ readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
499
+ /** Diameter in px. Default `48`. */
500
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
501
+ /** Ring thickness in px. Default `4`. */
502
+ readonly thickness: _angular_core.InputSignalWithTransform<number, unknown>;
503
+ /** Semantic colour of the progress arc. */
504
+ readonly tone: _angular_core.InputSignal<MkTone>;
505
+ /** Show a rotating arc for unknown-duration work (a circular preloader). */
506
+ readonly indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
507
+ /** Show the percentage in the centre. */
508
+ readonly showLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
509
+ /** Accessible label (recommended, especially when indeterminate). */
510
+ readonly label: _angular_core.InputSignal<string>;
511
+ protected readonly clampedValue: _angular_core.Signal<number>;
512
+ protected readonly fraction: _angular_core.Signal<number>;
513
+ protected readonly percent: _angular_core.Signal<number>;
514
+ protected readonly radius: _angular_core.Signal<number>;
515
+ protected readonly circumference: _angular_core.Signal<number>;
516
+ /** Dash offset that reveals `fraction` of the circle. */
517
+ protected readonly dashOffset: _angular_core.Signal<number>;
518
+ protected readonly center: _angular_core.Signal<number>;
519
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkProgressRing, never>;
520
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkProgressRing, "mk-progress-ring", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
521
+ }
522
+
523
+ /**
524
+ * Spinner — a circular indeterminate loading indicator. Exposes `role="status"`
525
+ * with a visually-hidden label so assistive tech announces the loading state.
526
+ * The animation slows under `prefers-reduced-motion`.
527
+ *
528
+ * ```html
529
+ * <mk-spinner />
530
+ * <mk-spinner size="lg" tone="neutral" label="Fetching results" />
531
+ * ```
532
+ */
533
+ declare class MkSpinner {
534
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
535
+ /** Size scale. */
536
+ readonly size: _angular_core.InputSignal<MkSize>;
537
+ /** Semantic color tone. */
538
+ readonly tone: _angular_core.InputSignal<MkTone>;
539
+ /** Visually-hidden status label announced to screen readers. */
540
+ readonly label: _angular_core.InputSignal<string>;
541
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSpinner, never>;
542
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSpinner, "mk-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
543
+ }
544
+
545
+ /**
546
+ * Shared, framework-agnostic helpers for the mk-kit SVG charts. Pure functions
547
+ * only — no Angular, no DOM — so they stay trivially testable and reusable.
548
+ */
549
+ /** A named data series for multi-series charts. */
550
+ interface MkChartSeries {
551
+ /** Legend/tooltip label (identity — always shown, never colour-alone). */
552
+ name: string;
553
+ /** The values, one per category/x position. */
554
+ data: number[];
555
+ /** Optional explicit colour; defaults to the validated palette by index. */
556
+ color?: string;
557
+ }
558
+ /** A single slice for the donut/pie chart. */
559
+ interface MkChartSlice {
560
+ /** Slice label. */
561
+ name: string;
562
+ /** Slice value (summed to compute proportions). */
563
+ value: number;
564
+ /** Optional explicit colour; defaults to the palette by index. */
565
+ color?: string;
566
+ }
567
+ /** A resolved 2-D point in SVG user space. */
568
+ interface MkPoint {
569
+ x: number;
570
+ y: number;
571
+ }
572
+ /** Number of hues in the validated categorical palette (`--mk-chart-1..8`). */
573
+ declare const MK_CHART_PALETTE_SIZE = 8;
574
+ /**
575
+ * Categorical colour for a series index — a CSS reference to the validated
576
+ * `--mk-chart-N` token. Assigned in fixed order and wrapped past 8 (prefer
577
+ * folding a 9th series into "Other" over relying on the wrap).
578
+ */
579
+ declare function mkChartColor(index: number): string;
580
+ /** Build a linear scale mapping `[d0,d1]` (domain) onto `[r0,r1]` (range). */
581
+ declare function mkLinearScale(d0: number, d1: number, r0: number, r1: number): (value: number) => number;
582
+ /**
583
+ * "Nice" rounded tick values covering `[min,max]` with roughly `count` steps —
584
+ * used for value axes so gridlines land on human numbers.
585
+ */
586
+ declare function mkNiceTicks(min: number, max: number, count?: number): number[];
587
+ /** Straight-segment SVG path (`M … L …`) through the given points. */
588
+ declare function mkLinePath(points: readonly MkPoint[]): string;
589
+ /**
590
+ * Closed area path under a line: the line, dropped to `baselineY` at each end.
591
+ */
592
+ declare function mkAreaPath(points: readonly MkPoint[], baselineY: number): string;
593
+ /**
594
+ * SVG arc path for a donut/pie slice between two angles (radians, clockwise
595
+ * from 12 o'clock). `inner` of 0 yields a pie wedge; > 0 yields a ring segment.
596
+ */
597
+ declare function mkArcPath(cx: number, cy: number, outer: number, inner: number, startAngle: number, endAngle: number): string;
598
+ /** Compact number formatting for axes/tooltips (1.2k, 3.4M). */
599
+ declare function mkFormatCompact(value: number): string;
600
+
601
+ /** Visual form of a {@link MkSparkline}. */
602
+ type MkSparklineType = 'line' | 'area' | 'bar';
603
+ /**
604
+ * Sparkline — a tiny, axis-less trend chart sized to sit inline in a table
605
+ * cell, stat card or list row. Single series only; it's a *mark*, so it carries
606
+ * no legend or tooltip (give context with the surrounding label + `label`).
607
+ *
608
+ * ```html
609
+ * <mk-sparkline [data]="[3,5,4,7,6,9,8]" type="area" />
610
+ * <mk-sparkline [data]="visits()" [width]="80" showDot
611
+ * color="var(--mk-success)" label="Weekly visits" />
612
+ * ```
613
+ */
614
+ declare class MkSparkline {
615
+ /** The values to plot (left → right). */
616
+ readonly data: _angular_core.InputSignal<readonly number[]>;
617
+ /** Visual form. */
618
+ readonly type: _angular_core.InputSignal<MkSparklineType>;
619
+ /** Any CSS colour; defaults to the first chart hue. */
620
+ readonly color: _angular_core.InputSignal<string>;
621
+ /** Intrinsic width in px (the SVG scales with its box). */
622
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
623
+ /** Intrinsic height in px. */
624
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
625
+ /** Line/area stroke width. */
626
+ readonly strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
627
+ /** Draw a dot on the last point (line/area only). */
628
+ readonly showDot: _angular_core.InputSignalWithTransform<boolean, unknown>;
629
+ /** Fixed domain minimum (defaults to the data min). */
630
+ readonly min: _angular_core.InputSignal<number | undefined>;
631
+ /** Fixed domain maximum (defaults to the data max). */
632
+ readonly max: _angular_core.InputSignal<number | undefined>;
633
+ /** Accessible label; a data summary is generated when omitted. */
634
+ readonly label: _angular_core.InputSignal<string>;
635
+ private readonly pad;
636
+ private readonly domain;
637
+ protected readonly points: _angular_core.Signal<MkPoint[]>;
638
+ protected readonly linePath: _angular_core.Signal<string>;
639
+ protected readonly areaPath: _angular_core.Signal<string>;
640
+ /** Bar geometry for the `bar` type. */
641
+ protected readonly bars: _angular_core.Signal<{
642
+ x: number;
643
+ y: number;
644
+ w: number;
645
+ h: number;
646
+ }[]>;
647
+ protected readonly lastPoint: _angular_core.Signal<MkPoint | null>;
648
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
649
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSparkline, never>;
650
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSparkline, "mk-sparkline", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "showDot": { "alias": "showDot"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
651
+ }
652
+
653
+ interface BarRect {
654
+ x: number;
655
+ y: number;
656
+ w: number;
657
+ h: number;
658
+ color: string;
659
+ seriesIndex: number;
660
+ categoryIndex: number;
661
+ value: number;
662
+ }
663
+ interface GridLine {
664
+ value: number;
665
+ label: string;
666
+ x1: number;
667
+ y1: number;
668
+ x2: number;
669
+ y2: number;
670
+ labelX: number;
671
+ labelY: number;
672
+ }
673
+ interface Band {
674
+ label: string;
675
+ labelX: number;
676
+ labelY: number;
677
+ /** SVG transform when the axis is tilted; `null` when labels sit flat. */
678
+ transform: string | null;
679
+ }
680
+ /** Bar orientation. */
681
+ type MkBarOrientation = 'vertical' | 'horizontal';
682
+ /**
683
+ * BarChart — compares a measure across categories with one or more series
684
+ * (grouped or `stacked`), `vertical` (default) or `horizontal`. Dependency-free
685
+ * SVG on the validated `--mk-chart-*` palette; ships a legend for ≥ 2 series, a
686
+ * value axis with gridlines, per-bar hover tooltips and a screen-reader table.
687
+ *
688
+ * ```html
689
+ * <mk-bar-chart orientation="horizontal"
690
+ * [categories]="['Q1','Q2','Q3','Q4']"
691
+ * [series]="[{ name: 'Revenue', data: [12,19,15,22] }]" />
692
+ * ```
693
+ */
694
+ declare class MkBarChart {
695
+ /** Measured host width (falls back to `width` before first measure). */
696
+ private readonly autoWidth;
697
+ /** The viewBox width the geometry is drawn against. */
698
+ protected readonly drawWidth: _angular_core.Signal<number>;
699
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
700
+ /** Category labels along the category axis. */
701
+ readonly categories: _angular_core.InputSignal<readonly string[]>;
702
+ /** One or more data series (values align to `categories`). */
703
+ readonly series: _angular_core.InputSignal<readonly MkChartSeries[]>;
704
+ /** Bar direction. */
705
+ readonly orientation: _angular_core.InputSignal<MkBarOrientation>;
706
+ /** Intrinsic width in viewBox units — the fallback before the host is
707
+ * measured, and the fixed drawing width when `responsive` is off. */
708
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
709
+ /**
710
+ * Match the viewBox width to the host's actual width so `height` means
711
+ * pixels and a wide container no longer stretches the chart vertically.
712
+ * Set false to pin the drawing to `width` (the pre-0.8 behaviour).
713
+ */
714
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean, unknown>;
715
+ /** Intrinsic height. */
716
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
717
+ /** Stack series into one bar per category instead of grouping. */
718
+ readonly stacked: _angular_core.InputSignalWithTransform<boolean, unknown>;
719
+ /** Show gridlines behind the bars. */
720
+ readonly showGrid: _angular_core.InputSignalWithTransform<boolean, unknown>;
721
+ /** Force the legend on/off (defaults to on when there are ≥ 2 series). */
722
+ readonly showLegend: _angular_core.InputSignal<boolean | undefined>;
723
+ /**
724
+ * Category-label tilt in degrees. `'auto'` (the default) leaves labels flat
725
+ * while they fit and tilts them 45° when they would collide — the axis of a
726
+ * narrow chart is otherwise an unreadable smear. A number pins the angle
727
+ * (0 = always flat, 30/45 = always tilted); values are clamped to 0…90.
728
+ *
729
+ * Tilting reserves the extra vertical room it needs, so `height` still means
730
+ * the height you asked for. When even tilted labels cannot fit, the chart
731
+ * thins them — every Nth label is dropped rather than overlapped.
732
+ */
733
+ readonly labelAngle: _angular_core.InputSignal<number | "auto">;
734
+ /** Accessible summary; generated from the data when omitted. */
735
+ readonly label: _angular_core.InputSignal<string>;
736
+ protected readonly hovered: _angular_core.WritableSignal<BarRect | null>;
737
+ /** Tap-to-pin: a touch tap on a bar pins the tooltip until a tap lands
738
+ * outside the chart (mouse hover in/out is unaffected). */
739
+ private readonly tapPin;
740
+ protected readonly horizontal: _angular_core.Signal<boolean>;
741
+ /** Widest category label, in estimated px. */
742
+ private readonly widestLabelPx;
743
+ /**
744
+ * The tilt actually applied. `auto` stays flat while the labels fit their
745
+ * band and tilts 45° otherwise; an explicit number always wins (clamped).
746
+ * Horizontal bars put categories on the Y axis, where tilting makes no
747
+ * sense, so they are always flat.
748
+ */
749
+ protected readonly resolvedAngle: _angular_core.Signal<number>;
750
+ /**
751
+ * Show every Nth label. Tilting buys room but not unlimited room: at 45° a
752
+ * label still occupies `width * cos(45°)` horizontally, so a 24-category
753
+ * chart in a card can need thinning on top of the tilt. Dropping labels
754
+ * beats overlapping them — the bars all still draw.
755
+ */
756
+ protected readonly labelStep: _angular_core.Signal<number>;
757
+ private readonly margin;
758
+ protected readonly plot: _angular_core.Signal<{
759
+ x: number;
760
+ y: number;
761
+ w: number;
762
+ h: number;
763
+ }>;
764
+ protected readonly colors: _angular_core.Signal<string[]>;
765
+ protected readonly legendVisible: _angular_core.Signal<boolean>;
766
+ private readonly maxValue;
767
+ protected readonly ticks: _angular_core.Signal<number[]>;
768
+ private readonly tickMax;
769
+ /** Pixel position along the value axis for a value. */
770
+ private readonly valuePos;
771
+ /** Gridlines + value-axis labels (orientation-aware). */
772
+ protected readonly gridRows: _angular_core.Signal<GridLine[]>;
773
+ /** Category-axis labels. */
774
+ protected readonly bands: _angular_core.Signal<Band[]>;
775
+ /** All bar rectangles (grouped or stacked, vertical or horizontal). */
776
+ protected readonly bars: _angular_core.Signal<BarRect[]>;
777
+ protected readonly legend: _angular_core.Signal<{
778
+ name: string;
779
+ color: string;
780
+ }[]>;
781
+ /** Tooltip position (percent of viewBox) + content for the hovered bar. */
782
+ protected readonly tooltip: _angular_core.Signal<{
783
+ left: number;
784
+ top: number;
785
+ category: string;
786
+ series: string;
787
+ color: string;
788
+ value: string;
789
+ multi: boolean;
790
+ } | null>;
791
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
792
+ protected setHover(bar: BarRect | null): void;
793
+ protected pinHover(bar: BarRect, event: PointerEvent): void;
794
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkBarChart, never>;
795
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkBarChart, "mk-bar-chart", never, { "categories": { "alias": "categories"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "labelAngle": { "alias": "labelAngle"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
796
+ }
797
+
798
+ /**
799
+ * LineChart — a line (or `area`) chart for change over time / ordered
800
+ * categories, with one or more series. Dependency-free SVG on the validated
801
+ * `--mk-chart-*` palette; ships a legend for ≥ 2 series, a value axis, a
802
+ * hover crosshair with a shared tooltip, and a screen-reader data table.
803
+ *
804
+ * ```html
805
+ * <mk-line-chart area
806
+ * [categories]="months"
807
+ * [series]="[{ name: 'Sessions', data: sessions() }]" />
808
+ * ```
809
+ */
810
+ declare class MkLineChart {
811
+ /** Measured host width (falls back to `width` before first measure). */
812
+ private readonly autoWidth;
813
+ /** The viewBox width the geometry is drawn against. */
814
+ protected readonly drawWidth: _angular_core.Signal<number>;
815
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
816
+ /** Ordered category labels along the x axis. */
817
+ readonly categories: _angular_core.InputSignal<readonly string[]>;
818
+ /** One or more data series (values align to `categories`). */
819
+ readonly series: _angular_core.InputSignal<readonly MkChartSeries[]>;
820
+ /** Intrinsic width in viewBox units — the fallback before the host is
821
+ * measured, and the fixed drawing width when `responsive` is off. */
822
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
823
+ /**
824
+ * Match the viewBox width to the host's actual width so `height` means
825
+ * pixels and a wide container no longer stretches the chart vertically.
826
+ * Set false to pin the drawing to `width` (the pre-0.8 behaviour).
827
+ */
828
+ readonly responsive: _angular_core.InputSignalWithTransform<boolean, unknown>;
829
+ /** Intrinsic height. */
830
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
831
+ /** Fill the area under each line. */
832
+ readonly area: _angular_core.InputSignalWithTransform<boolean, unknown>;
833
+ /** Stack the series (cumulative bands) — implies filled areas. */
834
+ readonly stacked: _angular_core.InputSignalWithTransform<boolean, unknown>;
835
+ /** Draw a dot at every data point. */
836
+ readonly showDots: _angular_core.InputSignalWithTransform<boolean, unknown>;
837
+ /** Show gridlines. */
838
+ readonly showGrid: _angular_core.InputSignalWithTransform<boolean, unknown>;
839
+ /** Force the legend on/off (defaults to on when there are ≥ 2 series). */
840
+ readonly showLegend: _angular_core.InputSignal<boolean | undefined>;
841
+ /** Accessible summary; generated from the data when omitted. */
842
+ readonly label: _angular_core.InputSignal<string>;
843
+ protected readonly hoverIndex: _angular_core.WritableSignal<number | null>;
844
+ /** Tap-to-pin: a touch tap on a hit band pins the tooltip until a tap lands
845
+ * outside the chart (mouse hover in/out is unaffected). */
846
+ private readonly tapPin;
847
+ protected readonly plot: _angular_core.Signal<{
848
+ x: number;
849
+ y: number;
850
+ w: number;
851
+ h: number;
852
+ }>;
853
+ protected readonly colors: _angular_core.Signal<string[]>;
854
+ protected readonly legendVisible: _angular_core.Signal<boolean>;
855
+ private readonly extent;
856
+ protected readonly ticks: _angular_core.Signal<number[]>;
857
+ private readonly domain;
858
+ private readonly toY;
859
+ private readonly xAt;
860
+ protected readonly gridRows: _angular_core.Signal<{
861
+ value: number;
862
+ label: string;
863
+ y: number;
864
+ }[]>;
865
+ /** Per-series rendered geometry (points + line + area paths). */
866
+ protected readonly rendered: _angular_core.Signal<{
867
+ name: string;
868
+ color: string;
869
+ points: MkPoint[];
870
+ line: string;
871
+ area: string;
872
+ }[]>;
873
+ /** Whether to paint the filled areas. */
874
+ protected readonly fillAreas: _angular_core.Signal<boolean>;
875
+ /** Transparent hit bands (one per category) driving the shared tooltip. */
876
+ protected readonly hitBands: _angular_core.Signal<{
877
+ index: number;
878
+ x: number;
879
+ y: number;
880
+ w: number;
881
+ h: number;
882
+ }[]>;
883
+ protected readonly crosshairX: _angular_core.Signal<number | null>;
884
+ protected readonly legend: _angular_core.Signal<{
885
+ name: string;
886
+ color: string;
887
+ }[]>;
888
+ /** Hovered-point markers + tooltip payload for the active category. */
889
+ protected readonly activePoints: _angular_core.Signal<{
890
+ color: string;
891
+ name: string;
892
+ x: number;
893
+ y: number;
894
+ value: number;
895
+ }[]>;
896
+ protected readonly tooltip: _angular_core.Signal<{
897
+ left: number;
898
+ top: number;
899
+ category: string;
900
+ rows: {
901
+ color: string;
902
+ name: string;
903
+ value: string;
904
+ }[];
905
+ multi: boolean;
906
+ } | null>;
907
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
908
+ protected setHover(index: number | null): void;
909
+ protected pinHover(index: number, event: PointerEvent): void;
910
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkLineChart, never>;
911
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkLineChart, "mk-line-chart", never, { "categories": { "alias": "categories"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "area": { "alias": "area"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; "showDots": { "alias": "showDots"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
912
+ }
913
+
914
+ interface SliceGeom {
915
+ name: string;
916
+ value: number;
917
+ color: string;
918
+ path: string;
919
+ percent: number;
920
+ midAngle: number;
921
+ index: number;
922
+ }
923
+ /**
924
+ * DonutChart — proportions of a whole as a ring (or a full pie when
925
+ * `thickness` covers the radius). Dependency-free SVG on the validated
926
+ * `--mk-chart-*` palette; ships a value/percent legend, per-slice hover
927
+ * tooltips, an optional centre label, and a screen-reader data table.
928
+ *
929
+ * ```html
930
+ * <mk-donut-chart centerLabel="1,240" centerSublabel="Total"
931
+ * [slices]="[{ name: 'Direct', value: 540 }, { name: 'Search', value: 700 }]" />
932
+ * ```
933
+ */
934
+ declare class MkDonutChart {
935
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
936
+ /** The slices; each `value` contributes to the whole. */
937
+ readonly slices: _angular_core.InputSignal<readonly MkChartSlice[]>;
938
+ /** Diameter in viewBox units (the SVG scales to its container). */
939
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
940
+ /** Ring thickness. Set `0` (or ≥ radius) for a full pie. */
941
+ readonly thickness: _angular_core.InputSignalWithTransform<number, unknown>;
942
+ /** Show the legend with values + percentages. */
943
+ readonly showLegend: _angular_core.InputSignalWithTransform<boolean, unknown>;
944
+ /** Big centre label (e.g. a total). Donut only. */
945
+ readonly centerLabel: _angular_core.InputSignal<string>;
946
+ /** Small centre caption under the label. */
947
+ readonly centerSublabel: _angular_core.InputSignal<string>;
948
+ /** Accessible summary; generated from the data when omitted. */
949
+ readonly label: _angular_core.InputSignal<string>;
950
+ protected readonly hovered: _angular_core.WritableSignal<number | null>;
951
+ /** Tap-to-pin: a touch tap on a slice pins the tooltip until a tap lands
952
+ * outside the chart (mouse hover in/out is unaffected). */
953
+ private readonly tapPin;
954
+ protected readonly total: _angular_core.Signal<number>;
955
+ protected readonly center: _angular_core.Signal<number>;
956
+ protected readonly outerRadius: _angular_core.Signal<number>;
957
+ protected readonly innerRadius: _angular_core.Signal<number>;
958
+ protected readonly geom: _angular_core.Signal<SliceGeom[]>;
959
+ protected readonly legend: _angular_core.Signal<{
960
+ name: string;
961
+ color: string;
962
+ value: string;
963
+ percent: number;
964
+ }[]>;
965
+ protected readonly tooltip: _angular_core.Signal<{
966
+ left: number;
967
+ top: number;
968
+ name: string;
969
+ color: string;
970
+ value: string;
971
+ percent: number;
972
+ } | null>;
973
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
974
+ protected setHover(index: number | null): void;
975
+ protected pinHover(index: number, event: PointerEvent): void;
976
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDonutChart, never>;
977
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDonutChart, "mk-donut-chart", never, { "slices": { "alias": "slices"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "centerLabel": { "alias": "centerLabel"; "required": false; "isSignal": true; }; "centerSublabel": { "alias": "centerSublabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
978
+ }
979
+
980
+ /**
981
+ * Gauge — a single-metric radial dial (a KPI: "68% of quota"). Dependency-free
982
+ * SVG: a track arc with a value arc filled proportionally to `value` on the
983
+ * `[min, max]` scale, and a centred value + label. The sweep is configurable
984
+ * (`arc`, default 270°). Exposes `role="meter"` for assistive tech.
985
+ *
986
+ * ```html
987
+ * <mk-gauge [value]="68" label="of quota" unit="%" />
988
+ * ```
989
+ */
990
+ declare class MkGauge {
991
+ /** The current value. */
992
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
993
+ /** Scale minimum. */
994
+ readonly min: _angular_core.InputSignalWithTransform<number, unknown>;
995
+ /** Scale maximum. */
996
+ readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
997
+ /** Sweep of the arc in degrees (30–360). */
998
+ readonly arc: _angular_core.InputSignalWithTransform<number, unknown>;
999
+ /** Intrinsic size (viewBox units; the SVG scales to its container). */
1000
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
1001
+ /** Arc thickness. */
1002
+ readonly thickness: _angular_core.InputSignalWithTransform<number, unknown>;
1003
+ /** Value-arc colour. */
1004
+ readonly color: _angular_core.InputSignal<string>;
1005
+ /** Track (background arc) colour. */
1006
+ readonly trackColor: _angular_core.InputSignal<string>;
1007
+ /** Label under the value. */
1008
+ readonly label: _angular_core.InputSignal<string>;
1009
+ /** Unit appended to the value (e.g. `%`). */
1010
+ readonly unit: _angular_core.InputSignal<string>;
1011
+ /** Override the centred value text. */
1012
+ readonly valueText: _angular_core.InputSignal<string>;
1013
+ private readonly TAU;
1014
+ protected readonly cx: _angular_core.Signal<number>;
1015
+ protected readonly cy: _angular_core.Signal<number>;
1016
+ private readonly rOuter;
1017
+ private readonly rInner;
1018
+ /** Value clamped to [min, max] then normalised to 0–1. */
1019
+ protected readonly fraction: _angular_core.Signal<number>;
1020
+ private readonly sweep;
1021
+ /** Arc starts after half the gap, measured clockwise from 6 o'clock. */
1022
+ private readonly startAngle;
1023
+ protected readonly trackPath: _angular_core.Signal<string>;
1024
+ protected readonly valuePath: _angular_core.Signal<string>;
1025
+ protected readonly centerText: _angular_core.Signal<string>;
1026
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1027
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkGauge, never>;
1028
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkGauge, "mk-gauge", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "arc": { "alias": "arc"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "trackColor": { "alias": "trackColor"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "valueText": { "alias": "valueText"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1029
+ }
1030
+
1031
+ /** A single plotted point. `size` (optional) turns it into a bubble. */
1032
+ interface MkScatterPoint {
1033
+ x: number;
1034
+ y: number;
1035
+ /** Value driving the bubble radius when `bubble` sizing is used. */
1036
+ size?: number;
1037
+ /** Optional label shown in the tooltip. */
1038
+ label?: string;
1039
+ }
1040
+ /** A named group of scatter points sharing a colour. */
1041
+ interface MkScatterSeries {
1042
+ name: string;
1043
+ color?: string;
1044
+ points: readonly MkScatterPoint[];
1045
+ }
1046
+ interface RenderedPoint {
1047
+ cx: number;
1048
+ cy: number;
1049
+ r: number;
1050
+ color: string;
1051
+ seriesName: string;
1052
+ x: number;
1053
+ y: number;
1054
+ label?: string;
1055
+ }
1056
+ /**
1057
+ * ScatterChart — plot (x, y) points across two numeric axes to reveal
1058
+ * correlation and clusters. Give each point a `size` to render a bubble chart.
1059
+ * Dependency-free SVG on the validated `--mk-chart-*` palette; ships nice-tick
1060
+ * axes, a legend for ≥ 2 series, a per-point hover tooltip and a screen-reader
1061
+ * data table.
1062
+ *
1063
+ * ```html
1064
+ * <mk-scatter-chart
1065
+ * xLabel="Spend" yLabel="Revenue"
1066
+ * [series]="[{ name: 'Q3', points: pts() }]" />
1067
+ * ```
1068
+ */
1069
+ declare class MkScatterChart {
1070
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1071
+ /** One or more point series. */
1072
+ readonly series: _angular_core.InputSignal<readonly MkScatterSeries[]>;
1073
+ /** Intrinsic width (viewBox units; the SVG scales to its container). */
1074
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
1075
+ /** Intrinsic height. */
1076
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
1077
+ /** Radius of each point when not sizing by `size`. */
1078
+ readonly pointRadius: _angular_core.InputSignalWithTransform<number, unknown>;
1079
+ /** Size points by their `size` value (bubble chart). */
1080
+ readonly bubble: _angular_core.InputSignalWithTransform<boolean, unknown>;
1081
+ /** Largest bubble radius when `bubble` is on. */
1082
+ readonly maxRadius: _angular_core.InputSignalWithTransform<number, unknown>;
1083
+ /** Show gridlines. */
1084
+ readonly showGrid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1085
+ /** Force the legend on/off (defaults to on when there are ≥ 2 series). */
1086
+ readonly showLegend: _angular_core.InputSignal<boolean | undefined>;
1087
+ /** x-axis title. */
1088
+ readonly xLabel: _angular_core.InputSignal<string>;
1089
+ /** y-axis title. */
1090
+ readonly yLabel: _angular_core.InputSignal<string>;
1091
+ /** Accessible summary; generated from the data when omitted. */
1092
+ readonly label: _angular_core.InputSignal<string>;
1093
+ protected readonly hoverKey: _angular_core.WritableSignal<string | null>;
1094
+ /** Tap-to-pin: a touch tap on a point pins the tooltip until a tap lands
1095
+ * outside the chart (mouse hover in/out is unaffected). */
1096
+ private readonly tapPin;
1097
+ protected readonly plot: _angular_core.Signal<{
1098
+ x: number;
1099
+ y: number;
1100
+ w: number;
1101
+ h: number;
1102
+ }>;
1103
+ protected readonly colors: _angular_core.Signal<string[]>;
1104
+ protected readonly legendVisible: _angular_core.Signal<boolean>;
1105
+ private readonly allPoints;
1106
+ private readonly xExtent;
1107
+ private readonly yExtent;
1108
+ protected readonly xTicks: _angular_core.Signal<number[]>;
1109
+ protected readonly yTicks: _angular_core.Signal<number[]>;
1110
+ private readonly xScale;
1111
+ private readonly yScale;
1112
+ private readonly sizeExtent;
1113
+ private radiusFor;
1114
+ /** Gridlines + axis-tick geometry. */
1115
+ protected readonly xGrid: _angular_core.Signal<{
1116
+ value: number;
1117
+ label: string;
1118
+ x: number;
1119
+ y1: number;
1120
+ y2: number;
1121
+ }[]>;
1122
+ protected readonly yGrid: _angular_core.Signal<{
1123
+ value: number;
1124
+ label: string;
1125
+ y: number;
1126
+ x1: number;
1127
+ x2: number;
1128
+ }[]>;
1129
+ /** Every point positioned for rendering. */
1130
+ protected readonly points: _angular_core.Signal<RenderedPoint[]>;
1131
+ protected keyOf(index: number): string;
1132
+ protected readonly legend: _angular_core.Signal<{
1133
+ name: string;
1134
+ color: string;
1135
+ }[]>;
1136
+ protected readonly tooltip: _angular_core.Signal<{
1137
+ left: number;
1138
+ top: number;
1139
+ color: string;
1140
+ title: string;
1141
+ x: string;
1142
+ y: string;
1143
+ } | null>;
1144
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1145
+ protected setHover(key: string | null): void;
1146
+ protected pinHover(key: string, event: PointerEvent): void;
1147
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkScatterChart, never>;
1148
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkScatterChart, "mk-scatter-chart", never, { "series": { "alias": "series"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "pointRadius": { "alias": "pointRadius"; "required": false; "isSignal": true; }; "bubble": { "alias": "bubble"; "required": false; "isSignal": true; }; "maxRadius": { "alias": "maxRadius"; "required": false; "isSignal": true; }; "showGrid": { "alias": "showGrid"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "xLabel": { "alias": "xLabel"; "required": false; "isSignal": true; }; "yLabel": { "alias": "yLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1149
+ }
1150
+
1151
+ interface HeatCell {
1152
+ value: number | null;
1153
+ display: string;
1154
+ xLabel: string;
1155
+ bg: string;
1156
+ strong: boolean;
1157
+ }
1158
+ interface HeatRow {
1159
+ label: string;
1160
+ cells: HeatCell[];
1161
+ }
1162
+ /**
1163
+ * Heatmap — a matrix of cells shaded by value intensity, for correlation
1164
+ * grids, activity-by-time tables and the like. Rendered as a semantic
1165
+ * `<table>` (so it is inherently screen-reader friendly) with cell colours
1166
+ * mixed from `accent` over the surface via `color-mix`, so it tracks the theme.
1167
+ *
1168
+ * ```html
1169
+ * <mk-heatmap
1170
+ * [xLabels]="hours" [yLabels]="days" [data]="matrix()" showValues />
1171
+ * ```
1172
+ */
1173
+ declare class MkHeatmap {
1174
+ /** Column labels (x axis). */
1175
+ readonly xLabels: _angular_core.InputSignal<readonly string[]>;
1176
+ /** Row labels (y axis). */
1177
+ readonly yLabels: _angular_core.InputSignal<readonly string[]>;
1178
+ /** Row-major matrix: `data[row][col]`. Use `null` for a blank cell. */
1179
+ readonly data: _angular_core.InputSignal<readonly (readonly (number | null)[])[]>;
1180
+ /** Override the low end of the colour domain (defaults to the data min). */
1181
+ readonly min: _angular_core.InputSignal<number | null>;
1182
+ /** Override the high end of the colour domain (defaults to the data max). */
1183
+ readonly max: _angular_core.InputSignal<number | null>;
1184
+ /** Base colour mixed over the surface for intensity. */
1185
+ readonly accent: _angular_core.InputSignal<string>;
1186
+ /** Print each cell's value inside it. */
1187
+ readonly showValues: _angular_core.InputSignalWithTransform<boolean, unknown>;
1188
+ /** Show the min→max colour scale legend. */
1189
+ readonly showScale: _angular_core.InputSignalWithTransform<boolean, unknown>;
1190
+ /** Formatter for cell + legend values. */
1191
+ readonly format: _angular_core.InputSignal<(value: number) => string>;
1192
+ /** Accessible summary; generated from the data when omitted. */
1193
+ readonly label: _angular_core.InputSignal<string>;
1194
+ private readonly domain;
1195
+ /** Fraction (0–1) of the domain a value sits at. */
1196
+ private ratio;
1197
+ protected readonly rows: _angular_core.Signal<HeatRow[]>;
1198
+ /** Legend swatches from 0 → 1 intensity. */
1199
+ protected readonly scaleStops: _angular_core.Signal<{
1200
+ min: string;
1201
+ max: string;
1202
+ swatches: string[];
1203
+ }>;
1204
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1205
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkHeatmap, never>;
1206
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkHeatmap, "mk-heatmap", never, { "xLabels": { "alias": "xLabels"; "required": false; "isSignal": true; }; "yLabels": { "alias": "yLabels"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "accent": { "alias": "accent"; "required": false; "isSignal": true; }; "showValues": { "alias": "showValues"; "required": false; "isSignal": true; }; "showScale": { "alias": "showScale"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1207
+ }
1208
+
1209
+ /** One day's datum for `mk-calendar-heatmap`. */
1210
+ interface MkCalendarHeatmapEntry {
1211
+ /**
1212
+ * The day — a `Date`, or a string. `YYYY-MM-DD` strings are parsed as
1213
+ * **local** dates (never UTC-shifted); other strings go through `new Date()`.
1214
+ */
1215
+ date: Date | string;
1216
+ /** The day's value (e.g. an activity count). Multiple entries for the same day are summed. */
1217
+ value: number;
1218
+ }
1219
+ /** Payload of `mk-calendar-heatmap`'s `cellClick`. */
1220
+ interface MkCalendarHeatmapCell {
1221
+ /** The clicked day (local midnight). */
1222
+ date: Date;
1223
+ /** The day's aggregated value (0 when no entry exists). */
1224
+ value: number;
1225
+ }
1226
+ interface DayCell {
1227
+ key: string;
1228
+ /** `null` for grid padding outside the displayed range. */
1229
+ date: Date | null;
1230
+ value: number;
1231
+ bg: string;
1232
+ title: string | null;
1233
+ }
1234
+ interface WeekdayRow {
1235
+ label: string;
1236
+ /** Visually show the label (Mon/Wed/Fri style); hidden rows keep it for SR. */
1237
+ showLabel: boolean;
1238
+ cells: DayCell[];
1239
+ }
1240
+ interface MonthSegment {
1241
+ key: string;
1242
+ label: string;
1243
+ /** Number of week columns the month header spans. */
1244
+ span: number;
1245
+ }
1246
+ /**
1247
+ * Calendar heatmap — a GitHub-style year of daily squares: weeks as columns,
1248
+ * weekdays as rows, each day shaded by its value. Rendered as a semantic
1249
+ * `<table>` (month headers span their week columns, weekday names are row
1250
+ * headers, every cell carries its formatted value for screen readers) with
1251
+ * intensities mixed from `color` over the surface via `color-mix`, so it
1252
+ * tracks the theme. Values are bucketed linearly against the range maximum
1253
+ * into `levels` steps; days with value 0 (or no entry) render transparent.
1254
+ *
1255
+ * Shows the last 12 months ending today by default; set `year` for a fixed
1256
+ * calendar year.
1257
+ *
1258
+ * ```html
1259
+ * <mk-calendar-heatmap
1260
+ * [data]="contributions"
1261
+ * [year]="2026"
1262
+ * (cellClick)="openDay($event.date)"
1263
+ * />
1264
+ * ```
1265
+ */
1266
+ declare class MkCalendarHeatmap {
1267
+ /** The daily values. Days without an entry count as 0. */
1268
+ readonly data: _angular_core.InputSignal<readonly MkCalendarHeatmapEntry[]>;
1269
+ /** Show a fixed calendar year; unset shows the last 12 months ending today. */
1270
+ readonly year: _angular_core.InputSignalWithTransform<number | null, string | number | null>;
1271
+ /** First weekday of the columns: 0 = Sunday … 6 = Saturday. */
1272
+ readonly firstDayOfWeek: _angular_core.InputSignalWithTransform<number, unknown>;
1273
+ /** Base colour mixed over the surface for intensity. */
1274
+ readonly color: _angular_core.InputSignal<string>;
1275
+ /** Number of intensity buckets in the ramp. */
1276
+ readonly levels: _angular_core.InputSignalWithTransform<number, unknown>;
1277
+ /** Formatter for each cell's title / screen-reader text (and legend max). */
1278
+ readonly format: _angular_core.InputSignal<((date: Date, value: number) => string) | null>;
1279
+ /** Show the less→more colour ramp legend. */
1280
+ readonly showScale: _angular_core.InputSignalWithTransform<boolean, unknown>;
1281
+ /** Accessible summary; generated from the data when omitted. */
1282
+ readonly label: _angular_core.InputSignal<string>;
1283
+ /** Emits the clicked day and its value. */
1284
+ readonly cellClick: _angular_core.OutputEmitterRef<MkCalendarHeatmapCell>;
1285
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1286
+ /** Aggregated value per day key (duplicate entries are summed). */
1287
+ private readonly values;
1288
+ /** Displayed [start, end] range, both at local midnight, inclusive. */
1289
+ private readonly range;
1290
+ private readonly sanitizedLevels;
1291
+ private readonly layout;
1292
+ protected readonly rows: _angular_core.Signal<WeekdayRow[]>;
1293
+ protected readonly monthSegments: _angular_core.Signal<MonthSegment[]>;
1294
+ /** Legend: 0 → max swatches mixed exactly like the cells. */
1295
+ protected readonly scaleStops: _angular_core.Signal<{
1296
+ min: string;
1297
+ max: string;
1298
+ swatches: string[];
1299
+ }>;
1300
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1301
+ private readonly defaultFormat;
1302
+ protected onCellClick(cell: DayCell): void;
1303
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCalendarHeatmap, never>;
1304
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCalendarHeatmap, "mk-calendar-heatmap", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "year": { "alias": "year"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "levels": { "alias": "levels"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "showScale": { "alias": "showScale"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "cellClick": "cellClick"; }, never, never, true, never>;
1305
+ }
1306
+
1307
+ interface RadarPoint {
1308
+ x: number;
1309
+ y: number;
1310
+ }
1311
+ interface RadarSeries {
1312
+ name: string;
1313
+ color: string;
1314
+ polygon: string;
1315
+ points: RadarPoint[];
1316
+ }
1317
+ interface RadarAxis {
1318
+ label: string;
1319
+ x: number;
1320
+ y: number;
1321
+ lx: number;
1322
+ ly: number;
1323
+ anchor: 'start' | 'middle' | 'end';
1324
+ }
1325
+ /**
1326
+ * RadarChart — a radar / spider chart comparing several series across the same
1327
+ * set of axes (skills, product profiles, survey dimensions). Dependency-free
1328
+ * SVG on the validated `--mk-chart-*` palette; ships concentric grid rings, a
1329
+ * legend for ≥ 2 series and a screen-reader data table.
1330
+ *
1331
+ * ```html
1332
+ * <mk-radar-chart
1333
+ * [axes]="['Speed','Power','Range','Cost','Ease']"
1334
+ * [series]="[{ name: 'Model A', data: [8,6,7,5,9] }]" />
1335
+ * ```
1336
+ */
1337
+ declare class MkRadarChart {
1338
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1339
+ /** Axis labels (one spoke each). Series data align to this order. */
1340
+ readonly axes: _angular_core.InputSignal<readonly string[]>;
1341
+ /** One or more series (values align to `axes`). */
1342
+ readonly series: _angular_core.InputSignal<readonly MkChartSeries[]>;
1343
+ /** Domain maximum (defaults to a nice value above the data max). */
1344
+ readonly max: _angular_core.InputSignal<number | null>;
1345
+ /** Number of concentric grid rings. */
1346
+ readonly levels: _angular_core.InputSignalWithTransform<number, unknown>;
1347
+ /** Intrinsic width (viewBox units; the SVG scales to its container). */
1348
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
1349
+ /** Intrinsic height. */
1350
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
1351
+ /** Draw a dot at each vertex. */
1352
+ readonly showDots: _angular_core.InputSignalWithTransform<boolean, unknown>;
1353
+ /** Force the legend on/off (defaults to on when there are ≥ 2 series). */
1354
+ readonly showLegend: _angular_core.InputSignal<boolean | undefined>;
1355
+ /** Accessible summary; generated from the data when omitted. */
1356
+ readonly label: _angular_core.InputSignal<string>;
1357
+ private readonly cx;
1358
+ private readonly cy;
1359
+ private readonly radius;
1360
+ protected readonly colors: _angular_core.Signal<string[]>;
1361
+ protected readonly legendVisible: _angular_core.Signal<boolean>;
1362
+ private readonly domainMax;
1363
+ /** Angle (radians) of axis `i`, starting at the top and going clockwise. */
1364
+ private angleAt;
1365
+ private pointAt;
1366
+ /** Concentric grid ring polygons (outer → inner). */
1367
+ protected readonly rings: _angular_core.Signal<{
1368
+ key: number;
1369
+ points: string;
1370
+ }[]>;
1371
+ /** Axis spokes + outer labels. */
1372
+ protected readonly axisSpokes: _angular_core.Signal<RadarAxis[]>;
1373
+ /** Per-series polygon + vertex geometry. */
1374
+ protected readonly rendered: _angular_core.Signal<RadarSeries[]>;
1375
+ protected readonly legend: _angular_core.Signal<{
1376
+ name: string;
1377
+ color: string;
1378
+ }[]>;
1379
+ protected readonly ringMax: _angular_core.Signal<string>;
1380
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1381
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkRadarChart, never>;
1382
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkRadarChart, "mk-radar-chart", never, { "axes": { "alias": "axes"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "levels": { "alias": "levels"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showDots": { "alias": "showDots"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1383
+ }
1384
+
1385
+ /** A single stage of the funnel (ordered largest → smallest conceptually). */
1386
+ interface MkFunnelSegment {
1387
+ /** Stage label (e.g. "Visits"). */
1388
+ label: string;
1389
+ /** Stage value; drives the band width. */
1390
+ value: number;
1391
+ /** Optional explicit colour; defaults to the palette by index. */
1392
+ color?: string;
1393
+ }
1394
+ interface FunnelBand {
1395
+ label: string;
1396
+ value: number;
1397
+ valueLabel: string;
1398
+ /** Conversion relative to the first (top) segment, as a percentage. */
1399
+ percent: number;
1400
+ percentLabel: string;
1401
+ color: string;
1402
+ topWidth: number;
1403
+ bottomWidth: number;
1404
+ polygon: string;
1405
+ labelX: number;
1406
+ labelY: number;
1407
+ subY: number;
1408
+ }
1409
+ /**
1410
+ * FunnelChart — decreasing stacked trapezoids visualising conversion through a
1411
+ * sequence of stages. Each band's top width tracks its own value and its bottom
1412
+ * width tracks the next stage's value, so consecutive bands connect into a
1413
+ * funnel. Dependency-free SVG on the validated `--mk-chart-*` palette; each band
1414
+ * is labelled with its value and its conversion relative to the top stage, and a
1415
+ * screen-reader table mirrors the data.
1416
+ *
1417
+ * ```html
1418
+ * <mk-funnel-chart
1419
+ * [segments]="[
1420
+ * { label: 'Visits', value: 1000 },
1421
+ * { label: 'Signups', value: 400 },
1422
+ * { label: 'Paid', value: 120 },
1423
+ * ]" />
1424
+ * ```
1425
+ */
1426
+ declare class MkFunnelChart {
1427
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1428
+ /** The funnel stages, ordered largest → smallest conceptually. */
1429
+ readonly segments: _angular_core.InputSignal<readonly MkFunnelSegment[]>;
1430
+ /** Intrinsic width (viewBox units; the SVG scales to its container). */
1431
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
1432
+ /** Intrinsic height. */
1433
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
1434
+ /** Force the legend on/off (funnels label each band, so off by default). */
1435
+ readonly showLegend: _angular_core.InputSignal<boolean | undefined>;
1436
+ /** Render the value + conversion text on each band. */
1437
+ readonly showValues: _angular_core.InputSignalWithTransform<boolean, unknown>;
1438
+ /** Accessible summary; generated from the data when omitted. */
1439
+ readonly label: _angular_core.InputSignal<string>;
1440
+ protected readonly plot: _angular_core.Signal<{
1441
+ x: number;
1442
+ y: number;
1443
+ w: number;
1444
+ h: number;
1445
+ }>;
1446
+ protected readonly legendVisible: _angular_core.Signal<boolean>;
1447
+ private readonly maxValue;
1448
+ private readonly topValue;
1449
+ /** One trapezoid per stage, stacked top → bottom. */
1450
+ protected readonly bands: _angular_core.Signal<FunnelBand[]>;
1451
+ protected readonly legend: _angular_core.Signal<{
1452
+ name: string;
1453
+ color: string;
1454
+ }[]>;
1455
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1456
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkFunnelChart, never>;
1457
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkFunnelChart, "mk-funnel-chart", never, { "segments": { "alias": "segments"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "showValues": { "alias": "showValues"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1458
+ }
1459
+
1460
+ /** A single treemap tile: a labelled rectangle sized by `value`. */
1461
+ interface MkTreemapItem {
1462
+ /** Tile label (identity — shown on the tile when it fits, and in the tooltip). */
1463
+ label: string;
1464
+ /** Positive magnitude driving the tile's area. */
1465
+ value: number;
1466
+ /** Optional explicit colour; defaults to the validated palette by index. */
1467
+ color?: string;
1468
+ }
1469
+ /** A positioned tile in SVG user space, tagged with its source `index`. */
1470
+ interface MkTreemapRect {
1471
+ x: number;
1472
+ y: number;
1473
+ w: number;
1474
+ h: number;
1475
+ index: number;
1476
+ }
1477
+ /**
1478
+ * Squarified treemap layout — pack `items` into the rectangle `(x, y, w, h)` as
1479
+ * nested tiles whose areas are proportional to `value`, greedily building rows
1480
+ * along the shorter side so tiles stay close to square. Returns exactly one
1481
+ * rect per input item, tagged with its original `index` (so callers can render
1482
+ * in input order). Framework-agnostic and pure.
1483
+ */
1484
+ declare function mkSquarify(items: readonly {
1485
+ value: number;
1486
+ }[], x: number, y: number, w: number, h: number): MkTreemapRect[];
1487
+ interface RenderedTile {
1488
+ x: number;
1489
+ y: number;
1490
+ w: number;
1491
+ h: number;
1492
+ color: string;
1493
+ label: string;
1494
+ value: number;
1495
+ valueText: string;
1496
+ pct: string;
1497
+ showText: boolean;
1498
+ showValue: boolean;
1499
+ clipId: string;
1500
+ cx: number;
1501
+ cy: number;
1502
+ index: number;
1503
+ }
1504
+ /**
1505
+ * Treemap — nested rectangles sized by value, using a squarified layout that
1506
+ * keeps tiles close to square. Dependency-free SVG on the validated
1507
+ * `--mk-chart-*` palette; ships in-tile labels (hidden when a tile is too
1508
+ * small), a hover tooltip with the share of total, and a screen-reader table.
1509
+ *
1510
+ * ```html
1511
+ * <mk-treemap [items]="[{ label: 'Ads', value: 40 }, { label: 'SEO', value: 25 }]" />
1512
+ * ```
1513
+ */
1514
+ declare class MkTreemap {
1515
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1516
+ /** The tiles to pack, largest first (order-independent — sorted internally). */
1517
+ readonly items: _angular_core.InputSignal<readonly MkTreemapItem[]>;
1518
+ /** Intrinsic width (viewBox units; the SVG scales to its container). */
1519
+ readonly width: _angular_core.InputSignalWithTransform<number, unknown>;
1520
+ /** Intrinsic height. */
1521
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
1522
+ /** Draw each tile's value beneath its label when the tile is tall enough. */
1523
+ readonly showValues: _angular_core.InputSignalWithTransform<boolean, unknown>;
1524
+ /** Accessible summary; generated from the data when omitted. */
1525
+ readonly label: _angular_core.InputSignal<string>;
1526
+ protected readonly hoverKey: _angular_core.WritableSignal<string | null>;
1527
+ /** Tap-to-pin: a touch tap on a tile pins the tooltip until a tap lands
1528
+ * outside the chart (mouse hover in/out is unaffected). */
1529
+ private readonly tapPin;
1530
+ protected readonly total: _angular_core.Signal<number>;
1531
+ /** Every tile positioned and decorated for rendering (in input order). */
1532
+ protected readonly tiles: _angular_core.Signal<RenderedTile[]>;
1533
+ protected keyOf(index: number): string;
1534
+ /** Rounded share of the total (e.g. `42%`) for the screen-reader table. */
1535
+ protected shareOf(value: number): string;
1536
+ protected readonly tooltip: _angular_core.Signal<{
1537
+ left: number;
1538
+ top: number;
1539
+ color: string;
1540
+ title: string;
1541
+ value: string;
1542
+ pct: string;
1543
+ } | null>;
1544
+ protected readonly resolvedLabel: _angular_core.Signal<string>;
1545
+ protected setHover(key: string | null): void;
1546
+ protected pinHover(key: string, event: PointerEvent): void;
1547
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkTreemap, never>;
1548
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkTreemap, "mk-treemap", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "showValues": { "alias": "showValues"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1549
+ }
1550
+
1551
+ /** Placeholder geometry for a {@link MkSkeleton}. */
1552
+ type MkSkeletonShape = 'text' | 'rect' | 'circle';
1553
+ /**
1554
+ * Skeleton — a shimmering placeholder shown while content loads. It is
1555
+ * `aria-hidden`; mark the surrounding region `aria-busy="true"` so assistive
1556
+ * tech knows content is pending. The shimmer stops under
1557
+ * `prefers-reduced-motion`.
1558
+ *
1559
+ * ```html
1560
+ * <mk-skeleton shape="circle" [width]="40" [height]="40" />
1561
+ * <mk-skeleton shape="text" [lines]="3" />
1562
+ * <mk-skeleton shape="rect" width="100%" [height]="180" />
1563
+ * ```
1564
+ */
1565
+ declare class MkSkeleton {
1566
+ /** Placeholder geometry. */
1567
+ readonly shape: _angular_core.InputSignal<MkSkeletonShape>;
1568
+ /** Width — a number (px) or any CSS length/percentage string. */
1569
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
1570
+ /** Height — a number (px) or any CSS length/percentage string. */
1571
+ readonly height: _angular_core.InputSignal<string | number | undefined>;
1572
+ /** Number of lines to render for `shape="text"`. */
1573
+ readonly lines: _angular_core.InputSignalWithTransform<number, unknown>;
1574
+ private toCss;
1575
+ protected readonly styleWidth: _angular_core.Signal<string>;
1576
+ protected readonly styleHeight: _angular_core.Signal<string | null>;
1577
+ /** Line index array for the text variant (at least one line). */
1578
+ protected readonly lineArray: _angular_core.Signal<unknown[]>;
1579
+ /** Last line of a multi-line block is shortened for a natural look. */
1580
+ protected lineWidth(index: number): string;
1581
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSkeleton, never>;
1582
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSkeleton, "mk-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1583
+ }
1584
+
1585
+ /** Ready-made loading layouts for {@link MkSkeletonPreset}. */
1586
+ type MkSkeletonPresetKind = 'paragraph' | 'card' | 'list' | 'table';
1587
+ /**
1588
+ * SkeletonPreset — composite loading placeholders assembled from
1589
+ * {@link MkSkeleton}: a `paragraph`, a media `card`, an avatar `list` or a
1590
+ * `table`. Announces "Loading" to assistive tech; swap it for real content once
1591
+ * loaded.
1592
+ *
1593
+ * ```html
1594
+ * <mk-skeleton-preset preset="card" />
1595
+ * <mk-skeleton-preset preset="list" [rows]="5" />
1596
+ * <mk-skeleton-preset preset="table" [rows]="4" [columns]="5" />
1597
+ * ```
1598
+ */
1599
+ declare class MkSkeletonPreset {
1600
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1601
+ /** Which layout to render. */
1602
+ readonly preset: _angular_core.InputSignal<MkSkeletonPresetKind>;
1603
+ /** Number of rows (paragraph lines / list items / table body rows). */
1604
+ readonly rows: _angular_core.InputSignalWithTransform<number, unknown>;
1605
+ /** Number of columns (table only). */
1606
+ readonly columns: _angular_core.InputSignalWithTransform<number, unknown>;
1607
+ /** Accessible loading label. */
1608
+ readonly loadingLabel: _angular_core.InputSignal<string>;
1609
+ protected readonly rowRange: _angular_core.Signal<number[]>;
1610
+ protected readonly colRange: _angular_core.Signal<number[]>;
1611
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkSkeletonPreset, never>;
1612
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkSkeletonPreset, "mk-skeleton-preset", never, { "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "loadingLabel": { "alias": "loadingLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1613
+ }
1614
+
1615
+ /**
1616
+ * InlineEdit — click a piece of text to edit it in place. The display is a
1617
+ * button that swaps to an input on click (or Enter/Space); Enter or blur saves,
1618
+ * Escape reverts. Ideal for editable labels in tables and detail panels.
1619
+ * Implements `ControlValueAccessor` + a two-way `value` model of `string`.
1620
+ *
1621
+ * ```html
1622
+ * <mk-inline-edit [(value)]="title" placeholder="Untitled" />
1623
+ * <mk-inline-edit multiline [(value)]="notes" />
1624
+ * ```
1625
+ */
1626
+ declare class MkInlineEdit implements ControlValueAccessor {
1627
+ private readonly injector;
1628
+ private readonly field;
1629
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1630
+ private readonly displayRef;
1631
+ private readonly inputRef;
1632
+ /** Two-way edited value. */
1633
+ readonly value: _angular_core.ModelSignal<string>;
1634
+ /** Shown (muted) when the value is empty. */
1635
+ readonly placeholder: _angular_core.InputSignal<string>;
1636
+ /** Use a multi-line textarea; Enter inserts a newline, blur/✓ saves. */
1637
+ readonly multiline: _angular_core.InputSignalWithTransform<boolean, unknown>;
1638
+ /** Save when the field loses focus (otherwise blur cancels). */
1639
+ readonly saveOnBlur: _angular_core.InputSignalWithTransform<boolean, unknown>;
1640
+ /** Accessible label for the edit trigger + field. */
1641
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1642
+ /** Disable editing. */
1643
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1644
+ /** Force the invalid visual + `aria-invalid` when used standalone. */
1645
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1646
+ /** Control size. Ignored when nested in an `mk-form-field`. */
1647
+ readonly size: _angular_core.InputSignal<MkSize>;
1648
+ /** Emitted with the new value when an edit is saved. */
1649
+ readonly saved: _angular_core.OutputEmitterRef<string>;
1650
+ /** Emitted when an edit is cancelled. */
1651
+ readonly cancelled: _angular_core.OutputEmitterRef<void>;
1652
+ protected readonly editing: _angular_core.WritableSignal<boolean>;
1653
+ protected readonly draft: _angular_core.WritableSignal<string>;
1654
+ private readonly cvaDisabled;
1655
+ private onChange;
1656
+ private onTouched;
1657
+ readonly fieldId: string;
1658
+ protected readonly effectiveSize: _angular_core.Signal<MkSize>;
1659
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
1660
+ protected readonly isInvalid: _angular_core.Signal<boolean>;
1661
+ protected readonly labelledBy: _angular_core.Signal<string | null>;
1662
+ protected readonly describedBy: _angular_core.Signal<string | null>;
1663
+ protected readonly displayText: _angular_core.Signal<string>;
1664
+ protected startEdit(): void;
1665
+ protected onInput(event: Event): void;
1666
+ protected onKeydown(event: KeyboardEvent): void;
1667
+ protected onBlur(): void;
1668
+ protected save(): void;
1669
+ protected cancel(): void;
1670
+ private restoreFocus;
1671
+ writeValue(value: string | null): void;
1672
+ registerOnChange(fn: (value: string) => void): void;
1673
+ registerOnTouched(fn: () => void): void;
1674
+ setDisabledState(isDisabled: boolean): void;
1675
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkInlineEdit, never>;
1676
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkInlineEdit, "mk-inline-edit", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "saveOnBlur": { "alias": "saveOnBlur"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
1677
+ }
1678
+
1679
+ /** A duration split into whole day/hour/minute/second parts. */
1680
+ interface MkDurationParts {
1681
+ days: number;
1682
+ hours: number;
1683
+ minutes: number;
1684
+ seconds: number;
1685
+ }
1686
+ /**
1687
+ * Split a positive millisecond duration into whole days, hours, minutes and
1688
+ * seconds. Negative inputs clamp to zero.
1689
+ *
1690
+ * ```ts
1691
+ * mkSplitDuration(90_061_000); // { days: 1, hours: 1, minutes: 1, seconds: 1 }
1692
+ * ```
1693
+ */
1694
+ declare function mkSplitDuration(ms: number): MkDurationParts;
1695
+ /**
1696
+ * Countdown — ticks every second and shows the time remaining until a target
1697
+ * instant as days / hours / minutes / seconds. Emits {@link finished} once when
1698
+ * the target passes and then keeps showing zeros (or {@link finishedText}).
1699
+ *
1700
+ * ```html
1701
+ * <mk-countdown [to]="launchDate" (finished)="onLaunch()" />
1702
+ * ```
1703
+ */
1704
+ declare class MkCountdown {
1705
+ private readonly document;
1706
+ private readonly isBrowser;
1707
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1708
+ /** The target instant to count down to. */
1709
+ readonly to: _angular_core.InputSignal<Date | null>;
1710
+ /** Show the days segment; when false, days roll into the hours value. */
1711
+ readonly showDays: _angular_core.InputSignalWithTransform<boolean, unknown>;
1712
+ /** Show the textual label beneath each value. */
1713
+ readonly showLabels: _angular_core.InputSignalWithTransform<boolean, unknown>;
1714
+ /** Zero-pad values to two digits. */
1715
+ readonly pad: _angular_core.InputSignalWithTransform<boolean, unknown>;
1716
+ /** Text to show instead of zeros once the countdown finishes. */
1717
+ readonly finishedText: _angular_core.InputSignal<string>;
1718
+ /** Fires exactly once when the target instant is reached. */
1719
+ readonly finished: _angular_core.OutputEmitterRef<void>;
1720
+ /** Current wall-clock time, updated every tick. */
1721
+ protected readonly now: _angular_core.WritableSignal<number>;
1722
+ /** Remaining milliseconds, clamped at zero. */
1723
+ protected readonly remaining: _angular_core.Signal<number>;
1724
+ protected readonly parts: _angular_core.Signal<{
1725
+ days: number;
1726
+ hours: number;
1727
+ minutes: number;
1728
+ seconds: number;
1729
+ }>;
1730
+ protected readonly isDone: _angular_core.Signal<boolean>;
1731
+ /**
1732
+ * Text for the polite live region. Deliberately formatted WITHOUT the
1733
+ * seconds segment so the string (and therefore the announcement) only
1734
+ * changes when a minute rolls over, instead of chattering every second.
1735
+ * When the countdown reaches zero it switches to a final "finished"
1736
+ * announcement ({@link finishedText} when provided).
1737
+ */
1738
+ protected readonly liveText: _angular_core.Signal<string>;
1739
+ private hasFinished;
1740
+ private intervalId?;
1741
+ /** Set once the first render has happened (browser only). */
1742
+ private viewReady;
1743
+ constructor();
1744
+ /**
1745
+ * No ticking while the tab is hidden — every tick is a change-detection
1746
+ * pass in a zoneless app. On return, resync immediately from `Date.now()`
1747
+ * so the display never shows stale time.
1748
+ */
1749
+ private readonly onVisibilityChange;
1750
+ private startInterval;
1751
+ private stopInterval;
1752
+ private tick;
1753
+ protected format(value: number): string;
1754
+ ngOnDestroy(): void;
1755
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCountdown, never>;
1756
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCountdown, "mk-countdown", never, { "to": { "alias": "to"; "required": false; "isSignal": true; }; "showDays": { "alias": "showDays"; "required": false; "isSignal": true; }; "showLabels": { "alias": "showLabels"; "required": false; "isSignal": true; }; "pad": { "alias": "pad"; "required": false; "isSignal": true; }; "finishedText": { "alias": "finishedText"; "required": false; "isSignal": true; }; }, { "finished": "finished"; }, never, never, true, never>;
1757
+ }
1758
+
1759
+ /** Layout for {@link MkDescriptionList}. */
1760
+ type MkDescriptionLayout = 'grid' | 'stacked';
1761
+ /**
1762
+ * DescriptionList — a semantic `<dl>` of term/detail pairs for entity-detail and
1763
+ * metadata panels. Project {@link MkDescItem} rows; values may be rich content
1764
+ * (badges, links, …). In `grid` layout terms align in a shared column; in
1765
+ * `stacked` each term sits above its value.
1766
+ *
1767
+ * ```html
1768
+ * <mk-description-list>
1769
+ * <mk-desc-item term="Status"><mk-badge tone="success">Active</mk-badge></mk-desc-item>
1770
+ * <mk-desc-item term="Owner">Ada Lovelace</mk-desc-item>
1771
+ * </mk-description-list>
1772
+ * ```
1773
+ */
1774
+ declare class MkDescriptionList {
1775
+ /** `grid` aligns terms in a column; `stacked` puts each term above its value. */
1776
+ readonly layout: _angular_core.InputSignal<MkDescriptionLayout>;
1777
+ /** Draw a divider between rows. */
1778
+ readonly divided: _angular_core.InputSignalWithTransform<boolean, unknown>;
1779
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDescriptionList, never>;
1780
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDescriptionList, "mk-description-list", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "divided": { "alias": "divided"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1781
+ }
1782
+ /**
1783
+ * A single term/detail row inside {@link MkDescriptionList}. Renders a `<dt>`
1784
+ * (the `term`) and a `<dd>` (the projected value). The host is `display:contents`
1785
+ * so the `<dt>`/`<dd>` participate directly in the list's grid.
1786
+ */
1787
+ declare class MkDescItem {
1788
+ /** The term (label) shown in the `<dt>`. */
1789
+ readonly term: _angular_core.InputSignal<string>;
1790
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDescItem, never>;
1791
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDescItem, "mk-desc-item", never, { "term": { "alias": "term"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1792
+ }
1793
+
1794
+ /**
1795
+ * Code — a read-only, themed code block with syntax highlighting, an optional
1796
+ * filename header, line numbers and a copy button. Highlighting reuses the same
1797
+ * dependency-free tokenizer as {@link MkCodeEditor}. For an editable field use
1798
+ * `mk-code-editor` instead.
1799
+ *
1800
+ * ```html
1801
+ * <mk-code language="json" filename="config.json" [code]="json" />
1802
+ * ```
1803
+ */
1804
+ declare class MkCode {
1805
+ /** The source to display. */
1806
+ readonly code: _angular_core.InputSignal<string>;
1807
+ /** Language for highlighting. */
1808
+ readonly language: _angular_core.InputSignal<MkCodeLanguage>;
1809
+ /** Optional filename shown in a header bar. */
1810
+ readonly filename: _angular_core.InputSignal<string>;
1811
+ /** Show a line-number gutter. */
1812
+ readonly lineNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
1813
+ /** Show the copy button. */
1814
+ readonly copyable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1815
+ /** Soft-wrap long lines instead of scrolling horizontally. */
1816
+ readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
1817
+ protected readonly highlighted: _angular_core.Signal<string>;
1818
+ protected readonly lines: _angular_core.Signal<number[]>;
1819
+ /** Whether to render the header bar (filename and/or copy button). */
1820
+ protected readonly hasHeader: _angular_core.Signal<boolean>;
1821
+ /**
1822
+ * Accessible name of the focusable scroll region: the filename when set,
1823
+ * else a generic "Code". (No MK_I18N key covers this today — the block
1824
+ * editor's `blockCode` string is scoped to the editor palette.)
1825
+ */
1826
+ protected readonly scrollLabel: _angular_core.Signal<string>;
1827
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCode, never>;
1828
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCode, "mk-code", never, { "code": { "alias": "code"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "filename": { "alias": "filename"; "required": false; "isSignal": true; }; "lineNumbers": { "alias": "lineNumbers"; "required": false; "isSignal": true; }; "copyable": { "alias": "copyable"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1829
+ }
1830
+
1831
+ /**
1832
+ * VirtualScroll — renders only the rows visible in the viewport (plus a small
1833
+ * overscan), so a list of thousands of fixed-height items stays smooth. Give
1834
+ * the host a height and provide a row template:
1835
+ *
1836
+ * ```html
1837
+ * <mk-virtual-scroll [items]="rows" [itemHeight]="40" style="height: 20rem;">
1838
+ * <ng-template let-row let-i="index">{{ i }} — {{ row.name }}</ng-template>
1839
+ * </mk-virtual-scroll>
1840
+ * ```
1841
+ */
1842
+ declare class MkVirtualScroll {
1843
+ private readonly isBrowser;
1844
+ private readonly viewportRef;
1845
+ /** The full list of items. */
1846
+ readonly items: _angular_core.InputSignal<readonly unknown[]>;
1847
+ /** Fixed height of each row in px. */
1848
+ readonly itemHeight: _angular_core.InputSignalWithTransform<number, unknown>;
1849
+ /** Extra rows rendered above/below the viewport to smooth fast scrolls. */
1850
+ readonly overscan: _angular_core.InputSignalWithTransform<number, unknown>;
1851
+ /** The row template (`<ng-template let-item let-i="index">`). */
1852
+ protected readonly template: _angular_core.Signal<TemplateRef<any> | undefined>;
1853
+ protected readonly scrollTop: _angular_core.WritableSignal<number>;
1854
+ protected readonly viewportHeight: _angular_core.WritableSignal<number>;
1855
+ /** Total scrollable height (sizes the scrollbar). */
1856
+ protected readonly totalHeight: _angular_core.Signal<number>;
1857
+ /**
1858
+ * The [start, end) index window currently rendered. Custom equality means
1859
+ * per-pixel scrolling only re-renders when the window actually shifts.
1860
+ */
1861
+ private readonly range;
1862
+ /** Offset of the first rendered row from the top. */
1863
+ protected readonly offset: _angular_core.Signal<number>;
1864
+ /** The rendered slice, each with its absolute index. */
1865
+ protected readonly visibleItems: _angular_core.Signal<{
1866
+ item: unknown;
1867
+ index: number;
1868
+ }[]>;
1869
+ constructor();
1870
+ private resizeObserver?;
1871
+ ngOnDestroy(): void;
1872
+ private measure;
1873
+ protected onScroll(event: Event): void;
1874
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkVirtualScroll, never>;
1875
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkVirtualScroll, "mk-virtual-scroll", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; }, {}, ["template"], never, true, never>;
1876
+ }
1877
+
1878
+ /**
1879
+ * A single slide inside {@link MkCarousel}. Mark each slide element with
1880
+ * `mkCarouselSlide`; the carousel wires ARIA + visibility.
1881
+ */
1882
+ declare class MkCarouselSlide {
1883
+ readonly el: ElementRef<HTMLElement>;
1884
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCarouselSlide, never>;
1885
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MkCarouselSlide, "[mkCarouselSlide]", never, {}, {}, never, never, true, never>;
1886
+ }
1887
+ /**
1888
+ * Carousel — an accessible slides/gallery. Project slides marked with
1889
+ * `mkCarouselSlide`; get prev/next arrows, dot indicators, Arrow-key
1890
+ * navigation, pointer swipe (touch or mouse drag; vertical page scroll stays
1891
+ * native) and optional autoplay that pauses on hover/focus. The current slide
1892
+ * is a two-way `index` model.
1893
+ *
1894
+ * ```html
1895
+ * <mk-carousel ariaLabel="Featured" autoplay>
1896
+ * <div mkCarouselSlide>…</div>
1897
+ * <div mkCarouselSlide>…</div>
1898
+ * </mk-carousel>
1899
+ * ```
1900
+ */
1901
+ declare class MkCarousel {
1902
+ private readonly isBrowser;
1903
+ private readonly document;
1904
+ private readonly host;
1905
+ private readonly slides;
1906
+ /** Localised strings (override globally via `provideMkI18n`). */
1907
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
1908
+ /** Two-way current slide index. */
1909
+ readonly index: _angular_core.ModelSignal<number>;
1910
+ /** Accessible label for the carousel region. */
1911
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1912
+ /** Wrap around at the ends. */
1913
+ readonly loop: _angular_core.InputSignalWithTransform<boolean, unknown>;
1914
+ /** Show the dot indicators. */
1915
+ readonly showDots: _angular_core.InputSignalWithTransform<boolean, unknown>;
1916
+ /** Show the prev/next arrows. */
1917
+ readonly showArrows: _angular_core.InputSignalWithTransform<boolean, unknown>;
1918
+ /**
1919
+ * Advance automatically. Pauses transiently on hover/focus/pointer-down and
1920
+ * shows a persistent pause/play toggle (`userPaused`). Never runs when the
1921
+ * user prefers reduced motion.
1922
+ */
1923
+ readonly autoplay: _angular_core.InputSignalWithTransform<boolean, unknown>;
1924
+ /** Autoplay interval in ms. */
1925
+ readonly interval: _angular_core.InputSignalWithTransform<number, unknown>;
1926
+ /**
1927
+ * Persistent, user-controlled pause (WCAG 2.2.2). Latched by the pause/play
1928
+ * toggle; the transient hover/focus pause never overrides it. Two-way so
1929
+ * consumers can bind or preset it.
1930
+ */
1931
+ readonly userPaused: _angular_core.ModelSignal<boolean>;
1932
+ /** Transient pause (hover / focus / pointer held down inside the viewport). */
1933
+ protected readonly paused: _angular_core.WritableSignal<boolean>;
1934
+ /** True while the autoplay interval is actually running. */
1935
+ protected readonly playing: _angular_core.WritableSignal<boolean>;
1936
+ /** True while the browser tab is hidden — no advancing (or CD) in the dark. */
1937
+ private readonly pageHidden;
1938
+ /** True while the carousel is fully scrolled out of the viewport. */
1939
+ private readonly offscreen;
1940
+ private timer?;
1941
+ private io?;
1942
+ protected readonly count: _angular_core.Signal<number>;
1943
+ protected readonly dots: _angular_core.Signal<number[]>;
1944
+ protected readonly liveText: _angular_core.Signal<string>;
1945
+ /**
1946
+ * Silence the live region while the slideshow is auto-advancing — otherwise
1947
+ * every auto-advance is announced forever. Announce again as soon as the
1948
+ * user is in control (paused, latched, or autoplay off).
1949
+ */
1950
+ protected readonly liveMode: _angular_core.Signal<"off" | "polite">;
1951
+ /** Resolved text direction ('ltr' until measured in the browser). */
1952
+ private readonly dir;
1953
+ /** Live swipe gesture, or null when no pointer is being tracked. */
1954
+ private swipe;
1955
+ /** Visual drag offset (px) applied on top of the slide position. */
1956
+ private readonly dragOffset;
1957
+ /** True while a horizontal drag is in flight (kills the track transition). */
1958
+ protected readonly dragging: _angular_core.WritableSignal<boolean>;
1959
+ /**
1960
+ * Track offset — in RTL the flex track lays out right-to-left, so moving to
1961
+ * the next slide means translating in the positive X direction. While a
1962
+ * swipe is in flight the pixel drag offset rides on top.
1963
+ */
1964
+ protected readonly trackTransform: _angular_core.Signal<string>;
1965
+ constructor();
1966
+ /** Go to slide `i` (clamped, or wrapped when `loop`). */
1967
+ goTo(i: number): void;
1968
+ next(): void;
1969
+ prev(): void;
1970
+ protected onKeydown(event: KeyboardEvent): void;
1971
+ protected pause(): void;
1972
+ protected resume(): void;
1973
+ /** Latches / releases the persistent pause (the toolbar toggle button). */
1974
+ protected toggleUserPause(): void;
1975
+ /**
1976
+ * Touch users can't hover — holding a pointer down pauses autoplay
1977
+ * transiently. It also arms swipe tracking, except on the carousel's own
1978
+ * controls (play/pause, arrows), which must stay plain tappable buttons.
1979
+ */
1980
+ protected onPointerDown(event: PointerEvent): void;
1981
+ protected onPointerMove(event: PointerEvent): void;
1982
+ protected onPointerUp(event: PointerEvent): void;
1983
+ /**
1984
+ * Capture-phase, one-shot click swallow: the browser fires a synthetic click
1985
+ * right after pointerup, which would activate whatever link/button the drag
1986
+ * ended on. The safety timeout covers gestures that produce no click at all.
1987
+ */
1988
+ private suppressNextClick;
1989
+ private prefersReducedMotion;
1990
+ private readonly onVisibilityChange;
1991
+ private stopTimer;
1992
+ ngOnDestroy(): void;
1993
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkCarousel, never>;
1994
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkCarousel, "mk-carousel", never, { "index": { "alias": "index"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "showDots": { "alias": "showDots"; "required": false; "isSignal": true; }; "showArrows": { "alias": "showArrows"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "userPaused": { "alias": "userPaused"; "required": false; "isSignal": true; }; }, { "index": "indexChange"; "userPaused": "userPausedChange"; }, ["slides"], ["*"], true, never>;
1995
+ }
1996
+
1997
+ /**
1998
+ * Dependency-free text diff for {@link MkDiff} — an LCS line diff with optional
1999
+ * intra-line word highlighting. Pure and SSR-safe (no DOM). Suited to revision
2000
+ * comparison ("what changed between save N and N+1").
2001
+ */
2002
+ /** The kind of change for a diff row/segment. */
2003
+ type MkDiffOp = 'equal' | 'insert' | 'delete';
2004
+ /** A word-level segment within a changed line. */
2005
+ interface MkDiffSegment {
2006
+ text: string;
2007
+ /** True when this word differs from the paired line. */
2008
+ changed: boolean;
2009
+ }
2010
+ /** One line of a computed diff. */
2011
+ interface MkDiffRow {
2012
+ op: MkDiffOp;
2013
+ text: string;
2014
+ /** 1-based line number in the "before" text (null for inserts). */
2015
+ beforeNo: number | null;
2016
+ /** 1-based line number in the "after" text (null for deletes). */
2017
+ afterNo: number | null;
2018
+ /** Word segments for changed lines (present when word highlighting runs). */
2019
+ segments?: MkDiffSegment[];
2020
+ }
2021
+ /** Summary counts for a diff. */
2022
+ interface MkDiffStats {
2023
+ added: number;
2024
+ removed: number;
2025
+ unchanged: number;
2026
+ }
2027
+ /** Options for {@link mkComputeDiff}. */
2028
+ interface MkDiffOptions {
2029
+ /** Highlight the specific words that changed within paired lines. */
2030
+ wordHighlight?: boolean;
2031
+ /** Treat trailing whitespace as insignificant when comparing lines. */
2032
+ ignoreTrailingWhitespace?: boolean;
2033
+ }
2034
+ /**
2035
+ * Compute a line diff between `before` and `after`. Returns one {@link MkDiffRow}
2036
+ * per line in document order, with `equal` / `insert` / `delete` ops and 1-based
2037
+ * before/after line numbers. With `wordHighlight` (default true) changed lines
2038
+ * also carry word-level `segments`.
2039
+ */
2040
+ declare function mkComputeDiff(before: string, after: string, options?: MkDiffOptions): MkDiffRow[];
2041
+ /** Summary counts (added / removed / unchanged lines) for a diff. */
2042
+ declare function mkDiffStats(rows: MkDiffRow[]): MkDiffStats;
2043
+
2044
+ /** How {@link MkDiff} lays out the comparison. */
2045
+ type MkDiffMode = 'unified' | 'split';
2046
+ interface SplitRow {
2047
+ left: MkDiffRow | null;
2048
+ right: MkDiffRow | null;
2049
+ }
2050
+ /**
2051
+ * Diff — a text comparison view for revisions (before ⇄ after). Computes an LCS
2052
+ * line diff with optional intra-line word highlighting and renders a `unified`
2053
+ * (single-column, +/-) or `split` (side-by-side) view with line numbers and an
2054
+ * add/remove summary.
2055
+ *
2056
+ * ```html
2057
+ * <mk-diff [before]="v1" [after]="v2" mode="split" />
2058
+ * ```
2059
+ */
2060
+ declare class MkDiff {
2061
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2062
+ /** The original ("before") text. */
2063
+ readonly before: _angular_core.InputSignal<string>;
2064
+ /** The new ("after") text. */
2065
+ readonly after: _angular_core.InputSignal<string>;
2066
+ /** Layout: single-column `unified` or side-by-side `split`. */
2067
+ readonly mode: _angular_core.InputSignal<MkDiffMode>;
2068
+ /** Highlight the specific words that changed within a line. */
2069
+ readonly wordHighlight: _angular_core.InputSignalWithTransform<boolean, unknown>;
2070
+ /** Show line-number gutters. */
2071
+ readonly lineNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
2072
+ /** Ignore trailing whitespace when comparing lines. */
2073
+ readonly ignoreTrailingWhitespace: _angular_core.InputSignalWithTransform<boolean, unknown>;
2074
+ /** Show the +added / −removed summary header. */
2075
+ readonly showStats: _angular_core.InputSignalWithTransform<boolean, unknown>;
2076
+ /** Column labels (split view header / a11y). */
2077
+ readonly beforeLabel: _angular_core.InputSignal<string>;
2078
+ readonly afterLabel: _angular_core.InputSignal<string>;
2079
+ protected readonly rows: _angular_core.Signal<MkDiffRow[]>;
2080
+ protected readonly stats: _angular_core.Signal<_mk_kit_ui_data.MkDiffStats>;
2081
+ /** Rows paired into two columns for the split view. */
2082
+ protected readonly splitRows: _angular_core.Signal<SplitRow[]>;
2083
+ protected marker(op: MkDiffRow['op']): string;
2084
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkDiff, never>;
2085
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkDiff, "mk-diff", never, { "before": { "alias": "before"; "required": false; "isSignal": true; }; "after": { "alias": "after"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "wordHighlight": { "alias": "wordHighlight"; "required": false; "isSignal": true; }; "lineNumbers": { "alias": "lineNumbers"; "required": false; "isSignal": true; }; "ignoreTrailingWhitespace": { "alias": "ignoreTrailingWhitespace"; "required": false; "isSignal": true; }; "showStats": { "alias": "showStats"; "required": false; "isSignal": true; }; "beforeLabel": { "alias": "beforeLabel"; "required": false; "isSignal": true; }; "afterLabel": { "alias": "afterLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2086
+ }
2087
+
2088
+ /** A single draggable card on a {@link MkKanban} board. */
2089
+ interface MkKanbanCard {
2090
+ /** Stable identity used for tracking and move events. */
2091
+ id: unknown;
2092
+ /** Text shown by the default card renderer. */
2093
+ title: string;
2094
+ /** Arbitrary extra fields for custom card templates. */
2095
+ [key: string]: unknown;
2096
+ }
2097
+ /** A column (bucket) of {@link MkKanbanCard}s on a {@link MkKanban} board. */
2098
+ interface MkKanbanColumn {
2099
+ /** Stable identity used for tracking and move events. */
2100
+ id: unknown;
2101
+ /** Heading shown in the column header and used as its aria-label. */
2102
+ title: string;
2103
+ /** The ordered cards contained in this column. */
2104
+ cards: MkKanbanCard[];
2105
+ }
2106
+ /**
2107
+ * Emitted by {@link MkKanban} after a card has been moved (between or within
2108
+ * columns) and the two-way `columns` model has been updated.
2109
+ */
2110
+ interface MkKanbanCardMovedEvent {
2111
+ /** The card that was moved. */
2112
+ card: MkKanbanCard;
2113
+ /** `id` of the column the card came from. */
2114
+ from: unknown;
2115
+ /** `id` of the column the card was dropped into. */
2116
+ to: unknown;
2117
+ /** The card's index within the source column before the move. */
2118
+ fromIndex: number;
2119
+ /** The card's index within the destination column after the move. */
2120
+ toIndex: number;
2121
+ }
2122
+ /**
2123
+ * Kanban board — a horizontal row of columns whose cards can be dragged and
2124
+ * reordered within a column or transferred between columns. Built on the dnd
2125
+ * group's connected `[mkDropList]` / `[mkDrag]` directives, so it inherits both
2126
+ * pointer and keyboard dragging (WCAG 2.1.1) for free.
2127
+ *
2128
+ * Bind `columns` two-way; the model is updated immutably on each drop. Project
2129
+ * an `<ng-template>` to render custom card content — it receives the card as
2130
+ * `$implicit` and the owning column as `column`:
2131
+ *
2132
+ * ```html
2133
+ * <mk-kanban [(columns)]="board" (cardMoved)="onMoved($event)">
2134
+ * <ng-template #cardTemplate let-card let-column="column">
2135
+ * <strong>{{ card.title }}</strong>
2136
+ * </ng-template>
2137
+ * </mk-kanban>
2138
+ * ```
2139
+ */
2140
+ declare class MkKanban {
2141
+ /** The board's columns and their cards (two-way). Updated on every drop. */
2142
+ readonly columns: _angular_core.ModelSignal<MkKanbanColumn[]>;
2143
+ /** Disable all dragging on the board. */
2144
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2145
+ /** Emitted after the model is updated when a card is moved. */
2146
+ readonly cardMoved: _angular_core.OutputEmitterRef<MkKanbanCardMovedEvent>;
2147
+ /** Optional consumer-projected card renderer (`$implicit` = card). */
2148
+ protected readonly cardTemplate: _angular_core.Signal<TemplateRef<unknown> | undefined>;
2149
+ /** Board-scoped prefix so this board's drop-list ids never collide. */
2150
+ private readonly boardId;
2151
+ /** Column count as its own computed so id arrays survive card-only updates. */
2152
+ private readonly columnCount;
2153
+ /** Stable drop-list id per column, positionally matched to `columns()`. */
2154
+ protected readonly listIds: _angular_core.Signal<string[]>;
2155
+ /**
2156
+ * Per-column connected-target ids (every other column's list). One stable
2157
+ * array per column, recomputed only when the column count changes — a fresh
2158
+ * array per change-detection pass would dirty each `MkDropList`'s
2159
+ * `connectedTo` input identity on every cycle.
2160
+ */
2161
+ private readonly connections;
2162
+ /** Ids of every other column's list — the connected transfer targets for `i`. */
2163
+ protected connectedTo(index: number): string[];
2164
+ /**
2165
+ * Apply a drop from the dnd module. Reads the source/target columns from the
2166
+ * event's containers (matched by their drop-list ids), updates the two-way
2167
+ * `columns` model immutably, then emits {@link cardMoved}.
2168
+ */
2169
+ protected onDrop(event: MkDropEvent<MkKanbanCard>): void;
2170
+ /**
2171
+ * Immutably move the card at `fromIndex` of column `fromCol` to `toIndex` of
2172
+ * column `toCol`, updating the model and emitting {@link cardMoved}. Column
2173
+ * indices refer to positions in `columns()`.
2174
+ */
2175
+ private moveCard;
2176
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkKanban, never>;
2177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkKanban, "mk-kanban", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "columns": "columnsChange"; "cardMoved": "cardMoved"; }, ["cardTemplate"], never, true, never>;
2178
+ }
2179
+
2180
+ /**
2181
+ * Dependency-free QR Code encoder.
2182
+ *
2183
+ * A from-scratch implementation of the QR encoding algorithm (ISO/IEC 18004):
2184
+ * byte-mode (UTF-8) data encoding, Reed–Solomon error correction over GF(256),
2185
+ * matrix construction with function patterns, all eight data masks scored by
2186
+ * the four penalty rules, and BCH format/version information.
2187
+ *
2188
+ * Scope: byte mode only, versions 1–10 (module counts 21…57), ECC levels
2189
+ * L/M/Q/H. That covers roughly 7–271 UTF-8 bytes depending on the ECC level.
2190
+ * Numeric/alphanumeric/kanji modes and versions ≥ 11 are intentionally out of
2191
+ * scope — everything is encoded as UTF-8 bytes, which is always valid.
2192
+ *
2193
+ * The single public entry point is {@link mkEncodeQr}, a pure function.
2194
+ */
2195
+ type MkQrEcc = 'L' | 'M' | 'Q' | 'H';
2196
+ /**
2197
+ * Encode `text` (UTF-8, byte mode) as a QR code module matrix.
2198
+ *
2199
+ * @param text The payload. May be empty.
2200
+ * @param ecc Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%).
2201
+ * @returns A square `boolean[][]` where `true` marks a dark module. The side
2202
+ * length is `17 + 4 * version` (21 for v1 … 57 for v10).
2203
+ * @throws If the payload does not fit in versions 1–10 at the chosen ECC level.
2204
+ */
2205
+ declare function mkEncodeQr(text: string, ecc: MkQrEcc): boolean[][];
2206
+
2207
+ /**
2208
+ * QR Code — a dependency-free QR generator rendered as an SVG. The entire
2209
+ * encoding (byte mode, Reed–Solomon ECC, masking, format info) is implemented
2210
+ * from scratch in {@link mkEncodeQr}; no npm library is used. Dark modules are
2211
+ * drawn as `<rect>`s over a background rectangle that also fills the quiet zone,
2212
+ * so the code is theme-aware (`var(--mk-text)` on `var(--mk-surface)`) and
2213
+ * fully overridable. Exposes `role="img"` with an `aria-label` for assistive
2214
+ * tech.
2215
+ *
2216
+ * Supports versions 1–10 and ECC levels L/M/Q/H (byte mode / UTF-8).
2217
+ *
2218
+ * ```html
2219
+ * <mk-qr-code value="https://example.com" ecc="M" [size]="200" />
2220
+ * ```
2221
+ */
2222
+ declare class MkQrCode {
2223
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2224
+ /** The text to encode (UTF-8, byte mode). */
2225
+ readonly value: _angular_core.InputSignal<string>;
2226
+ /** Error-correction level: `L` (~7%), `M` (~15%), `Q` (~25%), `H` (~30%). */
2227
+ readonly ecc: _angular_core.InputSignal<MkQrEcc>;
2228
+ /** Rendered pixel size of the (square) SVG. */
2229
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
2230
+ /** Width of the light margin around the code, in modules (spec recommends 4). */
2231
+ readonly quietZone: _angular_core.InputSignalWithTransform<number, unknown>;
2232
+ /** Dark-module colour. */
2233
+ readonly color: _angular_core.InputSignal<string>;
2234
+ /** Background / quiet-zone colour. */
2235
+ readonly background: _angular_core.InputSignal<string>;
2236
+ /**
2237
+ * Accessible label for the image. When omitted, the label carries the
2238
+ * encoded content (`QR code: <value>`) so AT users learn what the code says.
2239
+ */
2240
+ readonly label: _angular_core.InputSignal<string>;
2241
+ /** The label actually exposed on the host: `label`, or a generated default. */
2242
+ protected readonly effectiveLabel: _angular_core.Signal<string>;
2243
+ /** The module matrix (`true` = dark); empty if encoding fails (e.g. too long). */
2244
+ protected readonly matrix: _angular_core.Signal<boolean[][]>;
2245
+ /** Quiet zone clamped to a non-negative integer. */
2246
+ protected readonly quiet: _angular_core.Signal<number>;
2247
+ /** Side length of the viewBox in modules (code + both quiet-zone margins). */
2248
+ protected readonly dimension: _angular_core.Signal<number>;
2249
+ /** Top-left coordinates (in module units) of every dark module. */
2250
+ protected readonly modules: _angular_core.Signal<{
2251
+ x: number;
2252
+ y: number;
2253
+ }[]>;
2254
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkQrCode, never>;
2255
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkQrCode, "mk-qr-code", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "ecc": { "alias": "ecc"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "quietZone": { "alias": "quietZone"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2256
+ }
2257
+
2258
+ /** One rendered node of the JSON tree. */
2259
+ interface MkJsonNode {
2260
+ /** Property name / array index; `null` for the root. */
2261
+ key: string | null;
2262
+ /** Node kind (drives colouring + expandability). */
2263
+ type: 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null' | 'circular';
2264
+ /** Display text for primitives. */
2265
+ display: string;
2266
+ /** Children for objects/arrays. */
2267
+ children: MkJsonNode[];
2268
+ /** Unique path (e.g. `$.users[0].name`) used for expansion tracking. */
2269
+ path: string;
2270
+ /** Nesting depth (root = 0). */
2271
+ depth: number;
2272
+ }
2273
+ /** Build the node tree for a JSON-ish value (circular refs marked). */
2274
+ declare function mkBuildJsonTree(value: unknown): MkJsonNode;
2275
+ /**
2276
+ * JsonViewer — a read-only, collapsible tree for JSON-ish data: objects and
2277
+ * arrays fold behind disclosure buttons (with a `{…} n items` preview),
2278
+ * primitives are colour-coded by type, and circular references render as
2279
+ * `[Circular]` instead of recursing. `expandDepth` controls how much is open
2280
+ * initially; `expandAll()` / `collapseAll()` are available on the component.
2281
+ *
2282
+ * The complement of `mk-code-editor`: the editor edits JSON text, this
2283
+ * explores JSON *data* (API responses, entity payloads, config dumps).
2284
+ *
2285
+ * ```html
2286
+ * <mk-json-viewer [data]="response" [expandDepth]="2" />
2287
+ * ```
2288
+ */
2289
+ declare class MkJsonViewer {
2290
+ /** Localised strings (override globally via `provideMkI18n`). */
2291
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2292
+ /** The value to display (any JSON-serialisable data). */
2293
+ readonly data: _angular_core.InputSignal<unknown>;
2294
+ /** How many levels start expanded (root = level 1). */
2295
+ readonly expandDepth: _angular_core.InputSignalWithTransform<number, unknown>;
2296
+ /** Accessible label of the tree region. */
2297
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2298
+ /**
2299
+ * Paths currently expanded. Mutated in place — a toggle is O(1) instead of
2300
+ * copying the whole set — with `expansionVersion` bumped so signal-driven
2301
+ * bindings re-evaluate. Always read through {@link isExpanded}.
2302
+ */
2303
+ private readonly expanded;
2304
+ /** Bumped on every expansion change; the reactive face of `expanded`. */
2305
+ private readonly expansionVersion;
2306
+ /** The built node tree. */
2307
+ protected readonly root: _angular_core.Signal<MkJsonNode>;
2308
+ /**
2309
+ * Collapsed previews, cached per node so template bindings don't rebuild the
2310
+ * string on every change-detection pass. Keyed weakly: entries die with the
2311
+ * tree when `data` changes.
2312
+ */
2313
+ private readonly previews;
2314
+ constructor();
2315
+ protected isExpanded(path: string): boolean;
2316
+ protected toggle(path: string): void;
2317
+ /** Expand every object/array node. */
2318
+ expandAll(): void;
2319
+ /** Collapse everything (the root stays visible). */
2320
+ collapseAll(): void;
2321
+ /** Swap the expansion set's contents and notify bindings. */
2322
+ private replaceExpanded;
2323
+ /** Collapsed preview, e.g. `{…}` / `[…]` + item count (cached per node). */
2324
+ protected preview(node: MkJsonNode): string;
2325
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkJsonViewer, never>;
2326
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkJsonViewer, "mk-json-viewer", ["mkJsonViewer"], { "data": { "alias": "data"; "required": true; "isSignal": true; }; "expandDepth": { "alias": "expandDepth"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2327
+ }
2328
+
2329
+ /**
2330
+ * Minimal ANSI SGR parser for {@link MkLogViewer}.
2331
+ *
2332
+ * Understands the SGR (`ESC[…m`) subset that matters for log output — reset
2333
+ * (0), bold (1), italic (3), underline (4), the 22/23/24 "off" codes, the 8
2334
+ * standard + 8 bright foreground colours (30–37 / 90–97, 39 reset) and the
2335
+ * matching backgrounds (40–47 / 100–107, 49 reset). Extended-colour
2336
+ * introducers (38/48;5;… and 38/48;2;r;g;b) are consumed so their arguments
2337
+ * are never misread as other codes, but map to "no colour" (the theme has no
2338
+ * 256-colour palette). Every other escape sequence — cursor movement, erase,
2339
+ * OSC titles, single-character escapes — is stripped rather than rendered as
2340
+ * garbage.
2341
+ *
2342
+ * Colours are emitted as CSS class names (`mk-ansi--fg-red`,
2343
+ * `mk-ansi--bg-bright-blue`, `mk-ansi--bold`, …) themed in
2344
+ * `log-viewer.scss`, not as raw terminal colours.
2345
+ */
2346
+ /** One styled run of text within a parsed line. */
2347
+ interface MkAnsiSpan {
2348
+ /** The plain text of the run (escape sequences removed). */
2349
+ text: string;
2350
+ /** `mk-ansi--*` class names styling the run; empty for plain text. */
2351
+ classes: readonly string[];
2352
+ }
2353
+ /**
2354
+ * Parse one log line into styled spans. Pure — same input, same output.
2355
+ * Adjacent runs with identical styling are merged, so a plain line yields a
2356
+ * single span (or none when empty).
2357
+ */
2358
+ declare function mkParseAnsi(line: string): MkAnsiSpan[];
2359
+ /** Remove every ANSI escape sequence from a line (for copy / search). */
2360
+ declare function mkStripAnsi(line: string): string;
2361
+
2362
+ /** One render token of a log line: a styled run, optionally a search match. */
2363
+ interface MkLogToken {
2364
+ text: string;
2365
+ /** Space-joined `mk-ansi--*` classes ('' for plain text). */
2366
+ cls: string;
2367
+ /** True when the token is part of a search-query match. */
2368
+ mark: boolean;
2369
+ }
2370
+ interface MkLogLine {
2371
+ /** Absolute index within the (ring-buffered) lines. */
2372
+ index: number;
2373
+ tokens: MkLogToken[];
2374
+ }
2375
+ /**
2376
+ * LogViewer — a virtualized, tail-following log / terminal pane. Renders only
2377
+ * the visible window of a (ring-buffered) line array, parses ANSI SGR colour
2378
+ * codes into theme-aware spans, follows new output at the bottom until the
2379
+ * user scrolls away, and highlights plain-string search matches.
2380
+ *
2381
+ * ```html
2382
+ * <mk-log-viewer
2383
+ * [lines]="lines()"
2384
+ * [(follow)]="follow"
2385
+ * [query]="search()"
2386
+ * (matches)="count.set($event)"
2387
+ * />
2388
+ * ```
2389
+ *
2390
+ * Wrap mode (`[wrap]="true"` or the toolbar toggle) soft-wraps long lines;
2391
+ * because wrapped rows have no fixed height, wrap mode renders **without**
2392
+ * virtualization — fine up to a few thousand lines, so keep `maxLines`
2393
+ * modest when wrapping is expected.
2394
+ *
2395
+ * `query` is matched as a case-insensitive plain string — no regex.
2396
+ */
2397
+ declare class MkLogViewer {
2398
+ /** Localised strings (override globally via `provideMkI18n`). */
2399
+ protected readonly i18n: _mk_kit_ui_core.MkI18nStrings;
2400
+ private readonly isBrowser;
2401
+ private readonly viewportRef;
2402
+ /** The log lines (may contain ANSI SGR escape sequences). */
2403
+ readonly lines: _angular_core.InputSignal<readonly string[]>;
2404
+ /** Stick to the bottom as new lines arrive (two-way; detaches on scroll-up). */
2405
+ readonly follow: _angular_core.ModelSignal<boolean>;
2406
+ /** Soft-wrap long lines (two-way; disables virtualization — see class docs). */
2407
+ readonly wrap: _angular_core.ModelSignal<boolean>;
2408
+ /** Parse ANSI SGR colour codes; `false` renders lines verbatim. */
2409
+ readonly ansi: _angular_core.InputSignalWithTransform<boolean, unknown>;
2410
+ /** Case-insensitive plain-string search; matches are highlighted. */
2411
+ readonly query: _angular_core.InputSignal<string>;
2412
+ /** Ring buffer size: oldest lines are dropped beyond this. */
2413
+ readonly maxLines: _angular_core.InputSignalWithTransform<number, unknown>;
2414
+ /** Fixed row height in px (drives virtualization; also sets line-height). */
2415
+ readonly itemHeight: _angular_core.InputSignalWithTransform<number, unknown>;
2416
+ /** Hide the built-in toolbar row. */
2417
+ readonly hideToolbar: _angular_core.InputSignalWithTransform<boolean, unknown>;
2418
+ /** Accessible label of the log region. */
2419
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2420
+ /** Emits the total number of `query` matches whenever it changes. */
2421
+ readonly matches: _angular_core.OutputEmitterRef<number>;
2422
+ /** The lines actually shown: the newest `maxLines` of `lines`. */
2423
+ protected readonly buffered: _angular_core.Signal<readonly string[]>;
2424
+ protected readonly scrollTop: _angular_core.WritableSignal<number>;
2425
+ protected readonly viewportHeight: _angular_core.WritableSignal<number>;
2426
+ protected readonly totalHeight: _angular_core.Signal<number>;
2427
+ private readonly range;
2428
+ protected readonly offset: _angular_core.Signal<number>;
2429
+ /** The virtualized window — only ~viewport+overscan lines are parsed. */
2430
+ protected readonly visibleLines: _angular_core.Signal<MkLogLine[]>;
2431
+ /** Wrap mode: every line, non-virtualized (parse memoized per content). */
2432
+ protected readonly wrappedLines: _angular_core.Signal<MkLogLine[]>;
2433
+ /** Total number of case-insensitive plain-string matches of `query`. */
2434
+ readonly matchCount: _angular_core.Signal<number>;
2435
+ /** The full buffer as plain text (escapes stripped) for copy-all. */
2436
+ protected readonly allText: _angular_core.Signal<string>;
2437
+ /**
2438
+ * Wrap-mode parse cache, keyed by line content: appending N lines re-parses
2439
+ * only the N new ones (duplicate lines share one entry — harmless, spans
2440
+ * are immutable render data). Virtual mode skips it: parsing the ~30-row
2441
+ * window per render is cheaper than any bookkeeping.
2442
+ */
2443
+ private readonly parseCache;
2444
+ /** Guards against treating our own scrollTop writes as user scrolling. */
2445
+ private programmaticScroll;
2446
+ private resizeObserver?;
2447
+ constructor();
2448
+ ngOnDestroy(): void;
2449
+ /** Re-enable follow mode and jump to the newest line. */
2450
+ protected resumeFollow(): void;
2451
+ protected onScroll(event: Event): void;
2452
+ private scrollToBottom;
2453
+ private measure;
2454
+ private parse;
2455
+ /** Turn one raw line into render tokens (ANSI spans split at matches). */
2456
+ private renderLine;
2457
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkLogViewer, never>;
2458
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkLogViewer, "mk-log-viewer", ["mkLogViewer"], { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "follow": { "alias": "follow"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "ansi": { "alias": "ansi"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "maxLines": { "alias": "maxLines"; "required": false; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": false; "isSignal": true; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, { "follow": "followChange"; "wrap": "wrapChange"; "matches": "matches"; }, never, ["*"], true, never>;
2459
+ }
2460
+
2461
+ /**
2462
+ * Markdown — renders a CommonMark subset (see {@link mkParseMarkdown} for the
2463
+ * exact syntax list) with zero runtime dependencies. Built for admin-app
2464
+ * content: changelogs, AI output, user notes.
2465
+ *
2466
+ * SECURITY MODEL: raw HTML in the source is never passed through — it is
2467
+ * always escaped and shown as text, and link/image URLs are restricted to
2468
+ * http/https/mailto/relative, so the rendered string contains only markup the
2469
+ * renderer itself generates. It is bound via `[innerHTML]` and additionally
2470
+ * passes through Angular's `DomSanitizer` (no `bypassSecurityTrustHtml`),
2471
+ * which keeps every element and attribute the renderer emits.
2472
+ *
2473
+ * ```html
2474
+ * <mk-markdown [source]="changelog" linkTarget="_blank" />
2475
+ * ```
2476
+ */
2477
+ declare class MkMarkdown {
2478
+ /** Markdown source text. */
2479
+ readonly source: _angular_core.InputSignal<string>;
2480
+ /** Turn bare `http(s)://…` URLs into links. Off by default. */
2481
+ readonly autolink: _angular_core.InputSignalWithTransform<boolean, unknown>;
2482
+ /** Link target; `'_blank'` also adds `rel="noopener noreferrer"`. */
2483
+ readonly linkTarget: _angular_core.InputSignal<"" | "_blank">;
2484
+ /** The rendered (safe-by-construction) HTML string. */
2485
+ protected readonly html: _angular_core.Signal<string>;
2486
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MkMarkdown, never>;
2487
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MkMarkdown, "mk-markdown", never, { "source": { "alias": "source"; "required": false; "isSignal": true; }; "autolink": { "alias": "autolink"; "required": false; "isSignal": true; }; "linkTarget": { "alias": "linkTarget"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2488
+ }
2489
+
2490
+ /** Column alignment of a table, from the delimiter row's colons. */
2491
+ type MkMarkdownAlign = 'left' | 'center' | 'right' | null;
2492
+ /** Inline (phrasing) node of the markdown AST. */
2493
+ type MkMarkdownInline = {
2494
+ kind: 'text';
2495
+ text: string;
2496
+ } | {
2497
+ kind: 'softbreak';
2498
+ } | {
2499
+ kind: 'break';
2500
+ } | {
2501
+ kind: 'code';
2502
+ code: string;
2503
+ } | {
2504
+ kind: 'strong';
2505
+ children: MkMarkdownInline[];
2506
+ } | {
2507
+ kind: 'em';
2508
+ children: MkMarkdownInline[];
2509
+ } | {
2510
+ kind: 'del';
2511
+ children: MkMarkdownInline[];
2512
+ } | {
2513
+ kind: 'link';
2514
+ href: string;
2515
+ children: MkMarkdownInline[];
2516
+ } | {
2517
+ kind: 'image';
2518
+ src: string;
2519
+ alt: string;
2520
+ };
2521
+ /** One `<li>`: tight inline content plus an optional nested list. */
2522
+ interface MkMarkdownListItem {
2523
+ children: MkMarkdownInline[];
2524
+ sublist: MkMarkdownList | null;
2525
+ }
2526
+ /** An ordered or unordered (tight) list block. */
2527
+ interface MkMarkdownList {
2528
+ kind: 'list';
2529
+ ordered: boolean;
2530
+ /** First ordinal of an ordered list (`3.` starts at 3). Always 1 for bullets. */
2531
+ start: number;
2532
+ items: MkMarkdownListItem[];
2533
+ }
2534
+ /** Block-level node of the markdown AST. */
2535
+ type MkMarkdownBlock = {
2536
+ kind: 'heading';
2537
+ level: 1 | 2 | 3 | 4 | 5 | 6;
2538
+ children: MkMarkdownInline[];
2539
+ } | {
2540
+ kind: 'paragraph';
2541
+ children: MkMarkdownInline[];
2542
+ } | {
2543
+ kind: 'code';
2544
+ language: string;
2545
+ code: string;
2546
+ } | {
2547
+ kind: 'blockquote';
2548
+ children: MkMarkdownBlock[];
2549
+ } | {
2550
+ kind: 'hr';
2551
+ } | MkMarkdownList | {
2552
+ kind: 'table';
2553
+ align: MkMarkdownAlign[];
2554
+ header: MkMarkdownInline[][];
2555
+ rows: MkMarkdownInline[][][];
2556
+ };
2557
+ interface MkMarkdownParseOptions {
2558
+ /** Turn bare `http(s)://…` URLs into links. Off by default. */
2559
+ autolink?: boolean;
2560
+ }
2561
+ interface MkMarkdownRenderOptions {
2562
+ /** `'_blank'` renders `target="_blank" rel="noopener noreferrer"` on links. */
2563
+ linkTarget?: '' | '_blank';
2564
+ }
2565
+ /**
2566
+ * Parse markdown source into a typed AST. Pure and dependency-free — safe to
2567
+ * run on a server. Unsafe link/image URLs are already dropped at this stage,
2568
+ * so the AST never carries a `javascript:` (or other non-allow-listed) URL.
2569
+ */
2570
+ declare function mkParseMarkdown(src: string, options?: MkMarkdownParseOptions): MkMarkdownBlock[];
2571
+ /**
2572
+ * Render a parsed AST to an HTML string. The output contains only tags this
2573
+ * renderer generates (all source text is escaped), so it is safe to bind to
2574
+ * `[innerHTML]` — Angular's sanitizer keeps every element/attribute used here.
2575
+ * Fenced code is highlighted via `mkHighlight` for its known languages.
2576
+ */
2577
+ declare function mkRenderMarkdown(blocks: MkMarkdownBlock[], options?: MkMarkdownRenderOptions): string;
2578
+
2579
+ export { MK_CHART_PALETTE_SIZE, MkAvatar, MkAvatarGroup, MkBadge, MkBarChart, MkCalendarHeatmap, MkCard, MkCardFooter, MkCardHeader, MkCardTitle, MkCarousel, MkCarouselSlide, MkCode, MkCountdown, MkDescItem, MkDescriptionList, MkDiff, MkDivider, MkDonutChart, MkEmptyState, MkFunnelChart, MkGauge, MkHeatmap, MkInlineEdit, MkJsonViewer, MkKanban, MkLineChart, MkList, MkListItem, MkLogViewer, MkMarkdown, MkProfileActions, MkProfileCard, MkProfileMeta, MkProgressBar, MkProgressRing, MkQrCode, MkRadarChart, MkScatterChart, MkSkeleton, MkSkeletonPreset, MkSparkline, MkSpinner, MkStatCard, MkTag, MkTimeline, MkTimelineItem, MkTreemap, MkVirtualScroll, mkArcPath, mkAreaPath, mkBuildJsonTree, mkChartColor, mkComputeDiff, mkDiffStats, mkEncodeQr, mkFormatCompact, mkLinePath, mkLinearScale, mkNiceTicks, mkParseAnsi, mkParseMarkdown, mkRenderMarkdown, mkSplitDuration, mkSquarify, mkStripAnsi };
2580
+ export type { MkAnsiSpan, MkAvatarShape, MkAvatarStatus, MkBadgeVariant, MkBarOrientation, MkCalendarHeatmapCell, MkCalendarHeatmapEntry, MkCardPadding, MkCardVariant, MkChartSeries, MkChartSlice, MkDescriptionLayout, MkDiffMode, MkDiffOp, MkDiffOptions, MkDiffRow, MkDiffSegment, MkDiffStats, MkDividerOrientation, MkDurationParts, MkFunnelSegment, MkJsonNode, MkKanbanCard, MkKanbanCardMovedEvent, MkKanbanColumn, MkLogToken, MkMarkdownAlign, MkMarkdownBlock, MkMarkdownInline, MkMarkdownList, MkMarkdownListItem, MkMarkdownParseOptions, MkMarkdownRenderOptions, MkPoint, MkProfileCardOrientation, MkQrEcc, MkScatterPoint, MkScatterSeries, MkSkeletonPresetKind, MkSkeletonShape, MkSparklineType, MkStatTrend, MkTagVariant, MkTreemapItem, MkTreemapRect };