@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.
Files changed (100) hide show
  1. package/README.md +15 -4
  2. package/dist/badge.js +1 -1
  3. package/dist/button.js +1 -1
  4. package/dist/check-indicator.d.ts +12 -0
  5. package/dist/check-indicator.js +3 -0
  6. package/dist/check-indicator.js.map +1 -0
  7. package/dist/chunk-3522NABN.js +452 -0
  8. package/dist/chunk-3522NABN.js.map +1 -0
  9. package/dist/chunk-4SW3ESVI.js +111 -0
  10. package/dist/chunk-4SW3ESVI.js.map +1 -0
  11. package/dist/chunk-BJOY3XL7.js +27 -0
  12. package/dist/chunk-BJOY3XL7.js.map +1 -0
  13. package/dist/chunk-BPTGPF3L.js +3 -0
  14. package/dist/chunk-BPTGPF3L.js.map +1 -0
  15. package/dist/chunk-DV3MXDLN.js +46 -0
  16. package/dist/chunk-DV3MXDLN.js.map +1 -0
  17. package/dist/chunk-ESUTPQDO.js +21 -0
  18. package/dist/chunk-ESUTPQDO.js.map +1 -0
  19. package/dist/{chunk-TLTKWLMN.js → chunk-GA3XIDVX.js} +3 -3
  20. package/dist/{chunk-TLTKWLMN.js.map → chunk-GA3XIDVX.js.map} +1 -1
  21. package/dist/chunk-GPIN2ITX.js +63 -0
  22. package/dist/chunk-GPIN2ITX.js.map +1 -0
  23. package/dist/{chunk-56VRWCLJ.js → chunk-GTXGTQ6F.js} +2 -2
  24. package/dist/{chunk-56VRWCLJ.js.map → chunk-GTXGTQ6F.js.map} +1 -1
  25. package/dist/chunk-H5U4KNXF.js +63 -0
  26. package/dist/chunk-H5U4KNXF.js.map +1 -0
  27. package/dist/chunk-HSUCCANX.js +44 -0
  28. package/dist/chunk-HSUCCANX.js.map +1 -0
  29. package/dist/chunk-KXLMTAZ5.js +109 -0
  30. package/dist/chunk-KXLMTAZ5.js.map +1 -0
  31. package/dist/chunk-LEDQQBVV.js +184 -0
  32. package/dist/chunk-LEDQQBVV.js.map +1 -0
  33. package/dist/chunk-MXOBOS4Y.js +60 -0
  34. package/dist/chunk-MXOBOS4Y.js.map +1 -0
  35. package/dist/chunk-N5KQRHXU.js +107 -0
  36. package/dist/chunk-N5KQRHXU.js.map +1 -0
  37. package/dist/chunk-OAR74ML4.js +3 -0
  38. package/dist/chunk-OAR74ML4.js.map +1 -0
  39. package/dist/chunk-OUHUVACM.js +45 -0
  40. package/dist/chunk-OUHUVACM.js.map +1 -0
  41. package/dist/chunk-PPH3G7AL.js +3 -0
  42. package/dist/chunk-PPH3G7AL.js.map +1 -0
  43. package/dist/chunk-RU3DEF2O.js +186 -0
  44. package/dist/chunk-RU3DEF2O.js.map +1 -0
  45. package/dist/{chunk-NQQNTK6L.js → chunk-SKTLC2XY.js} +2 -2
  46. package/dist/{chunk-NQQNTK6L.js.map → chunk-SKTLC2XY.js.map} +1 -1
  47. package/dist/chunk-WZSAUESL.js +58 -0
  48. package/dist/chunk-WZSAUESL.js.map +1 -0
  49. package/dist/chunk-XE4TFW63.js +34 -0
  50. package/dist/chunk-XE4TFW63.js.map +1 -0
  51. package/dist/combobox.d.ts +54 -0
  52. package/dist/combobox.js +3 -0
  53. package/dist/combobox.js.map +1 -0
  54. package/dist/confirmation-modal.js +1 -1
  55. package/dist/context-menu.d.ts +22 -0
  56. package/dist/context-menu.js +3 -0
  57. package/dist/context-menu.js.map +1 -0
  58. package/dist/error-banner.d.ts +10 -0
  59. package/dist/error-banner.js +3 -0
  60. package/dist/error-banner.js.map +1 -0
  61. package/dist/expandable-search.d.ts +16 -0
  62. package/dist/expandable-search.js +3 -0
  63. package/dist/expandable-search.js.map +1 -0
  64. package/dist/field-label.d.ts +13 -0
  65. package/dist/field-label.js +3 -0
  66. package/dist/field-label.js.map +1 -0
  67. package/dist/form-modal.d.ts +23 -0
  68. package/dist/form-modal.js +3 -0
  69. package/dist/form-modal.js.map +1 -0
  70. package/dist/index.d.ts +17 -0
  71. package/dist/index.js +22 -6
  72. package/dist/info-button.d.ts +13 -0
  73. package/dist/info-button.js +3 -0
  74. package/dist/info-button.js.map +1 -0
  75. package/dist/marquee.d.ts +39 -0
  76. package/dist/marquee.js +3 -0
  77. package/dist/marquee.js.map +1 -0
  78. package/dist/menu.d.ts +38 -0
  79. package/dist/menu.js +3 -0
  80. package/dist/menu.js.map +1 -0
  81. package/dist/popover-button.d.ts +23 -0
  82. package/dist/popover-button.js +3 -0
  83. package/dist/popover-button.js.map +1 -0
  84. package/dist/search-input.d.ts +15 -0
  85. package/dist/search-input.js +3 -0
  86. package/dist/search-input.js.map +1 -0
  87. package/dist/selection-bar.d.ts +13 -0
  88. package/dist/selection-bar.js +3 -0
  89. package/dist/selection-bar.js.map +1 -0
  90. package/dist/styles.css +1 -1
  91. package/dist/undo-notice.d.ts +14 -0
  92. package/dist/undo-notice.js +3 -0
  93. package/dist/undo-notice.js.map +1 -0
  94. package/dist/view-toggle.d.ts +13 -0
  95. package/dist/view-toggle.js +3 -0
  96. package/dist/view-toggle.js.map +1 -0
  97. package/dist/wizard.d.ts +57 -0
  98. package/dist/wizard.js +3 -0
  99. package/dist/wizard.js.map +1 -0
  100. package/package.json +70 -3
