@ktnpm_devops/react-component 0.6.0 → 0.7.1

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 (227) hide show
  1. package/dist/composites/FilterDropdown/FilterDropdown.d.ts.map +1 -1
  2. package/dist/composites/MultiSelectDropdown/MultiSelectDropdown.d.ts +5 -1
  3. package/dist/composites/MultiSelectDropdown/MultiSelectDropdown.d.ts.map +1 -1
  4. package/dist/index10.cjs +1 -1
  5. package/dist/index10.js +1 -1
  6. package/dist/index11.cjs +1 -1
  7. package/dist/index11.js +1 -1
  8. package/dist/index12.cjs +1 -1
  9. package/dist/index12.js +1 -1
  10. package/dist/index14.cjs +1 -1
  11. package/dist/index14.js +1 -1
  12. package/dist/index15.cjs +2 -2
  13. package/dist/index15.js +2 -2
  14. package/dist/index16.cjs +1 -1
  15. package/dist/index16.js +1 -1
  16. package/dist/index17.cjs +1 -1
  17. package/dist/index17.js +1 -1
  18. package/dist/index18.cjs +2 -2
  19. package/dist/index18.js +2 -2
  20. package/dist/index19.cjs +2 -2
  21. package/dist/index19.js +2 -2
  22. package/dist/index20.cjs +2 -2
  23. package/dist/index20.js +2 -2
  24. package/dist/index21.cjs +1 -1
  25. package/dist/index21.js +1 -1
  26. package/dist/index22.cjs +1 -1
  27. package/dist/index22.js +1 -1
  28. package/dist/index23.cjs +1 -1
  29. package/dist/index23.js +1 -1
  30. package/dist/index24.cjs +14 -11
  31. package/dist/index24.cjs.map +1 -1
  32. package/dist/index24.js +14 -11
  33. package/dist/index24.js.map +1 -1
  34. package/dist/index25.cjs +1 -1
  35. package/dist/index25.js +1 -1
  36. package/dist/index27.cjs +2 -2
  37. package/dist/index27.js +2 -2
  38. package/dist/index28.cjs +1 -1
  39. package/dist/index28.js +1 -1
  40. package/dist/index29.cjs +11 -9
  41. package/dist/index29.cjs.map +1 -1
  42. package/dist/index29.js +11 -9
  43. package/dist/index29.js.map +1 -1
  44. package/dist/index30.cjs +1 -1
  45. package/dist/index30.js +1 -1
  46. package/dist/index31.cjs +2 -2
  47. package/dist/index31.js +2 -2
  48. package/dist/index32.cjs +2 -2
  49. package/dist/index32.js +2 -2
  50. package/dist/index33.cjs +1 -1
  51. package/dist/index33.js +1 -1
  52. package/dist/index34.cjs +2 -2
  53. package/dist/index34.js +2 -2
  54. package/dist/index35.cjs +1 -1
  55. package/dist/index35.js +1 -1
  56. package/dist/index36.cjs +1 -1
  57. package/dist/index36.js +1 -1
  58. package/dist/index37.cjs +1 -1
  59. package/dist/index37.js +1 -1
  60. package/dist/index38.cjs +1 -1
  61. package/dist/index38.js +1 -1
  62. package/dist/index39.cjs +2 -2
  63. package/dist/index39.js +2 -2
  64. package/dist/index40.cjs +1 -1
  65. package/dist/index40.js +1 -1
  66. package/dist/index41.cjs +3 -3
  67. package/dist/index41.js +3 -3
  68. package/dist/index42.cjs +1 -1
  69. package/dist/index42.js +1 -1
  70. package/dist/index43.cjs +1 -1
  71. package/dist/index43.js +1 -1
  72. package/dist/index44.cjs +2 -2
  73. package/dist/index44.js +2 -2
  74. package/dist/index45.cjs +1 -1
  75. package/dist/index45.js +1 -1
  76. package/dist/index46.cjs +1 -1
  77. package/dist/index46.js +1 -1
  78. package/dist/index47.cjs +2 -2
  79. package/dist/index47.js +2 -2
  80. package/dist/index49.cjs +20 -2
  81. package/dist/index49.cjs.map +1 -1
  82. package/dist/index49.js +21 -3
  83. package/dist/index49.js.map +1 -1
  84. package/dist/index50.cjs +12 -15
  85. package/dist/index50.cjs.map +1 -1
  86. package/dist/index50.js +12 -15
  87. package/dist/index50.js.map +1 -1
  88. package/dist/index51.cjs +18 -76
  89. package/dist/index51.cjs.map +1 -1
  90. package/dist/index51.js +17 -75
  91. package/dist/index51.js.map +1 -1
  92. package/dist/index52.cjs +13 -13
  93. package/dist/index52.js +13 -13
  94. package/dist/index53.cjs +76 -27
  95. package/dist/index53.cjs.map +1 -1
  96. package/dist/index53.js +75 -26
  97. package/dist/index53.js.map +1 -1
  98. package/dist/index54.cjs +22 -19
  99. package/dist/index54.cjs.map +1 -1
  100. package/dist/index54.js +22 -19
  101. package/dist/index54.js.map +1 -1
  102. package/dist/index57.cjs +10 -19
  103. package/dist/index57.cjs.map +1 -1
  104. package/dist/index57.js +11 -20
  105. package/dist/index57.js.map +1 -1
  106. package/dist/index58.cjs +35 -5
  107. package/dist/index58.cjs.map +1 -1
  108. package/dist/index58.js +36 -6
  109. package/dist/index58.js.map +1 -1
  110. package/dist/index59.cjs +19 -10
  111. package/dist/index59.cjs.map +1 -1
  112. package/dist/index59.js +19 -10
  113. package/dist/index59.js.map +1 -1
  114. package/dist/index60.cjs +34 -10
  115. package/dist/index60.cjs.map +1 -1
  116. package/dist/index60.js +35 -11
  117. package/dist/index60.js.map +1 -1
  118. package/dist/index61.cjs +19 -64
  119. package/dist/index61.cjs.map +1 -1
  120. package/dist/index61.js +20 -65
  121. package/dist/index61.js.map +1 -1
  122. package/dist/index62.cjs +2 -11
  123. package/dist/index62.cjs.map +1 -1
  124. package/dist/index62.js +3 -12
  125. package/dist/index62.js.map +1 -1
  126. package/dist/index63.cjs +20 -2
  127. package/dist/index63.cjs.map +1 -1
  128. package/dist/index63.js +21 -3
  129. package/dist/index63.js.map +1 -1
  130. package/dist/index64.cjs +76 -31
  131. package/dist/index64.cjs.map +1 -1
  132. package/dist/index64.js +76 -31
  133. package/dist/index64.js.map +1 -1
  134. package/dist/index65.cjs +16 -19
  135. package/dist/index65.cjs.map +1 -1
  136. package/dist/index65.js +16 -19
  137. package/dist/index65.js.map +1 -1
  138. package/dist/index66.cjs +2 -14
  139. package/dist/index66.cjs.map +1 -1
  140. package/dist/index66.js +2 -14
  141. package/dist/index66.js.map +1 -1
  142. package/dist/index67.cjs +66 -30
  143. package/dist/index67.cjs.map +1 -1
  144. package/dist/index67.js +66 -30
  145. package/dist/index67.js.map +1 -1
  146. package/dist/index69.cjs +16 -19
  147. package/dist/index69.cjs.map +1 -1
  148. package/dist/index69.js +16 -19
  149. package/dist/index69.js.map +1 -1
  150. package/dist/index70.cjs +10 -13
  151. package/dist/index70.cjs.map +1 -1
  152. package/dist/index70.js +10 -13
  153. package/dist/index70.js.map +1 -1
  154. package/dist/index71.cjs +9 -9
  155. package/dist/index71.js +10 -10
  156. package/dist/index72.cjs +2 -5
  157. package/dist/index72.cjs.map +1 -1
  158. package/dist/index72.js +2 -5
  159. package/dist/index72.js.map +1 -1
  160. package/dist/index73.cjs +5 -38
  161. package/dist/index73.cjs.map +1 -1
  162. package/dist/index73.js +6 -39
  163. package/dist/index73.js.map +1 -1
  164. package/dist/index74.cjs +37 -16
  165. package/dist/index74.cjs.map +1 -1
  166. package/dist/index74.js +38 -17
  167. package/dist/index74.js.map +1 -1
  168. package/dist/index75.cjs +43 -34
  169. package/dist/index75.cjs.map +1 -1
  170. package/dist/index75.js +43 -34
  171. package/dist/index75.js.map +1 -1
  172. package/dist/index76.cjs +50 -2
  173. package/dist/index76.cjs.map +1 -1
  174. package/dist/index76.js +51 -3
  175. package/dist/index76.js.map +1 -1
  176. package/dist/index77.cjs +134 -58
  177. package/dist/index77.cjs.map +1 -1
  178. package/dist/index77.js +133 -57
  179. package/dist/index77.js.map +1 -1
  180. package/dist/index78.cjs +40 -25
  181. package/dist/index78.cjs.map +1 -1
  182. package/dist/index78.js +40 -25
  183. package/dist/index78.js.map +1 -1
  184. package/dist/index79.cjs +13 -49
  185. package/dist/index79.cjs.map +1 -1
  186. package/dist/index79.js +14 -50
  187. package/dist/index79.js.map +1 -1
  188. package/dist/index80.cjs +49 -43
  189. package/dist/index80.cjs.map +1 -1
  190. package/dist/index80.js +50 -44
  191. package/dist/index80.js.map +1 -1
  192. package/dist/index81.cjs +28 -31
  193. package/dist/index81.cjs.map +1 -1
  194. package/dist/index81.js +28 -31
  195. package/dist/index81.js.map +1 -1
  196. package/dist/index82.cjs +52 -16
  197. package/dist/index82.cjs.map +1 -1
  198. package/dist/index82.js +52 -16
  199. package/dist/index82.js.map +1 -1
  200. package/dist/index83.cjs +30 -54
  201. package/dist/index83.cjs.map +1 -1
  202. package/dist/index83.js +30 -54
  203. package/dist/index83.js.map +1 -1
  204. package/dist/index84.cjs +13 -16
  205. package/dist/index84.cjs.map +1 -1
  206. package/dist/index84.js +14 -17
  207. package/dist/index84.js.map +1 -1
  208. package/dist/index85.cjs +35 -77
  209. package/dist/index85.cjs.map +1 -1
  210. package/dist/index85.js +35 -77
  211. package/dist/index85.js.map +1 -1
  212. package/dist/index86.cjs +22 -134
  213. package/dist/index86.cjs.map +1 -1
  214. package/dist/index86.js +21 -133
  215. package/dist/index86.js.map +1 -1
  216. package/dist/index87.cjs +4 -40
  217. package/dist/index87.cjs.map +1 -1
  218. package/dist/index87.js +5 -41
  219. package/dist/index87.js.map +1 -1
  220. package/dist/index88.cjs +25 -28
  221. package/dist/index88.cjs.map +1 -1
  222. package/dist/index88.js +25 -28
  223. package/dist/index88.js.map +1 -1
  224. package/dist/index9.cjs +1 -1
  225. package/dist/index9.js +1 -1
  226. package/dist/style.css +37 -16
  227. package/package.json +1 -1
