@neuronection/assistant-ui 0.1.0 → 0.3.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 (131) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +40 -9
  3. package/dist/badge.js +1 -1
  4. package/dist/button.js +1 -1
  5. package/dist/check-indicator.d.ts +12 -0
  6. package/dist/check-indicator.js +3 -0
  7. package/dist/check-indicator.js.map +1 -0
  8. package/dist/chip-input.d.ts +14 -0
  9. package/dist/chip-input.js +3 -0
  10. package/dist/chip-input.js.map +1 -0
  11. package/dist/chip-list.d.ts +15 -0
  12. package/dist/chip-list.js +3 -0
  13. package/dist/chip-list.js.map +1 -0
  14. package/dist/chunk-2KO2YIZN.js +357 -0
  15. package/dist/chunk-2KO2YIZN.js.map +1 -0
  16. package/dist/chunk-3522NABN.js +452 -0
  17. package/dist/chunk-3522NABN.js.map +1 -0
  18. package/dist/chunk-4SW3ESVI.js +111 -0
  19. package/dist/chunk-4SW3ESVI.js.map +1 -0
  20. package/dist/chunk-5AVBKEDQ.js +74 -0
  21. package/dist/chunk-5AVBKEDQ.js.map +1 -0
  22. package/dist/chunk-5X3RYDPC.js +54 -0
  23. package/dist/chunk-5X3RYDPC.js.map +1 -0
  24. package/dist/chunk-BJOY3XL7.js +27 -0
  25. package/dist/chunk-BJOY3XL7.js.map +1 -0
  26. package/dist/chunk-BPTGPF3L.js +3 -0
  27. package/dist/chunk-BPTGPF3L.js.map +1 -0
  28. package/dist/chunk-DV3MXDLN.js +46 -0
  29. package/dist/chunk-DV3MXDLN.js.map +1 -0
  30. package/dist/chunk-ESUTPQDO.js +21 -0
  31. package/dist/chunk-ESUTPQDO.js.map +1 -0
  32. package/dist/{chunk-TLTKWLMN.js → chunk-GA3XIDVX.js} +3 -3
  33. package/dist/{chunk-TLTKWLMN.js.map → chunk-GA3XIDVX.js.map} +1 -1
  34. package/dist/chunk-GPIN2ITX.js +63 -0
  35. package/dist/chunk-GPIN2ITX.js.map +1 -0
  36. package/dist/{chunk-56VRWCLJ.js → chunk-GTXGTQ6F.js} +2 -2
  37. package/dist/{chunk-56VRWCLJ.js.map → chunk-GTXGTQ6F.js.map} +1 -1
  38. package/dist/chunk-H5U4KNXF.js +63 -0
  39. package/dist/chunk-H5U4KNXF.js.map +1 -0
  40. package/dist/chunk-HSUCCANX.js +44 -0
  41. package/dist/chunk-HSUCCANX.js.map +1 -0
  42. package/dist/chunk-KXLMTAZ5.js +109 -0
  43. package/dist/chunk-KXLMTAZ5.js.map +1 -0
  44. package/dist/chunk-LEDQQBVV.js +184 -0
  45. package/dist/chunk-LEDQQBVV.js.map +1 -0
  46. package/dist/chunk-MXOBOS4Y.js +60 -0
  47. package/dist/chunk-MXOBOS4Y.js.map +1 -0
  48. package/dist/chunk-N5KQRHXU.js +107 -0
  49. package/dist/chunk-N5KQRHXU.js.map +1 -0
  50. package/dist/chunk-OAR74ML4.js +3 -0
  51. package/dist/chunk-OAR74ML4.js.map +1 -0
  52. package/dist/chunk-OUHUVACM.js +45 -0
  53. package/dist/chunk-OUHUVACM.js.map +1 -0
  54. package/dist/chunk-PPH3G7AL.js +3 -0
  55. package/dist/chunk-PPH3G7AL.js.map +1 -0
  56. package/dist/chunk-RU3DEF2O.js +186 -0
  57. package/dist/chunk-RU3DEF2O.js.map +1 -0
  58. package/dist/{chunk-NQQNTK6L.js → chunk-SKTLC2XY.js} +2 -2
  59. package/dist/{chunk-NQQNTK6L.js.map → chunk-SKTLC2XY.js.map} +1 -1
  60. package/dist/chunk-TPLQL62V.js +124 -0
  61. package/dist/chunk-TPLQL62V.js.map +1 -0
  62. package/dist/chunk-UIUALJNR.js +110 -0
  63. package/dist/chunk-UIUALJNR.js.map +1 -0
  64. package/dist/chunk-WZSAUESL.js +58 -0
  65. package/dist/chunk-WZSAUESL.js.map +1 -0
  66. package/dist/chunk-XE4TFW63.js +34 -0
  67. package/dist/chunk-XE4TFW63.js.map +1 -0
  68. package/dist/chunk-XLD2BPTT.js +82 -0
  69. package/dist/chunk-XLD2BPTT.js.map +1 -0
  70. package/dist/combobox.d.ts +54 -0
  71. package/dist/combobox.js +3 -0
  72. package/dist/combobox.js.map +1 -0
  73. package/dist/confirmation-modal.js +1 -1
  74. package/dist/context-menu.d.ts +22 -0
  75. package/dist/context-menu.js +3 -0
  76. package/dist/context-menu.js.map +1 -0
  77. package/dist/date-picker.d.ts +26 -0
  78. package/dist/date-picker.js +3 -0
  79. package/dist/date-picker.js.map +1 -0
  80. package/dist/error-banner.d.ts +10 -0
  81. package/dist/error-banner.js +3 -0
  82. package/dist/error-banner.js.map +1 -0
  83. package/dist/expandable-search.d.ts +16 -0
  84. package/dist/expandable-search.js +3 -0
  85. package/dist/expandable-search.js.map +1 -0
  86. package/dist/field-label.d.ts +13 -0
  87. package/dist/field-label.js +3 -0
  88. package/dist/field-label.js.map +1 -0
  89. package/dist/form-modal.d.ts +23 -0
  90. package/dist/form-modal.js +3 -0
  91. package/dist/form-modal.js.map +1 -0
  92. package/dist/index.d.ts +23 -0
  93. package/dist/index.js +30 -8
  94. package/dist/info-button.d.ts +13 -0
  95. package/dist/info-button.js +3 -0
  96. package/dist/info-button.js.map +1 -0
  97. package/dist/marquee.d.ts +39 -0
  98. package/dist/marquee.js +3 -0
  99. package/dist/marquee.js.map +1 -0
  100. package/dist/menu.d.ts +38 -0
  101. package/dist/menu.js +3 -0
  102. package/dist/menu.js.map +1 -0
  103. package/dist/popover-button.d.ts +23 -0
  104. package/dist/popover-button.js +3 -0
  105. package/dist/popover-button.js.map +1 -0
  106. package/dist/range-bar.d.ts +15 -0
  107. package/dist/range-bar.js +3 -0
  108. package/dist/range-bar.js.map +1 -0
  109. package/dist/scale-slider.d.ts +18 -0
  110. package/dist/scale-slider.js +3 -0
  111. package/dist/scale-slider.js.map +1 -0
  112. package/dist/search-input.d.ts +15 -0
  113. package/dist/search-input.js +3 -0
  114. package/dist/search-input.js.map +1 -0
  115. package/dist/selection-bar.d.ts +13 -0
  116. package/dist/selection-bar.js +3 -0
  117. package/dist/selection-bar.js.map +1 -0
  118. package/dist/styles.css +1 -1
  119. package/dist/table.d.ts +10 -0
  120. package/dist/table.js +3 -0
  121. package/dist/table.js.map +1 -0
  122. package/dist/undo-notice.d.ts +14 -0
  123. package/dist/undo-notice.js +3 -0
  124. package/dist/undo-notice.js.map +1 -0
  125. package/dist/view-toggle.d.ts +13 -0
  126. package/dist/view-toggle.js +3 -0
  127. package/dist/view-toggle.js.map +1 -0
  128. package/dist/wizard.d.ts +57 -0
  129. package/dist/wizard.js +3 -0
  130. package/dist/wizard.js.map +1 -0
  131. package/package.json +97 -4
