@arbidocs/blocks 0.4.141 → 0.4.143

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 (222) hide show
  1. package/dist/agents/index.cjs +440 -436
  2. package/dist/agents/index.js +12 -8
  3. package/dist/chat/index.cjs +139 -138
  4. package/dist/chat/index.js +4 -3
  5. package/dist/{chunk-S24XEVPS.cjs → chunk-464YPRAE.cjs} +33 -2
  6. package/dist/chunk-464YPRAE.cjs.map +1 -0
  7. package/dist/{chunk-7YLJHTDC.cjs → chunk-5A2QQAF5.cjs} +11 -11
  8. package/dist/{chunk-7YLJHTDC.cjs.map → chunk-5A2QQAF5.cjs.map} +1 -1
  9. package/dist/{chunk-ON3TKY5Y.js → chunk-5YHEHEJT.js} +242 -4
  10. package/dist/chunk-5YHEHEJT.js.map +1 -0
  11. package/dist/chunk-76L6LOP3.cjs +308 -0
  12. package/dist/chunk-76L6LOP3.cjs.map +1 -0
  13. package/dist/chunk-AHDJXIUB.cjs +25 -0
  14. package/dist/chunk-AHDJXIUB.cjs.map +1 -0
  15. package/dist/chunk-AOSUHWIL.js +98 -0
  16. package/dist/chunk-AOSUHWIL.js.map +1 -0
  17. package/dist/{chunk-YFF3GTJQ.js → chunk-C44TDH54.js} +14 -1613
  18. package/dist/chunk-C44TDH54.js.map +1 -0
  19. package/dist/{chunk-GFRQG36Y.cjs → chunk-COCGRJLA.cjs} +213 -57
  20. package/dist/chunk-COCGRJLA.cjs.map +1 -0
  21. package/dist/chunk-CQCC7LE7.js +210 -0
  22. package/dist/chunk-CQCC7LE7.js.map +1 -0
  23. package/dist/{chunk-UGCKUXRV.js → chunk-CSI2B2H5.js} +3 -3
  24. package/dist/{chunk-UGCKUXRV.js.map → chunk-CSI2B2H5.js.map} +1 -1
  25. package/dist/{chunk-R26BK7YL.cjs → chunk-DTROMMDX.cjs} +4 -4
  26. package/dist/{chunk-R26BK7YL.cjs.map → chunk-DTROMMDX.cjs.map} +1 -1
  27. package/dist/{chunk-65THHQVB.cjs → chunk-ECW2R2KF.cjs} +27 -27
  28. package/dist/{chunk-65THHQVB.cjs.map → chunk-ECW2R2KF.cjs.map} +1 -1
  29. package/dist/{chunk-RI6DZA5X.js → chunk-EF4ZLKRM.js} +3 -3
  30. package/dist/{chunk-RI6DZA5X.js.map → chunk-EF4ZLKRM.js.map} +1 -1
  31. package/dist/{chunk-WS5EX7DN.cjs → chunk-EYKISBDO.cjs} +5 -5
  32. package/dist/{chunk-WS5EX7DN.cjs.map → chunk-EYKISBDO.cjs.map} +1 -1
  33. package/dist/chunk-FJETR2AS.js +561 -0
  34. package/dist/chunk-FJETR2AS.js.map +1 -0
  35. package/dist/{chunk-JO3EMZ4X.js → chunk-GWSGIZQ5.js} +3 -3
  36. package/dist/{chunk-JO3EMZ4X.js.map → chunk-GWSGIZQ5.js.map} +1 -1
  37. package/dist/{chunk-O6W6RW3B.js → chunk-H4D7WKDY.js} +207 -54
  38. package/dist/chunk-H4D7WKDY.js.map +1 -0
  39. package/dist/{chunk-OAQEUTNJ.cjs → chunk-HAOKT4LC.cjs} +5 -5
  40. package/dist/{chunk-OAQEUTNJ.cjs.map → chunk-HAOKT4LC.cjs.map} +1 -1
  41. package/dist/{chunk-YWY2KIX2.js → chunk-IJST4EBM.js} +13 -9
  42. package/dist/chunk-IJST4EBM.js.map +1 -0
  43. package/dist/{chunk-3RJN2VTL.js → chunk-IXWJGOM2.js} +3 -3
  44. package/dist/{chunk-3RJN2VTL.js.map → chunk-IXWJGOM2.js.map} +1 -1
  45. package/dist/{chunk-CYNF5PZI.js → chunk-J5CWKFSC.js} +3 -3
  46. package/dist/{chunk-CYNF5PZI.js.map → chunk-J5CWKFSC.js.map} +1 -1
  47. package/dist/{chunk-OWCEQKAR.cjs → chunk-JSTKEZBS.cjs} +21 -318
  48. package/dist/chunk-JSTKEZBS.cjs.map +1 -0
  49. package/dist/{chunk-TP6PLDNM.cjs → chunk-KMZWKSKO.cjs} +8 -8
  50. package/dist/{chunk-TP6PLDNM.cjs.map → chunk-KMZWKSKO.cjs.map} +1 -1
  51. package/dist/{chunk-C4WSHRR6.cjs → chunk-KPZZ5FHE.cjs} +32 -12
  52. package/dist/chunk-KPZZ5FHE.cjs.map +1 -0
  53. package/dist/{chunk-CKCBBYTA.js → chunk-KSHKTOY2.js} +5 -205
  54. package/dist/chunk-KSHKTOY2.js.map +1 -0
  55. package/dist/chunk-LJJJ6CYH.cjs +62 -0
  56. package/dist/chunk-LJJJ6CYH.cjs.map +1 -0
  57. package/dist/chunk-LPYEUD2D.cjs +1627 -0
  58. package/dist/chunk-LPYEUD2D.cjs.map +1 -0
  59. package/dist/chunk-MHFF5N65.cjs +101 -0
  60. package/dist/chunk-MHFF5N65.cjs.map +1 -0
  61. package/dist/{chunk-GYAUJ4KT.js → chunk-MTSKK3BN.js} +32 -3
  62. package/dist/chunk-MTSKK3BN.js.map +1 -0
  63. package/dist/chunk-NHZK64TQ.js +75 -0
  64. package/dist/chunk-NHZK64TQ.js.map +1 -0
  65. package/dist/{chunk-BPBSSMRB.js → chunk-NRFAWUVD.js} +3 -3
  66. package/dist/{chunk-BPBSSMRB.js.map → chunk-NRFAWUVD.js.map} +1 -1
  67. package/dist/chunk-NWNVWO6L.cjs +80 -0
  68. package/dist/chunk-NWNVWO6L.cjs.map +1 -0
  69. package/dist/{chunk-CQ4MFKFC.cjs → chunk-O2GW5IY6.cjs} +90 -86
  70. package/dist/chunk-O2GW5IY6.cjs.map +1 -0
  71. package/dist/{chunk-3BFGL2JL.cjs → chunk-ODRHHWHY.cjs} +4 -4
  72. package/dist/{chunk-3BFGL2JL.cjs.map → chunk-ODRHHWHY.cjs.map} +1 -1
  73. package/dist/{chunk-Y3KA6X7B.js → chunk-OVR3XMYL.js} +4 -4
  74. package/dist/{chunk-Y3KA6X7B.js.map → chunk-OVR3XMYL.js.map} +1 -1
  75. package/dist/{chunk-Y5KTM3V5.js → chunk-PDKM27DF.js} +17 -295
  76. package/dist/chunk-PDKM27DF.js.map +1 -0
  77. package/dist/{chunk-OAL3B2ZU.cjs → chunk-PLJ7PHWU.cjs} +5 -5
  78. package/dist/{chunk-OAL3B2ZU.cjs.map → chunk-PLJ7PHWU.cjs.map} +1 -1
  79. package/dist/{chunk-2UUNSHDI.cjs → chunk-RB7GX2VT.cjs} +59 -1682
  80. package/dist/chunk-RB7GX2VT.cjs.map +1 -0
  81. package/dist/chunk-RFIBUWLF.cjs +232 -0
  82. package/dist/chunk-RFIBUWLF.cjs.map +1 -0
  83. package/dist/chunk-RLWIUUQ5.js +23 -0
  84. package/dist/chunk-RLWIUUQ5.js.map +1 -0
  85. package/dist/{chunk-MIDXCYZB.cjs → chunk-RQ2Y7USX.cjs} +15 -235
  86. package/dist/chunk-RQ2Y7USX.cjs.map +1 -0
  87. package/dist/chunk-SV65E4QW.js +58 -0
  88. package/dist/chunk-SV65E4QW.js.map +1 -0
  89. package/dist/{chunk-LYUO3E6V.js → chunk-SZOFGU7W.js} +3 -3
  90. package/dist/{chunk-LYUO3E6V.js.map → chunk-SZOFGU7W.js.map} +1 -1
  91. package/dist/chunk-T5B7FM7S.js +1602 -0
  92. package/dist/chunk-T5B7FM7S.js.map +1 -0
  93. package/dist/{chunk-YNIBUKV5.js → chunk-TBEVGWY3.js} +32 -14
  94. package/dist/chunk-TBEVGWY3.js.map +1 -0
  95. package/dist/{chunk-MJCCBMM5.cjs → chunk-TC3RQNEX.cjs} +6 -80
  96. package/dist/chunk-TC3RQNEX.cjs.map +1 -0
  97. package/dist/chunk-TZGBRLPK.js +288 -0
  98. package/dist/chunk-TZGBRLPK.js.map +1 -0
  99. package/dist/chunk-U6YVZDOV.cjs +574 -0
  100. package/dist/chunk-U6YVZDOV.cjs.map +1 -0
  101. package/dist/{chunk-QIMVTGKS.cjs → chunk-U73KPFYH.cjs} +255 -2
  102. package/dist/chunk-U73KPFYH.cjs.map +1 -0
  103. package/dist/{chunk-HFGXA5CL.cjs → chunk-UTTTJSQU.cjs} +4 -4
  104. package/dist/{chunk-HFGXA5CL.cjs.map → chunk-UTTTJSQU.cjs.map} +1 -1
  105. package/dist/{chunk-DLBUFHLY.js → chunk-VTTZZ4FN.js} +4 -74
  106. package/dist/chunk-VTTZZ4FN.js.map +1 -0
  107. package/dist/{chunk-5FTIHRZH.cjs → chunk-XVUOMWMD.cjs} +4 -4
  108. package/dist/{chunk-5FTIHRZH.cjs.map → chunk-XVUOMWMD.cjs.map} +1 -1
  109. package/dist/{chunk-3ZYOASAX.js → chunk-Y4ATWQGV.js} +3 -3
  110. package/dist/{chunk-3ZYOASAX.js.map → chunk-Y4ATWQGV.js.map} +1 -1
  111. package/dist/{chunk-444XKG46.js → chunk-YKQ2DPIP.js} +3 -3
  112. package/dist/{chunk-444XKG46.js.map → chunk-YKQ2DPIP.js.map} +1 -1
  113. package/dist/{chunk-HEMU73OP.cjs → chunk-YSHIC4NJ.cjs} +4 -4
  114. package/dist/{chunk-HEMU73OP.cjs.map → chunk-YSHIC4NJ.cjs.map} +1 -1
  115. package/dist/{chunk-5BXEYYH6.js → chunk-ZM26YEOT.js} +3 -3
  116. package/dist/{chunk-5BXEYYH6.js.map → chunk-ZM26YEOT.js.map} +1 -1
  117. package/dist/citations/index.cjs +12 -12
  118. package/dist/citations/index.js +3 -3
  119. package/dist/connect/docx.cjs +36 -7
  120. package/dist/connect/docx.cjs.map +1 -1
  121. package/dist/connect/docx.d.ts +9 -2
  122. package/dist/connect/docx.js +30 -6
  123. package/dist/connect/docx.js.map +1 -1
  124. package/dist/connect/index.cjs +805 -630
  125. package/dist/connect/index.cjs.map +1 -1
  126. package/dist/connect/index.d.ts +2 -0
  127. package/dist/connect/index.js +639 -509
  128. package/dist/connect/index.js.map +1 -1
  129. package/dist/connection/ConnectedSettings.d.ts +3 -2
  130. package/dist/connection/docx/ConnectedNativeDocxComparison.d.ts +5 -0
  131. package/dist/connection/docx/ConnectedNativeDocxEditor.d.ts +16 -0
  132. package/dist/connection/{ConnectedStreamedWordArtifact.d.ts → docx/ConnectedStreamedWordArtifact.d.ts} +1 -1
  133. package/dist/connection/docx/support.d.ts +27 -0
  134. package/dist/connection/docx/useConnectedDocxReferences.d.ts +2 -0
  135. package/dist/connection/docx/useConnectedHouseTemplate.d.ts +2 -0
  136. package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +35 -0
  137. package/dist/connection/settings-page/ConnectedMailSettings.d.ts +13 -0
  138. package/dist/connection/settings-page/ConnectedPremiumModels.d.ts +1 -0
  139. package/dist/connection/settings-page/ConnectedPrivacySettings.d.ts +12 -0
  140. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +29 -0
  141. package/dist/connection/settings-page/SessionStatusIcon.d.ts +7 -0
  142. package/dist/connection/settings-page/index.d.ts +6 -0
  143. package/dist/docx/index.cjs +17 -63
  144. package/dist/docx/index.cjs.map +1 -1
  145. package/dist/docx/index.d.ts +1 -0
  146. package/dist/docx/index.js +2 -64
  147. package/dist/docx/index.js.map +1 -1
  148. package/dist/docx/template/candidates.d.ts +16 -0
  149. package/dist/facts/index.cjs +4 -4
  150. package/dist/facts/index.js +3 -3
  151. package/dist/files/index.cjs +3 -3
  152. package/dist/files/index.js +2 -2
  153. package/dist/home/index.cjs +20 -20
  154. package/dist/home/index.js +4 -4
  155. package/dist/index.cjs +793 -755
  156. package/dist/index.cjs.map +1 -1
  157. package/dist/index.d.ts +2 -0
  158. package/dist/index.js +25 -19
  159. package/dist/index.js.map +1 -1
  160. package/dist/lib/deep-link.d.ts +46 -0
  161. package/dist/lib/sidebar-mode.d.ts +1 -3
  162. package/dist/lib/use-close-on-escape.d.ts +6 -0
  163. package/dist/provider/BlocksProvider.d.ts +5 -1
  164. package/dist/provider/settings-section.d.ts +9 -0
  165. package/dist/retrieval/index.cjs +4 -4
  166. package/dist/retrieval/index.js +2 -2
  167. package/dist/settings/AppearanceSettings.d.ts +18 -0
  168. package/dist/settings/ServerConnectionControls.d.ts +16 -0
  169. package/dist/settings/SettingsPage.d.ts +31 -0
  170. package/dist/settings/index.cjs +189 -251
  171. package/dist/settings/index.cjs.map +1 -1
  172. package/dist/settings/index.d.ts +3 -1
  173. package/dist/settings/index.js +89 -200
  174. package/dist/settings/index.js.map +1 -1
  175. package/dist/shell/ShellSidebar.d.ts +37 -0
  176. package/dist/shell/Sidebar.d.ts +6 -6
  177. package/dist/shell/index.cjs +63 -50
  178. package/dist/shell/index.d.ts +4 -1
  179. package/dist/shell/index.js +5 -4
  180. package/dist/shell/types.d.ts +18 -0
  181. package/dist/shell/use-sidebar-controller.d.ts +59 -0
  182. package/dist/site/index.cjs +74 -73
  183. package/dist/site/index.js +3 -2
  184. package/dist/studio/index.cjs +80 -78
  185. package/dist/studio/index.cjs.map +1 -1
  186. package/dist/studio/index.js +10 -8
  187. package/dist/studio/index.js.map +1 -1
  188. package/dist/workflow-canvas/index.cjs +64 -60
  189. package/dist/workflow-canvas/index.cjs.map +1 -1
  190. package/dist/workflow-canvas/index.js +12 -8
  191. package/dist/workflow-canvas/index.js.map +1 -1
  192. package/dist/workspaces/index.cjs +3 -3
  193. package/dist/workspaces/index.js +2 -2
  194. package/node_modules/@arbidocs/coedit/package.json +1 -1
  195. package/package.json +4 -4
  196. package/dist/chunk-2UUNSHDI.cjs.map +0 -1
  197. package/dist/chunk-4TR5QCCX.cjs +0 -43
  198. package/dist/chunk-4TR5QCCX.cjs.map +0 -1
  199. package/dist/chunk-7NDW4KF4.cjs +0 -112
  200. package/dist/chunk-7NDW4KF4.cjs.map +0 -1
  201. package/dist/chunk-C4WSHRR6.cjs.map +0 -1
  202. package/dist/chunk-CKCBBYTA.js.map +0 -1
  203. package/dist/chunk-CQ4MFKFC.cjs.map +0 -1
  204. package/dist/chunk-DLBUFHLY.js.map +0 -1
  205. package/dist/chunk-ETXYVO6E.js +0 -109
  206. package/dist/chunk-ETXYVO6E.js.map +0 -1
  207. package/dist/chunk-GFRQG36Y.cjs.map +0 -1
  208. package/dist/chunk-GYAUJ4KT.js.map +0 -1
  209. package/dist/chunk-MCKOZACC.js +0 -41
  210. package/dist/chunk-MCKOZACC.js.map +0 -1
  211. package/dist/chunk-MIDXCYZB.cjs.map +0 -1
  212. package/dist/chunk-MJCCBMM5.cjs.map +0 -1
  213. package/dist/chunk-O6W6RW3B.js.map +0 -1
  214. package/dist/chunk-ON3TKY5Y.js.map +0 -1
  215. package/dist/chunk-OWCEQKAR.cjs.map +0 -1
  216. package/dist/chunk-QIMVTGKS.cjs.map +0 -1
  217. package/dist/chunk-S24XEVPS.cjs.map +0 -1
  218. package/dist/chunk-Y5KTM3V5.js.map +0 -1
  219. package/dist/chunk-YFF3GTJQ.js.map +0 -1
  220. package/dist/chunk-YNIBUKV5.js.map +0 -1
  221. package/dist/chunk-YWY2KIX2.js.map +0 -1
  222. package/dist/connection/ConnectedNativeDocxEditor.d.ts +0 -6
