@santi020k/lumen 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,18 @@ umbrella package only when you want the framework-neutral CLI or registry APIs:
15
15
  pnpm add @santi020k/lumen
16
16
  ```
17
17
 
18
+ ## Typography
19
+
20
+ Lumen defaults `--ui-font` to the canonical Santi020k Montserrat family stack:
21
+
22
+ ```css
23
+ --ui-font: "Montserrat", "Avenir Next", "Segoe UI", sans-serif;
24
+ ```
25
+
26
+ The package declares the family but does not bundle or load font files. Applications should load
27
+ Montserrat once through their preferred delivery path, or override `--ui-font` when using another
28
+ typeface.
29
+
18
30
  The umbrella package also exposes typed registry metadata and the `lumen` CLI:
19
31
 
20
32
  ```bash
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { type ConsumerInventory, type ConsumerReference, type ConsumerRolloutOptions, type ConsumerRolloutReport, formatConsumerRollout, inspectLumenConsumer, type LumenFramework, runConsumerRollout, updateLumenManifestSource, updateLumenWorkspaceSource } from './consumer-rollout.js';
2
2
  export { addLumenRegistryItem, getLumenRegistryEntries, getLumenRegistryItem, loadLumenRegistry, type LumenAddOptions, type LumenAddResult, type LumenAddTarget, type LumenMergeConflict, type LumenRegistry, lumenRegistry, type LumenRegistryComponent, type LumenRegistryEntry, type LumenRegistryFile, type LumenRegistryItem, type LumenRegistryLoadOptions } from './registry.js';