@@ -0,0 +1,186 @@
1
+ import * as React from 'react';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components/marquee/Marquee.tsx
5
+ function rectsIntersect(a, b) {
6
+ return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
7
+ }
8
+ function marqueeRect(startX, startY, currentX, currentY) {
9
+ return {
10
+ left: Math.min(startX, currentX),
11
+ top: Math.min(startY, currentY),
12
+ right: Math.max(startX, currentX),
13
+ bottom: Math.max(startY, currentY)
14
+ };
15
+ }
16
+ function hitTestIds(container, marquee) {
17
+ const hits = [];
18
+ const elements = container.querySelectorAll("[data-selectable-id]");
19
+ for (const element of elements) {
20
+ const box = element.getBoundingClientRect();
21
+ const itemRect = {
22
+ left: box.left,
23
+ top: box.top,
24
+ right: box.right,
25
+ bottom: box.bottom
26
+ };
27
+ if (rectsIntersect(marquee, itemRect)) {
28
+ const id = element.getAttribute("data-selectable-id");
29
+ if (id !== null) {
30
+ hits.push(id);
31
+ }
32
+ }
33
+ }
34
+ return hits;
35
+ }
36
+ var DRAG_THRESHOLD = 4;
37
+ var INTERACTIVE_SELECTOR = "button, input, textarea, select, a, [data-selectable-id], [data-no-marquee]";
38
+ function useMarquee({
39
+ enabled,
40
+ containerRef,
41
+ getBaseSelection,
42
+ onSelect
43
+ }) {
44
+ const [band, setBand] = React.useState(null);
45
+ const startRef = React.useRef(null);
46
+ const armedRef = React.useRef(false);
47
+ const getBaseRef = React.useRef(getBaseSelection);
48
+ getBaseRef.current = getBaseSelection;
49
+ const onSelectRef = React.useRef(onSelect);
50
+ onSelectRef.current = onSelect;
51
+ React.useEffect(() => {
52
+ if (!enabled) {
53
+ return;
54
+ }
55
+ const container = containerRef.current;
56
+ if (container === null) {
57
+ return;
58
+ }
59
+ const onMouseDown = (event) => {
60
+ if (event.button !== 0) {
61
+ return;
62
+ }
63
+ const target = event.target;
64
+ if (target !== null && target.closest(INTERACTIVE_SELECTOR) !== null) {
65
+ return;
66
+ }
67
+ const base = event.ctrlKey || event.metaKey ? new Set(getBaseRef.current()) : /* @__PURE__ */ new Set();
68
+ startRef.current = { x: event.clientX, y: event.clientY, base };
69
+ armedRef.current = false;
70
+ };
71
+ const onMouseMove = (event) => {
72
+ const start = startRef.current;
73
+ if (start === null) {
74
+ return;
75
+ }
76
+ const rect = marqueeRect(start.x, start.y, event.clientX, event.clientY);
77
+ if (!armedRef.current) {
78
+ if (rect.right - rect.left < DRAG_THRESHOLD && rect.bottom - rect.top < DRAG_THRESHOLD) {
79
+ return;
80
+ }
81
+ armedRef.current = true;
82
+ onSelectRef.current([...start.base], "start");
83
+ }
84
+ setBand(rect);
85
+ const containerNow = containerRef.current;
86
+ if (containerNow !== null) {
87
+ const hits = hitTestIds(containerNow, rect);
88
+ onSelectRef.current([.../* @__PURE__ */ new Set([...start.base, ...hits])], "drag");
89
+ }
90
+ };
91
+ const finish = (event) => {
92
+ const start = startRef.current;
93
+ if (start === null) {
94
+ return;
95
+ }
96
+ startRef.current = null;
97
+ setBand(null);
98
+ if (armedRef.current) {
99
+ const containerNow = containerRef.current;
100
+ if (containerNow !== null) {
101
+ const rect = marqueeRect(start.x, start.y, event.clientX, event.clientY);
102
+ const hits = hitTestIds(containerNow, rect);
103
+ onSelectRef.current([.../* @__PURE__ */ new Set([...start.base, ...hits])], "end");
104
+ }
105
+ return;
106
+ }
107
+ if (!event.ctrlKey && !event.metaKey) {
108
+ onSelectRef.current([], "end");
109
+ }
110
+ };
111
+ const onKey = (event) => {
112
+ if (event.key === "Escape" && startRef.current !== null) {
113
+ const start = startRef.current;
114
+ startRef.current = null;
115
+ setBand(null);
116
+ onSelectRef.current([...start.base], "end");
117
+ }
118
+ };
119
+ container.addEventListener("mousedown", onMouseDown);
120
+ window.addEventListener("mousemove", onMouseMove);
121
+ window.addEventListener("mouseup", finish);
122
+ window.addEventListener("keydown", onKey);
123
+ return () => {
124
+ container.removeEventListener("mousedown", onMouseDown);
125
+ window.removeEventListener("mousemove", onMouseMove);
126
+ window.removeEventListener("mouseup", finish);
127
+ window.removeEventListener("keydown", onKey);
128
+ };
129
+ }, [enabled, containerRef]);
130
+ return { band };
131
+ }
132
+ function MarqueeBand({ band }) {
133
+ if (band === null) {
134
+ return null;
135
+ }
136
+ return /* @__PURE__ */ jsx(
137
+ "div",
138
+ {
139
+ "data-as": "marquee-band",
140
+ className: "pointer-events-none fixed z-40 rounded-[calc(var(--as-radius-sm)-2px)] border border-[var(--as-primary)] bg-[var(--as-primary)]/10",
141
+ style: {
142
+ left: band.left,
143
+ top: band.top,
144
+ width: band.right - band.left,
145
+ height: band.bottom - band.top
146
+ },
147
+ "aria-hidden": true
148
+ }
149
+ );
150
+ }
151
+ var MarqueeSurface = React.forwardRef(
152
+ function MarqueeSurface2({ children, selection, clearBlocked, className, ...props }, ref) {
153
+ const paneRef = React.useRef(null);
154
+ React.useImperativeHandle(ref, () => paneRef.current);
155
+ const { band } = useMarquee({
156
+ enabled: true,
157
+ containerRef: paneRef,
158
+ getBaseSelection: () => selection.selected,
159
+ onSelect: (ids) => selection.set(ids)
160
+ });
161
+ React.useEffect(() => {
162
+ const onKey = (event) => {
163
+ if (clearBlocked?.() ?? false) {
164
+ return;
165
+ }
166
+ const target = event.target;
167
+ if (target instanceof Element && target.closest('input, textarea, select, [contenteditable="true"]') !== null) {
168
+ return;
169
+ }
170
+ if (event.key === "Escape") {
171
+ selection.clear();
172
+ }
173
+ };
174
+ window.addEventListener("keydown", onKey);
175
+ return () => window.removeEventListener("keydown", onKey);
176
+ }, [clearBlocked, selection]);
177
+ return /* @__PURE__ */ jsxs("div", { ref: paneRef, "data-marquee-surface": "", "data-as": "marquee-surface", className, ...props, children: [
178
+ children,
179
+ /* @__PURE__ */ jsx(MarqueeBand, { band })
180
+ ] });
181
+ }
182
+ );
183
+
184
+ export { MarqueeBand, MarqueeSurface, hitTestIds, marqueeRect, rectsIntersect, useMarquee };
185
+ //# sourceMappingURL=chunk-RU3DEF2O.js.map
186
+ //# sourceMappingURL=chunk-RU3DEF2O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/marquee/Marquee.tsx"],"names":["MarqueeSurface"],"mappings":"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","file":"chunk-RU3DEF2O.js","sourcesContent":["import * as React from 'react'\n\nexport interface Rect {\n left: number\n top: number\n right: number\n bottom: number\n}\n\nexport function rectsIntersect(a: Rect, b: Rect): boolean {\n return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom\n}\n\nexport function marqueeRect(\n startX: number,\n startY: number,\n currentX: number,\n currentY: number,\n): Rect {\n return {\n left: Math.min(startX, currentX),\n top: Math.min(startY, currentY),\n right: Math.max(startX, currentX),\n bottom: Math.max(startY, currentY),\n }\n}\n\nexport function hitTestIds(container: HTMLElement, marquee: Rect): string[] {\n const hits: string[] = []\n const elements = container.querySelectorAll<HTMLElement>('[data-selectable-id]')\n for (const element of elements) {\n const box = element.getBoundingClientRect()\n const itemRect: Rect = {\n left: box.left,\n top: box.top,\n right: box.right,\n bottom: box.bottom,\n }\n if (rectsIntersect(marquee, itemRect)) {\n const id = element.getAttribute('data-selectable-id')\n if (id !== null) {\n hits.push(id)\n }\n }\n }\n return hits\n}\n\nconst DRAG_THRESHOLD = 4\n\nconst INTERACTIVE_SELECTOR =\n 'button, input, textarea, select, a, [data-selectable-id], [data-no-marquee]'\n\nexport type MarqueePhase = 'start' | 'drag' | 'end'\n\nexport interface UseMarqueeOptions {\n enabled: boolean\n containerRef: { current: HTMLElement | null }\n getBaseSelection: () => Set<string>\n onSelect: (ids: string[], phase: MarqueePhase) => void\n}\n\nexport function useMarquee({\n enabled,\n containerRef,\n getBaseSelection,\n onSelect,\n}: UseMarqueeOptions): { band: Rect | null } {\n const [band, setBand] = React.useState<Rect | null>(null)\n const startRef = React.useRef<{ x: number; y: number; base: Set<string> } | null>(null)\n const armedRef = React.useRef(false)\n const getBaseRef = React.useRef(getBaseSelection)\n getBaseRef.current = getBaseSelection\n const onSelectRef = React.useRef(onSelect)\n onSelectRef.current = onSelect\n\n React.useEffect(() => {\n if (!enabled) {\n return\n }\n const container = containerRef.current\n if (container === null) {\n return\n }\n\n const onMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) {\n return\n }\n const target = event.target as Element | null\n if (target !== null && target.closest(INTERACTIVE_SELECTOR) !== null) {\n return\n }\n const base =\n event.ctrlKey || event.metaKey\n ? new Set(getBaseRef.current())\n : new Set<string>()\n startRef.current = { x: event.clientX, y: event.clientY, base }\n armedRef.current = false\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const start = startRef.current\n if (start === null) {\n return\n }\n const rect = marqueeRect(start.x, start.y, event.clientX, event.clientY)\n if (!armedRef.current) {\n if (\n rect.right - rect.left < DRAG_THRESHOLD &&\n rect.bottom - rect.top < DRAG_THRESHOLD\n ) {\n return\n }\n armedRef.current = true\n onSelectRef.current([...start.base], 'start')\n }\n setBand(rect)\n const containerNow = containerRef.current\n if (containerNow !== null) {\n const hits = hitTestIds(containerNow, rect)\n onSelectRef.current([...new Set([...start.base, ...hits])], 'drag')\n }\n }\n\n const finish = (event: MouseEvent) => {\n const start = startRef.current\n if (start === null) {\n return\n }\n startRef.current = null\n setBand(null)\n if (armedRef.current) {\n const containerNow = containerRef.current\n if (containerNow !== null) {\n const rect = marqueeRect(start.x, start.y, event.clientX, event.clientY)\n const hits = hitTestIds(containerNow, rect)\n onSelectRef.current([...new Set([...start.base, ...hits])], 'end')\n }\n return\n }\n if (!event.ctrlKey && !event.metaKey) {\n onSelectRef.current([], 'end')\n }\n }\n\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && startRef.current !== null) {\n const start = startRef.current\n startRef.current = null\n setBand(null)\n onSelectRef.current([...start.base], 'end')\n }\n }\n\n container.addEventListener('mousedown', onMouseDown)\n window.addEventListener('mousemove', onMouseMove)\n window.addEventListener('mouseup', finish)\n window.addEventListener('keydown', onKey)\n return () => {\n container.removeEventListener('mousedown', onMouseDown)\n window.removeEventListener('mousemove', onMouseMove)\n window.removeEventListener('mouseup', finish)\n window.removeEventListener('keydown', onKey)\n }\n }, [enabled, containerRef])\n\n return { band }\n}\n\nexport function MarqueeBand({ band }: { band: Rect | null }) {\n if (band === null) {\n return null\n }\n return (\n <div\n data-as=\"marquee-band\"\n className=\"pointer-events-none fixed z-40 rounded-[calc(var(--as-radius-sm)-2px)] border border-[var(--as-primary)] bg-[var(--as-primary)]/10\"\n style={{\n left: band.left,\n top: band.top,\n width: band.right - band.left,\n height: band.bottom - band.top,\n }}\n aria-hidden\n />\n )\n}\n\nexport interface MarqueeSelection {\n selected: Set<string>\n set: (ids: string[]) => void\n clear: () => void\n}\n\nexport interface MarqueeSurfaceProps extends React.ComponentProps<'div'> {\n children: React.ReactNode\n selection: MarqueeSelection\n clearBlocked?: () => boolean\n}\n\nexport const MarqueeSurface = React.forwardRef<HTMLDivElement, MarqueeSurfaceProps>(\n function MarqueeSurface({ children, selection, clearBlocked, className, ...props }, ref) {\n const paneRef = React.useRef<HTMLDivElement | null>(null)\n React.useImperativeHandle(ref, () => paneRef.current as HTMLDivElement)\n const { band } = useMarquee({\n enabled: true,\n containerRef: paneRef,\n getBaseSelection: () => selection.selected,\n onSelect: (ids) => selection.set(ids),\n })\n React.useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (clearBlocked?.() ?? false) {\n return\n }\n const target = event.target\n if (\n target instanceof Element &&\n target.closest('input, textarea, select, [contenteditable=\"true\"]') !== null\n ) {\n return\n }\n if (event.key === 'Escape') {\n selection.clear()\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [clearBlocked, selection])\n return (\n <div ref={paneRef} data-marquee-surface=\"\" data-as=\"marquee-surface\" className={className} {...props}>\n {children}\n <MarqueeBand band={band} />\n </div>\n )\n },\n)\n"]}
@@ -35,5 +35,5 @@ var Badge = React.forwardRef(function Badge2({ className, variant, ...props }, r
35
35
  });
