@epilot/spark-ui 0.26.1 → 0.27.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/dist/components/alert-dialog.cjs +1 -1
- package/dist/components/alert-dialog.js +1 -1
- package/dist/components/attachment.d.cts +2 -2
- package/dist/components/attachment.d.ts +2 -2
- package/dist/components/avatar.d.cts +1 -1
- package/dist/components/avatar.d.ts +1 -1
- package/dist/components/badge.cjs +10 -2
- package/dist/components/badge.cjs.map +1 -1
- package/dist/components/badge.d.cts +2 -1
- package/dist/components/badge.d.ts +2 -1
- package/dist/components/badge.js +10 -2
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.d.cts +1 -1
- package/dist/components/banner.d.ts +1 -1
- package/dist/components/box.d.cts +1 -1
- package/dist/components/box.d.ts +1 -1
- package/dist/components/bubble.cjs +1 -1
- package/dist/components/bubble.cjs.map +1 -1
- package/dist/components/bubble.d.cts +1 -1
- package/dist/components/bubble.d.ts +1 -1
- package/dist/components/bubble.js +1 -1
- package/dist/components/bubble.js.map +1 -1
- package/dist/components/button-group.d.cts +1 -1
- package/dist/components/button-group.d.ts +1 -1
- package/dist/components/button.cjs +27 -6
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.cts +8 -7
- package/dist/components/button.d.ts +8 -7
- package/dist/components/button.js +27 -6
- package/dist/components/button.js.map +1 -1
- package/dist/components/callout.d.cts +1 -1
- package/dist/components/callout.d.ts +1 -1
- package/dist/components/card.cjs +8 -4
- package/dist/components/card.cjs.map +1 -1
- package/dist/components/card.d.cts +6 -2
- package/dist/components/card.d.ts +6 -2
- package/dist/components/card.js +8 -4
- package/dist/components/card.js.map +1 -1
- package/dist/components/checkbox-group.cjs +31 -0
- package/dist/components/checkbox-group.cjs.map +1 -0
- package/dist/components/checkbox-group.d.cts +27 -0
- package/dist/components/checkbox-group.d.ts +27 -0
- package/dist/components/checkbox-group.js +28 -0
- package/dist/components/checkbox-group.js.map +1 -0
- package/dist/components/checkbox.d.cts +1 -1
- package/dist/components/checkbox.d.ts +1 -1
- package/dist/components/dialog.cjs +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/empty-state.d.cts +3 -3
- package/dist/components/empty-state.d.ts +3 -3
- package/dist/components/field.cjs +110 -15
- package/dist/components/field.cjs.map +1 -1
- package/dist/components/field.d.cts +16 -3
- package/dist/components/field.d.ts +16 -3
- package/dist/components/field.js +111 -17
- package/dist/components/field.js.map +1 -1
- package/dist/components/input-group.cjs +9 -9
- package/dist/components/input-group.cjs.map +1 -1
- package/dist/components/input-group.d.cts +1 -1
- package/dist/components/input-group.d.ts +1 -1
- package/dist/components/input-group.js +9 -9
- package/dist/components/input-group.js.map +1 -1
- package/dist/components/input.d.cts +1 -1
- package/dist/components/input.d.ts +1 -1
- package/dist/components/list.cjs +21 -5
- package/dist/components/list.cjs.map +1 -1
- package/dist/components/list.d.cts +13 -5
- package/dist/components/list.d.ts +13 -5
- package/dist/components/list.js +21 -5
- package/dist/components/list.js.map +1 -1
- package/dist/components/marker.cjs +1 -1
- package/dist/components/marker.cjs.map +1 -1
- package/dist/components/marker.d.cts +1 -1
- package/dist/components/marker.d.ts +1 -1
- package/dist/components/marker.js +1 -1
- package/dist/components/marker.js.map +1 -1
- package/dist/components/page-header.d.cts +1 -1
- package/dist/components/page-header.d.ts +1 -1
- package/dist/components/pill.d.cts +1 -1
- package/dist/components/pill.d.ts +1 -1
- package/dist/components/radio.cjs +6 -2
- package/dist/components/radio.cjs.map +1 -1
- package/dist/components/radio.d.cts +4 -2
- package/dist/components/radio.d.ts +4 -2
- package/dist/components/radio.js +6 -2
- package/dist/components/radio.js.map +1 -1
- package/dist/components/rating.cjs +167 -0
- package/dist/components/rating.cjs.map +1 -0
- package/dist/components/rating.d.cts +50 -0
- package/dist/components/rating.d.ts +50 -0
- package/dist/components/rating.js +162 -0
- package/dist/components/rating.js.map +1 -0
- package/dist/components/scroll-area.cjs +9 -2
- package/dist/components/scroll-area.cjs.map +1 -1
- package/dist/components/scroll-area.d.cts +1 -1
- package/dist/components/scroll-area.d.ts +1 -1
- package/dist/components/scroll-area.js +10 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/segmented-control.d.cts +1 -1
- package/dist/components/segmented-control.d.ts +1 -1
- package/dist/components/select.d.cts +1 -1
- package/dist/components/select.d.ts +1 -1
- package/dist/components/selection-item.cjs +42 -0
- package/dist/components/selection-item.cjs.map +1 -0
- package/dist/components/selection-item.d.cts +25 -0
- package/dist/components/selection-item.d.ts +25 -0
- package/dist/components/selection-item.js +39 -0
- package/dist/components/selection-item.js.map +1 -0
- package/dist/components/sheet.cjs +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/skeleton.cjs +1 -1
- package/dist/components/skeleton.cjs.map +1 -1
- package/dist/components/skeleton.js +1 -1
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/slider.cjs +1 -1
- package/dist/components/slider.cjs.map +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/spinner.cjs +81 -8
- package/dist/components/spinner.cjs.map +1 -1
- package/dist/components/spinner.js +81 -8
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/stepper.cjs +3 -2
- package/dist/components/stepper.cjs.map +1 -1
- package/dist/components/stepper.js +3 -2
- package/dist/components/stepper.js.map +1 -1
- package/dist/components/switch-group.cjs +32 -0
- package/dist/components/switch-group.cjs.map +1 -0
- package/dist/components/switch-group.d.cts +26 -0
- package/dist/components/switch-group.d.ts +26 -0
- package/dist/components/switch-group.js +29 -0
- package/dist/components/switch-group.js.map +1 -0
- package/dist/components/switch.d.cts +1 -1
- package/dist/components/switch.d.ts +1 -1
- package/dist/components/tabs.cjs +32 -23
- package/dist/components/tabs.cjs.map +1 -1
- package/dist/components/tabs.d.cts +5 -5
- package/dist/components/tabs.d.ts +5 -5
- package/dist/components/tabs.js +32 -23
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/textarea.d.cts +1 -1
- package/dist/components/textarea.d.ts +1 -1
- package/dist/components/theme.cjs +44 -2
- package/dist/components/theme.cjs.map +1 -1
- package/dist/components/theme.d.cts +4 -2
- package/dist/components/theme.d.ts +4 -2
- package/dist/components/theme.js +44 -2
- package/dist/components/theme.js.map +1 -1
- package/dist/components/toast.cjs +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle-group.d.cts +1 -1
- package/dist/components/toggle-group.d.ts +1 -1
- package/dist/components/toggle.d.cts +2 -2
- package/dist/components/toggle.d.ts +2 -2
- package/dist/lib/accent-theme.d.cts +1 -1
- package/dist/lib/accent-theme.d.ts +1 -1
- package/dist/lib/container-chrome.cjs +4 -4
- package/dist/lib/container-chrome.cjs.map +1 -1
- package/dist/lib/container-chrome.d.cts +1 -1
- package/dist/lib/container-chrome.d.ts +1 -1
- package/dist/lib/container-chrome.js +4 -4
- package/dist/lib/container-chrome.js.map +1 -1
- package/dist/lib/input-box-variants.cjs +8 -8
- package/dist/lib/input-box-variants.cjs.map +1 -1
- package/dist/lib/input-box-variants.d.cts +1 -1
- package/dist/lib/input-box-variants.d.ts +1 -1
- package/dist/lib/input-box-variants.js +8 -8
- package/dist/lib/input-box-variants.js.map +1 -1
- package/dist/lib/selection-list.cjs +17 -0
- package/dist/lib/selection-list.cjs.map +1 -0
- package/dist/lib/selection-list.d.cts +11 -0
- package/dist/lib/selection-list.d.ts +11 -0
- package/dist/lib/selection-list.js +15 -0
- package/dist/lib/selection-list.js.map +1 -0
- package/dist/lib/theme-types.cjs.map +1 -1
- package/dist/lib/theme-types.d.cts +2 -2
- package/dist/lib/theme-types.d.ts +2 -2
- package/dist/lib/theme-types.js.map +1 -1
- package/dist/lib/toggle-group-context.d.cts +2 -1
- package/dist/lib/toggle-group-context.d.ts +2 -1
- package/dist/styles/spark-default.css +12 -1
- package/dist/styles/theme.css +98 -0
- package/dist/{theme-types-Bn5E15-P.d.ts → theme-types-CKZzOmSa.d.cts} +11 -2
- package/dist/{theme-types-Bn5E15-P.d.cts → theme-types-CKZzOmSa.d.ts} +11 -2
- package/package.json +1 -1
|
@@ -21,17 +21,90 @@ const Spinner = react.forwardRef(({ className, size = "default", label = "Loadin
|
|
|
21
21
|
className: "sr-only",
|
|
22
22
|
children: label
|
|
23
23
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
24
|
-
className: "size-full animate-
|
|
24
|
+
className: "size-full animate-spinner-turn motion-reduce:animate-none",
|
|
25
25
|
fill: "none",
|
|
26
26
|
viewBox: "0 0 24 24",
|
|
27
27
|
xmlns: "http://www.w3.org/2000/svg",
|
|
28
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", {
|
|
29
|
+
className: "motion-reduce:hidden",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
32
|
+
className: "animate-spinner-spark motion-reduce:animate-none",
|
|
33
|
+
cx: "12",
|
|
34
|
+
cy: "12",
|
|
35
|
+
r: "9.5",
|
|
36
|
+
stroke: "currentColor",
|
|
37
|
+
strokeWidth: "3",
|
|
38
|
+
strokeLinecap: "round",
|
|
39
|
+
strokeDasharray: "3.75 200",
|
|
40
|
+
strokeDashoffset: "0",
|
|
41
|
+
opacity: ".12"
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", {
|
|
44
|
+
opacity: ".3",
|
|
45
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
46
|
+
className: "animate-spinner-band-1 motion-reduce:animate-none",
|
|
47
|
+
cx: "12",
|
|
48
|
+
cy: "12",
|
|
49
|
+
r: "9.5",
|
|
50
|
+
stroke: "currentColor",
|
|
51
|
+
strokeWidth: "3",
|
|
52
|
+
strokeDasharray: "3.75 200",
|
|
53
|
+
strokeDashoffset: "-3.75"
|
|
54
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
55
|
+
className: "animate-spinner-band-1-end motion-reduce:animate-none",
|
|
56
|
+
cx: "12",
|
|
57
|
+
cy: "12",
|
|
58
|
+
r: "9.5",
|
|
59
|
+
stroke: "currentColor",
|
|
60
|
+
strokeWidth: "3",
|
|
61
|
+
strokeLinecap: "round",
|
|
62
|
+
strokeDasharray: ".01 200",
|
|
63
|
+
strokeDashoffset: "-3.75"
|
|
64
|
+
})]
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
67
|
+
className: "animate-spinner-band-2 motion-reduce:animate-none",
|
|
68
|
+
cx: "12",
|
|
69
|
+
cy: "12",
|
|
70
|
+
r: "9.5",
|
|
71
|
+
stroke: "currentColor",
|
|
72
|
+
strokeWidth: "3",
|
|
73
|
+
strokeDasharray: "3.75 200",
|
|
74
|
+
strokeDashoffset: "-7.5",
|
|
75
|
+
opacity: ".6"
|
|
76
|
+
}),
|
|
77
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
78
|
+
className: "animate-spinner-band-3 motion-reduce:animate-none",
|
|
79
|
+
cx: "12",
|
|
80
|
+
cy: "12",
|
|
81
|
+
r: "9.5",
|
|
82
|
+
stroke: "currentColor",
|
|
83
|
+
strokeWidth: "3",
|
|
84
|
+
strokeLinecap: "round",
|
|
85
|
+
strokeDasharray: "3.75 200",
|
|
86
|
+
strokeDashoffset: "-11.25"
|
|
87
|
+
})
|
|
88
|
+
]
|
|
89
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", {
|
|
90
|
+
className: "hidden motion-reduce:inline",
|
|
91
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
92
|
+
cx: "12",
|
|
93
|
+
cy: "12",
|
|
94
|
+
r: "9.5",
|
|
95
|
+
stroke: "currentColor",
|
|
96
|
+
strokeWidth: "3",
|
|
97
|
+
opacity: ".25"
|
|
98
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
99
|
+
cx: "12",
|
|
100
|
+
cy: "12",
|
|
101
|
+
r: "9.5",
|
|
102
|
+
stroke: "currentColor",
|
|
103
|
+
strokeWidth: "3",
|
|
104
|
+
strokeLinecap: "round",
|
|
105
|
+
strokeDasharray: "15 60",
|
|
106
|
+
strokeDashoffset: "-29.85"
|
|
107
|
+
})]
|
|
35
108
|
})]
|
|
36
109
|
})]
|
|
37
110
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.cjs","names":["React"],"sources":["../../src/components/spinner.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Size variant */\n size?: 'sm' | 'default' | 'lg'\n /** Screen-reader announcement */\n label?: string\n}\n\nconst sizeClasses = {\n sm: 'size-4',\n default: 'size-6',\n lg: 'size-8',\n} as const\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = 'default', label = 'Loading', ...props }, ref) => (\n // color + size live on the wrapper so className can override them (svg inherits via currentColor/size-full)\n <div\n className={cn('inline-flex text-spark-9', sizeClasses[size], className)}\n data-slot=\"spinner\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n
|
|
1
|
+
{"version":3,"file":"spinner.cjs","names":["React"],"sources":["../../src/components/spinner.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Size variant */\n size?: 'sm' | 'default' | 'lg'\n /** Screen-reader announcement */\n label?: string\n}\n\nconst sizeClasses = {\n sm: 'size-4',\n default: 'size-6',\n lg: 'size-8',\n} as const\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = 'default', label = 'Loading', ...props }, ref) => (\n // color + size live on the wrapper so className can override them (svg inherits via currentColor/size-full)\n <div\n className={cn('inline-flex text-spark-9', sizeClasses[size], className)}\n data-slot=\"spinner\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n <svg\n className=\"size-full animate-spinner-turn motion-reduce:animate-none\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g className=\"motion-reduce:hidden\">\n <circle\n className=\"animate-spinner-spark motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"0\"\n opacity=\".12\"\n />\n {/* band 1 and its round end share one group opacity so the overlap does not darken */}\n <g opacity=\".3\">\n <circle\n className=\"animate-spinner-band-1 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-3.75\"\n />\n <circle\n className=\"animate-spinner-band-1-end motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\".01 200\"\n strokeDashoffset=\"-3.75\"\n />\n </g>\n <circle\n className=\"animate-spinner-band-2 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-7.5\"\n opacity=\".6\"\n />\n <circle\n className=\"animate-spinner-band-3 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-11.25\"\n />\n </g>\n <g className=\"hidden motion-reduce:inline\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\".25\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"15 60\"\n strokeDashoffset=\"-29.85\"\n />\n </g>\n </svg>\n </div>\n ),\n)\n\nSpinner.displayName = 'Spinner'\n\nexport { Spinner }\nexport type { SpinnerProps }\n"],"mappings":";;;;;;;;AAUA,MAAM,cAAc;CAClB,IAAI;CACJ,SAAS;CACT,IAAI;AACN;AAEA,MAAM,UAAUA,MAAM,YACnB,EAAE,WAAW,OAAO,WAAW,QAAQ,WAAW,GAAG,SAAS,QAE7D,iBAAA,GAAA,kBAAA,MAAC,OAAD;CACE,YAAA,GAAA,GAAA,IAAc,4BAA4B,YAAY,OAAO,SAAS;CACtE,aAAU;CACL;CACL,MAAK;CACL,GAAI;WALN,CAOE,iBAAA,GAAA,kBAAA,KAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,GACvC,iBAAA,GAAA,kBAAA,MAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,SAAQ;EACR,OAAM;YAJR,CAME,iBAAA,GAAA,kBAAA,MAAC,KAAD;GAAG,WAAU;aAAb;IACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,iBAAgB;KAChB,kBAAiB;KACjB,SAAQ;IACT,CAAA;IAED,iBAAA,GAAA,kBAAA,MAAC,KAAD;KAAG,SAAQ;eAAX,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;MACE,WAAU;MACV,IAAG;MACH,IAAG;MACH,GAAE;MACF,QAAO;MACP,aAAY;MACZ,iBAAgB;MAChB,kBAAiB;KAClB,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAC,UAAD;MACE,WAAU;MACV,IAAG;MACH,IAAG;MACH,GAAE;MACF,QAAO;MACP,aAAY;MACZ,eAAc;MACd,iBAAgB;MAChB,kBAAiB;KAClB,CAAA,CACA;;IACH,iBAAA,GAAA,kBAAA,KAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,iBAAgB;KAChB,kBAAiB;KACjB,SAAQ;IACT,CAAA;IACD,iBAAA,GAAA,kBAAA,KAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,iBAAgB;KAChB,kBAAiB;IAClB,CAAA;GACA;MACH,iBAAA,GAAA,kBAAA,MAAC,KAAD;GAAG,WAAU;aAAb,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,QAAO;IACP,aAAY;IACZ,SAAQ;GACT,CAAA,GACD,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,QAAO;IACP,aAAY;IACZ,eAAc;IACd,iBAAgB;IAChB,kBAAiB;GAClB,CAAA,CACA;IACA;GACF;EAET;AAEA,QAAQ,cAAc"}
|
|
@@ -18,17 +18,90 @@ const Spinner = React$1.forwardRef(({ className, size = "default", label = "Load
|
|
|
18
18
|
className: "sr-only",
|
|
19
19
|
children: label
|
|
20
20
|
}), /* @__PURE__ */ jsxs("svg", {
|
|
21
|
-
className: "size-full animate-
|
|
21
|
+
className: "size-full animate-spinner-turn motion-reduce:animate-none",
|
|
22
22
|
fill: "none",
|
|
23
23
|
viewBox: "0 0 24 24",
|
|
24
24
|
xmlns: "http://www.w3.org/2000/svg",
|
|
25
|
-
children: [/* @__PURE__ */
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
children: [/* @__PURE__ */ jsxs("g", {
|
|
26
|
+
className: "motion-reduce:hidden",
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsx("circle", {
|
|
29
|
+
className: "animate-spinner-spark motion-reduce:animate-none",
|
|
30
|
+
cx: "12",
|
|
31
|
+
cy: "12",
|
|
32
|
+
r: "9.5",
|
|
33
|
+
stroke: "currentColor",
|
|
34
|
+
strokeWidth: "3",
|
|
35
|
+
strokeLinecap: "round",
|
|
36
|
+
strokeDasharray: "3.75 200",
|
|
37
|
+
strokeDashoffset: "0",
|
|
38
|
+
opacity: ".12"
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ jsxs("g", {
|
|
41
|
+
opacity: ".3",
|
|
42
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
43
|
+
className: "animate-spinner-band-1 motion-reduce:animate-none",
|
|
44
|
+
cx: "12",
|
|
45
|
+
cy: "12",
|
|
46
|
+
r: "9.5",
|
|
47
|
+
stroke: "currentColor",
|
|
48
|
+
strokeWidth: "3",
|
|
49
|
+
strokeDasharray: "3.75 200",
|
|
50
|
+
strokeDashoffset: "-3.75"
|
|
51
|
+
}), /* @__PURE__ */ jsx("circle", {
|
|
52
|
+
className: "animate-spinner-band-1-end motion-reduce:animate-none",
|
|
53
|
+
cx: "12",
|
|
54
|
+
cy: "12",
|
|
55
|
+
r: "9.5",
|
|
56
|
+
stroke: "currentColor",
|
|
57
|
+
strokeWidth: "3",
|
|
58
|
+
strokeLinecap: "round",
|
|
59
|
+
strokeDasharray: ".01 200",
|
|
60
|
+
strokeDashoffset: "-3.75"
|
|
61
|
+
})]
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ jsx("circle", {
|
|
64
|
+
className: "animate-spinner-band-2 motion-reduce:animate-none",
|
|
65
|
+
cx: "12",
|
|
66
|
+
cy: "12",
|
|
67
|
+
r: "9.5",
|
|
68
|
+
stroke: "currentColor",
|
|
69
|
+
strokeWidth: "3",
|
|
70
|
+
strokeDasharray: "3.75 200",
|
|
71
|
+
strokeDashoffset: "-7.5",
|
|
72
|
+
opacity: ".6"
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ jsx("circle", {
|
|
75
|
+
className: "animate-spinner-band-3 motion-reduce:animate-none",
|
|
76
|
+
cx: "12",
|
|
77
|
+
cy: "12",
|
|
78
|
+
r: "9.5",
|
|
79
|
+
stroke: "currentColor",
|
|
80
|
+
strokeWidth: "3",
|
|
81
|
+
strokeLinecap: "round",
|
|
82
|
+
strokeDasharray: "3.75 200",
|
|
83
|
+
strokeDashoffset: "-11.25"
|
|
84
|
+
})
|
|
85
|
+
]
|
|
86
|
+
}), /* @__PURE__ */ jsxs("g", {
|
|
87
|
+
className: "hidden motion-reduce:inline",
|
|
88
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
89
|
+
cx: "12",
|
|
90
|
+
cy: "12",
|
|
91
|
+
r: "9.5",
|
|
92
|
+
stroke: "currentColor",
|
|
93
|
+
strokeWidth: "3",
|
|
94
|
+
opacity: ".25"
|
|
95
|
+
}), /* @__PURE__ */ jsx("circle", {
|
|
96
|
+
cx: "12",
|
|
97
|
+
cy: "12",
|
|
98
|
+
r: "9.5",
|
|
99
|
+
stroke: "currentColor",
|
|
100
|
+
strokeWidth: "3",
|
|
101
|
+
strokeLinecap: "round",
|
|
102
|
+
strokeDasharray: "15 60",
|
|
103
|
+
strokeDashoffset: "-29.85"
|
|
104
|
+
})]
|
|
32
105
|
})]
|
|
33
106
|
})]
|
|
34
107
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","names":["React"],"sources":["../../src/components/spinner.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Size variant */\n size?: 'sm' | 'default' | 'lg'\n /** Screen-reader announcement */\n label?: string\n}\n\nconst sizeClasses = {\n sm: 'size-4',\n default: 'size-6',\n lg: 'size-8',\n} as const\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = 'default', label = 'Loading', ...props }, ref) => (\n // color + size live on the wrapper so className can override them (svg inherits via currentColor/size-full)\n <div\n className={cn('inline-flex text-spark-9', sizeClasses[size], className)}\n data-slot=\"spinner\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n
|
|
1
|
+
{"version":3,"file":"spinner.js","names":["React"],"sources":["../../src/components/spinner.tsx"],"sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface SpinnerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Size variant */\n size?: 'sm' | 'default' | 'lg'\n /** Screen-reader announcement */\n label?: string\n}\n\nconst sizeClasses = {\n sm: 'size-4',\n default: 'size-6',\n lg: 'size-8',\n} as const\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProps>(\n ({ className, size = 'default', label = 'Loading', ...props }, ref) => (\n // color + size live on the wrapper so className can override them (svg inherits via currentColor/size-full)\n <div\n className={cn('inline-flex text-spark-9', sizeClasses[size], className)}\n data-slot=\"spinner\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n <svg\n className=\"size-full animate-spinner-turn motion-reduce:animate-none\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g className=\"motion-reduce:hidden\">\n <circle\n className=\"animate-spinner-spark motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"0\"\n opacity=\".12\"\n />\n {/* band 1 and its round end share one group opacity so the overlap does not darken */}\n <g opacity=\".3\">\n <circle\n className=\"animate-spinner-band-1 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-3.75\"\n />\n <circle\n className=\"animate-spinner-band-1-end motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\".01 200\"\n strokeDashoffset=\"-3.75\"\n />\n </g>\n <circle\n className=\"animate-spinner-band-2 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-7.5\"\n opacity=\".6\"\n />\n <circle\n className=\"animate-spinner-band-3 motion-reduce:animate-none\"\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.75 200\"\n strokeDashoffset=\"-11.25\"\n />\n </g>\n <g className=\"hidden motion-reduce:inline\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n opacity=\".25\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"15 60\"\n strokeDashoffset=\"-29.85\"\n />\n </g>\n </svg>\n </div>\n ),\n)\n\nSpinner.displayName = 'Spinner'\n\nexport { Spinner }\nexport type { SpinnerProps }\n"],"mappings":";;;;;AAUA,MAAM,cAAc;CAClB,IAAI;CACJ,SAAS;CACT,IAAI;AACN;AAEA,MAAM,UAAUA,QAAM,YACnB,EAAE,WAAW,OAAO,WAAW,QAAQ,WAAW,GAAG,SAAS,QAE7D,qBAAC,OAAD;CACE,WAAW,GAAG,4BAA4B,YAAY,OAAO,SAAS;CACtE,aAAU;CACL;CACL,MAAK;CACL,GAAI;WALN,CAOE,oBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,GACvC,qBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,SAAQ;EACR,OAAM;YAJR,CAME,qBAAC,KAAD;GAAG,WAAU;aAAb;IACE,oBAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,iBAAgB;KAChB,kBAAiB;KACjB,SAAQ;IACT,CAAA;IAED,qBAAC,KAAD;KAAG,SAAQ;eAAX,CACE,oBAAC,UAAD;MACE,WAAU;MACV,IAAG;MACH,IAAG;MACH,GAAE;MACF,QAAO;MACP,aAAY;MACZ,iBAAgB;MAChB,kBAAiB;KAClB,CAAA,GACD,oBAAC,UAAD;MACE,WAAU;MACV,IAAG;MACH,IAAG;MACH,GAAE;MACF,QAAO;MACP,aAAY;MACZ,eAAc;MACd,iBAAgB;MAChB,kBAAiB;KAClB,CAAA,CACA;;IACH,oBAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,iBAAgB;KAChB,kBAAiB;KACjB,SAAQ;IACT,CAAA;IACD,oBAAC,UAAD;KACE,WAAU;KACV,IAAG;KACH,IAAG;KACH,GAAE;KACF,QAAO;KACP,aAAY;KACZ,eAAc;KACd,iBAAgB;KAChB,kBAAiB;IAClB,CAAA;GACA;MACH,qBAAC,KAAD;GAAG,WAAU;aAAb,CACE,oBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,QAAO;IACP,aAAY;IACZ,SAAQ;GACT,CAAA,GACD,oBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,QAAO;IACP,aAAY;IACZ,eAAc;IACd,iBAAgB;IAChB,kBAAiB;GAClB,CAAA,CACA;IACA;GACF;EAET;AAEA,QAAQ,cAAc"}
|
|
@@ -7,6 +7,7 @@ let _epilot_spark_icons = require("@epilot/spark-icons");
|
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let cn = require("cn");
|
|
9
9
|
//#region src/components/stepper.tsx
|
|
10
|
+
const STEP_BUTTON = "touch-target inline-flex size-8 items-center justify-center rounded-sm text-gray transition-colors outline-hidden hover:bg-gray-a3 focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-40 disabled:hover:bg-transparent motion-reduce:transition-none";
|
|
10
11
|
const Stepper = react.forwardRef(({ value, onValueChange, onValueCommit, min = 0, max = 100, step = 1, formatValue = (v) => String(v), disabled, className, commitDelayMs = 400, "aria-label": ariaLabel, decreaseLabel, increaseLabel }, ref) => {
|
|
11
12
|
const commitTimerRef = react.useRef(null);
|
|
12
13
|
react.useEffect(() => () => {
|
|
@@ -47,7 +48,7 @@ const Stepper = react.forwardRef(({ value, onValueChange, onValueCommit, min = 0
|
|
|
47
48
|
"aria-label": decreaseLabel,
|
|
48
49
|
onClick: decrement,
|
|
49
50
|
disabled: disabled || atMin,
|
|
50
|
-
className:
|
|
51
|
+
className: STEP_BUTTON,
|
|
51
52
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_epilot_spark_icons.ChevronLeft, { className: "[--spark-icon-size:16px]" })
|
|
52
53
|
}),
|
|
53
54
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -60,7 +61,7 @@ const Stepper = react.forwardRef(({ value, onValueChange, onValueCommit, min = 0
|
|
|
60
61
|
"aria-label": increaseLabel,
|
|
61
62
|
onClick: increment,
|
|
62
63
|
disabled: disabled || atMax,
|
|
63
|
-
className:
|
|
64
|
+
className: STEP_BUTTON,
|
|
64
65
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_epilot_spark_icons.ChevronRight, { className: "[--spark-icon-size:16px]" })
|
|
65
66
|
})
|
|
66
67
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper.cjs","names":["React","ChevronLeft","ChevronRight"],"sources":["../../src/components/stepper.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@epilot/spark-icons'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface StepperProps {\n value: number\n onValueChange: (value: number) => void\n /**\n * Fires once after the user stops interacting (default: 400ms after the last\n * click). Use this for side effects like persisting the value, so rapid\n * clicks don't fan out into a request per click.\n */\n onValueCommit?: (value: number) => void\n min?: number\n max?: number\n step?: number\n formatValue?: (value: number) => string\n disabled?: boolean\n className?: string\n /** Delay (ms) after the last click before `onValueCommit` fires. */\n commitDelayMs?: number\n /** Accessible label, e.g. \"Sunshare percentage\". */\n 'aria-label'?: string\n /** Accessible label for the decrement button. */\n decreaseLabel: string\n /** Accessible label for the increment button. */\n increaseLabel: string\n}\n\nconst Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n value,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n step = 1,\n formatValue = (v) => String(v),\n disabled,\n className,\n commitDelayMs = 400,\n 'aria-label': ariaLabel,\n decreaseLabel,\n increaseLabel,\n },\n ref,\n ) => {\n const commitTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n React.useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n },\n [],\n )\n\n const scheduleCommit = (next: number) => {\n if (!onValueCommit) return\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n commitTimerRef.current = setTimeout(() => {\n commitTimerRef.current = null\n onValueCommit(next)\n }, commitDelayMs)\n }\n\n const decrement = () => {\n const next = Math.max(min, value - step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n const increment = () => {\n const next = Math.min(max, value + step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n\n const atMin = value <= min\n const atMax = value >= max\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex h-12 w-full items-center justify-between rounded-md bg-base-gray-soft px-2',\n className,\n )}\n >\n <button\n type=\"button\"\n aria-label={decreaseLabel}\n onClick={decrement}\n disabled={disabled || atMin}\n className
|
|
1
|
+
{"version":3,"file":"stepper.cjs","names":["React","ChevronLeft","ChevronRight"],"sources":["../../src/components/stepper.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@epilot/spark-icons'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\n\nconst STEP_BUTTON =\n 'touch-target inline-flex size-8 items-center justify-center rounded-sm text-gray transition-colors outline-hidden hover:bg-gray-a3 focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-40 disabled:hover:bg-transparent motion-reduce:transition-none'\n\ninterface StepperProps {\n value: number\n onValueChange: (value: number) => void\n /**\n * Fires once after the user stops interacting (default: 400ms after the last\n * click). Use this for side effects like persisting the value, so rapid\n * clicks don't fan out into a request per click.\n */\n onValueCommit?: (value: number) => void\n min?: number\n max?: number\n step?: number\n formatValue?: (value: number) => string\n disabled?: boolean\n className?: string\n /** Delay (ms) after the last click before `onValueCommit` fires. */\n commitDelayMs?: number\n /** Accessible label, e.g. \"Sunshare percentage\". */\n 'aria-label'?: string\n /** Accessible label for the decrement button. */\n decreaseLabel: string\n /** Accessible label for the increment button. */\n increaseLabel: string\n}\n\nconst Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n value,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n step = 1,\n formatValue = (v) => String(v),\n disabled,\n className,\n commitDelayMs = 400,\n 'aria-label': ariaLabel,\n decreaseLabel,\n increaseLabel,\n },\n ref,\n ) => {\n const commitTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n React.useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n },\n [],\n )\n\n const scheduleCommit = (next: number) => {\n if (!onValueCommit) return\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n commitTimerRef.current = setTimeout(() => {\n commitTimerRef.current = null\n onValueCommit(next)\n }, commitDelayMs)\n }\n\n const decrement = () => {\n const next = Math.max(min, value - step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n const increment = () => {\n const next = Math.min(max, value + step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n\n const atMin = value <= min\n const atMax = value >= max\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex h-12 w-full items-center justify-between rounded-md bg-base-gray-soft px-2',\n className,\n )}\n >\n <button\n type=\"button\"\n aria-label={decreaseLabel}\n onClick={decrement}\n disabled={disabled || atMin}\n className={STEP_BUTTON}\n >\n <ChevronLeft className=\"[--spark-icon-size:16px]\" />\n </button>\n <span\n className=\"text-base font-semibold text-gray tabular-nums select-none\"\n aria-live=\"polite\"\n >\n {formatValue(value)}\n </span>\n <button\n type=\"button\"\n aria-label={increaseLabel}\n onClick={increment}\n disabled={disabled || atMax}\n className={STEP_BUTTON}\n >\n <ChevronRight className=\"[--spark-icon-size:16px]\" />\n </button>\n </div>\n )\n },\n)\n\nStepper.displayName = 'Stepper'\n\nexport { Stepper }\nexport type { StepperProps }\n"],"mappings":";;;;;;;;;AAIA,MAAM,cACJ;AA2BF,MAAM,UAAUA,MAAM,YAElB,EACE,OACA,eACA,eACA,MAAM,GACN,MAAM,KACN,OAAO,GACP,eAAe,MAAM,OAAO,CAAC,GAC7B,UACA,WACA,gBAAgB,KAChB,cAAc,WACd,eACA,iBAEF,QACG;CACH,MAAM,iBAAiBA,MAAM,OAC3B,IACF;CAEA,MAAM,sBACQ;EACV,IAAI,eAAe,SAAS,aAAa,eAAe,OAAO;CACjE,GACA,CAAC,CACH;CAEA,MAAM,kBAAkB,SAAiB;EACvC,IAAI,CAAC,eAAe;EACpB,IAAI,eAAe,SAAS,aAAa,eAAe,OAAO;EAC/D,eAAe,UAAU,iBAAiB;GACxC,eAAe,UAAU;GACzB,cAAc,IAAI;EACpB,GAAG,aAAa;CAClB;CAEA,MAAM,kBAAkB;EACtB,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,IAAI;EACvC,IAAI,SAAS,OAAO;GAClB,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB;CACF;CACA,MAAM,kBAAkB;EACtB,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,IAAI;EACvC,IAAI,SAAS,OAAO;GAClB,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB;CACF;CAEA,MAAM,QAAQ,SAAS;CACvB,MAAM,QAAQ,SAAS;CAEvB,OACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,YAAA,GAAA,GAAA,IACE,0FACA,SACF;YAPF;GASE,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,MAAK;IACL,cAAY;IACZ,SAAS;IACT,UAAU,YAAY;IACtB,WAAW;cAEX,iBAAA,GAAA,kBAAA,KAACC,oBAAAA,aAAD,EAAa,WAAU,2BAA4B,CAAA;GAC7C,CAAA;GACR,iBAAA,GAAA,kBAAA,KAAC,QAAD;IACE,WAAU;IACV,aAAU;cAET,YAAY,KAAK;GACd,CAAA;GACN,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,MAAK;IACL,cAAY;IACZ,SAAS;IACT,UAAU,YAAY;IACtB,WAAW;cAEX,iBAAA,GAAA,kBAAA,KAACC,oBAAAA,cAAD,EAAc,WAAU,2BAA4B,CAAA;GAC9C,CAAA;EACL;;AAET,CACF;AAEA,QAAQ,cAAc"}
|
|
@@ -4,6 +4,7 @@ import * as React$1 from "react";
|
|
|
4
4
|
import { ChevronLeft, ChevronRight } from "@epilot/spark-icons";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
//#region src/components/stepper.tsx
|
|
7
|
+
const STEP_BUTTON = "touch-target inline-flex size-8 items-center justify-center rounded-sm text-gray transition-colors outline-hidden hover:bg-gray-a3 focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-40 disabled:hover:bg-transparent motion-reduce:transition-none";
|
|
7
8
|
const Stepper = React$1.forwardRef(({ value, onValueChange, onValueCommit, min = 0, max = 100, step = 1, formatValue = (v) => String(v), disabled, className, commitDelayMs = 400, "aria-label": ariaLabel, decreaseLabel, increaseLabel }, ref) => {
|
|
8
9
|
const commitTimerRef = React$1.useRef(null);
|
|
9
10
|
React$1.useEffect(() => () => {
|
|
@@ -44,7 +45,7 @@ const Stepper = React$1.forwardRef(({ value, onValueChange, onValueCommit, min =
|
|
|
44
45
|
"aria-label": decreaseLabel,
|
|
45
46
|
onClick: decrement,
|
|
46
47
|
disabled: disabled || atMin,
|
|
47
|
-
className:
|
|
48
|
+
className: STEP_BUTTON,
|
|
48
49
|
children: /* @__PURE__ */ jsx(ChevronLeft, { className: "[--spark-icon-size:16px]" })
|
|
49
50
|
}),
|
|
50
51
|
/* @__PURE__ */ jsx("span", {
|
|
@@ -57,7 +58,7 @@ const Stepper = React$1.forwardRef(({ value, onValueChange, onValueCommit, min =
|
|
|
57
58
|
"aria-label": increaseLabel,
|
|
58
59
|
onClick: increment,
|
|
59
60
|
disabled: disabled || atMax,
|
|
60
|
-
className:
|
|
61
|
+
className: STEP_BUTTON,
|
|
61
62
|
children: /* @__PURE__ */ jsx(ChevronRight, { className: "[--spark-icon-size:16px]" })
|
|
62
63
|
})
|
|
63
64
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper.js","names":["React"],"sources":["../../src/components/stepper.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@epilot/spark-icons'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\n\ninterface StepperProps {\n value: number\n onValueChange: (value: number) => void\n /**\n * Fires once after the user stops interacting (default: 400ms after the last\n * click). Use this for side effects like persisting the value, so rapid\n * clicks don't fan out into a request per click.\n */\n onValueCommit?: (value: number) => void\n min?: number\n max?: number\n step?: number\n formatValue?: (value: number) => string\n disabled?: boolean\n className?: string\n /** Delay (ms) after the last click before `onValueCommit` fires. */\n commitDelayMs?: number\n /** Accessible label, e.g. \"Sunshare percentage\". */\n 'aria-label'?: string\n /** Accessible label for the decrement button. */\n decreaseLabel: string\n /** Accessible label for the increment button. */\n increaseLabel: string\n}\n\nconst Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n value,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n step = 1,\n formatValue = (v) => String(v),\n disabled,\n className,\n commitDelayMs = 400,\n 'aria-label': ariaLabel,\n decreaseLabel,\n increaseLabel,\n },\n ref,\n ) => {\n const commitTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n React.useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n },\n [],\n )\n\n const scheduleCommit = (next: number) => {\n if (!onValueCommit) return\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n commitTimerRef.current = setTimeout(() => {\n commitTimerRef.current = null\n onValueCommit(next)\n }, commitDelayMs)\n }\n\n const decrement = () => {\n const next = Math.max(min, value - step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n const increment = () => {\n const next = Math.min(max, value + step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n\n const atMin = value <= min\n const atMax = value >= max\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex h-12 w-full items-center justify-between rounded-md bg-base-gray-soft px-2',\n className,\n )}\n >\n <button\n type=\"button\"\n aria-label={decreaseLabel}\n onClick={decrement}\n disabled={disabled || atMin}\n className
|
|
1
|
+
{"version":3,"file":"stepper.js","names":["React"],"sources":["../../src/components/stepper.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from '@epilot/spark-icons'\nimport * as React from 'react'\nimport { cn } from '../utils/cn'\n\nconst STEP_BUTTON =\n 'touch-target inline-flex size-8 items-center justify-center rounded-sm text-gray transition-colors outline-hidden hover:bg-gray-a3 focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-40 disabled:hover:bg-transparent motion-reduce:transition-none'\n\ninterface StepperProps {\n value: number\n onValueChange: (value: number) => void\n /**\n * Fires once after the user stops interacting (default: 400ms after the last\n * click). Use this for side effects like persisting the value, so rapid\n * clicks don't fan out into a request per click.\n */\n onValueCommit?: (value: number) => void\n min?: number\n max?: number\n step?: number\n formatValue?: (value: number) => string\n disabled?: boolean\n className?: string\n /** Delay (ms) after the last click before `onValueCommit` fires. */\n commitDelayMs?: number\n /** Accessible label, e.g. \"Sunshare percentage\". */\n 'aria-label'?: string\n /** Accessible label for the decrement button. */\n decreaseLabel: string\n /** Accessible label for the increment button. */\n increaseLabel: string\n}\n\nconst Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n value,\n onValueChange,\n onValueCommit,\n min = 0,\n max = 100,\n step = 1,\n formatValue = (v) => String(v),\n disabled,\n className,\n commitDelayMs = 400,\n 'aria-label': ariaLabel,\n decreaseLabel,\n increaseLabel,\n },\n ref,\n ) => {\n const commitTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(\n null,\n )\n\n React.useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n },\n [],\n )\n\n const scheduleCommit = (next: number) => {\n if (!onValueCommit) return\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current)\n commitTimerRef.current = setTimeout(() => {\n commitTimerRef.current = null\n onValueCommit(next)\n }, commitDelayMs)\n }\n\n const decrement = () => {\n const next = Math.max(min, value - step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n const increment = () => {\n const next = Math.min(max, value + step)\n if (next !== value) {\n onValueChange(next)\n scheduleCommit(next)\n }\n }\n\n const atMin = value <= min\n const atMax = value >= max\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n 'inline-flex h-12 w-full items-center justify-between rounded-md bg-base-gray-soft px-2',\n className,\n )}\n >\n <button\n type=\"button\"\n aria-label={decreaseLabel}\n onClick={decrement}\n disabled={disabled || atMin}\n className={STEP_BUTTON}\n >\n <ChevronLeft className=\"[--spark-icon-size:16px]\" />\n </button>\n <span\n className=\"text-base font-semibold text-gray tabular-nums select-none\"\n aria-live=\"polite\"\n >\n {formatValue(value)}\n </span>\n <button\n type=\"button\"\n aria-label={increaseLabel}\n onClick={increment}\n disabled={disabled || atMax}\n className={STEP_BUTTON}\n >\n <ChevronRight className=\"[--spark-icon-size:16px]\" />\n </button>\n </div>\n )\n },\n)\n\nStepper.displayName = 'Stepper'\n\nexport { Stepper }\nexport type { StepperProps }\n"],"mappings":";;;;;;AAIA,MAAM,cACJ;AA2BF,MAAM,UAAUA,QAAM,YAElB,EACE,OACA,eACA,eACA,MAAM,GACN,MAAM,KACN,OAAO,GACP,eAAe,MAAM,OAAO,CAAC,GAC7B,UACA,WACA,gBAAgB,KAChB,cAAc,WACd,eACA,iBAEF,QACG;CACH,MAAM,iBAAiBA,QAAM,OAC3B,IACF;CAEA,QAAM,sBACQ;EACV,IAAI,eAAe,SAAS,aAAa,eAAe,OAAO;CACjE,GACA,CAAC,CACH;CAEA,MAAM,kBAAkB,SAAiB;EACvC,IAAI,CAAC,eAAe;EACpB,IAAI,eAAe,SAAS,aAAa,eAAe,OAAO;EAC/D,eAAe,UAAU,iBAAiB;GACxC,eAAe,UAAU;GACzB,cAAc,IAAI;EACpB,GAAG,aAAa;CAClB;CAEA,MAAM,kBAAkB;EACtB,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,IAAI;EACvC,IAAI,SAAS,OAAO;GAClB,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB;CACF;CACA,MAAM,kBAAkB;EACtB,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,IAAI;EACvC,IAAI,SAAS,OAAO;GAClB,cAAc,IAAI;GAClB,eAAe,IAAI;EACrB;CACF;CAEA,MAAM,QAAQ,SAAS;CACvB,MAAM,QAAQ,SAAS;CAEvB,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,WAAW,GACT,0FACA,SACF;YAPF;GASE,oBAAC,UAAD;IACE,MAAK;IACL,cAAY;IACZ,SAAS;IACT,UAAU,YAAY;IACtB,WAAW;cAEX,oBAAC,aAAD,EAAa,WAAU,2BAA4B,CAAA;GAC7C,CAAA;GACR,oBAAC,QAAD;IACE,WAAU;IACV,aAAU;cAET,YAAY,KAAK;GACd,CAAA;GACN,oBAAC,UAAD;IACE,MAAK;IACL,cAAY;IACZ,SAAS;IACT,UAAU,YAAY;IACtB,WAAW;cAEX,oBAAC,cAAD,EAAc,WAAU,2BAA4B,CAAA;GAC9C,CAAA;EACL;;AAET,CACF;AAEA,QAAQ,cAAc"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const require_chunk = require("../chunk-DY84GLCh.cjs");
|
|
4
|
+
const require_lib_accent_colors = require("../lib/accent-colors.cjs");
|
|
5
|
+
const require_components_field = require("./field.cjs");
|
|
6
|
+
const require_lib_selection_list = require("../lib/selection-list.cjs");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
|
+
let cn = require("cn");
|
|
11
|
+
//#region src/components/switch-group.tsx
|
|
12
|
+
/** Lays out switches as one group; each switch keeps its own checked state. */
|
|
13
|
+
function SwitchGroup({ className, styleVariant, color, gap = 3, listStyle, style, ...props }) {
|
|
14
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
15
|
+
role: "group",
|
|
16
|
+
"data-slot": "switch-group",
|
|
17
|
+
"data-style": styleVariant !== void 0 || color !== void 0 ? styleVariant ?? "solid" : void 0,
|
|
18
|
+
"data-accent-color": color ? require_lib_accent_colors.accentByColor[color] : void 0,
|
|
19
|
+
"data-list-style": listStyle,
|
|
20
|
+
"data-invalid": require_components_field.useFieldSetInvalid(),
|
|
21
|
+
className: (0, cn.cn)("grid", listStyle ? require_lib_selection_list.selectionListClasses[listStyle] : "gap-[calc(var(--spark-layout-gap)*var(--switch-group-gap-steps,3))]", className),
|
|
22
|
+
style: {
|
|
23
|
+
"--switch-group-gap-steps": gap,
|
|
24
|
+
...style
|
|
25
|
+
},
|
|
26
|
+
...props
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
exports.SwitchGroup = SwitchGroup;
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=switch-group.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-group.cjs","names":["accentByColor","useFieldSetInvalid","selectionListClasses"],"sources":["../../src/components/switch-group.tsx"],"sourcesContent":["import * as React from 'react'\nimport { accentByColor } from '../lib/accent-colors'\nimport { selectionListClasses } from '../lib/selection-list'\nimport type { SparkInputStyle, SparkStyle } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\nimport { useFieldSetInvalid } from './field'\nimport type { SparkSwitchColor } from './switch'\n\ntype SwitchGroupProps = React.ComponentProps<'div'> & {\n styleVariant?: SparkStyle\n color?: SparkSwitchColor\n /** How many `--spark-layout-gap` units apart each switch sits. */\n gap?: number\n /** Shows the options as a styled list of `SelectionItem` rows; ignores `gap`. */\n listStyle?: SparkInputStyle\n}\n\n/** Lays out switches as one group; each switch keeps its own checked state. */\nfunction SwitchGroup({\n className,\n styleVariant,\n color,\n gap = 3,\n listStyle,\n style,\n ...props\n}: SwitchGroupProps) {\n const hasLook = styleVariant !== undefined || color !== undefined\n const dataStyle = hasLook ? (styleVariant ?? 'solid') : undefined\n const dataAccentColor = color ? accentByColor[color] : undefined\n const invalid = useFieldSetInvalid()\n\n return (\n <div\n role=\"group\"\n data-slot=\"switch-group\"\n data-style={dataStyle}\n data-accent-color={dataAccentColor}\n data-list-style={listStyle}\n data-invalid={invalid}\n className={cn(\n 'grid',\n listStyle\n ? selectionListClasses[listStyle]\n : 'gap-[calc(var(--spark-layout-gap)*var(--switch-group-gap-steps,3))]',\n className,\n )}\n style={\n { '--switch-group-gap-steps': gap, ...style } as React.CSSProperties\n }\n {...props}\n />\n )\n}\n\nexport { SwitchGroup }\nexport type { SwitchGroupProps }\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAS,YAAY,EACnB,WACA,cACA,OACA,MAAM,GACN,WACA,OACA,GAAG,SACgB;CAMnB,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cATY,iBAAiB,KAAA,KAAa,UAAU,KAAA,IAC3B,gBAAgB,UAAW,KAAA;EASpD,qBARoB,QAAQA,0BAAAA,cAAc,SAAS,KAAA;EASnD,mBAAiB;EACjB,gBATYC,yBAAAA,mBASQ;EACpB,YAAA,GAAA,GAAA,IACE,QACA,YACIC,2BAAAA,qBAAqB,aACrB,uEACJ,SACF;EACA,OACE;GAAE,4BAA4B;GAAK,GAAG;EAAM;EAE9C,GAAI;CACL,CAAA;AAEL"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { g as SparkStyle, l as SparkInputStyle } from "../theme-types-CKZzOmSa.cjs";
|
|
4
|
+
import { SparkSwitchColor } from "./switch.cjs";
|
|
5
|
+
import * as React$1 from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/components/switch-group.d.ts
|
|
8
|
+
type SwitchGroupProps = React$1.ComponentProps<'div'> & {
|
|
9
|
+
styleVariant?: SparkStyle;
|
|
10
|
+
color?: SparkSwitchColor; /** How many `--spark-layout-gap` units apart each switch sits. */
|
|
11
|
+
gap?: number; /** Shows the options as a styled list of `SelectionItem` rows; ignores `gap`. */
|
|
12
|
+
listStyle?: SparkInputStyle;
|
|
13
|
+
};
|
|
14
|
+
/** Lays out switches as one group; each switch keeps its own checked state. */
|
|
15
|
+
declare function SwitchGroup({
|
|
16
|
+
className,
|
|
17
|
+
styleVariant,
|
|
18
|
+
color,
|
|
19
|
+
gap,
|
|
20
|
+
listStyle,
|
|
21
|
+
style,
|
|
22
|
+
...props
|
|
23
|
+
}: SwitchGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { SwitchGroup, type SwitchGroupProps };
|
|
26
|
+
//# sourceMappingURL=switch-group.d.cts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { g as SparkStyle, l as SparkInputStyle } from "../theme-types-CKZzOmSa.js";
|
|
4
|
+
import { SparkSwitchColor } from "./switch.js";
|
|
5
|
+
import * as React$1 from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/components/switch-group.d.ts
|
|
8
|
+
type SwitchGroupProps = React$1.ComponentProps<'div'> & {
|
|
9
|
+
styleVariant?: SparkStyle;
|
|
10
|
+
color?: SparkSwitchColor; /** How many `--spark-layout-gap` units apart each switch sits. */
|
|
11
|
+
gap?: number; /** Shows the options as a styled list of `SelectionItem` rows; ignores `gap`. */
|
|
12
|
+
listStyle?: SparkInputStyle;
|
|
13
|
+
};
|
|
14
|
+
/** Lays out switches as one group; each switch keeps its own checked state. */
|
|
15
|
+
declare function SwitchGroup({
|
|
16
|
+
className,
|
|
17
|
+
styleVariant,
|
|
18
|
+
color,
|
|
19
|
+
gap,
|
|
20
|
+
listStyle,
|
|
21
|
+
style,
|
|
22
|
+
...props
|
|
23
|
+
}: SwitchGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { SwitchGroup, type SwitchGroupProps };
|
|
26
|
+
//# sourceMappingURL=switch-group.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../utils/cn.js";
|
|
3
|
+
import { accentByColor } from "../lib/accent-colors.js";
|
|
4
|
+
import { useFieldSetInvalid } from "./field.js";
|
|
5
|
+
import { selectionListClasses } from "../lib/selection-list.js";
|
|
6
|
+
import "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
//#region src/components/switch-group.tsx
|
|
9
|
+
/** Lays out switches as one group; each switch keeps its own checked state. */
|
|
10
|
+
function SwitchGroup({ className, styleVariant, color, gap = 3, listStyle, style, ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx("div", {
|
|
12
|
+
role: "group",
|
|
13
|
+
"data-slot": "switch-group",
|
|
14
|
+
"data-style": styleVariant !== void 0 || color !== void 0 ? styleVariant ?? "solid" : void 0,
|
|
15
|
+
"data-accent-color": color ? accentByColor[color] : void 0,
|
|
16
|
+
"data-list-style": listStyle,
|
|
17
|
+
"data-invalid": useFieldSetInvalid(),
|
|
18
|
+
className: cn("grid", listStyle ? selectionListClasses[listStyle] : "gap-[calc(var(--spark-layout-gap)*var(--switch-group-gap-steps,3))]", className),
|
|
19
|
+
style: {
|
|
20
|
+
"--switch-group-gap-steps": gap,
|
|
21
|
+
...style
|
|
22
|
+
},
|
|
23
|
+
...props
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { SwitchGroup };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=switch-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-group.js","names":[],"sources":["../../src/components/switch-group.tsx"],"sourcesContent":["import * as React from 'react'\nimport { accentByColor } from '../lib/accent-colors'\nimport { selectionListClasses } from '../lib/selection-list'\nimport type { SparkInputStyle, SparkStyle } from '../lib/theme-types'\nimport { cn } from '../utils/cn'\nimport { useFieldSetInvalid } from './field'\nimport type { SparkSwitchColor } from './switch'\n\ntype SwitchGroupProps = React.ComponentProps<'div'> & {\n styleVariant?: SparkStyle\n color?: SparkSwitchColor\n /** How many `--spark-layout-gap` units apart each switch sits. */\n gap?: number\n /** Shows the options as a styled list of `SelectionItem` rows; ignores `gap`. */\n listStyle?: SparkInputStyle\n}\n\n/** Lays out switches as one group; each switch keeps its own checked state. */\nfunction SwitchGroup({\n className,\n styleVariant,\n color,\n gap = 3,\n listStyle,\n style,\n ...props\n}: SwitchGroupProps) {\n const hasLook = styleVariant !== undefined || color !== undefined\n const dataStyle = hasLook ? (styleVariant ?? 'solid') : undefined\n const dataAccentColor = color ? accentByColor[color] : undefined\n const invalid = useFieldSetInvalid()\n\n return (\n <div\n role=\"group\"\n data-slot=\"switch-group\"\n data-style={dataStyle}\n data-accent-color={dataAccentColor}\n data-list-style={listStyle}\n data-invalid={invalid}\n className={cn(\n 'grid',\n listStyle\n ? selectionListClasses[listStyle]\n : 'gap-[calc(var(--spark-layout-gap)*var(--switch-group-gap-steps,3))]',\n className,\n )}\n style={\n { '--switch-group-gap-steps': gap, ...style } as React.CSSProperties\n }\n {...props}\n />\n )\n}\n\nexport { SwitchGroup }\nexport type { SwitchGroupProps }\n"],"mappings":";;;;;;;;;AAkBA,SAAS,YAAY,EACnB,WACA,cACA,OACA,MAAM,GACN,WACA,OACA,GAAG,SACgB;CAMnB,OACE,oBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cATY,iBAAiB,KAAA,KAAa,UAAU,KAAA,IAC3B,gBAAgB,UAAW,KAAA;EASpD,qBARoB,QAAQ,cAAc,SAAS,KAAA;EASnD,mBAAiB;EACjB,gBATY,mBASQ;EACpB,WAAW,GACT,QACA,YACI,qBAAqB,aACrB,uEACJ,SACF;EACA,OACE;GAAE,4BAA4B;GAAK,GAAG;EAAM;EAE9C,GAAI;CACL,CAAA;AAEL"}
|
package/dist/components/tabs.cjs
CHANGED
|
@@ -36,10 +36,11 @@ function Tabs(props) {
|
|
|
36
36
|
...props
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
const TabsVariantContext = react.createContext("underline");
|
|
39
40
|
const REVEAL_PEEK = 40;
|
|
40
41
|
const WORM_MS = 210;
|
|
41
42
|
const TabsList = react.forwardRef(function TabsList({ className, style, variant = "underline", fill, ...props }, ref) {
|
|
42
|
-
const resolved = variant === "pill" ? "pill" : "underline";
|
|
43
|
+
const resolved = variant === "pill" ? "pill" : variant === "portal" ? "portal" : "underline";
|
|
43
44
|
const wrapperRef = react.useRef(null);
|
|
44
45
|
const scrollerRef = react.useRef(null);
|
|
45
46
|
const scrollerCallbackRef = react.useMemo(() => composeRefs(scrollerRef, ref), [ref]);
|
|
@@ -86,7 +87,7 @@ const TabsList = react.forwardRef(function TabsList({ className, style, variant
|
|
|
86
87
|
}
|
|
87
88
|
syncOverflow();
|
|
88
89
|
if (active && changed) {
|
|
89
|
-
reveal(active);
|
|
90
|
+
if (resolved !== "portal") reveal(active);
|
|
90
91
|
lastActive = active;
|
|
91
92
|
}
|
|
92
93
|
mounted = true;
|
|
@@ -126,35 +127,43 @@ const TabsList = react.forwardRef(function TabsList({ className, style, variant
|
|
|
126
127
|
className: (0, cn.cn)("touch-target absolute top-1/2 z-1 hidden size-10 -translate-y-1/2 cursor-pointer items-center justify-center rounded-[max(var(--spark-rounded-md),var(--spark-rounded-full))] bg-gray-1/72 text-gray-a11 backdrop-blur-sm hover:text-gray-12", dir === 1 ? "right-0 group-data-overflow-end/tabs:flex" : "left-0 group-data-overflow-start/tabs:flex"),
|
|
127
128
|
children: dir === 1 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_epilot_spark_icons.ChevronRight, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_epilot_spark_icons.ChevronLeft, {})
|
|
128
129
|
});
|
|
129
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
"
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
130
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TabsVariantContext.Provider, {
|
|
131
|
+
value: resolved,
|
|
132
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
133
|
+
className: (0, cn.cn)("group/tabs relative max-w-full", fill ? "block w-full" : "inline-block", className),
|
|
134
|
+
"data-fill": fill ? true : void 0,
|
|
135
|
+
"data-slot": "tabs-list",
|
|
136
|
+
"data-variant": resolved,
|
|
137
|
+
ref: wrapperRef,
|
|
138
|
+
style,
|
|
139
|
+
children: [
|
|
140
|
+
resolved === "portal" ? null : chevron(-1),
|
|
141
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_tabs.Tabs.List, {
|
|
142
|
+
"data-slot": "tabs-scroller",
|
|
143
|
+
ref: scrollerCallbackRef,
|
|
144
|
+
className: (0, cn.cn)("relative flex", resolved === "portal" ? "h-10 items-center gap-4 overflow-visible text-gray" : "no-scrollbar w-full items-stretch overflow-x-auto scroll-smooth motion-reduce:scroll-auto", resolved === "portal" && (fill ? "w-full" : "w-fit"), resolved === "underline" && "gap-2", resolved === "underline" && "after:pointer-events-none after:absolute after:bottom-0 after:left-(--tabs-indicator-x,0px) after:h-1 after:w-(--tabs-indicator-w,0px) after:rounded-full after:bg-(--spark-tabs-indicator,var(--spark-indicator)) after:transition-none after:duration-200 after:ease-out after:content-[''] data-indicator-ready:after:transition-[left,width] motion-reduce:after:transition-none!", resolved === "underline" && "has-[[data-slot=tabs-trigger][data-active][aria-invalid=true]]:after:bg-input-invalid", resolved === "pill" && "gap-0 rounded-md bg-gray-a3 p-1"),
|
|
145
|
+
...props
|
|
146
|
+
}),
|
|
147
|
+
resolved === "portal" ? null : chevron(1)
|
|
148
|
+
]
|
|
149
|
+
})
|
|
146
150
|
});
|
|
147
151
|
});
|
|
148
152
|
function TabsTrigger({ className, children, ...props }) {
|
|
149
|
-
|
|
153
|
+
const variant = react.useContext(TabsVariantContext);
|
|
154
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_tabs.Tabs.Tab, {
|
|
150
155
|
"data-slot": "tabs-trigger",
|
|
151
|
-
className: (0, cn.cn)("group/trigger touch-target inline-flex
|
|
156
|
+
className: (0, cn.cn)("group/trigger touch-target inline-flex shrink-0 cursor-pointer scroll-mx-10 items-center justify-center whitespace-nowrap", variant === "portal" ? "min-w-20 flex-col rounded-sm text-base font-bold text-gray transition-none first:ml-0.5 last:mr-6 focus-visible:ring-2 focus-visible:ring-offset-0 data-disabled:opacity-50" : "min-w-(--tabs-trigger-minw,0px) text-gray-12 transition-colors motion-reduce:transition-none", "group-data-fill/tabs:shrink group-data-fill/tabs:grow group-data-fill/tabs:basis-0", variant === "portal" ? null : "data-active:text-(--spark-tabs-ink,var(--spark-a11))", "focus-visible:outline-hidden", "group-data-[variant=pill]/tabs:focus-visible:ring-2 group-data-[variant=pill]/tabs:focus-visible:ring-offset-1", "data-disabled:pointer-events-none", variant === "portal" ? null : "data-disabled:text-gray-a8", "aria-invalid:text-error-soft-foreground group-data-[variant=underline]/tabs:aria-invalid:border-input-invalid data-active:aria-invalid:text-error-soft-foreground", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4", "group-data-[variant=underline]/tabs:min-h-12 group-data-[variant=underline]/tabs:px-1 group-data-[variant=underline]/tabs:text-base group-data-[variant=underline]/tabs:font-bold group-data-[variant=underline]/tabs:[--tabs-trigger-minw:5rem]", "group-data-[variant=underline]/tabs:border-b-2 group-data-[variant=underline]/tabs:border-gray-a5", "group-data-[variant=pill]/tabs:h-8 group-data-[variant=pill]/tabs:rounded-sm group-data-[variant=pill]/tabs:px-4 group-data-[variant=pill]/tabs:text-sm group-data-[variant=pill]/tabs:font-medium", "group-data-[variant=pill]/tabs:not-data-active:hover:bg-gray-a3", "group-data-[variant=pill]/tabs:data-active:bg-gray-1 group-data-[variant=pill]/tabs:data-active:shadow-sm dark:group-data-[variant=pill]/tabs:data-active:bg-gray-a4 dark:group-data-[variant=pill]/tabs:data-active:inset-ring dark:group-data-[variant=pill]/tabs:data-active:inset-ring-gray-a6", className),
|
|
152
157
|
...props,
|
|
153
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
158
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
154
159
|
"data-slot": "tabs-trigger-inner",
|
|
155
160
|
className: (0, cn.cn)("inline-flex items-center gap-1", "group-data-[variant=underline]/tabs:rounded-md group-data-[variant=underline]/tabs:px-2 group-data-[variant=underline]/tabs:py-1 group-data-[variant=underline]/tabs:transition-colors", "group-data-[variant=underline]/tabs:group-hover/trigger:bg-gray-a3", "group-data-[variant=underline]/tabs:group-focus-visible/trigger:ring-2 group-data-[variant=underline]/tabs:group-focus-visible/trigger:ring-offset-1"),
|
|
156
161
|
children
|
|
157
|
-
})
|
|
162
|
+
}), variant === "portal" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
163
|
+
"aria-hidden": "true",
|
|
164
|
+
"data-slot": "tabs-indicator",
|
|
165
|
+
className: "mt-1.5 flex h-1 w-full px-4 group-data-active/trigger:bg-base-accent-solid"
|
|
166
|
+
}) : null]
|
|
158
167
|
});
|
|
159
168
|
}
|
|
160
169
|
/** @deprecated Use `TabsTrigger` — it adapts to the `TabsList` variant automatically. */
|