@goliapkg/gds 2.1.1 → 2.2.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/a11y-CoNNB_xa.js +6 -0
- package/dist/a11y-CoNNB_xa.js.map +1 -0
- package/dist/{avatar-Ct8OOGx6.js → avatar-oCar1zX6.js} +2 -2
- package/dist/{avatar-Ct8OOGx6.js.map → avatar-oCar1zX6.js.map} +1 -1
- package/dist/{badge-BCvi5RVF.js → badge-B3ijD3ch.js} +2 -2
- package/dist/{badge-BCvi5RVF.js.map → badge-B3ijD3ch.js.map} +1 -1
- package/dist/{button-BD3VHhwq.js → button-fRpdsI_4.js} +15 -41
- package/dist/button-fRpdsI_4.js.map +1 -0
- package/dist/dist-qdXk1a7h.js +35 -0
- package/dist/dist-qdXk1a7h.js.map +1 -0
- package/dist/{dom-17XgfxMq.js → dom-DkPgnDHP.js} +1 -1
- package/dist/{dom-17XgfxMq.js.map → dom-DkPgnDHP.js.map} +1 -1
- package/dist/editor/index.d.ts +11 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +1250 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/email-composer-field-UoKh5XMX.js +178 -0
- package/dist/email-composer-field-UoKh5XMX.js.map +1 -0
- package/dist/{gesture-I79dlTuS.js → gesture-CVcSA-iZ.js} +1 -1
- package/dist/{gesture-I79dlTuS.js.map → gesture-CVcSA-iZ.js.map} +1 -1
- package/dist/{highlight-BAGZc-4h.js → highlight-pgwGrmcq.js} +1 -1
- package/dist/{highlight-BAGZc-4h.js.map → highlight-pgwGrmcq.js.map} +1 -1
- package/dist/{hooks-BE-_EmDI.js → hooks-CejfTXVD.js} +1 -1
- package/dist/{hooks-BE-_EmDI.js.map → hooks-CejfTXVD.js.map} +1 -1
- package/dist/{icon-button-Bns79124.js → icon-button-CR2GECEZ.js} +3 -3
- package/dist/{icon-button-Bns79124.js.map → icon-button-CR2GECEZ.js.map} +1 -1
- package/dist/index.js +30 -27
- package/dist/l2-primitives/index.js +11 -11
- package/dist/{l2-primitives-Cn0KNxbB.js → l2-primitives-D503ozjH.js} +4 -4
- package/dist/{l2-primitives-Cn0KNxbB.js.map → l2-primitives-D503ozjH.js.map} +1 -1
- package/dist/l3-atoms/index.js +6 -5
- package/dist/{l3-atoms-BCJNqPHk.js → l3-atoms-CumlHlnP.js} +54 -53
- package/dist/{l3-atoms-BCJNqPHk.js.map → l3-atoms-CumlHlnP.js.map} +1 -1
- package/dist/l4-molecules/index.js +5 -4
- package/dist/{l4-molecules-DtNnQaFU.js → l4-molecules-CWwgFWmO.js} +125 -124
- package/dist/{l4-molecules-DtNnQaFU.js.map → l4-molecules-CWwgFWmO.js.map} +1 -1
- package/dist/l5-organisms/index.d.ts +0 -10
- package/dist/l5-organisms/index.d.ts.map +1 -1
- package/dist/l5-organisms/index.js +2 -2
- package/dist/{l5-organisms-Bu2Z8LSj.js → l5-organisms-QcvIAoHr.js} +1310 -2548
- package/dist/l5-organisms-QcvIAoHr.js.map +1 -0
- package/dist/l6-charts/index.js +1 -1
- package/dist/{l6-charts-DEA5DgMy.js → l6-charts-DKNVGuo0.js} +145 -17
- package/dist/l6-charts-DKNVGuo0.js.map +1 -0
- package/dist/l7-patterns/index.js +1 -1
- package/dist/{l7-patterns-CwonNW9o.js → l7-patterns-CM3FUxjA.js} +34 -34
- package/dist/{l7-patterns-CwonNW9o.js.map → l7-patterns-CM3FUxjA.js.map} +1 -1
- package/dist/loading-dots-CjzCz938.js +24 -0
- package/dist/loading-dots-CjzCz938.js.map +1 -0
- package/dist/motion-CKB1OKVd.js +22 -0
- package/dist/motion-CKB1OKVd.js.map +1 -0
- package/dist/{portal-Bbl6F_Wj.js → portal-B7bfstxv.js} +1 -1
- package/dist/{portal-Bbl6F_Wj.js.map → portal-B7bfstxv.js.map} +1 -1
- package/dist/{progress-dZIQEiTw.js → progress-B81FKPw5.js} +2 -2
- package/dist/{progress-dZIQEiTw.js.map → progress-B81FKPw5.js.map} +1 -1
- package/dist/{resize-handle-BjSNhgJK.js → resize-handle-BFffbhyG.js} +2 -2
- package/dist/{resize-handle-BjSNhgJK.js.map → resize-handle-BFffbhyG.js.map} +1 -1
- package/dist/{sanitize-BF45M9xp.js → sanitize-CO5dRqZX.js} +1 -1
- package/dist/{sanitize-BF45M9xp.js.map → sanitize-CO5dRqZX.js.map} +1 -1
- package/dist/{separator-CRll1Ycp.js → separator-wAUWmxji.js} +2 -2
- package/dist/{separator-CRll1Ycp.js.map → separator-wAUWmxji.js.map} +1 -1
- package/dist/{skeleton-C9FFZSYN.js → skeleton-DhqLfA7r.js} +1 -1
- package/dist/{skeleton-C9FFZSYN.js.map → skeleton-DhqLfA7r.js.map} +1 -1
- package/dist/{spinner-C15eER04.js → spinner-BimzKtfC.js} +3 -3
- package/dist/{spinner-C15eER04.js.map → spinner-BimzKtfC.js.map} +1 -1
- package/dist/{stepper-DJ8pn-9D.js → stepper-BINbai2f.js} +4 -4
- package/dist/{stepper-DJ8pn-9D.js.map → stepper-BINbai2f.js.map} +1 -1
- package/dist/{switch-BAS-GXJV.js → switch-COzaggYE.js} +3 -3
- package/dist/{switch-BAS-GXJV.js.map → switch-COzaggYE.js.map} +1 -1
- package/dist/{textarea-Btdu41rY.js → textarea-DD1huKel.js} +3 -3
- package/dist/{textarea-Btdu41rY.js.map → textarea-DD1huKel.js.map} +1 -1
- package/dist/toast-BujeTn1T.js +442 -0
- package/dist/toast-BujeTn1T.js.map +1 -0
- package/dist/{loading-dots-C1LPHGa0.js → tooltip-BlvhLCp0.js} +2 -17
- package/dist/tooltip-BlvhLCp0.js.map +1 -0
- package/dist/utils/index.js +8 -7
- package/package.json +5 -1
- package/dist/button-BD3VHhwq.js.map +0 -1
- package/dist/l5-organisms-Bu2Z8LSj.js.map +0 -1
- package/dist/l6-charts-DEA5DgMy.js.map +0 -1
- package/dist/loading-dots-C1LPHGa0.js.map +0 -1
- package/dist/motion-DUPegem-.js +0 -22
- package/dist/motion-DUPegem-.js.map +0 -1
- package/dist/toast-QxCZG0Oy.js +0 -614
- package/dist/toast-QxCZG0Oy.js.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { r as e } from "./glass-CQTlX7IO.js";
|
|
2
|
+
import { forwardRef as t } from "react";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
//#region src/l3-atoms/loading-dots.tsx
|
|
5
|
+
var r = {
|
|
6
|
+
default: "h-1.5 w-1.5",
|
|
7
|
+
sm: "h-1 w-1"
|
|
8
|
+
}, i = t(function({ className: t, count: i = 3, size: a = "default", ...o }, s) {
|
|
9
|
+
return /* @__PURE__ */ n("span", {
|
|
10
|
+
className: e("gds-gap-xs inline-flex items-center", t),
|
|
11
|
+
"data-component": "loading-dots",
|
|
12
|
+
ref: s,
|
|
13
|
+
role: "status",
|
|
14
|
+
...o,
|
|
15
|
+
children: Array.from({ length: i }, (t, i) => /* @__PURE__ */ n("span", {
|
|
16
|
+
className: e("gds-radius-badge bg-fg-muted/40 animate-pulse", r[a]),
|
|
17
|
+
style: { animationDelay: `${i * 150}ms` }
|
|
18
|
+
}, i))
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//#endregion
|
|
22
|
+
export { i as t };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=loading-dots-CjzCz938.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading-dots-CjzCz938.js","names":[],"sources":["../src/l3-atoms/loading-dots.tsx"],"sourcesContent":["import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LoadingDotsProps = React.HTMLAttributes<HTMLSpanElement> & {\n count?: number\n size?: 'default' | 'sm'\n}\n\nconst sizeMap = {\n default: 'h-1.5 w-1.5',\n sm: 'h-1 w-1',\n}\n\nexport const LoadingDots = forwardRef<HTMLSpanElement, LoadingDotsProps>(\n function LoadingDots(\n { className, count = 3, size = 'default', ...props },\n ref\n ) {\n return (\n <span\n className={cx('gds-gap-xs inline-flex items-center', className)}\n data-component=\"loading-dots\"\n ref={ref}\n role=\"status\"\n {...props}\n >\n {Array.from({ length: count }, (_, i) => (\n <span\n className={cx(\n 'gds-radius-badge bg-fg-muted/40 animate-pulse',\n sizeMap[size]\n )}\n key={i}\n style={{ animationDelay: `${i * 150}ms` }}\n />\n ))}\n </span>\n )\n }\n)\n\nexport type { LoadingDotsProps }\n"],"mappings":";;;;AASA,IAAM,IAAU;CACd,SAAS;CACT,IAAI;CACL,EAEY,IAAc,EACzB,SACE,EAAE,cAAW,WAAQ,GAAG,UAAO,WAAW,GAAG,KAC7C,GACA;AACA,QACE,kBAAC,QAAD;EACE,WAAW,EAAG,uCAAuC,EAAU;EAC/D,kBAAe;EACV;EACL,MAAK;EACL,GAAI;YAEH,MAAM,KAAK,EAAE,QAAQ,GAAO,GAAG,GAAG,MACjC,kBAAC,QAAD;GACE,WAAW,EACT,iDACA,EAAQ,GACT;GAED,OAAO,EAAE,gBAAgB,GAAG,IAAI,IAAI,KAAK;GACzC,EAFK,EAEL,CACF;EACG,CAAA;EAGZ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/utils/motion.ts
|
|
2
|
+
var e = {
|
|
3
|
+
fadeIn: "animate-fade-in",
|
|
4
|
+
fadeOut: "animate-fade-out",
|
|
5
|
+
scaleIn: "animate-scale-in",
|
|
6
|
+
scaleOut: "animate-scale-out",
|
|
7
|
+
slideUp: "animate-slide-up",
|
|
8
|
+
slideDown: "animate-slide-down",
|
|
9
|
+
slideLeft: "animate-slide-left",
|
|
10
|
+
slideRight: "animate-slide-right"
|
|
11
|
+
};
|
|
12
|
+
function t(t) {
|
|
13
|
+
return t === void 0 ? "" : e[t] ?? "";
|
|
14
|
+
}
|
|
15
|
+
function n(e, n) {
|
|
16
|
+
let r = t(e);
|
|
17
|
+
return r === "" ? "" : n === "fast" ? `${r} animate-fast` : n === "slow" ? `${r} animate-slow` : r;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { n, t };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=motion-CKB1OKVd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion-CKB1OKVd.js","names":[],"sources":["../src/utils/motion.ts"],"sourcesContent":["// L-dep — motion helper\n// converts a motion prop value to a CSS class name\n// this is the bridge between component props and the CSS animation system\n// zero friction: <Card motion=\"scaleIn\"> → className=\"animate-scale-in\"\n\nconst PRESET_TO_CLASS: Record<string, string> = {\n fadeIn: 'animate-fade-in',\n fadeOut: 'animate-fade-out',\n scaleIn: 'animate-scale-in',\n scaleOut: 'animate-scale-out',\n slideUp: 'animate-slide-up',\n slideDown: 'animate-slide-down',\n slideLeft: 'animate-slide-left',\n slideRight: 'animate-slide-right',\n}\n\n// convert motion prop to className — returns empty string if no motion\nexport function motionClass(motion?: string): string {\n if (motion === undefined) return ''\n return PRESET_TO_CLASS[motion] ?? ''\n}\n\n// convert motion prop with speed variant\nexport function motionClassWithSpeed(\n motion?: string,\n speed?: 'fast' | 'slow'\n): string {\n const base = motionClass(motion)\n if (base === '') return ''\n if (speed === 'fast') return `${base} animate-fast`\n if (speed === 'slow') return `${base} animate-slow`\n return base\n}\n"],"mappings":";AAKA,IAAM,IAA0C;CAC9C,QAAQ;CACR,SAAS;CACT,SAAS;CACT,UAAU;CACV,SAAS;CACT,WAAW;CACX,WAAW;CACX,YAAY;CACb;AAGD,SAAgB,EAAY,GAAyB;AAEnD,QADI,MAAW,KAAA,IAAkB,KAC1B,EAAgB,MAAW;;AAIpC,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAO,EAAY,EAAO;AAIhC,QAHI,MAAS,KAAW,KACpB,MAAU,SAAe,GAAG,EAAK,iBACjC,MAAU,SAAe,GAAG,EAAK,iBAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-
|
|
1
|
+
{"version":3,"file":"portal-B7bfstxv.js","names":[],"sources":["../src/utils/portal.tsx"],"sourcesContent":["// portal — anti-corruption wrapper for react-dom createPortal\n// all portal rendering must go through this utility, not import react-dom directly\nimport type { ReactNode, ReactPortal } from 'react'\nimport { createPortal } from 'react-dom'\n\n// render children into a DOM container via portal\n// returns null during SSR (no document available)\nexport function renderPortal(\n children: ReactNode,\n container?: Element | null\n): ReactPortal | null {\n if (typeof document === 'undefined') return null\n return createPortal(children, container ?? document.body)\n}\n"],"mappings":";;AAOA,SAAgB,EACd,GACA,GACoB;AAEpB,QADI,OAAO,WAAa,MAAoB,OACrC,EAAa,GAAU,KAAa,SAAS,KAAK"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as e } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t } from "./dist-qdXk1a7h.js";
|
|
3
3
|
import { forwardRef as n } from "react";
|
|
4
4
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
5
|
//#region src/l2-primitives/progress.tsx
|
|
@@ -41,4 +41,4 @@ var a = t("flex-1 overflow-hidden gds-radius-badge bg-bg-tertiary", {
|
|
|
41
41
|
//#endregion
|
|
42
42
|
export { a as n, s as t };
|
|
43
43
|
|
|
44
|
-
//# sourceMappingURL=progress-
|
|
44
|
+
//# sourceMappingURL=progress-B81FKPw5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress-
|
|
1
|
+
{"version":3,"file":"progress-B81FKPw5.js","names":[],"sources":["../src/l2-primitives/progress.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst progressVariants = cva(\n 'flex-1 overflow-hidden gds-radius-badge bg-bg-tertiary',\n {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-2',\n lg: 'h-3',\n sm: 'h-1',\n },\n },\n }\n)\n\nconst barColorMap = {\n danger: 'bg-danger',\n default: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n}\n\ntype ProgressProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof progressVariants> & {\n showLabel?: boolean\n value?: number\n variant?: 'danger' | 'default' | 'success' | 'warning'\n }\n\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(\n function Progress(\n {\n className,\n showLabel = false,\n size,\n value = 0,\n variant = 'default',\n ...props\n },\n ref\n ) {\n const clamped = Math.max(0, Math.min(100, value))\n\n return (\n <div\n className={cx('gds-gap-sm flex items-center', className)}\n data-component=\"progress\"\n ref={ref}\n {...props}\n >\n <div\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={clamped}\n className={progressVariants({ size })}\n role=\"progressbar\"\n >\n <div\n className={cx(\n 'gds-radius-badge h-full transition-all',\n barColorMap[variant]\n )}\n style={{ width: `${clamped}%` }}\n />\n </div>\n {showLabel && (\n <span className=\"gds-text-label text-fg-muted shrink-0 font-mono tabular-nums select-none\">\n {clamped}%\n </span>\n )}\n </div>\n )\n }\n)\n\nexport { progressVariants }\nexport type { ProgressProps }\n"],"mappings":";;;;;AAMA,IAAM,IAAmB,EACvB,0DACA;CACE,iBAAiB,EAAE,MAAM,WAAW;CACpC,UAAU,EACR,MAAM;EACJ,SAAS;EACT,IAAI;EACJ,IAAI;EACL,EACF;CACF,CACF,EAEK,IAAc;CAClB,QAAQ;CACR,SAAS;CACT,SAAS;CACT,SAAS;CACV,EASY,IAAW,EACtB,SACE,EACE,cACA,eAAY,IACZ,SACA,WAAQ,GACR,aAAU,WACV,GAAG,KAEL,GACA;CACA,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC;AAEjD,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,gCAAgC,EAAU;EACxD,kBAAe;EACV;EACL,GAAI;YAJN,CAME,kBAAC,OAAD;GACE,iBAAe;GACf,iBAAe;GACf,iBAAe;GACf,WAAW,EAAiB,EAAE,SAAM,CAAC;GACrC,MAAK;aAEL,kBAAC,OAAD;IACE,WAAW,EACT,0CACA,EAAY,GACb;IACD,OAAO,EAAE,OAAO,GAAG,EAAQ,IAAI;IAC/B,CAAA;GACE,CAAA,EACL,KACC,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACG,GAAQ,IACJ;KAEL;;EAGX"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as e } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t } from "./a11y-CoNNB_xa.js";
|
|
3
3
|
import { forwardRef as n, useCallback as r, useRef as i } from "react";
|
|
4
4
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
5
|
//#region src/l3-atoms/checkbox.tsx
|
|
@@ -77,4 +77,4 @@ var c = n(function({ checked: n = !1, checkIcon: r, className: i, disabled: c =
|
|
|
77
77
|
//#endregion
|
|
78
78
|
export { c as n, l as r, u as t };
|
|
79
79
|
|
|
80
|
-
//# sourceMappingURL=resize-handle-
|
|
80
|
+
//# sourceMappingURL=resize-handle-BFffbhyG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resize-handle-
|
|
1
|
+
{"version":3,"file":"resize-handle-BFffbhyG.js","names":[],"sources":["../src/l3-atoms/checkbox.tsx","../src/l3-atoms/resize-handle.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype CheckboxProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'onChange'\n> & {\n checked?: boolean\n checkIcon?: ReactNode\n label?: string\n onChange?: (checked: boolean) => void\n}\n\n// default check SVG (no lucide dependency)\nfunction DefaultCheck() {\n return (\n <svg\n className=\"text-accent-fg h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M5 13l4 4L19 7\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n function Checkbox(\n {\n checked = false,\n checkIcon,\n className,\n disabled = false,\n label,\n onChange,\n ...props\n },\n ref\n ) {\n return (\n <button\n aria-checked={checked}\n className={cx(\n 'gds-gap-sm inline-flex items-center select-none',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"checkbox\"\n data-state={checked ? 'checked' : 'unchecked'}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n ref={ref}\n role=\"checkbox\"\n type=\"button\"\n {...props}\n >\n <span\n className={cx(\n 'gds-icon gds-radius-button inline-flex shrink-0 items-center justify-center border transition-colors',\n focusCls,\n checked\n ? 'border-accent bg-accent'\n : 'border-border bg-bg hover:border-accent/50'\n )}\n >\n <span\n className={cx(\n 'transition-opacity',\n checked ? 'opacity-100' : 'opacity-0'\n )}\n >\n {checkIcon ?? <DefaultCheck />}\n </span>\n </span>\n {label !== undefined && (\n <span className=\"gds-text-body text-fg\">{label}</span>\n )}\n </button>\n )\n }\n)\n\nconst checkboxVariants = {\n state: {\n checked: 'border-accent bg-accent',\n unchecked: 'border-border bg-bg hover:border-accent/50',\n },\n} as const\n\nexport { checkboxVariants }\nexport type { CheckboxProps }\n","import { forwardRef, useCallback, useRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ResizeHandleProps = React.HTMLAttributes<HTMLDivElement> & {\n orientation?: 'horizontal' | 'vertical'\n onResize: (delta: number) => void\n onResizeEnd?: () => void\n disabled?: boolean\n}\n\nexport const ResizeHandle = forwardRef<HTMLDivElement, ResizeHandleProps>(\n function ResizeHandle(\n {\n className,\n disabled,\n onResize,\n onResizeEnd,\n orientation = 'vertical',\n ...props\n },\n ref\n ) {\n const startPos = useRef(0)\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n\n const isVertical = orientation === 'vertical'\n startPos.current = isVertical ? e.clientX : e.clientY\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const current = isVertical ? moveEvent.clientX : moveEvent.clientY\n const delta = current - startPos.current\n startPos.current = current\n onResize(delta)\n }\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n onResizeEnd?.()\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n },\n [disabled, onResize, onResizeEnd, orientation]\n )\n\n return (\n <div\n className={cx(\n 'group relative flex items-center justify-center select-none',\n orientation === 'vertical'\n ? 'w-2 cursor-col-resize flex-col self-stretch'\n : 'h-2 cursor-row-resize self-stretch',\n disabled && 'pointer-events-none opacity-40',\n className\n )}\n data-component=\"resize-handle\"\n data-orientation={orientation}\n onMouseDown={handleMouseDown}\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n {...props}\n >\n <div\n className={cx(\n 'transition-colors',\n orientation === 'vertical'\n ? 'bg-border group-hover:bg-accent/50 group-active:bg-accent h-full w-0.5'\n : 'bg-border group-hover:bg-accent/50 group-active:bg-accent h-0.5 w-full'\n )}\n />\n </div>\n )\n }\n)\n\nexport type { ResizeHandleProps }\n"],"mappings":";;;;;AAiBA,SAAS,IAAe;AACtB,QACE,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,QAAO;EACP,aAAa;EACb,SAAQ;YAER,kBAAC,QAAD;GAAM,GAAE;GAAiB,eAAc;GAAQ,gBAAe;GAAU,CAAA;EACpE,CAAA;;AAIV,IAAa,IAAW,EACtB,SACE,EACE,aAAU,IACV,cACA,cACA,cAAW,IACX,UACA,aACA,GAAG,KAEL,GACA;AACA,QACE,kBAAC,UAAD;EACE,gBAAc;EACd,WAAW,EACT,mDACA,KAAY,iCACZ,EACD;EACD,kBAAe;EACf,cAAY,IAAU,YAAY;EACxB;EACV,eAAe,IAAW,CAAC,EAAQ;EAC9B;EACL,MAAK;EACL,MAAK;EACL,GAAI;YAdN,CAgBE,kBAAC,QAAD;GACE,WAAW,EACT,wGACA,GACA,IACI,4BACA,6CACL;aAED,kBAAC,QAAD;IACE,WAAW,EACT,sBACA,IAAU,gBAAgB,YAC3B;cAEA,KAAa,kBAAC,GAAD,EAAgB,CAAA;IACzB,CAAA;GACF,CAAA,EACN,MAAU,KAAA,KACT,kBAAC,QAAD;GAAM,WAAU;aAAyB;GAAa,CAAA,CAEjD;;EAGd,EAEK,IAAmB,EACvB,OAAO;CACL,SAAS;CACT,WAAW;CACZ,EACF,ECjFY,IAAe,EAC1B,SACE,EACE,cACA,aACA,aACA,gBACA,iBAAc,YACd,GAAG,KAEL,GACA;CACA,IAAM,IAAW,EAAO,EAAE,EAEpB,IAAkB,GACrB,MAAwB;AACvB,MAAI,EAAU;AACd,IAAE,gBAAgB;EAElB,IAAM,IAAa,MAAgB;AACnC,IAAS,UAAU,IAAa,EAAE,UAAU,EAAE;EAE9C,IAAM,KAAmB,MAA0B;GACjD,IAAM,IAAU,IAAa,EAAU,UAAU,EAAU,SACrD,IAAQ,IAAU,EAAS;AAEjC,GADA,EAAS,UAAU,GACnB,EAAS,EAAM;KAGX,UAAsB;AAG1B,GAFA,SAAS,oBAAoB,aAAa,EAAgB,EAC1D,SAAS,oBAAoB,WAAW,EAAc,EACtD,KAAe;;AAIjB,EADA,SAAS,iBAAiB,aAAa,EAAgB,EACvD,SAAS,iBAAiB,WAAW,EAAc;IAErD;EAAC;EAAU;EAAU;EAAa;EAAY,CAC/C;AAED,QACE,kBAAC,OAAD;EACE,WAAW,EACT,+DACA,MAAgB,aACZ,gDACA,sCACJ,KAAY,kCACZ,EACD;EACD,kBAAe;EACf,oBAAkB;EAClB,aAAa;EACR;EACL,MAAK;EACL,oBAAkB;EAClB,GAAI;YAEJ,kBAAC,OAAD,EACE,WAAW,EACT,qBACA,MAAgB,aACZ,2EACA,yEACL,EACD,CAAA;EACE,CAAA;EAGX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-
|
|
1
|
+
{"version":3,"file":"sanitize-CO5dRqZX.js","names":[],"sources":["../src/utils/sanitize.ts"],"sourcesContent":["// anti-corruption wrapper — HTML sanitization\n// L5 components import from here, never directly from dompurify\n// consumers who don't use EmailThread don't need dompurify installed\n\nimport DOMPurify, { type Config } from 'dompurify'\n\nexport type SanitizeConfig = Config\n\n// pre-configured sanitizer for email HTML rendering\nconst EMAIL_SANITIZE_CONFIG: SanitizeConfig = {\n FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input'],\n ADD_ATTR: ['style', 'align', 'bgcolor', 'target', 'rel'],\n RETURN_TRUSTED_TYPE: false,\n}\n\nexport function sanitizeEmailHtml(html: string): string {\n return DOMPurify.sanitize(html, EMAIL_SANITIZE_CONFIG) as string\n}\n\nexport function sanitizeHtml(html: string, config?: SanitizeConfig): string {\n return DOMPurify.sanitize(html, {\n ...config,\n RETURN_TRUSTED_TYPE: false,\n }) as string\n}\n\nexport { EMAIL_SANITIZE_CONFIG }\n"],"mappings":";;AASA,IAAM,IAAwC;CAC5C,aAAa;EAAC;EAAU;EAAU;EAAU;EAAS;EAAQ;EAAQ;CACrE,UAAU;EAAC;EAAS;EAAS;EAAW;EAAU;EAAM;CACxD,qBAAqB;CACtB;AAED,SAAgB,EAAkB,GAAsB;AACtD,QAAO,EAAU,SAAS,GAAM,EAAsB;;AAGxD,SAAgB,EAAa,GAAc,GAAiC;AAC1E,QAAO,EAAU,SAAS,GAAM;EAC9B,GAAG;EACH,qBAAqB;EACtB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as e } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t } from "./dist-qdXk1a7h.js";
|
|
3
3
|
import { forwardRef as n } from "react";
|
|
4
4
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
5
|
//#region src/l2-primitives/aspect-ratio.tsx
|
|
@@ -62,4 +62,4 @@ var a = n(function({ children: t, className: n, ratio: i = 16 / 9, style: a, ...
|
|
|
62
62
|
//#endregion
|
|
63
63
|
export { o as n, a as r, s as t };
|
|
64
64
|
|
|
65
|
-
//# sourceMappingURL=separator-
|
|
65
|
+
//# sourceMappingURL=separator-wAUWmxji.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"separator-
|
|
1
|
+
{"version":3,"file":"separator-wAUWmxji.js","names":[],"sources":["../src/l2-primitives/aspect-ratio.tsx","../src/l2-primitives/separator.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype AspectRatioProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode\n ratio?: number\n}\n\nexport const AspectRatio = forwardRef<HTMLDivElement, AspectRatioProps>(\n function AspectRatio(\n { children, className, ratio = 16 / 9, style, ...props },\n ref\n ) {\n return (\n <div\n className={cx('relative w-full overflow-hidden', className)}\n data-component=\"aspect-ratio\"\n ref={ref}\n style={{ ...style, aspectRatio: ratio }}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nexport type { AspectRatioProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst separatorVariants = cva('border-border', {\n defaultVariants: { variant: 'solid' },\n variants: {\n variant: {\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n solid: 'border-solid',\n },\n },\n})\n\ntype SeparatorProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof separatorVariants> & {\n label?: string\n orientation?: 'horizontal' | 'vertical'\n }\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n function Separator(\n {\n className,\n label,\n orientation = 'horizontal',\n variant = 'solid',\n ...props\n },\n ref\n ) {\n if (orientation === 'vertical') {\n return (\n <div\n aria-orientation=\"vertical\"\n className={cx(\n 'inline-block h-full border-l',\n separatorVariants({ variant }),\n className\n )}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n }\n\n if (label !== undefined) {\n return (\n <div\n className={cx('gds-gap flex items-center select-none', className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n >\n <div\n className={cx('flex-1 border-t', separatorVariants({ variant }))}\n />\n <span className=\"gds-text-caption text-fg-muted/40 shrink-0 font-semibold tracking-widest uppercase\">\n {label}\n </span>\n <div\n className={cx('flex-1 border-t', separatorVariants({ variant }))}\n />\n </div>\n )\n }\n\n if (variant === 'solid') {\n return (\n <div\n className={cx('bg-border h-px w-full shrink-0', className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n }\n\n return (\n <div\n aria-orientation=\"horizontal\"\n className={cx('border-t', separatorVariants({ variant }), className)}\n data-component=\"separator\"\n ref={ref}\n role=\"separator\"\n {...props}\n />\n )\n }\n)\n\nexport { separatorVariants }\nexport type { SeparatorProps }\n"],"mappings":";;;;;AAUA,IAAa,IAAc,EACzB,SACE,EAAE,aAAU,cAAW,WAAQ,KAAK,GAAG,UAAO,GAAG,KACjD,GACA;AACA,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,mCAAmC,EAAU;EAC3D,kBAAe;EACV;EACL,OAAO;GAAE,GAAG;GAAO,aAAa;GAAO;EACvC,GAAI;EAEH;EACG,CAAA;EAGX,ECrBK,IAAoB,EAAI,iBAAiB;CAC7C,iBAAiB,EAAE,SAAS,SAAS;CACrC,UAAU,EACR,SAAS;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACR,EACF;CACF,CAAC,EAQW,IAAY,EACvB,SACE,EACE,cACA,UACA,iBAAc,cACd,aAAU,SACV,GAAG,KAEL,GACA;AAoDA,QAnDI,MAAgB,aAEhB,kBAAC,OAAD;EACE,oBAAiB;EACjB,WAAW,EACT,gCACA,EAAkB,EAAE,YAAS,CAAC,EAC9B,EACD;EACD,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GAIF,MAAU,KAAA,IAsBV,MAAY,UAEZ,kBAAC,OAAD;EACE,WAAW,EAAG,kCAAkC,EAAU;EAC1D,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GAKJ,kBAAC,OAAD;EACE,oBAAiB;EACjB,WAAW,EAAG,YAAY,EAAkB,EAAE,YAAS,CAAC,EAAE,EAAU;EACpE,kBAAe;EACV;EACL,MAAK;EACL,GAAI;EACJ,CAAA,GAxCA,kBAAC,OAAD;EACE,WAAW,EAAG,yCAAyC,EAAU;EACjE,kBAAe;EACV;EACL,MAAK;EACL,GAAI;YALN;GAOE,kBAAC,OAAD,EACE,WAAW,EAAG,mBAAmB,EAAkB,EAAE,YAAS,CAAC,CAAC,EAChE,CAAA;GACF,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GACP,kBAAC,OAAD,EACE,WAAW,EAAG,mBAAmB,EAAkB,EAAE,YAAS,CAAC,CAAC,EAChE,CAAA;GACE;;EA2Bb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton-
|
|
1
|
+
{"version":3,"file":"skeleton-DhqLfA7r.js","names":[],"sources":["../src/l2-primitives/skeleton.tsx"],"sourcesContent":["// skeleton — loading placeholder with shimmer animation\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype SkeletonVariant = 'circle' | 'rect' | 'text'\n\ntype SkeletonProps = {\n className?: string\n height?: number | string\n lines?: number\n variant?: SkeletonVariant\n width?: number | string\n}\n\nconst shimmerStyle: React.CSSProperties = {\n backgroundImage:\n 'linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.06) 40%, rgba(255,255,255,0.06) 60%, transparent 100%)',\n backgroundSize: '200% 100%',\n animation: 'gds-shimmer 1.5s ease-in-out infinite',\n}\n\nconst variantDefaults: Record<SkeletonVariant, string> = {\n text: 'h-4 w-full rounded',\n circle: 'h-10 w-10 rounded-full',\n rect: 'h-20 w-full rounded-md',\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n function Skeleton(\n { className, height, lines = 1, variant = 'text', width },\n ref\n ) {\n const sizeStyle: React.CSSProperties = {}\n if (width !== undefined)\n sizeStyle.width = typeof width === 'number' ? `${width}px` : width\n if (height !== undefined)\n sizeStyle.height = typeof height === 'number' ? `${height}px` : height\n\n const baseClass = cx('bg-bg-tertiary', variantDefaults[variant])\n\n if (variant === 'text' && lines > 1) {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col gap-2', className)}\n data-component=\"skeleton\"\n data-variant={variant}\n >\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cx(baseClass, i === lines - 1 && 'w-3/4')}\n style={{ ...sizeStyle, ...shimmerStyle }}\n />\n ))}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(baseClass, className)}\n data-component=\"skeleton\"\n data-variant={variant}\n style={{ ...sizeStyle, ...shimmerStyle }}\n />\n )\n }\n)\n\nexport type { SkeletonProps, SkeletonVariant }\n"],"mappings":";;;;AAeA,IAAM,IAAoC;CACxC,iBACE;CACF,gBAAgB;CAChB,WAAW;CACZ,EAEK,IAAmD;CACvD,MAAM;CACN,QAAQ;CACR,MAAM;CACP,EAEY,IAAW,EACtB,SACE,EAAE,cAAW,WAAQ,WAAQ,GAAG,aAAU,QAAQ,YAClD,GACA;CACA,IAAM,IAAiC,EAAE;AAGzC,CAFI,MAAU,KAAA,MACZ,EAAU,QAAQ,OAAO,KAAU,WAAW,GAAG,EAAM,MAAM,IAC3D,MAAW,KAAA,MACb,EAAU,SAAS,OAAO,KAAW,WAAW,GAAG,EAAO,MAAM;CAElE,IAAM,IAAY,EAAG,kBAAkB,EAAgB,GAAS;AAqBhE,QAnBI,MAAY,UAAU,IAAQ,IAE9B,kBAAC,OAAD;EACO;EACL,WAAW,EAAG,uBAAuB,EAAU;EAC/C,kBAAe;EACf,gBAAc;YAEb,MAAM,KAAK,EAAE,QAAQ,GAAO,GAAG,GAAG,MACjC,kBAAC,OAAD;GAEE,WAAW,EAAG,GAAW,MAAM,IAAQ,KAAK,QAAQ;GACpD,OAAO;IAAE,GAAG;IAAW,GAAG;IAAc;GACxC,EAHK,EAGL,CACF;EACE,CAAA,GAKR,kBAAC,OAAD;EACO;EACL,WAAW,EAAG,GAAW,EAAU;EACnC,kBAAe;EACf,gBAAc;EACd,OAAO;GAAE,GAAG;GAAW,GAAG;GAAc;EACxC,CAAA;EAGP"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
3
|
-
import { r } from "./
|
|
2
|
+
import { t as n } from "./dist-qdXk1a7h.js";
|
|
3
|
+
import { t as r } from "./a11y-CoNNB_xa.js";
|
|
4
4
|
import { forwardRef as i, useCallback as a, useState as o } from "react";
|
|
5
5
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
6
|
//#region src/l2-primitives/input.tsx
|
|
@@ -198,4 +198,4 @@ var p = i(function({ className: n, clearable: r, copyable: i, error: p, glass: m
|
|
|
198
198
|
//#endregion
|
|
199
199
|
export { l as a, p as i, h as n, m as r, g as t };
|
|
200
200
|
|
|
201
|
-
//# sourceMappingURL=spinner-
|
|
201
|
+
//# sourceMappingURL=spinner-BimzKtfC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner-C15eER04.js","names":[],"sources":["../src/l2-primitives/input.tsx","../src/l2-primitives/label.tsx","../src/l2-primitives/spinner.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst inputVariants = cva(\n 'w-full gds-radius-input border bg-bg text-fg transition-colors placeholder:text-fg-muted/50 outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n focusCls,\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n variants: {\n error: {\n false: 'border-border hover:border-border-strong',\n true: 'border-danger',\n },\n inputSize: {\n default: 'gds-h gds-text-body',\n sm: 'gds-h-sm gds-text-label',\n },\n },\n }\n)\n\ntype InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> &\n VariantProps<typeof inputVariants> & {\n /** Height and text scale preset (named inputSize to avoid HTML conflict) */\n inputSize?: 'default' | 'sm'\n /** Show red border for validation error state */\n error?: boolean\n /** Show clear button when input has value */\n clearable?: boolean\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Icon element rendered on the left side */\n icon?: ReactNode\n /** Show spinner on the right side */\n loading?: boolean\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Icon element rendered on the right side */\n rightIcon?: ReactNode\n /** v2: static prefix text (e.g. \"https://\") */\n prefix?: string\n /** v2: static suffix text (e.g. \".example.com\") */\n suffix?: string\n /** v2: show copy button that copies value to clipboard */\n copyable?: boolean\n /** v2: custom action element rendered inside input (right side) */\n action?: ReactNode\n }\n\n// inline spinner SVG (no lucide dependency at L2)\nfunction InlineSpinner() {\n return (\n <svg\n className=\"text-fg-muted h-3.5 w-3.5 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\n// inline X SVG for clear button\nfunction InlineClear() {\n return (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\n// inline copy icon\nfunction InlineCopy({ copied }: { copied: boolean }) {\n if (copied) {\n return (\n <svg\n className=\"text-success h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M20 6L9 17l-5-5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n }\n return (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path\n d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n className,\n clearable,\n copyable,\n error,\n glass,\n icon,\n inputSize,\n loading,\n onClear,\n rightIcon,\n value,\n prefix,\n suffix,\n action,\n ...props\n },\n ref\n) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n if (value === undefined) return\n navigator.clipboard\n .writeText(String(value))\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n .catch(() => {\n // clipboard not available\n })\n }, [value])\n\n const hasLeft = icon !== undefined\n const hasPrefix = prefix !== undefined\n const hasSuffix = suffix !== undefined\n const showClear = clearable === true && value !== undefined && value !== ''\n const showCopy = copyable === true\n const showLoading = loading === true\n const hasRight =\n rightIcon !== undefined ||\n showClear ||\n showLoading ||\n showCopy ||\n action !== undefined\n\n // rightmost elements stack: action > copy > loading > clear > rightIcon\n const rightElements: ReactNode[] = []\n if (action !== undefined) rightElements.push(action)\n if (showCopy) {\n rightElements.push(\n <button\n key=\"copy\"\n aria-label={copied ? 'Copied' : 'Copy to clipboard'}\n className=\"text-fg-muted/50 hover:text-fg-muted transition-colors\"\n onClick={handleCopy}\n tabIndex={-1}\n type=\"button\"\n >\n <InlineCopy copied={copied} />\n </button>\n )\n }\n if (showLoading) rightElements.push(<InlineSpinner key=\"spin\" />)\n if (showClear) {\n rightElements.push(\n <button\n key=\"clear\"\n aria-label=\"Clear\"\n className=\"text-fg-muted/50 hover:text-fg-muted transition-colors\"\n onClick={onClear}\n tabIndex={-1}\n type=\"button\"\n >\n <InlineClear />\n </button>\n )\n }\n if (rightIcon !== undefined && !showClear && !showLoading)\n rightElements.push(rightIcon)\n\n const needsWrapper = hasLeft || hasRight || hasPrefix || hasSuffix\n const glsCls = glassClass(glass)\n const glsExtra = glass === true ? 'border-white/10 bg-bg/60' : ''\n\n if (!needsWrapper) {\n return (\n <input\n className={cx(\n inputVariants({ error, inputSize }),\n 'gds-pad-x',\n glsCls,\n glsExtra,\n className\n )}\n data-component=\"input\"\n ref={ref}\n value={value}\n {...props}\n />\n )\n }\n\n return (\n <div\n className={cx(\n 'relative flex items-center',\n (hasPrefix || hasSuffix) &&\n 'gds-radius-input border-border bg-bg overflow-hidden border',\n (hasPrefix || hasSuffix) && error === true && 'border-danger',\n (hasPrefix || hasSuffix) && glsCls,\n (hasPrefix || hasSuffix) && glsExtra\n )}\n data-component=\"input\"\n >\n {hasPrefix && (\n <span className=\"bg-bg-secondary gds-pad-x gds-text-body text-fg-muted border-border flex shrink-0 items-center self-stretch border-r select-none\">\n {prefix}\n </span>\n )}\n {hasLeft && !hasPrefix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm absolute top-1/2 left-2.5 -translate-y-1/2\">\n {icon}\n </span>\n )}\n <input\n className={cx(\n hasPrefix || hasSuffix\n ? 'text-fg gds-text-body gds-pad-x placeholder:text-fg-muted/50 min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n (inputSize === 'sm' ? 'gds-h-sm gds-text-label' : 'gds-h')\n : inputVariants({ error, inputSize }),\n !hasPrefix && hasLeft ? 'pl-8' : !hasPrefix ? 'gds-pad-x' : '',\n hasRight ? 'pr-8' : !hasSuffix ? 'gds-pad-x' : '',\n !hasPrefix && !hasSuffix && glsCls,\n !hasPrefix && !hasSuffix && glsExtra,\n !hasPrefix && !hasSuffix && className\n )}\n ref={ref}\n value={value}\n {...props}\n />\n {hasSuffix && (\n <span className=\"bg-bg-secondary gds-pad-x gds-text-body text-fg-muted border-border flex shrink-0 items-center self-stretch border-l select-none\">\n {suffix}\n </span>\n )}\n {hasRight && !hasSuffix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm absolute top-1/2 right-2.5 flex -translate-y-1/2 items-center gap-1.5\">\n {rightElements}\n </span>\n )}\n {hasRight && hasSuffix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm flex shrink-0 items-center gap-1.5 pr-2.5\">\n {rightElements}\n </span>\n )}\n </div>\n )\n})\n\nexport { inputVariants }\nexport type { InputProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LabelProps = React.LabelHTMLAttributes<HTMLLabelElement> & {\n required?: boolean\n}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { children, className, required = false, ...props },\n ref\n) {\n return (\n <label\n className={cx(\n 'gds-text-body text-fg block font-medium select-none',\n className\n )}\n data-component=\"label\"\n ref={ref}\n {...props}\n >\n {children}\n {required && <span className=\"text-danger ml-0.5\">*</span>}\n </label>\n )\n})\n\nexport type { LabelProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst spinnerVariants = cva('animate-spin text-accent', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'gds-icon',\n lg: 'gds-icon-lg',\n sm: 'gds-icon-sm',\n },\n },\n})\n\ntype SpinnerProps = VariantProps<typeof spinnerVariants> & {\n className?: string\n}\n\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(function Spinner(\n { className, size },\n ref\n) {\n return (\n <svg\n className={cx(spinnerVariants({ size }), className)}\n data-component=\"spinner\"\n fill=\"none\"\n ref={ref}\n role=\"status\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nexport { spinnerVariants }\nexport type { SpinnerProps }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spinner-BimzKtfC.js","names":[],"sources":["../src/l2-primitives/input.tsx","../src/l2-primitives/label.tsx","../src/l2-primitives/spinner.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef, useCallback, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst inputVariants = cva(\n 'w-full gds-radius-input border bg-bg text-fg transition-colors placeholder:text-fg-muted/50 outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n focusCls,\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n defaultVariants: {\n error: false,\n inputSize: 'default',\n },\n variants: {\n error: {\n false: 'border-border hover:border-border-strong',\n true: 'border-danger',\n },\n inputSize: {\n default: 'gds-h gds-text-body',\n sm: 'gds-h-sm gds-text-label',\n },\n },\n }\n)\n\ntype InputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> &\n VariantProps<typeof inputVariants> & {\n /** Height and text scale preset (named inputSize to avoid HTML conflict) */\n inputSize?: 'default' | 'sm'\n /** Show red border for validation error state */\n error?: boolean\n /** Show clear button when input has value */\n clearable?: boolean\n /** Enable frosted glass translucency effect */\n glass?: boolean\n /** Icon element rendered on the left side */\n icon?: ReactNode\n /** Show spinner on the right side */\n loading?: boolean\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Icon element rendered on the right side */\n rightIcon?: ReactNode\n /** v2: static prefix text (e.g. \"https://\") */\n prefix?: string\n /** v2: static suffix text (e.g. \".example.com\") */\n suffix?: string\n /** v2: show copy button that copies value to clipboard */\n copyable?: boolean\n /** v2: custom action element rendered inside input (right side) */\n action?: ReactNode\n }\n\n// inline spinner SVG (no lucide dependency at L2)\nfunction InlineSpinner() {\n return (\n <svg\n className=\"text-fg-muted h-3.5 w-3.5 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\n// inline X SVG for clear button\nfunction InlineClear() {\n return (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\n// inline copy icon\nfunction InlineCopy({ copied }: { copied: boolean }) {\n if (copied) {\n return (\n <svg\n className=\"text-success h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M20 6L9 17l-5-5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n }\n return (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path\n d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n className,\n clearable,\n copyable,\n error,\n glass,\n icon,\n inputSize,\n loading,\n onClear,\n rightIcon,\n value,\n prefix,\n suffix,\n action,\n ...props\n },\n ref\n) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n if (value === undefined) return\n navigator.clipboard\n .writeText(String(value))\n .then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n .catch(() => {\n // clipboard not available\n })\n }, [value])\n\n const hasLeft = icon !== undefined\n const hasPrefix = prefix !== undefined\n const hasSuffix = suffix !== undefined\n const showClear = clearable === true && value !== undefined && value !== ''\n const showCopy = copyable === true\n const showLoading = loading === true\n const hasRight =\n rightIcon !== undefined ||\n showClear ||\n showLoading ||\n showCopy ||\n action !== undefined\n\n // rightmost elements stack: action > copy > loading > clear > rightIcon\n const rightElements: ReactNode[] = []\n if (action !== undefined) rightElements.push(action)\n if (showCopy) {\n rightElements.push(\n <button\n key=\"copy\"\n aria-label={copied ? 'Copied' : 'Copy to clipboard'}\n className=\"text-fg-muted/50 hover:text-fg-muted transition-colors\"\n onClick={handleCopy}\n tabIndex={-1}\n type=\"button\"\n >\n <InlineCopy copied={copied} />\n </button>\n )\n }\n if (showLoading) rightElements.push(<InlineSpinner key=\"spin\" />)\n if (showClear) {\n rightElements.push(\n <button\n key=\"clear\"\n aria-label=\"Clear\"\n className=\"text-fg-muted/50 hover:text-fg-muted transition-colors\"\n onClick={onClear}\n tabIndex={-1}\n type=\"button\"\n >\n <InlineClear />\n </button>\n )\n }\n if (rightIcon !== undefined && !showClear && !showLoading)\n rightElements.push(rightIcon)\n\n const needsWrapper = hasLeft || hasRight || hasPrefix || hasSuffix\n const glsCls = glassClass(glass)\n const glsExtra = glass === true ? 'border-white/10 bg-bg/60' : ''\n\n if (!needsWrapper) {\n return (\n <input\n className={cx(\n inputVariants({ error, inputSize }),\n 'gds-pad-x',\n glsCls,\n glsExtra,\n className\n )}\n data-component=\"input\"\n ref={ref}\n value={value}\n {...props}\n />\n )\n }\n\n return (\n <div\n className={cx(\n 'relative flex items-center',\n (hasPrefix || hasSuffix) &&\n 'gds-radius-input border-border bg-bg overflow-hidden border',\n (hasPrefix || hasSuffix) && error === true && 'border-danger',\n (hasPrefix || hasSuffix) && glsCls,\n (hasPrefix || hasSuffix) && glsExtra\n )}\n data-component=\"input\"\n >\n {hasPrefix && (\n <span className=\"bg-bg-secondary gds-pad-x gds-text-body text-fg-muted border-border flex shrink-0 items-center self-stretch border-r select-none\">\n {prefix}\n </span>\n )}\n {hasLeft && !hasPrefix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm absolute top-1/2 left-2.5 -translate-y-1/2\">\n {icon}\n </span>\n )}\n <input\n className={cx(\n hasPrefix || hasSuffix\n ? 'text-fg gds-text-body gds-pad-x placeholder:text-fg-muted/50 min-w-0 flex-1 bg-transparent outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n (inputSize === 'sm' ? 'gds-h-sm gds-text-label' : 'gds-h')\n : inputVariants({ error, inputSize }),\n !hasPrefix && hasLeft ? 'pl-8' : !hasPrefix ? 'gds-pad-x' : '',\n hasRight ? 'pr-8' : !hasSuffix ? 'gds-pad-x' : '',\n !hasPrefix && !hasSuffix && glsCls,\n !hasPrefix && !hasSuffix && glsExtra,\n !hasPrefix && !hasSuffix && className\n )}\n ref={ref}\n value={value}\n {...props}\n />\n {hasSuffix && (\n <span className=\"bg-bg-secondary gds-pad-x gds-text-body text-fg-muted border-border flex shrink-0 items-center self-stretch border-l select-none\">\n {suffix}\n </span>\n )}\n {hasRight && !hasSuffix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm absolute top-1/2 right-2.5 flex -translate-y-1/2 items-center gap-1.5\">\n {rightElements}\n </span>\n )}\n {hasRight && hasSuffix && (\n <span className=\"text-fg-muted/50 gds-icon-child-sm flex shrink-0 items-center gap-1.5 pr-2.5\">\n {rightElements}\n </span>\n )}\n </div>\n )\n})\n\nexport { inputVariants }\nexport type { InputProps }\n","import { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype LabelProps = React.LabelHTMLAttributes<HTMLLabelElement> & {\n required?: boolean\n}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { children, className, required = false, ...props },\n ref\n) {\n return (\n <label\n className={cx(\n 'gds-text-body text-fg block font-medium select-none',\n className\n )}\n data-component=\"label\"\n ref={ref}\n {...props}\n >\n {children}\n {required && <span className=\"text-danger ml-0.5\">*</span>}\n </label>\n )\n})\n\nexport type { LabelProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst spinnerVariants = cva('animate-spin text-accent', {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'gds-icon',\n lg: 'gds-icon-lg',\n sm: 'gds-icon-sm',\n },\n },\n})\n\ntype SpinnerProps = VariantProps<typeof spinnerVariants> & {\n className?: string\n}\n\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(function Spinner(\n { className, size },\n ref\n) {\n return (\n <svg\n className={cx(spinnerVariants({ size }), className)}\n data-component=\"spinner\"\n fill=\"none\"\n ref={ref}\n role=\"status\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nexport { spinnerVariants }\nexport type { SpinnerProps }\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
3
|
-
import { r } from "./dom-
|
|
4
|
-
import { n as i, r as a, s as o } from "./hooks-
|
|
2
|
+
import { t as n } from "./a11y-CoNNB_xa.js";
|
|
3
|
+
import { r } from "./dom-DkPgnDHP.js";
|
|
4
|
+
import { n as i, r as a, s as o } from "./hooks-CejfTXVD.js";
|
|
5
5
|
import { createContext as s, forwardRef as c, useContext as l, useState as u } from "react";
|
|
6
6
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
7
7
|
//#region src/l4-molecules/accordion.tsx
|
|
@@ -196,4 +196,4 @@ var g = c(function({ className: t, current: n, steps: r }, i) {
|
|
|
196
196
|
//#endregion
|
|
197
197
|
export { h as a, m as i, _ as n, g as r, y as t };
|
|
198
198
|
|
|
199
|
-
//# sourceMappingURL=stepper-
|
|
199
|
+
//# sourceMappingURL=stepper-BINbai2f.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper-DJ8pn-9D.js","names":[],"sources":["../src/l4-molecules/accordion.tsx","../src/l4-molecules/progress-steps.tsx","../src/l4-molecules/sheet.tsx","../src/l4-molecules/stepper.tsx"],"sourcesContent":["// accordion — expandable sections with single/multiple mode\nimport type { KeyboardEvent, ReactNode } from 'react'\nimport { createContext, useContext, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype AccordionType = 'multiple' | 'single'\n\ntype AccordionContextValue = {\n expanded: string[]\n toggle: (id: string) => void\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({\n expanded: [],\n toggle: () => {},\n})\n\nexport type AccordionProps = {\n children: ReactNode\n type?: AccordionType\n defaultExpanded?: string[]\n className?: string\n}\n\nexport function Accordion({\n children,\n type = 'single',\n defaultExpanded = [],\n className,\n}: AccordionProps) {\n const [expanded, setExpanded] = useState<string[]>(defaultExpanded)\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const isOpen = prev.includes(id)\n if (isOpen) return prev.filter((x) => x !== id)\n if (type === 'single') return [id]\n return [...prev, id]\n })\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n if (\n e.key !== 'ArrowUp' &&\n e.key !== 'ArrowDown' &&\n e.key !== 'Home' &&\n e.key !== 'End'\n ) {\n return\n }\n const triggers = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button[aria-expanded]'\n )\n )\n const current = triggers.indexOf(e.target as HTMLButtonElement)\n if (current < 0) return\n\n e.preventDefault()\n let nextIndex = current\n if (e.key === 'ArrowDown') {\n nextIndex = (current + 1) % triggers.length\n } else if (e.key === 'ArrowUp') {\n nextIndex = (current - 1 + triggers.length) % triggers.length\n } else if (e.key === 'Home') {\n nextIndex = 0\n } else if (e.key === 'End') {\n nextIndex = triggers.length - 1\n }\n triggers[nextIndex]?.focus()\n }\n\n return (\n <div\n className={cx('divide-border divide-y', className)}\n data-component=\"accordion\"\n onKeyDown={handleKeyDown}\n >\n <AccordionContext.Provider value={{ expanded, toggle }}>\n {children}\n </AccordionContext.Provider>\n </div>\n )\n}\n\nexport type AccordionItemProps = {\n id: string\n title: string\n children: ReactNode\n disabled?: boolean\n className?: string\n}\n\nexport function AccordionItem({\n id,\n title,\n children,\n disabled,\n className,\n}: AccordionItemProps) {\n const { expanded, toggle } = useContext(AccordionContext)\n const isOpen = expanded.includes(id)\n\n return (\n <div className={cx(className)} data-state={isOpen ? 'open' : 'closed'}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => toggle(id)}\n className={cx(\n 'gds-pad-y-lg text-fg flex w-full items-center justify-between text-left text-sm font-medium transition-colors',\n focusCls,\n disabled === true && 'pointer-events-none opacity-40'\n )}\n aria-expanded={isOpen}\n >\n <span>{title}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={cx(\n 'shrink-0 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n >\n <path d=\"M3.5 5.5l3.5 3 3.5-3\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"gds-text-body text-fg-muted pb-3\">{children}</div>\n )}\n </div>\n )\n}\n","// progress-steps — linear progress indicator with labeled steps\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ProgressStepsProps = {\n className?: string\n current: number\n steps: string[]\n}\n\nexport const ProgressSteps = forwardRef<HTMLDivElement, ProgressStepsProps>(\n function ProgressSteps({ className, current, steps }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex items-center', className)}\n data-component=\"progress-steps\"\n role=\"list\"\n >\n {steps.map((label, i) => {\n const isCompleted = i < current\n const isCurrent = i === current\n\n return (\n <div\n key={`${label}-${i}`}\n className=\"flex flex-1 items-center\"\n role=\"listitem\"\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div\n className={cx(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium',\n isCompleted && 'bg-accent text-accent-fg',\n isCurrent &&\n 'border-accent bg-accent/10 text-accent border-2',\n !isCompleted &&\n !isCurrent &&\n 'border-border bg-bg-secondary text-fg-muted border'\n )}\n >\n {isCompleted ? (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span\n className={cx(\n 'gds-text-caption text-center',\n isCurrent ? 'text-fg font-medium' : 'text-fg-muted'\n )}\n >\n {label}\n </span>\n </div>\n {i < steps.length - 1 && (\n <div\n className={cx(\n 'mx-2 h-px flex-1',\n isCompleted ? 'bg-accent' : 'bg-border'\n )}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { ProgressStepsProps }\n","// sheet — side panel overlay with slide transition\nimport type { CSSProperties, ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\n\ntype SheetSide = 'left' | 'right'\n\nexport type SheetProps = {\n open: boolean\n onClose: () => void\n children: ReactNode\n side?: SheetSide\n title?: string\n description?: string\n glass?: boolean\n width?: number | string\n className?: string\n}\n\nexport const Sheet = forwardRef<HTMLDivElement, SheetProps>(function Sheet(\n {\n open,\n onClose,\n children,\n side = 'right',\n title,\n description,\n glass,\n width = 320,\n className,\n },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n const isRight = side === 'right'\n const style: CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"sheet\"\n data-state=\"open\"\n >\n <div\n ref={mergeRefs(ref, trapRef)}\n style={style}\n className={cx(\n 'gds-ctx gds-shadow-xl fixed top-0 bottom-0 flex flex-col border transition-transform duration-200',\n isRight ? 'right-0 border-l' : 'left-0 border-r',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n className\n )}\n >\n {(title !== undefined || description !== undefined) && (\n <div className=\"gds-gap border-border gds-pad-x-lg gds-pad-y-lg flex items-start justify-between border-b\">\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"gds-pad-x-lg gds-pad-y-lg flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n )\n})\n","// stepper — multi-step progress indicator with connecting lines\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StepDef = {\n label: string\n description?: string\n}\n\nexport type StepperProps = React.HTMLAttributes<HTMLDivElement> & {\n steps: StepDef[]\n current: number\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst checkSvg = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n)\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n function Stepper(\n { steps, current, orientation = 'horizontal', className, ...props },\n ref\n ) {\n const isHoriz = orientation === 'horizontal'\n\n return (\n <div\n ref={ref}\n className={cx('flex', isHoriz ? 'items-start' : 'flex-col', className)}\n data-component=\"stepper\"\n role=\"list\"\n {...props}\n >\n {steps.map((step, i) => {\n const completed = i < current\n const active = i === current\n\n return (\n <div\n key={`${step.label}-${i}`}\n className={cx(\n 'flex',\n isHoriz ? 'flex-1 items-center' : 'items-start'\n )}\n role=\"listitem\"\n >\n <div\n className={cx(\n 'flex',\n isHoriz ? 'flex-col items-center' : 'gds-gap items-start'\n )}\n >\n <div className=\"flex items-center\">\n {/* step circle */}\n <div\n className={cx(\n 'gds-sq-sm gds-radius-badge gds-text-body flex shrink-0 items-center justify-center font-medium transition-colors',\n completed && 'bg-accent text-accent-fg',\n active &&\n 'border-accent text-accent ring-accent/20 border-2 bg-transparent ring-2',\n !completed && !active && 'bg-bg-tertiary text-fg-muted'\n )}\n >\n {completed ? checkSvg : i + 1}\n </div>\n </div>\n {/* label + description */}\n <div className={cx(isHoriz ? 'mt-2 text-center' : '')}>\n <p\n className={cx(\n 'gds-text-body font-medium',\n active ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {step.label}\n </p>\n {step.description !== undefined && (\n <p className=\"gds-text-caption text-fg-muted mt-0.5\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {/* connecting line */}\n {i < steps.length - 1 &&\n (isHoriz ? (\n <div\n className={cx(\n 'mx-2 mt-3.5 h-px flex-1',\n completed ? 'bg-accent' : 'bg-border'\n )}\n />\n ) : (\n <div\n className={cx(\n 'mt-1 mb-1 ml-3.5 w-px',\n 'min-h-6',\n completed ? 'bg-accent' : 'bg-border'\n )}\n />\n ))}\n </div>\n )\n })}\n </div>\n )\n }\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stepper-BINbai2f.js","names":[],"sources":["../src/l4-molecules/accordion.tsx","../src/l4-molecules/progress-steps.tsx","../src/l4-molecules/sheet.tsx","../src/l4-molecules/stepper.tsx"],"sourcesContent":["// accordion — expandable sections with single/multiple mode\nimport type { KeyboardEvent, ReactNode } from 'react'\nimport { createContext, useContext, useState } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype AccordionType = 'multiple' | 'single'\n\ntype AccordionContextValue = {\n expanded: string[]\n toggle: (id: string) => void\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({\n expanded: [],\n toggle: () => {},\n})\n\nexport type AccordionProps = {\n children: ReactNode\n type?: AccordionType\n defaultExpanded?: string[]\n className?: string\n}\n\nexport function Accordion({\n children,\n type = 'single',\n defaultExpanded = [],\n className,\n}: AccordionProps) {\n const [expanded, setExpanded] = useState<string[]>(defaultExpanded)\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const isOpen = prev.includes(id)\n if (isOpen) return prev.filter((x) => x !== id)\n if (type === 'single') return [id]\n return [...prev, id]\n })\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\n if (\n e.key !== 'ArrowUp' &&\n e.key !== 'ArrowDown' &&\n e.key !== 'Home' &&\n e.key !== 'End'\n ) {\n return\n }\n const triggers = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button[aria-expanded]'\n )\n )\n const current = triggers.indexOf(e.target as HTMLButtonElement)\n if (current < 0) return\n\n e.preventDefault()\n let nextIndex = current\n if (e.key === 'ArrowDown') {\n nextIndex = (current + 1) % triggers.length\n } else if (e.key === 'ArrowUp') {\n nextIndex = (current - 1 + triggers.length) % triggers.length\n } else if (e.key === 'Home') {\n nextIndex = 0\n } else if (e.key === 'End') {\n nextIndex = triggers.length - 1\n }\n triggers[nextIndex]?.focus()\n }\n\n return (\n <div\n className={cx('divide-border divide-y', className)}\n data-component=\"accordion\"\n onKeyDown={handleKeyDown}\n >\n <AccordionContext.Provider value={{ expanded, toggle }}>\n {children}\n </AccordionContext.Provider>\n </div>\n )\n}\n\nexport type AccordionItemProps = {\n id: string\n title: string\n children: ReactNode\n disabled?: boolean\n className?: string\n}\n\nexport function AccordionItem({\n id,\n title,\n children,\n disabled,\n className,\n}: AccordionItemProps) {\n const { expanded, toggle } = useContext(AccordionContext)\n const isOpen = expanded.includes(id)\n\n return (\n <div className={cx(className)} data-state={isOpen ? 'open' : 'closed'}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => toggle(id)}\n className={cx(\n 'gds-pad-y-lg text-fg flex w-full items-center justify-between text-left text-sm font-medium transition-colors',\n focusCls,\n disabled === true && 'pointer-events-none opacity-40'\n )}\n aria-expanded={isOpen}\n >\n <span>{title}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={cx(\n 'shrink-0 transition-transform duration-200',\n isOpen && 'rotate-180'\n )}\n >\n <path d=\"M3.5 5.5l3.5 3 3.5-3\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"gds-text-body text-fg-muted pb-3\">{children}</div>\n )}\n </div>\n )\n}\n","// progress-steps — linear progress indicator with labeled steps\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\ntype ProgressStepsProps = {\n className?: string\n current: number\n steps: string[]\n}\n\nexport const ProgressSteps = forwardRef<HTMLDivElement, ProgressStepsProps>(\n function ProgressSteps({ className, current, steps }, ref) {\n return (\n <div\n ref={ref}\n className={cx('flex items-center', className)}\n data-component=\"progress-steps\"\n role=\"list\"\n >\n {steps.map((label, i) => {\n const isCompleted = i < current\n const isCurrent = i === current\n\n return (\n <div\n key={`${label}-${i}`}\n className=\"flex flex-1 items-center\"\n role=\"listitem\"\n >\n <div className=\"flex flex-col items-center gap-1\">\n <div\n className={cx(\n 'flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium',\n isCompleted && 'bg-accent text-accent-fg',\n isCurrent &&\n 'border-accent bg-accent/10 text-accent border-2',\n !isCompleted &&\n !isCurrent &&\n 'border-border bg-bg-secondary text-fg-muted border'\n )}\n >\n {isCompleted ? (\n <svg\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ) : (\n i + 1\n )}\n </div>\n <span\n className={cx(\n 'gds-text-caption text-center',\n isCurrent ? 'text-fg font-medium' : 'text-fg-muted'\n )}\n >\n {label}\n </span>\n </div>\n {i < steps.length - 1 && (\n <div\n className={cx(\n 'mx-2 h-px flex-1',\n isCompleted ? 'bg-accent' : 'bg-border'\n )}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n }\n)\n\nexport type { ProgressStepsProps }\n","// sheet — side panel overlay with slide transition\nimport type { CSSProperties, ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { mergeRefs } from '../utils/dom'\nimport { glassClass } from '../utils/glass'\nimport { useEscapeKey, useFocusTrap, useScrollLock } from '../utils/hooks'\n\ntype SheetSide = 'left' | 'right'\n\nexport type SheetProps = {\n open: boolean\n onClose: () => void\n children: ReactNode\n side?: SheetSide\n title?: string\n description?: string\n glass?: boolean\n width?: number | string\n className?: string\n}\n\nexport const Sheet = forwardRef<HTMLDivElement, SheetProps>(function Sheet(\n {\n open,\n onClose,\n children,\n side = 'right',\n title,\n description,\n glass,\n width = 320,\n className,\n },\n ref\n) {\n const trapRef = useFocusTrap(open)\n useScrollLock(open)\n useEscapeKey(open, onClose)\n\n if (!open) return null\n\n const isRight = side === 'right'\n const style: CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/50\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n data-component=\"sheet\"\n data-state=\"open\"\n >\n <div\n ref={mergeRefs(ref, trapRef)}\n style={style}\n className={cx(\n 'gds-ctx gds-shadow-xl fixed top-0 bottom-0 flex flex-col border transition-transform duration-200',\n isRight ? 'right-0 border-l' : 'left-0 border-r',\n glass\n ? cx(glassClass(glass), 'bg-bg/60 border-white/10')\n : 'border-border bg-surface',\n className\n )}\n >\n {(title !== undefined || description !== undefined) && (\n <div className=\"gds-gap border-border gds-pad-x-lg gds-pad-y-lg flex items-start justify-between border-b\">\n <div className=\"min-w-0\">\n {title !== undefined && (\n <h2 className=\"text-fg text-sm font-semibold\">{title}</h2>\n )}\n {description !== undefined && (\n <p className=\"gds-text-body text-fg-muted mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className={cx(\n 'gds-radius-button text-fg-muted hover:text-fg shrink-0 p-1',\n focusCls\n )}\n aria-label=\"Close\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"gds-pad-x-lg gds-pad-y-lg flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n )\n})\n","// stepper — multi-step progress indicator with connecting lines\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\n\nexport type StepDef = {\n label: string\n description?: string\n}\n\nexport type StepperProps = React.HTMLAttributes<HTMLDivElement> & {\n steps: StepDef[]\n current: number\n orientation?: 'horizontal' | 'vertical'\n}\n\nconst checkSvg = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7.5l3 3 5-6\" />\n </svg>\n)\n\nexport const Stepper = forwardRef<HTMLDivElement, StepperProps>(\n function Stepper(\n { steps, current, orientation = 'horizontal', className, ...props },\n ref\n ) {\n const isHoriz = orientation === 'horizontal'\n\n return (\n <div\n ref={ref}\n className={cx('flex', isHoriz ? 'items-start' : 'flex-col', className)}\n data-component=\"stepper\"\n role=\"list\"\n {...props}\n >\n {steps.map((step, i) => {\n const completed = i < current\n const active = i === current\n\n return (\n <div\n key={`${step.label}-${i}`}\n className={cx(\n 'flex',\n isHoriz ? 'flex-1 items-center' : 'items-start'\n )}\n role=\"listitem\"\n >\n <div\n className={cx(\n 'flex',\n isHoriz ? 'flex-col items-center' : 'gds-gap items-start'\n )}\n >\n <div className=\"flex items-center\">\n {/* step circle */}\n <div\n className={cx(\n 'gds-sq-sm gds-radius-badge gds-text-body flex shrink-0 items-center justify-center font-medium transition-colors',\n completed && 'bg-accent text-accent-fg',\n active &&\n 'border-accent text-accent ring-accent/20 border-2 bg-transparent ring-2',\n !completed && !active && 'bg-bg-tertiary text-fg-muted'\n )}\n >\n {completed ? checkSvg : i + 1}\n </div>\n </div>\n {/* label + description */}\n <div className={cx(isHoriz ? 'mt-2 text-center' : '')}>\n <p\n className={cx(\n 'gds-text-body font-medium',\n active ? 'text-fg' : 'text-fg-muted'\n )}\n >\n {step.label}\n </p>\n {step.description !== undefined && (\n <p className=\"gds-text-caption text-fg-muted mt-0.5\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {/* connecting line */}\n {i < steps.length - 1 &&\n (isHoriz ? (\n <div\n className={cx(\n 'mx-2 mt-3.5 h-px flex-1',\n completed ? 'bg-accent' : 'bg-border'\n )}\n />\n ) : (\n <div\n className={cx(\n 'mt-1 mb-1 ml-3.5 w-px',\n 'min-h-6',\n completed ? 'bg-accent' : 'bg-border'\n )}\n />\n ))}\n </div>\n )\n })}\n </div>\n )\n }\n)\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
3
|
-
import { r } from "./
|
|
2
|
+
import { t as n } from "./dist-qdXk1a7h.js";
|
|
3
|
+
import { t as r } from "./a11y-CoNNB_xa.js";
|
|
4
4
|
import { forwardRef as i, useMemo as a } from "react";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
6
|
//#region src/l3-atoms/chip.tsx
|
|
@@ -127,4 +127,4 @@ var u = i(function({ className: n, glass: r, icon: i, label: a, onRemove: u, rem
|
|
|
127
127
|
//#endregion
|
|
128
128
|
export { c as a, u as i, f as n, d as r, h as t };
|
|
129
129
|
|
|
130
|
-
//# sourceMappingURL=switch-
|
|
130
|
+
//# sourceMappingURL=switch-COzaggYE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch-
|
|
1
|
+
{"version":3,"file":"switch-COzaggYE.js","names":[],"sources":["../src/l3-atoms/chip.tsx","../src/l3-atoms/range-slider.tsx","../src/l3-atoms/switch.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst chipVariants = cva(\n 'inline-flex select-none items-center gds-gap-xs gds-radius-badge gds-pad-x-sm gds-pad-y-sm gds-text-label font-medium',\n {\n defaultVariants: { variant: 'default' },\n variants: {\n variant: {\n accent: 'bg-accent/10 text-accent',\n danger: 'bg-danger/10 text-danger',\n default: 'bg-fg-muted/10 text-fg-muted',\n success: 'bg-success/10 text-success',\n warning: 'bg-warning/10 text-warning',\n },\n },\n }\n)\n\ntype ChipProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof chipVariants> & {\n glass?: boolean\n icon?: ReactNode\n label: string\n onRemove?: () => void\n removeIcon?: ReactNode\n }\n\n// default X SVG\nfunction DefaultRemoveIcon() {\n return (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(\n { className, glass, icon, label, onRemove, removeIcon, variant, ...props },\n ref\n) {\n return (\n <span\n className={cx(\n chipVariants({ variant }),\n glassClass(glass),\n glass === true && 'border border-white/10 bg-white/5',\n className\n )}\n data-component=\"chip\"\n data-variant={variant ?? 'default'}\n ref={ref}\n {...props}\n >\n {icon !== undefined && <span className=\"gds-icon-child-sm\">{icon}</span>}\n {label}\n {onRemove !== undefined && (\n <button\n className={cx(\n 'gds-radius-badge ml-0.5 p-0.5 transition-colors hover:bg-current/10',\n focusCls\n )}\n onClick={onRemove}\n tabIndex={-1}\n type=\"button\"\n >\n {removeIcon ?? <DefaultRemoveIcon />}\n </button>\n )}\n </span>\n )\n})\n\nexport { chipVariants }\nexport type { ChipProps }\n","// range-slider — styled native range input with optional value label\nimport { forwardRef, useMemo } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\n\ntype RangeSliderProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'onChange' | 'type' | 'value'\n> & {\n disabled?: boolean\n max?: number\n min?: number\n onChange: (value: number) => void\n showValue?: boolean\n step?: number\n value: number\n}\n\nexport const RangeSlider = forwardRef<HTMLInputElement, RangeSliderProps>(\n function RangeSlider(\n {\n className,\n disabled = false,\n max = 100,\n min = 0,\n onChange,\n showValue = false,\n step = 1,\n value,\n ...props\n },\n ref\n ) {\n const percent = useMemo(() => {\n const range = max - min\n if (range <= 0) return 0\n return ((value - min) / range) * 100\n }, [value, min, max])\n\n return (\n <div\n className={cx(\n 'relative flex items-center select-none',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"range-slider\"\n data-state={disabled ? 'disabled' : 'enabled'}\n >\n {showValue && (\n <span\n className=\"text-fg-muted absolute -top-5 text-[10px] font-medium transition-[left]\"\n style={{ left: `${percent}%`, transform: 'translateX(-50%)' }}\n >\n {value}\n </span>\n )}\n <input\n className={cx(\n 'gds-range-slider bg-bg-tertiary h-1.5 w-full cursor-pointer appearance-none rounded-full',\n focusCls,\n disabled && 'pointer-events-none'\n )}\n disabled={disabled}\n max={max}\n min={min}\n onChange={(e) => onChange(Number(e.target.value))}\n ref={ref}\n step={step}\n style={{\n background: `linear-gradient(to right, var(--gds-accent) 0%, var(--gds-accent) ${percent}%, var(--gds-bg-tertiary) ${percent}%, var(--gds-bg-tertiary) 100%)`,\n }}\n type=\"range\"\n value={value}\n {...props}\n />\n </div>\n )\n }\n)\n\nexport type { RangeSliderProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport type { VariantProps } from '../utils/types'\n\nconst switchVariants = cva(\n 'relative inline-flex shrink-0 cursor-pointer select-none items-center gds-radius-badge transition-colors ' +\n focusCls,\n {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-5 w-9',\n sm: 'h-4 w-7',\n },\n },\n }\n)\n\nconst thumbSizeMap = {\n default: 'gds-icon',\n sm: 'h-3 w-3',\n}\n\nconst thumbTranslateMap = {\n default: { off: 'translate-x-0.5', on: 'translate-x-4' },\n sm: { off: 'translate-x-0.5', on: 'translate-x-3.5' },\n}\n\ntype SwitchProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'onChange'\n> &\n VariantProps<typeof switchVariants> & {\n checked?: boolean\n label?: string\n onChange?: (checked: boolean) => void\n }\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n function Switch(\n {\n checked = false,\n className,\n disabled = false,\n label,\n onChange,\n size = 'default',\n ...props\n },\n ref\n ) {\n const sizeKey = size ?? 'default'\n\n return (\n <label\n className={cx(\n 'gds-gap-sm inline-flex items-center select-none',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n data-component=\"switch\"\n data-state={checked ? 'on' : 'off'}\n >\n <button\n aria-checked={checked}\n className={cx(\n switchVariants({ size }),\n checked ? 'bg-accent' : 'bg-bg-tertiary',\n disabled && 'cursor-not-allowed'\n )}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n ref={ref}\n role=\"switch\"\n type=\"button\"\n {...props}\n >\n <span\n className={cx(\n 'gds-radius-badge bg-fg gds-shadow-sm transition-transform',\n thumbSizeMap[sizeKey],\n checked\n ? thumbTranslateMap[sizeKey].on\n : thumbTranslateMap[sizeKey].off\n )}\n />\n </button>\n {label !== undefined && (\n <span className=\"gds-text-body text-fg\">{label}</span>\n )}\n </label>\n )\n }\n)\n\nexport { switchVariants }\nexport type { SwitchProps }\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
-
import {
|
|
3
|
-
import { r } from "./
|
|
2
|
+
import { t as n } from "./dist-qdXk1a7h.js";
|
|
3
|
+
import { t as r } from "./a11y-CoNNB_xa.js";
|
|
4
4
|
import { forwardRef as i } from "react";
|
|
5
5
|
import { jsx as a } from "react/jsx-runtime";
|
|
6
6
|
//#region src/l2-primitives/kbd.tsx
|
|
@@ -37,4 +37,4 @@ var o = i(function({ children: n, className: r, glass: i, ...o }, s) {
|
|
|
37
37
|
//#endregion
|
|
38
38
|
export { s as n, o as r, l as t };
|
|
39
39
|
|
|
40
|
-
//# sourceMappingURL=textarea-
|
|
40
|
+
//# sourceMappingURL=textarea-DD1huKel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea-
|
|
1
|
+
{"version":3,"file":"textarea-DD1huKel.js","names":[],"sources":["../src/l2-primitives/kbd.tsx","../src/l2-primitives/textarea.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\n\ntype KbdProps = React.HTMLAttributes<HTMLElement> & {\n children: ReactNode\n glass?: boolean\n}\n\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n { children, className, glass, ...props },\n ref\n) {\n return (\n <kbd\n className={cx(\n 'gds-radius-button border-border/60 bg-bg-tertiary gds-pad-x-sm gds-pad-y-sm gds-text-label text-fg-muted inline-flex items-center border font-mono select-none',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"kbd\"\n ref={ref}\n {...props}\n >\n {children}\n </kbd>\n )\n})\n\nexport type { KbdProps }\n","import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { focusCls } from '../utils/a11y'\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\ntype TextareaResize = 'both' | 'none' | 'vertical'\n\nconst textareaVariants = cva(\n 'w-full gds-radius-input border bg-bg gds-pad-x gds-pad-y text-fg gds-text-body placeholder:text-fg-muted/50 outline-none disabled:cursor-not-allowed disabled:opacity-50 ' +\n focusCls,\n {\n compoundVariants: [\n {\n error: true,\n className: 'focus-visible:ring-danger',\n },\n ],\n defaultVariants: {\n error: false,\n },\n variants: {\n error: {\n false: 'border-border hover:border-border-strong',\n true: 'border-danger',\n },\n },\n }\n)\n\nconst resizeClasses: Record<TextareaResize, string> = {\n both: 'resize',\n none: 'resize-none',\n vertical: 'resize-y',\n}\n\ntype TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> &\n VariantProps<typeof textareaVariants> & {\n autoGrow?: boolean\n glass?: boolean\n resize?: TextareaResize\n }\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea(\n {\n autoGrow = false,\n className,\n error,\n glass,\n resize = 'vertical',\n ...props\n },\n ref\n ) {\n return (\n <textarea\n className={cx(\n textareaVariants({ error }),\n resizeClasses[resize],\n autoGrow && '[field-sizing:content] overflow-hidden',\n glassClass(glass),\n glass === true && 'bg-bg/60 border-white/10',\n className\n )}\n data-component=\"textarea\"\n ref={ref}\n {...props}\n />\n )\n }\n)\n\nexport { textareaVariants }\nexport type { TextareaProps, TextareaResize }\n"],"mappings":";;;;;;AAWA,IAAa,IAAM,EAAkC,SACnD,EAAE,aAAU,cAAW,UAAO,GAAG,KACjC,GACA;AACA,QACE,kBAAC,OAAD;EACE,WAAW,EACT,kKACA,EAAW,EAAM,EACjB,MAAU,MAAQ,4BAClB,EACD;EACD,kBAAe;EACV;EACL,GAAI;EAEH;EACG,CAAA;EAER,ECpBI,IAAmB,EACvB,8KACE,GACF;CACE,kBAAkB,CAChB;EACE,OAAO;EACP,WAAW;EACZ,CACF;CACD,iBAAiB,EACf,OAAO,IACR;CACD,UAAU,EACR,OAAO;EACL,OAAO;EACP,MAAM;EACP,EACF;CACF,CACF,EAEK,IAAgD;CACpD,MAAM;CACN,MAAM;CACN,UAAU;CACX,EASY,IAAW,EACtB,SACE,EACE,cAAW,IACX,cACA,UACA,UACA,YAAS,YACT,GAAG,KAEL,GACA;AACA,QACE,kBAAC,YAAD;EACE,WAAW,EACT,EAAiB,EAAE,UAAO,CAAC,EAC3B,EAAc,IACd,KAAY,0CACZ,EAAW,EAAM,EACjB,MAAU,MAAQ,4BAClB,EACD;EACD,kBAAe;EACV;EACL,GAAI;EACJ,CAAA;EAGP"}
|