36
36
 
37
37
  export { Badge, badgeVariants };
38
- //# sourceMappingURL=chunk-NQQNTK6L.js.map
39
- //# sourceMappingURL=chunk-NQQNTK6L.js.map
38
+ //# sourceMappingURL=chunk-SKTLC2XY.js.map
39
+ //# sourceMappingURL=chunk-SKTLC2XY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/badge/Badge.tsx"],"names":["Badge"],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB,qGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,uEAAA;AAAA,QACT,SAAA,EACE,2EAAA;AAAA,QACF,OAAA,EAAS,+CAAA;AAAA,QACT,OAAA,EAAS,uEAAA;AAAA,QACT,OAAA,EAAS,uEAAA;AAAA,QACT,MAAA,EAAQ,qEAAA;AAAA,QACR,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAMO,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA,CAAwC,SAASA,MAAAA,CAC1E,EAAE,WAAW,OAAA,EAAS,GAAG,KAAA,EAAM,EAC/B,GAAA,EACA;AACA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAQ,OAAA;AAAA,MACR,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MAClD,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC","file":"chunk-NQQNTK6L.js","sourcesContent":["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center gap-1 rounded-full border px-2.5 py-0.5 text-xs font-medium [&_svg]:size-3',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-[var(--as-primary)] text-[var(--as-primary-fg)]',\n secondary:\n 'border-transparent bg-[var(--as-secondary)] text-[var(--as-secondary-fg)]',\n outline: 'border-[var(--as-border)] text-[var(--as-fg)]',\n success: 'border-transparent bg-[var(--as-success)] text-[var(--as-success-fg)]',\n warning: 'border-transparent bg-[var(--as-warning)] text-[var(--as-warning-fg)]',\n danger: 'border-transparent bg-[var(--as-danger)] text-[var(--as-danger-fg)]',\n ai: 'border-transparent bg-[var(--as-ai)] text-[var(--as-ai-fg)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nexport interface BadgeProps\n extends React.ComponentProps<'span'>,\n VariantProps<typeof badgeVariants> {}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, variant, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n data-as=\"badge\"\n className={cn(badgeVariants({ variant, className }))}\n {...props}\n />\n )\n})\n\nexport { badgeVariants }\n"]}
1
+ {"version":3,"sources":["../src/components/badge/Badge.tsx"],"names":["Badge"],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB,qGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,uEAAA;AAAA,QACT,SAAA,EACE,2EAAA;AAAA,QACF,OAAA,EAAS,+CAAA;AAAA,QACT,OAAA,EAAS,uEAAA;AAAA,QACT,OAAA,EAAS,uEAAA;AAAA,QACT,MAAA,EAAQ,qEAAA;AAAA,QACR,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX;AAEJ;AAMO,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA,CAAwC,SAASA,MAAAA,CAC1E,EAAE,WAAW,OAAA,EAAS,GAAG,KAAA,EAAM,EAC/B,GAAA,EACA;AACA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAQ,OAAA;AAAA,MACR,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MAClD,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC","file":"chunk-SKTLC2XY.js","sourcesContent":["import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center gap-1 rounded-full border px-2.5 py-0.5 text-xs font-medium [&_svg]:size-3',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-[var(--as-primary)] text-[var(--as-primary-fg)]',\n secondary:\n 'border-transparent bg-[var(--as-secondary)] text-[var(--as-secondary-fg)]',\n outline: 'border-[var(--as-border)] text-[var(--as-fg)]',\n success: 'border-transparent bg-[var(--as-success)] text-[var(--as-success-fg)]',\n warning: 'border-transparent bg-[var(--as-warning)] text-[var(--as-warning-fg)]',\n danger: 'border-transparent bg-[var(--as-danger)] text-[var(--as-danger-fg)]',\n ai: 'border-transparent bg-[var(--as-ai)] text-[var(--as-ai-fg)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nexport interface BadgeProps\n extends React.ComponentProps<'span'>,\n VariantProps<typeof badgeVariants> {}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, variant, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n data-as=\"badge\"\n className={cn(badgeVariants({ variant, className }))}\n {...props}\n />\n )\n})\n\nexport { badgeVariants }\n\n\n"]}
@@ -0,0 +1,58 @@
1
+ import { MenuContent, MenuItem } from './chunk-KXLMTAZ5.js';
2
+ import { cn } from './chunk-BLJWR4ZV.js';
3
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function ContextMenu({ x, y, items, onClose, className }) {
7
+ const open = items.length > 0;
8
+ return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.Root, { open, onOpenChange: (next) => !next && onClose(), modal: false, children: [
9
+ /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, { asChild: true, "aria-hidden": true, tabIndex: -1, children: /* @__PURE__ */ jsx(
10
+ "span",
11
+ {
12
+ "data-as": "context-menu-anchor",
13
+ style: { position: "fixed", left: x, top: y, width: 0, height: 0 }
14
+ }
15
+ ) }),
16
+ /* @__PURE__ */ jsx(
17
+ MenuContent,
18
+ {
19
+ align: "start",
20
+ sideOffset: 2,
21
+ collisionPadding: 8,
22
+ "data-as": "context-menu",
23
+ onCloseAutoFocus: (event) => event.preventDefault(),
24
+ className: cn("min-w-40", className),
25
+ children: items.map(
26
+ (item) => item.disabled === true ? /* @__PURE__ */ jsxs(
27
+ "span",
28
+ {
29
+ role: "menuitem",
30
+ "aria-disabled": "true",
31
+ title: item.hint,
32
+ className: "pointer-events-none flex w-full cursor-default select-none items-center gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-left text-sm text-[var(--as-muted-fg)] opacity-50 [&_svg]:size-4 [&_svg]:shrink-0",
33
+ children: [
34
+ item.icon ? /* @__PURE__ */ jsx(item.icon, { "aria-hidden": true }) : null,
35
+ item.label
36
+ ]
37
+ },
38
+ item.key
39
+ ) : /* @__PURE__ */ jsx(
40
+ MenuItem,
41
+ {
42
+ icon: item.icon,
43
+ danger: item.danger,
44
+ title: item.hint,
45
+ onSelect: () => item.onSelect?.(),
46
+ children: item.label
47
+ },
48
+ item.key
49
+ )
50
+ )
51
+ }
52
+ )
53
+ ] });
54
+ }
55
+
56
+ export { ContextMenu };
57
+ //# sourceMappingURL=chunk-WZSAUESL.js.map
58
+ //# sourceMappingURL=chunk-WZSAUESL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/context-menu/ContextMenu.tsx"],"names":[],"mappings":";;;;;AAwBO,SAAS,YAAY,EAAE,CAAA,EAAG,GAAG,KAAA,EAAO,OAAA,EAAS,WAAU,EAAqB;AACjF,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AAC5B,EAAA,uBACE,IAAA,CAAuB,qBAAA,CAAA,IAAA,EAAtB,EAA2B,IAAA,EAAY,YAAA,EAAc,CAAC,IAAA,KAAS,CAAC,IAAA,IAAQ,OAAA,EAAQ,EAAG,KAAA,EAAO,KAAA,EACzF,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAuB,+BAAtB,EAA8B,OAAA,EAAO,MAAC,aAAA,EAAW,IAAA,EAAC,UAAU,EAAA,EAC3D,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAQ,qBAAA;AAAA,QACR,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE;AAAA,KACnE,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,OAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,gBAAA,EAAkB,CAAA;AAAA,QAClB,SAAA,EAAQ,cAAA;AAAA,QACR,gBAAA,EAAkB,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,QAClD,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,QAElC,QAAA,EAAA,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,IAAA,KACV,IAAA,CAAK,QAAA,KAAa,IAAA,mBAChB,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,UAAA;AAAA,cACL,eAAA,EAAc,MAAA;AAAA,cACd,OAAO,IAAA,CAAK,IAAA;AAAA,cACZ,SAAA,EAAU,0NAAA;AAAA,cAET,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,uBAAO,GAAA,CAAC,IAAA,CAAK,MAAL,EAAU,aAAA,EAAW,MAAC,CAAA,GAAK,IAAA;AAAA,gBACxC,IAAA,CAAK;AAAA;AAAA,aAAA;AAAA,YAPD,IAAA,CAAK;AAAA,WAQZ,mBAEA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,OAAO,IAAA,CAAK,IAAA;AAAA,cACZ,QAAA,EAAU,MAAM,IAAA,CAAK,QAAA,IAAW;AAAA,cAE/B,QAAA,EAAA,IAAA,CAAK;AAAA,aAAA;AAAA,YAND,IAAA,CAAK;AAAA;AAOZ;AAEJ;AAAA;AACF,GAAA,EACF,CAAA;AAEJ","file":"chunk-WZSAUESL.js","sourcesContent":["import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { MenuContent, MenuItem } from '../menu/Menu'\n\nexport interface ContextMenuItem {\n key: string\n label: string\n icon?: LucideIcon\n onSelect?: () => void\n danger?: boolean\n disabled?: boolean\n hint?: string\n}\n\nexport interface ContextMenuProps {\n x: number\n y: number\n items: ContextMenuItem[]\n onClose: () => void\n className?: string\n}\n\nexport function ContextMenu({ x, y, items, onClose, className }: ContextMenuProps) {\n const open = items.length > 0\n return (\n <DropdownMenuPrimitive.Root open={open} onOpenChange={(next) => !next && onClose()} modal={false}>\n <DropdownMenuPrimitive.Trigger asChild aria-hidden tabIndex={-1}>\n <span\n data-as=\"context-menu-anchor\"\n style={{ position: 'fixed', left: x, top: y, width: 0, height: 0 }}\n />\n </DropdownMenuPrimitive.Trigger>\n <MenuContent\n align=\"start\"\n sideOffset={2}\n collisionPadding={8}\n data-as=\"context-menu\"\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={cn('min-w-40', className)}\n >\n {items.map((item) =>\n item.disabled === true ? (\n <span\n key={item.key}\n role=\"menuitem\"\n aria-disabled=\"true\"\n title={item.hint}\n className=\"pointer-events-none flex w-full cursor-default select-none items-center gap-2 rounded-[calc(var(--as-radius-sm)-2px)] px-2 py-1.5 text-left text-sm text-[var(--as-muted-fg)] opacity-50 [&_svg]:size-4 [&_svg]:shrink-0\"\n >\n {item.icon ? <item.icon aria-hidden /> : null}\n {item.label}\n </span>\n ) : (\n <MenuItem\n key={item.key}\n icon={item.icon}\n danger={item.danger}\n title={item.hint}\n onSelect={() => item.onSelect?.()}\n >\n {item.label}\n </MenuItem>\n ),\n )}\n </MenuContent>\n </DropdownMenuPrimitive.Root>\n )\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { Minus, Check } from 'lucide-react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var CheckIndicator = React.forwardRef(
7
+ function CheckIndicator2({ checked, label, onToggle, mixed = false, className }, ref) {
8
+ return /* @__PURE__ */ jsx(
9
+ "button",
10
+ {
11
+ ref,
12
+ type: "button",
13
+ role: "checkbox",
14
+ "data-as": "check-indicator",
15
+ "aria-checked": mixed ? "mixed" : checked,
16
+ "aria-label": label,
17
+ onClick: (event) => {
18
+ event.stopPropagation();
19
+ onToggle();
20
+ },
21
+ className: cn(
22
+ "flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-[calc(var(--as-radius-sm)-2px)] transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]",
23
+ checked || mixed ? "bg-[var(--as-primary)] text-[var(--as-primary-fg)]" : "border border-[var(--as-border)] text-[var(--as-muted-fg)] hover:border-[var(--as-fg)]/40",
24
+ className
25
+ ),
26
+ children: mixed ? /* @__PURE__ */ jsx(Minus, { className: "size-3", "aria-hidden": true }) : checked ? /* @__PURE__ */ jsx(Check, { className: "size-3", "aria-hidden": true }) : null
27
+ }
28
+ );
29
+ }
30
+ );
31
+
32
+ export { CheckIndicator };
33
+ //# sourceMappingURL=chunk-XE4TFW63.js.map
34
+ //# sourceMappingURL=chunk-XE4TFW63.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/check-indicator/CheckIndicator.tsx"],"names":["CheckIndicator"],"mappings":";;;;;AAYO,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA;AAAA,EAClC,SAASA,eAAAA,CAAe,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,GAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,GAAA,EAAK;AACnF,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,SAAA,EAAQ,iBAAA;AAAA,QACR,cAAA,EAAc,QAAQ,OAAA,GAAU,OAAA;AAAA,QAChC,YAAA,EAAY,KAAA;AAAA,QACZ,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,QAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,+NAAA;AAAA,UACA,OAAA,IAAW,QACP,oDAAA,GACA,2FAAA;AAAA,UACJ;AAAA,SACF;AAAA,QAEC,QAAA,EAAA,KAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAS,aAAA,EAAW,IAAA,EAAC,CAAA,GACpC,OAAA,uBACD,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,MAAC,CAAA,GACpC;AAAA;AAAA,KACN;AAAA,EAEJ;AACF","file":"chunk-XE4TFW63.js","sourcesContent":["import * as React from 'react'\nimport { Check, Minus } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport interface CheckIndicatorProps {\n checked: boolean\n label: string\n onToggle: () => void\n mixed?: boolean\n className?: string\n}\n\nexport const CheckIndicator = React.forwardRef<HTMLButtonElement, CheckIndicatorProps>(\n function CheckIndicator({ checked, label, onToggle, mixed = false, className }, ref) {\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"checkbox\"\n data-as=\"check-indicator\"\n aria-checked={mixed ? 'mixed' : checked}\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation()\n onToggle()\n }}\n className={cn(\n 'flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-[calc(var(--as-radius-sm)-2px)] transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--as-focus-ring)]',\n checked || mixed\n ? 'bg-[var(--as-primary)] text-[var(--as-primary-fg)]'\n : 'border border-[var(--as-border)] text-[var(--as-muted-fg)] hover:border-[var(--as-fg)]/40',\n className,\n )}\n >\n {mixed ? (\n <Minus className=\"size-3\" aria-hidden />\n ) : checked ? (\n <Check className=\"size-3\" aria-hidden />\n ) : null}\n </button>\n )\n },\n)\n"]}
@@ -0,0 +1,54 @@
1
+ import * as React from 'react';
2
+
3
+ interface ComboboxOption {
4
+ value: string;
5
+ label: string;
6
+ description?: string;
7
+ group?: string;
8
+ disabled?: boolean;
9
+ }
10
+ interface ComboboxProps {
11
+ options: ComboboxOption[];
12
+ value?: string;
13
+ onChange: (value: string) => void;
14
+ placeholder?: string;
15
+ searchPlaceholder?: string;
16
+ searchLabel?: string;
17
+ emptyLabel?: string;
18
+ loadingLabel?: string;
19
+ loading?: boolean;
20
+ disabled?: boolean;
21
+ clearable?: boolean;
22
+ clearLabel?: string;
23
+ onSearchChange?: (term: string) => void;
24
+ onOpenChange?: (open: boolean) => void;
25
+ label?: string;
26
+ error?: string;
27
+ id?: string;
28
+ className?: string;
29
+ panelClassName?: string;
30
+ }
31
+ declare const Combobox: React.ForwardRefExoticComponent<ComboboxProps & React.RefAttributes<HTMLButtonElement>>;
32
+ interface ComboboxMultiProps {
33
+ options: ComboboxOption[];
34
+ value: string[];
35
+ onChange: (value: string[]) => void;
36
+ placeholder?: string;
37
+ searchPlaceholder?: string;
38
+ searchLabel?: string;
39
+ emptyLabel?: string;
40
+ loadingLabel?: string;
41
+ loading?: boolean;
42
+ disabled?: boolean;
43
+ maxTriggerLabels?: number;
44
+ onSearchChange?: (term: string) => void;
45
+ onOpenChange?: (open: boolean) => void;
46
+ label?: string;
47
+ error?: string;
48
+ id?: string;
49
+ className?: string;
50
+ panelClassName?: string;
51
+ }
52
+ declare const ComboboxMulti: React.ForwardRefExoticComponent<ComboboxMultiProps & React.RefAttributes<HTMLButtonElement>>;
53
+
54
+ export { Combobox, ComboboxMulti, type ComboboxMultiProps, type ComboboxOption, type ComboboxProps };
@@ -0,0 +1,3 @@
1
+ export { Combobox, ComboboxMulti } from './chunk-3522NABN.js';
2
+ //# sourceMappingURL=combobox.js.map
3
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"combobox.js"}
@@ -1,3 +1,3 @@
1
- export { ConfirmationModal } from './chunk-TLTKWLMN.js';
1
+ export { ConfirmationModal } from './chunk-GA3XIDVX.js';
2
2
  //# sourceMappingURL=confirmation-modal.js.map
