@santi020k/lumen 0.4.0 → 1.0.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,180 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readdir, readFile, stat } from 'node:fs/promises';
3
+ import { extname, join, relative, resolve } from 'node:path';
4
+ import { lumenComponentBehavior, lumenStylingContracts } from '@santi020k/lumen-core';
5
+ const sourceExtensions = new Set(['.astro', '.css', '.js', '.jsx', '.mjs', '.ts', '.tsx']);
6
+ const ignoredDirectories = new Set(['.git', '.next', '.turbo', 'coverage', 'dist', 'node_modules']);
7
+ const publicRootSlots = new Set(Object.values(lumenStylingContracts).flatMap(contract => [contract.rootSlot, ...contract.parts]));
8
+ const findSourceFiles = async (root) => {
9
+ const files = [];
10
+ const visit = async (directory) => {
11
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
12
+ if (ignoredDirectories.has(entry.name))
13
+ continue;
14
+ const path = join(directory, entry.name);
15
+ if (entry.isDirectory())
16
+ await visit(path);
17
+ else if (sourceExtensions.has(extname(entry.name)))
18
+ files.push(path);
19
+ }
20
+ };
21
+ await visit(root);
22
+ return files;
23
+ };
24
+ const importedNames = (source, packageName) => {
25
+ const names = [];
26
+ const pattern = new RegExp(`import\\s*\\{([\\s\\S]*?)\\}\\s*from\\s*['"]${packageName}['"]`, 'g');
27
+ for (const match of source.matchAll(pattern)) {
28
+ for (const entry of (match[1] ?? '').split(',')) {
29
+ const name = entry.trim().split(/\s+as\s+/u)[0];
30
+ if (name)
31
+ names.push(name);
32
+ }
33
+ }
34
+ return names;
35
+ };
36
+ const finding = (file, rule, message, remediation, severity = 'error') => ({ file, message, remediation, rule, severity });
37
+ const getFrameworks = (joined) => [
38
+ joined.includes('@santi020k/lumen-astro') && 'astro',
39
+ joined.includes('@santi020k/lumen-elements') && 'elements',
40
+ joined.includes('@santi020k/lumen-react') && 'react'
41
+ ].filter((value) => Boolean(value));
42
+ const collectCompatibilityFindings = (root, sources) => sources.flatMap(item => {
43
+ const file = relative(root, item.file);
44
+ const findings = [];
45
+ if (/surface\s*=\s*["']glass["']/u.test(item.source)) {
46
+ findings.push(finding(file, 'deprecated-surface-glass', 'The surface="glass" compatibility alias is deprecated.', 'Replace it with the glass prop or attribute.', 'advisory'));
47
+ }
48
+ if (item.source.includes('ui:datatable-selection-change')) {
49
+ findings.push(finding(file, 'deprecated-datatable-event', 'The ui:datatable-selection-change event alias is deprecated.', 'Rename it to ui:data-table-selection-change.', 'advisory'));
50
+ }
51
+ return findings;
52
+ });
53
+ const getCatalogFingerprint = (sources) => {
54
+ const names = [...new Set(sources.flatMap(item => [
55
+ ...importedNames(item.source, '@santi020k/lumen-astro'),
56
+ ...importedNames(item.source, '@santi020k/lumen-react')
57
+ ]))]
58
+ .filter(name => name in lumenComponentBehavior)
59
+ .sort();
60
+ const contracts = names.map(name => [name, lumenComponentBehavior[name]]);
61
+ return createHash('sha256').update(JSON.stringify(contracts)).digest('hex');
62
+ };
63
+ const collectRuntimeFindings = (root, sources, runtimeComponents) => {
64
+ const imports = sources.flatMap(item => importedNames(item.source, '@santi020k/lumen-astro').map(name => ({ file: item.file, name })));
65
+ const mounts = sources.filter(item => /<UIPrimitives(?:\s|\/|>)/u.test(item.source));
66
+ const findings = [];
67
+ if (runtimeComponents.length > 0 && mounts.length === 0) {
68
+ findings.push(finding(imports[0] ? relative(root, imports[0].file) : 'package.json', 'astro-runtime-missing', `Interactive Astro imports require UIPrimitives: ${runtimeComponents.join(', ')}.`, 'Mount <UIPrimitives /> once in the root layout.'));
69
+ }
70
+ for (const mount of mounts.slice(1)) {
71
+ findings.push(finding(relative(root, mount.file), 'astro-runtime-duplicate', 'UIPrimitives is mounted more than once.', 'Keep one mount in the application root layout.'));
72
+ }
73
+ return findings;
74
+ };
75
+ const collectCssFindings = (root, sources) => sources.filter(item => item.file.endsWith('.css')).flatMap(item => {
76
+ const layerIndex = item.source.indexOf('/layers.css');
77
+ const tailwindIndex = item.source.indexOf('tailwindcss');
78
+ const styleIndex = item.source.indexOf('/styles.css');
79
+ const findings = [];
80
+ if (tailwindIndex >= 0 &&
81
+ (layerIndex < 0 || styleIndex < 0 || !(layerIndex < tailwindIndex && tailwindIndex < styleIndex))) {
82
+ findings.push(finding(relative(root, item.file), 'tailwind-layer-order', 'Tailwind and Lumen imports do not use the verified cascade order.', 'Import Lumen layers.css, then tailwindcss, then the matching Lumen styles.css.'));
83
+ }
84
+ for (const match of item.source.matchAll(/\.ui-([a-z0-9-]+)/g)) {
85
+ const selector = match[1] ?? '';
86
+ if (!publicRootSlots.has(selector)) {
87
+ findings.push(finding(relative(root, item.file), 'internal-selector', `Selector .ui-${selector} is not a documented stable root hook.`, 'Prefer component props, semantic tokens, documented custom properties, or [data-slot].', 'advisory'));
88
+ }
89
+ }
90
+ return findings;
91
+ });
92
+ const styleImportByFramework = {
93
+ astro: '@santi020k/lumen-astro/styles.css',
94
+ elements: '@santi020k/lumen-elements/styles.css',
95
+ react: '@santi020k/lumen-react/styles.css'
96
+ };
97
+ const collectFrameworkStyleFindings = (root, sources, frameworks) => frameworks.flatMap(framework => {
98
+ const references = sources.filter(item => item.source.includes(styleImportByFramework[framework]));
99
+ if (references.length === 0) {
100
+ return [finding('styles', 'framework-style-missing', `No ${styleImportByFramework[framework]} import was found.`, 'Load the matching adapter stylesheet once in the application root.')];
101
+ }
102
+ return references.slice(1).map(item => finding(relative(root, item.file), 'framework-style-duplicate', `The ${framework} stylesheet is loaded more than once.`, 'Keep one stylesheet import in the application root.'));
103
+ });
104
+ const collectAdapterMismatchFindings = (joined, frameworks) => {
105
+ const adapters = [...joined.matchAll(/@santi020k\/lumen-(astro|elements|react)\/styles\.css/g)]
106
+ .map(match => match[1])
107
+ .filter((adapter) => adapter === 'astro' || adapter === 'elements' || adapter === 'react');
108
+ return [...new Set(adapters)]
109
+ .filter(adapter => !frameworks.includes(adapter))
110
+ .map(adapter => finding('styles', 'adapter-style-mismatch', `The ${adapter} stylesheet is loaded without matching ${adapter} imports.`, 'Load the stylesheet from the adapter used by this application boundary.'));
111
+ };
112
+ export const inspectLumenIntegration = async (repository) => {
113
+ const root = resolve(repository);
114
+ if (!(await stat(root)).isDirectory())
115
+ throw new Error(`Not a directory: ${root}`);
116
+ const files = await findSourceFiles(root);
117
+ const sources = await Promise.all(files.map(async (file) => ({ file, source: await readFile(file, 'utf8') })));
118
+ const joined = sources.map(item => item.source).join('\n');
119
+ const frameworks = getFrameworks(joined);
120
+ const astroNames = sources.flatMap(item => importedNames(item.source, '@santi020k/lumen-astro'));
121
+ const runtimeComponents = [...new Set(astroNames.filter(name => name in lumenComponentBehavior &&
122
+ lumenComponentBehavior[name].astro === 'ui-primitives'))];
123
+ const findings = [
124
+ ...collectCompatibilityFindings(root, sources),
125
+ ...collectRuntimeFindings(root, sources, runtimeComponents),
126
+ ...collectCssFindings(root, sources),
127
+ ...collectFrameworkStyleFindings(root, sources, frameworks),
128
+ ...collectAdapterMismatchFindings(joined, frameworks)
129
+ ];
130
+ return {
131
+ catalogFingerprint: getCatalogFingerprint(sources),
132
+ findings,
133
+ frameworks,
134
+ generatedAt: new Date().toISOString(),
135
+ healthy: findings.every(item => item.severity !== 'error'),
136
+ repository: root,
137
+ runtimeComponents
138
+ };
139
+ };
140
+ export const formatLumenDiagnostics = (report) => {
141
+ const heading = report.healthy ? 'Lumen integration is healthy.' : 'Lumen integration has blocking findings.';
142
+ if (report.findings.length === 0)
143
+ return heading;
144
+ return [
145
+ heading,
146
+ ...report.findings.map(item => `[${item.severity}] ${item.file} ${item.rule}: ${item.message} ${item.remediation}`)
147
+ ].join('\n');
148
+ };
149
+ export const createLumenSetup = (framework, tailwind = false) => {
150
+ const setupByFramework = {
151
+ astro: {
152
+ styles: '@import "@santi020k/lumen-astro/styles.css";',
153
+ tailwind: '@import "@santi020k/lumen-astro/layers.css";\n' +
154
+ '@import "tailwindcss";\n' +
155
+ '@import "@santi020k/lumen-astro/styles.css";'
156
+ },
157
+ elements: {
158
+ styles: '@import "@santi020k/lumen-elements/styles.css";',
159
+ tailwind: '@import "@santi020k/lumen-elements/layers.css";\n' +
160
+ '@import "tailwindcss";\n' +
161
+ '@import "@santi020k/lumen-elements/styles.css";'
162
+ },
163
+ react: {
164
+ styles: '@import "@santi020k/lumen-react/styles.css";',
165
+ tailwind: '@import "@santi020k/lumen-react/layers.css";\n' +
166
+ '@import "tailwindcss";\n' +
167
+ '@import "@santi020k/lumen-react/styles.css";'
168
+ }
169
+ };
170
+ const styles = tailwind ? setupByFramework[framework].tailwind : setupByFramework[framework].styles;
171
+ if (framework === 'astro') {
172
+ return `${styles}\n\n---\nimport { UIPrimitives } from '@santi020k/lumen-astro'\n---\n\n<UIPrimitives />`;
173
+ }
174
+ if (framework === 'elements') {
175
+ return `${styles}\n\n` +
176
+ 'import { defineLumenElements } from \'@santi020k/lumen-elements/define\'\n\n' +
177
+ 'defineLumenElements()';
178
+ }
179
+ return styles;
180
+ };
@@ -31,6 +31,42 @@ export declare const lumenRegistry: {
31
31
  readonly name: "data-visualization";
32
32
  readonly type: "recipe";
33
33
  readonly components: readonly ["Chart", "Sparkline", "BarChart", "LineChart", "PieChart", "Stat", "Meter"];
34
+ }, {
35
+ readonly name: "analytics-dashboard";
36
+ readonly type: "recipe";
37
+ readonly components: readonly ["Sidebar", "Stat", "Sparkline", "LineChart", "BarChart", "DateRangePicker", "Table", "Badge"];
38
+ }, {
39
+ readonly name: "saas-admin";
40
+ readonly type: "recipe";
41
+ readonly components: readonly ["Sidebar", "Stat", "Sparkline", "Alert", "Progress", "SearchField", "Table", "Badge"];
42
+ }, {
43
+ readonly name: "commerce-dashboard";
44
+ readonly type: "recipe";
45
+ readonly components: readonly ["Sidebar", "Stat", "Sparkline", "BarChart", "PieChart", "Progress", "Table", "Badge"];
46
+ }, {
47
+ readonly name: "project-workspace";
48
+ readonly type: "recipe";
49
+ readonly components: readonly ["Sidebar", "Stat", "Sparkline", "Progress", "Timeline", "Avatar", "Table", "Badge"];
50
+ }, {
51
+ readonly name: "auth-onboarding";
52
+ readonly type: "recipe";
53
+ readonly components: readonly ["Card", "Stepper", "Field", "Label", "Input", "Alert", "Checkbox", "Progress", "Button"];
54
+ }, {
55
+ readonly name: "docs-shell";
56
+ readonly type: "recipe";
57
+ readonly components: readonly ["SkipLink", "NavigationMenu", "ThemeToggle", "Sidebar", "Sheet", "Prose", "Pagination", "Code", "CodeTabs"];
58
+ }, {
59
+ readonly name: "marketing-shell";
60
+ readonly type: "recipe";
61
+ readonly components: readonly ["SkipLink", "NavigationMenu", "ButtonLink", "Card", "ScrollReveal", "BackToTop"];
62
+ }, {
63
+ readonly name: "dashboard-shell";
64
+ readonly type: "recipe";
65
+ readonly components: readonly ["NavigationMenu", "Sidebar", "Card", "Stat", "StatTrend", "Badge", "SearchField", "DateRangePicker", "Empty", "Table", "Chart"];
66
+ }, {
67
+ readonly name: "validated-form";
68
+ readonly type: "recipe";
69
+ readonly components: readonly ["Form", "Field", "FieldError", "Label", "Input", "NativeSelect", "Textarea", "Button"];
34
70
  }, {
35
71
  readonly name: "ai-docs";
36
72
  readonly type: "documentation";
@@ -166,6 +202,41 @@ export declare const lumenRegistry: {
166
202
  readonly category: "Layout";
167
203
  readonly files: readonly ["packages/astro/components/Card.astro", "packages/astro/styles/lumen.css"];
168
204
  readonly dependencies: readonly ["styles"];
205
+ }, {
206
+ readonly name: "CardContent";
207
+ readonly type: "component";
208
+ readonly description: "Provides the main content region inside a card.";
209
+ readonly category: "Layout";
210
+ readonly files: readonly ["packages/astro/components/CardContent.astro", "packages/astro/styles/lumen.css"];
211
+ readonly dependencies: readonly ["Card", "styles"];
212
+ }, {
213
+ readonly name: "CardDescription";
214
+ readonly type: "component";
215
+ readonly description: "Adds supporting copy to a card header.";
216
+ readonly category: "Layout";
217
+ readonly files: readonly ["packages/astro/components/CardDescription.astro", "packages/astro/styles/lumen.css"];
218
+ readonly dependencies: readonly ["Card", "styles"];
219
+ }, {
220
+ readonly name: "CardFooter";
221
+ readonly type: "component";
222
+ readonly description: "Groups actions at the end of a card.";
223
+ readonly category: "Layout";
224
+ readonly files: readonly ["packages/astro/components/CardFooter.astro", "packages/astro/styles/lumen.css"];
225
+ readonly dependencies: readonly ["Card", "styles"];
226
+ }, {
227
+ readonly name: "CardHeader";
228
+ readonly type: "component";
229
+ readonly description: "Groups introductory content at the start of a card.";
230
+ readonly category: "Layout";
231
+ readonly files: readonly ["packages/astro/components/CardHeader.astro", "packages/astro/styles/lumen.css"];
232
+ readonly dependencies: readonly ["Card", "styles"];
233
+ }, {
234
+ readonly name: "CardTitle";
235
+ readonly type: "component";
236
+ readonly description: "Provides a semantic card title with a stable styling hook.";
237
+ readonly category: "Layout";
238
+ readonly files: readonly ["packages/astro/components/CardTitle.astro", "packages/astro/styles/lumen.css"];
239
+ readonly dependencies: readonly ["Card", "styles"];
169
240
  }, {
170
241
  readonly name: "Carousel";
171
242
  readonly type: "component";
@@ -187,6 +258,13 @@ export declare const lumenRegistry: {
187
258
  readonly category: "Forms";
188
259
  readonly files: readonly ["packages/astro/components/Checkbox.astro", "packages/astro/styles/lumen.css"];
189
260
  readonly dependencies: readonly ["styles"];
261
+ }, {
262
+ readonly name: "CheckboxGroup";
263
+ readonly type: "component";
264
+ readonly description: "Groups related checkbox choices under one legend.";
265
+ readonly category: "Forms";
266
+ readonly files: readonly ["packages/astro/components/CheckboxGroup.astro", "packages/astro/styles/lumen.css"];
267
+ readonly dependencies: readonly ["Checkbox", "styles"];
190
268
  }, {
191
269
  readonly name: "Collapsible";
192
270
  readonly type: "component";
@@ -215,6 +293,20 @@ export declare const lumenRegistry: {
215
293
  readonly category: "Forms";
216
294
  readonly files: readonly ["packages/astro/components/Combobox.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
217
295
  readonly dependencies: readonly ["styles", "runtime"];
296
+ }, {
297
+ readonly name: "Container";
298
+ readonly type: "component";
299
+ readonly description: "Centers page content within responsive gutters and a maximum width.";
300
+ readonly category: "Layout";
301
+ readonly files: readonly ["packages/astro/components/Container.astro", "packages/astro/styles/lumen.css"];
302
+ readonly dependencies: readonly ["styles"];
303
+ }, {
304
+ readonly name: "CopyButton";
305
+ readonly type: "component";
306
+ readonly description: "Copies arbitrary text or the content of another element with accessible feedback.";
307
+ readonly category: "Actions";
308
+ readonly files: readonly ["packages/astro/components/CopyButton.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
309
+ readonly dependencies: readonly ["styles", "runtime"];
218
310
  }, {
219
311
  readonly name: "Command";
220
312
  readonly type: "component";
@@ -292,6 +384,13 @@ export declare const lumenRegistry: {
292
384
  readonly category: "Feedback";
293
385
  readonly files: readonly ["packages/astro/components/Empty.astro", "packages/astro/styles/lumen.css"];
294
386
  readonly dependencies: readonly ["styles"];
387
+ }, {
388
+ readonly name: "ErrorSummary";
389
+ readonly type: "component";
390
+ readonly description: "Summarizes form errors and links people back to invalid controls.";
391
+ readonly category: "Forms";
392
+ readonly files: readonly ["packages/astro/components/ErrorSummary.astro", "packages/astro/styles/lumen.css"];
393
+ readonly dependencies: readonly ["styles"];
295
394
  }, {
296
395
  readonly name: "Eyebrow";
297
396
  readonly type: "component";
@@ -306,6 +405,13 @@ export declare const lumenRegistry: {
306
405
  readonly category: "Forms";
307
406
  readonly files: readonly ["packages/astro/components/Input.astro", "packages/astro/components/Label.astro", "packages/astro/components/Field.astro", "packages/astro/styles/lumen.css"];
308
407
  readonly dependencies: readonly ["Input", "Label", "styles"];
408
+ }, {
409
+ readonly name: "FieldError";
410
+ readonly type: "component";
411
+ readonly description: "Displays an error connected to a form control.";
412
+ readonly category: "Forms";
413
+ readonly files: readonly ["packages/astro/components/FieldError.astro", "packages/astro/styles/lumen.css"];
414
+ readonly dependencies: readonly ["Field", "styles"];
309
415
  }, {
310
416
  readonly name: "FloatingBadge";
311
417
  readonly type: "component";
@@ -313,6 +419,13 @@ export declare const lumenRegistry: {
313
419
  readonly category: "Data display";
314
420
  readonly files: readonly ["packages/astro/components/FloatingBadge.astro", "packages/astro/styles/lumen.css"];
315
421
  readonly dependencies: readonly ["styles"];
422
+ }, {
423
+ readonly name: "Form";
424
+ readonly type: "component";
425
+ readonly description: "Adds consistent validation and submission state to a native form.";
426
+ readonly category: "Forms";
427
+ readonly files: readonly ["packages/astro/components/Form.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
428
+ readonly dependencies: readonly ["styles", "runtime"];
316
429
  }, {
317
430
  readonly name: "FormattedDate";
318
431
  readonly type: "component";
@@ -397,6 +510,13 @@ export declare const lumenRegistry: {
397
510
  readonly category: "Data display";
398
511
  readonly files: readonly ["packages/astro/components/LineChart.astro", "packages/astro/components/Chart.astro", "packages/astro/styles/lumen.css"];
399
512
  readonly dependencies: readonly ["Chart", "styles"];
513
+ }, {
514
+ readonly name: "ListBox";
515
+ readonly type: "component";
516
+ readonly description: "Presents a visible single- or multi-select option list.";
517
+ readonly category: "Forms";
518
+ readonly files: readonly ["packages/astro/components/ListBox.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
519
+ readonly dependencies: readonly ["styles", "runtime"];
400
520
  }, {
401
521
  readonly name: "Marker";
402
522
  readonly type: "component";
@@ -453,6 +573,13 @@ export declare const lumenRegistry: {
453
573
  readonly category: "Navigation";
454
574
  readonly files: readonly ["packages/astro/components/Pagination.astro", "packages/astro/styles/lumen.css"];
455
575
  readonly dependencies: readonly ["styles"];
576
+ }, {
577
+ readonly name: "PasswordField";
578
+ readonly type: "component";
579
+ readonly description: "Combines a password input with guidance, errors, and a visibility toggle.";
580
+ readonly category: "Forms";
581
+ readonly files: readonly ["packages/astro/components/PasswordField.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
582
+ readonly dependencies: readonly ["Button", "Field", "FieldError", "Input", "Label", "styles", "runtime"];
456
583
  }, {
457
584
  readonly name: "PhoneInput";
458
585
  readonly type: "component";
@@ -486,8 +613,8 @@ export declare const lumenRegistry: {
486
613
  readonly type: "component";
487
614
  readonly description: "Shows completion, loading progress, or quota usage.";
488
615
  readonly category: "Feedback";
489
- readonly files: readonly ["packages/astro/components/Progress.astro", "packages/astro/styles/lumen.css"];
490
- readonly dependencies: readonly ["styles"];
616
+ readonly files: readonly ["packages/astro/components/Progress.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
617
+ readonly dependencies: readonly ["styles", "runtime"];
491
618
  }, {
492
619
  readonly name: "Prose";
493
620
  readonly type: "component";
@@ -765,6 +892,48 @@ export declare const lumenRegistry: {
765
892
  readonly category: "Data display";
766
893
  readonly description: "A stat component.";
767
894
  readonly files: readonly ["packages/astro/components/Stat.astro", "packages/react/src/components.tsx"];
895
+ }, {
896
+ readonly name: "StatDescription";
897
+ readonly type: "component";
898
+ readonly description: "Adds supporting context to a composed statistic.";
899
+ readonly category: "Data display";
900
+ readonly files: readonly ["packages/astro/components/StatDescription.astro", "packages/astro/styles/lumen.css"];
901
+ readonly dependencies: readonly ["Stat", "styles"];
902
+ }, {
903
+ readonly name: "StatIcon";
904
+ readonly type: "component";
905
+ readonly description: "Provides an icon region for a composed statistic.";
906
+ readonly category: "Data display";
907
+ readonly files: readonly ["packages/astro/components/StatIcon.astro", "packages/astro/styles/lumen.css"];
908
+ readonly dependencies: readonly ["Stat", "styles"];
909
+ }, {
910
+ readonly name: "StatLabel";
911
+ readonly type: "component";
912
+ readonly description: "Labels a composed statistic.";
913
+ readonly category: "Data display";
914
+ readonly files: readonly ["packages/astro/components/StatLabel.astro", "packages/astro/styles/lumen.css"];
915
+ readonly dependencies: readonly ["Stat", "styles"];
916
+ }, {
917
+ readonly name: "StatTrend";
918
+ readonly type: "component";
919
+ readonly description: "Communicates a metric delta with a semantic tone.";
920
+ readonly category: "Data display";
921
+ readonly files: readonly ["packages/astro/components/StatTrend.astro", "packages/astro/styles/lumen.css"];
922
+ readonly dependencies: readonly ["Stat", "styles"];
923
+ }, {
924
+ readonly name: "StatValue";
925
+ readonly type: "component";
926
+ readonly description: "Displays the prominent value in a composed statistic.";
927
+ readonly category: "Data display";
928
+ readonly files: readonly ["packages/astro/components/StatValue.astro", "packages/astro/styles/lumen.css"];
929
+ readonly dependencies: readonly ["Stat", "styles"];
930
+ }, {
931
+ readonly name: "Stack";
932
+ readonly type: "component";
933
+ readonly description: "Arranges children with tokenized direction, spacing, and alignment.";
934
+ readonly category: "Layout";
935
+ readonly files: readonly ["packages/astro/components/Stack.astro", "packages/astro/styles/lumen.css"];
936
+ readonly dependencies: readonly ["styles"];
768
937
  }, {
769
938
  readonly name: "Meter";
770
939
  readonly type: "component";
@@ -915,6 +1084,20 @@ export declare const lumenRegistry: {
915
1084
  readonly category: "Navigation";
916
1085
  readonly description: "A floating action button with expandable sub-actions.";
917
1086
  readonly files: readonly ["packages/astro/components/SpeedDial.astro", "packages/react/src/components.tsx"];
1087
+ }, {
1088
+ readonly name: "Grid";
1089
+ readonly type: "component";
1090
+ readonly category: "Layout";
1091
+ readonly description: "Arranges content in fixed or responsive tokenized columns.";
1092
+ readonly files: readonly ["packages/astro/components/Grid.astro", "packages/astro/styles/lumen.css"];
1093
+ readonly dependencies: readonly ["styles"];
1094
+ }, {
1095
+ readonly name: "VisuallyHidden";
1096
+ readonly type: "component";
1097
+ readonly category: "Layout";
1098
+ readonly description: "Keeps meaningful content available to assistive technology without displaying it.";
1099
+ readonly files: readonly ["packages/astro/components/VisuallyHidden.astro", "packages/astro/styles/lumen.css"];
1100
+ readonly dependencies: readonly ["styles"];
918
1101
  }];
919
1102
  };
920
1103
  //# sourceMappingURL=registry-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-data.d.ts","sourceRoot":"","sources":["../src/registry-data.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkyDQ,CAAA"}
1
+ {"version":3,"file":"registry-data.d.ts","sourceRoot":"","sources":["../src/registry-data.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+sEQ,CAAA"}