@mastra/playground-ui 39.0.1-alpha.2 → 40.0.0-alpha.3

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 (142) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/components/CodeBlock.cjs.js +4 -3
  3. package/dist/components/CodeBlock.cjs.js.map +1 -1
  4. package/dist/components/CodeBlock.es.js +4 -3
  5. package/dist/components/CodeBlock.es.js.map +1 -1
  6. package/dist/components/ContentBlocks.cjs.js +1 -0
  7. package/dist/components/ContentBlocks.cjs.js.map +1 -1
  8. package/dist/components/ContentBlocks.es.js +1 -0
  9. package/dist/components/ContentBlocks.es.js.map +1 -1
  10. package/dist/components/DataFilter.cjs.js +3 -5
  11. package/dist/components/DataFilter.cjs.js.map +1 -1
  12. package/dist/components/DataFilter.es.js +3 -5
  13. package/dist/components/DataFilter.es.js.map +1 -1
  14. package/dist/components/DataList.cjs.js +1 -1
  15. package/dist/components/DataList.es.js +1 -1
  16. package/dist/components/DateTimePicker.cjs.js +1 -1
  17. package/dist/components/DateTimePicker.es.js +1 -1
  18. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  19. package/dist/components/DateTimeRangePicker.es.js +1 -1
  20. package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
  21. package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
  22. package/dist/components/ItemList.cjs.js +2 -0
  23. package/dist/components/ItemList.cjs.js.map +1 -1
  24. package/dist/components/ItemList.es.js +2 -0
  25. package/dist/components/ItemList.es.js.map +1 -1
  26. package/dist/components/RuleBuilder.cjs.js +4 -2
  27. package/dist/components/RuleBuilder.cjs.js.map +1 -1
  28. package/dist/components/RuleBuilder.es.js +4 -2
  29. package/dist/components/RuleBuilder.es.js.map +1 -1
  30. package/dist/components/Tabs.cjs.js +1 -1
  31. package/dist/components/Tabs.es.js +1 -1
  32. package/dist/components/Tree.cjs.js +3 -2
  33. package/dist/components/Tree.cjs.js.map +1 -1
  34. package/dist/components/Tree.es.js +3 -2
  35. package/dist/components/Tree.es.js.map +1 -1
  36. package/dist/data-list-top-cell-B27jd1HH.js.map +1 -1
  37. package/dist/data-list-top-cell-DummeYkE.cjs.map +1 -1
  38. package/dist/{date-time-range-picker-BL2NxcTo.js → date-time-range-picker-Dsyc_jOU.js} +2 -2
  39. package/dist/{date-time-range-picker-BL2NxcTo.js.map → date-time-range-picker-Dsyc_jOU.js.map} +1 -1
  40. package/dist/{date-time-range-picker-DY3GLaiu.cjs → date-time-range-picker-mAwcchzy.cjs} +2 -2
  41. package/dist/{date-time-range-picker-DY3GLaiu.cjs.map → date-time-range-picker-mAwcchzy.cjs.map} +1 -1
  42. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js +6 -4
  43. package/dist/domains/logs/hooks/use-logs-list-navigation.cjs.js.map +1 -1
  44. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js +6 -4
  45. package/dist/domains/logs/hooks/use-logs-list-navigation.es.js.map +1 -1
  46. package/dist/domains/memory/components/flame-graph.cjs.js +5 -1
  47. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  48. package/dist/domains/memory/components/flame-graph.es.js +5 -1
  49. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  50. package/dist/domains/memory/components/observation-detail-view.cjs.js +9 -5
  51. package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
  52. package/dist/domains/memory/components/observation-detail-view.es.js +9 -5
  53. package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
  54. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  55. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  56. package/dist/domains/metrics/components/latency-card-view.cjs.js +1 -1
  57. package/dist/domains/metrics/components/latency-card-view.es.js +1 -1
  58. package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
  59. package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
  60. package/dist/domains/metrics/components/scores-card-view.cjs.js +2 -2
  61. package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
  62. package/dist/domains/metrics/components/scores-card-view.es.js +2 -2
  63. package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
  64. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
  65. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
  66. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +1 -1
  67. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +1 -1
  68. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
  69. package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
  70. package/dist/domains/metrics/hooks/use-metrics-filters.cjs.js +4 -3
  71. package/dist/domains/metrics/hooks/use-metrics-filters.cjs.js.map +1 -1
  72. package/dist/domains/metrics/hooks/use-metrics-filters.es.js +4 -3
  73. package/dist/domains/metrics/hooks/use-metrics-filters.es.js.map +1 -1
  74. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +1 -0
  75. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
  76. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +1 -0
  77. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
  78. package/dist/domains/metrics/metrics-filters.cjs.js +2 -1
  79. package/dist/domains/metrics/metrics-filters.cjs.js.map +1 -1
  80. package/dist/domains/metrics/metrics-filters.es.js +2 -1
  81. package/dist/domains/metrics/metrics-filters.es.js.map +1 -1
  82. package/dist/domains/traces/components/shared.cjs.js +1 -1
  83. package/dist/domains/traces/components/shared.cjs.js.map +1 -1
  84. package/dist/domains/traces/components/shared.es.js +1 -1
  85. package/dist/domains/traces/components/shared.es.js.map +1 -1
  86. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  87. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  88. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  89. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  90. package/dist/domains/traces/hooks/use-trace-list-navigation.cjs.js +8 -2
  91. package/dist/domains/traces/hooks/use-trace-list-navigation.cjs.js.map +1 -1
  92. package/dist/domains/traces/hooks/use-trace-list-navigation.es.js +8 -2
  93. package/dist/domains/traces/hooks/use-trace-list-navigation.es.js.map +1 -1
  94. package/dist/domains/traces/hooks/use-trace-span-navigation.cjs.js +8 -2
  95. package/dist/domains/traces/hooks/use-trace-span-navigation.cjs.js.map +1 -1
  96. package/dist/domains/traces/hooks/use-trace-span-navigation.es.js +8 -2
  97. package/dist/domains/traces/hooks/use-trace-span-navigation.es.js.map +1 -1
  98. package/dist/domains/traces/hooks/use-traces.cjs.js +2 -0
  99. package/dist/domains/traces/hooks/use-traces.cjs.js.map +1 -1
  100. package/dist/domains/traces/hooks/use-traces.es.js +2 -0
  101. package/dist/domains/traces/hooks/use-traces.es.js.map +1 -1
  102. package/dist/ee/signals/components/signal-details-page.cjs.js +1 -1
  103. package/dist/ee/signals/components/signal-details-page.es.js +1 -1
  104. package/dist/ee/topics/utils.cjs.js +1 -1
  105. package/dist/ee/topics/utils.cjs.js.map +1 -1
  106. package/dist/ee/topics/utils.es.js +1 -1
  107. package/dist/ee/topics/utils.es.js.map +1 -1
  108. package/dist/{env-file-uuok37Ac.js → env-file-BITYowCx.js} +5 -2
  109. package/dist/env-file-BITYowCx.js.map +1 -0
  110. package/dist/{env-file-C6u8aJM0.cjs → env-file-BU2hStkm.cjs} +5 -2
  111. package/dist/env-file-BU2hStkm.cjs.map +1 -0
  112. package/dist/hooks/use-environment-variables-editor.cjs.js +8 -3
  113. package/dist/hooks/use-environment-variables-editor.cjs.js.map +1 -1
  114. package/dist/hooks/use-environment-variables-editor.es.js +8 -3
  115. package/dist/hooks/use-environment-variables-editor.es.js.map +1 -1
  116. package/dist/hooks/use-in-view.cjs.js +1 -0
  117. package/dist/hooks/use-in-view.cjs.js.map +1 -1
  118. package/dist/hooks/use-in-view.es.js +1 -0
  119. package/dist/hooks/use-in-view.es.js.map +1 -1
  120. package/dist/src/ds/components/Tabs/tabs-list.d.ts +17 -2
  121. package/dist/src/ds/components/Tabs/tabs.stories.d.ts +2 -1
  122. package/dist/{tabs-tab-B7Ziuuh8.cjs → tabs-tab-BeUPTvaP.cjs} +3 -2
  123. package/dist/tabs-tab-BeUPTvaP.cjs.map +1 -0
  124. package/dist/{tabs-tab-XnMoa1fn.js → tabs-tab-CaZnZdY8.js} +3 -2
  125. package/dist/tabs-tab-CaZnZdY8.js.map +1 -0
  126. package/dist/{time-picker-ji6mao2A.js → time-picker-CBBi1dOV.js} +18 -9
  127. package/dist/time-picker-CBBi1dOV.js.map +1 -0
  128. package/dist/{time-picker-D5qUadVb.cjs → time-picker-DmBH2LAb.cjs} +18 -9
  129. package/dist/time-picker-DmBH2LAb.cjs.map +1 -0
  130. package/dist/{traces-data-list-DzqdihE7.js → traces-data-list-B_5TPfYF.js} +4 -3
  131. package/dist/traces-data-list-B_5TPfYF.js.map +1 -0
  132. package/dist/{traces-data-list-BpQO8ZSH.cjs → traces-data-list-D7QLXnsh.cjs} +4 -3
  133. package/dist/traces-data-list-D7QLXnsh.cjs.map +1 -0
  134. package/package.json +6 -6
  135. package/dist/env-file-C6u8aJM0.cjs.map +0 -1
  136. package/dist/env-file-uuok37Ac.js.map +0 -1
  137. package/dist/tabs-tab-B7Ziuuh8.cjs.map +0 -1
  138. package/dist/tabs-tab-XnMoa1fn.js.map +0 -1
  139. package/dist/time-picker-D5qUadVb.cjs.map +0 -1
  140. package/dist/time-picker-ji6mao2A.js.map +0 -1
  141. package/dist/traces-data-list-BpQO8ZSH.cjs.map +0 -1
  142. package/dist/traces-data-list-DzqdihE7.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 40.0.0-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Deprecated the legacy line TabList fallback for new tabs while keeping existing tabs compatible. ([#18978](https://github.com/mastra-ai/mastra/pull/18978))
8
+
9
+ - Improved playground-ui's safety around array and object access. ([#18860](https://github.com/mastra-ai/mastra/pull/18860))
10
+ This release reduces the risk of undefined reads without changing behavior.
11
+ - Updated dependencies [[`b291760`](https://github.com/mastra-ai/mastra/commit/b291760df9d6c7e4fc72606c8f0a4af2cf6e946c), [`29b7ea6`](https://github.com/mastra-ai/mastra/commit/29b7ea64e72b5523d5bdcbd34ee03d2b854d54e1), [`82f0f43`](https://github.com/mastra-ai/mastra/commit/82f0f439600871ca2d20ab6fced2c68db1e42536), [`10959d5`](https://github.com/mastra-ai/mastra/commit/10959d509d824f682d40ff96e05ee044aec3b0e5), [`ffc3c17`](https://github.com/mastra-ai/mastra/commit/ffc3c17274ea17c11aa6f73d3140649cd7fc8abc), [`3908e53`](https://github.com/mastra-ai/mastra/commit/3908e53ce04bbea04f5e0c097d7aa298c35fabee), [`3908e53`](https://github.com/mastra-ai/mastra/commit/3908e53ce04bbea04f5e0c097d7aa298c35fabee)]:
12
+ - @mastra/core@1.50.0-alpha.3
13
+ - @mastra/react@1.2.3-alpha.3
14
+ - @mastra/client-js@1.31.0-alpha.3
15
+
3
16
  ## 39.0.1-alpha.2
4
17
 
5
18
  ### Patch Changes
@@ -6,7 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
6
6
  const code = require('../code-B3WONxnA.cjs');
7
7
  const copyButton = require('../copy-button-DN9mi_LV.cjs');
8
8
  const select = require('../select-BxSmi19p.cjs');
9
- const tabsTab = require('../tabs-tab-B7Ziuuh8.cjs');
9
+ const tabsTab = require('../tabs-tab-BeUPTvaP.cjs');
10
10
  const primitives_transitions = require('../primitives/transitions.cjs.js');
11
11
  const utils_cn = require('../cn-vA5sWo9W.cjs');
12
12
 
@@ -27,7 +27,8 @@ function CodeBlock({
27
27
  const hasOptions = options && options.length > 0;
28
28
  const useTabs = hasOptions && selector === "tabs";
29
29
  const useSelect = hasOptions && selector === "select";
30
- const activeValue = value ?? options?.[0]?.value;
30
+ const firstOption = options?.[0];
31
+ const activeValue = value ?? firstOption?.value;
31
32
  return /* @__PURE__ */ jsxRuntime.jsxs(
32
33
  "figure",
33
34
  {
@@ -36,7 +37,7 @@ function CodeBlock({
36
37
  className
37
38
  ),
38
39
  children: [
39
- useTabs && options && /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tabs, { defaultTab: options[0].value, value: activeValue, onValueChange: onValueChange ?? (() => {
40
+ useTabs && firstOption && /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tabs, { defaultTab: firstOption.value, value: activeValue, onValueChange: onValueChange ?? (() => {
40
41
  }), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-stretch", children: [
41
42
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(tabsTab.TabList, { children: options.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(tabsTab.Tab, { value: opt.value, children: opt.label }, opt.value)) }) }),
42
43
  actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center border-b border-border1 pr-2 pl-3", children: actions })
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.cjs.js","sources":["../../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const activeValue = value ?? options?.[0]?.value;\n\n return (\n <figure\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border2/40 bg-surface2',\n className,\n )}\n >\n {useTabs && options && (\n <Tabs defaultTab={options[0].value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border1 pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border2/40 px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border2/40 px-4 py-2\">\n <figcaption className=\"font-mono text-ui-sm text-neutral4\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border2/40 px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-ui-sm text-neutral5',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'whitespace-pre-wrap break-all',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 pointer-fine:opacity-0 group-hover:opacity-100 group-focus-within:opacity-100',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":["code","jsxs","cn","jsx","Tabs","TabList","Tab","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Code","CopyButton","transitions"],"mappings":"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"}
1
+ {"version":3,"file":"CodeBlock.cjs.js","sources":["../../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border2/40 bg-surface2',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border1 pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border2/40 px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border2/40 px-4 py-2\">\n <figcaption className=\"font-mono text-ui-sm text-neutral4\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border2/40 px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-ui-sm text-neutral5',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'whitespace-pre-wrap break-all',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 pointer-fine:opacity-0 group-hover:opacity-100 group-focus-within:opacity-100',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":["code","jsxs","cn","jsx","Tabs","TabList","Tab","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Code","CopyButton","transitions"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { C as Code } from '../code-C5KVVzOZ.js';
3
3
  import { C as CopyButton } from '../copy-button-CJjjhHKN.js';
4
4
  import { S as Select, d as SelectTrigger, e as SelectValue, a as SelectContent, c as SelectItem } from '../select-CFB6QZ9B.js';
5
- import { b as Tabs, a as TabList, T as Tab } from '../tabs-tab-XnMoa1fn.js';
5
+ import { b as Tabs, a as TabList, T as Tab } from '../tabs-tab-CaZnZdY8.js';
6
6
  import { transitions } from '../primitives/transitions.es.js';
7
7
  import { c as cn } from '../cn-BakJzhuv.js';
8
8
 
@@ -23,7 +23,8 @@ function CodeBlock({
23
23
  const hasOptions = options && options.length > 0;
24
24
  const useTabs = hasOptions && selector === "tabs";
25
25
  const useSelect = hasOptions && selector === "select";
26
- const activeValue = value ?? options?.[0]?.value;
26
+ const firstOption = options?.[0];
27
+ const activeValue = value ?? firstOption?.value;
27
28
  return /* @__PURE__ */ jsxs(
28
29
  "figure",
29
30
  {
@@ -32,7 +33,7 @@ function CodeBlock({
32
33
  className
33
34
  ),
34
35
  children: [
35
- useTabs && options && /* @__PURE__ */ jsx(Tabs, { defaultTab: options[0].value, value: activeValue, onValueChange: onValueChange ?? (() => {
36
+ useTabs && firstOption && /* @__PURE__ */ jsx(Tabs, { defaultTab: firstOption.value, value: activeValue, onValueChange: onValueChange ?? (() => {
36
37
  }), children: /* @__PURE__ */ jsxs("div", { className: "flex items-stretch", children: [
37
38
  /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx(TabList, { children: options.map((opt) => /* @__PURE__ */ jsx(Tab, { value: opt.value, children: opt.label }, opt.value)) }) }),
38
39
  actions && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center border-b border-border1 pr-2 pl-3", children: actions })
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.es.js","sources":["../../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const activeValue = value ?? options?.[0]?.value;\n\n return (\n <figure\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border2/40 bg-surface2',\n className,\n )}\n >\n {useTabs && options && (\n <Tabs defaultTab={options[0].value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border1 pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border2/40 px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border2/40 px-4 py-2\">\n <figcaption className=\"font-mono text-ui-sm text-neutral4\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border2/40 px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-ui-sm text-neutral5',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'whitespace-pre-wrap break-all',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 pointer-fine:opacity-0 group-hover:opacity-100 group-focus-within:opacity-100',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CodeBlock.es.js","sources":["../../src/ds/components/CodeBlock/code-block.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Code } from '../Code/code';\nimport { CopyButton } from '../CopyButton/copy-button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../Select/select';\nimport { TabList } from '../Tabs/tabs-list';\nimport { Tabs } from '../Tabs/tabs-root';\nimport { Tab } from '../Tabs/tabs-tab';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type CodeBlockSelector = 'select' | 'tabs';\n\nexport type CodeBlockOverflow = 'wrap' | 'scroll';\n\nexport interface CodeBlockOption {\n label: string;\n value: string;\n}\n\nexport interface CodeBlockProps {\n code: string;\n options?: CodeBlockOption[];\n value?: string;\n onValueChange?: (value: string) => void;\n selector?: CodeBlockSelector;\n fileName?: string;\n lang?: string;\n /** `wrap` (default) breaks long lines — best for commands and snippets.\n * `scroll` preserves columns behind a horizontal scroll — best for source code. */\n overflow?: CodeBlockOverflow;\n copyMessage?: string;\n copyTooltip?: string;\n actions?: ReactNode;\n className?: string;\n}\n\nexport function CodeBlock({\n code,\n options,\n value,\n onValueChange,\n selector = 'select',\n fileName,\n lang,\n overflow = 'wrap',\n copyMessage,\n copyTooltip,\n actions,\n className,\n}: CodeBlockProps) {\n const hasOptions = options && options.length > 0;\n const useTabs = hasOptions && selector === 'tabs';\n const useSelect = hasOptions && selector === 'select';\n const firstOption = options?.[0];\n const activeValue = value ?? firstOption?.value;\n\n return (\n <figure\n className={cn(\n 'group relative flex w-full flex-col overflow-hidden rounded-2xl border border-border2/40 bg-surface2',\n className,\n )}\n >\n {useTabs && firstOption && (\n <Tabs defaultTab={firstOption.value} value={activeValue} onValueChange={onValueChange ?? (() => {})}>\n <div className=\"flex items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <TabList>\n {options.map(opt => (\n <Tab key={opt.value} value={opt.value}>\n {opt.label}\n </Tab>\n ))}\n </TabList>\n </div>\n {actions && <div className=\"flex shrink-0 items-center border-b border-border1 pr-2 pl-3\">{actions}</div>}\n </div>\n </Tabs>\n )}\n\n {useSelect && options && (\n <div className=\"flex items-center border-b border-border2/40 px-2 py-1.5\">\n <Select value={activeValue} onValueChange={onValueChange}>\n <SelectTrigger size=\"sm\" variant=\"ghost\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options.map(opt => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && fileName && (\n <div className=\"flex items-center border-b border-border2/40 px-4 py-2\">\n <figcaption className=\"font-mono text-ui-sm text-neutral4\">{fileName}</figcaption>\n {actions && <div className=\"ml-auto flex items-center\">{actions}</div>}\n </div>\n )}\n\n {!hasOptions && !fileName && actions && (\n <div className=\"flex items-center justify-end border-b border-border2/40 px-2 py-1.5\">{actions}</div>\n )}\n\n <div className=\"relative\">\n <Code\n code={code}\n lang={lang}\n className={cn(\n 'px-4 py-3 font-mono text-ui-sm text-neutral5',\n overflow === 'scroll' ? 'overflow-x-auto whitespace-pre' : 'whitespace-pre-wrap break-all',\n )}\n />\n <CopyButton\n content={code}\n copyMessage={copyMessage}\n tooltip={copyTooltip}\n size=\"sm\"\n className={cn(\n 'absolute top-2 right-2 opacity-100 pointer-fine:opacity-0 group-hover:opacity-100 group-focus-within:opacity-100',\n transitions.opacity,\n )}\n />\n </div>\n </figure>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ const dnd = require('@hello-pangea/dnd');
8
8
  const reorder = (list, startIndex, endIndex) => {
9
9
  const result = Array.from(list);
10
10
  const [removed] = result.splice(startIndex, 1);
11
+ if (removed === void 0) return result;
11
12
  result.splice(endIndex, 0, removed);
12
13
  return result;
13
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ContentBlocks.cjs.js","sources":["../../src/ds/components/ContentBlocks/content-blocks.tsx","../../src/ds/components/ContentBlocks/content-block.tsx"],"sourcesContent":["import type { DropResult, DroppableProvided } from '@hello-pangea/dnd';\nimport { DragDropContext, Droppable } from '@hello-pangea/dnd';\n\nexport interface ContentBlocksProps<T> {\n children: React.ReactNode;\n items: Array<T>;\n onChange: (items: Array<T>) => void;\n className?: string;\n}\n\nconst reorder = <T,>(list: Array<T>, startIndex: number, endIndex: number): Array<T> => {\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n return result;\n};\n\nexport function ContentBlocks<T>({ children, items, onChange, className }: ContentBlocksProps<T>) {\n const handleDragEnd = (result: DropResult) => {\n if (!result.destination) return;\n\n const nextItems = reorder(items, result.source.index, result.destination.index);\n\n onChange(nextItems);\n };\n\n return (\n <DragDropContext onDragEnd={handleDragEnd}>\n <Droppable droppableId=\"droppable\">\n {(provided: DroppableProvided) => (\n <div {...provided.droppableProps} ref={provided.innerRef} className={className}>\n {children}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n","import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd';\nimport { Draggable } from '@hello-pangea/dnd';\n\nexport type ContentBlockChildren =\n | React.ReactNode\n | ((dragHandleProps: DraggableProvidedDragHandleProps | null) => React.ReactNode);\n\nexport interface ContentBlockProps {\n children: ContentBlockChildren;\n index: number;\n draggableId: string;\n className?: string;\n}\n\nexport const ContentBlock = ({ children, index, draggableId, className }: ContentBlockProps) => {\n const isRenderProp = typeof children === 'function';\n\n return (\n <Draggable draggableId={draggableId} index={index}>\n {provided => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...(isRenderProp ? {} : provided.dragHandleProps)}\n className={className}\n style={provided.draggableProps.style}\n >\n {isRenderProp ? children(provided.dragHandleProps) : children}\n </div>\n )}\n </Draggable>\n );\n};\n"],"names":["DragDropContext","jsx","Droppable","jsxs","Draggable"],"mappings":";;;;;;;AAUA,MAAM,OAAA,GAAU,CAAK,IAAA,EAAgB,UAAA,EAAoB,QAAA,KAA+B;AACtF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7C,EAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,SAAS,cAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAU,EAA0B;AAChG,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAuB;AAC5C,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AAEzB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,sCACGA,mBAAA,EAAA,EAAgB,SAAA,EAAW,eAC1B,QAAA,kBAAAC,cAAA,CAACC,aAAA,EAAA,EAAU,aAAY,WAAA,EACpB,QAAA,EAAA,CAAC,QAAA,qBACAC,eAAA,CAAC,SAAK,GAAG,QAAA,CAAS,gBAAgB,GAAA,EAAK,QAAA,CAAS,UAAU,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS;AAAA,GAAA,EACZ,GAEJ,CAAA,EACF,CAAA;AAEJ;;ACxBO,MAAM,eAAe,CAAC,EAAE,UAAU,KAAA,EAAO,WAAA,EAAa,WAAU,KAAyB;AAC9F,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,UAAA;AAEzC,EAAA,uBACEF,cAAA,CAACG,aAAA,EAAA,EAAU,WAAA,EAA0B,KAAA,EAClC,QAAA,EAAA,CAAA,QAAA,qBACCH,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,QAAA,CAAS,QAAA;AAAA,MACb,GAAG,QAAA,CAAS,cAAA;AAAA,MACZ,GAAI,YAAA,GAAe,EAAC,GAAI,QAAA,CAAS,eAAA;AAAA,MAClC,SAAA;AAAA,MACA,KAAA,EAAO,SAAS,cAAA,CAAe,KAAA;AAAA,MAE9B,QAAA,EAAA,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,GAAI;AAAA;AAAA,GACvD,EAEJ,CAAA;AAEJ;;;;;"}
1
+ {"version":3,"file":"ContentBlocks.cjs.js","sources":["../../src/ds/components/ContentBlocks/content-blocks.tsx","../../src/ds/components/ContentBlocks/content-block.tsx"],"sourcesContent":["import type { DropResult, DroppableProvided } from '@hello-pangea/dnd';\nimport { DragDropContext, Droppable } from '@hello-pangea/dnd';\n\nexport interface ContentBlocksProps<T> {\n children: React.ReactNode;\n items: Array<T>;\n onChange: (items: Array<T>) => void;\n className?: string;\n}\n\nconst reorder = <T,>(list: Array<T>, startIndex: number, endIndex: number): Array<T> => {\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n if (removed === undefined) return result;\n result.splice(endIndex, 0, removed);\n return result;\n};\n\nexport function ContentBlocks<T>({ children, items, onChange, className }: ContentBlocksProps<T>) {\n const handleDragEnd = (result: DropResult) => {\n if (!result.destination) return;\n\n const nextItems = reorder(items, result.source.index, result.destination.index);\n\n onChange(nextItems);\n };\n\n return (\n <DragDropContext onDragEnd={handleDragEnd}>\n <Droppable droppableId=\"droppable\">\n {(provided: DroppableProvided) => (\n <div {...provided.droppableProps} ref={provided.innerRef} className={className}>\n {children}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n","import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd';\nimport { Draggable } from '@hello-pangea/dnd';\n\nexport type ContentBlockChildren =\n | React.ReactNode\n | ((dragHandleProps: DraggableProvidedDragHandleProps | null) => React.ReactNode);\n\nexport interface ContentBlockProps {\n children: ContentBlockChildren;\n index: number;\n draggableId: string;\n className?: string;\n}\n\nexport const ContentBlock = ({ children, index, draggableId, className }: ContentBlockProps) => {\n const isRenderProp = typeof children === 'function';\n\n return (\n <Draggable draggableId={draggableId} index={index}>\n {provided => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...(isRenderProp ? {} : provided.dragHandleProps)}\n className={className}\n style={provided.draggableProps.style}\n >\n {isRenderProp ? children(provided.dragHandleProps) : children}\n </div>\n )}\n </Draggable>\n );\n};\n"],"names":["DragDropContext","jsx","Droppable","jsxs","Draggable"],"mappings":";;;;;;;AAUA,MAAM,OAAA,GAAU,CAAK,IAAA,EAAgB,UAAA,EAAoB,QAAA,KAA+B;AACtF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7C,EAAA,IAAI,OAAA,KAAY,QAAW,OAAO,MAAA;AAClC,EAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,SAAS,cAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAU,EAA0B;AAChG,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAuB;AAC5C,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AAEzB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,sCACGA,mBAAA,EAAA,EAAgB,SAAA,EAAW,eAC1B,QAAA,kBAAAC,cAAA,CAACC,aAAA,EAAA,EAAU,aAAY,WAAA,EACpB,QAAA,EAAA,CAAC,QAAA,qBACAC,eAAA,CAAC,SAAK,GAAG,QAAA,CAAS,gBAAgB,GAAA,EAAK,QAAA,CAAS,UAAU,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS;AAAA,GAAA,EACZ,GAEJ,CAAA,EACF,CAAA;AAEJ;;ACzBO,MAAM,eAAe,CAAC,EAAE,UAAU,KAAA,EAAO,WAAA,EAAa,WAAU,KAAyB;AAC9F,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,UAAA;AAEzC,EAAA,uBACEF,cAAA,CAACG,aAAA,EAAA,EAAU,WAAA,EAA0B,KAAA,EAClC,QAAA,EAAA,CAAA,QAAA,qBACCH,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,QAAA,CAAS,QAAA;AAAA,MACb,GAAG,QAAA,CAAS,cAAA;AAAA,MACZ,GAAI,YAAA,GAAe,EAAC,GAAI,QAAA,CAAS,eAAA;AAAA,MAClC,SAAA;AAAA,MACA,KAAA,EAAO,SAAS,cAAA,CAAe,KAAA;AAAA,MAE9B,QAAA,EAAA,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,GAAI;AAAA;AAAA,GACvD,EAEJ,CAAA;AAEJ;;;;;"}
@@ -4,6 +4,7 @@ import { DragDropContext, Droppable, Draggable } from '@hello-pangea/dnd';
4
4
  const reorder = (list, startIndex, endIndex) => {
5
5
  const result = Array.from(list);
6
6
  const [removed] = result.splice(startIndex, 1);
7
+ if (removed === void 0) return result;
7
8
  result.splice(endIndex, 0, removed);
8
9
  return result;
9
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ContentBlocks.es.js","sources":["../../src/ds/components/ContentBlocks/content-blocks.tsx","../../src/ds/components/ContentBlocks/content-block.tsx"],"sourcesContent":["import type { DropResult, DroppableProvided } from '@hello-pangea/dnd';\nimport { DragDropContext, Droppable } from '@hello-pangea/dnd';\n\nexport interface ContentBlocksProps<T> {\n children: React.ReactNode;\n items: Array<T>;\n onChange: (items: Array<T>) => void;\n className?: string;\n}\n\nconst reorder = <T,>(list: Array<T>, startIndex: number, endIndex: number): Array<T> => {\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n return result;\n};\n\nexport function ContentBlocks<T>({ children, items, onChange, className }: ContentBlocksProps<T>) {\n const handleDragEnd = (result: DropResult) => {\n if (!result.destination) return;\n\n const nextItems = reorder(items, result.source.index, result.destination.index);\n\n onChange(nextItems);\n };\n\n return (\n <DragDropContext onDragEnd={handleDragEnd}>\n <Droppable droppableId=\"droppable\">\n {(provided: DroppableProvided) => (\n <div {...provided.droppableProps} ref={provided.innerRef} className={className}>\n {children}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n","import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd';\nimport { Draggable } from '@hello-pangea/dnd';\n\nexport type ContentBlockChildren =\n | React.ReactNode\n | ((dragHandleProps: DraggableProvidedDragHandleProps | null) => React.ReactNode);\n\nexport interface ContentBlockProps {\n children: ContentBlockChildren;\n index: number;\n draggableId: string;\n className?: string;\n}\n\nexport const ContentBlock = ({ children, index, draggableId, className }: ContentBlockProps) => {\n const isRenderProp = typeof children === 'function';\n\n return (\n <Draggable draggableId={draggableId} index={index}>\n {provided => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...(isRenderProp ? {} : provided.dragHandleProps)}\n className={className}\n style={provided.draggableProps.style}\n >\n {isRenderProp ? children(provided.dragHandleProps) : children}\n </div>\n )}\n </Draggable>\n );\n};\n"],"names":[],"mappings":";;;AAUA,MAAM,OAAA,GAAU,CAAK,IAAA,EAAgB,UAAA,EAAoB,QAAA,KAA+B;AACtF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7C,EAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,SAAS,cAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAU,EAA0B;AAChG,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAuB;AAC5C,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AAEzB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,2BACG,eAAA,EAAA,EAAgB,SAAA,EAAW,eAC1B,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,aAAY,WAAA,EACpB,QAAA,EAAA,CAAC,QAAA,qBACA,IAAA,CAAC,SAAK,GAAG,QAAA,CAAS,gBAAgB,GAAA,EAAK,QAAA,CAAS,UAAU,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS;AAAA,GAAA,EACZ,GAEJ,CAAA,EACF,CAAA;AAEJ;;ACxBO,MAAM,eAAe,CAAC,EAAE,UAAU,KAAA,EAAO,WAAA,EAAa,WAAU,KAAyB;AAC9F,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,UAAA;AAEzC,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAA0B,KAAA,EAClC,QAAA,EAAA,CAAA,QAAA,qBACC,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,QAAA,CAAS,QAAA;AAAA,MACb,GAAG,QAAA,CAAS,cAAA;AAAA,MACZ,GAAI,YAAA,GAAe,EAAC,GAAI,QAAA,CAAS,eAAA;AAAA,MAClC,SAAA;AAAA,MACA,KAAA,EAAO,SAAS,cAAA,CAAe,KAAA;AAAA,MAE9B,QAAA,EAAA,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,GAAI;AAAA;AAAA,GACvD,EAEJ,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ContentBlocks.es.js","sources":["../../src/ds/components/ContentBlocks/content-blocks.tsx","../../src/ds/components/ContentBlocks/content-block.tsx"],"sourcesContent":["import type { DropResult, DroppableProvided } from '@hello-pangea/dnd';\nimport { DragDropContext, Droppable } from '@hello-pangea/dnd';\n\nexport interface ContentBlocksProps<T> {\n children: React.ReactNode;\n items: Array<T>;\n onChange: (items: Array<T>) => void;\n className?: string;\n}\n\nconst reorder = <T,>(list: Array<T>, startIndex: number, endIndex: number): Array<T> => {\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n if (removed === undefined) return result;\n result.splice(endIndex, 0, removed);\n return result;\n};\n\nexport function ContentBlocks<T>({ children, items, onChange, className }: ContentBlocksProps<T>) {\n const handleDragEnd = (result: DropResult) => {\n if (!result.destination) return;\n\n const nextItems = reorder(items, result.source.index, result.destination.index);\n\n onChange(nextItems);\n };\n\n return (\n <DragDropContext onDragEnd={handleDragEnd}>\n <Droppable droppableId=\"droppable\">\n {(provided: DroppableProvided) => (\n <div {...provided.droppableProps} ref={provided.innerRef} className={className}>\n {children}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n","import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd';\nimport { Draggable } from '@hello-pangea/dnd';\n\nexport type ContentBlockChildren =\n | React.ReactNode\n | ((dragHandleProps: DraggableProvidedDragHandleProps | null) => React.ReactNode);\n\nexport interface ContentBlockProps {\n children: ContentBlockChildren;\n index: number;\n draggableId: string;\n className?: string;\n}\n\nexport const ContentBlock = ({ children, index, draggableId, className }: ContentBlockProps) => {\n const isRenderProp = typeof children === 'function';\n\n return (\n <Draggable draggableId={draggableId} index={index}>\n {provided => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...(isRenderProp ? {} : provided.dragHandleProps)}\n className={className}\n style={provided.draggableProps.style}\n >\n {isRenderProp ? children(provided.dragHandleProps) : children}\n </div>\n )}\n </Draggable>\n );\n};\n"],"names":[],"mappings":";;;AAUA,MAAM,OAAA,GAAU,CAAK,IAAA,EAAgB,UAAA,EAAoB,QAAA,KAA+B;AACtF,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7C,EAAA,IAAI,OAAA,KAAY,QAAW,OAAO,MAAA;AAClC,EAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,SAAS,cAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,WAAU,EAA0B;AAChG,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAuB;AAC5C,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AAEzB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,KAAA,EAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAE9E,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,2BACG,eAAA,EAAA,EAAgB,SAAA,EAAW,eAC1B,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,aAAY,WAAA,EACpB,QAAA,EAAA,CAAC,QAAA,qBACA,IAAA,CAAC,SAAK,GAAG,QAAA,CAAS,gBAAgB,GAAA,EAAK,QAAA,CAAS,UAAU,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,QAAA,CAAS;AAAA,GAAA,EACZ,GAEJ,CAAA,EACF,CAAA;AAEJ;;ACzBO,MAAM,eAAe,CAAC,EAAE,UAAU,KAAA,EAAO,WAAA,EAAa,WAAU,KAAyB;AAC9F,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,UAAA;AAEzC,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAU,WAAA,EAA0B,KAAA,EAClC,QAAA,EAAA,CAAA,QAAA,qBACC,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,QAAA,CAAS,QAAA;AAAA,MACb,GAAG,QAAA,CAAS,cAAA;AAAA,MACZ,GAAI,YAAA,GAAe,EAAC,GAAI,QAAA,CAAS,eAAA;AAAA,MAClC,SAAA;AAAA,MACA,KAAA,EAAO,SAAS,cAAA,CAAe,KAAA;AAAA,MAE9B,QAAA,EAAA,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,GAAI;AAAA;AAAA,GACvD,EAEJ,CAAA;AAEJ;;;;"}
@@ -170,11 +170,9 @@ function SelectDataFilter({
170
170
  ) }),
171
171
  /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenu.Separator, {}),
172
172
  grouped.map((group) => {
173
- if (group.items.length === 1 && !group.label) {
174
- return renderCategory(group.items[0]);
175
- }
176
- if (group.label && group.items.length === 1) {
177
- return renderCategory(group.items[0]);
173
+ const firstItem = group.items[0];
174
+ if (group.items.length === 1 && firstItem) {
175
+ return renderCategory(firstItem);
178
176
  }
179
177
  return /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu.Sub, { children: [
180
178
  /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenu.SubTrigger, { children: group.label }),
@@ -1 +1 @@
1
- {"version":3,"file":"DataFilter.cjs.js","sources":["../../src/ds/components/DataFilter/select-data-filter.tsx"],"sourcesContent":["import { FilterIcon, SearchIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useState, useMemo, useCallback } from 'react';\n\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { cn } from '@/lib/utils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single selectable value within a filter category */\nexport type SelectDataFilterValue = {\n value: string;\n label: string;\n};\n\n/** Selection mode for a filter category */\nexport type SelectDataFilterMode = 'single' | 'multi';\n\n/** A filter category that appears in the filter dropdown */\nexport type SelectDataFilterCategory = {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional group header (categories with the same group are nested under it) */\n group?: string;\n /** Available values to pick from */\n values: SelectDataFilterValue[];\n /** 'single' = radio, 'multi' = checkboxes. Defaults to 'multi'. */\n mode?: SelectDataFilterMode;\n};\n\n/** Current selected state: category id -> selected value(s) */\nexport type SelectDataFilterState = Record<string, string[]>;\n\nexport type SelectDataFilterProps = {\n /** Filter categories to display */\n categories: SelectDataFilterCategory[];\n /** Current filter selections */\n value: SelectDataFilterState;\n /** Called when selections change */\n onChange: (next: SelectDataFilterState) => void;\n /** Disable the trigger button */\n disabled?: boolean;\n /** Override the trigger label */\n label?: ReactNode;\n /** Content alignment */\n align?: 'start' | 'center' | 'end';\n /** Minimum items before showing search in a submenu */\n searchThreshold?: number;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst SUBMENU_SEARCH_THRESHOLD = 6;\n\nfunction SubMenuSearch({\n value,\n onChange,\n label = 'Search',\n}: {\n value: string;\n onChange: (v: string) => void;\n label?: string;\n}) {\n return (\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search...\"\n aria-label={label}\n value={value}\n onChange={e => onChange(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SelectDataFilter({\n categories,\n value,\n onChange,\n disabled,\n label = 'Filter',\n align = 'end',\n searchThreshold = SUBMENU_SEARCH_THRESHOLD,\n}: SelectDataFilterProps) {\n const [filterSearch, setFilterSearch] = useState('');\n const [subSearch, setSubSearch] = useState('');\n\n const resetSubSearch = useCallback((open: boolean) => {\n if (!open) setSubSearch('');\n }, []);\n\n // Count active filters\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const selections of Object.values(value)) {\n if (selections.length > 0) count++;\n }\n return count;\n }, [value]);\n\n // Group categories\n const grouped = useMemo(() => {\n const q = filterSearch.toLowerCase();\n const groups: { key: string; label?: string; items: SelectDataFilterCategory[] }[] = [];\n const groupMap = new Map<string, SelectDataFilterCategory[]>();\n const ungrouped: SelectDataFilterCategory[] = [];\n\n for (const cat of categories) {\n if (cat.values.length === 0) continue;\n // Filter by search\n if (q) {\n const matchesLabel = cat.label.toLowerCase().includes(q);\n const matchesValues = cat.values.some(v => v.label.toLowerCase().includes(q));\n if (!matchesLabel && !matchesValues) continue;\n }\n if (cat.group) {\n let items = groupMap.get(cat.group);\n if (!items) {\n items = [];\n groupMap.set(cat.group, items);\n }\n items.push(cat);\n } else {\n ungrouped.push(cat);\n }\n }\n\n // Ungrouped items first\n for (const cat of ungrouped) {\n groups.push({ key: cat.id, items: [cat] });\n }\n // Then grouped\n for (const [groupLabel, items] of groupMap) {\n groups.push({ key: `group-${groupLabel}`, label: groupLabel, items });\n }\n\n return groups;\n }, [categories, filterSearch]);\n\n const handleSelect = (categoryId: string, selectedValue: string, mode: SelectDataFilterMode) => {\n const current = value[categoryId] ?? [];\n let next: string[];\n\n if (mode === 'single') {\n next = current.includes(selectedValue) ? [] : [selectedValue];\n } else {\n next = current.includes(selectedValue) ? current.filter(v => v !== selectedValue) : [...current, selectedValue];\n }\n\n onChange({ ...value, [categoryId]: next });\n };\n\n const handleClearAll = () => {\n onChange({});\n };\n\n const renderCategory = (cat: SelectDataFilterCategory) => {\n const mode = cat.mode ?? 'multi';\n const selected = value[cat.id] ?? [];\n const selectedCount = selected.length;\n\n return (\n <DropdownMenu.Sub key={cat.id} onOpenChange={resetSubSearch}>\n <DropdownMenu.SubTrigger>\n <span className={cn('truncate')}>{cat.label}</span>\n {selectedCount > 0 && <span className={cn('ml-auto text-ui-sm text-accent1')}>{selectedCount}</span>}\n </DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {cat.values.length >= searchThreshold && (\n <SubMenuSearch value={subSearch} onChange={setSubSearch} label={`Search ${cat.label.toLowerCase()}`} />\n )}\n {mode === 'single' ? (\n <DropdownMenu.RadioGroup value={selected[0] ?? ''} onValueChange={val => handleSelect(cat.id, val, mode)}>\n {cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.RadioItem key={v.value} value={v.value}>\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n ) : (\n cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.CheckboxItem\n key={v.value}\n checked={selected.includes(v.value)}\n onCheckedChange={() => handleSelect(cat.id, v.value, mode)}\n onSelect={e => e.preventDefault()}\n >\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.CheckboxItem>\n ))\n )}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n };\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" disabled={disabled} size=\"md\">\n <FilterIcon />\n {label}\n {activeFilterCount > 0 && (\n <span\n className={cn(\n 'ml-0.5 inline-flex items-center justify-center rounded-full bg-accent1/50 text-neutral5 text-ui-sm w-5 h-5',\n )}\n >\n {activeFilterCount}\n </span>\n )}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align={align} className={cn('min-w-[12rem]')}>\n {/* Search */}\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search filters...\"\n aria-label=\"Search filters\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n\n <DropdownMenu.Separator />\n\n {grouped.map(group => {\n if (group.items.length === 1 && !group.label) {\n return renderCategory(group.items[0]);\n }\n\n if (group.label && group.items.length === 1) {\n // Single item in a named group — render directly with group as context\n return renderCategory(group.items[0]);\n }\n\n // Multiple items under a group label — nest under a sub-trigger\n return (\n <DropdownMenu.Sub key={group.key}>\n <DropdownMenu.SubTrigger>{group.label}</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {group.items.map(cat => renderCategory(cat))}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n })}\n\n {/* Clear all */}\n {activeFilterCount > 0 && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={handleClearAll}>\n <XIcon />\n Clear all filters\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["jsx","cn","jsxs","SearchIcon","useState","useCallback","useMemo","DropdownMenu","Button","FilterIcon","Fragment","XIcon"],"mappings":"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"}
1
+ {"version":3,"file":"DataFilter.cjs.js","sources":["../../src/ds/components/DataFilter/select-data-filter.tsx"],"sourcesContent":["import { FilterIcon, SearchIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useState, useMemo, useCallback } from 'react';\n\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { cn } from '@/lib/utils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single selectable value within a filter category */\nexport type SelectDataFilterValue = {\n value: string;\n label: string;\n};\n\n/** Selection mode for a filter category */\nexport type SelectDataFilterMode = 'single' | 'multi';\n\n/** A filter category that appears in the filter dropdown */\nexport type SelectDataFilterCategory = {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional group header (categories with the same group are nested under it) */\n group?: string;\n /** Available values to pick from */\n values: SelectDataFilterValue[];\n /** 'single' = radio, 'multi' = checkboxes. Defaults to 'multi'. */\n mode?: SelectDataFilterMode;\n};\n\n/** Current selected state: category id -> selected value(s) */\nexport type SelectDataFilterState = Record<string, string[]>;\n\nexport type SelectDataFilterProps = {\n /** Filter categories to display */\n categories: SelectDataFilterCategory[];\n /** Current filter selections */\n value: SelectDataFilterState;\n /** Called when selections change */\n onChange: (next: SelectDataFilterState) => void;\n /** Disable the trigger button */\n disabled?: boolean;\n /** Override the trigger label */\n label?: ReactNode;\n /** Content alignment */\n align?: 'start' | 'center' | 'end';\n /** Minimum items before showing search in a submenu */\n searchThreshold?: number;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst SUBMENU_SEARCH_THRESHOLD = 6;\n\nfunction SubMenuSearch({\n value,\n onChange,\n label = 'Search',\n}: {\n value: string;\n onChange: (v: string) => void;\n label?: string;\n}) {\n return (\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search...\"\n aria-label={label}\n value={value}\n onChange={e => onChange(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SelectDataFilter({\n categories,\n value,\n onChange,\n disabled,\n label = 'Filter',\n align = 'end',\n searchThreshold = SUBMENU_SEARCH_THRESHOLD,\n}: SelectDataFilterProps) {\n const [filterSearch, setFilterSearch] = useState('');\n const [subSearch, setSubSearch] = useState('');\n\n const resetSubSearch = useCallback((open: boolean) => {\n if (!open) setSubSearch('');\n }, []);\n\n // Count active filters\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const selections of Object.values(value)) {\n if (selections.length > 0) count++;\n }\n return count;\n }, [value]);\n\n // Group categories\n const grouped = useMemo(() => {\n const q = filterSearch.toLowerCase();\n const groups: { key: string; label?: string; items: SelectDataFilterCategory[] }[] = [];\n const groupMap = new Map<string, SelectDataFilterCategory[]>();\n const ungrouped: SelectDataFilterCategory[] = [];\n\n for (const cat of categories) {\n if (cat.values.length === 0) continue;\n // Filter by search\n if (q) {\n const matchesLabel = cat.label.toLowerCase().includes(q);\n const matchesValues = cat.values.some(v => v.label.toLowerCase().includes(q));\n if (!matchesLabel && !matchesValues) continue;\n }\n if (cat.group) {\n let items = groupMap.get(cat.group);\n if (!items) {\n items = [];\n groupMap.set(cat.group, items);\n }\n items.push(cat);\n } else {\n ungrouped.push(cat);\n }\n }\n\n // Ungrouped items first\n for (const cat of ungrouped) {\n groups.push({ key: cat.id, items: [cat] });\n }\n // Then grouped\n for (const [groupLabel, items] of groupMap) {\n groups.push({ key: `group-${groupLabel}`, label: groupLabel, items });\n }\n\n return groups;\n }, [categories, filterSearch]);\n\n const handleSelect = (categoryId: string, selectedValue: string, mode: SelectDataFilterMode) => {\n const current = value[categoryId] ?? [];\n let next: string[];\n\n if (mode === 'single') {\n next = current.includes(selectedValue) ? [] : [selectedValue];\n } else {\n next = current.includes(selectedValue) ? current.filter(v => v !== selectedValue) : [...current, selectedValue];\n }\n\n onChange({ ...value, [categoryId]: next });\n };\n\n const handleClearAll = () => {\n onChange({});\n };\n\n const renderCategory = (cat: SelectDataFilterCategory) => {\n const mode = cat.mode ?? 'multi';\n const selected = value[cat.id] ?? [];\n const selectedCount = selected.length;\n\n return (\n <DropdownMenu.Sub key={cat.id} onOpenChange={resetSubSearch}>\n <DropdownMenu.SubTrigger>\n <span className={cn('truncate')}>{cat.label}</span>\n {selectedCount > 0 && <span className={cn('ml-auto text-ui-sm text-accent1')}>{selectedCount}</span>}\n </DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {cat.values.length >= searchThreshold && (\n <SubMenuSearch value={subSearch} onChange={setSubSearch} label={`Search ${cat.label.toLowerCase()}`} />\n )}\n {mode === 'single' ? (\n <DropdownMenu.RadioGroup value={selected[0] ?? ''} onValueChange={val => handleSelect(cat.id, val, mode)}>\n {cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.RadioItem key={v.value} value={v.value}>\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n ) : (\n cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.CheckboxItem\n key={v.value}\n checked={selected.includes(v.value)}\n onCheckedChange={() => handleSelect(cat.id, v.value, mode)}\n onSelect={e => e.preventDefault()}\n >\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.CheckboxItem>\n ))\n )}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n };\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" disabled={disabled} size=\"md\">\n <FilterIcon />\n {label}\n {activeFilterCount > 0 && (\n <span\n className={cn(\n 'ml-0.5 inline-flex items-center justify-center rounded-full bg-accent1/50 text-neutral5 text-ui-sm w-5 h-5',\n )}\n >\n {activeFilterCount}\n </span>\n )}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align={align} className={cn('min-w-[12rem]')}>\n {/* Search */}\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search filters...\"\n aria-label=\"Search filters\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n\n <DropdownMenu.Separator />\n\n {grouped.map(group => {\n const firstItem = group.items[0];\n\n if (group.items.length === 1 && firstItem) {\n // A single category (grouped or not) renders directly, without a sub-trigger.\n return renderCategory(firstItem);\n }\n\n // Multiple items under a group label — nest under a sub-trigger\n return (\n <DropdownMenu.Sub key={group.key}>\n <DropdownMenu.SubTrigger>{group.label}</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {group.items.map(cat => renderCategory(cat))}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n })}\n\n {/* Clear all */}\n {activeFilterCount > 0 && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={handleClearAll}>\n <XIcon />\n Clear all filters\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":["jsx","cn","jsxs","SearchIcon","useState","useCallback","useMemo","DropdownMenu","Button","FilterIcon","Fragment","XIcon"],"mappings":"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"}
@@ -166,11 +166,9 @@ function SelectDataFilter({
166
166
  ) }),
167
167
  /* @__PURE__ */ jsx(DropdownMenu.Separator, {}),
168
168
  grouped.map((group) => {
169
- if (group.items.length === 1 && !group.label) {
170
- return renderCategory(group.items[0]);
171
- }
172
- if (group.label && group.items.length === 1) {
173
- return renderCategory(group.items[0]);
169
+ const firstItem = group.items[0];
170
+ if (group.items.length === 1 && firstItem) {
171
+ return renderCategory(firstItem);
174
172
  }
175
173
  return /* @__PURE__ */ jsxs(DropdownMenu.Sub, { children: [
176
174
  /* @__PURE__ */ jsx(DropdownMenu.SubTrigger, { children: group.label }),
@@ -1 +1 @@
1
- {"version":3,"file":"DataFilter.es.js","sources":["../../src/ds/components/DataFilter/select-data-filter.tsx"],"sourcesContent":["import { FilterIcon, SearchIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useState, useMemo, useCallback } from 'react';\n\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { cn } from '@/lib/utils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single selectable value within a filter category */\nexport type SelectDataFilterValue = {\n value: string;\n label: string;\n};\n\n/** Selection mode for a filter category */\nexport type SelectDataFilterMode = 'single' | 'multi';\n\n/** A filter category that appears in the filter dropdown */\nexport type SelectDataFilterCategory = {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional group header (categories with the same group are nested under it) */\n group?: string;\n /** Available values to pick from */\n values: SelectDataFilterValue[];\n /** 'single' = radio, 'multi' = checkboxes. Defaults to 'multi'. */\n mode?: SelectDataFilterMode;\n};\n\n/** Current selected state: category id -> selected value(s) */\nexport type SelectDataFilterState = Record<string, string[]>;\n\nexport type SelectDataFilterProps = {\n /** Filter categories to display */\n categories: SelectDataFilterCategory[];\n /** Current filter selections */\n value: SelectDataFilterState;\n /** Called when selections change */\n onChange: (next: SelectDataFilterState) => void;\n /** Disable the trigger button */\n disabled?: boolean;\n /** Override the trigger label */\n label?: ReactNode;\n /** Content alignment */\n align?: 'start' | 'center' | 'end';\n /** Minimum items before showing search in a submenu */\n searchThreshold?: number;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst SUBMENU_SEARCH_THRESHOLD = 6;\n\nfunction SubMenuSearch({\n value,\n onChange,\n label = 'Search',\n}: {\n value: string;\n onChange: (v: string) => void;\n label?: string;\n}) {\n return (\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search...\"\n aria-label={label}\n value={value}\n onChange={e => onChange(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SelectDataFilter({\n categories,\n value,\n onChange,\n disabled,\n label = 'Filter',\n align = 'end',\n searchThreshold = SUBMENU_SEARCH_THRESHOLD,\n}: SelectDataFilterProps) {\n const [filterSearch, setFilterSearch] = useState('');\n const [subSearch, setSubSearch] = useState('');\n\n const resetSubSearch = useCallback((open: boolean) => {\n if (!open) setSubSearch('');\n }, []);\n\n // Count active filters\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const selections of Object.values(value)) {\n if (selections.length > 0) count++;\n }\n return count;\n }, [value]);\n\n // Group categories\n const grouped = useMemo(() => {\n const q = filterSearch.toLowerCase();\n const groups: { key: string; label?: string; items: SelectDataFilterCategory[] }[] = [];\n const groupMap = new Map<string, SelectDataFilterCategory[]>();\n const ungrouped: SelectDataFilterCategory[] = [];\n\n for (const cat of categories) {\n if (cat.values.length === 0) continue;\n // Filter by search\n if (q) {\n const matchesLabel = cat.label.toLowerCase().includes(q);\n const matchesValues = cat.values.some(v => v.label.toLowerCase().includes(q));\n if (!matchesLabel && !matchesValues) continue;\n }\n if (cat.group) {\n let items = groupMap.get(cat.group);\n if (!items) {\n items = [];\n groupMap.set(cat.group, items);\n }\n items.push(cat);\n } else {\n ungrouped.push(cat);\n }\n }\n\n // Ungrouped items first\n for (const cat of ungrouped) {\n groups.push({ key: cat.id, items: [cat] });\n }\n // Then grouped\n for (const [groupLabel, items] of groupMap) {\n groups.push({ key: `group-${groupLabel}`, label: groupLabel, items });\n }\n\n return groups;\n }, [categories, filterSearch]);\n\n const handleSelect = (categoryId: string, selectedValue: string, mode: SelectDataFilterMode) => {\n const current = value[categoryId] ?? [];\n let next: string[];\n\n if (mode === 'single') {\n next = current.includes(selectedValue) ? [] : [selectedValue];\n } else {\n next = current.includes(selectedValue) ? current.filter(v => v !== selectedValue) : [...current, selectedValue];\n }\n\n onChange({ ...value, [categoryId]: next });\n };\n\n const handleClearAll = () => {\n onChange({});\n };\n\n const renderCategory = (cat: SelectDataFilterCategory) => {\n const mode = cat.mode ?? 'multi';\n const selected = value[cat.id] ?? [];\n const selectedCount = selected.length;\n\n return (\n <DropdownMenu.Sub key={cat.id} onOpenChange={resetSubSearch}>\n <DropdownMenu.SubTrigger>\n <span className={cn('truncate')}>{cat.label}</span>\n {selectedCount > 0 && <span className={cn('ml-auto text-ui-sm text-accent1')}>{selectedCount}</span>}\n </DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {cat.values.length >= searchThreshold && (\n <SubMenuSearch value={subSearch} onChange={setSubSearch} label={`Search ${cat.label.toLowerCase()}`} />\n )}\n {mode === 'single' ? (\n <DropdownMenu.RadioGroup value={selected[0] ?? ''} onValueChange={val => handleSelect(cat.id, val, mode)}>\n {cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.RadioItem key={v.value} value={v.value}>\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n ) : (\n cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.CheckboxItem\n key={v.value}\n checked={selected.includes(v.value)}\n onCheckedChange={() => handleSelect(cat.id, v.value, mode)}\n onSelect={e => e.preventDefault()}\n >\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.CheckboxItem>\n ))\n )}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n };\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" disabled={disabled} size=\"md\">\n <FilterIcon />\n {label}\n {activeFilterCount > 0 && (\n <span\n className={cn(\n 'ml-0.5 inline-flex items-center justify-center rounded-full bg-accent1/50 text-neutral5 text-ui-sm w-5 h-5',\n )}\n >\n {activeFilterCount}\n </span>\n )}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align={align} className={cn('min-w-[12rem]')}>\n {/* Search */}\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search filters...\"\n aria-label=\"Search filters\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n\n <DropdownMenu.Separator />\n\n {grouped.map(group => {\n if (group.items.length === 1 && !group.label) {\n return renderCategory(group.items[0]);\n }\n\n if (group.label && group.items.length === 1) {\n // Single item in a named group — render directly with group as context\n return renderCategory(group.items[0]);\n }\n\n // Multiple items under a group label — nest under a sub-trigger\n return (\n <DropdownMenu.Sub key={group.key}>\n <DropdownMenu.SubTrigger>{group.label}</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {group.items.map(cat => renderCategory(cat))}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n })}\n\n {/* Clear all */}\n {activeFilterCount > 0 && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={handleClearAll}>\n <XIcon />\n Clear all filters\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":";;;;;;;AA2DA,MAAM,wBAAA,GAA2B,CAAA;AAEjC,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAIG;AACD,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAW,CAAA,EAC5B,QAAA,kBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,oEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,EAAA,CAAG,oCAAoC,CAAA,EAAG,CAAA;AAAA,wBACjE,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,WAAA,EAAY,WAAA;AAAA,YACZ,YAAA,EAAY,KAAA;AAAA,YACZ,KAAA;AAAA,YACA,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACtC,SAAA,EAAW,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB;AAAA,YAClC,SAAA,EAAW,GAAG,uFAAuF;AAAA;AAAA;AACvG;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAMO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,KAAA,GAAQ,KAAA;AAAA,EACR,eAAA,GAAkB;AACpB,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,EAAE,CAAA;AAE7C,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,IAAA,KAAkB;AACpD,IAAA,IAAI,CAAC,IAAA,EAAM,YAAA,CAAa,EAAE,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AAC7C,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,KAAA,EAAA;AAAA,IAC7B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC5B,IAAA,MAAM,CAAA,GAAI,aAAa,WAAA,EAAY;AACnC,IAAA,MAAM,SAA+E,EAAC;AACtF,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAwC;AAC7D,IAAA,MAAM,YAAwC,EAAC;AAE/C,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE7B,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,MAAM,eAAe,GAAA,CAAI,KAAA,CAAM,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA;AACvD,QAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAC5E,QAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,aAAA,EAAe;AAAA,MACvC;AACA,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAClC,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,KAAA,GAAQ,EAAC;AACT,UAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,QAC/B;AACA,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,MACpB;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,IAAI,KAAA,EAAO,CAAC,GAAG,CAAA,EAAG,CAAA;AAAA,IAC3C;AAEA,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,QAAA,EAAU;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,EAAI,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAE7B,EAAA,MAAM,YAAA,GAAe,CAAC,UAAA,EAAoB,aAAA,EAAuB,IAAA,KAA+B;AAC9F,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAU,CAAA,IAAK,EAAC;AACtC,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,GAAO,QAAQ,QAAA,CAAS,aAAa,IAAI,EAAC,GAAI,CAAC,aAAa,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,aAAa,CAAA,GAAI,CAAC,GAAG,SAAS,aAAa,CAAA;AAAA,IAChH;AAEA,IAAA,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAC,UAAU,GAAG,MAAM,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAkC;AACxD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,OAAA;AACzB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,EAAE,KAAK,EAAC;AACnC,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAE/B,IAAA,uBACE,IAAA,CAAC,YAAA,CAAa,GAAA,EAAb,EAA8B,cAAc,cAAA,EAC3C,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,YAAA,CAAa,YAAb,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,SAAA,EAAW,EAAA,CAAG,UAAU,CAAA,EAAI,cAAI,KAAA,EAAM,CAAA;AAAA,QAC3C,aAAA,GAAgB,qBAAK,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,iCAAiC,GAAI,QAAA,EAAA,aAAA,EAAc;AAAA,OAAA,EAC/F,CAAA;AAAA,2BACC,YAAA,CAAa,UAAA,EAAb,EAAwB,SAAA,EAAW,EAAA,CAAG,eAAe,CAAA,EACnD,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,eAAA,oBACpB,GAAA,CAAC,iBAAc,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA,OAAA,EAAU,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA;AAAA,QAEtG,IAAA,KAAS,QAAA,mBACR,GAAA,CAAC,YAAA,CAAa,YAAb,EAAwB,KAAA,EAAO,QAAA,CAAS,CAAC,KAAK,EAAA,EAAI,aAAA,EAAe,CAAA,GAAA,KAAO,YAAA,CAAa,IAAI,EAAA,EAAI,GAAA,EAAK,IAAI,CAAA,EACpG,cAAI,MAAA,CACF,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,aAAa,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,SAAS,SAAA,CAAU,WAAA,EAAa,CAAC,EACjF,GAAA,CAAI,CAAA,CAAA,qBACH,GAAA,CAAC,YAAA,CAAa,WAAb,EAAqC,KAAA,EAAO,CAAA,CAAE,KAAA,EAC7C,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,UAAU,GAAI,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA,EAAA,EADf,CAAA,CAAE,KAE/B,CACD,CAAA,EACL,CAAA,GAEA,GAAA,CAAI,OACD,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,SAAA,IAAa,EAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,WAAA,EAAa,CAAC,CAAA,CACjF,IAAI,CAAA,CAAA,qBACH,GAAA;AAAA,UAAC,YAAA,CAAa,YAAA;AAAA,UAAb;AAAA,YAEC,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,YAClC,iBAAiB,MAAM,YAAA,CAAa,IAAI,EAAA,EAAI,CAAA,CAAE,OAAO,IAAI,CAAA;AAAA,YACzD,QAAA,EAAU,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,YAEhC,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,UAAU,CAAA,EAAI,YAAE,KAAA,EAAM;AAAA,WAAA;AAAA,UALrC,CAAA,CAAE;AAAA,SAOV;AAAA,OAAA,EAEP;AAAA,KAAA,EAAA,EAjCqB,IAAI,EAkC3B,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,KAAA,EACnB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,CAAa,OAAA,EAAb,EAAqB,OAAA,EAAO,IAAA,EAC3B,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,QAAA,EAAoB,IAAA,EAAK,IAAA,EACjD,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,CAAA;AAAA,MACX,KAAA;AAAA,MACA,oBAAoB,CAAA,oBACnB,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT;AAAA,WACF;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,aAAa,OAAA,EAAb,EAAqB,OAAc,SAAA,EAAW,EAAA,CAAG,eAAe,CAAA,EAE/D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAW,CAAA,EAC5B,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,oEAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,EAAA,CAAG,oCAAoC,CAAA,EAAG,CAAA;AAAA,4BACjE,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,WAAA,EAAY,mBAAA;AAAA,gBACZ,YAAA,EAAW,gBAAA;AAAA,gBACX,KAAA,EAAO,YAAA;AAAA,gBACP,QAAA,EAAU,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC7C,SAAA,EAAW,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB;AAAA,gBAClC,SAAA,EAAW,GAAG,uFAAuF;AAAA;AAAA;AACvG;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,YAAA,CAAa,SAAA,EAAb,EAAuB,CAAA;AAAA,MAEvB,OAAA,CAAQ,IAAI,CAAA,KAAA,KAAS;AACpB,QAAA,IAAI,MAAM,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,MAAM,KAAA,EAAO;AAC5C,UAAA,OAAO,cAAA,CAAe,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACtC;AAEA,QAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,EAAG;AAE3C,UAAA,OAAO,cAAA,CAAe,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACtC;AAGA,QAAA,uBACE,IAAA,CAAC,YAAA,CAAa,GAAA,EAAb,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,CAAa,UAAA,EAAb,EAAyB,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,0BACtC,GAAA,CAAC,YAAA,CAAa,UAAA,EAAb,EAAwB,WAAW,EAAA,CAAG,eAAe,CAAA,EACnD,QAAA,EAAA,KAAA,CAAM,MAAM,GAAA,CAAI,CAAA,GAAA,KAAO,cAAA,CAAe,GAAG,CAAC,CAAA,EAC7C;AAAA,SAAA,EAAA,EAJqB,MAAM,GAK7B,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,MAGA,iBAAA,GAAoB,qBACnB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAA,CAAa,WAAb,EAAuB,CAAA;AAAA,wBACxB,IAAA,CAAC,YAAA,CAAa,IAAA,EAAb,EAAkB,UAAU,cAAA,EAC3B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,CAAA;AAAA,UAAE;AAAA,SAAA,EAEX;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DataFilter.es.js","sources":["../../src/ds/components/DataFilter/select-data-filter.tsx"],"sourcesContent":["import { FilterIcon, SearchIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useState, useMemo, useCallback } from 'react';\n\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\nimport { cn } from '@/lib/utils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single selectable value within a filter category */\nexport type SelectDataFilterValue = {\n value: string;\n label: string;\n};\n\n/** Selection mode for a filter category */\nexport type SelectDataFilterMode = 'single' | 'multi';\n\n/** A filter category that appears in the filter dropdown */\nexport type SelectDataFilterCategory = {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional group header (categories with the same group are nested under it) */\n group?: string;\n /** Available values to pick from */\n values: SelectDataFilterValue[];\n /** 'single' = radio, 'multi' = checkboxes. Defaults to 'multi'. */\n mode?: SelectDataFilterMode;\n};\n\n/** Current selected state: category id -> selected value(s) */\nexport type SelectDataFilterState = Record<string, string[]>;\n\nexport type SelectDataFilterProps = {\n /** Filter categories to display */\n categories: SelectDataFilterCategory[];\n /** Current filter selections */\n value: SelectDataFilterState;\n /** Called when selections change */\n onChange: (next: SelectDataFilterState) => void;\n /** Disable the trigger button */\n disabled?: boolean;\n /** Override the trigger label */\n label?: ReactNode;\n /** Content alignment */\n align?: 'start' | 'center' | 'end';\n /** Minimum items before showing search in a submenu */\n searchThreshold?: number;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst SUBMENU_SEARCH_THRESHOLD = 6;\n\nfunction SubMenuSearch({\n value,\n onChange,\n label = 'Search',\n}: {\n value: string;\n onChange: (v: string) => void;\n label?: string;\n}) {\n return (\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search...\"\n aria-label={label}\n value={value}\n onChange={e => onChange(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SelectDataFilter({\n categories,\n value,\n onChange,\n disabled,\n label = 'Filter',\n align = 'end',\n searchThreshold = SUBMENU_SEARCH_THRESHOLD,\n}: SelectDataFilterProps) {\n const [filterSearch, setFilterSearch] = useState('');\n const [subSearch, setSubSearch] = useState('');\n\n const resetSubSearch = useCallback((open: boolean) => {\n if (!open) setSubSearch('');\n }, []);\n\n // Count active filters\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const selections of Object.values(value)) {\n if (selections.length > 0) count++;\n }\n return count;\n }, [value]);\n\n // Group categories\n const grouped = useMemo(() => {\n const q = filterSearch.toLowerCase();\n const groups: { key: string; label?: string; items: SelectDataFilterCategory[] }[] = [];\n const groupMap = new Map<string, SelectDataFilterCategory[]>();\n const ungrouped: SelectDataFilterCategory[] = [];\n\n for (const cat of categories) {\n if (cat.values.length === 0) continue;\n // Filter by search\n if (q) {\n const matchesLabel = cat.label.toLowerCase().includes(q);\n const matchesValues = cat.values.some(v => v.label.toLowerCase().includes(q));\n if (!matchesLabel && !matchesValues) continue;\n }\n if (cat.group) {\n let items = groupMap.get(cat.group);\n if (!items) {\n items = [];\n groupMap.set(cat.group, items);\n }\n items.push(cat);\n } else {\n ungrouped.push(cat);\n }\n }\n\n // Ungrouped items first\n for (const cat of ungrouped) {\n groups.push({ key: cat.id, items: [cat] });\n }\n // Then grouped\n for (const [groupLabel, items] of groupMap) {\n groups.push({ key: `group-${groupLabel}`, label: groupLabel, items });\n }\n\n return groups;\n }, [categories, filterSearch]);\n\n const handleSelect = (categoryId: string, selectedValue: string, mode: SelectDataFilterMode) => {\n const current = value[categoryId] ?? [];\n let next: string[];\n\n if (mode === 'single') {\n next = current.includes(selectedValue) ? [] : [selectedValue];\n } else {\n next = current.includes(selectedValue) ? current.filter(v => v !== selectedValue) : [...current, selectedValue];\n }\n\n onChange({ ...value, [categoryId]: next });\n };\n\n const handleClearAll = () => {\n onChange({});\n };\n\n const renderCategory = (cat: SelectDataFilterCategory) => {\n const mode = cat.mode ?? 'multi';\n const selected = value[cat.id] ?? [];\n const selectedCount = selected.length;\n\n return (\n <DropdownMenu.Sub key={cat.id} onOpenChange={resetSubSearch}>\n <DropdownMenu.SubTrigger>\n <span className={cn('truncate')}>{cat.label}</span>\n {selectedCount > 0 && <span className={cn('ml-auto text-ui-sm text-accent1')}>{selectedCount}</span>}\n </DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {cat.values.length >= searchThreshold && (\n <SubMenuSearch value={subSearch} onChange={setSubSearch} label={`Search ${cat.label.toLowerCase()}`} />\n )}\n {mode === 'single' ? (\n <DropdownMenu.RadioGroup value={selected[0] ?? ''} onValueChange={val => handleSelect(cat.id, val, mode)}>\n {cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.RadioItem key={v.value} value={v.value}>\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n ) : (\n cat.values\n .filter(v => !subSearch || v.label.toLowerCase().includes(subSearch.toLowerCase()))\n .map(v => (\n <DropdownMenu.CheckboxItem\n key={v.value}\n checked={selected.includes(v.value)}\n onCheckedChange={() => handleSelect(cat.id, v.value, mode)}\n onSelect={e => e.preventDefault()}\n >\n <span className={cn('truncate')}>{v.label}</span>\n </DropdownMenu.CheckboxItem>\n ))\n )}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n };\n\n return (\n <DropdownMenu modal={false}>\n <DropdownMenu.Trigger asChild>\n <Button variant=\"outline\" disabled={disabled} size=\"md\">\n <FilterIcon />\n {label}\n {activeFilterCount > 0 && (\n <span\n className={cn(\n 'ml-0.5 inline-flex items-center justify-center rounded-full bg-accent1/50 text-neutral5 text-ui-sm w-5 h-5',\n )}\n >\n {activeFilterCount}\n </span>\n )}\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align={align} className={cn('min-w-[12rem]')}>\n {/* Search */}\n <div className={cn('px-2 pb-2')}>\n <div\n className={cn(\n 'flex items-center gap-2 border border-border1 rounded-md px-2 py-1',\n 'focus-within:border-neutral2',\n )}\n >\n <SearchIcon className={cn('text-neutral3 h-3.5 w-3.5 shrink-0')} />\n <input\n type=\"text\"\n placeholder=\"Search filters...\"\n aria-label=\"Search filters\"\n value={filterSearch}\n onChange={e => setFilterSearch(e.target.value)}\n onKeyDown={e => e.stopPropagation()}\n className={cn('bg-transparent text-ui-sm text-neutral4 placeholder:text-neutral3 outline-none w-full')}\n />\n </div>\n </div>\n\n <DropdownMenu.Separator />\n\n {grouped.map(group => {\n const firstItem = group.items[0];\n\n if (group.items.length === 1 && firstItem) {\n // A single category (grouped or not) renders directly, without a sub-trigger.\n return renderCategory(firstItem);\n }\n\n // Multiple items under a group label — nest under a sub-trigger\n return (\n <DropdownMenu.Sub key={group.key}>\n <DropdownMenu.SubTrigger>{group.label}</DropdownMenu.SubTrigger>\n <DropdownMenu.SubContent className={cn('max-h-[20rem]')}>\n {group.items.map(cat => renderCategory(cat))}\n </DropdownMenu.SubContent>\n </DropdownMenu.Sub>\n );\n })}\n\n {/* Clear all */}\n {activeFilterCount > 0 && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item onSelect={handleClearAll}>\n <XIcon />\n Clear all filters\n </DropdownMenu.Item>\n </>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const dataListSkeleton = require('../data-list-skeleton-Du8Lshzl.cjs');
7
7
  const jsxRuntime = require('react/jsx-runtime');
8
8
  const dataListTopCell = require('../data-list-top-cell-DummeYkE.cjs');
9
9
  const dateFns = require('date-fns');
10
- const tracesDataList = require('../traces-data-list-BpQO8ZSH.cjs');
10
+ const tracesDataList = require('../traces-data-list-D7QLXnsh.cjs');
11
11
 
12
12
  function toDate(value) {
13
13
  const date = value instanceof Date ? value : new Date(value);
@@ -3,7 +3,7 @@ export { D as DataListSkeleton } from '../data-list-skeleton-DuoPJD5w.js';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
  import { a as DataListCell, c as DataListNextPageLoading, f as DataListNoMatch, h as DataListRowButton, k as DataListTopCell, l as DataListTop, D as DataListRoot } from '../data-list-top-cell-B27jd1HH.js';
5
5
  import { format, isToday } from 'date-fns';
6
- export { T as TracesDataList } from '../traces-data-list-DzqdihE7.js';
6
+ export { T as TracesDataList } from '../traces-data-list-B_5TPfYF.js';
7
7
 
8
8
  function toDate(value) {
9
9
  const date = value instanceof Date ? value : new Date(value);
@@ -8,7 +8,7 @@ const lucideReact = require('lucide-react');
8
8
  const React = require('react');
9
9
  const useDebounce = require('use-debounce');
10
10
  const textFieldBlock = require('../text-field-block-DnhYm_C2.cjs');
11
- const timePicker = require('../time-picker-D5qUadVb.cjs');
11
+ const timePicker = require('../time-picker-DmBH2LAb.cjs');
12
12
  const Button = require('../Button-66ghjQV8.cjs');
13
13
  const popover = require('../popover-fpyU6qei.cjs');
14
14
  const utils_cn = require('../cn-vA5sWo9W.cjs');
@@ -4,7 +4,7 @@ import { CircleAlertIcon, CalendarIcon } from 'lucide-react';
4
4
  import * as React from 'react';
5
5
  import { useDebouncedCallback } from 'use-debounce';
6
6
  import { T as TextFieldBlock } from '../text-field-block-wLF3JlhE.js';
7
- import { D as DatePicker, T as TimePicker } from '../time-picker-ji6mao2A.js';
7
+ import { D as DatePicker, T as TimePicker } from '../time-picker-CBBi1dOV.js';
8
8
  import { B as Button } from '../Button-Bq0VuEbC.js';
9
9
  import { P as Popover, b as PopoverTrigger, a as PopoverContent } from '../popover-CfOWA0et.js';
10
10
  import { c as cn } from '../cn-BakJzhuv.js';
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const dateTimeRangePicker = require('../date-time-range-picker-DY3GLaiu.cjs');
5
+ const dateTimeRangePicker = require('../date-time-range-picker-mAwcchzy.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { D as DateTimeRangePicker } from '../date-time-range-picker-BL2NxcTo.js';
1
+ export { D as DateTimeRangePicker } from '../date-time-range-picker-Dsyc_jOU.js';
2
2
  //# sourceMappingURL=DateTimeRangePicker.es.js.map
@@ -8,7 +8,7 @@ const lucideReact = require('lucide-react');
8
8
  const React = require('react');
9
9
  const Button = require('../Button-66ghjQV8.cjs');
10
10
  const Notice = require('../Notice-h63wsfzJ.cjs');
11
- const envFile = require('../env-file-C6u8aJM0.cjs');
11
+ const envFile = require('../env-file-BU2hStkm.cjs');
12
12
  const dataList = require('../data-list-DDQRmA6L.cjs');
13
13
  const hooks_useCopyToClipboard = require('../hooks/use-copy-to-clipboard.cjs.js');
14
14
  const fieldBlock = require('../field-block-BR_ZD9QO.cjs');
@@ -4,7 +4,7 @@ import { PlusIcon, EyeOffIcon, EyeIcon, CheckIcon, CopyIcon, Code2Icon, TrashIco
4
4
  import { createContext, use, useState, useMemo } from 'react';
5
5
  import { B as Button } from '../Button-Bq0VuEbC.js';
6
6
  import { N as Notice } from '../Notice-CiS1Dv3i.js';
7
- import { D as DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE } from '../env-file-uuok37Ac.js';
7
+ import { D as DUPLICATE_ENVIRONMENT_VARIABLE_MESSAGE } from '../env-file-BITYowCx.js';
8
8
  import { D as DataList } from '../data-list-D5uItcj6.js';
9
9
  import { useCopyToClipboard } from '../hooks/use-copy-to-clipboard.es.js';
10
10
  import { F as FieldBlock } from '../field-block-CpRBHzQO.js';
@@ -329,6 +329,7 @@ function getToNextItemFn({ entries, id, update }) {
329
329
  if (thereIsNextItem) {
330
330
  return () => {
331
331
  const nextItem = entries[currentIndex + 1];
332
+ if (!nextItem) return;
332
333
  update(nextItem.id);
333
334
  };
334
335
  }
@@ -340,6 +341,7 @@ function getToPreviousItemFn({ entries, id, update }) {
340
341
  if (thereIsPreviousItem) {
341
342
  return () => {
342
343
  const previousItem = entries[currentIndex - 1];
344
+ if (!previousItem) return;
343
345
  update(previousItem.id);
344
346
  };
345
347
  }