3
3
  //# sourceMappingURL=confirmation-modal.js.map
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import { LucideIcon } from 'lucide-react';
3
+
4
+ interface ContextMenuItem {
5
+ key: string;
6
+ label: string;
7
+ icon?: LucideIcon;
8
+ onSelect?: () => void;
9
+ danger?: boolean;
10
+ disabled?: boolean;
11
+ hint?: string;
12
+ }
13
+ interface ContextMenuProps {
14
+ x: number;
15
+ y: number;
16
+ items: ContextMenuItem[];
17
+ onClose: () => void;
18
+ className?: string;
19
+ }
20
+ declare function ContextMenu({ x, y, items, onClose, className }: ContextMenuProps): React.JSX.Element;
21
+
22
+ export { ContextMenu, type ContextMenuItem, type ContextMenuProps };
@@ -0,0 +1,3 @@
1
+ export { ContextMenu } from './chunk-WZSAUESL.js';
2
+ //# sourceMappingURL=context-menu.js.map
3
+ //# sourceMappingURL=context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"context-menu.js"}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+
3
+ interface ErrorBannerProps {
4
+ message: string | null | undefined;
5
+ action?: React.ReactNode;
6
+ className?: string;
7
+ }
8
+ declare function ErrorBanner({ message, action, className }: ErrorBannerProps): React.JSX.Element | null;
9
+
10
+ export { ErrorBanner, type ErrorBannerProps };
@@ -0,0 +1,3 @@
1
+ export { ErrorBanner } from './chunk-BJOY3XL7.js';
2
+ //# sourceMappingURL=error-banner.js.map
3
+ //# sourceMappingURL=error-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"error-banner.js"}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+
3
+ interface ExpandableSearchProps {
4
+ value: string;
5
+ onChange: (value: string) => void;
6
+ onSubmit?: (value: string) => void;
7
+ onClear?: () => void;
8
+ placeholder: string;
9
+ ariaLabel: string;
10
+ clearLabel?: string;
11
+ expandLabel?: string;
12
+ className?: string;
13
+ }
14
+ declare const ExpandableSearch: React.ForwardRefExoticComponent<ExpandableSearchProps & React.RefAttributes<HTMLInputElement>>;
15
+
16
+ export { ExpandableSearch, type ExpandableSearchProps };
@@ -0,0 +1,3 @@
1
+ export { ExpandableSearch } from './chunk-4SW3ESVI.js';
2
+ //# sourceMappingURL=expandable-search.js.map
3
+ //# sourceMappingURL=expandable-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"expandable-search.js"}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+
3
+ interface FieldLabelProps {
4
+ children: React.ReactNode;
5
+ info: React.ReactNode;
6
+ infoTitle?: React.ReactNode;
7
+ label?: string;
8
+ showOnHover?: boolean;
9
+ className?: string;
10
+ }
11
+ declare function FieldLabel({ children, info, infoTitle, label, showOnHover, className, }: FieldLabelProps): React.JSX.Element;
12
+
13
+ export { FieldLabel, type FieldLabelProps };
@@ -0,0 +1,3 @@
1
+ export { FieldLabel } from './chunk-ESUTPQDO.js';
2
+ //# sourceMappingURL=field-label.js.map
3
+ //# sourceMappingURL=field-label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"field-label.js"}
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import { LucideIcon } from 'lucide-react';
3
+
4
+ interface FormModalProps {
5
+ open: boolean;
6
+ onOpenChange: (open: boolean) => void;
7
+ title: React.ReactNode;
8
+ description?: React.ReactNode;
9
+ icon?: LucideIcon;
10
+ children: React.ReactNode;
11
+ onSubmit?: () => void;
12
+ submitting?: boolean;
13
+ submitDisabled?: boolean;
14
+ submitLabel?: string;
15
+ cancelLabel?: string;
16
+ closeLabel?: string;
17
+ size?: 'sm' | 'md' | 'lg' | 'xl';
18
+ contentClassName?: string;
19
+ footer?: React.ReactNode;
20
+ }
21
+ declare function FormModal({ open, onOpenChange, title, description, icon: Icon, children, onSubmit, submitting, submitDisabled, submitLabel, cancelLabel, closeLabel, size, contentClassName, footer, }: FormModalProps): React.JSX.Element;
22
+
23
+ export { FormModal, type FormModalProps };
@@ -0,0 +1,3 @@
1
+ export { FormModal } from './chunk-GPIN2ITX.js';
2
+ //# sourceMappingURL=form-modal.js.map
3
+ //# sourceMappingURL=form-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"form-modal.js"}
package/dist/index.d.ts CHANGED
@@ -6,17 +6,34 @@ export { ThemeScope, ThemeScopeProps } from './theme-scope.js';
6
6
  export { Badge, BadgeProps, badgeVariants } from './badge.js';
