@neuronection/assistant-ui 0.1.0 → 0.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/README.md +15 -4
- package/dist/badge.js +1 -1
- package/dist/button.js +1 -1
- package/dist/check-indicator.d.ts +12 -0
- package/dist/check-indicator.js +3 -0
- package/dist/check-indicator.js.map +1 -0
- package/dist/chunk-3522NABN.js +452 -0
- package/dist/chunk-3522NABN.js.map +1 -0
- package/dist/chunk-4SW3ESVI.js +111 -0
- package/dist/chunk-4SW3ESVI.js.map +1 -0
- package/dist/chunk-BJOY3XL7.js +27 -0
- package/dist/chunk-BJOY3XL7.js.map +1 -0
- package/dist/chunk-BPTGPF3L.js +3 -0
- package/dist/chunk-BPTGPF3L.js.map +1 -0
- package/dist/chunk-DV3MXDLN.js +46 -0
- package/dist/chunk-DV3MXDLN.js.map +1 -0
- package/dist/chunk-ESUTPQDO.js +21 -0
- package/dist/chunk-ESUTPQDO.js.map +1 -0
- package/dist/{chunk-TLTKWLMN.js → chunk-GA3XIDVX.js} +3 -3
- package/dist/{chunk-TLTKWLMN.js.map → chunk-GA3XIDVX.js.map} +1 -1
- package/dist/chunk-GPIN2ITX.js +63 -0
- package/dist/chunk-GPIN2ITX.js.map +1 -0
- package/dist/{chunk-56VRWCLJ.js → chunk-GTXGTQ6F.js} +2 -2
- package/dist/{chunk-56VRWCLJ.js.map → chunk-GTXGTQ6F.js.map} +1 -1
- package/dist/chunk-H5U4KNXF.js +63 -0
- package/dist/chunk-H5U4KNXF.js.map +1 -0
- package/dist/chunk-HSUCCANX.js +44 -0
- package/dist/chunk-HSUCCANX.js.map +1 -0
- package/dist/chunk-KXLMTAZ5.js +109 -0
- package/dist/chunk-KXLMTAZ5.js.map +1 -0
- package/dist/chunk-LEDQQBVV.js +184 -0
- package/dist/chunk-LEDQQBVV.js.map +1 -0
- package/dist/chunk-MXOBOS4Y.js +60 -0
- package/dist/chunk-MXOBOS4Y.js.map +1 -0
- package/dist/chunk-N5KQRHXU.js +107 -0
- package/dist/chunk-N5KQRHXU.js.map +1 -0
- package/dist/chunk-OAR74ML4.js +3 -0
- package/dist/chunk-OAR74ML4.js.map +1 -0
- package/dist/chunk-OUHUVACM.js +45 -0
- package/dist/chunk-OUHUVACM.js.map +1 -0
- package/dist/chunk-PPH3G7AL.js +3 -0
- package/dist/chunk-PPH3G7AL.js.map +1 -0
- package/dist/chunk-RU3DEF2O.js +186 -0
- package/dist/chunk-RU3DEF2O.js.map +1 -0
- package/dist/{chunk-NQQNTK6L.js → chunk-SKTLC2XY.js} +2 -2
- package/dist/{chunk-NQQNTK6L.js.map → chunk-SKTLC2XY.js.map} +1 -1
- package/dist/chunk-WZSAUESL.js +58 -0
- package/dist/chunk-WZSAUESL.js.map +1 -0
- package/dist/chunk-XE4TFW63.js +34 -0
- package/dist/chunk-XE4TFW63.js.map +1 -0
- package/dist/combobox.d.ts +54 -0
- package/dist/combobox.js +3 -0
- package/dist/combobox.js.map +1 -0
- package/dist/confirmation-modal.js +1 -1
- package/dist/context-menu.d.ts +22 -0
- package/dist/context-menu.js +3 -0
- package/dist/context-menu.js.map +1 -0
- package/dist/error-banner.d.ts +10 -0
- package/dist/error-banner.js +3 -0
- package/dist/error-banner.js.map +1 -0
- package/dist/expandable-search.d.ts +16 -0
- package/dist/expandable-search.js +3 -0
- package/dist/expandable-search.js.map +1 -0
- package/dist/field-label.d.ts +13 -0
- package/dist/field-label.js +3 -0
- package/dist/field-label.js.map +1 -0
- package/dist/form-modal.d.ts +23 -0
- package/dist/form-modal.js +3 -0
- package/dist/form-modal.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +22 -6
- package/dist/info-button.d.ts +13 -0
- package/dist/info-button.js +3 -0
- package/dist/info-button.js.map +1 -0
- package/dist/marquee.d.ts +39 -0
- package/dist/marquee.js +3 -0
- package/dist/marquee.js.map +1 -0
- package/dist/menu.d.ts +38 -0
- package/dist/menu.js +3 -0
- package/dist/menu.js.map +1 -0
- package/dist/popover-button.d.ts +23 -0
- package/dist/popover-button.js +3 -0
- package/dist/popover-button.js.map +1 -0
- package/dist/search-input.d.ts +15 -0
- package/dist/search-input.js +3 -0
- package/dist/search-input.js.map +1 -0
- package/dist/selection-bar.d.ts +13 -0
- package/dist/selection-bar.js +3 -0
- package/dist/selection-bar.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/undo-notice.d.ts +14 -0
- package/dist/undo-notice.js +3 -0
- package/dist/undo-notice.js.map +1 -0
- package/dist/view-toggle.d.ts +13 -0
- package/dist/view-toggle.js +3 -0
- package/dist/view-toggle.js.map +1 -0
- package/dist/wizard.d.ts +57 -0
- package/dist/wizard.js +3 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +70 -3
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Search, X } from 'lucide-react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var ExpandableSearch = React.forwardRef(
|
|
7
|
+
function ExpandableSearch2({
|
|
8
|
+
value,
|
|
9
|
+
onChange,
|
|
10
|
+
onSubmit,
|
|
11
|
+
onClear,
|
|
12
|
+
placeholder,
|
|
13
|
+
ariaLabel,
|
|
14
|
+
clearLabel = "Clear search",
|
|
15
|
+
expandLabel = "Search",
|
|
16
|
+
className
|
|
17
|
+
}, ref) {
|
|
18
|
+
const [open, setOpen] = React.useState(value !== "");
|
|
19
|
+
const inputRef = React.useRef(null);
|
|
20
|
+
React.useImperativeHandle(ref, () => inputRef.current);
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
if (open) {
|
|
23
|
+
inputRef.current?.focus();
|
|
24
|
+
}
|
|
25
|
+
}, [open]);
|
|
26
|
+
const clear = () => {
|
|
27
|
+
onChange("");
|
|
28
|
+
onClear?.();
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"form",
|
|
32
|
+
{
|
|
33
|
+
"data-as": "expandable-search",
|
|
34
|
+
role: "search",
|
|
35
|
+
className: cn(
|
|
36
|
+
"flex h-9 items-center overflow-hidden rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] transition-[width] duration-300 ease-out focus-within:border-[var(--as-focus-ring)]",
|
|
37
|
+
open ? "w-64" : "w-9",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
onSubmit: (event) => {
|
|
41
|
+
event.preventDefault();
|
|
42
|
+
onSubmit?.(value);
|
|
43
|
+
},
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ jsx(
|
|
46
|
+
"button",
|
|
47
|
+
{
|
|
48
|
+
type: "button",
|
|
49
|
+
className: "flex size-9 shrink-0 cursor-pointer items-center justify-center text-[var(--as-muted-fg)] hover:bg-[var(--as-secondary)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--as-focus-ring)]",
|
|
50
|
+
"aria-label": open ? void 0 : expandLabel,
|
|
51
|
+
title: open ? void 0 : expandLabel,
|
|
52
|
+
onClick: () => {
|
|
53
|
+
if (!open) {
|
|
54
|
+
setOpen(true);
|
|
55
|
+
} else {
|
|
56
|
+
inputRef.current?.focus();
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
children: /* @__PURE__ */ jsx(Search, { className: "size-4", "aria-hidden": true })
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
"input",
|
|
64
|
+
{
|
|
65
|
+
ref: inputRef,
|
|
66
|
+
type: "text",
|
|
67
|
+
className: cn(
|
|
68
|
+
"min-w-0 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none transition-opacity duration-200 placeholder:text-[var(--as-muted-fg)]",
|
|
69
|
+
open ? "opacity-100" : "pointer-events-none opacity-0"
|
|
70
|
+
),
|
|
71
|
+
placeholder,
|
|
72
|
+
"aria-label": ariaLabel,
|
|
73
|
+
"aria-hidden": !open,
|
|
74
|
+
tabIndex: open ? 0 : -1,
|
|
75
|
+
value,
|
|
76
|
+
onChange: (event) => onChange(event.target.value),
|
|
77
|
+
onKeyDown: (event) => {
|
|
78
|
+
if (event.key === "Escape") {
|
|
79
|
+
if (value) {
|
|
80
|
+
clear();
|
|
81
|
+
} else {
|
|
82
|
+
setOpen(false);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
onBlur: () => {
|
|
87
|
+
if (!value) {
|
|
88
|
+
setOpen(false);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
open && value ? /* @__PURE__ */ jsx(
|
|
94
|
+
"button",
|
|
95
|
+
{
|
|
96
|
+
type: "button",
|
|
97
|
+
className: "mr-2 shrink-0 cursor-pointer rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
98
|
+
"aria-label": clearLabel,
|
|
99
|
+
onClick: clear,
|
|
100
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-4", "aria-hidden": true })
|
|
101
|
+
}
|
|
102
|
+
) : null
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
export { ExpandableSearch };
|
|
110
|
+
//# sourceMappingURL=chunk-4SW3ESVI.js.map
|
|
111
|
+
//# sourceMappingURL=chunk-4SW3ESVI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/expandable-search/ExpandableSearch.tsx"],"names":["ExpandableSearch"],"mappings":"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","file":"chunk-4SW3ESVI.js","sourcesContent":["import * as React from 'react'\nimport { Search, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface ExpandableSearchProps {\n value: string\n onChange: (value: string) => void\n onSubmit?: (value: string) => void\n onClear?: () => void\n placeholder: string\n ariaLabel: string\n clearLabel?: string\n expandLabel?: string\n className?: string\n}\n\nexport const ExpandableSearch = React.forwardRef<HTMLInputElement, ExpandableSearchProps>(\n function ExpandableSearch(\n {\n value,\n onChange,\n onSubmit,\n onClear,\n placeholder,\n ariaLabel,\n clearLabel = 'Clear search',\n expandLabel = 'Search',\n className,\n },\n ref,\n ) {\n const [open, setOpen] = React.useState(value !== '')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement)\n\n React.useEffect(() => {\n if (open) {\n inputRef.current?.focus()\n }\n }, [open])\n\n const clear = () => {\n onChange('')\n onClear?.()\n }\n\n return (\n <form\n data-as=\"expandable-search\"\n role=\"search\"\n className={cn(\n 'flex h-9 items-center overflow-hidden rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] transition-[width] duration-300 ease-out focus-within:border-[var(--as-focus-ring)]',\n open ? 'w-64' : 'w-9',\n className,\n )}\n onSubmit={(event) => {\n event.preventDefault()\n onSubmit?.(value)\n }}\n >\n <button\n type=\"button\"\n className=\"flex size-9 shrink-0 cursor-pointer items-center justify-center text-[var(--as-muted-fg)] hover:bg-[var(--as-secondary)] hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--as-focus-ring)]\"\n aria-label={open ? undefined : expandLabel}\n title={open ? undefined : expandLabel}\n onClick={() => {\n if (!open) {\n setOpen(true)\n } else {\n inputRef.current?.focus()\n }\n }}\n >\n <Search className=\"size-4\" aria-hidden />\n </button>\n <input\n ref={inputRef}\n type=\"text\"\n className={cn(\n 'min-w-0 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none transition-opacity duration-200 placeholder:text-[var(--as-muted-fg)]',\n open ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-hidden={!open}\n tabIndex={open ? 0 : -1}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n if (value) {\n clear()\n } else {\n setOpen(false)\n }\n }\n }}\n onBlur={() => {\n if (!value) {\n setOpen(false)\n }\n }}\n />\n {open && value ? (\n <button\n type=\"button\"\n className=\"mr-2 shrink-0 cursor-pointer rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n aria-label={clearLabel}\n onClick={clear}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </form>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function ErrorBanner({ message, action, className }) {
|
|
5
|
+
if (!message) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
return /* @__PURE__ */ jsxs(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
role: "alert",
|
|
12
|
+
"data-as": "error-banner",
|
|
13
|
+
className: cn(
|
|
14
|
+
"flex items-center gap-3 rounded-[var(--as-radius)] border border-[var(--as-danger)]/40 bg-[var(--as-danger)]/10 px-3 py-2 text-xs text-[var(--as-danger)]",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
children: [
|
|
18
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: message }),
|
|
19
|
+
action ?? null
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { ErrorBanner };
|
|
26
|
+
//# sourceMappingURL=chunk-BJOY3XL7.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-BJOY3XL7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/error-banner/ErrorBanner.tsx"],"names":[],"mappings":";;;AASO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAU,EAAqB;AAC5E,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAQ,cAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACT,2JAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QACzC,MAAA,IAAU;AAAA;AAAA;AAAA,GACb;AAEJ","file":"chunk-BJOY3XL7.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface ErrorBannerProps {\n message: string | null | undefined\n action?: React.ReactNode\n className?: string\n}\n\nexport function ErrorBanner({ message, action, className }: ErrorBannerProps) {\n if (!message) {\n return null\n }\n return (\n <div\n role=\"alert\"\n data-as=\"error-banner\"\n className={cn(\n 'flex items-center gap-3 rounded-[var(--as-radius)] border border-[var(--as-danger)]/40 bg-[var(--as-danger)]/10 px-3 py-2 text-xs text-[var(--as-danger)]',\n className,\n )}\n >\n <span className=\"min-w-0 flex-1\">{message}</span>\n {action ?? null}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-BPTGPF3L.js"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PopoverButton } from './chunk-N5KQRHXU.js';
|
|
2
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
3
|
+
import { Info } from 'lucide-react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function InfoButton({
|
|
7
|
+
children,
|
|
8
|
+
title,
|
|
9
|
+
label = "Information",
|
|
10
|
+
showOnHover = true,
|
|
11
|
+
openOnHover = true,
|
|
12
|
+
className
|
|
13
|
+
}) {
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
"span",
|
|
16
|
+
{
|
|
17
|
+
"data-as": "info-button",
|
|
18
|
+
className: cn(
|
|
19
|
+
"shrink-0",
|
|
20
|
+
showOnHover && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100",
|
|
21
|
+
className
|
|
22
|
+
),
|
|
23
|
+
onMouseDown: (event) => event.stopPropagation(),
|
|
24
|
+
onClick: (event) => event.stopPropagation(),
|
|
25
|
+
onDoubleClick: (event) => event.stopPropagation(),
|
|
26
|
+
children: /* @__PURE__ */ jsx(
|
|
27
|
+
PopoverButton,
|
|
28
|
+
{
|
|
29
|
+
trigger: /* @__PURE__ */ jsx(Info, { className: "size-4", "aria-hidden": true }),
|
|
30
|
+
label,
|
|
31
|
+
triggerClassName: "size-6 text-[var(--as-muted-fg)] hover:text-[var(--as-fg)]",
|
|
32
|
+
openOnHover,
|
|
33
|
+
panelClassName: "max-w-xs",
|
|
34
|
+
children: /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
35
|
+
title ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: title }) : null,
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-[var(--as-muted-fg)]", children })
|
|
37
|
+
] })
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { InfoButton };
|
|
45
|
+
//# sourceMappingURL=chunk-DV3MXDLN.js.map
|
|
46
|
+
//# sourceMappingURL=chunk-DV3MXDLN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/info-button/InfoButton.tsx"],"names":[],"mappings":";;;;;AAcO,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA,GAAQ,aAAA;AAAA,EACR,WAAA,GAAc,IAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAQ,aAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACT,UAAA;AAAA,QACA,WAAA,IACE,+EAAA;AAAA,QACF;AAAA,OACF;AAAA,MACA,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,MAC9C,OAAA,EAAS,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,MAC1C,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,MAEhD,QAAA,kBAAA,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,yBAAS,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,UAC9C,KAAA;AAAA,UACA,gBAAA,EAAiB,4DAAA;AAAA,UACjB,WAAA;AAAA,UACA,cAAA,EAAe,UAAA;AAAA,UAEf,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,mBAAQ,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,iBAAM,CAAA,GAAO,IAAA;AAAA,4BAC1D,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAS;AAAA,WAAA,EAC/D;AAAA;AAAA;AACF;AAAA,GACF;AAEJ","file":"chunk-DV3MXDLN.js","sourcesContent":["import * as React from 'react'\nimport { Info } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { PopoverButton } from '../popover-button/PopoverButton'\n\nexport interface InfoButtonProps {\n children: React.ReactNode\n title?: React.ReactNode\n label?: string\n showOnHover?: boolean\n openOnHover?: boolean\n className?: string\n}\n\nexport function InfoButton({\n children,\n title,\n label = 'Information',\n showOnHover = true,\n openOnHover = true,\n className,\n}: InfoButtonProps) {\n return (\n <span\n data-as=\"info-button\"\n className={cn(\n 'shrink-0',\n showOnHover &&\n 'opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100',\n className,\n )}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n <PopoverButton\n trigger={<Info className=\"size-4\" aria-hidden />}\n label={label}\n triggerClassName=\"size-6 text-[var(--as-muted-fg)] hover:text-[var(--as-fg)]\"\n openOnHover={openOnHover}\n panelClassName=\"max-w-xs\"\n >\n <div className=\"space-y-1.5\">\n {title ? <p className=\"text-sm font-medium\">{title}</p> : null}\n <div className=\"text-xs text-[var(--as-muted-fg)]\">{children}</div>\n </div>\n </PopoverButton>\n </span>\n )\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { InfoButton } from './chunk-DV3MXDLN.js';
|
|
2
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function FieldLabel({
|
|
6
|
+
children,
|
|
7
|
+
info,
|
|
8
|
+
infoTitle,
|
|
9
|
+
label,
|
|
10
|
+
showOnHover,
|
|
11
|
+
className
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsxs("span", { "data-as": "field-label", className: cn("group flex items-center gap-1 text-xs", className), children: [
|
|
14
|
+
/* @__PURE__ */ jsx("span", { children }),
|
|
15
|
+
/* @__PURE__ */ jsx(InfoButton, { title: infoTitle, label, showOnHover, children: info })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { FieldLabel };
|
|
20
|
+
//# sourceMappingURL=chunk-ESUTPQDO.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-ESUTPQDO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/field-label/FieldLabel.tsx"],"names":[],"mappings":";;;;AAaO,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE,IAAA,CAAC,UAAK,SAAA,EAAQ,aAAA,EAAc,WAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA,EAC1F,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,wBACf,UAAA,EAAA,EAAW,KAAA,EAAO,SAAA,EAAW,KAAA,EAAc,aACzC,QAAA,EAAA,IAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-ESUTPQDO.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\nimport { InfoButton } from '../info-button/InfoButton'\n\nexport interface FieldLabelProps {\n children: React.ReactNode\n info: React.ReactNode\n infoTitle?: React.ReactNode\n label?: string\n showOnHover?: boolean\n className?: string\n}\n\nexport function FieldLabel({\n children,\n info,\n infoTitle,\n label,\n showOnHover,\n className,\n}: FieldLabelProps) {\n return (\n <span data-as=\"field-label\" className={cn('group flex items-center gap-1 text-xs', className)}>\n <span>{children}</span>\n <InfoButton title={infoTitle} label={label} showOnHover={showOnHover}>\n {info}\n </InfoButton>\n </span>\n )\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription } from './chunk-RHBQ3GZE.js';
|
|
2
|
-
import { Button } from './chunk-
|
|
2
|
+
import { Button } from './chunk-GTXGTQ6F.js';
|
|
3
3
|
import { cn } from './chunk-BLJWR4ZV.js';
|
|
4
4
|
import { AlertTriangle } from 'lucide-react';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -51,5 +51,5 @@ function ConfirmationModal({
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export { ConfirmationModal };
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-GA3XIDVX.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-GA3XIDVX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/confirmation-modal/ConfirmationModal.tsx"],"names":[],"mappings":";;;;;;AA2BO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,WAAA,GAAc,QAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,MAAM,IAAA,GAAO,aAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,UAAA,GAAa;AACf,CAAA,EAA2B;AACzB,EAAA,uBACE,GAAA,CAAC,SAAM,IAAA,EAAY,YAAA,EACjB,+BAAC,YAAA,EAAA,EAAa,IAAA,EAAY,UAAA,EAAwB,kBAAA,EAAkB,MAAA,EAClE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,gCAAA;AAAA,cACA,cACI,kDAAA,GACA;AAAA,aACN;AAAA,YAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,WAAU,QAAA,EAAS;AAAA;AAAA,SAC9C;AAAA,wBACA,GAAA,CAAC,cAAY,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACrB,CAAA;AAAA,MACC,WAAA,mBAAc,GAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,WAAA,EAAY,CAAA,GAAsB;AAAA,KAAA,EACtE,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,aAAa,KAAK,CAAA,EAAG,QAAA,EAAU,IAAA,EACrE,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,cAAc,aAAA,GAAgB,SAAA;AAAA,UACvC,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,UACzB,OAAA,EAAS,IAAA;AAAA,UAER,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/confirmation-modal/ConfirmationModal.tsx"],"names":[],"mappings":";;;;;;AA2BO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,WAAA,GAAc,QAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,MAAM,IAAA,GAAO,aAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,UAAA,GAAa;AACf,CAAA,EAA2B;AACzB,EAAA,uBACE,GAAA,CAAC,SAAM,IAAA,EAAY,YAAA,EACjB,+BAAC,YAAA,EAAA,EAAa,IAAA,EAAY,UAAA,EAAwB,kBAAA,EAAkB,MAAA,EAClE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,gCAAA;AAAA,cACA,cACI,kDAAA,GACA;AAAA,aACN;AAAA,YAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,WAAU,QAAA,EAAS;AAAA;AAAA,SAC9C;AAAA,wBACA,GAAA,CAAC,cAAY,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACrB,CAAA;AAAA,MACC,WAAA,mBAAc,GAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,WAAA,EAAY,CAAA,GAAsB;AAAA,KAAA,EACtE,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,aAAa,KAAK,CAAA,EAAG,QAAA,EAAU,IAAA,EACrE,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,cAAc,aAAA,GAAgB,SAAA;AAAA,UACvC,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,UACzB,OAAA,EAAS,IAAA;AAAA,UAER,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-GA3XIDVX.js","sourcesContent":["import * as React from 'react'\nimport { AlertTriangle, type LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Button } from '../button/Button'\nimport {\n Modal,\n ModalContent,\n ModalDescription,\n ModalHeader,\n ModalTitle,\n} from '../modal/Modal'\n\nexport interface ConfirmationModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n destructive?: boolean\n busy?: boolean\n onConfirm: () => void\n icon?: LucideIcon\n size?: 'sm' | 'md' | 'lg' | 'xl'\n closeLabel?: string\n}\n\nexport function ConfirmationModal({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n destructive = false,\n busy = false,\n onConfirm,\n icon: Icon = AlertTriangle,\n size = 'sm',\n closeLabel = 'Close',\n}: ConfirmationModalProps) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size={size} closeLabel={closeLabel} aria-describedby={undefined}>\n <ModalHeader>\n <div className=\"flex items-center gap-3\">\n <span\n className={cn(\n 'rounded-[var(--as-radius)] p-2',\n destructive\n ? 'bg-[var(--as-danger)]/10 text-[var(--as-danger)]'\n : 'bg-[var(--as-secondary)] text-[var(--as-fg)]',\n )}\n >\n <Icon aria-hidden=\"true\" className=\"size-5\" />\n </span>\n <ModalTitle>{title}</ModalTitle>\n </div>\n {description ? <ModalDescription>{description}</ModalDescription> : null}\n </ModalHeader>\n <div className=\"flex flex-col-reverse gap-2 p-6 pt-0 sm:flex-row sm:justify-end\">\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={busy}>\n {cancelLabel}\n </Button>\n <Button\n variant={destructive ? 'destructive' : 'default'}\n onClick={() => onConfirm()}\n loading={busy}\n >\n {confirmLabel}\n </Button>\n </div>\n </ModalContent>\n </Modal>\n )\n}\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalFooter } from './chunk-RHBQ3GZE.js';
|
|
2
|
+
import { Button } from './chunk-GTXGTQ6F.js';
|
|
3
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function FormModal({
|
|
7
|
+
open,
|
|
8
|
+
onOpenChange,
|
|
9
|
+
title,
|
|
10
|
+
description,
|
|
11
|
+
icon: Icon,
|
|
12
|
+
children,
|
|
13
|
+
onSubmit,
|
|
14
|
+
submitting = false,
|
|
15
|
+
submitDisabled = false,
|
|
16
|
+
submitLabel = "Save",
|
|
17
|
+
cancelLabel = "Cancel",
|
|
18
|
+
closeLabel = "Close",
|
|
19
|
+
size = "md",
|
|
20
|
+
contentClassName,
|
|
21
|
+
footer
|
|
22
|
+
}) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Modal, { open, onOpenChange, children: /* @__PURE__ */ jsx(ModalContent, { size, closeLabel, "aria-describedby": void 0, children: /* @__PURE__ */ jsxs(
|
|
24
|
+
"form",
|
|
25
|
+
{
|
|
26
|
+
"data-as": "form-modal",
|
|
27
|
+
className: cn("contents", contentClassName),
|
|
28
|
+
onSubmit: (event) => {
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
if (!submitting && !submitDisabled) {
|
|
31
|
+
onSubmit?.();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxs(ModalHeader, { children: [
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
37
|
+
Icon ? /* @__PURE__ */ jsx("span", { className: "rounded-[var(--as-radius)] bg-[var(--as-secondary)] p-2 text-[var(--as-fg)]", children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: "size-5" }) }) : null,
|
|
38
|
+
/* @__PURE__ */ jsx(ModalTitle, { children: title })
|
|
39
|
+
] }),
|
|
40
|
+
description ? /* @__PURE__ */ jsx(ModalDescription, { children: description }) : null
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 pb-2", children }),
|
|
43
|
+
footer ?? /* @__PURE__ */ jsxs(ModalFooter, { children: [
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
Button,
|
|
46
|
+
{
|
|
47
|
+
type: "button",
|
|
48
|
+
variant: "outline",
|
|
49
|
+
onClick: () => onOpenChange(false),
|
|
50
|
+
disabled: submitting,
|
|
51
|
+
children: cancelLabel
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
onSubmit ? /* @__PURE__ */ jsx(Button, { type: "submit", disabled: submitDisabled || submitting, loading: submitting, children: submitLabel }) : null
|
|
55
|
+
] })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
) }) });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { FormModal };
|
|
62
|
+
//# sourceMappingURL=chunk-GPIN2ITX.js.map
|
|
63
|
+
//# sourceMappingURL=chunk-GPIN2ITX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/form-modal/FormModal.tsx"],"names":[],"mappings":";;;;;AA+BO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,EAAM,IAAA;AAAA,EACN,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,cAAA,GAAiB,KAAA;AAAA,EACjB,WAAA,GAAc,MAAA;AAAA,EACd,WAAA,GAAc,QAAA;AAAA,EACd,UAAA,GAAa,OAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,gBAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,uBACE,GAAA,CAAC,SAAM,IAAA,EAAY,YAAA,EACjB,8BAAC,YAAA,EAAA,EAAa,IAAA,EAAY,UAAA,EAAwB,kBAAA,EAAkB,MAAA,EAClE,QAAA,kBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAQ,YAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,gBAAgB,CAAA;AAAA,MAC1C,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAI,CAAC,UAAA,IAAc,CAAC,cAAA,EAAgB;AAClC,UAAA,QAAA,IAAW;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,IAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6EAAA,EACd,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA,EAC9C,CAAA,GACE,IAAA;AAAA,4BACJ,GAAA,CAAC,cAAY,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EACrB,CAAA;AAAA,UACC,WAAA,mBAAc,GAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,WAAA,EAAY,CAAA,GAAsB;AAAA,SAAA,EACtE,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAa,QAAA,EAAS,CAAA;AAAA,QACpC,MAAA,yBACE,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,cACjC,QAAA,EAAU,UAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,QAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,QAAA,EAAU,cAAA,IAAkB,UAAA,EAAY,OAAA,EAAS,UAAA,EACpE,QAAA,EAAA,WAAA,EACH,CAAA,GACE;AAAA,SAAA,EACN;AAAA;AAAA;AAAA,KAGN,CAAA,EACF,CAAA;AAEJ","file":"chunk-GPIN2ITX.js","sourcesContent":["import * as React from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Button } from '../button/Button'\nimport {\n Modal,\n ModalContent,\n ModalDescription,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '../modal/Modal'\n\nexport interface FormModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: React.ReactNode\n description?: React.ReactNode\n icon?: LucideIcon\n children: React.ReactNode\n onSubmit?: () => void\n submitting?: boolean\n submitDisabled?: boolean\n submitLabel?: string\n cancelLabel?: string\n closeLabel?: string\n size?: 'sm' | 'md' | 'lg' | 'xl'\n contentClassName?: string\n footer?: React.ReactNode\n}\n\nexport function FormModal({\n open,\n onOpenChange,\n title,\n description,\n icon: Icon,\n children,\n onSubmit,\n submitting = false,\n submitDisabled = false,\n submitLabel = 'Save',\n cancelLabel = 'Cancel',\n closeLabel = 'Close',\n size = 'md',\n contentClassName,\n footer,\n}: FormModalProps) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent size={size} closeLabel={closeLabel} aria-describedby={undefined}>\n <form\n data-as=\"form-modal\"\n className={cn('contents', contentClassName)}\n onSubmit={(event) => {\n event.preventDefault()\n if (!submitting && !submitDisabled) {\n onSubmit?.()\n }\n }}\n >\n <ModalHeader>\n <div className=\"flex items-center gap-3\">\n {Icon ? (\n <span className=\"rounded-[var(--as-radius)] bg-[var(--as-secondary)] p-2 text-[var(--as-fg)]\">\n <Icon aria-hidden=\"true\" className=\"size-5\" />\n </span>\n ) : null}\n <ModalTitle>{title}</ModalTitle>\n </div>\n {description ? <ModalDescription>{description}</ModalDescription> : null}\n </ModalHeader>\n <div className=\"px-6 pb-2\">{children}</div>\n {footer ?? (\n <ModalFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={submitting}\n >\n {cancelLabel}\n </Button>\n {onSubmit ? (\n <Button type=\"submit\" disabled={submitDisabled || submitting} loading={submitting}>\n {submitLabel}\n </Button>\n ) : null}\n </ModalFooter>\n )}\n </form>\n </ModalContent>\n </Modal>\n )\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/button/Button.tsx"],"names":["Button"],"mappings":";;;;;;;AAMA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,uWAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,qEAAA;AAAA,QACT,SAAA,EAAW,yEAAA;AAAA,QACX,OAAA,EACE,wFAAA;AAAA,QACF,KAAA,EAAO,gCAAA;AAAA,QACP,WAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,eAAA;AAAA,QACT,EAAA,EAAI,gDAAA;AAAA,QACJ,EAAA,EAAI,yCAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AASO,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EAC1B,SAASA,OAAAA,
|
|
1
|
+
{"version":3,"sources":["../src/components/button/Button.tsx"],"names":["Button"],"mappings":";;;;;;;AAMA,IAAM,cAAA,GAAiB,GAAA;AAAA,EACrB,uWAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,qEAAA;AAAA,QACT,SAAA,EAAW,yEAAA;AAAA,QACX,OAAA,EACE,wFAAA;AAAA,QACF,KAAA,EAAO,gCAAA;AAAA,QACP,WAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,eAAA;AAAA,QACT,EAAA,EAAI,gDAAA;AAAA,QACJ,EAAA,EAAI,yCAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AASO,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EAC1B,SAASA,OAAAA,CAEP,EAAE,SAAA,EAAW,SAAS,IAAA,EAAM,OAAA,GAAU,KAAA,EAAO,OAAA,GAAU,OAAO,QAAA,EAAU,QAAA,EAAU,GAAG,KAAA,IACrF,GAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,OAAA,GACd,QAAA,mBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAU,GAAA,CAAC,WAAQ,CAAA,GAAK,IAAA;AAAA,MACxB;AAAA,KAAA,EACH,CAAA;AAEF,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,QAC1D,UAAU,OAAA,IAAW,QAAA;AAAA,QACrB,aAAW,OAAA,IAAW,MAAA;AAAA,QACrB,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF","file":"chunk-GTXGTQ6F.js","sourcesContent":["import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\nimport { Spinner } from '../spinner/Spinner'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--as-radius)] text-sm font-medium text-[var(--as-fg)] transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: 'bg-[var(--as-primary)] text-[var(--as-primary-fg)] hover:opacity-90',\n secondary: 'bg-[var(--as-secondary)] text-[var(--as-secondary-fg)] hover:opacity-80',\n outline:\n 'border border-[var(--as-border)] bg-[var(--as-surface)] hover:bg-[var(--as-secondary)]',\n ghost: 'hover:bg-[var(--as-secondary)]',\n destructive:\n 'bg-[var(--as-danger)] text-[var(--as-danger-fg)] hover:opacity-90',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-[var(--as-radius-sm)] px-3 text-xs',\n lg: 'h-10 rounded-[var(--as-radius-lg)] px-6',\n icon: 'size-9 rounded-full',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport interface ButtonProps\n extends React.ComponentProps<'button'>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n /* */\n { className, variant, size, asChild = false, loading = false, disabled, children, ...props },\n ref,\n ) {\n const Comp = asChild ? Slot : 'button'\n const content = asChild ? (\n children\n ) : (\n <>\n {loading ? <Spinner /> : null}\n {children}\n </>\n )\n return (\n <Comp\n ref={ref}\n data-as=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n disabled={loading || disabled}\n aria-busy={loading || undefined}\n {...props}\n >\n {content}\n </Comp>\n )\n },\n)\n\nexport { buttonVariants }\n\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Search, X } from 'lucide-react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var SearchInput = React.forwardRef(
|
|
7
|
+
function SearchInput2({
|
|
8
|
+
value,
|
|
9
|
+
onChange,
|
|
10
|
+
onSubmit,
|
|
11
|
+
placeholder,
|
|
12
|
+
ariaLabel,
|
|
13
|
+
autoFocus = false,
|
|
14
|
+
clearLabel = "Clear search",
|
|
15
|
+
className
|
|
16
|
+
}, ref) {
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"form",
|
|
19
|
+
{
|
|
20
|
+
"data-as": "search-input",
|
|
21
|
+
role: "search",
|
|
22
|
+
className: cn(
|
|
23
|
+
"flex items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 focus-within:border-[var(--as-focus-ring)]",
|
|
24
|
+
className
|
|
25
|
+
),
|
|
26
|
+
onSubmit: (event) => {
|
|
27
|
+
event.preventDefault();
|
|
28
|
+
onSubmit?.(value);
|
|
29
|
+
},
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx(Search, { className: "size-4 shrink-0 text-[var(--as-muted-fg)]", "aria-hidden": true }),
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
"input",
|
|
34
|
+
{
|
|
35
|
+
ref,
|
|
36
|
+
type: "text",
|
|
37
|
+
autoFocus,
|
|
38
|
+
className: "min-w-0 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]",
|
|
39
|
+
placeholder,
|
|
40
|
+
"aria-label": ariaLabel,
|
|
41
|
+
value,
|
|
42
|
+
onChange: (event) => onChange(event.target.value)
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
value ? /* @__PURE__ */ jsx(
|
|
46
|
+
"button",
|
|
47
|
+
{
|
|
48
|
+
type: "button",
|
|
49
|
+
className: "rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
50
|
+
onClick: () => onChange(""),
|
|
51
|
+
"aria-label": clearLabel,
|
|
52
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-4", "aria-hidden": true })
|
|
53
|
+
}
|
|
54
|
+
) : null
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export { SearchInput };
|
|
62
|
+
//# sourceMappingURL=chunk-H5U4KNXF.js.map
|
|
63
|
+
//# sourceMappingURL=chunk-H5U4KNXF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/search-input/SearchInput.tsx"],"names":["SearchInput"],"mappings":";;;;;AAeO,IAAM,WAAA,GAAoB,KAAA,CAAA,UAAA;AAAA,EAC/B,SAASA,YAAAA,CACP;AAAA,IACE,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA,GAAa,cAAA;AAAA,IACb;AAAA,KAEF,GAAA,EACA;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,iKAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,QAAA,GAAW,KAAK,CAAA;AAAA,QAClB,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,2CAAA,EAA4C,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,0BAC1E,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,IAAA,EAAK,MAAA;AAAA,cACL,SAAA;AAAA,cACA,SAAA,EAAU,8GAAA;AAAA,cACV,WAAA;AAAA,cACA,YAAA,EAAY,SAAA;AAAA,cACZ,KAAA;AAAA,cACA,UAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA,WAClD;AAAA,UACC,KAAA,mBACC,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,+MAAA;AAAA,cACV,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,cAC1B,YAAA,EAAY,UAAA;AAAA,cAEZ,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,WACpC,GACE;AAAA;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"chunk-H5U4KNXF.js","sourcesContent":["import * as React from 'react'\nimport { Search, X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface SearchInputProps {\n value: string\n onChange: (value: string) => void\n onSubmit?: (value: string) => void\n placeholder: string\n ariaLabel: string\n autoFocus?: boolean\n clearLabel?: string\n className?: string\n}\n\nexport const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(\n function SearchInput(\n {\n value,\n onChange,\n onSubmit,\n placeholder,\n ariaLabel,\n autoFocus = false,\n clearLabel = 'Clear search',\n className,\n },\n ref,\n ) {\n return (\n <form\n data-as=\"search-input\"\n role=\"search\"\n className={cn(\n 'flex items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-border)] bg-[var(--as-surface)] px-3 py-2 focus-within:border-[var(--as-focus-ring)]',\n className,\n )}\n onSubmit={(event) => {\n event.preventDefault()\n onSubmit?.(value)\n }}\n >\n <Search className=\"size-4 shrink-0 text-[var(--as-muted-fg)]\" aria-hidden />\n <input\n ref={ref}\n type=\"text\"\n autoFocus={autoFocus}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-[var(--as-fg)] outline-none placeholder:text-[var(--as-muted-fg)]\"\n placeholder={placeholder}\n aria-label={ariaLabel}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n {value ? (\n <button\n type=\"button\"\n className=\"rounded-[var(--as-radius-sm)] p-0.5 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n onClick={() => onChange('')}\n aria-label={clearLabel}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n ) : null}\n </form>\n )\n },\n)\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import { X } from 'lucide-react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function SelectionBar({
|
|
6
|
+
count,
|
|
7
|
+
onClear,
|
|
8
|
+
countLabel,
|
|
9
|
+
clearLabel = "Clear selection",
|
|
10
|
+
children,
|
|
11
|
+
className
|
|
12
|
+
}) {
|
|
13
|
+
if (count === 0) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return /* @__PURE__ */ jsxs(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
"data-as": "selection-bar",
|
|
20
|
+
className: cn(
|
|
21
|
+
"flex flex-wrap items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 px-3 py-1.5 text-sm text-[var(--as-fg)]",
|
|
22
|
+
className
|
|
23
|
+
),
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-[var(--as-primary)]", children: countLabel ?? `${count} selected` }),
|
|
26
|
+
children,
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
"button",
|
|
29
|
+
{
|
|
30
|
+
type: "button",
|
|
31
|
+
className: "ml-auto cursor-pointer rounded-[var(--as-radius-sm)] p-1 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
|
|
32
|
+
"aria-label": clearLabel,
|
|
33
|
+
onClick: onClear,
|
|
34
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-4", "aria-hidden": true })
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { SelectionBar };
|
|
43
|
+
//# sourceMappingURL=chunk-HSUCCANX.js.map
|
|
44
|
+
//# sourceMappingURL=chunk-HSUCCANX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/selection-bar/SelectionBar.tsx"],"names":[],"mappings":";;;;AAaO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA,GAAa,iBAAA;AAAA,EACb,QAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAQ,eAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACT,qKAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,sCAAA,EACb,QAAA,EAAA,UAAA,IAAc,CAAA,EAAG,KAAK,CAAA,SAAA,CAAA,EACzB,CAAA;AAAA,QACC,QAAA;AAAA,wBACD,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,oOAAA;AAAA,YACV,YAAA,EAAY,UAAA;AAAA,YACZ,OAAA,EAAS,OAAA;AAAA,YAET,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA;AACpC;AAAA;AAAA,GACF;AAEJ","file":"chunk-HSUCCANX.js","sourcesContent":["import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface SelectionBarProps {\n count: number\n onClear: () => void\n countLabel?: React.ReactNode\n clearLabel?: string\n children?: React.ReactNode\n className?: string\n}\n\nexport function SelectionBar({\n count,\n onClear,\n countLabel,\n clearLabel = 'Clear selection',\n children,\n className,\n}: SelectionBarProps) {\n if (count === 0) {\n return null\n }\n return (\n <div\n data-as=\"selection-bar\"\n className={cn(\n 'flex flex-wrap items-center gap-2 rounded-[var(--as-radius)] border border-[var(--as-primary)]/30 bg-[var(--as-primary)]/10 px-3 py-1.5 text-sm text-[var(--as-fg)]',\n className,\n )}\n >\n <span className=\"font-medium text-[var(--as-primary)]\">\n {countLabel ?? `${count} selected`}\n </span>\n {children}\n <button\n type=\"button\"\n className=\"ml-auto cursor-pointer rounded-[var(--as-radius-sm)] p-1 text-[var(--as-muted-fg)] transition-colors hover:text-[var(--as-fg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]\"\n aria-label={clearLabel}\n onClick={onClear}\n >\n <X className=\"size-4\" aria-hidden />\n </button>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { cn } from './chunk-BLJWR4ZV.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import { Loader2 } from 'lucide-react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var Menu = DropdownMenuPrimitive.Root;
|
|
8
|
+
var MenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
9
|
+
var MenuGroup = DropdownMenuPrimitive.Group;
|
|
10
|
+
var MenuContent = React.forwardRef(function MenuContent2({ className, sideOffset = 6, children, ...props }, ref) {
|
|
11
|
+
return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
12
|
+
DropdownMenuPrimitive.Content,
|
|
13
|
+
{
|
|
14
|
+
ref,
|
|
15
|
+
"data-as": "menu",
|
|
16
|
+
sideOffset,
|
|
17
|
+
collisionPadding: 8,
|
|
18
|
+
className: cn(
|
|
19
|
+
"as-anim-pop z-50 min-w-40 overflow-hidden rounded-[var(--as-radius-lg)] border border-[var(--as-border)] bg-[var(--as-surface-raised)] p-1 text-[var(--as-fg)] shadow-[var(--as-shadow-3)]",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
...props,
|
|
23
|
+
children
|
|
24
|
+
}
|
|
25
|
+
) });
|
|
26
|
+
});
|
|
27
|
+
var MenuItem = React.forwardRef(function MenuItem2({ className, icon: Icon, danger, pending, disabled, children, ...props }, ref) {
|
|
28
|
+
const SpinnerIcon = pending ? Loader2 : null;
|
|
29
|
+
return /* @__PURE__ */ jsxs(
|
|
30
|
+
DropdownMenuPrimitive.Item,
|
|
31
|
+
{
|
|
32
|
+
ref,
|
|
33
|
+
disabled: disabled || pending,
|
|
34
|
+
"aria-busy": pending || void 0,
|
|
35
|
+
className: cn(
|
|
36
|
+
"flex w-full cursor-pointer select-none items-center gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-left text-sm outline-none transition-colors focus:bg-[var(--as-secondary)] data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0",
|
|
37
|
+
danger && "text-[var(--as-danger)] focus:bg-[var(--as-danger)]/10",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
...props,
|
|
41
|
+
children: [
|
|
42
|
+
SpinnerIcon ? /* @__PURE__ */ jsx(SpinnerIcon, { className: "animate-spin", "aria-hidden": true }) : Icon ? /* @__PURE__ */ jsx(Icon, { "aria-hidden": true }) : null,
|
|
43
|
+
children
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
var MenuSeparator = React.forwardRef(function MenuSeparator2({ className, ...props }, ref) {
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
DropdownMenuPrimitive.Separator,
|
|
51
|
+
{
|
|
52
|
+
ref,
|
|
53
|
+
className: cn("-mx-1 my-1 h-px bg-[var(--as-border)]", className),
|
|
54
|
+
...props
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
var MenuLabel = React.forwardRef(function MenuLabel2({ className, ...props }, ref) {
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
DropdownMenuPrimitive.Label,
|
|
61
|
+
{
|
|
62
|
+
ref,
|
|
63
|
+
className: cn("px-2 py-1.5 text-xs font-medium text-[var(--as-muted-fg)]", className),
|
|
64
|
+
...props
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
function ActionMenu({
|
|
69
|
+
label,
|
|
70
|
+
trigger,
|
|
71
|
+
items,
|
|
72
|
+
align = "end",
|
|
73
|
+
side = "bottom",
|
|
74
|
+
triggerClassName,
|
|
75
|
+
panelClassName,
|
|
76
|
+
disabled = false
|
|
77
|
+
}) {
|
|
78
|
+
return /* @__PURE__ */ jsxs(Menu, { modal: false, children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
MenuTrigger,
|
|
81
|
+
{
|
|
82
|
+
type: "button",
|
|
83
|
+
"aria-label": label,
|
|
84
|
+
disabled,
|
|
85
|
+
className: cn(
|
|
86
|
+
"inline-flex cursor-pointer items-center justify-center gap-1 rounded-full transition-colors hover:bg-[var(--as-secondary)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)] disabled:pointer-events-none disabled:opacity-50",
|
|
87
|
+
triggerClassName ?? "size-9"
|
|
88
|
+
),
|
|
89
|
+
children: trigger
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsx(MenuContent, { align, side, className: cn("w-52 p-1", panelClassName), children: /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: items.map((item) => /* @__PURE__ */ jsx(
|
|
93
|
+
MenuItem,
|
|
94
|
+
{
|
|
95
|
+
icon: item.icon,
|
|
96
|
+
danger: item.danger,
|
|
97
|
+
disabled: item.disabled,
|
|
98
|
+
pending: item.pending,
|
|
99
|
+
onSelect: () => item.onSelect(),
|
|
100
|
+
children: item.label
|
|
101
|
+
},
|
|
102
|
+
item.key
|
|
103
|
+
)) }) })
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { ActionMenu, Menu, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuSeparator, MenuTrigger };
|
|
108
|
+
//# sourceMappingURL=chunk-KXLMTAZ5.js.map
|
|
109
|
+
//# sourceMappingURL=chunk-KXLMTAZ5.js.map
|