package/dist/index29.cjs CHANGED
@@ -4,8 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
6
  const useClickOutside = require("./index4.cjs");
7
- const constants = require("./index51.cjs");
8
- const MultiSelectDropdown_module = require("./index85.cjs");
7
+ const constants = require("./index53.cjs");
8
+ const MultiSelectDropdown_module = require("./index64.cjs");
9
9
  const arraysMatch = (a, b) => {
10
10
  if (a.length !== b.length) return false;
11
11
  const set = new Set(b);
@@ -20,7 +20,9 @@ const MultiSelectDropdown = ({
20
20
  error = null,
21
21
  allowCustomValues = false,
22
22
  customTriggerLabel,
23
- selectionMode
23
+ selectionMode,
24
+ emptyMeansAll = false,
25
+ triggerSummary = "text"
24
26
  }) => {
25
27
  const [isOpen, setIsOpen] = react.useState(false);
26
28
  const [searchTerm, setSearchTerm] = react.useState("");
@@ -44,10 +46,10 @@ const MultiSelectDropdown = ({
44
46
  });
45
47
  }, [normalizedOptions, searchTerm]);
46
48
  const allOptionValues = react.useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);
47
- const initialSelection = react.useMemo(
48
- () => Array.isArray(selected) && selected.length ? Array.from(new Set(selected)) : allOptionValues,
49
- [selected, allOptionValues]
50
- );
49
+ const initialSelection = react.useMemo(() => {
50
+ if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));
51
+ return emptyMeansAll ? allOptionValues : [];
52
+ }, [selected, allOptionValues, emptyMeansAll]);
51
53
  const [pendingSelection, setPendingSelection] = react.useState(initialSelection);