7
7
  export { Button, ButtonProps, buttonVariants } from './button.js';
8
8
  export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './card.js';
9
+ export { CheckIndicator, CheckIndicatorProps } from './check-indicator.js';
10
+ export { Combobox, ComboboxMulti, ComboboxMultiProps, ComboboxOption, ComboboxProps } from './combobox.js';
9
11
  export { ConfirmationModal, ConfirmationModalProps } from './confirmation-modal.js';
12
+ export { ContextMenu, ContextMenuItem, ContextMenuProps } from './context-menu.js';
10
13
  export { EmptyState, EmptyStateProps } from './empty-state.js';
14
+ export { ErrorBanner, ErrorBannerProps } from './error-banner.js';
15
+ export { ExpandableSearch, ExpandableSearchProps } from './expandable-search.js';
16
+ export { FieldLabel, FieldLabelProps } from './field-label.js';
17
+ export { FormModal, FormModalProps } from './form-modal.js';
18
+ export { InfoButton, InfoButtonProps } from './info-button.js';
11
19
  export { Input, InputProps } from './input.js';
20
+ export { MarqueeBand, MarqueePhase, MarqueeSelection, MarqueeSurface, MarqueeSurfaceProps, Rect, UseMarqueeOptions, hitTestIds, marqueeRect, rectsIntersect, useMarquee } from './marquee.js';
21
+ export { ActionMenu, ActionMenuItem, ActionMenuProps, Menu, MenuContent, MenuGroup, MenuItem, MenuItemProps, MenuLabel, MenuSeparator, MenuTrigger } from './menu.js';
12
22
  export { Modal, ModalClose, ModalContent, ModalContentProps, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './modal.js';
23
+ export { PopoverButton, PopoverButtonProps } from './popover-button.js';
13
24
  export { Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger } from './popover.js';
25
+ export { SearchInput, SearchInputProps } from './search-input.js';
26
+ export { SelectionBar, SelectionBarProps } from './selection-bar.js';
14
27
  export { Spinner, SpinnerProps } from './spinner.js';
15
28
  export { InfoTooltip, InfoTooltipProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip.js';
29
+ export { UndoNotice, UndoNoticeProps } from './undo-notice.js';
30
+ export { ViewToggle, ViewToggleProps, ViewToggleView } from './view-toggle.js';
31
+ export { Stepper, StepperProps, StepperStep, Wizard, WizardContext, WizardProps, WizardStep } from './wizard.js';
16
32
  import 'react';
17
33
  import 'class-variance-authority/types';
18
34
  import 'class-variance-authority';
19
35
  import 'lucide-react';
36
+ import '@radix-ui/react-dropdown-menu';
20
37
  import '@radix-ui/react-dialog';
21
38
  import '@radix-ui/react-popover';
22
39
  import '@radix-ui/react-tooltip';
package/dist/index.js CHANGED
@@ -1,16 +1,32 @@
1
- export { Portal } from './chunk-7YLR4AGA.js';
2
1
  export { ThemeScope } from './chunk-TGU3PKNM.js';
3
2
  export { InfoTooltip, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './chunk-TJGX27YO.js';
3
+ export { UndoNotice } from './chunk-OUHUVACM.js';
4
+ export { ViewToggle } from './chunk-MXOBOS4Y.js';
5
+ export { Stepper, Wizard } from './chunk-LEDQQBVV.js';
6
+ export { MarqueeBand, MarqueeSurface, hitTestIds, marqueeRect, rectsIntersect, useMarquee } from './chunk-RU3DEF2O.js';
4
7
  export { Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger } from './chunk-CI56SSO2.js';
8
+ export { Portal } from './chunk-7YLR4AGA.js';
9
+ export { SearchInput } from './chunk-H5U4KNXF.js';
10
+ export { SelectionBar } from './chunk-HSUCCANX.js';
11
+ export { ContextMenu } from './chunk-WZSAUESL.js';
12
+ export { ActionMenu, Menu, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuSeparator, MenuTrigger } from './chunk-KXLMTAZ5.js';
13
+ export { EmptyState } from './chunk-KDJLYKR6.js';
14
+ export { ErrorBanner } from './chunk-BJOY3XL7.js';
15
+ export { ExpandableSearch } from './chunk-4SW3ESVI.js';
16
+ export { FieldLabel } from './chunk-ESUTPQDO.js';
17
+ export { FormModal } from './chunk-GPIN2ITX.js';
18
+ export { InfoButton } from './chunk-DV3MXDLN.js';
19
+ export { PopoverButton } from './chunk-N5KQRHXU.js';
20
+ export { Input } from './chunk-COPPAHR5.js';
5
21
  export { rawTokens, semanticTokens } from './chunk-3HFL3JGP.js';
6
- export { Badge, badgeVariants } from './chunk-NQQNTK6L.js';
22
+ export { Badge, badgeVariants } from './chunk-SKTLC2XY.js';
7
23
  export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-HSWSYEFQ.js';
8
- export { ConfirmationModal } from './chunk-TLTKWLMN.js';
24
+ export { CheckIndicator } from './chunk-XE4TFW63.js';
25
+ export { Combobox, ComboboxMulti } from './chunk-3522NABN.js';
26
+ export { ConfirmationModal } from './chunk-GA3XIDVX.js';
9
27
  export { Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, modalContentVariants } from './chunk-RHBQ3GZE.js';
10
- export { Button, buttonVariants } from './chunk-56VRWCLJ.js';
28
+ export { Button, buttonVariants } from './chunk-GTXGTQ6F.js';
11
29
  export { Spinner } from './chunk-INTST5VG.js';
12
- export { EmptyState } from './chunk-KDJLYKR6.js';
13
- export { Input } from './chunk-COPPAHR5.js';
14
30
  export { cn } from './chunk-BLJWR4ZV.js';
15
31
  //# sourceMappingURL=index.js.map
16
32
  //# sourceMappingURL=index.js.map