@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.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/_virtual/_rolldown/runtime.cjs +30 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.cjs +129 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.cts +61 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.mts +61 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.mjs +126 -0
- package/dist/components/Button/Button.cjs +80 -0
- package/dist/components/Button/Button.d.cts +68 -0
- package/dist/components/Button/Button.d.mts +68 -0
- package/dist/components/Button/Button.mjs +79 -0
- package/dist/components/Checkbox/Checkbox.cjs +183 -0
- package/dist/components/Checkbox/Checkbox.d.cts +45 -0
- package/dist/components/Checkbox/Checkbox.d.mts +45 -0
- package/dist/components/Checkbox/Checkbox.mjs +182 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.cjs +97 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.cts +56 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.mts +56 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.mjs +96 -0
- package/dist/components/FileTrigger/FileTrigger.cjs +51 -0
- package/dist/components/FileTrigger/FileTrigger.d.cts +52 -0
- package/dist/components/FileTrigger/FileTrigger.d.mts +52 -0
- package/dist/components/FileTrigger/FileTrigger.mjs +50 -0
- package/dist/components/GridList/GridList.cjs +220 -0
- package/dist/components/GridList/GridList.d.cts +72 -0
- package/dist/components/GridList/GridList.d.mts +72 -0
- package/dist/components/GridList/GridList.mjs +217 -0
- package/dist/components/Group/Group.cjs +77 -0
- package/dist/components/Group/Group.d.cts +61 -0
- package/dist/components/Group/Group.d.mts +61 -0
- package/dist/components/Group/Group.mjs +74 -0
- package/dist/components/Icon/Icon.cjs +52 -0
- package/dist/components/Icon/Icon.mjs +52 -0
- package/dist/components/Icon/glyphs.cjs +72 -0
- package/dist/components/Icon/glyphs.mjs +63 -0
- package/dist/components/Link/Link.cjs +62 -0
- package/dist/components/Link/Link.d.cts +38 -0
- package/dist/components/Link/Link.d.mts +38 -0
- package/dist/components/Link/Link.mjs +61 -0
- package/dist/components/ListBox/ListBox.cjs +126 -0
- package/dist/components/ListBox/ListBox.d.cts +63 -0
- package/dist/components/ListBox/ListBox.d.mts +63 -0
- package/dist/components/ListBox/ListBox.mjs +123 -0
- package/dist/components/Meter/Meter.cjs +126 -0
- package/dist/components/Meter/Meter.d.cts +63 -0
- package/dist/components/Meter/Meter.d.mts +63 -0
- package/dist/components/Meter/Meter.mjs +125 -0
- package/dist/components/NumberField/NumberField.cjs +221 -0
- package/dist/components/NumberField/NumberField.d.cts +68 -0
- package/dist/components/NumberField/NumberField.d.mts +68 -0
- package/dist/components/NumberField/NumberField.mjs +220 -0
- package/dist/components/ProgressBar/ProgressBar.cjs +132 -0
- package/dist/components/ProgressBar/ProgressBar.d.cts +56 -0
- package/dist/components/ProgressBar/ProgressBar.d.mts +56 -0
- package/dist/components/ProgressBar/ProgressBar.mjs +129 -0
- package/dist/components/RadioGroup/RadioGroup.cjs +218 -0
- package/dist/components/RadioGroup/RadioGroup.d.cts +82 -0
- package/dist/components/RadioGroup/RadioGroup.d.mts +82 -0
- package/dist/components/RadioGroup/RadioGroup.mjs +215 -0
- package/dist/components/Select/Select.cjs +253 -0
- package/dist/components/Select/Select.d.cts +86 -0
- package/dist/components/Select/Select.d.mts +86 -0
- package/dist/components/Select/Select.mjs +250 -0
- package/dist/components/Separator/Separator.cjs +64 -0
- package/dist/components/Separator/Separator.d.cts +44 -0
- package/dist/components/Separator/Separator.d.mts +44 -0
- package/dist/components/Separator/Separator.mjs +63 -0
- package/dist/components/Slider/Slider.cjs +160 -0
- package/dist/components/Slider/Slider.d.cts +45 -0
- package/dist/components/Slider/Slider.d.mts +45 -0
- package/dist/components/Slider/Slider.mjs +159 -0
- package/dist/components/Switch/Switch.cjs +176 -0
- package/dist/components/Switch/Switch.d.cts +43 -0
- package/dist/components/Switch/Switch.d.mts +43 -0
- package/dist/components/Switch/Switch.mjs +175 -0
- package/dist/components/Tabs/Tabs.cjs +180 -0
- package/dist/components/Tabs/Tabs.d.cts +85 -0
- package/dist/components/Tabs/Tabs.d.mts +85 -0
- package/dist/components/Tabs/Tabs.mjs +173 -0
- package/dist/components/Toast/Toast.cjs +218 -0
- package/dist/components/Toast/Toast.d.cts +96 -0
- package/dist/components/Toast/Toast.d.mts +96 -0
- package/dist/components/Toast/Toast.mjs +214 -0
- package/dist/components/ToggleButton/ToggleButton.cjs +125 -0
- package/dist/components/ToggleButton/ToggleButton.d.cts +43 -0
- package/dist/components/ToggleButton/ToggleButton.d.mts +43 -0
- package/dist/components/ToggleButton/ToggleButton.mjs +124 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.cjs +48 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.cts +41 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.mts +41 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.mjs +47 -0
- package/dist/components/Toolbar/Toolbar.cjs +67 -0
- package/dist/components/Toolbar/Toolbar.d.cts +60 -0
- package/dist/components/Toolbar/Toolbar.d.mts +60 -0
- package/dist/components/Toolbar/Toolbar.mjs +66 -0
- package/dist/composites/Accordion/Accordion.cjs +279 -0
- package/dist/composites/Accordion/Accordion.d.cts +176 -0
- package/dist/composites/Accordion/Accordion.d.mts +176 -0
- package/dist/composites/Accordion/Accordion.mjs +270 -0
- package/dist/composites/ConfirmationDialog/ConfirmationDialog.cjs +206 -0
- package/dist/composites/ConfirmationDialog/ConfirmationDialog.d.cts +166 -0
- package/dist/composites/ConfirmationDialog/ConfirmationDialog.d.mts +166 -0
- package/dist/composites/ConfirmationDialog/ConfirmationDialog.mjs +203 -0
- package/dist/composites/Dialog/Dialog.cjs +372 -0
- package/dist/composites/Dialog/Dialog.d.cts +234 -0
- package/dist/composites/Dialog/Dialog.d.mts +234 -0
- package/dist/composites/Dialog/Dialog.mjs +360 -0
- package/dist/composites/Disclosure/Disclosure.cjs +214 -0
- package/dist/composites/Disclosure/Disclosure.d.cts +118 -0
- package/dist/composites/Disclosure/Disclosure.d.mts +118 -0
- package/dist/composites/Disclosure/Disclosure.mjs +207 -0
- package/dist/composites/Form/Form.cjs +161 -0
- package/dist/composites/Form/Form.d.cts +176 -0
- package/dist/composites/Form/Form.d.mts +176 -0
- package/dist/composites/Form/Form.mjs +156 -0
- package/dist/composites/Menu/Menu.cjs +190 -0
- package/dist/composites/Menu/Menu.d.cts +158 -0
- package/dist/composites/Menu/Menu.d.mts +158 -0
- package/dist/composites/Menu/Menu.mjs +186 -0
- package/dist/composites/Popover/Popover.cjs +80 -0
- package/dist/composites/Popover/Popover.d.cts +56 -0
- package/dist/composites/Popover/Popover.d.mts +56 -0
- package/dist/composites/Popover/Popover.mjs +78 -0
- package/dist/composites/SearchField/SearchField.cjs +194 -0
- package/dist/composites/SearchField/SearchField.d.cts +81 -0
- package/dist/composites/SearchField/SearchField.d.mts +81 -0
- package/dist/composites/SearchField/SearchField.mjs +189 -0
- package/dist/composites/TagGroup/TagGroup.cjs +212 -0
- package/dist/composites/TagGroup/TagGroup.d.cts +84 -0
- package/dist/composites/TagGroup/TagGroup.d.mts +84 -0
- package/dist/composites/TagGroup/TagGroup.mjs +209 -0
- package/dist/composites/TextArea/TextArea.cjs +190 -0
- package/dist/composites/TextArea/TextArea.d.cts +95 -0
- package/dist/composites/TextArea/TextArea.d.mts +95 -0
- package/dist/composites/TextArea/TextArea.mjs +181 -0
- package/dist/composites/TextField/TextField.cjs +200 -0
- package/dist/composites/TextField/TextField.d.cts +111 -0
- package/dist/composites/TextField/TextField.d.mts +111 -0
- package/dist/composites/TextField/TextField.mjs +191 -0
- package/dist/composites/Tooltip/Tooltip.cjs +79 -0
- package/dist/composites/Tooltip/Tooltip.d.cts +53 -0
- package/dist/composites/Tooltip/Tooltip.d.mts +53 -0
- package/dist/composites/Tooltip/Tooltip.mjs +77 -0
- package/dist/composites/Wizard/Wizard.cjs +333 -0
- package/dist/composites/Wizard/Wizard.d.cts +206 -0
- package/dist/composites/Wizard/Wizard.d.mts +206 -0
- package/dist/composites/Wizard/Wizard.mjs +324 -0
- package/dist/composites/scope.cjs +124 -0
- package/dist/composites/scope.mjs +121 -0
- package/dist/index.cjs +186 -0
- package/dist/index.d.cts +37 -0
- package/dist/index.d.mts +37 -0
- package/dist/index.mjs +39 -0
- package/dist/semantics/componentMeta.d.cts +37 -0
- package/dist/semantics/componentMeta.d.mts +37 -0
- package/dist/semantics/index.cjs +16 -0
- package/dist/semantics/index.d.cts +4 -0
- package/dist/semantics/index.d.mts +4 -0
- package/dist/semantics/index.mjs +3 -0
- package/dist/semantics/taxonomy.cjs +150 -0
- package/dist/semantics/taxonomy.d.cts +153 -0
- package/dist/semantics/taxonomy.d.mts +153 -0
- package/dist/semantics/taxonomy.mjs +140 -0
- package/dist/tokens/escapeHatch.cjs +13 -0
- package/dist/tokens/escapeHatch.mjs +13 -0
- package/dist/tokens/focusRing.cjs +28 -0
- package/dist/tokens/focusRing.mjs +28 -0
- package/dist/tokens/keyframes.cjs +76 -0
- package/dist/tokens/keyframes.mjs +75 -0
- package/dist/tokens/resolveInteractiveStyle.cjs +41 -0
- package/dist/tokens/resolveInteractiveStyle.mjs +41 -0
- package/llms.txt +142 -0
- package/package.json +70 -0
- 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 };
|