52
54
  const closeAndReset = react.useCallback(() => {
53
55
  setIsOpen(false);
@@ -134,8 +136,8 @@ const MultiSelectDropdown = ({
134
136
  /* @__PURE__ */ jsxRuntime.jsx("svg", { className: MultiSelectDropdown_module.default.chevron, width: constants.ICON_SIZE.MD, height: constants.ICON_SIZE.MD, viewBox: constants.SVG_VIEWBOX, fill: "none", stroke: "currentColor", strokeWidth: constants.SVG_STROKE_WIDTH, strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" }) }),
135
137
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: MultiSelectDropdown_module.default.label, children: label }),
136
138
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: MultiSelectDropdown_module.default.valueGroup, children: [
137
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: MultiSelectDropdown_module.default.value, children: customTriggerLabel || getSelectedLabel() }),
138
- isActiveFilter && /* @__PURE__ */ jsxRuntime.jsx("span", { className: MultiSelectDropdown_module.default.badge, children: selectedCountValue }),
139
+ triggerSummary === "text" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: MultiSelectDropdown_module.default.value, children: customTriggerLabel || getSelectedLabel() }),
140
+ (triggerSummary === "count" ? selectedSize > 0 : isActiveFilter) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: MultiSelectDropdown_module.default.badge, children: selectedCountValue }),
139
141
  isActiveFilter && /* @__PURE__ */ jsxRuntime.jsx(
140
142
  "div",
141
143
  {
@@ -1 +1 @@
1
- {"version":3,"file":"index29.cjs","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(\n () => (Array.isArray(selected) && selected.length ? Array.from(new Set(selected)) : allOptionValues),\n [selected, allOptionValues],\n );\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n {isActiveFilter && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"dialog\" aria-label={`${label} filter`}>\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button type=\"button\" className={styles.chip} onClick={handleSelectAll} disabled={shouldDisableControls}>\n Select all\n </button>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleClearAll} disabled={pendingSize === 0}>\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && <p className={clsx(styles.status, styles.statusError)}>{error}</p>}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.chip} onClick={handleApply} disabled={!hasChanges}>\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useRef","useMemo","useCallback","useClickOutside","useEffect","styles","jsx","clsx","jsxs","ICON_SIZE","SVG_VIEWBOX","SVG_STROKE_WIDTH"],"mappings":"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"}
1
+ {"version":3,"file":"index29.cjs","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n /** Treat an empty `selected` array as \"all selected\" (opt-in, legacy behavior). */\n emptyMeansAll?: boolean;\n /** What the trigger shows as a summary: the value label ('text') or just the count badge ('count'). */\n triggerSummary?: 'text' | 'count';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n emptyMeansAll = false,\n triggerSummary = 'text',\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(() => {\n if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));\n return emptyMeansAll ? allOptionValues : [];\n }, [selected, allOptionValues, emptyMeansAll]);\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n {triggerSummary === 'text' && (\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n )}\n {(triggerSummary === 'count' ? selectedSize > 0 : isActiveFilter) && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"dialog\" aria-label={`${label} filter`}>\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button type=\"button\" className={styles.chip} onClick={handleSelectAll} disabled={shouldDisableControls}>\n Select all\n </button>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleClearAll} disabled={pendingSize === 0}>\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && <p className={clsx(styles.status, styles.statusError)}>{error}</p>}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.chip} onClick={handleApply} disabled={!hasChanges}>\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useRef","useMemo","useCallback","useClickOutside","useEffect","styles","jsx","clsx","jsxs","ICON_SIZE","SVG_VIEWBOX","SVG_STROKE_WIDTH"],"mappings":"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"}
package/dist/index29.js CHANGED
@@ -2,8 +2,8 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useRef, useMemo, useCallback, useEffect } from "react";
3
3
  import { clsx } from "./index48.js";