@@ -0,0 +1,232 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var lucideReact = require('lucide-react');
6
+ var ui = require('@arbidocs/react/ui');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ // src/settings/MultiSelect.tsx
30
+ var MultiSelect = React__namespace.forwardRef(
31
+ ({
32
+ data,
33
+ value,
34
+ onChange,
35
+ searchValue,
36
+ onSearchChange,
37
+ placeholder = "Select options",
38
+ searchable = false,
39
+ clearable = false,
40
+ size = "md",
41
+ autoFocus = false,
42
+ onDropdownOpen,
43
+ onDropdownClose,
44
+ renderOption,
45
+ animation = 0,
46
+ modalPopover = false,
47
+ className,
48
+ ...props
49
+ }, ref) => {
50
+ const [isPopoverOpen, setIsPopoverOpen] = React__namespace.useState(false);
51
+ const [internalSearchValue, setInternalSearchValue] = React__namespace.useState("");
52
+ const currentSearchValue = searchValue ?? internalSearchValue;
53
+ React__namespace.useEffect(() => {
54
+ if (isPopoverOpen && onDropdownOpen) {
55
+ onDropdownOpen();
56
+ } else if (!isPopoverOpen && onDropdownClose) {
57
+ onDropdownClose();
58
+ }
59
+ }, [isPopoverOpen, onDropdownOpen, onDropdownClose]);
60
+ React__namespace.useEffect(() => {
61
+ if (autoFocus) {
62
+ setIsPopoverOpen(true);
63
+ }
64
+ }, [autoFocus]);
65
+ const handleSearchValueChange = (newValue) => {
66
+ if (onSearchChange) {
67
+ onSearchChange(newValue);
68
+ } else {
69
+ setInternalSearchValue(newValue);
70
+ }
71
+ };
72
+ const getSizeClasses = () => {
73
+ switch (size) {
74
+ case "sm":
75
+ return "min-h-8 text-sm";
76
+ case "lg":
77
+ return "min-h-12 text-base";
78
+ default:
79
+ return "min-h-10 text-sm";
80
+ }
81
+ };
82
+ const handleInputKeyDown = (event) => {
83
+ if (event.key === "Enter") {
84
+ setIsPopoverOpen(true);
85
+ } else if (event.key === "Backspace" && !event.currentTarget.value) {
86
+ const newSelectedValues = [...value];
87
+ newSelectedValues.pop();
88
+ onChange(newSelectedValues);
89
+ }
90
+ };
91
+ const toggleOption = (optionValue) => {
92
+ const newSelectedValues = value.includes(optionValue) ? value.filter((v) => v !== optionValue) : [...value, optionValue];
93
+ onChange(newSelectedValues);
94
+ };
95
+ const handleClear = () => {
96
+ onChange([]);
97
+ };
98
+ const toggleAll = () => {
99
+ if (value.length === data.length) {
100
+ handleClear();
101
+ } else {
102
+ const allValues = data.map((option) => option.value);
103
+ onChange(allValues);
104
+ }
105
+ };
106
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open: isPopoverOpen, onOpenChange: setIsPopoverOpen, modal: modalPopover, children: [
107
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
108
+ ui.Button,
109
+ {
110
+ ref,
111
+ ...props,
112
+ variant: "outline",
113
+ className: ui.cn(
114
+ "flex w-full p-1 rounded-md border h-auto items-center justify-between bg-background hover:bg-accent [&_svg]:pointer-events-auto",
115
+ getSizeClasses(),
116
+ className
117
+ ),
118
+ "data-testid": "multi-select-trigger",
119
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between w-full mx-auto", children: [
120
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground mx-3", children: placeholder }),
121
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 cursor-pointer text-muted-foreground mx-2" })
122
+ ] })
123
+ }
124
+ ) }),
125
+ /* @__PURE__ */ jsxRuntime.jsx(
126
+ ui.PopoverContent,
127
+ {
128
+ className: "w-[var(--radix-popover-trigger-width)] p-0",
129
+ align: "start",
130
+ side: "bottom",
131
+ sideOffset: 4,
132
+ children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: true, children: [
133
+ searchable && /* @__PURE__ */ jsxRuntime.jsx(
134
+ ui.CommandInput,
135
+ {
136
+ placeholder: "Search...",
137
+ value: currentSearchValue,
138
+ onValueChange: handleSearchValueChange,
139
+ onKeyDown: handleInputKeyDown,
140
+ autoFocus
141
+ }
142
+ ),
143
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { children: [
144
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: "No results found." }),
145
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandGroup, { children: [
146
+ /* @__PURE__ */ jsxRuntime.jsxs(
147
+ ui.CommandItem,
148
+ {
149
+ onSelect: toggleAll,
150
+ className: "cursor-pointer",
151
+ "data-testid": "multi-select-all-option",
152
+ children: [
153
+ /* @__PURE__ */ jsxRuntime.jsx(
154
+ "div",
155
+ {
156
+ className: ui.cn(
157
+ "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
158
+ value.length === data.length ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
159
+ ),
160
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" })
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "(Select All)" })
164
+ ]
165
+ },
166
+ "all"
167
+ ),
168
+ data.map((option) => {
169
+ const isSelected = value.includes(option.value);
170
+ return /* @__PURE__ */ jsxRuntime.jsx(
171
+ ui.CommandItem,
172
+ {
173
+ value: option.label,
174
+ onSelect: () => toggleOption(option.value),
175
+ className: "cursor-pointer",
176
+ "data-testid": `multi-select-option-${option.value}`,
177
+ children: renderOption ? renderOption({ option, checked: isSelected }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
178
+ /* @__PURE__ */ jsxRuntime.jsx(
179
+ "div",
180
+ {
181
+ className: ui.cn(
182
+ "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
183
+ isSelected ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
184
+ ),
185
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" })
186
+ }
187
+ ),
188
+ option.icon && /* @__PURE__ */ jsxRuntime.jsx(option.icon, { className: "mr-2 h-4 w-4 text-muted-foreground" }),
189
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
190
+ ] })
191
+ },
192
+ option.value
193
+ );
194
+ })
195
+ ] }),
196
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandSeparator, {}),
197
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
198
+ clearable && value.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
199
+ /* @__PURE__ */ jsxRuntime.jsx(
200
+ ui.CommandItem,
201
+ {
202
+ onSelect: handleClear,
203
+ className: "flex-1 justify-center cursor-pointer",
204
+ "data-testid": "multi-select-clear-button",
205
+ children: "Clear"
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Separator, { orientation: "vertical", className: "flex min-h-6 h-full" })
209
+ ] }),
210
+ /* @__PURE__ */ jsxRuntime.jsx(
211
+ ui.CommandItem,
212
+ {
213
+ onSelect: () => setIsPopoverOpen(false),
214
+ className: "flex-1 justify-center cursor-pointer max-w-full",
215
+ "data-testid": "multi-select-close-button",
216
+ children: "Close"
217
+ }
218
+ )
219
+ ] }) })
220
+ ] })
221
+ ] })
222
+ }
223
+ ),
224
+ animation > 0 && value.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.WandSparkles, { className: "cursor-pointer my-2 text-muted-foreground bg-background w-3 h-3" })
225
+ ] });
226
+ }
227
+ );
228
+ MultiSelect.displayName = "MultiSelect";
229
+
230
+ exports.MultiSelect = MultiSelect;
231
+ //# sourceMappingURL=chunk-RFIBUWLF.cjs.map
232
+ //# sourceMappingURL=chunk-RFIBUWLF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/MultiSelect.tsx"],"names":["React","Popover","jsx","PopoverTrigger","Button","cn","jsxs","ChevronDown","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","CheckIcon","Fragment","CommandSeparator","Separator","WandSparkles"],"mappings":"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","file":"chunk-RFIBUWLF.cjs","sourcesContent":["import * as React from 'react'\nimport { CheckIcon, ChevronDown, WandSparkles } from 'lucide-react'\n\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Separator,\n cn,\n} from '@arbidocs/react/ui'\n\n/**\n * Variants for the multi-select component to handle different styles.\n * Uses class-variance-authority (cva) to define different styles based on \"variant\" prop.\n */\n\n/**\n * Props for MultiSelect component\n */\ninterface MultiSelectProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /**\n * An array of option objects to be displayed in the multi-select component.\n * Each option object has a label, value, and an optional icon.\n */\n data: {\n /** The text to display for the option. */\n label: string\n /** The unique value associated with the option. */\n value: string\n /** Optional icon component to display alongside the option. */\n icon?: React.ComponentType<{ className?: string }>\n }[]\n\n /**\n * Current selected values.\n */\n value: string[]\n\n /**\n * Callback function triggered when the selected values change.\n * Receives an array of the new selected values.\n */\n onChange: (value: string[]) => void\n\n /**\n * Current search value for filtering options.\n */\n searchValue?: string\n\n /**\n * Callback function triggered when the search value changes.\n */\n onSearchChange?: (value: string) => void\n\n /**\n * Placeholder text to be displayed when no values are selected.\n * Optional, defaults to \"Select options\".\n */\n placeholder?: string\n\n /**\n * Whether the component is searchable.\n */\n searchable?: boolean\n\n /**\n * Whether the component is clearable.\n */\n clearable?: boolean\n\n /**\n * Size of the component.\n */\n size?: 'sm' | 'md' | 'lg'\n\n /**\n * Whether the component should auto focus.\n */\n autoFocus?: boolean\n\n /**\n * Callback triggered when dropdown opens.\n */\n onDropdownOpen?: () => void\n\n /**\n * Callback triggered when dropdown closes.\n */\n onDropdownClose?: () => void\n\n /**\n * Custom render function for options.\n */\n renderOption?: (params: {\n option: { label: string; value: string; icon?: React.ComponentType<{ className?: string }> }\n checked: boolean\n }) => React.ReactNode\n\n /**\n * Animation duration in seconds for the visual effects (e.g., bouncing badges).\n * Optional, defaults to 0 (no animation).\n */\n animation?: number\n\n /**\n * Maximum number of items to display. Extra selected items will be summarized.\n * Optional, defaults to 3.\n */\n maxCount?: number\n\n /**\n * The modality of the popover. When set to true, interaction with outside elements\n * will be disabled and only popover content will be visible to screen readers.\n * Optional, defaults to false.\n */\n modalPopover?: boolean\n\n /**\n * If true, renders the multi-select component as a child of another component.\n * Optional, defaults to false.\n */\n asChild?: boolean\n\n /**\n * Additional class names to apply custom styles to the multi-select component.\n * Optional, can be used to add custom styles.\n */\n className?: string\n}\n\nexport const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(\n (\n {\n data,\n value,\n onChange,\n searchValue,\n onSearchChange,\n placeholder = 'Select options',\n searchable = false,\n clearable = false,\n size = 'md',\n autoFocus = false,\n onDropdownOpen,\n onDropdownClose,\n renderOption,\n animation = 0,\n modalPopover = false,\n className,\n ...props\n },\n ref\n ) => {\n const [isPopoverOpen, setIsPopoverOpen] = React.useState(false)\n const [internalSearchValue, setInternalSearchValue] = React.useState('')\n\n const currentSearchValue = searchValue ?? internalSearchValue\n\n React.useEffect(() => {\n if (isPopoverOpen && onDropdownOpen) {\n onDropdownOpen()\n } else if (!isPopoverOpen && onDropdownClose) {\n onDropdownClose()\n }\n }, [isPopoverOpen, onDropdownOpen, onDropdownClose])\n\n // Handle autoFocus - open dropdown immediately when component mounts\n React.useEffect(() => {\n if (autoFocus) {\n setIsPopoverOpen(true)\n }\n }, [autoFocus])\n\n const handleSearchValueChange = (newValue: string) => {\n if (onSearchChange) {\n onSearchChange(newValue)\n } else {\n setInternalSearchValue(newValue)\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm':\n return 'min-h-8 text-sm'\n case 'lg':\n return 'min-h-12 text-base'\n default:\n return 'min-h-10 text-sm'\n }\n }\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n setIsPopoverOpen(true)\n } else if (event.key === 'Backspace' && !event.currentTarget.value) {\n const newSelectedValues = [...value]\n newSelectedValues.pop()\n onChange(newSelectedValues)\n }\n }\n\n const toggleOption = (optionValue: string) => {\n const newSelectedValues = value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue]\n onChange(newSelectedValues)\n }\n\n const handleClear = () => {\n onChange([])\n }\n\n const toggleAll = () => {\n if (value.length === data.length) {\n handleClear()\n } else {\n const allValues = data.map((option) => option.value)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen} modal={modalPopover}>\n <PopoverTrigger asChild>\n <Button\n ref={ref}\n {...props}\n variant=\"outline\"\n className={cn(\n 'flex w-full p-1 rounded-md border h-auto items-center justify-between bg-background hover:bg-accent [&_svg]:pointer-events-auto',\n getSizeClasses(),\n className\n )}\n data-testid=\"multi-select-trigger\"\n >\n <div className=\"flex items-center justify-between w-full mx-auto\">\n <span className=\"text-sm text-muted-foreground mx-3\">{placeholder}</span>\n <ChevronDown className=\"h-4 cursor-pointer text-muted-foreground mx-2\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-[var(--radix-popover-trigger-width)] p-0\"\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n >\n <Command shouldFilter={true}>\n {searchable && (\n <CommandInput\n placeholder=\"Search...\"\n value={currentSearchValue}\n onValueChange={handleSearchValueChange}\n onKeyDown={handleInputKeyDown}\n autoFocus={autoFocus}\n />\n )}\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n <CommandItem\n key=\"all\"\n onSelect={toggleAll}\n className=\"cursor-pointer\"\n data-testid=\"multi-select-all-option\"\n >\n <div\n className={cn(\n 'mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary',\n value.length === data.length\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <CheckIcon className=\"h-4 w-4\" />\n </div>\n <span>(Select All)</span>\n </CommandItem>\n {data.map((option) => {\n const isSelected = value.includes(option.value)\n return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={() => toggleOption(option.value)}\n className=\"cursor-pointer\"\n data-testid={`multi-select-option-${option.value}`}\n >\n {renderOption ? (\n renderOption({ option, checked: isSelected })\n ) : (\n <>\n <div\n className={cn(\n 'mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <CheckIcon className=\"h-4 w-4\" />\n </div>\n {option.icon && (\n <option.icon className=\"mr-2 h-4 w-4 text-muted-foreground\" />\n )}\n <span>{option.label}</span>\n </>\n )}\n </CommandItem>\n )\n })}\n </CommandGroup>\n <CommandSeparator />\n <CommandGroup>\n <div className=\"flex items-center justify-between\">\n {clearable && value.length > 0 && (\n <>\n <CommandItem\n onSelect={handleClear}\n className=\"flex-1 justify-center cursor-pointer\"\n data-testid=\"multi-select-clear-button\"\n >\n Clear\n </CommandItem>\n <Separator orientation=\"vertical\" className=\"flex min-h-6 h-full\" />\n </>\n )}\n <CommandItem\n onSelect={() => setIsPopoverOpen(false)}\n className=\"flex-1 justify-center cursor-pointer max-w-full\"\n data-testid=\"multi-select-close-button\"\n >\n Close\n </CommandItem>\n </div>\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n {animation > 0 && value.length > 0 && (\n <WandSparkles className=\"cursor-pointer my-2 text-muted-foreground bg-background w-3 h-3\" />\n )}\n </Popover>\n )\n }\n)\n\nMultiSelect.displayName = 'MultiSelect'\n"]}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { useState, useRef, useCallback } from 'react';
3
+
4
+ // src/lib/useControllableState.ts
5
+ function useControllableState(value, defaultValue, onChange) {
6
+ const [inner, setInner] = useState(defaultValue);
7
+ const isControlled = value !== void 0;
8
+ const current = isControlled ? value : inner;
9
+ const onChangeRef = useRef(onChange);
10
+ onChangeRef.current = onChange;
11
+ const set = useCallback(
12
+ (next) => {
13
+ if (!isControlled) setInner(next);
14
+ onChangeRef.current?.(next);
15
+ },
16
+ [isControlled]
17
+ );
18
+ return [current, set];
19
+ }
20
+
21
+ export { useControllableState };
22
+ //# sourceMappingURL=chunk-RLWIUUQ5.js.map
23
+ //# sourceMappingURL=chunk-RLWIUUQ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/useControllableState.ts"],"names":[],"mappings":";;;AAMO,SAAS,oBAAA,CACd,KAAA,EACA,YAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAY,YAAY,CAAA;AAClD,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,eAAe,KAAA,GAAQ,KAAA;AACvC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAY;AACX,MAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,IAAI,CAAA;AAChC,MAAA,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AACA,EAAA,OAAO,CAAC,SAAS,GAAG,CAAA;AACtB","file":"chunk-RLWIUUQ5.js","sourcesContent":["import { useCallback, useRef, useState } from 'react'\n\n/**\n * State that is controlled when `value` is passed and uncontrolled (seeded by `defaultValue`)\n * otherwise. `onChange` fires in both modes.\n */\nexport function useControllableState<T>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T) => void\n): [T, (next: T) => void] {\n const [inner, setInner] = useState<T>(defaultValue)\n const isControlled = value !== undefined\n const current = isControlled ? value : inner\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n const set = useCallback(\n (next: T) => {\n if (!isControlled) setInner(next)\n onChangeRef.current?.(next)\n },\n [isControlled]\n )\n return [current, set]\n}\n"]}
@@ -1,32 +1,12 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var React = require('react');
4
+ var react = require('react');
5
5
  var lucideReact = require('lucide-react');
