@rebasepro/ui 0.24.0 → 0.24.1-canary.gcb918fc

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 (241) hide show
  1. package/dist/components/Alert.d.ts +6 -0
  2. package/dist/components/Alert.es.js +82 -0
  3. package/dist/components/Alert.es.js.map +1 -0
  4. package/dist/components/Autocomplete.es.js +53 -0
  5. package/dist/components/Autocomplete.es.js.map +1 -0
  6. package/dist/components/Avatar.d.ts +3 -1
  7. package/dist/components/Avatar.es.js +37 -0
  8. package/dist/components/Avatar.es.js.map +1 -0
  9. package/dist/components/Badge.es.js +27 -0
  10. package/dist/components/Badge.es.js.map +1 -0
  11. package/dist/components/BooleanSwitch.es.js +75 -0
  12. package/dist/components/BooleanSwitch.es.js.map +1 -0
  13. package/dist/components/BooleanSwitchWithLabel.es.js +55 -0
  14. package/dist/components/BooleanSwitchWithLabel.es.js.map +1 -0
  15. package/dist/components/Button.es.js +58 -0
  16. package/dist/components/Button.es.js.map +1 -0
  17. package/dist/components/Card.es.js +26 -0
  18. package/dist/components/Card.es.js.map +1 -0
  19. package/dist/components/CenteredView.es.js +23 -0
  20. package/dist/components/CenteredView.es.js.map +1 -0
  21. package/dist/components/Checkbox.es.js +62 -0
  22. package/dist/components/Checkbox.es.js.map +1 -0
  23. package/dist/components/Chip.es.js +72 -0
  24. package/dist/components/Chip.es.js.map +1 -0
  25. package/dist/components/CircularProgress.es.js +28 -0
  26. package/dist/components/CircularProgress.es.js.map +1 -0
  27. package/dist/components/CircularProgressCenter.es.js +30 -0
  28. package/dist/components/CircularProgressCenter.es.js.map +1 -0
  29. package/dist/components/Collapse.es.js +57 -0
  30. package/dist/components/Collapse.es.js.map +1 -0
  31. package/dist/components/ColorPicker.es.js +89 -0
  32. package/dist/components/ColorPicker.es.js.map +1 -0
  33. package/dist/components/Container.es.js +31 -0
  34. package/dist/components/Container.es.js.map +1 -0
  35. package/dist/components/DateTimeField.d.ts +11 -1
  36. package/dist/components/DateTimeField.es.js +253 -0
  37. package/dist/components/DateTimeField.es.js.map +1 -0
  38. package/dist/components/DebouncedTextField.es.js +93 -0
  39. package/dist/components/DebouncedTextField.es.js.map +1 -0
  40. package/dist/components/Dialog.es.js +98 -0
  41. package/dist/components/Dialog.es.js.map +1 -0
  42. package/dist/components/DialogActions.es.js +15 -0
  43. package/dist/components/DialogActions.es.js.map +1 -0
  44. package/dist/components/DialogContent.es.js +18 -0
  45. package/dist/components/DialogContent.es.js.map +1 -0
  46. package/dist/components/DialogTitle.es.js +26 -0
  47. package/dist/components/DialogTitle.es.js.map +1 -0
  48. package/dist/components/ErrorBoundary.es.js +158 -0
  49. package/dist/components/ErrorBoundary.es.js.map +1 -0
  50. package/dist/components/ExpandablePanel.es.js +91 -0
  51. package/dist/components/ExpandablePanel.es.js.map +1 -0
  52. package/dist/components/FileUpload.es.js +58 -0
  53. package/dist/components/FileUpload.es.js.map +1 -0
  54. package/dist/components/FilterChip.es.js +31 -0
  55. package/dist/components/FilterChip.es.js.map +1 -0
  56. package/dist/components/IconButton.es.js +52 -0
  57. package/dist/components/IconButton.es.js.map +1 -0
  58. package/dist/components/InfoLabel.es.js +18 -0
  59. package/dist/components/InfoLabel.es.js.map +1 -0
  60. package/dist/components/InputLabel.es.js +27 -0
  61. package/dist/components/InputLabel.es.js.map +1 -0
  62. package/dist/components/Label.es.js +18 -0
  63. package/dist/components/Label.es.js.map +1 -0
  64. package/dist/components/LoadingButton.es.js +21 -0
  65. package/dist/components/LoadingButton.es.js.map +1 -0
  66. package/dist/components/Markdown.es.js +88 -0
  67. package/dist/components/Markdown.es.js.map +1 -0
  68. package/dist/components/Menu.es.js +46 -0
  69. package/dist/components/Menu.es.js.map +1 -0
  70. package/dist/components/Menubar.es.js +142 -0
  71. package/dist/components/Menubar.es.js.map +1 -0
  72. package/dist/components/MultiSelect.d.ts +1 -7
  73. package/dist/components/MultiSelect.es.js +271 -0
  74. package/dist/components/MultiSelect.es.js.map +1 -0
  75. package/dist/components/Paper.es.js +16 -0
  76. package/dist/components/Paper.es.js.map +1 -0
  77. package/dist/components/Popover.es.js +113 -0
  78. package/dist/components/Popover.es.js.map +1 -0
  79. package/dist/components/RadioGroup.es.js +30 -0
  80. package/dist/components/RadioGroup.es.js.map +1 -0
  81. package/dist/components/ResizablePanels.d.ts +3 -1
  82. package/dist/components/ResizablePanels.es.js +137 -0
  83. package/dist/components/ResizablePanels.es.js.map +1 -0
  84. package/dist/components/SearchBar.es.js +82 -0
  85. package/dist/components/SearchBar.es.js.map +1 -0
  86. package/dist/components/Select.d.ts +8 -1
  87. package/dist/components/Select.es.js +300 -0
  88. package/dist/components/Select.es.js.map +1 -0
  89. package/dist/components/Separator.es.js +20 -0
  90. package/dist/components/Separator.es.js.map +1 -0
  91. package/dist/components/Sheet.es.js +73 -0
  92. package/dist/components/Sheet.es.js.map +1 -0
  93. package/dist/components/Skeleton.es.js +33 -0
  94. package/dist/components/Skeleton.es.js.map +1 -0
  95. package/dist/components/Slider.es.js +56 -0
  96. package/dist/components/Slider.es.js.map +1 -0
  97. package/dist/components/Table.d.ts +18 -3
  98. package/dist/components/Table.es.js +69 -0
  99. package/dist/components/Table.es.js.map +1 -0
  100. package/dist/components/Tabs.es.js +101 -0
  101. package/dist/components/Tabs.es.js.map +1 -0
  102. package/dist/components/TextField.d.ts +0 -8
  103. package/dist/components/TextField.es.js +111 -0
  104. package/dist/components/TextField.es.js.map +1 -0
  105. package/dist/components/TextareaAutosize.es.js +187 -0
  106. package/dist/components/TextareaAutosize.es.js.map +1 -0
  107. package/dist/components/ToggleButtonGroup.d.ts +6 -1
  108. package/dist/components/ToggleButtonGroup.es.js +35 -0
  109. package/dist/components/ToggleButtonGroup.es.js.map +1 -0
  110. package/dist/components/Tooltip.d.ts +24 -0
  111. package/dist/components/Tooltip.es.js +165 -0
  112. package/dist/components/Tooltip.es.js.map +1 -0
  113. package/dist/components/Typography.es.js +85 -0
  114. package/dist/components/Typography.es.js.map +1 -0
  115. package/dist/components/VirtualTable/VirtualTable.es.js +516 -0
  116. package/dist/components/VirtualTable/VirtualTable.es.js.map +1 -0
  117. package/dist/components/VirtualTable/VirtualTableCell.d.ts +1 -1
  118. package/dist/components/VirtualTable/VirtualTableCell.es.js +40 -0
  119. package/dist/components/VirtualTable/VirtualTableCell.es.js.map +1 -0
  120. package/dist/components/VirtualTable/VirtualTableHeader.es.js +209 -0
  121. package/dist/components/VirtualTable/VirtualTableHeader.es.js.map +1 -0
  122. package/dist/components/VirtualTable/VirtualTableHeaderRow.es.js +166 -0
  123. package/dist/components/VirtualTable/VirtualTableHeaderRow.es.js.map +1 -0
  124. package/dist/components/VirtualTable/VirtualTableProps.d.ts +13 -2
  125. package/dist/components/VirtualTable/VirtualTableRow.d.ts +6 -7
  126. package/dist/components/VirtualTable/VirtualTableRow.es.js +41 -0
  127. package/dist/components/VirtualTable/VirtualTableRow.es.js.map +1 -0
  128. package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +2 -1
  129. package/dist/components/VirtualTable/fields/VirtualTableDateField.es.js +71 -0
  130. package/dist/components/VirtualTable/fields/VirtualTableDateField.es.js.map +1 -0
  131. package/dist/components/VirtualTable/fields/VirtualTableInput.es.js +73 -0
  132. package/dist/components/VirtualTable/fields/VirtualTableInput.es.js.map +1 -0
  133. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.es.js +47 -0
  134. package/dist/components/VirtualTable/fields/VirtualTableNumberInput.es.js.map +1 -0
  135. package/dist/components/VirtualTable/fields/VirtualTableSelect.es.js +83 -0
  136. package/dist/components/VirtualTable/fields/VirtualTableSelect.es.js.map +1 -0
  137. package/dist/components/VirtualTable/fields/VirtualTableSwitch.es.js +22 -0
  138. package/dist/components/VirtualTable/fields/VirtualTableSwitch.es.js.map +1 -0
  139. package/dist/components/VirtualTable/selection/SelectionContext.es.js +23 -0
  140. package/dist/components/VirtualTable/selection/SelectionContext.es.js.map +1 -0
  141. package/dist/components/VirtualTable/selection/SelectionStore.es.js +43 -0
  142. package/dist/components/VirtualTable/selection/SelectionStore.es.js.map +1 -0
  143. package/dist/components/VirtualTable/types.d.ts +1 -1
  144. package/dist/components/common/SelectInputLabel.es.js +28 -0
  145. package/dist/components/common/SelectInputLabel.es.js.map +1 -0
  146. package/dist/components/index.es.js +64 -0
  147. package/dist/hooks/PortalContainerContext.es.js +40 -0
  148. package/dist/hooks/PortalContainerContext.es.js.map +1 -0
  149. package/dist/hooks/UiLabelsContext.d.ts +63 -0
  150. package/dist/hooks/UiLabelsContext.es.js +59 -0
  151. package/dist/hooks/UiLabelsContext.es.js.map +1 -0
  152. package/dist/hooks/useDebounceCallback.es.js +15 -0
  153. package/dist/hooks/useDebounceCallback.es.js.map +1 -0
  154. package/dist/hooks/useDebounceValue.es.js +19 -0
  155. package/dist/hooks/useDebounceValue.es.js.map +1 -0
  156. package/dist/hooks/useDebouncedCallback.es.js +36 -0
  157. package/dist/hooks/useDebouncedCallback.es.js.map +1 -0
  158. package/dist/hooks/useInjectStyles.es.js +27 -0
  159. package/dist/hooks/useInjectStyles.es.js.map +1 -0
  160. package/dist/hooks/useIsDarkMode.es.js +61 -0
  161. package/dist/hooks/useIsDarkMode.es.js.map +1 -0
  162. package/dist/hooks/useModalFocus.es.js +81 -0
  163. package/dist/hooks/useModalFocus.es.js.map +1 -0
  164. package/dist/hooks/useOutsideAlerter.es.js +41 -0
  165. package/dist/hooks/useOutsideAlerter.es.js.map +1 -0
  166. package/dist/hooks/useRestoreInterruptedFocus.es.js +61 -0
  167. package/dist/hooks/useRestoreInterruptedFocus.es.js.map +1 -0
  168. package/dist/icons/GitHubIcon.es.js +23 -0
  169. package/dist/icons/GitHubIcon.es.js.map +1 -0
  170. package/dist/icons/HandleIcon.es.js +60 -0
  171. package/dist/icons/HandleIcon.es.js.map +1 -0
  172. package/dist/icons/Icon.es.js +25 -0
  173. package/dist/icons/Icon.es.js.map +1 -0
  174. package/dist/icons/LucideIconByName.d.ts +12 -9
  175. package/dist/icons/LucideIconByName.es.js +83 -0
  176. package/dist/icons/LucideIconByName.es.js.map +1 -0
  177. package/dist/icons/cool_icon_keys.es.js +55 -0
  178. package/dist/icons/cool_icon_keys.es.js.map +1 -0
  179. package/dist/icons/icon_keys.es.js +1941 -0
  180. package/dist/icons/icon_keys.es.js.map +1 -0
  181. package/dist/icons/index.d.ts +4 -3
  182. package/dist/icons/index.es.js +8 -0
  183. package/dist/icons/lucide_icon_map.d.ts +12 -0
  184. package/dist/icons/lucide_icon_map.es.js +2 -0
  185. package/dist/index.d.ts +2 -0
  186. package/dist/index.es.js +87 -9563
  187. package/dist/styles.es.js +158 -0
  188. package/dist/styles.es.js.map +1 -0
  189. package/dist/util/chip_colors.es.js +290 -0
  190. package/dist/util/chip_colors.es.js.map +1 -0
  191. package/dist/util/cls.es.js +10 -0
  192. package/dist/util/cls.es.js.map +1 -0
  193. package/dist/util/debounce.es.js +22 -0
  194. package/dist/util/debounce.es.js.map +1 -0
  195. package/dist/util/hash.es.js +16 -0
  196. package/dist/util/hash.es.js.map +1 -0
  197. package/dist/util/keys.es.js +37 -0
  198. package/dist/util/keys.es.js.map +1 -0
  199. package/dist/util/lazy_chunk.es.js +96 -0
  200. package/dist/util/lazy_chunk.es.js.map +1 -0
  201. package/dist/views/CardView.d.ts +26 -2
  202. package/dist/views/CardView.es.js +435 -0
  203. package/dist/views/CardView.es.js.map +1 -0
  204. package/dist/views/CollectionView/CollectionCardView.es.js +179 -0
  205. package/dist/views/CollectionView/CollectionCardView.es.js.map +1 -0
  206. package/dist/views/CollectionView/CollectionKanbanView.es.js +172 -0
  207. package/dist/views/CollectionView/CollectionKanbanView.es.js.map +1 -0
  208. package/dist/views/CollectionView/CollectionListView.es.js +156 -0
  209. package/dist/views/CollectionView/CollectionListView.es.js.map +1 -0
  210. package/dist/views/CollectionView/CollectionTableView.es.js +149 -0
  211. package/dist/views/CollectionView/CollectionTableView.es.js.map +1 -0
  212. package/dist/views/CollectionView/CollectionView.es.js +197 -0
  213. package/dist/views/CollectionView/CollectionView.es.js.map +1 -0
  214. package/dist/views/CollectionView/CollectionViewToolbar.es.js +155 -0
  215. package/dist/views/CollectionView/CollectionViewToolbar.es.js.map +1 -0
  216. package/dist/views/CollectionView/DefaultCellRenderer.es.js +302 -0
  217. package/dist/views/CollectionView/DefaultCellRenderer.es.js.map +1 -0
  218. package/dist/views/CollectionView/resolveTitleProperty.es.js +56 -0
  219. package/dist/views/CollectionView/resolveTitleProperty.es.js.map +1 -0
  220. package/dist/views/CollectionView/utils.es.js +19 -0
  221. package/dist/views/CollectionView/utils.es.js.map +1 -0
  222. package/dist/views/Kanban/Board.es.js +237 -0
  223. package/dist/views/Kanban/Board.es.js.map +1 -0
  224. package/dist/views/Kanban/BoardColumn.es.js +81 -0
  225. package/dist/views/Kanban/BoardColumn.es.js.map +1 -0
  226. package/dist/views/Kanban/BoardColumnTitle.es.js +27 -0
  227. package/dist/views/Kanban/BoardColumnTitle.es.js.map +1 -0
  228. package/dist/views/Kanban/BoardSortableList.es.js +98 -0
  229. package/dist/views/Kanban/BoardSortableList.es.js.map +1 -0
  230. package/dist/views/Kanban/placement.es.js +27 -0
  231. package/dist/views/Kanban/placement.es.js.map +1 -0
  232. package/dist/views/KanbanView.es.js +11 -0
  233. package/dist/views/KanbanView.es.js.map +1 -0
  234. package/dist/views/ListView.d.ts +15 -2
  235. package/dist/views/ListView.es.js +245 -0
  236. package/dist/views/ListView.es.js.map +1 -0
  237. package/dist/views/useScrollParentRestoration.d.ts +8 -1
  238. package/dist/views/useScrollParentRestoration.es.js +75 -0
  239. package/dist/views/useScrollParentRestoration.es.js.map +1 -0
  240. package/package.json +2 -2
  241. package/dist/index.es.js.map +0 -1
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { cls } from "../util/cls.es.js";
3
+ import { loadChunk } from "../util/lazy_chunk.es.js";
4
+ import React, { useEffect, useMemo, useSyncExternalStore } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { deepEqual } from "fast-equals";
7
+ //#region src/components/Markdown.tsx
8
+ var proseClasses = {
9
+ small: "prose prose-sm typography-body2",
10
+ medium: "prose typography-body1",
11
+ large: "prose prose-lg",
12
+ xl: "prose prose-xl",
13
+ "2xl": "prose prose-2xl"
14
+ };
15
+ /**
16
+ * Tailwind typography-plugin weight overrides.
17
+ * The plugin defaults to very heavy weights (h1: 800, h2: 700, h3/h4: 600,
18
+ * strong: 600, code: 600) which clash with the Rebase design-system that uses
19
+ * font-light (300) / font-normal (400) for headings.
20
+ * We reset them here so rendered markdown matches the rest of the UI.
21
+ */
22
+ var proseWeightOverrides = [
23
+ "prose-headings:font-normal",
24
+ "prose-strong:font-semibold",
25
+ "prose-code:font-normal",
26
+ "prose-blockquote:font-normal",
27
+ "prose-a:font-normal"
28
+ ].join(" ");
29
+ /**
30
+ * The parser, fetched the first time a `Markdown` mounts and shared after that.
31
+ *
32
+ * markdown-it and its dependencies are ~100 kB minified (44 kB gzipped), and
33
+ * every admin evaluates this module on boot — the login screen included —
34
+ * while only markdown cells and previews ever render one. A static import put
35
+ * all of it in the chunk the login screen preloads. So it is imported on
36
+ * demand; until it lands, `Markdown` shows its source as plain text in the
37
+ * same container. Once loaded it is reused for the session, and every later
38
+ * render is synchronous.
39
+ *
40
+ * Read through `useSyncExternalStore` with an empty server snapshot, so a
41
+ * server render and the hydration that follows it both show the plain text,
42
+ * whatever the server process had loaded before.
43
+ */
44
+ var md;
45
+ var loading;
46
+ var parserListeners = /* @__PURE__ */ new Set();
47
+ function loadParser() {
48
+ loading ??= loadChunk(() => import("markdown-it")).then(({ default: MarkdownItParser }) => {
49
+ md = new MarkdownItParser({ html: false });
50
+ parserListeners.forEach((listener) => listener());
51
+ return md;
52
+ }, (error) => {
53
+ loading = void 0;
54
+ throw error;
55
+ });
56
+ return loading;
57
+ }
58
+ function subscribeToParser(listener) {
59
+ parserListeners.add(listener);
60
+ return () => parserListeners.delete(listener);
61
+ }
62
+ var loadedParser = () => md;
63
+ var noParserOnTheServer = () => void 0;
64
+ /**
65
+ * @group Preview components
66
+ */
67
+ var Markdown = React.memo(function Markdown({ source, className, size = "medium" }) {
68
+ const parser = useSyncExternalStore(subscribeToParser, loadedParser, noParserOnTheServer);
69
+ const text = typeof source === "string" ? source : "";
70
+ useEffect(() => {
71
+ if (parser) return;
72
+ loadParser().catch((error) => console.error("[rebase] could not load the markdown renderer", error));
73
+ }, [parser]);
74
+ const html = useMemo(() => parser?.render(text), [parser, text]);
75
+ const classes = cls(proseClasses[size], "dark:prose-invert prose-headings:font-title", proseWeightOverrides, className);
76
+ if (html === void 0) return /* @__PURE__ */ jsx("div", {
77
+ className: cls(classes, "whitespace-pre-line"),
78
+ children: text
79
+ });
80
+ return /* @__PURE__ */ jsx("div", {
81
+ className: classes,
82
+ dangerouslySetInnerHTML: { __html: html }
83
+ });
84
+ }, deepEqual);
85
+ //#endregion
86
+ export { Markdown };
87
+
88
+ //# sourceMappingURL=Markdown.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.es.js","names":[],"sources":["../../src/components/Markdown.tsx"],"sourcesContent":["\"use client\";\nimport React, { useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport { deepEqual as equal } from \"fast-equals\"\n\nimport type MarkdownIt from \"markdown-it\";\nimport { cls } from \"../util\";\nimport { loadChunk } from \"../util/lazy_chunk\";\n\nexport interface MarkdownProps {\n source: string,\n size?: \"small\" | \"medium\" | \"large\" | \"xl\" | \"2xl\";\n className?: string\n}\n\nconst proseClasses = {\n small: \"prose prose-sm typography-body2\",\n medium: \"prose typography-body1\",\n large: \"prose prose-lg\",\n xl: \"prose prose-xl\",\n \"2xl\": \"prose prose-2xl\"\n};\n\n/**\n * Tailwind typography-plugin weight overrides.\n * The plugin defaults to very heavy weights (h1: 800, h2: 700, h3/h4: 600,\n * strong: 600, code: 600) which clash with the Rebase design-system that uses\n * font-light (300) / font-normal (400) for headings.\n * We reset them here so rendered markdown matches the rest of the UI.\n */\nconst proseWeightOverrides = [\n \"prose-headings:font-normal\",\n \"prose-strong:font-semibold\",\n \"prose-code:font-normal\",\n \"prose-blockquote:font-normal\",\n \"prose-a:font-normal\"\n].join(\" \");\n\n/**\n * The parser, fetched the first time a `Markdown` mounts and shared after that.\n *\n * markdown-it and its dependencies are ~100 kB minified (44 kB gzipped), and\n * every admin evaluates this module on boot — the login screen included —\n * while only markdown cells and previews ever render one. A static import put\n * all of it in the chunk the login screen preloads. So it is imported on\n * demand; until it lands, `Markdown` shows its source as plain text in the\n * same container. Once loaded it is reused for the session, and every later\n * render is synchronous.\n *\n * Read through `useSyncExternalStore` with an empty server snapshot, so a\n * server render and the hydration that follows it both show the plain text,\n * whatever the server process had loaded before.\n */\nlet md: MarkdownIt | undefined;\nlet loading: Promise<MarkdownIt> | undefined;\nconst parserListeners = new Set<() => void>();\n\nfunction loadParser(): Promise<MarkdownIt> {\n loading ??= loadChunk(() => import(\"markdown-it\")).then(({ default: MarkdownItParser }) => {\n md = new MarkdownItParser({ html: false });\n parserListeners.forEach(listener => listener());\n return md;\n }, (error: unknown) => {\n // The next `Markdown` to mount tries again; this one stays plain text.\n loading = undefined;\n throw error;\n });\n return loading;\n}\n\nfunction subscribeToParser(listener: () => void): () => void {\n parserListeners.add(listener);\n return () => parserListeners.delete(listener);\n}\n\nconst loadedParser = () => md;\nconst noParserOnTheServer = () => undefined;\n\n/**\n * @group Preview components\n */\nexport const Markdown = React.memo<MarkdownProps>(function Markdown({\n source,\n className,\n size = \"medium\"\n }: MarkdownProps) {\n const parser = useSyncExternalStore(subscribeToParser, loadedParser, noParserOnTheServer);\n const text = typeof source === \"string\" ? source : \"\";\n\n useEffect(() => {\n if (parser) return;\n loadParser().catch(error => console.error(\"[rebase] could not load the markdown renderer\", error));\n }, [parser]);\n\n const html = useMemo(() => parser?.render(text), [parser, text]);\n const classes = cls(proseClasses[size], \"dark:prose-invert prose-headings:font-title\", proseWeightOverrides, className);\n\n if (html === undefined) {\n // Until the parser arrives: the source as text, line breaks kept,\n // in the same box, so the space the rendered markdown takes is\n // roughly held and nothing is hidden.\n return <div className={cls(classes, \"whitespace-pre-line\")}>{text}</div>;\n }\n\n return <div\n className={classes}\n dangerouslySetInnerHTML={{ __html: html }}\n />;\n }\n , equal) as React.FunctionComponent<MarkdownProps>;\n"],"mappings":";;;;;;;AAcA,IAAM,eAAe;CACjB,OAAO;CACP,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,OAAO;AACX;;;;;;;;AASA,IAAM,uBAAuB;CACzB;CACA;CACA;CACA;CACA;AACJ,CAAC,CAAC,KAAK,GAAG;;;;;;;;;;;;;;;;AAiBV,IAAI;AACJ,IAAI;AACJ,IAAM,kCAAkB,IAAI,IAAgB;AAE5C,SAAS,aAAkC;CACvC,YAAY,gBAAgB,OAAO,cAAc,CAAC,CAAC,MAAM,EAAE,SAAS,uBAAuB;EACvF,KAAK,IAAI,iBAAiB,EAAE,MAAM,MAAM,CAAC;EACzC,gBAAgB,SAAQ,aAAY,SAAS,CAAC;EAC9C,OAAO;CACX,IAAI,UAAmB;EAEnB,UAAU,KAAA;EACV,MAAM;CACV,CAAC;CACD,OAAO;AACX;AAEA,SAAS,kBAAkB,UAAkC;CACzD,gBAAgB,IAAI,QAAQ;CAC5B,aAAa,gBAAgB,OAAO,QAAQ;AAChD;AAEA,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B,KAAA;;;;AAKlC,IAAa,WAAW,MAAM,KAAoB,SAAS,SAAS,EACI,QACA,WACA,OAAO,YACO;CAC9E,MAAM,SAAS,qBAAqB,mBAAmB,cAAc,mBAAmB;CACxF,MAAM,OAAO,OAAO,WAAW,WAAW,SAAS;CAEnD,gBAAgB;EACZ,IAAI,QAAQ;EACZ,WAAW,CAAC,CAAC,OAAM,UAAS,QAAQ,MAAM,iDAAiD,KAAK,CAAC;CACrG,GAAG,CAAC,MAAM,CAAC;CAEX,MAAM,OAAO,cAAc,QAAQ,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC;CAC/D,MAAM,UAAU,IAAI,aAAa,OAAO,+CAA+C,sBAAsB,SAAS;CAEtH,IAAI,SAAS,KAAA,GAIT,OAAO,oBAAC,OAAD;EAAK,WAAW,IAAI,SAAS,qBAAqB;YAAI;CAAU,CAAA;CAG3E,OAAO,oBAAC,OAAD;EACH,WAAW;EACX,yBAAyB,EAAE,QAAQ,KAAK;CAC3C,CAAA;AACL,GACE,SAAK"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { focusedDisabled, paperMixin } from "../styles.es.js";
3
+ import { cls } from "../util/cls.es.js";
4
+ import { usePortalContainer } from "../hooks/PortalContainerContext.es.js";
5
+ import React from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
8
+ //#region src/components/Menu.tsx
9
+ var Menu = React.forwardRef(({ children, trigger, open, defaultOpen, side, align, onOpenChange, portalContainer, sideOffset = 4, className }, ref) => {
10
+ const contextContainer = usePortalContainer();
11
+ const finalContainer = portalContainer ?? contextContainer ?? void 0;
12
+ return /* @__PURE__ */ jsxs(DropdownMenu.Root, {
13
+ open,
14
+ defaultOpen,
15
+ onOpenChange,
16
+ children: [/* @__PURE__ */ jsx(DropdownMenu.Trigger, {
17
+ ref,
18
+ asChild: true,
19
+ children: trigger
20
+ }), /* @__PURE__ */ jsx(DropdownMenu.Portal, {
21
+ container: finalContainer,
22
+ children: /* @__PURE__ */ jsx(DropdownMenu.Content, {
23
+ side,
24
+ sideOffset,
25
+ align,
26
+ className: cls(paperMixin, focusedDisabled, "py-2 z-50", className),
27
+ children
28
+ })
29
+ })]
30
+ });
31
+ });
32
+ Menu.displayName = "Menu";
33
+ var MenuItem = React.memo(({ children, dense = false, disabled = false, onClick, className }) => {
34
+ const classNames = cls(onClick && !disabled && "cursor-pointer", disabled && "opacity-50 cursor-not-allowed", "rounded-md text-sm font-medium text-surface-accent-700 dark:text-surface-accent-300 flex items-center gap-4 transition-colors duration-150", !disabled && "hover:bg-surface-hover", dense ? "px-4 py-1.5" : "px-4 py-2", className);
35
+ return /* @__PURE__ */ jsx(DropdownMenu.Item, {
36
+ className: classNames,
37
+ disabled,
38
+ onClick: disabled ? void 0 : onClick,
39
+ children
40
+ });
41
+ });
42
+ MenuItem.displayName = "MenuItem";
43
+ //#endregion
44
+ export { Menu, MenuItem };
45
+
46
+ //# sourceMappingURL=Menu.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.es.js","names":[],"sources":["../../src/components/Menu.tsx"],"sourcesContent":["\"use client\";\nimport React from \"react\";\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { focusedDisabled, paperMixin } from \"../styles\";\nimport { cls } from \"../util\";\nimport { usePortalContainer } from \"../hooks/PortalContainerContext\";\n\nexport type MenuProps = {\n children: React.ReactNode;\n trigger: React.ReactNode;\n\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n\n portalContainer?: HTMLElement | null;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n\n sideOffset?: number;\n className?: string;\n}\n\nconst Menu = React.forwardRef<\n React.ElementRef<typeof DropdownMenu.Trigger>,\n MenuProps\n>(({\n children,\n trigger,\n open,\n defaultOpen,\n side,\n align,\n onOpenChange,\n portalContainer,\n sideOffset = 4,\n className\n }, ref) => {\n // Get the portal container from context\n const contextContainer = usePortalContainer();\n\n // Prioritize manual prop, fallback to context container\n const finalContainer = (portalContainer ?? contextContainer ?? undefined) as HTMLElement | undefined;\n\n return (\n <DropdownMenu.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}>\n <DropdownMenu.Trigger\n ref={ref}\n asChild>\n {trigger}\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal container={finalContainer}>\n <DropdownMenu.Content\n side={side}\n sideOffset={sideOffset}\n align={align}\n // `z-50` is the floating layer — the tier `Dialog`, `Sheet`,\n // `Select` and `Tooltip` all sit on. Radix copies this value\n // onto the popper wrapper it portals next to them, so at any\n // lower value the menu opens *behind* the dialog or sheet it\n // was opened from: visible in the DOM, painted under the\n // overlay, and unclickable. Peers on this tier stack by mount\n // order, which is what puts a menu above the dialog holding\n // its trigger, and a dialog that menu opens above them both.\n className={cls(paperMixin, focusedDisabled, \"py-2 z-50\", className)}>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n})\nMenu.displayName = \"Menu\"\n\nexport { Menu }\n\nexport type MenuItemProps = {\n children: React.ReactNode;\n dense?: boolean;\n disabled?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n className?: string;\n};\n\nexport const MenuItem = React.memo(({\n children,\n dense = false, // Default value is false if not provided\n disabled = false,\n onClick,\n className\n }: MenuItemProps) => {\n // Dynamically adjusting the class based on the \"dense\" prop\n const classNames = cls(\n onClick && !disabled && \"cursor-pointer\",\n disabled && \"opacity-50 cursor-not-allowed\",\n \"rounded-md text-sm font-medium text-surface-accent-700 dark:text-surface-accent-300 flex items-center gap-4 transition-colors duration-150\",\n !disabled && \"hover:bg-surface-hover\",\n dense ? \"px-4 py-1.5\" : \"px-4 py-2\",\n className\n );\n\n return (\n <DropdownMenu.Item\n className={classNames}\n disabled={disabled}\n onClick={disabled ? undefined : onClick}>\n {children}\n </DropdownMenu.Item>\n );\n});\n\nMenuItem.displayName = \"MenuItem\";\n"],"mappings":";;;;;;;;AAuBA,IAAM,OAAO,MAAM,YAGhB,EACI,UACA,SACA,MACA,aACA,MACA,OACA,cACA,iBACA,aAAa,GACb,aACD,QAAQ;CAEV,MAAM,mBAAmB,mBAAmB;CAG5C,MAAM,iBAAkB,mBAAmB,oBAAoB,KAAA;CAE/D,OACI,qBAAC,aAAa,MAAd;EACU;EACO;EACC;YAHlB,CAII,oBAAC,aAAa,SAAd;GACS;GACL,SAAA;aACC;EACiB,CAAA,GACtB,oBAAC,aAAa,QAAd;GAAqB,WAAW;aAC5B,oBAAC,aAAa,SAAd;IACU;IACM;IACL;IASP,WAAW,IAAI,YAAY,iBAAiB,aAAa,SAAS;IACjE;GACiB,CAAA;EACL,CAAA,CACN;;AAE3B,CAAC;AACD,KAAK,cAAc;AAYnB,IAAa,WAAW,MAAM,MAAM,EACI,UACA,QAAQ,OACR,WAAW,OACX,SACA,gBACiB;CAErD,MAAM,aAAa,IACf,WAAW,CAAC,YAAY,kBACxB,YAAY,iCACZ,8IACA,CAAC,YAAY,0BACb,QAAQ,gBAAgB,aACxB,SACJ;CAEA,OACI,oBAAC,aAAa,MAAd;EACI,WAAW;EACD;EACV,SAAS,WAAW,KAAA,IAAY;EAC/B;CACc,CAAA;AAE3B,CAAC;AAED,SAAS,cAAc"}
@@ -0,0 +1,142 @@
1
+ import { cls } from "../util/cls.es.js";
2
+ import { usePortalContainer } from "../hooks/PortalContainerContext.es.js";
3
+ import { iconSize } from "../icons/Icon.es.js";
4
+ import "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
7
+ import * as MenubarPrimitive from "@radix-ui/react-menubar";
8
+ //#region src/components/Menubar.tsx
9
+ function Menubar({ children, onSelect, value, defaultValue, onValueChange, className }) {
10
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Root, {
11
+ onSelect,
12
+ value,
13
+ defaultValue,
14
+ onValueChange,
15
+ className: cls("z-10 flex bg-surface-card p-[3px] rounded-lg shadow-sm", className),
16
+ children
17
+ });
18
+ }
19
+ function MenubarMenu({ children, value }) {
20
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Menu, {
21
+ value,
22
+ children
23
+ });
24
+ }
25
+ function MenubarTrigger({ children, onSelect, className }) {
26
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Trigger, {
27
+ onSelect,
28
+ className: cls("py-2 px-3 outline-none select-none font-medium leading-none rounded-md text-text-primary dark:text-text-primary-dark text-sm transition-colors duration-150 flex items-center justify-between gap-[2px] data-[highlighted]:bg-surface-hover data-[state=open]:bg-surface-active hover:bg-surface-hover", className),
29
+ children
30
+ });
31
+ }
32
+ function MenubarPortal({ children, portalContainer }) {
33
+ const contextContainer = usePortalContainer();
34
+ const finalContainer = portalContainer ?? contextContainer ?? void 0;
35
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Portal, {
36
+ container: finalContainer,
37
+ children
38
+ });
39
+ }
40
+ function MenubarContent({ children, className, align, sideOffset, alignOffset, onSelect, ...rest }) {
41
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Content, {
42
+ onSelect,
43
+ className: cls("z-50 min-w-[220px] bg-surface-card rounded-md p-[6px] shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),_0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)] [animation-duration:_400ms] [animation-timing-function:_cubic-bezier(0.16,_1,_0.3,_1)] will-change-[transform,opacity]", className),
44
+ align: align ?? "start",
45
+ sideOffset: sideOffset ?? 5,
46
+ alignOffset: alignOffset ?? -3,
47
+ ...rest,
48
+ children
49
+ });
50
+ }
51
+ function MenubarItem({ children, leftPadding, className, disabled, onSelect, ...rest }) {
52
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Item, {
53
+ onSelect,
54
+ className: cls("group text-sm leading-none rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 outline-none data-[state=open]:bg-surface-active data-[state=open]:text-text-primary data-[state=open]:dark:text-text-primary-dark data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none", leftPadding ? "pl-5" : "", disabled ? "pointer-events-none text-text-secondary dark:text-text-secondary-dark" : "text-text-primary dark:text-text-primary-dark", className),
55
+ disabled,
56
+ ...rest,
57
+ children
58
+ });
59
+ }
60
+ function MenubarSeparator({ children, className, ...rest }) {
61
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Separator, {
62
+ className: cls("h-[1px] bg-hairline m-[5px]", className),
63
+ ...rest,
64
+ children
65
+ });
66
+ }
67
+ function MenubarSub({ children, ...rest }) {
68
+ return /* @__PURE__ */ jsx(MenubarPrimitive.Sub, {
69
+ ...rest,
70
+ children
71
+ });
72
+ }
73
+ function MenubarSubTrigger({ children, className, onSelect, ...rest }) {
74
+ return /* @__PURE__ */ jsx(MenubarPrimitive.SubTrigger, {
75
+ onSelect,
76
+ className: cls("group text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 outline-none data-[state=open]:bg-surface-active data-[state=open]:text-text-primary data-[state=open]:dark:text-text-primary-dark data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none", className),
77
+ ...rest,
78
+ children
79
+ });
80
+ }
81
+ function MenubarSubContent({ children, alignOffset, className, onSelect, ...rest }) {
82
+ return /* @__PURE__ */ jsx(MenubarPrimitive.SubContent, {
83
+ onSelect,
84
+ alignOffset: alignOffset ?? -5,
85
+ className: cls("min-w-[220px] bg-surface-card rounded-md p-[6px] shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),_0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)] [animation-duration:_400ms] [animation-timing-function:_cubic-bezier(0.16,_1,_0.3,_1)] will-change-[transform,opacity]", className),
86
+ ...rest,
87
+ children
88
+ });
89
+ }
90
+ function MenubarCheckboxItem({ children, checked, onCheckedChange, className, onSelect, ...rest }) {
91
+ return /* @__PURE__ */ jsx(MenubarPrimitive.CheckboxItem, {
92
+ onSelect,
93
+ className: cls("text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 pl-5 outline-none data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none", className),
94
+ checked,
95
+ onCheckedChange,
96
+ ...rest,
97
+ children
98
+ });
99
+ }
100
+ function MenubarItemIndicator({ children, className, ...rest }) {
101
+ return /* @__PURE__ */ jsx(MenubarPrimitive.ItemIndicator, {
102
+ className: cls("absolute left-0 w-4 inline-flex items-center justify-center", className),
103
+ ...rest,
104
+ children: children ?? /* @__PURE__ */ jsx(CheckIcon, { size: iconSize.smallest })
105
+ });
106
+ }
107
+ function MenubarRadioGroup({ children, className, value, onValueChange, onSelect, ...rest }) {
108
+ return /* @__PURE__ */ jsx(MenubarPrimitive.RadioGroup, {
109
+ className: cls(className),
110
+ value,
111
+ onValueChange,
112
+ onSelect,
113
+ ...rest,
114
+ children: children ?? /* @__PURE__ */ jsx(CheckIcon, { size: iconSize.small })
115
+ });
116
+ }
117
+ function MenubarRadioItem({ children, className, value, onSelect, ...rest }) {
118
+ return /* @__PURE__ */ jsx(MenubarPrimitive.RadioItem, {
119
+ onSelect,
120
+ className: cls("text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 pl-5 outline-none data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none", className),
121
+ value,
122
+ ...rest,
123
+ children: children ?? /* @__PURE__ */ jsx(CheckIcon, { size: iconSize.small })
124
+ });
125
+ }
126
+ function MenubarShortcut({ children, className, ...rest }) {
127
+ return /* @__PURE__ */ jsx("div", {
128
+ className: cls("ml-auto pl-5 group-data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark", className),
129
+ ...rest,
130
+ children
131
+ });
132
+ }
133
+ function MenubarSubTriggerIndicator() {
134
+ return /* @__PURE__ */ jsx("div", {
135
+ className: "ml-auto pl-5 ",
136
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { size: iconSize.small })
137
+ });
138
+ }
139
+ //#endregion
140
+ export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarItem, MenubarItemIndicator, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarSubTriggerIndicator, MenubarTrigger };
141
+
142
+ //# sourceMappingURL=Menubar.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menubar.es.js","names":[],"sources":["../../src/components/Menubar.tsx"],"sourcesContent":["\nimport * as React from \"react\";\n\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\";\nimport { cls } from \"../util\";\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\";\nimport { iconSize } from \"../icons/Icon\";\nimport { usePortalContainer } from \"../hooks/PortalContainerContext\";\n\nexport function Menubar({\n children,\n onSelect,\n value,\n defaultValue,\n onValueChange,\n className\n }: {\n children: React.ReactNode,\n onSelect?: (event: React.SyntheticEvent) => void,\n /** Value of the open menu, controlled. Pair with `onValueChange`. */\n value?: string,\n /** Value of the menu open on mount, uncontrolled. */\n defaultValue?: string,\n onValueChange?: (value: string) => void,\n className?: string\n}) {\n return (\n <MenubarPrimitive.Root\n onSelect={onSelect}\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n className={cls(\"z-10 flex bg-surface-card p-[3px] rounded-lg shadow-sm\", className)}>\n {children}\n </MenubarPrimitive.Root>\n )\n}\n\nexport function MenubarMenu({\n children,\n value\n }: {\n children: React.ReactNode,\n /** Identifies this menu to the parent Menubar's `value`/`defaultValue`. */\n value?: string\n}) {\n return (\n <MenubarPrimitive.Menu value={value}>\n {children}\n </MenubarPrimitive.Menu>\n )\n}\n\nexport function MenubarTrigger({\n children,\n onSelect,\n className\n }: {\n children: React.ReactNode,\n onSelect?: (event: React.SyntheticEvent) => void,\n className?: string\n}) {\n return (\n <MenubarPrimitive.Trigger\n onSelect={onSelect}\n className={cls(\"py-2 px-3 outline-none select-none font-medium leading-none rounded-md text-text-primary dark:text-text-primary-dark text-sm transition-colors duration-150 flex items-center justify-between gap-[2px] data-[highlighted]:bg-surface-hover data-[state=open]:bg-surface-active hover:bg-surface-hover\",\n className)}>\n {children}\n </MenubarPrimitive.Trigger>\n )\n}\n\nexport function MenubarPortal({\n children,\n portalContainer\n }: {\n children: React.ReactNode;\n portalContainer?: HTMLElement | null;\n}) {\n // Get the portal container from context\n const contextContainer = usePortalContainer();\n\n // Prioritize manual prop, fallback to context container\n const finalContainer = (portalContainer ?? contextContainer ?? undefined) as HTMLElement | undefined;\n\n return (\n <MenubarPrimitive.Portal container={finalContainer}>\n {children}\n </MenubarPrimitive.Portal>\n )\n}\n\nexport function MenubarContent({\n children,\n className,\n align,\n sideOffset,\n alignOffset,\n onSelect,\n ...rest\n }: {\n children: React.ReactNode,\n className?: string,\n onSelect?: (event: React.SyntheticEvent) => void,\n align?: \"start\" | \"center\" | \"end\",\n sideOffset?: number,\n alignOffset?: number\n}) {\n return (\n <MenubarPrimitive.Content\n onSelect={onSelect}\n // `z-50`, the floating layer — see the note in `Menu`. This carried\n // no z-index at all, so the wrapper Radix portals out to the body\n // got `auto` and the menu opened underneath any dialog or panel it\n // was hosted in.\n className={cls(\"z-50 min-w-[220px] bg-surface-card rounded-md p-[6px] shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),_0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)] [animation-duration:_400ms] [animation-timing-function:_cubic-bezier(0.16,_1,_0.3,_1)] will-change-[transform,opacity]\", className)}\n align={align ?? \"start\"}\n sideOffset={sideOffset ?? 5}\n alignOffset={alignOffset ?? -3}\n {...rest}\n >\n {children}\n </MenubarPrimitive.Content>\n )\n}\n\nexport function MenubarItem({\n children,\n leftPadding,\n className,\n disabled,\n onSelect,\n ...rest\n }: {\n children: React.ReactNode,\n onSelect?: (event: Event) => void;\n leftPadding?: boolean,\n className?: string,\n disabled?: boolean\n}) {\n return (\n <MenubarPrimitive.Item\n onSelect={onSelect}\n className={cls(\"group text-sm leading-none rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 outline-none data-[state=open]:bg-surface-active data-[state=open]:text-text-primary data-[state=open]:dark:text-text-primary-dark data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none\",\n leftPadding ? \"pl-5\" : \"\",\n disabled ? \"pointer-events-none text-text-secondary dark:text-text-secondary-dark\" : \"text-text-primary dark:text-text-primary-dark\",\n className)}\n disabled={disabled}\n {...rest}\n >\n {children}\n </MenubarPrimitive.Item>\n )\n}\n\nexport function MenubarSeparator({\n children,\n className,\n ...rest\n }: {\n children?: React.ReactNode,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.Separator\n className={cls(\"h-[1px] bg-hairline m-[5px]\", className)}\n {...rest}\n >\n {children}\n </MenubarPrimitive.Separator>\n )\n}\n\nexport function MenubarSub({\n children,\n ...rest\n }: {\n children?: React.ReactNode,\n}) {\n return (\n <MenubarPrimitive.Sub\n {...rest}\n >\n {children}\n </MenubarPrimitive.Sub>\n )\n}\n\nexport function MenubarSubTrigger({\n children,\n className,\n onSelect,\n ...rest\n }: {\n children?: React.ReactNode,\n onSelect?: (event: React.SyntheticEvent) => void,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n onSelect={onSelect}\n className={cls(\"group text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 outline-none data-[state=open]:bg-surface-active data-[state=open]:text-text-primary data-[state=open]:dark:text-text-primary-dark data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none\",\n className)}\n {...rest}\n >\n {children}\n </MenubarPrimitive.SubTrigger>\n )\n}\n\nexport function MenubarSubContent({\n children,\n alignOffset,\n className,\n onSelect,\n ...rest\n }: {\n children?: React.ReactNode,\n onSelect?: (event: React.SyntheticEvent) => void,\n alignOffset?: number,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.SubContent\n onSelect={onSelect}\n alignOffset={alignOffset ?? -5}\n className={cls(\"min-w-[220px] bg-surface-card rounded-md p-[6px] shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),_0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)] [animation-duration:_400ms] [animation-timing-function:_cubic-bezier(0.16,_1,_0.3,_1)] will-change-[transform,opacity]\",\n className)}\n {...rest}\n >\n {children}\n </MenubarPrimitive.SubContent>\n )\n}\n\nexport function MenubarCheckboxItem({\n children,\n checked,\n onCheckedChange,\n className,\n onSelect,\n ...rest\n }: {\n children?: React.ReactNode,\n onSelect?: (event: Event) => void;\n checked?: boolean,\n onCheckedChange?: () => void,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.CheckboxItem\n onSelect={onSelect}\n className={cls(\"text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 pl-5 outline-none data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none\",\n className)}\n checked={checked}\n onCheckedChange={onCheckedChange}\n {...rest}\n >\n {children}\n </MenubarPrimitive.CheckboxItem>\n )\n}\n\nexport function MenubarItemIndicator({\n children,\n className,\n ...rest\n }: {\n children?: React.ReactNode,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.ItemIndicator\n className={cls(\"absolute left-0 w-4 inline-flex items-center justify-center\", className)}\n {...rest}>\n {children ?? <CheckIcon size={iconSize.smallest}/>}\n </MenubarPrimitive.ItemIndicator>\n )\n}\n\nexport function MenubarRadioGroup({\n children,\n className,\n value,\n onValueChange,\n onSelect,\n ...rest\n }: {\n children?: React.ReactNode,\n onSelect?: (event: React.SyntheticEvent) => void,\n value?: string,\n onValueChange?: (value: string) => void,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.RadioGroup\n className={cls(className)}\n value={value}\n onValueChange={onValueChange}\n onSelect={onSelect}\n {...rest}>\n {children ?? <CheckIcon size={iconSize.small}/>}\n </MenubarPrimitive.RadioGroup>\n )\n}\n\nexport function MenubarRadioItem({\n children,\n className,\n value,\n onSelect,\n ...rest\n }: {\n children?: React.ReactNode,\n onSelect?: (event: Event) => void;\n value: string,\n className?: string,\n}) {\n return (\n <MenubarPrimitive.RadioItem\n onSelect={onSelect}\n className={cls(\"text-sm leading-none text-text-primary dark:text-text-primary-dark rounded-md flex items-center h-[32px] px-[10px] py-[2px] relative select-none transition-colors duration-150 pl-5 outline-none data-[highlighted]:bg-surface-hover data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark data-[disabled]:pointer-events-none\",\n className)}\n value={value}\n {...rest}>\n {children ?? <CheckIcon size={iconSize.small}/>}\n </MenubarPrimitive.RadioItem>\n )\n}\n\nexport function MenubarShortcut({\n children,\n className,\n ...rest\n }: {\n children?: React.ReactNode,\n className?: string,\n}) {\n return (\n <div\n className={cls(\"ml-auto pl-5 group-data-[disabled]:text-text-disabled data-[disabled]:dark:text-text-disabled-dark\",\n className)}\n {...rest}>\n {children}\n </div>\n )\n}\n\nexport function MenubarSubTriggerIndicator() {\n return (\n <div className=\"ml-auto pl-5 \">\n <ChevronRightIcon size={iconSize.small}/>\n </div>\n )\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,QAAQ,EACI,UACA,UACA,OACA,cACA,eACA,aAUzB;CACC,OACI,oBAAC,iBAAiB,MAAlB;EACc;EACH;EACO;EACC;EACf,WAAW,IAAI,0DAA0D,SAAS;EACjF;CACkB,CAAA;AAE/B;AAEA,SAAgB,YAAY,EACI,UACA,SAK7B;CACC,OACI,oBAAC,iBAAiB,MAAlB;EAA8B;EACzB;CACkB,CAAA;AAE/B;AAEA,SAAgB,eAAe,EACI,UACA,UACA,aAKhC;CACC,OACI,oBAAC,iBAAiB,SAAlB;EACc;EACV,WAAW,IAAI,0SACX,SAAS;EACZ;CACqB,CAAA;AAElC;AAEA,SAAgB,cAAc,EACI,UACA,mBAI/B;CAEC,MAAM,mBAAmB,mBAAmB;CAG5C,MAAM,iBAAkB,mBAAmB,oBAAoB,KAAA;CAE/D,OACI,oBAAC,iBAAiB,QAAlB;EAAyB,WAAW;EAC/B;CACoB,CAAA;AAEjC;AAEA,SAAgB,eAAe,EACI,UACA,WACA,OACA,YACA,aACA,UACA,GAAG,QAQnC;CACC,OACI,oBAAC,iBAAiB,SAAlB;EACc;EAKV,WAAW,IAAI,+QAA+Q,SAAS;EACvS,OAAO,SAAS;EAChB,YAAY,cAAc;EAC1B,aAAa,eAAe;EAC5B,GAAI;EAEH;CACqB,CAAA;AAElC;AAEA,SAAgB,YAAY,EACI,UACA,aACA,WACA,UACA,UACA,GAAG,QAOhC;CACC,OACI,oBAAC,iBAAiB,MAAlB;EACc;EACV,WAAW,IAAI,uaACX,cAAc,SAAS,IACvB,WAAW,0EAA0E,iDACrF,SAAS;EACH;EACV,GAAI;EAEH;CACkB,CAAA;AAE/B;AAEA,SAAgB,iBAAiB,EACI,UACA,WACA,GAAG,QAIrC;CACC,OACI,oBAAC,iBAAiB,WAAlB;EACI,WAAW,IAAI,+BAA+B,SAAS;EACvD,GAAI;EAEH;CACuB,CAAA;AAEpC;AAEA,SAAgB,WAAW,EACI,UACA,GAAG,QAG/B;CACC,OACI,oBAAC,iBAAiB,KAAlB;EACI,GAAI;EAEH;CACiB,CAAA;AAE9B;AAEA,SAAgB,kBAAkB,EACI,UACA,WACA,UACA,GAAG,QAKtC;CACC,OACI,oBAAC,iBAAiB,YAAlB;EACc;EACV,WAAW,IAAI,qdACX,SAAS;EACb,GAAI;EAEH;CACwB,CAAA;AAErC;AAEA,SAAgB,kBAAkB,EACI,UACA,aACA,WACA,UACA,GAAG,QAMtC;CACC,OACI,oBAAC,iBAAiB,YAAlB;EACc;EACV,aAAa,eAAe;EAC5B,WAAW,IAAI,0QACX,SAAS;EACb,GAAI;EAEH;CACwB,CAAA;AAErC;AAEA,SAAgB,oBAAoB,EACI,UACA,SACA,iBACA,WACA,UACA,GAAG,QAOxC;CACC,OACI,oBAAC,iBAAiB,cAAlB;EACc;EACV,WAAW,IAAI,6VACX,SAAS;EACJ;EACQ;EACjB,GAAI;EAEH;CAC0B,CAAA;AAEvC;AAEA,SAAgB,qBAAqB,EACI,UACA,WACA,GAAG,QAIzC;CACC,OACI,oBAAC,iBAAiB,eAAlB;EACI,WAAW,IAAI,+DAA+D,SAAS;EACvF,GAAI;YACH,YAAY,oBAAC,WAAD,EAAW,MAAM,SAAS,SAAU,CAAA;CACrB,CAAA;AAExC;AAEA,SAAgB,kBAAkB,EACI,UACA,WACA,OACA,eACA,UACA,GAAG,QAOtC;CACC,OACI,oBAAC,iBAAiB,YAAlB;EACI,WAAW,IAAI,SAAS;EACjB;EACQ;EACL;EACV,GAAI;YACH,YAAY,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;CACrB,CAAA;AAErC;AAEA,SAAgB,iBAAiB,EACI,UACA,WACA,OACA,UACA,GAAG,QAMrC;CACC,OACI,oBAAC,iBAAiB,WAAlB;EACc;EACV,WAAW,IAAI,6VACX,SAAS;EACN;EACP,GAAI;YACH,YAAY,oBAAC,WAAD,EAAW,MAAM,SAAS,MAAO,CAAA;CACtB,CAAA;AAEpC;AAEA,SAAgB,gBAAgB,EACI,UACA,WACA,GAAG,QAIpC;CACC,OACI,oBAAC,OAAD;EACI,WAAW,IAAI,sGACX,SAAS;EACb,GAAI;EACH;CACA,CAAA;AAEb;AAEA,SAAgB,6BAA6B;CACzC,OACI,oBAAC,OAAD;EAAK,WAAU;YACX,oBAAC,kBAAD,EAAkB,MAAM,SAAS,MAAO,CAAA;CACvC,CAAA;AAEb"}
@@ -1,5 +1,4 @@
1
1
  import * as React from "react";
