@langchain/macaw-components 1.0.0-beta.1 → 1.0.0-beta.6

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 (185) hide show
  1. package/dist/_chunks/{LoadingIndicator-DgtU9aqD.js → LoadingIndicator-CDcArsiM.js} +13 -12
  2. package/dist/_chunks/LoadingIndicator-CDcArsiM.js.map +1 -0
  3. package/dist/_chunks/render-attachment-icon-BWBEMxXZ.js +270 -0
  4. package/dist/_chunks/render-attachment-icon-BWBEMxXZ.js.map +1 -0
  5. package/dist/catalog.json +527 -408
  6. package/dist/components/Attachment/Attachment.d.ts +21 -0
  7. package/dist/components/Attachment/Attachment.js +165 -0
  8. package/dist/components/Attachment/Attachment.js.map +1 -0
  9. package/dist/components/Attachment/AttachmentList.d.ts +5 -0
  10. package/dist/components/Attachment/AttachmentList.js +32 -0
  11. package/dist/components/Attachment/AttachmentList.js.map +1 -0
  12. package/dist/components/Attachment/index.d.ts +4 -0
  13. package/dist/components/Attachment/index.js +3 -0
  14. package/dist/components/Attachment/render-attachment-icon.d.ts +3 -0
  15. package/dist/components/Attachment/render-attachment-icon.js +2 -0
  16. package/dist/components/Avatar/Avatar.js +2 -2
  17. package/dist/components/Badge/Badge.d.ts +2 -0
  18. package/dist/components/Badge/Badge.js +12 -1
  19. package/dist/components/Badge/Badge.js.map +1 -1
  20. package/dist/components/Banner/Banner.js +1 -1
  21. package/dist/components/Button/Button.js +1 -1
  22. package/dist/components/Button/constants.js +2 -2
  23. package/dist/components/Button/constants.js.map +1 -1
  24. package/dist/components/ChartCard/ChartCard.d.ts +1 -4
  25. package/dist/components/ChartCard/ChartCard.js +2 -2
  26. package/dist/components/ChartCard/ChartCard.js.map +1 -1
  27. package/dist/components/ChartCard/ChartCardSkeleton.d.ts +1 -1
  28. package/dist/components/ChartCard/ChartCardSkeleton.js +37 -0
  29. package/dist/components/ChartCard/ChartCardSkeleton.js.map +1 -1
  30. package/dist/components/ChartLegend/ChartLegend.js +2 -2
  31. package/dist/components/ChartLegend/ChartLegendItemRenderer.js +2 -2
  32. package/dist/components/ChartLegend/ChartLegendItemRenderer.js.map +1 -1
  33. package/dist/components/Code/Code.utils.d.ts +3 -2
  34. package/dist/components/Code/Code.utils.js +7 -3
  35. package/dist/components/Code/Code.utils.js.map +1 -1
  36. package/dist/components/Code/CodeLanguageSelect.d.ts +7 -0
  37. package/dist/components/Code/CodeLanguageSelect.js +29 -0
  38. package/dist/components/Code/CodeLanguageSelect.js.map +1 -0
  39. package/dist/components/Code/CodeLite.js +3 -0
  40. package/dist/components/Code/CodeLite.js.map +1 -1
  41. package/dist/components/Code/CodeToolbar.d.ts +7 -0
  42. package/dist/components/Code/CodeToolbar.js +19 -0
  43. package/dist/components/Code/CodeToolbar.js.map +1 -0
  44. package/dist/components/Code/codeLanguages.d.ts +7 -0
  45. package/dist/components/Code/codeLanguages.js +59 -0
  46. package/dist/components/Code/codeLanguages.js.map +1 -0
  47. package/dist/components/Code/index.d.ts +15 -2
  48. package/dist/components/Code/index.js +70 -50
  49. package/dist/components/Code/index.js.map +1 -1
  50. package/dist/components/Code/types.d.ts +1 -1
  51. package/dist/components/Command/Command.d.ts +10 -13
  52. package/dist/components/Command/Command.js +7 -2
  53. package/dist/components/Command/Command.js.map +1 -1
  54. package/dist/components/Command/CommandMenu.d.ts +7 -1
  55. package/dist/components/Command/CommandMenu.js +17 -9
  56. package/dist/components/Command/CommandMenu.js.map +1 -1
  57. package/dist/components/ContextMenu/ContextMenu.d.ts +6 -0
  58. package/dist/components/ContextMenu/ContextMenu.js +3 -2
  59. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  60. package/dist/components/CopyButton/CopyButton.js +2 -2
  61. package/dist/components/Dialog/index.js +2 -2
  62. package/dist/components/DropdownMenu/DropdownMenu.d.ts +11 -0
  63. package/dist/components/DropdownMenu/DropdownMenu.js +5 -4
  64. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  65. package/dist/components/ErrorMessage/ErrorMessage.js +1 -1
  66. package/dist/components/GroupedTabs/GroupedTabs.d.ts +5 -2
  67. package/dist/components/GroupedTabs/GroupedTabs.js +33 -26
  68. package/dist/components/GroupedTabs/GroupedTabs.js.map +1 -1
  69. package/dist/components/IconButton/IconButton.js +2 -2
  70. package/dist/components/Input/Input.js +1 -1
  71. package/dist/components/LineChart/LineChart.d.ts +2 -2
  72. package/dist/components/LineChart/LineChart.js +3 -1
  73. package/dist/components/LineChart/LineChart.js.map +1 -1
  74. package/dist/components/LineChart/LineChart.types.d.ts +16 -0
  75. package/dist/components/LineChart/LineChartPlot.d.ts +3 -2
  76. package/dist/components/LineChart/LineChartPlot.js +8 -1
  77. package/dist/components/LineChart/LineChartPlot.js.map +1 -1
  78. package/dist/components/LineChart/LineChartVerticalMarkers.d.ts +8 -0
  79. package/dist/components/LineChart/LineChartVerticalMarkers.js +47 -0
  80. package/dist/components/LineChart/LineChartVerticalMarkers.js.map +1 -0
  81. package/dist/components/LineChart/index.d.ts +1 -1
  82. package/dist/components/Logo/index.js +11 -6
  83. package/dist/components/Logo/index.js.map +1 -1
  84. package/dist/components/MetricChart/MetricChart.d.ts +2 -0
  85. package/dist/components/MetricChart/MetricChart.js +15 -4
  86. package/dist/components/MetricChart/MetricChart.js.map +1 -1
  87. package/dist/components/MetricChart/index.d.ts +1 -1
  88. package/dist/components/Pane/Pane.js +2 -2
  89. package/dist/components/SankeyChart/AnimatedSankeyLink.d.ts +17 -0
  90. package/dist/components/SankeyChart/AnimatedSankeyLink.js +44 -0
  91. package/dist/components/SankeyChart/AnimatedSankeyLink.js.map +1 -0
  92. package/dist/components/SankeyChart/AnimatedSankeyNode.d.ts +16 -0
  93. package/dist/components/SankeyChart/AnimatedSankeyNode.js +42 -0
  94. package/dist/components/SankeyChart/AnimatedSankeyNode.js.map +1 -0
  95. package/dist/components/SankeyChart/SankeyChart.d.ts +42 -0
  96. package/dist/components/SankeyChart/SankeyChart.js +185 -0
  97. package/dist/components/SankeyChart/SankeyChart.js.map +1 -0
  98. package/dist/components/SankeyChart/SankeyChart.types.d.ts +90 -0
  99. package/dist/components/SankeyChart/SankeyChart.types.js +0 -0
  100. package/dist/components/SankeyChart/SankeyChart.utils.d.ts +21 -0
  101. package/dist/components/SankeyChart/SankeyChart.utils.js +299 -0
  102. package/dist/components/SankeyChart/SankeyChart.utils.js.map +1 -0
  103. package/dist/components/SankeyChart/SankeyNodeLabel.d.ts +10 -0
  104. package/dist/components/SankeyChart/SankeyNodeLabel.js +30 -0
  105. package/dist/components/SankeyChart/SankeyNodeLabel.js.map +1 -0
  106. package/dist/components/SankeyChart/SankeyNodeLabel.utils.d.ts +9 -0
  107. package/dist/components/SankeyChart/SankeyNodeLabel.utils.js +29 -0
  108. package/dist/components/SankeyChart/SankeyNodeLabel.utils.js.map +1 -0
  109. package/dist/components/SankeyChart/constants.d.ts +22 -0
  110. package/dist/components/SankeyChart/constants.js +27 -0
  111. package/dist/components/SankeyChart/constants.js.map +1 -0
  112. package/dist/components/SankeyChart/index.d.ts +5 -0
  113. package/dist/components/SankeyChart/index.js +4 -0
  114. package/dist/components/Select/Select.js +5 -5
  115. package/dist/components/Select/Select.js.map +1 -1
  116. package/dist/components/Select/SelectPrimitive.d.ts +6 -0
  117. package/dist/components/Select/SelectPrimitive.js +3 -2
  118. package/dist/components/Select/SelectPrimitive.js.map +1 -1
  119. package/dist/components/Slider/Slider.js +10 -3
  120. package/dist/components/Slider/Slider.js.map +1 -1
  121. package/dist/components/SplitViewPane/SplitViewPane.d.ts +2 -1
  122. package/dist/components/SplitViewPane/SplitViewPane.js +113 -219
  123. package/dist/components/SplitViewPane/SplitViewPane.js.map +1 -1
  124. package/dist/components/SplitViewPane/SplitViewPaneHeader.js +2 -2
  125. package/dist/components/SplitViewPane/useShowChildren.d.ts +5 -0
  126. package/dist/components/SplitViewPane/useShowChildren.js +14 -0
  127. package/dist/components/SplitViewPane/useShowChildren.js.map +1 -0
  128. package/dist/components/SplitViewPane/useSplitViewPaneResize.d.ts +21 -0
  129. package/dist/components/SplitViewPane/useSplitViewPaneResize.js +145 -0
  130. package/dist/components/SplitViewPane/useSplitViewPaneResize.js.map +1 -0
  131. package/dist/components/Textarea/Textarea.d.ts +4 -3
  132. package/dist/components/Textarea/Textarea.js +7 -21
  133. package/dist/components/Textarea/Textarea.js.map +1 -1
  134. package/dist/components/ThinkingState/LoadingIndicator.d.ts +1 -0
  135. package/dist/components/ThinkingState/LoadingIndicator.js +1 -1
  136. package/dist/components/ThinkingState/ThinkingState.d.ts +1 -0
  137. package/dist/components/ThinkingState/ThinkingState.js +5 -4
  138. package/dist/components/ThinkingState/ThinkingState.js.map +1 -1
  139. package/dist/components/ThinkingState/index.js +1 -1
  140. package/dist/components/Toast/index.js +33 -28
  141. package/dist/components/Toast/index.js.map +1 -1
  142. package/dist/components/Tooltip/Tooltip.js +2 -2
  143. package/dist/components/Typeahead/Typeahead.js +18 -8
  144. package/dist/components/Typeahead/Typeahead.js.map +1 -1
  145. package/dist/components/Typeahead/Typeahead.types.d.ts +2 -0
  146. package/dist/components/Typeahead/TypeaheadParts.d.ts +3 -1
  147. package/dist/components/Typeahead/TypeaheadParts.js +7 -6
  148. package/dist/components/Typeahead/TypeaheadParts.js.map +1 -1
  149. package/dist/components/Typeahead/TypeaheadView.js +19 -13
  150. package/dist/components/Typeahead/TypeaheadView.js.map +1 -1
  151. package/dist/components/Typeahead/useTypeaheadDomSync.d.ts +1 -1
  152. package/dist/components/Typeahead/useTypeaheadDomSync.js +14 -8
  153. package/dist/components/Typeahead/useTypeaheadDomSync.js.map +1 -1
  154. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.d.ts +2 -1
  155. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js +10 -9
  156. package/dist/components/Typeahead/useTypeaheadUncontrolledInput.js.map +1 -1
  157. package/dist/components/UnsavedChangesDialog.js +2 -2
  158. package/dist/components/index.d.ts +3 -1
  159. package/dist/components/index.js +7 -5
  160. package/dist/components.css +22 -18
  161. package/dist/hooks/useDebouncedCommit.d.ts +14 -0
  162. package/dist/hooks/useDebouncedCommit.js +35 -0
  163. package/dist/hooks/useDebouncedCommit.js.map +1 -0
  164. package/dist/icons/LongTailPhosphorIcons.js +1 -1
  165. package/dist/icons/PaddedPhosphorIcons.d.ts +1 -0
  166. package/dist/icons/PaddedPhosphorIcons.js +4 -2
  167. package/dist/icons/PaddedPhosphorIcons.js.map +1 -1
  168. package/dist/icons/WeightedPhosphorIcons.d.ts +1 -0
  169. package/dist/icons/WeightedPhosphorIcons.js +3 -1
  170. package/dist/icons/WeightedPhosphorIcons.js.map +1 -1
  171. package/dist/icons/index.js +3 -3
  172. package/dist/index.js +7 -5
  173. package/dist/utilities.css +1 -1
  174. package/dist/utils/chartColors.d.ts +2 -1
  175. package/dist/utils/chartColors.js +2 -1
  176. package/dist/utils/chartColors.js.map +1 -1
  177. package/dist/utils/componentSizes.d.ts +0 -1
  178. package/dist/utils/componentSizes.js.map +1 -1
  179. package/dist/utils/lazy-codemirror-loader.d.ts +0 -2
  180. package/dist/utils/lazy-codemirror-loader.js +1 -3
  181. package/dist/utils/lazy-codemirror-loader.js.map +1 -1
  182. package/docs/DESIGN.md +17 -0
  183. package/docs/STYLES.md +4 -1
  184. package/package.json +21 -8
  185. package/dist/_chunks/LoadingIndicator-DgtU9aqD.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { cn } from "../../utils/cn.js";