@@ -0,0 +1,74 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function pct(value, domainMin, domainMax) {
6
+ if (domainMax === domainMin) return 0;
7
+ return (value - domainMin) / (domainMax - domainMin) * 100;
8
+ }
9
+ function fmt(value) {
10
+ return Number.isInteger(value) ? value.toLocaleString() : value.toFixed(1).replace(/\.0$/, "");
11
+ }
12
+ var RangeBar = React.forwardRef(
13
+ function RangeBar2({ low, high, min, max, value, unit, label, valueLabel = "You", className, ...props }, ref) {
14
+ if (!Number.isFinite(low) || !Number.isFinite(high) || high <= low) {
15
+ return null;
16
+ }
17
+ const span = high - low;
18
+ let domainMin = min ?? low - span;
19
+ let domainMax = max ?? high + span;
20
+ if (domainMin < 0 && low >= 0) {
21
+ const shift = -domainMin;
22
+ domainMin = 0;
23
+ domainMax += shift;
24
+ }
25
+ if (domainMax <= domainMin) domainMax = domainMin + span;
26
+ const left = Math.max(0, Math.min(100, pct(low, domainMin, domainMax)));
27
+ const right = Math.max(0, Math.min(100, pct(high, domainMin, domainMax)));
28
+ const valuePct = value !== null && value !== void 0 && Number.isFinite(value) ? Math.max(0, Math.min(100, pct(value, domainMin, domainMax))) : null;
29
+ return /* @__PURE__ */ jsxs(
30
+ "div",
31
+ {
32
+ ref,
33
+ "data-as": "range-bar",
34
+ className: cn("w-full", className),
35
+ ...props,
36
+ children: [
37
+ label ? /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs text-[var(--as-muted-fg)]", children: label }) : null,
38
+ /* @__PURE__ */ jsxs("div", { className: "relative h-3.5 w-full rounded-full bg-[var(--as-muted)]", children: [
39
+ /* @__PURE__ */ jsx(
40
+ "div",
41
+ {
42
+ className: "absolute h-full rounded-full bg-[color-mix(in_srgb,var(--as-primary)_30%,transparent)]",
43
+ style: { left: `${left}%`, width: `${Math.max(0, right - left)}%` },
44
+ title: `${label ? `${label}: ` : ""}${fmt(low)} \u2013 ${fmt(high)}${unit ? ` ${unit}` : ""}`
45
+ }
46
+ ),
47
+ valuePct !== null ? /* @__PURE__ */ jsx(
48
+ "div",
49
+ {
50
+ className: "absolute top-1/2 size-2.5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-[var(--as-surface-raised)] bg-[var(--as-primary)] shadow-[var(--as-shadow-1)]",
51
+ style: { left: `${valuePct}%` },
52
+ title: `${valueLabel}: ${fmt(value)}${unit ? ` ${unit}` : ""}`
53
+ }
54
+ ) : null
55
+ ] }),
56
+ /* @__PURE__ */ jsxs("div", { className: "mt-0.5 flex justify-between text-[10px] text-[var(--as-muted-fg)]", children: [
57
+ /* @__PURE__ */ jsx("span", { children: fmt(domainMin) }),
58
+ /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
59
+ fmt(low),
60
+ " \u2013 ",
61
+ fmt(high),
62
+ unit ? ` ${unit}` : ""
63
+ ] }),
64
+ /* @__PURE__ */ jsx("span", { children: fmt(domainMax) })
65
+ ] })
66
+ ]
67
+ }
68
+ );
69
+ }
70
+ );
71
+
72
+ export { RangeBar };
73
+ //# sourceMappingURL=chunk-5AVBKEDQ.js.map
74
+ //# sourceMappingURL=chunk-5AVBKEDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/range-bar/RangeBar.tsx"],"names":["RangeBar"],"mappings":"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","file":"chunk-5AVBKEDQ.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface RangeBarProps extends React.ComponentProps<'div'> {\n low: number\n high: number\n min?: number\n max?: number\n value?: number | null\n unit?: string\n label?: string\n valueLabel?: string\n}\n\nfunction pct(value: number, domainMin: number, domainMax: number): number {\n if (domainMax === domainMin) return 0\n return ((value - domainMin) / (domainMax - domainMin)) * 100\n}\n\nfunction fmt(value: number): string {\n return Number.isInteger(value)\n ? value.toLocaleString()\n : value.toFixed(1).replace(/\\.0$/, '')\n}\n\nexport const RangeBar = React.forwardRef<HTMLDivElement, RangeBarProps>(\n function RangeBar(\n { low, high, min, max, value, unit, label, valueLabel = 'You', className, ...props },\n ref,\n ) {\n if (!Number.isFinite(low) || !Number.isFinite(high) || high <= low) {\n return null\n }\n\n const span = high - low\n let domainMin = min ?? low - span\n let domainMax = max ?? high + span\n if (domainMin < 0 && low >= 0) {\n const shift = -domainMin\n domainMin = 0\n domainMax += shift\n }\n if (domainMax <= domainMin) domainMax = domainMin + span\n\n const left = Math.max(0, Math.min(100, pct(low, domainMin, domainMax)))\n const right = Math.max(0, Math.min(100, pct(high, domainMin, domainMax)))\n const valuePct =\n value !== null && value !== undefined && Number.isFinite(value)\n ? Math.max(0, Math.min(100, pct(value, domainMin, domainMax)))\n : null\n\n return (\n <div\n ref={ref}\n data-as=\"range-bar\"\n className={cn('w-full', className)}\n {...props}\n >\n {label ? (\n <p className=\"mb-1 text-xs text-[var(--as-muted-fg)]\">{label}</p>\n ) : null}\n <div className=\"relative h-3.5 w-full rounded-full bg-[var(--as-muted)]\">\n <div\n className=\"absolute h-full rounded-full bg-[color-mix(in_srgb,var(--as-primary)_30%,transparent)]\"\n style={{ left: `${left}%`, width: `${Math.max(0, right - left)}%` }}\n title={`${label ? `${label}: ` : ''}${fmt(low)} – ${fmt(high)}${unit ? ` ${unit}` : ''}`}\n />\n {valuePct !== null ? (\n <div\n className=\"absolute top-1/2 size-2.5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-[var(--as-surface-raised)] bg-[var(--as-primary)] shadow-[var(--as-shadow-1)]\"\n style={{ left: `${valuePct}%` }}\n title={`${valueLabel}: ${fmt(value as number)}${unit ? ` ${unit}` : ''}`}\n />\n ) : null}\n </div>\n <div className=\"mt-0.5 flex justify-between text-[10px] text-[var(--as-muted-fg)]\">\n <span>{fmt(domainMin)}</span>\n <span className=\"font-medium\">\n {fmt(low)} – {fmt(high)}\n {unit ? ` ${unit}` : ''}\n </span>\n <span>{fmt(domainMax)}</span>\n </div>\n </div>\n )\n },\n)\n"]}
@@ -0,0 +1,54 @@
1
+ import { cn } from './chunk-BLJWR4ZV.js';
2
+ import * as React from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var Table = React.forwardRef(
6
+ function Table2({ headers, rows, emptyText = "Nothing here yet", className, ...props }, ref) {
7
+ return /* @__PURE__ */ jsx(
8
+ "div",
9
+ {
10
+ ref,
11
+ "data-as": "table",
12
+ className: cn("overflow-x-auto", className),
13
+ ...props,
14
+ children: /* @__PURE__ */ jsxs("table", { className: "min-w-full divide-y divide-[var(--as-border)]", children: [
15
+ /* @__PURE__ */ jsx("thead", { className: "bg-[var(--as-muted)]", children: /* @__PURE__ */ jsx("tr", { children: headers.map((header, index) => /* @__PURE__ */ jsx(
16
+ "th",
17
+ {
18
+ scope: "col",
19
+ className: "px-4 py-2.5 text-left text-xs font-medium uppercase tracking-wider text-[var(--as-muted-fg)]",
20
+ children: header
21
+ },
22
+ index
23
+ )) }) }),
24
+ /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-[color-mix(in_srgb,var(--as-border)_55%,transparent)] bg-[var(--as-surface-raised)]", children: rows.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
25
+ "td",
26
+ {
27
+ colSpan: headers.length,
28
+ className: "px-4 py-6 text-center text-sm text-[var(--as-muted-fg)]",
29
+ children: emptyText
30
+ }
31
+ ) }) : rows.map((row, rowIndex) => /* @__PURE__ */ jsx(
32
+ "tr",
33
+ {
34
+ className: "transition-colors hover:bg-[color-mix(in_srgb,var(--as-muted)_60%,transparent)]",
35
+ children: row.map((cell, cellIndex) => /* @__PURE__ */ jsx(
36
+ "td",
37
+ {
38
+ className: "whitespace-nowrap px-4 py-3 text-sm text-[var(--as-fg)]",
39
+ children: cell
40
+ },
41
+ cellIndex
42
+ ))
43
+ },
44
+ rowIndex
45
+ )) })
46
+ ] })
47
+ }
48
+ );
49
+ }
50
+ );
51
+
52
+ export { Table };
53
+ //# sourceMappingURL=chunk-5X3RYDPC.js.map
54
+ //# sourceMappingURL=chunk-5X3RYDPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/table/Table.tsx"],"names":["Table"],"mappings":";;;;AASO,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EACzB,SAASA,MAAAA,CAAM,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,GAAY,kBAAA,EAAoB,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AAC1F,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,QACzC,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,+CAAA,EACf,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,WAAU,sBAAA,EACf,QAAA,kBAAA,GAAA,CAAC,QACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpB,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAU,8FAAA;AAAA,cAET,QAAA,EAAA;AAAA,aAAA;AAAA,YAJI;AAAA,WAMR,GACH,CAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,WAAM,SAAA,EAAU,qGAAA,EACd,eAAK,MAAA,KAAW,CAAA,uBACd,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,SAAS,OAAA,CAAQ,MAAA;AAAA,cACjB,SAAA,EAAU,yDAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,aAEL,CAAA,GAEA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,QAAA,qBACb,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,iFAAA;AAAA,cAET,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAM,SAAA,qBACd,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,yDAAA;AAAA,kBAET,QAAA,EAAA;AAAA,iBAAA;AAAA,gBAHI;AAAA,eAKR;AAAA,aAAA;AAAA,YAVI;AAAA,WAYR,CAAA,EAEL;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF","file":"chunk-5X3RYDPC.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../../lib/utils'\n\nexport interface TableProps extends React.ComponentProps<'div'> {\n headers: string[]\n rows: React.ReactNode[][]\n emptyText?: string\n}\n\nexport const Table = React.forwardRef<HTMLDivElement, TableProps>(\n function Table({ headers, rows, emptyText = 'Nothing here yet', className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-as=\"table\"\n className={cn('overflow-x-auto', className)}\n {...props}\n >\n <table className=\"min-w-full divide-y divide-[var(--as-border)]\">\n <thead className=\"bg-[var(--as-muted)]\">\n <tr>\n {headers.map((header, index) => (\n <th\n key={index}\n scope=\"col\"\n className=\"px-4 py-2.5 text-left text-xs font-medium uppercase tracking-wider text-[var(--as-muted-fg)]\"\n >\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-[color-mix(in_srgb,var(--as-border)_55%,transparent)] bg-[var(--as-surface-raised)]\">\n {rows.length === 0 ? (\n <tr>\n <td\n colSpan={headers.length}\n className=\"px-4 py-6 text-center text-sm text-[var(--as-muted-fg)]\"\n >\n {emptyText}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n className=\"transition-colors hover:bg-[color-mix(in_srgb,var(--as-muted)_60%,transparent)]\"\n >\n {row.map((cell, cellIndex) => (\n <td\n key={cellIndex}\n className=\"whitespace-nowrap px-4 py-3 text-sm text-[var(--as-fg)]\"\n >\n {cell}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\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,3 @@
1
+
2
+ //# sourceMappingURL=chunk-BPTGPF3L.js.map
3
+ //# sourceMappingURL=chunk-BPTGPF3L.js.map
@@ -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-56VRWCLJ.js';
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-TLTKWLMN.js.map
55
- //# sourceMappingURL=chunk-TLTKWLMN.js.map
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-TLTKWLMN.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"]}
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"]}
@@ -52,5 +52,5 @@ var Button = React.forwardRef(
52
52
  );
53
53
 
54
54
  export { Button, buttonVariants };
55
- //# sourceMappingURL=chunk-56VRWCLJ.js.map
56
- //# sourceMappingURL=chunk-56VRWCLJ.js.map
55
+ //# sourceMappingURL=chunk-GTXGTQ6F.js.map
56
+ //# sourceMappingURL=chunk-GTXGTQ6F.js.map
@@ -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,CACP,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-56VRWCLJ.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 { 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"]}
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"]}