@ttoss/fsl-ui 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +30 -0
  4. package/dist/components/Breadcrumbs/Breadcrumbs.cjs +129 -0
  5. package/dist/components/Breadcrumbs/Breadcrumbs.d.cts +61 -0
  6. package/dist/components/Breadcrumbs/Breadcrumbs.d.mts +61 -0
  7. package/dist/components/Breadcrumbs/Breadcrumbs.mjs +126 -0
  8. package/dist/components/Button/Button.cjs +80 -0
  9. package/dist/components/Button/Button.d.cts +68 -0
  10. package/dist/components/Button/Button.d.mts +68 -0
  11. package/dist/components/Button/Button.mjs +79 -0
  12. package/dist/components/Checkbox/Checkbox.cjs +183 -0
  13. package/dist/components/Checkbox/Checkbox.d.cts +45 -0
  14. package/dist/components/Checkbox/Checkbox.d.mts +45 -0
  15. package/dist/components/Checkbox/Checkbox.mjs +182 -0
  16. package/dist/components/CheckboxGroup/CheckboxGroup.cjs +97 -0
  17. package/dist/components/CheckboxGroup/CheckboxGroup.d.cts +56 -0
  18. package/dist/components/CheckboxGroup/CheckboxGroup.d.mts +56 -0
  19. package/dist/components/CheckboxGroup/CheckboxGroup.mjs +96 -0
  20. package/dist/components/FileTrigger/FileTrigger.cjs +51 -0
  21. package/dist/components/FileTrigger/FileTrigger.d.cts +52 -0
  22. package/dist/components/FileTrigger/FileTrigger.d.mts +52 -0
  23. package/dist/components/FileTrigger/FileTrigger.mjs +50 -0
  24. package/dist/components/GridList/GridList.cjs +220 -0
  25. package/dist/components/GridList/GridList.d.cts +72 -0
  26. package/dist/components/GridList/GridList.d.mts +72 -0
  27. package/dist/components/GridList/GridList.mjs +217 -0
  28. package/dist/components/Group/Group.cjs +77 -0
  29. package/dist/components/Group/Group.d.cts +61 -0
  30. package/dist/components/Group/Group.d.mts +61 -0
  31. package/dist/components/Group/Group.mjs +74 -0
  32. package/dist/components/Icon/Icon.cjs +52 -0
  33. package/dist/components/Icon/Icon.mjs +52 -0
  34. package/dist/components/Icon/glyphs.cjs +72 -0
  35. package/dist/components/Icon/glyphs.mjs +63 -0
  36. package/dist/components/Link/Link.cjs +62 -0
  37. package/dist/components/Link/Link.d.cts +38 -0
  38. package/dist/components/Link/Link.d.mts +38 -0
  39. package/dist/components/Link/Link.mjs +61 -0
  40. package/dist/components/ListBox/ListBox.cjs +126 -0
  41. package/dist/components/ListBox/ListBox.d.cts +63 -0
  42. package/dist/components/ListBox/ListBox.d.mts +63 -0
  43. package/dist/components/ListBox/ListBox.mjs +123 -0
  44. package/dist/components/Meter/Meter.cjs +126 -0
  45. package/dist/components/Meter/Meter.d.cts +63 -0
  46. package/dist/components/Meter/Meter.d.mts +63 -0
  47. package/dist/components/Meter/Meter.mjs +125 -0
  48. package/dist/components/NumberField/NumberField.cjs +221 -0
  49. package/dist/components/NumberField/NumberField.d.cts +68 -0
  50. package/dist/components/NumberField/NumberField.d.mts +68 -0
  51. package/dist/components/NumberField/NumberField.mjs +220 -0
  52. package/dist/components/ProgressBar/ProgressBar.cjs +132 -0
  53. package/dist/components/ProgressBar/ProgressBar.d.cts +56 -0
  54. package/dist/components/ProgressBar/ProgressBar.d.mts +56 -0
  55. package/dist/components/ProgressBar/ProgressBar.mjs +129 -0
  56. package/dist/components/RadioGroup/RadioGroup.cjs +218 -0
  57. package/dist/components/RadioGroup/RadioGroup.d.cts +82 -0
  58. package/dist/components/RadioGroup/RadioGroup.d.mts +82 -0
  59. package/dist/components/RadioGroup/RadioGroup.mjs +215 -0
  60. package/dist/components/Select/Select.cjs +253 -0
  61. package/dist/components/Select/Select.d.cts +86 -0
  62. package/dist/components/Select/Select.d.mts +86 -0
  63. package/dist/components/Select/Select.mjs +250 -0
  64. package/dist/components/Separator/Separator.cjs +64 -0
  65. package/dist/components/Separator/Separator.d.cts +44 -0
  66. package/dist/components/Separator/Separator.d.mts +44 -0
  67. package/dist/components/Separator/Separator.mjs +63 -0
  68. package/dist/components/Slider/Slider.cjs +160 -0
  69. package/dist/components/Slider/Slider.d.cts +45 -0
  70. package/dist/components/Slider/Slider.d.mts +45 -0
  71. package/dist/components/Slider/Slider.mjs +159 -0
  72. package/dist/components/Switch/Switch.cjs +176 -0
  73. package/dist/components/Switch/Switch.d.cts +43 -0
  74. package/dist/components/Switch/Switch.d.mts +43 -0
  75. package/dist/components/Switch/Switch.mjs +175 -0
  76. package/dist/components/Tabs/Tabs.cjs +180 -0
  77. package/dist/components/Tabs/Tabs.d.cts +85 -0
  78. package/dist/components/Tabs/Tabs.d.mts +85 -0
  79. package/dist/components/Tabs/Tabs.mjs +173 -0
  80. package/dist/components/Toast/Toast.cjs +218 -0
  81. package/dist/components/Toast/Toast.d.cts +96 -0
  82. package/dist/components/Toast/Toast.d.mts +96 -0
  83. package/dist/components/Toast/Toast.mjs +214 -0
  84. package/dist/components/ToggleButton/ToggleButton.cjs +125 -0
  85. package/dist/components/ToggleButton/ToggleButton.d.cts +43 -0
  86. package/dist/components/ToggleButton/ToggleButton.d.mts +43 -0
  87. package/dist/components/ToggleButton/ToggleButton.mjs +124 -0
  88. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.cjs +48 -0
  89. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.cts +41 -0
  90. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.mts +41 -0
  91. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.mjs +47 -0
  92. package/dist/components/Toolbar/Toolbar.cjs +67 -0
  93. package/dist/components/Toolbar/Toolbar.d.cts +60 -0
  94. package/dist/components/Toolbar/Toolbar.d.mts +60 -0
  95. package/dist/components/Toolbar/Toolbar.mjs +66 -0
  96. package/dist/composites/Accordion/Accordion.cjs +279 -0
  97. package/dist/composites/Accordion/Accordion.d.cts +176 -0
  98. package/dist/composites/Accordion/Accordion.d.mts +176 -0
  99. package/dist/composites/Accordion/Accordion.mjs +270 -0
  100. package/dist/composites/ConfirmationDialog/ConfirmationDialog.cjs +206 -0
  101. package/dist/composites/ConfirmationDialog/ConfirmationDialog.d.cts +166 -0
  102. package/dist/composites/ConfirmationDialog/ConfirmationDialog.d.mts +166 -0
  103. package/dist/composites/ConfirmationDialog/ConfirmationDialog.mjs +203 -0
  104. package/dist/composites/Dialog/Dialog.cjs +372 -0
  105. package/dist/composites/Dialog/Dialog.d.cts +234 -0
  106. package/dist/composites/Dialog/Dialog.d.mts +234 -0
  107. package/dist/composites/Dialog/Dialog.mjs +360 -0
  108. package/dist/composites/Disclosure/Disclosure.cjs +214 -0
  109. package/dist/composites/Disclosure/Disclosure.d.cts +118 -0
  110. package/dist/composites/Disclosure/Disclosure.d.mts +118 -0
  111. package/dist/composites/Disclosure/Disclosure.mjs +207 -0
  112. package/dist/composites/Form/Form.cjs +161 -0
  113. package/dist/composites/Form/Form.d.cts +176 -0
  114. package/dist/composites/Form/Form.d.mts +176 -0
  115. package/dist/composites/Form/Form.mjs +156 -0
  116. package/dist/composites/Menu/Menu.cjs +190 -0
  117. package/dist/composites/Menu/Menu.d.cts +158 -0
  118. package/dist/composites/Menu/Menu.d.mts +158 -0
  119. package/dist/composites/Menu/Menu.mjs +186 -0
  120. package/dist/composites/Popover/Popover.cjs +80 -0
  121. package/dist/composites/Popover/Popover.d.cts +56 -0
  122. package/dist/composites/Popover/Popover.d.mts +56 -0
  123. package/dist/composites/Popover/Popover.mjs +78 -0
  124. package/dist/composites/SearchField/SearchField.cjs +194 -0
  125. package/dist/composites/SearchField/SearchField.d.cts +81 -0
  126. package/dist/composites/SearchField/SearchField.d.mts +81 -0
  127. package/dist/composites/SearchField/SearchField.mjs +189 -0
  128. package/dist/composites/TagGroup/TagGroup.cjs +212 -0
  129. package/dist/composites/TagGroup/TagGroup.d.cts +84 -0
  130. package/dist/composites/TagGroup/TagGroup.d.mts +84 -0
  131. package/dist/composites/TagGroup/TagGroup.mjs +209 -0
  132. package/dist/composites/TextArea/TextArea.cjs +190 -0
  133. package/dist/composites/TextArea/TextArea.d.cts +95 -0
  134. package/dist/composites/TextArea/TextArea.d.mts +95 -0
  135. package/dist/composites/TextArea/TextArea.mjs +181 -0
  136. package/dist/composites/TextField/TextField.cjs +200 -0
  137. package/dist/composites/TextField/TextField.d.cts +111 -0
  138. package/dist/composites/TextField/TextField.d.mts +111 -0
  139. package/dist/composites/TextField/TextField.mjs +191 -0
  140. package/dist/composites/Tooltip/Tooltip.cjs +79 -0
  141. package/dist/composites/Tooltip/Tooltip.d.cts +53 -0
  142. package/dist/composites/Tooltip/Tooltip.d.mts +53 -0
  143. package/dist/composites/Tooltip/Tooltip.mjs +77 -0
  144. package/dist/composites/Wizard/Wizard.cjs +333 -0
  145. package/dist/composites/Wizard/Wizard.d.cts +206 -0
  146. package/dist/composites/Wizard/Wizard.d.mts +206 -0
  147. package/dist/composites/Wizard/Wizard.mjs +324 -0
  148. package/dist/composites/scope.cjs +124 -0
  149. package/dist/composites/scope.mjs +121 -0
  150. package/dist/index.cjs +186 -0
  151. package/dist/index.d.cts +37 -0
  152. package/dist/index.d.mts +37 -0
  153. package/dist/index.mjs +39 -0
  154. package/dist/semantics/componentMeta.d.cts +37 -0
  155. package/dist/semantics/componentMeta.d.mts +37 -0
  156. package/dist/semantics/index.cjs +16 -0
  157. package/dist/semantics/index.d.cts +4 -0
  158. package/dist/semantics/index.d.mts +4 -0
  159. package/dist/semantics/index.mjs +3 -0
  160. package/dist/semantics/taxonomy.cjs +150 -0
  161. package/dist/semantics/taxonomy.d.cts +153 -0
  162. package/dist/semantics/taxonomy.d.mts +153 -0
  163. package/dist/semantics/taxonomy.mjs +140 -0
  164. package/dist/tokens/escapeHatch.cjs +13 -0
  165. package/dist/tokens/escapeHatch.mjs +13 -0
  166. package/dist/tokens/focusRing.cjs +28 -0
  167. package/dist/tokens/focusRing.mjs +28 -0
  168. package/dist/tokens/keyframes.cjs +76 -0
  169. package/dist/tokens/keyframes.mjs +75 -0
  170. package/dist/tokens/resolveInteractiveStyle.cjs +41 -0
  171. package/dist/tokens/resolveInteractiveStyle.mjs +41 -0
  172. package/llms.txt +142 -0
  173. package/package.json +70 -0
  174. package/src/tokens/CONTRACT.md +505 -0