3
- export { applyDataViewState, canPlaceScheduleEvent, coerceThemeBuilderExportFormat, coerceThemeBuilderMode, coerceThemeBuilderScheme, composeClassName, createDataViewRequestUrl, createDataViewSearchParams, createDataViewServerRequest, createDataViewState, createDataViewStorageKey, createScheduleSlots, createScheduleStorageKey, createThemeBuilderTokens, createThemePalette, expandRecurringScheduleEvent, exportThemeBuilderCss, exportThemeBuilderValue, exportThemeCss, filterDataRecords, getContrastRatio, getScheduleConflicts, getVirtualRange, loadDataViewState, loadScheduleEvents, type LumenCodeToken, lumenCodeTokenClassNames, type LumenCodeTokenKind, lumenColors, type LumenColorTokenName, lumenColorTokenNames, type LumenComponentName, lumenComponentNames, type LumenContrastScore, lumenDarkTheme, type LumenDataRecord, type LumenDataViewServerRequest, type LumenDataViewState, lumenGlass, type LumenGlassColorTokenName, lumenGlassColorTokenNames, type LumenGlassEffectTokenName, lumenGlassEffectTokenNames, type LumenGlassTokenName, lumenGlassTokenNames, type LumenKeyValueReader, type LumenKeyValueStorage, type LumenKeyValueWriter, lumenLightTheme, lumenPackages, type LumenPackageTarget, type LumenScheduleConflict, type LumenScheduleEvent, type LumenScheduleKeyValueReader, type LumenScheduleKeyValueStorage, type LumenScheduleKeyValueWriter, type LumenScheduleResizeEdge, type LumenScheduleResizeOptions, type LumenScheduleResource, type LumenScheduleSlot, type LumenSemanticColorTokenName, lumenSemanticColorTokenNames, type LumenSortDirection, lumenThemeAttribute, type LumenThemeBuilderExportFormat, type LumenThemeBuilderMode, type LumenThemeBuilderOptions, type LumenThemeBuilderResult, type LumenThemeBuilderScheme, type LumenThemeContrastSuggestion, type LumenThemeTokens, lumenTokenNames, mergeThemeTokens, moveScheduleEvent, normalizeLumenCode, normalizeThemeBuilderHex, normalizeThemeBuilderHue, paginateDataRecords, parseDataViewState, parseScheduleEvents, parseThemeCss, pinDataViewColumn, renderLumenCodeHtml, resizeScheduleEvent, resizeScheduleEvents, saveDataViewState, saveScheduleEvents, scheduleEventsOverlap, scoreThemeContrast, serializeDataViewState, serializeScheduleEvents, sortDataRecords, suggestReadableInk, themeBuilderHexToHsl, toggleDataViewSelection, tokenizeLumenCode, tuneThemeContrast, unpinDataViewColumn } from '@santi020k/lumen-core';
3
+ export { alignLumenChartSeries, applyDataViewState, canPlaceScheduleEvent, coerceThemeBuilderExportFormat, coerceThemeBuilderMode, coerceThemeBuilderScheme, composeClassName, createDataViewRequestUrl, createDataViewSearchParams, createDataViewServerRequest, createDataViewState, createDataViewStorageKey, createLumenBarGeometry, createLumenLineGeometry, createLumenPieGeometry, createScheduleSlots, createScheduleStorageKey, createThemeBuilderTokens, createThemePalette, expandRecurringScheduleEvent, exportThemeBuilderCss, exportThemeBuilderValue, exportThemeCss, filterDataRecords, getContrastRatio, getLumenChartCategories, getLumenChartDomain, getLumenChartTicks, getLumenChartValueRatio, getScheduleConflicts, getVirtualRange, hasLumenPieData, loadDataViewState, loadScheduleEvents, type LumenBarChartLayout, type LumenBarGeometry, type LumenBarGeometryCategory, type LumenBarGeometryMark, type LumenBarGeometryOptions, lumenChart, type LumenChartDatum, type LumenChartDomain, type LumenChartGeometryPoint, type LumenChartOrientation, type LumenChartSeries, type LumenChartTone, lumenChartTones, type LumenCodeToken, lumenCodeTokenClassNames, type LumenCodeTokenKind, lumenColors, type LumenColorTokenName, lumenColorTokenNames, type LumenComponentName, lumenComponentNames, type LumenContrastScore, lumenDarkTheme, type LumenDataRecord, type LumenDataViewServerRequest, type LumenDataViewState, lumenGlass, type LumenGlassColorTokenName, lumenGlassColorTokenNames, type LumenGlassEffectTokenName, lumenGlassEffectTokenNames, type LumenGlassTokenName, lumenGlassTokenNames, type LumenKeyValueReader, type LumenKeyValueStorage, type LumenKeyValueWriter, lumenLightTheme, type LumenLineGeometry, type LumenLineGeometryOptions, lumenPackages, type LumenPackageTarget, type LumenPieChartVariant, type LumenPieGeometry, type LumenPieGeometryOptions, type LumenPieGeometrySlice, type LumenScheduleConflict, type LumenScheduleEvent, type LumenScheduleKeyValueReader, type LumenScheduleKeyValueStorage, type LumenScheduleKeyValueWriter, type LumenScheduleResizeEdge, type LumenScheduleResizeOptions, type LumenScheduleResource, type LumenScheduleSlot, type LumenSemanticColorTokenName, lumenSemanticColorTokenNames, type LumenSortDirection, lumenThemeAttribute, type LumenThemeBuilderExportFormat, type LumenThemeBuilderMode, type LumenThemeBuilderOptions, type LumenThemeBuilderResult, type LumenThemeBuilderScheme, type LumenThemeContrastSuggestion, type LumenThemeTokens, lumenTokenNames, mergeThemeTokens, moveScheduleEvent, normalizeLumenCode, normalizeThemeBuilderHex, normalizeThemeBuilderHue, paginateDataRecords, parseDataViewState, parseScheduleEvents, parseThemeCss, pinDataViewColumn, renderLumenCodeHtml, resizeScheduleEvent, resizeScheduleEvents, resolveLumenChartTone, saveDataViewState, saveScheduleEvents, scaleLumenChartValue, scheduleEventsOverlap, scoreThemeContrast, serializeDataViewState, serializeScheduleEvents, sortDataRecords, suggestReadableInk, themeBuilderHexToHsl, toggleDataViewSelection, tokenizeLumenCode, tuneThemeContrast, unpinDataViewColumn } from '@santi020k/lumen-core';
4
4
  export declare const lumen: {
5
5
  readonly name: "Lumen";
6
6
  readonly packageName: "@santi020k/lumen";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,cAAc,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,aAAa,EACb,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,8BAA8B,EAC9B,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,EAC5B,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,cAAc,EACnB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,WAAW,EACX,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,UAAU,EACV,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,eAAe,EACf,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,uBAAuB,CAAA;AAE9B,eAAO,MAAM,KAAK;;;;CAIR,CAAA;AAEV,OAAO,EACL,kBAAkB,EAClB,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { formatConsumerRollout, inspectLumenConsumer, runConsumerRollout, updateLumenManifestSource, updateLumenWorkspaceSource } from './consumer-rollout.js';
2
2
  export { addLumenRegistryItem, getLumenRegistryEntries, getLumenRegistryItem, loadLumenRegistry, lumenRegistry } from './registry.js';
3
- export { applyDataViewState, canPlaceScheduleEvent, coerceThemeBuilderExportFormat, coerceThemeBuilderMode, coerceThemeBuilderScheme, composeClassName, createDataViewRequestUrl, createDataViewSearchParams, createDataViewServerRequest, createDataViewState, createDataViewStorageKey, createScheduleSlots, createScheduleStorageKey, createThemeBuilderTokens, createThemePalette, expandRecurringScheduleEvent, exportThemeBuilderCss, exportThemeBuilderValue, exportThemeCss, filterDataRecords, getContrastRatio, getScheduleConflicts, getVirtualRange, loadDataViewState, loadScheduleEvents, lumenCodeTokenClassNames, lumenColors, lumenColorTokenNames, lumenComponentNames, lumenDarkTheme, lumenGlass, lumenGlassColorTokenNames, lumenGlassEffectTokenNames, lumenGlassTokenNames, lumenLightTheme, lumenPackages, lumenSemanticColorTokenNames, lumenThemeAttribute, lumenTokenNames, mergeThemeTokens, moveScheduleEvent, normalizeLumenCode, normalizeThemeBuilderHex, normalizeThemeBuilderHue, paginateDataRecords, parseDataViewState, parseScheduleEvents, parseThemeCss, pinDataViewColumn, renderLumenCodeHtml, resizeScheduleEvent, resizeScheduleEvents, saveDataViewState, saveScheduleEvents, scheduleEventsOverlap, scoreThemeContrast, serializeDataViewState, serializeScheduleEvents, sortDataRecords, suggestReadableInk, themeBuilderHexToHsl, toggleDataViewSelection, tokenizeLumenCode, tuneThemeContrast, unpinDataViewColumn } from '@santi020k/lumen-core';
3
+ export { alignLumenChartSeries, applyDataViewState, canPlaceScheduleEvent, coerceThemeBuilderExportFormat, coerceThemeBuilderMode, coerceThemeBuilderScheme, composeClassName, createDataViewRequestUrl, createDataViewSearchParams, createDataViewServerRequest, createDataViewState, createDataViewStorageKey, createLumenBarGeometry, createLumenLineGeometry, createLumenPieGeometry, createScheduleSlots, createScheduleStorageKey, createThemeBuilderTokens, createThemePalette, expandRecurringScheduleEvent, exportThemeBuilderCss, exportThemeBuilderValue, exportThemeCss, filterDataRecords, getContrastRatio, getLumenChartCategories, getLumenChartDomain, getLumenChartTicks, getLumenChartValueRatio, getScheduleConflicts, getVirtualRange, hasLumenPieData, loadDataViewState, loadScheduleEvents, lumenChart, lumenChartTones, lumenCodeTokenClassNames, lumenColors, lumenColorTokenNames, lumenComponentNames, lumenDarkTheme, lumenGlass, lumenGlassColorTokenNames, lumenGlassEffectTokenNames, lumenGlassTokenNames, lumenLightTheme, lumenPackages, lumenSemanticColorTokenNames, lumenThemeAttribute, lumenTokenNames, mergeThemeTokens, moveScheduleEvent, normalizeLumenCode, normalizeThemeBuilderHex, normalizeThemeBuilderHue, paginateDataRecords, parseDataViewState, parseScheduleEvents, parseThemeCss, pinDataViewColumn, renderLumenCodeHtml, resizeScheduleEvent, resizeScheduleEvents, resolveLumenChartTone, saveDataViewState, saveScheduleEvents, scaleLumenChartValue, scheduleEventsOverlap, scoreThemeContrast, serializeDataViewState, serializeScheduleEvents, sortDataRecords, suggestReadableInk, themeBuilderHexToHsl, toggleDataViewSelection, tokenizeLumenCode, tuneThemeContrast, unpinDataViewColumn } from '@santi020k/lumen-core';
4
4
  export const lumen = {
5
5
  name: 'Lumen',
6
6
  packageName: '@santi020k/lumen',
@@ -27,6 +27,10 @@ export declare const lumenRegistry: {
27
27
  readonly name: "rich-text-editor";
28
28
  readonly type: "recipe";
29
29
  readonly components: readonly ["RichTextEditor", "ButtonGroup", "ToggleGroup", "Textarea"];
30
+ }, {
31
+ readonly name: "data-visualization";
32
+ readonly type: "recipe";
33
+ readonly components: readonly ["Chart", "Sparkline", "BarChart", "LineChart", "PieChart", "Stat", "Meter"];
30
34
  }, {
31
35
  readonly name: "ai-docs";
32
36
  readonly type: "documentation";
@@ -106,6 +110,13 @@ export declare const lumenRegistry: {
106
110
  readonly category: "Data display";
107
111
  readonly files: readonly ["packages/astro/components/Badge.astro", "packages/astro/styles/lumen.css"];
108
112
  readonly dependencies: readonly ["styles"];
113
+ }, {
114
+ readonly name: "BarChart";
115
+ readonly type: "component";
116
+ readonly description: "Compares categorical or discrete-period values with grouped and stacked bars.";
117
+ readonly category: "Data display";
118
+ readonly files: readonly ["packages/astro/components/BarChart.astro", "packages/astro/components/Chart.astro", "packages/astro/styles/lumen.css"];
119
+ readonly dependencies: readonly ["Chart", "styles"];
109
120
  }, {
110
121
  readonly name: "Breadcrumb";
111
122
  readonly type: "component";
@@ -379,6 +390,13 @@ export declare const lumenRegistry: {
379
390
  readonly category: "Navigation";
380
391
  readonly files: readonly ["packages/astro/components/Link.astro", "packages/astro/styles/lumen.css"];
381
392
  readonly dependencies: readonly ["styles"];
393
+ }, {
394
+ readonly name: "LineChart";
395
+ readonly type: "component";
396
+ readonly description: "Shows ordered trends, multiple series, missing-value gaps, areas, markers, and reference values.";
397
+ readonly category: "Data display";
398
+ readonly files: readonly ["packages/astro/components/LineChart.astro", "packages/astro/components/Chart.astro", "packages/astro/styles/lumen.css"];
399
+ readonly dependencies: readonly ["Chart", "styles"];
382
400
  }, {
383
401
  readonly name: "Marker";
384
402
  readonly type: "component";
@@ -442,6 +460,13 @@ export declare const lumenRegistry: {
442
460
  readonly category: "Forms";
443
461
  readonly files: readonly ["packages/astro/components/PhoneInput.astro", "packages/astro/styles/lumen.css"];
444
462
  readonly dependencies: readonly ["Input", "NativeSelect", "styles"];
463
+ }, {
464
+ readonly name: "PieChart";
465
+ readonly type: "component";
466
+ readonly description: "Shows part-to-whole relationships as an accessible donut or pie chart.";
467
+ readonly category: "Data display";
468
+ readonly files: readonly ["packages/astro/components/PieChart.astro", "packages/astro/components/Chart.astro", "packages/astro/styles/lumen.css"];
469
+ readonly dependencies: readonly ["Chart", "styles"];
445
470
  }, {
446
471
  readonly name: "Pill";
447
472
  readonly type: "component";
@@ -498,6 +523,13 @@ export declare const lumenRegistry: {
498
523
  readonly category: "Layout";
499
524
  readonly files: readonly ["packages/astro/components/ScrollArea.astro", "packages/astro/styles/lumen.css"];
500
525
  readonly dependencies: readonly ["styles"];
526
+ }, {
527
+ readonly name: "ScrollProgress";
528
+ readonly type: "component";
529
+ readonly description: "Shows how far a reader has progressed through the current document.";
530
+ readonly category: "Feedback";
531
+ readonly files: readonly ["packages/astro/components/ScrollProgress.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
532
+ readonly dependencies: readonly ["styles", "runtime"];
501
533
  }, {
502
534
  readonly name: "Schedule";
503
535
  readonly type: "component";
@@ -568,6 +600,13 @@ export declare const lumenRegistry: {
568
600
  readonly category: "Feedback";
569
601
  readonly files: readonly ["packages/astro/components/Sonner.astro", "packages/astro/styles/lumen.css", "packages/astro/runtime/UIPrimitives.astro"];
570
602
  readonly dependencies: readonly ["styles", "runtime"];
603
+ }, {
604
+ readonly name: "Sparkline";
605
+ readonly type: "component";
606
+ readonly description: "Shows a compact, text-labelled trend beside an existing metric.";
607
+ readonly category: "Data display";
608
+ readonly files: readonly ["packages/astro/components/Sparkline.astro", "packages/astro/styles/lumen.css"];
609
+ readonly dependencies: readonly ["styles"];
571
610
  }, {
572
611
  readonly name: "Spinner";
573
612
  readonly type: "component";
@@ -1 +1 @@
1
- {"version":3,"file":"registry-data.d.ts","sourceRoot":"","sources":["../src/registry-data.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4sDQ,CAAA"}
1
+ {"version":3,"file":"registry-data.d.ts","sourceRoot":"","sources":["../src/registry-data.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkyDQ,CAAA"}
@@ -75,6 +75,19 @@ export const lumenRegistry = {
75
75
  "Textarea"
76
76
  ]
77
77
  },
78
+ {
79
+ "name": "data-visualization",
80
+ "type": "recipe",
81
+ "components": [
82
+ "Chart",
83
+ "Sparkline",
84
+ "BarChart",
85
+ "LineChart",
86
+ "PieChart",
87
+ "Stat",
88
+ "Meter"
89
+ ]
90
+ },
78
91
  {
79
92
  "name": "ai-docs",
80
93
  "type": "documentation",
@@ -229,6 +242,21 @@ export const lumenRegistry = {
229
242
  "styles"
230
243
  ]
231
244
  },
245
+ {
246
+ "name": "BarChart",
247
+ "type": "component",
248
+ "description": "Compares categorical or discrete-period values with grouped and stacked bars.",
249
+ "category": "Data display",
250
+ "files": [
251
+ "packages/astro/components/BarChart.astro",
252
+ "packages/astro/components/Chart.astro",
253
+ "packages/astro/styles/lumen.css"
254
+ ],
255
+ "dependencies": [
256
+ "Chart",
257
+ "styles"
258
+ ]
259
+ },
232
260
  {
233
261
  "name": "Breadcrumb",
234
262
  "type": "component",
@@ -787,6 +815,21 @@ export const lumenRegistry = {
787
815
  "styles"
788
816
  ]
789
817
  },
818
+ {
819
+ "name": "LineChart",
820
+ "type": "component",
821
+ "description": "Shows ordered trends, multiple series, missing-value gaps, areas, markers, and reference values.",
822
+ "category": "Data display",
823
+ "files": [
824
+ "packages/astro/components/LineChart.astro",
825
+ "packages/astro/components/Chart.astro",
826
+ "packages/astro/styles/lumen.css"
827
+ ],
828
+ "dependencies": [
829
+ "Chart",
830
+ "styles"
831
+ ]
832
+ },
790
833
  {
791
834
  "name": "Marker",
792
835
  "type": "component",
@@ -916,6 +959,21 @@ export const lumenRegistry = {
916
959
  "styles"
917
960
  ]
918
961
  },
962
+ {
963
+ "name": "PieChart",
964
+ "type": "component",
965
+ "description": "Shows part-to-whole relationships as an accessible donut or pie chart.",
966
+ "category": "Data display",
967
+ "files": [
968
+ "packages/astro/components/PieChart.astro",
969
+ "packages/astro/components/Chart.astro",
970
+ "packages/astro/styles/lumen.css"
971
+ ],
972
+ "dependencies": [
973
+ "Chart",
974
+ "styles"
975
+ ]
976
+ },
919
977
  {
920
978
  "name": "Pill",
921
979
  "type": "component",
@@ -1032,6 +1090,21 @@ export const lumenRegistry = {
1032
1090
  "styles"
1033
1091
  ]
1034
1092
  },
1093
+ {
1094
+ "name": "ScrollProgress",
1095
+ "type": "component",
1096
+ "description": "Shows how far a reader has progressed through the current document.",
1097
+ "category": "Feedback",
1098
+ "files": [
1099
+ "packages/astro/components/ScrollProgress.astro",
1100
+ "packages/astro/styles/lumen.css",
1101
+ "packages/astro/runtime/UIPrimitives.astro"
1102
+ ],
1103
+ "dependencies": [
1104
+ "styles",
1105
+ "runtime"
1106
+ ]
1107
+ },
1035
1108
  {
1036
1109
  "name": "Schedule",
1037
1110
  "type": "component",
@@ -1172,6 +1245,19 @@ export const lumenRegistry = {
1172
1245
  "runtime"
1173
1246
  ]
1174
1247
  },
1248
+ {
1249
+ "name": "Sparkline",
1250
+ "type": "component",
1251
+ "description": "Shows a compact, text-labelled trend beside an existing metric.",
1252
+ "category": "Data display",
1253
+ "files": [
1254
+ "packages/astro/components/Sparkline.astro",
1255
+ "packages/astro/styles/lumen.css"
1256
+ ],
1257
+ "dependencies": [
1258
+ "styles"
1259
+ ]
1260
+ },
1175
1261
  {
1176
1262
  "name": "Spinner",
1177
1263
  "type": "component",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@santi020k/lumen",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "semver": "^7.8.0",
42
- "@santi020k/lumen-core": "^0.3.0"
42
+ "@santi020k/lumen-core": "^0.4.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^26.1.1",
package/styles.css CHANGED
@@ -26,6 +26,22 @@
26
26
  --success: 142 71% 36%;
27
27
  --warning: 38 92% 50%;
28
28
  --danger: 0 84% 60%;
29
+ --chart-axis: var(--ink-muted);
30
+ --chart-diverging-mid: 220 13% 91%;
31
+ --chart-diverging-negative: 0 84% 60%;
32
+ --chart-diverging-positive: 221 83% 53%;
33
+ --chart-grid: var(--line);
34
+ --chart-sequential-high: 221 83% 40%;
35
+ --chart-sequential-low: 218 100% 97%;
36
+ --chart-sequential-mid: 221 83% 67%;
37
+ --chart-series-1: 221 83% 53%;
38
+ --chart-series-2: 168 76% 36%;
39
+ --chart-series-3: 280 72% 56%;
40
+ --chart-series-4: 25 95% 53%;
41
+ --chart-series-5: 340 82% 55%;
42
+ --chart-series-6: 190 82% 42%;
43
+ --chart-series-7: 52 92% 45%;
44
+ --chart-series-8: 215 16% 47%;
29
45
  --ui-on-danger: 0 0% 0%;
30
46
  --ui-radius: 0.625rem;
31
47
  --ui-radius-sm: 0.375rem;
@@ -49,7 +65,7 @@
49
65
  0 1px 2px hsl(222 47% 11% / 0.08),
50
66
  0 12px 32px hsl(222 47% 11% / 0.12),
51
67
  0 32px 80px hsl(222 47% 11% / 0.14);
52
- --ui-font: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
68
+ --ui-font: "Montserrat", "Avenir Next", "Segoe UI", sans-serif;
53
69
  --ui-duration-fast: 120ms;
54
70
  --ui-duration: 160ms;
55
71
  --ui-duration-slow: 300ms;
@@ -75,6 +91,22 @@
75
91
  --success: 142 69% 45%;
76
92
  --warning: 38 92% 55%;
77
93
  --danger: 0 84% 65%;
94
+ --chart-axis: var(--ink-muted);
95
+ --chart-diverging-mid: 222 14% 22%;
96
+ --chart-diverging-negative: 0 84% 65%;
97
+ --chart-diverging-positive: 199 91% 56%;
98
+ --chart-grid: var(--line);
99
+ --chart-sequential-high: 199 91% 66%;
100
+ --chart-sequential-low: 199 84% 16%;
101
+ --chart-sequential-mid: 199 72% 42%;
102
+ --chart-series-1: 199 91% 56%;
103
+ --chart-series-2: 166 76% 43%;
104
+ --chart-series-3: 285 82% 72%;
105
+ --chart-series-4: 31 96% 62%;
106
+ --chart-series-5: 342 88% 68%;
107
+ --chart-series-6: 188 86% 54%;
108
+ --chart-series-7: 52 94% 58%;
109
+ --chart-series-8: 215 18% 68%;
78
110
  --ui-on-danger: var(--canvas);
79
111
  --ui-shadow-sm: 0 1px 2px hsl(0 0% 0% / 0.18);
80
112
  --ui-shadow-md: 0 12px 32px hsl(0 0% 0% / 0.24);
@@ -243,6 +275,7 @@
243
275
  .ui-skeleton,
244
276
  .ui-slider,
245
277
  .ui-sonner,
278
+ .ui-sparkline,
246
279
  .ui-spinner,
247
280
  .ui-switch,
248
281
  .ui-table-wrap,
@@ -957,21 +990,20 @@
957
990
  min-height: 12rem;
958
991
  overflow: hidden;
959
992
  border-radius: var(--ui-radius-lg);
960
- background-color: hsl(var(--surface-muted));
961
- background-image:
962
- radial-gradient(circle, hsl(var(--brand) / 0.34) 0 2px, transparent 2.5px),
963
- radial-gradient(circle, hsl(var(--accent) / 0.28) 0 1.5px, transparent 2px),
964
- radial-gradient(circle, hsl(var(--ink) / 0.14) 0 1px, transparent 1.5px);
965
- background-position: 1rem 1rem, 3.5rem 2.5rem, 6rem 4rem;
966
- background-size: 7rem 7rem, 9rem 9rem, 5rem 5rem;
967
- }
968
-
969
- .ui-particles[data-ui-particles="low"] {
970
- background-size: 11rem 11rem, 14rem 14rem, 9rem 9rem;
993
+ background: transparent;
971
994
  }
972
995
 
973
- .ui-particles[data-ui-particles="high"] {
974
- background-size: 4.5rem 4.5rem, 6rem 6rem, 3.5rem 3.5rem;
996
+ .ui-particles__particle {
997
+ position: absolute;
998
+ top: var(--ui-particle-top);
999
+ left: var(--ui-particle-left);
1000
+ width: var(--ui-particle-size);
1001
+ height: var(--ui-particle-size);
1002
+ border-radius: 50%;
1003
+ background: hsl(var(--ui-particle-tone) / 0.25);
1004
+ box-shadow: 0 0 var(--ui-particle-size) hsl(var(--ui-particle-tone) / 0.15);
1005
+ opacity: 0;
1006
+ animation: ui-particle-drift var(--ui-particle-duration) ease-in-out var(--ui-particle-delay) infinite;
975
1007
  }
976
1008
 
977
1009
  .ui-motion-duration-fast {
@@ -3393,6 +3425,11 @@
3393
3425
  gap: 0.75rem;
3394
3426
  }
3395
3427
 
3428
+ .ui-chart__heading {
3429
+ display: grid;
3430
+ gap: 0.25rem;
3431
+ }
3432
+
3396
3433
  .ui-chart h2,
3397
3434
  .ui-chart h3,
3398
3435
  .ui-chart p {
@@ -3413,6 +3450,24 @@
3413
3450
  color: hsl(var(--brand));
3414
3451
  }
3415
3452
 
3453
+ .ui-chart__plot {
3454
+ min-width: 0;
3455
+ overflow-x: auto;
3456
+ }
3457
+
3458
+ .ui-chart__empty {
3459
+ min-height: 10rem;
3460
+ display: grid;
3461
+ margin: 0;
3462
+ color: hsl(var(--ink-muted));
3463
+ place-items: center;
3464
+ text-align: center;
3465
+ }
3466
+
3467
+ .ui-chart__plot > svg {
3468
+ min-width: 32rem;
3469
+ }
3470
+
3416
3471
  .ui-chart svg :where(path, polyline, line) {
3417
3472
  vector-effect: non-scaling-stroke;
3418
3473
  stroke-linecap: round;
@@ -3425,6 +3480,273 @@
3425
3480
  line-height: 1.5;
3426
3481
  }
3427
3482
 
3483
+ .ui-chart__legend {
3484
+ display: flex;
3485
+ flex-wrap: wrap;
3486
+ gap: 0.5rem 1rem;
3487
+ margin: 0;
3488
+ padding: 0;
3489
+ color: hsl(var(--ink-soft));
3490
+ font-size: 0.75rem;
3491
+ list-style: none;
3492
+ }
3493
+
3494
+ .ui-chart__legend li {
3495
+ display: inline-flex;
3496
+ align-items: center;
3497
+ gap: 0.4rem;
3498
+ }
3499
+
3500
+ .ui-chart__legend li > span {
3501
+ width: 0.65rem;
3502
+ height: 0.65rem;
3503
+ border: 2px solid var(--ui-chart-color);
3504
+ border-radius: 999px;
3505
+ background: color-mix(in srgb, var(--ui-chart-color) 30%, transparent);
3506
+ }
3507
+
3508
+ .ui-chart__grid line {
3509
+ stroke: hsl(var(--chart-grid) / 0.72);
3510
+ stroke-width: 1;
3511
+ }
3512
+
3513
+ .ui-chart__grid text,
3514
+ .ui-chart__axis-labels text {
3515
+ fill: hsl(var(--chart-axis));
3516
+ font-size: 0.6875rem;
3517
+ }
3518
+
3519
+ .ui-chart__grid text {
3520
+ dominant-baseline: middle;
3521
+ text-anchor: end;
3522
+ }
3523
+
3524
+ .ui-chart__reference {
3525
+ stroke: hsl(var(--ink-muted));
3526
+ stroke-dasharray: 5 5;
3527
+ stroke-width: 1.5;
3528
+ }
3529
+
3530
+ .ui-chart__data {
3531
+ border-top: 1px solid hsl(var(--line));
3532
+ color: hsl(var(--ink-soft));
3533
+ font-size: 0.8125rem;
3534
+ padding-block-start: 0.75rem;
3535
+ }
3536
+
3537
+ .ui-chart__data summary {
3538
+ width: fit-content;
3539
+ border-radius: var(--ui-radius-sm);
3540
+ color: hsl(var(--brand));
3541
+ cursor: pointer;
3542
+ font-weight: 700;
3543
+ }
3544
+
3545
+ .ui-chart__data summary:focus-visible {
3546
+ outline: 2px solid hsl(var(--brand) / 0.72);
3547
+ outline-offset: 0.2rem;
3548
+ }
3549
+
3550
+ .ui-chart__data > div {
3551
+ overflow-x: auto;
3552
+ margin-block-start: 0.75rem;
3553
+ }
3554
+
3555
+ .ui-chart__data table {
3556
+ width: 100%;
3557
+ border-collapse: collapse;
3558
+ }
3559
+
3560
+ .ui-chart__data :where(th, td) {
3561
+ border-bottom: 1px solid hsl(var(--line));
3562
+ padding: 0.5rem;
3563
+ text-align: end;
3564
+ white-space: nowrap;
3565
+ }
3566
+
3567
+ .ui-chart__data :where(th, td):first-child {
3568
+ text-align: start;
3569
+ }
3570
+
3571
+ .ui-chart__data th {
3572
+ color: hsl(var(--ink));
3573
+ font-weight: 700;
3574
+ }
3575
+
3576
+ .ui-chart-tone--series-1 {
3577
+ --ui-chart-color: hsl(var(--chart-series-1));
3578
+ }
3579
+
3580
+ .ui-chart-tone--series-2 {
3581
+ --ui-chart-color: hsl(var(--chart-series-2));
3582
+ }
3583
+
3584
+ .ui-chart-tone--series-3 {
3585
+ --ui-chart-color: hsl(var(--chart-series-3));
3586
+ }
3587
+
3588
+ .ui-chart-tone--series-4 {
3589
+ --ui-chart-color: hsl(var(--chart-series-4));
3590
+ }
3591
+
3592
+ .ui-chart-tone--series-5 {
3593
+ --ui-chart-color: hsl(var(--chart-series-5));
3594
+ }
3595
+
3596
+ .ui-chart-tone--series-6 {
3597
+ --ui-chart-color: hsl(var(--chart-series-6));
3598
+ }
3599
+
3600
+ .ui-chart-tone--series-7 {
3601
+ --ui-chart-color: hsl(var(--chart-series-7));
3602
+ }
3603
+
3604
+ .ui-chart-tone--series-8 {
3605
+ --ui-chart-color: hsl(var(--chart-series-8));
3606
+ }
3607
+
3608
+ .ui-chart-tone--brand {
3609
+ --ui-chart-color: hsl(var(--brand));
3610
+ }
3611
+
3612
+ .ui-chart-tone--accent {
3613
+ --ui-chart-color: hsl(var(--accent));
3614
+ }
3615
+
3616
+ .ui-chart-tone--success {
3617
+ --ui-chart-color: hsl(var(--success));
3618
+ }
3619
+
3620
+ .ui-chart-tone--warning {
3621
+ --ui-chart-color: hsl(var(--warning));
3622
+ }
3623
+
3624
+ .ui-chart-tone--danger {
3625
+ --ui-chart-color: hsl(var(--danger));
3626
+ }
3627
+
3628
+ .ui-chart-tone--neutral {
3629
+ --ui-chart-color: hsl(var(--ink-muted));
3630
+ }
3631
+
3632
+ .ui-bar-chart__marks rect {
3633
+ fill: var(--ui-chart-color);
3634
+ }
3635
+
3636
+ .ui-pie-chart__plot {
3637
+ position: relative;
3638
+ display: grid;
3639
+ overflow: visible;
3640
+ place-items: center;
3641
+ }
3642
+
3643
+ .ui-pie-chart__plot > svg {
3644
+ z-index: 0;
3645
+ grid-area: 1 / 1;
3646
+ width: min(100%, 20rem);
3647
+ min-width: 0;
3648
+ min-height: 0;
3649
+ aspect-ratio: 1;
3650
+ }
3651
+
3652
+ .ui-pie-chart__slices path {
3653
+ fill: var(--ui-chart-color);
3654
+ stroke: hsl(var(--surface));
3655
+ stroke-width: 2;
3656
+ }
3657
+
3658
+ .ui-pie-chart__center {
3659
+ z-index: 1;
3660
+ display: grid;
3661
+ grid-area: 1 / 1;
3662
+ max-width: 7rem;
3663
+ gap: 0.2rem;
3664
+ place-items: center;
3665
+ text-align: center;
3666
+ pointer-events: none;
3667
+ }
3668
+
3669
+ .ui-pie-chart__center strong {
3670
+ color: hsl(var(--ink));
3671
+ font-size: clamp(1.35rem, 5vw, 2rem);
3672
+ line-height: 1;
3673
+ }
3674
+
3675
+ .ui-pie-chart__center span {
3676
+ color: hsl(var(--ink-muted));
3677
+ font-size: 0.75rem;
3678
+ line-height: 1.25;
3679
+ }
3680
+
3681
+ .ui-line-chart__line,
3682
+ .ui-sparkline__line {
3683
+ fill: none;
3684
+ stroke: var(--ui-chart-color);
3685
+ stroke-width: 2.5;
3686
+ }
3687
+
3688
+ .ui-line-chart__area,
3689
+ .ui-sparkline__area {
3690
+ fill: color-mix(in srgb, var(--ui-chart-color) 18%, transparent);
3691
+ stroke: none;
3692
+ }
3693
+
3694
+ .ui-line-chart__point,
3695
+ .ui-sparkline__endpoint {
3696
+ fill: hsl(var(--surface));
3697
+ stroke: var(--ui-chart-color);
3698
+ stroke-width: 2;
3699
+ }
3700
+
3701
+ .ui-line-chart__series.ui-chart-tone--series-2 .ui-line-chart__line {
3702
+ stroke-dasharray: 8 5;
3703
+ }
3704
+
3705
+ .ui-line-chart__series.ui-chart-tone--series-3 .ui-line-chart__line {
3706
+ stroke-dasharray: 3 4;
3707
+ }
3708
+
3709
+ .ui-line-chart__series.ui-chart-tone--series-4 .ui-line-chart__line {
3710
+ stroke-dasharray: 10 4 2 4;
3711
+ }
3712
+
3713
+ .ui-line-chart__series:is(
3714
+ .ui-chart-tone--series-5,
3715
+ .ui-chart-tone--series-6,
3716
+ .ui-chart-tone--series-7,
3717
+ .ui-chart-tone--series-8
3718
+ ) .ui-line-chart__line {
3719
+ stroke-dasharray: 2 5;
3720
+ }
3721
+
3722
+ .ui-sparkline {
3723
+ display: inline-flex;
3724
+ width: 8rem;
3725
+ height: 2.5rem;
3726
+ color: hsl(var(--ink));
3727
+ }
3728
+
3729
+ .ui-sparkline svg {
3730
+ display: block;
3731
+ width: 100%;
3732
+ height: 100%;
3733
+ overflow: visible;
3734
+ }
3735
+
3736
+ @media (prefers-reduced-motion: no-preference) {
3737
+ .ui-pie-chart__slices path {
3738
+ transition:
3739
+ opacity var(--ui-duration-fast) var(--ui-ease),
3740
+ transform var(--ui-duration-fast) var(--ui-ease);
3741
+ transform-box: fill-box;
3742
+ transform-origin: center;
3743
+ }
3744
+
3745
+ .ui-pie-chart__slices path:hover {
3746
+ transform: scale(1.025);
3747
+ }
3748
+ }
3749
+
3428
3750
  .ui-sonner {
3429
3751
  position: fixed;
3430
3752
  z-index: 50;
@@ -4053,6 +4375,7 @@
4053
4375
  .ui-date-picker-field--glass .ui-date-picker__popover,
4054
4376
  .ui-select-field--glass .ui-select__list,
4055
4377
  .ui-sidebar--glass,
4378
+ .ui-stat--glass,
4056
4379
  .ui-table-wrap--glass,
4057
4380
  .ui-tabs--glass,
4058
4381
  .ui-theme-builder--glass,
@@ -4250,6 +4573,7 @@
4250
4573
  .ui-date-picker-field--glass .ui-date-picker__popover,
4251
4574
  .ui-select-field--glass .ui-select__list,
4252
4575
  .ui-sidebar--glass,
4576
+ .ui-stat--glass,
4253
4577
  .ui-table-wrap--glass,
4254
4578
  .ui-tabs--glass,
4255
4579
  .ui-theme-builder--glass,
@@ -4706,10 +5030,10 @@
4706
5030
  opacity: 0;
4707
5031
  }
4708
5032
  10% {
4709
- opacity: 0.15;
5033
+ opacity: 0.9;
4710
5034
  }
4711
5035
  90% {
4712
- opacity: 0.1;
5036
+ opacity: 0.7;
4713
5037
  }
4714
5038
  100% {
4715
5039
  transform: translateY(-100vh) translateX(20px);
@@ -4717,6 +5041,13 @@
4717
5041
  }
4718
5042
  }
4719
5043
 
5044
+ @media (prefers-reduced-motion: reduce) {
5045
+ .ui-particles__particle {
5046
+ display: none;
5047
+ animation: none;
5048
+ }
5049
+ }
5050
+
4720
5051
  .ui-stat {
4721
5052
  display: flex;
4722
5053
  flex-direction: column;
@@ -4726,6 +5057,32 @@
4726
5057
  border: 1px solid hsl(var(--line));
4727
5058
  border-radius: 0.5rem;
4728
5059
  }
5060
+
5061
+ .ui-stat--accent,
5062
+ .ui-stat--glass {
5063
+ gap: 0.5rem;
5064
+ padding: 1.25rem;
5065
+ border-radius: var(--ui-radius-lg);
5066
+ }
5067
+
5068
+ .ui-stat--accent {
5069
+ border-color: hsl(var(--brand) / 0.2);
5070
+ background: linear-gradient(145deg, hsl(var(--surface)), hsl(var(--brand-soft) / 0.28));
5071
+ box-shadow: var(--ui-shadow-sm);
5072
+ }
5073
+
5074
+ .ui-stat--accent .ui-stat-value,
5075
+ .ui-stat--glass .ui-stat-value {
5076
+ font-size: 2rem;
5077
+ font-weight: 700;
5078
+ line-height: 1.1;
5079
+ letter-spacing: -0.025em;
5080
+ }
5081
+
5082
+ .ui-stat--accent .ui-stat-value {
5083
+ color: hsl(var(--brand));
5084
+ }
5085
+
4729
5086
  .ui-stat-label {
4730
5087
  font-size: 0.875rem;
4731
5088
  color: hsl(var(--ink-muted));
@@ -4890,6 +5247,17 @@
4890
5247
  white-space: nowrap;
4891
5248
  }
4892
5249
 
5250
+ .ui-pill--brand {
5251
+ border-color: hsl(var(--brand) / 0.34);
5252
+ background: hsl(var(--brand-soft) / 0.72);
5253
+ color: hsl(var(--brand));
5254
+ }
5255
+
5256
+ .ui-pill--outline {
5257
+ background: transparent;
5258
+ color: hsl(var(--ink-soft));
5259
+ }
5260
+
4893
5261
  .ui-pill__count {
4894
5262
  margin-left: 0.5rem;
4895
5263
  padding-left: 0.5rem;
@@ -4902,6 +5270,7 @@
4902
5270
 
4903
5271
  a.ui-pill {
4904
5272
  cursor: pointer;
5273
+ min-height: 2.75rem;
4905
5274
  text-decoration: none;
4906
5275
  }
4907
5276
 
@@ -4910,6 +5279,47 @@ a.ui-pill:hover {
4910
5279
  color: hsl(var(--brand-solid));
4911
5280
  }
4912
5281
 
5282
+ a.ui-pill--brand:hover {
5283
+ border-color: hsl(var(--brand) / 0.6);
5284
+ background: hsl(var(--brand-solid));
5285
+ color: hsl(var(--canvas));
5286
+ }
5287
+
5288
+ a.ui-pill:focus-visible {
5289
+ outline: 2px solid hsl(var(--brand));
5290
+ outline-offset: 2px;
5291
+ }
5292
+
5293
+ .ui-scroll-progress {
5294
+ position: fixed;
5295
+ inset: 0 0 auto;
5296
+ z-index: 9999;
5297
+ height: 0.1875rem;
5298
+ overflow: hidden;
5299
+ pointer-events: none;
5300
+ background: hsl(var(--surface-strong) / 0.48);
5301
+ }
5302
+
5303
+ .ui-scroll-progress--bottom {
5304
+ inset: auto 0 0;
5305
+ }
5306
+
5307
+ .ui-scroll-progress__bar {
5308
+ display: block;
5309
+ width: 100%;
5310
+ height: 100%;
5311
+ transform: scaleX(0);
5312
+ transform-origin: left;
5313
+ background: hsl(var(--brand-solid));
5314
+ will-change: transform;
5315
+ }
5316
+
5317
+ @media (prefers-reduced-motion: reduce) {
5318
+ .ui-scroll-progress__bar {
5319
+ transition: none;
5320
+ }
5321
+ }
5322
+
4913
5323
  /* CoverImage hover lift + bottom gradient overlay */
4914
5324
  .ui-cover-image--hover {
4915
5325
  transition: transform 300ms ease;
@@ -5249,6 +5659,16 @@ a.ui-pill:hover {
5249
5659
  text-decoration: none;
5250
5660
  font-size: 0.875rem;
5251
5661
  }
5662
+ .ui-anchor a[data-depth="3"] {
5663
+ padding-inline-start: 1.5rem;
5664
+ font-size: 0.8125rem;
5665
+ }
5666
+ .ui-anchor a[data-depth="4"],
5667
+ .ui-anchor a[data-depth="5"],
5668
+ .ui-anchor a[data-depth="6"] {
5669
+ padding-inline-start: 2.25rem;
5670
+ font-size: 0.8125rem;
5671
+ }
5252
5672
  .ui-anchor a:hover {
5253
5673
  color: hsl(var(--ink));
5254
5674
  }