6
6
  var cmdk = require('cmdk');
7
7
  var ui = require('@arbidocs/react/ui');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
10
- function _interopNamespace(e) {
11
- if (e && e.__esModule) return e;
12
- var n = Object.create(null);
13
- if (e) {
14
- Object.keys(e).forEach(function (k) {
15
- if (k !== 'default') {
16
- var d = Object.getOwnPropertyDescriptor(e, k);
17
- Object.defineProperty(n, k, d.get ? d : {
18
- enumerable: true,
19
- get: function () { return e[k]; }
20
- });
21
- }
22
- });
23
- }
24
- n.default = e;
25
- return Object.freeze(n);
26
- }
27
-
28
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
-
30
10
  // src/settings/DocumentPicker.tsx
31
11
  var TOKEN_WARNING_THRESHOLD = 15e4;
32
12
  var TOKEN_DANGER_THRESHOLD = 19e4;
@@ -53,14 +33,14 @@ function DocumentPicker({
53
33
  listClassName,
54
34
  labels
55
35
  }) {
56
- const l = React.useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels]);
36
+ const l = react.useMemo(() => ({ ...DEFAULT_DOCUMENT_PICKER_LABELS, ...labels }), [labels]);
57
37
  const multi = selectedIds !== void 0;
58
38
  const isChosen = (id) => multi ? selectedIds.includes(id) : value === id;