4
4
  import { useClickOutside } from "./index4.js";
5
- import { SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index51.js";
6
- import styles from "./index85.js";
5
+ import { SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index53.js";
6
+ import styles from "./index64.js";
7
7
  const arraysMatch = (a, b) => {
8
8
  if (a.length !== b.length) return false;
9
9
  const set = new Set(b);
@@ -18,7 +18,9 @@ const MultiSelectDropdown = ({
18
18
  error = null,
19
19
  allowCustomValues = false,
20
20
  customTriggerLabel,
21
- selectionMode
21
+ selectionMode,
22
+ emptyMeansAll = false,
23
+ triggerSummary = "text"
22
24
  }) => {
23
25
  const [isOpen, setIsOpen] = useState(false);
24
26
  const [searchTerm, setSearchTerm] = useState("");
@@ -42,10 +44,10 @@ const MultiSelectDropdown = ({
42
44
  });
43
45
  }, [normalizedOptions, searchTerm]);
44
46
  const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);
45
- const initialSelection = useMemo(
46
- () => Array.isArray(selected) && selected.length ? Array.from(new Set(selected)) : allOptionValues,
47
- [selected, allOptionValues]
48
- );
47
+ const initialSelection = useMemo(() => {
48
+ if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));
49
+ return emptyMeansAll ? allOptionValues : [];
50
+ }, [selected, allOptionValues, emptyMeansAll]);
49
51
  const [pendingSelection, setPendingSelection] = useState(initialSelection);