2
- import { ChangeEvent } from "react";
3
2
  export type MultiSelectValue = string | number | boolean;
4
3
  interface MultiSelectContextProps<T extends MultiSelectValue = string> {
5
4
  fieldValue?: T[];
@@ -13,12 +12,11 @@ interface MultiSelectProps<T extends MultiSelectValue = string> {
13
12
  modalPopover?: boolean;
14
13
  className?: string;
15
14
  open?: boolean;
16
- name?: string;
15
+ /** Put on the trigger button, so a `<label htmlFor>` can name it. */
17
16
  id?: string;
18
17
  onOpenChange?: (open: boolean) => void;
19
18
  value?: T[];
20
19
  inputClassName?: string;
21
- onChange?: React.EventHandler<ChangeEvent<HTMLSelectElement>>;
22
20
  onValueChange?: (updatedValue: T[]) => void;
23
21
  placeholder?: React.ReactNode;
24
22
  size?: "smallest" | "small" | "medium" | "large";
@@ -26,13 +24,9 @@ interface MultiSelectProps<T extends MultiSelectValue = string> {
26
24
  label?: React.ReactNode | string;
27
25
  disabled?: boolean;
28
26
  error?: boolean;
29
- position?: "item-aligned" | "popper";
30
- endAdornment?: React.ReactNode;
31
- multiple?: boolean;
32
27
  includeSelectAll?: boolean;
33
28
  includeClear?: boolean;
34
29
  inputRef?: React.Ref<HTMLButtonElement>;
35
- padding?: boolean;
36
30
  invisible?: boolean;
37
31
  /**
38
32
  * Whether the trigger draws its own chevron. A table cell turns it off:
@@ -0,0 +1,271 @@
1
+ "use client";
2
+ import { defaultBorderMixin, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, fieldBackgroundInvisibleMixin, fieldBackgroundMixin, focusedDisabled } from "../styles.es.js";
3
+ import { cls } from "../util/cls.es.js";
4
+ import { usePortalContainer } from "../hooks/PortalContainerContext.es.js";
5
+ import { useInjectStyles } from "../hooks/useInjectStyles.es.js";
6
+ import { iconSize } from "../icons/Icon.es.js";
7
+ import { Chip } from "./Chip.es.js";
8
+ import { Separator } from "./Separator.es.js";
9
+ import { SelectInputLabel } from "./common/SelectInputLabel.es.js";
10
+ import * as React$1 from "react";
11
+ import { Children, useEffect, useState } from "react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ import { CheckIcon, ChevronDownIcon, XIcon } from "lucide-react";
14
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
15
+ import { Command } from "cmdk";
16
+ //#region src/components/MultiSelect.tsx
17
+ var MultiSelectContext = React$1.createContext(null);
18
+ /**
19
+ * The popover's trigger, or — given an anchor — a plain child beside a
20
+ * `Popover.Anchor` on that element. Not both: Radix's trigger registers itself
21
+ * as the anchor through a ref callback, which under StrictMode runs again
22
+ * after the custom anchor's effect and wins, leaving the list anchored to a
23
+ * trigger the custom anchor then unmounts. The button toggles the list itself.
24
+ */
25
+ function MultiSelectTrigger({ anchorRef, children }) {
26
+ if (!anchorRef) return /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, {
27
+ asChild: true,
28
+ children
29
+ });
30
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(PopoverPrimitive.Anchor, { virtualRef: anchorRef }), children] });
31
+ }
32
+ var MultiSelect = React$1.forwardRef(({ value, id, size = "large", label, error, onValueChange, invisible, chevron = true, anchorRef, triggerContent, disabled, placeholder, modalPopover = true, includeClear = true, includeSelectAll = true, useChips = true, className, inputClassName, inputRef, children, renderValues, open, onOpenChange, portalContainer, "aria-label": ariaLabel }, ref) => {
33
+ const [isMounted, setIsMounted] = useState(false);
34
+ const [isPopoverOpen, setIsPopoverOpen] = useState(open ?? false);
35
+ const [selectedValues, setSelectedValues] = useState(value ?? []);
36
+ const contextContainer = usePortalContainer();
37
+ const finalContainer = portalContainer ?? contextContainer ?? void 0;
38
+ useEffect(() => {
39
+ setIsMounted(true);
40
+ }, []);
41
+ const onPopoverOpenChange = (open) => {
42
+ setIsPopoverOpen(open);
43
+ onOpenChange?.(open);
44
+ };
45
+ useEffect(() => {
46
+ setIsPopoverOpen(open ?? false);
47
+ }, [open]);
48
+ const allValues = React$1.useMemo(() => {
49
+ const values = [];
50
+ Children.forEach(children, (child) => {
51
+ if (React$1.isValidElement(child) && child.props.value !== void 0 && child.props.value !== null) values.push(String(child.props.value));
52
+ });
53
+ return values;
54
+ }, [children]);
55
+ const allSelected = allValues.length > 0 && allValues.every((v) => selectedValues.some((s) => String(s) === v));
56
+ const optionsMap = React$1.useMemo(() => {
57
+ const map = /* @__PURE__ */ new Map();
58
+ Children.forEach(children, (child) => {
59
+ if (React$1.isValidElement(child)) map.set(String(child.props.value), child.props.children);
60
+ });
61
+ return map;
62
+ }, [children]);
63
+ React$1.useEffect(() => {
64
+ setSelectedValues(value ?? []);
65
+ }, [value]);
66
+ const updateValues = React$1.useCallback((values) => {
67
+ if (disabled) return;
68
+ setSelectedValues(values);
69
+ onValueChange?.(values);
70
+ }, [onValueChange, disabled]);
71
+ const onItemClick = React$1.useCallback((newValue) => {
72
+ let newSelectedValues;
73
+ if (selectedValues.some((v) => String(v) === String(newValue))) newSelectedValues = selectedValues.filter((v) => String(v) !== String(newValue));
74
+ else newSelectedValues = [...selectedValues, String(newValue)];
75
+ updateValues(newSelectedValues);
76
+ }, [selectedValues, updateValues]);
77
+ const handleInputKeyDown = (event) => {
78
+ if (event.key === "Enter") onPopoverOpenChange(true);
79
+ else if (event.key === "Backspace" && !event.currentTarget.value) {
80
+ const newSelectedValues = [...selectedValues];
81
+ newSelectedValues.pop();
82
+ updateValues(newSelectedValues);
83
+ }
84
+ };
85
+ const toggleOption = (value) => {
86
+ const newSelectedValues = selectedValues.some((v) => String(v) === String(value)) ? selectedValues.filter((v) => String(v) !== String(value)) : [...selectedValues, value];
87
+ updateValues(newSelectedValues);
88
+ };
89
+ const handleClear = () => {
90
+ updateValues([]);
91
+ };
92
+ const handleTogglePopover = () => {
93
+ onPopoverOpenChange(!isPopoverOpen);
94
+ };
95
+ const toggleAll = () => {
96
+ if (allSelected) handleClear();
97
+ else updateValues(allValues);
98
+ onPopoverOpenChange(false);
99
+ };
100
+ useInjectStyles("MultiSelect", `
101
+ [data-multi-select-content] [cmdk-group] {
102
+ max-height: 45vh;
103
+ overflow-y: auto;
104
+ } `);
105
+ const contextValue = React$1.useMemo(() => ({
106
+ fieldValue: selectedValues,
107
+ onItemClick
108
+ }), [selectedValues, onItemClick]);
109
+ const bare = triggerContent !== void 0;
110
+ return /* @__PURE__ */ jsxs(MultiSelectContext.Provider, {
111
+ value: contextValue,
112
+ children: [typeof label === "string" ? /* @__PURE__ */ jsx(SelectInputLabel, {
113
+ error,
114
+ children: label
115
+ }) : label, /* @__PURE__ */ jsxs(PopoverPrimitive.Root, {
116
+ open: isMounted && isPopoverOpen,
117
+ onOpenChange: onPopoverOpenChange,
118
+ modal: modalPopover,
119
+ children: [/* @__PURE__ */ jsx(MultiSelectTrigger, {
120
+ anchorRef,
121
+ children: /* @__PURE__ */ jsx("button", {
122
+ ref: inputRef ?? ref,
123
+ id,
124
+ disabled,
125
+ "aria-invalid": error || void 0,
126
+ "aria-label": ariaLabel ?? (typeof label === "string" ? label : void 0),
127
+ onClick: handleTogglePopover,
128
+ className: bare ? cls("relative flex items-center w-full text-start select-none outline-none focus:outline-none focus-visible:outline-none", className, inputClassName) : cls(invisible ? {
129
+ smallest: "min-h-[28px]",
130
+ small: "min-h-[32px]",
131
+ medium: "min-h-[40px]",
132
+ large: "min-h-[48px]"
133
+ }[size] : {
134
+ smallest: "min-h-[30px]",
135
+ small: "min-h-[34px]",
136
+ medium: "min-h-[42px]",
137
+ large: "min-h-[50px]"
138
+ }[size], {
139
+ "py-0": size === "smallest",
140
+ "py-0.5": size === "small",
141
+ "py-1": size === "medium" || size === "large"
142
+ }, {
143
+ "px-2": size === "small" || size === "smallest",
144
+ "px-4": size === "medium" || size === "large"
145
+ }, "select-none rounded-lg text-sm", "outline-none focus:outline-none focus-visible:outline-none", invisible ? fieldBackgroundInvisibleMixin : fieldBackgroundMixin, disabled ? fieldBackgroundDisabledMixin : invisible ? "" : fieldBackgroundHoverMixin, "relative flex items-center", className, inputClassName),
146
+ children: bare ? triggerContent : selectedValues.length > 0 ? /* @__PURE__ */ jsxs("div", {
147
+ className: "flex justify-between items-center w-full",
148
+ children: [/* @__PURE__ */ jsxs("div", {
149
+ className: "flex flex-wrap items-center gap-1.5 text-start",
150
+ children: [renderValues && renderValues(selectedValues), !renderValues && selectedValues.map((value) => {
151
+ const optionChildren = optionsMap.get(String(value));
152
+ if (!useChips) return optionChildren;
153
+ return /* @__PURE__ */ jsxs(Chip, {
154
+ size: size === "smallest" || size === "small" ? "smallest" : "small",
155
+ className: cls("flex flex-row items-center p-1"),
156
+ children: [optionChildren, /* @__PURE__ */ jsx(XIcon, {
157
+ size: iconSize.smallest,
158
+ onClick: (event) => {
159
+ event.stopPropagation();
160
+ toggleOption(value);
161
+ }
162
+ })]
163
+ }, String(value));
164
+ })]
165
+ }), /* @__PURE__ */ jsxs("div", {
166
+ className: "flex items-center justify-between",
167
+ children: [includeClear && /* @__PURE__ */ jsx(XIcon, {
168
+ className: "ml-4",
169
+ size: iconSize.small,
170
+ onClick: (event) => {
171
+ event.stopPropagation();
172
+ handleClear();
173
+ }
174
+ }), chevron && /* @__PURE__ */ jsx("div", {
175
+ className: cls("px-2 h-full flex items-center"),
176
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {
177
+ size: size === "large" ? iconSize.medium : iconSize.small,
178
+ className: cls("transition", isPopoverOpen ? "rotate-180" : "")
179
+ })
180
+ })]
181
+ })]
182
+ }) : /* @__PURE__ */ jsxs("div", {
183
+ className: "flex items-center justify-between w-full mx-auto",
184
+ children: [/* @__PURE__ */ jsx("span", {
185
+ className: "text-sm",
186
+ children: placeholder
187
+ }), chevron && /* @__PURE__ */ jsx("div", {
188
+ className: cls("px-2 h-full flex items-center"),
189
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {
190
+ size: size === "large" ? iconSize.medium : iconSize.small,
191
+ className: cls("transition", isPopoverOpen ? "rotate-180" : "")
192
+ })
193
+ })]
194
+ })
195
+ })
196
+ }), /* @__PURE__ */ jsx(PopoverPrimitive.Portal, {
197
+ container: finalContainer,
198
+ children: /* @__PURE__ */ jsx(PopoverPrimitive.Content, {
199
+ "data-multi-select-content": true,
200
+ className: cls("z-50 overflow-hidden border bg-surface-card rounded-lg w-[400px]", defaultBorderMixin),
201
+ align: "start",
202
+ sideOffset: 8,
203
+ onEscapeKeyDown: () => onPopoverOpenChange(false),
204
+ children: /* @__PURE__ */ jsxs(Command, { children: [
205
+ /* @__PURE__ */ jsxs("div", {
206
+ className: "flex flex-row items-center",
207
+ children: [/* @__PURE__ */ jsx(Command.Input, {
208
+ className: cls(focusedDisabled, "bg-transparent outline-none flex-1 h-full w-full m-4 flex-grow text-surface-accent-900 dark:text-white"),
209
+ placeholder: "Search...",
210
+ onKeyDown: handleInputKeyDown
211
+ }), selectedValues.length > 0 && /* @__PURE__ */ jsx("div", {
212
+ onClick: handleClear,
213
+ className: "text-sm justify-center cursor-pointer py-3 px-4 text-text-secondary dark:text-text-secondary-dark",
214
+ children: "Clear"
215
+ })]
216
+ }),
217
+ /* @__PURE__ */ jsx(Separator, {
218
+ orientation: "horizontal",
219
+ className: "my-0"
220
+ }),
221
+ /* @__PURE__ */ jsxs(Command.List, { children: [/* @__PURE__ */ jsx(Command.Empty, {
222
+ className: "px-4 py-2 text-sm text-text-secondary dark:text-text-secondary-dark",
223
+ children: "No results found."
224
+ }), /* @__PURE__ */ jsxs(Command.Group, { children: [includeSelectAll && /* @__PURE__ */ jsxs(Command.Item, {
225
+ onSelect: toggleAll,
226
+ className: cls("flex flex-row items-center gap-1.5", "cursor-pointer", "m-1", "ring-offset-transparent", "p-1 rounded-md aria-[selected=true]:outline-none aria-[selected=true]:ring-2 aria-[selected=true]:ring-primary aria-[selected=true]:ring-primary/75 aria-[selected=true]:ring-offset-2", "aria-[selected=true]:bg-surface-active", "cursor-pointer p-2 rounded-md aria-[selected=true]:bg-surface-active"),
227
+ children: [/* @__PURE__ */ jsx(InnerCheckBox, { checked: allSelected }), /* @__PURE__ */ jsx("span", {
228
+ className: "text-sm text-text-secondary dark:text-text-secondary-dark",
229
+ children: "(Select All)"
230
+ })]
231
+ }, "all"), children] })] })
232
+ ] })
233
+ })
234
+ })]
235
+ })]
236
+ });
237
+ });
238
+ MultiSelect.displayName = "MultiSelect";
239
+ var MultiSelectItem = React$1.memo(function MultiSelectItem({ children, value, className }) {
240
+ const context = React$1.useContext(MultiSelectContext);
241
+ if (!context) throw new Error("MultiSelectItem must be used inside a MultiSelect");
242
+ const { fieldValue, onItemClick } = context;
243
+ const isSelected = (fieldValue ?? []).some((v) => String(v) === String(value));
244
+ return /* @__PURE__ */ jsxs(Command.Item, {
245
+ onMouseDown: (e) => {
246
+ e.preventDefault();
247
+ e.stopPropagation();
248
+ },
249
+ onSelect: (_) => {
250
+ onItemClick(value);
251
+ },
252
+ className: cls("flex flex-row items-center gap-1.5", isSelected ? "bg-surface-active" : "", "cursor-pointer", "m-1", "ring-offset-transparent", "p-1 rounded-md aria-[selected=true]:outline-none aria-[selected=true]:ring-2 aria-[selected=true]:ring-primary aria-[selected=true]:ring-primary/75 aria-[selected=true]:ring-offset-2", "aria-[selected=true]:bg-surface-active", "cursor-pointer p-2 rounded-md aria-[selected=true]:bg-surface-active", "text-surface-accent-700 dark:text-surface-accent-300", className),
253
+ children: [/* @__PURE__ */ jsx(InnerCheckBox, { checked: isSelected }), children]
254
+ });
255
+ });
256
+ var InnerCheckBox = React$1.memo(function InnerCheckBox({ checked }) {
257
+ return /* @__PURE__ */ jsx("div", {
258
+ className: cls("p-2", "w-8 h-8", "inline-flex items-center justify-center text-sm font-medium focus:outline-none transition-colors ease-in-out duration-150"),
259
+ children: /* @__PURE__ */ jsx("div", {
260
+ className: cls("border-2 relative transition-colors ease-in-out duration-150", "w-4 h-4 rounded-sm flex items-center justify-center", checked ? "bg-primary" : "bg-surface-card", checked ? "text-surface-accent-100 dark:text-surface-accent-900" : "", checked ? "border-transparent" : "border-surface-accent-800 dark:border-surface-accent-200"),
261
+ children: checked && /* @__PURE__ */ jsx(CheckIcon, {
262
+ size: iconSize.smallest,
263
+ className: "absolute"
264
+ })
265
+ })
266
+ });
267
+ });
268
+ //#endregion
269
+ export { MultiSelect, MultiSelectContext, MultiSelectItem };
270
+
271
+ //# sourceMappingURL=MultiSelect.es.js.map