@mk-kit/ui 0.34.1 → 0.36.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.
@@ -0,0 +1,401 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, booleanAttribute, computed, Directive, ChangeDetectionStrategy, Component, numberAttribute } from '@angular/core';
3
+ import { MkBreakpointService } from '@mk-kit/ui/core';
4
+
5
+ /**
6
+ * A number, or a numeric string as it arrives from a plain attribute
7
+ * (`gap="4"`, `colSpan="2"`), as a number; anything else unchanged.
8
+ */
9
+ function mkNumeric(value) {
10
+ return typeof value === 'string' && /^\s*-?\d+(\.\d+)?\s*$/.test(value) ? Number(value) : value;
11
+ }
12
+ /** Translate a {@link MkSpace} into CSS (`null` when unset). */
13
+ function mkSpaceToCss(value) {
14
+ if (value == null || value === '')
15
+ return null;
16
+ const v = mkNumeric(value);
17
+ if (typeof v === 'number')
18
+ return v === 0 ? '0' : `var(--mk-space-${v})`;
19
+ return v;
20
+ }
21
+ const JUSTIFY = {
22
+ start: 'flex-start',
23
+ center: 'center',
24
+ end: 'flex-end',
25
+ between: 'space-between',
26
+ around: 'space-around',
27
+ evenly: 'space-evenly',
28
+ stretch: 'stretch',
29
+ };
30
+ const ALIGN = {
31
+ start: 'flex-start',
32
+ center: 'center',
33
+ end: 'flex-end',
34
+ stretch: 'stretch',
35
+ baseline: 'baseline',
36
+ };
37
+ /** `justify-content` value for a {@link MkJustify} keyword (`null` when unset). */
38
+ function mkJustifyToCss(value) {
39
+ return value ? JUSTIFY[value] : null;
40
+ }
41
+ /** `align-items` / `align-self` value for a {@link MkAlign} keyword (`null` when unset). */
42
+ function mkAlignToCss(value) {
43
+ return value ? ALIGN[value] : null;
44
+ }
45
+
46
+ /**
47
+ * Shared inputs and host style bindings of `mk-stack` and `mk-flex`.
48
+ * Responsive inputs re-resolve when the viewport crosses a breakpoint.
49
+ */
50
+ class MkFlexBase {
51
+ bp = inject(MkBreakpointService);
52
+ /** Cross-axis alignment of children. */
53
+ align = input(null, /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
55
+ /** Main-axis distribution of children. */
56
+ justify = input(null, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
58
+ /** Let children wrap onto new lines. */
59
+ wrap = input(false, { ...(ngDevMode ? { debugName: "wrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
60
+ /** Render as `inline-flex` (sits in a line of text) instead of a block. */
61
+ inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
62
+ directionCss = computed(() => this.bp.resolve(this.direction()) ?? null, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "directionCss" }] : /* istanbul ignore next */ []));
64
+ gapCss = computed(() => mkSpaceToCss(this.bp.resolve(this.gap())), /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []));
66
+ alignCss = computed(() => mkAlignToCss(this.bp.resolve(this.align() ?? undefined)), /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "alignCss" }] : /* istanbul ignore next */ []));
68
+ justifyCss = computed(() => mkJustifyToCss(this.bp.resolve(this.justify() ?? undefined)), /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "justifyCss" }] : /* istanbul ignore next */ []));
70
+ wrapCss = computed(() => (this.wrap() ? 'wrap' : null), /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "wrapCss" }] : /* istanbul ignore next */ []));
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlexBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
73
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MkFlexBase, isStandalone: true, inputs: { align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "inline() ? \"inline-flex\" : \"flex\"", "style.flex-direction": "directionCss()", "style.gap": "gapCss()", "style.align-items": "alignCss()", "style.justify-content": "justifyCss()", "style.flex-wrap": "wrapCss()" } }, ngImport: i0 });
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlexBase, decorators: [{
76
+ type: Directive,
77
+ args: [{
78
+ host: {
79
+ '[style.display]': 'inline() ? "inline-flex" : "flex"',
80
+ '[style.flex-direction]': 'directionCss()',
81
+ '[style.gap]': 'gapCss()',
82
+ '[style.align-items]': 'alignCss()',
83
+ '[style.justify-content]': 'justifyCss()',
84
+ '[style.flex-wrap]': 'wrapCss()',
85
+ },
86
+ }]
87
+ }], propDecorators: { align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], justify: [{ type: i0.Input, args: [{ isSignal: true, alias: "justify", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }] } });
88
+
89
+ /**
90
+ * Stack — children laid out one after another with a consistent gap, vertical
91
+ * by default. The everyday layout primitive: form sections, card bodies,
92
+ * sidebars, a row of buttons (`direction="row"`).
93
+ *
94
+ * ```html
95
+ * <mk-stack gap="4">
96
+ * <mk-input … />
97
+ * <mk-input … />
98
+ * <mk-stack direction="row" gap="2" justify="end">
99
+ * <button mkButton variant="ghost">Cancel</button>
100
+ * <button mkButton>Save</button>
101
+ * </mk-stack>
102
+ * </mk-stack>
103
+ *
104
+ * <!-- Stack on phones, side by side from md up -->
105
+ * <mk-stack [direction]="{ xs: 'column', md: 'row' }" [gap]="{ xs: 3, md: 6 }">…</mk-stack>
106
+ * ```
107
+ */
108
+ class MkStack extends MkFlexBase {
109
+ /** Space between children (default `4` = 16px). */
110
+ gap = input(4, /* @ts-ignore */
111
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
112
+ /** Direction (default `column`). */
113
+ direction = input('column', /* @ts-ignore */
114
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkStack, deps: null, target: i0.ɵɵFactoryTarget.Component });
116
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MkStack, isStandalone: true, selector: "mk-stack", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "mk-stack" }, usesInheritance: true, ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
117
+ }
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkStack, decorators: [{
119
+ type: Component,
120
+ args: [{
121
+ selector: 'mk-stack',
122
+ template: '<ng-content />',
123
+ changeDetection: ChangeDetectionStrategy.OnPush,
124
+ host: { class: 'mk-stack' },
125
+ }]
126
+ }], propDecorators: { gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }] } });
127
+
128
+ /**
129
+ * Flex — a flexbox container with its options as inputs, horizontal by default
130
+ * and no gap unless asked. Reach for it when a stack's "one after another"
131
+ * isn't the point: space-between toolbars, centring, wrapping tag clouds.
132
+ * Children can fine-tune themselves with `mkFlexItem`.
133
+ *
134
+ * ```html
135
+ * <mk-flex align="center" justify="between" gap="3">
136
+ * <h2>Orders</h2>
137
+ * <button mkButton>New order</button>
138
+ * </mk-flex>
139
+ * <mk-flex wrap gap="2">@for (tag of tags; track tag) { <mk-chip>{{ tag }}</mk-chip> }</mk-flex>
140
+ * ```
141
+ */
142
+ class MkFlex extends MkFlexBase {
143
+ /** Space between children (default none). */
144
+ gap = input(0, /* @ts-ignore */
145
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
146
+ /** Direction (default `row`). */
147
+ direction = input('row', /* @ts-ignore */
148
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
149
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlex, deps: null, target: i0.ɵɵFactoryTarget.Component });
150
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MkFlex, isStandalone: true, selector: "mk-flex", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "mk-flex" }, usesInheritance: true, ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlex, decorators: [{
153
+ type: Component,
154
+ args: [{
155
+ selector: 'mk-flex',
156
+ template: '<ng-content />',
157
+ changeDetection: ChangeDetectionStrategy.OnPush,
158
+ host: { class: 'mk-flex' },
159
+ }]
160
+ }], propDecorators: { gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }] } });
161
+
162
+ /**
163
+ * Per-child flex options inside `mk-flex` / `mk-stack` (or any flex parent).
164
+ *
165
+ * ```html
166
+ * <mk-flex gap="3">
167
+ * <mk-input mkFlexItem grow /> <!-- takes the remaining width -->
168
+ * <button mkButton>Search</button>
169
+ * </mk-flex>
170
+ * ```
171
+ */
172
+ class MkFlexItem {
173
+ bp = inject(MkBreakpointService);
174
+ /** `flex-grow`; a bare `grow` attribute means `1`. */
175
+ grow = input(null, { ...(ngDevMode ? { debugName: "grow" } : /* istanbul ignore next */ {}), transform: (v) => (v === '' || v === true ? 1 : v == null || v === false ? null : numberAttribute(v)) });
176
+ /** `flex-shrink`; a bare `shrink` attribute means `1`, `[shrink]="0"` pins the size. */
177
+ shrink = input(null, { ...(ngDevMode ? { debugName: "shrink" } : /* istanbul ignore next */ {}), transform: (v) => (v === '' || v === true ? 1 : v == null || v === false ? null : numberAttribute(v)) });
178
+ /** `flex-basis` — any CSS length or `auto`; may be responsive. */
179
+ basis = input(null, /* @ts-ignore */
180
+ ...(ngDevMode ? [{ debugName: "basis" }] : /* istanbul ignore next */ []));
181
+ /** Override the parent's `align` for this child. */
182
+ alignSelf = input(null, /* @ts-ignore */
183
+ ...(ngDevMode ? [{ debugName: "alignSelf" }] : /* istanbul ignore next */ []));
184
+ /** Visual order; may be responsive (e.g. move a sidebar first on phones). */
185
+ order = input(null, /* @ts-ignore */
186
+ ...(ngDevMode ? [{ debugName: "order" }] : /* istanbul ignore next */ []));
187
+ growCss = computed(() => this.grow(), /* @ts-ignore */
188
+ ...(ngDevMode ? [{ debugName: "growCss" }] : /* istanbul ignore next */ []));
189
+ shrinkCss = computed(() => this.shrink(), /* @ts-ignore */
190
+ ...(ngDevMode ? [{ debugName: "shrinkCss" }] : /* istanbul ignore next */ []));
191
+ basisCss = computed(() => this.bp.resolve(this.basis() ?? undefined) ?? null, /* @ts-ignore */
192
+ ...(ngDevMode ? [{ debugName: "basisCss" }] : /* istanbul ignore next */ []));
193
+ alignSelfCss = computed(() => mkAlignToCss(this.bp.resolve(this.alignSelf() ?? undefined)), /* @ts-ignore */
194
+ ...(ngDevMode ? [{ debugName: "alignSelfCss" }] : /* istanbul ignore next */ []));
195
+ orderCss = computed(() => mkNumeric(this.bp.resolve(this.order() ?? undefined)) ?? null, /* @ts-ignore */
196
+ ...(ngDevMode ? [{ debugName: "orderCss" }] : /* istanbul ignore next */ []));
197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlexItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
198
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MkFlexItem, isStandalone: true, selector: "[mkFlexItem]", inputs: { grow: { classPropertyName: "grow", publicName: "grow", isSignal: true, isRequired: false, transformFunction: null }, shrink: { classPropertyName: "shrink", publicName: "shrink", isSignal: true, isRequired: false, transformFunction: null }, basis: { classPropertyName: "basis", publicName: "basis", isSignal: true, isRequired: false, transformFunction: null }, alignSelf: { classPropertyName: "alignSelf", publicName: "alignSelf", isSignal: true, isRequired: false, transformFunction: null }, order: { classPropertyName: "order", publicName: "order", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.flex-grow": "growCss()", "style.flex-shrink": "shrinkCss()", "style.flex-basis": "basisCss()", "style.align-self": "alignSelfCss()", "style.order": "orderCss()" } }, ngImport: i0 });
199
+ }
200
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkFlexItem, decorators: [{
201
+ type: Directive,
202
+ args: [{
203
+ selector: '[mkFlexItem]',
204
+ host: {
205
+ '[style.flex-grow]': 'growCss()',
206
+ '[style.flex-shrink]': 'shrinkCss()',
207
+ '[style.flex-basis]': 'basisCss()',
208
+ '[style.align-self]': 'alignSelfCss()',
209
+ '[style.order]': 'orderCss()',
210
+ },
211
+ }]
212
+ }], propDecorators: { grow: [{ type: i0.Input, args: [{ isSignal: true, alias: "grow", required: false }] }], shrink: [{ type: i0.Input, args: [{ isSignal: true, alias: "shrink", required: false }] }], basis: [{ type: i0.Input, args: [{ isSignal: true, alias: "basis", required: false }] }], alignSelf: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignSelf", required: false }] }], order: [{ type: i0.Input, args: [{ isSignal: true, alias: "order", required: false }] }] } });
213
+
214
+ /**
215
+ * Grid — a CSS grid with the common cases as inputs.
216
+ *
217
+ * - `columns` — a count (`3` → three equal tracks) or a raw
218
+ * `grid-template-columns` string (`'240px 1fr'`); responsive maps work for
219
+ * both: `[columns]="{ xs: 1, md: 2, xl: 4 }"`.
220
+ * - `minColumnWidth` — auto-responsive without breakpoints: as many
221
+ * `≥ 16rem` columns as fit (`auto-fill`; add `autoFit` to stretch the last
222
+ * row's items instead of leaving empty tracks). Wins over `columns`.
223
+ * - `gap`, `rowGap`, `columnGap` — `--mk-space-*` steps or CSS lengths.
224
+ *
225
+ * Children can span tracks with `mkGridItem`.
226
+ *
227
+ * ```html
228
+ * <mk-grid [columns]="{ xs: 1, md: 2, xl: 4 }" gap="4">
229
+ * @for (kpi of kpis; track kpi.id) { <mk-card>…</mk-card> }
230
+ * </mk-grid>
231
+ *
232
+ * <mk-grid minColumnWidth="16rem" gap="4">…cards…</mk-grid>
233
+ * ```
234
+ */
235
+ class MkGrid {
236
+ bp = inject(MkBreakpointService);
237
+ /** Column count or `grid-template-columns` value; responsive allowed (default `1`). */
238
+ columns = input(1, /* @ts-ignore */
239
+ ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
240
+ /** Row count or `grid-template-rows` value; responsive allowed. */
241
+ rows = input(null, /* @ts-ignore */
242
+ ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
243
+ /** Minimum column width for an auto-filling grid, e.g. `16rem`. Overrides `columns`. */
244
+ minColumnWidth = input(null, /* @ts-ignore */
245
+ ...(ngDevMode ? [{ debugName: "minColumnWidth" }] : /* istanbul ignore next */ []));
246
+ /** With `minColumnWidth`: use `auto-fit` so items stretch when a row is short. */
247
+ autoFit = input(false, { ...(ngDevMode ? { debugName: "autoFit" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
248
+ /** Gap between both rows and columns (default `4` = 16px). */
249
+ gap = input(4, /* @ts-ignore */
250
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
251
+ /** Row gap override. */
252
+ rowGap = input(null, /* @ts-ignore */
253
+ ...(ngDevMode ? [{ debugName: "rowGap" }] : /* istanbul ignore next */ []));
254
+ /** Column gap override. */
255
+ columnGap = input(null, /* @ts-ignore */
256
+ ...(ngDevMode ? [{ debugName: "columnGap" }] : /* istanbul ignore next */ []));
257
+ /** `align-items` for every cell. */
258
+ align = input(null, /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
260
+ /** `justify-items` for every cell. */
261
+ justify = input(null, /* @ts-ignore */
262
+ ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
263
+ /** `grid-auto-flow` (e.g. `dense` to backfill holes left by spanning items). */
264
+ flow = input(null, /* @ts-ignore */
265
+ ...(ngDevMode ? [{ debugName: "flow" }] : /* istanbul ignore next */ []));
266
+ /** Render as `inline-grid`. */
267
+ inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
268
+ columnsCss = computed(() => {
269
+ const min = this.bp.resolve(this.minColumnWidth() ?? undefined);
270
+ if (min) {
271
+ const mode = this.autoFit() ? 'auto-fit' : 'auto-fill';
272
+ return `repeat(${mode}, minmax(min(${min}, 100%), 1fr))`;
273
+ }
274
+ return MkGrid.tracks(this.bp.resolve(this.columns()));
275
+ }, /* @ts-ignore */
276
+ ...(ngDevMode ? [{ debugName: "columnsCss" }] : /* istanbul ignore next */ []));
277
+ rowsCss = computed(() => MkGrid.tracks(this.bp.resolve(this.rows() ?? undefined)), /* @ts-ignore */
278
+ ...(ngDevMode ? [{ debugName: "rowsCss" }] : /* istanbul ignore next */ []));
279
+ // Longhands only: a `gap` shorthand followed by a `row-gap` override is
280
+ // serialised inconsistently across engines.
281
+ rowGapCss = computed(() => mkSpaceToCss(this.bp.resolve(this.rowGap() ?? undefined) ?? this.bp.resolve(this.gap())), /* @ts-ignore */
282
+ ...(ngDevMode ? [{ debugName: "rowGapCss" }] : /* istanbul ignore next */ []));
283
+ columnGapCss = computed(() => mkSpaceToCss(this.bp.resolve(this.columnGap() ?? undefined) ?? this.bp.resolve(this.gap())), /* @ts-ignore */
284
+ ...(ngDevMode ? [{ debugName: "columnGapCss" }] : /* istanbul ignore next */ []));
285
+ alignCss = computed(() => mkAlignToCss(this.bp.resolve(this.align() ?? undefined)), /* @ts-ignore */
286
+ ...(ngDevMode ? [{ debugName: "alignCss" }] : /* istanbul ignore next */ []));
287
+ justifyCss = computed(() => this.bp.resolve(this.justify() ?? undefined) ?? null, /* @ts-ignore */
288
+ ...(ngDevMode ? [{ debugName: "justifyCss" }] : /* istanbul ignore next */ []));
289
+ flowCss = computed(() => this.flow(), /* @ts-ignore */
290
+ ...(ngDevMode ? [{ debugName: "flowCss" }] : /* istanbul ignore next */ []));
291
+ /** A track list: a count becomes `repeat(n, minmax(0, 1fr))` so long content cannot blow a column out. */
292
+ static tracks(value) {
293
+ if (value == null || value === '')
294
+ return null;
295
+ const v = mkNumeric(value);
296
+ return typeof v === 'number' ? `repeat(${v}, minmax(0, 1fr))` : v;
297
+ }
298
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkGrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
299
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: MkGrid, isStandalone: true, selector: "mk-grid", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, minColumnWidth: { classPropertyName: "minColumnWidth", publicName: "minColumnWidth", isSignal: true, isRequired: false, transformFunction: null }, autoFit: { classPropertyName: "autoFit", publicName: "autoFit", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, rowGap: { classPropertyName: "rowGap", publicName: "rowGap", isSignal: true, isRequired: false, transformFunction: null }, columnGap: { classPropertyName: "columnGap", publicName: "columnGap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, flow: { classPropertyName: "flow", publicName: "flow", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.display": "inline() ? \"inline-grid\" : \"grid\"", "style.grid-template-columns": "columnsCss()", "style.grid-template-rows": "rowsCss()", "style.row-gap": "rowGapCss()", "style.column-gap": "columnGapCss()", "style.align-items": "alignCss()", "style.justify-items": "justifyCss()", "style.grid-auto-flow": "flowCss()" }, classAttribute: "mk-grid" }, ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
300
+ }
301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkGrid, decorators: [{
302
+ type: Component,
303
+ args: [{
304
+ selector: 'mk-grid',
305
+ template: '<ng-content />',
306
+ changeDetection: ChangeDetectionStrategy.OnPush,
307
+ host: {
308
+ class: 'mk-grid',
309
+ '[style.display]': 'inline() ? "inline-grid" : "grid"',
310
+ '[style.grid-template-columns]': 'columnsCss()',
311
+ '[style.grid-template-rows]': 'rowsCss()',
312
+ '[style.row-gap]': 'rowGapCss()',
313
+ '[style.column-gap]': 'columnGapCss()',
314
+ '[style.align-items]': 'alignCss()',
315
+ '[style.justify-items]': 'justifyCss()',
316
+ '[style.grid-auto-flow]': 'flowCss()',
317
+ },
318
+ }]
319
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], minColumnWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minColumnWidth", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], rowGap: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowGap", required: false }] }], columnGap: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnGap", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], justify: [{ type: i0.Input, args: [{ isSignal: true, alias: "justify", required: false }] }], flow: [{ type: i0.Input, args: [{ isSignal: true, alias: "flow", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }] } });
320
+
321
+ /**
322
+ * Per-cell placement inside `mk-grid`: span several tracks, or pin a start
323
+ * line. All inputs accept responsive maps, so a hero card can span the full
324
+ * row on phones and two of four columns on desktop.
325
+ *
326
+ * ```html
327
+ * <mk-grid [columns]="{ xs: 1, lg: 4 }" gap="4">
328
+ * <mk-card mkGridItem [colSpan]="{ xs: 1, lg: 2 }">Revenue</mk-card>
329
+ * …
330
+ * </mk-grid>
331
+ * ```
332
+ */
333
+ class MkGridItem {
334
+ bp = inject(MkBreakpointService);
335
+ /** Number of columns to span (`'all'` = the full row). */
336
+ colSpan = input(null, /* @ts-ignore */
337
+ ...(ngDevMode ? [{ debugName: "colSpan" }] : /* istanbul ignore next */ []));
338
+ /** Number of rows to span. */
339
+ rowSpan = input(null, /* @ts-ignore */
340
+ ...(ngDevMode ? [{ debugName: "rowSpan" }] : /* istanbul ignore next */ []));
341
+ /** Column line to start at (1-based). */
342
+ colStart = input(null, /* @ts-ignore */
343
+ ...(ngDevMode ? [{ debugName: "colStart" }] : /* istanbul ignore next */ []));
344
+ /** Row line to start at (1-based). */
345
+ rowStart = input(null, /* @ts-ignore */
346
+ ...(ngDevMode ? [{ debugName: "rowStart" }] : /* istanbul ignore next */ []));
347
+ /** `align-self` for this cell. */
348
+ alignSelf = input(null, /* @ts-ignore */
349
+ ...(ngDevMode ? [{ debugName: "alignSelf" }] : /* istanbul ignore next */ []));
350
+ /** `justify-self` for this cell. */
351
+ justifySelf = input(null, /* @ts-ignore */
352
+ ...(ngDevMode ? [{ debugName: "justifySelf" }] : /* istanbul ignore next */ []));
353
+ columnCss = computed(() => {
354
+ const span = this.bp.resolve(this.colSpan() ?? undefined);
355
+ if (span === 'all')
356
+ return '1 / -1';
357
+ return MkGridItem.line(this.bp.resolve(this.colStart() ?? undefined), span);
358
+ }, /* @ts-ignore */
359
+ ...(ngDevMode ? [{ debugName: "columnCss" }] : /* istanbul ignore next */ []));
360
+ rowCss = computed(() => MkGridItem.line(this.bp.resolve(this.rowStart() ?? undefined), this.bp.resolve(this.rowSpan() ?? undefined)), /* @ts-ignore */
361
+ ...(ngDevMode ? [{ debugName: "rowCss" }] : /* istanbul ignore next */ []));
362
+ alignSelfCss = computed(() => this.bp.resolve(this.alignSelf() ?? undefined) ?? null, /* @ts-ignore */
363
+ ...(ngDevMode ? [{ debugName: "alignSelfCss" }] : /* istanbul ignore next */ []));
364
+ justifySelfCss = computed(() => this.bp.resolve(this.justifySelf() ?? undefined) ?? null, /* @ts-ignore */
365
+ ...(ngDevMode ? [{ debugName: "justifySelfCss" }] : /* istanbul ignore next */ []));
366
+ static line(startIn, spanIn) {
367
+ const start = mkNumeric(startIn);
368
+ const span = mkNumeric(spanIn);
369
+ if (start == null && span == null)
370
+ return null;
371
+ const s = start != null ? String(start) : 'auto';
372
+ return typeof span === 'number' && span > 1 ? `${s} / span ${span}` : start != null ? s : null;
373
+ }
374
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkGridItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
375
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MkGridItem, isStandalone: true, selector: "[mkGridItem]", inputs: { colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null }, rowSpan: { classPropertyName: "rowSpan", publicName: "rowSpan", isSignal: true, isRequired: false, transformFunction: null }, colStart: { classPropertyName: "colStart", publicName: "colStart", isSignal: true, isRequired: false, transformFunction: null }, rowStart: { classPropertyName: "rowStart", publicName: "rowStart", isSignal: true, isRequired: false, transformFunction: null }, alignSelf: { classPropertyName: "alignSelf", publicName: "alignSelf", isSignal: true, isRequired: false, transformFunction: null }, justifySelf: { classPropertyName: "justifySelf", publicName: "justifySelf", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.grid-column": "columnCss()", "style.grid-row": "rowCss()", "style.align-self": "alignSelfCss()", "style.justify-self": "justifySelfCss()" } }, ngImport: i0 });
376
+ }
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkGridItem, decorators: [{
378
+ type: Directive,
379
+ args: [{
380
+ selector: '[mkGridItem]',
381
+ host: {
382
+ '[style.grid-column]': 'columnCss()',
383
+ '[style.grid-row]': 'rowCss()',
384
+ '[style.align-self]': 'alignSelfCss()',
385
+ '[style.justify-self]': 'justifySelfCss()',
386
+ },
387
+ }]
388
+ }], propDecorators: { colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }], rowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSpan", required: false }] }], colStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "colStart", required: false }] }], rowStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowStart", required: false }] }], alignSelf: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignSelf", required: false }] }], justifySelf: [{ type: i0.Input, args: [{ isSignal: true, alias: "justifySelf", required: false }] }] } });
389
+
390
+ /**
391
+ * @mk-kit/ui/layout — layout primitives: `mk-stack`, `mk-flex`, `mk-grid`
392
+ * and the `mkFlexItem` / `mkGridItem` child directives. Every spacing and
393
+ * track input accepts a per-breakpoint map resolved by `MkBreakpointService`.
394
+ */
395
+
396
+ /**
397
+ * Generated bundle index. Do not edit.
398
+ */
399
+
400
+ export { MkFlex, MkFlexBase, MkFlexItem, MkGrid, MkGridItem, MkStack, mkAlignToCss, mkJustifyToCss, mkNumeric, mkSpaceToCss };
401
+ //# sourceMappingURL=mk-kit-ui-layout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mk-kit-ui-layout.mjs","sources":["../../../projects/mk-kit/layout/space.ts","../../../projects/mk-kit/layout/flex-base.ts","../../../projects/mk-kit/layout/stack.ts","../../../projects/mk-kit/layout/flex.ts","../../../projects/mk-kit/layout/flex-item.ts","../../../projects/mk-kit/layout/grid.ts","../../../projects/mk-kit/layout/grid-item.ts","../../../projects/mk-kit/layout/index.ts","../../../projects/mk-kit/layout/mk-kit-ui-layout.ts"],"sourcesContent":["import type { MkResponsive } from '@mk-kit/ui/core';\n\n/**\n * A spacing value: a step on the `--mk-space-*` scale (`0 1 2 3 4 5 6 8 10 12\n * 16`, so `4` = `var(--mk-space-4)` = 16px and follows the density modes) or\n * any CSS length such as `'1.5rem'` / `'clamp(1rem, 2vw, 2rem)'`.\n */\nexport type MkSpace = number | string;\n\n/** Per-breakpoint spacing, e.g. `{ xs: 2, md: 4 }`. */\nexport type MkResponsiveSpace = MkResponsive<MkSpace>;\n\n/**\n * A number, or a numeric string as it arrives from a plain attribute\n * (`gap=\"4\"`, `colSpan=\"2\"`), as a number; anything else unchanged.\n */\nexport function mkNumeric<T>(value: T): T | number {\n return typeof value === 'string' && /^\\s*-?\\d+(\\.\\d+)?\\s*$/.test(value) ? Number(value) : value;\n}\n\n/** Translate a {@link MkSpace} into CSS (`null` when unset). */\nexport function mkSpaceToCss(value: MkSpace | null | undefined): string | null {\n if (value == null || value === '') return null;\n const v = mkNumeric(value);\n if (typeof v === 'number') return v === 0 ? '0' : `var(--mk-space-${v})`;\n return v;\n}\n\n/** Flex / grid main-axis distribution keywords, in plain words. */\nexport type MkJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly' | 'stretch';\n\n/** Cross-axis alignment keywords. */\nexport type MkAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n\nconst JUSTIFY: Record<MkJustify, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n stretch: 'stretch',\n};\n\nconst ALIGN: Record<MkAlign, string> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\n/** `justify-content` value for a {@link MkJustify} keyword (`null` when unset). */\nexport function mkJustifyToCss(value: MkJustify | null | undefined): string | null {\n return value ? JUSTIFY[value] : null;\n}\n\n/** `align-items` / `align-self` value for a {@link MkAlign} keyword (`null` when unset). */\nexport function mkAlignToCss(value: MkAlign | null | undefined): string | null {\n return value ? ALIGN[value] : null;\n}\n","import { Directive, booleanAttribute, computed, inject, input, type InputSignal } from '@angular/core';\nimport { MkBreakpointService, type MkResponsive } from '@mk-kit/ui/core';\nimport {\n mkAlignToCss,\n mkJustifyToCss,\n mkSpaceToCss,\n type MkAlign,\n type MkJustify,\n type MkResponsiveSpace,\n} from './space';\n\n/** Flex direction keywords. */\nexport type MkFlexDirection = 'row' | 'column' | 'row-reverse' | 'column-reverse';\n\n/**\n * Shared inputs and host style bindings of `mk-stack` and `mk-flex`.\n * Responsive inputs re-resolve when the viewport crosses a breakpoint.\n */\n@Directive({\n host: {\n '[style.display]': 'inline() ? \"inline-flex\" : \"flex\"',\n '[style.flex-direction]': 'directionCss()',\n '[style.gap]': 'gapCss()',\n '[style.align-items]': 'alignCss()',\n '[style.justify-content]': 'justifyCss()',\n '[style.flex-wrap]': 'wrapCss()',\n },\n})\nexport abstract class MkFlexBase {\n protected readonly bp = inject(MkBreakpointService);\n\n /** Space between children — a `--mk-space-*` step, a CSS length, or a per-breakpoint map. */\n abstract readonly gap: InputSignal<MkResponsiveSpace>;\n /** Main-axis direction; may be responsive, e.g. `{ xs: 'column', md: 'row' }`. */\n abstract readonly direction: InputSignal<MkResponsive<MkFlexDirection>>;\n\n /** Cross-axis alignment of children. */\n readonly align = input<MkResponsive<MkAlign> | null>(null);\n /** Main-axis distribution of children. */\n readonly justify = input<MkResponsive<MkJustify> | null>(null);\n /** Let children wrap onto new lines. */\n readonly wrap = input(false, { transform: booleanAttribute });\n /** Render as `inline-flex` (sits in a line of text) instead of a block. */\n readonly inline = input(false, { transform: booleanAttribute });\n\n protected readonly directionCss = computed(() => this.bp.resolve(this.direction()) ?? null);\n protected readonly gapCss = computed(() => mkSpaceToCss(this.bp.resolve(this.gap())));\n protected readonly alignCss = computed(() => mkAlignToCss(this.bp.resolve(this.align() ?? undefined)));\n protected readonly justifyCss = computed(() => mkJustifyToCss(this.bp.resolve(this.justify() ?? undefined)));\n protected readonly wrapCss = computed(() => (this.wrap() ? 'wrap' : null));\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkResponsive } from '@mk-kit/ui/core';\nimport { MkFlexBase, type MkFlexDirection } from './flex-base';\nimport type { MkResponsiveSpace } from './space';\n\n/**\n * Stack — children laid out one after another with a consistent gap, vertical\n * by default. The everyday layout primitive: form sections, card bodies,\n * sidebars, a row of buttons (`direction=\"row\"`).\n *\n * ```html\n * <mk-stack gap=\"4\">\n * <mk-input … />\n * <mk-input … />\n * <mk-stack direction=\"row\" gap=\"2\" justify=\"end\">\n * <button mkButton variant=\"ghost\">Cancel</button>\n * <button mkButton>Save</button>\n * </mk-stack>\n * </mk-stack>\n *\n * <!-- Stack on phones, side by side from md up -->\n * <mk-stack [direction]=\"{ xs: 'column', md: 'row' }\" [gap]=\"{ xs: 3, md: 6 }\">…</mk-stack>\n * ```\n */\n@Component({\n selector: 'mk-stack',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-stack' },\n})\nexport class MkStack extends MkFlexBase {\n /** Space between children (default `4` = 16px). */\n override readonly gap = input<MkResponsiveSpace>(4);\n /** Direction (default `column`). */\n override readonly direction = input<MkResponsive<MkFlexDirection>>('column');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { MkResponsive } from '@mk-kit/ui/core';\nimport { MkFlexBase, type MkFlexDirection } from './flex-base';\nimport type { MkResponsiveSpace } from './space';\n\n/**\n * Flex — a flexbox container with its options as inputs, horizontal by default\n * and no gap unless asked. Reach for it when a stack's \"one after another\"\n * isn't the point: space-between toolbars, centring, wrapping tag clouds.\n * Children can fine-tune themselves with `mkFlexItem`.\n *\n * ```html\n * <mk-flex align=\"center\" justify=\"between\" gap=\"3\">\n * <h2>Orders</h2>\n * <button mkButton>New order</button>\n * </mk-flex>\n * <mk-flex wrap gap=\"2\">@for (tag of tags; track tag) { <mk-chip>{{ tag }}</mk-chip> }</mk-flex>\n * ```\n */\n@Component({\n selector: 'mk-flex',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-flex' },\n})\nexport class MkFlex extends MkFlexBase {\n /** Space between children (default none). */\n override readonly gap = input<MkResponsiveSpace>(0);\n /** Direction (default `row`). */\n override readonly direction = input<MkResponsive<MkFlexDirection>>('row');\n}\n","import { Directive, computed, inject, input, numberAttribute } from '@angular/core';\nimport { MkBreakpointService, type MkResponsive } from '@mk-kit/ui/core';\nimport { mkAlignToCss, mkNumeric, type MkAlign } from './space';\n\n/**\n * Per-child flex options inside `mk-flex` / `mk-stack` (or any flex parent).\n *\n * ```html\n * <mk-flex gap=\"3\">\n * <mk-input mkFlexItem grow /> <!-- takes the remaining width -->\n * <button mkButton>Search</button>\n * </mk-flex>\n * ```\n */\n@Directive({\n selector: '[mkFlexItem]',\n host: {\n '[style.flex-grow]': 'growCss()',\n '[style.flex-shrink]': 'shrinkCss()',\n '[style.flex-basis]': 'basisCss()',\n '[style.align-self]': 'alignSelfCss()',\n '[style.order]': 'orderCss()',\n },\n})\nexport class MkFlexItem {\n private readonly bp = inject(MkBreakpointService);\n\n /** `flex-grow`; a bare `grow` attribute means `1`. */\n readonly grow = input<number | null, unknown>(null, {\n transform: (v) => (v === '' || v === true ? 1 : v == null || v === false ? null : numberAttribute(v)),\n });\n /** `flex-shrink`; a bare `shrink` attribute means `1`, `[shrink]=\"0\"` pins the size. */\n readonly shrink = input<number | null, unknown>(null, {\n transform: (v) => (v === '' || v === true ? 1 : v == null || v === false ? null : numberAttribute(v)),\n });\n /** `flex-basis` — any CSS length or `auto`; may be responsive. */\n readonly basis = input<MkResponsive<string> | null>(null);\n /** Override the parent's `align` for this child. */\n readonly alignSelf = input<MkResponsive<MkAlign> | null>(null);\n /** Visual order; may be responsive (e.g. move a sidebar first on phones). */\n readonly order = input<MkResponsive<number | string> | null>(null);\n\n protected readonly growCss = computed(() => this.grow());\n protected readonly shrinkCss = computed(() => this.shrink());\n protected readonly basisCss = computed(() => this.bp.resolve(this.basis() ?? undefined) ?? null);\n protected readonly alignSelfCss = computed(() => mkAlignToCss(this.bp.resolve(this.alignSelf() ?? undefined)));\n protected readonly orderCss = computed(() => mkNumeric(this.bp.resolve(this.order() ?? undefined)) ?? null);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { MkBreakpointService, type MkResponsive } from '@mk-kit/ui/core';\nimport {\n mkAlignToCss,\n mkNumeric,\n mkSpaceToCss,\n type MkAlign,\n type MkResponsiveSpace,\n} from './space';\n\n/** `justify-items` keywords. */\nexport type MkGridJustify = 'start' | 'center' | 'end' | 'stretch';\n\n/**\n * Grid — a CSS grid with the common cases as inputs.\n *\n * - `columns` — a count (`3` → three equal tracks) or a raw\n * `grid-template-columns` string (`'240px 1fr'`); responsive maps work for\n * both: `[columns]=\"{ xs: 1, md: 2, xl: 4 }\"`.\n * - `minColumnWidth` — auto-responsive without breakpoints: as many\n * `≥ 16rem` columns as fit (`auto-fill`; add `autoFit` to stretch the last\n * row's items instead of leaving empty tracks). Wins over `columns`.\n * - `gap`, `rowGap`, `columnGap` — `--mk-space-*` steps or CSS lengths.\n *\n * Children can span tracks with `mkGridItem`.\n *\n * ```html\n * <mk-grid [columns]=\"{ xs: 1, md: 2, xl: 4 }\" gap=\"4\">\n * @for (kpi of kpis; track kpi.id) { <mk-card>…</mk-card> }\n * </mk-grid>\n *\n * <mk-grid minColumnWidth=\"16rem\" gap=\"4\">…cards…</mk-grid>\n * ```\n */\n@Component({\n selector: 'mk-grid',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-grid',\n '[style.display]': 'inline() ? \"inline-grid\" : \"grid\"',\n '[style.grid-template-columns]': 'columnsCss()',\n '[style.grid-template-rows]': 'rowsCss()',\n '[style.row-gap]': 'rowGapCss()',\n '[style.column-gap]': 'columnGapCss()',\n '[style.align-items]': 'alignCss()',\n '[style.justify-items]': 'justifyCss()',\n '[style.grid-auto-flow]': 'flowCss()',\n },\n})\nexport class MkGrid {\n private readonly bp = inject(MkBreakpointService);\n\n /** Column count or `grid-template-columns` value; responsive allowed (default `1`). */\n readonly columns = input<MkResponsive<number | string>>(1);\n /** Row count or `grid-template-rows` value; responsive allowed. */\n readonly rows = input<MkResponsive<number | string> | null>(null);\n /** Minimum column width for an auto-filling grid, e.g. `16rem`. Overrides `columns`. */\n readonly minColumnWidth = input<MkResponsive<string> | null>(null);\n /** With `minColumnWidth`: use `auto-fit` so items stretch when a row is short. */\n readonly autoFit = input(false, { transform: booleanAttribute });\n /** Gap between both rows and columns (default `4` = 16px). */\n readonly gap = input<MkResponsiveSpace>(4);\n /** Row gap override. */\n readonly rowGap = input<MkResponsiveSpace | null>(null);\n /** Column gap override. */\n readonly columnGap = input<MkResponsiveSpace | null>(null);\n /** `align-items` for every cell. */\n readonly align = input<MkResponsive<MkAlign> | null>(null);\n /** `justify-items` for every cell. */\n readonly justify = input<MkResponsive<MkGridJustify> | null>(null);\n /** `grid-auto-flow` (e.g. `dense` to backfill holes left by spanning items). */\n readonly flow = input<'row' | 'column' | 'dense' | 'row dense' | 'column dense' | null>(null);\n /** Render as `inline-grid`. */\n readonly inline = input(false, { transform: booleanAttribute });\n\n protected readonly columnsCss = computed(() => {\n const min = this.bp.resolve(this.minColumnWidth() ?? undefined);\n if (min) {\n const mode = this.autoFit() ? 'auto-fit' : 'auto-fill';\n return `repeat(${mode}, minmax(min(${min}, 100%), 1fr))`;\n }\n return MkGrid.tracks(this.bp.resolve(this.columns()));\n });\n protected readonly rowsCss = computed(() => MkGrid.tracks(this.bp.resolve(this.rows() ?? undefined)));\n // Longhands only: a `gap` shorthand followed by a `row-gap` override is\n // serialised inconsistently across engines.\n protected readonly rowGapCss = computed(() =>\n mkSpaceToCss(this.bp.resolve(this.rowGap() ?? undefined) ?? this.bp.resolve(this.gap())),\n );\n protected readonly columnGapCss = computed(() =>\n mkSpaceToCss(this.bp.resolve(this.columnGap() ?? undefined) ?? this.bp.resolve(this.gap())),\n );\n protected readonly alignCss = computed(() => mkAlignToCss(this.bp.resolve(this.align() ?? undefined)));\n protected readonly justifyCss = computed(() => this.bp.resolve(this.justify() ?? undefined) ?? null);\n protected readonly flowCss = computed(() => this.flow());\n\n /** A track list: a count becomes `repeat(n, minmax(0, 1fr))` so long content cannot blow a column out. */\n private static tracks(value: number | string | null | undefined): string | null {\n if (value == null || value === '') return null;\n const v = mkNumeric(value);\n return typeof v === 'number' ? `repeat(${v}, minmax(0, 1fr))` : v;\n }\n}\n","import { Directive, computed, inject, input } from '@angular/core';\nimport { MkBreakpointService, type MkResponsive } from '@mk-kit/ui/core';\nimport { mkNumeric } from './space';\n\n/**\n * Per-cell placement inside `mk-grid`: span several tracks, or pin a start\n * line. All inputs accept responsive maps, so a hero card can span the full\n * row on phones and two of four columns on desktop.\n *\n * ```html\n * <mk-grid [columns]=\"{ xs: 1, lg: 4 }\" gap=\"4\">\n * <mk-card mkGridItem [colSpan]=\"{ xs: 1, lg: 2 }\">Revenue</mk-card>\n * …\n * </mk-grid>\n * ```\n */\n@Directive({\n selector: '[mkGridItem]',\n host: {\n '[style.grid-column]': 'columnCss()',\n '[style.grid-row]': 'rowCss()',\n '[style.align-self]': 'alignSelfCss()',\n '[style.justify-self]': 'justifySelfCss()',\n },\n})\nexport class MkGridItem {\n private readonly bp = inject(MkBreakpointService);\n\n /** Number of columns to span (`'all'` = the full row). */\n readonly colSpan = input<MkResponsive<number | 'all' | string> | null>(null);\n /** Number of rows to span. */\n readonly rowSpan = input<MkResponsive<number | string> | null>(null);\n /** Column line to start at (1-based). */\n readonly colStart = input<MkResponsive<number | string> | null>(null);\n /** Row line to start at (1-based). */\n readonly rowStart = input<MkResponsive<number | string> | null>(null);\n /** `align-self` for this cell. */\n readonly alignSelf = input<MkResponsive<'start' | 'center' | 'end' | 'stretch'> | null>(null);\n /** `justify-self` for this cell. */\n readonly justifySelf = input<MkResponsive<'start' | 'center' | 'end' | 'stretch'> | null>(null);\n\n protected readonly columnCss = computed(() => {\n const span = this.bp.resolve(this.colSpan() ?? undefined);\n if (span === 'all') return '1 / -1';\n return MkGridItem.line(this.bp.resolve(this.colStart() ?? undefined), span);\n });\n protected readonly rowCss = computed(() =>\n MkGridItem.line(this.bp.resolve(this.rowStart() ?? undefined), this.bp.resolve(this.rowSpan() ?? undefined)),\n );\n protected readonly alignSelfCss = computed(() => this.bp.resolve(this.alignSelf() ?? undefined) ?? null);\n protected readonly justifySelfCss = computed(() => this.bp.resolve(this.justifySelf() ?? undefined) ?? null);\n\n private static line(\n startIn: number | string | undefined,\n spanIn: number | string | undefined,\n ): string | null {\n const start = mkNumeric(startIn);\n const span = mkNumeric(spanIn);\n if (start == null && span == null) return null;\n const s = start != null ? String(start) : 'auto';\n return typeof span === 'number' && span > 1 ? `${s} / span ${span}` : start != null ? s : null;\n }\n}\n","/**\n * @mk-kit/ui/layout — layout primitives: `mk-stack`, `mk-flex`, `mk-grid`\n * and the `mkFlexItem` / `mkGridItem` child directives. Every spacing and\n * track input accepts a per-breakpoint map resolved by `MkBreakpointService`.\n */\nexport * from './space';\nexport * from './flex-base';\nexport * from './stack';\nexport * from './flex';\nexport * from './flex-item';\nexport * from './grid';\nexport * from './grid-item';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}