50
52
  const closeAndReset = useCallback(() => {
51
53
  setIsOpen(false);
@@ -132,8 +134,8 @@ const MultiSelectDropdown = ({
132
134
  /* @__PURE__ */ jsx("svg", { className: styles.chevron, width: ICON_SIZE.MD, height: ICON_SIZE.MD, viewBox: SVG_VIEWBOX, fill: "none", stroke: "currentColor", strokeWidth: SVG_STROKE_WIDTH, strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" }) }),
133
135
  /* @__PURE__ */ jsx("span", { className: styles.label, children: label }),
134
136
  /* @__PURE__ */ jsxs("div", { className: styles.valueGroup, children: [
135
- /* @__PURE__ */ jsx("span", { className: styles.value, children: customTriggerLabel || getSelectedLabel() }),
136
- isActiveFilter && /* @__PURE__ */ jsx("span", { className: styles.badge, children: selectedCountValue }),
137
+ triggerSummary === "text" && /* @__PURE__ */ jsx("span", { className: styles.value, children: customTriggerLabel || getSelectedLabel() }),
138
+ (triggerSummary === "count" ? selectedSize > 0 : isActiveFilter) && /* @__PURE__ */ jsx("span", { className: styles.badge, children: selectedCountValue }),
137
139
  isActiveFilter && /* @__PURE__ */ jsx(
138
140
  "div",
139
141
  {
@@ -1 +1 @@
1
- {"version":3,"file":"index29.js","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(\n () => (Array.isArray(selected) && selected.length ? Array.from(new Set(selected)) : allOptionValues),\n [selected, allOptionValues],\n );\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n {isActiveFilter && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"dialog\" aria-label={`${label} filter`}>\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button type=\"button\" className={styles.chip} onClick={handleSelectAll} disabled={shouldDisableControls}>\n Select all\n </button>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleClearAll} disabled={pendingSize === 0}>\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && <p className={clsx(styles.status, styles.statusError)}>{error}</p>}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.chip} onClick={handleApply} disabled={!hasChanges}>\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index29.js","sources":["../src/composites/MultiSelectDropdown/MultiSelectDropdown.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { ICON_SIZE, SVG_VIEWBOX, SVG_STROKE_WIDTH } from '../../constants';\nimport styles from './MultiSelectDropdown.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label?: string;\n count?: number;\n}\n\nexport interface MultiSelectDropdownProps {\n /** Label displayed on the trigger button. */\n label: string;\n /** Available options. */\n options: MultiSelectOption[];\n /** Currently selected values (controlled). */\n selected: string[];\n /** Called when the user applies a new selection. */\n onApply: (values: string[], metadata: { selectionMode: 'all' | 'custom' }) => void;\n /** Show loading indicator and disable controls. */\n isLoading?: boolean;\n /** Error message to display in the option list. */\n error?: string | null;\n /** Allow creating options from the search term. */\n allowCustomValues?: boolean;\n /** Override the trigger value label. */\n customTriggerLabel?: string;\n /** Explicit selection mode override. */\n selectionMode?: 'all' | 'custom';\n /** Treat an empty `selected` array as \"all selected\" (opt-in, legacy behavior). */\n emptyMeansAll?: boolean;\n /** What the trigger shows as a summary: the value label ('text') or just the count badge ('count'). */\n triggerSummary?: 'text' | 'count';\n}\n\nconst arraysMatch = (a: string[], b: string[]): boolean => {\n if (a.length !== b.length) return false;\n const set = new Set(b);\n return a.every((v) => set.has(v));\n};\n\nexport const MultiSelectDropdown = ({\n label,\n options,\n selected,\n onApply,\n isLoading = false,\n error = null,\n allowCustomValues = false,\n customTriggerLabel,\n selectionMode,\n emptyMeansAll = false,\n triggerSummary = 'text',\n}: MultiSelectDropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n const normalizedOptions = useMemo<MultiSelectOption[]>(() => {\n const map = new Map<string, MultiSelectOption>();\n options.forEach((opt) => map.set(opt.value, opt));\n if (Array.isArray(selected)) {\n selected.forEach((v) => {\n if (v && !map.has(v)) map.set(v, { value: v });\n });\n }\n return Array.from(map.values());\n }, [options, selected]);\n\n const filteredOptions = useMemo<MultiSelectOption[]>(() => {\n if (!searchTerm.trim()) return normalizedOptions;\n const term = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter((opt) => {\n const lbl = opt.label ?? opt.value;\n return lbl.toLowerCase().includes(term) || opt.value.toLowerCase().includes(term);\n });\n }, [normalizedOptions, searchTerm]);\n\n const allOptionValues = useMemo(() => normalizedOptions.map((o) => o.value), [normalizedOptions]);\n\n const initialSelection = useMemo(() => {\n if (Array.isArray(selected) && selected.length) return Array.from(new Set(selected));\n return emptyMeansAll ? allOptionValues : [];\n }, [selected, allOptionValues, emptyMeansAll]);\n\n const [pendingSelection, setPendingSelection] = useState<string[]>(initialSelection);\n\n const closeAndReset = useCallback(() => {\n setIsOpen(false);\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }, [initialSelection]);\n\n useClickOutside(containerRef, closeAndReset);\n\n useEffect(() => {\n if (isOpen) {\n setPendingSelection(initialSelection);\n setSearchTerm('');\n }\n }, [isOpen, initialSelection]);\n\n useEffect(() => {\n if (!isOpen) setPendingSelection(initialSelection);\n }, [initialSelection, isOpen]);\n\n const handleToggleOption = (value: string) => {\n setPendingSelection((prev) => {\n const unique = Array.from(new Set(prev));\n return unique.includes(value) ? unique.filter((v) => v !== value) : [...unique, value];\n });\n };\n\n const handleSelectAll = () => {\n if (filteredOptions.length === 0) {\n setPendingSelection([]);\n return;\n }\n setPendingSelection(filteredOptions.map((o) => o.value));\n };\n\n const handleClearAll = () => setPendingSelection([]);\n\n const handleApply = () => {\n const unique = Array.from(new Set(pendingSelection));\n const mode: 'all' | 'custom' =\n unique.length === 0 || unique.length === normalizedOptions.length ? 'all' : 'custom';\n onApply(unique, { selectionMode: mode });\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n setPendingSelection(Array.from(new Set(Array.isArray(selected) ? selected : [])));\n setIsOpen(false);\n };\n\n const pendingSet = useMemo(() => new Set(pendingSelection), [pendingSelection]);\n const selectedSet = useMemo(() => new Set(Array.isArray(selected) ? selected : []), [selected]);\n const hasChanges = !arraysMatch(Array.from(pendingSet), Array.from(selectedSet));\n\n const totalOptions = normalizedOptions.length;\n const selectedSize = selectedSet.size;\n const pendingSize = pendingSet.size;\n const isSelectedAll = selectedSize === 0 || selectedSize === totalOptions;\n const isPendingAll = pendingSize === 0 || pendingSize === totalOptions;\n const selectedCountValue = isSelectedAll ? totalOptions : selectedSize;\n const pendingCountValue = isPendingAll ? totalOptions : pendingSize;\n\n const isActiveFilter = selectionMode !== undefined ? selectionMode === 'custom' : !isSelectedAll;\n\n const getSelectedLabel = (): string => {\n if (isSelectedAll) return 'All';\n if (selectedSize === 1) {\n const val = Array.from(selectedSet)[0];\n const opt = normalizedOptions.find((o) => o.value === val);\n return opt?.label || opt?.value || String(selectedCountValue);\n }\n return String(selectedCountValue);\n };\n\n const shouldDisableControls = isLoading || options.length === 0;\n\n const normalizedSearch = searchTerm.trim();\n const canCreateCustom =\n allowCustomValues &&\n normalizedSearch.length > 0 &&\n !normalizedOptions.some((o) => o.value.toLowerCase() === normalizedSearch.toLowerCase());\n\n const handleCreateCustom = () => {\n if (!normalizedSearch) return;\n setPendingSelection((prev) => Array.from(new Set([...prev, normalizedSearch])));\n setSearchTerm('');\n };\n\n const handleClearFilter = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onApply([], { selectionMode: 'all' });\n };\n\n return (\n <div className={styles.root} ref={containerRef}>\n <button\n type=\"button\"\n className={clsx(styles.trigger, { [styles.active]: isOpen })}\n onClick={() => setIsOpen((prev) => !prev)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <div className={styles.triggerContent}>\n <svg className={styles.chevron} width={ICON_SIZE.MD} height={ICON_SIZE.MD} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <span className={styles.label}>{label}</span>\n <div className={styles.valueGroup}>\n {triggerSummary === 'text' && (\n <span className={styles.value}>{customTriggerLabel || getSelectedLabel()}</span>\n )}\n {(triggerSummary === 'count' ? selectedSize > 0 : isActiveFilter) && (\n <span className={styles.badge}>{selectedCountValue}</span>\n )}\n {isActiveFilter && (\n <div\n role=\"button\"\n tabIndex={0}\n className={styles.clear}\n onClick={handleClearFilter}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClearFilter(e as unknown as React.MouseEvent);\n }\n }}\n aria-label={`Clear ${label} filter`}\n >\n <svg width={ICON_SIZE.SM} height={ICON_SIZE.SM} viewBox={SVG_VIEWBOX} fill=\"none\" stroke=\"currentColor\" strokeWidth={SVG_STROKE_WIDTH} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </div>\n )}\n </div>\n </div>\n </button>\n\n {isOpen && (\n <div className={styles.panel} role=\"dialog\" aria-label={`${label} filter`}>\n <div className={styles.header}>\n <input\n type=\"search\"\n className={styles.search}\n placeholder={`Search ${label.toLowerCase()}`}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n disabled={shouldDisableControls}\n />\n <div className={styles.headerActions}>\n <button type=\"button\" className={styles.chip} onClick={handleSelectAll} disabled={shouldDisableControls}>\n Select all\n </button>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleClearAll} disabled={pendingSize === 0}>\n Deselect all\n </button>\n </div>\n </div>\n\n <div className={styles.list} role=\"listbox\">\n {isLoading && <p className={styles.status}>Loading options...</p>}\n {!isLoading && error && <p className={clsx(styles.status, styles.statusError)}>{error}</p>}\n {!isLoading && !error && filteredOptions.length === 0 && (\n <p className={styles.status}>No matches</p>\n )}\n {!isLoading &&\n !error &&\n filteredOptions.map((opt) => {\n const checked = pendingSet.has(opt.value);\n return (\n <label key={opt.value} className={styles.option}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => handleToggleOption(opt.value)}\n aria-checked={checked}\n />\n <span className={styles.optionLabel}>\n {opt.label ?? opt.value}\n {opt.count !== undefined && (\n <span className={styles.optionCount}>{opt.count}</span>\n )}\n </span>\n </label>\n );\n })}\n {!isLoading && !error && canCreateCustom && (\n <button type=\"button\" className={styles.create} onClick={handleCreateCustom}>\n Use &quot;{normalizedSearch}&quot;\n </button>\n )}\n </div>\n\n <div className={styles.footer}>\n <span className={styles.selection}>\n {isPendingAll ? 'All selected' : `${pendingCountValue} selected`}\n {hasChanges && (\n <span className={styles.selectionDelta}>\n ({pendingCountValue - selectedCountValue >= 0 ? '+' : ''}\n {pendingCountValue - selectedCountValue})\n </span>\n )}\n </span>\n <div className={styles.footerActions}>\n <button type=\"button\" className={clsx(styles.chip, styles.chipGhost)} onClick={handleCancel}>\n Cancel\n </button>\n <button type=\"button\" className={styles.chip} onClick={handleApply} disabled={!hasChanges}>\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index30.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const NavItem_module = require("./index57.cjs");
6
+ const NavItem_module = require("./index61.cjs");
7
7
  const NavItem = react.forwardRef(
8
8
  ({ icon, label, active = false, badge, collapsed = false, disabled = false, href, onClick, className }, ref) => {
9
9
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
package/dist/index30.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index57.js";
4
+ import styles from "./index61.js";
5
5
  const NavItem = forwardRef(
6
6
  ({ icon, label, active = false, badge, collapsed = false, disabled = false, href, onClick, className }, ref) => {
7
7
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
package/dist/index31.cjs CHANGED
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const constants = require("./index51.cjs");
7
- const Pagination_module = require("./index74.cjs");
6
+ const constants = require("./index53.cjs");
7
+ const Pagination_module = require("./index65.cjs");
8
8
  function range(start, end) {
9
9
  const out = [];
10
10
  for (let page = start; page <= end; page += 1) out.push(page);
package/dist/index31.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import { PAGINATION, SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index51.js";
5
- import styles from "./index74.js";
4
+ import { PAGINATION, SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index53.js";
5
+ import styles from "./index65.js";
6
6
  function range(start, end) {
7
7
  const out = [];
8
8
  for (let page = start; page <= end; page += 1) out.push(page);
package/dist/index32.cjs CHANGED
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const constants = require("./index51.cjs");
6
- const ResizableSplitPanel_module = require("./index66.cjs");
5
+ const constants = require("./index53.cjs");
6
+ const ResizableSplitPanel_module = require("./index79.cjs");
7
7
  const FULL_PERCENT = 100;
8
8
  const ResizableSplitPanel = ({
9
9
  leftPanel,
package/dist/index32.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useRef, useCallback, useEffect } from "react";
3
- import { KEYBOARD_STEP } from "./index51.js";
4
- import styles from "./index66.js";
3
+ import { KEYBOARD_STEP } from "./index53.js";
4
+ import styles from "./index79.js";
5
5
  const FULL_PERCENT = 100;
6
6
  const ResizableSplitPanel = ({
7
7
  leftPanel,
package/dist/index33.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const Row_module = require("./index61.cjs");
6
+ const Row_module = require("./index67.cjs");
7
7
  const gapClass = {
8
8
  none: Row_module.default.gapNone,
9
9
  "2xs": Row_module.default.gap2xs,
package/dist/index33.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index61.js";
4
+ import styles from "./index67.js";
5
5
  const gapClass = {
6
6
  none: styles.gapNone,
7
7
  "2xs": styles.gap2xs,
package/dist/index34.cjs CHANGED
@@ -4,8 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const ReactECharts = require("echarts-for-react");
6
6
  const clsx = require("./index48.cjs");
7
- const constants = require("./index51.cjs");
8
- const SankeyChartCard_module = require("./index73.cjs");
7
+ const constants = require("./index53.cjs");
8
+ const SankeyChartCard_module = require("./index74.cjs");
9
9
  const COLOR_METRIC_OPTIONS = [
10
10
  { value: "deviation", label: "Deviation" },
11
11
  { value: "severity", label: "Severity" },
package/dist/index34.js CHANGED
@@ -2,8 +2,8 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from "react";
3
3
  import ReactECharts from "echarts-for-react";
4
4
  import { clsx } from "./index48.js";
5
- import { MAX_SANKEY_NODES, CHART_COLORS } from "./index51.js";
6
- import styles from "./index73.js";
5
+ import { MAX_SANKEY_NODES, CHART_COLORS } from "./index53.js";
6
+ import styles from "./index74.js";
7
7
  const COLOR_METRIC_OPTIONS = [
8
8
  { value: "deviation", label: "Deviation" },
9
9
  { value: "severity", label: "Severity" },
package/dist/index35.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const SegmentedControl_module = require("./index54.cjs");
6
+ const SegmentedControl_module = require("./index49.cjs");
7
7
  function nextEnabledIndex(options, from, step) {
8
8
  const count = options.length;
9
9
  for (let i = 1; i <= count; i += 1) {
package/dist/index35.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef, useRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index54.js";
4
+ import styles from "./index49.js";
5
5
  function nextEnabledIndex(options, from, step) {
6
6
  const count = options.length;
7
7
  for (let i = 1; i <= count; i += 1) {
package/dist/index36.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const Select_module = require("./index63.cjs");
6
+ const Select_module = require("./index66.cjs");
7
7
  const Select = react.forwardRef(
8
8
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("select", { ref, className: clsx.clsx(Select_module.default.root, className), ...props, children })
9
9
  );
package/dist/index36.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index63.js";
4
+ import styles from "./index66.js";
5
5
  const Select = forwardRef(
6
6
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx("select", { ref, className: clsx(styles.root, className), ...props, children })
7
7
  );
package/dist/index37.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const clsx = require("./index48.cjs");
5
- const SettingsLayout_module = require("./index71.cjs");
5
+ const SettingsLayout_module = require("./index86.cjs");
6
6
  const SettingsLayout = ({
7
7
  sidebar,
8
8
  children,
package/dist/index37.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { clsx } from "./index48.js";
3
- import styles from "./index71.js";
3
+ import styles from "./index86.js";
4
4
  const SettingsLayout = ({
5
5
  sidebar,
6
6
  children,
package/dist/index38.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const constants = require("./index51.cjs");
6
+ const constants = require("./index53.cjs");
7
7
  const Sidebar_module = require("./index68.cjs");
8
8
  const SidebarContext = react.createContext({ isCollapsed: false });
9
9
  const useSidebarContext = () => react.useContext(SidebarContext);
package/dist/index38.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useContext, useState, useId, createContext } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import { SIDEBAR } from "./index51.js";
4
+ import { SIDEBAR } from "./index53.js";
5
5
  import styles from "./index68.js";
6
6
  const SidebarContext = createContext({ isCollapsed: false });
7
7
  const useSidebarContext = () => useContext(SidebarContext);
package/dist/index39.cjs CHANGED
@@ -5,8 +5,8 @@ const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
6
  const useClickOutside = require("./index4.cjs");
7
7
  const useEscapeKey = require("./index5.cjs");
8
- const constants = require("./index51.cjs");
9
- const SingleSelectDropdown_module = require("./index83.cjs");
8
+ const constants = require("./index53.cjs");
9
+ const SingleSelectDropdown_module = require("./index80.cjs");
10
10
  const SingleSelectDropdown = ({
11
11
  label,
12
12
  options,
package/dist/index39.js CHANGED
@@ -3,8 +3,8 @@ import { useState, useRef, useCallback, useMemo } from "react";
3
3
  import { clsx } from "./index48.js";
4
4
  import { useClickOutside } from "./index4.js";
5
5
  import { useEscapeKey } from "./index5.js";
6
- import { SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index51.js";
7
- import styles from "./index83.js";
6
+ import { SVG_STROKE_WIDTH, SVG_VIEWBOX, ICON_SIZE } from "./index53.js";
7
+ import styles from "./index80.js";
8
8
  const SingleSelectDropdown = ({
9
9
  label,
10
10
  options,
package/dist/index40.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const Sparkline_module = require("./index72.cjs");
6
+ const Sparkline_module = require("./index87.cjs");
7
7
  const PAD = 3;
8
8
  const Sparkline = react.forwardRef(
9
9
  ({
package/dist/index40.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index72.js";
4
+ import styles from "./index87.js";
5
5
  const PAD = 3;
6
6
  const Sparkline = forwardRef(
7
7
  ({
package/dist/index41.cjs CHANGED
@@ -4,9 +4,9 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const ReactECharts = require("echarts-for-react");
6
6
  const clsx = require("./index48.cjs");
7
- const constants = require("./index51.cjs");
8
- const buildChartOptions = require("./index86.cjs");
9
- const StackedBarChartCard_module = require("./index87.cjs");
7
+ const constants = require("./index53.cjs");
8
+ const buildChartOptions = require("./index77.cjs");
9
+ const StackedBarChartCard_module = require("./index78.cjs");
10
10
  const CHART_TYPE_LABELS = {
11
11
  bar: "Bar",
12
12
  pie: "Pie",
package/dist/index41.js CHANGED
@@ -2,9 +2,9 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useMemo, useCallback } from "react";
3
3
  import ReactECharts from "echarts-for-react";
4
4
  import { clsx } from "./index48.js";
5
- import { MAX_CATEGORIES, MAX_SUBCATEGORIES } from "./index51.js";
6
- import { aggregateData, buildBarOption, buildSunburstOption, buildPieOption } from "./index86.js";
7
- import styles from "./index87.js";
5
+ import { MAX_CATEGORIES, MAX_SUBCATEGORIES } from "./index53.js";
6
+ import { aggregateData, buildBarOption, buildSunburstOption, buildPieOption } from "./index77.js";
7
+ import styles from "./index78.js";
8
8
  const CHART_TYPE_LABELS = {
9
9
  bar: "Bar",
10
10
  pie: "Pie",
package/dist/index42.cjs CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const clsx = require("./index48.cjs");
6
- const StatCard_module = require("./index53.cjs");
6
+ const StatCard_module = require("./index54.cjs");
7
7
  const StatCard = react.forwardRef(
8
8
  ({
9
9
  label,
package/dist/index42.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { clsx } from "./index48.js";
4
- import styles from "./index53.js";
4
+ import styles from "./index54.js";
5
5
  const StatCard = forwardRef(
6
6
  ({
7
7
  label,
package/dist/index43.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const clsx = require("./index48.cjs");
5
- const Table_module = require("./index58.cjs");
5
+ const Table_module = require("./index73.cjs");
6
6
  const TableContainer = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx(Table_module.default.container, className), ...props });
7
7
  const Table = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx("table", { className: clsx.clsx(Table_module.default.root, className), ...props });
8
8
  exports.Table = Table;
package/dist/index43.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { clsx } from "./index48.js";
3
- import styles from "./index58.js";
3
+ import styles from "./index73.js";
4
4
  const TableContainer = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: clsx(styles.container, className), ...props });
5
5
  const Table = ({ className, ...props }) => /* @__PURE__ */ jsx("table", { className: clsx(styles.root, className), ...props });
6
6
  export {