@epilot/volt-ui-experimental-griffel 0.2.1 → 0.3.0

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 (170) hide show
  1. package/ADOPTING.md +416 -0
  2. package/README.md +96 -17
  3. package/dist/_virtual/jsx-dev-runtime.js +5 -0
  4. package/dist/_virtual/jsx-dev-runtime.js.map +1 -0
  5. package/dist/_virtual/react-jsx-dev-runtime.development.js +5 -0
  6. package/dist/_virtual/react-jsx-dev-runtime.development.js.map +1 -0
  7. package/dist/_virtual/react-jsx-dev-runtime.production.js +5 -0
  8. package/dist/_virtual/react-jsx-dev-runtime.production.js.map +1 -0
  9. package/dist/components/accordion/accordion.js +126 -66
  10. package/dist/components/accordion/accordion.js.map +1 -1
  11. package/dist/components/alert-dialog/alert-dialog.js +239 -137
  12. package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
  13. package/dist/components/avatar/avatar-group.js +102 -47
  14. package/dist/components/avatar/avatar-group.js.map +1 -1
  15. package/dist/components/avatar/avatar.js +99 -76
  16. package/dist/components/avatar/avatar.js.map +1 -1
  17. package/dist/components/badge/badge.js +56 -40
  18. package/dist/components/badge/badge.js.map +1 -1
  19. package/dist/components/breadcrumb/breadcrumb.js +97 -49
  20. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  21. package/dist/components/button/button.js +89 -78
  22. package/dist/components/button/button.js.map +1 -1
  23. package/dist/components/button-group/button-group.js +57 -33
  24. package/dist/components/button-group/button-group.js.map +1 -1
  25. package/dist/components/callout/callout.js +288 -164
  26. package/dist/components/callout/callout.js.map +1 -1
  27. package/dist/components/card/card.js +138 -82
  28. package/dist/components/card/card.js.map +1 -1
  29. package/dist/components/checkbox/checkbox.js +100 -49
  30. package/dist/components/checkbox/checkbox.js.map +1 -1
  31. package/dist/components/collapsible-sidebar/collapsible-sidebar.js +155 -107
  32. package/dist/components/collapsible-sidebar/collapsible-sidebar.js.map +1 -1
  33. package/dist/components/command/command.js +295 -156
  34. package/dist/components/command/command.js.map +1 -1
  35. package/dist/components/data-table/data-table-body.js +114 -54
  36. package/dist/components/data-table/data-table-body.js.map +1 -1
  37. package/dist/components/data-table/data-table-column-header.js +117 -45
  38. package/dist/components/data-table/data-table-column-header.js.map +1 -1
  39. package/dist/components/data-table/data-table-column-visibility.js +98 -39
  40. package/dist/components/data-table/data-table-column-visibility.js.map +1 -1
  41. package/dist/components/data-table/data-table-content.js +90 -58
  42. package/dist/components/data-table/data-table-content.js.map +1 -1
  43. package/dist/components/data-table/data-table-error.js +86 -42
  44. package/dist/components/data-table/data-table-error.js.map +1 -1
  45. package/dist/components/data-table/data-table-header.js +88 -54
  46. package/dist/components/data-table/data-table-header.js.map +1 -1
  47. package/dist/components/data-table/data-table-loading.js +30 -18
  48. package/dist/components/data-table/data-table-loading.js.map +1 -1
  49. package/dist/components/data-table/data-table-pagination.js +27 -19
  50. package/dist/components/data-table/data-table-pagination.js.map +1 -1
  51. package/dist/components/data-table/data-table-row.js +87 -64
  52. package/dist/components/data-table/data-table-row.js.map +1 -1
  53. package/dist/components/data-table/data-table-toolbar.js +24 -16
  54. package/dist/components/data-table/data-table-toolbar.js.map +1 -1
  55. package/dist/components/data-table/data-table.js +182 -145
  56. package/dist/components/data-table/data-table.js.map +1 -1
  57. package/dist/components/date-range-picker/date-range-picker.js +342 -214
  58. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  59. package/dist/components/date-range-picker/range-calendar.js +132 -92
  60. package/dist/components/date-range-picker/range-calendar.js.map +1 -1
  61. package/dist/components/date-time-picker/calendar.js +507 -323
  62. package/dist/components/date-time-picker/calendar.js.map +1 -1
  63. package/dist/components/date-time-picker/date-time-picker-context.js +64 -60
  64. package/dist/components/date-time-picker/date-time-picker-context.js.map +1 -1
  65. package/dist/components/date-time-picker/date-time-picker-input.js +249 -149
  66. package/dist/components/date-time-picker/date-time-picker-input.js.map +1 -1
  67. package/dist/components/date-time-picker/date-time-picker-panel.js +270 -156
  68. package/dist/components/date-time-picker/date-time-picker-panel.js.map +1 -1
  69. package/dist/components/date-time-picker/date-time-picker-popover.js +22 -14
  70. package/dist/components/date-time-picker/date-time-picker-popover.js.map +1 -1
  71. package/dist/components/date-time-picker/date-time-picker.js +118 -70
  72. package/dist/components/date-time-picker/date-time-picker.js.map +1 -1
  73. package/dist/components/date-time-picker/time-picker.js +204 -132
  74. package/dist/components/date-time-picker/time-picker.js.map +1 -1
  75. package/dist/components/density-provider/density-provider.js +48 -0
  76. package/dist/components/density-provider/density-provider.js.map +1 -0
  77. package/dist/components/dialog/dialog.js +281 -151
  78. package/dist/components/dialog/dialog.js.map +1 -1
  79. package/dist/components/drawer/drawer.js +272 -162
  80. package/dist/components/drawer/drawer.js.map +1 -1
  81. package/dist/components/dropdown-menu/dropdown-menu.js +376 -193
  82. package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
  83. package/dist/components/field/field-combobox.js +447 -240
  84. package/dist/components/field/field-combobox.js.map +1 -1
  85. package/dist/components/field/field-select.js +23 -19
  86. package/dist/components/field/field-select.js.map +1 -1
  87. package/dist/components/field/field.js +315 -206
  88. package/dist/components/field/field.js.map +1 -1
  89. package/dist/components/label/label.js +24 -16
  90. package/dist/components/label/label.js.map +1 -1
  91. package/dist/components/list/list.js +623 -369
  92. package/dist/components/list/list.js.map +1 -1
  93. package/dist/components/option-card/option-card.js +323 -159
  94. package/dist/components/option-card/option-card.js.map +1 -1
  95. package/dist/components/pill/pill.js +91 -72
  96. package/dist/components/pill/pill.js.map +1 -1
  97. package/dist/components/popover/popover.js +99 -54
  98. package/dist/components/popover/popover.js.map +1 -1
  99. package/dist/components/radio/radio.js +92 -49
  100. package/dist/components/radio/radio.js.map +1 -1
  101. package/dist/components/scroll-overflow/scroll-overflow.js +349 -197
  102. package/dist/components/scroll-overflow/scroll-overflow.js.map +1 -1
  103. package/dist/components/segmented-control/segmented-control.js +141 -97
  104. package/dist/components/segmented-control/segmented-control.js.map +1 -1
  105. package/dist/components/select/select.js +452 -227
  106. package/dist/components/select/select.js.map +1 -1
  107. package/dist/components/separator/separator.js +24 -16
  108. package/dist/components/separator/separator.js.map +1 -1
  109. package/dist/components/skeleton/skeleton.js +78 -38
  110. package/dist/components/skeleton/skeleton.js.map +1 -1
  111. package/dist/components/spinner/spinner.js +44 -20
  112. package/dist/components/spinner/spinner.js.map +1 -1
  113. package/dist/components/switch/switch.js +163 -86
  114. package/dist/components/switch/switch.js.map +1 -1
  115. package/dist/components/table/table-pagination.js +468 -210
  116. package/dist/components/table/table-pagination.js.map +1 -1
  117. package/dist/components/table/table.js +212 -144
  118. package/dist/components/table/table.js.map +1 -1
  119. package/dist/components/tabs/tabs.js +94 -58
  120. package/dist/components/tabs/tabs.js.map +1 -1
  121. package/dist/components/text/text.js +40 -32
  122. package/dist/components/text/text.js.map +1 -1
  123. package/dist/components/toast/toast.js +189 -113
  124. package/dist/components/toast/toast.js.map +1 -1
  125. package/dist/components/toggle/toggle-group.js +40 -24
  126. package/dist/components/toggle/toggle-group.js.map +1 -1
  127. package/dist/components/toggle/toggle.js +50 -42
  128. package/dist/components/toggle/toggle.js.map +1 -1
  129. package/dist/components/tooltip/tooltip.js +101 -55
  130. package/dist/components/tooltip/tooltip.js.map +1 -1
  131. package/dist/index.d.ts +1675 -1068
  132. package/dist/index.js +286 -280
  133. package/dist/index.js.map +1 -1
  134. package/dist/lib/clear-button.js +27 -15
  135. package/dist/lib/clear-button.js.map +1 -1
  136. package/dist/lib/icons.js +18 -6
  137. package/dist/lib/icons.js.map +1 -1
  138. package/dist/packages/volt-runtime/dist/sheet.js +27 -10
  139. package/dist/packages/volt-runtime/dist/sheet.js.map +1 -1
  140. package/dist/packages/volt-runtime/dist/styles/recipe.js +76 -0
  141. package/dist/packages/volt-runtime/dist/styles/recipe.js.map +1 -0
  142. package/dist/styles/document-context.js +12 -0
  143. package/dist/styles/document-context.js.map +1 -0
  144. package/dist/styles/make-styles.js +18 -10
  145. package/dist/styles/make-styles.js.map +1 -1
  146. package/dist/tokens/core.generated.js +1239 -1153
  147. package/dist/tokens/core.generated.js.map +1 -1
  148. package/dist/tokens/index.d.ts +1103 -1054
  149. package/dist/tokens/index.js +1045 -996
  150. package/dist/tokens/index.js.map +1 -1
  151. package/dist/tokens/install.js +25 -9
  152. package/dist/tokens/install.js.map +1 -1
  153. package/dist/tokens/palette.generated.js +1323 -1293
  154. package/dist/tokens/palette.generated.js.map +1 -1
  155. package/dist/tokens/use-palette-tokens.js +20 -0
  156. package/dist/tokens/use-palette-tokens.js.map +1 -0
  157. package/dist/tokens.json +127 -2
  158. package/dist/vendor/react/cjs/react-jsx-dev-runtime.development.js +236 -0
  159. package/dist/vendor/react/cjs/react-jsx-dev-runtime.development.js.map +1 -0
  160. package/dist/vendor/react/cjs/react-jsx-dev-runtime.production.js +21 -0
  161. package/dist/vendor/react/cjs/react-jsx-dev-runtime.production.js.map +1 -0
  162. package/dist/vendor/react/jsx-dev-runtime.js +9 -0
  163. package/dist/vendor/react/jsx-dev-runtime.js.map +1 -0
  164. package/package.json +17 -4
  165. package/scripts/migration-diagnostics-core.mjs +859 -0
  166. package/scripts/migration-diagnostics.mjs +353 -0
  167. package/scripts/migration-sweep.mjs +179 -0
  168. package/testing/jest-preset.cjs +64 -0
  169. package/dist/packages/volt-runtime/dist/styles/make-styles.js +0 -22
  170. package/dist/packages/volt-runtime/dist/styles/make-styles.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-overflow.js","sources":["../../../src/components/scroll-overflow/scroll-overflow.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type UseScrollOverflowOptions = {\n /** Scroll distance per step in pixels. Default: 200 */\n scrollStep?: number\n /** Scroll orientation. Default: \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nexport type UseScrollOverflowReturn = {\n /** Ref to attach to the scroll container (Base UI Viewport) */\n scrollRef: React.RefObject<HTMLDivElement | null>\n /** Whether the content overflows the container */\n hasOverflow: boolean\n /** Whether there is hidden content before the visible area (left or top) */\n canScrollStart: boolean\n /** Whether there is hidden content after the visible area (right or bottom) */\n canScrollEnd: boolean\n /** Scroll toward the start (left or up) by scrollStep */\n scrollToStart: () => void\n /** Scroll toward the end (right or down) by scrollStep */\n scrollToEnd: () => void\n}\n\nfunction getScrollBehavior(): ScrollBehavior {\n if (typeof window === \"undefined\" || !window.matchMedia) return \"auto\"\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\"\n}\n\nexport function useScrollOverflow(\n options: UseScrollOverflowOptions = {}\n): UseScrollOverflowReturn {\n const { scrollStep = 200, orientation = \"horizontal\" } = options\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const [hasOverflow, setHasOverflow] = React.useState(false)\n const [canScrollStart, setCanScrollStart] = React.useState(false)\n const [canScrollEnd, setCanScrollEnd] = React.useState(false)\n\n const isHorizontal = orientation === \"horizontal\"\n\n const updateScrollState = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n\n if (isHorizontal) {\n const scrollLeft = Math.round(el.scrollLeft)\n const scrollWidth = el.scrollWidth\n const clientWidth = el.clientWidth\n\n setHasOverflow(scrollWidth > clientWidth)\n setCanScrollStart(scrollLeft > 0)\n setCanScrollEnd(scrollLeft + clientWidth < scrollWidth - 1)\n } else {\n const scrollTop = Math.round(el.scrollTop)\n const scrollHeight = el.scrollHeight\n const clientHeight = el.clientHeight\n\n setHasOverflow(scrollHeight > clientHeight)\n setCanScrollStart(scrollTop > 0)\n setCanScrollEnd(scrollTop + clientHeight < scrollHeight - 1)\n }\n }, [isHorizontal])\n\n React.useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n\n updateScrollState()\n\n let observer: ResizeObserver | null = null\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(() => {\n updateScrollState()\n })\n observer.observe(el)\n for (const child of el.children) {\n observer.observe(child)\n }\n }\n\n el.addEventListener(\"scroll\", updateScrollState, { passive: true })\n\n return () => {\n observer?.disconnect()\n el.removeEventListener(\"scroll\", updateScrollState)\n }\n }, [updateScrollState])\n\n const scrollToStartFn = React.useCallback(() => {\n scrollRef.current?.scrollBy({\n [isHorizontal ? \"left\" : \"top\"]: -scrollStep,\n behavior: getScrollBehavior(),\n })\n }, [scrollStep, isHorizontal])\n\n const scrollToEndFn = React.useCallback(() => {\n scrollRef.current?.scrollBy({\n [isHorizontal ? \"left\" : \"top\"]: scrollStep,\n behavior: getScrollBehavior(),\n })\n }, [scrollStep, isHorizontal])\n\n return {\n scrollRef,\n hasOverflow,\n canScrollStart,\n canScrollEnd,\n scrollToStart: scrollToStartFn,\n scrollToEnd: scrollToEndFn,\n }\n}\n\nconst ChevronLeftIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M 8.86 10.51 C 8.94 10.51 9.02 10.49 9.08 10.43 C 9.14 10.38 9.17 10.3 9.17 10.21 V 5.79 C 9.17 5.7 9.14 5.62 9.08 5.57 C 9.01 5.51 8.94 5.49 8.86 5.49 C 8.84 5.49 8.77 5.52 8.65 5.58 L 6.55 7.68 C 6.5 7.73 6.47 7.78 6.44 7.83 C 6.42 7.88 6.41 7.94 6.41 8 C 6.41 8.06 6.42 8.12 6.44 8.17 C 6.47 8.22 6.5 8.27 6.55 8.32 L 8.65 10.42 C 8.68 10.45 8.71 10.47 8.75 10.49 C 8.78 10.51 8.82 10.51 8.86 10.51 Z\" />\n </svg>\n)\n\nconst ChevronRightIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M7.14 10.51C7.06 10.51 6.98 10.49 6.92 10.43C6.86 10.38 6.83 10.3 6.83 10.21V5.79C6.83 5.7 6.86 5.62 6.92 5.57C6.99 5.51 7.06 5.49 7.14 5.49C7.16 5.49 7.23 5.52 7.35 5.58L9.45 7.68C9.5 7.73 9.53 7.78 9.56 7.83C9.58 7.88 9.59 7.94 9.59 8C9.59 8.06 9.58 8.12 9.56 8.17C9.53 8.22 9.5 8.27 9.45 8.32L7.35 10.42C7.32 10.45 7.29 10.47 7.25 10.49C7.22 10.51 7.18 10.51 7.14 10.51Z\" />\n </svg>\n)\n\nconst ChevronUpIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M5.49 7.14C5.49 7.06 5.51 6.98 5.57 6.92C5.62 6.86 5.7 6.83 5.79 6.83H10.21C10.3 6.83 10.38 6.86 10.43 6.92C10.49 6.99 10.51 7.06 10.51 7.14C10.51 7.16 10.48 7.23 10.42 7.35L8.32 9.45C8.27 9.5 8.22 9.53 8.17 9.56C8.12 9.58 8.06 9.59 8 9.59C7.94 9.59 7.88 9.58 7.83 9.56C7.78 9.53 7.73 9.5 7.68 9.45L5.58 7.35C5.55 7.32 5.53 7.29 5.51 7.25C5.49 7.22 5.49 7.18 5.49 7.14Z\" />\n </svg>\n)\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M10.51 8.86C10.51 8.94 10.49 9.02 10.43 9.08C10.38 9.14 10.3 9.17 10.21 9.17H5.79C5.7 9.17 5.62 9.14 5.57 9.08C5.51 9.01 5.49 8.94 5.49 8.86C5.49 8.84 5.52 8.77 5.58 8.65L7.68 6.55C7.73 6.5 7.78 6.47 7.83 6.44C7.88 6.42 7.94 6.41 8 6.41C8.06 6.41 8.12 6.42 8.17 6.44C8.22 6.47 8.27 6.5 8.32 6.55L10.42 8.65C10.45 8.68 10.47 8.71 10.49 8.75C10.51 8.78 10.51 8.82 10.51 8.86Z\" />\n </svg>\n)\n\nconst useStyles = makeVoltStyles({\n container: {\n position: \"relative\",\n display: \"flex\",\n },\n containerHorizontal: {\n alignItems: \"center\",\n },\n containerVertical: {\n flexDirection: \"column\",\n },\n fade: {\n position: \"absolute\",\n zIndex: 10,\n pointerEvents: \"none\",\n },\n fadeHorizontalStart: {\n left: 0,\n top: 0,\n bottom: 0,\n },\n fadeHorizontalEnd: {\n right: 0,\n top: 0,\n bottom: 0,\n },\n fadeVerticalStart: {\n top: 0,\n left: 0,\n right: 0,\n },\n fadeVerticalEnd: {\n bottom: 0,\n left: 0,\n right: 0,\n },\n shadowHorizontalStart: {\n boxShadow: \"inset 8px 0 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowHorizontalEnd: {\n boxShadow: \"inset -8px 0 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowVerticalStart: {\n boxShadow: \"inset 0 8px 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowVerticalEnd: {\n boxShadow: \"inset 0 -8px 6px -6px rgba(0,0,0,0.08)\",\n },\n arrowButton: {\n position: \"absolute\",\n zIndex: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n ...shorthands.borderStyle(\"none\"),\n ...shorthands.borderWidth(0),\n ...shorthands.padding(0),\n },\n arrowHorizontalStart: {\n left: 0,\n top: 0,\n bottom: 0,\n width: \"1.5rem\",\n },\n arrowHorizontalEnd: {\n right: 0,\n top: 0,\n bottom: 0,\n width: \"1.5rem\",\n },\n arrowVerticalStart: {\n top: 0,\n left: 0,\n right: 0,\n height: \"1.5rem\",\n },\n arrowVerticalEnd: {\n bottom: 0,\n left: 0,\n right: 0,\n height: \"1.5rem\",\n },\n arrowBadge: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: tokens.grayA8,\n ...shorthands.borderRadius(tokens.radiusSm),\n backdropFilter: \"blur(4px)\",\n color: tokens.gray1,\n \":hover\": {\n backgroundColor: tokens.grayA12,\n },\n },\n arrowIcon: {\n width: \"1rem\",\n height: \"1rem\",\n },\n scrollAreaRoot: {\n ...shorthands.overflow(\"hidden\"),\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n scrollAreaRootHorizontal: {\n minWidth: 0,\n },\n scrollAreaRootVertical: {\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n },\n scrollAreaRootScrollbarHorizontal: {\n display: \"flex\",\n flexDirection: \"column\",\n },\n scrollAreaRootScrollbarVertical: {\n display: \"flex\",\n flexDirection: \"row\",\n },\n viewport: {\n ...shorthands.borderRadius(tokens.radiusMd),\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineOffset: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n },\n viewportHorizontal: {\n \"& > div\": {\n display: \"flex\",\n flexDirection: \"row\",\n },\n },\n viewportVertical: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n minHeight: 0,\n },\n viewportFlex: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n scrollbar: {\n position: \"relative\",\n display: \"flex\",\n touchAction: \"none\",\n userSelect: \"none\",\n ...shorthands.padding(\"1px\"),\n transitionProperty: \"color, background-color, border-color\",\n transitionDuration: \"150ms\",\n },\n scrollbarHidden: {\n display: \"none\",\n },\n scrollbarHorizontal: {\n height: \"0.5rem\",\n flexDirection: \"column\",\n },\n scrollbarVertical: {\n width: \"0.5rem\",\n flexDirection: \"row\",\n },\n thumb: {\n position: \"relative\",\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.grayA8,\n },\n})\n\nexport type ScrollOverflowProps = React.ComponentProps<\n typeof ScrollAreaPrimitive.Root\n> &\n UseScrollOverflowOptions & {\n /** Show navigation arrow buttons on edges. Default: false */\n arrows?: boolean\n /** Show gradient fade indicators on edges. Default: true */\n gradients?: boolean\n /** Gradient width in pixels. Default: 40 */\n gradientWidth?: number\n /** Gradient base color (CSS value). Should match the parent background. Default: \"var(--volt-body)\" */\n gradientColor?: string\n /** Show inset shadow on overflow edges. Default: true */\n shadow?: boolean\n /** Show a styled scrollbar track. Default: false */\n scrollbar?: boolean\n }\n\nexport const ScrollOverflow = React.forwardRef<\n HTMLDivElement,\n ScrollOverflowProps\n>(function ScrollOverflow(\n {\n className,\n children,\n arrows = false,\n gradients = true,\n gradientWidth = 40,\n gradientColor = \"var(--volt-body)\",\n shadow = true,\n scrollbar = false,\n scrollStep,\n orientation = \"horizontal\",\n ...props\n },\n ref\n) {\n const styles = useStyles()\n const {\n scrollRef,\n hasOverflow,\n canScrollStart,\n canScrollEnd,\n scrollToStart,\n scrollToEnd,\n } = useScrollOverflow({ scrollStep, orientation })\n\n const isHorizontal = orientation === \"horizontal\"\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Only handle when the viewport itself is focused, not children\n if (e.target !== e.currentTarget) return\n\n const prevKey = isHorizontal ? \"ArrowLeft\" : \"ArrowUp\"\n const nextKey = isHorizontal ? \"ArrowRight\" : \"ArrowDown\"\n\n switch (e.key) {\n case prevKey:\n e.preventDefault()\n scrollToStart()\n break\n case nextKey:\n e.preventDefault()\n scrollToEnd()\n break\n case \"Home\":\n e.preventDefault()\n scrollRef.current?.scrollTo({\n [isHorizontal ? \"left\" : \"top\"]: 0,\n behavior: \"smooth\",\n })\n break\n case \"End\":\n e.preventDefault()\n scrollRef.current?.scrollTo({\n [isHorizontal ? \"left\" : \"top\"]: isHorizontal\n ? scrollRef.current.scrollWidth\n : scrollRef.current.scrollHeight,\n behavior: \"smooth\",\n })\n break\n }\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"scroll-overflow\"\n {...{ [SLOT_ATTR]: \"scroll-overflow\" }}\n data-orientation={orientation}\n data-has-overflow={hasOverflow || undefined}\n data-can-scroll-start={canScrollStart || undefined}\n data-can-scroll-end={canScrollEnd || undefined}\n className={mergeClasses(\n styles.container,\n isHorizontal ? styles.containerHorizontal : styles.containerVertical,\n className\n )}\n >\n {/* Start gradient + shadow */}\n {gradients && canScrollStart && (\n <div\n data-slot=\"scroll-overflow-fade-start\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-fade-start\" }}\n aria-hidden=\"true\"\n className={mergeClasses(\n styles.fade,\n isHorizontal\n ? styles.fadeHorizontalStart\n : styles.fadeVerticalStart,\n shadow &&\n (isHorizontal\n ? styles.shadowHorizontalStart\n : styles.shadowVerticalStart)\n )}\n style={\n isHorizontal\n ? {\n width: gradientWidth,\n background: `linear-gradient(to right, ${gradientColor}, transparent)`,\n }\n : {\n height: gradientWidth,\n background: `linear-gradient(to bottom, ${gradientColor}, transparent)`,\n }\n }\n />\n )}\n\n {/* Start arrow button */}\n {arrows && canScrollStart && (\n <button\n data-slot=\"scroll-overflow-arrow-start\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-start\" }}\n type=\"button\"\n tabIndex={-1}\n aria-label={isHorizontal ? \"Scroll left\" : \"Scroll up\"}\n onClick={scrollToStart}\n className={mergeClasses(\n styles.arrowButton,\n isHorizontal\n ? styles.arrowHorizontalStart\n : styles.arrowVerticalStart\n )}\n >\n <span\n data-slot=\"scroll-overflow-arrow-icon\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-icon\" }}\n className={styles.arrowBadge}\n >\n {isHorizontal ? (\n <ChevronLeftIcon className={styles.arrowIcon} />\n ) : (\n <ChevronUpIcon className={styles.arrowIcon} />\n )}\n </span>\n </button>\n )}\n\n {/* Radix ScrollArea */}\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-overflow-root\"\n type=\"scroll\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-root\" }}\n className={mergeClasses(\n styles.scrollAreaRoot,\n isHorizontal\n ? styles.scrollAreaRootHorizontal\n : styles.scrollAreaRootVertical,\n scrollbar &&\n (isHorizontal\n ? styles.scrollAreaRootScrollbarHorizontal\n : styles.scrollAreaRootScrollbarVertical)\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={scrollRef}\n data-slot=\"scroll-overflow-viewport\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-viewport\" }}\n tabIndex={hasOverflow ? 0 : undefined}\n onKeyDown={handleKeyDown}\n className={mergeClasses(\n styles.viewport,\n isHorizontal && styles.viewportHorizontal,\n scrollbar && styles.viewportFlex,\n !isHorizontal && styles.viewportVertical\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation={orientation}\n data-slot=\"scroll-overflow-scrollbar\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-scrollbar\" }}\n className={mergeClasses(\n scrollbar ? styles.scrollbar : styles.scrollbarHidden,\n isHorizontal ? styles.scrollbarHorizontal : styles.scrollbarVertical\n )}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-overflow-thumb\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-thumb\" }}\n className={styles.thumb}\n />\n </ScrollAreaPrimitive.Scrollbar>\n </ScrollAreaPrimitive.Root>\n\n {/* End gradient + shadow */}\n {gradients && canScrollEnd && (\n <div\n data-slot=\"scroll-overflow-fade-end\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-fade-end\" }}\n aria-hidden=\"true\"\n className={mergeClasses(\n styles.fade,\n isHorizontal ? styles.fadeHorizontalEnd : styles.fadeVerticalEnd,\n shadow &&\n (isHorizontal\n ? styles.shadowHorizontalEnd\n : styles.shadowVerticalEnd)\n )}\n style={\n isHorizontal\n ? {\n width: gradientWidth,\n background: `linear-gradient(to left, ${gradientColor}, transparent)`,\n }\n : {\n height: gradientWidth,\n background: `linear-gradient(to top, ${gradientColor}, transparent)`,\n }\n }\n />\n )}\n\n {/* End arrow button */}\n {arrows && canScrollEnd && (\n <button\n data-slot=\"scroll-overflow-arrow-end\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-end\" }}\n type=\"button\"\n tabIndex={-1}\n aria-label={isHorizontal ? \"Scroll right\" : \"Scroll down\"}\n onClick={scrollToEnd}\n className={mergeClasses(\n styles.arrowButton,\n isHorizontal ? styles.arrowHorizontalEnd : styles.arrowVerticalEnd\n )}\n >\n <span\n data-slot=\"scroll-overflow-arrow-icon\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-icon\" }}\n className={styles.arrowBadge}\n >\n {isHorizontal ? (\n <ChevronRightIcon className={styles.arrowIcon} />\n ) : (\n <ChevronDownIcon className={styles.arrowIcon} />\n )}\n </span>\n </button>\n )}\n </div>\n )\n})\n"],"names":["getScrollBehavior","useScrollOverflow","options","scrollStep","orientation","scrollRef","React","hasOverflow","setHasOverflow","canScrollStart","setCanScrollStart","canScrollEnd","setCanScrollEnd","isHorizontal","updateScrollState","el","scrollLeft","scrollWidth","clientWidth","scrollTop","scrollHeight","clientHeight","observer","child","scrollToStartFn","_a","scrollToEndFn","ChevronLeftIcon","props","jsx","ChevronRightIcon","ChevronUpIcon","ChevronDownIcon","useStyles","makeVoltStyles","shorthands","tokens.grayA8","tokens.radiusSm","tokens.gray1","tokens.grayA12","tokens.radiusMd","tokens.accentA8","ScrollOverflow","className","children","arrows","gradients","gradientWidth","gradientColor","shadow","scrollbar","ref","styles","scrollToStart","scrollToEnd","handleKeyDown","e","prevKey","nextKey","_b","jsxs","SLOT_ATTR","mergeClasses","ScrollAreaPrimitive.Root","ScrollAreaPrimitive.Viewport","ScrollAreaPrimitive.Scrollbar","ScrollAreaPrimitive.Thumb"],"mappings":";;;;;;;;AA8BA,SAASA,IAAoC;AAC3C,SAAI,OAAO,SAAW,OAAe,CAAC,OAAO,cACtC,OAAO,WAAW,kCAAkC,EAAE,UADG,SAG5D;AACN;AAEO,SAASC,EACdC,IAAoC,IACX;AACzB,QAAM,EAAE,YAAAC,IAAa,KAAK,aAAAC,IAAc,iBAAiBF,GACnDG,IAAYC,EAAM,OAA8B,IAAI,GACpD,CAACC,GAAaC,CAAc,IAAIF,EAAM,SAAS,EAAK,GACpD,CAACG,GAAgBC,CAAiB,IAAIJ,EAAM,SAAS,EAAK,GAC1D,CAACK,GAAcC,CAAe,IAAIN,EAAM,SAAS,EAAK,GAEtDO,IAAeT,MAAgB,cAE/BU,IAAoBR,EAAM,YAAY,MAAM;AAChD,UAAMS,IAAKV,EAAU;AACrB,QAAKU;AAEL,UAAIF,GAAc;AAChB,cAAMG,IAAa,KAAK,MAAMD,EAAG,UAAU,GACrCE,IAAcF,EAAG,aACjBG,IAAcH,EAAG;AAEvB,QAAAP,EAAeS,IAAcC,CAAW,GACxCR,EAAkBM,IAAa,CAAC,GAChCJ,EAAgBI,IAAaE,IAAcD,IAAc,CAAC;AAAA,MAC5D,OAAO;AACL,cAAME,IAAY,KAAK,MAAMJ,EAAG,SAAS,GACnCK,IAAeL,EAAG,cAClBM,IAAeN,EAAG;AAExB,QAAAP,EAAeY,IAAeC,CAAY,GAC1CX,EAAkBS,IAAY,CAAC,GAC/BP,EAAgBO,IAAYE,IAAeD,IAAe,CAAC;AAAA,MAC7D;AAAA,EACF,GAAG,CAACP,CAAY,CAAC;AAEjB,EAAAP,EAAM,UAAU,MAAM;AACpB,UAAMS,IAAKV,EAAU;AACrB,QAAI,CAACU,EAAI;AAET,IAAAD,EAAA;AAEA,QAAIQ,IAAkC;AACtC,QAAI,OAAO,iBAAmB,KAAa;AACzC,MAAAA,IAAW,IAAI,eAAe,MAAM;AAClC,QAAAR,EAAA;AAAA,MACF,CAAC,GACDQ,EAAS,QAAQP,CAAE;AACnB,iBAAWQ,KAASR,EAAG;AACrB,QAAAO,EAAS,QAAQC,CAAK;AAAA,IAE1B;AAEA,WAAAR,EAAG,iBAAiB,UAAUD,GAAmB,EAAE,SAAS,IAAM,GAE3D,MAAM;AACX,MAAAQ,KAAA,QAAAA,EAAU,cACVP,EAAG,oBAAoB,UAAUD,CAAiB;AAAA,IACpD;AAAA,EACF,GAAG,CAACA,CAAiB,CAAC;AAEtB,QAAMU,IAAkBlB,EAAM,YAAY,MAAM;;AAC9C,KAAAmB,IAAApB,EAAU,YAAV,QAAAoB,EAAmB,SAAS;AAAA,MAC1B,CAACZ,IAAe,SAAS,KAAK,GAAG,CAACV;AAAA,MAClC,UAAUH,EAAA;AAAA,IAAkB;AAAA,EAEhC,GAAG,CAACG,GAAYU,CAAY,CAAC,GAEvBa,IAAgBpB,EAAM,YAAY,MAAM;;AAC5C,KAAAmB,IAAApB,EAAU,YAAV,QAAAoB,EAAmB,SAAS;AAAA,MAC1B,CAACZ,IAAe,SAAS,KAAK,GAAGV;AAAA,MACjC,UAAUH,EAAA;AAAA,IAAkB;AAAA,EAEhC,GAAG,CAACG,GAAYU,CAAY,CAAC;AAE7B,SAAO;AAAA,IACL,WAAAR;AAAA,IACA,aAAAE;AAAA,IACA,gBAAAE;AAAA,IACA,cAAAE;AAAA,IACA,eAAea;AAAA,IACf,aAAaE;AAAA,EAAA;AAEjB;AAEA,MAAMC,IAAkB,CAACC,MACvB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,MAAK;AAAA,IACJ,GAAGD;AAAA,IAEJ,UAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,sZAAA,CAAsZ;AAAA,EAAA;AACha,GAGIC,IAAmB,CAACF,MACxB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,MAAK;AAAA,IACJ,GAAGD;AAAA,IAEJ,UAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,wXAAA,CAAwX;AAAA,EAAA;AAClY,GAGIE,IAAgB,CAACH,MACrB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,MAAK;AAAA,IACJ,GAAGD;AAAA,IAEJ,UAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,oXAAA,CAAoX;AAAA,EAAA;AAC9X,GAGIG,IAAkB,CAACJ,MACvB,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,MAAK;AAAA,IACJ,GAAGD;AAAA,IAEJ,UAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,wXAAA,CAAwX;AAAA,EAAA;AAClY,GAGII,IAAYC,EAAe;AAAA,EAC/B,WAAW;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,EAAA;AAAA,EAEX,qBAAqB;AAAA,IACnB,YAAY;AAAA,EAAA;AAAA,EAEd,mBAAmB;AAAA,IACjB,eAAe;AAAA,EAAA;AAAA,EAEjB,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,EAAA;AAAA,EAEjB,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,EAAA;AAAA,EAEV,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EAAA;AAAA,EAEV,mBAAmB;AAAA,IACjB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,uBAAuB;AAAA,IACrB,WAAW;AAAA,EAAA;AAAA,EAEb,qBAAqB;AAAA,IACnB,WAAW;AAAA,EAAA;AAAA,EAEb,qBAAqB;AAAA,IACnB,WAAW;AAAA,EAAA;AAAA,EAEb,mBAAmB;AAAA,IACjB,WAAW;AAAA,EAAA;AAAA,EAEb,aAAa;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,GAAGC,EAAW,YAAY,MAAM;AAAA,IAChC,GAAGA,EAAW,YAAY,CAAC;AAAA,IAC3B,GAAGA,EAAW,QAAQ,CAAC;AAAA,EAAA;AAAA,EAEzB,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAAA,EAET,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAAA,EAET,oBAAoB;AAAA,IAClB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,kBAAkB;AAAA,IAChB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,YAAY;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,iBAAiBC;AAAAA,IACjB,GAAGD,EAAW,aAAaE,CAAe;AAAA,IAC1C,gBAAgB;AAAA,IAChB,OAAOC;AAAAA,IACP,UAAU;AAAA,MACR,iBAAiBC;AAAAA,IAAO;AAAA,EAC1B;AAAA,EAEF,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,gBAAgB;AAAA,IACd,GAAGJ,EAAW,SAAS,QAAQ;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAEb,0BAA0B;AAAA,IACxB,UAAU;AAAA,EAAA;AAAA,EAEZ,wBAAwB;AAAA,IACtB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,EAAA;AAAA,EAEjB,mCAAmC;AAAA,IACjC,SAAS;AAAA,IACT,eAAe;AAAA,EAAA;AAAA,EAEjB,iCAAiC;AAAA,IAC/B,SAAS;AAAA,IACT,eAAe;AAAA,EAAA;AAAA,EAEjB,UAAU;AAAA,IACR,GAAGA,EAAW,aAAaK,CAAe;AAAA,IAC1C,kBAAkB;AAAA,MAChB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,cAAc;AAAA,MACd,cAAcC;AAAAA,IAAO;AAAA,EACvB;AAAA,EAEF,oBAAoB;AAAA,IAClB,WAAW;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA,EAEF,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,EAAA;AAAA,EAEb,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAEb,WAAW;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,GAAGN,EAAW,QAAQ,KAAK;AAAA,IAC3B,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EAAA;AAAA,EAEtB,iBAAiB;AAAA,IACf,SAAS;AAAA,EAAA;AAAA,EAEX,qBAAqB;AAAA,IACnB,QAAQ;AAAA,IACR,eAAe;AAAA,EAAA;AAAA,EAEjB,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,eAAe;AAAA,EAAA;AAAA,EAEjB,OAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,GAAGA,EAAW,aAAa,QAAQ;AAAA,IACnC,iBAAiBC;AAAAA,EAAO;AAE5B,CAAC,GAoBYM,KAAiBpC,EAAM,WAGlC,SACA;AAAA,EACE,WAAAqC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,eAAAC,IAAgB;AAAA,EAChB,eAAAC,IAAgB;AAAA,EAChB,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,YAAA/C;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,GAAGwB;AACL,GACAuB,GACA;AACA,QAAMC,IAASnB,EAAA,GACT;AAAA,IACJ,WAAA5B;AAAA,IACA,aAAAE;AAAA,IACA,gBAAAE;AAAA,IACA,cAAAE;AAAA,IACA,eAAA0C;AAAA,IACA,aAAAC;AAAA,EAAA,IACErD,EAAkB,EAAE,YAAAE,GAAY,aAAAC,GAAa,GAE3CS,IAAeT,MAAgB,cAE/BmD,IAAgB,CAACC,MAA2C;;AAEhE,QAAIA,EAAE,WAAWA,EAAE,cAAe;AAElC,UAAMC,IAAU5C,IAAe,cAAc,WACvC6C,IAAU7C,IAAe,eAAe;AAE9C,YAAQ2C,EAAE,KAAA;AAAA,MACR,KAAKC;AACH,QAAAD,EAAE,eAAA,GACFH,EAAA;AACA;AAAA,MACF,KAAKK;AACH,QAAAF,EAAE,eAAA,GACFF,EAAA;AACA;AAAA,MACF,KAAK;AACH,QAAAE,EAAE,eAAA,IACF/B,IAAApB,EAAU,YAAV,QAAAoB,EAAmB,SAAS;AAAA,UAC1B,CAACZ,IAAe,SAAS,KAAK,GAAG;AAAA,UACjC,UAAU;AAAA,QAAA;AAEZ;AAAA,MACF,KAAK;AACH,QAAA2C,EAAE,eAAA,IACFG,IAAAtD,EAAU,YAAV,QAAAsD,EAAmB,SAAS;AAAA,UAC1B,CAAC9C,IAAe,SAAS,KAAK,GAAGA,IAC7BR,EAAU,QAAQ,cAClBA,EAAU,QAAQ;AAAA,UACtB,UAAU;AAAA,QAAA;AAEZ;AAAA,IAAA;AAAA,EAEN;AAEA,SACE,gBAAAuD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAT;AAAA,MACA,aAAU;AAAA,MACJ,CAACU,CAAS,GAAG;AAAA,MACnB,oBAAkBzD;AAAA,MAClB,qBAAmBG,KAAe;AAAA,MAClC,yBAAuBE,KAAkB;AAAA,MACzC,uBAAqBE,KAAgB;AAAA,MACrC,WAAWmD;AAAAA,QACTV,EAAO;AAAA,QACPvC,IAAeuC,EAAO,sBAAsBA,EAAO;AAAA,QACnDT;AAAA,MAAA;AAAA,MAID,UAAA;AAAA,QAAAG,KAAarC,KACZ,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACJ,CAACgC,CAAS,GAAG;AAAA,YACnB,eAAY;AAAA,YACZ,WAAWC;AAAAA,cACTV,EAAO;AAAA,cACPvC,IACIuC,EAAO,sBACPA,EAAO;AAAA,cACXH,MACGpC,IACGuC,EAAO,wBACPA,EAAO;AAAA,YAAA;AAAA,YAEf,OACEvC,IACI;AAAA,cACE,OAAOkC;AAAA,cACP,YAAY,6BAA6BC,CAAa;AAAA,YAAA,IAExD;AAAA,cACE,QAAQD;AAAA,cACR,YAAY,8BAA8BC,CAAa;AAAA,YAAA;AAAA,UACzD;AAAA,QAAA;AAAA,QAMTH,KAAUpC,KACT,gBAAAoB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACJ,CAACgC,CAAS,GAAG;AAAA,YACnB,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAYhD,IAAe,gBAAgB;AAAA,YAC3C,SAASwC;AAAA,YACT,WAAWS;AAAAA,cACTV,EAAO;AAAA,cACPvC,IACIuC,EAAO,uBACPA,EAAO;AAAA,YAAA;AAAA,YAGb,UAAA,gBAAAvB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,aAAU;AAAA,gBACJ,CAACgC,CAAS,GAAG;AAAA,gBACnB,WAAWT,EAAO;AAAA,gBAEjB,UAAAvC,IACC,gBAAAgB,EAACF,GAAA,EAAgB,WAAWyB,EAAO,UAAA,CAAW,IAE9C,gBAAAvB,EAACE,GAAA,EAAc,WAAWqB,EAAO,UAAA,CAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UAEhD;AAAA,QAAA;AAAA,QAKJ,gBAAAQ;AAAA,UAACG;AAAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,MAAK;AAAA,YACC,CAACF,CAAS,GAAG;AAAA,YACnB,WAAWC;AAAAA,cACTV,EAAO;AAAA,cACPvC,IACIuC,EAAO,2BACPA,EAAO;AAAA,cACXF,MACGrC,IACGuC,EAAO,oCACPA,EAAO;AAAA,YAAA;AAAA,YAEd,GAAGxB;AAAA,YAEJ,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAACmC;AAAAA,gBAAA;AAAA,kBACC,KAAK3D;AAAA,kBACL,aAAU;AAAA,kBACJ,CAACwD,CAAS,GAAG;AAAA,kBACnB,UAAUtD,IAAc,IAAI;AAAA,kBAC5B,WAAWgD;AAAA,kBACX,WAAWO;AAAAA,oBACTV,EAAO;AAAA,oBACPvC,KAAgBuC,EAAO;AAAA,oBACvBF,KAAaE,EAAO;AAAA,oBACpB,CAACvC,KAAgBuC,EAAO;AAAA,kBAAA;AAAA,kBAGzB,UAAAR;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGH,gBAAAf;AAAA,gBAACoC;AAAAA,gBAAA;AAAA,kBACC,YAAU;AAAA,kBACV,aAAA7D;AAAA,kBACA,aAAU;AAAA,kBACJ,CAACyD,CAAS,GAAG;AAAA,kBACnB,WAAWC;AAAAA,oBACTZ,IAAYE,EAAO,YAAYA,EAAO;AAAA,oBACtCvC,IAAeuC,EAAO,sBAAsBA,EAAO;AAAA,kBAAA;AAAA,kBAGrD,UAAA,gBAAAvB;AAAA,oBAACqC;AAAAA,oBAAA;AAAA,sBACC,aAAU;AAAA,sBACJ,CAACL,CAAS,GAAG;AAAA,sBACnB,WAAWT,EAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACpB;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAIDN,KAAanC,KACZ,gBAAAkB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACJ,CAACgC,CAAS,GAAG;AAAA,YACnB,eAAY;AAAA,YACZ,WAAWC;AAAAA,cACTV,EAAO;AAAA,cACPvC,IAAeuC,EAAO,oBAAoBA,EAAO;AAAA,cACjDH,MACGpC,IACGuC,EAAO,sBACPA,EAAO;AAAA,YAAA;AAAA,YAEf,OACEvC,IACI;AAAA,cACE,OAAOkC;AAAA,cACP,YAAY,4BAA4BC,CAAa;AAAA,YAAA,IAEvD;AAAA,cACE,QAAQD;AAAA,cACR,YAAY,2BAA2BC,CAAa;AAAA,YAAA;AAAA,UACtD;AAAA,QAAA;AAAA,QAMTH,KAAUlC,KACT,gBAAAkB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACJ,CAACgC,CAAS,GAAG;AAAA,YACnB,MAAK;AAAA,YACL,UAAU;AAAA,YACV,cAAYhD,IAAe,iBAAiB;AAAA,YAC5C,SAASyC;AAAA,YACT,WAAWQ;AAAAA,cACTV,EAAO;AAAA,cACPvC,IAAeuC,EAAO,qBAAqBA,EAAO;AAAA,YAAA;AAAA,YAGpD,UAAA,gBAAAvB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,aAAU;AAAA,gBACJ,CAACgC,CAAS,GAAG;AAAA,gBACnB,WAAWT,EAAO;AAAA,gBAEjB,UAAAvC,IACC,gBAAAgB,EAACC,GAAA,EAAiB,WAAWsB,EAAO,UAAA,CAAW,IAE/C,gBAAAvB,EAACG,GAAA,EAAgB,WAAWoB,EAAO,UAAA,CAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UAElD;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
1
+ {"version":3,"file":"scroll-overflow.js","sources":["../../../src/components/scroll-overflow/scroll-overflow.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type UseScrollOverflowOptions = {\n /** Scroll distance per step in pixels. Default: 200 */\n scrollStep?: number\n /** Scroll orientation. Default: \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nexport type UseScrollOverflowReturn = {\n /** Ref to attach to the scroll container (Base UI Viewport) */\n scrollRef: React.RefObject<HTMLDivElement | null>\n /** Whether the content overflows the container */\n hasOverflow: boolean\n /** Whether there is hidden content before the visible area (left or top) */\n canScrollStart: boolean\n /** Whether there is hidden content after the visible area (right or bottom) */\n canScrollEnd: boolean\n /** Scroll toward the start (left or up) by scrollStep */\n scrollToStart: () => void\n /** Scroll toward the end (right or down) by scrollStep */\n scrollToEnd: () => void\n}\n\nfunction getScrollBehavior(): ScrollBehavior {\n if (typeof window === \"undefined\" || !window.matchMedia) return \"auto\"\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\"\n}\n\nexport function useScrollOverflow(\n options: UseScrollOverflowOptions = {}\n): UseScrollOverflowReturn {\n const { scrollStep = 200, orientation = \"horizontal\" } = options\n const scrollRef = React.useRef<HTMLDivElement | null>(null)\n const [hasOverflow, setHasOverflow] = React.useState(false)\n const [canScrollStart, setCanScrollStart] = React.useState(false)\n const [canScrollEnd, setCanScrollEnd] = React.useState(false)\n\n const isHorizontal = orientation === \"horizontal\"\n\n const updateScrollState = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n\n if (isHorizontal) {\n const scrollLeft = Math.round(el.scrollLeft)\n const scrollWidth = el.scrollWidth\n const clientWidth = el.clientWidth\n\n setHasOverflow(scrollWidth > clientWidth)\n setCanScrollStart(scrollLeft > 0)\n setCanScrollEnd(scrollLeft + clientWidth < scrollWidth - 1)\n } else {\n const scrollTop = Math.round(el.scrollTop)\n const scrollHeight = el.scrollHeight\n const clientHeight = el.clientHeight\n\n setHasOverflow(scrollHeight > clientHeight)\n setCanScrollStart(scrollTop > 0)\n setCanScrollEnd(scrollTop + clientHeight < scrollHeight - 1)\n }\n }, [isHorizontal])\n\n React.useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n\n updateScrollState()\n\n let observer: ResizeObserver | null = null\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(() => {\n updateScrollState()\n })\n observer.observe(el)\n for (const child of el.children) {\n observer.observe(child)\n }\n }\n\n el.addEventListener(\"scroll\", updateScrollState, { passive: true })\n\n return () => {\n observer?.disconnect()\n el.removeEventListener(\"scroll\", updateScrollState)\n }\n }, [updateScrollState])\n\n const scrollToStartFn = React.useCallback(() => {\n scrollRef.current?.scrollBy({\n [isHorizontal ? \"left\" : \"top\"]: -scrollStep,\n behavior: getScrollBehavior(),\n })\n }, [scrollStep, isHorizontal])\n\n const scrollToEndFn = React.useCallback(() => {\n scrollRef.current?.scrollBy({\n [isHorizontal ? \"left\" : \"top\"]: scrollStep,\n behavior: getScrollBehavior(),\n })\n }, [scrollStep, isHorizontal])\n\n return {\n scrollRef,\n hasOverflow,\n canScrollStart,\n canScrollEnd,\n scrollToStart: scrollToStartFn,\n scrollToEnd: scrollToEndFn,\n }\n}\n\nconst ChevronLeftIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M 8.86 10.51 C 8.94 10.51 9.02 10.49 9.08 10.43 C 9.14 10.38 9.17 10.3 9.17 10.21 V 5.79 C 9.17 5.7 9.14 5.62 9.08 5.57 C 9.01 5.51 8.94 5.49 8.86 5.49 C 8.84 5.49 8.77 5.52 8.65 5.58 L 6.55 7.68 C 6.5 7.73 6.47 7.78 6.44 7.83 C 6.42 7.88 6.41 7.94 6.41 8 C 6.41 8.06 6.42 8.12 6.44 8.17 C 6.47 8.22 6.5 8.27 6.55 8.32 L 8.65 10.42 C 8.68 10.45 8.71 10.47 8.75 10.49 C 8.78 10.51 8.82 10.51 8.86 10.51 Z\" />\n </svg>\n)\n\nconst ChevronRightIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M7.14 10.51C7.06 10.51 6.98 10.49 6.92 10.43C6.86 10.38 6.83 10.3 6.83 10.21V5.79C6.83 5.7 6.86 5.62 6.92 5.57C6.99 5.51 7.06 5.49 7.14 5.49C7.16 5.49 7.23 5.52 7.35 5.58L9.45 7.68C9.5 7.73 9.53 7.78 9.56 7.83C9.58 7.88 9.59 7.94 9.59 8C9.59 8.06 9.58 8.12 9.56 8.17C9.53 8.22 9.5 8.27 9.45 8.32L7.35 10.42C7.32 10.45 7.29 10.47 7.25 10.49C7.22 10.51 7.18 10.51 7.14 10.51Z\" />\n </svg>\n)\n\nconst ChevronUpIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M5.49 7.14C5.49 7.06 5.51 6.98 5.57 6.92C5.62 6.86 5.7 6.83 5.79 6.83H10.21C10.3 6.83 10.38 6.86 10.43 6.92C10.49 6.99 10.51 7.06 10.51 7.14C10.51 7.16 10.48 7.23 10.42 7.35L8.32 9.45C8.27 9.5 8.22 9.53 8.17 9.56C8.12 9.58 8.06 9.59 8 9.59C7.94 9.59 7.88 9.58 7.83 9.56C7.78 9.53 7.73 9.5 7.68 9.45L5.58 7.35C5.55 7.32 5.53 7.29 5.51 7.25C5.49 7.22 5.49 7.18 5.49 7.14Z\" />\n </svg>\n)\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M10.51 8.86C10.51 8.94 10.49 9.02 10.43 9.08C10.38 9.14 10.3 9.17 10.21 9.17H5.79C5.7 9.17 5.62 9.14 5.57 9.08C5.51 9.01 5.49 8.94 5.49 8.86C5.49 8.84 5.52 8.77 5.58 8.65L7.68 6.55C7.73 6.5 7.78 6.47 7.83 6.44C7.88 6.42 7.94 6.41 8 6.41C8.06 6.41 8.12 6.42 8.17 6.44C8.22 6.47 8.27 6.5 8.32 6.55L10.42 8.65C10.45 8.68 10.47 8.71 10.49 8.75C10.51 8.78 10.51 8.82 10.51 8.86Z\" />\n </svg>\n)\n\nconst useStyles = makeVoltStyles({\n container: {\n position: \"relative\",\n display: \"flex\",\n },\n containerHorizontal: {\n alignItems: \"center\",\n },\n containerVertical: {\n flexDirection: \"column\",\n },\n fade: {\n position: \"absolute\",\n zIndex: 10,\n pointerEvents: \"none\",\n },\n fadeHorizontalStart: {\n left: 0,\n top: 0,\n bottom: 0,\n },\n fadeHorizontalEnd: {\n right: 0,\n top: 0,\n bottom: 0,\n },\n fadeVerticalStart: {\n top: 0,\n left: 0,\n right: 0,\n },\n fadeVerticalEnd: {\n bottom: 0,\n left: 0,\n right: 0,\n },\n shadowHorizontalStart: {\n boxShadow: \"inset 8px 0 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowHorizontalEnd: {\n boxShadow: \"inset -8px 0 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowVerticalStart: {\n boxShadow: \"inset 0 8px 6px -6px rgba(0,0,0,0.08)\",\n },\n shadowVerticalEnd: {\n boxShadow: \"inset 0 -8px 6px -6px rgba(0,0,0,0.08)\",\n },\n arrowButton: {\n position: \"absolute\",\n zIndex: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n ...shorthands.borderStyle(\"none\"),\n ...shorthands.borderWidth(0),\n ...shorthands.padding(0),\n },\n arrowHorizontalStart: {\n left: 0,\n top: 0,\n bottom: 0,\n width: \"1.5rem\",\n },\n arrowHorizontalEnd: {\n right: 0,\n top: 0,\n bottom: 0,\n width: \"1.5rem\",\n },\n arrowVerticalStart: {\n top: 0,\n left: 0,\n right: 0,\n height: \"1.5rem\",\n },\n arrowVerticalEnd: {\n bottom: 0,\n left: 0,\n right: 0,\n height: \"1.5rem\",\n },\n arrowBadge: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: tokens.grayA8,\n ...shorthands.borderRadius(tokens.radiusSm),\n backdropFilter: \"blur(4px)\",\n color: tokens.gray1,\n \":hover\": {\n backgroundColor: tokens.grayA12,\n },\n },\n arrowIcon: {\n width: \"1rem\",\n height: \"1rem\",\n },\n scrollAreaRoot: {\n ...shorthands.overflow(\"hidden\"),\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n scrollAreaRootHorizontal: {\n minWidth: 0,\n },\n scrollAreaRootVertical: {\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n },\n scrollAreaRootScrollbarHorizontal: {\n display: \"flex\",\n flexDirection: \"column\",\n },\n scrollAreaRootScrollbarVertical: {\n display: \"flex\",\n flexDirection: \"row\",\n },\n viewport: {\n ...shorthands.borderRadius(tokens.radiusMd),\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineOffset: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n },\n viewportHorizontal: {\n \"& > div\": {\n display: \"flex\",\n flexDirection: \"row\",\n },\n },\n viewportVertical: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n minHeight: 0,\n },\n viewportFlex: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n scrollbar: {\n position: \"relative\",\n display: \"flex\",\n touchAction: \"none\",\n userSelect: \"none\",\n ...shorthands.padding(\"1px\"),\n transitionProperty: \"color, background-color, border-color\",\n transitionDuration: \"150ms\",\n },\n scrollbarHidden: {\n display: \"none\",\n },\n scrollbarHorizontal: {\n height: \"0.5rem\",\n flexDirection: \"column\",\n },\n scrollbarVertical: {\n width: \"0.5rem\",\n flexDirection: \"row\",\n },\n thumb: {\n position: \"relative\",\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.grayA8,\n },\n})\n\nexport type ScrollOverflowProps = React.ComponentProps<\n typeof ScrollAreaPrimitive.Root\n> &\n UseScrollOverflowOptions & {\n /** Show navigation arrow buttons on edges. Default: false */\n arrows?: boolean\n /** Show gradient fade indicators on edges. Default: true */\n gradients?: boolean\n /** Gradient width in pixels. Default: 40 */\n gradientWidth?: number\n /** Gradient base color (CSS value). Should match the parent background. Default: \"var(--volt-body)\" */\n gradientColor?: string\n /** Show inset shadow on overflow edges. Default: true */\n shadow?: boolean\n /** Show a styled scrollbar track. Default: false */\n scrollbar?: boolean\n }\n\nexport const ScrollOverflow = React.forwardRef<\n HTMLDivElement,\n ScrollOverflowProps\n>(function ScrollOverflow(\n {\n className,\n children,\n arrows = false,\n gradients = true,\n gradientWidth = 40,\n gradientColor = \"var(--volt-body)\",\n shadow = true,\n scrollbar = false,\n scrollStep,\n orientation = \"horizontal\",\n ...props\n },\n ref\n) {\n const styles = useStyles()\n const {\n scrollRef,\n hasOverflow,\n canScrollStart,\n canScrollEnd,\n scrollToStart,\n scrollToEnd,\n } = useScrollOverflow({ scrollStep, orientation })\n\n const isHorizontal = orientation === \"horizontal\"\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Only handle when the viewport itself is focused, not children\n if (e.target !== e.currentTarget) return\n\n const prevKey = isHorizontal ? \"ArrowLeft\" : \"ArrowUp\"\n const nextKey = isHorizontal ? \"ArrowRight\" : \"ArrowDown\"\n\n switch (e.key) {\n case prevKey:\n e.preventDefault()\n scrollToStart()\n break\n case nextKey:\n e.preventDefault()\n scrollToEnd()\n break\n case \"Home\":\n e.preventDefault()\n scrollRef.current?.scrollTo({\n [isHorizontal ? \"left\" : \"top\"]: 0,\n behavior: \"smooth\",\n })\n break\n case \"End\":\n e.preventDefault()\n scrollRef.current?.scrollTo({\n [isHorizontal ? \"left\" : \"top\"]: isHorizontal\n ? scrollRef.current.scrollWidth\n : scrollRef.current.scrollHeight,\n behavior: \"smooth\",\n })\n break\n }\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"scroll-overflow\"\n {...{ [SLOT_ATTR]: \"scroll-overflow\" }}\n data-orientation={orientation}\n data-has-overflow={hasOverflow || undefined}\n data-can-scroll-start={canScrollStart || undefined}\n data-can-scroll-end={canScrollEnd || undefined}\n className={mergeClasses(\n styles.container,\n isHorizontal ? styles.containerHorizontal : styles.containerVertical,\n className\n )}\n >\n {/* Start gradient + shadow */}\n {gradients && canScrollStart && (\n <div\n data-slot=\"scroll-overflow-fade-start\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-fade-start\" }}\n aria-hidden=\"true\"\n className={mergeClasses(\n styles.fade,\n isHorizontal\n ? styles.fadeHorizontalStart\n : styles.fadeVerticalStart,\n shadow &&\n (isHorizontal\n ? styles.shadowHorizontalStart\n : styles.shadowVerticalStart)\n )}\n style={\n isHorizontal\n ? {\n width: gradientWidth,\n background: `linear-gradient(to right, ${gradientColor}, transparent)`,\n }\n : {\n height: gradientWidth,\n background: `linear-gradient(to bottom, ${gradientColor}, transparent)`,\n }\n }\n />\n )}\n\n {/* Start arrow button */}\n {arrows && canScrollStart && (\n <button\n data-slot=\"scroll-overflow-arrow-start\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-start\" }}\n type=\"button\"\n tabIndex={-1}\n aria-label={isHorizontal ? \"Scroll left\" : \"Scroll up\"}\n onClick={scrollToStart}\n className={mergeClasses(\n styles.arrowButton,\n isHorizontal\n ? styles.arrowHorizontalStart\n : styles.arrowVerticalStart\n )}\n >\n <span\n data-slot=\"scroll-overflow-arrow-icon\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-icon\" }}\n className={styles.arrowBadge}\n >\n {isHorizontal ? (\n <ChevronLeftIcon className={styles.arrowIcon} />\n ) : (\n <ChevronUpIcon className={styles.arrowIcon} />\n )}\n </span>\n </button>\n )}\n\n {/* Radix ScrollArea */}\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-overflow-root\"\n type=\"scroll\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-root\" }}\n className={mergeClasses(\n styles.scrollAreaRoot,\n isHorizontal\n ? styles.scrollAreaRootHorizontal\n : styles.scrollAreaRootVertical,\n scrollbar &&\n (isHorizontal\n ? styles.scrollAreaRootScrollbarHorizontal\n : styles.scrollAreaRootScrollbarVertical)\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={scrollRef}\n data-slot=\"scroll-overflow-viewport\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-viewport\" }}\n tabIndex={hasOverflow ? 0 : undefined}\n onKeyDown={handleKeyDown}\n className={mergeClasses(\n styles.viewport,\n isHorizontal && styles.viewportHorizontal,\n scrollbar && styles.viewportFlex,\n !isHorizontal && styles.viewportVertical\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation={orientation}\n data-slot=\"scroll-overflow-scrollbar\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-scrollbar\" }}\n className={mergeClasses(\n scrollbar ? styles.scrollbar : styles.scrollbarHidden,\n isHorizontal ? styles.scrollbarHorizontal : styles.scrollbarVertical\n )}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-overflow-thumb\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-thumb\" }}\n className={styles.thumb}\n />\n </ScrollAreaPrimitive.Scrollbar>\n </ScrollAreaPrimitive.Root>\n\n {/* End gradient + shadow */}\n {gradients && canScrollEnd && (\n <div\n data-slot=\"scroll-overflow-fade-end\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-fade-end\" }}\n aria-hidden=\"true\"\n className={mergeClasses(\n styles.fade,\n isHorizontal ? styles.fadeHorizontalEnd : styles.fadeVerticalEnd,\n shadow &&\n (isHorizontal\n ? styles.shadowHorizontalEnd\n : styles.shadowVerticalEnd)\n )}\n style={\n isHorizontal\n ? {\n width: gradientWidth,\n background: `linear-gradient(to left, ${gradientColor}, transparent)`,\n }\n : {\n height: gradientWidth,\n background: `linear-gradient(to top, ${gradientColor}, transparent)`,\n }\n }\n />\n )}\n\n {/* End arrow button */}\n {arrows && canScrollEnd && (\n <button\n data-slot=\"scroll-overflow-arrow-end\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-end\" }}\n type=\"button\"\n tabIndex={-1}\n aria-label={isHorizontal ? \"Scroll right\" : \"Scroll down\"}\n onClick={scrollToEnd}\n className={mergeClasses(\n styles.arrowButton,\n isHorizontal ? styles.arrowHorizontalEnd : styles.arrowVerticalEnd\n )}\n >\n <span\n data-slot=\"scroll-overflow-arrow-icon\"\n {...{ [SLOT_ATTR]: \"scroll-overflow-arrow-icon\" }}\n className={styles.arrowBadge}\n >\n {isHorizontal ? (\n <ChevronRightIcon className={styles.arrowIcon} />\n ) : (\n <ChevronDownIcon className={styles.arrowIcon} />\n )}\n </span>\n </button>\n )}\n </div>\n )\n})\n"],"names":["getScrollBehavior","useScrollOverflow","options","scrollStep","orientation","scrollRef","React","hasOverflow","setHasOverflow","canScrollStart","setCanScrollStart","canScrollEnd","setCanScrollEnd","isHorizontal","updateScrollState","el","scrollLeft","scrollWidth","clientWidth","scrollTop","scrollHeight","clientHeight","observer","child","scrollToStartFn","_a","scrollToEndFn","ChevronLeftIcon","props","jsxDEV","this","ChevronRightIcon","ChevronUpIcon","ChevronDownIcon","useStyles","makeVoltStyles","shorthands","tokens.grayA8","tokens.radiusSm","tokens.gray1","tokens.grayA12","tokens.radiusMd","tokens.accentA8","ScrollOverflow","className","children","arrows","gradients","gradientWidth","gradientColor","shadow","scrollbar","ref","styles","scrollToStart","scrollToEnd","handleKeyDown","e","prevKey","nextKey","_b","SLOT_ATTR","mergeClasses","ScrollAreaPrimitive.Root","ScrollAreaPrimitive.Viewport","ScrollAreaPrimitive.Scrollbar","ScrollAreaPrimitive.Thumb"],"mappings":"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"}
@@ -1,23 +1,23 @@
1
- import { jsx as g, jsxs as E } from "react/jsx-runtime";
2
- import * as u from "react";
3
- import { useRef as B, useState as k, useCallback as v, useLayoutEffect as w } from "react";
4
- import { Root as M, Item as O } from "../../vendor/@radix-ui/react-radio-group/dist/index.js";
1
+ import { j as a } from "../../vendor/react/jsx-dev-runtime.js";
2
+ import * as p from "react";
3
+ import { useRef as H, useState as v, useCallback as N, useLayoutEffect as w } from "react";
4
+ import { Root as X, Item as B } from "../../vendor/@radix-ui/react-radio-group/dist/index.js";
5
5
  import { shorthands as n } from "../../packages/volt-runtime/dist/vendor/@griffel/core/src/index.js";
6
- import { SLOT_ATTR as e } from "../../packages/volt-runtime/dist/renderer/contract.js";
7
- import { mergeClasses as C } from "../../packages/volt-runtime/dist/vendor/@griffel/core/src/mergeClasses.js";
8
- import { makeVoltStyles as G } from "../../styles/make-styles.js";
9
- import { spacingElement1 as m, semAccentDefault as R, accentA8 as P, semAccentSoft as I, fontWeightSemibold as Q, leadingXs as Y, textXs as _, spacingElement3 as A, body as J } from "../../tokens/index.js";
10
- const T = u.createContext({
6
+ import { SLOT_ATTR as t } from "../../packages/volt-runtime/dist/renderer/contract.js";
7
+ import { mergeClasses as k } from "../../packages/volt-runtime/dist/vendor/@griffel/core/src/mergeClasses.js";
8
+ import { makeVoltStyles as M } from "../../styles/make-styles.js";
9
+ import { spacingElement1 as u, semAccentDefault as C, accentA8 as O, semAccentSoft as E, fontWeightSemibold as G, leadingXs as P, textXs as Q, spacingElement3 as R, body as Y } from "../../tokens/index.js";
10
+ const D = p.createContext({
11
11
  layout: "hug"
12
- }), W = G({
12
+ }), I = M({
13
13
  group: {
14
14
  position: "relative",
15
15
  display: "inline-flex",
16
16
  alignItems: "center",
17
- ...n.gap(m),
17
+ ...n.gap(u),
18
18
  ...n.borderRadius("9999px"),
19
- backgroundColor: I,
20
- ...n.padding(m),
19
+ backgroundColor: E,
20
+ ...n.padding(u),
21
21
  ...n.border("0"),
22
22
  boxShadow: "none"
23
23
  },
@@ -37,7 +37,7 @@ const T = u.createContext({
37
37
  left: 0,
38
38
  zIndex: 0,
39
39
  ...n.borderRadius("9999px"),
40
- backgroundColor: J,
40
+ backgroundColor: Y,
41
41
  // Tailwind `shadow-sm`
42
42
  boxShadow: "0 1px 2px 0 #0000000d"
43
43
  },
@@ -52,21 +52,21 @@ const T = u.createContext({
52
52
  display: "inline-flex",
53
53
  alignItems: "center",
54
54
  justifyContent: "center",
55
- ...n.gap(m),
55
+ ...n.gap(u),
56
56
  ...n.borderRadius("9999px"),
57
57
  minWidth: "3rem",
58
58
  // v1 uses Tailwind's `px-3` = 0.75rem here. The semantic spacing scale has NO 0.75rem
59
59
  // token -- it runs 0.25/0.5/0.5/1/1.5/2 -- so this is a literal by necessity.
60
60
  // `spacingGroup1` is 0.5rem and reaching for it by name (as three components did)
61
61
  // silently loses 4px per side. See STATUS: the scale gap is the root cause.
62
- paddingLeft: A,
63
- paddingRight: A,
64
- paddingTop: m,
65
- paddingBottom: m,
66
- fontSize: _,
67
- lineHeight: Y,
68
- fontWeight: Q,
69
- color: R,
62
+ paddingLeft: R,
63
+ paddingRight: R,
64
+ paddingTop: u,
65
+ paddingBottom: u,
66
+ fontSize: Q,
67
+ lineHeight: P,
68
+ fontWeight: G,
69
+ color: C,
70
70
  cursor: "pointer",
71
71
  userSelect: "none",
72
72
  backgroundColor: "transparent",
@@ -80,12 +80,12 @@ const T = u.createContext({
80
80
  transitionDuration: "150ms",
81
81
  transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)",
82
82
  ":hover:not([data-checked])": {
83
- backgroundColor: I
83
+ backgroundColor: E
84
84
  },
85
85
  ":focus-visible": {
86
86
  outlineWidth: "2px",
87
87
  outlineStyle: "solid",
88
- outlineColor: P
88
+ outlineColor: O
89
89
  },
90
90
  "&[data-disabled]": {
91
91
  pointerEvents: "none",
@@ -94,17 +94,17 @@ const T = u.createContext({
94
94
  },
95
95
  "&[data-checked]": {
96
96
  backgroundColor: "transparent",
97
- color: R
97
+ color: C
98
98
  },
99
99
  "&[data-checked][data-disabled]": {
100
100
  backgroundColor: "transparent"
101
101
  },
102
- [`& [${e}="radio-group-indicator"]`]: {
102
+ [`& [${t}="radio-group-indicator"]`]: {
103
103
  display: "none"
104
104
  },
105
105
  // Keyed on SLOT_ATTR, never data-slot (rule 4): the composed RadioGroup emits both, and
106
106
  // data-slot values are shared with v1 so such a rule would also match v1-rendered DOM.
107
- [`[${e}='radio-group-indicator']`]: {
107
+ [`[${t}='radio-group-indicator']`]: {
108
108
  display: "none"
109
109
  }
110
110
  },
@@ -131,133 +131,177 @@ const T = u.createContext({
131
131
  textOverflow: "ellipsis",
132
132
  whiteSpace: "nowrap"
133
133
  }
134
- }), it = u.forwardRef(function({
134
+ }), re = p.forwardRef(function({
135
135
  className: x,
136
136
  layout: o = "hug",
137
- orientation: s = "horizontal",
137
+ orientation: l = "horizontal",
138
138
  value: r,
139
- defaultValue: p,
139
+ defaultValue: f,
140
140
  onValueChange: i,
141
- children: a,
141
+ children: s,
142
142
  ...b
143
- }, f) {
144
- const c = W(), l = B(null), [z, N] = k(p), [y, q] = k(!1), [D, F] = k({
143
+ }, g) {
144
+ const c = I(), m = H(null), [j, V] = v(f), [y, T] = v(!1), [W, $] = v({
145
145
  opacity: 0
146
- }), h = r !== void 0, L = h ? r : z, S = v(() => {
147
- if (!l.current) return;
148
- const t = l.current.querySelector(
149
- `[${e}="segmented-control-item"][data-state="checked"]`
146
+ }), h = r !== void 0, z = h ? r : j, S = N(() => {
147
+ if (!m.current) return;
148
+ const e = m.current.querySelector(
149
+ `[${t}="segmented-control-item"][data-state="checked"]`
150
150
  );
151
- t && (F({
151
+ e && ($({
152
152
  opacity: 1,
153
- width: t.offsetWidth,
154
- height: t.offsetHeight,
155
- transform: `translate(${t.offsetLeft}px, ${t.offsetTop}px)`
156
- }), q(!0));
153
+ width: e.offsetWidth,
154
+ height: e.offsetHeight,
155
+ transform: `translate(${e.offsetLeft}px, ${e.offsetTop}px)`
156
+ }), T(!0));
157
157
  }, []);
158
158
  w(() => {
159
- if (!l.current) return;
160
- const t = Array.from(
161
- l.current.querySelectorAll(
162
- `[${e}="segmented-control-item"]`
159
+ if (!m.current) return;
160
+ const e = Array.from(
161
+ m.current.querySelectorAll(
162
+ `[${t}="segmented-control-item"]`
163
163
  )
164
164
  );
165
- if (!t.length || (t.forEach((d) => d.style.minWidth = ""), o !== "equal")) return;
166
- const X = Math.max(...t.map((d) => d.offsetWidth));
167
- t.forEach((d) => d.style.minWidth = `${X}px`);
165
+ if (!e.length || (e.forEach((d) => d.style.minWidth = ""), o !== "equal")) return;
166
+ const L = Math.max(...e.map((d) => d.offsetWidth));
167
+ e.forEach((d) => d.style.minWidth = `${L}px`);
168
168
  }, [o]), w(() => {
169
169
  if (!y) {
170
170
  S();
171
171
  return;
172
172
  }
173
- const t = requestAnimationFrame(S);
174
- return () => cancelAnimationFrame(t);
175
- }, [L, y, S]);
176
- const j = v(
177
- (t) => {
178
- h || N(t), i == null || i(t);
173
+ const e = requestAnimationFrame(S);
174
+ return () => cancelAnimationFrame(e);
175
+ }, [z, y, S]);
176
+ const U = N(
177
+ (e) => {
178
+ h || V(e), i == null || i(e);
179
179
  },
180
180
  [h, i]
181
- ), H = (t) => {
182
- l.current = t, typeof f == "function" ? f(t) : f && (f.current = t);
183
- }, V = u.useMemo(() => ({ layout: o }), [o]);
184
- return /* @__PURE__ */ g(T.Provider, { value: V, children: /* @__PURE__ */ E(
185
- M,
181
+ ), q = (e) => {
182
+ m.current = e, typeof g == "function" ? g(e) : g && (g.current = e);
183
+ }, F = p.useMemo(() => ({ layout: o }), [o]);
184
+ return /* @__PURE__ */ a.jsxDEV(D.Provider, { value: F, children: /* @__PURE__ */ a.jsxDEV(
185
+ X,
186
186
  {
187
- ref: H,
187
+ ref: q,
188
188
  "data-slot": "segmented-control",
189
- [e]: "segmented-control",
189
+ [t]: "segmented-control",
190
190
  "data-layout": o,
191
191
  value: h ? r : void 0,
192
- defaultValue: p,
193
- onValueChange: j,
194
- orientation: s,
195
- className: C(
192
+ defaultValue: f,
193
+ onValueChange: U,
194
+ orientation: l,
195
+ className: k(
196
196
  c.group,
197
197
  o === "stretch" && c.groupStretch,
198
- s === "vertical" && c.groupVertical,
198
+ l === "vertical" && c.groupVertical,
199
199
  x
200
200
  ),
201
201
  ...b,
202
202
  children: [
203
- /* @__PURE__ */ g(
203
+ /* @__PURE__ */ a.jsxDEV(
204
204
  "span",
205
205
  {
206
206
  "aria-hidden": "true",
207
207
  "data-slot": "segmented-control-indicator",
208
- [e]: "segmented-control-indicator",
209
- className: C(
208
+ [t]: "segmented-control-indicator",
209
+ className: k(
210
210
  c.indicator,
211
211
  y && c.indicatorAnimated
212
212
  ),
213
- style: D
214
- }
213
+ style: W
214
+ },
215
+ void 0,
216
+ !1,
217
+ {
218
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
219
+ lineNumber: 263,
220
+ columnNumber: 9
221
+ },
222
+ this
215
223
  ),
216
- a
224
+ s
217
225
  ]
218
- }
219
- ) });
220
- }), at = u.forwardRef(function({ className: x, value: o, icon: s, children: r, ...p }, i) {
221
- const a = W(), { layout: b } = u.useContext(T);
222
- return /* @__PURE__ */ E(
223
- O,
226
+ },
227
+ void 0,
228
+ !0,
229
+ {
230
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
231
+ lineNumber: 246,
232
+ columnNumber: 7
233
+ },
234
+ this
235
+ ) }, void 0, !1, {
236
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
237
+ lineNumber: 245,
238
+ columnNumber: 5
239
+ }, this);
240
+ }), ie = p.forwardRef(function({ className: x, value: o, icon: l, children: r, ...f }, i) {
241
+ const s = I(), { layout: b } = p.useContext(D);
242
+ return /* @__PURE__ */ a.jsxDEV(
243
+ B,
224
244
  {
225
245
  ref: i,
226
246
  value: o,
227
247
  "data-slot": "segmented-control-item",
228
- [e]: "segmented-control-item",
229
- className: C(
230
- a.item,
231
- b === "stretch" && a.itemStretch,
248
+ [t]: "segmented-control-item",
249
+ className: k(
250
+ s.item,
251
+ b === "stretch" && s.itemStretch,
232
252
  x
233
253
  ),
234
- ...p,
254
+ ...f,
235
255
  children: [
236
- s && /* @__PURE__ */ g(
256
+ l && /* @__PURE__ */ a.jsxDEV(
237
257
  "span",
238
258
  {
239
259
  "aria-hidden": "true",
240
260
  "data-slot": "segmented-control-item-icon",
241
- [e]: "segmented-control-item-icon",
242
- className: a.icon,
243
- children: s
244
- }
261
+ [t]: "segmented-control-item-icon",
262
+ className: s.icon,
263
+ children: l
264
+ },
265
+ void 0,
266
+ !1,
267
+ {
268
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
269
+ lineNumber: 303,
270
+ columnNumber: 9
271
+ },
272
+ this
245
273
  ),
246
- r && /* @__PURE__ */ g(
274
+ r && /* @__PURE__ */ a.jsxDEV(
247
275
  "span",
248
276
  {
249
277
  "data-slot": "segmented-control-item-label",
250
- [e]: "segmented-control-item-label",
251
- className: a.label,
278
+ [t]: "segmented-control-item-label",
279
+ className: s.label,
252
280
  children: r
253
- }
281
+ },
282
+ void 0,
283
+ !1,
284
+ {
285
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
286
+ lineNumber: 313,
287
+ columnNumber: 9
288
+ },
289
+ this
254
290
  )
255
291
  ]
256
- }
292
+ },
293
+ void 0,
294
+ !0,
295
+ {
296
+ fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/segmented-control/segmented-control.tsx",
297
+ lineNumber: 290,
298
+ columnNumber: 5
299
+ },
300
+ this
257
301
  );
258
302
  });
259
303
  export {
260
- it as SegmentedControl,
261
- at as SegmentedControlItem
304
+ re as SegmentedControl,
305
+ ie as SegmentedControlItem
262
306
  };
263
307
  //# sourceMappingURL=segmented-control.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmented-control.js","sources":["../../../src/components/segmented-control/segmented-control.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\n\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type SegmentedControlLayout = \"hug\" | \"equal\" | \"stretch\"\n\nexport type SegmentedControlProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Root\n> & {\n layout?: SegmentedControlLayout\n}\n\nexport type SegmentedControlItemProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Item\n> & {\n icon?: React.ReactNode\n}\n\ninterface SegmentedControlContextValue {\n layout: SegmentedControlLayout\n}\n\nconst SegmentedControlContext =\n React.createContext<SegmentedControlContextValue>({\n layout: \"hug\",\n })\n\nconst useStyles = makeVoltStyles({\n group: {\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.semAccentSoft,\n ...shorthands.padding(tokens.spacingElement1),\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n },\n groupStretch: {\n display: \"flex\",\n width: \"100%\",\n },\n groupVertical: {\n flexDirection: \"column\",\n display: \"inline-flex\",\n width: \"fit-content\",\n },\n indicator: {\n pointerEvents: \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.body,\n // Tailwind `shadow-sm`\n boxShadow: \"0 1px 2px 0 #0000000d\",\n },\n indicatorAnimated: {\n transitionProperty: \"transform, width, height\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n item: {\n position: \"relative\",\n zIndex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n minWidth: \"3rem\",\n // v1 uses Tailwind's `px-3` = 0.75rem here. The semantic spacing scale has NO 0.75rem\n // token -- it runs 0.25/0.5/0.5/1/1.5/2 -- so this is a literal by necessity.\n // `spacingGroup1` is 0.5rem and reaching for it by name (as three components did)\n // silently loses 4px per side. See STATUS: the scale gap is the root cause.\n paddingLeft: tokens.spacingElement3,\n paddingRight: tokens.spacingElement3,\n paddingTop: tokens.spacingElement1,\n paddingBottom: tokens.spacingElement1,\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.semAccentDefault,\n cursor: \"pointer\",\n userSelect: \"none\",\n backgroundColor: \"transparent\",\n outlineStyle: \"none\",\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n aspectRatio: \"auto\",\n width: \"auto\",\n height: \"auto\",\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \":hover:not([data-checked])\": {\n backgroundColor: tokens.semAccentSoft,\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n backgroundColor: \"transparent\",\n },\n \"&[data-checked]\": {\n backgroundColor: \"transparent\",\n color: tokens.semAccentDefault,\n },\n \"&[data-checked][data-disabled]\": {\n backgroundColor: \"transparent\",\n },\n [`& [${SLOT_ATTR}=\"radio-group-indicator\"]`]: {\n display: \"none\",\n },\n // Keyed on SLOT_ATTR, never data-slot (rule 4): the composed RadioGroup emits both, and\n // data-slot values are shared with v1 so such a rule would also match v1-rendered DOM.\n [`[${SLOT_ATTR}='radio-group-indicator']`]: {\n display: \"none\",\n },\n },\n itemStretch: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n icon: {\n flexShrink: 0,\n width: \"1rem\",\n height: \"1rem\",\n pointerEvents: \"none\",\n \"& svg\": {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n },\n },\n label: {\n lineHeight: \"1rem\",\n overflowX: \"hidden\",\n overflowY: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n})\n\nexport const SegmentedControl = React.forwardRef<\n HTMLDivElement,\n SegmentedControlProps\n>(function SegmentedControl(\n {\n className,\n layout = \"hug\",\n orientation = \"horizontal\",\n value: valueProp,\n defaultValue,\n onValueChange,\n children,\n ...props\n },\n forwardedRef\n) {\n const styles = useStyles()\n const rootRef = useRef<HTMLDivElement>(null)\n const [trackedValue, setTrackedValue] = useState(defaultValue)\n // Starts false to prevent CSS transition flash on SSR hydration\n const [indicatorReady, setIndicatorReady] = useState(false)\n const [indicatorStyle, setIndicatorStyle] = useState<React.CSSProperties>({\n opacity: 0,\n })\n\n const isControlled = valueProp !== undefined\n const currentValue = isControlled ? valueProp : trackedValue\n\n const updateIndicator = useCallback(() => {\n if (!rootRef.current) return\n const el = rootRef.current.querySelector<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"][data-state=\"checked\"]`\n )\n if (!el) return\n setIndicatorStyle({\n opacity: 1,\n width: el.offsetWidth,\n height: el.offsetHeight,\n transform: `translate(${el.offsetLeft}px, ${el.offsetTop}px)`,\n })\n setIndicatorReady(true)\n }, [])\n\n // Must run before indicator effect so equalized widths are measured correctly\n useLayoutEffect(() => {\n if (!rootRef.current) return\n const items = Array.from(\n rootRef.current.querySelectorAll<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"]`\n )\n )\n if (!items.length) return\n items.forEach((el) => (el.style.minWidth = \"\"))\n if (layout !== \"equal\") return\n const max = Math.max(...items.map((el) => el.offsetWidth))\n items.forEach((el) => (el.style.minWidth = `${max}px`))\n }, [layout])\n\n useLayoutEffect(() => {\n if (!indicatorReady) {\n updateIndicator()\n return\n }\n const raf = requestAnimationFrame(updateIndicator)\n return () => cancelAnimationFrame(raf)\n }, [currentValue, indicatorReady, updateIndicator])\n\n const handleValueChange = useCallback(\n (value: string) => {\n if (!isControlled) setTrackedValue(value)\n onValueChange?.(value)\n },\n [isControlled, onValueChange]\n )\n\n const handleRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node)\n } else if (forwardedRef) {\n forwardedRef.current = node\n }\n }\n\n const contextValue = React.useMemo(() => ({ layout }), [layout])\n\n return (\n <SegmentedControlContext.Provider value={contextValue}>\n <RadioGroupPrimitive.Root\n ref={handleRef}\n data-slot=\"segmented-control\"\n {...{ [SLOT_ATTR]: \"segmented-control\" }}\n data-layout={layout}\n value={isControlled ? valueProp : undefined}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n orientation={orientation}\n className={mergeClasses(\n styles.group,\n layout === \"stretch\" && styles.groupStretch,\n orientation === \"vertical\" && styles.groupVertical,\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-indicator\"\n {...{ [SLOT_ATTR]: \"segmented-control-indicator\" }}\n className={mergeClasses(\n styles.indicator,\n indicatorReady && styles.indicatorAnimated\n )}\n style={indicatorStyle}\n />\n {children}\n </RadioGroupPrimitive.Root>\n </SegmentedControlContext.Provider>\n )\n})\n\nexport const SegmentedControlItem = React.forwardRef<\n HTMLButtonElement,\n SegmentedControlItemProps\n>(function SegmentedControlItem(\n { className, value, icon, children, ...props },\n ref\n) {\n const styles = useStyles()\n const { layout } = React.useContext(SegmentedControlContext)\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n value={value}\n data-slot=\"segmented-control-item\"\n {...{ [SLOT_ATTR]: \"segmented-control-item\" }}\n className={mergeClasses(\n styles.item,\n layout === \"stretch\" && styles.itemStretch,\n className\n )}\n {...props}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-item-icon\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-icon\" }}\n className={styles.icon}\n >\n {icon}\n </span>\n )}\n {children && (\n <span\n data-slot=\"segmented-control-item-label\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-label\" }}\n className={styles.label}\n >\n {children}\n </span>\n )}\n </RadioGroupPrimitive.Item>\n )\n})\n"],"names":["SegmentedControlContext","React","useStyles","makeVoltStyles","shorthands","tokens.spacingElement1","tokens.semAccentSoft","tokens.body","tokens.spacingElement3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.semAccentDefault","tokens.accentA8","SLOT_ATTR","SegmentedControl","className","layout","orientation","valueProp","defaultValue","onValueChange","children","props","forwardedRef","styles","rootRef","useRef","trackedValue","setTrackedValue","useState","indicatorReady","setIndicatorReady","indicatorStyle","setIndicatorStyle","isControlled","currentValue","updateIndicator","useCallback","el","useLayoutEffect","items","max","raf","handleValueChange","value","handleRef","node","contextValue","jsx","jsxs","RadioGroupPrimitive.Root","mergeClasses","SegmentedControlItem","icon","ref","RadioGroupPrimitive.Item"],"mappings":"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"}
1
+ {"version":3,"file":"segmented-control.js","sources":["../../../src/components/segmented-control/segmented-control.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\n\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type SegmentedControlLayout = \"hug\" | \"equal\" | \"stretch\"\n\nexport type SegmentedControlProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Root\n> & {\n layout?: SegmentedControlLayout\n}\n\nexport type SegmentedControlItemProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Item\n> & {\n icon?: React.ReactNode\n}\n\ninterface SegmentedControlContextValue {\n layout: SegmentedControlLayout\n}\n\nconst SegmentedControlContext =\n React.createContext<SegmentedControlContextValue>({\n layout: \"hug\",\n })\n\nconst useStyles = makeVoltStyles({\n group: {\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.semAccentSoft,\n ...shorthands.padding(tokens.spacingElement1),\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n },\n groupStretch: {\n display: \"flex\",\n width: \"100%\",\n },\n groupVertical: {\n flexDirection: \"column\",\n display: \"inline-flex\",\n width: \"fit-content\",\n },\n indicator: {\n pointerEvents: \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.body,\n // Tailwind `shadow-sm`\n boxShadow: \"0 1px 2px 0 #0000000d\",\n },\n indicatorAnimated: {\n transitionProperty: \"transform, width, height\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n item: {\n position: \"relative\",\n zIndex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n minWidth: \"3rem\",\n // v1 uses Tailwind's `px-3` = 0.75rem here. The semantic spacing scale has NO 0.75rem\n // token -- it runs 0.25/0.5/0.5/1/1.5/2 -- so this is a literal by necessity.\n // `spacingGroup1` is 0.5rem and reaching for it by name (as three components did)\n // silently loses 4px per side. See STATUS: the scale gap is the root cause.\n paddingLeft: tokens.spacingElement3,\n paddingRight: tokens.spacingElement3,\n paddingTop: tokens.spacingElement1,\n paddingBottom: tokens.spacingElement1,\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.semAccentDefault,\n cursor: \"pointer\",\n userSelect: \"none\",\n backgroundColor: \"transparent\",\n outlineStyle: \"none\",\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n aspectRatio: \"auto\",\n width: \"auto\",\n height: \"auto\",\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \":hover:not([data-checked])\": {\n backgroundColor: tokens.semAccentSoft,\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n backgroundColor: \"transparent\",\n },\n \"&[data-checked]\": {\n backgroundColor: \"transparent\",\n color: tokens.semAccentDefault,\n },\n \"&[data-checked][data-disabled]\": {\n backgroundColor: \"transparent\",\n },\n [`& [${SLOT_ATTR}=\"radio-group-indicator\"]`]: {\n display: \"none\",\n },\n // Keyed on SLOT_ATTR, never data-slot (rule 4): the composed RadioGroup emits both, and\n // data-slot values are shared with v1 so such a rule would also match v1-rendered DOM.\n [`[${SLOT_ATTR}='radio-group-indicator']`]: {\n display: \"none\",\n },\n },\n itemStretch: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n icon: {\n flexShrink: 0,\n width: \"1rem\",\n height: \"1rem\",\n pointerEvents: \"none\",\n \"& svg\": {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n },\n },\n label: {\n lineHeight: \"1rem\",\n overflowX: \"hidden\",\n overflowY: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n})\n\nexport const SegmentedControl = React.forwardRef<\n HTMLDivElement,\n SegmentedControlProps\n>(function SegmentedControl(\n {\n className,\n layout = \"hug\",\n orientation = \"horizontal\",\n value: valueProp,\n defaultValue,\n onValueChange,\n children,\n ...props\n },\n forwardedRef\n) {\n const styles = useStyles()\n const rootRef = useRef<HTMLDivElement>(null)\n const [trackedValue, setTrackedValue] = useState(defaultValue)\n // Starts false to prevent CSS transition flash on SSR hydration\n const [indicatorReady, setIndicatorReady] = useState(false)\n const [indicatorStyle, setIndicatorStyle] = useState<React.CSSProperties>({\n opacity: 0,\n })\n\n const isControlled = valueProp !== undefined\n const currentValue = isControlled ? valueProp : trackedValue\n\n const updateIndicator = useCallback(() => {\n if (!rootRef.current) return\n const el = rootRef.current.querySelector<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"][data-state=\"checked\"]`\n )\n if (!el) return\n setIndicatorStyle({\n opacity: 1,\n width: el.offsetWidth,\n height: el.offsetHeight,\n transform: `translate(${el.offsetLeft}px, ${el.offsetTop}px)`,\n })\n setIndicatorReady(true)\n }, [])\n\n // Must run before indicator effect so equalized widths are measured correctly\n useLayoutEffect(() => {\n if (!rootRef.current) return\n const items = Array.from(\n rootRef.current.querySelectorAll<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"]`\n )\n )\n if (!items.length) return\n items.forEach((el) => (el.style.minWidth = \"\"))\n if (layout !== \"equal\") return\n const max = Math.max(...items.map((el) => el.offsetWidth))\n items.forEach((el) => (el.style.minWidth = `${max}px`))\n }, [layout])\n\n useLayoutEffect(() => {\n if (!indicatorReady) {\n updateIndicator()\n return\n }\n const raf = requestAnimationFrame(updateIndicator)\n return () => cancelAnimationFrame(raf)\n }, [currentValue, indicatorReady, updateIndicator])\n\n const handleValueChange = useCallback(\n (value: string) => {\n if (!isControlled) setTrackedValue(value)\n onValueChange?.(value)\n },\n [isControlled, onValueChange]\n )\n\n const handleRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node)\n } else if (forwardedRef) {\n forwardedRef.current = node\n }\n }\n\n const contextValue = React.useMemo(() => ({ layout }), [layout])\n\n return (\n <SegmentedControlContext.Provider value={contextValue}>\n <RadioGroupPrimitive.Root\n ref={handleRef}\n data-slot=\"segmented-control\"\n {...{ [SLOT_ATTR]: \"segmented-control\" }}\n data-layout={layout}\n value={isControlled ? valueProp : undefined}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n orientation={orientation}\n className={mergeClasses(\n styles.group,\n layout === \"stretch\" && styles.groupStretch,\n orientation === \"vertical\" && styles.groupVertical,\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-indicator\"\n {...{ [SLOT_ATTR]: \"segmented-control-indicator\" }}\n className={mergeClasses(\n styles.indicator,\n indicatorReady && styles.indicatorAnimated\n )}\n style={indicatorStyle}\n />\n {children}\n </RadioGroupPrimitive.Root>\n </SegmentedControlContext.Provider>\n )\n})\n\nexport const SegmentedControlItem = React.forwardRef<\n HTMLButtonElement,\n SegmentedControlItemProps\n>(function SegmentedControlItem(\n { className, value, icon, children, ...props },\n ref\n) {\n const styles = useStyles()\n const { layout } = React.useContext(SegmentedControlContext)\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n value={value}\n data-slot=\"segmented-control-item\"\n {...{ [SLOT_ATTR]: \"segmented-control-item\" }}\n className={mergeClasses(\n styles.item,\n layout === \"stretch\" && styles.itemStretch,\n className\n )}\n {...props}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-item-icon\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-icon\" }}\n className={styles.icon}\n >\n {icon}\n </span>\n )}\n {children && (\n <span\n data-slot=\"segmented-control-item-label\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-label\" }}\n className={styles.label}\n >\n {children}\n </span>\n )}\n </RadioGroupPrimitive.Item>\n )\n})\n"],"names":["SegmentedControlContext","React","useStyles","makeVoltStyles","shorthands","tokens.spacingElement1","tokens.semAccentSoft","tokens.body","tokens.spacingElement3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.semAccentDefault","tokens.accentA8","SLOT_ATTR","SegmentedControl","className","layout","orientation","valueProp","defaultValue","onValueChange","children","props","forwardedRef","styles","rootRef","useRef","trackedValue","setTrackedValue","useState","indicatorReady","setIndicatorReady","indicatorStyle","setIndicatorStyle","isControlled","currentValue","updateIndicator","useCallback","el","useLayoutEffect","items","max","raf","handleValueChange","value","handleRef","node","contextValue","jsxDEV","RadioGroupPrimitive.Root","mergeClasses","SegmentedControlItem","icon","ref","RadioGroupPrimitive.Item"],"mappings":"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"}