@goliapkg/gds 0.9.3 → 0.9.5
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/avatar-By0U5Vts.js +74 -0
- package/dist/avatar-By0U5Vts.js.map +1 -0
- package/dist/badge-DTJq6AXr.js +59 -0
- package/dist/badge-DTJq6AXr.js.map +1 -0
- package/dist/button-avu-rQU4.js +99 -0
- package/dist/button-avu-rQU4.js.map +1 -0
- package/dist/dom-17XgfxMq.js +20 -0
- package/dist/dom-17XgfxMq.js.map +1 -0
- package/dist/gesture-BCGijGek.js +104 -0
- package/dist/gesture-BCGijGek.js.map +1 -0
- package/dist/gesture-system-v-bjvnCe.js +56 -0
- package/dist/gesture-system-v-bjvnCe.js.map +1 -0
- package/dist/glass-CQTlX7IO.js +1702 -0
- package/dist/glass-CQTlX7IO.js.map +1 -0
- package/dist/highlight-BAGZc-4h.js +28 -0
- package/dist/highlight-BAGZc-4h.js.map +1 -0
- package/dist/hooks-BE-_EmDI.js +87 -0
- package/dist/hooks-BE-_EmDI.js.map +1 -0
- package/dist/icon-button-YatlVZnz.js +44 -0
- package/dist/icon-button-YatlVZnz.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -18594
- package/dist/l0-tokens/deps.d.ts +5 -0
- package/dist/l0-tokens/deps.d.ts.map +1 -1
- package/dist/l0-tokens/index.js +4 -0
- package/dist/l0-tokens-DZkyVlac.js +296 -0
- package/dist/l0-tokens-DZkyVlac.js.map +1 -0
- package/dist/l1-systems/index.js +2 -0
- package/dist/l2-primitives/index.js +11 -0
- package/dist/l2-primitives/screen-overlay.d.ts.map +1 -1
- package/dist/l2-primitives/truncate.d.ts +2 -1
- package/dist/l2-primitives/truncate.d.ts.map +1 -1
- package/dist/l2-primitives-CqrezrJ4.js +482 -0
- package/dist/l2-primitives-CqrezrJ4.js.map +1 -0
- package/dist/l3-atoms/index.d.ts +0 -14
- package/dist/l3-atoms/index.d.ts.map +1 -1
- package/dist/l3-atoms/index.js +6 -0
- package/dist/l3-atoms/keyboard-shortcut.d.ts +1 -1
- package/dist/l3-atoms/keyboard-shortcut.d.ts.map +1 -1
- package/dist/l3-atoms/sparkle.d.ts +1 -1
- package/dist/l3-atoms/sparkle.d.ts.map +1 -1
- package/dist/l3-atoms-CsN9IA9J.js +1794 -0
- package/dist/l3-atoms-CsN9IA9J.js.map +1 -0
- package/dist/l4-molecules/dialog.d.ts.map +1 -1
- package/dist/l4-molecules/editable.d.ts.map +1 -0
- package/dist/l4-molecules/index.d.ts +12 -4
- package/dist/l4-molecules/index.d.ts.map +1 -1
- package/dist/l4-molecules/index.js +4 -0
- package/dist/l4-molecules/overflow-menu.d.ts.map +1 -0
- package/dist/l4-molecules/pin-input.d.ts.map +1 -0
- package/dist/l4-molecules/popover.d.ts.map +1 -0
- package/dist/l4-molecules/split-button.d.ts.map +1 -0
- package/dist/l4-molecules/tag-input.d.ts.map +1 -0
- package/dist/l4-molecules-DCc074MJ.js +4048 -0
- package/dist/l4-molecules-DCc074MJ.js.map +1 -0
- package/dist/l5-organisms/command-palette.d.ts.map +1 -1
- package/dist/l5-organisms/confetti.d.ts.map +1 -1
- package/dist/l5-organisms/cookie-banner.d.ts.map +1 -1
- package/dist/l5-organisms/image-preview.d.ts.map +1 -1
- package/dist/l5-organisms/index.d.ts +2 -0
- package/dist/l5-organisms/index.d.ts.map +1 -1
- package/dist/l5-organisms/index.js +2 -0
- package/dist/l5-organisms/notification-toast.d.ts.map +1 -1
- package/dist/{l4-molecules → l5-organisms}/sortable-table.d.ts.map +1 -1
- package/dist/l5-organisms-8KB_8a-H.js +3798 -0
- package/dist/l5-organisms-8KB_8a-H.js.map +1 -0
- package/dist/l6-charts/candlestick-chart.d.ts.map +1 -1
- package/dist/l6-charts/index.js +2 -0
- package/dist/l6-charts-DYnr5B9X.js +1743 -0
- package/dist/l6-charts-DYnr5B9X.js.map +1 -0
- package/dist/l7-patterns/index.js +2 -0
- package/dist/l7-patterns-DZXveS4Y.js +1826 -0
- package/dist/l7-patterns-DZXveS4Y.js.map +1 -0
- package/dist/loading-dots-fB4X_Zh0.js +24 -0
- package/dist/loading-dots-fB4X_Zh0.js.map +1 -0
- package/dist/motion-DUPegem-.js +22 -0
- package/dist/motion-DUPegem-.js.map +1 -0
- package/dist/portal-Bbl6F_Wj.js +9 -0
- package/dist/portal-Bbl6F_Wj.js.map +1 -0
- package/dist/progress-wAKN3Czz.js +44 -0
- package/dist/progress-wAKN3Czz.js.map +1 -0
- package/dist/resize-handle-CktEYqwi.js +77 -0
- package/dist/resize-handle-CktEYqwi.js.map +1 -0
- package/dist/scales-C80FTPsL.js +1299 -0
- package/dist/scales-C80FTPsL.js.map +1 -0
- package/dist/separator-Dqs23A9D.js +65 -0
- package/dist/separator-Dqs23A9D.js.map +1 -0
- package/dist/skeleton-C9FFZSYN.js +43 -0
- package/dist/skeleton-C9FFZSYN.js.map +1 -0
- package/dist/spinner-D8Ti-TFe.js +101 -0
- package/dist/spinner-D8Ti-TFe.js.map +1 -0
- package/dist/stepper-DhpGORX8.js +140 -0
- package/dist/stepper-DhpGORX8.js.map +1 -0
- package/dist/switch-DC85Os9r.js +130 -0
- package/dist/switch-DC85Os9r.js.map +1 -0
- package/dist/textarea-BJCl_aH2.js +40 -0
- package/dist/textarea-BJCl_aH2.js.map +1 -0
- package/dist/toast-DN5xANLM.js +442 -0
- package/dist/toast-DN5xANLM.js.map +1 -0
- package/dist/use-theme-C0aWVw70.js +203 -0
- package/dist/use-theme-C0aWVw70.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -0
- package/dist/utils/portal.d.ts +3 -0
- package/dist/utils/portal.d.ts.map +1 -0
- package/package.json +37 -1
- package/dist/index.js.map +0 -1
- package/dist/l3-atoms/editable.d.ts.map +0 -1
- package/dist/l3-atoms/overflow-menu.d.ts.map +0 -1
- package/dist/l3-atoms/pin-input.d.ts.map +0 -1
- package/dist/l3-atoms/popover.d.ts.map +0 -1
- package/dist/l3-atoms/split-button.d.ts.map +0 -1
- package/dist/l3-atoms/tag-input.d.ts.map +0 -1
- package/dist/l3-atoms/time-since.d.ts +0 -9
- package/dist/l3-atoms/time-since.d.ts.map +0 -1
- package/dist/l4-molecules/otp-input.d.ts +0 -11
- package/dist/l4-molecules/otp-input.d.ts.map +0 -1
- /package/dist/{l3-atoms → l4-molecules}/editable.d.ts +0 -0
- /package/dist/{l3-atoms → l4-molecules}/overflow-menu.d.ts +0 -0
- /package/dist/{l3-atoms → l4-molecules}/pin-input.d.ts +0 -0
- /package/dist/{l3-atoms → l4-molecules}/popover.d.ts +0 -0
- /package/dist/{l3-atoms → l4-molecules}/split-button.d.ts +0 -0
- /package/dist/{l3-atoms → l4-molecules}/tag-input.d.ts +0 -0
- /package/dist/{l4-molecules → l5-organisms}/sortable-table.d.ts +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
+
import { r as n } from "./button-avu-rQU4.js";
|
|
3
|
+
import { forwardRef as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
//#region src/l3-atoms/avatar.tsx
|
|
6
|
+
var o = n("relative inline-flex shrink-0 select-none items-center justify-center rounded-full font-medium", {
|
|
7
|
+
defaultVariants: { size: "default" },
|
|
8
|
+
variants: { size: {
|
|
9
|
+
default: "h-8 w-8 text-xs",
|
|
10
|
+
lg: "h-10 w-10 text-sm",
|
|
11
|
+
sm: "h-6 w-6 text-[10px]",
|
|
12
|
+
xs: "h-5 w-5 text-[9px]"
|
|
13
|
+
} }
|
|
14
|
+
}), s = [
|
|
15
|
+
"bg-palette-0",
|
|
16
|
+
"bg-palette-1",
|
|
17
|
+
"bg-palette-2",
|
|
18
|
+
"bg-palette-3",
|
|
19
|
+
"bg-palette-4",
|
|
20
|
+
"bg-palette-5",
|
|
21
|
+
"bg-palette-6",
|
|
22
|
+
"bg-palette-7",
|
|
23
|
+
"bg-palette-8",
|
|
24
|
+
"bg-palette-9"
|
|
25
|
+
], c = {
|
|
26
|
+
away: "bg-warning",
|
|
27
|
+
busy: "bg-danger",
|
|
28
|
+
offline: "bg-fg-muted/30",
|
|
29
|
+
online: "bg-success"
|
|
30
|
+
}, l = {
|
|
31
|
+
default: "h-2.5 w-2.5",
|
|
32
|
+
lg: "h-3 w-3",
|
|
33
|
+
sm: "h-2 w-2",
|
|
34
|
+
xs: "h-1.5 w-1.5"
|
|
35
|
+
};
|
|
36
|
+
function u(e) {
|
|
37
|
+
let t = e.trim().split(/\s+/);
|
|
38
|
+
return t.length >= 2 ? `${t[0][0]}${t[1][0]}`.toUpperCase() : e.slice(0, 2).toUpperCase();
|
|
39
|
+
}
|
|
40
|
+
function d(e) {
|
|
41
|
+
let t = 0;
|
|
42
|
+
for (let n = 0; n < e.length; n++) t = t * 31 + e.charCodeAt(n) | 0;
|
|
43
|
+
return Math.abs(t);
|
|
44
|
+
}
|
|
45
|
+
var f = r(function({ className: n, glass: r, name: f, size: p = "default", src: m, status: h, ...g }, _) {
|
|
46
|
+
let v = p ?? "default", y = f === void 0 ? 0 : d(f) % 10;
|
|
47
|
+
return /* @__PURE__ */ a("span", {
|
|
48
|
+
className: e(o({ size: p }), m === void 0 && s[y], m === void 0 && "text-accent-fg", t(r), n),
|
|
49
|
+
"data-component": "avatar",
|
|
50
|
+
ref: _,
|
|
51
|
+
...g,
|
|
52
|
+
children: [m === void 0 ? /* @__PURE__ */ i("span", { children: f === void 0 ? "?" : u(f) }) : /* @__PURE__ */ i("img", {
|
|
53
|
+
alt: f ?? "",
|
|
54
|
+
className: "absolute inset-0 h-full w-full rounded-full object-cover",
|
|
55
|
+
src: m
|
|
56
|
+
}), h !== void 0 && /* @__PURE__ */ i("span", { className: e("absolute right-0 bottom-0 rounded-full ring-2 ring-bg", l[v], c[h]) })]
|
|
57
|
+
});
|
|
58
|
+
}), p = r(function({ children: t, className: n, max: r, ...i }, o) {
|
|
59
|
+
let s = Array.isArray(t) ? t : [t], c = r === void 0 ? s : s.slice(0, r), l = r === void 0 ? 0 : s.length - r;
|
|
60
|
+
return /* @__PURE__ */ a("div", {
|
|
61
|
+
className: e("flex -space-x-2", n),
|
|
62
|
+
"data-component": "avatar-group",
|
|
63
|
+
ref: o,
|
|
64
|
+
...i,
|
|
65
|
+
children: [c, l > 0 && /* @__PURE__ */ a("span", {
|
|
66
|
+
className: "inline-flex gds-sq items-center justify-center rounded-full bg-bg-tertiary gds-text-body font-medium text-fg-muted ring-2 ring-bg",
|
|
67
|
+
children: ["+", l]
|
|
68
|
+
})]
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//#endregion
|
|
72
|
+
export { p as n, o as r, f as t };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=avatar-By0U5Vts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-By0U5Vts.js","names":[],"sources":["../src/l3-atoms/avatar.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 select-none items-center justify-center rounded-full font-medium',\n {\n defaultVariants: { size: 'default' },\n variants: {\n size: {\n default: 'h-8 w-8 text-xs',\n lg: 'h-10 w-10 text-sm',\n sm: 'h-6 w-6 text-[10px]',\n xs: 'h-5 w-5 text-[9px]',\n },\n },\n },\n)\n\nconst paletteColors = [\n 'bg-palette-0', 'bg-palette-1', 'bg-palette-2', 'bg-palette-3', 'bg-palette-4',\n 'bg-palette-5', 'bg-palette-6', 'bg-palette-7', 'bg-palette-8', 'bg-palette-9',\n]\n\nconst statusColors: Record<string, string> = {\n away: 'bg-warning',\n busy: 'bg-danger',\n offline: 'bg-fg-muted/30',\n online: 'bg-success',\n}\n\nconst statusSizeMap: Record<string, string> = {\n default: 'h-2.5 w-2.5',\n lg: 'h-3 w-3',\n sm: 'h-2 w-2',\n xs: 'h-1.5 w-1.5',\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length >= 2) return `${parts[0][0]}${parts[1][0]}`.toUpperCase()\n return name.slice(0, 2).toUpperCase()\n}\n\nfunction hashName(name: string): number {\n let hash = 0\n for (let i = 0; i < name.length; i++) {\n hash = (hash * 31 + name.charCodeAt(i)) | 0\n }\n return Math.abs(hash)\n}\n\ntype AvatarStatus = 'away' | 'busy' | 'offline' | 'online'\n\ntype AvatarProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof avatarVariants> & {\n glass?: boolean\n name?: string\n src?: string\n status?: AvatarStatus\n }\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n function Avatar({ className, glass, name, size = 'default', src, status, ...props }, ref) {\n const sizeKey = size ?? 'default'\n const colorIdx = name !== undefined ? hashName(name) % 10 : 0\n\n return (\n <span\n className={cx(\n avatarVariants({ size }),\n src === undefined && paletteColors[colorIdx],\n src === undefined && 'text-accent-fg',\n glassClass(glass),\n className,\n )}\n data-component=\"avatar\"\n ref={ref}\n {...props}\n >\n {src !== undefined ? (\n <img alt={name ?? ''} className=\"absolute inset-0 h-full w-full rounded-full object-cover\" src={src} />\n ) : (\n <span>{name !== undefined ? getInitials(name) : '?'}</span>\n )}\n {status !== undefined && (\n <span\n className={cx(\n 'absolute right-0 bottom-0 rounded-full ring-2 ring-bg',\n statusSizeMap[sizeKey],\n statusColors[status],\n )}\n />\n )}\n </span>\n )\n },\n)\n\ntype AvatarGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n max?: number\n}\n\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n function AvatarGroup({ children, className, max, ...props }, ref) {\n const items = Array.isArray(children) ? children : [children]\n const visible = max !== undefined ? items.slice(0, max) : items\n const overflow = max !== undefined ? items.length - max : 0\n\n return (\n <div\n className={cx('flex -space-x-2', className)}\n data-component=\"avatar-group\"\n ref={ref}\n {...props}\n >\n {visible}\n {overflow > 0 && (\n <span className=\"inline-flex gds-sq items-center justify-center rounded-full bg-bg-tertiary gds-text-body font-medium text-fg-muted ring-2 ring-bg\">\n +{overflow}\n </span>\n )}\n </div>\n )\n },\n)\n\nexport { avatarVariants }\nexport type { AvatarGroupProps, AvatarProps, AvatarStatus }\n"],"mappings":";;;;;AAOA,IAAM,IAAiB,EACrB,kGACA;CACE,iBAAiB,EAAE,MAAM,WAAW;CACpC,UAAU,EACR,MAAM;EACJ,SAAS;EACT,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACF,CACF,EAEK,IAAgB;CACpB;CAAgB;CAAgB;CAAgB;CAAgB;CAChE;CAAgB;CAAgB;CAAgB;CAAgB;CACjE,EAEK,IAAuC;CAC3C,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;CACT,EAEK,IAAwC;CAC5C,SAAS;CACT,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,SAAS,EAAY,GAAsB;CACzC,IAAM,IAAQ,EAAK,MAAM,CAAC,MAAM,MAAM;AAEtC,QADI,EAAM,UAAU,IAAU,GAAG,EAAM,GAAG,KAAK,EAAM,GAAG,KAAK,aAAa,GACnE,EAAK,MAAM,GAAG,EAAE,CAAC,aAAa;;AAGvC,SAAS,EAAS,GAAsB;CACtC,IAAI,IAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,IAC/B,KAAQ,IAAO,KAAK,EAAK,WAAW,EAAE,GAAI;AAE5C,QAAO,KAAK,IAAI,EAAK;;AAavB,IAAa,IAAS,EACpB,SAAgB,EAAE,cAAW,UAAO,SAAM,UAAO,WAAW,QAAK,WAAQ,GAAG,KAAS,GAAK;CACxF,IAAM,IAAU,KAAQ,WAClB,IAAW,MAAS,KAAA,IAAkC,IAAtB,EAAS,EAAK,GAAG;AAEvD,QACE,kBAAC,QAAD;EACE,WAAW,EACT,EAAe,EAAE,SAAM,CAAC,EACxB,MAAQ,KAAA,KAAa,EAAc,IACnC,MAAQ,KAAA,KAAa,kBACrB,EAAW,EAAM,EACjB,EACD;EACD,kBAAe;EACV;EACL,GAAI;YAVN,CAYG,MAAQ,KAAA,IAGP,kBAAC,QAAD,EAAA,UAAO,MAAS,KAAA,IAAgC,MAApB,EAAY,EAAK,EAAc,CAAA,GAF3D,kBAAC,OAAD;GAAK,KAAK,KAAQ;GAAI,WAAU;GAAgE;GAAO,CAAA,EAIxG,MAAW,KAAA,KACV,kBAAC,QAAD,EACE,WAAW,EACT,yDACA,EAAc,IACd,EAAa,GACd,EACD,CAAA,CAEC;;EAGZ,EAMY,IAAc,EACzB,SAAqB,EAAE,aAAU,cAAW,QAAK,GAAG,KAAS,GAAK;CAChE,IAAM,IAAQ,MAAM,QAAQ,EAAS,GAAG,IAAW,CAAC,EAAS,EACvD,IAAU,MAAQ,KAAA,IAAkC,IAAtB,EAAM,MAAM,GAAG,EAAI,EACjD,IAAW,MAAQ,KAAA,IAAiC,IAArB,EAAM,SAAS;AAEpD,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,mBAAmB,EAAU;EAC3C,kBAAe;EACV;EACL,GAAI;YAJN,CAMG,GACA,IAAW,KACV,kBAAC,QAAD;GAAM,WAAU;aAAhB,CAAoJ,KAChJ,EACG;KAEL;;EAGX"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { r as e, t } from "./glass-CQTlX7IO.js";
|
|
2
|
+
import { r as n } from "./button-avu-rQU4.js";
|
|
3
|
+
import { forwardRef as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
//#region src/l2-primitives/badge.tsx
|
|
6
|
+
var o = n("inline-flex select-none items-center gds-gap-xs gds-radius-badge gds-pad-x-sm gds-pad-y-sm gds-text-caption font-medium", {
|
|
7
|
+
defaultVariants: { variant: "default" },
|
|
8
|
+
variants: { variant: {
|
|
9
|
+
danger: "bg-danger/10 text-danger",
|
|
10
|
+
default: "bg-fg-muted/10 text-fg-muted",
|
|
11
|
+
info: "bg-accent/10 text-accent",
|
|
12
|
+
"palette-0": "bg-palette-0/10 text-palette-0",
|
|
13
|
+
"palette-1": "bg-palette-1/10 text-palette-1",
|
|
14
|
+
"palette-2": "bg-palette-2/10 text-palette-2",
|
|
15
|
+
"palette-3": "bg-palette-3/10 text-palette-3",
|
|
16
|
+
"palette-4": "bg-palette-4/10 text-palette-4",
|
|
17
|
+
"palette-5": "bg-palette-5/10 text-palette-5",
|
|
18
|
+
"palette-6": "bg-palette-6/10 text-palette-6",
|
|
19
|
+
"palette-7": "bg-palette-7/10 text-palette-7",
|
|
20
|
+
"palette-8": "bg-palette-8/10 text-palette-8",
|
|
21
|
+
"palette-9": "bg-palette-9/10 text-palette-9",
|
|
22
|
+
success: "bg-success/10 text-success",
|
|
23
|
+
warning: "bg-warning/10 text-warning"
|
|
24
|
+
} }
|
|
25
|
+
}), s = {
|
|
26
|
+
danger: "bg-danger",
|
|
27
|
+
default: "bg-fg-muted",
|
|
28
|
+
info: "bg-accent",
|
|
29
|
+
success: "bg-success",
|
|
30
|
+
warning: "bg-warning"
|
|
31
|
+
}, c = r(function({ children: n, className: r, count: c, countMax: l = 99, dot: u, glass: d, variant: f, ...p }, m) {
|
|
32
|
+
if (c !== void 0) {
|
|
33
|
+
if (c <= 0) return null;
|
|
34
|
+
let n = c > l ? `${l}+` : String(c);
|
|
35
|
+
return /* @__PURE__ */ i("span", {
|
|
36
|
+
className: e("inline-flex items-center justify-center gds-radius-badge gds-text-caption font-bold text-accent-fg select-none", "h-[18px] min-w-[18px] px-1", f === "danger" ? "animate-pulse bg-danger" : "bg-accent", t(d), d === !0 && "border border-white/10 bg-white/5", r),
|
|
37
|
+
"data-component": "badge",
|
|
38
|
+
"data-variant": "count",
|
|
39
|
+
ref: m,
|
|
40
|
+
...p,
|
|
41
|
+
children: n
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return /* @__PURE__ */ a("span", {
|
|
45
|
+
className: e(o({ variant: f }), t(d), d === !0 && "border border-white/10 bg-white/5", r),
|
|
46
|
+
"data-component": "badge",
|
|
47
|
+
"data-variant": f ?? "default",
|
|
48
|
+
ref: m,
|
|
49
|
+
...p,
|
|
50
|
+
children: [u === !0 && /* @__PURE__ */ i("span", { className: e("h-1.5 w-1.5 gds-radius-badge", s[f ?? "default"] ?? "bg-fg-muted") }), n]
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
function l(e) {
|
|
54
|
+
return `palette-${e % 10}`;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { o as n, l as r, c as t };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=badge-DTJq6AXr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-DTJq6AXr.js","names":[],"sources":["../src/l2-primitives/badge.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport { forwardRef } from 'react'\n\nimport { cx } from '../utils/cx'\nimport { glassClass } from '../utils/glass'\nimport type { VariantProps } from '../utils/types'\n\nconst badgeVariants = cva(\n 'inline-flex select-none items-center gds-gap-xs gds-radius-badge gds-pad-x-sm gds-pad-y-sm gds-text-caption font-medium',\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n danger: 'bg-danger/10 text-danger',\n default: 'bg-fg-muted/10 text-fg-muted',\n info: 'bg-accent/10 text-accent',\n 'palette-0': 'bg-palette-0/10 text-palette-0',\n 'palette-1': 'bg-palette-1/10 text-palette-1',\n 'palette-2': 'bg-palette-2/10 text-palette-2',\n 'palette-3': 'bg-palette-3/10 text-palette-3',\n 'palette-4': 'bg-palette-4/10 text-palette-4',\n 'palette-5': 'bg-palette-5/10 text-palette-5',\n 'palette-6': 'bg-palette-6/10 text-palette-6',\n 'palette-7': 'bg-palette-7/10 text-palette-7',\n 'palette-8': 'bg-palette-8/10 text-palette-8',\n 'palette-9': 'bg-palette-9/10 text-palette-9',\n success: 'bg-success/10 text-success',\n warning: 'bg-warning/10 text-warning',\n },\n },\n },\n)\n\nconst dotColors: Partial<Record<string, string>> = {\n danger: 'bg-danger',\n default: 'bg-fg-muted',\n info: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n}\n\ntype BadgeVariant = NonNullable<VariantProps<typeof badgeVariants>['variant']>\n\ntype BadgeProps = React.HTMLAttributes<HTMLSpanElement> &\n VariantProps<typeof badgeVariants> & {\n count?: number\n countMax?: number\n dot?: boolean\n glass?: boolean\n }\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n children,\n className,\n count,\n countMax = 99,\n dot,\n glass,\n variant,\n ...props\n },\n ref,\n ) {\n // count badge mode\n if (count !== undefined) {\n if (count <= 0) return null\n const display = count > countMax ? `${countMax}+` : String(count)\n return (\n <span\n className={cx(\n 'inline-flex items-center justify-center gds-radius-badge gds-text-caption font-bold text-accent-fg select-none',\n 'h-[18px] min-w-[18px] px-1',\n variant === 'danger' ? 'animate-pulse bg-danger' : 'bg-accent',\n glassClass(glass),\n glass === true && 'border border-white/10 bg-white/5',\n className,\n )}\n data-component=\"badge\"\n data-variant=\"count\"\n ref={ref}\n {...props}\n >\n {display}\n </span>\n )\n }\n\n // standard badge\n return (\n <span\n className={cx(\n badgeVariants({ variant }),\n glassClass(glass),\n glass === true && 'border border-white/10 bg-white/5',\n className,\n )}\n data-component=\"badge\"\n data-variant={variant ?? 'default'}\n ref={ref}\n {...props}\n >\n {dot === true && (\n <span\n className={cx(\n 'h-1.5 w-1.5 gds-radius-badge',\n dotColors[variant ?? 'default'] ?? 'bg-fg-muted',\n )}\n />\n )}\n {children}\n </span>\n )\n },\n)\n\n// map a numeric index to a palette variant\nexport function paletteVariant(index: number): BadgeVariant {\n return `palette-${index % 10}` as BadgeVariant\n}\n\nexport { badgeVariants }\nexport type { BadgeProps, BadgeVariant }\n"],"mappings":";;;;;AAOA,IAAM,IAAgB,EACpB,2HACA;CACE,iBAAiB,EACf,SAAS,WACV;CACD,UAAU,EACR,SAAS;EACP,QAAQ;EACR,SAAS;EACT,MAAM;EACN,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,SAAS;EACT,SAAS;EACV,EACF;CACF,CACF,EAEK,IAA6C;CACjD,QAAQ;CACR,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAYY,IAAQ,EACnB,SACE,EACE,aACA,cACA,UACA,cAAW,IACX,QACA,UACA,YACA,GAAG,KAEL,GACA;AAEA,KAAI,MAAU,KAAA,GAAW;AACvB,MAAI,KAAS,EAAG,QAAO;EACvB,IAAM,IAAU,IAAQ,IAAW,GAAG,EAAS,KAAK,OAAO,EAAM;AACjE,SACE,kBAAC,QAAD;GACE,WAAW,EACT,kHACA,8BACA,MAAY,WAAW,4BAA4B,aACnD,EAAW,EAAM,EACjB,MAAU,MAAQ,qCAClB,EACD;GACD,kBAAe;GACf,gBAAa;GACR;GACL,GAAI;aAEH;GACI,CAAA;;AAKX,QACE,kBAAC,QAAD;EACE,WAAW,EACT,EAAc,EAAE,YAAS,CAAC,EAC1B,EAAW,EAAM,EACjB,MAAU,MAAQ,qCAClB,EACD;EACD,kBAAe;EACf,gBAAc,KAAW;EACpB;EACL,GAAI;YAVN,CAYG,MAAQ,MACP,kBAAC,QAAD,EACE,WAAW,EACT,gCACA,EAAU,KAAW,cAAc,cACpC,EACD,CAAA,EAEH,EACI;;EAGZ;AAGD,SAAgB,EAAe,GAA6B;AAC1D,QAAO,WAAW,IAAQ"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { i as e, r as t, t as n } from "./glass-CQTlX7IO.js";
|
|
2
|
+
import { r, t as i } from "./motion-DUPegem-.js";
|
|
3
|
+
import { forwardRef as a } from "react";
|
|
4
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
//#region node_modules/class-variance-authority/dist/index.mjs
|
|
6
|
+
var c = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, l = e, u = (e, t) => (n) => {
|
|
7
|
+
if (t?.variants == null) return l(e, n?.class, n?.className);
|
|
8
|
+
let { variants: r, defaultVariants: i } = t, a = Object.keys(r).map((e) => {
|
|
9
|
+
let t = n?.[e], a = i?.[e];
|
|
10
|
+
if (t === null) return null;
|
|
11
|
+
let o = c(t) || c(a);
|
|
12
|
+
return r[e][o];
|
|
13
|
+
}), o = n && Object.entries(n).reduce((e, t) => {
|
|
14
|
+
let [n, r] = t;
|
|
15
|
+
return r === void 0 || (e[n] = r), e;
|
|
16
|
+
}, {});
|
|
17
|
+
return l(e, a, t?.compoundVariants?.reduce((e, t) => {
|
|
18
|
+
let { class: n, className: r, ...a } = t;
|
|
19
|
+
return Object.entries(a).every((e) => {
|
|
20
|
+
let [t, n] = e;
|
|
21
|
+
return Array.isArray(n) ? n.includes({
|
|
22
|
+
...i,
|
|
23
|
+
...o
|
|
24
|
+
}[t]) : {
|
|
25
|
+
...i,
|
|
26
|
+
...o
|
|
27
|
+
}[t] === n;
|
|
28
|
+
}) ? [
|
|
29
|
+
...e,
|
|
30
|
+
n,
|
|
31
|
+
r
|
|
32
|
+
] : e;
|
|
33
|
+
}, []), n?.class, n?.className);
|
|
34
|
+
}, d = u("inline-flex select-none items-center justify-center font-medium transition-colors " + r, {
|
|
35
|
+
defaultVariants: {
|
|
36
|
+
size: "default",
|
|
37
|
+
variant: "primary"
|
|
38
|
+
},
|
|
39
|
+
variants: {
|
|
40
|
+
size: {
|
|
41
|
+
default: "gds-h gds-gap-sm gds-radius-button gds-pad-x gds-text-body",
|
|
42
|
+
lg: "gds-h-lg gds-gap gds-radius-button gds-pad-x-lg gds-text-body",
|
|
43
|
+
sm: "gds-h-sm gds-gap-xs gds-radius-button gds-pad-x-sm gds-text-label"
|
|
44
|
+
},
|
|
45
|
+
variant: {
|
|
46
|
+
danger: "bg-danger text-accent-fg hover:bg-danger/90",
|
|
47
|
+
ghost: "bg-transparent text-fg-muted hover:bg-bg-tertiary hover:text-fg",
|
|
48
|
+
primary: "bg-accent text-accent-fg hover:bg-accent-hover",
|
|
49
|
+
secondary: "border border-border bg-transparent text-fg hover:bg-bg-tertiary"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
function f() {
|
|
54
|
+
return /* @__PURE__ */ s("svg", {
|
|
55
|
+
className: "h-3 w-3 animate-spin",
|
|
56
|
+
fill: "none",
|
|
57
|
+
viewBox: "0 0 24 24",
|
|
58
|
+
children: [/* @__PURE__ */ o("circle", {
|
|
59
|
+
className: "opacity-25",
|
|
60
|
+
cx: "12",
|
|
61
|
+
cy: "12",
|
|
62
|
+
r: "10",
|
|
63
|
+
stroke: "currentColor",
|
|
64
|
+
strokeWidth: "4"
|
|
65
|
+
}), /* @__PURE__ */ o("path", {
|
|
66
|
+
className: "opacity-75",
|
|
67
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z",
|
|
68
|
+
fill: "currentColor"
|
|
69
|
+
})]
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
var p = a(function({ children: e, className: r, disabled: a, fullWidth: c, glass: l, icon: u, iconRight: p, loading: m, motion: h, size: g, variant: _, ...v }, y) {
|
|
73
|
+
return /* @__PURE__ */ s("button", {
|
|
74
|
+
className: t(d({
|
|
75
|
+
size: g,
|
|
76
|
+
variant: _
|
|
77
|
+
}), (a === !0 || m === !0) && "cursor-not-allowed opacity-50", c === !0 && "w-full", n(l), l === !0 && "border border-white/10 bg-bg/60", i(h), r),
|
|
78
|
+
"data-component": "button",
|
|
79
|
+
"data-variant": _ ?? "primary",
|
|
80
|
+
disabled: a === !0 || m === !0,
|
|
81
|
+
ref: y,
|
|
82
|
+
...v,
|
|
83
|
+
children: [
|
|
84
|
+
m === !0 ? /* @__PURE__ */ o(f, {}) : u === void 0 ? null : /* @__PURE__ */ o("span", {
|
|
85
|
+
className: "gds-icon-child-sm",
|
|
86
|
+
children: u
|
|
87
|
+
}),
|
|
88
|
+
e,
|
|
89
|
+
p !== void 0 && /* @__PURE__ */ o("span", {
|
|
90
|
+
className: "gds-icon-child-sm",
|
|
91
|
+
children: p
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//#endregion
|
|
97
|
+
export { d as n, u as r, p as t };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=button-avu-rQU4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-avu-rQU4.js","names":[],"sources":["../node_modules/class-variance-authority/dist/index.mjs","../src/l2-primitives/button.tsx"],"sourcesContent":["/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","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 { motionClass } from '../utils/motion'\nimport type { VariantProps } from '../utils/types'\n\nconst buttonVariants = cva(\n 'inline-flex select-none items-center justify-center font-medium transition-colors ' +\n focusCls,\n {\n defaultVariants: {\n size: 'default',\n variant: 'primary',\n },\n variants: {\n size: {\n default: 'gds-h gds-gap-sm gds-radius-button gds-pad-x gds-text-body',\n lg: 'gds-h-lg gds-gap gds-radius-button gds-pad-x-lg gds-text-body',\n sm: 'gds-h-sm gds-gap-xs gds-radius-button gds-pad-x-sm gds-text-label',\n },\n variant: {\n danger: 'bg-danger text-accent-fg hover:bg-danger/90',\n ghost: 'bg-transparent text-fg-muted hover:bg-bg-tertiary hover:text-fg',\n primary: 'bg-accent text-accent-fg hover:bg-accent-hover',\n secondary: 'border border-border bg-transparent text-fg hover:bg-bg-tertiary',\n },\n },\n },\n)\n\ntype ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n fullWidth?: boolean\n glass?: boolean\n icon?: ReactNode\n iconRight?: ReactNode\n loading?: boolean\n motion?: string\n }\n\n// inline SVG spinner to avoid circular L2 dependency\nfunction InlineSpinner() {\n return (\n <svg className=\"h-3 w-3 animate-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\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 const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n {\n children,\n className,\n disabled,\n fullWidth,\n glass,\n icon,\n iconRight,\n loading,\n motion: m,\n size,\n variant,\n ...props\n },\n ref,\n ) {\n return (\n <button\n className={cx(\n buttonVariants({ size, variant }),\n (disabled === true || loading === true) && 'cursor-not-allowed opacity-50',\n fullWidth === true && 'w-full',\n glassClass(glass),\n glass === true && 'border border-white/10 bg-bg/60',\n motionClass(m),\n className,\n )}\n data-component=\"button\"\n data-variant={variant ?? 'primary'}\n disabled={disabled === true || loading === true}\n ref={ref}\n {...props}\n >\n {loading === true ? (\n <InlineSpinner />\n ) : icon !== undefined ? (\n <span className=\"gds-icon-child-sm\">{icon}</span>\n ) : null}\n {children}\n {iconRight !== undefined && (\n <span className=\"gds-icon-child-sm\">{iconRight}</span>\n )}\n </button>\n )\n },\n)\n\nexport { buttonVariants }\nexport type { ButtonProps }\n"],"x_google_ignoreList":[0],"mappings":";;;;;AAeA,IAAM,KAAiB,MAAQ,OAAO,KAAU,YAAY,GAAG,MAAU,MAAU,IAAI,MAAM,GAChF,IAAK,GACL,KAAO,GAAM,OAAU,MAAQ;AAEpC,KAAK,GAAuD,YAAa,KAAM,QAAO,EAAG,GAAM,GAAoD,OAAO,GAAoD,UAAU;CACxN,IAAM,EAAE,aAAU,uBAAoB,GAChC,IAAuB,OAAO,KAAK,EAAS,CAAC,KAAK,MAAU;EAC9D,IAAM,IAAc,IAAoD,IAClE,IAAqB,IAAkF;AAC7G,MAAI,MAAgB,KAAM,QAAO;EACjC,IAAM,IAAa,EAAc,EAAY,IAAI,EAAc,EAAmB;AAClF,SAAO,EAAS,GAAS;GAC3B,EACI,IAAwB,KAAS,OAAO,QAAQ,EAAM,CAAC,QAAQ,GAAK,MAAQ;EAC9E,IAAI,CAAC,GAAK,KAAS;AAKnB,SAJI,MAAU,KAAA,MAGd,EAAI,KAAO,IAFA;IAIZ,EAAE,CAAC;AAkBN,QAAO,EAAG,GAAM,GAjBqB,GAAmF,kBAAsG,QAAQ,GAAK,MAAQ;EAC/O,IAAI,EAAE,OAAO,GAAS,WAAW,GAAa,GAAG,MAA2B;AAC5E,SAAO,OAAO,QAAQ,EAAuB,CAAC,OAAO,MAAQ;GACzD,IAAI,CAAC,GAAK,KAAS;AACnB,UAAO,MAAM,QAAQ,EAAM,GAAG,EAAM,SAAS;IACzC,GAAG;IACH,GAAG;IACN,CAAC,GAAK,GAAI;IACP,GAAG;IACH,GAAG;IACN,CAAE,OAAS;IACd,GAAG;GACD,GAAG;GACH;GACA;GACH,GAAG;IACL,EAAE,CAAC,EAC8D,GAAoD,OAAO,GAAoD,UAAU;GC3C/L,IAAiB,EACrB,uFACE,GACF;CACE,iBAAiB;EACf,MAAM;EACN,SAAS;EACV;CACD,UAAU;EACR,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACL;EACD,SAAS;GACP,QAAQ;GACR,OAAO;GACP,SAAS;GACT,WAAW;GACZ;EACF;CACF,CACF;AAaD,SAAS,IAAgB;AACvB,QACE,kBAAC,OAAD;EAAK,WAAU;EAAuB,MAAK;EAAO,SAAQ;YAA1D,CACE,kBAAC,UAAD;GACE,WAAU;GACV,IAAG;GACH,IAAG;GACH,GAAE;GACF,QAAO;GACP,aAAY;GACZ,CAAA,EACF,kBAAC,QAAD;GACE,WAAU;GACV,GAAE;GACF,MAAK;GACL,CAAA,CACE;;;AAIV,IAAa,IAAS,EACpB,SACE,EACE,aACA,cACA,aACA,cACA,UACA,SACA,cACA,YACA,QAAQ,GACR,SACA,YACA,GAAG,KAEL,GACA;AACA,QACE,kBAAC,UAAD;EACE,WAAW,EACT,EAAe;GAAE;GAAM;GAAS,CAAC,GAChC,MAAa,MAAQ,MAAY,OAAS,iCAC3C,MAAc,MAAQ,UACtB,EAAW,EAAM,EACjB,MAAU,MAAQ,mCAClB,EAAY,EAAE,EACd,EACD;EACD,kBAAe;EACf,gBAAc,KAAW;EACzB,UAAU,MAAa,MAAQ,MAAY;EACtC;EACL,GAAI;YAdN;GAgBG,MAAY,KACX,kBAAC,GAAD,EAAiB,CAAA,GACf,MAAS,KAAA,IAET,OADF,kBAAC,QAAD;IAAM,WAAU;cAAqB;IAAY,CAAA;GAElD;GACA,MAAc,KAAA,KACb,kBAAC,QAAD;IAAM,WAAU;cAAqB;IAAiB,CAAA;GAEjD;;EAGd"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/utils/dom.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
return e.key === "Enter" || e.key === " ";
|
|
4
|
+
}
|
|
5
|
+
function t(...e) {
|
|
6
|
+
return (t) => {
|
|
7
|
+
for (let n of e) n != null && (typeof n == "function" ? n(t) : n.current = t);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function n(e, t, n) {
|
|
11
|
+
return Math.min(Math.max(e, t), n);
|
|
12
|
+
}
|
|
13
|
+
var r = 0;
|
|
14
|
+
function i(e = "gds") {
|
|
15
|
+
return r += 1, `${e}-${r}`;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { i, e as n, t as r, n as t };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=dom-17XgfxMq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-17XgfxMq.js","names":[],"sources":["../src/utils/dom.ts"],"sourcesContent":["// dom utilities — keyboard, event, and element helpers\n\n// check if keyboard event should trigger click (Enter or Space)\nexport function isActivationKey(e: React.KeyboardEvent): boolean {\n return e.key === 'Enter' || e.key === ' '\n}\n\n// merge multiple refs into one callback ref\nexport function mergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (value) => {\n for (const ref of refs) {\n if (ref === undefined || ref === null) continue\n if (typeof ref === 'function') {\n ref(value)\n } else {\n ;(ref as React.MutableRefObject<T | null>).current = value\n }\n }\n }\n}\n\n// clamp a number between min and max (immutable)\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\n// generate a unique id with optional prefix\nlet counter = 0\nexport function uid(prefix = 'gds'): string {\n counter += 1\n return `${prefix}-${counter}`\n}\n"],"mappings":";AAGA,SAAgB,EAAgB,GAAiC;AAC/D,QAAO,EAAE,QAAQ,WAAW,EAAE,QAAQ;;AAIxC,SAAgB,EACd,GAAG,GACmB;AACtB,SAAQ,MAAU;AAChB,OAAK,IAAM,KAAO,EACZ,MAA6B,SAC7B,OAAO,KAAQ,aACjB,EAAI,EAAM,GAER,EAAyC,UAAU;;;AAO7D,SAAgB,EAAM,GAAe,GAAa,GAAqB;AACrE,QAAO,KAAK,IAAI,KAAK,IAAI,GAAO,EAAI,EAAE,EAAI;;AAI5C,IAAI,IAAU;AACd,SAAgB,EAAI,IAAS,OAAe;AAE1C,QADA,KAAW,GACJ,GAAG,EAAO,GAAG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { a as e, c as t, i as n, t as r } from "./gesture-system-v-bjvnCe.js";
|
|
2
|
+
import { useCallback as i, useRef as a } from "react";
|
|
3
|
+
//#region src/utils/gesture.ts
|
|
4
|
+
function o(e) {
|
|
5
|
+
let n = a(null);
|
|
6
|
+
return {
|
|
7
|
+
onPointerDown: i((e) => {
|
|
8
|
+
n.current = {
|
|
9
|
+
startX: e.clientX,
|
|
10
|
+
startY: e.clientY,
|
|
11
|
+
startTime: Date.now(),
|
|
12
|
+
currentX: e.clientX,
|
|
13
|
+
currentY: e.clientY,
|
|
14
|
+
pointerId: e.pointerId
|
|
15
|
+
}, e.target.setPointerCapture(e.pointerId);
|
|
16
|
+
}, []),
|
|
17
|
+
onPointerMove: i((e) => {
|
|
18
|
+
n.current !== null && (n.current.currentX = e.clientX, n.current.currentY = e.clientY);
|
|
19
|
+
}, []),
|
|
20
|
+
onPointerUp: i(() => {
|
|
21
|
+
let r = n.current;
|
|
22
|
+
if (r === null) return;
|
|
23
|
+
n.current = null;
|
|
24
|
+
let i = r.currentX - r.startX, a = r.currentY - r.startY, o = Math.max(1, Date.now() - r.startTime), s = Math.abs(i), c = Math.abs(a), l = s > c, u = l ? s : c, d = l ? c : s, f = u / o;
|
|
25
|
+
if (u < t.minDistance || f < t.minVelocity || d > t.maxCrossDeviation) return;
|
|
26
|
+
let p;
|
|
27
|
+
p = l ? i > 0 ? "right" : "left" : a > 0 ? "down" : "up", e(p, f);
|
|
28
|
+
}, [e])
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function s(t) {
|
|
32
|
+
let n = a(null), r = a(null);
|
|
33
|
+
return {
|
|
34
|
+
onPointerDown: i((i) => {
|
|
35
|
+
r.current = {
|
|
36
|
+
x: i.clientX,
|
|
37
|
+
y: i.clientY
|
|
38
|
+
}, n.current = setTimeout(() => {
|
|
39
|
+
t(), n.current = null;
|
|
40
|
+
}, e.duration);
|
|
41
|
+
}, [t]),
|
|
42
|
+
onPointerMove: i((t) => {
|
|
43
|
+
if (r.current === null || n.current === null) return;
|
|
44
|
+
let i = Math.abs(t.clientX - r.current.x), a = Math.abs(t.clientY - r.current.y);
|
|
45
|
+
(i > e.maxMovement || a > e.maxMovement) && (clearTimeout(n.current), n.current = null);
|
|
46
|
+
}, []),
|
|
47
|
+
onPointerUp: i(() => {
|
|
48
|
+
n.current !== null && (clearTimeout(n.current), n.current = null), r.current = null;
|
|
49
|
+
}, [])
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function c(e, t) {
|
|
53
|
+
let n = a(null), o = a(!1);
|
|
54
|
+
return {
|
|
55
|
+
onPointerDown: i((e) => {
|
|
56
|
+
n.current = {
|
|
57
|
+
startX: e.clientX,
|
|
58
|
+
startY: e.clientY,
|
|
59
|
+
startTime: Date.now(),
|
|
60
|
+
currentX: e.clientX,
|
|
61
|
+
currentY: e.clientY,
|
|
62
|
+
pointerId: e.pointerId
|
|
63
|
+
}, o.current = !1, e.target.setPointerCapture(e.pointerId);
|
|
64
|
+
}, []),
|
|
65
|
+
onPointerMove: i((t) => {
|
|
66
|
+
let i = n.current;
|
|
67
|
+
if (i === null) return;
|
|
68
|
+
let a = t.clientX - i.startX, s = t.clientY - i.startY;
|
|
69
|
+
if (!o.current) {
|
|
70
|
+
if (Math.abs(a) < r.startThreshold && Math.abs(s) < r.startThreshold) return;
|
|
71
|
+
o.current = !0;
|
|
72
|
+
}
|
|
73
|
+
i.currentX = t.clientX, i.currentY = t.clientY, e({
|
|
74
|
+
dx: a,
|
|
75
|
+
dy: s,
|
|
76
|
+
isDragging: !0
|
|
77
|
+
});
|
|
78
|
+
}, [e]),
|
|
79
|
+
onPointerUp: i(() => {
|
|
80
|
+
let e = n.current;
|
|
81
|
+
if (e === null) return;
|
|
82
|
+
let r = e.currentX - e.startX, i = e.currentY - e.startY;
|
|
83
|
+
o.current && t && t({
|
|
84
|
+
dx: r,
|
|
85
|
+
dy: i,
|
|
86
|
+
isDragging: !1
|
|
87
|
+
}), n.current = null, o.current = !1;
|
|
88
|
+
}, [t])
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function l(e, t, r, i) {
|
|
92
|
+
let a = Math.min(Math.abs(e), n.maxVelocity) * Math.sign(e), o = t, s, c = () => {
|
|
93
|
+
if (a *= n.friction, o += a, Math.abs(a) < n.minVelocity) {
|
|
94
|
+
r(o), i?.();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
r(o), s = requestAnimationFrame(c);
|
|
98
|
+
};
|
|
99
|
+
return s = requestAnimationFrame(c), () => cancelAnimationFrame(s);
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
export { o as i, c as n, s as r, l as t };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=gesture-BCGijGek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture-BCGijGek.js","names":[],"sources":["../src/utils/gesture.ts"],"sourcesContent":["// L-dep — gesture hooks\n// consumes L0 gesture-system thresholds\n// provides touch/pointer gesture recognition for components\n\nimport { useCallback, useRef } from 'react'\n\nimport type { GestureDirection } from '../l0-tokens/gesture-system'\nimport { drag, inertia, longPress, swipe } from '../l0-tokens/gesture-system'\n\n// shared pointer state tracked during gestures\ntype PointerState = {\n startX: number\n startY: number\n startTime: number\n currentX: number\n currentY: number\n pointerId: number\n}\n\n// === useSwipe ===\n// detects swipe gestures on an element\n// returns handlers to spread on the target element\nexport type SwipeHandler = (dir: GestureDirection, velocity: number) => void\n\nexport function useSwipe(onSwipe: SwipeHandler) {\n const stateRef = useRef<PointerState | null>(null)\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n stateRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startTime: Date.now(),\n currentX: e.clientX,\n currentY: e.clientY,\n pointerId: e.pointerId,\n }\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [])\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (stateRef.current === null) return\n stateRef.current.currentX = e.clientX\n stateRef.current.currentY = e.clientY\n }, [])\n\n const onPointerUp = useCallback(() => {\n const s = stateRef.current\n if (s === null) return\n stateRef.current = null\n\n const dx = s.currentX - s.startX\n const dy = s.currentY - s.startY\n const dt = Math.max(1, Date.now() - s.startTime)\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n\n // determine if it's a horizontal or vertical swipe\n const isHorizontal = absDx > absDy\n const distance = isHorizontal ? absDx : absDy\n const crossDeviation = isHorizontal ? absDy : absDx\n const velocity = distance / dt\n\n // must meet thresholds\n if (distance < swipe.minDistance) return\n if (velocity < swipe.minVelocity) return\n if (crossDeviation > swipe.maxCrossDeviation) return\n\n let dir: GestureDirection\n if (isHorizontal) {\n dir = dx > 0 ? 'right' : 'left'\n } else {\n dir = dy > 0 ? 'down' : 'up'\n }\n\n onSwipe(dir, velocity)\n }, [onSwipe])\n\n return { onPointerDown, onPointerMove, onPointerUp }\n}\n\n// === useLongPress ===\n// detects long press on an element\nexport function useLongPress(onLongPress: () => void) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const startRef = useRef<{ x: number, y: number } | null>(null)\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n startRef.current = { x: e.clientX, y: e.clientY }\n timerRef.current = setTimeout(() => {\n onLongPress()\n timerRef.current = null\n }, longPress.duration)\n }, [onLongPress])\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (startRef.current === null || timerRef.current === null) return\n const dx = Math.abs(e.clientX - startRef.current.x)\n const dy = Math.abs(e.clientY - startRef.current.y)\n if (dx > longPress.maxMovement || dy > longPress.maxMovement) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const onPointerUp = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n startRef.current = null\n }, [])\n\n return { onPointerDown, onPointerMove, onPointerUp }\n}\n\n// === useDrag ===\n// provides drag position tracking with start threshold\nexport type DragState = {\n dx: number\n dy: number\n isDragging: boolean\n}\n\nexport type DragHandler = (state: DragState) => void\n\nexport function useDrag(onDrag: DragHandler, onDragEnd?: (state: DragState) => void) {\n const stateRef = useRef<PointerState | null>(null)\n const isDragging = useRef(false)\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n stateRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n startTime: Date.now(),\n currentX: e.clientX,\n currentY: e.clientY,\n pointerId: e.pointerId,\n }\n isDragging.current = false\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n }, [])\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n const s = stateRef.current\n if (s === null) return\n\n const dx = e.clientX - s.startX\n const dy = e.clientY - s.startY\n\n // start threshold — prevent accidental drag on tap\n if (!isDragging.current) {\n if (Math.abs(dx) < drag.startThreshold && Math.abs(dy) < drag.startThreshold) return\n isDragging.current = true\n }\n\n s.currentX = e.clientX\n s.currentY = e.clientY\n onDrag({ dx, dy, isDragging: true })\n }, [onDrag])\n\n const onPointerUp = useCallback(() => {\n const s = stateRef.current\n if (s === null) return\n\n const dx = s.currentX - s.startX\n const dy = s.currentY - s.startY\n\n if (isDragging.current && onDragEnd) {\n onDragEnd({ dx, dy, isDragging: false })\n }\n\n stateRef.current = null\n isDragging.current = false\n }, [onDragEnd])\n\n return { onPointerDown, onPointerMove, onPointerUp }\n}\n\n// === useInertia ===\n// applies momentum to a value after drag release\nexport function applyInertia(\n velocity: number,\n position: number,\n onFrame: (pos: number) => void,\n onEnd?: () => void,\n): () => void {\n let vel = Math.min(Math.abs(velocity), inertia.maxVelocity) * Math.sign(velocity)\n let pos = position\n let frame: number\n\n const step = () => {\n vel *= inertia.friction\n pos += vel\n\n if (Math.abs(vel) < inertia.minVelocity) {\n onFrame(pos)\n onEnd?.()\n return\n }\n\n onFrame(pos)\n frame = requestAnimationFrame(step)\n }\n\n frame = requestAnimationFrame(step)\n\n // return cancel function\n return () => cancelAnimationFrame(frame)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//#region src/l0-tokens/gesture-system.ts
|
|
2
|
+
var e = {
|
|
3
|
+
minDistance: 30,
|
|
4
|
+
minVelocity: .3,
|
|
5
|
+
maxCrossDeviation: 75,
|
|
6
|
+
dismissDuration: 200,
|
|
7
|
+
snapBack: {
|
|
8
|
+
tension: 300,
|
|
9
|
+
friction: 25
|
|
10
|
+
}
|
|
11
|
+
}, t = {
|
|
12
|
+
triggerDistance: 80,
|
|
13
|
+
maxDistance: 120,
|
|
14
|
+
resistanceFactor: .4,
|
|
15
|
+
indicatorSize: 32
|
|
16
|
+
}, n = {
|
|
17
|
+
minScaleDelta: .05,
|
|
18
|
+
minScale: .5,
|
|
19
|
+
maxScale: 4,
|
|
20
|
+
snapScales: [
|
|
21
|
+
1,
|
|
22
|
+
2,
|
|
23
|
+
3
|
|
24
|
+
]
|
|
25
|
+
}, r = {
|
|
26
|
+
duration: 500,
|
|
27
|
+
maxMovement: 10
|
|
28
|
+
}, i = {
|
|
29
|
+
startThreshold: 5,
|
|
30
|
+
snapDistance: 20
|
|
31
|
+
}, a = {
|
|
32
|
+
friction: .95,
|
|
33
|
+
minVelocity: .1,
|
|
34
|
+
maxVelocity: 5
|
|
35
|
+
}, o = {
|
|
36
|
+
swipe: e,
|
|
37
|
+
pullToRefresh: t,
|
|
38
|
+
pinchZoom: n,
|
|
39
|
+
longPress: r,
|
|
40
|
+
drag: i,
|
|
41
|
+
inertia: a
|
|
42
|
+
};
|
|
43
|
+
function s() {
|
|
44
|
+
return {
|
|
45
|
+
"--gds-gesture-dismiss-duration": `${e.dismissDuration}ms`,
|
|
46
|
+
"--gds-gesture-snap-tension": `${e.snapBack.tension}`,
|
|
47
|
+
"--gds-gesture-snap-friction": `${e.snapBack.friction}`,
|
|
48
|
+
"--gds-gesture-pull-trigger": `${t.triggerDistance}px`,
|
|
49
|
+
"--gds-gesture-pull-max": `${t.maxDistance}px`,
|
|
50
|
+
"--gds-gesture-longpress-duration": `${r.duration}ms`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { r as a, e as c, a as i, o as n, n as o, s as r, t as s, i as t };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=gesture-system-v-bjvnCe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture-system-v-bjvnCe.js","names":[],"sources":["../src/l0-tokens/gesture-system.ts"],"sourcesContent":["// L0 — gesture system\n// touch/pointer gesture recognition primitives\n// defines thresholds, velocities, and directions for gesture detection\n// actual React hooks consume these constants (in L-dep utils/hooks)\n\n// gesture direction\nexport type GestureDirection = 'down' | 'left' | 'right' | 'up'\n\n// swipe detection thresholds\nexport const swipe = {\n // minimum distance (px) to recognize as swipe, not tap\n minDistance: 30,\n // minimum velocity (px/ms) to count as intentional swipe\n minVelocity: 0.3,\n // maximum deviation in cross-axis (px) — prevents diagonal from triggering\n maxCrossDeviation: 75,\n // animation: how long the dismiss/snap animation takes\n dismissDuration: 200,\n // spring config for snap-back when swipe cancelled\n snapBack: { tension: 300, friction: 25 },\n} as const\n\n// pull-to-refresh thresholds\nexport const pullToRefresh = {\n // how far user must pull before refresh triggers\n triggerDistance: 80,\n // maximum pull distance (resistance beyond this)\n maxDistance: 120,\n // resistance factor after triggerDistance (0-1, lower = more resistance)\n resistanceFactor: 0.4,\n // indicator size\n indicatorSize: 32,\n} as const\n\n// pinch zoom thresholds\nexport const pinchZoom = {\n // minimum scale change to start zooming\n minScaleDelta: 0.05,\n // zoom limits\n minScale: 0.5,\n maxScale: 4.0,\n // snap-to scales (double-tap cycles through these)\n snapScales: [1, 2, 3] as readonly number[],\n} as const\n\n// long press\nexport const longPress = {\n // how long to hold before triggering (ms)\n duration: 500,\n // max movement during press before cancel (px)\n maxMovement: 10,\n} as const\n\n// drag\nexport const drag = {\n // minimum distance before drag starts (prevents accidental drag on tap)\n startThreshold: 5,\n // snap-to-edge distance (px) — item snaps to edge when within this range\n snapDistance: 20,\n} as const\n\n// velocity damping — for inertial scroll / flick gestures\nexport const inertia = {\n // friction multiplier per frame (0.95 = slow stop, 0.99 = long coast)\n friction: 0.95,\n // minimum velocity before stopping (px/ms)\n minVelocity: 0.1,\n // maximum velocity clamp (px/ms)\n maxVelocity: 5,\n} as const\n\n// export all thresholds as a single object for L-dep hooks\nexport const gestureConfig = {\n swipe,\n pullToRefresh,\n pinchZoom,\n longPress,\n drag,\n inertia,\n} as const\n\n// CSS vars for gesture-related animations\nexport function gestureToCssVars(): Record<string, string> {\n return {\n '--gds-gesture-dismiss-duration': `${swipe.dismissDuration}ms`,\n '--gds-gesture-snap-tension': `${swipe.snapBack.tension}`,\n '--gds-gesture-snap-friction': `${swipe.snapBack.friction}`,\n '--gds-gesture-pull-trigger': `${pullToRefresh.triggerDistance}px`,\n '--gds-gesture-pull-max': `${pullToRefresh.maxDistance}px`,\n '--gds-gesture-longpress-duration': `${longPress.duration}ms`,\n }\n}\n"],"mappings":";AASA,IAAa,IAAQ;CAEnB,aAAa;CAEb,aAAa;CAEb,mBAAmB;CAEnB,iBAAiB;CAEjB,UAAU;EAAE,SAAS;EAAK,UAAU;EAAI;CACzC,EAGY,IAAgB;CAE3B,iBAAiB;CAEjB,aAAa;CAEb,kBAAkB;CAElB,eAAe;CAChB,EAGY,IAAY;CAEvB,eAAe;CAEf,UAAU;CACV,UAAU;CAEV,YAAY;EAAC;EAAG;EAAG;EAAE;CACtB,EAGY,IAAY;CAEvB,UAAU;CAEV,aAAa;CACd,EAGY,IAAO;CAElB,gBAAgB;CAEhB,cAAc;CACf,EAGY,IAAU;CAErB,UAAU;CAEV,aAAa;CAEb,aAAa;CACd,EAGY,IAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,SAAgB,IAA2C;AACzD,QAAO;EACL,kCAAkC,GAAG,EAAM,gBAAgB;EAC3D,8BAA8B,GAAG,EAAM,SAAS;EAChD,+BAA+B,GAAG,EAAM,SAAS;EACjD,8BAA8B,GAAG,EAAc,gBAAgB;EAC/D,0BAA0B,GAAG,EAAc,YAAY;EACvD,oCAAoC,GAAG,EAAU,SAAS;EAC3D"}
|