59
- const [open, setOpen] = React.useState(false);
60
- React.useEffect(() => {
39
+ const [open, setOpen] = react.useState(false);
40
+ react.useEffect(() => {
61
41
  if (forceClosed) setOpen(false);
62
42
  }, [forceClosed]);
63
- const anchorRef = React.useRef(null);
43
+ const anchorRef = react.useRef(null);
64
44
  const leadingControl = (id) => onOpenDocument ? (
65
45
  // cmdk selects a row on click and prevents its mousedown (to keep input focus), which would
66
46
  // swallow a checkbox press. Stopping the events lets the checkbox toggle on its own.
@@ -248,11 +228,11 @@ function TriStateFilterMenu({
248
228
  labels
249
229
  }) {
250
230
  const l = { ...DEFAULT_TRI_STATE_FILTER_MENU_LABELS, ...labels };
251
- const [collapsedGroups, setCollapsedGroups] = React.useState(
231
+ const [collapsedGroups, setCollapsedGroups] = react.useState(
252
232
  () => new Set((groups ?? []).filter((g) => g.collapsible).map((g) => g.label))
253
233
  );
254
- const [isClickOpen, setIsClickOpen] = React.useState(false);
255
- const hoverTimeoutRef = React.useRef(null);
234
+ const [isClickOpen, setIsClickOpen] = react.useState(false);
235
+ const hoverTimeoutRef = react.useRef(null);
256
236
  const cancelPendingClose = () => {
257
237
  if (hoverTimeoutRef.current) {
258
238
  clearTimeout(hoverTimeoutRef.current);
@@ -274,11 +254,11 @@ function TriStateFilterMenu({
274
254
  setIsClickOpen(!isClickOpen);
275
255
  onOpenChange(!isClickOpen);
276
256
  };
277
- React.useEffect(() => {
257
+ react.useEffect(() => {
278
258
  onHoverHandlers?.({ onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave });
279
259
  }, []);
280
- React.useEffect(() => cancelPendingClose, []);
281
- const optionMap = React.useMemo(() => new Map(options.map((o) => [o.id, o])), [options]);
260
+ react.useEffect(() => cancelPendingClose, []);
261
+ const optionMap = react.useMemo(() => new Map(options.map((o) => [o.id, o])), [options]);
282
262
  const handleFilterToggle = (filterId) => {
283
263
  const next = new Map(filterStates);
284
264
  const current = next.get(filterId) ?? null;
@@ -304,7 +284,7 @@ function TriStateFilterMenu({
304
284
  ]
305
285
  }
306
286
  );
307
- const hasActiveFilters = React.useMemo(() => {
287
+ const hasActiveFilters = react.useMemo(() => {
308
288
  const ids = new Set(options.map((o) => o.id));
309
289
  return hasExternalActiveState || Array.from(filterStates.entries()).some(([k, v]) => ids.has(k) && v !== null);
310
290
  }, [filterStates, options, hasExternalActiveState]);
@@ -355,7 +335,7 @@ function TriStateFilterMenu({
355
335
  return groups.map((group, groupIndex) => {
356
336
  const isCollapsed = !!group.collapsible && collapsedGroups.has(group.label);
357
337
  const activeCount = group.collapsible ? group.options.filter((id) => filterStates.get(id) !== null).length : 0;
358
- return /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
338
+ return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
359
339
  groupIndex > 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuSeparator, {}),
360
340
  groupTopContent?.[group.label] && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
361
341
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1.5", children: groupTopContent[group.label] }),
@@ -473,210 +453,10 @@ function TriStateFilterMenu({
473
453
  }
474
454
  );
475
455
  }
476
- var MultiSelect = React__namespace.forwardRef(
477
- ({
478
- data,
479
- value,
480
- onChange,
481
- searchValue,
482
- onSearchChange,
483
- placeholder = "Select options",
484
- searchable = false,
485
- clearable = false,
486
- size = "md",
487
- autoFocus = false,
488
- onDropdownOpen,
489
- onDropdownClose,
490
- renderOption,
491
- animation = 0,
492
- modalPopover = false,
493
- className,
494
- ...props
495
- }, ref) => {
496
- const [isPopoverOpen, setIsPopoverOpen] = React__namespace.useState(false);
497
- const [internalSearchValue, setInternalSearchValue] = React__namespace.useState("");
498
- const currentSearchValue = searchValue ?? internalSearchValue;
499
- React__namespace.useEffect(() => {
500
- if (isPopoverOpen && onDropdownOpen) {
501
- onDropdownOpen();
502
- } else if (!isPopoverOpen && onDropdownClose) {
503
- onDropdownClose();
504
- }
505
- }, [isPopoverOpen, onDropdownOpen, onDropdownClose]);
506
- React__namespace.useEffect(() => {
507
- if (autoFocus) {
508
- setIsPopoverOpen(true);
509
- }
510
- }, [autoFocus]);
511
- const handleSearchValueChange = (newValue) => {
512
- if (onSearchChange) {
513
- onSearchChange(newValue);
514
- } else {
515
- setInternalSearchValue(newValue);
516
- }
517
- };
518
- const getSizeClasses = () => {
519
- switch (size) {
520
- case "sm":
521
- return "min-h-8 text-sm";
522
- case "lg":
523
- return "min-h-12 text-base";
524
- default:
525
- return "min-h-10 text-sm";
526
- }
527
- };
528
- const handleInputKeyDown = (event) => {
529
- if (event.key === "Enter") {
530
- setIsPopoverOpen(true);
531
- } else if (event.key === "Backspace" && !event.currentTarget.value) {
532
- const newSelectedValues = [...value];
533
- newSelectedValues.pop();
534
- onChange(newSelectedValues);
535
- }
536
- };
537
- const toggleOption = (optionValue) => {
538
- const newSelectedValues = value.includes(optionValue) ? value.filter((v) => v !== optionValue) : [...value, optionValue];
539
- onChange(newSelectedValues);
540
- };
541
- const handleClear = () => {
542
- onChange([]);
543
- };
544
- const toggleAll = () => {
545
- if (value.length === data.length) {
546
- handleClear();
547
- } else {
548
- const allValues = data.map((option) => option.value);
549
- onChange(allValues);
550
- }
551
- };
552
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open: isPopoverOpen, onOpenChange: setIsPopoverOpen, modal: modalPopover, children: [
553
- /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
554
- ui.Button,
555
- {
556
- ref,
557
- ...props,
558
- variant: "outline",
559
- className: ui.cn(
560
- "flex w-full p-1 rounded-md border h-auto items-center justify-between bg-background hover:bg-accent [&_svg]:pointer-events-auto",
561
- getSizeClasses(),
562
- className
563
- ),
564
- "data-testid": "multi-select-trigger",
565
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between w-full mx-auto", children: [
566
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground mx-3", children: placeholder }),
567
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 cursor-pointer text-muted-foreground mx-2" })
568
- ] })
569
- }
570
- ) }),
571
- /* @__PURE__ */ jsxRuntime.jsx(
572
- ui.PopoverContent,
573
- {
574
- className: "w-[var(--radix-popover-trigger-width)] p-0",
575
- align: "start",
576
- side: "bottom",
577
- sideOffset: 4,
578
- children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: true, children: [
579
- searchable && /* @__PURE__ */ jsxRuntime.jsx(
580
- ui.CommandInput,
581
- {
582
- placeholder: "Search...",
583
- value: currentSearchValue,
584
- onValueChange: handleSearchValueChange,
585
- onKeyDown: handleInputKeyDown,
586
- autoFocus
587
- }
588
- ),
589
- /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { children: [
590
- /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: "No results found." }),
591
- /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandGroup, { children: [
592
- /* @__PURE__ */ jsxRuntime.jsxs(
593
- ui.CommandItem,
594
- {
595
- onSelect: toggleAll,
596
- className: "cursor-pointer",
597
- "data-testid": "multi-select-all-option",
598
- children: [
599
- /* @__PURE__ */ jsxRuntime.jsx(
600
- "div",
601
- {
602
- className: ui.cn(
603
- "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
604
- value.length === data.length ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
605
- ),
606
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" })
607
- }
608
- ),
609
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "(Select All)" })
610
- ]
611
- },
612
- "all"
613
- ),
614
- data.map((option) => {
615
- const isSelected = value.includes(option.value);
616
- return /* @__PURE__ */ jsxRuntime.jsx(
617
- ui.CommandItem,
618
- {
619
- value: option.label,
620
- onSelect: () => toggleOption(option.value),
621
- className: "cursor-pointer",
622
- "data-testid": `multi-select-option-${option.value}`,
623
- children: renderOption ? renderOption({ option, checked: isSelected }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
624
- /* @__PURE__ */ jsxRuntime.jsx(
625
- "div",
626
- {
627
- className: ui.cn(
628
- "mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
629
- isSelected ? "bg-primary text-primary-foreground" : "opacity-50 [&_svg]:invisible"
630
- ),
631
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "h-4 w-4" })
632
- }
633
- ),
634
- option.icon && /* @__PURE__ */ jsxRuntime.jsx(option.icon, { className: "mr-2 h-4 w-4 text-muted-foreground" }),
635
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
636
- ] })
637
- },
638
- option.value
639
- );
640
- })
641
- ] }),
642
- /* @__PURE__ */ jsxRuntime.jsx(ui.CommandSeparator, {}),
643
- /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
644
- clearable && value.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
645
- /* @__PURE__ */ jsxRuntime.jsx(
646
- ui.CommandItem,
647
- {
648
- onSelect: handleClear,
649
- className: "flex-1 justify-center cursor-pointer",
650
- "data-testid": "multi-select-clear-button",
651
- children: "Clear"
652
- }
653
- ),
654
- /* @__PURE__ */ jsxRuntime.jsx(ui.Separator, { orientation: "vertical", className: "flex min-h-6 h-full" })
655
- ] }),
656
- /* @__PURE__ */ jsxRuntime.jsx(
657
- ui.CommandItem,
658
- {
659
- onSelect: () => setIsPopoverOpen(false),
660
- className: "flex-1 justify-center cursor-pointer max-w-full",
661
- "data-testid": "multi-select-close-button",
662
- children: "Close"
663
- }
664
- )
665
- ] }) })
666
- ] })
667
- ] })
668
- }
669
- ),
670
- animation > 0 && value.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.WandSparkles, { className: "cursor-pointer my-2 text-muted-foreground bg-background w-3 h-3" })
671
- ] });
672
- }
673
- );
674
- MultiSelect.displayName = "MultiSelect";
675
456
 
676
457
  exports.DEFAULT_DOCUMENT_PICKER_LABELS = DEFAULT_DOCUMENT_PICKER_LABELS;
677
458
  exports.DEFAULT_TRI_STATE_FILTER_MENU_LABELS = DEFAULT_TRI_STATE_FILTER_MENU_LABELS;
678
459
  exports.DocumentPicker = DocumentPicker;
679
- exports.MultiSelect = MultiSelect;
680
460
  exports.TriStateFilterMenu = TriStateFilterMenu;
681
- //# sourceMappingURL=chunk-MIDXCYZB.cjs.map
682
- //# sourceMappingURL=chunk-MIDXCYZB.cjs.map
461
+ //# sourceMappingURL=chunk-RQ2Y7USX.cjs.map
462
+ //# sourceMappingURL=chunk-RQ2Y7USX.cjs.map