2
+ import { OPTION_ROW_SIZES } from "../../utils/componentSizes.js";
2
3
  import zIndices from "../../utils/zIndices.js";
3
4
  import { useZIndex } from "../../utils/useZIndex.js";
4
5
  import { ZIndexProvider } from "../../utils/ZIndexContext.js";
@@ -99,9 +100,9 @@ var SelectLabel = React$1.forwardRef(({ className, ...props }, ref) => /* @__PUR
99
100
  ...props
100
101
  }));
101
102
  SelectLabel.displayName = RadixSelect.Label.displayName;
102
- var SelectItem = React$1.forwardRef(({ className, children, checkmarkPosition = "left", selectedIndicator = "checkmark", ...props }, ref) => /* @__PURE__ */ jsxs(RadixSelect.Item, {
103
+ var SelectItem = React$1.forwardRef(({ className, children, checkmarkPosition = "left", selectedIndicator = "checkmark", size = "md", ...props }, ref) => /* @__PURE__ */ jsxs(RadixSelect.Item, {
103
104
  ref,
104
- className: cn("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-space-2 text-sm outline-none focus:bg-elevated-hover data-[disabled]:pointer-events-none data-[disabled]:opacity-50", selectedIndicator === "background" ? "pl-space-2 data-[state=checked]:bg-selected data-[state=checked]:focus:bg-selected-hover" : checkmarkPosition === "left" ? "pl-space-6" : "pl-space-2", className),
105
+ className: cn("relative flex w-full cursor-default select-none items-center rounded-sm py-space-1 pr-space-2 outline-none focus:bg-elevated-hover data-[disabled]:pointer-events-none data-[disabled]:opacity-50", OPTION_ROW_SIZES[size].minHeightClassName, size === "sm" ? "text-xs leading-4" : "text-sm", selectedIndicator === "background" ? "pl-space-2 data-[state=checked]:bg-selected data-[state=checked]:focus:bg-selected-hover" : checkmarkPosition === "left" ? "pl-space-6" : "pl-space-2", className),
105
106
  ...props,
106
107
  children: [selectedIndicator === "checkmark" && /* @__PURE__ */ jsx("span", {
107
108
  className: cn("absolute flex h-3.5 w-3.5 items-center justify-center", checkmarkPosition === "left" ? "left-2" : "right-2"),
@@ -1 +1 @@
1
- {"version":3,"file":"SelectPrimitive.js","names":[],"sources":["../../../src/components/Select/SelectPrimitive.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CheckIcon,\n} from '../../icons/PaddedPhosphorIcons';\nimport { cn } from '../../utils/cn';\nimport { useZIndex } from '../../utils/useZIndex';\nimport { ZIndexProvider } from '../../utils/ZIndexContext';\nimport zIndices from '../../utils/zIndices';\n\nexport const SelectRoot: typeof RadixSelect.Root = (props) => {\n const [open = false, onOpenChange] = useControllableState({\n prop: props.open,\n defaultProp: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n });\n\n return (\n <RadixSelect.Root\n {...props}\n open={open}\n onOpenChange={onOpenChange}\n defaultOpen={undefined}\n />\n );\n};\n\nexport type SelectTriggerProps = React.ComponentPropsWithoutRef<\n typeof RadixSelect.Trigger\n> & {\n iconClassName?: string;\n};\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Trigger>,\n SelectTriggerProps\n>(({ className, children, iconClassName, ...props }, ref) => {\n if (props.asChild) {\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'flex items-center justify-between gap-space-2 rounded-md border border-default bg-transparent p-1.5 px-2.5 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-secondary [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {props.asChild ? children : <span>{children}</span>}\n </RadixSelect.Trigger>\n );\n }\n\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'flex items-center justify-between gap-space-2 rounded-md border border-default bg-transparent p-1.5 px-2.5 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-secondary [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <RadixSelect.Icon asChild>\n <span\n aria-hidden\n className={cn('inline-flex h-4 w-4 text-icon-primary', iconClassName)}\n >\n <CaretDownIcon size=\"100%\" weight=\"regular\" />\n </span>\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n );\n});\nSelectTrigger.displayName = RadixSelect.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof RadixSelect.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <RadixSelect.ScrollUpButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-space-1',\n className\n )}\n {...props}\n >\n <CaretUpIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = RadixSelect.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof RadixSelect.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <RadixSelect.ScrollDownButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-space-1',\n className\n )}\n {...props}\n >\n <CaretDownIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = RadixSelect.ScrollDownButton.displayName;\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Content>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => {\n const zIndex = useZIndex(zIndices.popover);\n\n return (\n <RadixSelect.Portal>\n <RadixSelect.Content\n ref={ref}\n className={cn(\n 'relative max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-default bg-elevated shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n style={{ zIndex, ...props.style }}\n >\n <ZIndexProvider value={zIndex}>\n <SelectScrollUpButton />\n <RadixSelect.Viewport\n className={cn(\n 'p-space-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </RadixSelect.Viewport>\n <SelectScrollDownButton />\n </ZIndexProvider>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n );\n});\nSelectContent.displayName = RadixSelect.Content.displayName;\n\nexport const SelectLabel = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Label>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Label>\n>(({ className, ...props }, ref) => (\n <RadixSelect.Label\n ref={ref}\n className={cn(\n 'py-1.5 pl-space-6 pr-space-2 text-sm font-semibold',\n className\n )}\n {...props}\n />\n));\nSelectLabel.displayName = RadixSelect.Label.displayName;\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Item>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Item> & {\n checkmarkPosition?: 'left' | 'right';\n selectedIndicator?: 'checkmark' | 'background';\n }\n>(\n (\n {\n className,\n children,\n checkmarkPosition = 'left',\n selectedIndicator = 'checkmark',\n ...props\n },\n ref\n ) => (\n <RadixSelect.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-space-2 text-sm outline-none focus:bg-elevated-hover data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n selectedIndicator === 'background'\n ? 'pl-space-2 data-[state=checked]:bg-selected data-[state=checked]:focus:bg-selected-hover'\n : checkmarkPosition === 'left'\n ? 'pl-space-6'\n : 'pl-space-2',\n className\n )}\n {...props}\n >\n {selectedIndicator === 'checkmark' && (\n <span\n className={cn(\n 'absolute flex h-3.5 w-3.5 items-center justify-center',\n checkmarkPosition === 'left' ? 'left-2' : 'right-2'\n )}\n >\n <RadixSelect.ItemIndicator>\n <CheckIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ItemIndicator>\n </span>\n )}\n\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n )\n);\nSelectItem.displayName = RadixSelect.Item.displayName;\n\nexport const SelectSeparator = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Separator>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Separator>\n>(({ className, ...props }, ref) => (\n <RadixSelect.Separator\n ref={ref}\n className={cn(\n '-mx-space-1 my-space-1 h-px border-b border-subtle',\n className\n )}\n {...props}\n />\n));\nSelectSeparator.displayName = RadixSelect.Separator.displayName;\n\nexport const SelectValue = RadixSelect.Value;\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectPrimitive.js","names":[],"sources":["../../../src/components/Select/SelectPrimitive.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\n\nimport {\n CaretDownIcon,\n CaretUpIcon,\n CheckIcon,\n} from '../../icons/PaddedPhosphorIcons';\nimport { cn } from '../../utils/cn';\nimport {\n OPTION_ROW_SIZES,\n type OptionRowSize,\n} from '../../utils/componentSizes';\nimport { useZIndex } from '../../utils/useZIndex';\nimport { ZIndexProvider } from '../../utils/ZIndexContext';\nimport zIndices from '../../utils/zIndices';\n\nexport const SelectRoot: typeof RadixSelect.Root = (props) => {\n const [open = false, onOpenChange] = useControllableState({\n prop: props.open,\n defaultProp: props.defaultOpen ?? false,\n onChange: props.onOpenChange,\n });\n\n return (\n <RadixSelect.Root\n {...props}\n open={open}\n onOpenChange={onOpenChange}\n defaultOpen={undefined}\n />\n );\n};\n\nexport type SelectTriggerProps = React.ComponentPropsWithoutRef<\n typeof RadixSelect.Trigger\n> & {\n iconClassName?: string;\n};\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Trigger>,\n SelectTriggerProps\n>(({ className, children, iconClassName, ...props }, ref) => {\n if (props.asChild) {\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'flex items-center justify-between gap-space-2 rounded-md border border-default bg-transparent p-1.5 px-2.5 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-secondary [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {props.asChild ? children : <span>{children}</span>}\n </RadixSelect.Trigger>\n );\n }\n\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'flex items-center justify-between gap-space-2 rounded-md border border-default bg-transparent p-1.5 px-2.5 text-sm focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-secondary [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <RadixSelect.Icon asChild>\n <span\n aria-hidden\n className={cn('inline-flex h-4 w-4 text-icon-primary', iconClassName)}\n >\n <CaretDownIcon size=\"100%\" weight=\"regular\" />\n </span>\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n );\n});\nSelectTrigger.displayName = RadixSelect.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof RadixSelect.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <RadixSelect.ScrollUpButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-space-1',\n className\n )}\n {...props}\n >\n <CaretUpIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = RadixSelect.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof RadixSelect.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <RadixSelect.ScrollDownButton\n ref={ref}\n className={cn(\n 'flex cursor-default items-center justify-center py-space-1',\n className\n )}\n {...props}\n >\n <CaretDownIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = RadixSelect.ScrollDownButton.displayName;\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Content>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => {\n const zIndex = useZIndex(zIndices.popover);\n\n return (\n <RadixSelect.Portal>\n <RadixSelect.Content\n ref={ref}\n className={cn(\n 'relative max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-default bg-elevated shadow-md',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n {...props}\n style={{ zIndex, ...props.style }}\n >\n <ZIndexProvider value={zIndex}>\n <SelectScrollUpButton />\n <RadixSelect.Viewport\n className={cn(\n 'p-space-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </RadixSelect.Viewport>\n <SelectScrollDownButton />\n </ZIndexProvider>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n );\n});\nSelectContent.displayName = RadixSelect.Content.displayName;\n\nexport const SelectLabel = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Label>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Label>\n>(({ className, ...props }, ref) => (\n <RadixSelect.Label\n ref={ref}\n className={cn(\n 'py-1.5 pl-space-6 pr-space-2 text-sm font-semibold',\n className\n )}\n {...props}\n />\n));\nSelectLabel.displayName = RadixSelect.Label.displayName;\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Item>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Item> & {\n checkmarkPosition?: 'left' | 'right';\n selectedIndicator?: 'checkmark' | 'background';\n /**\n * Controls minimum row height and default label typography.\n * Rich or multiline content grows intrinsically.\n */\n size?: OptionRowSize;\n }\n>(\n (\n {\n className,\n children,\n checkmarkPosition = 'left',\n selectedIndicator = 'checkmark',\n size = 'md',\n ...props\n },\n ref\n ) => (\n <RadixSelect.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-space-1 pr-space-2 outline-none focus:bg-elevated-hover data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n OPTION_ROW_SIZES[size].minHeightClassName,\n size === 'sm' ? 'text-xs leading-4' : 'text-sm',\n selectedIndicator === 'background'\n ? 'pl-space-2 data-[state=checked]:bg-selected data-[state=checked]:focus:bg-selected-hover'\n : checkmarkPosition === 'left'\n ? 'pl-space-6'\n : 'pl-space-2',\n className\n )}\n {...props}\n >\n {selectedIndicator === 'checkmark' && (\n <span\n className={cn(\n 'absolute flex h-3.5 w-3.5 items-center justify-center',\n checkmarkPosition === 'left' ? 'left-2' : 'right-2'\n )}\n >\n <RadixSelect.ItemIndicator>\n <CheckIcon aria-hidden size={16} weight=\"regular\" />\n </RadixSelect.ItemIndicator>\n </span>\n )}\n\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n )\n);\nSelectItem.displayName = RadixSelect.Item.displayName;\n\nexport const SelectSeparator = React.forwardRef<\n React.ElementRef<typeof RadixSelect.Separator>,\n React.ComponentPropsWithoutRef<typeof RadixSelect.Separator>\n>(({ className, ...props }, ref) => (\n <RadixSelect.Separator\n ref={ref}\n className={cn(\n '-mx-space-1 my-space-1 h-px border-b border-subtle',\n className\n )}\n {...props}\n />\n));\nSelectSeparator.displayName = RadixSelect.Separator.displayName;\n\nexport const SelectValue = RadixSelect.Value;\n"],"mappings":"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"}
@@ -20,6 +20,8 @@ function fromArray(v, wasArray) {
20
20
  */
21
21
  var Slider = ({ value, defaultValue, onChange, onChangeCommitted, min = 0, max = 100, step = 1, stepLabels, disabled = false, className, variant = "default", "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "data-testid": testId }) => {
22
22
  const isRange = Array.isArray(value ?? defaultValue);
23
+ const thumbValues = toArray(value) ?? toArray(defaultValue) ?? [0];
24
+ const hasMultipleThumbs = thumbValues.length > 1;
23
25
  const labeledSteps = stepLabels?.filter((s) => s.label);
24
26
  const hasLabels = !!labeledSteps && labeledSteps.length > 0;
25
27
  return /* @__PURE__ */ jsxs(SliderPrimitive.Root, {
@@ -32,15 +34,20 @@ var Slider = ({ value, defaultValue, onChange, onChangeCommitted, min = 0, max =
32
34
  disabled,
33
35
  onValueChange: (v) => onChange?.(fromArray(v, isRange)),
34
36
  onValueCommit: (v) => onChangeCommitted?.(fromArray(v, isRange)),
35
- "aria-label": ariaLabel,
36
- "aria-labelledby": ariaLabelledby,
37
37
  "data-testid": testId,
38
+ role: hasMultipleThumbs ? "group" : void 0,
39
+ "aria-label": hasMultipleThumbs ? ariaLabel : void 0,
40
+ "aria-labelledby": hasMultipleThumbs ? ariaLabelledby : void 0,
38
41
  children: [
39
42
  /* @__PURE__ */ jsx(SliderPrimitive.Track, {
40
43
  className: cn("relative w-full grow overflow-hidden", variant === "thick" ? "mx-2 h-2 rounded-xs bg-surface-level-3" : "h-1.5 rounded-full bg-surface-level-4"),
41
44
  children: /* @__PURE__ */ jsx(SliderPrimitive.Range, { className: cn("absolute h-full", disabled ? "data-[disabled]:bg-brand-subtle" : "bg-control-active") })
42
45
  }),
43
- (toArray(value) ?? toArray(defaultValue) ?? [0]).map((_, i) => /* @__PURE__ */ jsx(SliderPrimitive.Thumb, { className: cn("block rounded-full border-2 shadow transition", SELECTION_CONTROL_SIZES.sm.className, SELECTION_CONTROL_HIT_AREA_STYLES, "focus-visible:shadow-[0_0_0_4px_var(--bg-brand-subtle)] focus-visible:outline-none", disabled ? "border-muted bg-surface-level-3" : "cursor-pointer border-brand-300 bg-control-thumb hover:border-brand-400 dark:border-brand-500 dark:hover:border-brand-600") }, i)),
46
+ thumbValues.map((_, i) => /* @__PURE__ */ jsx(SliderPrimitive.Thumb, {
47
+ ...!hasMultipleThumbs && ariaLabel !== void 0 && { "aria-label": ariaLabel },
48
+ "aria-labelledby": hasMultipleThumbs ? void 0 : ariaLabelledby,
49
+ className: cn("block rounded-full border-2 shadow transition", SELECTION_CONTROL_SIZES.sm.className, SELECTION_CONTROL_HIT_AREA_STYLES, "focus-visible:shadow-[0_0_0_4px_var(--bg-brand-subtle)] focus-visible:outline-none", disabled ? "border-muted bg-surface-level-3" : "cursor-pointer border-brand-300 bg-control-thumb hover:border-brand-400 dark:border-brand-500 dark:hover:border-brand-600")
50
+ }, i)),
44
51
  hasLabels && /* @__PURE__ */ jsx("div", {
45
52
  "aria-hidden": true,
46
53
  className: "absolute bottom-2 w-full cursor-pointer",
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","names":[],"sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import * as SliderPrimitive from '@radix-ui/react-slider';\n\nimport { cn } from '../../utils/cn';\nimport {\n SELECTION_CONTROL_HIT_AREA_STYLES,\n SELECTION_CONTROL_SIZES,\n} from '../../utils/componentSizes';\nimport { Text } from '../Text';\n\nexport interface SliderStepLabel {\n value: number;\n label?: string;\n}\n\nexport interface SliderProps {\n /** Current value. Pass a number for a single thumb, number[] for a range slider. */\n value?: number | number[];\n /** Default value (uncontrolled). */\n defaultValue?: number | number[];\n /** Called continuously as the value changes. */\n onChange?: (value: number | number[]) => void;\n /** Called when the user finishes dragging (mouse/touch up or keyboard interaction ends). */\n onChangeCommitted?: (value: number | number[]) => void;\n min?: number;\n max?: number;\n step?: number;\n stepLabels?: SliderStepLabel[];\n disabled?: boolean;\n className?: string;\n /** Track treatment; `thick` is the meter-weight bar. */\n variant?: 'default' | 'thick';\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'data-testid'?: string;\n}\n\nfunction toArray(v: number | number[] | undefined): number[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v];\n}\n\nfunction fromArray(v: number[], wasArray: boolean): number | number[] {\n return wasArray ? v : v[0];\n}\n\n/**\n * Slider built on the Radix UI Slider primitive. Supports single-thumb and\n * range (multi-thumb) modes, optional labeled steps, and disabled state.\n *\n * When stepLabels are present, the Root's hit area extends to cover the label\n * row — clicking a label moves the thumb to that X position.\n */\nexport const Slider = ({\n value,\n defaultValue,\n onChange,\n onChangeCommitted,\n min = 0,\n max = 100,\n step = 1,\n stepLabels,\n disabled = false,\n className,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'data-testid': testId,\n}: SliderProps) => {\n const isRange = Array.isArray(value ?? defaultValue);\n const labeledSteps = stepLabels?.filter((s) => s.label);\n const hasLabels = !!labeledSteps && labeledSteps.length > 0;\n\n return (\n <SliderPrimitive.Root\n className={cn(\n 'relative flex w-full touch-none select-none items-center',\n hasLabels && 'pb-7',\n className\n )}\n value={toArray(value)}\n defaultValue={toArray(defaultValue)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onValueChange={(v) => onChange?.(fromArray(v, isRange))}\n onValueCommit={(v) => onChangeCommitted?.(fromArray(v, isRange))}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n data-testid={testId}\n >\n <SliderPrimitive.Track\n className={cn(\n 'relative w-full grow overflow-hidden',\n variant === 'thick'\n ? 'mx-2 h-2 rounded-xs bg-surface-level-3'\n : 'h-1.5 rounded-full bg-surface-level-4'\n )}\n >\n <SliderPrimitive.Range\n className={cn(\n 'absolute h-full',\n disabled ? 'data-[disabled]:bg-brand-subtle' : 'bg-control-active'\n )}\n />\n </SliderPrimitive.Track>\n\n {(toArray(value) ?? toArray(defaultValue) ?? [0]).map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n className={cn(\n 'block rounded-full border-2 shadow transition',\n SELECTION_CONTROL_SIZES.sm.className,\n SELECTION_CONTROL_HIT_AREA_STYLES,\n 'focus-visible:shadow-[0_0_0_4px_var(--bg-brand-subtle)] focus-visible:outline-none',\n disabled\n ? 'border-muted bg-surface-level-3'\n : 'cursor-pointer border-brand-300 bg-control-thumb hover:border-brand-400 dark:border-brand-500 dark:hover:border-brand-600'\n )}\n />\n ))}\n\n {hasLabels && (\n <div aria-hidden className=\"absolute bottom-2 w-full cursor-pointer\">\n {labeledSteps.map((s) => (\n <Text\n key={s.value}\n as=\"span\"\n variant=\"xs\"\n className=\"absolute -translate-x-1/2 truncate text-secondary\"\n // Left as non-tailwind on purpose for better readability on label positioning\n style={{\n left: `${((s.value - min) / (max - min)) * 100}%`,\n maxWidth: `${100 / labeledSteps.length}%`,\n }}\n >\n {s.label}\n </Text>\n ))}\n </div>\n )}\n </SliderPrimitive.Root>\n );\n};\n"],"mappings":";;;;;;AAoCA,SAAS,QAAQ,GAAwD;CACvE,IAAI,MAAM,KAAA,GAAW,OAAO,KAAA;CAC5B,OAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AAClC;AAEA,SAAS,UAAU,GAAa,UAAsC;CACpE,OAAO,WAAW,IAAI,EAAE;AAC1B;;;;;;;;AASA,IAAa,UAAU,EACrB,OACA,cACA,UACA,mBACA,MAAM,GACN,MAAM,KACN,OAAO,GACP,YACA,WAAW,OACX,WACA,UAAU,WACV,cAAc,WACd,mBAAmB,gBACnB,eAAe,aACE;CACjB,MAAM,UAAU,MAAM,QAAQ,SAAS,YAAY;CACnD,MAAM,eAAe,YAAY,QAAQ,MAAM,EAAE,KAAK;CACtD,MAAM,YAAY,CAAC,CAAC,gBAAgB,aAAa,SAAS;CAE1D,OACE,qBAAC,gBAAgB,MAAjB;EACE,WAAW,GACT,4DACA,aAAa,QACb,SACF;EACA,OAAO,QAAQ,KAAK;EACpB,cAAc,QAAQ,YAAY;EAC7B;EACA;EACC;EACI;EACV,gBAAgB,MAAM,WAAW,UAAU,GAAG,OAAO,CAAC;EACtD,gBAAgB,MAAM,oBAAoB,UAAU,GAAG,OAAO,CAAC;EAC/D,cAAY;EACZ,mBAAiB;EACjB,eAAa;EAhBf,UAAA;GAkBE,oBAAC,gBAAgB,OAAjB;IACE,WAAW,GACT,wCACA,YAAY,UACR,2CACA,uCACN;IAEA,UAAA,oBAAC,gBAAgB,OAAjB,EACE,WAAW,GACT,mBACA,WAAW,oCAAoC,mBACjD,EACD,CAAA;GACoB,CAAA;IAErB,QAAQ,KAAK,KAAK,QAAQ,YAAY,KAAK,CAAC,CAAC,EAAA,CAAG,KAAK,GAAG,MACxD,oBAAC,gBAAgB,OAAjB,EAEE,WAAW,GACT,iDACA,wBAAwB,GAAG,WAC3B,mCACA,sFACA,WACI,oCACA,2HACN,EACD,GAVM,CAUN,CACF;GAEA,aACC,oBAAC,OAAD;IAAK,eAAA;IAAY,WAAU;IACxB,UAAA,aAAa,KAAK,MACjB,oBAAC,MAAD;KAEE,IAAG;KACH,SAAQ;KACR,WAAU;KAEV,OAAO;MACL,MAAM,IAAK,EAAE,QAAQ,QAAQ,MAAM,OAAQ,IAAI;MAC/C,UAAU,GAAG,MAAM,aAAa,OAAO;KACzC;KAEC,UAAA,EAAE;IACC,GAXC,EAAE,KAWH,CACP;GACE,CAAA;EAEa;;AAE1B"}
1
+ {"version":3,"file":"Slider.js","names":[],"sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import * as SliderPrimitive from '@radix-ui/react-slider';\n\nimport { cn } from '../../utils/cn';\nimport {\n SELECTION_CONTROL_HIT_AREA_STYLES,\n SELECTION_CONTROL_SIZES,\n} from '../../utils/componentSizes';\nimport { Text } from '../Text';\n\nexport interface SliderStepLabel {\n value: number;\n label?: string;\n}\n\nexport interface SliderProps {\n /** Current value. Pass a number for a single thumb, number[] for a range slider. */\n value?: number | number[];\n /** Default value (uncontrolled). */\n defaultValue?: number | number[];\n /** Called continuously as the value changes. */\n onChange?: (value: number | number[]) => void;\n /** Called when the user finishes dragging (mouse/touch up or keyboard interaction ends). */\n onChangeCommitted?: (value: number | number[]) => void;\n min?: number;\n max?: number;\n step?: number;\n stepLabels?: SliderStepLabel[];\n disabled?: boolean;\n className?: string;\n /** Track treatment; `thick` is the meter-weight bar. */\n variant?: 'default' | 'thick';\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n 'data-testid'?: string;\n}\n\nfunction toArray(v: number | number[] | undefined): number[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v];\n}\n\nfunction fromArray(v: number[], wasArray: boolean): number | number[] {\n return wasArray ? v : v[0];\n}\n\n/**\n * Slider built on the Radix UI Slider primitive. Supports single-thumb and\n * range (multi-thumb) modes, optional labeled steps, and disabled state.\n *\n * When stepLabels are present, the Root's hit area extends to cover the label\n * row — clicking a label moves the thumb to that X position.\n */\nexport const Slider = ({\n value,\n defaultValue,\n onChange,\n onChangeCommitted,\n min = 0,\n max = 100,\n step = 1,\n stepLabels,\n disabled = false,\n className,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'data-testid': testId,\n}: SliderProps) => {\n const isRange = Array.isArray(value ?? defaultValue);\n const thumbValues = toArray(value) ?? toArray(defaultValue) ?? [0];\n const hasMultipleThumbs = thumbValues.length > 1;\n const labeledSteps = stepLabels?.filter((s) => s.label);\n const hasLabels = !!labeledSteps && labeledSteps.length > 0;\n\n return (\n <SliderPrimitive.Root\n className={cn(\n 'relative flex w-full touch-none select-none items-center',\n hasLabels && 'pb-7',\n className\n )}\n value={toArray(value)}\n defaultValue={toArray(defaultValue)}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n onValueChange={(v) => onChange?.(fromArray(v, isRange))}\n onValueCommit={(v) => onChangeCommitted?.(fromArray(v, isRange))}\n data-testid={testId}\n role={hasMultipleThumbs ? 'group' : undefined}\n aria-label={hasMultipleThumbs ? ariaLabel : undefined}\n aria-labelledby={hasMultipleThumbs ? ariaLabelledby : undefined}\n >\n <SliderPrimitive.Track\n className={cn(\n 'relative w-full grow overflow-hidden',\n variant === 'thick'\n ? 'mx-2 h-2 rounded-xs bg-surface-level-3'\n : 'h-1.5 rounded-full bg-surface-level-4'\n )}\n >\n <SliderPrimitive.Range\n className={cn(\n 'absolute h-full',\n disabled ? 'data-[disabled]:bg-brand-subtle' : 'bg-control-active'\n )}\n />\n </SliderPrimitive.Track>\n\n {thumbValues.map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n {...(!hasMultipleThumbs &&\n ariaLabel !== undefined && { 'aria-label': ariaLabel })}\n aria-labelledby={hasMultipleThumbs ? undefined : ariaLabelledby}\n className={cn(\n 'block rounded-full border-2 shadow transition',\n SELECTION_CONTROL_SIZES.sm.className,\n SELECTION_CONTROL_HIT_AREA_STYLES,\n 'focus-visible:shadow-[0_0_0_4px_var(--bg-brand-subtle)] focus-visible:outline-none',\n disabled\n ? 'border-muted bg-surface-level-3'\n : 'cursor-pointer border-brand-300 bg-control-thumb hover:border-brand-400 dark:border-brand-500 dark:hover:border-brand-600'\n )}\n />\n ))}\n\n {hasLabels && (\n <div aria-hidden className=\"absolute bottom-2 w-full cursor-pointer\">\n {labeledSteps.map((s) => (\n <Text\n key={s.value}\n as=\"span\"\n variant=\"xs\"\n className=\"absolute -translate-x-1/2 truncate text-secondary\"\n // Left as non-tailwind on purpose for better readability on label positioning\n style={{\n left: `${((s.value - min) / (max - min)) * 100}%`,\n maxWidth: `${100 / labeledSteps.length}%`,\n }}\n >\n {s.label}\n </Text>\n ))}\n </div>\n )}\n </SliderPrimitive.Root>\n );\n};\n"],"mappings":";;;;;;AAoCA,SAAS,QAAQ,GAAwD;CACvE,IAAI,MAAM,KAAA,GAAW,OAAO,KAAA;CAC5B,OAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AAClC;AAEA,SAAS,UAAU,GAAa,UAAsC;CACpE,OAAO,WAAW,IAAI,EAAE;AAC1B;;;;;;;;AASA,IAAa,UAAU,EACrB,OACA,cACA,UACA,mBACA,MAAM,GACN,MAAM,KACN,OAAO,GACP,YACA,WAAW,OACX,WACA,UAAU,WACV,cAAc,WACd,mBAAmB,gBACnB,eAAe,aACE;CACjB,MAAM,UAAU,MAAM,QAAQ,SAAS,YAAY;CACnD,MAAM,cAAc,QAAQ,KAAK,KAAK,QAAQ,YAAY,KAAK,CAAC,CAAC;CACjE,MAAM,oBAAoB,YAAY,SAAS;CAC/C,MAAM,eAAe,YAAY,QAAQ,MAAM,EAAE,KAAK;CACtD,MAAM,YAAY,CAAC,CAAC,gBAAgB,aAAa,SAAS;CAE1D,OACE,qBAAC,gBAAgB,MAAjB;EACE,WAAW,GACT,4DACA,aAAa,QACb,SACF;EACA,OAAO,QAAQ,KAAK;EACpB,cAAc,QAAQ,YAAY;EAC7B;EACA;EACC;EACI;EACV,gBAAgB,MAAM,WAAW,UAAU,GAAG,OAAO,CAAC;EACtD,gBAAgB,MAAM,oBAAoB,UAAU,GAAG,OAAO,CAAC;EAC/D,eAAa;EACb,MAAM,oBAAoB,UAAU,KAAA;EACpC,cAAY,oBAAoB,YAAY,KAAA;EAC5C,mBAAiB,oBAAoB,iBAAiB,KAAA;EAjBxD,UAAA;GAmBE,oBAAC,gBAAgB,OAAjB;IACE,WAAW,GACT,wCACA,YAAY,UACR,2CACA,uCACN;IAEA,UAAA,oBAAC,gBAAgB,OAAjB,EACE,WAAW,GACT,mBACA,WAAW,oCAAoC,mBACjD,EACD,CAAA;GACoB,CAAA;GAEtB,YAAY,KAAK,GAAG,MACnB,oBAAC,gBAAgB,OAAjB;IAEE,GAAK,CAAC,qBACJ,cAAc,KAAA,KAAa,EAAE,cAAc,UAAU;IACvD,mBAAiB,oBAAoB,KAAA,IAAY;IACjD,WAAW,GACT,iDACA,wBAAwB,GAAG,WAC3B,mCACA,sFACA,WACI,oCACA,2HACN;GACD,GAbM,CAaN,CACF;GAEA,aACC,oBAAC,OAAD;IAAK,eAAA;IAAY,WAAU;IACxB,UAAA,aAAa,KAAK,MACjB,oBAAC,MAAD;KAEE,IAAG;KACH,SAAQ;KACR,WAAU;KAEV,OAAO;MACL,MAAM,IAAK,EAAE,QAAQ,QAAQ,MAAM,OAAQ,IAAI;MAC/C,UAAU,GAAG,MAAM,aAAa,OAAO;KACzC;KAEC,UAAA,EAAE;IACC,GAXC,EAAE,KAWH,CACP;GACE,CAAA;EAEa;;AAE1B"}
@@ -14,6 +14,7 @@ export type SplitViewPaneProps = {
14
14
  open: boolean;
15
15
  children: ReactNode;
16
16
  className?: string;
17
+ variant?: 'overlay' | 'inline';
17
18
  sidePaneId?: string;
18
19
  hideArrows?: boolean;
19
20
  customHeader?: ReactNode;
@@ -38,4 +39,4 @@ export type SplitViewPaneProps = {
38
39
  onNext?: () => void;
39
40
  onPrevious?: () => void;
40
41
  });
41
- export declare function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children, title, className, sidePaneId, hideArrows, customHeader, useCustomHeaderSlot, defaultWidthPx, overrideWidthPx, minWidthPx, requireConfirmationOnClose, dismissOnOutsideClick, scrollContainer, headerClassName, }: SplitViewPaneProps): import("react").JSX.Element;
42
+ export declare function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children, title, className, variant, sidePaneId, hideArrows, customHeader, useCustomHeaderSlot, defaultWidthPx, overrideWidthPx, minWidthPx, requireConfirmationOnClose, dismissOnOutsideClick, scrollContainer, headerClassName, }: SplitViewPaneProps): import("react").JSX.Element;
@@ -6,21 +6,15 @@ import UnsavedChangesDialog from "../UnsavedChangesDialog.js";
6
6
  import { createPortalSlot } from "../PortalSlot.js";
7
7
  import { registerOpenPane } from "./openPaneRegistry.js";
8
8
  import { HeaderTitleActionSlot, SplitViewPaneHeader } from "./SplitViewPaneHeader.js";
9
- import { Fragment, createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useRef, useState } from "react";
9
+ import { useShowChildren } from "./useShowChildren.js";
10
+ import { useSplitViewPaneResize } from "./useSplitViewPaneResize.js";
11
+ import { Fragment, createContext, useCallback, useContext, useEffect, useId, useRef, useState } from "react";
10
12
  import { jsx, jsxs } from "react/jsx-runtime";
11
13
  import { useHotkeys } from "react-hotkeys-hook";
12
14
  import { Transition, TransitionChild } from "@headlessui/react";
13
15
  import * as Portal from "@radix-ui/react-portal";
14
16
  //#region packages/components/src/components/SplitViewPane/SplitViewPane.tsx
15
17
  var PaneDepth = createContext(0);
16
- var useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
17
- var MINIMUM_LEFT_MARGIN_PX = 100;
18
- var MINIMUM_PANE_WIDTH_PX = 500;
19
- var KEYBOARD_RESIZE_STEP_PX = 10;
20
- var MAX_INITIAL_PANE_WIDTH_PX = 1280;
21
- var INITIAL_PANE_WIDTH_RATIO = 2 / 3;
22
- var RESIZE_HANDLE_OUTSET_PX = 8;
23
- var RESIZE_HANDLE_WIDTH_PX = 20;
24
18
  var PANE_TRANSITION_CLASSES = {
25
19
  enter: "duration-normal motion-reduce:duration-0",
26
20
  enterFrom: "opacity-0",
@@ -29,152 +23,37 @@ var PANE_TRANSITION_CLASSES = {
29
23
  leaveFrom: "opacity-100",
30
24
  leaveTo: "animate-slide-right opacity-0 motion-reduce:animate-none"
31
25
  };
32
- var getClientWidth = () => {
33
- if (typeof document === "undefined" || typeof window === "undefined") return 0;
34
- return Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
35
- };
36
- function getAvailableWidth(element) {
37
- if (typeof document === "undefined") return 0;
38
- const style = getComputedStyle(element ?? document.documentElement);
39
- const reservedRight = Number.parseFloat(element ? style.right : style.getPropertyValue("--polly-chat-width"));
40
- return Math.max(0, getClientWidth() - (reservedRight || 0));
41
- }
42
- function clampLeft(value, width, minPaneWidthPx = MINIMUM_PANE_WIDTH_PX) {
43
- const maximumLeft = Math.max(0, width - minPaneWidthPx);
44
- return Math.min(maximumLeft, Math.max(MINIMUM_LEFT_MARGIN_PX, value));
45
- }
46
- function defaultLeft(props, width) {
47
- if (props.sidePaneId != null && typeof window !== "undefined") {
48
- const value = window.localStorage.getItem(`SidePanelGroup:sizes:${props.sidePaneId}`);
49
- const pastRatio = Number.parseFloat(value ?? "");
50
- if (!Number.isNaN(pastRatio)) return clampLeft(width - (width * pastRatio - props.offsetPx), width, props.minWidthPx);
51
- }
52
- return clampLeft(width - (Math.min(props.defaultWidthPx ?? MAX_INITIAL_PANE_WIDTH_PX, width * INITIAL_PANE_WIDTH_RATIO) - props.offsetPx), width, props.minWidthPx);
53
- }
54
- function useShowChildren({ open, children }) {
55
- const [showChildren, setShowChildren] = useState(children);
56
- useIsomorphicLayoutEffect(() => {
57
- if (open) setShowChildren(children);
58
- }, [open, children]);
59
- return showChildren;
26
+ var CustomHeaderSlot = createPortalSlot();
27
+ function PaneShell({ children, showConfirmModal, onDismissConfirm, onDiscard }) {
28
+ return /* @__PURE__ */ jsx(CustomHeaderSlot.Context, { children: /* @__PURE__ */ jsxs(HeaderTitleActionSlot.Context, { children: [children, /* @__PURE__ */ jsx(UnsavedChangesDialog, {
29
+ isOpen: showConfirmModal,
30
+ onClose: onDismissConfirm,
31
+ onDiscard,
32
+ title: "Unsaved Changes",
33
+ description: "You may have unsaved changes. Are you sure you want to exit?",
34
+ discardCopy: "Exit"
35
+ })] }) });
60
36
  }
61
- function useResize(props) {
62
- const target = useRef(null);
63
- const container = useRef(null);
64
- const [element, setElement] = useState(null);
65
- const containerRef = useCallback((node) => {
66
- container.current = node;
67
- setElement(node);
68
- }, []);
69
- const resizing = useRef(false);
70
- const initialProps = useRef(props);
71
- const [width, setWidth] = useState(0);
72
- const [left, setLeft] = useState(MINIMUM_LEFT_MARGIN_PX);
73
- useIsomorphicLayoutEffect(() => {
74
- const width = getAvailableWidth();
75
- setWidth(width);
76
- setLeft(defaultLeft(initialProps.current, width));
77
- }, []);
78
- useEffect(() => {
79
- if (props.overrideWidthPx) {
80
- const desiredWidth = props.overrideWidthPx - props.offsetPx;
81
- setLeft(clampLeft(width - desiredWidth, width, props.minWidthPx));
82
- }
83
- }, [
84
- props.overrideWidthPx,
85
- props.offsetPx,
86
- props.minWidthPx,
87
- width
88
- ]);
89
- const onMouseDown = useCallback((e) => {
90
- e.preventDefault();
91
- resizing.current = true;
92
- if (target.current) target.current.dataset.resizeHandleActive = "true";
93
- }, []);
94
- const onMouseUp = useCallback(() => {
95
- if (resizing.current) {
96
- resizing.current = false;
97
- if (target.current) delete target.current.dataset.resizeHandleActive;
98
- }
99
- }, []);
100
- const doResizeBounded = useCallback((desiredX) => {
101
- if (container.current) {
102
- const width = getAvailableWidth(container.current);
103
- const bounded = clampLeft(desiredX, width, props.minWidthPx);
104
- if (props.sidePaneId != null && width > 0) {
105
- const ratio = (width - bounded) / width;
106
- window.localStorage.setItem(`SidePanelGroup:sizes:${props.sidePaneId}`, ratio.toString());
107
- }
108
- container.current.style.left = `${bounded}px`;
109
- if (target.current) {
110
- target.current.style.left = `${bounded - RESIZE_HANDLE_OUTSET_PX}px`;
111
- target.current.setAttribute("aria-valuenow", bounded.toString());
112
- }
113
- setLeft(bounded);
114
- }
115
- }, [props.sidePaneId, props.minWidthPx]);
116
- const onMouseMove = useCallback((e) => {
117
- if (resizing.current && container.current) {
118
- e.preventDefault();
119
- doResizeBounded(e.clientX);
120
- }
121
- }, [doResizeBounded]);
122
- const onResize = useCallback(() => {
123
- setWidth(getAvailableWidth(container.current));
124
- if (container.current) doResizeBounded(Number.parseFloat(container.current.style.left));
125
- }, [doResizeBounded]);
126
- const onKeyDown = (e) => {
127
- const desiredLeft = e.key === "ArrowLeft" ? left - KEYBOARD_RESIZE_STEP_PX : e.key === "ArrowRight" ? left + KEYBOARD_RESIZE_STEP_PX : e.key === "Home" ? 0 : e.key === "End" ? width : void 0;
128
- if (desiredLeft === void 0) return;
129
- e.preventDefault();
130
- doResizeBounded(desiredLeft);
131
- };
132
- useIsomorphicLayoutEffect(() => {
133
- if (!element) return;
134
- onResize();
135
- const observer = new ResizeObserver(onResize);
136
- observer.observe(element);
137
- return () => observer.disconnect();
138
- }, [element, onResize]);
139
- useEffect(() => {
140
- window.addEventListener("resize", onResize);
141
- document.addEventListener("mouseup", onMouseUp);
142
- document.addEventListener("mousemove", onMouseMove);
143
- return () => {
144
- window.removeEventListener("resize", onResize);
145
- document.removeEventListener("mouseup", onMouseUp);
146
- document.removeEventListener("mousemove", onMouseMove);
147
- };
148
- }, [
149
- onMouseMove,
150
- onMouseUp,
151
- onResize
152
- ]);
153
- useEffect(() => {
154
- if (props.open && left !== clampLeft(left, width, props.minWidthPx)) setLeft(defaultLeft(props, width));
155
- }, [
156
- props,
157
- left,
158
- width
159
- ]);
160
- return {
161
- left,
162
- width,
163
- onMouseDown,
164
- onKeyDown,
165
- target,
166
- container,
167
- containerRef
168
- };
37
+ function PaneBody({ paneZIndex, depth, header, className, children }) {
38
+ return /* @__PURE__ */ jsxs(ZIndexProvider, {
39
+ value: paneZIndex,
40
+ children: [header, /* @__PURE__ */ jsx(PaneDepth.Provider, {
41
+ value: depth + 1,
42
+ children: /* @__PURE__ */ jsx("div", {
43
+ className: cn("flex flex-1 flex-col", className),
44
+ children
45
+ })
46
+ })]
47
+ });
169
48
  }
170
- var CustomHeaderSlot = createPortalSlot();
171
- function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children, title, className, sidePaneId, hideArrows, customHeader, useCustomHeaderSlot, defaultWidthPx, overrideWidthPx, minWidthPx, requireConfirmationOnClose = false, dismissOnOutsideClick = false, scrollContainer = "outer", headerClassName }) {
49
+ function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children, title, className, variant = "overlay", sidePaneId, hideArrows, customHeader, useCustomHeaderSlot, defaultWidthPx, overrideWidthPx, minWidthPx, requireConfirmationOnClose = false, dismissOnOutsideClick = false, scrollContainer = "outer", headerClassName }) {
172
50
  const depth = useContext(PaneDepth);
173
51
  const showChildren = useShowChildren({
174
52
  children,
175
53
  open
176
54
  });
177
- const { left, width, onMouseDown, onKeyDown, target, container, containerRef } = useResize({
55
+ const inline = variant === "inline";
56
+ const { left, width, onMouseDown, onKeyDown, target, container, containerRef } = useSplitViewPaneResize({
178
57
  offsetPx: depth * 4.5 * 16,
179
58
  sidePaneId,
180
59
  defaultWidthPx,
@@ -188,8 +67,8 @@ function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children,
188
67
  const paneZIndex = useZIndex(zIndices.pane);
189
68
  const paneId = useId();
190
69
  const titleId = title && !customHeader && !useCustomHeaderSlot ? `${paneId}-title` : void 0;
191
- const maximumLeft = Math.max(0, width - (minWidthPx ?? MINIMUM_PANE_WIDTH_PX));
192
- const minimumLeft = Math.min(MINIMUM_LEFT_MARGIN_PX, maximumLeft);
70
+ const maximumLeft = Math.max(0, width - (minWidthPx ?? 500));
71
+ const minimumLeft = Math.min(100, maximumLeft);
193
72
  const handleCloseClick = useCallback((e) => {
194
73
  if (requireConfirmationOnClose) {
195
74
  e?.preventDefault();
@@ -200,11 +79,12 @@ function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children,
200
79
  const handleCloseClickRef = useRef(handleCloseClick);
201
80
  handleCloseClickRef.current = handleCloseClick;
202
81
  useEffect(() => {
203
- if (!open) return;
82
+ if (!open || inline) return;
204
83
  return registerOpenPane(paneId, paneZIndex, container, (event) => handleCloseClickRef.current(event), dismissOnOutsideClick ? (event) => handleCloseClickRef.current(event) : void 0);
205
84
  }, [
206
85
  container,
207
86
  dismissOnOutsideClick,
87
+ inline,
208
88
  open,
209
89
  paneId,
210
90
  paneZIndex
@@ -222,6 +102,7 @@ function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children,
222
102
  const renderHeader = () => {
223
103
  if (customHeader) return customHeader;
224
104
  if (useCustomHeaderSlot) return /* @__PURE__ */ jsx(CustomHeaderSlot.Slot, {});
105
+ if (title == null && onClose == null) return null;
225
106
  return /* @__PURE__ */ jsx(SplitViewPaneHeader, {
226
107
  title,
227
108
  open,
@@ -234,79 +115,92 @@ function SplitViewPane({ open, onClose, onExpand, onNext, onPrevious, children,
234
115
  titleId
235
116
  });
236
117
  };
237
- return /* @__PURE__ */ jsx(CustomHeaderSlot.Context, { children: /* @__PURE__ */ jsxs(HeaderTitleActionSlot.Context, { children: [/* @__PURE__ */ jsx(Portal.Root, { children: /* @__PURE__ */ jsx(Transition, {
238
- show: open,
239
- as: Fragment,
240
- children: /* @__PURE__ */ jsxs("div", {
241
- className: "relative",
242
- style: { zIndex: paneZIndex },
243
- children: [/* @__PURE__ */ jsx(TransitionChild, {
244
- as: Fragment,
245
- ...PANE_TRANSITION_CLASSES,
246
- children: /* @__PURE__ */ jsx("div", {
247
- ref: containerRef,
248
- style: {
249
- left,
250
- right: `var(--polly-chat-width, 0px)`
251
- },
252
- className: cn("fixed inset-0 shadow-lg", !open && "pointer-events-none", scrollContainer === "outer" ? "overflow-y-auto overscroll-y-none" : "overflow-hidden"),
253
- "data-testid": "split-view-pane",
254
- role: titleId ? "region" : void 0,
255
- "aria-labelledby": titleId,
118
+ const dismissConfirm = () => setShowConfirmModal(false);
119
+ const discardAndClose = () => {
120
+ setShowConfirmModal(false);
121
+ onCloseRef.current?.();
122
+ };
123
+ return /* @__PURE__ */ jsx(PaneShell, {
124
+ showConfirmModal,
125
+ onDismissConfirm: dismissConfirm,
126
+ onDiscard: discardAndClose,
127
+ children: inline ? /* @__PURE__ */ jsx("div", {
128
+ inert: !open,
129
+ className: cn("grid shrink-0 transition-[grid-template-columns] duration-normal ease-out motion-reduce:transition-none", open ? "grid-cols-[1fr]" : "grid-cols-[0fr]"),
130
+ "data-testid": "split-view-pane",
131
+ role: titleId ? "region" : void 0,
132
+ "aria-labelledby": titleId,
133
+ children: /* @__PURE__ */ jsx("div", {
134
+ className: "flex min-w-0 flex-col overflow-y-auto overflow-x-hidden",
135
+ children: /* @__PURE__ */ jsx(PaneBody, {
136
+ paneZIndex,
137
+ depth,
138
+ header: renderHeader(),
139
+ className,
140
+ children
141
+ })
142
+ })
143
+ }) : /* @__PURE__ */ jsx(Portal.Root, { children: /* @__PURE__ */ jsx(Transition, {
144
+ show: open,
145
+ as: Fragment,
146
+ children: /* @__PURE__ */ jsxs("div", {
147
+ className: "relative",
148
+ style: { zIndex: paneZIndex },
149
+ children: [/* @__PURE__ */ jsx(TransitionChild, {
150
+ as: Fragment,
151
+ ...PANE_TRANSITION_CLASSES,
256
152
  children: /* @__PURE__ */ jsx("div", {
257
- className: cn("relative flex flex-col items-stretch bg-elevated", scrollContainer === "outer" ? "min-h-full" : "h-full"),
258
- children: /* @__PURE__ */ jsxs(ZIndexProvider, {
259
- value: paneZIndex,
260
- children: [renderHeader(), /* @__PURE__ */ jsx(PaneDepth.Provider, {
261
- value: depth + 1,
262
- children: /* @__PURE__ */ jsx("div", {
263
- className: cn("flex flex-1 flex-col", scrollContainer === "inner" && "min-h-0 overflow-y-auto overscroll-y-none", className),
264
- children: showChildren
265
- })
266
- })]
153
+ ref: containerRef,
154
+ style: {
155
+ left,
156
+ right: `var(--polly-chat-width, 0px)`
157
+ },
158
+ className: cn("fixed inset-0 shadow-lg", !open && "pointer-events-none", scrollContainer === "outer" ? "overflow-y-auto overscroll-y-none" : "overflow-hidden"),
159
+ "data-testid": "split-view-pane",
160
+ role: titleId ? "region" : void 0,
161
+ "aria-labelledby": titleId,
162
+ children: /* @__PURE__ */ jsx("div", {
163
+ className: cn("relative flex flex-col items-stretch bg-elevated", scrollContainer === "outer" ? "min-h-full" : "h-full"),
164
+ children: /* @__PURE__ */ jsx(PaneBody, {
165
+ paneZIndex,
166
+ depth,
167
+ header: renderHeader(),
168
+ className: cn(scrollContainer === "inner" && "min-h-0 overflow-y-auto overscroll-y-none", className),
169
+ children: showChildren
170
+ })
267
171
  })
268
172
  })
269
- })
270
- }), /* @__PURE__ */ jsx(TransitionChild, {
271
- as: Fragment,
272
- ...PANE_TRANSITION_CLASSES,
273
- children: /* @__PURE__ */ jsx("div", {
274
- ref: target,
275
- role: "separator",
276
- "aria-label": "Resize pane",
277
- "aria-orientation": "vertical",
278
- "aria-valuemin": minimumLeft,
279
- "aria-valuemax": maximumLeft,
280
- "aria-valuenow": left,
281
- tabIndex: 0,
282
- "data-split-view-pane-resize-handle": true,
283
- "data-testid": "split-view-pane-resize-handle",
284
- className: cn("group fixed inset-y-0 cursor-col-resize focus-visible:outline-none", !open && "pointer-events-none"),
285
- style: {
286
- left: left - RESIZE_HANDLE_OUTSET_PX,
287
- width: RESIZE_HANDLE_WIDTH_PX,
288
- zIndex: zIndices.resizeHandle
289
- },
290
- onMouseDown,
291
- onKeyDown,
173
+ }), /* @__PURE__ */ jsx(TransitionChild, {
174
+ as: Fragment,
175
+ ...PANE_TRANSITION_CLASSES,
292
176
  children: /* @__PURE__ */ jsx("div", {
293
- className: "absolute inset-y-0 w-0 border-l border-subtle transition-all duration-normal group-hover:border-l-2 group-focus-visible:border-l-2 group-focus-visible:border-l-brand group-data-[resize-handle-active]:border-l-brand motion-reduce:transition-none",
294
- style: { left: RESIZE_HANDLE_OUTSET_PX }
177
+ ref: target,
178
+ role: "separator",
179
+ "aria-label": "Resize pane",
180
+ "aria-orientation": "vertical",
181
+ "aria-valuemin": minimumLeft,
182
+ "aria-valuemax": maximumLeft,
183
+ "aria-valuenow": left,
184
+ tabIndex: 0,
185
+ "data-split-view-pane-resize-handle": true,
186
+ "data-testid": "split-view-pane-resize-handle",
187
+ className: cn("group fixed inset-y-0 cursor-col-resize focus-visible:outline-none", !open && "pointer-events-none"),
188
+ style: {
189
+ left: left - 8,
190
+ width: 20,
191
+ zIndex: zIndices.resizeHandle
192
+ },
193
+ onMouseDown,
194
+ onKeyDown,
195
+ children: /* @__PURE__ */ jsx("div", {
196
+ className: "absolute inset-y-0 w-0 border-l border-subtle transition-all duration-normal group-hover:border-l-2 group-focus-visible:border-l-2 group-focus-visible:border-l-brand group-data-[resize-handle-active]:border-l-brand motion-reduce:transition-none",
197
+ style: { left: 8 }
198
+ })
295
199
  })
296
- })
297
- })]
298
- })
299
- }) }), /* @__PURE__ */ jsx(UnsavedChangesDialog, {
300
- isOpen: showConfirmModal,
301
- onClose: () => setShowConfirmModal(false),
302
- onDiscard: () => {
303
- setShowConfirmModal(false);
304
- onCloseRef.current?.();
305
- },
306
- title: "Unsaved Changes",
307
- description: "You may have unsaved changes. Are you sure you want to exit?",
308
- discardCopy: "Exit"
309
- })] }) });
200
+ })]
201
+ })
202
+ }) })
203
+ });
310
204
  }
311
205
  //#endregion
312
206
  export { CustomHeaderSlot, HeaderTitleActionSlot, SplitViewPane };