@@ -0,0 +1,123 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ import { focusRingOutline } from "../../tokens/focusRing.mjs";
3
+ import { resolveInteractiveStyle } from "../../tokens/resolveInteractiveStyle.mjs";
4
+ import { vars } from "@ttoss/fsl-theme/vars";
5
+ import { ListBox, ListBoxItem } from "react-aria-components";
6
+ import { jsx } from "react/jsx-runtime";
7
+
8
+ //#region src/components/ListBox/ListBox.tsx
9
+ /** Formal semantic identity — ListBox root (Collection entity, surface). */
10
+ var listBoxMeta = {
11
+ displayName: "ListBox",
12
+ entity: "Collection",
13
+ structure: "root"
14
+ };
15
+ /** Formal semantic identity — ListBoxItem (Selection entity, one of a set). */
16
+ var listBoxItemMeta = {
17
+ displayName: "ListBoxItem",
18
+ entity: "Selection",
19
+ structure: "item",
20
+ composition: "selection"
21
+ };
22
+ /**
23
+ * A standalone semantic list box built on React Aria's `ListBox` — a
24
+ * selectable list of options.
25
+ *
26
+ * Per ADR-007 the CONTAINER is Entity = Collection (an `informational`
27
+ * surface) and each `ListBoxItem` is Entity = Selection (`input` chrome). Set
28
+ * `selectionMode="single|multiple"`. Use `ListBoxItem` for each option.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * <ListBox aria-label="Frameworks" selectionMode="multiple">
33
+ * <ListBoxItem id="react">React</ListBoxItem>
34
+ * <ListBoxItem id="vue">Vue</ListBoxItem>
35
+ * </ListBox>
36
+ * ```
37
+ */
38
+ var ListBox$1 = ({
39
+ children,
40
+ ...props
41
+ }) => {
42
+ const surface = vars.colors.informational.primary;
43
+ return /* @__PURE__ */jsx(ListBox, {
44
+ ...props,
45
+ "data-scope": "list-box",
46
+ "data-part": "root",
47
+ style: {
48
+ boxSizing: "border-box",
49
+ display: "flex",
50
+ flexDirection: "column",
51
+ gap: vars.spacing.gap.stack.xs,
52
+ padding: vars.spacing.inset.surface.sm,
53
+ borderRadius: vars.radii.surface,
54
+ borderWidth: vars.border.outline.surface.width,
55
+ borderStyle: vars.border.outline.surface.style,
56
+ borderColor: surface?.border?.default ?? "transparent",
57
+ backgroundColor: surface?.background?.default
58
+ },
59
+ children
60
+ });
61
+ };
62
+ ListBox$1.displayName = listBoxMeta.displayName;
63
+ /**
64
+ * A single option inside a `ListBox`. Entity = Selection → reads
65
+ * `vars.colors.input.primary.*` and surfaces the `selected` State (set
66
+ * membership) — the same chrome as `SelectItem`.
67
+ *
68
+ * @example
69
+ * ```tsx
70
+ * <ListBoxItem id="react">React</ListBoxItem>
71
+ * ```
72
+ */
73
+ var ListBoxItem$1 = ({
74
+ children,
75
+ ...props
76
+ }) => {
77
+ const c = vars.colors.input.primary;
78
+ return /* @__PURE__ */jsx(ListBoxItem, {
79
+ ...props,
80
+ "data-scope": "list-box",
81
+ "data-part": "item",
82
+ style: ({
83
+ isHovered,
84
+ isPressed,
85
+ isDisabled,
86
+ isFocusVisible,
87
+ isSelected
88
+ }) => {
89
+ return {
90
+ boxSizing: "border-box",
91
+ display: "flex",
92
+ alignItems: "center",
93
+ paddingBlock: vars.spacing.inset.control.md,
94
+ paddingInline: vars.spacing.inset.control.md,
95
+ borderRadius: vars.radii.control,
96
+ cursor: isDisabled ? "not-allowed" : "pointer",
97
+ opacity: isDisabled ? vars.opacity.disabled : void 0,
98
+ ...vars.text.label.md,
99
+ backgroundColor: resolveInteractiveStyle(c?.background, {
100
+ isDisabled,
101
+ isSelected,
102
+ isHovered,
103
+ isPressed
104
+ }),
105
+ color: resolveInteractiveStyle(c?.text, {
106
+ isDisabled,
107
+ isSelected,
108
+ isHovered
109
+ }) ?? c?.text?.default,
110
+ outline: focusRingOutline(isFocusVisible),
111
+ outlineOffset: "2px",
112
+ transitionProperty: "background-color, color",
113
+ transitionDuration: vars.motion.feedback.duration,
114
+ transitionTimingFunction: vars.motion.feedback.easing
115
+ };
116
+ },
117
+ children
118
+ });
119
+ };
120
+ ListBoxItem$1.displayName = listBoxItemMeta.displayName;
121
+
122
+ //#endregion
123
+ export { ListBox$1 as ListBox, ListBoxItem$1 as ListBoxItem, listBoxItemMeta, listBoxMeta };
@@ -0,0 +1,126 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ let _ttoss_fsl_theme_vars = require("@ttoss/fsl-theme/vars");
3
+ let react_aria_components = require("react-aria-components");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
5
+
6
+ //#region src/components/Meter/Meter.tsx
7
+ /** Formal semantic identity — Meter root (Feedback entity). */
8
+ var meterMeta = {
9
+ displayName: "Meter",
10
+ entity: "Feedback",
11
+ structure: "root"
12
+ };
13
+ /** Track (body) style — the empty rail the fill sits in. */
14
+ var buildTrackStyle = c => {
15
+ return {
16
+ position: "relative",
17
+ overflow: "hidden",
18
+ width: "100%",
19
+ height: _ttoss_fsl_theme_vars.vars.spacing.gap.stack.sm,
20
+ backgroundColor: c?.background?.default,
21
+ borderRadius: _ttoss_fsl_theme_vars.vars.radii.control,
22
+ borderWidth: _ttoss_fsl_theme_vars.vars.border.outline.surface.width,
23
+ borderStyle: _ttoss_fsl_theme_vars.vars.border.outline.surface.style,
24
+ borderColor: c?.border?.default
25
+ };
26
+ };
27
+ /** Fill (content) style — width tracks the value's percentage of the range. */
28
+ var buildFillStyle = ({
29
+ c,
30
+ percentage
31
+ }) => {
32
+ return {
33
+ height: "100%",
34
+ width: `${percentage}%`,
35
+ backgroundColor: c?.border?.default,
36
+ borderRadius: "inherit",
37
+ transitionProperty: "width",
38
+ transitionDuration: _ttoss_fsl_theme_vars.vars.motion.transition.enter.duration,
39
+ transitionTimingFunction: _ttoss_fsl_theme_vars.vars.motion.transition.enter.easing
40
+ };
41
+ };
42
+ /**
43
+ * A semantic meter built on React Aria's `Meter` — a static quantity within a
44
+ * known range (`role="meter"`).
45
+ *
46
+ * Reads from `vars.colors.feedback.{primary|positive|caution|negative}` and
47
+ * uses `vars.radii.control` for the track. Unlike `ProgressBar` (which
48
+ * communicates an operation *in progress* and supports an indeterminate
49
+ * mode), `Meter` displays a **fixed measurement the user reads** — battery,
50
+ * disk usage, rate limit remaining. Pick `Meter` when the number is a state,
51
+ * `ProgressBar` when it is a task advancing.
52
+ *
53
+ * Provide an accessible name via `aria-label` (or `aria-labelledby`) — the
54
+ * visible `label` is display text and does not itself name the meter.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * <Meter aria-label="Storage" label="Storage used" value={82} evaluation="caution" />
59
+ * <Meter aria-label="Battery" value={12} evaluation="negative" />
60
+ * ```
61
+ */
62
+ var Meter = ({
63
+ evaluation = "primary",
64
+ label,
65
+ showValueLabel = true,
66
+ ...props
67
+ }) => {
68
+ const c = _ttoss_fsl_theme_vars.vars.colors.feedback[evaluation];
69
+ return /* @__PURE__ */(0, react_jsx_runtime.jsx)(react_aria_components.Meter, {
70
+ ...props,
71
+ "data-scope": "meter",
72
+ "data-part": "root",
73
+ "data-evaluation": evaluation,
74
+ style: {
75
+ boxSizing: "border-box",
76
+ display: "flex",
77
+ flexDirection: "column",
78
+ gap: _ttoss_fsl_theme_vars.vars.spacing.gap.stack.xs
79
+ },
80
+ children: ({
81
+ percentage,
82
+ valueText
83
+ }) => {
84
+ return /* @__PURE__ */(0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, {
85
+ children: [(label || showValueLabel) && /* @__PURE__ */(0, react_jsx_runtime.jsxs)("div", {
86
+ "data-scope": "meter",
87
+ "data-part": "labelRow",
88
+ style: {
89
+ display: "flex",
90
+ justifyContent: "space-between",
91
+ alignItems: "baseline",
92
+ color: c?.text?.default,
93
+ ..._ttoss_fsl_theme_vars.vars.text.label.md
94
+ },
95
+ children: [/* @__PURE__ */(0, react_jsx_runtime.jsx)("span", {
96
+ "data-scope": "meter",
97
+ "data-part": "title",
98
+ children: label
99
+ }), showValueLabel && /* @__PURE__ */(0, react_jsx_runtime.jsx)("span", {
100
+ "data-scope": "meter",
101
+ "data-part": "status",
102
+ "aria-hidden": true,
103
+ children: valueText ?? `${Math.round(percentage)}%`
104
+ })]
105
+ }), /* @__PURE__ */(0, react_jsx_runtime.jsx)("div", {
106
+ "data-scope": "meter",
107
+ "data-part": "body",
108
+ style: buildTrackStyle(c),
109
+ children: /* @__PURE__ */(0, react_jsx_runtime.jsx)("div", {
110
+ "data-scope": "meter",
111
+ "data-part": "content",
112
+ style: buildFillStyle({
113
+ c,
114
+ percentage
115
+ })
116
+ })
117
+ })]
118
+ });
119
+ }
120
+ });
121
+ };
122
+ Meter.displayName = meterMeta.displayName;
123
+
124
+ //#endregion
125
+ exports.Meter = Meter;
126
+ exports.meterMeta = meterMeta;
@@ -0,0 +1,63 @@
1
+
2
+ import { EvaluationsFor } from "../../semantics/taxonomy.cjs";
3
+ import * as React from "react";
4
+ import { MeterProps } from "react-aria-components";
5
+
6
+ //#region src/components/Meter/Meter.d.ts
7
+ /** Formal semantic identity — Meter root (Feedback entity). */
8
+ declare const meterMeta: {
9
+ readonly displayName: "Meter";
10
+ readonly entity: "Feedback";
11
+ readonly structure: "root";
12
+ };
13
+ /**
14
+ * Props for the Meter component.
15
+ */
16
+ interface MeterProps$1 extends Omit<MeterProps, 'style' | 'className' | 'children'> {
17
+ /**
18
+ * Authorial emphasis matching the *meaning* of the level: `positive` for a
19
+ * healthy fill (storage available), `caution` for an approaching limit,
20
+ * `negative` for a critical level (battery almost empty). `primary` is the
21
+ * neutral default.
22
+ * @default 'primary'
23
+ */
24
+ evaluation?: EvaluationsFor<'Feedback'>;
25
+ /** Visible label shown above the bar (e.g. "Storage used"). */
26
+ label?: React.ReactNode;
27
+ /**
28
+ * Whether to render the formatted value alongside the label.
29
+ * @default true
30
+ */
31
+ showValueLabel?: boolean;
32
+ }
33
+ /**
34
+ * A semantic meter built on React Aria's `Meter` — a static quantity within a
35
+ * known range (`role="meter"`).
36
+ *
37
+ * Reads from `vars.colors.feedback.{primary|positive|caution|negative}` and
38
+ * uses `vars.radii.control` for the track. Unlike `ProgressBar` (which
39
+ * communicates an operation *in progress* and supports an indeterminate
40
+ * mode), `Meter` displays a **fixed measurement the user reads** — battery,
41
+ * disk usage, rate limit remaining. Pick `Meter` when the number is a state,
42
+ * `ProgressBar` when it is a task advancing.
43
+ *
44
+ * Provide an accessible name via `aria-label` (or `aria-labelledby`) — the
45
+ * visible `label` is display text and does not itself name the meter.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * <Meter aria-label="Storage" label="Storage used" value={82} evaluation="caution" />
50
+ * <Meter aria-label="Battery" value={12} evaluation="negative" />
51
+ * ```
52
+ */
53
+ declare const Meter: {
54
+ ({
55
+ evaluation,
56
+ label,
57
+ showValueLabel,
58
+ ...props
59
+ }: MeterProps$1): import("react/jsx-runtime").JSX.Element;
60
+ displayName: "Meter";
61
+ };
62
+ //#endregion
63
+ export { Meter, MeterProps$1 as MeterProps, meterMeta };
@@ -0,0 +1,63 @@
1
+
2
+ import { EvaluationsFor } from "../../semantics/taxonomy.mjs";
3
+ import { MeterProps } from "react-aria-components";
4
+ import * as React from "react";
5
+
6
+ //#region src/components/Meter/Meter.d.ts
7
+ /** Formal semantic identity — Meter root (Feedback entity). */
8
+ declare const meterMeta: {
9
+ readonly displayName: "Meter";
10
+ readonly entity: "Feedback";
11
+ readonly structure: "root";
12
+ };
13
+ /**
14
+ * Props for the Meter component.
15
+ */
16
+ interface MeterProps$1 extends Omit<MeterProps, 'style' | 'className' | 'children'> {
17
+ /**
18
+ * Authorial emphasis matching the *meaning* of the level: `positive` for a
19
+ * healthy fill (storage available), `caution` for an approaching limit,
20
+ * `negative` for a critical level (battery almost empty). `primary` is the
21
+ * neutral default.
22
+ * @default 'primary'
23
+ */
24
+ evaluation?: EvaluationsFor<'Feedback'>;
25
+ /** Visible label shown above the bar (e.g. "Storage used"). */
26
+ label?: React.ReactNode;
27
+ /**
28
+ * Whether to render the formatted value alongside the label.
29
+ * @default true
30
+ */
31
+ showValueLabel?: boolean;
32
+ }
33
+ /**
34
+ * A semantic meter built on React Aria's `Meter` — a static quantity within a
35
+ * known range (`role="meter"`).
36
+ *
37
+ * Reads from `vars.colors.feedback.{primary|positive|caution|negative}` and
38
+ * uses `vars.radii.control` for the track. Unlike `ProgressBar` (which
39
+ * communicates an operation *in progress* and supports an indeterminate
40
+ * mode), `Meter` displays a **fixed measurement the user reads** — battery,
41
+ * disk usage, rate limit remaining. Pick `Meter` when the number is a state,
42
+ * `ProgressBar` when it is a task advancing.
43
+ *
44
+ * Provide an accessible name via `aria-label` (or `aria-labelledby`) — the
45
+ * visible `label` is display text and does not itself name the meter.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * <Meter aria-label="Storage" label="Storage used" value={82} evaluation="caution" />
50
+ * <Meter aria-label="Battery" value={12} evaluation="negative" />
51
+ * ```
52
+ */
53
+ declare const Meter$1: {
54
+ ({
55
+ evaluation,
56
+ label,
57
+ showValueLabel,
58
+ ...props
59
+ }: MeterProps$1): import("react/jsx-runtime").JSX.Element;
60
+ displayName: "Meter";
61
+ };
62
+ //#endregion
63
+ export { Meter$1 as Meter, MeterProps$1 as MeterProps, meterMeta };
@@ -0,0 +1,125 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ import { vars } from "@ttoss/fsl-theme/vars";
3
+ import { Meter } from "react-aria-components";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+
6
+ //#region src/components/Meter/Meter.tsx
7
+ /** Formal semantic identity — Meter root (Feedback entity). */
8
+ var meterMeta = {
9
+ displayName: "Meter",
10
+ entity: "Feedback",
11
+ structure: "root"
12
+ };
13
+ /** Track (body) style — the empty rail the fill sits in. */
14
+ var buildTrackStyle = c => {
15
+ return {
16
+ position: "relative",
17
+ overflow: "hidden",
18
+ width: "100%",
19
+ height: vars.spacing.gap.stack.sm,
20
+ backgroundColor: c?.background?.default,
21
+ borderRadius: vars.radii.control,
22
+ borderWidth: vars.border.outline.surface.width,
23
+ borderStyle: vars.border.outline.surface.style,
24
+ borderColor: c?.border?.default
25
+ };
26
+ };
27
+ /** Fill (content) style — width tracks the value's percentage of the range. */
28
+ var buildFillStyle = ({
29
+ c,
30
+ percentage
31
+ }) => {
32
+ return {
33
+ height: "100%",
34
+ width: `${percentage}%`,
35
+ backgroundColor: c?.border?.default,
36
+ borderRadius: "inherit",
37
+ transitionProperty: "width",
38
+ transitionDuration: vars.motion.transition.enter.duration,
39
+ transitionTimingFunction: vars.motion.transition.enter.easing
40
+ };
41
+ };
42
+ /**
43
+ * A semantic meter built on React Aria's `Meter` — a static quantity within a
44
+ * known range (`role="meter"`).
45
+ *
46
+ * Reads from `vars.colors.feedback.{primary|positive|caution|negative}` and
47
+ * uses `vars.radii.control` for the track. Unlike `ProgressBar` (which
48
+ * communicates an operation *in progress* and supports an indeterminate
49
+ * mode), `Meter` displays a **fixed measurement the user reads** — battery,
50
+ * disk usage, rate limit remaining. Pick `Meter` when the number is a state,
51
+ * `ProgressBar` when it is a task advancing.
52
+ *
53
+ * Provide an accessible name via `aria-label` (or `aria-labelledby`) — the
54
+ * visible `label` is display text and does not itself name the meter.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * <Meter aria-label="Storage" label="Storage used" value={82} evaluation="caution" />
59
+ * <Meter aria-label="Battery" value={12} evaluation="negative" />
60
+ * ```
61
+ */
62
+ var Meter$1 = ({
63
+ evaluation = "primary",
64
+ label,
65
+ showValueLabel = true,
66
+ ...props
67
+ }) => {
68
+ const c = vars.colors.feedback[evaluation];
69
+ return /* @__PURE__ */jsx(Meter, {
70
+ ...props,
71
+ "data-scope": "meter",
72
+ "data-part": "root",
73
+ "data-evaluation": evaluation,
74
+ style: {
75
+ boxSizing: "border-box",
76
+ display: "flex",
77
+ flexDirection: "column",
78
+ gap: vars.spacing.gap.stack.xs
79
+ },
80
+ children: ({
81
+ percentage,
82
+ valueText
83
+ }) => {
84
+ return /* @__PURE__ */jsxs(Fragment, {
85
+ children: [(label || showValueLabel) && /* @__PURE__ */jsxs("div", {
86
+ "data-scope": "meter",
87
+ "data-part": "labelRow",
88
+ style: {
89
+ display: "flex",
90
+ justifyContent: "space-between",
91
+ alignItems: "baseline",
92
+ color: c?.text?.default,
93
+ ...vars.text.label.md
94
+ },
95
+ children: [/* @__PURE__ */jsx("span", {
96
+ "data-scope": "meter",
97
+ "data-part": "title",
98
+ children: label
99
+ }), showValueLabel && /* @__PURE__ */jsx("span", {
100
+ "data-scope": "meter",
101
+ "data-part": "status",
102
+ "aria-hidden": true,
103
+ children: valueText ?? `${Math.round(percentage)}%`
104
+ })]
105
+ }), /* @__PURE__ */jsx("div", {
106
+ "data-scope": "meter",
107
+ "data-part": "body",
108
+ style: buildTrackStyle(c),
109
+ children: /* @__PURE__ */jsx("div", {
110
+ "data-scope": "meter",
111
+ "data-part": "content",
112
+ style: buildFillStyle({
113
+ c,
114
+ percentage
115
+ })
116
+ })
117
+ })]
118
+ });
119
+ }
120
+ });
121
+ };
122
+ Meter$1.displayName = meterMeta.displayName;
123
+
124
+ //#endregion
125
+ export { Meter$1 as Meter, meterMeta };