prime-ui-kit 0.9.0 → 0.9.2

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 (982) hide show
  1. package/README.md +61 -47
  2. package/dist/chunks/chunk-IQELQNMR.js +379 -0
  3. package/dist/chunks/chunk-LXGRKN34.js +13260 -0
  4. package/dist/chunks/chunk-ZEFCDEEQ.js +3493 -0
  5. package/dist/color-picker.d.ts +7 -0
  6. package/dist/color-picker.js +9 -0
  7. package/dist/components/accordion/Accordion.d.ts +44 -32
  8. package/dist/components/avatar/Avatar.d.ts +36 -53
  9. package/dist/components/badge/Badge.d.ts +50 -13
  10. package/dist/components/badge/edgeIcons.d.ts +13 -0
  11. package/dist/components/badge/tier.d.ts +0 -1
  12. package/dist/components/banner/Banner.d.ts +29 -60
  13. package/dist/components/breadcrumb/Breadcrumb.d.ts +11 -23
  14. package/dist/components/button/Button.d.ts +22 -36
  15. package/dist/components/button-group/ButtonGroup.d.ts +17 -17
  16. package/dist/components/card/Card.d.ts +75 -202
  17. package/dist/components/checkbox/Checkbox.d.ts +37 -38
  18. package/dist/components/code-block/CodeBlock.d.ts +5 -13
  19. package/dist/components/color-picker/ColorPicker.d.ts +76 -52
  20. package/dist/components/color-picker/ColorPresets.d.ts +18 -30
  21. package/dist/components/color-swatches/ColorSwatches.d.ts +40 -0
  22. package/dist/components/command-menu/CommandMenu.d.ts +138 -78
  23. package/dist/components/crossfade/Crossfade.d.ts +14 -0
  24. package/dist/components/data-table/DataTable.d.ts +35 -81
  25. package/dist/components/data-table/Footer.d.ts +16 -0
  26. package/dist/components/data-table/Head.d.ts +21 -0
  27. package/dist/components/data-table/Row.d.ts +56 -0
  28. package/dist/components/data-table/StateRows.d.ts +18 -0
  29. package/dist/components/data-table/rows.d.ts +60 -0
  30. package/dist/components/data-table/types.d.ts +40 -0
  31. package/dist/components/data-table/useColumnHover.d.ts +9 -0
  32. package/dist/components/data-table/useFrozenColumns.d.ts +16 -0
  33. package/dist/components/data-table/useInfiniteRows.d.ts +24 -0
  34. package/dist/components/data-table/useRowSelection.d.ts +35 -0
  35. package/dist/components/datepicker/Datepicker.d.ts +9 -126
  36. package/dist/components/datepicker/DatepickerPanel.d.ts +113 -0
  37. package/dist/components/datepicker/datepickerModel.d.ts +16 -22
  38. package/dist/components/datepicker/panelLayout.d.ts +50 -0
  39. package/dist/components/digit-input/DigitInput.d.ts +24 -19
  40. package/dist/components/divider/Divider.d.ts +7 -15
  41. package/dist/components/dnd/Dnd.d.ts +135 -0
  42. package/dist/components/dnd/DragOverlay.d.ts +6 -0
  43. package/dist/components/dnd/autoScroll.d.ts +5 -0
  44. package/dist/components/dnd/context.d.ts +5 -0
  45. package/dist/components/dnd/dragSession.d.ts +102 -0
  46. package/dist/components/dnd/geometry.d.ts +30 -0
  47. package/dist/components/dnd/labels.d.ts +18 -0
  48. package/dist/components/dnd/store.d.ts +9 -0
  49. package/dist/components/dnd/useDragSource.d.ts +36 -0
  50. package/dist/components/dnd/useDropTarget.d.ts +44 -0
  51. package/dist/components/dnd/useFlipList.d.ts +11 -0
  52. package/dist/components/dnd/useSortableList.d.ts +62 -0
  53. package/dist/components/drawer/Drawer.d.ts +13 -21
  54. package/dist/components/dropdown/Dropdown.d.ts +78 -84
  55. package/dist/components/empty-page/EmptyPage.d.ts +48 -48
  56. package/dist/components/example-frame/ExampleFrame.d.ts +20 -27
  57. package/dist/components/file-upload/FileUpload.d.ts +79 -134
  58. package/dist/components/hint/Hint.d.ts +10 -11
  59. package/dist/components/index.d.ts +58 -42
  60. package/dist/components/input/Input.d.ts +35 -37
  61. package/dist/components/kanban/Kanban.d.ts +129 -0
  62. package/dist/components/kbd/Kbd.d.ts +6 -12
  63. package/dist/components/label/Label.d.ts +18 -15
  64. package/dist/components/link-button/LinkButton.d.ts +14 -15
  65. package/dist/components/login-form/LoginForm.d.ts +115 -0
  66. package/dist/components/modal/DialogParts.d.ts +57 -16
  67. package/dist/components/modal/Modal.d.ts +9 -20
  68. package/dist/components/native-select/NativeSelect.d.ts +28 -0
  69. package/dist/components/notification/Notification.d.ts +50 -16
  70. package/dist/components/notification/NotificationStore.d.ts +2 -6
  71. package/dist/components/page-content/PageContent.d.ts +43 -52
  72. package/dist/components/page-toolbar/PageToolbar.d.ts +53 -0
  73. package/dist/components/pagination/Pagination.d.ts +11 -23
  74. package/dist/components/popover/Popover.d.ts +62 -26
  75. package/dist/components/progress-bar/ProgressBar.d.ts +17 -13
  76. package/dist/components/progress-circle/ProgressCircle.d.ts +14 -15
  77. package/dist/components/radio/Radio.d.ts +46 -54
  78. package/dist/components/scroll-container/ScrollContainer.d.ts +10 -13
  79. package/dist/components/segmented-control/SegmentedControl.d.ts +20 -29
  80. package/dist/components/select/Select.d.ts +54 -135
  81. package/dist/components/select/SelectItem.d.ts +68 -0
  82. package/dist/components/select/selectContext.d.ts +61 -0
  83. package/dist/components/skeleton/Skeleton.d.ts +22 -0
  84. package/dist/components/slider/Slider.d.ts +24 -16
  85. package/dist/components/smart-filter/SmartFilter.d.ts +105 -0
  86. package/dist/components/smart-filter/model.d.ts +33 -0
  87. package/dist/components/spinner/Spinner.d.ts +22 -0
  88. package/dist/components/stepper/Stepper.d.ts +32 -42
  89. package/dist/components/switch/Switch.d.ts +19 -37
  90. package/dist/components/tabs/Tabs.d.ts +65 -38
  91. package/dist/components/tag-select/TagOptionMenu.d.ts +29 -0
  92. package/dist/components/tag-select/TagSelect.d.ts +15 -16
  93. package/dist/components/tag-select/useChipOverflow.d.ts +19 -0
  94. package/dist/components/textarea/Textarea.d.ts +16 -31
  95. package/dist/components/thumbnail/Thumbnail.d.ts +41 -0
  96. package/dist/components/timeline/Timeline.d.ts +46 -61
  97. package/dist/components/tooltip/Tooltip.d.ts +21 -17
  98. package/dist/components/typography/Typography.d.ts +5 -21
  99. package/dist/hooks/useControllableState.d.ts +0 -1
  100. package/dist/hooks/useEdgeOverflow.d.ts +12 -0
  101. package/dist/hooks/useEnterConfirm.d.ts +15 -0
  102. package/dist/hooks/useImageStatus.d.ts +19 -0
  103. package/dist/hooks/useInertSiblings.d.ts +9 -0
  104. package/dist/hooks/useMediaQuery.d.ts +7 -0
  105. package/dist/hooks/useMergedRefs.d.ts +6 -2
  106. package/dist/hooks/useModalLayer.d.ts +22 -0
  107. package/dist/hooks/usePosition.d.ts +46 -40
  108. package/dist/hooks/usePresence.d.ts +0 -1
  109. package/dist/hooks/useScrollLock.d.ts +3 -5
  110. package/dist/hooks/useStateSwap.d.ts +8 -0
  111. package/dist/hooks/useSwipeDismiss.d.ts +34 -0
  112. package/dist/icons/Icon.d.ts +24 -7
  113. package/dist/icons/index.d.ts +2 -44
  114. package/dist/icons/registry.d.ts +85 -0
  115. package/dist/index.css +7053 -6846
  116. package/dist/index.d.ts +0 -1
  117. package/dist/index.js +106 -13830
  118. package/dist/internal/AnchorRectContext.d.ts +12 -0
  119. package/dist/internal/ChoiceField.d.ts +34 -0
  120. package/dist/internal/ControlSizeContext.d.ts +6 -2
  121. package/dist/internal/FieldFrame.d.ts +47 -8
  122. package/dist/internal/HighlightMatch.d.ts +13 -0
  123. package/dist/internal/MenuGroup.d.ts +8 -0
  124. package/dist/internal/Portal.d.ts +0 -1
  125. package/dist/internal/VisuallyHidden.d.ts +11 -0
  126. package/dist/internal/context.d.ts +0 -1
  127. package/dist/internal/cx.d.ts +0 -1
  128. package/dist/internal/data-attributes.d.ts +0 -1
  129. package/dist/internal/fieldClasses.d.ts +9 -0
  130. package/dist/internal/formatLabel.d.ts +6 -0
  131. package/dist/internal/highlightTsxHtml.d.ts +1 -2
  132. package/dist/internal/iconBox.d.ts +9 -0
  133. package/dist/internal/iconLayout.d.ts +15 -0
  134. package/dist/internal/imageSlot.d.ts +29 -0
  135. package/dist/internal/layoutPxFromPrimitives.d.ts +2 -3
  136. package/dist/internal/listbox.d.ts +40 -0
  137. package/dist/internal/mergeRefs.d.ts +4 -2
  138. package/dist/internal/overlay/FloatingPanel.d.ts +36 -0
  139. package/dist/internal/overlay/focus.d.ts +14 -0
  140. package/dist/internal/overlay/layerStack.d.ts +41 -0
  141. package/dist/internal/overlay/useFloatingLayer.d.ts +70 -0
  142. package/dist/internal/polymorphic.d.ts +9 -0
  143. package/dist/internal/progressSegments.d.ts +63 -0
  144. package/dist/internal/rovingFocus.d.ts +18 -0
  145. package/dist/internal/scrollAncestors.d.ts +1 -2
  146. package/dist/internal/slot.d.ts +11 -5
  147. package/dist/internal/states.d.ts +3 -2
  148. package/dist/internal/swatch.d.ts +56 -0
  149. package/dist/internal/touchTarget.d.ts +4 -0
  150. package/dist/layout/app-header/AppHeader.d.ts +110 -0
  151. package/dist/layout/app-shell/AppShell.d.ts +47 -22
  152. package/dist/layout/bottom-nav/BottomNav.d.ts +80 -0
  153. package/dist/layout/index.d.ts +6 -3
  154. package/dist/layout/sidebar/Sidebar.d.ts +206 -35
  155. package/dist/theme/applyTheme.d.ts +0 -1
  156. package/dist/tokens/naming.d.ts +6 -0
  157. package/dist/tokens/primitives.d.ts +26 -80
  158. package/dist/tokens/semantic.d.ts +122 -25
  159. package/dist/tokens/themes/dark.d.ts +7 -1
  160. package/package.json +30 -24
  161. package/src/components/accordion/COMPONENT.md +91 -101
  162. package/src/components/accordion/examples/collapsible.tsx +27 -0
  163. package/src/components/accordion/examples/controlled.tsx +36 -0
  164. package/src/components/accordion/examples/examples.module.css +6 -39
  165. package/src/components/accordion/examples/multiple.tsx +31 -0
  166. package/src/components/accordion/examples/overview.tsx +39 -0
  167. package/src/components/accordion/examples/sizes.tsx +14 -25
  168. package/src/components/accordion/examples/states.tsx +23 -48
  169. package/src/components/accordion/examples/variants.tsx +35 -0
  170. package/src/components/accordion/examples/with-icon.tsx +47 -0
  171. package/src/components/avatar/COMPONENT.md +88 -153
  172. package/src/components/avatar/examples/examples.module.css +6 -44
  173. package/src/components/avatar/examples/overview.tsx +18 -0
  174. package/src/components/avatar/examples/presence.tsx +20 -17
  175. package/src/components/avatar/examples/sizes.tsx +8 -10
  176. package/src/components/avatar/examples/src-from-state.tsx +4 -5
  177. package/src/components/avatar/examples/states.tsx +17 -27
  178. package/src/components/avatar/examples/team-group.tsx +21 -0
  179. package/src/components/avatar/examples/variants.tsx +40 -0
  180. package/src/components/badge/COMPONENT.md +113 -122
  181. package/src/components/{tag → badge}/examples/applied-filters.tsx +10 -11
  182. package/src/components/badge/examples/examples.module.css +14 -59
  183. package/src/components/badge/examples/filter-values.tsx +39 -0
  184. package/src/components/badge/examples/in-controls.tsx +14 -26
  185. package/src/components/badge/examples/overview.tsx +13 -0
  186. package/src/components/badge/examples/sizes.tsx +8 -10
  187. package/src/components/badge/examples/states.tsx +35 -29
  188. package/src/components/badge/examples/variants.tsx +27 -36
  189. package/src/components/badge/examples/with-icon.tsx +50 -0
  190. package/src/components/banner/COMPONENT.md +89 -94
  191. package/src/components/banner/examples/dismissible.tsx +38 -0
  192. package/src/components/banner/examples/examples.module.css +6 -22
  193. package/src/components/banner/examples/narrow.tsx +23 -0
  194. package/src/components/banner/examples/overview.tsx +18 -0
  195. package/src/components/banner/examples/page-strip.tsx +53 -0
  196. package/src/components/banner/examples/sizes.tsx +22 -21
  197. package/src/components/banner/examples/structure.tsx +45 -0
  198. package/src/components/banner/examples/variants.tsx +28 -55
  199. package/src/components/breadcrumb/COMPONENT.md +55 -59
  200. package/src/components/breadcrumb/examples/ellipsis.tsx +12 -0
  201. package/src/components/breadcrumb/examples/examples.module.css +3 -52
  202. package/src/components/breadcrumb/examples/overflow.tsx +26 -0
  203. package/src/components/breadcrumb/examples/overview.tsx +12 -0
  204. package/src/components/breadcrumb/examples/sizes.tsx +11 -14
  205. package/src/components/breadcrumb/examples/with-icon.tsx +14 -0
  206. package/src/components/button/COMPONENT.md +65 -66
  207. package/src/components/button/examples/as-child.tsx +8 -32
  208. package/src/components/button/examples/examples.module.css +18 -76
  209. package/src/components/button/examples/in-form.tsx +20 -14
  210. package/src/components/button/examples/on-colored-host.tsx +29 -0
  211. package/src/components/button/examples/overview.tsx +13 -0
  212. package/src/components/button/examples/sizes.tsx +7 -9
  213. package/src/components/button/examples/states.tsx +18 -28
  214. package/src/components/button/examples/variants.tsx +31 -0
  215. package/src/components/button/examples/with-icon.tsx +35 -23
  216. package/src/components/button-group/COMPONENT.md +64 -55
  217. package/src/components/button-group/examples/controlled.tsx +3 -3
  218. package/src/components/button-group/examples/examples.module.css +4 -39
  219. package/src/components/button-group/examples/full-width.tsx +10 -14
  220. package/src/components/button-group/examples/in-form.tsx +3 -3
  221. package/src/components/button-group/examples/orientation.tsx +6 -8
  222. package/src/components/button-group/examples/overview.tsx +12 -0
  223. package/src/components/button-group/examples/sizes.tsx +8 -10
  224. package/src/components/button-group/examples/states.tsx +28 -7
  225. package/src/components/button-group/examples/with-icon.tsx +45 -0
  226. package/src/components/card/COMPONENT.md +99 -298
  227. package/src/components/card/examples/{content.tsx → content-templates.tsx} +23 -29
  228. package/src/components/card/examples/examples.module.css +0 -8
  229. package/src/components/card/examples/flat.tsx +9 -14
  230. package/src/components/card/examples/kpi-media.tsx +42 -0
  231. package/src/components/card/examples/narrow.tsx +47 -0
  232. package/src/components/card/examples/{settings.tsx → overview.tsx} +7 -8
  233. package/src/components/card/examples/panel-chart.tsx +26 -34
  234. package/src/components/card/examples/{metrics.tsx → variants.tsx} +12 -18
  235. package/src/components/checkbox/COMPONENT.md +92 -96
  236. package/src/components/checkbox/examples/controlled.tsx +41 -0
  237. package/src/components/checkbox/examples/examples.module.css +47 -43
  238. package/src/components/checkbox/examples/in-form.tsx +34 -0
  239. package/src/components/checkbox/examples/indicator.tsx +54 -0
  240. package/src/components/checkbox/examples/overview.tsx +10 -0
  241. package/src/components/checkbox/examples/sizes.tsx +5 -10
  242. package/src/components/checkbox/examples/states.tsx +42 -23
  243. package/src/components/checkbox/examples/without-label.tsx +3 -7
  244. package/src/components/code-block/COMPONENT.md +55 -57
  245. package/src/components/code-block/examples/color-scheme.tsx +4 -15
  246. package/src/components/code-block/examples/examples.module.css +9 -40
  247. package/src/components/code-block/examples/{long-lines.tsx → narrow.tsx} +3 -4
  248. package/src/components/code-block/examples/overview.tsx +19 -0
  249. package/src/components/code-block/examples/variants.tsx +12 -21
  250. package/src/components/color-picker/COMPONENT.md +196 -165
  251. package/src/components/color-picker/examples/controlled.tsx +37 -0
  252. package/src/components/color-picker/examples/examples.module.css +19 -88
  253. package/src/components/color-picker/examples/formats.tsx +13 -18
  254. package/src/components/color-picker/examples/in-form.tsx +44 -0
  255. package/src/components/color-picker/examples/overview.tsx +37 -0
  256. package/src/components/color-picker/examples/panel.tsx +12 -13
  257. package/src/components/color-picker/examples/presets-sizes.tsx +15 -20
  258. package/src/components/color-picker/examples/presets.tsx +33 -0
  259. package/src/components/color-picker/examples/sizes.tsx +26 -0
  260. package/src/components/color-picker/examples/states.tsx +4 -14
  261. package/src/components/color-picker/examples/validation.tsx +18 -0
  262. package/src/components/color-swatches/COMPONENT.md +145 -0
  263. package/src/components/color-swatches/examples/controlled.tsx +22 -0
  264. package/src/components/color-swatches/examples/examples.module.css +19 -0
  265. package/src/components/color-swatches/examples/in-form.tsx +35 -0
  266. package/src/components/color-swatches/examples/overview.tsx +6 -0
  267. package/src/components/color-swatches/examples/sizes.tsx +19 -0
  268. package/src/components/color-swatches/examples/states.tsx +20 -0
  269. package/src/components/color-swatches/examples/wrapping.tsx +12 -0
  270. package/src/components/command-menu/COMPONENT.md +117 -180
  271. package/src/components/command-menu/examples/controlled-open.tsx +29 -0
  272. package/src/components/command-menu/examples/controlled.tsx +19 -26
  273. package/src/components/command-menu/examples/dismiss.tsx +39 -0
  274. package/src/components/command-menu/examples/overview.tsx +61 -0
  275. package/src/components/command-menu/examples/sizes.tsx +30 -51
  276. package/src/components/command-menu/examples/states.tsx +6 -16
  277. package/src/components/command-menu/examples/structure.tsx +54 -0
  278. package/src/components/crossfade/COMPONENT.md +104 -0
  279. package/src/components/crossfade/examples/examples.module.css +65 -0
  280. package/src/components/crossfade/examples/overview.tsx +102 -0
  281. package/src/components/crossfade/examples/record-switch.tsx +67 -0
  282. package/src/components/data-table/COMPONENT.md +181 -182
  283. package/src/components/data-table/examples/appearance.tsx +31 -34
  284. package/src/components/data-table/examples/columns-visibility.tsx +167 -0
  285. package/src/components/data-table/examples/content-width.tsx +46 -26
  286. package/src/components/data-table/examples/controlled.tsx +56 -0
  287. package/src/components/data-table/examples/detail-panel.tsx +23 -28
  288. package/src/components/data-table/examples/examples.module.css +20 -91
  289. package/src/components/data-table/examples/infinite-scroll.tsx +17 -18
  290. package/src/components/data-table/examples/narrow.tsx +28 -38
  291. package/src/components/data-table/examples/nested-rows.tsx +32 -54
  292. package/src/components/data-table/examples/numeric.tsx +10 -19
  293. package/src/components/data-table/examples/overview.tsx +54 -0
  294. package/src/components/data-table/examples/selection.tsx +11 -15
  295. package/src/components/data-table/examples/sizes.tsx +22 -33
  296. package/src/components/data-table/examples/states.tsx +23 -24
  297. package/src/components/data-table/examples/sticky.tsx +17 -24
  298. package/src/components/data-table/examples/toolbar.tsx +21 -23
  299. package/src/components/datepicker/COMPONENT.md +152 -164
  300. package/src/components/datepicker/examples/controlled-open.tsx +32 -0
  301. package/src/components/datepicker/examples/controlled.tsx +39 -0
  302. package/src/components/datepicker/examples/examples.module.css +9 -23
  303. package/src/components/datepicker/examples/in-form.tsx +32 -45
  304. package/src/components/datepicker/examples/inline-panel.tsx +3 -3
  305. package/src/components/datepicker/examples/narrow.tsx +1 -1
  306. package/src/components/datepicker/examples/overview.tsx +6 -0
  307. package/src/components/datepicker/examples/range-presets.tsx +6 -5
  308. package/src/components/datepicker/examples/sizes.tsx +7 -10
  309. package/src/components/datepicker/examples/states.tsx +9 -30
  310. package/src/components/datepicker/examples/validation.tsx +26 -0
  311. package/src/components/datepicker/examples/yearless.tsx +9 -8
  312. package/src/components/digit-input/COMPONENT.md +96 -58
  313. package/src/components/digit-input/examples/controlled.tsx +6 -15
  314. package/src/components/digit-input/examples/examples.module.css +13 -38
  315. package/src/components/digit-input/examples/full-width.tsx +13 -0
  316. package/src/components/digit-input/examples/grouped.tsx +11 -0
  317. package/src/components/digit-input/examples/in-form.tsx +32 -0
  318. package/src/components/digit-input/examples/on-complete.tsx +20 -0
  319. package/src/components/digit-input/examples/overview.tsx +6 -0
  320. package/src/components/digit-input/examples/sizes.tsx +5 -17
  321. package/src/components/digit-input/examples/states.tsx +6 -50
  322. package/src/components/digit-input/examples/validation.tsx +17 -0
  323. package/src/components/divider/COMPONENT.md +62 -53
  324. package/src/components/divider/examples/align.tsx +14 -0
  325. package/src/components/divider/examples/examples.module.css +6 -20
  326. package/src/components/divider/examples/or-separator.tsx +19 -0
  327. package/src/components/divider/examples/overview.tsx +30 -0
  328. package/src/components/divider/examples/sizes.tsx +11 -10
  329. package/src/components/divider/examples/vertical.tsx +21 -0
  330. package/src/components/divider/examples/with-icon.tsx +26 -0
  331. package/src/components/dnd/COMPONENT.md +197 -0
  332. package/src/components/dnd/examples/board.tsx +83 -0
  333. package/src/components/dnd/examples/drop-zones.tsx +82 -0
  334. package/src/components/dnd/examples/examples.module.css +89 -0
  335. package/src/components/dnd/examples/handle.tsx +53 -0
  336. package/src/components/dnd/examples/narrow.tsx +42 -0
  337. package/src/components/dnd/examples/overview.tsx +45 -0
  338. package/src/components/drawer/COMPONENT.md +114 -105
  339. package/src/components/drawer/examples/controlled-open.tsx +33 -0
  340. package/src/components/drawer/examples/date-sheet.tsx +41 -0
  341. package/src/components/drawer/examples/dismiss.tsx +55 -0
  342. package/src/components/drawer/examples/examples.module.css +8 -24
  343. package/src/components/drawer/examples/in-form.tsx +82 -0
  344. package/src/components/drawer/examples/long-content.tsx +40 -0
  345. package/src/components/drawer/examples/overview.tsx +48 -0
  346. package/src/components/drawer/examples/{variants-sides.tsx → placement.tsx} +13 -14
  347. package/src/components/drawer/examples/sizes.tsx +9 -15
  348. package/src/components/drawer/examples/structure.tsx +35 -0
  349. package/src/components/dropdown/COMPONENT.md +119 -148
  350. package/src/components/dropdown/examples/checkbox-items.tsx +48 -0
  351. package/src/components/dropdown/examples/controlled-open.tsx +32 -0
  352. package/src/components/dropdown/examples/dismiss.tsx +17 -0
  353. package/src/components/dropdown/examples/examples.module.css +11 -45
  354. package/src/components/dropdown/examples/long-list.tsx +42 -0
  355. package/src/components/dropdown/examples/{full-width.tsx → match-trigger-width.tsx} +5 -4
  356. package/src/components/dropdown/examples/overview.tsx +41 -0
  357. package/src/components/dropdown/examples/placement.tsx +16 -13
  358. package/src/components/dropdown/examples/sizes.tsx +18 -15
  359. package/src/components/dropdown/examples/states.tsx +21 -29
  360. package/src/components/dropdown/examples/structure.tsx +56 -0
  361. package/src/components/empty-page/COMPONENT.md +72 -76
  362. package/src/components/empty-page/examples/compact.tsx +23 -0
  363. package/src/components/empty-page/examples/data-region.tsx +8 -11
  364. package/src/components/empty-page/examples/examples.module.css +22 -25
  365. package/src/components/empty-page/examples/icon-tones.tsx +5 -6
  366. package/src/components/empty-page/examples/narrow.tsx +26 -0
  367. package/src/components/empty-page/examples/{no-results.tsx → overview.tsx} +4 -5
  368. package/src/components/empty-page/examples/sizes.tsx +14 -20
  369. package/src/components/example-frame/COMPONENT.md +64 -66
  370. package/src/components/example-frame/examples/controlled.tsx +42 -0
  371. package/src/components/example-frame/examples/overview.tsx +16 -0
  372. package/src/components/file-upload/COMPONENT.md +128 -186
  373. package/src/components/file-upload/examples/avatar-upload.tsx +7 -12
  374. package/src/components/file-upload/examples/custom-body.tsx +44 -0
  375. package/src/components/file-upload/examples/examples.module.css +46 -64
  376. package/src/components/file-upload/examples/in-form.tsx +76 -0
  377. package/src/components/file-upload/examples/narrow.tsx +17 -0
  378. package/src/components/file-upload/examples/overview.tsx +52 -0
  379. package/src/components/file-upload/examples/sizes.tsx +16 -37
  380. package/src/components/file-upload/examples/states.tsx +6 -98
  381. package/src/components/file-upload/examples/upload-progress.tsx +39 -0
  382. package/src/components/file-upload/examples/validation.tsx +19 -0
  383. package/src/components/file-upload/examples/variants.tsx +5 -18
  384. package/src/components/hint/COMPONENT.md +42 -48
  385. package/src/components/hint/examples/examples.module.css +3 -45
  386. package/src/components/hint/examples/hint-or-error.tsx +5 -5
  387. package/src/components/hint/examples/overview.tsx +34 -0
  388. package/src/components/hint/examples/sizes.tsx +8 -10
  389. package/src/components/hint/examples/states.tsx +21 -14
  390. package/src/components/hint/examples/with-icon.tsx +31 -0
  391. package/src/components/input/COMPONENT.md +70 -88
  392. package/src/components/input/examples/affixes.tsx +22 -0
  393. package/src/components/input/examples/controlled.tsx +9 -10
  394. package/src/components/input/examples/examples.module.css +3 -116
  395. package/src/components/input/examples/in-form.tsx +35 -14
  396. package/src/components/input/examples/overview.tsx +12 -0
  397. package/src/components/input/examples/sizes.tsx +6 -11
  398. package/src/components/input/examples/states.tsx +6 -23
  399. package/src/components/input/examples/validation.tsx +35 -0
  400. package/src/components/input/examples/with-icon.tsx +25 -0
  401. package/src/components/input/examples/{search-without-focus-ring.tsx → without-focus-ring.tsx} +5 -5
  402. package/src/components/kanban/COMPONENT.md +181 -0
  403. package/src/components/kanban/examples/controlled.tsx +78 -0
  404. package/src/components/kanban/examples/examples.module.css +31 -0
  405. package/src/components/kanban/examples/limits.tsx +58 -0
  406. package/src/components/kanban/examples/narrow.tsx +76 -0
  407. package/src/components/kanban/examples/overview.tsx +130 -0
  408. package/src/components/kanban/examples/states.tsx +75 -0
  409. package/src/components/kanban/examples/structure.tsx +76 -0
  410. package/src/components/kbd/COMPONENT.md +50 -65
  411. package/src/components/kbd/examples/examples.module.css +11 -41
  412. package/src/components/kbd/examples/in-controls.tsx +25 -31
  413. package/src/components/kbd/examples/overview.tsx +24 -0
  414. package/src/components/kbd/examples/shortcut-list.tsx +12 -12
  415. package/src/components/kbd/examples/sizes.tsx +8 -13
  416. package/src/components/label/COMPONENT.md +45 -44
  417. package/src/components/label/examples/examples.module.css +8 -29
  418. package/src/components/label/examples/overview.tsx +17 -0
  419. package/src/components/label/examples/sizes.tsx +9 -13
  420. package/src/components/label/examples/states.tsx +17 -14
  421. package/src/components/label/examples/structure.tsx +32 -0
  422. package/src/components/label/examples/with-icon.tsx +25 -17
  423. package/src/components/link-button/COMPONENT.md +56 -39
  424. package/src/components/link-button/examples/as-child.tsx +18 -0
  425. package/src/components/link-button/examples/external-link.tsx +6 -6
  426. package/src/components/link-button/examples/overview.tsx +11 -0
  427. package/src/components/link-button/examples/sizes.tsx +9 -11
  428. package/src/components/link-button/examples/states.tsx +25 -12
  429. package/src/components/link-button/examples/variants.tsx +21 -0
  430. package/src/components/link-button/examples/with-icon.tsx +21 -13
  431. package/src/components/login-form/COMPONENT.md +162 -0
  432. package/src/components/login-form/examples/examples.module.css +39 -0
  433. package/src/components/login-form/examples/forgot-password.tsx +39 -0
  434. package/src/components/login-form/examples/narrow.tsx +32 -0
  435. package/src/components/login-form/examples/overview.tsx +58 -0
  436. package/src/components/login-form/examples/register.tsx +85 -0
  437. package/src/components/login-form/examples/reset-password.tsx +60 -0
  438. package/src/components/login-form/examples/sizes.tsx +38 -0
  439. package/src/components/login-form/examples/states.tsx +75 -0
  440. package/src/components/login-form/examples/structure.tsx +28 -0
  441. package/src/components/login-form/examples/verification-code.tsx +57 -0
  442. package/src/components/modal/COMPONENT.md +71 -88
  443. package/src/components/modal/examples/{controlled.tsx → controlled-open.tsx} +6 -12
  444. package/src/components/modal/examples/custom-container.tsx +29 -0
  445. package/src/components/modal/examples/dismiss.tsx +54 -0
  446. package/src/components/modal/examples/examples.module.css +4 -20
  447. package/src/components/modal/examples/in-form.tsx +78 -0
  448. package/src/components/modal/examples/long-content.tsx +52 -0
  449. package/src/components/modal/examples/overview.tsx +35 -0
  450. package/src/components/modal/examples/sizes.tsx +7 -9
  451. package/src/components/modal/examples/structure.tsx +53 -0
  452. package/src/components/native-select/COMPONENT.md +132 -0
  453. package/src/components/native-select/examples/controlled.tsx +26 -0
  454. package/src/components/native-select/examples/examples.module.css +14 -0
  455. package/src/components/native-select/examples/in-form.tsx +43 -0
  456. package/src/components/native-select/examples/option-groups.tsx +17 -0
  457. package/src/components/native-select/examples/overview.tsx +16 -0
  458. package/src/components/native-select/examples/sizes.tsx +18 -0
  459. package/src/components/native-select/examples/states.tsx +21 -0
  460. package/src/components/native-select/examples/validation.tsx +26 -0
  461. package/src/components/notification/COMPONENT.md +108 -122
  462. package/src/components/notification/examples/dismiss.tsx +50 -0
  463. package/src/components/notification/examples/examples.module.css +10 -23
  464. package/src/components/notification/examples/in-form.tsx +64 -0
  465. package/src/components/notification/examples/overview.tsx +24 -0
  466. package/src/components/notification/examples/placement.tsx +66 -0
  467. package/src/components/notification/examples/sizes.tsx +11 -18
  468. package/src/components/notification/examples/stacking.tsx +45 -0
  469. package/src/components/notification/examples/structure.tsx +20 -0
  470. package/src/components/notification/examples/tones.tsx +14 -26
  471. package/src/components/page-content/COMPONENT.md +50 -75
  472. package/src/components/page-content/examples/examples.module.css +4 -8
  473. package/src/components/page-content/examples/narrow.tsx +25 -0
  474. package/src/components/page-content/examples/overview.tsx +41 -0
  475. package/src/components/page-content/examples/variants.tsx +39 -0
  476. package/src/components/page-toolbar/COMPONENT.md +142 -0
  477. package/src/components/page-toolbar/examples/examples.module.css +16 -0
  478. package/src/components/page-toolbar/examples/narrow.tsx +103 -0
  479. package/src/components/page-toolbar/examples/overview.tsx +113 -0
  480. package/src/components/page-toolbar/examples/save-changes.tsx +40 -0
  481. package/src/components/page-toolbar/examples/without-search.tsx +60 -0
  482. package/src/components/pagination/COMPONENT.md +73 -64
  483. package/src/components/pagination/examples/controlled.tsx +51 -0
  484. package/src/components/pagination/examples/examples.module.css +6 -55
  485. package/src/components/pagination/examples/narrow.tsx +25 -0
  486. package/src/components/pagination/examples/overflow.tsx +23 -0
  487. package/src/components/pagination/examples/overview.tsx +6 -0
  488. package/src/components/pagination/examples/sizes.tsx +10 -18
  489. package/src/components/popover/COMPONENT.md +89 -99
  490. package/src/components/popover/examples/controlled-open.tsx +32 -0
  491. package/src/components/popover/examples/dismiss.tsx +49 -0
  492. package/src/components/popover/examples/examples.module.css +21 -41
  493. package/src/components/popover/examples/flush.tsx +47 -0
  494. package/src/components/popover/examples/in-form.tsx +54 -0
  495. package/src/components/popover/examples/{full-width.tsx → match-trigger-width.tsx} +7 -7
  496. package/src/components/popover/examples/overview.tsx +43 -0
  497. package/src/components/popover/examples/placement.tsx +17 -15
  498. package/src/components/popover/examples/sizes.tsx +12 -9
  499. package/src/components/popover/examples/structure.tsx +50 -0
  500. package/src/components/progress-bar/COMPONENT.md +103 -62
  501. package/src/components/progress-bar/examples/custom-max.tsx +12 -0
  502. package/src/components/progress-bar/examples/examples.module.css +4 -34
  503. package/src/components/progress-bar/examples/overview.tsx +12 -0
  504. package/src/components/progress-bar/examples/segments.tsx +32 -0
  505. package/src/components/progress-bar/examples/sizes.tsx +11 -8
  506. package/src/components/progress-bar/examples/variants.tsx +34 -0
  507. package/src/components/progress-circle/COMPONENT.md +102 -61
  508. package/src/components/progress-circle/examples/examples.module.css +2 -39
  509. package/src/components/progress-circle/examples/inner-content.tsx +35 -0
  510. package/src/components/progress-circle/examples/overview.tsx +10 -0
  511. package/src/components/progress-circle/examples/segments.tsx +64 -0
  512. package/src/components/progress-circle/examples/sizes.tsx +10 -12
  513. package/src/components/progress-circle/examples/variants.tsx +28 -0
  514. package/src/components/radio/COMPONENT.md +93 -114
  515. package/src/components/radio/examples/controlled.tsx +30 -0
  516. package/src/components/radio/examples/group.tsx +23 -0
  517. package/src/components/radio/examples/orientation.tsx +34 -0
  518. package/src/components/radio/examples/overview.tsx +18 -0
  519. package/src/components/radio/examples/sizes.tsx +7 -12
  520. package/src/components/radio/examples/states.tsx +42 -30
  521. package/src/components/scroll-container/COMPONENT.md +57 -29
  522. package/src/components/scroll-container/examples/edge-fade.tsx +53 -0
  523. package/src/components/scroll-container/examples/examples.module.css +7 -7
  524. package/src/components/scroll-container/examples/overscroll.tsx +27 -0
  525. package/src/components/scroll-container/examples/overview.tsx +27 -0
  526. package/src/components/scroll-container/examples/variants.tsx +54 -0
  527. package/src/components/segmented-control/COMPONENT.md +93 -107
  528. package/src/components/segmented-control/examples/colors.tsx +8 -13
  529. package/src/components/segmented-control/examples/controlled.tsx +10 -6
  530. package/src/components/segmented-control/examples/examples.module.css +2 -88
  531. package/src/components/segmented-control/examples/full-width.tsx +7 -44
  532. package/src/components/segmented-control/examples/overview.tsx +12 -0
  533. package/src/components/segmented-control/examples/scroll.tsx +16 -0
  534. package/src/components/segmented-control/examples/sizes.tsx +8 -20
  535. package/src/components/segmented-control/examples/states.tsx +28 -34
  536. package/src/components/segmented-control/examples/two-line.tsx +17 -104
  537. package/src/components/segmented-control/examples/with-icon.tsx +52 -0
  538. package/src/components/select/COMPONENT.md +155 -208
  539. package/src/components/select/examples/clearable.tsx +23 -0
  540. package/src/components/select/examples/controlled-open.tsx +30 -0
  541. package/src/components/select/examples/controlled.tsx +17 -10
  542. package/src/components/select/examples/examples.module.css +18 -38
  543. package/src/components/select/examples/in-form.tsx +59 -70
  544. package/src/components/select/examples/multiple.tsx +21 -33
  545. package/src/components/select/examples/overview.tsx +17 -0
  546. package/src/components/select/examples/rich-options.tsx +43 -69
  547. package/src/components/select/examples/searchable.tsx +42 -0
  548. package/src/components/select/examples/sizes.tsx +13 -17
  549. package/src/components/select/examples/states.tsx +34 -48
  550. package/src/components/select/examples/validation.tsx +41 -0
  551. package/src/components/select/examples/with-icon.tsx +35 -0
  552. package/src/components/skeleton/COMPONENT.md +104 -0
  553. package/src/components/skeleton/examples/examples.module.css +89 -0
  554. package/src/components/skeleton/examples/form.tsx +20 -0
  555. package/src/components/skeleton/examples/overview.tsx +21 -0
  556. package/src/components/skeleton/examples/sizes.tsx +24 -0
  557. package/src/components/skeleton/examples/with-crossfade.tsx +68 -0
  558. package/src/components/slider/COMPONENT.md +105 -68
  559. package/src/components/slider/examples/controlled.tsx +26 -30
  560. package/src/components/slider/examples/examples.module.css +8 -32
  561. package/src/components/slider/examples/hint-and-error.tsx +33 -0
  562. package/src/components/slider/examples/overview.tsx +6 -0
  563. package/src/components/slider/examples/range-step.tsx +7 -17
  564. package/src/components/slider/examples/sizes.tsx +8 -6
  565. package/src/components/slider/examples/states.tsx +11 -8
  566. package/src/components/slider/examples/value-format.tsx +13 -25
  567. package/src/components/slider/examples/variants.tsx +23 -0
  568. package/src/components/smart-filter/COMPONENT.md +184 -0
  569. package/src/components/smart-filter/examples/controlled.tsx +48 -0
  570. package/src/components/smart-filter/examples/examples.module.css +56 -0
  571. package/src/components/smart-filter/examples/many-values.tsx +53 -0
  572. package/src/components/smart-filter/examples/narrow.tsx +38 -0
  573. package/src/components/smart-filter/examples/overview.tsx +109 -0
  574. package/src/components/smart-filter/examples/sizes.tsx +33 -0
  575. package/src/components/spinner/COMPONENT.md +112 -0
  576. package/src/components/spinner/examples/examples.module.css +20 -0
  577. package/src/components/spinner/examples/loading-region.tsx +22 -0
  578. package/src/components/spinner/examples/overview.tsx +15 -0
  579. package/src/components/spinner/examples/sizes.tsx +19 -0
  580. package/src/components/spinner/examples/variants.tsx +19 -0
  581. package/src/components/stepper/COMPONENT.md +83 -78
  582. package/src/components/stepper/examples/controlled.tsx +46 -0
  583. package/src/components/stepper/examples/examples.module.css +9 -40
  584. package/src/components/stepper/examples/narrow.tsx +11 -19
  585. package/src/components/stepper/examples/orientation.tsx +21 -59
  586. package/src/components/stepper/examples/overview.tsx +28 -0
  587. package/src/components/stepper/examples/sizes.tsx +19 -28
  588. package/src/components/stepper/examples/states.tsx +20 -21
  589. package/src/components/stepper/examples/with-icon.tsx +29 -0
  590. package/src/components/switch/COMPONENT.md +75 -94
  591. package/src/components/switch/examples/controlled.tsx +8 -6
  592. package/src/components/switch/examples/examples.module.css +13 -45
  593. package/src/components/switch/examples/in-form.tsx +20 -24
  594. package/src/components/switch/examples/overview.tsx +10 -0
  595. package/src/components/switch/examples/settings-row.tsx +14 -22
  596. package/src/components/switch/examples/sizes.tsx +5 -10
  597. package/src/components/switch/examples/states.tsx +37 -25
  598. package/src/components/tabs/COMPONENT.md +156 -86
  599. package/src/components/tabs/examples/closable.tsx +48 -0
  600. package/src/components/tabs/examples/controlled.tsx +14 -20
  601. package/src/components/tabs/examples/examples.module.css +13 -93
  602. package/src/components/tabs/examples/orientation.tsx +40 -0
  603. package/src/components/tabs/examples/overflow.tsx +60 -0
  604. package/src/components/tabs/examples/overview.tsx +30 -0
  605. package/src/components/tabs/examples/sizes.tsx +19 -19
  606. package/src/components/tabs/examples/states.tsx +20 -55
  607. package/src/components/tabs/examples/two-line.tsx +22 -29
  608. package/src/components/tabs/examples/variants.tsx +40 -0
  609. package/src/components/tabs/examples/with-icon.tsx +44 -0
  610. package/src/components/tag-select/COMPONENT.md +119 -122
  611. package/src/components/tag-select/examples/controlled-open.tsx +29 -0
  612. package/src/components/tag-select/examples/controlled.tsx +26 -0
  613. package/src/components/tag-select/examples/creatable.tsx +28 -0
  614. package/src/components/tag-select/examples/examples.module.css +3 -22
  615. package/src/components/tag-select/examples/in-form.tsx +44 -41
  616. package/src/components/tag-select/examples/manage-tags.tsx +20 -39
  617. package/src/components/tag-select/examples/many-tags.tsx +20 -0
  618. package/src/components/tag-select/examples/overview.tsx +21 -0
  619. package/src/components/tag-select/examples/sizes.tsx +7 -10
  620. package/src/components/tag-select/examples/states.tsx +11 -36
  621. package/src/components/tag-select/examples/validation.tsx +35 -0
  622. package/src/components/textarea/COMPONENT.md +50 -50
  623. package/src/components/textarea/examples/auto-resize.tsx +21 -0
  624. package/src/components/textarea/examples/controlled.tsx +12 -16
  625. package/src/components/textarea/examples/examples.module.css +15 -48
  626. package/src/components/textarea/examples/in-form.tsx +52 -48
  627. package/src/components/textarea/examples/overview.tsx +12 -0
  628. package/src/components/textarea/examples/sizes.tsx +6 -7
  629. package/src/components/textarea/examples/states.tsx +9 -13
  630. package/src/components/textarea/examples/validation.tsx +34 -0
  631. package/src/components/textarea/examples/without-focus-ring.tsx +12 -0
  632. package/src/components/thumbnail/COMPONENT.md +150 -0
  633. package/src/components/thumbnail/examples/examples.module.css +45 -0
  634. package/src/components/thumbnail/examples/full-width.tsx +48 -0
  635. package/src/components/thumbnail/examples/overview.tsx +31 -0
  636. package/src/components/thumbnail/examples/ratios.tsx +25 -0
  637. package/src/components/thumbnail/examples/ring.tsx +29 -0
  638. package/src/components/thumbnail/examples/sizes.tsx +23 -0
  639. package/src/components/thumbnail/examples/states.tsx +38 -0
  640. package/src/components/thumbnail/examples/variants.tsx +28 -0
  641. package/src/components/timeline/COMPONENT.md +92 -203
  642. package/src/components/timeline/examples/examples.module.css +5 -20
  643. package/src/components/timeline/examples/links.tsx +28 -0
  644. package/src/components/timeline/examples/narrow.tsx +30 -38
  645. package/src/components/timeline/examples/{activity-feed.tsx → overview.tsx} +9 -17
  646. package/src/components/timeline/examples/sizes.tsx +22 -28
  647. package/src/components/timeline/examples/{service-history.tsx → structure.tsx} +10 -8
  648. package/src/components/timeline/examples/{colors-and-tones.tsx → variants.tsx} +11 -16
  649. package/src/components/tooltip/COMPONENT.md +74 -62
  650. package/src/components/tooltip/examples/{controlled.tsx → controlled-open.tsx} +5 -7
  651. package/src/components/tooltip/examples/delay.tsx +19 -28
  652. package/src/components/tooltip/examples/disabled-trigger.tsx +18 -0
  653. package/src/components/tooltip/examples/examples.module.css +3 -33
  654. package/src/components/tooltip/examples/long-content.tsx +12 -15
  655. package/src/components/tooltip/examples/overview.tsx +17 -0
  656. package/src/components/tooltip/examples/placement.tsx +30 -0
  657. package/src/components/tooltip/examples/sizes.tsx +12 -15
  658. package/src/components/tooltip/examples/toolbar.tsx +35 -0
  659. package/src/components/typography/COMPONENT.md +68 -99
  660. package/src/components/typography/examples/article.tsx +23 -36
  661. package/src/components/typography/examples/examples.module.css +20 -54
  662. package/src/components/typography/examples/inline-emphasis.tsx +20 -0
  663. package/src/components/typography/examples/overview.tsx +20 -0
  664. package/src/components/typography/examples/semantic-tag.tsx +17 -0
  665. package/src/components/typography/examples/truncate.tsx +7 -7
  666. package/src/components/typography/examples/variants.tsx +43 -42
  667. package/src/components/typography/examples/weights.tsx +31 -0
  668. package/src/layout/app-header/COMPONENT.md +178 -0
  669. package/src/layout/app-header/examples/breadcrumbs.tsx +36 -0
  670. package/src/layout/app-header/examples/examples.module.css +47 -0
  671. package/src/layout/app-header/examples/in-app-shell.tsx +70 -0
  672. package/src/layout/app-header/examples/narrow.tsx +29 -0
  673. package/src/layout/app-header/examples/overview.tsx +36 -0
  674. package/src/layout/app-shell/COMPONENT.md +63 -63
  675. package/src/layout/app-shell/examples/contained.tsx +5 -5
  676. package/src/layout/app-shell/examples/examples.module.css +24 -0
  677. package/src/layout/app-shell/examples/footer.tsx +59 -0
  678. package/src/layout/app-shell/examples/overview.tsx +83 -0
  679. package/src/layout/app-shell/examples/template.tsx +54 -0
  680. package/src/layout/bottom-nav/COMPONENT.md +153 -0
  681. package/src/layout/bottom-nav/examples/examples.module.css +39 -0
  682. package/src/layout/bottom-nav/examples/floating.tsx +89 -0
  683. package/src/layout/bottom-nav/examples/icon-only.tsx +41 -0
  684. package/src/layout/bottom-nav/examples/in-app-shell.tsx +64 -0
  685. package/src/layout/bottom-nav/examples/overview.tsx +44 -0
  686. package/src/layout/bottom-nav/examples/router.tsx +31 -0
  687. package/src/layout/bottom-nav/examples/structure.tsx +47 -0
  688. package/src/layout/sidebar/COMPONENT.md +304 -111
  689. package/src/layout/sidebar/examples/account.tsx +88 -0
  690. package/src/layout/sidebar/examples/brand-header.tsx +45 -0
  691. package/src/layout/sidebar/examples/collapsible-groups.tsx +77 -0
  692. package/src/layout/sidebar/examples/controlled-open.tsx +55 -0
  693. package/src/layout/sidebar/examples/controlled.tsx +68 -0
  694. package/src/layout/sidebar/examples/examples.module.css +17 -3
  695. package/src/layout/sidebar/examples/nested-items.tsx +74 -0
  696. package/src/layout/sidebar/examples/overview.tsx +126 -0
  697. package/src/layout/sidebar/examples/router.tsx +19 -13
  698. package/src/layout/sidebar/examples/sizes.tsx +17 -12
  699. package/src/layout/sidebar/examples/structure.tsx +81 -0
  700. package/src/styles/fonts.css +4 -0
  701. package/src/styles/globals.css +18 -29
  702. package/src/styles/reset.css +2 -0
  703. package/src/styles/theme-dark.css +6 -0
  704. package/src/styles/theme-light.css +58 -23
  705. package/src/styles/tokens.css +11 -77
  706. package/dist/components/accordion/Accordion.d.ts.map +0 -1
  707. package/dist/components/avatar/Avatar.d.ts.map +0 -1
  708. package/dist/components/badge/Badge.d.ts.map +0 -1
  709. package/dist/components/badge/tier.d.ts.map +0 -1
  710. package/dist/components/banner/Banner.d.ts.map +0 -1
  711. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +0 -1
  712. package/dist/components/button/Button.d.ts.map +0 -1
  713. package/dist/components/button-group/ButtonGroup.d.ts.map +0 -1
  714. package/dist/components/card/Card.d.ts.map +0 -1
  715. package/dist/components/checkbox/Checkbox.d.ts.map +0 -1
  716. package/dist/components/code-block/CodeBlock.d.ts.map +0 -1
  717. package/dist/components/color-picker/ColorPicker.d.ts.map +0 -1
  718. package/dist/components/color-picker/ColorPresets.d.ts.map +0 -1
  719. package/dist/components/command-menu/CommandMenu.d.ts.map +0 -1
  720. package/dist/components/data-table/DataTable.d.ts.map +0 -1
  721. package/dist/components/datepicker/Datepicker.d.ts.map +0 -1
  722. package/dist/components/datepicker/datepickerModel.d.ts.map +0 -1
  723. package/dist/components/digit-input/DigitInput.d.ts.map +0 -1
  724. package/dist/components/divider/Divider.d.ts.map +0 -1
  725. package/dist/components/drawer/Drawer.d.ts.map +0 -1
  726. package/dist/components/dropdown/Dropdown.d.ts.map +0 -1
  727. package/dist/components/dropdown/dropdownGeometry.d.ts +0 -10
  728. package/dist/components/dropdown/dropdownGeometry.d.ts.map +0 -1
  729. package/dist/components/dropdown/menuKeyboard.d.ts +0 -4
  730. package/dist/components/dropdown/menuKeyboard.d.ts.map +0 -1
  731. package/dist/components/dropdown/useDropdownPosition.d.ts +0 -18
  732. package/dist/components/dropdown/useDropdownPosition.d.ts.map +0 -1
  733. package/dist/components/empty-page/EmptyPage.d.ts.map +0 -1
  734. package/dist/components/example-frame/ExampleFrame.d.ts.map +0 -1
  735. package/dist/components/file-upload/FileUpload.d.ts.map +0 -1
  736. package/dist/components/hint/Hint.d.ts.map +0 -1
  737. package/dist/components/index.css +0 -11181
  738. package/dist/components/index.css.map +0 -7
  739. package/dist/components/index.d.ts.map +0 -1
  740. package/dist/components/index.js +0 -13833
  741. package/dist/components/index.js.map +0 -7
  742. package/dist/components/input/Input.d.ts.map +0 -1
  743. package/dist/components/kbd/Kbd.d.ts.map +0 -1
  744. package/dist/components/label/Label.d.ts.map +0 -1
  745. package/dist/components/link-button/LinkButton.d.ts.map +0 -1
  746. package/dist/components/modal/DialogParts.d.ts.map +0 -1
  747. package/dist/components/modal/Modal.d.ts.map +0 -1
  748. package/dist/components/modal/useInertSiblings.d.ts +0 -7
  749. package/dist/components/modal/useInertSiblings.d.ts.map +0 -1
  750. package/dist/components/notification/Notification.d.ts.map +0 -1
  751. package/dist/components/notification/NotificationStore.d.ts.map +0 -1
  752. package/dist/components/page-content/PageContent.d.ts.map +0 -1
  753. package/dist/components/pagination/Pagination.d.ts.map +0 -1
  754. package/dist/components/popover/Popover.d.ts.map +0 -1
  755. package/dist/components/popover/popoverGeometry.d.ts +0 -6
  756. package/dist/components/popover/popoverGeometry.d.ts.map +0 -1
  757. package/dist/components/popover/usePopoverPosition.d.ts +0 -18
  758. package/dist/components/popover/usePopoverPosition.d.ts.map +0 -1
  759. package/dist/components/progress-bar/ProgressBar.d.ts.map +0 -1
  760. package/dist/components/progress-circle/ProgressCircle.d.ts.map +0 -1
  761. package/dist/components/radio/Radio.d.ts.map +0 -1
  762. package/dist/components/scroll-container/ScrollContainer.d.ts.map +0 -1
  763. package/dist/components/segmented-control/SegmentedControl.d.ts.map +0 -1
  764. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +0 -29
  765. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts.map +0 -1
  766. package/dist/components/select/Select.d.ts.map +0 -1
  767. package/dist/components/select/selectIcons.d.ts +0 -15
  768. package/dist/components/select/selectIcons.d.ts.map +0 -1
  769. package/dist/components/select/selectListbox.d.ts +0 -13
  770. package/dist/components/select/selectListbox.d.ts.map +0 -1
  771. package/dist/components/slider/Slider.d.ts.map +0 -1
  772. package/dist/components/stepper/Stepper.d.ts.map +0 -1
  773. package/dist/components/switch/Switch.d.ts.map +0 -1
  774. package/dist/components/tabs/Tabs.d.ts.map +0 -1
  775. package/dist/components/tag/Tag.d.ts +0 -47
  776. package/dist/components/tag/Tag.d.ts.map +0 -1
  777. package/dist/components/tag-select/TagSelect.d.ts.map +0 -1
  778. package/dist/components/textarea/Textarea.d.ts.map +0 -1
  779. package/dist/components/timeline/Timeline.d.ts.map +0 -1
  780. package/dist/components/tooltip/Tooltip.d.ts.map +0 -1
  781. package/dist/components/typography/Typography.d.ts.map +0 -1
  782. package/dist/hooks/useControllableState.d.ts.map +0 -1
  783. package/dist/hooks/useEscapeKey.d.ts +0 -7
  784. package/dist/hooks/useEscapeKey.d.ts.map +0 -1
  785. package/dist/hooks/useFieldIds.d.ts +0 -17
  786. package/dist/hooks/useFieldIds.d.ts.map +0 -1
  787. package/dist/hooks/useFocusTrap.d.ts +0 -20
  788. package/dist/hooks/useFocusTrap.d.ts.map +0 -1
  789. package/dist/hooks/useMergedRefs.d.ts.map +0 -1
  790. package/dist/hooks/useModalKeyboard.d.ts +0 -14
  791. package/dist/hooks/useModalKeyboard.d.ts.map +0 -1
  792. package/dist/hooks/useOutsideClick.d.ts +0 -26
  793. package/dist/hooks/useOutsideClick.d.ts.map +0 -1
  794. package/dist/hooks/useOverlayModal.d.ts +0 -7
  795. package/dist/hooks/useOverlayModal.d.ts.map +0 -1
  796. package/dist/hooks/usePosition.d.ts.map +0 -1
  797. package/dist/hooks/usePresence.d.ts.map +0 -1
  798. package/dist/hooks/useResponsiveMonths.d.ts +0 -18
  799. package/dist/hooks/useResponsiveMonths.d.ts.map +0 -1
  800. package/dist/hooks/useScrollLock.d.ts.map +0 -1
  801. package/dist/icons/Icon.d.ts.map +0 -1
  802. package/dist/icons/index.d.ts.map +0 -1
  803. package/dist/index.css.map +0 -7
  804. package/dist/index.d.ts.map +0 -1
  805. package/dist/index.js.map +0 -7
  806. package/dist/internal/ControlSizeContext.d.ts.map +0 -1
  807. package/dist/internal/DividerContentContext.d.ts +0 -4
  808. package/dist/internal/DividerContentContext.d.ts.map +0 -1
  809. package/dist/internal/FieldFrame.d.ts.map +0 -1
  810. package/dist/internal/OverlayPortalLayerContext.d.ts +0 -13
  811. package/dist/internal/OverlayPortalLayerContext.d.ts.map +0 -1
  812. package/dist/internal/Portal.d.ts.map +0 -1
  813. package/dist/internal/context.d.ts.map +0 -1
  814. package/dist/internal/cx.d.ts.map +0 -1
  815. package/dist/internal/data-attributes.d.ts.map +0 -1
  816. package/dist/internal/highlightTsxHtml.d.ts.map +0 -1
  817. package/dist/internal/layoutPxFromPrimitives.d.ts.map +0 -1
  818. package/dist/internal/mergeRefs.d.ts.map +0 -1
  819. package/dist/internal/runtimeUnits.d.ts +0 -3
  820. package/dist/internal/runtimeUnits.d.ts.map +0 -1
  821. package/dist/internal/scrollAncestors.d.ts.map +0 -1
  822. package/dist/internal/slot.d.ts.map +0 -1
  823. package/dist/internal/states.d.ts.map +0 -1
  824. package/dist/internal/useFieldDescriptions.d.ts +0 -18
  825. package/dist/internal/useFieldDescriptions.d.ts.map +0 -1
  826. package/dist/layout/app-shell/AppShell.d.ts.map +0 -1
  827. package/dist/layout/index.d.ts.map +0 -1
  828. package/dist/layout/sidebar/Sidebar.d.ts.map +0 -1
  829. package/dist/theme/applyTheme.d.ts.map +0 -1
  830. package/dist/tokens/primitives.d.ts.map +0 -1
  831. package/dist/tokens/semantic.d.ts.map +0 -1
  832. package/dist/tokens/themes/dark.d.ts.map +0 -1
  833. package/dist/tokens/themes/light.d.ts +0 -3
  834. package/dist/tokens/themes/light.d.ts.map +0 -1
  835. package/src/components/accordion/examples/checkout.tsx +0 -73
  836. package/src/components/accordion/examples/layouts.tsx +0 -58
  837. package/src/components/avatar/examples/colors.tsx +0 -29
  838. package/src/components/avatar/examples/group.tsx +0 -35
  839. package/src/components/avatar/examples/team-card.tsx +0 -70
  840. package/src/components/badge/examples/icons.tsx +0 -37
  841. package/src/components/badge/examples/order-list.tsx +0 -48
  842. package/src/components/badge/examples/palette.tsx +0 -44
  843. package/src/components/badge/examples/surfaces.tsx +0 -21
  844. package/src/components/banner/examples/dismiss.tsx +0 -48
  845. package/src/components/banner/examples/placement.tsx +0 -92
  846. package/src/components/breadcrumb/examples/collapse.tsx +0 -56
  847. package/src/components/breadcrumb/examples/page-header.tsx +0 -31
  848. package/src/components/button/examples/composition.tsx +0 -46
  849. package/src/components/button/examples/controlled.tsx +0 -18
  850. package/src/components/button/examples/full-width.tsx +0 -15
  851. package/src/components/button/examples/icon-only.tsx +0 -42
  852. package/src/components/button/examples/surfaces.tsx +0 -18
  853. package/src/components/button/examples/variants-tones.tsx +0 -39
  854. package/src/components/button-group/examples/composition.tsx +0 -99
  855. package/src/components/card/examples/mini-media.tsx +0 -55
  856. package/src/components/card/examples/responsive.tsx +0 -72
  857. package/src/components/checkbox/examples/hint-error.tsx +0 -22
  858. package/src/components/checkbox/examples/select-all.tsx +0 -40
  859. package/src/components/checkbox/examples/settings-card.tsx +0 -76
  860. package/src/components/code-block/examples/api-docs.tsx +0 -31
  861. package/src/components/code-block/examples/controlled.tsx +0 -38
  862. package/src/components/code-block/examples/surfaces.tsx +0 -7
  863. package/src/components/color-picker/examples/brand-color.tsx +0 -73
  864. package/src/components/color-picker/examples/hex-input-sizes.tsx +0 -54
  865. package/src/components/color-picker/examples/presets-quick.tsx +0 -57
  866. package/src/components/color-picker/examples/presets-tags.tsx +0 -52
  867. package/src/components/command-menu/examples/composition.tsx +0 -91
  868. package/src/components/command-menu/examples/examples.module.css +0 -9
  869. package/src/components/command-menu/examples/keyboard-search.tsx +0 -94
  870. package/src/components/data-table/examples/dashboard.tsx +0 -205
  871. package/src/components/data-table/examples/sorting-pagination.tsx +0 -66
  872. package/src/components/datepicker/examples/badge.tsx +0 -19
  873. package/src/components/datepicker/examples/single.tsx +0 -16
  874. package/src/components/digit-input/examples/length-and-complete.tsx +0 -30
  875. package/src/components/digit-input/examples/surfaces.tsx +0 -6
  876. package/src/components/digit-input/examples/verification-step.tsx +0 -62
  877. package/src/components/divider/examples/composition.tsx +0 -49
  878. package/src/components/divider/examples/variants.tsx +0 -62
  879. package/src/components/drawer/examples/composition.tsx +0 -94
  880. package/src/components/drawer/examples/controlled.tsx +0 -42
  881. package/src/components/drawer/examples/features.tsx +0 -48
  882. package/src/components/drawer/examples/states.tsx +0 -54
  883. package/src/components/dropdown/examples/as-child.tsx +0 -23
  884. package/src/components/dropdown/examples/composition.tsx +0 -91
  885. package/src/components/dropdown/examples/controlled.tsx +0 -32
  886. package/src/components/dropdown/examples/row-actions.tsx +0 -56
  887. package/src/components/dropdown/examples/variants.tsx +0 -52
  888. package/src/components/example-frame/examples/basic.tsx +0 -18
  889. package/src/components/file-upload/examples/file-list.tsx +0 -67
  890. package/src/components/file-upload/examples/in-card.tsx +0 -84
  891. package/src/components/hint/examples/field-states.tsx +0 -60
  892. package/src/components/hint/examples/in-form.tsx +0 -45
  893. package/src/components/input/examples/anatomy.tsx +0 -70
  894. package/src/components/input/examples/control-alignment.tsx +0 -57
  895. package/src/components/input/examples/full-width.tsx +0 -23
  896. package/src/components/input/examples/icons-and-affixes.tsx +0 -32
  897. package/src/components/input/examples/reserved-support-row.tsx +0 -33
  898. package/src/components/input/examples/surfaces.tsx +0 -12
  899. package/src/components/input/examples/with-badge.tsx +0 -40
  900. package/src/components/kbd/examples/modifier-keys.tsx +0 -24
  901. package/src/components/label/examples/in-form.tsx +0 -39
  902. package/src/components/label/examples/markers.tsx +0 -27
  903. package/src/components/link-button/examples/composition.tsx +0 -30
  904. package/src/components/link-button/examples/examples.module.css +0 -46
  905. package/src/components/link-button/examples/tones.tsx +0 -15
  906. package/src/components/modal/examples/composition.tsx +0 -87
  907. package/src/components/modal/examples/features.tsx +0 -68
  908. package/src/components/modal/examples/link.tsx +0 -79
  909. package/src/components/modal/examples/states.tsx +0 -73
  910. package/src/components/notification/examples/features.tsx +0 -42
  911. package/src/components/notification/examples/live.tsx +0 -128
  912. package/src/components/notification/examples/save-form.tsx +0 -59
  913. package/src/components/page-content/examples/readable.tsx +0 -24
  914. package/src/components/page-content/examples/settings-page.tsx +0 -49
  915. package/src/components/page-content/examples/widths.tsx +0 -39
  916. package/src/components/pagination/examples/compact.tsx +0 -36
  917. package/src/components/pagination/examples/list-footer.tsx +0 -50
  918. package/src/components/pagination/examples/states.tsx +0 -44
  919. package/src/components/popover/examples/as-child.tsx +0 -29
  920. package/src/components/popover/examples/composition.tsx +0 -45
  921. package/src/components/popover/examples/controlled.tsx +0 -39
  922. package/src/components/popover/examples/features.tsx +0 -56
  923. package/src/components/popover/examples/inset-variants.tsx +0 -58
  924. package/src/components/popover/examples/states.tsx +0 -48
  925. package/src/components/progress-bar/examples/file-upload.tsx +0 -52
  926. package/src/components/progress-bar/examples/values-and-tones.tsx +0 -17
  927. package/src/components/progress-circle/examples/goals-card.tsx +0 -37
  928. package/src/components/progress-circle/examples/values-and-tones.tsx +0 -56
  929. package/src/components/radio/examples/examples.module.css +0 -43
  930. package/src/components/radio/examples/hint-error.tsx +0 -28
  931. package/src/components/radio/examples/horizontal.tsx +0 -33
  932. package/src/components/radio/examples/plan-picker.tsx +0 -55
  933. package/src/components/scroll-container/examples/both-axes.tsx +0 -57
  934. package/src/components/scroll-container/examples/list.tsx +0 -44
  935. package/src/components/segmented-control/examples/item-content.tsx +0 -78
  936. package/src/components/segmented-control/examples/surfaces.tsx +0 -82
  937. package/src/components/segmented-control/examples/toolbar.tsx +0 -56
  938. package/src/components/segmented-progress-bar/COMPONENT.md +0 -128
  939. package/src/components/segmented-progress-bar/examples/examples.module.css +0 -68
  940. package/src/components/segmented-progress-bar/examples/segment-gap.tsx +0 -24
  941. package/src/components/segmented-progress-bar/examples/sizes.tsx +0 -31
  942. package/src/components/segmented-progress-bar/examples/storage-distribution.tsx +0 -41
  943. package/src/components/select/examples/native.tsx +0 -21
  944. package/src/components/select/examples/search-groups.tsx +0 -61
  945. package/src/components/select/examples/with-badge.tsx +0 -47
  946. package/src/components/slider/examples/basic.tsx +0 -6
  947. package/src/components/slider/examples/display-settings.tsx +0 -41
  948. package/src/components/stepper/examples/wizard.tsx +0 -62
  949. package/src/components/switch/examples/notification-settings.tsx +0 -37
  950. package/src/components/switch/examples/on-off.tsx +0 -15
  951. package/src/components/switch/examples/validation.tsx +0 -19
  952. package/src/components/tabs/examples/horizontal.tsx +0 -30
  953. package/src/components/tabs/examples/vertical.tsx +0 -101
  954. package/src/components/tag/COMPONENT.md +0 -179
  955. package/src/components/tag/examples/colors.tsx +0 -49
  956. package/src/components/tag/examples/examples.module.css +0 -47
  957. package/src/components/tag/examples/sizes.tsx +0 -23
  958. package/src/components/tag/examples/states.tsx +0 -19
  959. package/src/components/tag/examples/surfaces.tsx +0 -16
  960. package/src/components/tag/examples/with-icon.tsx +0 -29
  961. package/src/components/textarea/examples/height-and-limits.tsx +0 -45
  962. package/src/components/textarea/examples/hint-and-error.tsx +0 -21
  963. package/src/components/textarea/examples/reserved-support-row.tsx +0 -37
  964. package/src/components/textarea/examples/surfaces.tsx +0 -11
  965. package/src/components/textarea/examples/with-label.tsx +0 -22
  966. package/src/components/timeline/examples/hover-highlight.tsx +0 -48
  967. package/src/components/timeline/examples/in-card.tsx +0 -48
  968. package/src/components/timeline/examples/selectable.tsx +0 -58
  969. package/src/components/tooltip/examples/composition.tsx +0 -37
  970. package/src/components/tooltip/examples/side.tsx +0 -29
  971. package/src/components/tooltip/examples/states.tsx +0 -45
  972. package/src/components/typography/examples/as-prop.tsx +0 -25
  973. package/src/components/typography/examples/composition.tsx +0 -23
  974. package/src/components/typography/examples/full-width.tsx +0 -29
  975. package/src/components/typography/examples/reading-and-form.tsx +0 -35
  976. package/src/components/typography/examples/states.tsx +0 -23
  977. package/src/components/typography/examples/tones.tsx +0 -34
  978. package/src/components/typography/examples/variant-catalog.tsx +0 -41
  979. package/src/layout/app-shell/examples/with-sidebar.tsx +0 -63
  980. package/src/layout/sidebar/examples/modes.tsx +0 -55
  981. package/src/layout/sidebar/examples/responsive.tsx +0 -44
  982. package/src/layout/sidebar/examples/states.tsx +0 -34
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/internal/ControlSizeContext.tsx", "../src/internal/OverlayPortalLayerContext.tsx", "../src/layout/app-shell/AppShell.tsx", "../src/components/scroll-container/ScrollContainer.tsx", "../src/internal/cx.ts", "../src/components/scroll-container/ScrollContainer.module.css", "../src/internal/data-attributes.ts", "../src/internal/mergeRefs.ts", "../src/layout/app-shell/AppShell.module.css", "../src/layout/sidebar/Sidebar.tsx", "../src/components/tooltip/Tooltip.tsx", "../src/hooks/useControllableState.ts", "../src/hooks/useEscapeKey.ts", "../src/hooks/usePosition.ts", "../src/internal/layoutPxFromPrimitives.ts", "../src/hooks/usePresence.ts", "../src/internal/context.ts", "../src/internal/overlayMotion.module.css", "../src/internal/Portal.tsx", "../src/components/tooltip/Tooltip.module.css", "../src/hooks/useFocusTrap.ts", "../src/hooks/useOutsideClick.ts", "../src/hooks/useScrollLock.ts", "../src/hooks/useOverlayModal.ts", "../src/internal/slot.tsx", "../src/layout/sidebar/Sidebar.module.css", "../src/components/accordion/Accordion.tsx", "../src/components/accordion/Accordion.module.css", "../src/components/avatar/Avatar.tsx", "../src/components/avatar/Avatar.module.css", "../src/components/badge/Badge.tsx", "../src/components/badge/Badge.module.css", "../src/components/badge/tier.ts", "../src/components/banner/Banner.tsx", "../src/components/button/Button.tsx", "../src/components/button/Button.module.css", "../src/components/banner/Banner.module.css", "../src/components/breadcrumb/Breadcrumb.tsx", "../src/icons/index.ts", "../src/icons/Icon.tsx", "../src/internal/DividerContentContext.tsx", "../src/icons/Icon.module.css", "../src/components/link-button/LinkButton.tsx", "../src/components/link-button/LinkButton.module.css", "../src/components/breadcrumb/Breadcrumb.module.css", "../src/components/button-group/ButtonGroup.tsx", "../src/components/button-group/ButtonGroup.module.css", "../src/components/card/Card.tsx", "../src/components/card/Card.module.css", "../src/components/checkbox/Checkbox.tsx", "../src/components/hint/Hint.module.css", "../src/components/hint/Hint.tsx", "../src/components/label/Label.tsx", "../src/components/label/Label.module.css", "../src/hooks/useMergedRefs.ts", "../src/internal/useFieldDescriptions.ts", "../src/components/checkbox/Checkbox.module.css", "../src/components/code-block/CodeBlock.tsx", "../src/internal/highlightTsxHtml.ts", "../src/components/code-block/CodeBlock.module.css", "../src/components/color-picker/ColorPicker.tsx", "../src/components/input/Input.tsx", "../src/hooks/useFieldIds.ts", "../src/components/input/Input.module.css", "../src/components/select/Select.tsx", "../src/internal/FieldFrame.tsx", "../src/internal/FieldFrame.module.css", "../src/internal/scrollAncestors.ts", "../src/components/select/Select.module.css", "../src/components/select/selectIcons.tsx", "../src/components/select/selectListbox.ts", "../src/components/color-picker/ColorPicker.module.css", "../src/components/color-picker/ColorPresets.tsx", "../src/components/popover/Popover.tsx", "../src/components/popover/Popover.module.css", "../src/components/popover/usePopoverPosition.ts", "../src/components/popover/popoverGeometry.ts", "../src/components/color-picker/ColorPresets.module.css", "../src/components/command-menu/CommandMenu.tsx", "../src/components/modal/DialogParts.module.css", "../src/components/modal/Modal.tsx", "../src/hooks/useModalKeyboard.ts", "../src/components/modal/DialogParts.tsx", "../src/components/modal/Modal.module.css", "../src/components/modal/useInertSiblings.ts", "../src/components/command-menu/CommandMenu.module.css", "../src/components/data-table/DataTable.tsx", "../src/internal/runtimeUnits.ts", "../src/components/pagination/Pagination.tsx", "../src/components/pagination/Pagination.module.css", "../src/components/data-table/DataTable.module.css", "../src/components/datepicker/Datepicker.tsx", "../tokens/primitives.ts", "../src/components/datepicker/Datepicker.module.css", "../src/components/datepicker/datepickerModel.ts", "../src/components/digit-input/DigitInput.tsx", "../src/components/digit-input/DigitInput.module.css", "../src/components/divider/Divider.tsx", "../src/components/divider/Divider.module.css", "../src/components/drawer/Drawer.tsx", "../src/components/drawer/Drawer.module.css", "../src/components/dropdown/Dropdown.tsx", "../src/components/dropdown/Dropdown.module.css", "../src/components/dropdown/menuKeyboard.ts", "../src/components/dropdown/useDropdownPosition.ts", "../src/components/dropdown/dropdownGeometry.ts", "../src/components/empty-page/EmptyPage.tsx", "../src/components/empty-page/EmptyPage.module.css", "../src/components/example-frame/ExampleFrame.tsx", "../src/components/segmented-control/SegmentedControl.tsx", "../src/components/segmented-control/SegmentedControl.module.css", "../src/theme/applyTheme.ts", "../src/components/example-frame/ExampleFrame.module.css", "../src/components/file-upload/FileUpload.tsx", "../src/components/progress-bar/ProgressBar.tsx", "../src/components/progress-bar/ProgressBar.module.css", "../src/components/file-upload/FileUpload.module.css", "../src/components/kbd/Kbd.tsx", "../src/components/kbd/Kbd.module.css", "../src/components/notification/Notification.tsx", "../src/components/notification/Notification.module.css", "../src/components/notification/NotificationStore.tsx", "../src/components/page-content/PageContent.tsx", "../src/components/page-content/PageContent.module.css", "../src/components/progress-circle/ProgressCircle.tsx", "../src/components/progress-circle/ProgressCircle.module.css", "../src/components/radio/Radio.tsx", "../src/components/radio/Radio.module.css", "../src/components/segmented-progress-bar/SegmentedProgressBar.tsx", "../src/components/segmented-progress-bar/SegmentedProgressBar.module.css", "../src/components/slider/Slider.tsx", "../src/components/slider/Slider.module.css", "../src/components/stepper/Stepper.tsx", "../src/components/stepper/Stepper.module.css", "../src/components/switch/Switch.tsx", "../src/components/switch/Switch.module.css", "../src/components/tabs/Tabs.tsx", "../src/components/tabs/Tabs.module.css", "../src/components/tag/Tag.tsx", "../src/components/tag/Tag.module.css", "../src/components/tag-select/TagSelect.tsx", "../src/components/tag-select/TagSelect.module.css", "../src/components/textarea/Textarea.tsx", "../src/components/textarea/Textarea.module.css", "../src/components/timeline/Timeline.tsx", "../src/components/timeline/Timeline.module.css", "../src/components/typography/Typography.tsx", "../src/components/typography/Typography.module.css", "../src/internal/states.ts"],
4
- "sourcesContent": ["import * as React from \"react\";\n\nimport type { ControlSize } from \"@/internal/states\";\n\nconst ControlSizeContext = React.createContext<ControlSize | null>(null);\nControlSizeContext.displayName = \"ControlSizeContext\";\n\nexport type ControlSizeProviderProps = {\n value: ControlSize;\n children: React.ReactNode;\n};\n\nexport function ControlSizeProvider({ value, children }: ControlSizeProviderProps) {\n return <ControlSizeContext.Provider value={value}>{children}</ControlSizeContext.Provider>;\n}\n\nControlSizeProvider.displayName = \"ControlSizeProvider\";\n\n/** \u0414\u043B\u044F `Icon`: \u0435\u0441\u043B\u0438 `size` \u043D\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u043D \u044F\u0432\u043D\u043E, \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0433\u043E \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0430. */\nexport function useOptionalControlSize(): ControlSize | undefined {\n return React.useContext(ControlSizeContext) ?? undefined;\n}\n", "import * as React from \"react\";\n\n/**\n * \u0421\u043B\u043E\u0439 \u0434\u043B\u044F \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430, \u043F\u043E\u0440\u0442\u0430\u043B\u0438\u0440\u0443\u0435\u043C\u043E\u0433\u043E \u0432 `document.body` (Popover, Dropdown, Select, Tooltip).\n * \u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 `page`; \u0432\u043D\u0443\u0442\u0440\u0438 `Drawer` / `Modal` \u2014 \u0432\u044B\u0448\u0435 \u0447\u0438\u0441\u043B\u043E\u0432\u044B\u0445 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u043E\u0431\u043E\u043B\u043E\u0447\u043A\u0438, \u0441\u043C. `tokens/primitives` \u2192 `zIndex`.\n */\nexport type OverlayPortalLayer = \"page\" | \"drawer\" | \"modal\" | \"drawerInModal\";\n\nconst OverlayPortalLayerContext = React.createContext<OverlayPortalLayer>(\"page\");\n\nexport type OverlayPortalLayerProviderProps = {\n value: OverlayPortalLayer;\n children: React.ReactNode;\n};\n\nexport function OverlayPortalLayerProvider({ value, children }: OverlayPortalLayerProviderProps) {\n return (\n <OverlayPortalLayerContext.Provider value={value}>\n {children}\n </OverlayPortalLayerContext.Provider>\n );\n}\n\nexport function useOverlayPortalLayer(): OverlayPortalLayer {\n return React.useContext(OverlayPortalLayerContext);\n}\n", "import * as React from \"react\";\nimport { useInRouterContext, useLocation } from \"react-router-dom\";\n\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\n\nimport styles from \"./AppShell.module.css\";\n\nexport type AppShellRootProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Viewport-high shell: only `AppShell.Main` scrolls. Otherwise the document scrolls. */\n fillViewport?: boolean;\n};\n\nexport type AppShellNavProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Navigation column (usually `Sidebar.Root`); sits on the canvas. */\nfunction AppShellNav({ className, ...rest }: AppShellNavProps) {\n return <div {...rest} className={cx(styles.nav, className)} />;\n}\nAppShellNav.displayName = \"AppShell.Nav\";\n\n/**\n * Grid: navigation column | content panel. Everything that is not `AppShell.Nav` goes into the\n * content panel (`bg-surface`, inset from the window on wide screens).\n */\nconst AppShellRoot = React.forwardRef<HTMLDivElement, AppShellRootProps>(function AppShellRoot(\n { fillViewport = false, className, children, ...rest },\n ref,\n) {\n const items = React.Children.toArray(children);\n const isNav = (child: React.ReactNode) =>\n React.isValidElement(child) && child.type === AppShellNav;\n const nav = items.filter(isNav);\n const panel = items.filter((child) => !isNav(child));\n\n return (\n <div\n {...rest}\n ref={ref}\n className={cx(styles.root, className)}\n {...toDataAttributes({ \"fill-viewport\": fillViewport || undefined })}\n >\n {nav}\n <div className={styles.panel}>{panel}</div>\n </div>\n );\n});\nAppShellRoot.displayName = \"AppShell.Root\";\n\nexport type AppShellHeaderProps = React.HTMLAttributes<HTMLElement>;\n\n/** Top bar of the content panel (breadcrumbs, page actions, mobile menu button). Sticky. */\nconst AppShellHeader = React.forwardRef<HTMLElement, AppShellHeaderProps>(function AppShellHeader(\n { className, ...rest },\n ref,\n) {\n return <header {...rest} ref={ref} className={cx(styles.header, className)} />;\n});\nAppShellHeader.displayName = \"AppShell.Header\";\n\n/** `full` (default): the whole panel with responsive gutters; `contained`: centered, up to `--prime-layout-content-max-width` (long-read pages). */\nexport type AppShellContentWidth = \"contained\" | \"full\";\n\nexport type AppShellMainProps = React.HTMLAttributes<HTMLElement> & {\n contentWidth?: AppShellContentWidth;\n};\n\n/** `<main>` with the canonical gutters; scrolls inside the panel when `fillViewport` is set. */\nconst AppShellMain = React.forwardRef<HTMLElement, AppShellMainProps>(function AppShellMain(\n { contentWidth = \"full\", className, children, ...rest },\n ref,\n) {\n return (\n <ScrollContainer\n {...rest}\n as=\"main\"\n ref={ref}\n axis=\"vertical\"\n overscrollBehavior=\"contain\"\n className={cx(styles.main, className)}\n data-content-width={contentWidth}\n >\n {children}\n </ScrollContainer>\n );\n});\nAppShellMain.displayName = \"AppShell.Main\";\n\nfunction RouteScrollReset({ mainRef }: { mainRef: React.RefObject<HTMLElement | null> }) {\n const { pathname } = useLocation();\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset main scroll on route change\n React.useLayoutEffect(() => {\n mainRef.current?.scrollTo(0, 0);\n }, [pathname]);\n return null;\n}\n\nexport type AppShellTemplateProps = Omit<AppShellRootProps, \"children\"> & {\n /** Navigation column content, usually `Sidebar.Root`. */\n nav?: React.ReactNode;\n /** `AppShell.Header` content; no header row when omitted. */\n header?: React.ReactNode;\n children?: React.ReactNode;\n mainProps?: Omit<AppShellMainProps, \"children\">;\n};\n\n/** Root + Nav + Header + Main in one; inside a router, main scrolls to top on route change. */\nconst AppShellTemplate = React.forwardRef<HTMLElement, AppShellTemplateProps>(\n function AppShellTemplate({ nav, header, children, mainProps, ...rootProps }, ref) {\n const mainRef = React.useRef<HTMLElement>(null);\n const setMainRef = React.useMemo(() => mergeRefs(mainRef, ref), [ref]);\n const inRouter = useInRouterContext();\n\n return (\n <AppShellRoot {...rootProps}>\n {nav == null ? null : <AppShellNav>{nav}</AppShellNav>}\n {header == null ? null : <AppShellHeader>{header}</AppShellHeader>}\n <AppShellMain {...mainProps} ref={setMainRef}>\n {children}\n {inRouter ? <RouteScrollReset mainRef={mainRef} /> : null}\n </AppShellMain>\n </AppShellRoot>\n );\n },\n);\nAppShellTemplate.displayName = \"AppShell.Template\";\n\nexport const AppShell = {\n Root: AppShellRoot,\n Nav: AppShellNav,\n Header: AppShellHeader,\n Main: AppShellMain,\n Template: AppShellTemplate,\n};\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\n\nimport styles from \"./ScrollContainer.module.css\";\n\nexport type ScrollContainerAxis = \"vertical\" | \"horizontal\" | \"both\";\n\nexport type ScrollContainerProps = Omit<React.HTMLAttributes<HTMLElement>, \"className\"> & {\n /** Root element. Default `div`; `AppShell.Main` renders `main`. */\n as?: \"div\" | \"main\" | \"aside\" | \"section\" | \"nav\" | \"article\";\n /** Scroll axis. Default `vertical`. */\n axis?: ScrollContainerAxis;\n /** `overscroll-behavior`. Default `contain`: nested panels do not chain scroll into the page. */\n overscrollBehavior?: \"auto\" | \"contain\" | \"none\";\n className?: string;\n};\n\nconst axisClass: Record<ScrollContainerAxis, string> = {\n vertical: styles.vertical,\n horizontal: styles.horizontal,\n both: styles.both,\n};\n\n/** Scroll region with the kit's thin scrollbars; shrinks inside flex/grid parents. */\nconst ScrollContainer = React.forwardRef<HTMLElement, ScrollContainerProps>(\n function ScrollContainer(\n {\n as: Component = \"div\",\n axis = \"vertical\",\n overscrollBehavior = \"contain\",\n className,\n ...rest\n },\n ref,\n ) {\n return (\n <Component\n ref={ref as never}\n className={cx(\n styles.root,\n axisClass[axis],\n overscrollBehavior === \"contain\" && styles.overscrollContain,\n overscrollBehavior === \"none\" && styles.overscrollNone,\n className,\n )}\n {...rest}\n />\n );\n },\n);\n\nScrollContainer.displayName = \"ScrollContainer\";\n\nexport { ScrollContainer };\n", "export function cx(...classNames: Array<string | false | null | undefined>): string {\n return classNames.filter(Boolean).join(\" \");\n}\n", "/*\n * Thin, quiet scrollbars: thumb in `fill-strong`, transparent track. Standard properties win in\n * Firefox and Chromium 121+; the WebKit pseudo-elements cover Safari.\n */\n.root {\n box-sizing: border-box;\n /* Lets the region shrink inside a flex/grid parent instead of growing with its content. */\n min-width: 0;\n min-height: 0;\n /*\n * No padding of its own: a neutral scroll primitive. The host decides (foundation \u00A77):\n * either it pads by at least --prime-focus-space, or its edge content is full-bleed and\n * uses inset focus rings (tables, lists).\n */\n scrollbar-width: thin;\n scrollbar-color: var(--prime-color-fill-strong) transparent;\n}\n\n.root::-webkit-scrollbar {\n width: var(--prime-space-2);\n height: var(--prime-space-2);\n}\n\n.root::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.root::-webkit-scrollbar-thumb {\n border: calc(var(--prime-space-1) / 2) solid transparent;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n background-clip: padding-box;\n}\n\n.root::-webkit-scrollbar-thumb:hover {\n background-color: var(--prime-color-fill-strong-hover);\n}\n\n.root::-webkit-scrollbar-corner {\n background: transparent;\n}\n\n.vertical {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.horizontal {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n.both {\n overflow: auto;\n}\n\n.overscrollContain {\n overscroll-behavior: contain;\n}\n\n.overscrollNone {\n overscroll-behavior: none;\n}\n", "type DataPrimitive = string | number | boolean | undefined;\n\ntype DataAttributesInput = Record<string, DataPrimitive>;\ntype DataAttributesOutput = Record<string, string | undefined>;\n\nexport function toDataAttributes(input: DataAttributesInput): DataAttributesOutput {\n const result: DataAttributesOutput = {};\n\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined) {\n continue;\n }\n\n const attributeName = `data-${key}`;\n result[attributeName] = typeof value === \"boolean\" ? String(value) : `${value}`;\n }\n\n return result;\n}\n", "import type * as React from \"react\";\n\n/** Composes multiple refs (callback or object) into one callback \u2014 same idea as Radix `composeRefs`. */\nexport function mergeRefs<T>(...refs: Array<React.Ref<T> | undefined>): React.RefCallback<T> {\n return (value) => {\n for (const ref of refs) {\n if (ref == null) continue;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n }\n };\n}\n", "/*\n * App shell: two full-height planes edge to edge \u2014 the navigation column on the canvas and the\n * content plane on the surface. No inset, radius, shadow or border: the boundary is the fill\n * change. Gutters inside the content plane: 16 \u2192 24 from 640px \u2192 32 from 1024px; top air\n * 24 \u2192 40 from 1024px.\n */\n\n.root {\n --shell-gutter: var(--prime-layout-gutter-s);\n --shell-top: var(--prime-space-6);\n\n box-sizing: border-box;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n width: 100%;\n min-width: 0;\n min-height: 100dvh;\n background: var(--prime-color-bg-canvas);\n color: var(--prime-color-text-primary);\n}\n\n.root:not(:has(> .nav)) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.root[data-fill-viewport=\"true\"] {\n height: 100dvh;\n min-height: 0;\n overflow: hidden;\n}\n\n@media (min-width: 640px) {\n .root {\n --shell-gutter: var(--prime-layout-gutter-m);\n }\n}\n\n@media (min-width: 1024px) {\n .root {\n --shell-gutter: var(--prime-layout-gutter-l);\n --shell-top: var(--prime-space-10);\n }\n}\n\n.nav {\n position: sticky;\n top: 0;\n box-sizing: border-box;\n display: flex;\n height: 100dvh;\n min-width: 0;\n}\n\n.root[data-fill-viewport=\"true\"] > .nav {\n position: static;\n height: 100%;\n min-height: 0;\n}\n\n.panel {\n /* Surface context: fields use the surface fill, cards become sunken tiles (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n --prime-color-card-bg: var(--prime-color-bg-sunken);\n --prime-card-shadow: none;\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: clip;\n background: var(--prime-color-bg-surface);\n color: var(--prime-color-text-primary);\n}\n\n.header {\n position: sticky;\n top: 0;\n z-index: var(--prime-z-sticky);\n box-sizing: border-box;\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--prime-space-3);\n min-width: 0;\n min-height: calc(var(--prime-control-m-height) + 2 * var(--prime-space-3));\n padding-block: var(--prime-space-3);\n padding-inline: var(--shell-gutter);\n background: var(--prime-color-bg-surface);\n}\n\n/*\n * Percent padding resolves against the panel width, so `contained` centers content without a\n * wrapper element.\n */\n.main {\n box-sizing: border-box;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n margin: 0;\n padding-block: var(--shell-top) var(--prime-space-16);\n /* Default: the whole panel, only the responsive gutters. */\n padding-inline: var(--shell-gutter);\n}\n\n/* Long-read pages: a centered column up to the content max width. */\n.main[data-content-width=\"contained\"] {\n padding-inline: max(\n var(--shell-gutter),\n calc((100% - var(--prime-layout-content-max-width)) / 2)\n );\n}\n", "import { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Tooltip } from \"@/components/tooltip/Tooltip\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useOverlayModal } from \"@/hooks/useOverlayModal\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { Slot } from \"@/internal/slot\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Sidebar.module.css\";\n\n/** Desktop rail mode: full width, icon rail, or collapsed to zero width. */\nexport type SidebarMode = \"expanded\" | \"compact\" | \"hidden\";\n\nexport type SidebarLabels = {\n /** `aria-label` of the `<nav>` landmark. */\n navigation: string;\n /** Toggle label while the rail is expanded. */\n collapse: string;\n /** Toggle label while the rail is compact or hidden. */\n expand: string;\n /** Toggle label inside the off-canvas panel, and the scrim's label. */\n close: string;\n};\n\nconst defaultLabels: SidebarLabels = {\n navigation: \"\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F\",\n collapse: \"\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C\",\n expand: \"\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C\",\n close: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044E\",\n};\n\n/** Below this width a `responsive` sidebar leaves the layout and becomes an off-canvas panel. */\nconst MOBILE_QUERY = \"(max-width: 767.98px)\";\n\ntype SidebarContextValue = {\n mode: SidebarMode;\n setMode: (mode: SidebarMode) => void;\n /** Off-canvas panel state (narrow viewports only). */\n open: boolean;\n setOpen: (open: boolean) => void;\n /** expanded \u2194 compact on desktop (hidden \u2192 expanded); open \u2194 closed off-canvas. */\n toggle: () => void;\n /** True while the sidebar is off-canvas (responsive and the viewport is narrower than 768px). */\n isMobile: boolean;\n size: ControlSize;\n navId: string;\n labels: SidebarLabels;\n};\n\nconst [SidebarProvider, useSidebar] = createComponentContext<SidebarContextValue>(\"Sidebar\");\n\nexport { useSidebar };\n\nfunction useMediaQuery(query: string, enabled: boolean): boolean {\n const subscribe = React.useCallback(\n (onChange: () => void) => {\n if (!enabled || typeof window === \"undefined\" || !window.matchMedia) return () => {};\n const mq = window.matchMedia(query);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n },\n [enabled, query],\n );\n const getSnapshot = () =>\n enabled && typeof window !== \"undefined\" && !!window.matchMedia\n ? window.matchMedia(query).matches\n : false;\n return React.useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SidebarRootProps = Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n children?: React.ReactNode;\n /** Item tier: height, icon and text of `--prime-control-<size>-*`. */\n size?: ControlSize;\n mode?: SidebarMode;\n defaultMode?: SidebarMode;\n onModeChange?: (mode: SidebarMode) => void;\n /** Off-canvas panel on narrow viewports (responsive only). */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Below 768px the rail becomes an off-canvas panel with a scrim and a focus trap. */\n responsive?: boolean;\n labels?: Partial<SidebarLabels>;\n};\n\nconst SidebarRoot = React.forwardRef<HTMLDivElement, SidebarRootProps>(function SidebarRoot(\n {\n children,\n className,\n size = \"m\",\n mode: modeProp,\n defaultMode = \"expanded\",\n onModeChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n responsive = true,\n labels: labelsProp,\n ...rest\n },\n ref,\n) {\n const labels = React.useMemo(() => ({ ...defaultLabels, ...labelsProp }), [labelsProp]);\n const isMobile = useMediaQuery(MOBILE_QUERY, responsive);\n\n const [mode, setMode] = useControllableState<SidebarMode>({\n value: modeProp,\n defaultValue: defaultMode,\n onChange: onModeChange,\n });\n const [openState, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const open = isMobile && openState;\n\n // Leaving the narrow viewport closes the off-canvas panel.\n React.useEffect(() => {\n if (!isMobile) setOpen(false);\n }, [isMobile, setOpen]);\n\n /*\n * While hidden the panel keeps the width of the last visible mode, so it clips out (and back\n * in) as one piece instead of reflowing its items.\n */\n const lastVisibleRef = React.useRef<Exclude<SidebarMode, \"hidden\">>(\n mode === \"hidden\" ? \"expanded\" : mode,\n );\n if (mode !== \"hidden\") lastVisibleRef.current = mode;\n\n const close = React.useCallback(() => setOpen(false), [setOpen]);\n const panelRef = useOverlayModal<HTMLElement>(open, close);\n\n const toggle = React.useCallback(() => {\n if (isMobile) {\n setOpen((prev) => !prev);\n return;\n }\n setMode((prev) => (prev === \"expanded\" ? \"compact\" : \"expanded\"));\n }, [isMobile, setMode, setOpen]);\n\n const navId = React.useId();\n\n const context = React.useMemo<SidebarContextValue>(\n () => ({ mode, setMode, open, setOpen, toggle, isMobile, size, navId, labels }),\n [mode, setMode, open, setOpen, toggle, isMobile, size, navId, labels],\n );\n\n return (\n <SidebarProvider value={context}>\n <div\n {...rest}\n ref={ref}\n className={cx(styles.root, className)}\n {...toDataAttributes({\n size,\n mode,\n \"panel-mode\": mode === \"hidden\" ? lastVisibleRef.current : mode,\n mobile: isMobile || undefined,\n state: isMobile ? (open ? \"open\" : \"closed\") : undefined,\n })}\n >\n {isMobile ? (\n <button\n type=\"button\"\n className={styles.scrim}\n aria-label={labels.close}\n tabIndex={-1}\n onClick={close}\n />\n ) : null}\n <nav\n ref={panelRef as React.Ref<HTMLElement>}\n id={navId}\n className={styles.panel}\n aria-label={labels.navigation}\n inert={(isMobile && !open) || (!isMobile && mode === \"hidden\") || undefined}\n >\n {children}\n </nav>\n </div>\n </SidebarProvider>\n );\n});\nSidebarRoot.displayName = \"Sidebar.Root\";\n\n// \u2500\u2500\u2500 Regions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SidebarHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\n\nfunction SidebarHeader({ className, ...rest }: SidebarHeaderProps) {\n return <div {...rest} className={cx(styles.header, className)} />;\n}\nSidebarHeader.displayName = \"Sidebar.Header\";\n\nexport type SidebarContentProps = React.ComponentPropsWithoutRef<\"div\">;\n\n/** Scrolling middle region. */\nconst SidebarContent = React.forwardRef<HTMLDivElement, SidebarContentProps>(\n function SidebarContent({ className, ...rest }, ref) {\n return <div {...rest} ref={ref} className={cx(styles.content, className)} />;\n },\n);\nSidebarContent.displayName = \"Sidebar.Content\";\n\nexport type SidebarFooterProps = React.ComponentPropsWithoutRef<\"div\">;\n\nfunction SidebarFooter({ className, ...rest }: SidebarFooterProps) {\n return <div {...rest} className={cx(styles.footer, className)} />;\n}\nSidebarFooter.displayName = \"Sidebar.Footer\";\n\nexport type SidebarGroupProps = Omit<React.ComponentPropsWithoutRef<\"div\">, \"role\"> & {\n /** Group heading. In compact mode it fades out and leaves its spacing. */\n label?: React.ReactNode;\n};\n\nfunction SidebarGroup({ className, label, children, ...rest }: SidebarGroupProps) {\n const labelId = React.useId();\n return (\n // biome-ignore lint/a11y/useSemanticElements: a nav group of links, not a form fieldset\n <div\n {...rest}\n role=\"group\"\n aria-labelledby={label === undefined ? undefined : labelId}\n className={cx(styles.group, className)}\n >\n {label === undefined ? null : (\n <div id={labelId} className={styles.groupLabel}>\n {label}\n </div>\n )}\n {children}\n </div>\n );\n}\nSidebarGroup.displayName = \"Sidebar.Group\";\n\n// \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction textOf(node: React.ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n return textOf(node.props.children);\n }\n return \"\";\n}\n\ntype ItemInnerProps = {\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n shortcut?: React.ReactNode;\n children?: React.ReactNode;\n};\n\nfunction ItemInner({ icon, badge, shortcut, children }: ItemInnerProps) {\n return (\n <>\n {icon === undefined ? null : (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className={styles.label}>{children}</span>\n {badge === undefined || badge === null ? null : <span className={styles.badge}>{badge}</span>}\n {shortcut === undefined ? null : (\n <span className={styles.shortcut} aria-hidden=\"true\">\n {shortcut}\n </span>\n )}\n </>\n );\n}\n\n/**\n * Wraps an item in a tooltip that opens only in compact mode. The tooltip is always mounted so\n * switching modes never remounts the item (focus stays on it).\n */\nfunction CompactTooltip({ text, children }: { text: string; children: React.ReactElement }) {\n const { mode, isMobile } = useSidebar();\n const enabled = mode === \"compact\" && !isMobile && text.length > 0;\n const [open, setOpen] = React.useState(false);\n return (\n <Tooltip.Root\n open={enabled && open}\n onOpenChange={(next) => setOpen(enabled && next)}\n delayDuration={0}\n >\n {/* Slot keeps the item's own ref: Tooltip.Trigger replaces the child's ref. */}\n <Tooltip.Trigger>\n <Slot>{children}</Slot>\n </Tooltip.Trigger>\n <Tooltip.Content side=\"right\">{text}</Tooltip.Content>\n </Tooltip.Root>\n );\n}\n\ntype SidebarItemOwnProps = {\n /** Leading icon; stays in place in every mode. */\n icon?: React.ReactNode;\n /** Counter or status; in compact mode it becomes a dot on the icon. */\n badge?: React.ReactNode;\n /** Keyboard hint (e.g. `<Kbd>`); hidden in compact mode. */\n shortcut?: React.ReactNode;\n /** Current page. Links rendered by a router may set `aria-current=\"page\"` instead. */\n active?: boolean;\n disabled?: boolean;\n /**\n * Render the single child element (e.g. a router link) as the item; its children become the\n * label.\n */\n asChild?: boolean;\n children?: React.ReactNode;\n};\n\nexport type SidebarItemProps = SidebarItemOwnProps &\n Omit<React.ComponentPropsWithoutRef<\"button\">, keyof SidebarItemOwnProps> & {\n /** Renders an `<a>` instead of a `<button>`. */\n href?: string;\n target?: string;\n rel?: string;\n };\n\nconst SidebarItem = React.forwardRef<HTMLElement, SidebarItemProps>(function SidebarItem(\n {\n icon,\n badge,\n shortcut,\n active = false,\n disabled = false,\n asChild = false,\n href,\n className,\n children,\n onClick,\n type,\n ...rest\n },\n ref,\n) {\n const { isMobile, setOpen } = useSidebar();\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n onClick?.(event as React.MouseEvent<HTMLButtonElement>);\n // Navigating from the off-canvas panel closes it.\n if (!event.defaultPrevented && isMobile && (href !== undefined || asChild)) setOpen(false);\n };\n\n const shared = {\n ...rest,\n className: cx(styles.item, className),\n onClick: handleClick,\n \"aria-current\": active ? (\"page\" as const) : rest[\"aria-current\"],\n ...toDataAttributes({\n state: active ? \"active\" : undefined,\n disabled: disabled || undefined,\n }),\n };\n\n let element: React.ReactElement;\n let labelSource: React.ReactNode = children;\n\n if (asChild && React.isValidElement<{ children?: React.ReactNode }>(children)) {\n labelSource = children.props.children;\n element = (\n <Slot {...shared} ref={ref} aria-disabled={disabled || undefined}>\n {React.cloneElement(\n children,\n undefined,\n <ItemInner icon={icon} badge={badge} shortcut={shortcut}>\n {children.props.children}\n </ItemInner>,\n )}\n </Slot>\n );\n } else if (href !== undefined) {\n element = (\n <a\n {...(shared as React.ComponentPropsWithoutRef<\"a\">)}\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={disabled ? undefined : href}\n aria-disabled={disabled || undefined}\n >\n <ItemInner icon={icon} badge={badge} shortcut={shortcut}>\n {children}\n </ItemInner>\n </a>\n );\n } else {\n element = (\n <button\n {...shared}\n ref={ref as React.Ref<HTMLButtonElement>}\n type={type ?? \"button\"}\n disabled={disabled}\n >\n <ItemInner icon={icon} badge={badge} shortcut={shortcut}>\n {children}\n </ItemInner>\n </button>\n );\n }\n\n const tooltipText = textOf(labelSource).trim() || (rest[\"aria-label\"] ?? \"\");\n return <CompactTooltip text={tooltipText}>{element}</CompactTooltip>;\n});\nSidebarItem.displayName = \"Sidebar.Item\";\n\n// \u2500\u2500\u2500 Toggle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SidebarToggleProps = Omit<\n React.ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"aria-label\" | \"aria-expanded\" | \"aria-controls\"\n>;\n\n/**\n * Item-shaped toggle: expanded \u2194 compact on desktop (hidden \u2192 expanded), closes the panel\n * off-canvas. Its label comes from `labels`.\n */\nconst SidebarToggle = React.forwardRef<HTMLButtonElement, SidebarToggleProps>(\n function SidebarToggle({ className, onClick, ...rest }, ref) {\n const { mode, isMobile, open, toggle, navId, labels } = useSidebar();\n const expanded = isMobile ? open : mode === \"expanded\";\n const label = isMobile ? labels.close : expanded ? labels.collapse : labels.expand;\n\n return (\n <CompactTooltip text={label}>\n <button\n {...rest}\n ref={ref}\n type=\"button\"\n className={cx(styles.item, className)}\n aria-expanded={expanded}\n aria-controls={navId}\n aria-label={label}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) toggle();\n }}\n >\n <ItemInner icon={expanded ? <PanelLeftClose /> : <PanelLeftOpen />}>{label}</ItemInner>\n </button>\n </CompactTooltip>\n );\n },\n);\nSidebarToggle.displayName = \"Sidebar.Toggle\";\n\nexport const Sidebar = {\n Root: SidebarRoot,\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Group: SidebarGroup,\n Item: SidebarItem,\n Toggle: SidebarToggle,\n};\n", "import * as React from \"react\";\n\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { getPanelOffsetPx, getViewportPadPx } from \"@/hooks/usePosition\";\nimport { usePresence } from \"@/hooks/usePresence\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { useOverlayPortalLayer } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Tooltip.module.css\";\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n// \u2500\u2500\u2500 Provider Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype TooltipProviderContextValue = {\n delayDuration: number;\n};\n\nconst TooltipProviderContext = React.createContext<TooltipProviderContextValue>({\n delayDuration: 400,\n});\n\n// \u2500\u2500\u2500 Root Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype TooltipRootContextValue = {\n isOpen: boolean;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentId: string;\n handleOpen: () => void;\n handleClose: () => void;\n};\n\nconst [TooltipRootProvider, useTooltipRootContext] =\n createComponentContext<TooltipRootContextValue>(\"Tooltip\");\n\n// \u2500\u2500\u2500 Provider \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TooltipProviderProps = {\n delayDuration?: number;\n children: React.ReactNode;\n};\n\nfunction TooltipProvider({ delayDuration = 400, children }: TooltipProviderProps) {\n const value = React.useMemo(() => ({ delayDuration }), [delayDuration]);\n return (\n <TooltipProviderContext.Provider value={value}>{children}</TooltipProviderContext.Provider>\n );\n}\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TooltipRootProps = {\n children: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** \u0417\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u043F\u043E\u043A\u0430\u0437\u0430 (\u043C\u0441) \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0442\u0443\u043B\u0442\u0438\u043F\u0430; \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0438\u0437 `Tooltip.Provider` (400). */\n delayDuration?: number;\n};\n\nfunction TooltipRoot({\n children,\n open,\n defaultOpen,\n onOpenChange,\n delayDuration: delayProp,\n}: TooltipRootProps) {\n const providerDelay = React.useContext(TooltipProviderContext).delayDuration;\n const delayDuration = delayProp ?? providerDelay;\n\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout>>(undefined);\n const contentId = React.useId();\n\n const handleOpen = React.useCallback(() => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => setIsOpen(true), delayDuration);\n }, [delayDuration, setIsOpen]);\n\n const handleClose = React.useCallback(() => {\n clearTimeout(timeoutRef.current);\n setIsOpen(false);\n }, [setIsOpen]);\n\n React.useEffect(() => {\n return () => clearTimeout(timeoutRef.current);\n }, []);\n\n /* WAI-ARIA tooltip: Escape \u0441\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0443, \u0444\u043E\u043A\u0443\u0441 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043D\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0435. */\n useEscapeKey({ enabled: isOpen, onEscape: handleClose });\n\n return (\n <TooltipRootProvider value={{ isOpen, triggerRef, contentId, handleOpen, handleClose }}>\n {children}\n </TooltipRootProvider>\n );\n}\n\n// \u2500\u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TooltipTriggerProps = {\n children: React.ReactElement;\n className?: string;\n};\n\nfunction TooltipTrigger({ children, className }: TooltipTriggerProps) {\n const { isOpen, triggerRef, contentId, handleOpen, handleClose } = useTooltipRootContext();\n const props = children.props as React.HTMLAttributes<HTMLElement> & {\n ref?: React.Ref<HTMLElement>;\n };\n\n return React.cloneElement(\n children as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>\n >,\n {\n ref: triggerRef,\n className: cx(props.className, className) || undefined,\n \"aria-describedby\":\n [props[\"aria-describedby\"], isOpen ? contentId : undefined].filter(Boolean).join(\" \") ||\n undefined,\n ...toDataAttributes({ state: isOpen ? \"open\" : \"closed\" }),\n onMouseEnter: (e: React.MouseEvent<HTMLElement>) => {\n props.onMouseEnter?.(e);\n handleOpen();\n },\n onMouseLeave: (e: React.MouseEvent<HTMLElement>) => {\n props.onMouseLeave?.(e);\n handleClose();\n },\n onFocus: (e: React.FocusEvent<HTMLElement>) => {\n props.onFocus?.(e);\n handleOpen();\n },\n onBlur: (e: React.FocusEvent<HTMLElement>) => {\n props.onBlur?.(e);\n handleClose();\n },\n },\n );\n}\n\n// \u2500\u2500\u2500 Positioning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype TooltipCoords = { top: number; left: number; side: TooltipSide };\n\nconst OPPOSITE: Record<TooltipSide, TooltipSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/** \u041F\u043E\u0437\u0438\u0446\u0438\u044F \u043F\u043E \u0441\u0442\u043E\u0440\u043E\u043D\u0435; \u0435\u0441\u043B\u0438 \u043D\u0435 \u0432\u043B\u0435\u0437\u0430\u0435\u0442 \u2014 \u043F\u0440\u043E\u0442\u0438\u0432\u043E\u043F\u043E\u043B\u043E\u0436\u043D\u0430\u044F \u0441\u0442\u043E\u0440\u043E\u043D\u0430; \u0437\u0430\u0442\u0435\u043C \u0441\u0434\u0432\u0438\u0433 \u0432 \u043F\u0440\u0435\u0434\u0435\u043B\u0430\u0445 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430. */\nexport function computeTooltipPosition(\n ar: Pick<DOMRectReadOnly, \"top\" | \"left\" | \"right\" | \"bottom\" | \"width\" | \"height\">,\n cw: number,\n ch: number,\n vw: number,\n vh: number,\n side: TooltipSide,\n offset: number,\n pad: number,\n): TooltipCoords {\n const place = (s: TooltipSide) => {\n switch (s) {\n case \"top\":\n return { top: ar.top - ch - offset, left: ar.left + ar.width / 2 - cw / 2 };\n case \"bottom\":\n return { top: ar.bottom + offset, left: ar.left + ar.width / 2 - cw / 2 };\n case \"left\":\n return { top: ar.top + ar.height / 2 - ch / 2, left: ar.left - cw - offset };\n case \"right\":\n return { top: ar.top + ar.height / 2 - ch / 2, left: ar.right + offset };\n }\n };\n const fits = (s: TooltipSide, p: { top: number; left: number }) =>\n s === \"top\" || s === \"bottom\"\n ? p.top >= pad && p.top + ch <= vh - pad\n : p.left >= pad && p.left + cw <= vw - pad;\n\n let resolved = side;\n let pos = place(side);\n if (!fits(side, pos)) {\n const alt = OPPOSITE[side];\n const altPos = place(alt);\n if (fits(alt, altPos)) {\n resolved = alt;\n pos = altPos;\n }\n }\n\n return {\n top: Math.round(Math.max(pad, Math.min(pos.top, vh - ch - pad))),\n left: Math.round(Math.max(pad, Math.min(pos.left, vw - cw - pad))),\n side: resolved,\n };\n}\n\n// \u2500\u2500\u2500 Content \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TooltipContentProps = {\n children: React.ReactNode;\n size?: ControlSize;\n side?: TooltipSide;\n className?: string;\n};\n\nfunction TooltipContent({ children, size = \"m\", side = \"top\", className }: TooltipContentProps) {\n const { isOpen, triggerRef, contentId } = useTooltipRootContext();\n const overlayPortalLayer = useOverlayPortalLayer();\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const [coords, setCoords] = React.useState<TooltipCoords | null>(null);\n // Pointer-leave / blur / Escape close it with the shared fade-out (Overlay contract).\n const presence = usePresence(isOpen, { exitDuration: \"fast\" });\n const mounted = presence.mounted;\n\n React.useEffect(() => {\n if (!mounted) {\n setCoords(null);\n return;\n }\n\n const update = () => {\n const anchor = triggerRef.current;\n const content = contentRef.current;\n if (!anchor || !content) return;\n const cr = content.getBoundingClientRect();\n setCoords(\n computeTooltipPosition(\n anchor.getBoundingClientRect(),\n cr.width,\n cr.height,\n window.innerWidth,\n window.innerHeight,\n side,\n getPanelOffsetPx(),\n getViewportPadPx(),\n ),\n );\n };\n\n const frameId = requestAnimationFrame(update);\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n\n return () => {\n cancelAnimationFrame(frameId);\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [mounted, triggerRef, side]);\n\n if (!mounted) return null;\n\n const positionStyle: React.CSSProperties = {\n position: \"fixed\",\n top: coords?.top ?? 0,\n left: coords?.left ?? 0,\n };\n\n return (\n <Portal>\n <div\n ref={contentRef}\n id={contentId}\n role=\"tooltip\"\n data-overlay-portal-layer={overlayPortalLayer}\n className={cx(styles.content, overlayMotion.floating, className)}\n style={positionStyle}\n onAnimationEnd={presence.onExitEnd}\n {...toDataAttributes({\n state: presence.state,\n size,\n /* Resolved side: flips to the opposite one when the requested side does not fit. */\n side: coords?.side ?? side,\n /* \u0414\u043E \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u0435\u043D (CSS), \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u043C\u0438\u0433\u0430\u0442\u044C \u0432 (0, 0). */\n positioned: coords ? true : undefined,\n })}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n </Portal>\n );\n}\n\n// \u2500\u2500\u2500 Exports \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nTooltipProvider.displayName = \"Tooltip.Provider\";\nTooltipRoot.displayName = \"Tooltip.Root\";\nTooltipTrigger.displayName = \"Tooltip.Trigger\";\nTooltipContent.displayName = \"Tooltip.Content\";\n\nexport const Tooltip = {\n Provider: TooltipProvider,\n Root: TooltipRoot,\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n};\n", "import * as React from \"react\";\n\ntype UseControllableStateParams<T> = {\n value?: T;\n defaultValue: T;\n onChange?: (nextValue: T) => void;\n};\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateParams<T>) {\n const [internalValue, setInternalValue] = React.useState<T>(defaultValue);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentValueRef = React.useRef(currentValue);\n\n React.useEffect(() => {\n currentValueRef.current = currentValue;\n }, [currentValue]);\n\n const setValue = React.useCallback(\n (nextValue: T | ((prev: T) => T)) => {\n const previousValue = currentValueRef.current;\n const computedValue =\n typeof nextValue === \"function\" ? (nextValue as (prev: T) => T)(previousValue) : nextValue;\n\n if (Object.is(previousValue, computedValue)) {\n return;\n }\n\n if (!isControlled) {\n setInternalValue(computedValue);\n }\n\n onChange?.(computedValue);\n },\n [isControlled, onChange],\n );\n\n return [currentValue, setValue] as const;\n}\n", "import * as React from \"react\";\n\ntype UseEscapeKeyOptions = {\n enabled: boolean;\n onEscape: () => void;\n};\n\n/**\n * Stack of active Escape layers (Modal, Drawer, Popover, Select\u2026). Only the most recently\n * enabled layer reacts, so Escape inside a Select that lives in a Modal closes the Select only,\n * and a nested Drawer closes before its parent. An Escape whose default was prevented by a\n * nested control is ignored by every layer.\n */\nconst escapeLayers: symbol[] = [];\n\nexport function useEscapeKey({ enabled, onEscape }: UseEscapeKeyOptions) {\n const onEscapeRef = React.useRef(onEscape);\n onEscapeRef.current = onEscape;\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const layer = Symbol(\"escape-layer\");\n escapeLayers.push(layer);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n // A nested control (listbox, combobox) already consumed this Escape.\n if (event.defaultPrevented) {\n return;\n }\n if (escapeLayers[escapeLayers.length - 1] !== layer) {\n return;\n }\n\n onEscapeRef.current();\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n const index = escapeLayers.lastIndexOf(layer);\n if (index !== -1) {\n escapeLayers.splice(index, 1);\n }\n };\n }, [enabled]);\n}\n", "import * as React from \"react\";\n\nimport { getRootFontSizePx } from \"@/internal/layoutPxFromPrimitives\";\n\nexport type PositionSide = \"bottom\" | \"top\";\nexport type PositionAlign = \"start\" | \"center\" | \"end\";\n\ntype UsePositionOptions = {\n side?: PositionSide;\n align?: PositionAlign;\n offset?: number;\n /** \u041E\u0442\u0441\u0442\u0443\u043F \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u043E\u0442 \u043A\u0440\u0430\u0451\u0432 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430 \u043F\u0440\u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u0435 flip/\u043F\u043E\u0437\u0438\u0446\u0438\u0438 (px). */\n viewportPad?: number;\n flip?: boolean;\n matchTriggerMinWidth?: boolean;\n};\n\ntype PositionStyle = {\n position: \"fixed\";\n top: number;\n left: number;\n minWidth?: number;\n maxWidth?: number;\n maxHeight?: number;\n};\n\n/**\n * Private custom properties written by `usePosition` on the floating element. Panels combine them\n * with tokens, e.g. `max-height: min(var(--prime-panel-max-height), var(--float-max-h))`, so the\n * design limit and the room next to the anchor both apply.\n */\nexport const FLOAT_MAX_HEIGHT_VAR = \"--float-max-h\";\n/** Trigger width (px) when the panel should be at least as wide as its anchor. */\nexport const FLOAT_MIN_WIDTH_VAR = \"--float-min-w\";\n/** Viewport width minus gutters (px): a panel is never wider than the screen. */\nexport const FLOAT_MAX_WIDTH_VAR = \"--float-max-w\";\n\nexport type PositionUpdateMeta = { resolvedSide: PositionSide };\n\nconst MIN_MENU_ESTIMATE = 176;\nconst FALLBACK_VIEWPORT_PAD_PX = 8;\nconst FALLBACK_PANEL_OFFSET_PX = 4;\n\n/**\n * Computed length of a CSS custom property on `:root` in px (rem/px values).\n * Falls back when there is no DOM / stylesheet (SSR, jsdom).\n */\nexport function readCssLengthPx(name: string, fallbackPx: number): number {\n if (typeof document === \"undefined\") return fallbackPx;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n if (!raw) return fallbackPx;\n const n = Number.parseFloat(raw);\n if (!Number.isFinite(n)) return fallbackPx;\n if (raw.endsWith(\"rem\")) return Math.round(n * getRootFontSizePx());\n if (raw.endsWith(\"px\") || n === 0) return Math.round(n);\n return fallbackPx;\n}\n\n/** Gap between anchor and floating panel: `--prime-panel-offset`. */\nexport function getPanelOffsetPx(): number {\n return readCssLengthPx(\"--prime-panel-offset\", FALLBACK_PANEL_OFFSET_PX);\n}\n\n/** Minimum distance from a floating panel to the viewport edge: `--prime-space-2`. */\nexport function getViewportPadPx(): number {\n return readCssLengthPx(\"--prime-space-2\", FALLBACK_VIEWPORT_PAD_PX);\n}\n/** \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u044B\u0441\u043E\u0442\u0430 \u0441\u043A\u0440\u043E\u043B\u043B\u0430 \u0432\u044B\u043F\u0430\u0434\u0430\u0448\u043A\u0438 \u043F\u0440\u0438 \u043E\u0447\u0435\u043D\u044C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u043C \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0435. */\nconst MIN_FLOATING_MAX_HEIGHT = 120;\n/** \u041F\u043E\u043A\u0430 offsetHeight === 0, \u0434\u043B\u044F side=top \u0437\u0430\u0434\u0430\u0451\u043C top \u043E\u0442 \u044F\u043A\u043E\u0440\u044F \u0441 \u0433\u0440\u0443\u0431\u043E\u0439 \u043E\u0446\u0435\u043D\u043A\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u044B (\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u043A\u0430\u0434\u0440 \u043F\u043E\u043F\u0440\u0430\u0432\u0438\u0442). */\nconst FIRST_PAINT_FLOAT_HEIGHT_GUESS_PX = 280;\n\nexport type ComputeFloatingOptions = {\n preferredSide: PositionSide;\n align: PositionAlign;\n offset: number;\n /** \u041E\u0442\u0441\u0442\u0443\u043F \u043E\u0442 \u043A\u0440\u0430\u0451\u0432 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430 (px); \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 8. */\n viewportPad?: number;\n flip: boolean;\n matchTriggerMinWidth: boolean;\n};\n\nexport type ComputedFloatPosition = {\n top: number;\n left: number;\n resolvedSide: PositionSide;\n minWidth?: number;\n /** \u0428\u0438\u0440\u0438\u043D\u0430 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430 \u043C\u0438\u043D\u0443\u0441 \u043F\u043E\u043B\u044F \u0441 \u043E\u0431\u0435\u0438\u0445 \u0441\u0442\u043E\u0440\u043E\u043D \u2014 \u043F\u0430\u043D\u0435\u043B\u044C \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0448\u0438\u0440\u0435 \u044D\u043A\u0440\u0430\u043D\u0430. */\n maxWidth: number;\n /** \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430\u044F \u0432\u044B\u0441\u043E\u0442\u0430 \u043F\u043E\u0434 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 (px), \u0441\u043E \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F. */\n maxHeight?: number;\n};\n\nfunction pickSideForFlip(\n preferred: PositionSide,\n roomBottom: number,\n roomTop: number,\n contentH: number,\n): PositionSide {\n if (contentH > 0) {\n const fitsB = roomBottom >= contentH;\n const fitsT = roomTop >= contentH;\n if (fitsB && !fitsT) return \"bottom\";\n if (fitsT && !fitsB) return \"top\";\n if (fitsB && fitsT) return \"bottom\";\n }\n /* \u0411\u0435\u0437 \u0432\u044B\u0441\u043E\u0442\u044B \u043D\u0435\u043B\u044C\u0437\u044F \u0441\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0442\u044C \u00AB\u043A\u0443\u0434\u0430 \u0432\u043B\u0435\u0437\u0435\u0442\u00BB \u0438 \u043D\u0435\u043B\u044C\u0437\u044F \u0431\u0440\u0430\u0442\u044C \u0441\u0442\u043E\u0440\u043E\u043D\u0443 \u043F\u043E room*: \u0438\u043D\u0430\u0447\u0435 side=top, \u0430 top \u0432 px \u0441\u0447\u0438\u0442\u0430\u044E\u0442 \u043A\u0430\u043A \u0434\u043B\u044F bottom \u2014 \u043F\u0430\u043D\u0435\u043B\u044C \u0443\u0435\u0437\u0436\u0430\u0435\u0442, maxHeight \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u043E\u0442 \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B. */\n if (contentH === 0) return preferred;\n if (roomBottom > roomTop) return \"bottom\";\n if (roomTop > roomBottom) return \"top\";\n return preferred;\n}\n\n/** \u042F\u043A\u043E\u0440\u044C + \u0440\u0430\u0437\u043C\u0435\u0440\u044B \u0441\u043B\u043E\u044F + \u0432\u044C\u044E\u043F\u043E\u0440\u0442; \u043F\u0440\u0438 flip \u2014 \u0441\u0442\u043E\u0440\u043E\u043D\u0430 \u0441 \u0431\u043E\u043B\u044C\u0448\u0438\u043C \u0437\u0430\u043F\u0430\u0441\u043E\u043C / \u043A\u0443\u0434\u0430 \u0432\u043B\u0435\u0437\u0430\u0435\u0442 \u043A\u043E\u043D\u0442\u0435\u043D\u0442. */\nexport function computeFloatingPosition(\n anchorRect: DOMRectReadOnly,\n contentW: number,\n contentH: number,\n vw: number,\n vh: number,\n opts: ComputeFloatingOptions,\n): ComputedFloatPosition {\n const { preferredSide, align, offset, flip, matchTriggerMinWidth } = opts;\n const pad = opts.viewportPad ?? FALLBACK_VIEWPORT_PAD_PX;\n const roomBottom = vh - anchorRect.bottom - offset - pad;\n const roomTop = anchorRect.top - offset - pad;\n\n const side = flip ? pickSideForFlip(preferredSide, roomBottom, roomTop, contentH) : preferredSide;\n\n const top =\n contentH === 0\n ? side === \"bottom\"\n ? anchorRect.bottom + offset\n : Math.max(pad, anchorRect.top - offset - FIRST_PAINT_FLOAT_HEIGHT_GUESS_PX)\n : side === \"bottom\"\n ? anchorRect.bottom + offset\n : anchorRect.top - offset - contentH;\n\n const maxWidth = Math.max(0, Math.floor(vw - pad * 2));\n const contentWidth = Math.min(\n maxWidth,\n contentW > 0\n ? contentW\n : matchTriggerMinWidth\n ? anchorRect.width\n : Math.max(anchorRect.width, MIN_MENU_ESTIMATE),\n );\n\n const leftFor = (a: PositionAlign) =>\n a === \"start\"\n ? anchorRect.left\n : a === \"end\"\n ? anchorRect.right - contentWidth\n : anchorRect.left + anchorRect.width / 2 - contentWidth / 2;\n const fits = (x: number) => x >= pad && x + contentWidth <= vw - pad;\n let left = leftFor(align);\n // \u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0439 flip: \u043D\u0435 \u0432\u043B\u0435\u0437\u0430\u0435\u0442 \u0441 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043A\u0440\u0430\u044F \u2014 \u043F\u0440\u043E\u0431\u0443\u0435\u043C \u043F\u0440\u043E\u0442\u0438\u0432\u043E\u043F\u043E\u043B\u043E\u0436\u043D\u044B\u0439 \u043A\u0440\u0430\u0439 \u044F\u043A\u043E\u0440\u044F.\n if (flip && !fits(left)) {\n const opposite: PositionAlign = align === \"end\" ? \"start\" : align === \"start\" ? \"end\" : align;\n if (opposite !== align && fits(leftFor(opposite))) left = leftFor(opposite);\n }\n\n left = Math.max(pad, Math.min(left, vw - contentWidth - pad));\n\n const out: ComputedFloatPosition = {\n top: Math.round(top),\n left: Math.round(left),\n resolvedSide: side,\n maxWidth,\n };\n if (matchTriggerMinWidth) out.minWidth = Math.min(anchorRect.width, maxWidth);\n const roomVertical = side === \"bottom\" ? roomBottom : roomTop;\n out.maxHeight = Math.max(MIN_FLOATING_MAX_HEIGHT, Math.floor(roomVertical));\n return out;\n}\n\ntype UsePositionResult = {\n resolvedSide: PositionSide;\n update: () => PositionUpdateMeta | undefined;\n};\n\nexport function usePosition(\n anchorRef: React.RefObject<HTMLElement | null>,\n contentRef: React.RefObject<HTMLElement | null>,\n options: UsePositionOptions = {},\n): UsePositionResult {\n const {\n side: preferredSide = \"bottom\",\n align = \"start\",\n offset: offsetOption,\n viewportPad: viewportPadOption,\n flip = true,\n matchTriggerMinWidth = true,\n } = options;\n\n const [resolvedSide, setResolvedSide] = React.useState<PositionSide>(preferredSide);\n\n const applyPositionStyle = React.useCallback(\n (pos: PositionStyle) => {\n const content = contentRef.current;\n if (!content) return;\n\n const setVar = (name: string, px: number | undefined) => {\n const next = px !== undefined ? `${px}px` : \"\";\n if (content.style.getPropertyValue(name) !== next) content.style.setProperty(name, next);\n };\n const nextTop = `${pos.top}px`;\n const nextLeft = `${pos.left}px`;\n /* \u0411\u0435\u0437 \u043B\u0438\u0448\u043D\u0438\u0445 \u043F\u0440\u0438\u0441\u0432\u043E\u0435\u043D\u0438\u0439 \u2014 \u043C\u0435\u043D\u044C\u0448\u0435 layout thrashing \u043F\u0440\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0445 update() \u0441 \u0442\u0435\u043C\u0438 \u0436\u0435 \u0447\u0438\u0441\u043B\u0430\u043C\u0438. */\n if (content.style.position !== pos.position) content.style.position = pos.position;\n if (content.style.top !== nextTop) content.style.top = nextTop;\n if (content.style.left !== nextLeft) content.style.left = nextLeft;\n setVar(FLOAT_MIN_WIDTH_VAR, pos.minWidth);\n setVar(FLOAT_MAX_WIDTH_VAR, pos.maxWidth);\n setVar(FLOAT_MAX_HEIGHT_VAR, pos.maxHeight);\n },\n [contentRef],\n );\n\n const update = React.useCallback((): PositionUpdateMeta | undefined => {\n const anchor = anchorRef.current;\n const content = contentRef.current;\n if (!anchor) return undefined;\n\n const viewportPad = viewportPadOption ?? getViewportPadPx();\n const offset = offsetOption ?? getPanelOffsetPx();\n const anchorRect = anchor.getBoundingClientRect();\n const pos = computeFloatingPosition(\n anchorRect,\n content?.offsetWidth ?? 0,\n content?.offsetHeight ?? 0,\n window.innerWidth,\n window.innerHeight,\n { preferredSide, align, offset, viewportPad, flip, matchTriggerMinWidth },\n );\n\n setResolvedSide((prev) => (pos.resolvedSide === prev ? prev : pos.resolvedSide));\n applyPositionStyle({\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n maxWidth: pos.maxWidth,\n ...(pos.minWidth !== undefined ? { minWidth: pos.minWidth } : {}),\n ...(pos.maxHeight !== undefined ? { maxHeight: pos.maxHeight } : {}),\n });\n return { resolvedSide: pos.resolvedSide };\n }, [\n anchorRef,\n applyPositionStyle,\n contentRef,\n preferredSide,\n align,\n offsetOption,\n flip,\n matchTriggerMinWidth,\n viewportPadOption,\n ]);\n\n return { resolvedSide, update };\n}\n", "/**\n * Fallback, \u0435\u0441\u043B\u0438 \u043D\u0435\u0442 `document` (SSR) \u0438\u043B\u0438 `getComputedStyle` \u043D\u0435 \u0434\u0430\u043B \u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 px\n * (\u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0442\u044C \u0441 \u0442\u0438\u043F\u0438\u0447\u043D\u044B\u043C `font-size` \u043D\u0430 `:root` \u0432 `globals`).\n */\nconst FALLBACK_ROOT_FONT_PX = 16;\n\n/**\n * \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u044B\u0439 `font-size` \u043A\u043E\u0440\u043D\u044F (`html`) \u0432 px \u2014 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u0430 rem \u0438\u0437 \u043F\u0440\u0438\u043C\u0438\u0442\u0438\u0432\u043E\u0432\n * \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u0438 floating UI / SVG \u0431\u0435\u0437 \u0436\u0451\u0441\u0442\u043A\u043E\u0439 \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u0438 \u043A 16.\n */\nexport function getRootFontSizePx(): number {\n if (typeof document === \"undefined\") {\n return FALLBACK_ROOT_FONT_PX;\n }\n const raw = getComputedStyle(document.documentElement).fontSize;\n const parsed = Number.parseFloat(raw);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : FALLBACK_ROOT_FONT_PX;\n}\n\nexport function remToPx(rem: string, rootPx: number = getRootFontSizePx()): number {\n const n = Number.parseFloat(rem);\n return Number.isFinite(n) ? Math.round(n * rootPx) : 0;\n}\n", "import * as React from \"react\";\n\nexport type PresenceState = \"open\" | \"closed\";\nexport type MotionDurationToken = \"fast\" | \"base\" | \"slow\";\n\n/** Token defaults (foundation \u00A77) used when the CSS variable cannot be read. */\nconst DURATION_FALLBACK_MS: Record<MotionDurationToken, number> = {\n fast: 120,\n base: 200,\n slow: 300,\n};\n\n/** Slack over the token duration before the timeout fallback unmounts the layer. */\nconst TIMEOUT_SLACK_MS = 50;\n\nexport function prefersReducedMotion(): boolean {\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n );\n}\n\nfunction parseDurationMs(raw: string): number | null {\n const value = raw.trim();\n if (value === \"\") return null;\n const n = Number.parseFloat(value);\n if (Number.isNaN(n)) return null;\n if (value.endsWith(\"ms\")) return n;\n if (value.endsWith(\"s\")) return n * 1000;\n return null;\n}\n\n/** `--prime-motion-duration-<token>` in ms, read from the document (respects theme overrides). */\nexport function motionDurationMs(token: MotionDurationToken): number {\n if (typeof document === \"undefined\") return DURATION_FALLBACK_MS[token];\n const raw = getComputedStyle(document.documentElement).getPropertyValue(\n `--prime-motion-duration-${token}`,\n );\n return parseDurationMs(raw) ?? DURATION_FALLBACK_MS[token];\n}\n\n/** Timeout fallback for an exit animation of `token` length: the token duration plus slack. */\nexport function exitTimeoutMs(token: MotionDurationToken): number {\n return motionDurationMs(token) + TIMEOUT_SLACK_MS;\n}\n\nexport type UsePresenceOptions = {\n /** Longest exit duration of the layer \u2014 the timeout fallback when no `animationend` arrives. */\n exitDuration?: MotionDurationToken;\n};\n\nexport type Presence = {\n /** Render the layer while this is true (open, or playing its exit animation). */\n mounted: boolean;\n /** Value for `data-state` on the layer: CSS animates both directions from it. */\n state: PresenceState;\n /**\n * Attach as `onAnimationEnd` (and/or `onTransitionEnd`) to the outermost animated element of the\n * layer. Events bubbling from descendants are ignored.\n */\n onExitEnd: (event: React.SyntheticEvent<Element>) => void;\n};\n\n/**\n * Keeps an overlay mounted until its exit animation ends. Open \u2192 mounted at once with\n * `state=\"open\"`; close \u2192 `state=\"closed\"` stays mounted until `animationend` / `transitionend`\n * on the layer element, or the token-duration timeout; unmounts immediately under\n * `prefers-reduced-motion: reduce`. Shared by every floating layer (foundation \u00A77 \"Overlay contract\").\n */\nexport function usePresence(open: boolean, options: UsePresenceOptions = {}): Presence {\n const { exitDuration = \"base\" } = options;\n const [mounted, setMounted] = React.useState(open);\n\n // Derived state updates during render (no extra commit): mount on open, skip the exit\n // animation entirely under reduced motion.\n if (open && !mounted) setMounted(true);\n if (!open && mounted && prefersReducedMotion()) setMounted(false);\n\n const openRef = React.useRef(open);\n openRef.current = open;\n\n React.useEffect(() => {\n if (open || !mounted) return;\n const id = window.setTimeout(() => setMounted(false), exitTimeoutMs(exitDuration));\n return () => window.clearTimeout(id);\n }, [open, mounted, exitDuration]);\n\n const onExitEnd = React.useCallback((event: React.SyntheticEvent<Element>) => {\n if (event.target !== event.currentTarget) return;\n if (!openRef.current) setMounted(false);\n }, []);\n\n return { mounted: open || mounted, state: open ? \"open\" : \"closed\", onExitEnd };\n}\n", "import * as React from \"react\";\n\n/**\n * Factory for creating typed React Context + a guard hook that throws\n * a descriptive error when used outside the provider.\n * Standardizes the composable-component pattern across prime-ui-kit.\n *\n * @example\n * const [InputProvider, useInputContext] = createComponentContext<InputContextValue>(\"Input\");\n */\nexport function createComponentContext<T>(displayName: string) {\n const Ctx = React.createContext<T | null>(null);\n Ctx.displayName = `${displayName}Context`;\n\n function useComponentContext(): T {\n const value = React.useContext(Ctx);\n if (value === null) {\n throw new Error(\n `[prime-ui-kit] \\`${displayName}\\` sub-component must be used inside \\`${displayName}.Root\\`.`,\n );\n }\n return value;\n }\n\n return [Ctx.Provider, useComponentContext] as const;\n}\n", "/*\n * Overlay motion \u2014 the one set of enter/exit animations for every floating layer\n * (foundation \u00A77 \"Overlay contract\"). Layers carry `data-state=\"open|closed\"` from `usePresence`;\n * the closed state plays the exit animation and stays mounted until `animationend`.\n * Durations collapse to 0 under `prefers-reduced-motion` (globals.css), and `usePresence`\n * unmounts at once there. A closing panel takes no pointer events; a closing scrim still does.\n *\n * scrim fade base \u00B7 enter / base \u00B7 exit\n * dialog fade + scale 0.98 \u2192 1 base \u00B7 enter / fast \u00B7 exit (bottom sheet < 640px: slide)\n * sheet slide up / down slow \u00B7 enter / base \u00B7 exit\n * drawer slide from its side slow \u00B7 enter / base \u00B7 exit\n * floating fade + 4px from anchor fast \u00B7 enter / fast \u00B7 exit (popover, menu, listbox, tooltip)\n */\n\n/* A closing scrim keeps catching pointer events, so the dismissing click never falls through to\n the page beneath it; the closing panels themselves are click-through. */\n[data-state=\"closed\"].dialog,\n[data-state=\"closed\"].drawer,\n[data-state=\"closed\"].floating {\n pointer-events: none;\n}\n\n/* \u2500\u2500\u2500 Scrim \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.scrim[data-state=\"open\"] {\n animation: overlayFadeIn var(--prime-motion-duration-base) var(--prime-motion-easing-enter) both;\n}\n\n.scrim[data-state=\"closed\"] {\n animation: overlayFadeOut var(--prime-motion-duration-base) var(--prime-motion-easing-exit) both;\n}\n\n/* \u2500\u2500\u2500 Dialog (Modal, CommandMenu) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.dialog[data-state=\"open\"] {\n animation: overlayDialogIn var(--prime-motion-duration-base) var(--prime-motion-easing-enter) both;\n}\n\n.dialog[data-state=\"closed\"] {\n animation: overlayDialogOut var(--prime-motion-duration-fast) var(--prime-motion-easing-exit) both;\n}\n\n@media (max-width: 639px) {\n .dialog[data-state=\"open\"] {\n animation: overlaySheetIn var(--prime-motion-duration-slow) var(--prime-motion-easing-enter)\n both;\n }\n\n .dialog[data-state=\"closed\"] {\n animation: overlaySheetOut var(--prime-motion-duration-base) var(--prime-motion-easing-exit)\n both;\n }\n}\n\n/* \u2500\u2500\u2500 Drawer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.drawer {\n --overlay-drawer-from: 100%;\n}\n\n.drawer[data-side=\"left\"] {\n --overlay-drawer-from: -100%;\n}\n\n.drawer[data-state=\"open\"] {\n animation: overlayDrawerIn var(--prime-motion-duration-slow) var(--prime-motion-easing-enter) both;\n}\n\n.drawer[data-state=\"closed\"] {\n animation: overlayDrawerOut var(--prime-motion-duration-base) var(--prime-motion-easing-exit) both;\n}\n\n/* \u2500\u2500\u2500 Floating panels: popover, dropdown, listbox, datepicker, tooltip \u2500\u2500\u2500 */\n\n.floating {\n /* Offset toward the anchor: the panel grows out of its trigger along the resolved side. */\n --overlay-shift: 0 calc(-1 * var(--prime-space-1));\n}\n\n.floating[data-side=\"top\"] {\n --overlay-shift: 0 var(--prime-space-1);\n}\n\n.floating[data-side=\"left\"] {\n --overlay-shift: var(--prime-space-1) 0;\n}\n\n.floating[data-side=\"right\"] {\n --overlay-shift: calc(-1 * var(--prime-space-1)) 0;\n}\n\n.floating[data-state=\"open\"] {\n animation: overlayFloatIn var(--prime-motion-duration-fast) var(--prime-motion-easing-enter) both;\n}\n\n.floating[data-state=\"closed\"] {\n animation: overlayFloatOut var(--prime-motion-duration-fast) var(--prime-motion-easing-exit) both;\n}\n\n/* \u2500\u2500\u2500 Keyframes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n@keyframes overlayFadeIn {\n from {\n opacity: 0;\n }\n}\n\n@keyframes overlayFadeOut {\n to {\n opacity: 0;\n }\n}\n\n@keyframes overlayDialogIn {\n from {\n opacity: 0;\n scale: 0.98;\n }\n}\n\n@keyframes overlayDialogOut {\n to {\n opacity: 0;\n scale: 0.98;\n }\n}\n\n@keyframes overlaySheetIn {\n from {\n translate: 0 100%;\n }\n}\n\n@keyframes overlaySheetOut {\n to {\n translate: 0 100%;\n }\n}\n\n@keyframes overlayDrawerIn {\n from {\n translate: var(--overlay-drawer-from) 0;\n }\n}\n\n@keyframes overlayDrawerOut {\n to {\n translate: var(--overlay-drawer-from) 0;\n }\n}\n\n@keyframes overlayFloatIn {\n from {\n opacity: 0;\n translate: var(--overlay-shift);\n }\n}\n\n@keyframes overlayFloatOut {\n to {\n opacity: 0;\n translate: var(--overlay-shift);\n }\n}\n", "import * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype PortalProps = {\n children: React.ReactNode;\n container?: HTMLElement | null;\n};\n\nexport function Portal({ children, container }: PortalProps) {\n const [mounted, setMounted] = React.useState(false);\n\n // useLayoutEffect: \u043F\u043E\u0440\u0442\u0430\u043B \u0432 DOM \u0434\u043E paint \u0438 \u0434\u043E layout-\u044D\u0444\u0444\u0435\u043A\u0442\u043E\u0432 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F (\u043D\u0443\u0436\u043D\u043E \u0434\u043B\u044F ref + \u043F\u043E\u0437\u0438\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F).\n React.useLayoutEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted) return null;\n\n return createPortal(children, container ?? document.body);\n}\n", "/* \u2500\u2500\u2500 Tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Inverse chip with caption text: `--prime-color-tooltip-*`, `--prime-tooltip-*`.\n * Flat \u2014 no arrow, no heavy shadow; contrast comes from the inverse fill.\n */\n\n.content {\n --tt-text: var(--prime-text-caption-size);\n --tt-lh: var(--prime-text-caption-line-height);\n --tt-px: var(--prime-tooltip-padding-x);\n --tt-py: var(--prime-tooltip-padding-y);\n\n position: fixed;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n max-width: min(var(--prime-tooltip-max-width), calc(100vw - var(--prime-space-4)));\n padding-block: var(--tt-py);\n padding-inline: var(--tt-px);\n border-radius: var(--prime-tooltip-radius);\n background: var(--prime-color-tooltip-bg);\n color: var(--prime-color-tooltip-text);\n font-family: var(--prime-font-family-sans);\n font-size: var(--tt-text);\n font-weight: var(--prime-font-weight-regular);\n line-height: var(--tt-lh);\n letter-spacing: var(--prime-text-caption-tracking);\n overflow-wrap: anywhere;\n pointer-events: none;\n isolation: isolate;\n}\n\n/* Until measured it stays invisible and does not start its enter animation. */\n.content[data-state]:not([data-positioned=\"true\"]) {\n opacity: 0;\n animation: none;\n}\n\n/* xs / s / m \u2014 caption (12/16). l / xl \u2014 body-s (13/20) \u0441 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u043F\u043E\u043B\u044F\u043C\u0438. */\n.content[data-size=\"l\"],\n.content[data-size=\"xl\"] {\n --tt-text: var(--prime-text-body-s-size);\n --tt-lh: var(--prime-text-body-s-line-height);\n}\n\n.content[data-size=\"xl\"] {\n --tt-px: var(--prime-space-3);\n --tt-py: var(--prime-space-2);\n}\n\n.content[data-overlay-portal-layer=\"page\"] {\n z-index: var(--prime-z-tooltip);\n}\n\n.content[data-overlay-portal-layer=\"drawer\"] {\n z-index: var(--prime-z-tooltip-in-drawer);\n}\n\n.content[data-overlay-portal-layer=\"modal\"] {\n z-index: var(--prime-z-tooltip-in-modal);\n}\n\n.content[data-overlay-portal-layer=\"drawerInModal\"] {\n z-index: var(--prime-z-tooltip-in-drawer-in-modal);\n}\n", "import * as React from \"react\";\n\nimport { isPointerDismiss } from \"./useOutsideClick\";\n\nconst FOCUSABLE_SELECTORS = [\n 'a[href]:not([tabindex=\"-1\"])',\n 'button:not([disabled]):not([tabindex=\"-1\"])',\n 'input:not([disabled]):not([type=\"hidden\"]):not([tabindex=\"-1\"])',\n 'select:not([disabled]):not([tabindex=\"-1\"])',\n 'textarea:not([disabled]):not([tabindex=\"-1\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\", \");\n\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTORS)).filter((el) => {\n if (el.getAttribute(\"aria-hidden\") === \"true\") return false;\n const style = window.getComputedStyle(el);\n return style.display !== \"none\" && style.visibility !== \"hidden\";\n });\n}\n\n/**\n * Active traps, innermost last. Only the top trap handles Tab, so a Dropdown or nested Drawer\n * opened from inside a Modal keeps focus without the outer trap pulling it back.\n */\nconst trapStack: symbol[] = [];\n\n/**\n * Last element that lost focus. When `autoFocus` inside the container moved focus before the\n * trap effect ran, this is the opener that should get focus back on close.\n */\nlet lastBlurred: HTMLElement | null = null;\nlet blurTrackingInstalled = false;\n\nfunction ensureBlurTracking() {\n if (blurTrackingInstalled || typeof document === \"undefined\") return;\n blurTrackingInstalled = true;\n document.addEventListener(\n \"focusout\",\n (event) => {\n if (event.target instanceof HTMLElement) {\n lastBlurred = event.target;\n }\n },\n true,\n );\n}\n\ntype UseFocusTrapOptions = {\n enabled: boolean;\n /** Whether to restore focus to the previously focused element on disable */\n restoreFocus?: boolean;\n /**\n * Element to focus initially. Without it the trap keeps focus that is already inside the\n * container (e.g. `autoFocus`), then tries `[data-autofocus]`, then the first focusable element,\n * then the container itself.\n */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n};\n\n/**\n * Traps keyboard focus inside a container element.\n * Tab cycles forward through focusable elements, Shift+Tab cycles backward.\n * Shared by Modal (panel), Drawer, Sidebar (mobile), Select.Content, Dropdown, Popover.\n */\nexport function useFocusTrap<T extends HTMLElement = HTMLElement>(\n options: UseFocusTrapOptions,\n): React.RefObject<T | null> {\n const { enabled, restoreFocus = true, initialFocusRef } = options;\n const containerRef = React.useRef<T | null>(null);\n const previousFocusRef = React.useRef<HTMLElement | null>(null);\n\n // Installed on render (before any commit) so the opener is recorded even when a child\n // `autoFocus` steals focus in the same commit that mounts the container.\n ensureBlurTracking();\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const layer = Symbol(\"focus-trap\");\n trapStack.push(layer);\n\n // React applies `autoFocus` during commit, before this effect: then the opener is the element\n // that just lost focus rather than the active one.\n const active = document.activeElement as HTMLElement | null;\n const focusAlreadyInside = active != null && container.contains(active);\n previousFocusRef.current = focusAlreadyInside\n ? lastBlurred && !container.contains(lastBlurred)\n ? lastBlurred\n : null\n : active;\n\n if (!focusAlreadyInside) {\n const toFocus =\n initialFocusRef?.current ??\n container.querySelector<HTMLElement>(\"[data-autofocus]\") ??\n getFocusableElements(container)[0] ??\n container;\n toFocus.focus({ preventScroll: true });\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n if (trapStack[trapStack.length - 1] !== layer) return;\n\n const focusable = getFocusableElements(container);\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const current = document.activeElement;\n\n if (event.shiftKey) {\n if (current === first || !container.contains(current)) {\n event.preventDefault();\n last.focus();\n }\n } else {\n if (current === last || !container.contains(current)) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n const index = trapStack.lastIndexOf(layer);\n if (index !== -1) {\n trapStack.splice(index, 1);\n }\n const previous = previousFocusRef.current;\n // Dismissed by a press outside: focus follows the pointer, not back to the opener.\n if (restoreFocus && previous?.isConnected && !isPointerDismiss()) {\n // Modal / Drawer make the page inert in a sibling effect whose cleanup runs after this\n // one; focusing an inert opener is a no-op, so wait until the same commit lifts it.\n if (previous.closest(\"[inert]\")) {\n queueMicrotask(() => {\n if (previous.isConnected) previous.focus({ preventScroll: true });\n });\n } else {\n previous.focus({ preventScroll: true });\n }\n }\n };\n }, [enabled, restoreFocus, initialFocusRef]);\n\n return containerRef;\n}\n", "import * as React from \"react\";\n\n/**\n * `pointerdown` \u2014 floating panels (Popover, Dropdown, Select\u2026): dismiss as soon as the press\n * starts outside. `click` \u2014 scrim layers (Modal, Drawer): the press must start AND end outside\n * the panel, so a drag from inside the dialog onto the scrim never closes it and the dismissing\n * click is consumed by the scrim instead of falling through to the page.\n */\nexport type OutsideClickTrigger = \"pointerdown\" | \"click\";\n\ntype OutsideClickLayer = {\n refs: React.RefObject<Array<React.RefObject<HTMLElement | null>>>;\n onOutsideClick: React.RefObject<(event: Event) => void>;\n trigger: OutsideClickTrigger;\n};\n\n/**\n * Stack of open floating layers, innermost last (same idea as the Escape stack in\n * `useEscapeKey`). One document listener asks only the topmost layer: a press outside it\n * dismisses it and nothing else, so a click outside a Select that is open inside a Modal closes\n * the Select only, and clicks inside a nested (portaled) child layer never reach the parent.\n */\nconst layers: OutsideClickLayer[] = [];\n\n/** A `click`-mode layer whose dismissing press started outside it (cleared on the next press). */\nlet pendingClickLayer: OutsideClickLayer | null = null;\n\n/**\n * True while a `pointerdown` outside a floating layer is dismissing it (until the press's own\n * mousedown has run). Focus then follows the pointer: the layer must NOT return focus to its\n * trigger \u2014 the press moves focus to the control under the pointer, or to nothing on empty space,\n * so a focused field blurs in the same click. Escape (and scrim clicks of Modal / Drawer) still\n * restore focus. Read by `useFocusTrap` and by layers that move focus themselves on dismiss.\n */\nlet pointerDismiss = false;\n\nexport function isPointerDismiss(): boolean {\n return pointerDismiss;\n}\n\nfunction isOutside(layer: OutsideClickLayer, target: Node) {\n return !layer.refs.current.some((ref) => ref.current?.contains(target));\n}\n\n/* A key press is never a pointer dismiss (e.g. Escape right after a press in the same task). */\nfunction onDocumentKeyDown() {\n pointerDismiss = false;\n}\n\nfunction onDocumentPointerDown(event: PointerEvent) {\n pendingClickLayer = null;\n pointerDismiss = false;\n const top = layers[layers.length - 1];\n const target = event.target;\n if (!top || !(target instanceof Node) || !isOutside(top, target)) return;\n if (top.trigger === \"click\") {\n pendingClickLayer = top;\n return;\n }\n pointerDismiss = true;\n /* The press's mousedown (which moves focus) is dispatched in the same task; clear after it. */\n window.setTimeout(() => {\n pointerDismiss = false;\n }, 0);\n top.onOutsideClick.current(event);\n}\n\nfunction onDocumentClick(event: MouseEvent) {\n const layer = pendingClickLayer;\n pendingClickLayer = null;\n const top = layers[layers.length - 1];\n const target = event.target;\n if (!layer || layer !== top || !(target instanceof Node) || !isOutside(layer, target)) return;\n layer.onOutsideClick.current(event);\n}\n\nfunction addLayer(layer: OutsideClickLayer) {\n if (layers.length === 0) {\n document.addEventListener(\"pointerdown\", onDocumentPointerDown, true);\n document.addEventListener(\"click\", onDocumentClick, true);\n document.addEventListener(\"keydown\", onDocumentKeyDown, true);\n }\n layers.push(layer);\n}\n\nfunction removeLayer(layer: OutsideClickLayer) {\n const index = layers.lastIndexOf(layer);\n if (index !== -1) layers.splice(index, 1);\n if (pendingClickLayer === layer) pendingClickLayer = null;\n if (layers.length === 0) {\n document.removeEventListener(\"pointerdown\", onDocumentPointerDown, true);\n document.removeEventListener(\"click\", onDocumentClick, true);\n document.removeEventListener(\"keydown\", onDocumentKeyDown, true);\n }\n}\n\ntype UseOutsideClickParams = {\n /** The layer and its trigger: a press inside any of them is not \"outside\". */\n refs: Array<React.RefObject<HTMLElement | null>>;\n /** Registers the layer while true (normally: while open). */\n enabled: boolean;\n /**\n * Called on a press outside while this layer is the topmost one. A layer that opts out\n * (`closeOnOutsideClick={false}`) still registers and passes a no-op, so it keeps blocking the\n * layers below it.\n */\n onOutsideClick: (event: Event) => void;\n /** Default `pointerdown`; scrim layers use `click`. */\n trigger?: OutsideClickTrigger;\n};\n\nexport function useOutsideClick({\n refs,\n enabled,\n onOutsideClick,\n trigger = \"pointerdown\",\n}: UseOutsideClickParams) {\n const refsRef = React.useRef(refs);\n refsRef.current = refs;\n const handlerRef = React.useRef(onOutsideClick);\n handlerRef.current = onOutsideClick;\n\n React.useEffect(() => {\n if (!enabled) return;\n const layer: OutsideClickLayer = { refs: refsRef, onOutsideClick: handlerRef, trigger };\n addLayer(layer);\n return () => removeLayer(layer);\n }, [enabled, trigger]);\n}\n", "import * as React from \"react\";\n\nlet lockCount = 0;\nlet savedOverflow = \"\";\nlet savedPaddingRight = \"\";\n\nfunction lockScroll() {\n if (lockCount === 0) {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n savedOverflow = document.body.style.overflow;\n savedPaddingRight = document.body.style.paddingRight;\n\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n }\n lockCount++;\n}\n\nfunction unlockScroll() {\n lockCount = Math.max(0, lockCount - 1);\n if (lockCount === 0) {\n document.body.style.overflow = savedOverflow;\n document.body.style.paddingRight = savedPaddingRight;\n }\n}\n\n/**\n * Locks body scroll when enabled. Supports multiple concurrent callers via\n * a reference-counted lock \u2014 the last caller to unmount restores scroll.\n * Compensates for scrollbar width to prevent layout shift.\n * Shared by modal/drawer overlays.\n */\nexport function useScrollLock(enabled: boolean) {\n React.useEffect(() => {\n if (!enabled) return;\n lockScroll();\n return () => unlockScroll();\n }, [enabled]);\n}\n", "import type * as React from \"react\";\n\nimport { useEscapeKey } from \"./useEscapeKey\";\nimport { useFocusTrap } from \"./useFocusTrap\";\nimport { useScrollLock } from \"./useScrollLock\";\n\n/**\n * \u041E\u0431\u0449\u0438\u0439 \u0441\u043B\u043E\u0439 \u0434\u043B\u044F \u043C\u043E\u0434\u0430\u043B\u044C\u043D\u044B\u0445 \u043E\u0432\u0435\u0440\u043B\u0435\u0435\u0432 (Sidebar narrow, Drawer \u0438 \u0442.\u0434.):\n * \u043B\u043E\u0432\u0443\u0448\u043A\u0430 \u0444\u043E\u043A\u0443\u0441\u0430, \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430, Escape.\n */\nexport function useOverlayModal<T extends HTMLElement = HTMLElement>(\n enabled: boolean,\n onClose: () => void,\n): React.RefObject<T | null> {\n const trapRef = useFocusTrap<T>({ enabled });\n useScrollLock(enabled);\n useEscapeKey({ enabled, onEscape: onClose });\n return trapRef;\n}\n", "import * as React from \"react\";\n\nimport { mergeRefs } from \"./mergeRefs\";\n\ntype AnyProps = Record<string, unknown>;\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const merged: AnyProps = { ...slotProps };\n\n for (const key of Object.keys(childProps)) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n if (key === \"className\") {\n // NavLink (and similar) pass className as a function receiving route state.\n // When slot has a plain string and child has a function, compose them.\n if (typeof childValue === \"function\" && typeof slotValue === \"string\") {\n const slotClass = slotValue;\n merged[key] = (...args: unknown[]) => {\n const resolved = (childValue as (...a: unknown[]) => unknown)(...args);\n return [slotClass, resolved].filter(Boolean).join(\" \") || undefined;\n };\n } else {\n const parts = [slotValue, childValue].filter(Boolean);\n merged[key] = parts.length > 0 ? parts.join(\" \") : undefined;\n }\n } else if (key === \"style\") {\n merged[key] =\n slotValue != null && childValue != null\n ? { ...(slotValue as object), ...(childValue as object) }\n : (childValue ?? slotValue);\n } else if (\n key.startsWith(\"on\") &&\n typeof slotValue === \"function\" &&\n typeof childValue === \"function\"\n ) {\n // Child handler runs first, then slot handler\n merged[key] = (...args: unknown[]) => {\n (childValue as (...a: unknown[]) => unknown)(...args);\n (slotValue as (...a: unknown[]) => unknown)(...args);\n };\n } else {\n // Child props override slot props\n merged[key] = childValue;\n }\n }\n\n return merged;\n}\n\nexport type SlotProps = { children?: React.ReactNode } & AnyProps;\n\n/**\n * Merges its own props onto the single React child element.\n * The basis of the `asChild` polymorphism pattern (same idea as Radix UI `Slot`).\n *\n * Merge rules:\n * - `className` \u2014 space-joined (slot first, child second)\n * - `style` \u2014 shallow-merged; child keys win\n * - `on*` handlers \u2014 both fire; child handler runs first\n * - All other props \u2014 child overrides slot\n * - `ref` \u2014 merged via `mergeRefs`\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(({ children, ...slotProps }, ref) => {\n if (!React.isValidElement(children)) {\n return <>{children}</>;\n }\n\n const child = children as React.ReactElement<AnyProps>;\n const childRef = (child as unknown as { ref?: React.Ref<unknown> }).ref ?? null;\n const composedRef =\n ref != null || childRef != null\n ? mergeRefs<unknown>(ref as React.Ref<unknown> | undefined, childRef ?? undefined)\n : undefined;\n\n const merged = mergeProps(slotProps, child.props);\n\n return React.cloneElement(child, {\n ...merged,\n ...(composedRef !== undefined ? { ref: composedRef } : {}),\n } as AnyProps);\n});\n\nSlot.displayName = \"Slot\";\n", "/*\n * Sidebar \u2014 navigation rail on the canvas (Graphite).\n *\n * No border, no card: items are transparent rows with a `fill-subtle` wash on hover; the current\n * item is lifted to `bg-surface` + `shadow-raised`.\n *\n * Motion: the root's inline size is the only thing that animates (expanded \u2194 compact \u2194 hidden,\n * one duration and easing). Item padding is derived from the compact width, so icons sit in the\n * same place in every mode; labels clip and fade instead of reflowing. While hidden the panel\n * keeps the width of the last visible mode and is clipped by the root as one piece.\n */\n\n.root {\n --sb-h: var(--prime-control-m-height);\n --sb-icon: var(--prime-control-m-icon);\n --sb-text: var(--prime-control-m-text-size);\n --sb-line-height: var(--prime-control-m-line-height);\n --sb-radius: var(--prime-control-m-radius);\n --sb-gap: var(--prime-control-m-gap);\n --sb-badge-h: var(--prime-badge-s-height);\n --sb-badge-px: var(--prime-badge-s-padding-x);\n --sb-badge-text: var(--prime-badge-s-text-size);\n\n --sb-expanded: var(--prime-layout-sidebar-width);\n --sb-compact: var(--prime-layout-sidebar-collapsed-width);\n --sb-pad: var(--prime-space-2);\n /* Centers the icon inside the compact rail; the same padding is used when expanded. */\n --sb-item-pad: calc((var(--sb-compact) - 2 * var(--sb-pad) - var(--sb-icon)) / 2);\n --sb-width: var(--sb-expanded);\n --sb-panel-width: var(--sb-expanded);\n --sb-duration: var(--prime-motion-duration-base);\n --sb-ease: var(--prime-motion-easing-standard);\n\n /* The rail is canvas: fields keep the canvas field fill; avatar rings match the rail. */\n --avatar-ring: var(--prime-color-bg-canvas);\n\n position: relative;\n box-sizing: border-box;\n flex: none;\n width: var(--sb-width);\n height: 100%;\n min-height: 0;\n overflow: clip;\n transition: width var(--sb-duration) var(--sb-ease);\n}\n\n.root[data-size=\"xs\"] {\n --sb-h: var(--prime-control-xs-height);\n --sb-icon: var(--prime-control-xs-icon);\n --sb-text: var(--prime-control-xs-text-size);\n --sb-line-height: var(--prime-control-xs-line-height);\n --sb-radius: var(--prime-control-xs-radius);\n --sb-gap: var(--prime-control-xs-gap);\n --sb-badge-h: var(--prime-badge-xs-height);\n --sb-badge-px: var(--prime-badge-xs-padding-x);\n --sb-badge-text: var(--prime-badge-xs-text-size);\n}\n\n.root[data-size=\"s\"] {\n --sb-h: var(--prime-control-s-height);\n --sb-icon: var(--prime-control-s-icon);\n --sb-text: var(--prime-control-s-text-size);\n --sb-line-height: var(--prime-control-s-line-height);\n --sb-radius: var(--prime-control-s-radius);\n --sb-gap: var(--prime-control-s-gap);\n --sb-badge-h: var(--prime-badge-xs-height);\n --sb-badge-px: var(--prime-badge-xs-padding-x);\n --sb-badge-text: var(--prime-badge-xs-text-size);\n}\n\n.root[data-size=\"l\"] {\n --sb-h: var(--prime-control-l-height);\n --sb-icon: var(--prime-control-l-icon);\n --sb-text: var(--prime-control-l-text-size);\n --sb-line-height: var(--prime-control-l-line-height);\n --sb-radius: var(--prime-control-l-radius);\n --sb-gap: var(--prime-control-l-gap);\n --sb-badge-h: var(--prime-badge-m-height);\n --sb-badge-px: var(--prime-badge-m-padding-x);\n --sb-badge-text: var(--prime-badge-m-text-size);\n}\n\n.root[data-size=\"xl\"] {\n --sb-h: var(--prime-control-xl-height);\n --sb-icon: var(--prime-control-xl-icon);\n --sb-text: var(--prime-control-xl-text-size);\n --sb-line-height: var(--prime-control-xl-line-height);\n --sb-radius: var(--prime-control-xl-radius);\n --sb-gap: var(--prime-control-xl-gap);\n --sb-badge-h: var(--prime-badge-m-height);\n --sb-badge-px: var(--prime-badge-m-padding-x);\n --sb-badge-text: var(--prime-badge-m-text-size);\n}\n\n.root[data-mode=\"compact\"] {\n --sb-width: var(--sb-compact);\n}\n\n.root[data-mode=\"hidden\"] {\n --sb-width: 0;\n}\n\n.root[data-panel-mode=\"compact\"] {\n --sb-panel-width: var(--sb-compact);\n}\n\n.panel {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: var(--sb-panel-width);\n height: 100%;\n min-height: 0;\n padding-block: var(--prime-space-3);\n padding-inline: var(--sb-pad);\n background: var(--prime-color-bg-canvas);\n color: var(--prime-color-text-primary);\n font-size: var(--sb-text);\n line-height: var(--sb-line-height);\n}\n\n/* --- Regions ----------------------------------------------------------------- */\n\n.header {\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--sb-gap);\n min-width: 0;\n min-height: var(--sb-h);\n overflow: hidden;\n}\n\n.content {\n --sb-fade: var(--prime-space-4);\n\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--prime-space-4);\n min-height: 0;\n /*\n * The scroll edge sits at the panel edge (rows keep the rail padding as focus space). Items\n * scroll under soft fades at both ends; the block padding equals the fade, so at rest nothing\n * is faded and no row is ever cut by a hard edge.\n */\n margin-inline: calc(-1 * var(--sb-pad));\n padding-block: var(--sb-fade);\n padding-inline: var(--sb-pad);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n /* A classic scrollbar would take width and move the icons; the rail scrolls by wheel/touch. */\n scrollbar-width: none;\n mask-image: linear-gradient(\n to bottom,\n transparent,\n black var(--sb-fade),\n black calc(100% - var(--sb-fade)),\n transparent\n );\n}\n\n/* Bare items without groups form one list: item rhythm, not group rhythm. */\n.content:not(:has(> .group)) {\n gap: var(--prime-space-1);\n}\n\n.content::-webkit-scrollbar {\n display: none;\n}\n\n.footer {\n display: flex;\n flex: none;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.groupLabel {\n display: flex;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--sb-item-pad);\n overflow: hidden;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n font-weight: var(--prime-font-weight-medium);\n letter-spacing: var(--prime-text-caption-tracking);\n white-space: nowrap;\n transition: opacity var(--sb-duration) var(--sb-ease);\n}\n\n/* --- Item -------------------------------------------------------------------- */\n\n.item {\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex: none;\n align-items: center;\n gap: var(--sb-gap);\n width: 100%;\n min-width: 0;\n min-height: var(--sb-h);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--sb-item-pad);\n overflow: hidden;\n border: 0;\n border-radius: var(--sb-radius);\n background: transparent;\n color: var(--prime-color-text-secondary);\n font: inherit;\n font-size: var(--sb-text);\n line-height: var(--sb-line-height);\n font-weight: var(--prime-font-weight-medium);\n text-align: start;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--sb-ease),\n color var(--prime-motion-duration-fast) var(--sb-ease),\n box-shadow var(--prime-motion-duration-fast) var(--sb-ease);\n}\n\n.item:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.item:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.item:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n /* Full-width rows inside clipping/scrolling regions: the ring is drawn inside the edge. */\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.item[data-state=\"active\"],\n.item[aria-current=\"page\"] {\n background: var(--prime-color-bg-surface);\n color: var(--prime-color-text-primary);\n box-shadow: var(--prime-shadow-raised);\n}\n\n.item[data-disabled=\"true\"],\n.item:disabled {\n background: transparent;\n color: var(--prime-color-text-disabled);\n box-shadow: none;\n cursor: not-allowed;\n}\n\n.icon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: var(--sb-icon);\n height: var(--sb-icon);\n color: var(--prime-color-text-muted);\n transition: color var(--prime-motion-duration-fast) var(--sb-ease);\n}\n\n.icon > :global(svg) {\n width: 100%;\n height: 100%;\n}\n\n.item:hover .icon,\n.item[data-state=\"active\"] .icon,\n.item[aria-current=\"page\"] .icon {\n color: var(--prime-color-text-primary);\n}\n\n.item[data-disabled=\"true\"] .icon,\n.item:disabled .icon {\n color: var(--prime-color-text-disabled);\n}\n\n.label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n transition: opacity var(--sb-duration) var(--sb-ease);\n}\n\n.badge {\n box-sizing: border-box;\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n min-width: var(--sb-badge-h);\n height: var(--sb-badge-h);\n padding-inline: var(--sb-badge-px);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n font-size: var(--sb-badge-text);\n line-height: 1;\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n}\n\n.shortcut {\n display: inline-flex;\n flex: none;\n align-items: center;\n transition: opacity var(--sb-duration) var(--sb-ease);\n}\n\n/* --- Compact (desktop only) ---------------------------------------------------- */\n\n.root[data-mode=\"compact\"]:not([data-mobile]) .label,\n.root[data-mode=\"compact\"]:not([data-mobile]) .shortcut,\n.root[data-mode=\"compact\"]:not([data-mobile]) .groupLabel {\n opacity: 0;\n}\n\n/* The badge becomes a dot on the icon's top-end corner. */\n.root[data-mode=\"compact\"]:not([data-mobile]) .badge {\n position: absolute;\n inset-block-start: calc(50% - var(--sb-icon) / 2 - var(--prime-space-1) / 2);\n inset-inline-start: calc(var(--sb-item-pad) + var(--sb-icon) - var(--prime-space-1));\n min-width: 0;\n width: var(--prime-space-2);\n height: var(--prime-space-2);\n padding: 0;\n overflow: hidden;\n background: var(--prime-color-accent-default);\n box-shadow: 0 0 0 calc(2 * var(--prime-border-width)) var(--prime-color-bg-canvas);\n color: transparent;\n font-size: 0;\n}\n\n/* --- Off-canvas (responsive, < 768px) ------------------------------------------ */\n\n.scrim {\n position: fixed;\n inset: 0;\n z-index: var(--prime-z-drawer);\n margin: 0;\n padding: 0;\n border: 0;\n background: var(--prime-color-bg-scrim);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--sb-duration) var(--sb-ease);\n}\n\n.root[data-mobile] {\n width: 0;\n overflow: visible;\n transition: none;\n}\n\n.root[data-mobile] .panel {\n position: fixed;\n inset-block: 0;\n inset-inline-start: 0;\n z-index: var(--prime-z-drawer);\n width: min(var(--sb-expanded), calc(100% - var(--prime-space-12)));\n min-width: 0;\n box-shadow: var(--prime-shadow-modal);\n transform: translateX(-100%);\n visibility: hidden;\n transition:\n transform var(--sb-duration) var(--sb-ease),\n visibility 0s linear var(--sb-duration);\n}\n\n.root[data-state=\"open\"] .panel {\n transform: none;\n visibility: visible;\n transition: transform var(--sb-duration) var(--sb-ease);\n}\n\n.root[data-state=\"open\"] .scrim {\n opacity: 1;\n pointer-events: auto;\n}\n", "import { ChevronDown } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Accordion.module.css\";\n\ntype AccordionBaseProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"defaultValue\" | \"onChange\"\n> & {\n /** Trigger, icon and content spacing tier. Default `m`. */\n size?: ControlSize;\n /** `grouped` \u2014 one frame without gaps (default); `separate` \u2014 every item is its own card. */\n layout?: \"grouped\" | \"separate\";\n};\n\n/** One open item at a time; `value` is the open item (`\"\"` when all are closed). */\nexport type AccordionSingleProps = AccordionBaseProps & {\n type?: \"single\";\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** When `false`, the open item cannot be closed by clicking it. Default `true`. */\n collapsible?: boolean;\n};\n\n/** Any number of open items; `value` lists them. */\nexport type AccordionMultipleProps = AccordionBaseProps & {\n type: \"multiple\";\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type AccordionRootProps = AccordionSingleProps | AccordionMultipleProps;\n\ntype AccordionContextValue = { size: ControlSize };\n\nconst [AccordionProvider, useAccordionContext] =\n createComponentContext<AccordionContextValue>(\"Accordion\");\n\ntype AccordionStateContextValue = {\n openValues: string[];\n toggleItem: (value: string, disabled: boolean) => void;\n};\n\nconst [AccordionStateProvider, useAccordionState] =\n createComponentContext<AccordionStateContextValue>(\"Accordion\");\n\ntype AccordionItemContextValue = {\n value: string;\n disabled: boolean;\n open: boolean;\n triggerId: string;\n contentId: string;\n};\n\nconst [AccordionItemProvider, useAccordionItem] =\n createComponentContext<AccordionItemContextValue>(\"Accordion\");\n\nexport type AccordionItemProps = React.HTMLAttributes<HTMLDivElement> & {\n value: string;\n disabled?: boolean;\n};\n\nexport type AccordionHeaderProps = React.HTMLAttributes<HTMLHeadingElement>;\n\nexport type AccordionTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport type AccordionContentProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport type AccordionIconProps<T extends React.ElementType = \"div\"> = {\n as?: T;\n className?: string;\n children?: React.ReactNode;\n} & Omit<React.ComponentPropsWithoutRef<T>, \"as\" | \"className\">;\n\ntype ArrowIcon = React.ElementType<{ className?: string; strokeWidth?: number | string }>;\n\nexport type AccordionArrowProps = React.HTMLAttributes<HTMLSpanElement> & {\n /** Glyph; rotates 180\u00B0 when the item opens. Default `ChevronDown`. */\n icon?: ArrowIcon;\n /** Glyph shown instead of `icon` while open (e.g. `Plus` \u2192 `Minus`); disables the rotation. */\n openIcon?: ArrowIcon;\n};\n\nfunction toOpenValues(value: string | string[] | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n const list = Array.isArray(value) ? value : [value];\n return Array.from(new Set(list.filter((entry) => entry !== \"\")));\n}\n\nconst AccordionRoot = React.forwardRef<HTMLDivElement, AccordionRootProps>(\n function AccordionRoot(props, ref) {\n const {\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n size = \"m\",\n layout = \"grouped\",\n className,\n children,\n ...restWithCollapsible\n } = props;\n const { collapsible = true, ...rest } = restWithCollapsible as typeof restWithCollapsible & {\n collapsible?: boolean;\n };\n const contextValue = React.useMemo(() => ({ size }), [size]);\n const isMultiple = type === \"multiple\";\n const controlledValues = React.useMemo(() => toOpenValues(value), [value]);\n\n const [uncontrolledValues, setUncontrolledValues] = React.useState<string[]>(\n () => toOpenValues(defaultValue) ?? [],\n );\n\n const openValues = controlledValues ?? uncontrolledValues;\n const isControlled = controlledValues !== undefined;\n\n const updateValues = React.useCallback(\n (nextValues: string[]) => {\n if (!isControlled) {\n setUncontrolledValues(nextValues);\n }\n if (isMultiple) {\n (onValueChange as ((next: string[]) => void) | undefined)?.(nextValues);\n } else {\n (onValueChange as ((next: string) => void) | undefined)?.(nextValues[0] ?? \"\");\n }\n },\n [isControlled, isMultiple, onValueChange],\n );\n\n const toggleItem = React.useCallback(\n (itemValue: string, disabledItem: boolean) => {\n if (disabledItem) return;\n\n if (isMultiple) {\n if (openValues.includes(itemValue)) {\n updateValues(openValues.filter((valueEntry) => valueEntry !== itemValue));\n return;\n }\n\n updateValues([...openValues, itemValue]);\n return;\n }\n\n const currentValue = openValues[0];\n if (currentValue === itemValue) {\n if (!collapsible) return;\n updateValues([]);\n return;\n }\n\n updateValues([itemValue]);\n },\n [collapsible, isMultiple, openValues, updateValues],\n );\n\n const stateContextValue = React.useMemo<AccordionStateContextValue>(\n () => ({ openValues, toggleItem }),\n [openValues, toggleItem],\n );\n\n return (\n <AccordionStateProvider value={stateContextValue}>\n <AccordionProvider value={contextValue}>\n <div\n ref={ref}\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, layout })}\n >\n {children}\n </div>\n </AccordionProvider>\n </AccordionStateProvider>\n );\n },\n);\nAccordionRoot.displayName = \"Accordion.Root\";\n\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(\n { className, value, disabled = false, children, ...rest },\n ref,\n) {\n const state = useAccordionState();\n const open = state.openValues.includes(value);\n const reactId = React.useId();\n const triggerId = `prime-accordion-trigger-${reactId}`;\n const contentId = `prime-accordion-content-${reactId}`;\n\n const itemContextValue = React.useMemo<AccordionItemContextValue>(\n () => ({\n value,\n disabled,\n open,\n triggerId,\n contentId,\n }),\n [contentId, disabled, open, triggerId, value],\n );\n\n return (\n <AccordionItemProvider value={itemContextValue}>\n <div\n ref={ref}\n {...rest}\n className={cx(styles.item, className)}\n {...toDataAttributes({ state: open ? \"open\" : \"closed\", disabled: disabled || undefined })}\n >\n {children}\n </div>\n </AccordionItemProvider>\n );\n});\nAccordionItem.displayName = \"Accordion.Item\";\n\nconst AccordionHeader = React.forwardRef<HTMLHeadingElement, AccordionHeaderProps>(\n function AccordionHeader({ className, ...rest }, ref) {\n return <h3 ref={ref} className={cx(styles.header, className)} {...rest} />;\n },\n);\nAccordionHeader.displayName = \"Accordion.Header\";\n\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n function AccordionTrigger({ className, children, ...rest }, ref) {\n const { size } = useAccordionContext();\n const state = useAccordionState();\n const item = useAccordionItem();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n rest.onClick?.(event);\n if (event.defaultPrevented) return;\n state.toggleItem(item.value, item.disabled);\n };\n\n return (\n <button\n ref={ref}\n type={rest.type ?? \"button\"}\n {...rest}\n id={item.triggerId}\n disabled={item.disabled}\n aria-controls={item.contentId}\n aria-expanded={item.open}\n {...toDataAttributes({\n state: item.open ? \"open\" : \"closed\",\n disabled: item.disabled || undefined,\n })}\n className={cx(styles.trigger, className)}\n onClick={handleClick}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </button>\n );\n },\n);\nAccordionTrigger.displayName = \"Accordion.Trigger\";\n\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n function AccordionContent({ className, children, style, ...rest }, ref) {\n const { size } = useAccordionContext();\n const item = useAccordionItem();\n const innerRef = React.useRef<HTMLDivElement | null>(null);\n const [contentHeight, setContentHeight] = React.useState(0);\n\n React.useLayoutEffect(() => {\n if (!innerRef.current) return;\n const target = innerRef.current;\n setContentHeight(target.scrollHeight);\n\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => {\n setContentHeight(target.scrollHeight);\n });\n observer.observe(target);\n return () => observer.disconnect();\n }, []);\n\n const combinedStyle = React.useMemo<React.CSSProperties>(\n () => ({\n ...style,\n \"--prime-accordion-content-height\": `${contentHeight}px`,\n }),\n [contentHeight, style],\n );\n\n const setRefs = (node: HTMLDivElement | null) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n\n return (\n <section\n ref={setRefs}\n id={item.contentId}\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n data-state={item.open ? \"open\" : \"closed\"}\n className={styles.content}\n style={combinedStyle}\n {...rest}\n >\n <div ref={innerRef} className={cx(styles.contentInner, className)}>\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n </section>\n );\n },\n);\nAccordionContent.displayName = \"Accordion.Content\";\n\nfunction AccordionIcon<T extends React.ElementType = \"div\">({\n as,\n className,\n children,\n ...rest\n}: AccordionIconProps<T>) {\n const Component = (as ?? \"div\") as React.ElementType;\n\n return (\n <Component className={cx(styles.icon, className)} {...rest}>\n {children}\n </Component>\n );\n}\nAccordionIcon.displayName = \"Accordion.Icon\";\n\nfunction AccordionArrow({\n className,\n icon: Icon = ChevronDown,\n openIcon: OpenIcon,\n ...rest\n}: AccordionArrowProps) {\n if (OpenIcon == null) {\n return (\n <span className={cx(styles.arrow, className)} {...rest}>\n <Icon\n aria-hidden\n className={cx(styles.arrowIcon, styles.arrowIconRotate)}\n strokeWidth={1.75}\n />\n </span>\n );\n }\n\n return (\n <span className={cx(styles.arrow, className)} {...rest}>\n <Icon\n aria-hidden\n className={cx(styles.arrowIcon, styles.arrowIconClosed)}\n strokeWidth={1.75}\n />\n <OpenIcon\n aria-hidden\n className={cx(styles.arrowIcon, styles.arrowIconOpen)}\n strokeWidth={1.75}\n />\n </span>\n );\n}\nAccordionArrow.displayName = \"Accordion.Arrow\";\n\nexport const Accordion = {\n Root: AccordionRoot,\n Header: AccordionHeader,\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Icon: AccordionIcon,\n Arrow: AccordionArrow,\n Content: AccordionContent,\n};\n", "/*\n * Accordion \u2014 Graphite.\n * grouped: one surface (card radius), hairline separators between items, no outer border.\n * separate: every item is its own surface with a gap between them.\n */\n\n.root {\n --acc-text-size: var(--prime-control-m-text-size);\n --acc-line-height: var(--prime-control-m-line-height);\n --acc-content-size: var(--prime-text-body-m-size);\n --acc-content-line-height: var(--prime-text-body-m-line-height);\n --acc-icon: var(--prime-control-m-icon);\n --acc-gap: var(--prime-space-3);\n --acc-pad-x: var(--prime-space-4);\n --acc-pad-y: var(--prime-space-3);\n --acc-min-height: calc(var(--prime-control-m-height) + var(--prime-space-4));\n\n /* Surface context for fields inside the content. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n border-radius: var(--prime-card-radius);\n background: var(--prime-color-card-bg);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --acc-text-size: var(--prime-control-xs-text-size);\n --acc-line-height: var(--prime-control-xs-line-height);\n --acc-content-size: var(--prime-text-caption-size);\n --acc-content-line-height: var(--prime-text-caption-line-height);\n --acc-icon: var(--prime-control-xs-icon);\n --acc-gap: var(--prime-space-2);\n --acc-pad-x: var(--prime-space-3);\n --acc-pad-y: var(--prime-space-2);\n --acc-min-height: calc(var(--prime-control-xs-height) + var(--prime-space-2));\n}\n\n.root[data-size=\"s\"] {\n --acc-text-size: var(--prime-control-s-text-size);\n --acc-line-height: var(--prime-control-s-line-height);\n --acc-content-size: var(--prime-text-body-s-size);\n --acc-content-line-height: var(--prime-text-body-s-line-height);\n --acc-icon: var(--prime-control-s-icon);\n --acc-gap: var(--prime-space-2);\n --acc-pad-x: var(--prime-space-3);\n --acc-pad-y: var(--prime-space-2);\n --acc-min-height: calc(var(--prime-control-s-height) + var(--prime-space-2));\n}\n\n.root[data-size=\"l\"] {\n --acc-text-size: var(--prime-control-l-text-size);\n --acc-line-height: var(--prime-control-l-line-height);\n --acc-icon: var(--prime-control-l-icon);\n --acc-pad-x: var(--prime-space-5);\n --acc-pad-y: var(--prime-space-4);\n --acc-min-height: calc(var(--prime-control-l-height) + var(--prime-space-4));\n}\n\n.root[data-size=\"xl\"] {\n --acc-text-size: var(--prime-control-xl-text-size);\n --acc-line-height: var(--prime-control-xl-line-height);\n --acc-content-size: var(--prime-text-body-l-size);\n --acc-content-line-height: var(--prime-text-body-l-line-height);\n --acc-icon: var(--prime-control-xl-icon);\n --acc-gap: var(--prime-space-4);\n --acc-pad-x: var(--prime-space-6);\n --acc-pad-y: var(--prime-space-4);\n --acc-min-height: calc(var(--prime-control-xl-height) + var(--prime-space-4));\n}\n\n/* ---------- Items ---------- */\n\n.item {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.item + .item {\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.root[data-layout=\"separate\"] {\n gap: var(--prime-space-2);\n overflow: visible;\n border-radius: 0;\n background: transparent;\n}\n\n.root[data-layout=\"separate\"] .item {\n overflow: hidden;\n border-top: 0;\n border-radius: var(--prime-card-radius);\n background: var(--prime-color-card-bg);\n box-shadow: var(--prime-card-shadow);\n}\n\n.header {\n display: flex;\n min-width: 0;\n margin: 0;\n font: inherit;\n}\n\n.trigger {\n display: flex;\n align-items: center;\n gap: var(--acc-gap);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n min-height: var(--acc-min-height);\n margin: 0;\n padding: var(--acc-pad-y) var(--acc-pad-x);\n border: 0;\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n font-size: var(--acc-text-size);\n line-height: var(--acc-line-height);\n font-weight: var(--prime-font-weight-medium);\n text-align: start;\n overflow-wrap: anywhere;\n cursor: pointer;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.trigger:hover:not(:disabled) {\n background: var(--prime-color-fill-subtle);\n}\n\n.trigger:active:not(:disabled) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.trigger:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.trigger:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--acc-icon);\n height: var(--acc-icon);\n color: var(--prime-color-text-secondary);\n}\n\n.icon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.trigger:disabled .icon {\n color: var(--prime-color-text-disabled);\n}\n\n.arrow {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n margin-inline-start: auto;\n}\n\n.arrowIcon {\n display: block;\n width: var(--acc-icon);\n height: var(--acc-icon);\n color: var(--prime-color-text-muted);\n transition:\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.trigger:hover:not(:disabled) .arrowIcon,\n.item[data-state=\"open\"] .arrowIcon {\n color: var(--prime-color-text-secondary);\n}\n\n.trigger:disabled .arrowIcon {\n color: var(--prime-color-text-disabled);\n}\n\n.arrowIconOpen {\n display: none;\n}\n\n.item[data-state=\"open\"] .arrowIconRotate {\n transform: rotate(180deg);\n}\n\n.item[data-state=\"open\"] .arrowIconClosed {\n display: none;\n}\n\n.item[data-state=\"open\"] .arrowIconOpen {\n display: block;\n}\n\n/* ---------- Content ---------- */\n\n.content {\n width: 100%;\n min-width: 0;\n max-height: 0;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n transition:\n max-height var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n opacity var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n visibility 0s linear var(--prime-motion-duration-base);\n}\n\n.content[data-state=\"open\"] {\n max-height: var(--prime-accordion-content-height, none);\n opacity: 1;\n visibility: visible;\n transition-delay: 0s;\n}\n\n.contentInner {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-3);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n /* Top padding keeps focus rings of the first focusable child inside the clipped `.content`. */\n padding: var(--prime-focus-space) var(--acc-pad-x) var(--acc-pad-y);\n color: var(--prime-color-text-secondary);\n font-size: var(--acc-content-size);\n line-height: var(--acc-content-line-height);\n overflow-wrap: anywhere;\n}\n\n/* Content aligns with the label text when the trigger has a leading icon. */\n.item:has(.trigger > .icon) .contentInner {\n padding-inline-start: calc(var(--acc-pad-x) + var(--acc-icon) + var(--acc-gap));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .content,\n .arrowIcon {\n transition: none;\n }\n}\n", "import * as React from \"react\";\n\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\n\nimport styles from \"./Avatar.module.css\";\n\n/** `xs` 20 \u00B7 `s` 24 \u00B7 `m` 32 \u00B7 `l` 40 \u00B7 `xl` 48 \u00B7 `2xl` 64 (`--prime-avatar-*`). */\nexport type AvatarSize = ControlSize | \"2xl\";\n\nexport type AvatarImageStatus = \"idle\" | \"loading\" | \"loaded\" | \"error\";\n\ntype AvatarContextValue = {\n size: AvatarSize;\n imageStatus: AvatarImageStatus;\n setImageStatus: React.Dispatch<React.SetStateAction<AvatarImageStatus>>;\n};\n\nconst [AvatarProvider, useAvatarContext] = createComponentContext<AvatarContextValue>(\"Avatar\");\n\nexport type AvatarRootProps = {\n size?: AvatarSize;\n /** Fallback color (`--prime-color-palette-<hue>-*`). Default `gray`. */\n color?: PaletteColor;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst AvatarRoot = React.forwardRef<HTMLDivElement, AvatarRootProps>(\n ({ size = \"m\", color = \"gray\", className, children, ...rest }, ref) => {\n const [imageStatus, setImageStatus] = React.useState<AvatarImageStatus>(\"idle\");\n\n const value = React.useMemo(\n () => ({\n size,\n imageStatus,\n setImageStatus,\n }),\n [size, imageStatus],\n );\n\n return (\n <AvatarProvider value={value}>\n <div\n ref={ref}\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, color })}\n {...rest}\n >\n {children}\n </div>\n </AvatarProvider>\n );\n },\n);\n\nAvatarRoot.displayName = \"AvatarRoot\";\n\nexport type AvatarImageProps = {\n src: string;\n alt?: string;\n className?: string;\n} & Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"alt\">;\n\ntype AvatarImageInnerProps = AvatarImageProps & {\n setImageStatus: React.Dispatch<React.SetStateAction<AvatarImageStatus>>;\n};\n\nconst AvatarImageInner = React.forwardRef<HTMLImageElement, AvatarImageInnerProps>(\n ({ setImageStatus, src, alt = \"\", className, onLoad, onError, ...rest }, ref) => {\n const [status, setStatus] = React.useState<\"loading\" | \"loaded\" | \"error\">(\"loading\");\n\n React.useLayoutEffect(() => {\n setImageStatus(\"loading\");\n return () => {\n setImageStatus(\"idle\");\n };\n }, [setImageStatus]);\n\n const handleLoad = React.useCallback(\n (event: React.SyntheticEvent<HTMLImageElement>) => {\n setStatus(\"loaded\");\n setImageStatus(\"loaded\");\n onLoad?.(event);\n },\n [onLoad, setImageStatus],\n );\n\n const handleError = React.useCallback(\n (event: React.SyntheticEvent<HTMLImageElement>) => {\n setStatus(\"error\");\n setImageStatus(\"error\");\n onError?.(event);\n },\n [onError, setImageStatus],\n );\n\n return (\n <img\n ref={ref}\n src={src}\n alt={alt}\n className={cx(styles.image, className)}\n onLoad={handleLoad}\n onError={handleError}\n {...toDataAttributes({ status })}\n {...rest}\n />\n );\n },\n);\n\nAvatarImageInner.displayName = \"AvatarImageInner\";\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>((props, ref) => {\n const { setImageStatus } = useAvatarContext();\n return <AvatarImageInner key={props.src} ref={ref} setImageStatus={setImageStatus} {...props} />;\n});\n\nAvatarImage.displayName = \"AvatarImage\";\n\nexport type AvatarFallbackProps = {\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction AvatarFallback({ children, className, ...rest }: AvatarFallbackProps) {\n const { imageStatus } = useAvatarContext();\n\n return (\n <span\n className={cx(styles.fallback, className)}\n aria-hidden={imageStatus === \"loaded\" ? true : undefined}\n {...rest}\n >\n {children}\n </span>\n );\n}\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport type AvatarPresence = \"online\" | \"offline\" | \"away\" | \"busy\";\n\nexport type AvatarStatusLabels = Record<AvatarPresence, string>;\n\nconst AVATAR_STATUS_LABELS: AvatarStatusLabels = {\n online: \"\u0412 \u0441\u0435\u0442\u0438\",\n offline: \"\u041D\u0435 \u0432 \u0441\u0435\u0442\u0438\",\n away: \"\u041E\u0442\u043E\u0448\u0451\u043B\",\n busy: \"\u0417\u0430\u043D\u044F\u0442\",\n};\n\nexport type AvatarStatusProps = {\n /** Presence shown as a dot on the avatar's bottom-end edge. */\n status: AvatarPresence;\n /** Accessible names of the presence states (Russian defaults). */\n labels?: Partial<AvatarStatusLabels>;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Presence dot; announced as an image with the state name (`labels`). */\nfunction AvatarStatus({ status, labels, className, ...rest }: AvatarStatusProps) {\n useAvatarContext();\n const label = { ...AVATAR_STATUS_LABELS, ...labels }[status];\n return (\n <span\n role=\"img\"\n aria-label={label}\n className={cx(styles.status, className)}\n {...toDataAttributes({ status })}\n {...rest}\n />\n );\n}\n\nAvatarStatus.displayName = \"AvatarStatus\";\n\nconst AVATAR_ROOT_DISPLAY = \"AvatarRoot\";\nconst AVATAR_GROUP_OVERFLOW_DISPLAY = \"AvatarGroupOverflow\";\n\nfunction getComponentDisplayName(type: unknown): string | undefined {\n if (typeof type === \"function\" || (typeof type === \"object\" && type !== null)) {\n return (type as { displayName?: string }).displayName;\n }\n return undefined;\n}\n\nfunction isAvatarRootElement(child: React.ReactElement): boolean {\n return child.type === AvatarRoot || getComponentDisplayName(child.type) === AVATAR_ROOT_DISPLAY;\n}\n\nexport type AvatarGroupOverflowProps = {\n size?: AvatarSize;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst AvatarGroupOverflow = React.forwardRef<HTMLDivElement, AvatarGroupOverflowProps>(\n ({ size = \"m\", className, children, ...rest }, ref) => (\n <div\n ref={ref}\n className={cx(styles.groupOverflow, className)}\n {...toDataAttributes({ size })}\n {...rest}\n >\n {children}\n </div>\n ),\n);\n\nAvatarGroupOverflow.displayName = AVATAR_GROUP_OVERFLOW_DISPLAY;\n\nfunction isAvatarGroupOverflowElement(child: React.ReactElement): boolean {\n return (\n child.type === AvatarGroupOverflow ||\n getComponentDisplayName(child.type) === AVATAR_GROUP_OVERFLOW_DISPLAY\n );\n}\n\nfunction injectAvatarGroupSize(children: React.ReactNode, size: AvatarSize): React.ReactNode {\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) {\n return child;\n }\n if (child.type === React.Fragment) {\n return React.cloneElement(\n child,\n {},\n injectAvatarGroupSize((child.props as { children?: React.ReactNode }).children, size),\n );\n }\n if (isAvatarRootElement(child)) {\n const props = child.props as AvatarRootProps;\n if (props.size !== undefined) {\n return child;\n }\n return React.cloneElement(child, { size } as Partial<AvatarRootProps>);\n }\n if (isAvatarGroupOverflowElement(child)) {\n const props = child.props as AvatarGroupOverflowProps;\n if (props.size !== undefined) {\n return child;\n }\n return React.cloneElement(child, { size } as Partial<AvatarGroupOverflowProps>);\n }\n return child;\n });\n}\n\nexport type AvatarGroupRootProps = {\n size?: AvatarSize;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst AvatarGroupRoot = React.forwardRef<HTMLDivElement, AvatarGroupRootProps>(\n ({ size = \"m\", className, children, role = \"group\", ...rest }, ref) => (\n <div\n ref={ref}\n role={role}\n className={cx(styles.groupRoot, className)}\n {...toDataAttributes({ size })}\n {...rest}\n >\n {injectAvatarGroupSize(children, size)}\n </div>\n ),\n);\n\nAvatarGroupRoot.displayName = \"AvatarGroupRoot\";\n\nexport const Avatar = {\n Root: AvatarRoot,\n Image: AvatarImage,\n Fallback: AvatarFallback,\n Status: AvatarStatus,\n Group: {\n Root: AvatarGroupRoot,\n Overflow: AvatarGroupOverflow,\n },\n};\n", "/*\n * Avatar \u2014 circle sized by `--prime-avatar-<tier>`; fallback initials use palette hues.\n * A host slot may size the avatar to itself by setting `--avatar-slot-size`; it wins over the\n * `size` tier.\n */\n.root,\n.groupOverflow {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-m));\n\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--avatar-size);\n height: var(--avatar-size);\n border-radius: var(--prime-radius-full);\n font-size: calc(var(--avatar-size) * 0.4);\n line-height: 1;\n font-weight: var(--prime-font-weight-medium);\n vertical-align: middle;\n user-select: none;\n}\n\n.root {\n --hue-soft: var(--prime-color-palette-gray-soft);\n --hue-text: var(--prime-color-palette-gray-text);\n\n background: var(--hue-soft);\n color: var(--hue-text);\n}\n\n:is(.root, .groupOverflow)[data-size=\"xs\"] {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-xs));\n}\n\n:is(.root, .groupOverflow)[data-size=\"s\"] {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-s));\n}\n\n:is(.root, .groupOverflow)[data-size=\"l\"] {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-l));\n}\n\n:is(.root, .groupOverflow)[data-size=\"xl\"] {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-xl));\n}\n\n:is(.root, .groupOverflow)[data-size=\"2xl\"] {\n --avatar-size: var(--avatar-slot-size, var(--prime-avatar-2xl));\n}\n\n/* \u2500\u2500\u2500 Hues \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-color=\"red\"] {\n --hue-soft: var(--prime-color-palette-red-soft);\n --hue-text: var(--prime-color-palette-red-text);\n}\n\n.root[data-color=\"blue\"] {\n --hue-soft: var(--prime-color-palette-blue-soft);\n --hue-text: var(--prime-color-palette-blue-text);\n}\n\n.root[data-color=\"green\"] {\n --hue-soft: var(--prime-color-palette-green-soft);\n --hue-text: var(--prime-color-palette-green-text);\n}\n\n.root[data-color=\"orange\"] {\n --hue-soft: var(--prime-color-palette-orange-soft);\n --hue-text: var(--prime-color-palette-orange-text);\n}\n\n.root[data-color=\"yellow\"] {\n --hue-soft: var(--prime-color-palette-yellow-soft);\n --hue-text: var(--prime-color-palette-yellow-text);\n}\n\n.root[data-color=\"purple\"] {\n --hue-soft: var(--prime-color-palette-purple-soft);\n --hue-text: var(--prime-color-palette-purple-text);\n}\n\n.root[data-color=\"sky\"] {\n --hue-soft: var(--prime-color-palette-sky-soft);\n --hue-text: var(--prime-color-palette-sky-text);\n}\n\n.root[data-color=\"pink\"] {\n --hue-soft: var(--prime-color-palette-pink-soft);\n --hue-text: var(--prime-color-palette-pink-text);\n}\n\n.root[data-color=\"teal\"] {\n --hue-soft: var(--prime-color-palette-teal-soft);\n --hue-text: var(--prime-color-palette-teal-text);\n}\n\n/* \u2500\u2500\u2500 Parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.image {\n position: absolute;\n inset: 0;\n z-index: 1;\n border-radius: inherit;\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: opacity var(--prime-motion-duration-base) var(--prime-motion-easing-enter);\n}\n\n.image[data-status=\"loading\"] {\n opacity: 0;\n}\n\n.image[data-status=\"loaded\"] {\n opacity: 1;\n}\n\n.image[data-status=\"error\"] {\n display: none;\n}\n\n.fallback {\n position: absolute;\n inset: 0;\n z-index: 0;\n border-radius: inherit;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n text-align: center;\n}\n\n/* An icon as fallback fills about half of the circle. */\n.fallback > svg {\n width: 50%;\n height: 50%;\n}\n\n/* Presence dot on the bottom-end edge, cut out of the avatar by a ring in the surface color. */\n.status {\n position: absolute;\n inset-block-end: 0;\n inset-inline-end: 0;\n z-index: 2;\n box-sizing: border-box;\n width: calc(var(--avatar-size) * 0.3);\n height: calc(var(--avatar-size) * 0.3);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-success-default);\n box-shadow: 0 0 0 calc(2 * var(--prime-border-width))\n var(--avatar-ring, var(--prime-color-bg-canvas));\n}\n\n.status[data-status=\"offline\"] {\n background: var(--prime-color-palette-gray-solid);\n}\n\n.status[data-status=\"away\"] {\n background: var(--prime-color-warning-default);\n}\n\n.status[data-status=\"busy\"] {\n background: var(--prime-color-danger-default);\n}\n\n/* \u2500\u2500\u2500 Group: overlap with a ring in the surface color \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/*\n * `--avatar-ring` is inherited, not declared here: surfaces (Card, Modal, Drawer, Popover,\n * Sidebar) set it to their own background, so the ring matches wherever the group sits.\n * Canvas is the fallback.\n */\n.groupRoot {\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n isolation: isolate;\n}\n\n.groupRoot > * {\n box-shadow: 0 0 0 calc(2 * var(--prime-border-width))\n var(--avatar-ring, var(--prime-color-bg-canvas));\n}\n\n.groupRoot > * + * {\n margin-inline-start: calc(var(--avatar-size) * -0.25);\n}\n\n.groupOverflow {\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n font-variant-numeric: tabular-nums;\n font-size: calc(var(--avatar-size) * 0.36);\n}\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor, Variant } from \"@/internal/states\";\n\nimport styles from \"./Badge.module.css\";\nimport { useBadgeTier } from \"./tier\";\n\nexport type BadgeRootProps = {\n /** Palette hue (categorization, not status). Default `gray`. */\n color?: PaletteColor;\n /** Treatment. Default `soft`. */\n variant?: Exclude<Variant, \"ghost\">;\n /** Badge tier; without it the badge follows the surrounding control one tier down. */\n size?: ControlSize;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nexport type BadgeIconProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nexport type BadgeDotProps = {\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nconst BadgeRoot = React.forwardRef<HTMLSpanElement, BadgeRootProps>(\n (\n { color = \"gray\", variant = \"soft\", size: sizeProp, disabled, children, className, ...rest },\n ref,\n ) => {\n const { size, tier } = useBadgeTier(sizeProp);\n const iconOnly =\n React.Children.count(children) > 0 &&\n React.Children.toArray(children).every(\n (child) => React.isValidElement(child) && child.type === BadgeIcon,\n );\n\n return (\n <span\n ref={ref}\n className={cx(styles.root, className)}\n {...toDataAttributes({\n color,\n variant,\n size,\n tier,\n \"icon-only\": iconOnly || undefined,\n disabled: disabled || undefined,\n })}\n {...rest}\n >\n <ControlSizeProvider value={tier}>{children}</ControlSizeProvider>\n </span>\n );\n },\n);\n\nBadgeRoot.displayName = \"BadgeRoot\";\n\nfunction BadgeIcon({ children, className, ...rest }: BadgeIconProps) {\n return (\n <span className={cx(styles.icon, className)} {...rest}>\n {children}\n </span>\n );\n}\n\nBadgeIcon.displayName = \"BadgeIcon\";\n\nfunction BadgeDot({ className, ...rest }: BadgeDotProps) {\n return <span className={cx(styles.dot, className)} aria-hidden=\"true\" {...rest} />;\n}\n\nBadgeDot.displayName = \"BadgeDot\";\n\nexport const Badge = { Root: BadgeRoot, Icon: BadgeIcon, Dot: BadgeDot };\n", "/*\n * Badge \u2014 soft by default, no borders. Dimensions come from `--prime-badge-<tier>-*`,\n * colors from `--prime-color-palette-<hue>-*`. `data-tier` is the visual tier\n * (equals `data-size` unless the size was inherited from a control, see ./tier.ts).\n */\n.root {\n --badge-h: var(--prime-badge-m-height);\n --badge-px: var(--prime-badge-m-padding-x);\n --badge-gap: var(--prime-badge-m-gap);\n --badge-radius: var(--prime-badge-m-radius);\n --badge-text: var(--prime-badge-m-text-size);\n --badge-lh: var(--prime-text-caption-line-height);\n --badge-dot: calc(var(--prime-space-1) + 2 * var(--prime-border-width));\n --prime-icon-size: var(--prime-badge-m-icon);\n\n --hue-soft: var(--prime-color-palette-gray-soft);\n --hue-text: var(--prime-color-palette-gray-text);\n --hue-solid: var(--prime-color-palette-gray-solid);\n --hue-solid-fg: var(--prime-color-palette-gray-solid-fg);\n\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--badge-gap);\n height: var(--badge-h);\n min-width: var(--badge-h);\n max-width: 100%;\n padding-inline: var(--badge-px);\n border-radius: var(--badge-radius);\n font-size: var(--badge-text);\n line-height: var(--badge-lh);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n vertical-align: middle;\n overflow: hidden;\n}\n\n/* \u2500\u2500\u2500 Tiers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-tier=\"xs\"] {\n --badge-h: var(--prime-badge-xs-height);\n --badge-px: var(--prime-badge-xs-padding-x);\n --badge-gap: var(--prime-badge-xs-gap);\n --badge-radius: var(--prime-badge-xs-radius);\n --badge-text: var(--prime-badge-xs-text-size);\n --prime-icon-size: var(--prime-badge-xs-icon);\n}\n\n.root[data-tier=\"s\"] {\n --badge-h: var(--prime-badge-s-height);\n --badge-px: var(--prime-badge-s-padding-x);\n --badge-gap: var(--prime-badge-s-gap);\n --badge-radius: var(--prime-badge-s-radius);\n --badge-text: var(--prime-badge-s-text-size);\n --prime-icon-size: var(--prime-badge-s-icon);\n}\n\n.root[data-tier=\"l\"] {\n --badge-h: var(--prime-badge-l-height);\n --badge-px: var(--prime-badge-l-padding-x);\n --badge-gap: var(--prime-badge-l-gap);\n --badge-radius: var(--prime-badge-l-radius);\n --badge-text: var(--prime-badge-l-text-size);\n --badge-lh: var(--prime-text-body-s-line-height);\n --badge-dot: var(--prime-space-2);\n --prime-icon-size: var(--prime-badge-l-icon);\n}\n\n.root[data-tier=\"xl\"] {\n --badge-h: var(--prime-badge-xl-height);\n --badge-px: var(--prime-badge-xl-padding-x);\n --badge-gap: var(--prime-badge-xl-gap);\n --badge-radius: var(--prime-badge-xl-radius);\n --badge-text: var(--prime-badge-xl-text-size);\n --badge-lh: var(--prime-text-body-m-line-height);\n --badge-dot: var(--prime-space-2);\n --prime-icon-size: var(--prime-badge-xl-icon);\n}\n\n.root[data-icon-only=\"true\"] {\n justify-content: center;\n width: var(--badge-h);\n padding-inline: 0;\n}\n\n/* \u2500\u2500\u2500 Hues \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-color=\"red\"] {\n --hue-soft: var(--prime-color-palette-red-soft);\n --hue-text: var(--prime-color-palette-red-text);\n --hue-solid: var(--prime-color-palette-red-solid);\n --hue-solid-fg: var(--prime-color-palette-red-solid-fg);\n}\n\n.root[data-color=\"blue\"] {\n --hue-soft: var(--prime-color-palette-blue-soft);\n --hue-text: var(--prime-color-palette-blue-text);\n --hue-solid: var(--prime-color-palette-blue-solid);\n --hue-solid-fg: var(--prime-color-palette-blue-solid-fg);\n}\n\n.root[data-color=\"green\"] {\n --hue-soft: var(--prime-color-palette-green-soft);\n --hue-text: var(--prime-color-palette-green-text);\n --hue-solid: var(--prime-color-palette-green-solid);\n --hue-solid-fg: var(--prime-color-palette-green-solid-fg);\n}\n\n.root[data-color=\"orange\"] {\n --hue-soft: var(--prime-color-palette-orange-soft);\n --hue-text: var(--prime-color-palette-orange-text);\n --hue-solid: var(--prime-color-palette-orange-solid);\n --hue-solid-fg: var(--prime-color-palette-orange-solid-fg);\n}\n\n.root[data-color=\"yellow\"] {\n --hue-soft: var(--prime-color-palette-yellow-soft);\n --hue-text: var(--prime-color-palette-yellow-text);\n --hue-solid: var(--prime-color-palette-yellow-solid);\n --hue-solid-fg: var(--prime-color-palette-yellow-solid-fg);\n}\n\n.root[data-color=\"purple\"] {\n --hue-soft: var(--prime-color-palette-purple-soft);\n --hue-text: var(--prime-color-palette-purple-text);\n --hue-solid: var(--prime-color-palette-purple-solid);\n --hue-solid-fg: var(--prime-color-palette-purple-solid-fg);\n}\n\n.root[data-color=\"sky\"] {\n --hue-soft: var(--prime-color-palette-sky-soft);\n --hue-text: var(--prime-color-palette-sky-text);\n --hue-solid: var(--prime-color-palette-sky-solid);\n --hue-solid-fg: var(--prime-color-palette-sky-solid-fg);\n}\n\n.root[data-color=\"pink\"] {\n --hue-soft: var(--prime-color-palette-pink-soft);\n --hue-text: var(--prime-color-palette-pink-text);\n --hue-solid: var(--prime-color-palette-pink-solid);\n --hue-solid-fg: var(--prime-color-palette-pink-solid-fg);\n}\n\n.root[data-color=\"teal\"] {\n --hue-soft: var(--prime-color-palette-teal-soft);\n --hue-text: var(--prime-color-palette-teal-text);\n --hue-solid: var(--prime-color-palette-teal-solid);\n --hue-solid-fg: var(--prime-color-palette-teal-solid-fg);\n}\n\n/* \u2500\u2500\u2500 Variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-variant=\"solid\"] {\n background: var(--hue-solid);\n color: var(--hue-solid-fg);\n}\n\n.root[data-variant=\"soft\"] {\n background: var(--hue-soft);\n color: var(--hue-text);\n}\n\n.root[data-variant=\"outline\"] {\n background: transparent;\n box-shadow: inset 0 0 0 var(--prime-border-width)\n color-mix(in srgb, var(--hue-text) 32%, transparent);\n color: var(--hue-text);\n}\n\n.root[data-disabled=\"true\"] {\n background: var(--prime-color-fill-muted);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.dot {\n flex-shrink: 0;\n width: var(--badge-dot);\n height: var(--badge-dot);\n border-radius: var(--prime-radius-full);\n background: currentColor;\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n}\n\n.icon > * {\n width: 100%;\n height: 100%;\n}\n", "import { useOptionalControlSize } from \"@/internal/ControlSizeContext\";\nimport type { ControlSize } from \"@/internal/states\";\n\n/**\n * Badge tiers (`--prime-badge-<tier>-*`): 16 \u00B7 20 \u00B7 24 \u00B7 28 \u00B7 32. Shared by Badge, Tag and Kbd.\n * Pairing rule (foundation \u00A76): inside a control of tier T a badge uses the tier one step down.\n */\nconst STEP_DOWN: Record<ControlSize, ControlSize> = {\n xs: \"xs\",\n s: \"xs\",\n m: \"s\",\n l: \"m\",\n xl: \"l\",\n};\n\nexport type ResolvedBadgeTier = {\n /** Nominal size exposed as `data-size`: the explicit prop, else the surrounding control size. */\n size: ControlSize;\n /** Visual tier exposed as `data-tier`; drives every dimension in CSS. */\n tier: ControlSize;\n};\n\n/**\n * Explicit `size` wins and is used as is. Without it the chip follows the nearest\n * `ControlSizeProvider` one tier down; with no provider the default is `m`.\n */\nexport function useBadgeTier(sizeProp: ControlSize | undefined): ResolvedBadgeTier {\n const surface = useOptionalControlSize();\n if (sizeProp !== undefined) return { size: sizeProp, tier: sizeProp };\n if (surface !== undefined) return { size: surface, tier: STEP_DOWN[surface] };\n return { size: \"m\", tier: \"m\" };\n}\n", "import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/button/Button\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone, Variant } from \"@/internal/states\";\n\nimport styles from \"./Banner.module.css\";\n\nexport type BannerLabels = {\n /** `aria-label` of the close button. */\n dismiss: string;\n};\n\nconst DEFAULT_LABELS: BannerLabels = { dismiss: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C\" };\n\nconst BannerLabelsContext = React.createContext<BannerLabels>(DEFAULT_LABELS);\n\n/**\n * When the banner has actions, dismiss moves into the actions row as a regular square button of the\n * same size, so it lines up with the other buttons; otherwise it is the small corner close.\n */\ntype BannerDismissContextValue = {\n onDismiss?: () => void;\n size: ControlSize;\n registerActions: () => () => void;\n};\nconst BannerDismissContext = React.createContext<BannerDismissContextValue | null>(null);\n\nexport type BannerRootProps = {\n /** Treatment: `soft` tinted fill (default), `solid` saturated fill, `outline` surface with a tone ring. */\n variant?: Exclude<Variant, \"ghost\">;\n /** Semantic color. Default `info`. */\n tone?: Tone;\n /** Spacing and type tier. Default `m`. */\n size?: ControlSize;\n /**\n * `inset` (default): rounded block in the content flow or inside a card.\n * `page`: edge-to-edge strip (no radius) at the top of a page or app shell; content follows the\n * page content column.\n */\n placement?: \"inset\" | \"page\";\n /** Renders a close button (unless `Banner.CloseButton` is already a child) and calls this on click. */\n onDismiss?: () => void;\n /** Built-in strings. */\n labels?: Partial<BannerLabels>;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction childHasCloseButton(children: React.ReactNode): boolean {\n return React.Children.toArray(children).some(\n (c) => React.isValidElement(c) && c.type === BannerCloseButton,\n );\n}\n\nconst BannerRoot = React.forwardRef<HTMLDivElement, BannerRootProps>(function BannerRoot(\n {\n variant = \"soft\",\n tone = \"info\",\n size = \"m\",\n placement = \"inset\",\n onDismiss,\n labels: labelsProp,\n className,\n children,\n ...rest\n },\n forwardedRef,\n) {\n const [actionsCount, setActionsCount] = React.useState(0);\n const registerActions = React.useCallback(() => {\n setActionsCount((n) => n + 1);\n return () => setActionsCount((n) => n - 1);\n }, []);\n const dismissContext = React.useMemo<BannerDismissContextValue>(\n () => ({ onDismiss, size, registerActions }),\n [onDismiss, size, registerActions],\n );\n const showInjectedClose =\n Boolean(onDismiss) && !childHasCloseButton(children) && actionsCount === 0;\n const dismiss = labelsProp?.dismiss ?? DEFAULT_LABELS.dismiss;\n const labels = React.useMemo<BannerLabels>(() => ({ dismiss }), [dismiss]);\n\n return (\n <div\n ref={forwardedRef}\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ variant, tone, size, placement })}\n >\n <BannerLabelsContext.Provider value={labels}>\n <BannerDismissContext.Provider value={dismissContext}>\n <ControlSizeProvider value={size}>\n {children}\n {showInjectedClose ? <BannerCloseButton onClick={onDismiss} /> : null}\n </ControlSizeProvider>\n </BannerDismissContext.Provider>\n </BannerLabelsContext.Provider>\n </div>\n );\n});\nBannerRoot.displayName = \"BannerRoot\";\n\nexport type BannerContentProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/** Layout of the message: icon on the first line, title over description, actions right (under the text when narrow). */\nfunction BannerContent({ className, children, ...rest }: BannerContentProps) {\n return (\n <div className={cx(styles.content, className)} {...rest}>\n {children}\n </div>\n );\n}\nBannerContent.displayName = \"BannerContent\";\n\nexport type BannerIconProps<T extends React.ElementType = \"div\"> = {\n as?: T;\n className?: string;\n children?: React.ReactNode;\n} & Omit<React.ComponentPropsWithoutRef<T>, \"as\" | \"className\">;\n\nfunction BannerIcon<T extends React.ElementType = \"div\">({\n as,\n className,\n children,\n ...rest\n}: BannerIconProps<T>) {\n const Component = (as ?? \"div\") as React.ElementType;\n\n return (\n <Component className={cx(styles.icon, className)} {...rest}>\n {children}\n </Component>\n );\n}\nBannerIcon.displayName = \"BannerIcon\";\n\nexport type BannerTitleProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction BannerTitle({ className, children, ...rest }: BannerTitleProps) {\n return (\n <span className={cx(styles.title, className)} {...rest}>\n {children}\n </span>\n );\n}\nBannerTitle.displayName = \"BannerTitle\";\n\nexport type BannerDescriptionProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction BannerDescription({ className, children, ...rest }: BannerDescriptionProps) {\n return (\n <span className={cx(styles.description, className)} {...rest}>\n {children}\n </span>\n );\n}\nBannerDescription.displayName = \"BannerDescription\";\n\nexport type BannerActionsProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/** Action buttons take the banner `size`; with `onDismiss` the close button joins this row. */\nfunction BannerActions({ className, children, ...rest }: BannerActionsProps) {\n const dismiss = React.useContext(BannerDismissContext);\n const labels = React.useContext(BannerLabelsContext);\n const register = dismiss?.registerActions;\n const hasDismiss = Boolean(dismiss?.onDismiss);\n\n React.useLayoutEffect(() => {\n if (!register || !hasDismiss) return;\n return register();\n }, [register, hasDismiss]);\n\n return (\n <div className={cx(styles.actions, className)} {...rest}>\n {children}\n {dismiss?.onDismiss ? (\n <Button.Root\n variant=\"outline\"\n tone=\"neutral\"\n size={dismiss.size}\n aria-label={labels.dismiss}\n className={styles.actionsClose}\n onClick={dismiss.onDismiss}\n >\n <Button.Icon>\n <X aria-hidden strokeWidth={2} />\n </Button.Icon>\n </Button.Root>\n ) : null}\n </div>\n );\n}\nBannerActions.displayName = \"BannerActions\";\n\nexport type BannerCloseButtonProps = {\n className?: string;\n children?: React.ReactNode;\n} & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"size\">;\n\nconst BannerCloseButton = React.forwardRef<HTMLButtonElement, BannerCloseButtonProps>(\n function BannerCloseButton(\n { className, children, type = \"button\", \"aria-label\": ariaLabel, ...rest },\n forwardedRef,\n ) {\n const labels = React.useContext(BannerLabelsContext);\n return (\n <button\n ref={forwardedRef}\n type={type}\n aria-label={ariaLabel ?? (children == null ? labels.dismiss : undefined)}\n className={cx(styles.closeButton, className)}\n {...rest}\n >\n {children ?? <X className={styles.closeIcon} aria-hidden strokeWidth={2} />}\n </button>\n );\n },\n);\nBannerCloseButton.displayName = \"BannerCloseButton\";\n\nexport const Banner = {\n Root: BannerRoot,\n Content: BannerContent,\n Icon: BannerIcon,\n Title: BannerTitle,\n Description: BannerDescription,\n Actions: BannerActions,\n CloseButton: BannerCloseButton,\n};\n", "import * as React from \"react\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { Slot } from \"@/internal/slot\";\nimport type { ControlSize, Tone, Variant } from \"@/internal/states\";\n\nimport styles from \"./Button.module.css\";\n\ntype ButtonContextValue = {\n loading: boolean;\n};\n\nconst [ButtonProvider, useButtonContext] = createComponentContext<ButtonContextValue>(\"Button\");\n\ntype ButtonLayout = {\n iconOnly: boolean;\n leadingIcon: boolean;\n trailingIcon: boolean;\n hasSpinner: boolean;\n};\n\n/**\n * Reads the direct children to drive optical padding (icon side = padX \u2212 4px),\n * the square icon-only shape and where the loading spinner goes.\n */\nfunction getButtonLayout(children: React.ReactNode): ButtonLayout {\n const items = React.Children.toArray(children).filter(\n (child) => !(typeof child === \"string\" && child.trim() === \"\"),\n );\n const isIcon = (child: React.ReactNode) =>\n React.isValidElement(child) && child.type === ButtonIcon;\n const isSpinner = (child: React.ReactNode) =>\n React.isValidElement(child) && child.type === ButtonSpinner;\n const content = items.filter((child) => !isSpinner(child));\n const iconOnly = content.length > 0 && content.every(isIcon);\n\n return {\n iconOnly,\n leadingIcon: !iconOnly && content.length > 0 && isIcon(content[0]),\n trailingIcon: !iconOnly && content.length > 0 && isIcon(content[content.length - 1]),\n hasSpinner: items.some(isSpinner),\n };\n}\n\nexport type ButtonRootProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"size\"> & {\n /** Visual treatment. Default `solid`. */\n variant?: Variant;\n /** Semantic color. Default `accent`; `danger` for destructive actions. */\n tone?: Extract<Tone, \"accent\" | \"neutral\" | \"danger\">;\n size?: ControlSize;\n fullWidth?: boolean;\n loading?: boolean;\n /**\n * Merges Button props onto its single child element instead of rendering `<button>`.\n * Use when the trigger must be a different element (e.g. `<a>`, React Router `<Link>`).\n *\n * - `disabled` / `loading` \u2192 `aria-disabled=\"true\"` + `pointer-events: none` (CSS);\n * native `disabled` attribute is NOT set (invalid on non-button elements).\n * - `type` is not forwarded (irrelevant for non-button elements).\n * - The child must accept `className`, `aria-*`, `data-*`, and event handler props.\n */\n asChild?: boolean;\n};\n\nconst ButtonRoot = React.forwardRef<HTMLButtonElement, ButtonRootProps>(\n (\n {\n children,\n className,\n variant = \"solid\",\n tone = \"accent\",\n size = \"m\",\n fullWidth,\n type = \"button\",\n loading = false,\n disabled,\n asChild = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...rest\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n const contextValue = React.useMemo(() => ({ loading }), [loading]);\n\n const layout = getButtonLayout(children);\n const dataAttrs = toDataAttributes({\n variant,\n tone,\n size,\n disabled: isDisabled || undefined,\n loading,\n \"full-width\": fullWidth,\n \"icon-only\": layout.iconOnly || undefined,\n \"leading-icon\": layout.leadingIcon || undefined,\n \"trailing-icon\": layout.trailingIcon || undefined,\n // Auto spinner without a leading icon is centered over the hidden label: width stays put.\n \"loading-overlay\":\n (loading && !asChild && !layout.hasSpinner && !layout.leadingIcon && !layout.iconOnly) ||\n undefined,\n });\n\n if (asChild) {\n const { onClick: userOnClick, ...restWithoutClick } = rest;\n return (\n <ButtonProvider value={contextValue}>\n <ControlSizeProvider value={size}>\n <Slot\n {...restWithoutClick}\n ref={ref as React.Ref<HTMLElement>}\n className={cx(styles.root, className)}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n onClick={\n isDisabled\n ? (e: React.MouseEvent) => {\n e.preventDefault();\n }\n : userOnClick\n }\n {...dataAttrs}\n >\n {children}\n </Slot>\n </ControlSizeProvider>\n </ButtonProvider>\n );\n }\n\n return (\n <ButtonProvider value={contextValue}>\n <button\n {...rest}\n ref={ref}\n type={type}\n className={cx(styles.root, className)}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n {...dataAttrs}\n >\n <ControlSizeProvider value={size}>\n {loading && !layout.hasSpinner ? (\n <span className={styles.spinner} aria-hidden=\"true\" />\n ) : null}\n {children}\n </ControlSizeProvider>\n </button>\n </ButtonProvider>\n );\n },\n);\n\nButtonRoot.displayName = \"ButtonRoot\";\n\nexport type ButtonIconProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nfunction ButtonIcon({ children, className, ...rest }: ButtonIconProps) {\n return (\n <span className={cx(styles.icon, className)} aria-hidden=\"true\" {...rest}>\n {children}\n </span>\n );\n}\n\nButtonIcon.displayName = \"ButtonIcon\";\n\nexport type ButtonSpinnerProps = {\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction ButtonSpinner({ className, ...rest }: ButtonSpinnerProps) {\n const { loading } = useButtonContext();\n if (!loading) return null;\n return <span className={cx(styles.spinner, className)} aria-hidden=\"true\" {...rest} />;\n}\n\nButtonSpinner.displayName = \"ButtonSpinner\";\n\nexport const Button = { Root: ButtonRoot, Icon: ButtonIcon, Spinner: ButtonSpinner };\n", "/*\n * Button \u2014 fill-based, no visible outline (`outline` draws a 1px inset line).\n * Geometry comes from `--prime-control-<tier>-*` so Button, Input and Select of one size align in a row.\n * Colors go through private vars: every tone \u00D7 variant only assigns them.\n */\n.root {\n --btn-h: var(--prime-control-m-height);\n --btn-px: var(--prime-control-m-padding-x);\n --btn-radius: var(--prime-control-m-radius);\n --btn-gap: var(--prime-control-m-gap);\n --btn-text: var(--prime-control-m-text-size);\n --btn-lh: var(--prime-control-m-line-height);\n --prime-icon-size: var(--prime-control-m-icon);\n /* Optical compensation on the icon side: padX \u2212 4px, never closer than 8px to the edge (xs). */\n --btn-px-icon: max(calc(var(--btn-px) - var(--prime-space-1)), var(--prime-space-2));\n\n --btn-bg: transparent;\n --btn-bg-hover: var(--prime-color-fill-subtle);\n --btn-bg-active: var(--btn-bg-hover);\n --btn-fg: var(--prime-color-text-primary);\n --btn-line: transparent;\n --btn-depth: 0 0 transparent;\n\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--btn-gap);\n height: var(--btn-h);\n min-width: var(--btn-h);\n max-width: 100%;\n padding-block: 0;\n padding-inline: var(--btn-px);\n margin: 0;\n border: 0;\n border-radius: var(--btn-radius);\n background: var(--btn-bg);\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--btn-line),\n var(--btn-depth);\n color: var(--btn-fg);\n font-family: inherit;\n font-size: var(--btn-text);\n line-height: var(--btn-lh);\n font-weight: var(--prime-font-weight-medium);\n white-space: nowrap;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* \u2500\u2500\u2500 Sizes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-size=\"xs\"] {\n --btn-h: var(--prime-control-xs-height);\n --btn-px: var(--prime-control-xs-padding-x);\n --btn-radius: var(--prime-control-xs-radius);\n --btn-gap: var(--prime-control-xs-gap);\n --btn-text: var(--prime-control-xs-text-size);\n --btn-lh: var(--prime-control-xs-line-height);\n --prime-icon-size: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"s\"] {\n --btn-h: var(--prime-control-s-height);\n --btn-px: var(--prime-control-s-padding-x);\n --btn-radius: var(--prime-control-s-radius);\n --btn-gap: var(--prime-control-s-gap);\n --btn-text: var(--prime-control-s-text-size);\n --btn-lh: var(--prime-control-s-line-height);\n --prime-icon-size: var(--prime-control-s-icon);\n}\n\n.root[data-size=\"l\"] {\n --btn-h: var(--prime-control-l-height);\n --btn-px: var(--prime-control-l-padding-x);\n --btn-radius: var(--prime-control-l-radius);\n --btn-gap: var(--prime-control-l-gap);\n --btn-text: var(--prime-control-l-text-size);\n --btn-lh: var(--prime-control-l-line-height);\n --prime-icon-size: var(--prime-control-l-icon);\n}\n\n.root[data-size=\"xl\"] {\n --btn-h: var(--prime-control-xl-height);\n --btn-px: var(--prime-control-xl-padding-x);\n --btn-radius: var(--prime-control-xl-radius);\n --btn-gap: var(--prime-control-xl-gap);\n --btn-text: var(--prime-control-xl-text-size);\n --btn-lh: var(--prime-control-xl-line-height);\n --prime-icon-size: var(--prime-control-xl-icon);\n}\n\n/* Optical compensation on the icon side. */\n.root[data-leading-icon=\"true\"] {\n padding-inline-start: var(--btn-px-icon);\n}\n\n.root[data-trailing-icon=\"true\"] {\n padding-inline-end: var(--btn-px-icon);\n}\n\n/* Icon-only buttons are square. */\n.root[data-icon-only=\"true\"] {\n width: var(--btn-h);\n padding-inline: 0;\n}\n\n.root[data-full-width=\"true\"] {\n display: flex;\n width: 100%;\n min-width: 0;\n}\n\n/* Nested Typography takes the control's type scale instead of its own role. */\n.root :is(p, span, div, small)[data-variant] {\n font-size: inherit;\n line-height: inherit;\n font-weight: inherit;\n color: inherit;\n}\n\n/* \u2500\u2500\u2500 Tone \u00D7 variant: assign colors only \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* accent */\n.root[data-tone=\"accent\"][data-variant=\"solid\"] {\n --btn-bg: var(--prime-color-accent-default);\n --btn-bg-hover: var(--prime-color-accent-hover);\n --btn-fg: var(--prime-color-accent-fg);\n}\n\n.root[data-tone=\"accent\"][data-variant=\"soft\"] {\n --btn-bg: var(--prime-color-accent-soft);\n --btn-bg-hover: var(--prime-color-accent-soft-hover);\n --btn-fg: var(--prime-color-accent-text);\n}\n\n.root[data-tone=\"accent\"][data-variant=\"outline\"] {\n --btn-line: var(--prime-color-border-default);\n --btn-fg: var(--prime-color-accent-text);\n}\n\n.root[data-tone=\"accent\"][data-variant=\"ghost\"] {\n --btn-bg-active: var(--prime-color-fill-subtle-active);\n --btn-fg: var(--prime-color-accent-text);\n}\n\n/* neutral */\n.root[data-tone=\"neutral\"][data-variant=\"solid\"] {\n --btn-bg: var(--prime-color-fill-muted);\n --btn-bg-hover: var(--prime-color-fill-muted-hover);\n}\n\n.root[data-tone=\"neutral\"][data-variant=\"soft\"] {\n --btn-bg: var(--prime-color-fill-subtle);\n --btn-bg-hover: var(--prime-color-fill-subtle-active);\n}\n\n.root[data-tone=\"neutral\"][data-variant=\"outline\"] {\n --btn-line: var(--prime-color-border-default);\n}\n\n.root[data-tone=\"neutral\"][data-variant=\"ghost\"] {\n --btn-bg-active: var(--prime-color-fill-subtle-active);\n --btn-fg: var(--prime-color-text-secondary);\n}\n\n.root[data-tone=\"neutral\"][data-variant=\"ghost\"]:hover:not([data-disabled=\"true\"]) {\n --btn-fg: var(--prime-color-text-primary);\n}\n\n/* danger */\n.root[data-tone=\"danger\"][data-variant=\"solid\"] {\n --btn-bg: var(--prime-color-danger-default);\n --btn-bg-hover: var(--prime-color-danger-hover);\n --btn-fg: var(--prime-color-danger-fg);\n}\n\n.root[data-tone=\"danger\"][data-variant=\"soft\"] {\n --btn-bg: var(--prime-color-danger-soft);\n --btn-bg-hover: color-mix(\n in srgb,\n var(--prime-color-danger-soft) 88%,\n var(--prime-color-danger-default)\n );\n --btn-fg: var(--prime-color-danger-text);\n}\n\n.root[data-tone=\"danger\"][data-variant=\"outline\"] {\n --btn-line: var(--prime-color-border-default);\n --btn-bg-hover: var(--prime-color-danger-soft);\n --btn-fg: var(--prime-color-danger-text);\n}\n\n.root[data-tone=\"danger\"][data-variant=\"ghost\"] {\n --btn-bg-hover: var(--prime-color-danger-soft);\n --btn-fg: var(--prime-color-danger-text);\n}\n\n/* \u2500\u2500\u2500 Interaction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root:hover:not([data-disabled=\"true\"]) {\n background-color: var(--btn-bg-hover);\n}\n\n.root:active:not([data-disabled=\"true\"]) {\n background-color: var(--btn-bg-active);\n transform: scale(0.98);\n}\n\n.root:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* Active navigation item when rendered via `asChild` (e.g. NavLink sets aria-current). */\n.root[aria-current=\"page\"]:is([data-variant=\"ghost\"], [data-variant=\"soft\"]) {\n --btn-bg: var(--prime-color-fill-subtle-active);\n --btn-fg: var(--prime-color-text-primary);\n}\n\n.root[data-disabled=\"true\"]:not([data-loading=\"true\"]) {\n --btn-bg: var(--prime-color-fill-muted);\n --btn-fg: var(--prime-color-text-disabled);\n --btn-line: transparent;\n --btn-depth: 0 0 transparent;\n\n background-image: none;\n box-shadow: none;\n cursor: not-allowed;\n}\n\n.root[data-disabled=\"true\"]:not([data-loading=\"true\"])[data-variant=\"ghost\"] {\n --btn-bg: transparent;\n}\n\n/* asChild: non-button hosts cannot be natively disabled. */\n.root[aria-disabled=\"true\"] {\n pointer-events: none;\n}\n\n/* \u2500\u2500\u2500 Icon & loading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n}\n\n.icon > svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.spinner {\n order: -1;\n flex-shrink: 0;\n box-sizing: border-box;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n border: calc(var(--prime-border-width) * 2) solid var(--btn-fg);\n border-inline-end-color: transparent;\n border-radius: var(--prime-radius-full);\n animation: prime-button-spin calc(var(--prime-motion-duration-slow) * 3) linear infinite;\n}\n\n.root[data-loading=\"true\"] {\n cursor: progress;\n}\n\n/* Spinner takes the place of the leading (or only) icon: width does not change. */\n.root[data-loading=\"true\"]:is([data-leading-icon=\"true\"], [data-icon-only=\"true\"])\n> .icon:not(.icon ~ .icon) {\n display: none;\n}\n\n/* No leading icon: the auto spinner is centered over the label, which keeps its space. */\n.root[data-loading-overlay=\"true\"] {\n color: transparent;\n}\n\n.root[data-loading-overlay=\"true\"] > .spinner {\n position: absolute;\n inset: 0;\n margin: auto;\n}\n\n@keyframes prime-button-spin {\n to {\n transform: rotate(360deg);\n }\n}\n", "/*\n * Banner \u2014 Graphite. In-flow message block, no borders.\n * soft: tinted tone fill, primary text, tone icon \u00B7 solid: saturated tone fill \u00B7\n * outline: card fill with a hairline tone ring.\n *\n * Layout (left-aligned, Notification's status-icon pattern):\n * [icon] [title ] [actions] [\u00D7]\n * [description ]\n * The icon sits on the title's first line, title and description stack in a text column capped at\n * the reading width, actions are on the right and vertically centered on the text. Below 36rem of the\n * banner's own width (container query) the actions move under the text. The close button is top-right,\n * centered on the first line.\n * Spacing lives in item paddings (not grid gaps), so absent parts leave no empty gutters.\n * `placement=\"page\"`: edge-to-edge strip without radius, content aligned to the page content column.\n */\n\n.root {\n --bn-bg: var(--prime-color-info-default);\n --bn-fg: var(--prime-color-info-fg);\n --bn-icon-color: currentColor;\n --bn-desc-color: currentColor;\n --bn-soft: var(--prime-color-info-soft);\n --bn-text: var(--prime-color-info-text);\n --bn-solid: var(--prime-color-info-default);\n --bn-solid-fg: var(--prime-color-info-fg);\n\n --bn-pad-y: var(--prime-space-3);\n --bn-pad-x: var(--prime-space-4);\n --bn-gap: var(--prime-space-3);\n --bn-actions-gap: var(--prime-space-4);\n --bn-icon: var(--prime-control-m-icon);\n --bn-title-size: var(--prime-control-m-text-size);\n --bn-title-line-height: var(--prime-control-m-line-height);\n --bn-desc-size: var(--prime-text-body-s-size);\n --bn-desc-line-height: var(--prime-text-body-s-line-height);\n --bn-radius: var(--prime-radius-l);\n --bn-close: var(--prime-control-xs-height);\n --bn-close-icon: var(--prime-control-s-icon);\n\n container-type: inline-size;\n position: relative;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n width: 100%;\n min-width: 0;\n padding: var(--bn-pad-y) var(--bn-pad-x);\n border-radius: var(--bn-radius);\n background: var(--bn-bg);\n color: var(--bn-fg);\n font-family: var(--prime-font-family-sans);\n text-align: start;\n}\n\n.root:has(> .closeButton) {\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--bn-gap);\n}\n\n/* Full-width page strip: no radius, content follows the page content column. */\n.root[data-placement=\"page\"] {\n --bn-radius: 0;\n padding-inline: max(var(--bn-pad-x), calc((100% - var(--prime-layout-content-max-width)) / 2));\n}\n\n/* ---------- Sizes ---------- */\n\n.root[data-size=\"xs\"] {\n --bn-pad-y: var(--prime-space-2);\n --bn-pad-x: var(--prime-space-2);\n --bn-gap: var(--prime-space-2);\n --bn-actions-gap: var(--prime-space-3);\n --bn-icon: var(--prime-control-xs-icon);\n --bn-title-size: var(--prime-control-xs-text-size);\n --bn-title-line-height: var(--prime-control-xs-line-height);\n --bn-desc-size: var(--prime-text-caption-size);\n --bn-desc-line-height: var(--prime-text-caption-line-height);\n --bn-radius: var(--prime-radius-m);\n --bn-close: var(--prime-space-5);\n --bn-close-icon: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"s\"] {\n --bn-pad-y: var(--prime-space-2);\n --bn-pad-x: var(--prime-space-3);\n --bn-gap: var(--prime-space-2);\n --bn-actions-gap: var(--prime-space-3);\n --bn-icon: var(--prime-control-s-icon);\n --bn-title-size: var(--prime-control-s-text-size);\n --bn-title-line-height: var(--prime-control-s-line-height);\n --bn-desc-size: var(--prime-text-caption-size);\n --bn-desc-line-height: var(--prime-text-caption-line-height);\n --bn-radius: var(--prime-radius-m);\n --bn-close: var(--prime-space-6);\n --bn-close-icon: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"l\"] {\n --bn-pad-y: var(--prime-space-4);\n --bn-pad-x: var(--prime-space-5);\n --bn-icon: var(--prime-control-l-icon);\n --bn-title-size: var(--prime-control-l-text-size);\n --bn-title-line-height: var(--prime-control-l-line-height);\n --bn-desc-size: var(--prime-text-body-m-size);\n --bn-desc-line-height: var(--prime-text-body-m-line-height);\n --bn-close: var(--prime-control-s-height);\n --bn-close-icon: var(--prime-control-m-icon);\n}\n\n.root[data-size=\"xl\"] {\n --bn-pad-y: var(--prime-space-5);\n --bn-pad-x: var(--prime-space-6);\n --bn-gap: var(--prime-space-4);\n --bn-actions-gap: var(--prime-space-6);\n --bn-icon: var(--prime-control-xl-icon);\n --bn-title-size: var(--prime-control-xl-text-size);\n --bn-title-line-height: var(--prime-control-xl-line-height);\n --bn-desc-size: var(--prime-text-body-m-size);\n --bn-desc-line-height: var(--prime-text-body-m-line-height);\n --bn-radius: var(--prime-radius-xl);\n --bn-close: var(--prime-control-s-height);\n --bn-close-icon: var(--prime-control-m-icon);\n}\n\n/* ---------- Tones ---------- */\n\n.root[data-tone=\"neutral\"] {\n --bn-soft: var(--prime-color-fill-muted);\n --bn-text: var(--prime-color-text-secondary);\n --bn-solid: var(--prime-color-bg-inverse);\n --bn-solid-fg: var(--prime-color-text-inverse);\n}\n\n.root[data-tone=\"accent\"] {\n --bn-soft: var(--prime-color-accent-soft);\n --bn-text: var(--prime-color-accent-text);\n --bn-solid: var(--prime-color-accent-default);\n --bn-solid-fg: var(--prime-color-accent-fg);\n}\n\n.root[data-tone=\"warning\"] {\n --bn-soft: var(--prime-color-warning-soft);\n --bn-text: var(--prime-color-warning-text);\n --bn-solid: var(--prime-color-warning-default);\n --bn-solid-fg: var(--prime-color-warning-fg);\n}\n\n.root[data-tone=\"danger\"] {\n --bn-soft: var(--prime-color-danger-soft);\n --bn-text: var(--prime-color-danger-text);\n --bn-solid: var(--prime-color-danger-default);\n --bn-solid-fg: var(--prime-color-danger-fg);\n}\n\n.root[data-tone=\"success\"] {\n --bn-soft: var(--prime-color-success-soft);\n --bn-text: var(--prime-color-success-text);\n --bn-solid: var(--prime-color-success-default);\n --bn-solid-fg: var(--prime-color-success-fg);\n}\n\n/* ---------- Variants ---------- */\n\n.root[data-variant=\"solid\"] {\n --bn-bg: var(--bn-solid);\n --bn-fg: var(--bn-solid-fg);\n}\n\n.root[data-variant=\"soft\"] {\n --bn-bg: var(--bn-soft);\n --bn-fg: var(--prime-color-text-primary);\n --bn-icon-color: var(--bn-text);\n --bn-desc-color: var(--prime-color-text-secondary);\n}\n\n.root[data-variant=\"outline\"] {\n --bn-bg: var(--prime-color-card-bg);\n --bn-fg: var(--prime-color-text-primary);\n --bn-icon-color: var(--bn-text);\n --bn-desc-color: var(--prime-color-text-secondary);\n\n box-shadow: inset 0 0 0 var(--prime-border-width)\n color-mix(in srgb, var(--bn-text) 32%, transparent);\n}\n\n/* ---------- Slots ---------- */\n\n.content {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas:\n \"icon title actions\"\n \"icon description actions\";\n align-items: start;\n min-width: 0;\n}\n\n/* The icon box is one title line high, so the glyph is centered on the first line. */\n.icon {\n grid-area: icon;\n box-sizing: content-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--bn-icon);\n height: var(--bn-title-line-height);\n padding-inline-end: var(--bn-gap);\n color: var(--bn-icon-color);\n}\n\n.icon svg {\n display: block;\n width: var(--bn-icon);\n height: var(--bn-icon);\n}\n\n.title {\n grid-area: title;\n min-width: 0;\n max-inline-size: var(--prime-layout-reading-max-width);\n font-size: var(--bn-title-size);\n line-height: var(--bn-title-line-height);\n font-weight: var(--prime-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.description {\n grid-area: description;\n min-width: 0;\n max-inline-size: var(--prime-layout-reading-max-width);\n font-size: var(--bn-desc-size);\n line-height: var(--bn-desc-line-height);\n color: var(--bn-desc-color);\n overflow-wrap: anywhere;\n}\n\n.content:has(> .title) > .description {\n padding-top: var(--prime-space-1);\n}\n\n.actions {\n grid-area: actions;\n align-self: center;\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--prime-space-2);\n padding-inline-start: var(--bn-actions-gap);\n}\n\n/* Dismiss inside the actions row: a regular square button, last in the row. */\n.actionsClose {\n order: 1;\n}\n\n.closeButton {\n grid-column: 2;\n grid-row: 1;\n align-self: start;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--bn-close);\n height: var(--bn-close);\n /* Centered on the first text line without growing the banner. */\n margin-block: calc((var(--bn-title-line-height) - var(--bn-close)) / 2);\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-s);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.closeIcon {\n width: var(--bn-close-icon);\n height: var(--bn-close-icon);\n}\n\n/* currentColor wash adapts to solid and soft fills alike. */\n.closeButton:hover:not(:disabled) {\n background: color-mix(in srgb, currentColor 12%, transparent);\n}\n\n.closeButton:active:not(:disabled) {\n background: color-mix(in srgb, currentColor 18%, transparent);\n}\n\n.closeButton:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.root[data-variant=\"solid\"] .closeButton:focus-visible {\n outline-color: currentColor;\n}\n\n.closeButton:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* ---------- Narrow container: actions under the text ---------- */\n\n@container (max-width: 36rem) {\n .content {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-areas:\n \"icon title\"\n \"icon description\"\n \". actions\";\n }\n\n .actions {\n align-self: start;\n padding-inline-start: 0;\n padding-top: var(--prime-space-3);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .closeButton {\n transition: none;\n }\n}\n", "import * as React from \"react\";\n\nimport { Icon } from \"@/icons\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport { LinkButton } from \"../link-button/LinkButton\";\n\nimport styles from \"./Breadcrumb.module.css\";\n\nexport type BreadcrumbLabels = {\n /** `aria-label` of the `nav` landmark. */\n nav: string;\n /** Accessible text of `Breadcrumb.Ellipsis` (skipped levels). */\n ellipsis: string;\n};\n\nconst DEFAULT_LABELS: BreadcrumbLabels = {\n nav: \"\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0446\u0435\u043F\u043E\u0447\u043A\u0430\",\n ellipsis: \"\u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B\",\n};\n\ntype BreadcrumbContextValue = { size: ControlSize; labels: BreadcrumbLabels };\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({\n size: \"m\",\n labels: DEFAULT_LABELS,\n});\n\nexport type BreadcrumbRootProps = {\n children: React.ReactNode;\n className?: string;\n /** \u041A\u0435\u0433\u043B\u044C \u0441\u0441\u044B\u043B\u043E\u043A (LinkButton), \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B, \u043C\u043D\u043E\u0433\u043E\u0442\u043E\u0447\u0438\u044F; \u0438\u043A\u043E\u043D\u043A\u0430-\u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0438 \u0438\u043A\u043E\u043D\u043A\u0430 \u00AB\u0434\u043E\u043C\u00BB \u2014 \u0442\u043E\u0442 \u0436\u0435 \u044F\u0440\u0443\u0441. */\n size?: ControlSize;\n /** Built-in strings. */\n labels?: Partial<BreadcrumbLabels>;\n} & React.HTMLAttributes<HTMLElement>;\n\n/** Minimum number of list children (item, separator, item, separator, item) to enable collapsing. */\nconst COLLAPSIBLE_MIN_CHILDREN = 5;\n\nfunction BreadcrumbRoot({\n children,\n className,\n size = \"m\",\n labels: labelsProp,\n ...rest\n}: BreadcrumbRootProps) {\n const items = React.Children.toArray(children);\n const collapsible = items.length >= COLLAPSIBLE_MIN_CHILDREN;\n const nav = labelsProp?.nav ?? DEFAULT_LABELS.nav;\n const ellipsis = labelsProp?.ellipsis ?? DEFAULT_LABELS.ellipsis;\n const contextValue = React.useMemo(\n () => ({ size, labels: { nav, ellipsis } }),\n [size, nav, ellipsis],\n );\n\n return (\n <BreadcrumbContext.Provider value={contextValue}>\n <ControlSizeProvider value={size}>\n <nav\n aria-label={nav}\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, collapsible })}\n >\n <ol className={styles.list}>\n {collapsible ? (\n <>\n {items.slice(0, 2)}\n {/* Shown only on narrow widths (container query) in place of the middle items. */}\n <li aria-hidden=\"true\" className={cx(styles.ellipsis, styles.autoCollapse)}>\n \u2026\n </li>\n <li aria-hidden=\"true\" className={cx(styles.separator, styles.autoCollapse)}>\n <Icon name=\"nav.chevronRight\" size={size} tone=\"secondary\" />\n </li>\n {items.slice(2)}\n </>\n ) : (\n children\n )}\n </ol>\n </nav>\n </ControlSizeProvider>\n </BreadcrumbContext.Provider>\n );\n}\nBreadcrumbRoot.displayName = \"Breadcrumb.Root\";\n\nexport type BreadcrumbItemProps = {\n href?: string;\n current?: boolean;\n children?: React.ReactNode;\n className?: string;\n /** \u0414\u043B\u044F \u0441\u0441\u044B\u043B\u043A\u0438 \u0431\u0435\u0437 \u0432\u0438\u0434\u0438\u043C\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u043A\u043E\u043D\u043A\u0430 \u00AB\u0434\u043E\u043C\u00BB). */\n \"aria-label\"?: string;\n};\n\nfunction BreadcrumbItem({\n href,\n current,\n children,\n className,\n \"aria-label\": ariaLabel,\n}: BreadcrumbItemProps) {\n const { size } = React.useContext(BreadcrumbContext);\n return (\n <li className={cx(styles.item, className)}>\n {href ? (\n <LinkButton.Root\n href={href}\n size={size}\n className={styles.breadcrumbLink}\n aria-label={ariaLabel}\n >\n {children}\n </LinkButton.Root>\n ) : (\n <span\n className={cx(styles.text, current && styles.itemCurrent)}\n aria-current={current ? \"page\" : undefined}\n title={typeof children === \"string\" ? children : undefined}\n >\n {children}\n </span>\n )}\n </li>\n );\n}\nBreadcrumbItem.displayName = \"Breadcrumb.Item\";\n\nexport type BreadcrumbSeparatorProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nfunction BreadcrumbSeparator({ children, className }: BreadcrumbSeparatorProps) {\n const { size } = React.useContext(BreadcrumbContext);\n return (\n <li aria-hidden=\"true\" className={cx(styles.separator, className)}>\n {children ?? <Icon name=\"nav.chevronRight\" size={size} tone=\"secondary\" />}\n </li>\n );\n}\nBreadcrumbSeparator.displayName = \"Breadcrumb.Separator\";\n\nexport type BreadcrumbEllipsisProps = {\n className?: string;\n};\n\nfunction BreadcrumbEllipsis({ className }: BreadcrumbEllipsisProps) {\n const { labels } = React.useContext(BreadcrumbContext);\n return (\n <li className={cx(styles.ellipsis, className)}>\n <span aria-hidden=\"true\">\u2026</span>\n <span className={styles.srOnly}>{labels.ellipsis}</span>\n </li>\n );\n}\nBreadcrumbEllipsis.displayName = \"Breadcrumb.Ellipsis\";\n\nexport const Breadcrumb = {\n Root: BreadcrumbRoot,\n Item: BreadcrumbItem,\n Separator: BreadcrumbSeparator,\n Ellipsis: BreadcrumbEllipsis,\n};\n", "import {\n Check,\n ChevronRight,\n Circle,\n CircleDot,\n CloudUpload,\n Copy,\n Download,\n Eye,\n EyeOff,\n House,\n LayoutGrid,\n Lock,\n Mail,\n Moon,\n Pipette,\n Search,\n Sun,\n X,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { BaseIconProps } from \"./Icon\";\nimport { createIcon } from \"./Icon\";\n\nexport const IconCheck = createIcon(Check);\nexport const IconChevronRight = createIcon(ChevronRight);\nexport const IconCircleDot = createIcon(CircleDot);\nexport const IconNavItemDot = createIcon(Circle);\nexport const IconClose = createIcon(X);\nexport const IconCloudUpload = createIcon(CloudUpload);\nexport const IconCopy = createIcon(Copy);\nexport const IconDownload = createIcon(Download);\nexport const IconMail = createIcon(Mail);\nexport const IconEye = createIcon(Eye);\nexport const IconEyeOff = createIcon(EyeOff);\nexport const IconHouse = createIcon(House);\nexport const IconLayoutGrid = createIcon(LayoutGrid);\nexport const IconLock = createIcon(Lock);\nexport const IconMoon = createIcon(Moon);\nexport const IconPipette = createIcon(Pipette);\nexport const IconSearch = createIcon(Search);\nexport const IconSun = createIcon(Sun);\n\nexport const iconRegistry = {\n \"nav.chevronRight\": IconChevronRight,\n \"nav.home\": IconHouse,\n \"nav.itemDot\": IconNavItemDot,\n \"nav.layoutGrid\": IconLayoutGrid,\n \"action.close\": IconClose,\n \"action.copy\": IconCopy,\n \"action.eyedropper\": IconPipette,\n \"action.search\": IconSearch,\n \"action.upload\": IconCloudUpload,\n \"field.email\": IconMail,\n \"field.password.show\": IconEye,\n \"field.password.hide\": IconEyeOff,\n \"status.locked\": IconLock,\n \"theme.dark\": IconMoon,\n \"theme.light\": IconSun,\n} as const;\n\nexport type IconName = keyof typeof iconRegistry;\n\nexport type NamedIconProps = BaseIconProps & {\n name: IconName;\n};\n\nexport const Icon = React.forwardRef<SVGSVGElement, NamedIconProps>(({ name, ...rest }, ref) => {\n const IconGlyph = iconRegistry[name];\n return React.createElement(IconGlyph, { ref, ...rest });\n});\n\nIcon.displayName = \"Icon\";\n\nexport type { BaseIconProps } from \"./Icon\";\n", "import type { LucideProps } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { useOptionalControlSize } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { DividerContentContext } from \"@/internal/DividerContentContext\";\nimport type { ControlSize, TextTone } from \"@/internal/states\";\n\nimport styles from \"./Icon.module.css\";\n\n/** Explicit sizes map to `--prime-icon-*`: xs 14 \u00B7 s 16 \u00B7 m 20 \u00B7 l 24 \u00B7 xl 32. */\nconst SIZE_CLASS: Record<ControlSize, string> = {\n xs: styles.sizeXs,\n s: styles.sizeS,\n m: styles.sizeM,\n l: styles.sizeL,\n xl: styles.sizeXl,\n};\n\ntype BaseIconProps = Omit<LucideProps, \"size\" | \"color\"> & {\n size?: ControlSize;\n /** Icon color; `default` inherits `currentColor`. */\n tone?: TextTone;\n};\n\ntype IconComponent = React.ComponentType<LucideProps>;\n\nfunction createIcon(IconGlyph: IconComponent) {\n const WrappedIcon = React.forwardRef<SVGSVGElement, BaseIconProps>(\n ({ className, size: sizeProp, tone = \"default\", strokeWidth = 1.75, style, ...rest }, ref) => {\n const controlSize = useOptionalControlSize();\n const insideDividerContent = React.useContext(DividerContentContext);\n /*\n * Explicit `size` \u2192 `--prime-icon-<size>`.\n * Otherwise the icon follows its host: the host's `--prime-icon-size` if it sets one\n * (Button, Badge, Tag, Kbd\u2026), else `--prime-control-<tier>-icon` of the nearest\n * `ControlSizeProvider`, else the `m` control icon (16px).\n * Inside `Divider.Root` content the divider sizes the svg itself.\n */\n const resolvedSize: ControlSize = sizeProp ?? controlSize ?? \"m\";\n const sizeClass = insideDividerContent\n ? undefined\n : cx(SIZE_CLASS[resolvedSize], sizeProp === undefined && styles.inherit);\n\n return (\n <IconGlyph\n ref={ref}\n className={cx(styles.root, sizeClass, className)}\n data-tone={tone === \"default\" ? undefined : tone}\n style={style}\n strokeWidth={strokeWidth}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n },\n );\n\n WrappedIcon.displayName = `EsIcon(${IconGlyph.displayName ?? \"Glyph\"})`;\n return WrappedIcon;\n}\n\nexport type { BaseIconProps };\nexport { createIcon };\n", "import * as React from \"react\";\n\n/** \u0412\u043D\u0443\u0442\u0440\u0438 `Divider.Root` \u2014 \u0443 `Icon` \u043D\u0435 \u0437\u0430\u0434\u0430\u044E\u0442\u0441\u044F \u043A\u043B\u0430\u0441\u0441\u044B \u0440\u0430\u0437\u043C\u0435\u0440\u0430; \u0433\u0430\u0431\u0430\u0440\u0438\u0442\u044B \u0438\u0437 `--prime-divider-icon`. */\nexport const DividerContentContext = React.createContext(false);\n\nDividerContentContext.displayName = \"DividerContentContext\";\n", ".root {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--icon-box);\n height: var(--icon-box);\n}\n\n/* Explicit `size` prop: global icon scale. */\n.sizeXs {\n --icon-box: var(--prime-icon-xs);\n}\n\n.sizeS {\n --icon-box: var(--prime-icon-s);\n}\n\n.sizeM {\n --icon-box: var(--prime-icon-m);\n}\n\n.sizeL {\n --icon-box: var(--prime-icon-l);\n}\n\n.sizeXl {\n --icon-box: var(--prime-icon-xl);\n}\n\n/*\n * No `size` prop: follow the host. A host may set `--prime-icon-size` (Button, Badge, Tag, Kbd\u2026);\n * otherwise the icon uses the control tier of the nearest ControlSizeProvider.\n */\n.inherit.sizeXs {\n --icon-box: var(--prime-icon-size, var(--prime-control-xs-icon));\n}\n\n.inherit.sizeS {\n --icon-box: var(--prime-icon-size, var(--prime-control-s-icon));\n}\n\n.inherit.sizeM {\n --icon-box: var(--prime-icon-size, var(--prime-control-m-icon));\n}\n\n.inherit.sizeL {\n --icon-box: var(--prime-icon-size, var(--prime-control-l-icon));\n}\n\n.inherit.sizeXl {\n --icon-box: var(--prime-icon-size, var(--prime-control-xl-icon));\n}\n\n.root[data-tone=\"secondary\"] {\n color: var(--prime-color-text-secondary);\n}\n\n.root[data-tone=\"muted\"] {\n color: var(--prime-color-text-muted);\n}\n\n.root[data-tone=\"accent\"] {\n color: var(--prime-color-accent-text);\n}\n\n.root[data-tone=\"success\"] {\n color: var(--prime-color-success-text);\n}\n\n.root[data-tone=\"warning\"] {\n color: var(--prime-color-warning-text);\n}\n\n.root[data-tone=\"danger\"] {\n color: var(--prime-color-danger-text);\n}\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./LinkButton.module.css\";\n\nexport type LinkButtonRootProps = {\n size?: ControlSize;\n /** `accent` \u2014 a regular link; `neutral` \u2014 quiet links in footers, metadata and dense navigation. */\n tone?: Extract<Tone, \"accent\" | \"neutral\">;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n} & React.AnchorHTMLAttributes<HTMLAnchorElement>;\n\nconst LinkButtonRoot = React.forwardRef<HTMLAnchorElement, LinkButtonRootProps>(\n (\n {\n size = \"m\",\n tone = \"accent\",\n disabled = false,\n children,\n className,\n tabIndex,\n \"aria-disabled\": ariaDisabled,\n ...rest\n },\n ref,\n ) => {\n const cls = cx(styles.root, className);\n const dataProps = toDataAttributes({\n size,\n tone,\n ...(disabled ? { disabled: true } : {}),\n });\n\n if (disabled) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: disabled state is not a navigable <a>; span keeps cursor + a11y without href\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n role=\"link\"\n aria-disabled=\"true\"\n tabIndex={-1}\n className={cls}\n {...dataProps}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </span>\n );\n }\n\n return (\n <a\n {...rest}\n ref={ref}\n className={cls}\n aria-disabled={ariaDisabled}\n tabIndex={tabIndex}\n {...dataProps}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </a>\n );\n },\n);\n\nLinkButtonRoot.displayName = \"LinkButton.Root\";\n\nexport const LinkButton = {\n Root: LinkButtonRoot,\n};\n", ".root {\n --link-text: var(--prime-control-m-text-size);\n --link-lh: var(--prime-control-m-line-height);\n --link-gap: var(--prime-space-1);\n --link-fg: var(--prime-color-accent-text);\n --link-fg-hover: var(--prime-color-accent-hover);\n --prime-icon-size: var(--prime-control-m-icon);\n\n display: inline-flex;\n align-items: center;\n gap: var(--link-gap);\n max-width: 100%;\n border-radius: var(--prime-radius-xs);\n color: var(--link-fg);\n font-size: var(--link-text);\n line-height: var(--link-lh);\n font-weight: var(--prime-font-weight-medium);\n text-decoration-line: underline;\n text-decoration-color: transparent;\n text-decoration-thickness: var(--prime-border-width);\n text-underline-offset: calc(var(--prime-space-1) - var(--prime-border-width));\n cursor: pointer;\n transition:\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n text-decoration-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.root[data-tone=\"neutral\"] {\n --link-fg: var(--prime-color-text-secondary);\n --link-fg-hover: var(--prime-color-text-primary);\n}\n\n.root[data-size=\"xs\"] {\n --link-text: var(--prime-control-xs-text-size);\n --link-lh: var(--prime-control-xs-line-height);\n --prime-icon-size: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"s\"] {\n --link-text: var(--prime-control-s-text-size);\n --link-lh: var(--prime-control-s-line-height);\n --prime-icon-size: var(--prime-control-s-icon);\n}\n\n.root[data-size=\"l\"] {\n --link-text: var(--prime-control-l-text-size);\n --link-lh: var(--prime-control-l-line-height);\n --link-gap: var(--prime-space-2);\n --prime-icon-size: var(--prime-control-l-icon);\n}\n\n/* Control tiers l and xl share text 16/24, so xl steps up to the title-l type (18) to stay distinct. */\n.root[data-size=\"xl\"] {\n --link-text: var(--prime-text-title-l-size);\n --link-lh: var(--prime-text-title-l-line-height);\n --link-gap: var(--prime-space-2);\n --prime-icon-size: var(--prime-control-xl-icon);\n}\n\n.root:hover:not([data-disabled=\"true\"]) {\n color: var(--link-fg-hover);\n text-decoration-color: currentColor;\n}\n\n.root:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.root[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n text-decoration: none;\n cursor: not-allowed;\n}\n", "/*\n * Breadcrumb \u2014 Graphite.\n * Previous segments muted, current page primary/medium. Each segment truncates with ellipsis;\n * on narrow containers the middle segments collapse into \u00AB\u2026\u00BB (still read by screen readers).\n */\n\n.root {\n --bc-text-size: var(--prime-control-m-text-size);\n --bc-line-height: var(--prime-control-m-line-height);\n --bc-gap: var(--prime-space-1);\n --bc-icon: var(--prime-control-m-icon);\n --bc-item-max: calc(var(--prime-space-24) * 2);\n\n /* Fill the available width: an inline-size container has no intrinsic width and would\n * collapse to 0 inside shrink-wrapped / flex parents. */\n container-type: inline-size;\n inline-size: 100%;\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n font-size: var(--bc-text-size);\n line-height: var(--bc-line-height);\n}\n\n.root[data-size=\"xs\"] {\n --bc-text-size: var(--prime-control-xs-text-size);\n --bc-line-height: var(--prime-control-xs-line-height);\n --bc-gap: var(--prime-space-0);\n --bc-icon: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"s\"] {\n --bc-text-size: var(--prime-control-s-text-size);\n --bc-line-height: var(--prime-control-s-line-height);\n --bc-icon: var(--prime-control-s-icon);\n}\n\n.root[data-size=\"l\"] {\n --bc-text-size: var(--prime-control-l-text-size);\n --bc-line-height: var(--prime-control-l-line-height);\n --bc-gap: var(--prime-space-2);\n --bc-icon: var(--prime-control-l-icon);\n}\n\n/* Matches LinkButton xl (title-l type), so links and the current page share one size. */\n.root[data-size=\"xl\"] {\n --bc-text-size: var(--prime-text-title-l-size);\n --bc-line-height: var(--prime-text-title-l-line-height);\n --bc-gap: var(--prime-space-2);\n --bc-icon: var(--prime-control-xl-icon);\n}\n\n.list {\n position: relative;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--bc-gap);\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n display: inline-flex;\n flex: 0 1 auto;\n align-items: center;\n min-width: 0;\n max-width: var(--bc-item-max);\n}\n\n/* Current page keeps priority: it shrinks last. */\n.item:last-child {\n flex-shrink: 0.5;\n}\n\n.item > * {\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text {\n display: block;\n color: var(--prime-color-text-muted);\n}\n\n.breadcrumbLink {\n color: var(--prime-color-text-muted);\n}\n\n/* An icon segment (e.g. \u00ABhome\u00BB) takes the tier icon size, not the glyph's intrinsic 24px. */\n.breadcrumbLink > svg {\n flex: none;\n width: var(--bc-icon);\n height: var(--bc-icon);\n}\n\n.item a.breadcrumbLink:hover,\n.item a.breadcrumbLink:focus-visible {\n color: var(--prime-color-text-primary);\n text-decoration-color: transparent;\n}\n\n.itemHome .breadcrumbLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n}\n\n.itemCurrent {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.separator {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n color: var(--prime-color-text-placeholder);\n user-select: none;\n}\n\n.ellipsis {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n color: var(--prime-color-text-muted);\n user-select: none;\n}\n\n.autoCollapse {\n display: none;\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n@container (max-width: 30rem) {\n .list {\n --bc-item-max: calc(var(--prime-space-24) + var(--prime-space-6));\n }\n\n .root[data-collapsible=\"true\"] .autoCollapse {\n display: inline-flex;\n }\n\n /* Middle segments and their separators, up to (not including) the last item: visually hidden,\n * still announced. The auto \u00AB\u2026 \u203A\u00BB pair replaces them, so the separator before the last item\n * is hidden too (otherwise \u00AB\u2026 \u203A \u203A\u00BB). */\n .root[data-collapsible=\"true\"] .list > li:nth-child(n + 5):nth-last-child(n + 2) {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n}\n", "import * as React from \"react\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./ButtonGroup.module.css\";\n\nexport type ButtonGroupOrientation = \"horizontal\" | \"vertical\";\n\ntype ButtonGroupContextValue = {\n size: ControlSize;\n};\n\nconst [ButtonGroupProvider, useButtonGroupContext] =\n createComponentContext<ButtonGroupContextValue>(\"ButtonGroup\");\n\nexport type ButtonGroupRootProps = React.HTMLAttributes<HTMLDivElement> & {\n orientation?: ButtonGroupOrientation;\n size?: ControlSize;\n /** Stretch the group to its container; horizontal segments share the width equally. */\n fullWidth?: boolean;\n children: React.ReactNode;\n};\n\nconst ButtonGroupRoot = React.forwardRef<HTMLDivElement, ButtonGroupRootProps>(\n (\n {\n orientation = \"horizontal\",\n size = \"m\",\n fullWidth,\n children,\n className,\n role = \"group\",\n ...rest\n },\n ref,\n ) => {\n const value = React.useMemo(() => ({ size }), [size]);\n\n return (\n <ButtonGroupProvider value={value}>\n <div\n ref={ref}\n role={role}\n className={cx(styles.root, className)}\n data-orientation={orientation === \"vertical\" ? \"vertical\" : undefined}\n data-size={size}\n data-full-width={fullWidth ? \"true\" : undefined}\n {...rest}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n </ButtonGroupProvider>\n );\n },\n);\n\nButtonGroupRoot.displayName = \"ButtonGroupRoot\";\n\nexport type ButtonGroupItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Toggle state of the segment: `aria-pressed` and `data-state=\"active\" | \"inactive\"`. */\n pressed?: boolean;\n};\n\nconst ButtonGroupItem = React.forwardRef<HTMLButtonElement, ButtonGroupItemProps>(\n ({ className, pressed, type = \"button\", children, ...rest }, ref) => {\n useButtonGroupContext();\n\n const items = React.Children.toArray(children).filter(\n (child) => !(typeof child === \"string\" && child.trim() === \"\"),\n );\n const isIcon = (child: React.ReactNode) =>\n React.isValidElement(child) && child.type === ButtonGroupIcon;\n const iconOnly = items.length > 0 && items.every(isIcon);\n const leadingIcon = !iconOnly && items.length > 0 && isIcon(items[0]);\n const trailingIcon = !iconOnly && items.length > 0 && isIcon(items[items.length - 1]);\n\n return (\n <button\n ref={ref}\n type={type}\n className={cx(styles.item, className)}\n data-state={pressed === undefined ? undefined : pressed ? \"active\" : \"inactive\"}\n data-icon-only={iconOnly ? \"true\" : undefined}\n data-leading-icon={leadingIcon ? \"true\" : undefined}\n data-trailing-icon={trailingIcon ? \"true\" : undefined}\n aria-pressed={typeof pressed === \"boolean\" ? pressed : undefined}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nButtonGroupItem.displayName = \"ButtonGroupItem\";\n\nexport type ButtonGroupIconProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nfunction ButtonGroupIcon({ children, className, ...rest }: ButtonGroupIconProps) {\n useButtonGroupContext();\n\n return (\n <span className={cx(styles.icon, className)} aria-hidden=\"true\" {...rest}>\n {children}\n </span>\n );\n}\n\nButtonGroupIcon.displayName = \"ButtonGroupIcon\";\n\nexport const ButtonGroup = { Root: ButtonGroupRoot, Item: ButtonGroupItem, Icon: ButtonGroupIcon };\n", "/*\n * Segmented group: joined segments on a neutral fill, no borders.\n * Segments are separated by a hairline gap that shows the surface behind;\n * only the outer corners are rounded, inner corners are square.\n */\n.root {\n --bg-h: var(--prime-control-m-height);\n --bg-px: var(--prime-control-m-padding-x);\n --bg-radius: var(--prime-control-m-radius);\n --bg-gap: var(--prime-control-m-gap);\n --bg-text: var(--prime-control-m-text-size);\n --bg-lh: var(--prime-control-m-line-height);\n --prime-icon-size: var(--prime-control-m-icon);\n\n display: inline-flex;\n gap: var(--prime-border-width);\n max-width: 100%;\n vertical-align: middle;\n}\n\n.root[data-size=\"xs\"] {\n --bg-h: var(--prime-control-xs-height);\n --bg-px: var(--prime-control-xs-padding-x);\n --bg-radius: var(--prime-control-xs-radius);\n --bg-gap: var(--prime-control-xs-gap);\n --bg-text: var(--prime-control-xs-text-size);\n --bg-lh: var(--prime-control-xs-line-height);\n --prime-icon-size: var(--prime-control-xs-icon);\n}\n\n.root[data-size=\"s\"] {\n --bg-h: var(--prime-control-s-height);\n --bg-px: var(--prime-control-s-padding-x);\n --bg-radius: var(--prime-control-s-radius);\n --bg-gap: var(--prime-control-s-gap);\n --bg-text: var(--prime-control-s-text-size);\n --bg-lh: var(--prime-control-s-line-height);\n --prime-icon-size: var(--prime-control-s-icon);\n}\n\n.root[data-size=\"l\"] {\n --bg-h: var(--prime-control-l-height);\n --bg-px: var(--prime-control-l-padding-x);\n --bg-radius: var(--prime-control-l-radius);\n --bg-gap: var(--prime-control-l-gap);\n --bg-text: var(--prime-control-l-text-size);\n --bg-lh: var(--prime-control-l-line-height);\n --prime-icon-size: var(--prime-control-l-icon);\n}\n\n.root[data-size=\"xl\"] {\n --bg-h: var(--prime-control-xl-height);\n --bg-px: var(--prime-control-xl-padding-x);\n --bg-radius: var(--prime-control-xl-radius);\n --bg-gap: var(--prime-control-xl-gap);\n --bg-text: var(--prime-control-xl-text-size);\n --bg-lh: var(--prime-control-xl-line-height);\n --prime-icon-size: var(--prime-control-xl-icon);\n}\n\n.root[data-orientation=\"vertical\"] {\n flex-direction: column;\n align-items: stretch;\n}\n\n.root[data-full-width=\"true\"] {\n display: flex;\n width: 100%;\n}\n\n.item {\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--bg-gap);\n min-width: var(--bg-h);\n height: var(--bg-h);\n padding-block: 0;\n padding-inline: var(--bg-px);\n margin: 0;\n border: 0;\n border-radius: 0;\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n font-family: inherit;\n font-size: var(--bg-text);\n line-height: var(--bg-lh);\n font-weight: var(--prime-font-weight-medium);\n white-space: nowrap;\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* Optical compensation: the icon side gets padX \u2212 4px, never closer than 8px (xs). */\n.item[data-leading-icon=\"true\"] {\n padding-inline-start: max(calc(var(--bg-px) - var(--prime-space-1)), var(--prime-space-2));\n}\n\n.item[data-trailing-icon=\"true\"] {\n padding-inline-end: max(calc(var(--bg-px) - var(--prime-space-1)), var(--prime-space-2));\n}\n\n/* Icon-only segment: square. */\n.item[data-icon-only=\"true\"] {\n width: var(--bg-h);\n padding-inline: 0;\n}\n\n.item:hover:not(:disabled) {\n background: var(--prime-color-fill-muted-hover);\n color: var(--prime-color-text-primary);\n}\n\n.item:active:not(:disabled) {\n background: var(--prime-color-fill-strong);\n}\n\n.item:focus-visible {\n z-index: 1;\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.item[data-state=\"active\"] {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.item[data-state=\"active\"]:hover:not(:disabled) {\n background: var(--prime-color-accent-soft-hover);\n color: var(--prime-color-accent-text);\n}\n\n.item:disabled {\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.root[data-full-width=\"true\"]:not([data-orientation=\"vertical\"]) > .item {\n flex: 1 1 0;\n min-width: 0;\n}\n\n/* Outer corners only. */\n.root:not([data-orientation=\"vertical\"]) > .item:first-child {\n border-start-start-radius: var(--bg-radius);\n border-end-start-radius: var(--bg-radius);\n}\n\n.root:not([data-orientation=\"vertical\"]) > .item:last-child {\n border-start-end-radius: var(--bg-radius);\n border-end-end-radius: var(--bg-radius);\n}\n\n.root[data-orientation=\"vertical\"] > .item:first-child {\n border-start-start-radius: var(--bg-radius);\n border-start-end-radius: var(--bg-radius);\n}\n\n.root[data-orientation=\"vertical\"] > .item:last-child {\n border-end-start-radius: var(--bg-radius);\n border-end-end-radius: var(--bg-radius);\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n}\n\n.icon > svg {\n width: 100%;\n height: 100%;\n}\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { Tone } from \"@/internal/states\";\n\nimport styles from \"./Card.module.css\";\n\nexport type CardRootProps = {\n /** Structural template: KPI tiles, lists, CTA, split, cover and chart sections. Default `panel`. */\n variant?:\n | \"mini\"\n | \"mini-media\"\n | \"metric\"\n | \"panel\"\n | \"stat-trend\"\n | \"cta\"\n | \"list\"\n | \"split\"\n | \"cover\";\n /**\n * \u0411\u0435\u0437 \u043B\u0451\u0433\u043A\u043E\u0439 \u0442\u0435\u043D\u0438 (\u043F\u043B\u043E\u0441\u043A\u0430\u044F \u043F\u043B\u0438\u0442\u043A\u0430 \u043D\u0430 \u0444\u043E\u043D\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B).\n * \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0442\u0435\u043D\u044C \u043F\u043E\u0432\u0435\u0440\u0445\u043D\u043E\u0441\u0442\u0438 \u0434\u043B\u044F \u043E\u0442\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043E\u0442 \u0444\u043E\u043D\u0430.\n */\n flat?: boolean;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst CardRoot = React.forwardRef<HTMLDivElement, CardRootProps>(function CardRoot(\n { variant = \"panel\", flat = false, className, children, ...rest },\n forwardedRef,\n) {\n return (\n <div\n ref={forwardedRef}\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ variant, flat: flat || undefined })}\n >\n {children}\n </div>\n );\n});\nCardRoot.displayName = \"CardRoot\";\n\nexport type CardIconBoxProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardIconBox({ className, children, ...rest }: CardIconBoxProps) {\n return (\n <div className={cx(styles.iconBox, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardIconBox.displayName = \"CardIconBox\";\n\nexport type CardLeadProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardLead({ className, children, ...rest }: CardLeadProps) {\n return (\n <div className={cx(styles.lead, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardLead.displayName = \"CardLead\";\n\nexport type CardHeaderRowProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardHeaderRow({ className, children, ...rest }: CardHeaderRowProps) {\n return (\n <div className={cx(styles.headerRow, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardHeaderRow.displayName = \"CardHeaderRow\";\n\nexport type CardStackProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardStack({ className, children, ...rest }: CardStackProps) {\n return (\n <div className={cx(styles.stack, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardStack.displayName = \"CardStack\";\n\nexport type CardLabelProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction CardLabel({ className, children, ...rest }: CardLabelProps) {\n return (\n <span className={cx(styles.label, className)} {...rest}>\n {children}\n </span>\n );\n}\nCardLabel.displayName = \"CardLabel\";\n\nexport type CardValueProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction CardValue({ className, children, ...rest }: CardValueProps) {\n return (\n <span className={cx(styles.value, className)} {...rest}>\n {children}\n </span>\n );\n}\nCardValue.displayName = \"CardValue\";\n\nexport type CardDescriptionProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLParagraphElement>;\n\nfunction CardDescription({ className, children, ...rest }: CardDescriptionProps) {\n return (\n <p className={cx(styles.description, className)} {...rest}>\n {children}\n </p>\n );\n}\nCardDescription.displayName = \"CardDescription\";\n\nexport type CardMediaProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardMedia({ className, children, ...rest }: CardMediaProps) {\n return (\n <div className={cx(styles.media, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardMedia.displayName = \"CardMedia\";\n\nexport type CardHeadingLevel = \"h2\" | \"h3\" | \"h4\";\n\nexport type CardTitleProps = {\n /** Heading level that fits the page outline (the look does not change). */\n as?: CardHeadingLevel;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLHeadingElement>;\n\nfunction CardTitle({ as: Tag = \"h3\", className, children, ...rest }: CardTitleProps) {\n return (\n <Tag className={cx(styles.title, className)} {...rest}>\n {children}\n </Tag>\n );\n}\nCardTitle.displayName = \"CardTitle\";\n\nexport type CardDeltaProps = {\n /** Color of the change: `success` \u2014 good, `danger` \u2014 bad, `neutral` (default). Independent of the sign. */\n tone?: Extract<Tone, \"neutral\" | \"success\" | \"warning\" | \"danger\">;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction CardDelta({ className, tone = \"neutral\", children, ...rest }: CardDeltaProps) {\n return (\n <span {...rest} className={cx(styles.delta, className)} data-tone={tone}>\n {children}\n </span>\n );\n}\nCardDelta.displayName = \"CardDelta\";\n\nexport type CardActionsProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardActions({ className, children, ...rest }: CardActionsProps) {\n return (\n <div className={cx(styles.actions, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardActions.displayName = \"CardActions\";\n\nexport type CardCtaBodyProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardCtaBody({ className, children, ...rest }: CardCtaBodyProps) {\n return (\n <div className={cx(styles.ctaBody, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardCtaBody.displayName = \"CardCtaBody\";\n\nexport type CardCoverProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardCover({ className, children, ...rest }: CardCoverProps) {\n return (\n <div className={cx(styles.cover, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardCover.displayName = \"CardCover\";\n\nexport type CardSplitProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardSplit({ className, children, ...rest }: CardSplitProps) {\n return (\n <div className={cx(styles.split, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardSplit.displayName = \"CardSplit\";\n\nexport type CardSplitCellProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardSplitCell({ className, children, ...rest }: CardSplitCellProps) {\n return (\n <div className={cx(styles.splitCell, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardSplitCell.displayName = \"CardSplitCell\";\n\nexport type CardListHeaderProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardListHeader({ className, children, ...rest }: CardListHeaderProps) {\n return (\n <div className={cx(styles.listHeader, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardListHeader.displayName = \"CardListHeader\";\n\nexport type CardListProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLUListElement>;\n\nconst CardList = React.forwardRef<HTMLUListElement, CardListProps>(function CardList(\n { className, children, ...rest },\n forwardedRef,\n) {\n return (\n <ul ref={forwardedRef} className={cx(styles.list, className)} {...rest}>\n {children}\n </ul>\n );\n});\nCardList.displayName = \"CardList\";\n\nexport type CardListItemProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLLIElement>;\n\nconst CardListItem = React.forwardRef<HTMLLIElement, CardListItemProps>(function CardListItem(\n { className, children, ...rest },\n forwardedRef,\n) {\n return (\n <li ref={forwardedRef} className={cx(styles.listItem, className)} {...rest}>\n {children}\n </li>\n );\n});\nCardListItem.displayName = \"CardListItem\";\n\nexport type CardSectionHeaderProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardSectionHeader({ className, children, ...rest }: CardSectionHeaderProps) {\n return (\n <div className={cx(styles.sectionHeader, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardSectionHeader.displayName = \"CardSectionHeader\";\n\nexport type CardSectionTitleProps = {\n /** Heading level that fits the page outline (the look does not change). */\n as?: CardHeadingLevel;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLHeadingElement>;\n\nfunction CardSectionTitle({ as: Tag = \"h3\", className, children, ...rest }: CardSectionTitleProps) {\n return (\n <Tag className={cx(styles.sectionTitle, className)} {...rest}>\n {children}\n </Tag>\n );\n}\nCardSectionTitle.displayName = \"CardSectionTitle\";\n\nexport type CardSectionTrailingProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardSectionTrailing({ className, children, ...rest }: CardSectionTrailingProps) {\n return (\n <div className={cx(styles.sectionTrailing, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardSectionTrailing.displayName = \"CardSectionTrailing\";\n\nexport type CardBodyProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardBody({ className, children, ...rest }: CardBodyProps) {\n return (\n <div className={cx(styles.body, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardBody.displayName = \"CardBody\";\n\nexport type CardChartProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction CardChart({ className, children, ...rest }: CardChartProps) {\n return (\n <div className={cx(styles.chart, className)} {...rest}>\n {children}\n </div>\n );\n}\nCardChart.displayName = \"CardChart\";\n\nexport const Card = {\n Root: CardRoot,\n IconBox: CardIconBox,\n Lead: CardLead,\n HeaderRow: CardHeaderRow,\n Stack: CardStack,\n Label: CardLabel,\n Value: CardValue,\n Description: CardDescription,\n Media: CardMedia,\n Title: CardTitle,\n Delta: CardDelta,\n Actions: CardActions,\n CtaBody: CardCtaBody,\n Cover: CardCover,\n Split: CardSplit,\n SplitCell: CardSplitCell,\n ListHeader: CardListHeader,\n List: CardList,\n ListItem: CardListItem,\n SectionHeader: CardSectionHeader,\n SectionTitle: CardSectionTitle,\n SectionTrailing: CardSectionTrailing,\n Body: CardBody,\n Chart: CardChart,\n};\n", "/*\n * Card \u2014 Graphite surface: `--prime-color-card-bg` (bg-surface on the canvas, bg-sunken inside a surface\n * plane), card radius, shadow-raised unless the host plane turns it into a sunken tile, no border.\n * Internal layout adapts to the card's own width (container queries).\n */\n\n.root {\n --card-pad: var(--prime-card-padding-m);\n --card-gap: var(--prime-card-gap);\n --card-icon: var(--prime-icon-m);\n --card-icon-box: var(--prime-control-l-height);\n /* Faint zone hairline, inset by the side padding \u2014 same language as Modal/Drawer. */\n --card-hairline: linear-gradient(\n var(--prime-color-border-faint),\n var(--prime-color-border-faint)\n );\n --card-hairline-size: calc(100% - 2 * var(--card-pad)) var(--prime-border-width);\n\n /* Fields inside a card are one step off the surface. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n container-type: inline-size;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n border-radius: var(--prime-card-radius);\n /* Avatar.Group rings match this surface. */\n --avatar-ring: var(--prime-color-card-bg);\n background: var(--prime-color-card-bg);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n text-align: start;\n}\n\n/* A surface plane (Card, Modal, Popover, AppShell content) sets `--prime-card-shadow: none` next to\n * `--prime-color-card-bg`, so a nested card is a flat sunken tile. */\n.root:not([data-flat=\"true\"]) {\n box-shadow: var(--prime-card-shadow);\n}\n\n/* Context for nested cards: set on children so the card's own fill and shadow still read the host's values. */\n.root > * {\n --prime-color-card-bg: var(--prime-color-bg-sunken);\n --prime-card-shadow: none;\n}\n\n/* ---------- Variants ---------- */\n\n.root[data-variant=\"mini\"] {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--prime-space-3);\n padding: var(--card-pad);\n}\n\n.root[data-variant=\"mini-media\"] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: flex-start;\n gap: var(--card-gap) var(--prime-space-3);\n padding: var(--card-pad);\n}\n\n.root[data-variant=\"metric\"],\n.root[data-variant=\"stat-trend\"],\n.root[data-variant=\"cta\"] {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--prime-space-2);\n padding: var(--card-pad);\n}\n\n.root[data-variant=\"cta\"] {\n gap: var(--prime-space-3);\n}\n\n.root[data-variant=\"panel\"],\n.root[data-variant=\"list\"],\n.root[data-variant=\"cover\"] {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 0;\n padding: 0;\n overflow: hidden;\n}\n\n.root[data-variant=\"split\"] {\n padding: var(--card-pad);\n}\n\n/* ---------- Slots ---------- */\n\n.iconBox {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--card-icon-box);\n height: var(--card-icon-box);\n border-radius: var(--prime-radius-m);\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.iconBox svg {\n display: block;\n width: var(--card-icon);\n height: var(--card-icon);\n}\n\n.lead {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-width: 0;\n max-width: 100%;\n}\n\n.lead svg {\n display: block;\n flex-shrink: 0;\n width: var(--card-icon);\n height: var(--card-icon);\n color: var(--prime-color-text-secondary);\n}\n\n.headerRow {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-3);\n width: 100%;\n min-width: 0;\n}\n\n.stack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.label {\n max-width: 100%;\n overflow: hidden;\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n font-weight: var(--prime-font-weight-regular);\n color: var(--prime-color-text-secondary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.value {\n min-width: 0;\n font-size: var(--prime-text-title-l-size);\n line-height: var(--prime-text-title-l-line-height);\n letter-spacing: var(--prime-text-title-l-tracking);\n font-weight: var(--prime-text-title-l-weight);\n color: var(--prime-color-text-primary);\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n\n.root[data-variant=\"metric\"] .value {\n font-size: var(--prime-text-heading-m-size);\n line-height: var(--prime-text-heading-m-line-height);\n letter-spacing: var(--prime-text-heading-m-tracking);\n font-weight: var(--prime-text-heading-m-weight);\n}\n\n.root[data-variant=\"stat-trend\"] .value {\n font-size: var(--prime-text-heading-l-size);\n line-height: var(--prime-text-heading-l-line-height);\n letter-spacing: var(--prime-text-heading-l-tracking);\n font-weight: var(--prime-text-heading-l-weight);\n}\n\n.headerRow > .value {\n flex-shrink: 0;\n text-align: end;\n}\n\n.description,\n.ctaBody {\n margin: 0;\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n font-weight: var(--prime-font-weight-regular);\n color: var(--prime-color-text-secondary);\n overflow-wrap: anywhere;\n}\n\n.media {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: flex-end;\n width: 100%;\n min-width: 0;\n min-height: var(--prime-space-10);\n}\n\n.root[data-variant=\"mini-media\"] > .iconBox {\n flex: 0 0 auto;\n}\n\n.root[data-variant=\"mini-media\"] > .stack {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.root[data-variant=\"mini-media\"] > .media {\n flex: 1 1 100%;\n min-width: 100%;\n}\n\n.title,\n.sectionTitle {\n margin: 0;\n min-width: 0;\n font-size: var(--prime-text-title-s-size);\n line-height: var(--prime-text-title-s-line-height);\n letter-spacing: var(--prime-text-title-s-tracking);\n font-weight: var(--prime-text-title-s-weight);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n.root[data-variant=\"cta\"] .title {\n font-size: var(--prime-text-title-m-size);\n line-height: var(--prime-text-title-m-line-height);\n letter-spacing: var(--prime-text-title-m-tracking);\n font-weight: var(--prime-text-title-m-weight);\n}\n\n.delta {\n display: inline-flex;\n align-items: center;\n gap: var(--prime-space-1);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.delta[data-tone=\"success\"] {\n color: var(--prime-color-success-text);\n}\n\n.delta[data-tone=\"warning\"] {\n color: var(--prime-color-warning-text);\n}\n\n.delta[data-tone=\"danger\"] {\n color: var(--prime-color-danger-text);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n padding-top: var(--prime-space-2);\n}\n\n/* ---------- panel ---------- */\n\n.sectionHeader {\n display: flex;\n flex-shrink: 0;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-3);\n min-height: var(--prime-control-m-height);\n padding: var(--prime-space-4) var(--card-pad) 0;\n}\n\n.sectionTitle {\n flex: 1 1 auto;\n}\n\n.sectionTrailing {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: flex-end;\n gap: var(--prime-space-2);\n color: var(--prime-color-text-secondary);\n}\n\n.sectionTrailing svg {\n display: block;\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n}\n\n.body {\n box-sizing: border-box;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--card-gap);\n min-width: 0;\n min-height: 0;\n padding: var(--card-gap) var(--card-pad) var(--card-pad);\n}\n\n.body > *:only-child,\n.chart > *:only-child {\n flex: 1 1 auto;\n align-self: stretch;\n width: 100%;\n min-height: 0;\n}\n\n/* Chart is edge-to-edge under the section header. */\n.chart {\n box-sizing: border-box;\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n padding: var(--card-gap) 0 0;\n}\n\n.root[data-variant=\"panel\"] > .sectionHeader + .body:last-child,\n.root[data-variant=\"panel\"] > .sectionHeader + .chart:last-child,\n.root[data-variant=\"panel\"] > .body + .chart {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n/* Body followed by a chart: the chart brings its own top spacing. */\n.root[data-variant=\"panel\"] > .sectionHeader + .body:has(+ .chart) {\n flex: 0 1 auto;\n padding-bottom: 0;\n}\n\n/* Header followed by content: faint inset hairline under the header (charts stay edge-to-edge). */\n.sectionHeader:has(+ .body) {\n padding-bottom: var(--prime-space-4);\n background: var(--card-hairline) center bottom / var(--card-hairline-size) no-repeat;\n}\n\n.sectionHeader + .body {\n padding-top: var(--prime-space-4);\n}\n\n/* Content before the footer keeps the same 16px above the hairline as the footer has below it. */\n.root[data-variant=\"panel\"] > .body:has(+ .actions),\n.root[data-variant=\"list\"] > .list:has(+ .actions) {\n padding-bottom: var(--prime-space-4);\n}\n\n/* Actions as the card's footer: faint hairline above, same side padding. */\n.root[data-variant=\"panel\"] > .actions,\n.root[data-variant=\"list\"] > .actions {\n justify-content: flex-end;\n padding: var(--prime-space-4) var(--card-pad) var(--card-pad);\n background: var(--card-hairline) center top / var(--card-hairline-size) no-repeat;\n}\n\n/* ---------- list ---------- */\n\n.listHeader {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-3);\n padding: var(--prime-space-4) var(--card-pad) var(--prime-space-2);\n}\n\n.listHeader:has(+ .list) {\n padding-bottom: var(--prime-space-4);\n background: var(--card-hairline) center bottom / var(--card-hairline-size) no-repeat;\n}\n\n.list {\n margin: 0;\n padding: 0 0 var(--prime-space-2);\n list-style: none;\n}\n\n.listHeader + .list {\n padding-top: var(--prime-space-2);\n}\n\n.listItem {\n padding: var(--prime-space-3) var(--card-pad);\n font-size: var(--prime-text-body-m-size);\n line-height: var(--prime-text-body-m-line-height);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n.listItem + .listItem {\n background: var(--card-hairline) center top / var(--card-hairline-size) no-repeat;\n}\n\n/* CTA: title + text is the header, actions are the footer. */\n.root[data-variant=\"cta\"] > .actions {\n padding-top: var(--prime-space-4);\n background: var(--card-hairline) center top / 100% var(--prime-border-width) no-repeat;\n}\n\n/* ---------- split ---------- */\n\n.split {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--card-gap) 0;\n width: 100%;\n min-width: 0;\n}\n\n.splitCell {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.splitCell + .splitCell {\n padding-inline-start: var(--card-pad);\n border-inline-start: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.splitCell:first-child {\n padding-inline-end: var(--card-pad);\n}\n\n.splitCell:has(> .iconBox) {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--prime-space-3);\n}\n\n/* ---------- cover ---------- */\n\n.cover {\n display: block;\n width: 100%;\n min-height: calc(var(--prime-space-16) * 2);\n max-height: calc(var(--prime-space-24) * 2);\n overflow: hidden;\n background: var(--prime-color-bg-sunken);\n}\n\n.cover > * {\n display: block;\n width: 100%;\n height: 100%;\n min-height: calc(var(--prime-space-16) * 2);\n object-fit: cover;\n}\n\n.root[data-variant=\"cover\"] > .stack {\n gap: var(--prime-space-1);\n padding: var(--card-gap) var(--card-pad) 0;\n}\n\n.root[data-variant=\"cover\"] > .stack:last-child {\n padding-bottom: var(--card-pad);\n}\n\n.root[data-variant=\"cover\"] > .actions {\n padding: var(--card-gap) var(--card-pad) var(--card-pad);\n}\n\n/* ---------- Responsive (own width; container = the card, so only descendants adapt) ---------- */\n\n@container (max-width: 20rem) {\n .root[data-variant=\"stat-trend\"] .value {\n font-size: var(--prime-text-heading-m-size);\n line-height: var(--prime-text-heading-m-line-height);\n letter-spacing: var(--prime-text-heading-m-tracking);\n }\n}\n\n@container (min-width: 36rem) {\n .root[data-variant=\"stat-trend\"] .value {\n font-size: var(--prime-text-display-s-size);\n line-height: var(--prime-text-display-s-line-height);\n letter-spacing: var(--prime-text-display-s-tracking);\n }\n}\n\n@container (max-width: 22rem) {\n .split {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .splitCell:first-child {\n padding-inline-end: 0;\n }\n\n .splitCell + .splitCell {\n padding-top: var(--card-gap);\n padding-inline-start: 0;\n border-inline-start: 0;\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n }\n\n .headerRow {\n flex-wrap: wrap;\n }\n}\n", "import * as React from \"react\";\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useMergedRefs } from \"@/hooks/useMergedRefs\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\nimport { type FieldDescriptions, useFieldDescriptions } from \"@/internal/useFieldDescriptions\";\n\nimport styles from \"./Checkbox.module.css\";\n\ntype InputPassthrough = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"checked\" | \"defaultChecked\" | \"onChange\" | \"children\"\n>;\n\ntype CheckboxContextValue = FieldDescriptions & {\n inputId: string;\n size: ControlSize;\n inputRef: React.Ref<HTMLInputElement>;\n checked: boolean;\n invalid: boolean;\n disabled: boolean;\n handleChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n inputPropsRef: React.MutableRefObject<InputPassthrough>;\n};\n\nconst [CheckboxProvider, useCheckboxContext] =\n createComponentContext<CheckboxContextValue>(\"Checkbox\");\n\nexport type CheckboxRootProps = InputPassthrough & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** Mixed state (e.g. \u00ABselect all\u00BB with a partial selection); wins over `checked` visually. */\n indeterminate?: boolean;\n /** Invalid state; also set while a `Checkbox.Error` is mounted. */\n invalid?: boolean;\n size?: ControlSize;\n /** Stretch to the container width. By default the field is as wide as its content. */\n fullWidth?: boolean;\n children?: React.ReactNode;\n};\n\nconst CheckboxRoot = React.forwardRef<HTMLInputElement, CheckboxRootProps>(\n (\n {\n id,\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n indeterminate = false,\n invalid: invalidProp = false,\n size = \"m\",\n fullWidth = false,\n disabled = false,\n className,\n \"aria-describedby\": ariaDescribedBy,\n children,\n ...inputRest\n },\n ref,\n ) => {\n const rawId = React.useId();\n const inputId = id ?? rawId;\n const descriptions = useFieldDescriptions(inputId, ariaDescribedBy);\n const invalid = invalidProp || descriptions.hasError;\n\n const [checked, setChecked] = useControllableState<boolean>({\n value: checkedProp,\n defaultValue: defaultChecked,\n onChange: onCheckedChange,\n });\n\n const internalRef = React.useRef<HTMLInputElement>(null);\n const mergedRef = useMergedRefs(internalRef, ref);\n\n React.useEffect(() => {\n if (internalRef.current) internalRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => setChecked(event.target.checked),\n [setChecked],\n );\n\n const inputPropsRef = React.useRef<InputPassthrough>(inputRest);\n inputPropsRef.current = inputRest;\n\n const ctxValue = React.useMemo(\n () => ({\n ...descriptions,\n inputId,\n size,\n inputRef: mergedRef,\n checked,\n invalid,\n disabled,\n handleChange,\n inputPropsRef,\n }),\n [descriptions, inputId, size, mergedRef, checked, invalid, disabled, handleChange],\n );\n\n return (\n <CheckboxProvider value={ctxValue}>\n <ControlSizeProvider value={size}>\n <div\n className={cx(styles.field, className)}\n {...toDataAttributes({\n size,\n state: indeterminate ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\",\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n \"full-width\": fullWidth || undefined,\n })}\n >\n {children}\n </div>\n </ControlSizeProvider>\n </CheckboxProvider>\n );\n },\n);\n\nCheckboxRoot.displayName = \"CheckboxRoot\";\n\n// \u2500\u2500\u2500 Label \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CheckboxLabelProps = {\n children?: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLLabelElement>, \"htmlFor\" | \"size\">;\n\nconst CheckboxLabel = React.forwardRef<HTMLLabelElement, CheckboxLabelProps>(function CheckboxLabel(\n { children, className, ...rest },\n ref,\n) {\n const {\n inputId,\n inputRef,\n checked,\n invalid,\n disabled,\n describedBy,\n handleChange,\n inputPropsRef,\n size,\n } = useCheckboxContext();\n\n return (\n <Label.Root\n ref={ref}\n htmlFor={inputId}\n size={size}\n disabled={disabled}\n className={cx(styles.labelRow, className)}\n {...rest}\n >\n <span className={styles.controlCell}>\n <input\n {...inputPropsRef.current}\n ref={inputRef}\n id={inputId}\n type=\"checkbox\"\n className={styles.input}\n disabled={disabled}\n checked={checked}\n onChange={handleChange}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n />\n <span className={styles.control} aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" className={styles.svg} aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M5.5 12.5l4.25 4.25L18.5 8\" pathLength={1} className={styles.checkPath} />\n <path d=\"M7 12h10\" pathLength={1} className={styles.indeterminateLine} />\n </svg>\n </span>\n </span>\n {children != null ? <span className={styles.text}>{children}</span> : null}\n </Label.Root>\n );\n});\n\nCheckboxLabel.displayName = \"CheckboxLabel\";\n\n// \u2500\u2500\u2500 Hint / Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CheckboxHintProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLParagraphElement>, \"id\">;\n\nfunction CheckboxHint({ children, className, ...rest }: CheckboxHintProps) {\n const { hintId, registerHint, size, disabled } = useCheckboxContext();\n React.useLayoutEffect(registerHint, [registerHint]);\n\n return (\n <Hint.Root\n id={hintId}\n size={size}\n disabled={disabled}\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nCheckboxHint.displayName = \"CheckboxHint\";\n\nexport type CheckboxErrorProps = CheckboxHintProps;\n\nfunction CheckboxError({ children, className, ...rest }: CheckboxErrorProps) {\n const { errorId, registerError, size } = useCheckboxContext();\n React.useLayoutEffect(registerError, [registerError]);\n\n return (\n <Hint.Root\n id={errorId}\n size={size}\n invalid\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nCheckboxError.displayName = \"CheckboxError\";\n\nexport const Checkbox = {\n Root: CheckboxRoot,\n Label: CheckboxLabel,\n Hint: CheckboxHint,\n Error: CheckboxError,\n};\n", "/*\n * Support text under a field. `data-size` is the tier of the paired field; typography comes\n * from `--prime-control-<T>-hint-*` (always smaller than the field text, foundation \u00A76).\n */\n.root {\n --prime-hint-size: var(--prime-control-m-hint-size);\n --prime-hint-line-height: var(--prime-control-m-hint-line-height);\n --prime-hint-icon: var(--prime-icon-xs);\n margin: 0;\n display: flex;\n align-items: flex-start;\n gap: var(--prime-space-1);\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n font-size: var(--prime-hint-size);\n line-height: var(--prime-hint-line-height);\n font-weight: var(--prime-font-weight-regular);\n letter-spacing: var(--prime-text-caption-tracking);\n color: var(--prime-color-text-muted);\n overflow-wrap: anywhere;\n}\n\n.root[data-size=\"xs\"] {\n --prime-hint-size: var(--prime-control-xs-hint-size);\n --prime-hint-line-height: var(--prime-control-xs-hint-line-height);\n}\n\n.root[data-size=\"s\"] {\n --prime-hint-size: var(--prime-control-s-hint-size);\n --prime-hint-line-height: var(--prime-control-s-hint-line-height);\n}\n\n.root[data-size=\"l\"] {\n --prime-hint-size: var(--prime-control-l-hint-size);\n --prime-hint-line-height: var(--prime-control-l-hint-line-height);\n --prime-hint-icon: var(--prime-icon-s);\n}\n\n.root[data-size=\"xl\"] {\n --prime-hint-size: var(--prime-control-xl-hint-size);\n --prime-hint-line-height: var(--prime-control-xl-hint-line-height);\n --prime-hint-icon: var(--prime-icon-s);\n}\n\n.root[data-invalid=\"true\"] {\n color: var(--prime-color-danger-text);\n}\n\n.root[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n}\n\n/* Icon is centred on the first line box: height = line-height, glyph = hint icon size. */\n.icon {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--prime-hint-icon);\n height: var(--prime-hint-line-height);\n}\n\n.icon > svg {\n display: block;\n width: var(--prime-hint-icon);\n height: var(--prime-hint-icon);\n}\n", "import type * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Hint.module.css\";\n\nexport type HintRootProps = {\n size?: ControlSize;\n /** Error message styling (`danger-text`). */\n invalid?: boolean;\n /** Dimmed text next to a disabled control. */\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLParagraphElement>;\n\nfunction HintRoot({ className, size = \"m\", invalid, disabled, children, ...rest }: HintRootProps) {\n return (\n <ControlSizeProvider value={size}>\n <p\n className={cx(styles.root, className)}\n {...rest}\n {...toDataAttributes({\n size,\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n })}\n >\n {children}\n </p>\n </ControlSizeProvider>\n );\n}\nHintRoot.displayName = \"HintRoot\";\n\nexport type HintIconProps = {\n children: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nfunction HintIcon({ className, children, ...rest }: HintIconProps) {\n return (\n <span className={cx(styles.icon, className)} aria-hidden=\"true\" {...rest}>\n {children}\n </span>\n );\n}\nHintIcon.displayName = \"HintIcon\";\n\nexport const Hint = { Root: HintRoot, Icon: HintIcon };\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Label.module.css\";\n\nexport type LabelLabels = {\n /** Muted marker after the label text when `optional`. */\n optional: string;\n};\n\nconst LABEL_LABELS: LabelLabels = { optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\" };\n\nconst LabelSizeContext = React.createContext<ControlSize>(\"m\");\n\nexport type LabelRootProps = Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"size\"> & {\n disabled?: boolean;\n size?: ControlSize;\n /** Appends a red `*` (decorative, `aria-hidden`). Put native `required` on the control itself. */\n required?: boolean;\n /** Appends the muted optional marker (`labels.optional`). */\n optional?: boolean;\n labels?: Partial<LabelLabels>;\n};\n\nconst LabelRoot = React.forwardRef<HTMLLabelElement, LabelRootProps>(\n ({ className, disabled, children, size = \"m\", required, optional, labels, ...rest }, ref) => (\n // biome-ignore lint/a11y/noLabelWithoutControl: field label primitive; association via htmlFor or wrapping control is caller responsibility\n <label\n ref={ref}\n className={cx(styles.root, className)}\n aria-disabled={disabled || undefined}\n {...rest}\n {...toDataAttributes({ disabled: disabled || undefined, size })}\n >\n <LabelSizeContext.Provider value={size}>\n {children}\n {required ? (\n <span className={styles.asterisk} aria-hidden=\"true\">\n *\n </span>\n ) : null}\n {optional ? (\n <span className={styles.optional}>{labels?.optional ?? LABEL_LABELS.optional}</span>\n ) : null}\n </LabelSizeContext.Provider>\n </label>\n ),\n);\nLabelRoot.displayName = \"LabelRoot\";\n\nfunction LabelIcon({ className, children, ...rest }: React.HTMLAttributes<HTMLSpanElement>) {\n const size = React.useContext(LabelSizeContext);\n return (\n <span className={cx(styles.iconSlot, className)} {...rest}>\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </span>\n );\n}\nLabelIcon.displayName = \"LabelIcon\";\n\n/** Secondary inline text inside the label (units, short clarification). */\nfunction LabelSub({ className, children, ...rest }: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cx(styles.sub, className)} {...rest}>\n {children}\n </span>\n );\n}\nLabelSub.displayName = \"LabelSub\";\n\nexport const Label = {\n Root: LabelRoot,\n Icon: LabelIcon,\n Sub: LabelSub,\n};\n", "/*\n * Field label. Tier T uses `--prime-control-<T>-label-*` (foundation \u00A76):\n * xs/s 12/16 \u00B7 m 13/20 \u00B7 l/xl 14/20, weight 500, primary text.\n */\n.root {\n --prime-label-size: var(--prime-control-m-label-size);\n --prime-label-line-height: var(--prime-control-m-label-line-height);\n display: inline-flex;\n align-items: center;\n flex-wrap: wrap;\n column-gap: var(--prime-space-1);\n min-width: 0;\n max-width: 100%;\n font-family: var(--prime-font-family-sans);\n font-size: var(--prime-label-size);\n line-height: var(--prime-label-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n.root[data-size=\"xs\"] {\n --prime-label-size: var(--prime-control-xs-label-size);\n --prime-label-line-height: var(--prime-control-xs-label-line-height);\n}\n\n.root[data-size=\"s\"] {\n --prime-label-size: var(--prime-control-s-label-size);\n --prime-label-line-height: var(--prime-control-s-label-line-height);\n}\n\n.root[data-size=\"l\"] {\n --prime-label-size: var(--prime-control-l-label-size);\n --prime-label-line-height: var(--prime-control-l-label-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --prime-label-size: var(--prime-control-xl-label-size);\n --prime-label-line-height: var(--prime-control-xl-label-line-height);\n}\n\n.root[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n}\n\n.iconSlot {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n color: var(--prime-color-text-muted);\n}\n\n.asterisk {\n color: var(--prime-color-danger-text);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.sub,\n.optional {\n font-weight: var(--prime-font-weight-regular);\n color: var(--prime-color-text-muted);\n}\n\n.root[data-disabled=\"true\"] :is(.asterisk, .sub, .optional, .iconSlot) {\n color: var(--prime-color-text-disabled);\n}\n", "import * as React from \"react\";\n\nfunction assignRef<T>(ref: React.Ref<T> | undefined, value: T) {\n if (typeof ref === \"function\") {\n ref(value);\n return;\n }\n\n if (ref && \"current\" in ref) {\n (ref as React.MutableRefObject<T>).current = value;\n }\n}\n\nexport function useMergedRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n return React.useCallback(\n (value: T) => {\n for (const ref of refs) {\n assignRef(ref, value);\n }\n },\n [refs],\n );\n}\n", "import * as React from \"react\";\n\nexport type FieldDescriptions = {\n hintId: string;\n errorId: string;\n /** An error part is mounted. */\n hasError: boolean;\n /** `aria-describedby` for the control: caller ids + mounted hint + mounted error. */\n describedBy: string | undefined;\n /** Call from a mounted hint part's layout effect; returns the cleanup. */\n registerHint: () => () => void;\n /** Call from a mounted error part's layout effect; returns the cleanup. */\n registerError: () => () => void;\n};\n\n/**\n * Ids and `aria-describedby` for compound fields whose hint/error are separate parts\n * (Checkbox, Radio, Switch): parts register themselves while mounted.\n */\nexport function useFieldDescriptions(inputId: string, ariaDescribedBy?: string): FieldDescriptions {\n const [hasHint, setHasHint] = React.useState(false);\n const [hasError, setHasError] = React.useState(false);\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n\n const describedBy =\n [ariaDescribedBy, hasHint ? hintId : undefined, hasError ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const registerHint = React.useCallback(() => {\n setHasHint(true);\n return () => setHasHint(false);\n }, []);\n const registerError = React.useCallback(() => {\n setHasError(true);\n return () => setHasError(false);\n }, []);\n\n return React.useMemo(\n () => ({ hintId, errorId, hasError, describedBy, registerHint, registerError }),\n [hintId, errorId, hasError, describedBy, registerHint, registerError],\n );\n}\n", "/*\n * Choice layout (shared by Checkbox / Radio / Switch):\n * grid [control] [text]\n * [ ] [hint / error]\n * The label row is a subgrid of the root so descriptions align with the text column.\n * The control cell is one text line tall, so the box is optically centred on the first line.\n */\n.field {\n --prime-choice-size: var(--prime-control-m-choice);\n --prime-choice-radius: var(--prime-radius-xs);\n --prime-choice-gap: var(--prime-control-m-gap);\n --prime-choice-text: var(--prime-control-m-text-size);\n --prime-choice-line-height: var(--prime-control-m-line-height);\n box-sizing: border-box;\n /* Shrink to content (so choices sit side by side in horizontal groups); text still wraps\n * within the container. `fullWidth` stretches the field. */\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n column-gap: var(--prime-choice-gap);\n row-gap: 0;\n align-content: start;\n}\n\n.field[data-full-width=\"true\"] {\n width: 100%;\n}\n\n.field[data-size=\"xs\"] {\n --prime-choice-size: var(--prime-control-xs-choice);\n --prime-choice-gap: var(--prime-control-xs-gap);\n --prime-choice-text: var(--prime-control-xs-text-size);\n --prime-choice-line-height: var(--prime-control-xs-line-height);\n}\n\n.field[data-size=\"s\"] {\n --prime-choice-size: var(--prime-control-s-choice);\n --prime-choice-gap: var(--prime-control-s-gap);\n --prime-choice-text: var(--prime-control-s-text-size);\n --prime-choice-line-height: var(--prime-control-s-line-height);\n}\n\n.field[data-size=\"l\"] {\n --prime-choice-size: var(--prime-control-l-choice);\n --prime-choice-gap: var(--prime-control-l-gap);\n --prime-choice-text: var(--prime-control-l-text-size);\n --prime-choice-line-height: var(--prime-control-l-line-height);\n}\n\n.field[data-size=\"xl\"] {\n --prime-choice-size: var(--prime-control-xl-choice);\n --prime-choice-radius: var(--prime-radius-s);\n --prime-choice-gap: var(--prime-control-xl-gap);\n --prime-choice-text: var(--prime-control-xl-text-size);\n --prime-choice-line-height: var(--prime-control-xl-line-height);\n}\n\n/* `.field .labelRow` outranks Label.Root's own inline-flex. */\n.field .labelRow {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n column-gap: var(--prime-choice-gap);\n align-items: start;\n width: 100%;\n font-size: var(--prime-choice-text);\n line-height: var(--prime-choice-line-height);\n font-weight: var(--prime-font-weight-regular);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n}\n\n.controlCell {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--prime-choice-size);\n height: max(var(--prime-choice-size), var(--prime-choice-line-height));\n}\n\n/* Native input stays in the box (for validation bubbles) but is invisible. */\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.control {\n box-sizing: border-box;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--prime-choice-size);\n height: var(--prime-choice-size);\n border-radius: var(--prime-choice-radius);\n background: var(--prime-color-fill-strong);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-accent-fg);\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.svg {\n display: block;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* Rounded check / bar, drawn with a stroke reveal and a small pop (scale) on check. */\n.checkPath,\n.indeterminateLine {\n fill: none;\n stroke: currentColor;\n stroke-width: 2.25;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 1;\n stroke-dashoffset: 1;\n transform-box: fill-box;\n transform-origin: center;\n transform: scale(0.6);\n opacity: 0;\n transition:\n stroke-dashoffset var(--prime-motion-duration-base) var(--prime-motion-easing-enter),\n transform var(--prime-motion-duration-base) var(--prime-motion-easing-enter),\n opacity var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.field[data-state=\"checked\"] .checkPath,\n.field[data-state=\"indeterminate\"] .indeterminateLine {\n stroke-dashoffset: 0;\n transform: scale(1);\n opacity: 1;\n}\n\n.text {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* ---- hover ---- */\n.labelRow:hover .control {\n background: var(--prime-color-fill-strong-hover);\n}\n\n/* ---- active: tactile press ---- */\n.labelRow:active .control {\n transform: scale(0.92);\n}\n\n/* ---- checked / indeterminate ---- */\n.field:is([data-state=\"checked\"], [data-state=\"indeterminate\"]) .control {\n background: var(--prime-color-accent-default);\n}\n\n.field:is([data-state=\"checked\"], [data-state=\"indeterminate\"]) .labelRow:hover .control {\n background: var(--prime-color-accent-hover);\n}\n\n/* ---- focus-visible ---- */\n.input:focus-visible + .control {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* ---- invalid ---- */\n.field[data-invalid=\"true\"][data-state=\"unchecked\"] .control {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.field[data-invalid=\"true\"] .input:focus-visible + .control {\n outline-color: var(--prime-color-danger-border);\n}\n\n/* ---- disabled ---- */\n.field[data-disabled=\"true\"] .labelRow {\n cursor: not-allowed;\n}\n\n.field[data-disabled=\"true\"] .control,\n.field[data-disabled=\"true\"] .labelRow:hover .control {\n background: var(--prime-color-fill-muted);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n transform: none;\n}\n\n/* ---- description / error under the text column ---- */\n.hintSlot {\n grid-column: 2;\n min-width: 0;\n}\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { highlightTsxHtml } from \"@/internal/highlightTsxHtml\";\nimport type { Variant } from \"@/internal/states\";\n\nimport styles from \"./CodeBlock.module.css\";\n\nexport type CodeBlockColorScheme = \"light\" | \"dark\";\n\n/** `soft` \u2014 sunken panel with padding and the `code` text role; `ghost` \u2014 bare `pre` that inherits type and background from its host. */\nexport type CodeBlockVariant = Extract<Variant, \"soft\" | \"ghost\">;\n\nexport type CodeBlockRootProps = {\n /** TS/TSX source; highlighted with `highlightTsxHtml`. */\n code: string;\n /** Forces a theme for the block. Omit to follow the surrounding theme. */\n colorScheme?: CodeBlockColorScheme;\n variant?: CodeBlockVariant;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLPreElement>, \"children\" | \"dangerouslySetInnerHTML\">;\n\nconst CodeBlockRoot = React.forwardRef<HTMLPreElement, CodeBlockRootProps>(function CodeBlockRoot(\n { code, colorScheme, variant = \"soft\", className, tabIndex, ...rest },\n ref,\n) {\n const html = React.useMemo(() => highlightTsxHtml(code.trimEnd()), [code]);\n\n return (\n <pre\n ref={ref}\n className={cx(styles.root, className)}\n data-theme={colorScheme}\n data-variant={variant}\n // A soft block scrolls horizontally: keep it reachable from the keyboard.\n tabIndex={tabIndex ?? (variant === \"soft\" ? 0 : undefined)}\n {...rest}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: markup from the trusted `highlightTsxHtml(code)` (escapes the source)\n dangerouslySetInnerHTML={{ __html: `<code class=\"${styles.code}\">${html}</code>` }}\n />\n );\n});\nCodeBlockRoot.displayName = \"CodeBlock.Root\";\n\nexport const CodeBlock = {\n Root: CodeBlockRoot,\n};\n", "/** \u041F\u0440\u0438\u043C\u0438\u0442\u0438\u0432\u043D\u0430\u044F \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 TS/TSX \u0434\u043B\u044F \u043F\u043B\u0435\u0439\u0433\u0440\u0430\u0443\u043D\u0434\u0430: \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438, \u0441\u0442\u0440\u043E\u043A\u0438, \u0447\u0438\u0441\u043B\u0430, \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430, JSX-\u0442\u0435\u0433\u0438. */\n\nconst KW = new Set(\n \"break case catch class const continue debugger default delete do else export extends false finally for from function if import in instanceof let new null return super switch this throw true try typeof var void while with yield async await of type interface implements package private protected public static readonly keyof as is enum namespace module declare abstract satisfies using\".split(\n \" \",\n ),\n);\n\nconst INTRINSIC =\n /^(?:div|span|a|button|input|form|label|p|code|pre|section|article|header|footer|nav|main|aside|ul|ol|li|table|tr|td|th|img|svg|path|circle|Fragment|Suspense|h[1-6])\\b/;\n\nfunction esc(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction span(cls: string, raw: string): string {\n return `<span class=\"${cls}\">${esc(raw)}</span>`;\n}\n\nfunction readString(s: string, start: number, quote: '\"' | \"'\" | \"`\"): number {\n let j = start + 1;\n while (j < s.length) {\n const c = s[j];\n if (c === \"\\\\\" && j + 1 < s.length) {\n j += 2;\n continue;\n }\n if (c === quote) return j + 1;\n j++;\n }\n return s.length;\n}\n\nexport function highlightTsxHtml(source: string): string {\n let i = 0;\n let out = \"\";\n const n = source.length;\n\n while (i < n) {\n const ch = source[i];\n const ch2 = source[i + 1];\n\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n out += esc(ch);\n i++;\n continue;\n }\n\n if (ch === \"/\" && ch2 === \"/\") {\n let j = i + 2;\n while (j < n && source[j] !== \"\\n\") j++;\n out += span(\"prime-tok-c\", source.slice(i, j));\n i = j;\n continue;\n }\n\n if (ch === \"/\" && ch2 === \"*\") {\n let j = i + 2;\n while (j + 1 < n && !(source[j] === \"*\" && source[j + 1] === \"/\")) j++;\n j = j + 2 <= n ? j + 2 : n;\n out += span(\"prime-tok-c\", source.slice(i, j));\n i = j;\n continue;\n }\n\n if (ch === \"`\") {\n const j = readString(source, i, \"`\");\n out += span(\"prime-tok-s\", source.slice(i, j));\n i = j;\n continue;\n }\n if (ch === '\"') {\n const j = readString(source, i, '\"');\n out += span(\"prime-tok-s\", source.slice(i, j));\n i = j;\n continue;\n }\n if (ch === \"'\") {\n const j = readString(source, i, \"'\");\n out += span(\"prime-tok-s\", source.slice(i, j));\n i = j;\n continue;\n }\n\n if (ch === \"<\" && source.slice(i, i + 4) === \"<!--\") {\n const end = source.indexOf(\"-->\", i + 4);\n const j = end === -1 ? n : end + 3;\n out += span(\"prime-tok-c\", source.slice(i, j));\n i = j;\n continue;\n }\n\n if (ch === \"<\") {\n const mm = source.slice(i).match(/^<(\\/?)([A-Za-z_][\\w.]*)\\b/);\n if (mm) {\n const name = mm[2];\n const isJsx = /^[A-Z]/.test(name) || INTRINSIC.test(name);\n if (isJsx) {\n const len = mm[0].length;\n out += span(\"prime-tok-x\", source.slice(i, i + len));\n i += len;\n continue;\n }\n }\n out += esc(\"<\");\n i++;\n continue;\n }\n\n if (/\\d/.test(ch)) {\n let j = i + 1;\n while (j < n && /[\\d.eE+-]/.test(source[j])) j++;\n out += span(\"prime-tok-n\", source.slice(i, j));\n i = j;\n continue;\n }\n\n if (/[a-zA-Z_$]/.test(ch)) {\n let j = i + 1;\n while (j < n && /[a-zA-Z0-9_$]/.test(source[j])) j++;\n const w = source.slice(i, j);\n out += KW.has(w) ? span(\"prime-tok-k\", w) : esc(w);\n i = j;\n continue;\n }\n\n out += esc(ch);\n i++;\n }\n\n return out;\n}\n", "/*\n * CodeBlock \u2014 monospace `code` role on a sunken wash, no border.\n * Token colors come from the palette, so they follow the theme; `data-theme` on the root\n * (from `colorScheme`) re-scopes the whole palette when a fixed scheme is requested.\n */\n.root {\n box-sizing: border-box;\n margin: 0;\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-mono);\n font-variant-ligatures: none;\n white-space: pre;\n tab-size: 2;\n}\n\n.root[data-variant=\"soft\"] {\n max-width: 100%;\n padding: var(--prime-space-3) var(--prime-space-4);\n overflow-x: auto;\n border-radius: var(--prime-radius-m);\n background: var(--prime-color-fill-muted);\n font-size: var(--prime-text-code-size);\n line-height: var(--prime-text-code-line-height);\n font-weight: var(--prime-text-code-weight);\n letter-spacing: var(--prime-text-code-tracking);\n}\n\n/* Forced scheme: the block carries its own background so the palette stays legible. */\n.root[data-variant=\"soft\"][data-theme] {\n background: var(--prime-color-bg-raised);\n}\n\n.root[data-variant=\"ghost\"] {\n padding: 0;\n background: transparent;\n font-size: inherit;\n line-height: inherit;\n}\n\n.root:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.code {\n font-family: inherit;\n}\n\n/* Syntax tokens from `highlightTsxHtml`. */\n.root :global(.prime-tok-k) {\n color: var(--prime-color-palette-purple-text);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.root :global(.prime-tok-s) {\n color: var(--prime-color-palette-teal-text);\n}\n\n.root :global(.prime-tok-c) {\n color: var(--prime-color-text-muted);\n font-style: italic;\n}\n\n.root :global(.prime-tok-n) {\n color: var(--prime-color-palette-orange-text);\n}\n\n.root :global(.prime-tok-x) {\n color: var(--prime-color-palette-blue-text);\n}\n", "import type { ColorChannel } from \"@react-types/color\";\nimport * as React from \"react\";\nimport {\n ColorArea as AriaColorArea,\n type ColorAreaProps as AriaColorAreaProps,\n ColorField as AriaColorField,\n ColorPicker as AriaColorPicker,\n ColorSlider as AriaColorSlider,\n type ColorSliderProps as AriaColorSliderProps,\n ColorSwatch as AriaColorSwatch,\n ColorSwatchPicker as AriaColorSwatchPicker,\n ColorSwatchPickerItem as AriaColorSwatchPickerItem,\n type ColorSwatchPickerItemProps as AriaColorSwatchPickerItemProps,\n type ColorSwatchPickerProps as AriaColorSwatchPickerProps,\n type ColorSwatchProps as AriaColorSwatchProps,\n ColorThumb as AriaColorThumb,\n type ColorThumbProps as AriaColorThumbProps,\n SliderOutput as AriaSliderOutput,\n type SliderOutputProps as AriaSliderOutputProps,\n SliderTrack as AriaSliderTrack,\n type SliderTrackProps as AriaSliderTrackProps,\n type Color,\n ColorPickerStateContext,\n composeRenderProps,\n parseColor,\n} from \"react-aria-components\";\n\nimport { Button } from \"@/components/button/Button\";\nimport { Input } from \"@/components/input/Input\";\nimport { Select } from \"@/components/select/Select\";\nimport selectStyles from \"@/components/select/Select.module.css\";\nimport { Icon } from \"@/icons\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./ColorPicker.module.css\";\n\nexport type { Color as ColorPickerColorValue } from \"react-aria-components\";\nexport type ColorValueFormat = \"hsl\" | \"rgb\" | \"hex\";\n\nexport type ColorPickerLabels = {\n /** `ColorPicker.FormatSelect` trigger. */\n format: string;\n /** `ColorPicker.EyeDropperButton` (also inside `ChannelStrip`). */\n eyeDropper: string;\n /** Hex field of `ChannelStrip` and the default `HexInput` label. */\n hex: string;\n hue: string;\n saturation: string;\n lightness: string;\n alpha: string;\n red: string;\n green: string;\n blue: string;\n};\n\nconst COLOR_PICKER_LABELS: ColorPickerLabels = {\n format: \"\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0446\u0432\u0435\u0442\u0430\",\n eyeDropper: \"\u041F\u0438\u043F\u0435\u0442\u043A\u0430\",\n hex: \"Hex\",\n hue: \"\u041E\u0442\u0442\u0435\u043D\u043E\u043A, \u0433\u0440\u0430\u0434\u0443\u0441\u044B\",\n saturation: \"\u041D\u0430\u0441\u044B\u0449\u0435\u043D\u043D\u043E\u0441\u0442\u044C, \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u044B\",\n lightness: \"\u042F\u0440\u043A\u043E\u0441\u0442\u044C, \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u044B\",\n alpha: \"\u041D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C, \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u044B\",\n red: \"\u041A\u0440\u0430\u0441\u043D\u044B\u0439, 0\u2013255\",\n green: \"\u0417\u0435\u043B\u0451\u043D\u044B\u0439, 0\u2013255\",\n blue: \"\u0421\u0438\u043D\u0438\u0439, 0\u2013255\",\n};\n\nexport type ColorPickerRootProps = {\n /** Controlled color: a CSS color string or a `Color` from `parseColor`. */\n value?: string | Color;\n defaultValue?: string | Color;\n onValueChange?: (color: Color) => void;\n /** Initial value format of `FormatSelect` and `ChannelStrip`. */\n defaultFormat?: ColorValueFormat;\n labels?: Partial<ColorPickerLabels>;\n children: React.ReactNode;\n};\n\nexport type ColorPickerHexInputProps = {\n size?: ControlSize;\n label?: React.ReactNode;\n /**\n * Draws the focus ring on the focused field (default). `false` sets `data-focus-ring=\"false\"` and\n * hides only the visual ring \u2014 focus, keyboard and ARIA are unchanged, the error ring still shows.\n * Turn it off only where focus is otherwise obvious; WCAG 2.4.7.\n */\n focusRing?: boolean;\n className?: string;\n};\n\nexport { parseColor };\n\ntype EyeDropperCtor = new () => { open: () => Promise<{ sRGBHex: string }> };\n\n/** Transparency checkerboard drawn under color layers (token colors, 8px cells). */\nconst CHECKER_GRADIENT =\n \"repeating-conic-gradient(var(--prime-color-bg-surface) 0deg 90deg, var(--prime-color-fill-strong) 90deg 180deg)\";\nconst CHECKER_BG = `${CHECKER_GRADIENT} 0% 0% / var(--prime-space-2) var(--prime-space-2)`;\nconst TRIGGER_SWATCH_FALLBACK_FILL = \"var(--prime-color-fill-strong)\";\n\ntype ColorPickerCtx = NonNullable<React.ContextType<typeof ColorPickerStateContext>>;\n\ntype ChannelLabelKey = Extract<ColorChannel, keyof ColorPickerLabels>;\n\nconst [ColorPickerProvider, useColorPickerContext] = createComponentContext<{\n format: ColorValueFormat;\n setFormat: (f: ColorValueFormat) => void;\n labels: ColorPickerLabels;\n}>(\"ColorPicker\");\n\n/** Hex text of the current color (`#rrggbb`, or `#rrggbbaa` with alpha). */\nfunction toHexText(color: Color) {\n return color.toString(color.getChannelValue(\"alpha\") < 1 ? \"hexa\" : \"hex\");\n}\n\n/**\n * Draft text for a hex input bound to the picker state: re-syncs when the color changes\n * (unless the input is focused) and commits on blur / Enter, reverting invalid input.\n */\nfunction useHexDraft(inputRef: React.RefObject<HTMLInputElement | null>) {\n const state = React.useContext(ColorPickerStateContext);\n const [text, setText] = React.useState(() => (state ? toHexText(state.color) : \"\"));\n const fingerprint = state ? state.color.toString(\"hexa\") : \"\";\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: the RAC state object is stable; the color change is tracked by its fingerprint\n React.useEffect(() => {\n if (!state || (inputRef.current && document.activeElement === inputRef.current)) return;\n setText(toHexText(state.color));\n }, [fingerprint]);\n\n const commit = () => {\n if (!state) return;\n try {\n state.setColor(parseColor(text.trim()));\n } catch {\n setText(toHexText(state.color));\n }\n };\n\n return { state, text, setText, commit };\n}\n\nconst FORMAT_SELECT_LABEL: Record<ColorValueFormat, string> = {\n hsl: \"HSL\",\n rgb: \"RGB\",\n hex: \"Hex\",\n};\n\nfunction FormatSelect({ className }: { className?: string }) {\n const { format, setFormat, labels } = useColorPickerContext();\n\n return (\n <div className={cx(styles.formatSelectWrap, className)}>\n <Select.Root\n value={format}\n onValueChange={(v) => {\n if (v === \"hsl\" || v === \"rgb\" || v === \"hex\") {\n setFormat(v);\n }\n }}\n >\n <Select.Trigger aria-label={labels.format}>\n <span className={selectStyles.triggerValue}>{FORMAT_SELECT_LABEL[format]}</span>\n </Select.Trigger>\n <Select.Content>\n <Select.Item label=\"HSL\" value=\"hsl\">\n HSL\n </Select.Item>\n <Select.Item label=\"RGB\" value=\"rgb\">\n RGB\n </Select.Item>\n <Select.Item label=\"Hex\" value=\"hex\">\n Hex\n </Select.Item>\n </Select.Content>\n </Select.Root>\n </div>\n );\n}\n\nfunction displayChannelValue(\n color: ColorPickerCtx[\"color\"],\n channel: ColorChannel,\n space: \"hsl\" | \"rgb\",\n) {\n const c = color.toFormat(space);\n const raw = c.getChannelValue(channel);\n if (channel === \"alpha\") {\n return String(Math.round(raw * 100));\n }\n return String(Math.round(raw));\n}\n\nfunction applyChannelValue(\n state: ColorPickerCtx,\n channel: ColorChannel,\n space: \"hsl\" | \"rgb\",\n text: string,\n) {\n const trimmed = text.trim().replace(\",\", \".\");\n const n = Number.parseFloat(trimmed);\n if (Number.isNaN(n)) {\n return;\n }\n if (channel === \"alpha\") {\n const pct = Math.min(100, Math.max(0, n));\n state.setColor(state.color.withChannelValue(\"alpha\", pct / 100));\n return;\n }\n const c = state.color.toFormat(space);\n const range = c.getChannelRange(channel);\n const v = Math.min(range.maxValue, Math.max(range.minValue, n));\n state.setColor(c.withChannelValue(channel, v));\n}\n\nfunction ChannelField({\n channel,\n space,\n suffix,\n}: {\n channel: ChannelLabelKey;\n space: \"hsl\" | \"rgb\";\n suffix: string;\n}) {\n const { labels } = useColorPickerContext();\n const state = React.useContext(ColorPickerStateContext);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [text, setText] = React.useState(() =>\n state ? displayChannelValue(state.color, channel, space) : \"\",\n );\n const fingerprint = state ? state.color.toString(\"hexa\") : \"\";\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: the RAC state object is stable; the color change is tracked by its fingerprint\n React.useEffect(() => {\n if (!state) {\n return;\n }\n if (inputRef.current && document.activeElement === inputRef.current) {\n return;\n }\n setText(displayChannelValue(state.color, channel, space));\n }, [fingerprint]);\n\n if (!state) {\n return null;\n }\n\n const commit = () => {\n applyChannelValue(state, channel, space, text);\n setText(displayChannelValue(state.color, channel, space));\n };\n\n return (\n <label className={styles.channelCell}>\n <input\n ref={inputRef}\n aria-label={labels[channel]}\n className={styles.channelInput}\n inputMode=\"decimal\"\n value={text}\n onBlur={commit}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n inputRef.current?.blur();\n }\n }}\n />\n {suffix ? <span className={styles.channelSuffix}>{suffix}</span> : null}\n </label>\n );\n}\n\nfunction StripHexField() {\n const { labels } = useColorPickerContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { state, text, setText, commit } = useHexDraft(inputRef);\n\n if (!state) {\n return null;\n }\n\n return (\n <label className={cx(styles.channelCell, styles.channelCellHex)}>\n <input\n ref={inputRef}\n aria-label={labels.hex}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n className={styles.channelInput}\n spellCheck={false}\n value={text}\n onBlur={commit}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n inputRef.current?.blur();\n }\n }}\n />\n </label>\n );\n}\n\nexport type ColorPickerChannelStripProps = {\n className?: string;\n /**\n * Draws the focus ring on the focused field (default). `false` sets `data-focus-ring=\"false\"` and\n * hides only the visual ring \u2014 focus, keyboard and ARIA are unchanged, the error ring still shows.\n * Turn it off only where focus is otherwise obvious; WCAG 2.4.7.\n */\n focusRing?: boolean;\n};\n\n/** Channel row: eyedropper on the left, then the cells of the current format. */\nfunction ChannelStrip({ className, focusRing = true }: ColorPickerChannelStripProps) {\n const { format } = useColorPickerContext();\n\n return (\n <div\n className={cx(styles.channelStrip, className)}\n data-focus-ring={focusRing ? undefined : \"false\"}\n >\n <div className={styles.channelStripLead}>\n <EyeDropperButton className={styles.channelStripEyedropperBtn} />\n </div>\n {format === \"hex\" ? (\n <StripHexField />\n ) : format === \"hsl\" ? (\n <>\n <ChannelField channel=\"hue\" space=\"hsl\" suffix=\"\u00B0\" />\n <ChannelField channel=\"saturation\" space=\"hsl\" suffix=\"%\" />\n <ChannelField channel=\"lightness\" space=\"hsl\" suffix=\"%\" />\n <ChannelField channel=\"alpha\" space=\"hsl\" suffix=\"%\" />\n </>\n ) : (\n <>\n <ChannelField channel=\"red\" space=\"rgb\" suffix=\"\" />\n <ChannelField channel=\"green\" space=\"rgb\" suffix=\"\" />\n <ChannelField channel=\"blue\" space=\"rgb\" suffix=\"\" />\n <ChannelField channel=\"alpha\" space=\"rgb\" suffix=\"%\" />\n </>\n )}\n </div>\n );\n}\n\nexport type ColorPickerPanelProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * `none` (default) \u2014 layout only, for use inside Popover / Card that already provide a surface.\n * `raised` \u2014 standalone floating panel: raised background, panel radius/padding, overlay shadow.\n */\n surface?: \"none\" | \"raised\";\n};\n\n/** Vertical stack for picker parts with the standard gap; optional raised surface. */\nconst Panel = React.forwardRef<HTMLDivElement, ColorPickerPanelProps>(function Panel(\n { surface = \"none\", className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx(styles.panel, className)} data-surface={surface} {...rest} />;\n});\n\nPanel.displayName = \"ColorPicker.Panel\";\n\nfunction ColorPickerRoot({\n value,\n defaultValue,\n onValueChange,\n defaultFormat = \"hsl\",\n labels: labelsProp,\n children,\n}: ColorPickerRootProps) {\n const [format, setFormat] = React.useState<ColorValueFormat>(defaultFormat);\n const labels = React.useMemo(() => ({ ...COLOR_PICKER_LABELS, ...labelsProp }), [labelsProp]);\n const contextValue = React.useMemo(() => ({ format, setFormat, labels }), [format, labels]);\n\n return (\n <ColorPickerProvider value={contextValue}>\n <AriaColorPicker value={value} defaultValue={defaultValue} onChange={onValueChange}>\n {children}\n </AriaColorPicker>\n </ColorPickerProvider>\n );\n}\nColorPickerRoot.displayName = \"ColorPicker.Root\";\n\nexport type ColorPickerFieldProps = React.ComponentProps<typeof AriaColorField> & {\n /**\n * Draws the focus ring on the focused field (default). `false` sets `data-focus-ring=\"false\"` and\n * hides only the visual ring \u2014 focus, keyboard and ARIA are unchanged, the error ring still shows.\n * Turn it off only where focus is otherwise obvious; WCAG 2.4.7.\n */\n focusRing?: boolean;\n};\n\nfunction Field({ className, focusRing = true, ...props }: ColorPickerFieldProps) {\n return (\n <AriaColorField\n className={composeRenderProps(className, (c) => cx(styles.field, c))}\n data-focus-ring={focusRing ? undefined : \"false\"}\n {...props}\n />\n );\n}\n\nexport type ColorPickerSliderProps = Omit<AriaColorSliderProps, \"isDisabled\"> & {\n disabled?: boolean;\n};\n\nfunction Slider({ className, disabled, ...props }: ColorPickerSliderProps) {\n return (\n <AriaColorSlider\n className={composeRenderProps(className, (c) => cx(styles.slider, c))}\n isDisabled={disabled}\n {...props}\n />\n );\n}\n\nexport type ColorPickerAreaProps = Omit<AriaColorAreaProps, \"isDisabled\"> & {\n disabled?: boolean;\n};\n\nfunction Area({ className, disabled, ...props }: ColorPickerAreaProps) {\n return (\n <AriaColorArea\n className={composeRenderProps(className, (c) => cx(styles.area, c))}\n isDisabled={disabled}\n {...props}\n />\n );\n}\n\nfunction SliderTrack({ className, style, ...props }: AriaSliderTrackProps) {\n return (\n <AriaSliderTrack\n className={composeRenderProps(className, (c) => cx(styles.sliderTrack, c))}\n style={(renderProps) => {\n const fromUser = typeof style === \"function\" ? style(renderProps) : style;\n const baseBg = renderProps.defaultStyle.background;\n const layered =\n renderProps.isDisabled || baseBg === undefined\n ? baseBg\n : `${String(baseBg)}, ${CHECKER_BG}`;\n return {\n ...renderProps.defaultStyle,\n ...fromUser,\n ...(layered !== undefined ? { background: layered } : null),\n };\n }}\n {...props}\n />\n );\n}\n\nfunction Thumb({ className, ...props }: AriaColorThumbProps) {\n return (\n <AriaColorThumb\n className={composeRenderProps(className, (c) => cx(styles.thumb, c))}\n {...props}\n />\n );\n}\n\nfunction AreaThumb({ className, ...props }: AriaColorThumbProps) {\n return (\n <AriaColorThumb\n className={composeRenderProps(className, (c) => cx(styles.thumbArea, c))}\n {...props}\n />\n );\n}\n\nexport type ColorPickerSwatchPickerProps = Omit<AriaColorSwatchPickerProps, \"onChange\"> & {\n onValueChange?: (color: Color) => void;\n};\n\n/** Preset group. Inside `Root` it follows the picker color; standalone it takes `value` itself. */\nfunction SwatchPicker({ className, onValueChange, ...props }: ColorPickerSwatchPickerProps) {\n return (\n <AriaColorSwatchPicker\n className={composeRenderProps(className, (c) => cx(styles.swatchPicker, c))}\n onChange={onValueChange}\n {...props}\n />\n );\n}\n\nexport type ColorPickerSwatchPickerItemProps = Omit<\n AriaColorSwatchPickerItemProps,\n \"isDisabled\"\n> & {\n disabled?: boolean;\n};\n\nfunction SwatchPickerItem({ className, disabled, ...props }: ColorPickerSwatchPickerItemProps) {\n return (\n <AriaColorSwatchPickerItem\n className={composeRenderProps(className, (c) => cx(styles.swatchItem, c))}\n isDisabled={disabled}\n {...props}\n />\n );\n}\n\nfunction Swatch({ className, style, ...props }: AriaColorSwatchProps) {\n return (\n <AriaColorSwatch\n className={composeRenderProps(className, (c) => cx(styles.swatch, c))}\n style={(renderProps) => {\n const fromUser = typeof style === \"function\" ? style(renderProps) : style;\n const baseBg = renderProps.defaultStyle.background;\n return {\n ...renderProps.defaultStyle,\n ...fromUser,\n ...(baseBg !== undefined ? { background: `${String(baseBg)}, ${CHECKER_BG}` } : null),\n };\n }}\n {...props}\n />\n );\n}\n\nfunction Output(props: AriaSliderOutputProps) {\n return (\n <AriaSliderOutput\n {...props}\n className={composeRenderProps(props.className, (c) => cx(styles.sliderValue, c))}\n />\n );\n}\n\nfunction SliderMeta({ label }: { label: React.ReactNode }) {\n return (\n <div className={styles.sliderHeader}>\n <span className={styles.sliderLabel}>{label}</span>\n <Output />\n </div>\n );\n}\n\nfunction HexInput({ size = \"m\", label, focusRing = true, className }: ColorPickerHexInputProps) {\n const { labels } = useColorPickerContext();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const { state, text, setText, commit } = useHexDraft(inputRef);\n\n if (!state) {\n return null;\n }\n\n return (\n <Input.Root className={className} label={label ?? labels.hex} size={size} focusRing={focusRing}>\n <Input.Wrapper>\n <Input.Field\n ref={inputRef}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={text}\n onBlur={commit}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n (e.target as HTMLInputElement).blur();\n }\n }}\n />\n </Input.Wrapper>\n </Input.Root>\n );\n}\n\nexport type ColorPickerEyeDropperButtonProps = Omit<\n React.ComponentPropsWithoutRef<typeof Button.Root>,\n \"variant\" | \"tone\" | \"size\" | \"aria-label\"\n>;\n\n/**\n * Square soft button that opens the native EyeDropper (name: `labels.eyeDropper`). Without\n * browser support it renders disabled and hidden from assistive tech. Default icon: pipette.\n */\nconst EyeDropperButton = React.forwardRef<HTMLButtonElement, ColorPickerEyeDropperButtonProps>(\n function EyeDropperButton(\n { children, onClick, type = \"button\", className, ...rest },\n forwardedRef,\n ) {\n const { labels } = useColorPickerContext();\n const state = React.useContext(ColorPickerStateContext);\n const content = children ?? (\n <Button.Icon>\n <Icon name=\"action.eyedropper\" />\n </Button.Icon>\n );\n const EyeDropperApi =\n typeof globalThis !== \"undefined\"\n ? (globalThis as unknown as { EyeDropper?: EyeDropperCtor }).EyeDropper\n : undefined;\n\n if (!state) {\n return null;\n }\n\n if (!EyeDropperApi) {\n return (\n <Button.Root\n variant=\"soft\"\n tone=\"neutral\"\n ref={forwardedRef}\n aria-hidden\n className={cx(styles.eyeDropperSquare, className)}\n disabled\n tabIndex={-1}\n type={type}\n {...rest}\n >\n {content}\n </Button.Root>\n );\n }\n\n return (\n <Button.Root\n variant=\"soft\"\n tone=\"neutral\"\n ref={forwardedRef}\n type={type}\n aria-label={labels.eyeDropper}\n className={cx(styles.eyeDropperSquare, className)}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) {\n return;\n }\n void new EyeDropperApi()\n .open()\n .then((result) => state.setColor(parseColor(result.sRGBHex)))\n .catch(() => {});\n }}\n {...rest}\n >\n {content}\n </Button.Root>\n );\n },\n);\n\nEyeDropperButton.displayName = \"ColorPicker.EyeDropperButton\";\n\nexport type ColorPickerTriggerSwatchProps = {\n className?: string;\n};\n\n/** Square of the current color, e.g. inside the popover trigger button. */\nfunction TriggerSwatch({ className }: ColorPickerTriggerSwatchProps) {\n const state = React.useContext(ColorPickerStateContext);\n const colorCss = state != null ? state.color.toString(\"css\") : TRIGGER_SWATCH_FALLBACK_FILL;\n return (\n <span aria-hidden className={cx(styles.triggerSwatch, className)}>\n <svg\n className={styles.triggerSwatchSvg}\n aria-hidden=\"true\"\n viewBox=\"0 0 1 1\"\n preserveAspectRatio=\"none\"\n >\n <rect width=\"1\" height=\"1\" fill={colorCss} />\n </svg>\n </span>\n );\n}\n\nTriggerSwatch.displayName = \"ColorPicker.TriggerSwatch\";\n\nexport const ColorPicker = {\n Root: ColorPickerRoot,\n Panel,\n TriggerSwatch,\n FormatSelect,\n ChannelStrip,\n Field,\n HexInput,\n Area,\n AreaThumb,\n Slider,\n SliderMeta,\n SliderTrack,\n Thumb,\n Output,\n SwatchPicker,\n SwatchPickerItem,\n Swatch,\n EyeDropperButton,\n};\n", "import * as React from \"react\";\nimport { Badge } from \"@/components/badge/Badge\";\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { useFieldIds } from \"@/hooks/useFieldIds\";\nimport { Icon } from \"@/icons\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\n\nimport composableStyles from \"./Input.module.css\";\n\n// \u2500\u2500\u2500 Composable API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type InputLabels = {\n /** Muted marker after the label when `optional`. */\n optional: string;\n /** Accessible name of `Input.ClearButton`. */\n clear: string;\n /** Screen-reader text of `Input.Counter`; `{current}` and `{max}` are replaced. */\n counter: string;\n};\n\nconst INPUT_LABELS: InputLabels = {\n optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\",\n clear: \"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\",\n counter: \"{current} \u0438\u0437 {max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432\",\n};\n\ntype InputContextValue = {\n size: ControlSize;\n invalid: boolean;\n focusRing: boolean;\n required: boolean;\n inputId: string;\n describedBy: string | undefined;\n labels: InputLabels;\n};\n\nconst [InputProvider, useInputContext] = createComponentContext<InputContextValue>(\"Input\");\n\n// ---- InputRoot ----\n\nexport type InputRootProps = {\n size?: ControlSize;\n /** Invalid state: danger ring on the field and `aria-invalid` on the input. A non-empty `error` implies it. */\n invalid?: boolean;\n /**\n * Draws the focus ring on `Input.Wrapper` (default). `false` hides only the visual ring \u2014 focus,\n * keyboard and ARIA are unchanged, the error ring still shows. Turn it off only where focus is\n * otherwise obvious (a single search field with a caret, e.g. a command palette); WCAG 2.4.7.\n */\n focusRing?: boolean;\n label?: React.ReactNode;\n /** Shows a red `*` after the label and sets native `required` on `Input.Field`. */\n required?: boolean;\n /** Shows the muted optional marker after the label text (`labels.optional`). */\n optional?: boolean;\n hint?: React.ReactNode;\n /** Error message; replaces the hint in the same slot and implies `invalid`. */\n error?: React.ReactNode;\n /** Right-aligned slot of the support row, e.g. `<Input.Counter current={n} max={50} />`. */\n counter?: React.ReactNode;\n /** Always render the support row so an appearing error does not shift the layout. */\n reserveSupportRow?: boolean;\n /** Explicit id for the underlying <input>; auto-generated if omitted. */\n id?: string;\n labels?: Partial<InputLabels>;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction InputRoot({\n size = \"m\",\n invalid: invalidProp = false,\n focusRing = true,\n label,\n required = false,\n optional = false,\n hint,\n error,\n counter,\n reserveSupportRow = false,\n id,\n labels: labelsProp,\n children,\n className,\n}: InputRootProps) {\n const showError = error != null && error !== false && error !== \"\";\n const invalid = invalidProp || showError;\n const showHint = !showError && hint != null && hint !== false;\n const { inputId, hintId, errorId, describedBy } = useFieldIds(id, {\n hasHint: showHint,\n hasError: showError,\n });\n\n const labels = React.useMemo(() => ({ ...INPUT_LABELS, ...labelsProp }), [labelsProp]);\n const showSupport = showHint || showError || counter != null || reserveSupportRow;\n\n const contextValue = React.useMemo(\n () => ({ size, invalid, focusRing, required, inputId, describedBy, labels }),\n [size, invalid, focusRing, required, inputId, describedBy, labels],\n );\n\n return (\n <InputProvider value={contextValue}>\n <ControlSizeProvider value={size}>\n <div\n className={cx(composableStyles.root, className)}\n {...toDataAttributes({ size, invalid: invalid || undefined })}\n >\n {label != null ? (\n <div className={composableStyles.header}>\n <Label.Root\n htmlFor={inputId}\n size={size}\n required={required}\n optional={optional}\n labels={{ optional: labels.optional }}\n className={composableStyles.label}\n >\n {label}\n </Label.Root>\n </div>\n ) : null}\n <div className={composableStyles.body}>\n {children}\n {showSupport && (\n <div className={composableStyles.meta} data-reserve={reserveSupportRow || undefined}>\n {showError ? (\n <Hint.Root id={errorId} size={size} invalid className={composableStyles.metaHint}>\n {error}\n </Hint.Root>\n ) : showHint ? (\n <Hint.Root id={hintId} size={size} className={composableStyles.metaHint}>\n {hint}\n </Hint.Root>\n ) : (\n <span className={composableStyles.metaHint} />\n )}\n {counter != null && <div className={composableStyles.metaCounter}>{counter}</div>}\n </div>\n )}\n </div>\n </div>\n </ControlSizeProvider>\n </InputProvider>\n );\n}\nInputRoot.displayName = \"Input.Root\";\n\n// ---- InputWrapper ----\n\nexport type InputWrapperProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nfunction InputWrapper({ children, className }: InputWrapperProps) {\n const { size, invalid, focusRing } = useInputContext();\n\n return (\n <div\n className={cx(composableStyles.wrapper, className)}\n {...toDataAttributes({\n size,\n invalid: invalid || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n >\n {children}\n </div>\n );\n}\nInputWrapper.displayName = \"Input.Wrapper\";\n\n// ---- InputField ----\n\nexport type InputFieldProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> & {\n /** Called with the new string value; native `onChange` still fires. */\n onValueChange?: (value: string) => void;\n};\n\nconst InputField = React.forwardRef<HTMLInputElement, InputFieldProps>(\n (\n { className, \"aria-describedby\": ariaDescribedBy, required, onChange, onValueChange, ...rest },\n ref,\n ) => {\n const { inputId, invalid, required: requiredCtx, describedBy } = useInputContext();\n\n const resolvedDescribedBy =\n [ariaDescribedBy, describedBy].filter(Boolean).join(\" \") || undefined;\n\n return (\n <input\n ref={ref}\n id={inputId}\n className={cx(composableStyles.field, className)}\n aria-invalid={invalid || undefined}\n aria-describedby={resolvedDescribedBy}\n required={required ?? (requiredCtx || undefined)}\n onChange={(event) => {\n onChange?.(event);\n onValueChange?.(event.target.value);\n }}\n {...rest}\n />\n );\n },\n);\nInputField.displayName = \"Input.Field\";\n\n// ---- InputIcon ----\n\nexport type InputIconProps = {\n side: \"start\" | \"end\";\n children: React.ReactNode;\n className?: string;\n};\n\nfunction InputIcon({ side, children, className }: InputIconProps) {\n return (\n <span className={cx(composableStyles.icon, className)} data-side={side} aria-hidden=\"true\">\n {children}\n </span>\n );\n}\nInputIcon.displayName = \"Input.Icon\";\n\n// ---- InputAffix ----\n\nexport type InputAffixProps = {\n side: \"start\" | \"end\";\n children: React.ReactNode;\n className?: string;\n};\n\nfunction InputAffix({ side, children, className }: InputAffixProps) {\n return (\n <div className={cx(composableStyles.affix, className)} data-side={side} aria-hidden=\"true\">\n {children}\n </div>\n );\n}\nInputAffix.displayName = \"Input.Affix\";\n\n// ---- InputInlineAffix ----\n\nexport type InputInlineAffixProps = {\n side: \"start\" | \"end\";\n children: React.ReactNode;\n className?: string;\n};\n\nfunction InputInlineAffix({ side, children, className }: InputInlineAffixProps) {\n return (\n <span\n className={cx(composableStyles.inlineAffix, className)}\n data-side={side}\n aria-hidden=\"true\"\n >\n {children}\n </span>\n );\n}\nInputInlineAffix.displayName = \"Input.InlineAffix\";\n\n// ---- InputBadge ----\n\nexport type InputBadgeProps = {\n /** Palette hue of the soft badge. Default `gray`. */\n color?: PaletteColor;\n children: React.ReactNode;\n className?: string;\n};\n\n/**\n * Status inside the field: a soft Badge one tier below the field, at the trailing edge before\n * the trailing icon / clear button. The value truncates before it; the field height is unchanged.\n */\nfunction InputBadge({ color = \"gray\", children, className }: InputBadgeProps) {\n return (\n <Badge.Root color={color} variant=\"soft\" className={cx(composableStyles.badge, className)}>\n {children}\n </Badge.Root>\n );\n}\nInputBadge.displayName = \"Input.Badge\";\n\n// ---- InputClearButton ----\n\nexport type InputClearButtonProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"children\" | \"aria-label\"\n>;\n\n/**\n * Trailing clear action. Render it only when the field has a value; clicking returns focus\n * to the input after `onClick` runs (clear the value in `onClick`).\n */\nconst InputClearButton = React.forwardRef<HTMLButtonElement, InputClearButtonProps>(\n ({ className, onClick, ...rest }, ref) => {\n const { inputId, labels } = useInputContext();\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cx(composableStyles.action, className)}\n aria-label={labels.clear}\n aria-controls={inputId}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n document.getElementById(inputId)?.focus();\n }\n }}\n {...rest}\n >\n <Icon name=\"action.close\" />\n </button>\n );\n },\n);\nInputClearButton.displayName = \"Input.ClearButton\";\n\n// ---- InputCounter ----\n\nexport type InputCounterProps = {\n current: number;\n max: number;\n className?: string;\n};\n\n/** Character counter for the support row; turns danger when `current > max`. */\nfunction InputCounter({ current, max, className }: InputCounterProps) {\n const { labels } = useInputContext();\n const spoken = labels.counter.replace(\"{current}\", String(current)).replace(\"{max}\", String(max));\n return (\n <span\n className={cx(composableStyles.counter, className)}\n data-invalid={current > max ? \"true\" : undefined}\n aria-live=\"polite\"\n >\n <span aria-hidden=\"true\">\n {current}/{max}\n </span>\n <span className={composableStyles.srOnly}>{spoken}</span>\n </span>\n );\n}\nInputCounter.displayName = \"Input.Counter\";\n\n// ---- Namespace export ----\n\nexport const Input = {\n Root: InputRoot,\n Wrapper: InputWrapper,\n Field: InputField,\n Icon: InputIcon,\n Affix: InputAffix,\n InlineAffix: InputInlineAffix,\n Badge: InputBadge,\n ClearButton: InputClearButton,\n Counter: InputCounter,\n};\n", "import * as React from \"react\";\n\ntype UseFieldIdsResult = {\n inputId: string;\n hintId: string;\n errorId: string;\n describedBy: string | undefined;\n};\n\n/**\n * Generates stable IDs for form field elements and builds aria-describedby.\n * Shared by Input, Select, Checkbox, Radio, Switch, Textarea.\n */\nexport function useFieldIds(\n explicitId?: string,\n options: { hasHint?: boolean; hasError?: boolean; extraDescribedBy?: string } = {},\n): UseFieldIdsResult {\n const generated = React.useId();\n const inputId = explicitId ?? generated;\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n\n const parts = [\n options.extraDescribedBy,\n options.hasHint ? hintId : undefined,\n options.hasError ? errorId : undefined,\n ].filter(Boolean);\n\n const describedBy = parts.length > 0 ? parts.join(\" \") : undefined;\n\n return { inputId, hintId, errorId, describedBy };\n}\n", "/*\n * Form field system (foundation \u00A74, \u00A76, \u00A77). Select, Datepicker and TagSelect match this file:\n * label \u2192 tier label size, weight 500, primary; gap to field = `label-gap`\n * field \u2192 fill-based, no visible border, tier height/padding/radius/text\n * support row (hint | error \u00B7 counter) \u2192 tier hint size; gap to field = `hint-gap`\n * Tier variables live on `.root[data-size]` and cascade into Wrapper/Field.\n */\n\n/* ---- Root ---- */\n.root {\n --prime-input-height: var(--prime-control-m-height);\n --prime-input-padding-x: var(--prime-control-m-field-padding-x);\n --prime-input-gap: var(--prime-control-m-gap);\n --prime-input-icon: var(--prime-control-m-icon);\n --prime-input-radius: var(--prime-control-m-radius);\n --prime-input-text: var(--prime-control-m-text-size);\n --prime-input-line-height: var(--prime-control-m-line-height);\n --prime-input-label-size: var(--prime-control-m-label-size);\n --prime-input-label-line-height: var(--prime-control-m-label-line-height);\n --prime-input-hint-size: var(--prime-control-m-hint-size);\n --prime-input-hint-line-height: var(--prime-control-m-hint-line-height);\n --prime-input-label-gap: var(--prime-control-m-label-gap);\n --prime-input-hint-gap: var(--prime-control-m-hint-gap);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--prime-input-label-gap);\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --prime-input-height: var(--prime-control-xs-height);\n --prime-input-padding-x: var(--prime-control-xs-field-padding-x);\n --prime-input-gap: var(--prime-control-xs-gap);\n --prime-input-icon: var(--prime-control-xs-icon);\n --prime-input-radius: var(--prime-control-xs-radius);\n --prime-input-text: var(--prime-control-xs-text-size);\n --prime-input-line-height: var(--prime-control-xs-line-height);\n --prime-input-label-size: var(--prime-control-xs-label-size);\n --prime-input-label-line-height: var(--prime-control-xs-label-line-height);\n --prime-input-hint-size: var(--prime-control-xs-hint-size);\n --prime-input-hint-line-height: var(--prime-control-xs-hint-line-height);\n --prime-input-label-gap: var(--prime-control-xs-label-gap);\n --prime-input-hint-gap: var(--prime-control-xs-hint-gap);\n}\n\n.root[data-size=\"s\"] {\n --prime-input-height: var(--prime-control-s-height);\n --prime-input-padding-x: var(--prime-control-s-field-padding-x);\n --prime-input-gap: var(--prime-control-s-gap);\n --prime-input-icon: var(--prime-control-s-icon);\n --prime-input-radius: var(--prime-control-s-radius);\n --prime-input-text: var(--prime-control-s-text-size);\n --prime-input-line-height: var(--prime-control-s-line-height);\n --prime-input-label-size: var(--prime-control-s-label-size);\n --prime-input-label-line-height: var(--prime-control-s-label-line-height);\n --prime-input-hint-size: var(--prime-control-s-hint-size);\n --prime-input-hint-line-height: var(--prime-control-s-hint-line-height);\n --prime-input-label-gap: var(--prime-control-s-label-gap);\n --prime-input-hint-gap: var(--prime-control-s-hint-gap);\n}\n\n.root[data-size=\"l\"] {\n --prime-input-height: var(--prime-control-l-height);\n --prime-input-padding-x: var(--prime-control-l-field-padding-x);\n --prime-input-gap: var(--prime-control-l-gap);\n --prime-input-icon: var(--prime-control-l-icon);\n --prime-input-radius: var(--prime-control-l-radius);\n --prime-input-text: var(--prime-control-l-text-size);\n --prime-input-line-height: var(--prime-control-l-line-height);\n --prime-input-label-size: var(--prime-control-l-label-size);\n --prime-input-label-line-height: var(--prime-control-l-label-line-height);\n --prime-input-hint-size: var(--prime-control-l-hint-size);\n --prime-input-hint-line-height: var(--prime-control-l-hint-line-height);\n --prime-input-label-gap: var(--prime-control-l-label-gap);\n --prime-input-hint-gap: var(--prime-control-l-hint-gap);\n}\n\n.root[data-size=\"xl\"] {\n --prime-input-height: var(--prime-control-xl-height);\n --prime-input-padding-x: var(--prime-control-xl-field-padding-x);\n --prime-input-gap: var(--prime-control-xl-gap);\n --prime-input-icon: var(--prime-control-xl-icon);\n --prime-input-radius: var(--prime-control-xl-radius);\n --prime-input-text: var(--prime-control-xl-text-size);\n --prime-input-line-height: var(--prime-control-xl-line-height);\n --prime-input-label-size: var(--prime-control-xl-label-size);\n --prime-input-label-line-height: var(--prime-control-xl-label-line-height);\n --prime-input-hint-size: var(--prime-control-xl-hint-size);\n --prime-input-hint-line-height: var(--prime-control-xl-hint-line-height);\n --prime-input-label-gap: var(--prime-control-xl-label-gap);\n --prime-input-hint-gap: var(--prime-control-xl-hint-gap);\n}\n\n/* ---- Header: label, then the optional marker right after it (same as Label.Root optional) ---- */\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n column-gap: var(--prime-space-1);\n min-width: 0;\n}\n\n/* ---- Body: field + support row ---- */\n.body {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--prime-input-hint-gap);\n}\n\n/* ---- Wrapper (the visible field) ---- */\n.wrapper {\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--prime-input-gap);\n min-width: 0;\n height: var(--prime-input-height);\n padding-inline: var(--prime-input-padding-x);\n overflow: hidden;\n border-radius: var(--prime-input-radius);\n background: var(--prime-color-field-bg);\n /* Transparent control outline; becomes visible under `prefers-contrast: more`. */\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n cursor: text;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* Sectioned affix sits flush with the edge. */\n.wrapper:has(> .affix[data-side=\"start\"]) {\n padding-inline-start: 0;\n}\n\n.wrapper:has(> .affix[data-side=\"end\"]) {\n padding-inline-end: 0;\n}\n\n.wrapper:hover:not(:has(input:disabled, input:read-only, input:focus-visible)) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.wrapper:has(input:focus-visible) {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.wrapper:not([data-focus-ring=\"false\"]):has(input:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.wrapper[data-invalid=\"true\"] {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.wrapper[data-invalid=\"true\"]:has(input:focus-visible) {\n outline-color: var(--prime-color-danger-border);\n}\n\n.wrapper:has(input:disabled) {\n background: var(--prime-color-field-bg-disabled);\n color: var(--prime-color-text-disabled);\n box-shadow: none;\n cursor: not-allowed;\n}\n\n.wrapper:has(input:read-only:not(:disabled)) {\n cursor: default;\n}\n\n/* ---- Field (input element) ---- */\n.field {\n -webkit-appearance: none;\n appearance: none;\n flex: 1 1 auto;\n align-self: stretch;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n outline: none;\n box-shadow: none;\n font: inherit;\n font-size: var(--prime-input-text);\n line-height: var(--prime-input-line-height);\n text-overflow: ellipsis;\n}\n\n.field:focus,\n.field:focus-visible {\n outline: none;\n}\n\n.field::-webkit-search-decoration,\n.field::-webkit-search-cancel-button,\n.field::-webkit-search-results-button,\n.field::-webkit-search-results-decoration {\n -webkit-appearance: none;\n}\n\n.field::placeholder {\n color: var(--prime-color-text-placeholder);\n opacity: 1;\n}\n\n.field:disabled {\n color: var(--prime-color-text-disabled);\n -webkit-text-fill-color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.field:disabled::placeholder {\n color: var(--prime-color-text-disabled);\n}\n\n.field[type=\"number\"] {\n font-variant-numeric: tabular-nums;\n}\n\n/* A numeric value with a trailing unit is one group (foundation \u00A79): the value hugs the unit. */\n.wrapper:has(> .inlineAffix[data-side=\"end\"])\n.field:is([type=\"number\"], [inputmode=\"decimal\"], [inputmode=\"numeric\"]) {\n text-align: end;\n}\n\n/*\n * ---- Icon ----\n * Centered between the edge and the text (foundation \u00A76): edge\u2192icon = icon\u2192text = field padX.\n * The wrapper gap is the tier gap (value \u2194 unit), so the icon pads its text side up to padX.\n */\n.icon {\n --prime-input-icon-space: calc(var(--prime-input-padding-x) - var(--prime-input-gap));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-sizing: content-box;\n width: var(--prime-input-icon);\n height: var(--prime-input-icon);\n color: var(--prime-color-text-muted);\n pointer-events: none;\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.icon > svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.icon[data-side=\"start\"] {\n order: -1;\n padding-inline-end: var(--prime-input-icon-space);\n}\n\n.icon[data-side=\"end\"] {\n order: 3;\n padding-inline-start: var(--prime-input-icon-space);\n}\n\n.wrapper:has(input:focus-visible) .icon {\n color: var(--prime-color-text-secondary);\n}\n\n.wrapper:has(input:disabled) :is(.icon, .inlineAffix, .affix) {\n color: var(--prime-color-text-disabled);\n}\n\n/* ---- Affix: a tinted section (fill instead of a divider line) ---- */\n.affix {\n display: flex;\n align-items: center;\n align-self: stretch;\n flex-shrink: 0;\n padding-inline: var(--prime-input-padding-x);\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-input-text);\n line-height: var(--prime-input-line-height);\n white-space: nowrap;\n}\n\n.affix[data-side=\"start\"] {\n order: -1;\n}\n\n.affix[data-side=\"end\"] {\n order: 5;\n}\n\n/* ---- InlineAffix: plain muted text next to the value ---- */\n.inlineAffix {\n flex-shrink: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-input-text);\n line-height: var(--prime-input-line-height);\n white-space: nowrap;\n}\n\n.inlineAffix[data-side=\"start\"] {\n order: -1;\n}\n\n.inlineAffix[data-side=\"end\"] {\n order: 1;\n}\n\n/*\n * ---- Badge (Input.Badge) ----\n * Trailing order: value \u00B7 unit \u00B7 badge \u00B7 icon \u00B7 clear \u00B7 affix section. Like an icon it sits padX\n * from the text and padX from the edge (foundation \u00A76); it never shrinks, the value truncates.\n */\n.badge {\n order: 2;\n margin-inline-start: calc(var(--prime-input-padding-x) - var(--prime-input-gap));\n}\n\n/* Gray soft is a wash like the field: a stronger wash keeps a neutral badge visible (\u00A74). */\n.badge[data-color=\"gray\"]:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-strong);\n}\n\n/* ---- Trailing action (clear) ---- */\n.action {\n order: 4;\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n /* Icon-sized hit circle: sits padX from the edge and padX from the text (foundation \u00A76). */\n width: var(--prime-input-icon);\n height: var(--prime-input-icon);\n margin: 0;\n margin-inline-start: calc(var(--prime-input-padding-x) - var(--prime-input-gap));\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-full);\n background: transparent;\n color: var(--prime-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.action > svg {\n display: block;\n width: calc(var(--prime-input-icon) - var(--prime-space-1));\n height: calc(var(--prime-input-icon) - var(--prime-space-1));\n}\n\n.action:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.action:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.action:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: 0;\n}\n\n.action:disabled,\n.wrapper:has(input:disabled) .action {\n color: var(--prime-color-text-disabled);\n background: transparent;\n cursor: not-allowed;\n}\n\n/* ---- Support row: hint | error (same slot) \u00B7 counter (right) ---- */\n.meta {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.meta[data-reserve=\"true\"] {\n min-height: var(--prime-input-hint-line-height);\n}\n\n.metaHint {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.metaCounter {\n flex-shrink: 0;\n}\n\n.counter {\n display: block;\n font-size: var(--prime-input-hint-size);\n line-height: var(--prime-input-hint-line-height);\n font-variant-numeric: tabular-nums;\n color: var(--prime-color-text-muted);\n white-space: nowrap;\n}\n\n.counter[data-invalid=\"true\"] {\n color: var(--prime-color-danger-text);\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n padding: 0;\n margin: calc(-1 * var(--prime-border-width));\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n", "import * as React from \"react\";\nimport { Badge } from \"@/components/badge/Badge\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport { usePosition } from \"@/hooks/usePosition\";\nimport { usePresence } from \"@/hooks/usePresence\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport {\n FieldFrame,\n type FieldFrameProps,\n type FieldIds,\n useFieldFrame,\n} from \"@/internal/FieldFrame\";\nimport { useOverlayPortalLayer } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport { getScrollContainers } from \"@/internal/scrollAncestors\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\n\nimport styles from \"./Select.module.css\";\nimport { CheckIcon, ChevronIcon, ClearIcon, SearchIcon, Spinner } from \"./selectIcons\";\nimport { handleSelectListboxKeyDown, queryEnabledSelectOptions } from \"./selectListbox\";\n\n/** \u0421\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0435 \u043E\u043F\u0446\u0438\u0438 `usePosition` \u2014 \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442 \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u043C \u0440\u0435\u043D\u0434\u0435\u0440\u0435 Select.Content. */\nconst SELECT_LISTBOX_POSITION_OPTS = {\n side: \"bottom\" as const,\n align: \"start\" as const,\n};\n\nexport type SelectLabels = {\n /** Placeholder and accessible name of the search field (`Select.Content searchable`). */\n search: string;\n /** Empty state: no items or nothing matches. */\n empty: string;\n /** Second line of the empty state while searching. */\n emptyHint: string;\n /** Status row while `loading`. */\n loading: string;\n /** Tooltip of the clear button (`clearable`). */\n clear: string;\n /** Muted marker after the label when `optional`. */\n optional: string;\n};\n\nconst SELECT_LABELS: SelectLabels = {\n search: \"\u041F\u043E\u0438\u0441\u043A\",\n empty: \"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E\",\n emptyHint: \"\u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441\",\n loading: \"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026\",\n clear: \"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C\",\n optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\",\n};\n\n/** `id` \u043E\u043F\u0446\u0438\u0438 \u0434\u043B\u044F `aria-activedescendant` (\u0431\u0435\u0437 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u2014 \u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 id). */\nfunction optionDomId(listboxId: string, value: string): string {\n return `${listboxId}-opt-${value.replace(/\\s+/g, \"_\")}`;\n}\n\n/** \u041F\u0430\u0443\u0437\u0430, \u043F\u043E\u0441\u043B\u0435 \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u0431\u0443\u0444\u0435\u0440 typeahead \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u043D\u043E\u0432\u043E. */\nconst TYPEAHEAD_RESET_MS = 500;\n\nfunction normalizeQuery(q: string): string {\n return q.trim().toLocaleLowerCase();\n}\n\n// \u2500\u2500\u2500 Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype SelectedLabelBinding = { value: string; label: string };\n\ntype SelectContextValue = {\n size: ControlSize;\n invalid: boolean;\n focusRing: boolean;\n required: boolean;\n isOpen: boolean;\n /** When `true`, value is `string[]`, list stays open on pick, options toggle, listbox is `aria-multiselectable`. */\n multiple: boolean;\n selectedValue: string | undefined;\n /** Label shown in trigger; only applies while `binding.value === selectedValue` (single mode). */\n selectedLabelBinding: SelectedLabelBinding | undefined;\n /** Multi mode: current selection order. */\n selectedValues: string[];\n /** Multi mode: resolved labels for `Select.Value` join. */\n labelsByValue: Record<string, string>;\n onSelect: (value: string, label: string) => void;\n onClose: () => void;\n onOpen: () => void;\n highlightedValue: string | undefined;\n setHighlightedValue: (v: string | undefined) => void;\n triggerId: string;\n listboxId: string;\n /** Hint / error ids of the field frame. */\n describedBy: string | undefined;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n disabled?: boolean;\n placeholder?: string;\n onInitLabel: (value: string, label: string) => void;\n /** \u0421\u0442\u0440\u043E\u043A\u0430 \u043F\u043E\u0438\u0441\u043A\u0430 `Select.Content searchable`; \u043F\u0443\u0441\u0442\u0430\u044F \u2014 \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u043D\u0435\u0442. */\n query: string;\n setQuery: (q: string) => void;\n loading: boolean;\n clearable: boolean;\n hasValue: boolean;\n clear: () => void;\n labels: SelectLabels;\n};\n\nconst [SelectProvider, useSelectContext] = createComponentContext<SelectContextValue>(\"Select\");\n\n// \u2500\u2500\u2500 SelectRoot \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype SelectRootBase = FieldFrameProps & {\n size?: ControlSize;\n disabled?: boolean;\n placeholder?: string;\n /** Danger ring and `aria-invalid`; a non-empty `error` implies it. */\n invalid?: boolean;\n /** Id of the control (trigger or native `<select>`); generated when omitted. */\n id?: string;\n labels?: Partial<SelectLabels>;\n className?: string;\n children: React.ReactNode;\n};\n\ntype SelectSingleValueProps = {\n multiple?: false;\n value?: string;\n defaultValue?: string;\n /** Picked value; `\"\"` after clearing. */\n onValueChange?: (value: string) => void;\n};\n\ntype SelectMultipleValueProps = {\n multiple: true;\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n};\n\ntype SelectComboboxProps = {\n native?: false;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Clear button in the trigger (and `Delete` / `Backspace` on it) while a value is selected. */\n clearable?: boolean;\n /** Spinner instead of the chevron, `aria-busy`, a status row in the list. */\n loading?: boolean;\n};\n\n/**\n * Native mode: the system `<select>`. It has no `Select.Trigger`, so naming attributes and\n * `name` go on Root.\n */\ntype SelectNativeProps = Pick<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n \"name\" | \"aria-label\" | \"aria-labelledby\" | \"aria-describedby\"\n> & {\n native: true;\n};\n\nexport type SelectRootProps = SelectRootBase &\n (SelectSingleValueProps | SelectMultipleValueProps) &\n (SelectComboboxProps | SelectNativeProps);\n\ntype FieldBinding = {\n size: ControlSize;\n ids: FieldIds;\n focusRing: boolean;\n required: boolean;\n labels: SelectLabels;\n};\n\nfunction SelectRoot(props: SelectRootProps) {\n const {\n size = \"m\",\n label,\n required = false,\n optional,\n hint,\n error,\n invalid,\n focusRing = true,\n disabled,\n id,\n labels: labelsProp,\n className,\n } = props;\n const labels = React.useMemo(() => ({ ...SELECT_LABELS, ...labelsProp }), [labelsProp]);\n const ids = useFieldFrame(\n id,\n { hint, error, invalid },\n props.native === true ? props[\"aria-describedby\"] : undefined,\n );\n const field: FieldBinding = { size, ids, focusRing, required, labels };\n\n let control: React.ReactNode;\n if (props.native === true) {\n control =\n props.multiple === true ? (\n <SelectNativeMultiRoot {...props} field={field} />\n ) : (\n <SelectNativeRoot {...props} field={field} />\n );\n } else {\n control =\n props.multiple === true ? (\n <SelectComboboxMultiRoot {...props} field={field} />\n ) : (\n <SelectComboboxRoot {...props} field={field} />\n );\n }\n\n return (\n <FieldFrame\n size={size}\n ids={ids}\n label={label}\n required={required}\n optional={optional}\n hint={hint}\n error={error}\n disabled={disabled}\n optionalLabel={labels.optional}\n className={className}\n >\n {control}\n </FieldFrame>\n );\n}\nSelectRoot.displayName = \"Select.Root\";\n\n/** \u041E\u0431\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F / \u043F\u043E\u0438\u0441\u043A\u0430 / \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u043E\u0431\u043E\u0438\u0445 combobox-\u0440\u0435\u0436\u0438\u043C\u043E\u0432. */\nfunction useComboboxShell(\n { open, defaultOpen, onOpenChange }: SelectComboboxProps,\n controlId: string,\n) {\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n const [highlightedValue, setHighlightedValue] = React.useState<string | undefined>(undefined);\n const [query, setQuery] = React.useState(\"\");\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n\n /* \u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435 (\u0432 \u0442\u043E\u043C \u0447\u0438\u0441\u043B\u0435 \u0441\u043D\u0430\u0440\u0443\u0436\u0438, \u0447\u0435\u0440\u0435\u0437 `open`) \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430. */\n React.useEffect(() => {\n if (!isOpen) setQuery(\"\");\n }, [isOpen]);\n\n const onClose = React.useCallback(() => setIsOpen(false), [setIsOpen]);\n const onOpen = React.useCallback(() => setIsOpen(true), [setIsOpen]);\n\n return {\n isOpen,\n setIsOpen,\n highlightedValue,\n setHighlightedValue,\n query,\n setQuery,\n triggerId: controlId,\n listboxId: `${controlId}-listbox`,\n triggerRef,\n onClose,\n onOpen,\n };\n}\n\ntype ComboboxRootInternalProps<V> = SelectRootBase &\n SelectComboboxProps & {\n value?: V;\n defaultValue?: V;\n onValueChange?: (value: V) => void;\n field: FieldBinding;\n };\n\nfunction SelectComboboxRoot({\n value,\n defaultValue,\n onValueChange,\n disabled,\n placeholder,\n clearable = false,\n loading = false,\n open,\n defaultOpen,\n onOpenChange,\n field,\n children,\n}: ComboboxRootInternalProps<string>) {\n const { size, ids, focusRing, required, labels } = field;\n const handleChange = React.useCallback(\n (v: string | undefined) => {\n if (v !== undefined) onValueChange?.(v);\n },\n [onValueChange],\n );\n\n const [selectedValue, setSelectedValue] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: handleChange,\n });\n\n const [selectedLabelBinding, setSelectedLabelBinding] = React.useState<\n SelectedLabelBinding | undefined\n >(undefined);\n const shell = useComboboxShell({ open, defaultOpen, onOpenChange }, ids.controlId);\n const { setIsOpen } = shell;\n\n // Sync ref so onInitLabel doesn't go stale\n const selectedValueRef = React.useRef(selectedValue);\n selectedValueRef.current = selectedValue;\n\n const onInitLabel = React.useCallback((val: string, label: string) => {\n if (val === selectedValueRef.current) {\n setSelectedLabelBinding({ value: val, label });\n }\n }, []);\n\n const onSelect = React.useCallback(\n (val: string, label: string) => {\n setSelectedValue(val);\n setSelectedLabelBinding({ value: val, label });\n setIsOpen(false);\n },\n [setSelectedValue, setIsOpen],\n );\n\n const hasValue = selectedValue !== undefined && selectedValue !== \"\";\n const clear = React.useCallback(() => {\n setSelectedValue(\"\");\n setSelectedLabelBinding(undefined);\n }, [setSelectedValue]);\n\n const contextValue = React.useMemo<SelectContextValue>(\n () => ({\n size,\n invalid: ids.invalid,\n focusRing,\n required,\n isOpen: shell.isOpen,\n multiple: false,\n selectedValue,\n selectedLabelBinding,\n selectedValues: [],\n labelsByValue: {},\n onSelect,\n onClose: shell.onClose,\n onOpen: shell.onOpen,\n highlightedValue: shell.highlightedValue,\n setHighlightedValue: shell.setHighlightedValue,\n triggerId: shell.triggerId,\n listboxId: shell.listboxId,\n describedBy: ids.describedBy,\n triggerRef: shell.triggerRef,\n disabled,\n placeholder,\n onInitLabel,\n query: shell.query,\n setQuery: shell.setQuery,\n loading,\n clearable,\n hasValue,\n clear,\n labels,\n }),\n [\n size,\n ids.invalid,\n focusRing,\n ids.describedBy,\n required,\n shell.isOpen,\n selectedValue,\n selectedLabelBinding,\n onSelect,\n shell.onClose,\n shell.onOpen,\n shell.highlightedValue,\n shell.setHighlightedValue,\n shell.triggerId,\n shell.listboxId,\n shell.triggerRef,\n disabled,\n placeholder,\n onInitLabel,\n shell.query,\n shell.setQuery,\n loading,\n clearable,\n hasValue,\n clear,\n labels,\n ],\n );\n\n return (\n <SelectProvider value={contextValue}>\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </SelectProvider>\n );\n}\n\nfunction SelectComboboxMultiRoot({\n value,\n defaultValue,\n onValueChange,\n disabled,\n placeholder,\n clearable = false,\n loading = false,\n open,\n defaultOpen,\n onOpenChange,\n field,\n children,\n}: ComboboxRootInternalProps<string[]>) {\n const { size, ids, focusRing, required, labels } = field;\n const [selectedValues, setSelectedValues] = useControllableState<string[]>({\n value,\n defaultValue: defaultValue ?? [],\n onChange: onValueChange,\n });\n\n const [labelsByValue, setLabelsByValue] = React.useState<Record<string, string>>({});\n const shell = useComboboxShell({ open, defaultOpen, onOpenChange }, ids.controlId);\n\n const onInitLabel = React.useCallback((val: string, label: string) => {\n setLabelsByValue((prev) => {\n if (prev[val] === label) return prev;\n return { ...prev, [val]: label };\n });\n }, []);\n\n const onSelect = React.useCallback(\n (val: string, label: string) => {\n setLabelsByValue((prev) => ({ ...prev, [val]: label }));\n setSelectedValues((prev) => {\n if (prev.includes(val)) {\n return prev.filter((x) => x !== val);\n }\n return [...prev, val];\n });\n },\n [setSelectedValues],\n );\n\n const hasValue = selectedValues.length > 0;\n const clear = React.useCallback(() => {\n setSelectedValues([]);\n }, [setSelectedValues]);\n\n const contextValue = React.useMemo<SelectContextValue>(\n () => ({\n size,\n invalid: ids.invalid,\n focusRing,\n required,\n isOpen: shell.isOpen,\n multiple: true,\n selectedValue: undefined,\n selectedLabelBinding: undefined,\n selectedValues,\n labelsByValue,\n onSelect,\n onClose: shell.onClose,\n onOpen: shell.onOpen,\n highlightedValue: shell.highlightedValue,\n setHighlightedValue: shell.setHighlightedValue,\n triggerId: shell.triggerId,\n listboxId: shell.listboxId,\n describedBy: ids.describedBy,\n triggerRef: shell.triggerRef,\n disabled,\n placeholder,\n onInitLabel,\n query: shell.query,\n setQuery: shell.setQuery,\n loading,\n clearable,\n hasValue,\n clear,\n labels,\n }),\n [\n size,\n ids.invalid,\n focusRing,\n ids.describedBy,\n required,\n shell.isOpen,\n selectedValues,\n labelsByValue,\n onSelect,\n shell.onClose,\n shell.onOpen,\n shell.highlightedValue,\n shell.setHighlightedValue,\n shell.triggerId,\n shell.listboxId,\n shell.triggerRef,\n disabled,\n placeholder,\n onInitLabel,\n shell.query,\n shell.setQuery,\n loading,\n clearable,\n hasValue,\n clear,\n labels,\n ],\n );\n\n return (\n <SelectProvider value={contextValue}>\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </SelectProvider>\n );\n}\n\n// \u2500\u2500\u2500 SelectTrigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectTriggerProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"id\" | \"type\" | \"role\"\n>;\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n (\n { className, children, onClick, onKeyDown, \"aria-describedby\": ariaDescribedBy, ...rest },\n forwardedRef,\n ) => {\n const {\n isOpen,\n onOpen,\n onClose,\n triggerId,\n listboxId,\n disabled,\n size,\n invalid,\n focusRing,\n required,\n describedBy,\n triggerRef,\n loading,\n clearable,\n hasValue,\n clear,\n labels,\n } = useSelectContext();\n\n const setRefs = React.useCallback(\n (el: HTMLButtonElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(el);\n } else if (forwardedRef) {\n (forwardedRef as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n }\n },\n [forwardedRef, triggerRef],\n );\n\n const showClear = clearable && hasValue && !disabled && !loading;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (!disabled) {\n if (isOpen) onClose();\n else onOpen();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e);\n if ([\"ArrowDown\", \"ArrowUp\", \" \", \"Enter\"].includes(e.key)) {\n e.preventDefault();\n if (!isOpen) onOpen();\n return;\n }\n if (showClear && (e.key === \"Delete\" || e.key === \"Backspace\")) {\n e.preventDefault();\n clear();\n }\n };\n\n return (\n <button\n ref={setRefs}\n id={triggerId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-describedby={[ariaDescribedBy, describedBy].filter(Boolean).join(\" \") || undefined}\n aria-busy={loading || undefined}\n disabled={disabled}\n className={cx(styles.trigger, className)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...toDataAttributes({\n state: isOpen ? \"open\" : \"closed\",\n size,\n invalid: invalid || undefined,\n loading: loading || undefined,\n disabled: disabled || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n {...rest}\n >\n <span className={styles.triggerMain}>{children}</span>\n {showClear ? (\n // \u041D\u0435 \u043A\u043D\u043E\u043F\u043A\u0430: \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0432 <button> \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B.\n // \u041A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u2014 Delete / Backspace \u043D\u0430 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0435.\n <span\n className={styles.triggerClear}\n aria-hidden\n title={labels.clear}\n data-select-clear=\"\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation();\n clear();\n }}\n >\n <ClearIcon />\n </span>\n ) : null}\n <span className={styles.triggerChevronSlot} aria-hidden>\n {loading ? <Spinner className={styles.spinner} /> : <ChevronIcon />}\n </span>\n </button>\n );\n },\n);\nSelectTrigger.displayName = \"Select.Trigger\";\n\n// \u2500\u2500\u2500 SelectValue \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** What `Select.Value` passes to its render function: the selected option. */\nexport type SelectValueItem = { value: string; label: string };\n\nexport type SelectValueProps = {\n className?: string;\n /**\n * Single mode: renders the selected option in the trigger, e.g. with the same\n * `Select.ItemMedia` / `Select.ItemText` / `Select.ItemDescription` parts as the row.\n * Not called while empty (the placeholder shows) and ignored in `multiple` mode.\n */\n children?: (item: SelectValueItem) => React.ReactNode;\n};\n\nfunction SelectValue({ className, children }: SelectValueProps) {\n const ctx = useSelectContext();\n if (ctx.multiple) {\n const { selectedValues, labelsByValue, placeholder } = ctx;\n const display =\n selectedValues.length === 0\n ? placeholder\n : selectedValues.map((v) => labelsByValue[v] ?? v).join(\", \");\n return (\n <span\n className={cx(styles.triggerValue, className)}\n {...toDataAttributes({ placeholder: display == null || display === \"\" })}\n >\n {display}\n </span>\n );\n }\n const { selectedLabelBinding, selectedValue, placeholder } = ctx;\n const empty = selectedValue === undefined || selectedValue === \"\";\n /* \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u0438\u0437 items \u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E value; \u0438\u043D\u0430\u0447\u0435 \u2014 raw value \u0438\u043B\u0438 placeholder \u0434\u043E onInitLabel */\n const label =\n selectedLabelBinding && selectedLabelBinding.value === selectedValue\n ? selectedLabelBinding.label\n : selectedValue;\n if (children && !empty) {\n const parts = partitionRichChildren(children({ value: selectedValue, label: label ?? \"\" }));\n return (\n <span\n className={cx(styles.triggerValue, className)}\n {...toDataAttributes({ rich: parts.rich || undefined })}\n >\n {parts.media}\n <span className={styles.valueBody}>{parts.body}</span>\n </span>\n );\n }\n const display = empty ? placeholder : label;\n return (\n <span\n className={cx(styles.triggerValue, className)}\n {...toDataAttributes({ placeholder: display == null || display === \"\" })}\n >\n {display}\n </span>\n );\n}\nSelectValue.displayName = \"SelectValue\";\n\n// \u2500\u2500\u2500 SelectTriggerIcon \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectTriggerIconProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction SelectTriggerIcon({ className, children, ...rest }: SelectTriggerIconProps) {\n return (\n <span className={cx(styles.triggerIcon, className)} {...rest}>\n {children}\n </span>\n );\n}\nSelectTriggerIcon.displayName = \"SelectTriggerIcon\";\n\n// \u2500\u2500\u2500 SelectBadge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectBadgeProps = {\n /** Palette hue of the soft badge. Default `gray`. */\n color?: PaletteColor;\n children: React.ReactNode;\n className?: string;\n};\n\n/**\n * Status inside the trigger: a soft Badge one tier below the field, at the trailing edge before\n * the clear button and the chevron. The value truncates before it; the trigger height is unchanged.\n */\nfunction SelectBadge({ color = \"gray\", children, className }: SelectBadgeProps) {\n return (\n <Badge.Root color={color} variant=\"soft\" className={cx(styles.badge, className)}>\n {children}\n </Badge.Root>\n );\n}\nSelectBadge.displayName = \"Select.Badge\";\n\n// \u2500\u2500\u2500 Rich option parts (row and trigger) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectItemMediaProps = {\n /** Palette hue of the tile (soft fill + hue text for an icon). Without it \u2014 a neutral fill. */\n color?: PaletteColor;\n /** An icon or an `<img>` (covers the tile). */\n children: React.ReactNode;\n className?: string;\n};\n\n/** Leading thumbnail tile of a rich option; the option grows to two lines. */\nfunction SelectItemMedia({ color, children, className }: SelectItemMediaProps) {\n return (\n <span\n className={cx(styles.itemMedia, className)}\n aria-hidden=\"true\"\n {...toDataAttributes({ color })}\n >\n {children}\n </span>\n );\n}\nSelectItemMedia.displayName = \"Select.ItemMedia\";\n\nexport type SelectItemTextProps = {\n children: React.ReactNode;\n className?: string;\n};\n\n/** Title of a rich option; its text is the option label (trigger, typeahead, search). */\nfunction SelectItemText({ children, className }: SelectItemTextProps) {\n return <span className={cx(styles.itemTitle, className)}>{children}</span>;\n}\nSelectItemText.displayName = \"Select.ItemText\";\n\nexport type SelectItemDescriptionProps = {\n children: React.ReactNode;\n className?: string;\n};\n\n/** Muted second line under `Select.ItemText`; searchable. */\nfunction SelectItemDescription({ children, className }: SelectItemDescriptionProps) {\n return <span className={cx(styles.itemDescription, className)}>{children}</span>;\n}\nSelectItemDescription.displayName = \"Select.ItemDescription\";\n\nexport type SelectItemMetaProps = {\n children: React.ReactNode;\n className?: string;\n};\n\n/** Trailing meta of an option (price, count): muted, tabular, right-aligned, before the check. */\nfunction SelectItemMeta({ children, className }: SelectItemMetaProps) {\n return <span className={cx(styles.itemMeta, className)}>{children}</span>;\n}\nSelectItemMeta.displayName = \"Select.ItemMeta\";\n\ntype RichParts = {\n media: React.ReactNode[];\n body: React.ReactNode[];\n meta: React.ReactNode[];\n /** Two-line layout: a description or a media tile is present. */\n rich: boolean;\n title: React.ReactNode | undefined;\n description: React.ReactNode | undefined;\n};\n\n/** Splits rich parts out of children (fragments are flattened; parts must be direct children). */\nfunction partitionRichChildren(children: React.ReactNode): RichParts {\n const parts: RichParts = {\n media: [],\n body: [],\n meta: [],\n rich: false,\n title: undefined,\n description: undefined,\n };\n let index = 0;\n const visit = (node: React.ReactNode) => {\n React.Children.forEach(node, (raw) => {\n if (raw == null || raw === false) return;\n /* \u0421\u0432\u043E\u0438 \u043A\u043B\u044E\u0447\u0438: \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043C\u0430\u0441\u0441\u0438\u0432\u0430\u043C\u0438 \u0432 \u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u043B\u043E\u0442\u0430\u0445. */\n const child = React.isValidElement(raw)\n ? React.cloneElement(raw, { key: raw.key ?? `prime-select-part-${index++}` })\n : raw;\n if (React.isValidElement(child)) {\n const props = child.props as { children?: React.ReactNode };\n if (child.type === React.Fragment) {\n visit(props.children);\n return;\n }\n if (child.type === SelectItemMedia) {\n parts.media.push(child);\n parts.rich = true;\n return;\n }\n if (child.type === SelectItemMeta) {\n parts.meta.push(child);\n return;\n }\n if (child.type === SelectItemText) parts.title = props.children;\n if (child.type === SelectItemDescription) {\n parts.description = props.children;\n parts.rich = true;\n }\n }\n parts.body.push(child);\n });\n };\n visit(children);\n return parts;\n}\n\n// \u2500\u2500\u2500 SelectContent \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectContentProps = {\n className?: string;\n /** \u041F\u043E\u043B\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432\u0432\u0435\u0440\u0445\u0443 \u043F\u0430\u043D\u0435\u043B\u0438; \u043F\u0443\u043D\u043A\u0442\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0443\u044E\u0442\u0441\u044F \u043F\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u0438 `keywords`. */\n searchable?: boolean;\n children: React.ReactNode;\n};\n\nfunction SelectContent({ className, searchable = false, children }: SelectContentProps) {\n const {\n isOpen,\n onClose,\n onSelect,\n triggerId,\n listboxId,\n triggerRef,\n highlightedValue,\n setHighlightedValue,\n selectedValue,\n selectedValues,\n multiple,\n size,\n query,\n setQuery,\n loading,\n labels,\n } = useSelectContext();\n\n const selectedValueRef = React.useRef(selectedValue);\n selectedValueRef.current = selectedValue;\n const selectedValuesRef = React.useRef(selectedValues);\n selectedValuesRef.current = selectedValues;\n const multipleRef = React.useRef(multiple);\n multipleRef.current = multiple;\n\n const overlayPortalLayer = useOverlayPortalLayer();\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const listboxRef = React.useRef<HTMLElement | null>(null);\n const searchRef = React.useRef<HTMLInputElement | null>(null);\n const { resolvedSide, update } = usePosition(\n triggerRef,\n contentRef,\n SELECT_LISTBOX_POSITION_OPTS,\n );\n\n /** `update` \u0438\u0437 `usePosition` \u043C\u0435\u043D\u044F\u0435\u0442 identity \u043F\u0440\u0438 \u0441\u043C\u0435\u043D\u0435 deps \u2014 \u043D\u0435 \u043F\u043E\u0434\u043F\u0438\u0441\u044B\u0432\u0430\u0442\u044C \u043D\u0430 \u043D\u0435\u0433\u043E \u044D\u0444\u0444\u0435\u043A\u0442\u044B \u043F\u043E\u0437\u0438\u0446\u0438\u0438 (\u0440\u0438\u0441\u043A \u0446\u0438\u043A\u043B\u0430 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u043C \u0441\u043F\u0438\u0441\u043A\u0435). */\n const updateRef = React.useRef(update);\n updateRef.current = update;\n\n const getItems = React.useCallback(() => queryEnabledSelectOptions(listboxRef.current), []);\n\n /* \u041F\u0443\u0441\u0442\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435: \u043F\u043E\u0441\u043B\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u043C \u0432\u0438\u0434\u0438\u043C\u044B\u0435 \u043E\u043F\u0446\u0438\u0438 (\u043F\u0443\u043D\u043A\u0442\u044B \u0441\u0430\u043C\u0438 \u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u043F\u043E\u0438\u0441\u043A\u0443). */\n const [isEmpty, setIsEmpty] = React.useState(false);\n React.useLayoutEffect(() => {\n const count = listboxRef.current?.querySelectorAll('[role=\"option\"]').length ?? 0;\n setIsEmpty((prev) => (prev === (count === 0) ? prev : count === 0));\n });\n\n /* \u041F\u043E\u0437\u0438\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u0441\u043F\u0438\u0441\u043E\u043A \u043E\u0442\u043A\u0440\u044B\u0442 */\n React.useLayoutEffect(() => {\n if (!isOpen) return;\n updateRef.current();\n const rafId = requestAnimationFrame(() => updateRef.current());\n return () => cancelAnimationFrame(rafId);\n }, [isOpen]);\n\n /* \u041F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E `isOpen`, \u0447\u0442\u043E\u0431\u044B \u0442\u0443\u043C\u0431\u043B\u0435\u0440 \u043C\u0443\u043B\u044C\u0442\u0438\u0432\u044B\u0431\u043E\u0440\u0430 \u043D\u0435 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u043B highlight */\n React.useEffect(() => {\n if (!isOpen) {\n setHighlightedValue(undefined);\n return;\n }\n\n const rafId = requestAnimationFrame(() => {\n const focusTarget = searchRef.current ?? listboxRef.current;\n if (!focusTarget) return;\n focusTarget.focus({ preventScroll: true });\n const items = queryEnabledSelectOptions(listboxRef.current);\n if (multipleRef.current) {\n const sv = selectedValuesRef.current;\n const firstSelected = sv.find((v) => items.some((i) => i.dataset.value === v));\n setHighlightedValue(firstSelected ?? undefined);\n } else {\n const sv = selectedValueRef.current;\n const selected = items.find((i) => i.dataset.value === sv);\n if (selected && sv) {\n setHighlightedValue(sv);\n selected.scrollIntoView?.({ block: \"nearest\" });\n }\n }\n });\n return () => cancelAnimationFrame(rafId);\n }, [isOpen, setHighlightedValue]);\n\n /* \u041F\u043E\u0438\u0441\u043A: \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 \u0443\u0445\u043E\u0434\u0438\u0442 \u043D\u0430 \u043F\u0435\u0440\u0432\u044B\u0439 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0439 \u043F\u0443\u043D\u043A\u0442. */\n React.useEffect(() => {\n if (!isOpen || query === \"\") return;\n const first = queryEnabledSelectOptions(listboxRef.current)[0];\n setHighlightedValue(first?.dataset.value);\n }, [isOpen, query, setHighlightedValue]);\n\n /* \u041A\u0430\u043A \u0443 Dropdown/Popover: \u043F\u0435\u0440\u0435\u0441\u0447\u0451\u0442 fixed \u043F\u0440\u0438 scroll \u043F\u0440\u0435\u0434\u043A\u043E\u0432 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430, resize, \u0441\u043C\u0435\u043D\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043F\u0430\u043D\u0435\u043B\u0438. */\n React.useEffect(() => {\n if (!isOpen) return;\n\n let rafCoalesce = 0;\n const schedule = () => {\n cancelAnimationFrame(rafCoalesce);\n rafCoalesce = requestAnimationFrame(() => updateRef.current());\n };\n\n window.addEventListener(\"resize\", schedule);\n const scrollTargets = getScrollContainers(triggerRef.current);\n for (const t of scrollTargets) {\n t.addEventListener(\"scroll\", schedule, { passive: true });\n }\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n\n const panel = contentRef.current;\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && panel) {\n ro = new ResizeObserver(schedule);\n ro.observe(panel);\n }\n\n return () => {\n cancelAnimationFrame(rafCoalesce);\n window.removeEventListener(\"resize\", schedule);\n for (const t of scrollTargets) {\n t.removeEventListener(\"scroll\", schedule);\n }\n vv?.removeEventListener(\"resize\", schedule);\n ro?.disconnect();\n };\n }, [isOpen, triggerRef]);\n\n const closeAndReturnFocus = React.useCallback(() => {\n onClose();\n triggerRef.current?.focus({ preventScroll: true });\n }, [onClose, triggerRef]);\n\n useEscapeKey({ enabled: isOpen, onEscape: closeAndReturnFocus });\n useOutsideClick({\n refs: [triggerRef, contentRef],\n enabled: isOpen,\n /* Focus follows the pointer (foundation \u00A78): no return to the trigger. */\n onOutsideClick: onClose,\n });\n // The listbox stays in the DOM (labels for the trigger); presence only drives display + motion.\n const presence = usePresence(isOpen, { exitDuration: \"fast\" });\n\n /* Typeahead \u043F\u043E \u043F\u043E\u0434\u043F\u0438\u0441\u0438 (\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0443): \u0431\u0443\u0444\u0435\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u043F\u0430\u0443\u0437\u044B. */\n const typeahead = React.useRef({ buffer: \"\", timer: 0 });\n React.useEffect(() => () => window.clearTimeout(typeahead.current.timer), []);\n\n const handleTypeahead = React.useCallback(\n (key: string) => {\n const state = typeahead.current;\n window.clearTimeout(state.timer);\n state.buffer += key.toLocaleLowerCase();\n state.timer = window.setTimeout(() => {\n state.buffer = \"\";\n }, TYPEAHEAD_RESET_MS);\n const items = getItems();\n const start = items.findIndex((i) => i.dataset.value === highlightedValue);\n /* \u041E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u0441\u0438\u043C\u0432\u043E\u043B \u043F\u043E\u0434\u0440\u044F\u0434 \u2014 \u043F\u043E \u043A\u0440\u0443\u0433\u0443 \u043F\u043E \u043F\u0443\u043D\u043A\u0442\u0430\u043C \u043D\u0430 \u044D\u0442\u0443 \u0431\u0443\u043A\u0432\u0443; \u0438\u043D\u0430\u0447\u0435 \u2014 \u043F\u043E \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0443. */\n const repeated = [...state.buffer].every((c) => c === state.buffer[0]);\n const query = repeated ? key.toLocaleLowerCase() : state.buffer;\n const from = repeated ? start + 1 : Math.max(start, 0);\n const pool = [...items.slice(from), ...items.slice(0, from)];\n const match = pool.find((i) => (i.dataset.label ?? \"\").toLocaleLowerCase().startsWith(query));\n if (match) {\n setHighlightedValue(match.dataset.value);\n match.scrollIntoView?.({ block: \"nearest\" });\n }\n },\n [getItems, highlightedValue, setHighlightedValue],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n /* \u0412 \u043F\u043E\u043B\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B, Home \u0438 End \u2014 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430, \u0430 \u043D\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F. */\n if (e.target instanceof HTMLInputElement && [\" \", \"Home\", \"End\"].includes(e.key)) return;\n const printable = e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey;\n if (\n printable &&\n !(e.target instanceof HTMLInputElement) &&\n (e.key !== \" \" || typeahead.current.buffer !== \"\")\n ) {\n e.preventDefault();\n handleTypeahead(e.key);\n return;\n }\n if (e.key === \"Tab\") {\n onClose();\n return;\n }\n handleSelectListboxKeyDown(e, {\n items: getItems(),\n highlightedValue,\n setHighlightedValue,\n onSelect: (value, label) => {\n onSelect(value, label);\n if (!multiple) triggerRef.current?.focus({ preventScroll: true });\n },\n onClose: closeAndReturnFocus,\n });\n },\n [\n getItems,\n highlightedValue,\n setHighlightedValue,\n onSelect,\n onClose,\n closeAndReturnFocus,\n multiple,\n triggerRef,\n handleTypeahead,\n ],\n );\n\n const activeDescendant =\n isOpen && highlightedValue !== undefined ? optionDomId(listboxId, highlightedValue) : undefined;\n const showEmpty = isEmpty && !loading;\n\n return (\n <Portal>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0442 \u043E\u0442 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438 listbox */}\n <div\n ref={contentRef}\n aria-hidden={!isOpen}\n data-react-aria-top-layer=\"true\"\n data-overlay-portal-layer={overlayPortalLayer}\n className={cx(styles.content, overlayMotion.floating, className)}\n onKeyDown={handleKeyDown}\n onAnimationEnd={presence.onExitEnd}\n style={{ display: presence.mounted ? undefined : \"none\" }}\n {...toDataAttributes({\n side: resolvedSide,\n size,\n searching: query !== \"\",\n state: presence.state,\n })}\n >\n {searchable ? (\n // The search field is the permanent focus of the panel: no ring (foundation \u00A77).\n <div className={styles.search} data-focus-ring=\"false\">\n <SearchIcon className={styles.searchIcon} />\n <input\n ref={searchRef}\n type=\"text\"\n className={styles.searchInput}\n value={query}\n placeholder={labels.search}\n aria-label={labels.search}\n aria-controls={listboxId}\n aria-activedescendant={activeDescendant}\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => setQuery(e.target.value)}\n />\n </div>\n ) : null}\n {loading ? (\n <div className={styles.status} role=\"status\">\n <Spinner className={styles.spinner} />\n <span>{labels.loading}</span>\n </div>\n ) : null}\n <ScrollContainer\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable={multiple ? true : undefined}\n aria-labelledby={triggerId}\n aria-activedescendant={searchable ? undefined : activeDescendant}\n aria-busy={loading || undefined}\n tabIndex={-1}\n className={styles.listbox}\n >\n {children}\n </ScrollContainer>\n {showEmpty ? (\n <div className={styles.empty} role=\"status\">\n <span className={styles.emptyText}>{labels.empty}</span>\n {query !== \"\" && labels.emptyHint ? (\n <span className={styles.emptyHint}>{labels.emptyHint}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n </Portal>\n );\n}\nSelectContent.displayName = \"SelectContent\";\n\n// \u2500\u2500\u2500 SelectItemIcon (\u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D \u0434\u043E SelectItem \u2014 partition \u043F\u043E \u0442\u0438\u043F\u0443 + \u043C\u0430\u0440\u043A\u0435\u0440\u0443) \u2500\u2500\u2500\u2500\n\nexport type SelectItemIconProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction SelectItemIcon({ className, children, ...rest }: SelectItemIconProps) {\n return (\n <span className={cx(styles.itemIcon, className)} {...rest}>\n {children}\n </span>\n );\n}\nSelectItemIcon.displayName = \"SelectItemIcon\";\n/** \u041D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E `child.type === SelectItemIcon`: \u043F\u0440\u0438 \u0434\u0432\u0443\u0445 \u043A\u043E\u043F\u0438\u044F\u0445 \u043C\u043E\u0434\u0443\u043B\u044F \u0432 \u0431\u0430\u043D\u0434\u043B\u0435 \u0441\u0441\u044B\u043B\u043A\u0438 \u0440\u0430\u0437\u043D\u044B\u0435 \u2014 \u0438\u043A\u043E\u043D\u043A\u0430 \u043F\u043E\u043F\u0430\u0434\u0430\u043B\u0430 \u0432 `itemText` \u0438 \u0441\u0445\u043B\u043E\u043F\u044B\u0432\u0430\u043B\u0441\u044F `gap`. */\nconst SELECT_ITEM_ICON_MARKER = \"__primeSelectItemIcon\" as const;\nObject.assign(SelectItemIcon, { [SELECT_ITEM_ICON_MARKER]: true });\n\nfunction isSelectItemIconType(type: unknown): boolean {\n if (type === SelectItemIcon) return true;\n if (typeof type === \"function\") {\n const fn = type as unknown as Record<string, unknown>;\n if (fn[SELECT_ITEM_ICON_MARKER] === true) return true;\n if (fn.displayName === \"SelectItemIcon\") return true;\n }\n return false;\n}\n\nfunction selectItemTextFromRest(rest: React.ReactNode[]): string | undefined {\n const parts: string[] = [];\n for (const node of rest) {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const s = String(node).trim();\n if (s.length > 0) parts.push(s);\n }\n }\n return parts.length > 0 ? parts.join(\" \") : undefined;\n}\n\n/** Option label: explicit `label`, then `Select.ItemText`, then plain text children, then `value`. */\nfunction resolveItemLabel(\n label: string | undefined,\n children: React.ReactNode,\n value: string,\n): string {\n if (label) return label;\n const { title } = partitionRichChildren(children);\n const titleText = title === undefined ? \"\" : extractPlainTextFromNode(title).trim();\n if (titleText) return titleText;\n const { rest } = partitionSelectItemChildren(children);\n return selectItemTextFromRest(rest) ?? (typeof children === \"string\" ? children : value);\n}\n\nfunction partitionSelectItemChildren(children: React.ReactNode) {\n const icons: React.ReactElement[] = [];\n const rest: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && isSelectItemIconType(child.type)) {\n icons.push(child);\n } else if (child != null && child !== false) {\n rest.push(child);\n }\n });\n\n return { icons, rest };\n}\n\n// \u2500\u2500\u2500 SelectItem \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectItemProps = {\n value: string;\n /** Explicit label for display in trigger; falls back to string children, then value */\n label?: string;\n /** \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 (`Select.Content searchable`). */\n keywords?: string;\n disabled?: boolean;\n className?: string;\n children: React.ReactNode;\n};\n\nconst SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(\n ({ value, label, keywords, disabled, className, children }, ref) => {\n const {\n multiple,\n size,\n selectedValue,\n selectedValues,\n highlightedValue,\n setHighlightedValue,\n onSelect,\n onInitLabel,\n listboxId,\n query,\n } = useSelectContext();\n\n const { icons, rest } = partitionSelectItemChildren(children);\n const parts = partitionRichChildren(rest);\n\n const isSelected = multiple ? selectedValues.includes(value) : selectedValue === value;\n const isHighlighted = highlightedValue === value;\n const resolvedLabel = resolveItemLabel(label, children, value);\n const descriptionText =\n parts.description === undefined ? \"\" : extractPlainTextFromNode(parts.description);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u0438 \u0432\u043D\u0435\u0448\u043D\u0435\u043C `selectedValue` (single); \u0432 multi \u0432 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 `undefined`\n React.useEffect(() => {\n onInitLabel(value, resolvedLabel);\n }, [value, resolvedLabel, onInitLabel, selectedValue]);\n\n const q = normalizeQuery(query);\n if (\n q !== \"\" &&\n !normalizeQuery(`${resolvedLabel} ${descriptionText} ${keywords ?? \"\"}`).includes(q)\n ) {\n return null;\n }\n\n const handleClick = () => {\n if (!disabled) onSelect(value, resolvedLabel);\n };\n\n const handleMouseMove = () => {\n if (!disabled && !isHighlighted) setHighlightedValue(value);\n };\n\n return (\n // biome-ignore lint/a11y/useFocusableInteractive: \u0444\u043E\u043A\u0443\u0441 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043D\u0430 listbox / \u043F\u043E\u0438\u0441\u043A\u0435 (aria-activedescendant)\n // biome-ignore lint/a11y/useKeyWithClickEvents: \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 listbox\n <div\n ref={ref}\n id={optionDomId(listboxId, value)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n className={cx(styles.item, className)}\n onClick={handleClick}\n onMouseMove={handleMouseMove}\n {...toDataAttributes({\n value,\n label: resolvedLabel,\n selected: isSelected,\n highlighted: isHighlighted,\n disabled: Boolean(disabled),\n size,\n rich: parts.rich || undefined,\n })}\n >\n {multiple ? (\n <span className={styles.itemCheckbox} aria-hidden=\"true\">\n {isSelected ? <CheckIcon /> : null}\n </span>\n ) : null}\n {icons.map((icon, index) =>\n React.cloneElement(icon, {\n key: icon.key ?? `prime-select-item-icon-${String(index)}`,\n }),\n )}\n {parts.media}\n <span className={styles.itemText}>{parts.body}</span>\n {parts.meta}\n {multiple ? null : (\n <span className={styles.itemCheckSlot} aria-hidden=\"true\">\n {isSelected ? <CheckIcon /> : null}\n </span>\n )}\n </div>\n );\n },\n);\nSelectItem.displayName = \"SelectItem\";\n\n// \u2500\u2500\u2500 SelectGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction SelectGroup({ className, ...rest }: SelectGroupProps) {\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" is correct for ARIA listbox groups; <fieldset> is not valid inside role=\"listbox\"\n return <div role=\"group\" className={cx(styles.group, className)} {...rest} />;\n}\nSelectGroup.displayName = \"SelectGroup\";\n\n// \u2500\u2500\u2500 SelectGroupLabel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectGroupLabelProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction SelectGroupLabel({ className, ...rest }: SelectGroupLabelProps) {\n const { size } = useSelectContext();\n return (\n <div className={cx(styles.groupLabel, className)} {...rest} {...toDataAttributes({ size })} />\n );\n}\nSelectGroupLabel.displayName = \"SelectGroupLabel\";\n\n// \u2500\u2500\u2500 SelectSeparator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SelectSeparatorProps = React.HTMLAttributes<HTMLHRElement>;\n\nfunction SelectSeparator({ className, ...rest }: SelectSeparatorProps) {\n return <hr className={cx(styles.separator, className)} {...rest} />;\n}\nSelectSeparator.displayName = \"SelectSeparator\";\n\n// \u2500\u2500\u2500 Native <select> (Select.Root native) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype NativeOptionsWalkResult = {\n nodes: React.ReactNode[];\n firstEnabledValue: string | undefined;\n};\n\nfunction extractPlainTextFromNode(node: React.ReactNode): string {\n if (node == null || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(extractPlainTextFromNode).join(\"\");\n if (React.isValidElement(node)) {\n const p = node.props as { children?: React.ReactNode };\n if (p != null && typeof p === \"object\" && \"children\" in p) {\n return extractPlainTextFromNode(p.children);\n }\n }\n return \"\";\n}\n\nfunction renderNativeOptionElement(\n el: React.ReactElement<SelectItemProps>,\n keyIndex: number,\n): React.ReactNode {\n const { value, label, disabled, children } = el.props;\n const resolvedLabel = resolveItemLabel(label, children, value);\n return (\n <option key={`prime-select-native-opt-${keyIndex}`} value={value} disabled={disabled}>\n {resolvedLabel}\n </option>\n );\n}\n\nfunction walkNativeOptions(node: React.ReactNode): NativeOptionsWalkResult {\n const nodes: React.ReactNode[] = [];\n let firstEnabledValue: string | undefined;\n let keyIndex = 0;\n\n const visit = (n: React.ReactNode) => {\n React.Children.forEach(n, (child) => {\n if (child == null || child === false) return;\n if (!React.isValidElement(child)) return;\n if (child.type === React.Fragment) {\n visit((child.props as { children?: React.ReactNode }).children);\n return;\n }\n if (child.type === SelectItem) {\n const p = child.props as SelectItemProps;\n if (!p.disabled && firstEnabledValue === undefined) {\n firstEnabledValue = p.value;\n }\n nodes.push(\n renderNativeOptionElement(child as React.ReactElement<SelectItemProps>, keyIndex),\n );\n keyIndex += 1;\n return;\n }\n if (child.type === SelectGroup) {\n const ogKey = keyIndex;\n let groupLabel = \"\";\n const groupNodes: React.ReactNode[] = [];\n React.Children.forEach((child.props as { children?: React.ReactNode }).children, (gc) => {\n if (!React.isValidElement(gc)) return;\n if (gc.type === SelectGroupLabel) {\n groupLabel = extractPlainTextFromNode(\n (gc.props as { children?: React.ReactNode }).children,\n );\n } else if (gc.type === SelectItem) {\n const gp = gc.props as SelectItemProps;\n if (!gp.disabled && firstEnabledValue === undefined) {\n firstEnabledValue = gp.value;\n }\n groupNodes.push(\n renderNativeOptionElement(gc as React.ReactElement<SelectItemProps>, keyIndex),\n );\n keyIndex += 1;\n }\n });\n nodes.push(\n <optgroup key={`prime-select-native-og-${ogKey}`} label={groupLabel || \"\\u00A0\"}>\n {groupNodes}\n </optgroup>,\n );\n return;\n }\n if (child.type === SelectSeparator) {\n return;\n }\n const wrapProps = child.props as { children?: React.ReactNode };\n if (wrapProps.children != null) {\n visit(wrapProps.children);\n }\n });\n };\n\n visit(node);\n return { nodes, firstEnabledValue };\n}\n\ntype NativeRootInternalProps<V> = SelectRootBase &\n Omit<SelectNativeProps, \"native\"> & {\n value?: V;\n defaultValue?: V;\n onValueChange?: (value: V) => void;\n field: FieldBinding;\n };\n\nfunction nativeSelectProps(\n {\n name,\n disabled,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n }: Pick<SelectRootBase, \"disabled\"> & Omit<SelectNativeProps, \"native\">,\n { size, ids, focusRing, required }: FieldBinding,\n) {\n return {\n id: ids.controlId,\n name,\n required: required || undefined,\n disabled,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ids.describedBy,\n \"aria-invalid\": ids.invalid || undefined,\n className: styles.nativeSelect,\n ...toDataAttributes({\n size,\n invalid: ids.invalid || undefined,\n disabled: disabled || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n }),\n };\n}\n\nfunction SelectNativeRoot(props: NativeRootInternalProps<string>) {\n const { value, defaultValue, onValueChange, placeholder, children, field } = props;\n const handleChange = React.useCallback(\n (v: string | undefined) => {\n if (v !== undefined) onValueChange?.(v);\n },\n [onValueChange],\n );\n\n const [selectedValue, setSelectedValue] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: handleChange,\n });\n\n const { nodes: optionNodes, firstEnabledValue } = React.useMemo(\n () => walkNativeOptions(children),\n [children],\n );\n\n const hasPlaceholder = placeholder != null && placeholder !== \"\";\n const selectValue =\n selectedValue === undefined ? (hasPlaceholder ? \"\" : (firstEnabledValue ?? \"\")) : selectedValue;\n\n return (\n <ControlSizeProvider value={field.size}>\n <span className={styles.nativeWrap}>\n <select\n {...nativeSelectProps(props, field)}\n value={selectValue}\n onChange={(e) => setSelectedValue(e.target.value === \"\" ? undefined : e.target.value)}\n >\n {hasPlaceholder ? <option value=\"\">{placeholder}</option> : null}\n {optionNodes}\n </select>\n <span className={styles.nativeChevron} data-size={field.size} aria-hidden>\n <ChevronIcon />\n </span>\n </span>\n </ControlSizeProvider>\n );\n}\n\nfunction SelectNativeMultiRoot(props: NativeRootInternalProps<string[]>) {\n const { value, defaultValue, onValueChange, children, field } = props;\n const [selectedValues, setSelectedValues] = useControllableState<string[]>({\n value,\n defaultValue: defaultValue ?? [],\n onChange: onValueChange,\n });\n\n const { nodes: optionNodes } = React.useMemo(() => walkNativeOptions(children), [children]);\n\n return (\n <ControlSizeProvider value={field.size}>\n <select\n {...nativeSelectProps(props, field)}\n data-multiple=\"true\"\n multiple\n value={selectedValues}\n onChange={(e) => setSelectedValues(Array.from(e.target.selectedOptions, (o) => o.value))}\n >\n {optionNodes}\n </select>\n </ControlSizeProvider>\n );\n}\n\n// \u2500\u2500\u2500 Namespace export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const Select = {\n Root: SelectRoot,\n Trigger: SelectTrigger,\n Value: SelectValue,\n TriggerIcon: SelectTriggerIcon,\n Badge: SelectBadge,\n Content: SelectContent,\n Item: SelectItem,\n ItemIcon: SelectItemIcon,\n ItemMedia: SelectItemMedia,\n ItemText: SelectItemText,\n ItemDescription: SelectItemDescription,\n ItemMeta: SelectItemMeta,\n Group: SelectGroup,\n GroupLabel: SelectGroupLabel,\n Separator: SelectSeparator,\n};\n", "import * as React from \"react\";\n\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./FieldFrame.module.css\";\n\n/** Field props shared by Select, TagSelect and Datepicker (the same contract as `Input.Root`). */\nexport type FieldFrameProps = {\n label?: React.ReactNode;\n /** Red `*` after the label; the control gets native `required` / `aria-required`. */\n required?: boolean;\n /** Muted `labels.optional` marker after the label. */\n optional?: boolean;\n hint?: React.ReactNode;\n /** Error message; replaces the hint in the same slot and implies `invalid`. */\n error?: React.ReactNode;\n /**\n * Draws the focus ring on the field (default). `false` sets `data-focus-ring=\"false\"` on it and\n * hides only the visual ring \u2014 focus, keyboard and ARIA are unchanged, the error ring still shows.\n * Turn it off only where focus is otherwise obvious; WCAG 2.4.7.\n */\n focusRing?: boolean;\n};\n\nexport function hasFieldError(error: React.ReactNode): boolean {\n return error != null && error !== false && error !== \"\";\n}\n\nexport type FieldIds = {\n controlId: string;\n /** Id of the label element (rendered only when `label` is set). */\n labelId: string;\n hintId: string;\n errorId: string;\n /** `aria-describedby` of the control: caller ids + hint or error. */\n describedBy: string | undefined;\n invalid: boolean;\n};\n\n/** Ids and validation state of a framed field. */\nexport function useFieldFrame(\n explicitId: string | undefined,\n { hint, error, invalid }: { hint?: React.ReactNode; error?: React.ReactNode; invalid?: boolean },\n ariaDescribedBy?: string,\n): FieldIds {\n const generated = React.useId();\n const controlId = explicitId ?? generated;\n const hintId = `${controlId}-hint`;\n const errorId = `${controlId}-error`;\n const showError = hasFieldError(error);\n const showHint = !showError && hint != null && hint !== false && hint !== \"\";\n const describedBy =\n [ariaDescribedBy, showHint ? hintId : undefined, showError ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n return {\n controlId,\n labelId: `${controlId}-label`,\n hintId,\n errorId,\n describedBy,\n invalid: Boolean(invalid) || showError,\n };\n}\n\ntype FieldFrameRenderProps = FieldFrameProps & {\n size: ControlSize;\n ids: FieldIds;\n disabled?: boolean;\n optionalLabel: string;\n className?: string;\n children: React.ReactNode;\n};\n\n/** Label row \u00B7 control \u00B7 support row (hint or error), spaced by the tier's `label-gap` / `hint-gap`. */\nexport function FieldFrame({\n size,\n ids,\n label,\n required,\n optional,\n hint,\n error,\n disabled,\n optionalLabel,\n className,\n children,\n}: FieldFrameRenderProps) {\n const showError = hasFieldError(error);\n const showHint = !showError && hint != null && hint !== false && hint !== \"\";\n\n return (\n <div\n className={cx(styles.root, className)}\n {...toDataAttributes({\n size,\n invalid: ids.invalid || undefined,\n disabled: disabled || undefined,\n })}\n >\n {label != null && label !== false ? (\n <Label.Root\n id={ids.labelId}\n htmlFor={ids.controlId}\n size={size}\n required={required}\n optional={optional}\n disabled={disabled}\n labels={{ optional: optionalLabel }}\n className={styles.label}\n >\n {label}\n </Label.Root>\n ) : null}\n <div className={styles.body}>\n {children}\n {showError ? (\n <Hint.Root id={ids.errorId} size={size} invalid>\n {error}\n </Hint.Root>\n ) : showHint ? (\n <Hint.Root id={ids.hintId} size={size} disabled={disabled}>\n {hint}\n </Hint.Root>\n ) : null}\n </div>\n </div>\n );\n}\n", "/*\n * Field frame of Select, TagSelect and Datepicker: the same rhythm as `Input.Root`\n * (label \u2192 `label-gap` \u2192 field \u2192 `hint-gap` \u2192 support row).\n */\n.root {\n --ff-label-gap: var(--prime-control-m-label-gap);\n --ff-hint-gap: var(--prime-control-m-hint-gap);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--ff-label-gap);\n min-width: 0;\n max-width: 100%;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --ff-label-gap: var(--prime-control-xs-label-gap);\n --ff-hint-gap: var(--prime-control-xs-hint-gap);\n}\n\n.root[data-size=\"s\"] {\n --ff-label-gap: var(--prime-control-s-label-gap);\n --ff-hint-gap: var(--prime-control-s-hint-gap);\n}\n\n.root[data-size=\"l\"] {\n --ff-label-gap: var(--prime-control-l-label-gap);\n --ff-hint-gap: var(--prime-control-l-hint-gap);\n}\n\n.root[data-size=\"xl\"] {\n --ff-label-gap: var(--prime-control-xl-label-gap);\n --ff-hint-gap: var(--prime-control-xl-hint-gap);\n}\n\n.label {\n align-self: flex-start;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--ff-hint-gap);\n min-width: 0;\n}\n", "const SCROLLABLE = /^(auto|scroll|overlay)$/;\n\n/** window, \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043C\u044B\u0435 \u043F\u0440\u0435\u0434\u043A\u0438 \u044F\u043A\u043E\u0440\u044F \u0438 visualViewport \u2014 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0441\u0447\u0451\u0442\u0430 fixed \u043F\u0440\u0438 scroll. */\nexport function getScrollContainers(\n node: Element | null,\n): Array<Element | Window | VisualViewport> {\n const out: Array<Element | Window | VisualViewport> = [window];\n if (!node || typeof window === \"undefined\") return out;\n\n for (let el: Element | null = node.parentElement; el; el = el.parentElement) {\n const { overflowX, overflowY } = window.getComputedStyle(el);\n if (SCROLLABLE.test(overflowY) || SCROLLABLE.test(overflowX)) {\n out.push(el);\n }\n }\n\n if (window.visualViewport) out.push(window.visualViewport);\n return out;\n}\n", "/* \u2500\u2500\u2500 Select \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Trigger = field system (foundation \u00A74, \u00A76, \u00A78): fill instead of border, tier height,\n * field padding, inset danger ring on error, the single focus ring.\n * Panel = shared floating panel (`--prime-panel-*`), items use the trigger tier.\n */\n\n/* \u2500\u2500\u2500 Tier variables (trigger + panel share the same data-size) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.trigger,\n.nativeSelect,\n.nativeChevron,\n.content {\n --sel-h: var(--prime-control-m-height);\n --sel-px: var(--prime-control-m-field-padding-x);\n --sel-gap: var(--prime-control-m-gap);\n --sel-icon: var(--prime-control-m-icon);\n --sel-radius: var(--prime-control-m-radius);\n --sel-text: var(--prime-control-m-text-size);\n --sel-lh: var(--prime-control-m-line-height);\n --sel-item-h: var(--prime-control-m-item-height);\n --sel-choice: var(--prime-control-s-choice);\n --sel-desc-size: var(--prime-text-body-s-size);\n --sel-desc-lh: var(--prime-text-body-s-line-height);\n --sel-media-h: var(--prime-space-7);\n --sel-media-w: var(--prime-space-10);\n --sel-media-radius: var(--prime-radius-s);\n}\n\n[data-size=\"xs\"]:is(.trigger, .nativeSelect, .nativeChevron, .content) {\n --sel-h: var(--prime-control-xs-height);\n --sel-px: var(--prime-control-xs-field-padding-x);\n --sel-gap: var(--prime-control-xs-gap);\n --sel-icon: var(--prime-control-xs-icon);\n --sel-radius: var(--prime-control-xs-radius);\n --sel-text: var(--prime-control-xs-text-size);\n --sel-lh: var(--prime-control-xs-line-height);\n --sel-item-h: var(--prime-control-xs-item-height);\n --sel-choice: var(--prime-control-xs-choice);\n --sel-desc-size: var(--prime-text-caption-size);\n --sel-desc-lh: var(--prime-text-caption-line-height);\n --sel-media-h: var(--prime-space-5);\n --sel-media-w: var(--prime-space-7);\n --sel-media-radius: var(--prime-radius-xs);\n}\n\n[data-size=\"s\"]:is(.trigger, .nativeSelect, .nativeChevron, .content) {\n --sel-h: var(--prime-control-s-height);\n --sel-px: var(--prime-control-s-field-padding-x);\n --sel-gap: var(--prime-control-s-gap);\n --sel-icon: var(--prime-control-s-icon);\n --sel-radius: var(--prime-control-s-radius);\n --sel-text: var(--prime-control-s-text-size);\n --sel-lh: var(--prime-control-s-line-height);\n --sel-item-h: var(--prime-control-s-item-height);\n --sel-choice: var(--prime-control-xs-choice);\n --sel-desc-size: var(--prime-text-caption-size);\n --sel-desc-lh: var(--prime-text-caption-line-height);\n --sel-media-h: var(--prime-space-6);\n --sel-media-w: var(--prime-space-8);\n --sel-media-radius: var(--prime-radius-xs);\n}\n\n[data-size=\"l\"]:is(.trigger, .nativeSelect, .nativeChevron, .content) {\n --sel-h: var(--prime-control-l-height);\n --sel-px: var(--prime-control-l-field-padding-x);\n --sel-gap: var(--prime-control-l-gap);\n --sel-icon: var(--prime-control-l-icon);\n --sel-radius: var(--prime-control-l-radius);\n --sel-text: var(--prime-control-l-text-size);\n --sel-lh: var(--prime-control-l-line-height);\n --sel-item-h: var(--prime-control-l-item-height);\n --sel-choice: var(--prime-control-m-choice);\n --sel-desc-size: var(--prime-text-body-s-size);\n --sel-desc-lh: var(--prime-text-body-s-line-height);\n --sel-media-h: var(--prime-space-8);\n --sel-media-w: var(--prime-space-12);\n --sel-media-radius: var(--prime-radius-m);\n}\n\n[data-size=\"xl\"]:is(.trigger, .nativeSelect, .nativeChevron, .content) {\n --sel-h: var(--prime-control-xl-height);\n --sel-px: var(--prime-control-xl-field-padding-x);\n --sel-gap: var(--prime-control-xl-gap);\n --sel-icon: var(--prime-control-xl-icon);\n --sel-radius: var(--prime-control-xl-radius);\n --sel-text: var(--prime-control-xl-text-size);\n --sel-lh: var(--prime-control-xl-line-height);\n --sel-item-h: var(--prime-control-xl-item-height);\n --sel-choice: var(--prime-control-l-choice);\n --sel-desc-size: var(--prime-text-body-s-size);\n --sel-desc-lh: var(--prime-text-body-s-line-height);\n --sel-media-h: var(--prime-space-10);\n --sel-media-w: var(--prime-space-14);\n --sel-media-radius: var(--prime-radius-m);\n}\n\n.spinner {\n animation: selectSpin calc(var(--prime-motion-duration-slow) * 3) linear infinite;\n}\n\n@keyframes selectSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* \u2500\u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/*\n * Icons (leading, clear, chevron) sit centered between the edge and the text (foundation \u00A76):\n * edge\u2192icon = icon\u2192text = field padX, so the trigger gap is padX too.\n */\n.trigger,\n.nativeSelect {\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--sel-px);\n width: 100%;\n min-width: 0;\n height: var(--sel-h);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--sel-px);\n border: 0;\n border-radius: var(--sel-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--sel-text);\n font-weight: var(--prime-font-weight-regular);\n line-height: var(--sel-lh);\n text-align: start;\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.trigger:hover:not(:disabled),\n.nativeSelect:hover:not(:disabled) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.trigger[data-state=\"open\"],\n.trigger:focus-visible,\n.nativeSelect:focus-visible {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.trigger:not([data-focus-ring=\"false\"]):focus-visible,\n.nativeSelect:not([data-focus-ring=\"false\"]):focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.trigger[data-invalid=\"true\"],\n.nativeSelect[data-invalid=\"true\"] {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.trigger[data-invalid=\"true\"]:focus-visible,\n.nativeSelect[data-invalid=\"true\"]:focus-visible {\n outline-color: var(--prime-color-danger-border);\n}\n\n.trigger:disabled,\n.nativeSelect:disabled {\n background: var(--prime-color-field-bg-disabled);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.triggerMain {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: var(--sel-px);\n min-width: 0;\n}\n\n.triggerValue {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Rich value (`Select.Value` render function with media / description): two lines, the trigger\n grows from the tier height with tier padding; single-line triggers are unchanged. */\n.trigger:has(.triggerValue[data-rich=\"true\"]) {\n height: auto;\n min-height: var(--sel-h);\n padding-block: var(--sel-gap);\n}\n\n.triggerValue:has(> .valueBody) {\n display: flex;\n align-items: center;\n gap: var(--sel-gap);\n}\n\n.valueBody {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n}\n\n/* Select.Badge: after the value, before the clear button and the chevron (padX on both sides). */\n.badge {\n order: 1;\n}\n\n/* Gray soft is a wash like the field: a stronger wash keeps a neutral badge visible (\u00A74). */\n.badge[data-color=\"gray\"]:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-strong);\n}\n\n.triggerValue[data-placeholder=\"true\"] {\n color: var(--prime-color-text-placeholder);\n}\n\n.trigger:disabled .triggerValue {\n color: var(--prime-color-text-disabled);\n}\n\n.triggerIcon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-icon);\n height: var(--sel-icon);\n color: var(--prime-color-text-muted);\n}\n\n.triggerIcon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.trigger:disabled .triggerIcon {\n color: var(--prime-color-text-disabled);\n}\n\n.triggerChevronSlot,\n.triggerClear {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-icon);\n height: var(--sel-icon);\n color: var(--prime-color-text-muted);\n}\n\n.triggerChevronSlot {\n pointer-events: none;\n}\n\n.triggerChevronSlot svg,\n.triggerClear svg {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.trigger[data-state=\"open\"] .triggerChevronSlot svg:not(.spinner) {\n transform: rotate(180deg);\n}\n\n.trigger:disabled .triggerChevronSlot {\n color: var(--prime-color-text-disabled);\n}\n\n.triggerClear {\n border-radius: var(--prime-radius-xs);\n cursor: pointer;\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.triggerClear:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n/* \u2500\u2500\u2500 Native <select> \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.nativeWrap {\n position: relative;\n display: flex;\n width: 100%;\n min-width: 0;\n}\n\n.nativeSelect {\n display: block;\n appearance: none;\n padding-inline-end: calc(var(--sel-px) + var(--sel-icon) + var(--sel-px));\n}\n\n.nativeSelect[data-multiple=\"true\"] {\n height: auto;\n min-height: calc(var(--sel-item-h) * 4);\n padding: var(--prime-panel-padding);\n}\n\n/* \u0428\u0435\u0432\u0440\u043E\u043D \u2014 \u0442\u043E\u0442 \u0436\u0435 \u0433\u043B\u0438\u0444, \u0447\u0442\u043E \u0443 \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u043E\u0433\u043E \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430; \u0446\u0432\u0435\u0442 \u0438\u0437 \u0442\u043E\u043A\u0435\u043D\u0430, \u043D\u0435 \u0438\u0437 data-URI. */\n.nativeChevron {\n position: absolute;\n inset-block: 0;\n inset-inline-end: var(--sel-px);\n display: inline-flex;\n align-items: center;\n width: var(--sel-icon);\n color: var(--prime-color-text-muted);\n pointer-events: none;\n}\n\n.nativeChevron svg {\n display: block;\n width: 100%;\n height: var(--sel-icon);\n}\n\n.nativeSelect:disabled + .nativeChevron {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.content {\n /* Fields inside a raised surface stay distinguishable (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: max-content;\n min-width: min(\n max(var(--prime-panel-min-width), var(--float-min-w, 0px)),\n var(--float-max-w, 100vw)\n );\n max-width: min(calc(var(--prime-panel-min-width) * 2), var(--float-max-w, 100vw));\n max-height: min(var(--prime-panel-max-height), var(--float-max-h, var(--prime-panel-max-height)));\n padding: var(--prime-panel-padding);\n overflow: hidden;\n border-radius: var(--prime-panel-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--sel-text);\n line-height: var(--sel-lh);\n outline: none;\n}\n\n/* \u0417\u0430\u043A\u0440\u044B\u0442\u044B\u0439 listbox \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432 DOM \u0434\u043B\u044F onInitLabel \u2192 \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u0432 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0435; \u043D\u0435 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u0442\u044C \u043A\u043B\u0438\u043A\u0438 \u043F\u043E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435. */\n.content[aria-hidden=\"true\"] {\n pointer-events: none;\n}\n\n.content[data-overlay-portal-layer=\"page\"] {\n z-index: var(--prime-z-dropdown);\n}\n\n.content[data-overlay-portal-layer=\"drawer\"] {\n z-index: var(--prime-z-dropdown-in-drawer);\n}\n\n.content[data-overlay-portal-layer=\"modal\"] {\n z-index: var(--prime-z-dropdown-in-modal);\n}\n\n.content[data-overlay-portal-layer=\"drawerInModal\"] {\n z-index: var(--prime-z-dropdown-in-drawer-in-modal);\n}\n\n.listbox {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n outline: none;\n}\n\n.listbox:empty {\n display: none;\n}\n\n/* \u2500\u2500\u2500 Search (top of the panel, hairline below, full bleed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.search {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--sel-gap);\n height: var(--sel-item-h);\n margin: calc(-1 * var(--prime-panel-padding)) calc(-1 * var(--prime-panel-padding))\n var(--prime-panel-padding);\n padding-block: var(--prime-panel-padding);\n padding-inline: calc(var(--prime-panel-padding) + var(--prime-panel-item-padding-x));\n border-bottom: var(--prime-border-width) solid var(--prime-color-border-subtle);\n box-sizing: content-box;\n}\n\n.searchIcon {\n flex-shrink: 0;\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n color: var(--prime-color-text-muted);\n}\n\n.searchInput {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n outline: none;\n}\n\n/* Search field: inset ring on the full-bleed row, never clipped by the panel. The panel's own\n search row sets data-focus-ring=\"false\" (foundation \u00A77: the caret is the indicator). */\n.search:not([data-focus-ring=\"false\"]):has(.searchInput:focus-visible) {\n /* Follows the panel's top corners so the ring is not cut by its rounding. */\n border-start-start-radius: var(--prime-panel-radius);\n border-start-end-radius: var(--prime-panel-radius);\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.searchInput::placeholder {\n color: var(--prime-color-text-placeholder);\n}\n\n/* \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.item {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--sel-gap);\n width: 100%;\n min-height: var(--sel-item-h);\n padding-block: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n border-radius: var(--prime-panel-item-radius);\n color: var(--prime-color-text-primary);\n font-size: var(--sel-text);\n line-height: var(--sel-lh);\n text-align: start;\n cursor: pointer;\n user-select: none;\n outline: none;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.item[data-highlighted=\"true\"] {\n background: var(--prime-color-fill-subtle);\n}\n\n.item:active:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.item[data-selected=\"true\"] {\n font-weight: var(--prime-font-weight-medium);\n}\n\n.item[data-disabled=\"true\"] {\n background: transparent;\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.itemText {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.itemIcon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-icon);\n height: var(--sel-icon);\n color: var(--prime-color-text-muted);\n}\n\n.itemIcon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.item[data-disabled=\"true\"] .itemIcon {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Rich option parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* Two-line option: grows from the tier item height with tier padding. */\n.item[data-rich=\"true\"] {\n padding-block: var(--sel-gap);\n}\n\n.item[data-rich=\"true\"] .itemText {\n display: flex;\n flex-direction: column;\n}\n\n.item[data-rich=\"true\"][data-selected=\"true\"] {\n background: var(--prime-color-accent-soft);\n}\n\n.item[data-rich=\"true\"][data-selected=\"true\"][data-highlighted=\"true\"] {\n background: var(--prime-color-accent-soft-hover);\n}\n\n.itemTitle,\n.itemDescription {\n display: block;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.item[data-rich=\"true\"] .itemTitle,\n.triggerValue[data-rich=\"true\"] .itemTitle {\n font-weight: var(--prime-font-weight-medium);\n}\n\n.itemDescription {\n color: var(--prime-color-text-muted);\n font-size: var(--sel-desc-size);\n font-weight: var(--prime-font-weight-regular);\n line-height: var(--sel-desc-lh);\n}\n\n.itemMeta {\n flex-shrink: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--sel-desc-size);\n font-weight: var(--prime-font-weight-regular);\n line-height: var(--sel-desc-lh);\n font-variant-numeric: tabular-nums;\n text-align: end;\n white-space: nowrap;\n}\n\n.itemMedia {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-media-w);\n height: var(--sel-media-h);\n overflow: hidden;\n border-radius: var(--sel-media-radius);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n}\n\n.itemMedia > svg {\n display: block;\n width: var(--sel-icon);\n height: var(--sel-icon);\n}\n\n.itemMedia > img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.itemMedia[data-color=\"gray\"] {\n background: var(--prime-color-palette-gray-soft);\n color: var(--prime-color-palette-gray-text);\n}\n\n.itemMedia[data-color=\"blue\"] {\n background: var(--prime-color-palette-blue-soft);\n color: var(--prime-color-palette-blue-text);\n}\n\n.itemMedia[data-color=\"green\"] {\n background: var(--prime-color-palette-green-soft);\n color: var(--prime-color-palette-green-text);\n}\n\n.itemMedia[data-color=\"orange\"] {\n background: var(--prime-color-palette-orange-soft);\n color: var(--prime-color-palette-orange-text);\n}\n\n.itemMedia[data-color=\"red\"] {\n background: var(--prime-color-palette-red-soft);\n color: var(--prime-color-palette-red-text);\n}\n\n.itemMedia[data-color=\"yellow\"] {\n background: var(--prime-color-palette-yellow-soft);\n color: var(--prime-color-palette-yellow-text);\n}\n\n.itemMedia[data-color=\"purple\"] {\n background: var(--prime-color-palette-purple-soft);\n color: var(--prime-color-palette-purple-text);\n}\n\n.itemMedia[data-color=\"sky\"] {\n background: var(--prime-color-palette-sky-soft);\n color: var(--prime-color-palette-sky-text);\n}\n\n.itemMedia[data-color=\"pink\"] {\n background: var(--prime-color-palette-pink-soft);\n color: var(--prime-color-palette-pink-text);\n}\n\n.itemMedia[data-color=\"teal\"] {\n background: var(--prime-color-palette-teal-soft);\n color: var(--prime-color-palette-teal-text);\n}\n\n.trigger:disabled :is(.itemDescription, .itemMeta),\n.item[data-disabled=\"true\"] :is(.itemDescription, .itemMeta) {\n color: var(--prime-color-text-disabled);\n}\n\n/* Fixed trailing column for the check mark (single). */\n.itemCheckSlot {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-icon);\n height: var(--sel-icon);\n color: var(--prime-color-accent-text);\n}\n\n.itemCheckSlot svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* Fixed leading column with a checkbox (multiple). */\n.itemCheckbox {\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--sel-choice);\n height: var(--sel-choice);\n border-radius: var(--prime-radius-xs);\n background: var(--prime-color-fill-strong);\n color: var(--prime-color-accent-fg);\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.itemCheckbox svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.item[data-highlighted=\"true\"] .itemCheckbox {\n background: var(--prime-color-fill-strong-hover);\n}\n\n.item[data-selected=\"true\"] .itemCheckbox {\n background: var(--prime-color-accent-default);\n}\n\n.item[data-disabled=\"true\"] .itemCheckbox {\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Group / separator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.group {\n display: flex;\n flex-direction: column;\n}\n\n/* \u041F\u043E\u0438\u0441\u043A \u0441\u043A\u0440\u044B\u043B \u0432\u0441\u0435 \u043F\u0443\u043D\u043A\u0442\u044B \u0433\u0440\u0443\u043F\u043F\u044B \u2014 \u043F\u0440\u044F\u0447\u0435\u043C \u0438 \u043F\u043E\u0434\u043F\u0438\u0441\u044C. */\n.group:not(:has([role=\"option\"])) {\n display: none;\n}\n\n.groupLabel {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.separator {\n flex-shrink: 0;\n align-self: stretch;\n height: 0;\n margin-block: var(--prime-panel-padding);\n margin-inline: calc(-1 * var(--prime-panel-padding));\n border: 0;\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.content[data-searching=\"true\"] .separator {\n display: none;\n}\n\n/* \u2500\u2500\u2500 Status rows: loading / empty \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.status {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--sel-gap);\n min-height: var(--sel-item-h);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n}\n\n.status .spinner {\n width: var(--sel-icon);\n height: var(--sel-icon);\n}\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--prime-space-1);\n padding: var(--prime-space-4) var(--prime-space-3);\n text-align: center;\n}\n\n.emptyText {\n color: var(--prime-color-text-secondary);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n}\n\n.emptyHint {\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n}\n", "/**\n * \u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 \u0433\u043B\u0438\u0444\u044B Select / TagSelect: 24-viewBox, \u043E\u0431\u0432\u043E\u0434\u043A\u0430 \u043D\u0435 \u043C\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044F\n * (`vector-effect`), \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0442\u043E\u043B\u0449\u0438\u043D\u0430 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0430 \u043D\u0430 \u0432\u0441\u0435\u0445 \u044F\u0440\u0443\u0441\u0430\u0445.\n */\n\ntype IconProps = { className?: string };\n\nconst STROKE = 1.7;\n\nexport function CheckIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M5.5 12.5l4.25 4.25L18.5 8\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\nexport function ChevronIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M7 10l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\nexport function ClearIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M7 7l10 10M17 7L7 17\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\nexport function SearchIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n cx=\"11\"\n cy=\"11\"\n r=\"6.5\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n vectorEffect=\"non-scaling-stroke\"\n />\n <path\n d=\"M16 16l4 4\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\n/** \u041A\u043E\u043B\u044C\u0446\u043E \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438; \u0432\u0440\u0430\u0449\u0435\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u043A\u043B\u0430\u0441\u0441 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044F (`--prime-motion-*`). */\nexport function Spinner({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n stroke=\"currentColor\"\n strokeOpacity=\"0.25\"\n strokeWidth={STROKE}\n vectorEffect=\"non-scaling-stroke\"\n />\n <path\n d=\"M20 12a8 8 0 0 0-8-8\"\n stroke=\"currentColor\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n", "import type * as React from \"react\";\n\n/** \u041E\u043F\u0446\u0438\u0438 listbox: \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u043F\u0443\u043D\u043A\u0442\u044B (\u0431\u0435\u0437 `data-disabled`). */\nexport function queryEnabledSelectOptions(container: HTMLElement | null): HTMLElement[] {\n if (!container) return [];\n return Array.from(\n container.querySelectorAll<HTMLElement>('[role=\"option\"]:not([data-disabled=\"true\"])'),\n );\n}\n\nexport type SelectListboxKeyboardContext = {\n items: HTMLElement[];\n highlightedValue: string | undefined;\n setHighlightedValue: (value: string | undefined) => void;\n onSelect: (value: string, label: string) => void;\n onClose: () => void;\n};\n\n/** \u041E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043A\u043B\u0430\u0432\u0438\u0448 \u0434\u043B\u044F `role=\"listbox\"` (\u0441\u0442\u0440\u0435\u043B\u043A\u0438, Home/End, Enter, Space, Escape). */\nexport function handleSelectListboxKeyDown(\n e: React.KeyboardEvent<HTMLDivElement>,\n ctx: SelectListboxKeyboardContext,\n): void {\n const { items, highlightedValue, setHighlightedValue, onSelect, onClose } = ctx;\n if (items.length === 0) return;\n\n const currentIndex = items.findIndex((i) => i.dataset.value === highlightedValue);\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n setHighlightedValue(items[next]?.dataset.value);\n items[next]?.scrollIntoView?.({ block: \"nearest\" });\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n setHighlightedValue(items[prev]?.dataset.value);\n items[prev]?.scrollIntoView?.({ block: \"nearest\" });\n break;\n }\n case \"Home\": {\n e.preventDefault();\n setHighlightedValue(items[0]?.dataset.value);\n items[0]?.scrollIntoView?.({ block: \"nearest\" });\n break;\n }\n case \"End\": {\n e.preventDefault();\n const last = items[items.length - 1];\n setHighlightedValue(last?.dataset.value);\n last?.scrollIntoView?.({ block: \"nearest\" });\n break;\n }\n case \"Enter\":\n case \" \": {\n e.preventDefault();\n if (highlightedValue) {\n const item = items.find((i) => i.dataset.value === highlightedValue);\n const label = item?.dataset.label ?? item?.textContent?.trim() ?? highlightedValue;\n onSelect(highlightedValue, label);\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n onClose();\n break;\n }\n default:\n break;\n }\n}\n", "/*\n * ColorPicker parts (react-aria-components). Inputs follow the field system (Input.module.css):\n * fill-based, no borders, tier m. Thumbs: thumb-colored ring + overlay shadow, like Slider.\n * Color surfaces get a subtle inner edge so white / transparent colors stay visible.\n */\n\n/* ---- Panel: vertical layout of the picker; optional raised surface ---- */\n.panel {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-3);\n width: 100%;\n min-width: 0;\n}\n\n.panel[data-surface=\"raised\"] {\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n padding: var(--prime-panel-content-padding);\n border-radius: var(--prime-panel-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n}\n\n/* ---- Hue / alpha slider ---- */\n.slider {\n --cp-track-h: var(--prime-space-3);\n --cp-thumb: var(--prime-control-m-choice);\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n}\n\n.sliderHeader {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n}\n\n.sliderLabel {\n font-size: var(--prime-control-m-label-size);\n line-height: var(--prime-control-m-label-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n}\n\n.sliderValue {\n font-size: var(--prime-control-m-label-size);\n line-height: var(--prime-control-m-label-line-height);\n font-variant-numeric: tabular-nums;\n color: var(--prime-color-text-secondary);\n}\n\n.sliderTrack {\n box-sizing: border-box;\n width: 100%;\n height: var(--cp-track-h);\n border-radius: var(--prime-radius-full);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-subtle-active);\n cursor: pointer;\n}\n\n.slider[data-disabled] .sliderTrack {\n cursor: not-allowed;\n filter: grayscale(1);\n}\n\n/* ---- Thumbs (slider + area) ---- */\n.thumb,\n.thumbArea {\n z-index: 2;\n box-sizing: border-box;\n width: var(--cp-thumb, var(--prime-control-m-choice));\n height: var(--cp-thumb, var(--prime-control-m-choice));\n border: var(--prime-focus-width) solid var(--prime-color-control-thumb);\n border-radius: var(--prime-radius-full);\n box-shadow: var(--prime-shadow-overlay);\n cursor: grab;\n transition:\n width var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n height var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.thumb[data-dragging],\n.thumbArea[data-dragging] {\n cursor: grabbing;\n}\n\n.thumb[data-focus-visible],\n.thumbArea[data-focus-visible] {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.thumb[data-disabled],\n.thumbArea[data-disabled] {\n box-shadow: none;\n cursor: not-allowed;\n}\n\n/* RAC sets only left + translate(-50%, -50%); centre vertically on the track. */\n.slider[data-orientation=\"horizontal\"] .thumb {\n top: 50%;\n}\n\n/* ---- Saturation / lightness area ---- */\n.area {\n --cp-thumb: var(--prime-control-l-choice);\n box-sizing: border-box;\n width: 100%;\n aspect-ratio: 4 / 3;\n border-radius: var(--prime-radius-m);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-subtle-active);\n}\n\n.area[data-disabled] {\n filter: grayscale(1);\n pointer-events: none;\n}\n\n/* ---- Format select ---- */\n.formatSelectWrap {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n}\n\n/* ---- Channel strip: eyedropper + equal grid columns, one field per channel ----\n * Each cell is a field row (foundation \u00A79 \"Field affixes\"): the value and its unit are one\n * end-aligned group separated by the compact (xs) tier gap, so number\u2013unit spacing is identical in every cell.\n * Column widths come from the grid, never from fixed widths on the cells. */\n.channelStrip {\n display: grid;\n grid-auto-flow: column;\n grid-template-columns: auto;\n grid-auto-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--prime-space-1);\n width: 100%;\n min-width: 0;\n height: var(--prime-control-m-height);\n}\n\n.channelStripLead {\n display: flex;\n}\n\n.channelStrip .channelStripEyedropperBtn {\n aspect-ratio: 1;\n height: 100%;\n padding: 0;\n}\n\n.channelCell {\n box-sizing: border-box;\n display: flex;\n align-items: baseline;\n align-self: stretch;\n gap: var(--prime-control-xs-gap);\n min-width: 0;\n padding-block: calc((var(--prime-control-m-height) - var(--prime-control-s-line-height)) / 2);\n padding-inline: var(--prime-space-2) var(--prime-space-1);\n border-radius: var(--prime-control-m-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n font-size: var(--prime-control-s-text-size);\n line-height: var(--prime-control-s-line-height);\n font-variant-numeric: tabular-nums;\n cursor: text;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.channelCell:hover:not(:focus-within) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.channelCell:has(.channelInput:focus-visible) {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring. */\n.channelStrip:not([data-focus-ring=\"false\"]) .channelCell:has(.channelInput:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.channelInput {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: end;\n outline: none;\n}\n\n.channelCellHex {\n padding-inline: var(--prime-control-s-field-padding-x);\n}\n\n.channelCellHex .channelInput {\n text-align: start;\n}\n\n.channelSuffix {\n flex-shrink: 0;\n color: var(--prime-color-text-muted);\n}\n\n/* ---- Swatches ---- */\n.swatchPicker {\n display: flex;\n flex-wrap: wrap;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n}\n\n.swatchItem {\n flex-shrink: 0;\n display: flex;\n border-radius: var(--prime-radius-full);\n outline: none;\n cursor: pointer;\n transition: transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.swatchItem[data-hovered]:not([data-disabled]) {\n transform: scale(1.08);\n}\n\n.swatchItem[data-selected] {\n outline: var(--prime-focus-width) solid var(--prime-color-accent-default);\n outline-offset: var(--prime-focus-offset);\n}\n\n.swatchItem[data-focus-visible] {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.swatchItem[data-disabled] {\n cursor: not-allowed;\n filter: grayscale(1);\n}\n\n.swatch {\n box-sizing: border-box;\n width: var(--prime-icon-l);\n height: var(--prime-icon-l);\n border-radius: var(--prime-radius-full);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-subtle-active);\n}\n\n/* ---- Trigger swatch (inside a button) ---- */\n.triggerSwatch {\n position: relative;\n box-sizing: border-box;\n display: inline-block;\n flex-shrink: 0;\n /* Follows the host's icon size (Button sets `--prime-icon-size` per tier); m outside a host. */\n width: var(--prime-icon-size, var(--prime-control-m-icon));\n height: var(--prime-icon-size, var(--prime-control-m-icon));\n overflow: hidden;\n border-radius: var(--prime-radius-xs);\n vertical-align: middle;\n}\n\n/* Inner edge painted above the color layer. */\n.triggerSwatch::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-subtle-active);\n pointer-events: none;\n}\n\n.triggerSwatchSvg {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* ---- RAC ColorField (field system, tier m) ---- */\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--prime-control-m-label-gap);\n min-width: 0;\n}\n\n.field :global(.react-aria-Label) {\n font-size: var(--prime-control-m-label-size);\n line-height: var(--prime-control-m-label-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n}\n\n.field :global(.react-aria-Input) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: var(--prime-control-m-height);\n margin: 0;\n padding-inline: var(--prime-control-m-field-padding-x);\n border: 0;\n border-radius: var(--prime-control-m-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n font: inherit;\n font-size: var(--prime-control-m-text-size);\n line-height: var(--prime-control-m-line-height);\n font-variant-numeric: tabular-nums;\n outline: none;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.field :global(.react-aria-Input[data-hovered]):not([data-focused]) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.field :global(.react-aria-Input[data-focus-visible]),\n.field :global(.react-aria-Input[data-focused]) {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.field:not([data-focus-ring=\"false\"]) :global(.react-aria-Input[data-focus-visible]),\n.field:not([data-focus-ring=\"false\"]) :global(.react-aria-Input[data-focused]) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.field[data-invalid] :global(.react-aria-Input) {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.field[data-invalid] :global(.react-aria-Input[data-focused]) {\n outline-color: var(--prime-color-danger-border);\n}\n\n.field[data-disabled] :global(.react-aria-Input) {\n background: var(--prime-color-field-bg-disabled);\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* ---- Standalone eyedropper: square, same height as a field ---- */\n.eyeDropperSquare {\n flex-shrink: 0;\n width: var(--prime-control-m-height);\n min-width: var(--prime-control-m-height);\n padding: 0;\n}\n", "import { Check } from \"lucide-react\";\nimport * as React from \"react\";\nimport { parseColor } from \"react-aria-components\";\n\nimport { Popover } from \"@/components/popover/Popover\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport type { PositionAlign, PositionSide } from \"@/hooks/usePosition\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./ColorPresets.module.css\";\n\nexport type ColorPreset = {\n /** CSS color stored as the value (`onValueChange` returns it as is). */\n value: string;\n /** Human-readable name: the option's accessible name and the trigger's `aria-label` suffix. */\n label: string;\n};\n\n/**\n * Default quick colors: the kit palette primitives (`tokens/primitives.ts`).\n * Row 1 \u2014 step 500 of eight hues, row 2 \u2014 step 700 of the same hues.\n * Take `COLOR_PRESETS.slice(0, 8)` for a single row of eight.\n */\nexport const COLOR_PRESETS: readonly ColorPreset[] = [\n { value: \"#ef4444\", label: \"\u041A\u0440\u0430\u0441\u043D\u044B\u0439\" },\n { value: \"#f97316\", label: \"\u041E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439\" },\n { value: \"#eab308\", label: \"\u0416\u0451\u043B\u0442\u044B\u0439\" },\n { value: \"#22c55e\", label: \"\u0417\u0435\u043B\u0451\u043D\u044B\u0439\" },\n { value: \"#14b8a6\", label: \"\u0411\u0438\u0440\u044E\u0437\u043E\u0432\u044B\u0439\" },\n { value: \"#5068f5\", label: \"\u0421\u0438\u043D\u0438\u0439\" },\n { value: \"#a855f7\", label: \"\u0424\u0438\u043E\u043B\u0435\u0442\u043E\u0432\u044B\u0439\" },\n { value: \"#ec4899\", label: \"\u0420\u043E\u0437\u043E\u0432\u044B\u0439\" },\n { value: \"#b91c1c\", label: \"\u0422\u0451\u043C\u043D\u043E-\u043A\u0440\u0430\u0441\u043D\u044B\u0439\" },\n { value: \"#c2410c\", label: \"\u0422\u0451\u043C\u043D\u043E-\u043E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439\" },\n { value: \"#a16207\", label: \"\u0413\u043E\u0440\u0447\u0438\u0447\u043D\u044B\u0439\" },\n { value: \"#15803d\", label: \"\u0422\u0451\u043C\u043D\u043E-\u0437\u0435\u043B\u0451\u043D\u044B\u0439\" },\n { value: \"#0f766e\", label: \"\u0422\u0451\u043C\u043D\u043E-\u0431\u0438\u0440\u044E\u0437\u043E\u0432\u044B\u0439\" },\n { value: \"#2f4ae0\", label: \"\u0422\u0451\u043C\u043D\u043E-\u0441\u0438\u043D\u0438\u0439\" },\n { value: \"#7e22ce\", label: \"\u0422\u0451\u043C\u043D\u043E-\u0444\u0438\u043E\u043B\u0435\u0442\u043E\u0432\u044B\u0439\" },\n { value: \"#be185d\", label: \"\u0422\u0451\u043C\u043D\u043E-\u0440\u043E\u0437\u043E\u0432\u044B\u0439\" },\n];\n\nexport type ColorPresetsLabels = {\n /** Trigger name prefix: `aria-label` = \"<trigger>: <color name>\". */\n trigger: string;\n /** Accessible name of the swatch list when `Content` has no `label`. */\n list: string;\n /** The \"no color\" swatch (`allowEmpty`) and the trigger name for an empty value. */\n empty: string;\n};\n\nconst COLOR_PRESETS_LABELS: ColorPresetsLabels = {\n trigger: \"\u0426\u0432\u0435\u0442\",\n list: \"\u0426\u0432\u0435\u0442\u0430\",\n empty: \"\u0411\u0435\u0437 \u0446\u0432\u0435\u0442\u0430\",\n};\n\n/** Viewport width below which l / xl grids wrap to half the columns (foundation \u00A79 breakpoint). */\nconst NARROW_QUERY = \"(max-width: 479px)\";\n\ntype Option = { value: string | null; label: string; contrast: \"light\" | \"dark\" };\n\ntype Ctx = {\n value: string | null;\n select: (value: string | null) => void;\n close: () => void;\n options: Option[];\n selectedLabel: string;\n columns: number;\n size: ControlSize;\n disabled: boolean;\n labels: ColorPresetsLabels;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\n\nconst [ColorPresetsProvider, useColorPresetsContext] = createComponentContext<Ctx>(\"ColorPresets\");\n\nfunction sameColor(a: string | null, b: string | null) {\n return (a ?? \"\").trim().toLowerCase() === (b ?? \"\").trim().toLowerCase();\n}\n\n/** `dark` when a dark mark contrasts better with the color than a light one (WCAG luminance). */\nfunction markContrast(value: string): \"light\" | \"dark\" {\n try {\n const rgb = parseColor(value).toFormat(\"rgb\");\n const lin = (c: number) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n };\n const l =\n 0.2126 * lin(rgb.getChannelValue(\"red\")) +\n 0.7152 * lin(rgb.getChannelValue(\"green\")) +\n 0.0722 * lin(rgb.getChannelValue(\"blue\"));\n // Equal contrast against white (L=1) and black (L=0) at L \u2248 0.179.\n return l > 0.179 ? \"dark\" : \"light\";\n } catch {\n return \"dark\";\n }\n}\n\nexport type ColorPresetsRootProps = {\n /** Controlled color; `null` \u2014 no color. */\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Swatches in panel order. Default: `COLOR_PRESETS` (16). */\n presets?: readonly ColorPreset[];\n /** Grid columns. Default: one row for up to 8 presets (+ \"no color\"), else 8; 16 \u2192 8 \u00D7 2. */\n columns?: number;\n /** Tier of the trigger, swatches and panel. */\n size?: ControlSize;\n disabled?: boolean;\n /** Adds the \"no color\" swatch after the presets (value `null`); hue rows stay aligned. */\n allowEmpty?: boolean;\n /** Close the panel after a pick (focus returns to the trigger). Default `true`. */\n closeOnSelect?: boolean;\n labels?: Partial<ColorPresetsLabels>;\n children: React.ReactNode;\n};\n\nfunction ColorPresetsRoot({\n value: valueProp,\n defaultValue = null,\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n presets = COLOR_PRESETS,\n columns: columnsProp,\n size = \"m\",\n disabled = false,\n allowEmpty = false,\n closeOnSelect = true,\n labels: labelsProp,\n children,\n}: ColorPresetsRootProps) {\n const [value, setValue] = useControllableState<string | null>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const labels = React.useMemo(() => ({ ...COLOR_PRESETS_LABELS, ...labelsProp }), [labelsProp]);\n\n const options = React.useMemo<Option[]>(\n () => [\n ...presets.map((p) => ({ ...p, contrast: markContrast(p.value) })),\n ...(allowEmpty ? [{ value: null, label: labels.empty, contrast: \"dark\" as const }] : []),\n ],\n [allowEmpty, presets, labels.empty],\n );\n // Up to 8 presets (+ \"no color\") fit one row; more wrap into rows of 8.\n const columns = Math.max(\n 1,\n Math.round(columnsProp ?? (presets.length <= 8 ? options.length : 8)),\n );\n const selectedLabel =\n value == null ? labels.empty : (presets.find((p) => sameColor(p.value, value))?.label ?? value);\n\n const select = React.useCallback(\n (next: string | null) => {\n setValue(next);\n if (closeOnSelect) {\n setOpen(false);\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [setValue, setOpen, closeOnSelect],\n );\n const close = React.useCallback(() => setOpen(false), [setOpen]);\n\n const ctx = React.useMemo<Ctx>(\n () => ({\n value,\n select,\n close,\n options,\n selectedLabel,\n columns,\n size,\n disabled,\n labels,\n triggerRef,\n }),\n [value, select, close, options, selectedLabel, columns, size, disabled, labels],\n );\n\n return (\n <ColorPresetsProvider value={ctx}>\n <Popover.Root open={open && !disabled} onOpenChange={setOpen}>\n {children}\n </Popover.Root>\n </ColorPresetsProvider>\n );\n}\nColorPresetsRoot.displayName = \"ColorPresets.Root\";\n\n/** Color layer of a swatch: an SVG rect (no inline style), or the checkerboard for no color. */\nfunction SwatchFill({ value }: { value: string | null }) {\n if (value == null) return <span aria-hidden className={styles.checker} />;\n return (\n <svg className={styles.fill} aria-hidden=\"true\" viewBox=\"0 0 1 1\" preserveAspectRatio=\"none\">\n <rect width=\"1\" height=\"1\" fill={value} />\n </svg>\n );\n}\n\nexport type ColorPresetsSwatchProps = { className?: string };\n\n/**\n * The current color as a small square for a custom trigger (e.g. inside `Button.Root`). Sized from\n * the host's `--prime-icon-size`; `aria-hidden` \u2014 the trigger carries the name.\n */\nfunction Swatch({ className }: ColorPresetsSwatchProps) {\n const { value } = useColorPresetsContext();\n return (\n <span aria-hidden className={cx(styles.swatch, className)}>\n <SwatchFill value={value} />\n </span>\n );\n}\nSwatch.displayName = \"ColorPresets.Swatch\";\n\nexport type ColorPresetsTriggerProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"disabled\" | \"value\"\n> & {\n /**\n * `false` (default) \u2014 the kit square swatch button of the Root tier. `true` \u2014 `children` (one\n * element, e.g. `Button.Root` with `ColorPresets.Swatch`) becomes the trigger.\n */\n asChild?: boolean;\n children?: React.ReactElement;\n};\n\n/** Opens the panel. Name: `aria-label` ?? \"<labels.trigger>: <color name>\". */\nconst Trigger = React.forwardRef<HTMLButtonElement, ColorPresetsTriggerProps>(function Trigger(\n { asChild = false, children, className, onKeyDown, \"aria-label\": ariaLabel, ...rest },\n forwardedRef,\n) {\n const { value, size, disabled, labels, selectedLabel, triggerRef } = useColorPresetsContext();\n const ref = React.useMemo(\n () => mergeRefs<HTMLButtonElement>(forwardedRef, triggerRef as React.Ref<HTMLButtonElement>),\n [forwardedRef, triggerRef],\n );\n const name = ariaLabel ?? `${labels.trigger}: ${selectedLabel}`;\n\n if (asChild && children) {\n // biome-ignore lint/suspicious/noExplicitAny: cloneElement on an arbitrary element\n const child = children as React.ReactElement<any>;\n const childRef = (child.props as { ref?: React.Ref<HTMLElement> }).ref;\n return (\n <Popover.Trigger>\n {React.cloneElement(child, {\n ...rest,\n ref: mergeRefs(childRef, ref as React.Ref<HTMLElement>),\n disabled: disabled || child.props.disabled,\n \"aria-label\": child.props[\"aria-label\"] ?? name,\n })}\n </Popover.Trigger>\n );\n }\n\n return (\n <Popover.Trigger>\n <button\n type=\"button\"\n {...rest}\n ref={ref}\n aria-label={name}\n disabled={disabled}\n data-size={size}\n data-empty={value == null ? \"\" : undefined}\n data-disabled={disabled ? \"\" : undefined}\n className={cx(styles.trigger, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n e.currentTarget.click();\n }\n }}\n >\n <SwatchFill value={value} />\n </button>\n </Popover.Trigger>\n );\n});\nTrigger.displayName = \"ColorPresets.Trigger\";\n\nexport type ColorPresetsContentProps = {\n /** Visible heading above the grid; also the list's accessible name (else `labels.list`). */\n label?: React.ReactNode;\n align?: PositionAlign;\n side?: PositionSide;\n className?: string;\n};\n\nfunction useNarrowViewport() {\n const [narrow, setNarrow] = React.useState(false);\n React.useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const mql = window.matchMedia(NARROW_QUERY);\n const update = () => setNarrow(mql.matches);\n update();\n mql.addEventListener?.(\"change\", update);\n return () => mql.removeEventListener?.(\"change\", update);\n }, []);\n return narrow;\n}\n\n/** Floating panel (Popover overlay contract) with the swatch grid: `role=\"listbox\"`. */\nfunction Content({ label, align = \"start\", side = \"bottom\", className }: ColorPresetsContentProps) {\n const { size } = useColorPresetsContext();\n return (\n <Popover.Content align={align} side={side} size={size} insetGap=\"x2\" className={className}>\n <SwatchList label={label} />\n </Popover.Content>\n );\n}\nContent.displayName = \"ColorPresets.Content\";\n\nfunction SwatchList({ label }: { label?: React.ReactNode }) {\n const { value, select, close, options, columns, size, labels, triggerRef } =\n useColorPresetsContext();\n const labelId = React.useId();\n const narrow = useNarrowViewport();\n // l / xl rows of more than 4 do not fit a 320px screen: wrap to half the columns.\n const wraps = narrow && (size === \"l\" || size === \"xl\") && columns > 4;\n const cols = wraps ? Math.ceil(columns / 2) : columns;\n\n const selectedIndex = options.findIndex((o) => sameColor(o.value, value));\n const [active, setActive] = React.useState(Math.max(0, selectedIndex));\n const itemRefs = React.useRef<Array<HTMLDivElement | null>>([]);\n\n // Opening moves focus to the selected swatch (or the first one).\n // biome-ignore lint/correctness/useExhaustiveDependencies: focus once on mount\n React.useEffect(() => {\n itemRefs.current[Math.max(0, selectedIndex)]?.focus({ preventScroll: true });\n }, []);\n\n const move = (index: number) => {\n const next = Math.min(options.length - 1, Math.max(0, index));\n setActive(next);\n itemRefs.current[next]?.focus();\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case \"ArrowRight\":\n move(active + 1);\n break;\n case \"ArrowLeft\":\n move(active - 1);\n break;\n case \"ArrowDown\":\n if (active + cols < options.length) move(active + cols);\n break;\n case \"ArrowUp\":\n if (active - cols >= 0) move(active - cols);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(options.length - 1);\n break;\n case \"Enter\":\n case \" \": {\n const option = options[active];\n if (option) select(option.value);\n break;\n }\n case \"Tab\":\n // Leave like a native select: focus goes back to the trigger, then Tab moves on from it.\n triggerRef.current?.focus({ preventScroll: true });\n close();\n return;\n default:\n return;\n }\n e.preventDefault();\n };\n\n return (\n <>\n {label != null ? (\n <div id={labelId} className={styles.label} data-size={size}>\n {label}\n </div>\n ) : null}\n <div\n role=\"listbox\"\n aria-label={label != null ? undefined : labels.list}\n aria-labelledby={label != null ? labelId : undefined}\n className={styles.grid}\n data-size={size}\n style={{ \"--cpr-columns\": cols } as React.CSSProperties}\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n {options.map((option, i) => {\n const selected = i === selectedIndex;\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: keys are handled by the listbox (roving tabindex)\n <div\n key={option.value ?? \"empty\"}\n ref={(el) => {\n itemRefs.current[i] = el;\n }}\n role=\"option\"\n aria-selected={selected}\n aria-label={option.label}\n tabIndex={i === active ? 0 : -1}\n title={option.label}\n className={styles.option}\n data-selected={selected ? \"\" : undefined}\n data-empty={option.value == null ? \"\" : undefined}\n data-contrast={option.contrast}\n onClick={() => select(option.value)}\n onFocus={() => setActive(i)}\n >\n <SwatchFill value={option.value} />\n {selected ? <Check aria-hidden className={styles.check} strokeWidth={3} /> : null}\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\nexport const ColorPresets = {\n Root: ColorPresetsRoot,\n Trigger,\n Swatch,\n Content,\n};\n", "import * as React from \"react\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { useFocusTrap } from \"@/hooks/useFocusTrap\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport type { PositionAlign, PositionSide } from \"@/hooks/usePosition\";\nimport { usePresence } from \"@/hooks/usePresence\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\nimport { useOverlayPortalLayer } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Popover.module.css\";\nimport { usePopoverPosition } from \"./usePopoverPosition\";\n\ntype Ctx = {\n isOpen: boolean;\n onClose: () => void;\n onToggle: () => void;\n triggerId: string;\n contentId: string;\n triggerRef: React.RefObject<HTMLElement | null>;\n closeOnOutsideClick: boolean;\n};\n\nconst [PopoverProvider, usePopoverContext] = createComponentContext<Ctx>(\"Popover\");\n\nexport type PopoverRootProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** A pointerdown outside the panel and its trigger closes it. Default `true`. */\n closeOnOutsideClick?: boolean;\n children: React.ReactNode;\n};\n\nfunction PopoverRoot({\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnOutsideClick = true,\n children,\n}: PopoverRootProps) {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const id = React.useId();\n const triggerId = `${id}-trigger`;\n const contentId = `${id}-content`;\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const onClose = React.useCallback(() => setIsOpen(false), [setIsOpen]);\n const onToggle = React.useCallback(() => setIsOpen((v) => !v), [setIsOpen]);\n\n const value = React.useMemo(\n () => ({ isOpen, onClose, onToggle, triggerId, contentId, triggerRef, closeOnOutsideClick }),\n [isOpen, onClose, onToggle, triggerId, contentId, closeOnOutsideClick],\n );\n\n return <PopoverProvider value={value}>{children}</PopoverProvider>;\n}\nPopoverRoot.displayName = \"PopoverRoot\";\n\nexport type PopoverTriggerProps = {\n /** The element that opens the panel (usually a Button); it receives ref, ARIA and the click handler. */\n children: React.ReactElement;\n};\n\nfunction PopoverTrigger({ children }: PopoverTriggerProps) {\n const { isOpen, onToggle, triggerId, contentId, triggerRef } = usePopoverContext();\n const toggleRef = React.useRef(onToggle);\n toggleRef.current = onToggle;\n\n const setNode = React.useCallback(\n (el: HTMLElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current = el;\n },\n [triggerRef],\n );\n\n // biome-ignore lint/suspicious/noExplicitAny: cloneElement \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\n const child = children as React.ReactElement<any>;\n const childRef =\n (child.props as { ref?: React.Ref<HTMLElement | null> }).ref ??\n (child as unknown as { ref?: React.Ref<HTMLElement | null> }).ref;\n const mergedRef = React.useMemo(() => mergeRefs(childRef, setNode), [childRef, setNode]);\n const userClick = child.props?.onClick as React.MouseEventHandler<HTMLElement> | undefined;\n\n return React.cloneElement(child, {\n ref: mergedRef,\n // Keep the child's own id (a field label's htmlFor points at it); fall back to the generated one.\n id: (child.props?.id as string | undefined) ?? triggerId,\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-haspopup\": \"dialog\",\n \"aria-controls\": contentId,\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n userClick?.(e);\n toggleRef.current();\n },\n });\n}\nPopoverTrigger.displayName = \"PopoverTrigger\";\n\nexport type PopoverInsetPadding = \"none\" | \"x1\" | \"x2\" | \"x3\";\nexport type PopoverInsetGap = \"none\" | \"pad\" | \"x2\" | \"x3\" | \"x4\";\n\nexport type PopoverContentProps = {\n align?: PositionAlign;\n side?: PositionSide;\n sameMinWidthAsTrigger?: boolean;\n size?: ControlSize;\n trapFocus?: boolean;\n /** \u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C \u043F\u043E\u043B\u044F\u043C \u043A\u0430\u043A \u0443 Dropdown (`padding` = `--dd-pad` + inset). */\n insetPadding?: PopoverInsetPadding;\n /** \u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0437\u0430\u0437\u043E\u0440 \u043C\u0435\u0436\u0434\u0443 \u043F\u0440\u044F\u043C\u044B\u043C\u0438 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u043C\u0438 \u0431\u043B\u043E\u043A\u0430\u043C\u0438; `pad` = \u043A\u0430\u043A \u0443 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043F\u043E\u043B\u0435\u0439 (`--dd-pad`). */\n insetGap?: PopoverInsetGap;\n /**\n * \u041F\u043E\u0434\u043D\u044F\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u043D\u0430\u0434 \u0432\u044B\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u043C \u0441\u043F\u0438\u0441\u043A\u043E\u043C \u0442\u043E\u0433\u043E \u0436\u0435 \u0441\u043B\u043E\u044F (dropdown 1200 > popover 1000).\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435, \u0435\u0441\u043B\u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0432\u043D\u0443\u0442\u0440\u0438 Select/TagSelect listbox \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u043E\u0433\u043E dropdown.\n */\n stackAboveDropdown?: boolean;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction PopoverContent({\n align = \"start\",\n side = \"bottom\",\n sameMinWidthAsTrigger = false,\n size = \"m\",\n trapFocus = false,\n insetPadding = \"none\",\n insetGap = \"pad\",\n stackAboveDropdown = false,\n children,\n className,\n}: PopoverContentProps) {\n const { isOpen, onClose, triggerRef, contentId, triggerId, closeOnOutsideClick } =\n usePopoverContext();\n const overlayPortalLayer = useOverlayPortalLayer();\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const presence = usePresence(isOpen, { exitDuration: \"fast\" });\n\n const layout = usePopoverPosition({\n // Keeps its position while the exit animation plays.\n open: presence.mounted,\n triggerRef,\n contentRef,\n side,\n align,\n sameMinWidthAsTrigger,\n });\n\n const trapRef = useFocusTrap<HTMLDivElement>({\n enabled: isOpen && trapFocus,\n restoreFocus: true,\n });\n const ref = React.useMemo(() => mergeRefs(contentRef, trapRef), [trapRef]);\n\n // Overlay contract: Escape closes the panel and returns focus to the trigger when it was inside\n // the panel. An outside press only closes it: focus follows the pointer (foundation \u00A78).\n const dismiss = React.useCallback(() => {\n const active = document.activeElement;\n if (!active || active === document.body || contentRef.current?.contains(active)) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n onClose();\n }, [onClose, triggerRef]);\n useEscapeKey({ enabled: isOpen, onEscape: dismiss });\n useOutsideClick({\n refs: [triggerRef, contentRef],\n enabled: isOpen,\n onOutsideClick: () => {\n if (closeOnOutsideClick) onClose();\n },\n });\n\n const titleId = `${contentId}-title`;\n const descriptionId = `${contentId}-description`;\n const [hasTitle, setHasTitle] = React.useState(false);\n const [hasDescription, setHasDescription] = React.useState(false);\n const slots = React.useMemo(\n () => ({ titleId, descriptionId, setHasTitle, setHasDescription }),\n [titleId, descriptionId],\n );\n\n if (!presence.mounted) return null;\n\n return (\n <Portal>\n <ControlSizeProvider value={size}>\n <PopoverSlotsContext.Provider value={slots}>\n <ScrollContainer\n ref={ref}\n id={contentId}\n role=\"dialog\"\n aria-modal={false}\n aria-labelledby={hasTitle ? titleId : triggerRef.current?.id || triggerId}\n aria-describedby={hasDescription ? descriptionId : undefined}\n data-react-aria-top-layer=\"true\"\n data-overlay-portal-layer={overlayPortalLayer}\n data-overlay-stack={stackAboveDropdown ? \"above-dropdown\" : undefined}\n data-side={layout?.resolvedSide ?? side}\n data-state={presence.state}\n data-size={size}\n data-inset-padding={insetPadding}\n data-inset-gap={insetGap}\n className={cx(styles.popoverScroll, overlayMotion.floating, className)}\n style={layout?.style}\n onAnimationEnd={presence.onExitEnd}\n >\n {children}\n </ScrollContainer>\n </PopoverSlotsContext.Provider>\n </ControlSizeProvider>\n </Portal>\n );\n}\nPopoverContent.displayName = \"PopoverContent\";\n\n// \u2500\u2500\u2500 Header / Title / Description / Actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype PopoverSlots = {\n titleId: string;\n descriptionId: string;\n setHasTitle: (v: boolean) => void;\n setHasDescription: (v: boolean) => void;\n};\n\nconst PopoverSlotsContext = React.createContext<PopoverSlots | null>(null);\n\nexport type PopoverHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A + \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441 \u043F\u043B\u043E\u0442\u043D\u044B\u043C \u0448\u0430\u0433\u043E\u043C (4px) \u0432\u043D\u0443\u0442\u0440\u0438 \u043F\u0430\u043D\u0435\u043B\u0438. */\nfunction PopoverHeader({ className, ...rest }: PopoverHeaderProps) {\n return <div className={cx(styles.header, className)} {...rest} />;\n}\nPopoverHeader.displayName = \"PopoverHeader\";\n\nexport type PopoverTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u043F\u0430\u043D\u0435\u043B\u0438; \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C \u0438\u043C\u0435\u043D\u0435\u043C \u0434\u0438\u0430\u043B\u043E\u0433\u0430 (`aria-labelledby`). */\nfunction PopoverTitle({ className, id, ...rest }: PopoverTitleProps) {\n const slots = React.useContext(PopoverSlotsContext);\n const setHasTitle = slots?.setHasTitle;\n React.useLayoutEffect(() => {\n if (!setHasTitle || id) return;\n setHasTitle(true);\n return () => setHasTitle(false);\n }, [setHasTitle, id]);\n return <h2 id={id ?? slots?.titleId} className={cx(styles.title, className)} {...rest} />;\n}\nPopoverTitle.displayName = \"PopoverTitle\";\n\nexport type PopoverDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nfunction PopoverDescription({ className, id, ...rest }: PopoverDescriptionProps) {\n const slots = React.useContext(PopoverSlotsContext);\n const setHasDescription = slots?.setHasDescription;\n React.useLayoutEffect(() => {\n if (!setHasDescription || id) return;\n setHasDescription(true);\n return () => setHasDescription(false);\n }, [setHasDescription, id]);\n return (\n <p id={id ?? slots?.descriptionId} className={cx(styles.description, className)} {...rest} />\n );\n}\nPopoverDescription.displayName = \"PopoverDescription\";\n\nexport type PopoverActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** \u041A\u043D\u043E\u043F\u043A\u0438 \u0432\u043D\u0438\u0437\u0443 \u043F\u0430\u043D\u0435\u043B\u0438: \u0441\u043F\u0440\u0430\u0432\u0430, `gap: 8`; \u043D\u0430 \u0443\u0437\u043A\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438 \u2014 \u0432 \u043A\u043E\u043B\u043E\u043D\u043A\u0443 \u043D\u0430 \u0432\u0441\u044E \u0448\u0438\u0440\u0438\u043D\u0443. */\nfunction PopoverActions({ className, ...rest }: PopoverActionsProps) {\n return <div className={cx(styles.actions, className)} {...rest} />;\n}\nPopoverActions.displayName = \"PopoverActions\";\n\nexport const Popover = {\n Root: PopoverRoot,\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n Header: PopoverHeader,\n Title: PopoverTitle,\n Description: PopoverDescription,\n Actions: PopoverActions,\n};\n", "/* \u2500\u2500\u2500 Popover \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Shared floating panel surface: raised fill, `--prime-panel-radius`, overlay shadow.\n * Free-form content gets `--prime-panel-content-padding`; one ScrollContainer = surface + scroll.\n */\n\n.popoverScroll {\n --po-pad: var(--prime-panel-content-padding);\n --po-inset-extra: 0px;\n --po-gap: var(--prime-space-3);\n --po-text: var(--prime-control-m-text-size);\n --po-lh: var(--prime-control-m-line-height);\n --po-desc: var(--prime-control-m-label-size);\n --po-desc-lh: var(--prime-control-m-label-line-height);\n /* Fields inside a raised surface stay distinguishable (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n --prime-color-card-bg: var(--prime-color-bg-sunken);\n --prime-card-shadow: none;\n\n position: fixed;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--po-gap);\n width: max-content;\n min-width: min(\n max(var(--prime-panel-min-width), var(--float-min-w, 0px)),\n var(--float-max-w, 100vw)\n );\n max-width: min(calc(var(--prime-panel-min-width) * 2), var(--float-max-w, 100vw));\n margin: 0;\n padding: calc(var(--po-pad) + var(--po-inset-extra));\n border: 0;\n border-radius: var(--prime-panel-radius);\n /* Avatar.Group rings match this surface. */\n --avatar-ring: var(--prime-color-bg-raised);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--po-text);\n line-height: var(--po-lh);\n outline: none;\n}\n\n.popoverScroll[data-size=\"xs\"] {\n --po-pad: var(--prime-space-3);\n --po-gap: var(--prime-space-2);\n --po-text: var(--prime-control-xs-text-size);\n --po-lh: var(--prime-control-xs-line-height);\n --po-desc: var(--prime-control-xs-label-size);\n --po-desc-lh: var(--prime-control-xs-label-line-height);\n}\n\n.popoverScroll[data-size=\"s\"] {\n --po-pad: var(--prime-space-3);\n --po-gap: var(--prime-space-2);\n --po-text: var(--prime-control-s-text-size);\n --po-lh: var(--prime-control-s-line-height);\n --po-desc: var(--prime-control-s-label-size);\n --po-desc-lh: var(--prime-control-s-label-line-height);\n}\n\n.popoverScroll[data-size=\"l\"] {\n --po-gap: var(--prime-space-4);\n --po-text: var(--prime-control-l-text-size);\n --po-lh: var(--prime-control-l-line-height);\n --po-desc: var(--prime-control-l-label-size);\n --po-desc-lh: var(--prime-control-l-label-line-height);\n}\n\n.popoverScroll[data-size=\"xl\"] {\n --po-pad: var(--prime-space-5);\n --po-gap: var(--prime-space-4);\n --po-text: var(--prime-control-xl-text-size);\n --po-lh: var(--prime-control-xl-line-height);\n --po-desc: var(--prime-control-xl-label-size);\n --po-desc-lh: var(--prime-control-xl-label-line-height);\n}\n\n.popoverScroll[data-inset-padding=\"x1\"] {\n --po-inset-extra: var(--prime-space-1);\n}\n\n.popoverScroll[data-inset-padding=\"x2\"] {\n --po-inset-extra: var(--prime-space-2);\n}\n\n.popoverScroll[data-inset-padding=\"x3\"] {\n --po-inset-extra: var(--prime-space-3);\n}\n\n.popoverScroll[data-inset-gap=\"none\"] {\n --po-gap: 0;\n}\n\n.popoverScroll[data-inset-gap=\"x2\"] {\n --po-gap: var(--prime-space-2);\n}\n\n.popoverScroll[data-inset-gap=\"x3\"] {\n --po-gap: var(--prime-space-3);\n}\n\n.popoverScroll[data-inset-gap=\"x4\"] {\n --po-gap: var(--prime-space-4);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"page\"] {\n z-index: var(--prime-z-popover);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"drawer\"] {\n z-index: var(--prime-z-popover-in-drawer);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"modal\"] {\n z-index: var(--prime-z-popover-in-modal);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"drawerInModal\"] {\n z-index: var(--prime-z-popover-in-drawer-in-modal);\n}\n\n/* \u041F\u043E\u0432\u0435\u0440\u0445 listbox/dropdown \u0442\u043E\u0433\u043E \u0436\u0435 \u0441\u043B\u043E\u044F (\u0438\u043D\u0430\u0447\u0435 dropdown 1200 > popover 1000 \u043D\u0430 page). \u0423\u0440\u043E\u0432\u043D\u0438 \u043A\u0430\u043A \u0443 tooltip. */\n.popoverScroll[data-overlay-portal-layer=\"page\"][data-overlay-stack=\"above-dropdown\"] {\n z-index: var(--prime-z-tooltip);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"drawer\"][data-overlay-stack=\"above-dropdown\"] {\n z-index: var(--prime-z-tooltip-in-drawer);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"modal\"][data-overlay-stack=\"above-dropdown\"] {\n z-index: var(--prime-z-tooltip-in-modal);\n}\n\n.popoverScroll[data-overlay-portal-layer=\"drawerInModal\"][data-overlay-stack=\"above-dropdown\"] {\n z-index: var(--prime-z-tooltip-in-drawer-in-modal);\n}\n\n/* \u2500\u2500\u2500 Title / description / actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.header {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--prime-color-text-primary);\n /* Title and description follow the panel tier, like the controls inside it. */\n font-size: var(--po-text);\n font-weight: var(--prime-text-title-s-weight);\n line-height: var(--po-lh);\n letter-spacing: var(--prime-text-title-s-tracking);\n}\n\n.description {\n margin: 0;\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--prime-color-text-secondary);\n font-size: var(--po-desc);\n line-height: var(--po-desc-lh);\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--prime-space-2);\n padding-block-start: var(--prime-space-1);\n}\n\n/* \u0423\u0437\u043A\u0430\u044F \u043F\u0430\u043D\u0435\u043B\u044C (320px): \u043A\u043D\u043E\u043F\u043A\u0438 \u0432 \u043A\u043E\u043B\u043E\u043D\u043A\u0443 \u043D\u0430 \u0432\u0441\u044E \u0448\u0438\u0440\u0438\u043D\u0443, \u043E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u2014 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439. */\n@media (max-width: 479px) {\n .actions {\n flex-direction: column;\n align-items: stretch;\n }\n}\n", "import * as React from \"react\";\n\nimport type { PositionAlign, PositionSide } from \"@/hooks/usePosition\";\nimport {\n computeFloatingPosition,\n FLOAT_MAX_WIDTH_VAR,\n FLOAT_MIN_WIDTH_VAR,\n} from \"@/hooks/usePosition\";\nimport { getScrollContainers } from \"@/internal/scrollAncestors\";\n\nimport {\n getPopoverMaxHeightForAnchorSide,\n getPopoverPanelOffsetPx,\n getPopoverViewportPadPx,\n} from \"./popoverGeometry\";\n\nexport type PopoverLayout = {\n style: React.CSSProperties;\n resolvedSide: PositionSide;\n};\n\ntype Params = {\n open: boolean;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLDivElement | null>;\n side: PositionSide;\n align: PositionAlign;\n sameMinWidthAsTrigger: boolean;\n};\n\nfunction layoutEqual(a: PopoverLayout, b: PopoverLayout): boolean {\n return (\n a.resolvedSide === b.resolvedSide &&\n a.style.top === b.style.top &&\n a.style.left === b.style.left &&\n a.style.maxHeight === b.style.maxHeight &&\n a.style.minWidth === b.style.minWidth &&\n (a.style as Record<string, unknown>)[FLOAT_MAX_WIDTH_VAR] ===\n (b.style as Record<string, unknown>)[FLOAT_MAX_WIDTH_VAR] &&\n (a.style as Record<string, unknown>)[FLOAT_MIN_WIDTH_VAR] ===\n (b.style as Record<string, unknown>)[FLOAT_MIN_WIDTH_VAR] &&\n a.style.width === b.style.width &&\n a.style.boxSizing === b.style.boxSizing\n );\n}\n\n/** \u041F\u043E\u0437\u0438\u0446\u0438\u044F + max-height \u043E\u0434\u043D\u0438\u043C \u043F\u0440\u043E\u0445\u043E\u0434\u043E\u043C; resize / scroll-\u043F\u0440\u0435\u0434\u043A\u0438 / ResizeObserver / visualViewport. */\nexport function usePopoverPosition({\n open,\n triggerRef,\n contentRef,\n side,\n align,\n sameMinWidthAsTrigger,\n}: Params): PopoverLayout | null {\n const [layout, setLayout] = React.useState<PopoverLayout | null>(null);\n\n const commit = React.useCallback(() => {\n const trigger = triggerRef.current;\n const panel = contentRef.current;\n if (!trigger || !panel) return;\n\n const anchorRect = trigger.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const panelOffset = getPopoverPanelOffsetPx();\n const viewportPad = getPopoverViewportPadPx();\n const pos = computeFloatingPosition(anchorRect, panel.offsetWidth, panel.offsetHeight, vw, vh, {\n preferredSide: side,\n align,\n offset: panelOffset,\n viewportPad,\n flip: true,\n matchTriggerMinWidth: sameMinWidthAsTrigger,\n });\n\n const anchorW = Math.round(anchorRect.width);\n const matchTriggerBox =\n sameMinWidthAsTrigger && anchorW > 0\n ? { width: anchorW, minWidth: anchorW, boxSizing: \"border-box\" as const }\n : pos.minWidth !== undefined\n ? { [FLOAT_MIN_WIDTH_VAR]: `${pos.minWidth}px` }\n : {};\n\n const next: PopoverLayout = {\n resolvedSide: pos.resolvedSide,\n style: {\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n maxHeight: getPopoverMaxHeightForAnchorSide(\n anchorRect,\n pos.resolvedSide,\n vh,\n panelOffset,\n viewportPad,\n ),\n [FLOAT_MAX_WIDTH_VAR]: `${pos.maxWidth}px`,\n ...matchTriggerBox,\n } as unknown as React.CSSProperties,\n };\n\n setLayout((prev) => (prev && layoutEqual(prev, next) ? prev : next));\n }, [triggerRef, contentRef, side, align, sameMinWidthAsTrigger]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setLayout(null);\n return;\n }\n\n let rafCoalesce = 0;\n const schedule = () => {\n cancelAnimationFrame(rafCoalesce);\n rafCoalesce = requestAnimationFrame(commit);\n };\n\n commit();\n const rafFollowUp = requestAnimationFrame(commit);\n\n window.addEventListener(\"resize\", schedule);\n const scrollTargets = getScrollContainers(triggerRef.current);\n for (const t of scrollTargets) {\n t.addEventListener(\"scroll\", schedule, { passive: true });\n }\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n\n const panel = contentRef.current;\n const ro = panel ? new ResizeObserver(schedule) : null;\n if (panel && ro) ro.observe(panel);\n\n return () => {\n cancelAnimationFrame(rafFollowUp);\n cancelAnimationFrame(rafCoalesce);\n window.removeEventListener(\"resize\", schedule);\n for (const t of scrollTargets) {\n t.removeEventListener(\"scroll\", schedule);\n }\n vv?.removeEventListener(\"resize\", schedule);\n ro?.disconnect();\n };\n }, [open, commit, triggerRef, contentRef]);\n\n return layout;\n}\n", "import { getPanelOffsetPx, getViewportPadPx, type PositionSide } from \"@/hooks/usePosition\";\n\nexport const POPOVER_MIN_MAX_HEIGHT = 120;\n\nexport function getPopoverMaxHeightForAnchorSide(\n anchor: DOMRectReadOnly,\n side: PositionSide,\n viewportHeight: number,\n panelOffsetPx: number,\n viewportPadPx: number,\n): number {\n const raw =\n side === \"bottom\"\n ? viewportHeight - anchor.bottom - panelOffsetPx - viewportPadPx\n : anchor.top - panelOffsetPx - viewportPadPx;\n return Math.floor(Math.max(POPOVER_MIN_MAX_HEIGHT, raw));\n}\n\nexport function getPopoverPanelOffsetPx(): number {\n return getPanelOffsetPx();\n}\n\nexport function getPopoverViewportPadPx(): number {\n return getViewportPadPx();\n}\n", "/*\n * ColorPresets \u2014 quick color pick: a square swatch trigger + a popover grid of preset swatches.\n * Tier T: trigger = control height \u00B7 swatch = item-height \u2212 8 (16 \u00B7 20 \u00B7 24 \u00B7 28 \u00B7 32) \u00B7\n * gap = control gap \u00B7 swatch radius steps with size (4 \u00B7 6 \u00B7 6 \u00B7 8 \u00B7 8).\n * Every color surface carries a faint inner ring so white / near-background colors stay visible.\n */\n\n/* ---- Shared color layers ---- */\n.fill,\n.checker {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* \"No color\": transparency checkerboard, 4 \u00D7 4 cells at any size. */\n.checker {\n background:\n repeating-conic-gradient(\n var(--prime-color-bg-surface) 0deg 90deg,\n var(--prime-color-fill-strong) 90deg 180deg\n )\n 0 0 / 50% 50%;\n}\n\n/* ---- Trigger: square swatch button of the tier height ---- */\n.trigger {\n --cpr-size: var(--prime-control-m-height);\n --cpr-radius: var(--prime-control-m-radius);\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--cpr-size);\n height: var(--cpr-size);\n margin: 0;\n padding: 0;\n overflow: hidden;\n border: 0;\n border-radius: var(--cpr-radius);\n background: var(--prime-color-field-bg);\n cursor: pointer;\n transition: transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.trigger[data-size=\"xs\"] {\n --cpr-size: var(--prime-control-xs-height);\n --cpr-radius: var(--prime-control-xs-radius);\n}\n\n.trigger[data-size=\"s\"] {\n --cpr-size: var(--prime-control-s-height);\n --cpr-radius: var(--prime-control-s-radius);\n}\n\n.trigger[data-size=\"l\"] {\n --cpr-size: var(--prime-control-l-height);\n --cpr-radius: var(--prime-control-l-radius);\n}\n\n.trigger[data-size=\"xl\"] {\n --cpr-size: var(--prime-control-xl-height);\n --cpr-radius: var(--prime-control-xl-radius);\n}\n\n/* Inner edge above the color layer; darkens on hover / open. */\n.trigger::after,\n.option::after,\n.swatch::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-subtle-active);\n pointer-events: none;\n transition: box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.trigger:hover:not(:disabled)::after,\n.trigger[data-state=\"open\"]::after {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-fill-strong);\n}\n\n.trigger:active:not(:disabled) {\n transform: scale(0.98);\n}\n\n.trigger:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.trigger:disabled {\n cursor: not-allowed;\n filter: grayscale(1);\n opacity: 0.5;\n}\n\n/* ---- Swatch for custom triggers (follows the host icon size) ---- */\n.swatch {\n position: relative;\n box-sizing: border-box;\n display: inline-block;\n flex-shrink: 0;\n width: var(--prime-icon-size, var(--prime-control-m-icon));\n height: var(--prime-icon-size, var(--prime-control-m-icon));\n overflow: hidden;\n border-radius: var(--prime-radius-xs);\n vertical-align: middle;\n}\n\n/* ---- Panel: section label + swatch grid ---- */\n.label {\n color: var(--prime-color-text-secondary);\n font-size: var(--prime-control-m-label-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-control-m-label-line-height);\n}\n\n.label[data-size=\"xs\"],\n.label[data-size=\"s\"] {\n font-size: var(--prime-control-xs-label-size);\n line-height: var(--prime-control-xs-label-line-height);\n}\n\n.label[data-size=\"l\"],\n.label[data-size=\"xl\"] {\n font-size: var(--prime-control-l-label-size);\n line-height: var(--prime-control-l-label-line-height);\n}\n\n.grid {\n --cpr-swatch: calc(var(--prime-control-m-item-height) - var(--prime-space-2));\n --cpr-swatch-radius: var(--prime-radius-s);\n display: grid;\n grid-template-columns: repeat(var(--cpr-columns, 8), var(--cpr-swatch));\n justify-content: start;\n gap: var(--prime-control-m-gap);\n outline: none;\n}\n\n.grid[data-size=\"xs\"] {\n --cpr-swatch: calc(var(--prime-control-xs-item-height) - var(--prime-space-2));\n --cpr-swatch-radius: var(--prime-radius-xs);\n gap: var(--prime-control-xs-gap);\n}\n\n.grid[data-size=\"s\"] {\n --cpr-swatch: calc(var(--prime-control-s-item-height) - var(--prime-space-2));\n gap: var(--prime-control-s-gap);\n}\n\n.grid[data-size=\"l\"] {\n --cpr-swatch: calc(var(--prime-control-l-item-height) - var(--prime-space-2));\n --cpr-swatch-radius: var(--prime-radius-m);\n gap: var(--prime-control-l-gap);\n}\n\n.grid[data-size=\"xl\"] {\n --cpr-swatch: calc(var(--prime-control-xl-item-height) - var(--prime-space-2));\n --cpr-swatch-radius: var(--prime-radius-m);\n gap: var(--prime-control-xl-gap);\n}\n\n.option {\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--cpr-swatch);\n height: var(--cpr-swatch);\n border-radius: var(--cpr-swatch-radius);\n cursor: pointer;\n transition: transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* Color layers are clipped to the swatch radius; the ring outside stays visible. */\n.option > .fill,\n.option > .checker {\n border-radius: inherit;\n overflow: hidden;\n}\n\n.option:hover {\n transform: scale(1.08);\n}\n\n/* Selected: 2px accent ring with a 2px gap + check mark. */\n.option[data-selected] {\n outline: var(--prime-focus-width) solid var(--prime-color-accent-default);\n outline-offset: var(--prime-focus-offset);\n}\n\n.option:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.option:focus:not(:focus-visible):not([data-selected]) {\n outline: none;\n}\n\n/* Check mark contrasts with the swatch in both themes: light on dark colors, dark on light ones. */\n.check {\n position: relative;\n z-index: 1;\n width: 62.5%;\n height: 62.5%;\n color: var(--prime-color-control-thumb);\n pointer-events: none;\n}\n\n.option[data-contrast=\"dark\"] .check {\n color: var(--prime-color-palette-yellow-solid-fg);\n}\n", "import * as React from \"react\";\n\nimport modalShellStyles from \"@/components/modal/DialogParts.module.css\";\nimport { Modal, type ModalContentProps, type ModalRootProps } from \"@/components/modal/Modal\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport scrollContainerStyles from \"@/components/scroll-container/ScrollContainer.module.css\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Variant } from \"@/internal/states\";\nimport styles from \"./CommandMenu.module.css\";\n\n// \u2500\u2500\u2500 Filtering & item registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype ItemEntry = {\n id: string;\n order: number;\n value: string;\n keywords: string;\n disabled: boolean;\n groupId: string;\n onSelectRef: React.MutableRefObject<(() => void) | undefined>;\n};\n\nfunction normalize(s: string): string {\n return s.trim().toLowerCase();\n}\n\nfunction matchesQuery(entry: ItemEntry, query: string): boolean {\n if (!query) return true;\n const q = normalize(query);\n const hay = `${normalize(entry.value)} ${normalize(entry.keywords)}`;\n return hay.includes(q);\n}\n\nexport type CommandMenuLabels = {\n /** Default placeholder and accessible name of `CommandMenu.Input`. */\n search: string;\n /** `CommandMenu.Empty`: nothing matches the query. */\n empty: string;\n /** Second line of `CommandMenu.Empty`. */\n emptyHint: string;\n};\n\nconst COMMAND_MENU_LABELS: CommandMenuLabels = {\n search: \"\u041F\u043E\u0438\u0441\u043A\",\n empty: \"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E\",\n emptyHint: \"\u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0437\u0430\u043F\u0440\u043E\u0441\",\n};\n\n// \u2500\u2500\u2500 Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype CommandMenuContextValue = {\n labels: CommandMenuLabels;\n search: string;\n setSearch: React.Dispatch<React.SetStateAction<string>>;\n listboxId: string;\n activeId: string | null;\n setActiveId: React.Dispatch<React.SetStateAction<string | null>>;\n registerItem: (\n id: string,\n patch: Omit<ItemEntry, \"id\" | \"order\" | \"onSelectRef\"> & {\n onSelectRef: ItemEntry[\"onSelectRef\"];\n },\n ) => () => void;\n visibleIds: string[];\n itemGet: (id: string) => ItemEntry | undefined;\n moveActive: (delta: number) => void;\n activateSelected: () => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n};\n\nconst [CommandMenuProvider, useCommandMenuContext] =\n createComponentContext<CommandMenuContextValue>(\"CommandMenu\");\n\nconst CommandMenuGroupContext = React.createContext<string>(\"\");\n\nfunction CommandMenuRootProvider({\n labels,\n children,\n}: {\n labels: CommandMenuLabels;\n children: React.ReactNode;\n}) {\n const listboxId = React.useId();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const itemsRef = React.useRef<Map<string, ItemEntry>>(new Map());\n const orderSeqRef = React.useRef(0);\n const orderMapRef = React.useRef<Map<string, number>>(new Map());\n const [version, bump] = React.useReducer((n: number) => n + 1, 0);\n\n const [search, setSearch] = React.useState(\"\");\n const [activeId, setActiveId] = React.useState<string | null>(null);\n\n React.useLayoutEffect(() => {\n orderSeqRef.current = 0;\n orderMapRef.current.clear();\n }, []);\n\n React.useEffect(() => {\n setSearch(\"\");\n setActiveId(null);\n const id = requestAnimationFrame(() => inputRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }, []);\n\n const registerItem = React.useCallback(\n (\n id: string,\n patch: Omit<ItemEntry, \"id\" | \"order\" | \"onSelectRef\"> & {\n onSelectRef: ItemEntry[\"onSelectRef\"];\n },\n ) => {\n let order = orderMapRef.current.get(id);\n if (order === undefined) {\n order = orderSeqRef.current++;\n orderMapRef.current.set(id, order);\n }\n itemsRef.current.set(id, { ...patch, id, order });\n bump();\n return () => {\n itemsRef.current.delete(id);\n bump();\n };\n },\n [],\n );\n\n const visibleIds = React.useMemo(() => {\n void version;\n const list = [...itemsRef.current.values()].sort((a, b) => a.order - b.order);\n return list\n .filter((e) => matchesQuery(e, search))\n .filter((e) => !e.disabled)\n .map((e) => e.id);\n }, [search, version]);\n\n const itemGet = React.useCallback((id: string) => itemsRef.current.get(id), []);\n\n React.useLayoutEffect(() => {\n setActiveId((prev) => {\n if (visibleIds.length === 0) return null;\n if (prev && visibleIds.includes(prev)) return prev;\n return visibleIds[0] ?? null;\n });\n }, [visibleIds]);\n\n const moveActive = React.useCallback(\n (delta: number) => {\n if (visibleIds.length === 0) return;\n setActiveId((prev) => {\n const idx = prev ? visibleIds.indexOf(prev) : -1;\n const next = idx < 0 ? 0 : (idx + delta + visibleIds.length) % visibleIds.length;\n return visibleIds[next] ?? null;\n });\n },\n [visibleIds],\n );\n\n const activateSelected = React.useCallback(() => {\n if (!activeId) return;\n itemsRef.current.get(activeId)?.onSelectRef.current?.();\n }, [activeId]);\n\n const value = React.useMemo(\n () => ({\n labels,\n search,\n setSearch,\n listboxId,\n activeId,\n setActiveId,\n registerItem,\n visibleIds,\n itemGet,\n moveActive,\n activateSelected,\n inputRef,\n }),\n [\n labels,\n search,\n listboxId,\n activeId,\n registerItem,\n visibleIds,\n itemGet,\n moveActive,\n activateSelected,\n ],\n );\n\n return <CommandMenuProvider value={value}>{children}</CommandMenuProvider>;\n}\n\n// \u2500\u2500\u2500 Dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuDialogProps = Pick<\n ModalRootProps,\n \"open\" | \"defaultOpen\" | \"onOpenChange\" | \"closeOnEscape\" | \"closeOnOutsideClick\"\n> &\n Pick<\n ModalContentProps,\n | \"children\"\n | \"className\"\n | \"overlayClassName\"\n | \"aria-label\"\n | \"aria-labelledby\"\n | \"aria-describedby\"\n > & {\n /** Tier of the list rows and the search row: item height, text, icon. Default `m`. */\n size?: ControlSize;\n labels?: Partial<CommandMenuLabels>;\n };\n\nfunction CommandMenuDialog({\n children,\n overlayClassName,\n className,\n open,\n defaultOpen,\n onOpenChange,\n closeOnEscape = true,\n closeOnOutsideClick = true,\n size = \"m\",\n labels: labelsProp,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n}: CommandMenuDialogProps) {\n const labels = React.useMemo(() => ({ ...COMMAND_MENU_LABELS, ...labelsProp }), [labelsProp]);\n return (\n <Modal.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n closeOnEscape={closeOnEscape}\n closeOnOutsideClick={closeOnOutsideClick}\n >\n <Modal.Content\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n aria-labelledby={ariaLabelledBy}\n className={cx(styles.dialogContent, styles.root, className)}\n overlayClassName={cx(\n scrollContainerStyles.root,\n scrollContainerStyles.vertical,\n scrollContainerStyles.flexItem,\n scrollContainerStyles.touch,\n scrollContainerStyles.overscrollContain,\n styles.dialogOverlay,\n overlayClassName,\n )}\n >\n {/* `display: contents`: carries the tier variables without breaking the panel's flex column. */}\n <div className={styles.tier} data-size={size}>\n <ControlSizeProvider value={size}>\n <CommandMenuRootProvider labels={labels}>{children}</CommandMenuRootProvider>\n </ControlSizeProvider>\n </div>\n </Modal.Content>\n </Modal.Root>\n );\n}\n\nfunction CommandMenuDialogTitle({ className, ...rest }: React.HTMLAttributes<HTMLHeadingElement>) {\n return <h2 className={cx(modalShellStyles.title, styles.dialogTitle, className)} {...rest} />;\n}\n\nfunction CommandMenuDialogDescription({\n className,\n ...rest\n}: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n className={cx(modalShellStyles.description, styles.dialogDescription, className)}\n {...rest}\n />\n );\n}\n\n// \u2500\u2500\u2500 Input row + input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuInputRowProps = React.HTMLAttributes<HTMLDivElement> & {\n /** \u0421\u043B\u043E\u0442 \u0441\u043B\u0435\u0432\u0430; \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0438\u043A\u043E\u043D\u043A\u0430 \u043F\u043E\u0438\u0441\u043A\u0430. `null` \u2014 \u0431\u0435\u0437 \u0438\u043A\u043E\u043D\u043A\u0438. */\n leading?: React.ReactNode;\n trailing?: React.ReactNode;\n};\n\n/** Search row; its height follows the Dialog `size` (taller on `l` / `xl`). */\nfunction CommandMenuInputRow({\n leading,\n trailing,\n children,\n className,\n ...rest\n}: CommandMenuInputRowProps) {\n return (\n // The search field is the permanent focus of the palette: no ring (foundation \u00A77).\n <div className={cx(styles.inputRow, className)} data-focus-ring=\"false\" {...rest}>\n {leading === undefined ? <SearchGlyph className={styles.inputIcon} /> : leading}\n {children}\n {trailing}\n </div>\n );\n}\n\nfunction SearchGlyph({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n cx=\"11\"\n cy=\"11\"\n r=\"6.5\"\n stroke=\"currentColor\"\n strokeWidth={1.7}\n vectorEffect=\"non-scaling-stroke\"\n />\n <path\n d=\"M16 16l4 4\"\n stroke=\"currentColor\"\n strokeWidth={1.7}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\nexport type CommandMenuInputProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"type\"\n> & {\n /** Called with the new query; native `onChange` still fires. */\n onValueChange?: (value: string) => void;\n};\n\nconst CommandMenuInput = React.forwardRef<HTMLInputElement, CommandMenuInputProps>(\n (\n {\n className,\n onKeyDown,\n value: valueProp,\n onChange,\n onValueChange,\n placeholder,\n \"aria-label\": ariaLabel,\n ...rest\n },\n forwardedRef,\n ) => {\n const {\n labels,\n search,\n setSearch,\n listboxId,\n activeId,\n moveActive,\n activateSelected,\n inputRef,\n setActiveId,\n visibleIds,\n } = useCommandMenuContext();\n\n const isControlled = valueProp !== undefined;\n\n React.useEffect(() => {\n if (isControlled) {\n setSearch(valueProp !== undefined && valueProp !== null ? String(valueProp) : \"\");\n }\n }, [isControlled, valueProp, setSearch]);\n\n const setRefs = React.useCallback(\n (node: HTMLInputElement | null) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef, inputRef],\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n if (!isControlled) {\n setSearch(e.target.value);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n moveActive(1);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n moveActive(-1);\n return;\n }\n if (e.key === \"Home\") {\n e.preventDefault();\n if (visibleIds[0]) setActiveId(visibleIds[0]);\n return;\n }\n if (e.key === \"End\") {\n e.preventDefault();\n const last = visibleIds[visibleIds.length - 1];\n if (last) setActiveId(last);\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n activateSelected();\n }\n };\n\n return (\n <input\n {...rest}\n ref={setRefs}\n type=\"search\"\n placeholder={placeholder ?? labels.search}\n aria-label={ariaLabel ?? (rest[\"aria-labelledby\"] ? undefined : labels.search)}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId ? `${activeId}-option` : undefined}\n className={cx(styles.input, className)}\n value={isControlled ? valueProp : search}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n />\n );\n },\n);\n\nCommandMenuInput.displayName = \"CommandMenu.Input\";\n\n// \u2500\u2500\u2500 List \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuListProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst CommandMenuList = React.forwardRef<HTMLDivElement, CommandMenuListProps>(\n ({ className, children, ...rest }, ref) => {\n const { listboxId } = useCommandMenuContext();\n\n return (\n <ScrollContainer\n ref={ref}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable={false}\n className={cx(styles.list, className)}\n {...rest}\n >\n {children}\n </ScrollContainer>\n );\n },\n);\n\nCommandMenuList.displayName = \"CommandMenu.List\";\n\n// \u2500\u2500\u2500 Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n heading?: React.ReactNode;\n};\n\nfunction CommandMenuGroup({ heading, className, children, ...rest }: CommandMenuGroupProps) {\n const groupId = React.useId();\n const { visibleIds, itemGet } = useCommandMenuContext();\n\n const hasVisible = visibleIds.some((id) => itemGet(id)?.groupId === groupId);\n const hasHeading = heading !== undefined && heading !== null;\n const headingId = `${groupId}-heading`;\n\n return (\n <CommandMenuGroupContext.Provider value={groupId}>\n {/* biome-ignore lint/a11y/useSemanticElements: role=\"group\" \u0432\u043D\u0443\u0442\u0440\u0438 role=\"listbox\"; <fieldset> \u0442\u0430\u043C \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C */}\n <div\n role=\"group\"\n aria-labelledby={hasHeading ? headingId : undefined}\n className={cx(styles.group, className)}\n hidden={hasVisible ? undefined : true}\n {...rest}\n >\n {hasHeading ? (\n typeof heading === \"string\" ? (\n <div id={headingId} className={styles.groupHeading}>\n {heading}\n </div>\n ) : (\n <div id={headingId} className={styles.groupHeadingRich}>\n {heading}\n </div>\n )\n ) : null}\n {children}\n </div>\n </CommandMenuGroupContext.Provider>\n );\n}\n\n// \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuItemProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onSelect\"\n> & {\n /** Text matched with `keywords`; with `\"\"` the item shows only while the query is empty or `keywords` match. */\n value: string;\n keywords?: string;\n onSelect?: () => void;\n};\n\nconst CommandMenuItem = React.forwardRef<HTMLButtonElement, CommandMenuItemProps>(\n (\n { className, value, keywords = \"\", disabled, onSelect, onClick, onPointerMove, ...rest },\n forwardedRef,\n ) => {\n const id = React.useId();\n const optionId = `${id}-option`;\n const groupId = React.useContext(CommandMenuGroupContext);\n const { registerItem, activeId, setActiveId, visibleIds } = useCommandMenuContext();\n const onSelectRef = React.useRef(onSelect);\n\n React.useEffect(() => {\n onSelectRef.current = onSelect;\n }, [onSelect]);\n\n React.useLayoutEffect(() => {\n return registerItem(id, {\n value,\n keywords,\n disabled: Boolean(disabled),\n groupId,\n onSelectRef,\n });\n }, [id, value, keywords, disabled, groupId, registerItem]);\n\n const filteredIn = visibleIds.includes(id);\n const selected = activeId === id;\n const listRef = React.useRef<HTMLButtonElement>(null);\n\n const setRefs = React.useCallback(\n (node: HTMLButtonElement | null) => {\n listRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef],\n );\n\n React.useEffect(() => {\n if (selected && listRef.current) {\n listRef.current.scrollIntoView?.({ block: \"nearest\" });\n }\n }, [selected]);\n\n const handlePointerMove = (e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerMove?.(e);\n if (e.defaultPrevented || disabled) return;\n if (filteredIn) setActiveId(id);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (e.defaultPrevented || disabled) return;\n if (!filteredIn) return;\n setActiveId(id);\n onSelectRef.current?.();\n };\n\n return (\n <button\n ref={setRefs}\n type=\"button\"\n id={optionId}\n role=\"option\"\n tabIndex={-1}\n aria-selected={selected}\n hidden={filteredIn ? undefined : true}\n disabled={disabled}\n className={cx(styles.item, className)}\n {...toDataAttributes({\n selected: selected ? true : undefined,\n disabled: disabled ? true : undefined,\n })}\n onPointerMove={handlePointerMove}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\n\nCommandMenuItem.displayName = \"CommandMenu.Item\";\n\n// \u2500\u2500\u2500 Item icon (polymorphic) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuItemIconProps<T extends React.ElementType = \"span\"> = {\n as?: T;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<T>, \"as\" | \"className\">;\n\nfunction CommandMenuItemIcon<T extends React.ElementType = \"span\">({\n as,\n className,\n ...rest\n}: CommandMenuItemIconProps<T>) {\n const Comp = as ?? \"span\";\n return <Comp className={cx(styles.itemIcon, className)} aria-hidden {...rest} />;\n}\n\n// \u2500\u2500\u2500 \u0421\u0435\u043A\u0446\u0438\u044F \u0442\u0435\u0433\u043E\u0432 \u043F\u043E\u0434 \u0441\u0442\u0440\u043E\u043A\u043E\u0439 \u043F\u043E\u0438\u0441\u043A\u0430 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuTagSectionProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction CommandMenuTagSection({ className, ...rest }: CommandMenuTagSectionProps) {\n return <div className={cx(styles.tagSection, className)} {...rest} />;\n}\n\nexport type CommandMenuTagSectionLabelProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction CommandMenuTagSectionLabel({ className, ...rest }: CommandMenuTagSectionLabelProps) {\n return <div className={cx(styles.tagSectionLabel, className)} {...rest} />;\n}\n\nexport type CommandMenuTagRowProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction CommandMenuTagRow({ className, ...rest }: CommandMenuTagRowProps) {\n return <div className={cx(styles.tagRow, className)} {...rest} />;\n}\n\n// \u2500\u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction CommandMenuFooter({ className, ...rest }: CommandMenuFooterProps) {\n return <div className={cx(styles.footer, className)} {...rest} />;\n}\n\nexport type CommandMenuFooterKeyBoxProps = Omit<React.HTMLAttributes<HTMLElement>, \"color\"> & {\n /** `soft` \u2014 \u043A\u043B\u0430\u0432\u0438\u0448\u0430 \u043D\u0430 \u043C\u044F\u0433\u043A\u043E\u0439 \u043F\u043E\u0434\u043B\u043E\u0436\u043A\u0435 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E), `ghost` \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0442\u0435\u043A\u0441\u0442. */\n variant?: Extract<Variant, \"soft\" | \"ghost\">;\n};\n\n/** \u041A\u043B\u0430\u0432\u0438\u0448\u0430 \u0432 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430\u0445 \u0444\u0443\u0442\u0435\u0440\u0430 (\u0441\u0442\u0438\u043B\u044C Kbd). */\nconst CommandMenuFooterKeyBox = React.forwardRef<HTMLElement, CommandMenuFooterKeyBoxProps>(\n ({ className, variant = \"soft\", ...rest }, ref) => (\n <kbd\n ref={ref}\n className={cx(styles.key, className)}\n {...toDataAttributes({ variant })}\n {...rest}\n />\n ),\n);\n\nCommandMenuFooterKeyBox.displayName = \"CommandMenu.FooterKeyBox\";\n\nexport type CommandMenuFooterHintProps = React.HTMLAttributes<HTMLSpanElement> & {\n /** \u041A\u043B\u0430\u0432\u0438\u0448\u0438 (\u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u043B\u0438 \u0438\u043A\u043E\u043D\u043A\u0438), \u043A\u0430\u0436\u0434\u0430\u044F \u2014 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 `FooterKeyBox`. */\n keys: React.ReactNode[];\n};\n\n/** \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430 \u0444\u0443\u0442\u0435\u0440\u0430: \u043A\u043B\u0430\u0432\u0438\u0448\u0438 + \u043F\u043E\u0434\u043F\u0438\u0441\u044C (\u00AB\u2191 \u2193 \u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F\u00BB). */\nfunction CommandMenuFooterHint({ keys, children, className, ...rest }: CommandMenuFooterHintProps) {\n return (\n <span className={cx(styles.footerHintItem, className)} {...rest}>\n {keys.map((k, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: \u0441\u0442\u0430\u0442\u0438\u0447\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u043A\u043B\u0430\u0432\u0438\u0448\n <CommandMenuFooterKeyBox key={i}>{k}</CommandMenuFooterKeyBox>\n ))}\n <span className={styles.footerHint}>{children}</span>\n </span>\n );\n}\n\n// \u2500\u2500\u2500 Empty \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuEmptyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * \u041F\u0443\u0441\u0442\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435: \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443 \u043D\u0435\u0442 \u043D\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430.\n * \u0422\u0435\u043A\u0441\u0442 \u2014 `labels.empty` / `labels.emptyHint` \u0443 Dialog; `children` \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043F\u043E\u0434 \u043D\u0438\u043C.\n */\nfunction CommandMenuEmpty({ children, className, ...rest }: CommandMenuEmptyProps) {\n const { visibleIds, labels } = useCommandMenuContext();\n if (visibleIds.length > 0) return null;\n return (\n <div role=\"status\" className={cx(styles.empty, className)} {...rest}>\n <span className={styles.emptyText}>{labels.empty}</span>\n {labels.emptyHint ? <span className={styles.emptyHint}>{labels.emptyHint}</span> : null}\n {children}\n </div>\n );\n}\n\n// \u2500\u2500\u2500 Item parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type CommandMenuItemShortcutProps = React.HTMLAttributes<HTMLElement>;\n\n/** \u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 \u0441\u043F\u0440\u0430\u0432\u0430 \u0432 \u043F\u0443\u043D\u043A\u0442\u0435 (\u043F\u0440\u0438\u0433\u043B\u0443\u0448\u0451\u043D\u043D\u044B\u0439 Kbd). */\nfunction CommandMenuItemShortcut({ className, ...rest }: CommandMenuItemShortcutProps) {\n return <kbd className={cx(styles.itemShortcut, className)} {...rest} />;\n}\n\nexport type CommandMenuItemTextProps = React.HTMLAttributes<HTMLSpanElement> & {\n /** \u0412\u0442\u043E\u0440\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 (\u043F\u0443\u0442\u044C, \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435) \u2014 caption, muted. */\n description?: React.ReactNode;\n};\n\n/** \u0422\u0435\u043A\u0441\u0442 \u043F\u0443\u043D\u043A\u0442\u0430: \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0441 \u043C\u043D\u043E\u0433\u043E\u0442\u043E\u0447\u0438\u0435\u043C + \u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435. */\nfunction CommandMenuItemText({\n description,\n children,\n className,\n ...rest\n}: CommandMenuItemTextProps) {\n return (\n <span className={cx(styles.itemText, className)} {...rest}>\n <span className={styles.itemLabel}>{children}</span>\n {description ? <span className={styles.itemDescription}>{description}</span> : null}\n </span>\n );\n}\n\n// \u2500\u2500\u2500 Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const CommandMenu = {\n Dialog: CommandMenuDialog,\n DialogTitle: CommandMenuDialogTitle,\n DialogDescription: CommandMenuDialogDescription,\n InputRow: CommandMenuInputRow,\n Input: CommandMenuInput,\n List: CommandMenuList,\n Group: CommandMenuGroup,\n Item: CommandMenuItem,\n ItemIcon: CommandMenuItemIcon,\n ItemText: CommandMenuItemText,\n ItemShortcut: CommandMenuItemShortcut,\n Empty: CommandMenuEmpty,\n TagSection: CommandMenuTagSection,\n TagSectionLabel: CommandMenuTagSectionLabel,\n TagRow: CommandMenuTagRow,\n Footer: CommandMenuFooter,\n FooterKeyBox: CommandMenuFooterKeyBox,\n FooterHint: CommandMenuFooterHint,\n};\n", "/*\n * Header / body / footer of Modal and Drawer. Every zone owns its side padding\n * (`--dialog-padding`, set by Modal.Content / Drawer.Content): the scrolling body keeps it inside\n * the scroll box, so focus rings of edge-to-edge fields are never clipped (foundation \u00A77).\n * Header and footer are separated by a faint hairline (a 1px background line inset by the same padding):\n *\n * header 24 top \u00B7 20 bottom\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500 body 20 \u00B7 gap 16 (scrolls)\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500 footer 20 top \u00B7 24 bottom\n */\n\n/* \u2500\u2500\u2500 Shell \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* Applied by Modal.Content and Drawer.Content next to their own surface class. */\n.shell {\n --dialog-hairline: linear-gradient(\n var(--prime-color-border-faint),\n var(--prime-color-border-faint)\n );\n --dialog-hairline-size: calc(100% - 2 * var(--dialog-padding)) var(--prime-border-width);\n\n container: prime-dialog / inline-size;\n /* Surface context: nested cards become sunken tiles without shadow (foundation \u00A74). */\n --prime-color-card-bg: var(--prime-color-bg-sunken);\n --prime-card-shadow: none;\n}\n\n/* \u2500\u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/*\n * Grid, not markup order: icon | title + description | close always share one row,\n * whatever order the children come in.\n */\n.header {\n display: grid;\n flex: 0 0 auto;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--prime-space-4);\n row-gap: var(--prime-space-1);\n min-width: 0;\n padding: var(--prime-space-6) var(--dialog-padding) var(--prime-space-5);\n}\n\n/* Faint inset hairline under the header when a body or footer follows. */\n.header:not(:last-child) {\n background: var(--dialog-hairline) center bottom / var(--dialog-hairline-size) no-repeat;\n}\n\n.header:has(> .icon) {\n grid-template-columns: auto minmax(0, 1fr) auto;\n}\n\n/* Title, description and any custom text sit in the text column (second from the end). */\n.header > :not(.icon, .close) {\n grid-column: -3 / -2;\n}\n\n/*\n * With a description the block is 24 + 4 + 20 = 48: the 40px icon box is offset to sit centered\n * against a one-line description and stays at the top when the description wraps.\n */\n.header[data-has-description=\"true\"] {\n align-items: start;\n}\n\n/* Header alone closes with the dialog's 24px rhythm. */\n.header:last-child {\n padding-block-end: var(--prime-space-6);\n}\n\n.icon {\n --prime-icon-size: var(--prime-icon-m);\n\n grid-column: 1;\n grid-row: 1;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--prime-space-10);\n height: var(--prime-space-10);\n border-radius: var(--prime-radius-l);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n}\n\n.header[data-has-description=\"true\"] > .icon {\n grid-row: 1 / span 2;\n margin-block-start: calc(\n (\n var(--prime-text-title-m-line-height) +\n var(--prime-space-1) +\n var(--prime-text-body-s-line-height) -\n var(--prime-space-10)\n ) /\n 2\n );\n}\n\n/* Raw SVG children (lucide etc.) follow the icon tier too. */\n.icon > svg {\n flex: 0 0 auto;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n}\n\n.icon[data-tone=\"accent\"] {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.icon[data-tone=\"success\"] {\n background: var(--prime-color-success-soft);\n color: var(--prime-color-success-text);\n}\n\n.icon[data-tone=\"warning\"] {\n background: var(--prime-color-warning-soft);\n color: var(--prime-color-warning-text);\n}\n\n.icon[data-tone=\"danger\"] {\n background: var(--prime-color-danger-soft);\n color: var(--prime-color-danger-text);\n}\n\n.icon[data-tone=\"info\"] {\n background: var(--prime-color-info-soft);\n color: var(--prime-color-info-text);\n}\n\n.title {\n margin: 0;\n color: var(--prime-color-text-primary);\n font-size: var(--prime-text-title-m-size);\n line-height: var(--prime-text-title-m-line-height);\n font-weight: var(--prime-text-title-m-weight);\n letter-spacing: var(--prime-text-title-m-tracking);\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.description {\n margin: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n font-weight: var(--prime-text-body-s-weight);\n overflow-wrap: anywhere;\n}\n\n/*\n * Square ghost close (tier s). With a description it hangs from the top, centered on the title's\n * first line; the inline pull puts the glyph on the content edge.\n */\n.close {\n grid-column: -2 / -1;\n grid-row: 1;\n width: var(--prime-control-s-height);\n min-width: var(--prime-control-s-height);\n padding-inline: 0;\n margin-inline-end: calc(-1 * var(--prime-space-2));\n}\n\n.header[data-has-description=\"true\"] > .close {\n margin-block: calc((var(--prime-text-title-m-line-height) - var(--prime-control-s-height)) / 2);\n}\n\n/* \u2500\u2500\u2500 Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--prime-space-4);\n min-width: 0;\n min-height: 0;\n padding: var(--prime-space-5) var(--dialog-padding);\n overflow-wrap: anywhere;\n}\n\n/* Headless dialog: full 24px top. */\n.body:first-child {\n padding-block-start: var(--prime-space-6);\n}\n\n.body:last-child {\n padding-block-end: var(--prime-space-6);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.footer {\n display: grid;\n flex: 0 0 auto;\n align-items: center;\n min-width: 0;\n padding: var(--prime-space-5) var(--dialog-padding) var(--prime-space-6);\n}\n\n/* Footer after a body gets the hairline above it (after a header the header already draws one). */\n.footer:not(:first-child):not(.header + .footer) {\n background: var(--dialog-hairline) center top / var(--dialog-hairline-size) no-repeat;\n}\n\n.footer:first-child {\n padding-block-start: var(--prime-space-6);\n}\n\n/* Equal-width actions in one row. */\n.footer[data-layout=\"fill\"] {\n grid-auto-columns: minmax(0, 1fr);\n grid-auto-flow: column;\n gap: var(--prime-space-3);\n}\n\n.footer[data-layout=\"fill\"] > * {\n width: 100%;\n}\n\n/* Auto-width actions, right-aligned. */\n.footer[data-layout=\"end\"] {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--prime-space-2);\n}\n\n/* Dialog narrower than 360px: one action per row, full width, DOM order (primary last). */\n@container prime-dialog (max-width: 359px) {\n .footer[data-layout] {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--prime-space-2);\n }\n\n .footer[data-layout] > * {\n width: 100%;\n }\n}\n", "import * as React from \"react\";\n\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useFocusTrap } from \"@/hooks/useFocusTrap\";\nimport { useModalKeyboard } from \"@/hooks/useModalKeyboard\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport { type PresenceState, usePresence } from \"@/hooks/usePresence\";\nimport { useScrollLock } from \"@/hooks/useScrollLock\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { OverlayPortalLayerProvider } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport type { ControlSize } from \"@/internal/states\";\nimport {\n DialogBody,\n DialogClose,\n DialogConfirm,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogIcon,\n DialogShellProvider,\n DialogTitle,\n dialogShellClassName,\n useDialogShellValue,\n} from \"./DialogParts\";\nimport styles from \"./Modal.module.css\";\nimport { useInertSiblings } from \"./useInertSiblings\";\n\nexport type {\n DialogBodyProps as ModalBodyProps,\n DialogCloseProps as ModalCloseProps,\n DialogConfirmProps as ModalConfirmProps,\n DialogDescriptionProps as ModalDescriptionProps,\n DialogFooterProps as ModalFooterProps,\n DialogHeaderProps as ModalHeaderProps,\n DialogIconProps as ModalIconProps,\n DialogTitleProps as ModalTitleProps,\n} from \"./DialogParts\";\n\nexport type ModalLabels = {\n /** `aria-label` of the header close button. */\n close: string;\n};\n\nconst MODAL_LABELS: ModalLabels = {\n close: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C\",\n};\n\ntype ModalContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n closeOnEscape: boolean;\n closeOnOutsideClick: boolean;\n confirmOnEnter: boolean;\n onEnterConfirm?: (event: KeyboardEvent) => void;\n labels: ModalLabels;\n};\n\nconst [ModalProvider, useModalContext] = createComponentContext<ModalContextValue>(\"Modal\");\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ModalRootProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Escape closes the dialog. Default `true`. */\n closeOnEscape?: boolean;\n /**\n * A click on the scrim (any pointerdown outside the dialog) closes it. Default `true`; turn it\n * off for destructive confirms.\n */\n closeOnOutsideClick?: boolean;\n /** Enter clicks the action wrapped in `Modal.Confirm`. Default `true`. */\n confirmOnEnter?: boolean;\n /** Replaces the default Enter confirm (the `Modal.Confirm` click). */\n onEnterConfirm?: (event: KeyboardEvent) => void;\n labels?: Partial<ModalLabels>;\n children?: React.ReactNode;\n};\n\nfunction ModalRoot({\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnEscape = true,\n closeOnOutsideClick = true,\n confirmOnEnter = true,\n onEnterConfirm,\n labels,\n children,\n}: ModalRootProps) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const closeLabel = labels?.close ?? MODAL_LABELS.close;\n const value = React.useMemo<ModalContextValue>(\n () => ({\n open: isOpen,\n setOpen,\n closeOnEscape,\n closeOnOutsideClick,\n confirmOnEnter,\n onEnterConfirm,\n labels: { close: closeLabel },\n }),\n [\n isOpen,\n setOpen,\n closeOnEscape,\n closeOnOutsideClick,\n confirmOnEnter,\n onEnterConfirm,\n closeLabel,\n ],\n );\n\n return <ModalProvider value={value}>{children}</ModalProvider>;\n}\nModalRoot.displayName = \"Modal.Root\";\n\n// \u2500\u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ModalTriggerProps = {\n children: React.ReactElement<{ onClick?: React.MouseEventHandler }>;\n};\n\n/** Opens the dialog on the child's click (unless the child prevents default). */\nfunction ModalTrigger({ children }: ModalTriggerProps) {\n const { setOpen } = useModalContext();\n const child = React.Children.only(children);\n return React.cloneElement(child, {\n onClick: (event: React.MouseEvent) => {\n child.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen(true);\n },\n });\n}\nModalTrigger.displayName = \"Modal.Trigger\";\n\n// \u2500\u2500\u2500 Content \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ModalContentProps = React.HTMLAttributes<HTMLDivElement> & {\n /**\n * Dialog width: `s` 440 \u00B7 `m` 560 \u00B7 `l` 720 \u00B7 `xl` 960. Below 640px of viewport the dialog is\n * always a full-width bottom sheet.\n */\n size?: Exclude<ControlSize, \"xs\">;\n /** Portal target. Default `document.body`. */\n container?: HTMLElement | null;\n /** Class on the full-screen scrim. */\n overlayClassName?: string;\n};\n\nfunction ModalContent({ container, ...props }: ModalContentProps) {\n const { open } = useModalContext();\n // Stays mounted with `data-state=\"closed\"` while the exit animation plays.\n const presence = usePresence(open, { exitDuration: \"base\" });\n if (!presence.mounted) return null;\n return (\n <Portal container={container}>\n <ModalDialog {...props} state={presence.state} onExitEnd={presence.onExitEnd} />\n </Portal>\n );\n}\n\ntype ModalDialogProps = Omit<ModalContentProps, \"container\"> & {\n state: PresenceState;\n onExitEnd: (event: React.SyntheticEvent<Element>) => void;\n};\n\n/** Mounted inside the portal so focus trap and inert siblings see the attached node. */\nfunction ModalDialog({\n size = \"m\",\n overlayClassName,\n className,\n children,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n state,\n onExitEnd,\n ...rest\n}: ModalDialogProps) {\n const {\n open,\n setOpen,\n closeOnEscape,\n closeOnOutsideClick,\n confirmOnEnter,\n onEnterConfirm,\n labels,\n } = useModalContext();\n\n const confirmRef = React.useRef<HTMLElement | null>(null);\n const onClose = React.useCallback(() => setOpen(false), [setOpen]);\n\n const shell = useDialogShellValue({\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n onClose,\n closeLabel: labels.close,\n footerLayout: size === \"s\" || size === \"m\" ? \"fill\" : \"end\",\n confirmRef,\n });\n\n const trapRef = useFocusTrap<HTMLDivElement>({ enabled: open });\n useScrollLock(open);\n useInertSiblings(open, trapRef);\n // Scrim layer: the press must start and end outside the panel (no drag-to-close, no click-through).\n useOutsideClick({\n refs: [trapRef],\n enabled: open,\n trigger: \"click\",\n onOutsideClick: () => {\n if (closeOnOutsideClick) onClose();\n },\n });\n useModalKeyboard({\n open,\n trapRef,\n closeOnEscape,\n onClose,\n confirmOnEnter,\n onEnterConfirm,\n primaryRef: confirmRef,\n });\n\n return (\n // Scrim dismiss is a pointerdown outside the dialog (useOutsideClick), Escape via useModalKeyboard.\n <div\n role=\"presentation\"\n className={cx(styles.overlay, overlayMotion.scrim, overlayClassName)}\n data-testid=\"modal-overlay\"\n data-state={state}\n onAnimationEnd={onExitEnd}\n >\n <div\n ref={trapRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n className={cx(dialogShellClassName, styles.content, overlayMotion.dialog, className)}\n data-size={size}\n data-state={state}\n {...shell.aria}\n {...rest}\n >\n <DialogShellProvider value={shell.value}>\n <OverlayPortalLayerProvider value=\"modal\">\n <ControlSizeProvider value=\"m\">{children}</ControlSizeProvider>\n </OverlayPortalLayerProvider>\n </DialogShellProvider>\n </div>\n </div>\n );\n}\n\nModalContent.displayName = \"Modal.Content\";\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const Modal = {\n Root: ModalRoot,\n Trigger: ModalTrigger,\n Content: ModalContent,\n Header: DialogHeader,\n Icon: DialogIcon,\n Title: DialogTitle,\n Description: DialogDescription,\n Body: DialogBody,\n Footer: DialogFooter,\n Close: DialogClose,\n Confirm: DialogConfirm,\n};\n", "import * as React from \"react\";\n\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\n\nfunction shouldBlockEnterConfirm(target: EventTarget | null): boolean {\n if (!target || !(target instanceof HTMLElement)) {\n return false;\n }\n const el = target;\n if (el.isContentEditable) {\n return true;\n }\n if (el.closest('[contenteditable=\"true\"]')) {\n return true;\n }\n const tag = el.tagName;\n if (tag === \"TEXTAREA\") {\n return true;\n }\n if (tag === \"SELECT\") {\n return true;\n }\n if (tag === \"INPUT\") {\n const { type } = el as HTMLInputElement;\n return (\n type === \"checkbox\" ||\n type === \"radio\" ||\n type === \"file\" ||\n type === \"button\" ||\n type === \"submit\" ||\n type === \"reset\"\n );\n }\n return false;\n}\n\nexport type UseModalKeyboardOptions = {\n open: boolean;\n trapRef: React.RefObject<HTMLElement | null>;\n closeOnEscape: boolean;\n onClose: () => void;\n confirmOnEnter: boolean;\n onEnterConfirm?: (event: KeyboardEvent) => void;\n /** \u0426\u0435\u043B\u0435\u0432\u043E\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F (\u043A\u043D\u043E\u043F\u043A\u0430 \u0438\u0437 `Modal.Footer` `primary`). */\n primaryRef: React.RefObject<HTMLElement | null>;\n};\n\n/** Escape + Enter \u0434\u043B\u044F `role=\"dialog\"`: Escape \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0435\u0442; Enter \u0438\u043C\u0438\u0442\u0438\u0440\u0443\u0435\u0442 `click()` \u043F\u043E `primaryRef`. */\nexport function useModalKeyboard({\n open,\n trapRef,\n closeOnEscape,\n onClose,\n confirmOnEnter,\n onEnterConfirm,\n primaryRef,\n}: UseModalKeyboardOptions) {\n useEscapeKey({ enabled: closeOnEscape && open, onEscape: onClose });\n\n React.useEffect(() => {\n if (!open || !confirmOnEnter) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\" || event.repeat) {\n return;\n }\n\n const container = trapRef.current;\n if (!container) {\n return;\n }\n\n const active = document.activeElement;\n if (!active || !container.contains(active)) {\n return;\n }\n\n const header = container.querySelector(\"header\");\n if (header && event.target instanceof Node && header.contains(event.target)) {\n return;\n }\n\n if (shouldBlockEnterConfirm(event.target)) {\n return;\n }\n\n if (onEnterConfirm) {\n onEnterConfirm(event);\n return;\n }\n\n const primary = primaryRef.current;\n if (!primary) {\n return;\n }\n\n if (active === primary) {\n return;\n }\n\n event.preventDefault();\n primary.click();\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => document.removeEventListener(\"keydown\", onKeyDown, true);\n }, [open, confirmOnEnter, onEnterConfirm, primaryRef, trapRef]);\n}\n", "/**\n * Shared header / body / footer parts of Modal and Drawer. Not exported from the package root:\n * consumers use them as `Modal.*` and `Drawer.*`. The owning content component provides the\n * shell context (ids, close handler, labels, default footer layout).\n */\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/button/Button\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { Icon } from \"@/icons\";\nimport { cx } from \"@/internal/cx\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\nimport type { Tone } from \"@/internal/states\";\n\nimport styles from \"./DialogParts.module.css\";\n\n/** Class for the `role=\"dialog\"` element: hairline tokens and the `prime-dialog` container. */\nexport const dialogShellClassName = styles.shell;\n\n/** Footer actions: `fill` \u2014 equal-width buttons in one row; `end` \u2014 auto-width, right-aligned. */\nexport type DialogFooterLayout = \"fill\" | \"end\";\n\ntype DialogShellContextValue = {\n titleId: string;\n descriptionId: string;\n hasDescription: boolean;\n registerTitle: (present: boolean) => void;\n registerDescription: (present: boolean) => void;\n onClose: () => void;\n closeLabel: string;\n footerLayout: DialogFooterLayout;\n /** Enter-confirm target (Modal only). */\n confirmRef?: React.MutableRefObject<HTMLElement | null>;\n};\n\nconst DialogShellContext = React.createContext<DialogShellContextValue | null>(null);\n\nfunction useDialogShell(part: string): DialogShellContextValue {\n const value = React.useContext(DialogShellContext);\n if (value === null) {\n throw new Error(`[prime-ui-kit] ${part} must be used inside Modal.Content or Drawer.Content.`);\n }\n return value;\n}\n\ntype UseDialogShellOptions = {\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n onClose: () => void;\n closeLabel: string;\n footerLayout: DialogFooterLayout;\n confirmRef?: React.MutableRefObject<HTMLElement | null>;\n};\n\n/** Builds the shell context and the resolved `aria-*` for the `role=\"dialog\"` element. */\nexport function useDialogShellValue({\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n onClose,\n closeLabel,\n footerLayout,\n confirmRef,\n}: UseDialogShellOptions) {\n const internalTitleId = React.useId();\n const internalDescriptionId = React.useId();\n const titleId = ariaLabelledBy ?? internalTitleId;\n const descriptionId = ariaDescribedBy ?? internalDescriptionId;\n\n const [hasTitle, setHasTitle] = React.useState(false);\n const [hasDescription, setHasDescription] = React.useState(false);\n\n const value = React.useMemo<DialogShellContextValue>(\n () => ({\n titleId,\n descriptionId,\n hasDescription,\n registerTitle: setHasTitle,\n registerDescription: setHasDescription,\n onClose,\n closeLabel,\n footerLayout,\n confirmRef,\n }),\n [titleId, descriptionId, hasDescription, onClose, closeLabel, footerLayout, confirmRef],\n );\n\n const aria = {\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy ?? (hasTitle && !ariaLabel ? titleId : undefined),\n \"aria-describedby\": ariaDescribedBy ?? (hasDescription ? descriptionId : undefined),\n };\n\n return { value, aria };\n}\n\nexport function DialogShellProvider({\n value,\n children,\n}: {\n value: DialogShellContextValue;\n children: React.ReactNode;\n}) {\n return <DialogShellContext.Provider value={value}>{children}</DialogShellContext.Provider>;\n}\n\n// \u2500\u2500\u2500 Icon \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DialogIconProps = {\n /** Soft fill + text color of the role. Default `neutral`. */\n tone?: Tone;\n children: React.ReactNode;\n className?: string;\n};\n\nexport function DialogIcon({ tone = \"neutral\", children, className }: DialogIconProps) {\n return (\n <span className={cx(styles.icon, className)} data-tone={tone} aria-hidden=\"true\">\n {children}\n </span>\n );\n}\nDialogIcon.displayName = \"Dialog.Icon\";\n\n// \u2500\u2500\u2500 Title / Description \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DialogTitleProps = Omit<React.HTMLAttributes<HTMLHeadingElement>, \"id\">;\n\nexport function DialogTitle({ className, ...rest }: DialogTitleProps) {\n const { titleId, registerTitle } = useDialogShell(\"Title\");\n React.useLayoutEffect(() => {\n registerTitle(true);\n return () => registerTitle(false);\n }, [registerTitle]);\n return <h2 id={titleId} className={cx(styles.title, className)} {...rest} />;\n}\nDialogTitle.displayName = \"Dialog.Title\";\n\nexport type DialogDescriptionProps = Omit<React.HTMLAttributes<HTMLParagraphElement>, \"id\">;\n\nexport function DialogDescription({ className, ...rest }: DialogDescriptionProps) {\n const { descriptionId, registerDescription } = useDialogShell(\"Description\");\n React.useLayoutEffect(() => {\n registerDescription(true);\n return () => registerDescription(false);\n }, [registerDescription]);\n return <p id={descriptionId} className={cx(styles.description, className)} {...rest} />;\n}\nDialogDescription.displayName = \"Dialog.Description\";\n\n// \u2500\u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DialogHeaderProps = React.HTMLAttributes<HTMLElement> & {\n /** Built-in close button (square ghost `s`, `labels.close`). Default `true`. */\n showClose?: boolean;\n};\n\n/**\n * `[Icon] [Title + Description] [close]` in one row. Layout is a CSS grid, so child order\n * does not matter; text children stack in the middle column.\n */\nexport function DialogHeader({\n showClose = true,\n className,\n children,\n ...rest\n}: DialogHeaderProps) {\n const { onClose, closeLabel, hasDescription } = useDialogShell(\"Header\");\n\n return (\n <header\n className={cx(styles.header, className)}\n data-has-description={hasDescription ? \"true\" : undefined}\n {...rest}\n >\n {children}\n {showClose ? (\n <Button.Root\n variant=\"ghost\"\n tone=\"neutral\"\n type=\"button\"\n size=\"s\"\n aria-label={closeLabel}\n className={styles.close}\n onClick={onClose}\n >\n <Button.Icon>\n <Icon name=\"action.close\" tone=\"secondary\" />\n </Button.Icon>\n </Button.Root>\n ) : null}\n </header>\n );\n}\nDialogHeader.displayName = \"Dialog.Header\";\n\n// \u2500\u2500\u2500 Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DialogBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** The only scrolling zone; header and footer stay put. */\nexport function DialogBody({ className, ...rest }: DialogBodyProps) {\n return <ScrollContainer className={cx(styles.body, className)} {...rest} />;\n}\nDialogBody.displayName = \"Dialog.Body\";\n\n// \u2500\u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DialogFooterProps = React.HTMLAttributes<HTMLElement> & {\n /** `fill` \u2014 equal-width buttons; `end` \u2014 auto width, right-aligned. Default depends on the container. */\n layout?: DialogFooterLayout;\n};\n\n/** Actions in DOM order, primary last. Stacks full width when the dialog is narrower than 360px. */\nexport function DialogFooter({ layout, className, ...rest }: DialogFooterProps) {\n const { footerLayout } = useDialogShell(\"Footer\");\n return (\n <footer\n className={cx(styles.footer, className)}\n data-layout={layout ?? footerLayout}\n {...rest}\n />\n );\n}\nDialogFooter.displayName = \"Dialog.Footer\";\n\n// \u2500\u2500\u2500 Close / Confirm (wrap one child) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype SlotChild = React.ReactElement<{\n onClick?: React.MouseEventHandler;\n ref?: React.Ref<HTMLElement>;\n}>;\n\nexport type DialogCloseProps = { children: SlotChild };\n\n/** Adds \"close the dialog\" to the child's click (unless the child prevents default). */\nexport function DialogClose({ children }: DialogCloseProps) {\n const { onClose } = useDialogShell(\"Close\");\n const child = React.Children.only(children);\n return React.cloneElement(child, {\n onClick: (event: React.MouseEvent) => {\n child.props.onClick?.(event);\n if (!event.defaultPrevented) onClose();\n },\n });\n}\nDialogClose.displayName = \"Dialog.Close\";\n\nexport type DialogConfirmProps = { children: SlotChild };\n\n/** Marks the primary action: Enter inside the dialog clicks it (`confirmOnEnter`). */\nexport function DialogConfirm({ children }: DialogConfirmProps) {\n const { confirmRef } = useDialogShell(\"Confirm\");\n const child = React.Children.only(children);\n const childRef = child.props.ref;\n const ref = React.useMemo(\n () =>\n mergeRefs(childRef, (node: HTMLElement | null) => {\n if (confirmRef) confirmRef.current = node;\n }),\n [childRef, confirmRef],\n );\n return React.cloneElement(child, { ref });\n}\nDialogConfirm.displayName = \"Dialog.Confirm\";\n", "/*\n * Modal \u2014 raised surface on a scrim. Header / body / footer (DialogParts.module.css) own their\n * side padding (`--dialog-padding`) and the inset hairlines. Only the body scrolls. Below 640px of viewport the dialog becomes a bottom sheet.\n */\n\n.overlay {\n position: fixed;\n inset: 0;\n z-index: var(--prime-z-modal);\n display: grid;\n place-items: center;\n box-sizing: border-box;\n padding: var(--prime-modal-viewport-padding);\n background: var(--prime-color-bg-scrim);\n overflow: hidden;\n}\n\n.content {\n --modal-width: var(--prime-modal-width-m);\n /* Fields inside a raised surface use the \"on surface\" fill. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n /* Avatar.Group rings match this surface. */\n --avatar-ring: var(--prime-color-bg-raised);\n\n --dialog-padding: var(--prime-modal-padding);\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: min(100%, var(--modal-width));\n max-height: calc(100dvh - 2 * var(--prime-modal-viewport-padding));\n min-height: 0;\n overflow: hidden;\n background: var(--prime-color-bg-raised);\n color: var(--prime-color-text-primary);\n border-radius: var(--prime-modal-radius);\n box-shadow: var(--prime-shadow-modal);\n outline: none;\n font-size: var(--prime-text-body-m-size);\n line-height: var(--prime-text-body-m-line-height);\n}\n\n.content[data-size=\"s\"] {\n --modal-width: var(--prime-modal-width-s);\n}\n\n.content[data-size=\"l\"] {\n --modal-width: var(--prime-modal-width-l);\n}\n\n.content[data-size=\"xl\"] {\n --modal-width: var(--prime-modal-width-xl);\n}\n\n/* \u2500\u2500\u2500 Narrow viewport: bottom sheet \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n@media (max-width: 639px) {\n .overlay {\n place-items: end stretch;\n padding: var(--prime-modal-viewport-padding) 0 0;\n }\n\n .content {\n width: 100%;\n max-height: calc(100dvh - var(--prime-modal-viewport-padding));\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n }\n}\n\n/* Motion (scrim fade, dialog scale, bottom-sheet slide) lives in internal/overlayMotion.module.css. */\n", "import * as React from \"react\";\n\n/**\n * While `enabled`, makes every `<body>` child except the portal that holds `ref` inert and\n * `aria-hidden`, then restores the previous values. Shared by Modal and Drawer.\n */\nexport function useInertSiblings(enabled: boolean, ref: React.RefObject<HTMLElement | null>) {\n React.useEffect(() => {\n if (!enabled) return;\n const node = ref.current;\n if (!node) return;\n\n let portalRoot: Element | null = node;\n while (portalRoot && portalRoot.parentElement !== document.body) {\n portalRoot = portalRoot.parentElement;\n }\n\n const previous = Array.from(document.body.children)\n .filter((el) => el !== portalRoot)\n .map((el) => ({\n el: el as HTMLElement,\n inert: (el as HTMLElement).inert,\n ariaHidden: el.getAttribute(\"aria-hidden\"),\n }));\n\n for (const { el } of previous) {\n el.inert = true;\n el.setAttribute(\"aria-hidden\", \"true\");\n }\n\n return () => {\n for (const { el, inert, ariaHidden } of previous) {\n el.inert = inert;\n if (ariaHidden === null) el.removeAttribute(\"aria-hidden\");\n else el.setAttribute(\"aria-hidden\", ariaHidden);\n }\n };\n }, [enabled, ref]);\n}\n", "/* \u2500\u2500\u2500 CommandMenu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Modal-level search palette: search row on top (hairline below), scrolling list of\n * sections, footer with key hints (hairline above). Items follow the floating panel recipe.\n */\n\n/* Top-aligned palette: the list grows downwards, the search row never jumps. */\n.dialogOverlay {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n padding-block-start: clamp(var(--prime-modal-viewport-padding), 12vh, var(--prime-space-24));\n padding-block-end: max(var(--prime-modal-viewport-padding), env(safe-area-inset-bottom, 0px));\n padding-inline: max(var(--prime-modal-viewport-padding), env(safe-area-inset-left, 0px));\n}\n\n/* `.root` \u0434\u0443\u0431\u043B\u0438\u0440\u0443\u0435\u0442 \u043A\u043B\u0430\u0441\u0441, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0431\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B/\u0441\u0435\u0442\u043A\u0443 `Modal.Content` \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u043F\u043E\u0440\u044F\u0434\u043A\u0430 CSS. */\n.dialogContent.root[role=\"dialog\"] {\n --cm-width: var(--prime-modal-width-l);\n --cm-max-height: calc(var(--prime-panel-max-height) * 1.5);\n\n box-sizing: border-box;\n display: flex;\n /* Hug the results: `.root` grows inside the overlay column otherwise and leaves an empty sheet. */\n flex: 0 1 auto;\n flex-direction: column;\n gap: 0;\n width: min(100%, var(--cm-width));\n min-width: 0;\n max-width: 100%;\n max-height: min(var(--cm-max-height), calc(100dvh - 2 * var(--prime-modal-viewport-padding)));\n padding: 0;\n overflow: hidden;\n border-radius: var(--prime-modal-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-modal);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n /* Fields inside a raised surface stay distinguishable (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n}\n\n/* Tier variables (Dialog `size`); `display: contents` keeps the panel's flex column intact. */\n.tier {\n --cm-item-h: var(--prime-control-m-item-height);\n --cm-text: var(--prime-control-m-text-size);\n --cm-lh: var(--prime-control-m-line-height);\n --cm-icon: var(--prime-control-m-icon);\n --cm-input-h: var(--prime-space-12);\n\n display: contents;\n}\n\n.tier[data-size=\"xs\"] {\n --cm-item-h: var(--prime-control-xs-item-height);\n --cm-text: var(--prime-control-xs-text-size);\n --cm-lh: var(--prime-control-xs-line-height);\n --cm-icon: var(--prime-control-xs-icon);\n --cm-input-h: var(--prime-space-10);\n}\n\n.tier[data-size=\"s\"] {\n --cm-item-h: var(--prime-control-s-item-height);\n --cm-text: var(--prime-control-s-text-size);\n --cm-lh: var(--prime-control-s-line-height);\n --cm-icon: var(--prime-control-s-icon);\n --cm-input-h: var(--prime-space-10);\n}\n\n.tier[data-size=\"l\"] {\n --cm-item-h: var(--prime-control-l-item-height);\n --cm-text: var(--prime-control-l-text-size);\n --cm-lh: var(--prime-control-l-line-height);\n --cm-icon: var(--prime-control-l-icon);\n --cm-input-h: calc(var(--prime-space-12) + var(--prime-space-2));\n}\n\n.tier[data-size=\"xl\"] {\n --cm-item-h: var(--prime-control-xl-item-height);\n --cm-text: var(--prime-control-xl-text-size);\n --cm-lh: var(--prime-control-xl-line-height);\n --cm-icon: var(--prime-control-xl-icon);\n --cm-input-h: calc(var(--prime-space-12) + var(--prime-space-2));\n}\n\n.root {\n /* One content column for the whole palette: header text, search icon, scope chips, group\n headings and item icons all start at 16 (list padding 8 + item padding 8). */\n --cm-inset: calc(var(--prime-space-2) + var(--prime-panel-item-padding-x));\n\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n}\n\n/* \u2500\u2500\u2500 Optional visible title / description (above the search row) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.dialogTitle,\n.dialogDescription {\n padding-inline: var(--cm-inset);\n}\n\n.dialogTitle {\n padding-block: var(--prime-space-5) var(--prime-space-2);\n}\n\n.dialogTitle:has(+ .dialogDescription) {\n padding-block-end: 0;\n}\n\n.dialogDescription {\n padding-block: var(--prime-space-1) var(--prime-space-2);\n}\n\n/* \u2500\u2500\u2500 Search row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.inputRow {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n /* Same icon \u2192 text gap as the item rows, so the query lines up with item labels. */\n gap: var(--prime-space-3);\n width: 100%;\n min-height: var(--cm-input-h);\n padding-block: 0;\n padding-inline: var(--cm-inset);\n border-bottom: var(--prime-border-width) solid var(--prime-color-border-faint);\n}\n\n.inputIcon {\n flex-shrink: 0;\n width: var(--prime-icon-m);\n height: var(--prime-icon-m);\n color: var(--prime-color-text-muted);\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* The search row sets data-focus-ring=\"false\" (foundation \u00A77: the caret is the indicator);\n the inset ring below applies only if a consumer turns it back on. */\n.inputRow:first-child {\n border-start-start-radius: var(--prime-modal-radius);\n border-start-end-radius: var(--prime-modal-radius);\n}\n\n.inputRow:not([data-focus-ring=\"false\"]):has(.input:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.inputRow:focus-within .inputIcon {\n color: var(--prime-color-text-secondary);\n}\n\n.input {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n min-height: var(--prime-control-l-height);\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--prime-color-text-primary);\n font-family: inherit;\n font-size: var(--prime-text-body-l-size);\n line-height: var(--prime-text-body-l-line-height);\n outline: none;\n appearance: none;\n}\n\n.input::-webkit-search-cancel-button {\n appearance: none;\n}\n\n.input::placeholder {\n color: var(--prime-color-text-placeholder);\n}\n\n/* \u2500\u2500\u2500 List / groups \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* Filtered-out rows and groups: `hidden` must win over `display: flex`. */\n.item[hidden],\n.group[hidden] {\n display: none;\n}\n\n.list {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n min-height: 0;\n padding: var(--prime-space-2);\n}\n\n.group {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.groupHeading,\n.groupHeadingRich {\n display: flex;\n align-items: center;\n gap: var(--prime-space-2);\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n/* \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.item {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--prime-space-3);\n width: 100%;\n min-height: var(--cm-item-h);\n margin: 0;\n padding-block: var(--prime-space-1);\n padding-inline: var(--prime-panel-item-padding-x);\n border: 0;\n border-radius: var(--prime-panel-item-radius);\n background: transparent;\n color: var(--prime-color-text-primary);\n font-family: inherit;\n font-size: var(--cm-text);\n line-height: var(--cm-lh);\n text-align: start;\n cursor: pointer;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.item[data-selected=\"true\"] {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.item:active:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-muted);\n}\n\n.item[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.itemIcon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--cm-icon);\n height: var(--cm-icon);\n color: var(--prime-color-text-muted);\n}\n\n.item[data-selected=\"true\"] .itemIcon {\n color: var(--prime-color-text-secondary);\n}\n\n.item[data-disabled=\"true\"] .itemIcon {\n color: var(--prime-color-text-disabled);\n}\n\n.itemText {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n}\n\n.itemLabel,\n.itemDescription {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.itemDescription {\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.itemShortcut {\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--prime-color-text-muted);\n font-family: var(--prime-font-family-sans);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n font-variant-numeric: tabular-nums;\n}\n\n/* \u2500\u2500\u2500 Empty \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-1);\n padding: var(--prime-space-10) var(--prime-space-4);\n text-align: center;\n}\n\n.emptyText {\n color: var(--prime-color-text-secondary);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n}\n\n.emptyHint {\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n}\n\n/* \u2500\u2500\u2500 Tags section under the search row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.tagSection {\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n gap: var(--prime-space-2);\n padding: var(--prime-space-3) var(--cm-inset);\n border-bottom: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.tagSectionLabel {\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n}\n\n.tagRow {\n display: flex;\n flex-wrap: wrap;\n gap: var(--prime-space-2);\n}\n\n/* \u2500\u2500\u2500 Footer with key hints \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.footer {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-2) var(--prime-space-4);\n min-height: var(--prime-space-10);\n padding: var(--prime-space-2) var(--cm-inset);\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n}\n\n.footerHintItem {\n display: inline-flex;\n align-items: center;\n gap: var(--prime-space-1);\n}\n\n.footerHint {\n padding-inline-start: var(--prime-space-1);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n}\n\n/* Key cap: badge s tier, soft fill, tabular digits. */\n.key {\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n min-width: var(--prime-badge-s-height);\n height: var(--prime-badge-s-height);\n padding-inline: var(--prime-space-1);\n border-radius: var(--prime-badge-s-radius);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--prime-badge-s-text-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: 1;\n font-variant-numeric: tabular-nums;\n}\n\n.key[data-variant=\"ghost\"] {\n background: transparent;\n color: var(--prime-color-text-muted);\n}\n\n.key svg {\n width: var(--prime-badge-s-icon);\n height: var(--prime-badge-s-icon);\n}\n", "import { ArrowDown, ArrowUp, ArrowUpDown, ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"@/components/button/Button\";\nimport { Checkbox } from \"@/components/checkbox/Checkbox\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { DATA_TABLE_INFINITE_ROOT_MARGIN } from \"@/internal/runtimeUnits\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport { Pagination } from \"../pagination/Pagination\";\nimport styles from \"./DataTable.module.css\";\n\nexport type DataTableOrder = \"asc\" | \"desc\";\nexport type DataTableSortState = { columnId: string; order: DataTableOrder } | null;\ntype CellAlign = \"start\" | \"center\" | \"end\";\n\nexport type DataTableColumn<Row> = {\n id: string;\n header: React.ReactNode;\n accessor?: keyof Row | ((row: Row) => unknown);\n cell?: (row: Row) => React.ReactNode;\n sortable?: boolean;\n sortAccessor?: (row: Row) => unknown;\n sortComparator?: (a: Row, b: Row, order: DataTableOrder) => number;\n align?: CellAlign;\n width?: string;\n minWidth?: string;\n /** \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0435 \u0448\u0438\u0440\u0438\u043D\u044B \u043A\u043E\u043B\u043E\u043D\u043A\u0438 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 `12rem` \u0438\u043B\u0438 `min(100%, 20rem)`). */\n maxWidth?: string;\n /**\n * \u0427\u0438\u0441\u043B\u043E\u0432\u0430\u044F \u043A\u043E\u043B\u043E\u043D\u043A\u0430: `tabular-nums`, \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E `end` (\u044F\u0432\u043D\u044B\u0439 `align` \u0432\u0430\u0436\u043D\u0435\u0435).\n */\n numeric?: boolean;\n /**\n * \u0414\u043B\u0438\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u0441 \u043C\u043D\u043E\u0433\u043E\u0442\u043E\u0447\u0438\u0435\u043C. \u0428\u0438\u0440\u0438\u043D\u0443 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 `maxWidth` (\u0438\u043B\u0438 `width`);\n * \u0434\u043B\u044F \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u044B\u0445 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 `title`.\n */\n truncate?: boolean;\n onHeaderClick?: (event: React.MouseEvent<HTMLTableCellElement>) => void;\n onCellClick?: (\n row: Row,\n event: React.MouseEvent<HTMLTableCellElement> | React.KeyboardEvent<HTMLTableCellElement>,\n ) => void;\n};\n\nexport type DataTableLabels = {\n /** Screen-reader announcement while skeleton rows are shown. */\n loading: string;\n /** Default empty-state text (when `empty` is not set). */\n empty: string;\n /** Footer range line. */\n range: (from: number, to: number, total: number) => string;\n /** Footer status while `loadingMore`. */\n loadingMore: string;\n /** Footer hint when more rows can be revealed or loaded by scrolling. */\n scrollForMore: string;\n /** `aria-label` of the header \u00ABselect all\u00BB checkbox. */\n selectAll: string;\n /** `aria-label` of a row checkbox; `label` comes from `getRowLabel`. */\n selectRow: (label?: string) => string;\n /** Screen-reader announcement after the selection changes. */\n selectedCount: (count: number) => string;\n /** `aria-label` of the expand toggle of a collapsed row. */\n expand: (label?: string) => string;\n /** `aria-label` of the expand toggle of an expanded row. */\n collapse: (label?: string) => string;\n};\n\nconst DEFAULT_LABELS: DataTableLabels = {\n loading: \"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445\u2026\",\n empty: \"\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F.\",\n range: (from, to, total) => `\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E ${from}\u2013${to} \u0438\u0437 ${total}`,\n loadingMore: \"\u0414\u043E\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u0441\u0442\u0440\u043E\u043A\u0438\u2026\",\n scrollForMore: \"\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u0437 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438\",\n selectAll: \"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0441\u0442\u0440\u043E\u043A\u0438\",\n selectRow: (label) => (label ? `\u0412\u044B\u0431\u0440\u0430\u0442\u044C: ${label}` : \"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443\"),\n selectedCount: (count) => `\u0412\u044B\u0431\u0440\u0430\u043D\u043E: ${count}`,\n expand: (label) => (label ? `\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C: ${label}` : \"\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443\"),\n collapse: (label) => (label ? `\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C: ${label}` : \"\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443\"),\n};\n\nexport type DataTableRootProps<Row> = {\n columns: DataTableColumn<Row>[];\n rows: Row[];\n size?: ControlSize;\n className?: string;\n showHeader?: boolean;\n stickyHeader?: boolean;\n stickyFirstColumn?: boolean;\n /**\n * Stable row id (also for sub-rows from `getRowChildren`; `index` is the index among siblings).\n * Selection and expansion are keyed by it. Without it the id is the row's position, which breaks\n * when sorting \u2014 pass it whenever `selectable` or expansion is used.\n */\n getRowKey?: (row: Row, index: number) => React.Key;\n /** Human name of a row for the checkbox / expand toggle `aria-label`s (e.g. the person's name). */\n getRowLabel?: (row: Row) => string;\n onRowClick?: (row: Row, index: number, event: React.MouseEvent<HTMLTableRowElement>) => void;\n loading?: boolean;\n /** Empty-state content (e.g. `EmptyPage`); defaults to `labels.empty`. */\n empty?: React.ReactNode;\n /** Built-in strings (Russian defaults). */\n labels?: Partial<DataTableLabels>;\n /** Row divider line. Default `standard` (hairline). */\n dividerStyle?: \"standard\" | \"dashed\" | \"dotted\" | \"none\";\n sort?: DataTableSortState;\n defaultSort?: DataTableSortState;\n onSortChange?: (sort: DataTableSortState) => void;\n page?: number;\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n pageSize?: number;\n showPagination?: boolean;\n siblingCount?: number;\n paginationSize?: ControlSize;\n infiniteScroll?: boolean;\n initialVisibleRows?: number;\n infiniteBatchSize?: number;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void | Promise<void>;\n /**\n * \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u044B\u0441\u043E\u0442\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 (\u0447\u0438\u0441\u043B\u043E \u2014 px). \u041F\u0440\u0438 `infiniteScroll` \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 360.\n * \u0411\u0435\u0437 `infiniteScroll` \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u044F\u0432\u043D\u043E: \u043E\u0431\u044B\u0447\u043D\u0430\u044F \u0442\u0430\u0431\u043B\u0438\u0446\u0430 \u0441 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u043E\u0439 \u0432\u044B\u0441\u043E\u0442\u043E\u0439 \u0438\n * \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u043E\u0439 \u0442\u0435\u043B\u0430 (\u0432\u043C\u0435\u0441\u0442\u0435 \u0441\u043E `stickyHeader` \u0448\u0430\u043F\u043A\u0430 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432\u0438\u0434\u0438\u043C\u043E\u0439).\n */\n scrollHeight?: number | string;\n /**\n * \u0420\u0430\u0441\u0442\u044F\u043D\u0443\u0442\u044C `<table>` \u043D\u0430 100% \u0448\u0438\u0440\u0438\u043D\u044B \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0430. \u041B\u0438\u0448\u043D\u044F\u044F \u0448\u0438\u0440\u0438\u043D\u0430 \u0440\u0430\u0441\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u0434\u0432\u0438\u0436\u043A\u043E\u043C \u0442\u0430\u0431\u043B\u0438\u0446\u044B\n * (`table-layout: auto`) \u043F\u043E \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u2014 \u0441 \u043E\u043F\u043E\u0440\u043E\u0439 \u043D\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0438 `width` / `minWidth` / `maxWidth` \u043A\u043E\u043B\u043E\u043D\u043E\u043A.\n * \u041F\u0440\u0438 `false` \u0448\u0438\u0440\u0438\u043D\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443 (`width: max-content`).\n */\n fillWidth?: boolean;\n /** \u041F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 (\u043F\u043E\u043B\u0443\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u0430\u044F \u0441\u043C\u0435\u0441\u044C \u0441 \u0444\u043E\u043D\u043E\u043C \u0441\u0442\u0440\u043E\u043A\u0438). */\n highlightRowOnHover?: boolean;\n /** \u041F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u043F\u043E\u0434 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C (\u0448\u0430\u043F\u043A\u0430 + \u044F\u0447\u0435\u0439\u043A\u0438). */\n highlightColumnOnHover?: boolean;\n /** \u0427\u0435\u0440\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0435 \u0444\u043E\u043D\u0430 \u0441\u0442\u0440\u043E\u043A (\u0437\u0435\u0431\u0440\u0430). */\n striped?: boolean;\n /** \u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438 \u043C\u0435\u0436\u0434\u0443 \u043A\u043E\u043B\u043E\u043D\u043A\u0430\u043C\u0438. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0442\u043E\u043B\u044C\u043A\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 hairline. */\n columnDividers?: boolean;\n /**\n * Built-in row selection: a leading checkbox column, header \u00ABselect all\u00BB (indeterminate when\n * partial), Shift+click range, press-and-drag across checkboxes, Space on a focused checkbox,\n * `aria-selected` + `accent-soft` rows and a polite \u00AB\u0412\u044B\u0431\u0440\u0430\u043D\u043E: N\u00BB announcement.\n */\n selectable?: boolean;\n /** Selected row ids (controlled). */\n selected?: React.Key[];\n /** Initially selected row ids (uncontrolled). */\n defaultSelected?: React.Key[];\n onSelectedChange?: (selected: React.Key[]) => void;\n /** Tree sub-rows: rendered under the parent with the same columns, indented by depth. */\n getRowChildren?: (row: Row) => Row[] | undefined;\n /** Detail panel rendered in a full-width row under an expanded row. */\n renderExpanded?: (row: Row) => React.ReactNode;\n /**\n * Whether a row gets an expand toggle. Default: it has sub-rows, or `renderExpanded` is set.\n */\n isRowExpandable?: (row: Row) => boolean;\n /** Expanded row ids (controlled). */\n expanded?: React.Key[];\n /** Initially expanded row ids (uncontrolled). */\n defaultExpanded?: React.Key[];\n onExpandedChange?: (expanded: React.Key[]) => void;\n /** \u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438: \u0437\u0430\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0435\u043B\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435\u043C \u0441 `role=\"alert\"`. */\n error?: React.ReactNode;\n /** \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0442\u0440\u043E\u043A-\u0441\u043A\u0435\u043B\u0435\u0442\u043E\u043D\u043E\u0432 \u043F\u0440\u0438 `loading` \u0431\u0435\u0437 \u0434\u0430\u043D\u043D\u044B\u0445. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E `min(pageSize, 5)`. */\n loadingRows?: number;\n /** \u041F\u0430\u043D\u0435\u043B\u044C \u043D\u0430\u0434 \u0442\u0430\u0431\u043B\u0438\u0446\u0435\u0439 (\u043F\u043E\u0438\u0441\u043A, \u0444\u0438\u043B\u044C\u0442\u0440\u044B, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F). \u041F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u0441\u044F \u043D\u0430 \u0443\u0437\u043A\u043E\u0439 \u0448\u0438\u0440\u0438\u043D\u0435. */\n toolbar?: React.ReactNode;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction isDate(value: unknown): value is Date {\n return value instanceof Date;\n}\n\nfunction comparePrimitive(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return Number(a) - Number(b);\n if (isDate(a) && isDate(b)) return a.getTime() - b.getTime();\n\n return String(a).localeCompare(String(b), undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n}\n\nfunction getColumnValue<Row>(row: Row, column: DataTableColumn<Row>): unknown {\n if (column.sortAccessor) return column.sortAccessor(row);\n\n if (typeof column.accessor === \"function\") return column.accessor(row);\n\n if (typeof column.accessor === \"string\") {\n const key = column.accessor as keyof Row;\n return row[key];\n }\n\n return undefined;\n}\n\nfunction renderColumnCell<Row>(row: Row, column: DataTableColumn<Row>): React.ReactNode {\n if (column.cell) return column.cell(row);\n const value = getColumnValue(row, column);\n if (value == null) return \"\u2014\";\n return String(value);\n}\n\nfunction nextOrder(current: DataTableSortState, columnId: string): DataTableSortState {\n if (!current || current.columnId !== columnId) return { columnId, order: \"asc\" };\n if (current.order === \"asc\") return { columnId, order: \"desc\" };\n return null;\n}\n\nfunction sortIndicator(sort: DataTableSortState, columnId: string): string {\n if (!sort || sort.columnId !== columnId) return \"none\";\n return sort.order;\n}\n\nfunction columnAlign<Row>(column: DataTableColumn<Row>): CellAlign {\n if (column.align) return column.align;\n return column.numeric ? \"end\" : \"start\";\n}\n\nfunction ariaSortValue(indicator: string): \"ascending\" | \"descending\" | \"none\" {\n if (indicator === \"asc\") return \"ascending\";\n if (indicator === \"desc\") return \"descending\";\n return \"none\";\n}\n\ntype FlatRow<Row> = {\n row: Row;\n key: React.Key;\n depth: number;\n /** Ids of the direct sub-rows (empty when none). */\n childKeys: React.Key[];\n expandable: boolean;\n expanded: boolean;\n /** Mounted by the latest expand: plays the enter animation. */\n animate: boolean;\n};\n\nconst EMPTY_KEYS: React.Key[] = [];\n\n/** Toggle buttons sit one tier below the table tier (m table \u2192 xs button, 28). */\nconst TOGGLE_SIZE: Record<ControlSize, ControlSize> = {\n xs: \"xs\",\n s: \"xs\",\n m: \"xs\",\n l: \"s\",\n xl: \"s\",\n};\n\nfunction sortRowList<Row>(list: Row[], column: DataTableColumn<Row>, order: DataTableOrder): Row[] {\n const direction = order === \"asc\" ? 1 : -1;\n return list\n .map((row, index) => ({ row, index }))\n .sort((a, b) => {\n const compared = column.sortComparator\n ? column.sortComparator(a.row, b.row, order)\n : comparePrimitive(getColumnValue(a.row, column), getColumnValue(b.row, column));\n if (compared === 0) return a.index - b.index;\n return compared * direction;\n })\n .map((item) => item.row);\n}\n\nfunction domIdPart(key: React.Key): string {\n return String(key).replace(/[^A-Za-z0-9_-]/g, \"_\");\n}\n\nconst SKELETON_DEFAULT_ROWS = 5;\nconst DEFAULT_INFINITE_SCROLL_HEIGHT = 360;\n\nfunction columnSizeStyle<Row>(column: DataTableColumn<Row>): React.CSSProperties | undefined {\n const { width, minWidth, maxWidth } = column;\n if (!width && !minWidth && !maxWidth) return undefined;\n return { width, minWidth, maxWidth };\n}\n\nfunction DataTableRoot<Row>({\n columns,\n rows,\n size = \"m\",\n className,\n showHeader = true,\n stickyHeader = false,\n stickyFirstColumn = false,\n getRowKey,\n onRowClick,\n loading = false,\n empty,\n labels: labelsProp,\n dividerStyle = \"standard\",\n sort,\n defaultSort = null,\n onSortChange,\n page,\n defaultPage = 1,\n onPageChange,\n pageSize = 10,\n showPagination = true,\n siblingCount = 1,\n paginationSize,\n infiniteScroll = false,\n initialVisibleRows,\n infiniteBatchSize = 20,\n hasMore = false,\n loadingMore = false,\n onLoadMore,\n scrollHeight,\n fillWidth = true,\n highlightRowOnHover = true,\n highlightColumnOnHover = false,\n striped = false,\n columnDividers = false,\n getRowLabel,\n selectable = false,\n selected,\n defaultSelected = EMPTY_KEYS,\n onSelectedChange,\n getRowChildren,\n renderExpanded,\n isRowExpandable,\n expanded,\n defaultExpanded = EMPTY_KEYS,\n onExpandedChange,\n error,\n loadingRows,\n toolbar,\n}: DataTableRootProps<Row>) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n const [hoveredColumnId, setHoveredColumnId] = React.useState<string | null>(null);\n\n const clearHoveredColumn = React.useCallback(() => {\n setHoveredColumnId(null);\n }, []);\n\n const setHoveredColumn = React.useCallback(\n (columnId: string) => {\n if (highlightColumnOnHover) setHoveredColumnId(columnId);\n },\n [highlightColumnOnHover],\n );\n\n const [sortState, setSortState] = useControllableState<DataTableSortState>({\n value: sort,\n defaultValue: defaultSort,\n onChange: onSortChange,\n });\n\n const [pageState, setPageState] = useControllableState<number>({\n value: page,\n defaultValue: defaultPage,\n onChange: onPageChange,\n });\n\n const initialVisible = Math.max(1, initialVisibleRows ?? pageSize);\n const [visibleRowCount, setVisibleRowCount] = React.useState(initialVisible);\n const scrollRef = React.useRef<HTMLDivElement | null>(null);\n const sentinelRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useLayoutEffect(() => {\n const viewport = scrollRef.current;\n if (!viewport) return;\n\n const maxHeight = scrollHeight ?? (infiniteScroll ? DEFAULT_INFINITE_SCROLL_HEIGHT : undefined);\n viewport.style.maxHeight =\n maxHeight === undefined ? \"\" : typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n }, [infiniteScroll, scrollHeight]);\n\n const sortableColumns = React.useMemo(\n () => new Set(columns.filter((c) => c.sortable).map((c) => c.id)),\n [columns],\n );\n\n const sortColumn = React.useMemo(() => {\n if (!sortState || !sortableColumns.has(sortState.columnId)) return null;\n return columns.find((item) => item.id === sortState.columnId) ?? null;\n }, [columns, sortState, sortableColumns]);\n\n /** Sub-rows of a row, sorted like the top level. */\n const childrenOf = React.useCallback(\n (row: Row): Row[] => {\n const list = getRowChildren?.(row) ?? [];\n if (!sortColumn || !sortState || list.length < 2) return list;\n return sortRowList(list, sortColumn, sortState.order);\n },\n [getRowChildren, sortColumn, sortState],\n );\n\n const sortedRows = React.useMemo(() => {\n if (!sortColumn || !sortState) return rows;\n return sortRowList(rows, sortColumn, sortState.order);\n }, [rows, sortColumn, sortState]);\n\n const keyOf = React.useCallback(\n (row: Row, index: number, parentKey: React.Key | null): React.Key => {\n if (getRowKey) return getRowKey(row, index);\n return parentKey === null ? index : `${String(parentKey)}.${index}`;\n },\n [getRowKey],\n );\n\n const expandEnabled = Boolean(getRowChildren || renderExpanded);\n const [expandedKeys, setExpandedKeys] = useControllableState<React.Key[]>({\n value: expanded,\n defaultValue: defaultExpanded,\n onChange: onExpandedChange,\n });\n const expandedSet = React.useMemo(() => new Set(expandedKeys), [expandedKeys]);\n /** Row whose latest expand mounted new rows: only those animate in. */\n const [lastExpandedKey, setLastExpandedKey] = React.useState<React.Key | null>(null);\n\n const [selectedKeys, setSelectedKeys] = useControllableState<React.Key[]>({\n value: selected,\n defaultValue: defaultSelected,\n onChange: onSelectedChange,\n });\n const selectedSet = React.useMemo(() => new Set(selectedKeys), [selectedKeys]);\n\n const totalRows = sortedRows.length;\n const safePageSize = Math.max(1, pageSize);\n const totalPages = Math.max(1, Math.ceil(totalRows / safePageSize));\n const safePage = clamp(pageState, 1, totalPages);\n\n React.useEffect(() => {\n if (safePage !== pageState) setPageState(safePage);\n }, [pageState, safePage, setPageState]);\n\n React.useEffect(() => {\n if (infiniteScroll) {\n setVisibleRowCount(initialVisible);\n return;\n }\n setPageState(1);\n }, [infiniteScroll, initialVisible, setPageState]);\n\n React.useEffect(() => {\n if (!infiniteScroll) return;\n setVisibleRowCount((prev) => clamp(prev, initialVisible, Math.max(initialVisible, totalRows)));\n }, [infiniteScroll, initialVisible, totalRows]);\n\n const displayedRows = React.useMemo(() => {\n if (infiniteScroll) {\n return sortedRows.slice(0, visibleRowCount);\n }\n const from = (safePage - 1) * safePageSize;\n const to = from + safePageSize;\n return sortedRows.slice(from, to);\n }, [infiniteScroll, safePage, safePageSize, sortedRows, visibleRowCount]);\n\n /** Rendered rows in order: page rows plus the sub-rows of expanded rows. */\n const flatRows = React.useMemo(() => {\n const out: FlatRow<Row>[] = [];\n const visit = (\n list: Row[],\n depth: number,\n parentKey: React.Key | null,\n parentAnimate: boolean,\n offset: number,\n ) => {\n list.forEach((row, i) => {\n const key = keyOf(row, offset + i, parentKey);\n const children = expandEnabled ? childrenOf(row) : [];\n const childKeys = children.map((child, ci) => keyOf(child, ci, key));\n const expandable = expandEnabled\n ? (isRowExpandable?.(row) ?? (children.length > 0 || Boolean(renderExpanded)))\n : false;\n const isExpanded = expandable && expandedSet.has(key);\n out.push({\n row,\n key,\n depth,\n childKeys,\n expandable,\n expanded: isExpanded,\n animate: parentAnimate,\n });\n if (isExpanded && children.length > 0) {\n visit(children, depth + 1, key, parentAnimate || lastExpandedKey === key, 0);\n }\n });\n };\n const pageOffset = infiniteScroll ? 0 : (safePage - 1) * safePageSize;\n visit(displayedRows, 0, null, false, pageOffset);\n return out;\n }, [\n childrenOf,\n displayedRows,\n expandEnabled,\n expandedSet,\n infiniteScroll,\n isRowExpandable,\n keyOf,\n lastExpandedKey,\n renderExpanded,\n safePage,\n safePageSize,\n ]);\n\n /** Every row id in the data (all pages, all depths): the scope of \u00ABselect all\u00BB. */\n const allKeys = React.useMemo(() => {\n if (!selectable) return EMPTY_KEYS;\n const out: React.Key[] = [];\n const visit = (list: Row[], parentKey: React.Key | null) => {\n list.forEach((row, i) => {\n const key = keyOf(row, i, parentKey);\n out.push(key);\n const children = getRowChildren?.(row);\n if (children?.length) visit(children, key);\n });\n };\n visit(sortedRows, null);\n return out;\n }, [getRowChildren, keyOf, selectable, sortedRows]);\n\n const selectedInData = selectable ? allKeys.filter((key) => selectedSet.has(key)).length : 0;\n const allSelected = selectable && allKeys.length > 0 && selectedInData === allKeys.length;\n const someSelected = selectedInData > 0 && !allSelected;\n\n // \u2500\u2500\u2500 Selection interactions \u2500\u2500\u2500\n const [announcement, setAnnouncement] = React.useState(\"\");\n const [dragging, setDragging] = React.useState(false);\n const selectedRef = React.useRef(selectedSet);\n selectedRef.current = selectedSet;\n const flatRef = React.useRef(flatRows);\n flatRef.current = flatRows;\n const anchorRef = React.useRef<React.Key | null>(null);\n const shiftKeyRef = React.useRef(false);\n /** The pointer already applied the change: the click that follows must not toggle again. */\n const pointerHandledRef = React.useRef(false);\n /** Set while a cancelled pointer click is dispatched: its checkbox change (if any) is ignored. */\n const ignoreChangeRef = React.useRef(false);\n const dragCleanupRef = React.useRef<(() => void) | null>(null);\n const tableRef = React.useRef<HTMLTableElement | null>(null);\n\n React.useEffect(() => () => dragCleanupRef.current?.(), []);\n\n const selectedCountLabel = labels.selectedCount;\n const commitSelection = React.useCallback(\n (next: Set<React.Key>) => {\n selectedRef.current = next;\n setSelectedKeys(Array.from(next));\n setAnnouncement(selectedCountLabel(next.size));\n },\n [selectedCountLabel, setSelectedKeys],\n );\n\n /** Sets every rendered row between two visible indices (inclusive) to `value`. */\n const applyRange = React.useCallback(\n (from: number, to: number, value: boolean) => {\n const list = flatRef.current;\n const next = new Set(selectedRef.current);\n for (let i = Math.min(from, to); i <= Math.max(from, to); i += 1) {\n const item = list[i];\n if (!item) continue;\n if (value) next.add(item.key);\n else next.delete(item.key);\n }\n commitSelection(next);\n },\n [commitSelection],\n );\n\n const indexOfKey = (key: React.Key | null) =>\n key === null ? -1 : flatRef.current.findIndex((item) => item.key === key);\n\n const selectAt = (index: number, value: boolean, extend: boolean) => {\n const anchorIndex = indexOfKey(anchorRef.current);\n if (extend && anchorIndex >= 0) applyRange(anchorIndex, index, value);\n else applyRange(index, index, value);\n anchorRef.current = flatRef.current[index]?.key ?? null;\n };\n\n const handleSelectPointerDown = (index: number, event: React.PointerEvent<HTMLElement>) => {\n if (event.button !== 0 || event.pointerType === \"touch\") return;\n // No native text selection and no focus jump while pressing / dragging; focus the box ourselves.\n event.preventDefault();\n // `focusVisible: false`: a pointer press shows no ring; Space continues from this box.\n event.currentTarget\n .querySelector(\"input\")\n ?.focus({ preventScroll: true, focusVisible: false } as FocusOptions);\n pointerHandledRef.current = true;\n const key = flatRef.current[index]?.key;\n if (key === undefined) return;\n const value = !selectedRef.current.has(key);\n selectAt(index, value, event.shiftKey);\n\n let last = index;\n let dragActive = false;\n const onMove = (moveEvent: PointerEvent) => {\n const target = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n const cell = target?.closest<HTMLElement>(\"[data-select-index]\");\n if (!cell || !tableRef.current?.contains(cell)) return;\n const nextIndex = Number(cell.dataset.selectIndex);\n if (Number.isNaN(nextIndex) || nextIndex === last) return;\n if (!dragActive) {\n dragActive = true;\n setDragging(true);\n }\n applyRange(last, nextIndex, value);\n last = nextIndex;\n anchorRef.current = flatRef.current[nextIndex]?.key ?? anchorRef.current;\n };\n const stop = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", stop);\n window.removeEventListener(\"pointercancel\", stop);\n dragCleanupRef.current = null;\n setDragging(false);\n };\n dragCleanupRef.current?.();\n dragCleanupRef.current = stop;\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", stop);\n window.addEventListener(\"pointercancel\", stop);\n };\n\n const handleSelectClickCapture = (event: React.MouseEvent<HTMLElement>) => {\n // Pointer clicks were applied on pointerdown (the native toggle lands on the same value), so the\n // change they cause is ignored; keyboard clicks (detail 0) go through.\n if (pointerHandledRef.current && event.detail > 0) {\n pointerHandledRef.current = false;\n ignoreChangeRef.current = true;\n window.setTimeout(() => {\n ignoreChangeRef.current = false;\n }, 0);\n }\n };\n\n const handleSelectAll = () => {\n const next = new Set(selectedRef.current);\n if (allSelected) for (const key of allKeys) next.delete(key);\n else for (const key of allKeys) next.add(key);\n commitSelection(next);\n };\n\n const toggleExpanded = (key: React.Key) => {\n const isOpen = expandedSet.has(key);\n setLastExpandedKey(isOpen ? null : key);\n setExpandedKeys(isOpen ? expandedKeys.filter((k) => k !== key) : [...expandedKeys, key]);\n };\n\n const baseId = React.useId();\n const rowDomId = (key: React.Key) => `${baseId}-row-${domIdPart(key)}`;\n const detailDomId = (key: React.Key) => `${baseId}-detail-${domIdPart(key)}`;\n const leadCount = (selectable ? 1 : 0) + (expandEnabled ? 1 : 0);\n const totalColumns = columns.length + leadCount;\n\n const hasInternalMore = infiniteScroll && displayedRows.length < totalRows;\n const canRequestMore = infiniteScroll && Boolean(onLoadMore) && hasMore && !loadingMore;\n\n const handleReachEnd = React.useCallback(() => {\n if (!infiniteScroll) return;\n\n if (hasInternalMore) {\n setVisibleRowCount((prev) => Math.min(prev + Math.max(1, infiniteBatchSize), totalRows));\n return;\n }\n\n if (canRequestMore && onLoadMore) {\n void onLoadMore();\n }\n }, [canRequestMore, hasInternalMore, infiniteBatchSize, infiniteScroll, onLoadMore, totalRows]);\n\n React.useEffect(() => {\n if (!infiniteScroll) return;\n const root = scrollRef.current;\n const target = sentinelRef.current;\n if (!root || !target) return;\n\n if (typeof IntersectionObserver === \"undefined\") {\n const onScroll = () => {\n const nearBottom = root.scrollTop + root.clientHeight >= root.scrollHeight - 64;\n if (nearBottom) {\n handleReachEnd();\n }\n };\n root.addEventListener(\"scroll\", onScroll);\n return () => root.removeEventListener(\"scroll\", onScroll);\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry?.isIntersecting) {\n handleReachEnd();\n }\n },\n { root, rootMargin: DATA_TABLE_INFINITE_ROOT_MARGIN, threshold: 0.01 },\n );\n\n observer.observe(target);\n return () => observer.disconnect();\n }, [handleReachEnd, infiniteScroll]);\n\n const fromRow = totalRows === 0 ? 0 : infiniteScroll ? 1 : (safePage - 1) * safePageSize + 1;\n const toRow =\n totalRows === 0\n ? 0\n : infiniteScroll\n ? displayedRows.length\n : fromRow + displayedRows.length - 1;\n\n const hasError = error != null && error !== false;\n const showSkeleton = !hasError && loading && displayedRows.length === 0;\n const showEmpty = !hasError && !loading && displayedRows.length === 0;\n /* \u00AB\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E 0\u20130 \u0438\u0437 0\u00BB means nothing in loading / empty / error states: the body already says it. */\n const showRangeMeta = !hasError && !showSkeleton && !showEmpty && totalRows > 0;\n const showPaginationControl = !infiniteScroll && showPagination && totalPages > 1;\n const showInfiniteMeta =\n !hasError && infiniteScroll && (hasInternalMore || loadingMore || canRequestMore);\n const showFooter = showRangeMeta || showPaginationControl || showInfiniteMeta;\n const bodyRows = hasError ? [] : flatRows;\n const skeletonCount = Math.max(1, loadingRows ?? Math.min(safePageSize, SKELETON_DEFAULT_ROWS));\n\n return (\n <ControlSizeProvider value={size}>\n <div\n className={cx(styles.root, className)}\n {...toDataAttributes({\n size,\n divider: dividerStyle,\n \"column-dividers\": columnDividers,\n \"show-header\": showHeader,\n \"sticky-header\": stickyHeader,\n \"sticky-first-column\": stickyFirstColumn,\n \"table-width\": fillWidth ? \"fill\" : \"auto\",\n \"highlight-row\": highlightRowOnHover,\n \"highlight-column\": highlightColumnOnHover,\n striped,\n loading: loading || undefined,\n selectable: selectable || undefined,\n expandable: expandEnabled || undefined,\n dragging: dragging || undefined,\n })}\n >\n {toolbar != null ? <div className={styles.toolbar}>{toolbar}</div> : null}\n\n <ScrollContainer\n ref={scrollRef}\n axis=\"both\"\n overscrollBehavior=\"auto\"\n className={styles.viewport}\n >\n <table\n ref={tableRef}\n className={styles.table}\n aria-busy={loading || loadingMore ? true : undefined}\n onMouseLeave={highlightColumnOnHover ? clearHoveredColumn : undefined}\n >\n {showHeader ? (\n <thead className={styles.head}>\n <tr className={styles.headRow}>\n {selectable ? (\n <th\n scope=\"col\"\n className={cx(\n styles.headCell,\n styles.selectCell,\n stickyFirstColumn && styles.stickyLead,\n stickyFirstColumn && stickyHeader && styles.cornerCellSticky,\n )}\n >\n <Checkbox.Root\n size={size}\n checked={allSelected}\n indeterminate={someSelected}\n disabled={allKeys.length === 0}\n onCheckedChange={handleSelectAll}\n aria-label={labels.selectAll}\n >\n <Checkbox.Label />\n </Checkbox.Root>\n </th>\n ) : null}\n {expandEnabled ? (\n <th\n scope=\"col\"\n className={cx(\n styles.headCell,\n styles.toggleCell,\n stickyFirstColumn && styles.stickyLead,\n stickyFirstColumn && stickyHeader && styles.cornerCellSticky,\n )}\n />\n ) : null}\n {columns.map((column, columnIndex) => {\n const align = columnAlign(column);\n const indicator = sortIndicator(sortState, column.id);\n const isSortable = Boolean(column.sortable);\n const isFirstColumn = columnIndex === 0;\n return (\n <th\n key={column.id}\n className={cx(\n styles.headCell,\n stickyFirstColumn && isFirstColumn && styles.firstColumnSticky,\n stickyHeader &&\n stickyFirstColumn &&\n isFirstColumn &&\n styles.cornerCellSticky,\n )}\n style={columnSizeStyle(column)}\n data-align={align}\n data-sortable={isSortable ? \"true\" : undefined}\n data-sorted={isSortable && indicator !== \"none\" ? \"true\" : undefined}\n aria-sort={isSortable ? ariaSortValue(indicator) : undefined}\n data-first-column={isFirstColumn ? \"true\" : undefined}\n data-column-id={column.id}\n data-column-hovered={\n highlightColumnOnHover && hoveredColumnId === column.id\n ? \"true\"\n : undefined\n }\n scope=\"col\"\n onMouseEnter={() => setHoveredColumn(column.id)}\n onClick={(event) => {\n column.onHeaderClick?.(event);\n if (!isSortable) return;\n const next = nextOrder(sortState, column.id);\n setSortState(next);\n setPageState(1);\n }}\n >\n {isSortable ? (\n <button type=\"button\" className={styles.sortButton}>\n <span className={styles.headLabel}>{column.header}</span>\n <span className={styles.sortIcon} aria-hidden=\"true\">\n {indicator === \"asc\" ? (\n <ArrowUp className={styles.sortGlyph} strokeWidth={2} />\n ) : indicator === \"desc\" ? (\n <ArrowDown className={styles.sortGlyph} strokeWidth={2} />\n ) : (\n <ArrowUpDown className={styles.sortGlyph} strokeWidth={2} />\n )}\n </span>\n </button>\n ) : (\n <span className={styles.headLabel}>{column.header}</span>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n ) : null}\n\n <tbody className={styles.body}>\n {hasError ? (\n <tr>\n <td colSpan={totalColumns} className={cx(styles.stateCell, styles.stateError)}>\n <div className={styles.stateContent} role=\"alert\">\n {error}\n </div>\n </td>\n </tr>\n ) : null}\n\n {showSkeleton\n ? Array.from({ length: skeletonCount }, (_, rowIndex) => (\n <tr\n // biome-ignore lint/suspicious/noArrayIndexKey: static placeholder rows\n key={`skeleton-${rowIndex}`}\n className={cx(styles.row, styles.skeletonRow)}\n data-skeleton=\"true\"\n >\n {selectable ? (\n <td className={cx(styles.cell, styles.selectCell)}>\n <span className={styles.skeleton} aria-hidden=\"true\" />\n </td>\n ) : null}\n {expandEnabled ? <td className={cx(styles.cell, styles.toggleCell)} /> : null}\n {columns.map((column) => (\n <td\n key={column.id}\n className={styles.cell}\n style={columnSizeStyle(column)}\n data-align={columnAlign(column)}\n >\n <span className={styles.skeleton} aria-hidden=\"true\" />\n </td>\n ))}\n </tr>\n ))\n : null}\n\n {showEmpty ? (\n <tr>\n <td colSpan={totalColumns} className={styles.stateCell}>\n <div className={styles.stateContent}>{empty ?? labels.empty}</div>\n </td>\n </tr>\n ) : null}\n\n {bodyRows.map((item, index) => {\n const { row, key, depth } = item;\n const isSelected = selectable && selectedSet.has(key);\n const rowLabel = getRowLabel?.(row);\n const detail = item.expanded && renderExpanded ? renderExpanded(row) : null;\n const hasDetail = detail !== null && detail !== undefined && detail !== false;\n const controls = [\n ...(hasDetail ? [detailDomId(key)] : []),\n ...(item.expanded ? item.childKeys.map(rowDomId) : []),\n ].join(\" \");\n const tr = (\n <tr\n id={rowDomId(key)}\n className={styles.row}\n style={depth > 0 ? ({ \"--dt-depth\": depth } as React.CSSProperties) : undefined}\n data-stripe={striped && index % 2 === 1 ? \"alt\" : undefined}\n data-clickable={onRowClick ? \"true\" : undefined}\n data-depth={depth > 0 ? depth : undefined}\n data-expanded={item.expanded ? \"true\" : undefined}\n data-animate={item.animate ? \"true\" : undefined}\n aria-selected={selectable ? isSelected : undefined}\n onClick={(event) => onRowClick?.(row, index, event)}\n >\n {selectable ? (\n <td\n className={cx(\n styles.cell,\n styles.selectCell,\n stickyFirstColumn && styles.stickyLead,\n )}\n data-select-index={index}\n onPointerDown={(event) => handleSelectPointerDown(index, event)}\n onClickCapture={handleSelectClickCapture}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n shiftKeyRef.current = event.shiftKey;\n }}\n >\n <Checkbox.Root\n size={size}\n checked={isSelected}\n onCheckedChange={(value) => {\n if (ignoreChangeRef.current) return;\n selectAt(index, value, shiftKeyRef.current);\n shiftKeyRef.current = false;\n }}\n aria-label={labels.selectRow(rowLabel)}\n >\n <Checkbox.Label />\n </Checkbox.Root>\n </td>\n ) : null}\n {expandEnabled ? (\n <td\n className={cx(\n styles.cell,\n styles.toggleCell,\n stickyFirstColumn && styles.stickyLead,\n )}\n >\n {item.expandable ? (\n <Button.Root\n variant=\"ghost\"\n tone=\"neutral\"\n size={TOGGLE_SIZE[size]}\n className={styles.toggle}\n aria-expanded={item.expanded}\n aria-controls={controls || undefined}\n aria-label={\n item.expanded ? labels.collapse(rowLabel) : labels.expand(rowLabel)\n }\n onClick={(event) => {\n event.stopPropagation();\n toggleExpanded(key);\n }}\n >\n <Button.Icon>\n <ChevronRight className={styles.chevron} strokeWidth={2} />\n </Button.Icon>\n </Button.Root>\n ) : null}\n </td>\n ) : null}\n {columns.map((column, columnIndex) => {\n const isFirstColumn = columnIndex === 0;\n const isCellClickable = Boolean(column.onCellClick);\n const content = renderColumnCell(row, column);\n return (\n <td\n key={column.id}\n className={cx(\n styles.cell,\n stickyFirstColumn && isFirstColumn && styles.firstColumnSticky,\n )}\n style={columnSizeStyle(column)}\n data-align={columnAlign(column)}\n data-numeric={column.numeric ? \"true\" : undefined}\n data-first-column={isFirstColumn ? \"true\" : undefined}\n data-column-id={column.id}\n data-column-hovered={\n highlightColumnOnHover && hoveredColumnId === column.id\n ? \"true\"\n : undefined\n }\n onMouseEnter={() => setHoveredColumn(column.id)}\n onClick={(event) => column.onCellClick?.(row, event)}\n role={isCellClickable ? \"button\" : undefined}\n tabIndex={isCellClickable ? 0 : undefined}\n onKeyDown={\n isCellClickable\n ? (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n column.onCellClick?.(row, event);\n }\n }\n : undefined\n }\n >\n {column.truncate ? (\n <span\n className={styles.truncate}\n style={{ maxWidth: column.maxWidth ?? column.width }}\n title={\n typeof content === \"string\" || typeof content === \"number\"\n ? String(content)\n : undefined\n }\n >\n {content}\n </span>\n ) : (\n content\n )}\n </td>\n );\n })}\n </tr>\n );\n // One keyed fragment either way, so opening the detail never remounts the row\n // (the toggle keeps focus).\n return (\n <React.Fragment key={String(key)}>\n {tr}\n {hasDetail ? (\n <tr\n id={detailDomId(key)}\n className={styles.detailRow}\n data-animate={lastExpandedKey === key || item.animate ? \"true\" : undefined}\n >\n <td colSpan={totalColumns} className={styles.detailCell}>\n <div className={styles.detailMotion}>\n <div className={styles.detailContent}>{detail}</div>\n </div>\n </td>\n </tr>\n ) : null}\n </React.Fragment>\n );\n })}\n </tbody>\n </table>\n\n {infiniteScroll ? (\n <div ref={sentinelRef} className={styles.sentinel} aria-hidden=\"true\" />\n ) : null}\n </ScrollContainer>\n\n {showSkeleton ? (\n <span className={styles.srOnly} role=\"status\">\n {labels.loading}\n </span>\n ) : null}\n\n {selectable ? (\n <span className={styles.srOnly} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </span>\n ) : null}\n\n {showFooter ? (\n <div className={styles.footer}>\n {showRangeMeta ? (\n <p className={styles.meta}>{labels.range(fromRow, toRow, totalRows)}</p>\n ) : null}\n\n {showPaginationControl ? (\n <Pagination.Root\n className={styles.pagination}\n value={safePage}\n totalPages={totalPages}\n onValueChange={setPageState}\n siblingCount={siblingCount}\n size={paginationSize ?? size}\n compact=\"auto\"\n />\n ) : null}\n\n {showInfiniteMeta ? (\n <p className={styles.meta} aria-live=\"polite\">\n {loadingMore ? labels.loadingMore : labels.scrollForMore}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n </ControlSizeProvider>\n );\n}\n\nDataTableRoot.displayName = \"DataTableRoot\";\n\nexport const DataTable = {\n Root: DataTableRoot,\n};\n", "export const CSS_PX_SUFFIX = \"px\";\nexport const DATA_TABLE_INFINITE_ROOT_MARGIN = \"0px 0px 120px 0px\";\n", "import { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Pagination.module.css\";\n\nfunction buildPageRange(page: number, total: number, siblings: number): Array<number | \"...\"> {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n\n const left = Math.max(2, page - siblings);\n const right = Math.min(total - 1, page + siblings);\n\n const showLeftEllipsis = left > 2;\n const showRightEllipsis = right < total - 1;\n\n const pages: Array<number | \"...\"> = [1];\n if (showLeftEllipsis) pages.push(\"...\");\n for (let i = left; i <= right; i++) pages.push(i);\n if (showRightEllipsis) pages.push(\"...\");\n pages.push(total);\n\n return pages;\n}\n\n/** \u0422\u0435\u043A\u0441\u0442\u044B \u0434\u043B\u044F \u0430\u0441\u0441\u0438\u0441\u0442\u0438\u0432\u043D\u044B\u0445 \u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0439; \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C. */\nexport type PaginationLabels = {\n /** `aria-label` \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. */\n nav: string;\n previous: string;\n next: string;\n /** `aria-label` \u043A\u043D\u043E\u043F\u043A\u0438 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. */\n page: (page: number) => string;\n /** \u0421\u043A\u0440\u044B\u0442\u044B\u0439 \u043F\u0440\u0435\u0434\u043B\u043E\u0433 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0438 \u043E\u0431\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435\u0439 \u0432 \u043A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u043E\u043C \u0432\u0438\u0434\u0435 (\u00AB3 \u0438\u0437 12\u00BB). */\n of: string;\n};\n\nconst DEFAULT_PAGINATION_LABELS: PaginationLabels = {\n nav: \"\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u043F\u043E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\u043C\",\n previous: \"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\",\n next: \"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\",\n page: (page) => `\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 ${page}`,\n of: \"\u0438\u0437\",\n};\n\nexport type PaginationRootProps = {\n /** Current page (1-based), controlled. */\n value?: number;\n /** Initial page when uncontrolled. Default `1`. */\n defaultValue?: number;\n onValueChange?: (page: number) => void;\n totalPages: number;\n /** Pages shown on each side of the current one before an ellipsis. Default `1`. */\n siblingCount?: number;\n /** \u042F\u0440\u0443\u0441 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043E\u0432: \u0432\u044B\u0441\u043E\u0442\u0430 \u043A\u043D\u043E\u043F\u043E\u043A = `--prime-control-<size>-height`. */\n size?: ControlSize;\n /**\n * \u041A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C: \u0441\u0442\u0440\u0435\u043B\u043A\u0438 + \u00AB\u0442\u0435\u043A\u0443\u0449\u0430\u044F / \u0432\u0441\u0435\u0433\u043E\u00BB \u0432\u043C\u0435\u0441\u0442\u043E \u0440\u044F\u0434\u0430 \u043D\u043E\u043C\u0435\u0440\u043E\u0432.\n * `\"auto\"` \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u0435\u0442 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044E \u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0443 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F \u0438 \u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u044B\u0439 \u0432\u0438\u0434 \u043D\u0430 \u0443\u0437\u043A\u043E\u0439 \u0448\u0438\u0440\u0438\u043D\u0435\n * (container query).\n */\n compact?: boolean | \"auto\";\n /** \u0422\u0435\u043A\u0441\u0442\u044B \u0434\u043B\u044F \u0441\u043A\u0440\u0438\u043D\u0440\u0438\u0434\u0435\u0440\u043E\u0432 (\u0447\u0430\u0441\u0442\u0438\u0447\u043D\u043E). */\n labels?: Partial<PaginationLabels>;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLElement>, \"defaultValue\" | \"onChange\">;\n\nfunction PaginationRoot({\n value,\n defaultValue = 1,\n onValueChange,\n totalPages,\n siblingCount = 1,\n size = \"m\",\n compact = false,\n labels,\n className,\n ...rest\n}: PaginationRootProps) {\n const [page, setPage] = useControllableState({ value, defaultValue, onChange: onValueChange });\n\n if (totalPages < 1) {\n return null;\n }\n\n const safePage = Math.min(Math.max(1, page), totalPages);\n const onPageChange = (next: number) => {\n if (next !== safePage) setPage(next);\n };\n const pages = buildPageRange(safePage, totalPages, siblingCount);\n const compactMode = compact === \"auto\" ? \"auto\" : compact ? \"true\" : \"false\";\n const text = { ...DEFAULT_PAGINATION_LABELS, ...labels };\n\n return (\n <nav\n {...rest}\n aria-label={text.nav}\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, compact: compactMode })}\n >\n <div className={styles.list}>\n <button\n type=\"button\"\n className={styles.button}\n disabled={safePage <= 1}\n onClick={() => onPageChange(safePage - 1)}\n aria-label={text.previous}\n >\n <ChevronLeft className={styles.icon} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n\n {compactMode !== \"true\"\n ? pages.map((p, i) =>\n p === \"...\" ? (\n <span\n key={`ellipsis-after-${pages[i - 1]}-before-${pages[i + 1]}`}\n className={cx(styles.ellipsis, styles.pageItem)}\n aria-hidden=\"true\"\n >\n \u2026\n </span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cx(styles.button, styles.pageItem)}\n data-current={p === safePage ? \"true\" : undefined}\n onClick={() => onPageChange(p)}\n aria-current={p === safePage ? \"page\" : undefined}\n aria-label={text.page(p)}\n >\n {p}\n </button>\n ),\n )\n : null}\n\n {compactMode !== \"false\" ? (\n <span className={styles.summary}>\n <span className={styles.summaryCurrent}>{safePage}</span>\n <span aria-hidden=\"true\">/</span>\n <span className={styles.srOnly}>{text.of}</span>\n <span>{totalPages}</span>\n </span>\n ) : null}\n\n <button\n type=\"button\"\n className={styles.button}\n disabled={safePage >= totalPages}\n onClick={() => onPageChange(safePage + 1)}\n aria-label={text.next}\n >\n <ChevronRight className={styles.icon} strokeWidth={2} aria-hidden=\"true\" />\n </button>\n </div>\n </nav>\n );\n}\n\nPaginationRoot.displayName = \"PaginationRoot\";\n\nexport const Pagination = { Root: PaginationRoot };\n", ".root {\n --pg-size: var(--prime-control-m-height);\n --pg-radius: var(--prime-control-m-radius);\n --pg-text-size: var(--prime-control-m-text-size);\n --pg-line-height: var(--prime-control-m-line-height);\n --pg-icon: var(--prime-control-m-icon);\n --pg-gap: var(--prime-space-1);\n\n display: inline-flex;\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --pg-size: var(--prime-control-xs-height);\n --pg-radius: var(--prime-control-xs-radius);\n --pg-text-size: var(--prime-control-xs-text-size);\n --pg-line-height: var(--prime-control-xs-line-height);\n --pg-icon: var(--prime-control-xs-icon);\n --pg-gap: 0;\n}\n\n.root[data-size=\"s\"] {\n --pg-size: var(--prime-control-s-height);\n --pg-radius: var(--prime-control-s-radius);\n --pg-text-size: var(--prime-control-s-text-size);\n --pg-line-height: var(--prime-control-s-line-height);\n --pg-icon: var(--prime-control-s-icon);\n}\n\n.root[data-size=\"l\"] {\n --pg-size: var(--prime-control-l-height);\n --pg-radius: var(--prime-control-l-radius);\n --pg-text-size: var(--prime-control-l-text-size);\n --pg-line-height: var(--prime-control-l-line-height);\n --pg-icon: var(--prime-control-l-icon);\n}\n\n.root[data-size=\"xl\"] {\n --pg-size: var(--prime-control-xl-height);\n --pg-radius: var(--prime-control-xl-radius);\n --pg-text-size: var(--prime-control-xl-text-size);\n --pg-line-height: var(--prime-control-xl-line-height);\n --pg-icon: var(--prime-control-xl-icon);\n --pg-gap: var(--prime-space-2);\n}\n\n/* `compact=\"auto\"`: the nav fills its parent and becomes a size container for the list. */\n.root[data-compact=\"auto\"] {\n display: block;\n width: 100%;\n container-type: inline-size;\n}\n\n.list {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--pg-gap);\n min-width: 0;\n}\n\n.root[data-compact=\"auto\"] .list {\n justify-content: flex-end;\n}\n\n.button {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n min-width: var(--pg-size);\n height: var(--pg-size);\n margin: 0;\n padding: 0 var(--prime-space-1);\n border: 0;\n border-radius: var(--pg-radius);\n background: transparent;\n color: var(--prime-color-text-secondary);\n font: inherit;\n font-size: var(--pg-text-size);\n line-height: var(--pg-line-height);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.button:hover:not(:disabled) {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.button:active:not(:disabled) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.button:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.button[data-current=\"true\"],\n.button[data-current=\"true\"]:hover {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.button:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.icon {\n width: var(--pg-icon);\n height: var(--pg-icon);\n flex-shrink: 0;\n}\n\n.ellipsis {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n min-width: var(--pg-size);\n height: var(--pg-size);\n color: var(--prime-color-text-muted);\n font-size: var(--pg-text-size);\n line-height: var(--pg-line-height);\n user-select: none;\n}\n\n.summary {\n display: inline-flex;\n align-items: center;\n gap: var(--prime-space-1);\n padding-inline: var(--prime-space-2);\n font-size: var(--pg-text-size);\n line-height: var(--pg-line-height);\n color: var(--prime-color-text-muted);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.summaryCurrent {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.root[data-compact=\"auto\"] .summary {\n display: none;\n}\n\n@container (max-width: 22rem) {\n .root[data-compact=\"auto\"] .pageItem {\n display: none;\n }\n\n .root[data-compact=\"auto\"] .summary {\n display: inline-flex;\n }\n\n .root[data-compact=\"auto\"] .list {\n justify-content: space-between;\n }\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n", "/*\n * DataTable \u2014 Graphite.\n * Surface container (bg-surface, card radius, no outer border), sunken head, hairline row separators.\n * Density follows `size`: xs/s = compact (row-height-s), m = default (row-height-m), l/xl = comfortable (row-height-l).\n */\n\n.root {\n --dt-row-height: var(--prime-table-row-height-m);\n --dt-head-height: var(--prime-control-m-height);\n --dt-head-size: var(--prime-control-m-label-size);\n --dt-head-line-height: var(--prime-control-m-label-line-height);\n --dt-pad-x: var(--prime-table-cell-padding-x);\n --dt-gap: var(--prime-space-2);\n --dt-text-size: var(--prime-control-m-text-size);\n --dt-text-line-height: var(--prime-control-m-line-height);\n --dt-sort-icon: var(--prime-control-m-icon);\n --dt-choice: var(--prime-control-m-choice);\n /* Expand toggle: square ghost button one tier below the table (m \u2192 xs, 28). */\n --dt-toggle: var(--prime-control-xs-height);\n /* Sub-row indent per depth: an avatar of the tier + the cell gap, so a child's content starts\n * under the parent's text. Override `--dt-indent` on the root for other leading content. */\n --dt-indent: calc(var(--prime-avatar-m) + var(--dt-gap));\n /* Leading utility columns (selection, expand toggle); widths include padding. */\n --dt-select-w: calc(var(--dt-choice) + 2 * var(--dt-pad-x));\n --dt-toggle-w: var(--dt-toggle);\n\n /* Bounded block: card-bg contrasts with the host plane (surface on canvas, sunken on a surface). */\n --dt-surface: var(--prime-color-card-bg);\n /* One opaque step off the table fill, so sticky head and zebra rows stay visible on either host. */\n --dt-step: color-mix(in srgb, var(--dt-surface) 96%, var(--prime-color-text-primary));\n /* Two steps: on the canvas one step off white equals the canvas, and the table's top edge vanishes. */\n --dt-head-bg: color-mix(in srgb, var(--dt-surface) 92%, var(--prime-color-text-primary));\n --dt-divider-color: var(--prime-color-border-subtle);\n --dt-divider-style: solid;\n --dt-divider-width: var(--prime-border-width);\n --dt-column-divider-width: 0;\n\n --dt-z-sticky-first-column: 1;\n --dt-z-sticky-header: 2;\n --dt-z-sticky-corner: 3;\n\n /* Surface context: fields inside the table are one step off the surface. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border-radius: var(--prime-card-radius);\n background: var(--dt-surface);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n}\n\n/* Header is one step below the cell text of the same tier; heights follow the control tiers. */\n.root[data-size=\"xs\"] {\n --dt-row-height: var(--prime-table-row-height-s);\n --dt-head-height: var(--prime-control-xs-height);\n --dt-head-size: var(--prime-control-xs-label-size);\n --dt-head-line-height: var(--prime-control-xs-label-line-height);\n --dt-pad-x: var(--prime-space-2);\n --dt-text-size: var(--prime-control-xs-text-size);\n --dt-text-line-height: var(--prime-control-xs-line-height);\n --dt-sort-icon: var(--prime-control-xs-icon);\n --dt-choice: var(--prime-control-xs-choice);\n --dt-indent: calc(var(--prime-avatar-xs) + var(--dt-gap));\n}\n\n.root[data-size=\"s\"] {\n --dt-row-height: var(--prime-table-row-height-s);\n --dt-head-height: var(--prime-control-s-height);\n --dt-head-size: var(--prime-control-s-label-size);\n --dt-head-line-height: var(--prime-control-s-label-line-height);\n --dt-text-size: var(--prime-control-s-text-size);\n --dt-text-line-height: var(--prime-control-s-line-height);\n --dt-sort-icon: var(--prime-control-s-icon);\n --dt-choice: var(--prime-control-s-choice);\n --dt-indent: calc(var(--prime-avatar-s) + var(--dt-gap));\n}\n\n.root[data-size=\"l\"] {\n --dt-row-height: var(--prime-table-row-height-l);\n --dt-head-height: var(--prime-control-l-height);\n --dt-head-size: var(--prime-control-l-label-size);\n --dt-head-line-height: var(--prime-control-l-label-line-height);\n --dt-text-size: var(--prime-control-l-text-size);\n --dt-text-line-height: var(--prime-control-l-line-height);\n --dt-sort-icon: var(--prime-control-l-icon);\n --dt-choice: var(--prime-control-l-choice);\n --dt-toggle: var(--prime-control-s-height);\n --dt-indent: calc(var(--prime-avatar-l) + var(--dt-gap));\n}\n\n.root[data-size=\"xl\"] {\n --dt-row-height: var(--prime-table-row-height-l);\n --dt-head-height: var(--prime-control-xl-height);\n --dt-head-size: var(--prime-control-xl-label-size);\n --dt-head-line-height: var(--prime-control-xl-label-line-height);\n --dt-pad-x: var(--prime-space-4);\n --dt-text-size: var(--prime-control-xl-text-size);\n --dt-text-line-height: var(--prime-control-xl-line-height);\n --dt-sort-icon: var(--prime-control-xl-icon);\n --dt-choice: var(--prime-control-xl-choice);\n --dt-toggle: var(--prime-control-s-height);\n --dt-indent: calc(var(--prime-avatar-l) + var(--dt-gap));\n}\n\n/* Without a selection column the toggle column is first and carries the leading cell padding. */\n.root[data-expandable=\"true\"]:not([data-selectable=\"true\"]) {\n --dt-toggle-w: calc(var(--dt-toggle) + var(--dt-pad-x));\n}\n\n.root[data-selectable=\"true\"] {\n --dt-lead: var(--dt-select-w);\n}\n\n.root[data-expandable=\"true\"] {\n --dt-lead: var(--dt-toggle-w);\n}\n\n.root[data-selectable=\"true\"][data-expandable=\"true\"] {\n --dt-lead: calc(var(--dt-select-w) + var(--dt-toggle-w));\n}\n\n/* Only while dragging across checkboxes: no native text selection. */\n.root[data-dragging=\"true\"] {\n user-select: none;\n}\n\n.root[data-divider=\"dashed\"] {\n --dt-divider-style: dashed;\n}\n\n.root[data-divider=\"dotted\"] {\n --dt-divider-style: dotted;\n}\n\n.root[data-divider=\"none\"] {\n --dt-divider-width: 0;\n}\n\n.root[data-column-dividers=\"true\"] {\n --dt-column-divider-width: var(--prime-border-width);\n}\n\n/* ---------- Toolbar ---------- */\n\n.toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-2);\n padding: var(--prime-space-3) var(--dt-pad-x);\n}\n\n.toolbar > * {\n min-width: 0;\n}\n\n/* ---------- Viewport & table ---------- */\n\n/* Full-bleed: head and rows touch the container edges; the root clips them to its radius.\n * Focusables at the edges (sort buttons, clickable cells) use the inset focus ring. */\n.viewport {\n width: 100%;\n padding: 0;\n isolation: isolate;\n /* No rubber-band: an elastic overscroll would pull rows away from the sticky head and column. */\n overscroll-behavior: none;\n}\n\n.table {\n width: max-content;\n border-collapse: separate;\n border-spacing: 0;\n font-size: var(--dt-text-size);\n line-height: var(--dt-text-line-height);\n}\n\n.root[data-table-width=\"fill\"] .table {\n width: 100%;\n min-width: max-content;\n}\n\n/* ---------- Head ---------- */\n\n.headCell {\n height: var(--dt-head-height);\n padding: 0 var(--dt-pad-x);\n background: var(--dt-head-bg);\n font-size: var(--dt-head-size);\n line-height: var(--dt-head-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-muted);\n text-align: start;\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.headCell[data-sorted=\"true\"] {\n color: var(--prime-color-text-secondary);\n}\n\n.headCell[data-align=\"center\"] {\n text-align: center;\n}\n\n.headCell[data-align=\"end\"] {\n text-align: end;\n}\n\n.headCell + .headCell {\n border-inline-start: var(--dt-column-divider-width) solid var(--dt-divider-color);\n}\n\n.root[data-sticky-header=\"true\"] .headCell {\n position: sticky;\n top: 0;\n z-index: var(--dt-z-sticky-header);\n}\n\n.headLabel {\n display: inline-block;\n min-width: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n vertical-align: middle;\n}\n\n.sortButton {\n display: inline-flex;\n align-items: center;\n gap: var(--prime-space-1);\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-xs);\n background: none;\n color: inherit;\n font: inherit;\n letter-spacing: inherit;\n text-align: inherit;\n cursor: pointer;\n user-select: none;\n vertical-align: middle;\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.headCell[data-align=\"end\"] .sortButton {\n flex-direction: row-reverse;\n}\n\n.sortButton:hover {\n color: var(--prime-color-text-primary);\n}\n\n/*\n * Inset ring on the whole head cell: the header sits at the edge of the scrolling viewport, and\n * the sort button has no padding, so a ring on the button itself would cut through its label.\n */\n.sortButton:focus-visible {\n outline: none;\n}\n\n.headCell:has(.sortButton:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.sortIcon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--dt-sort-icon);\n height: var(--dt-sort-icon);\n color: var(--prime-color-text-placeholder);\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.sortButton:hover .sortIcon,\n.sortButton:focus-visible .sortIcon {\n color: var(--prime-color-text-secondary);\n}\n\n.headCell[data-sorted=\"true\"] .sortIcon {\n color: var(--prime-color-accent-text);\n}\n\n.sortGlyph {\n width: 100%;\n height: 100%;\n}\n\n/* ---------- Body ---------- */\n\n/*\n * Every cell paints an opaque base (`--dt-cell-bg`) plus a translucent wash (`--dt-wash`), so sticky\n * cells stay opaque while hover / stripe / column highlight compose without extra colors.\n */\n.row {\n --dt-cell-bg: var(--dt-surface);\n --dt-wash: transparent;\n}\n\n.cell {\n height: var(--dt-row-height);\n padding: 0 var(--dt-pad-x);\n background-color: var(--dt-cell-bg);\n background-image: linear-gradient(var(--dt-wash), var(--dt-wash));\n color: var(--prime-color-text-primary);\n text-align: start;\n vertical-align: middle;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.cell[data-align=\"center\"] {\n text-align: center;\n}\n\n.cell[data-align=\"end\"] {\n text-align: end;\n}\n\n.cell[data-numeric=\"true\"] {\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.cell + .cell {\n border-inline-start: var(--dt-column-divider-width) solid var(--dt-divider-color);\n}\n\n.row + .row .cell {\n border-top: var(--dt-divider-width) var(--dt-divider-style) var(--dt-divider-color);\n}\n\n/* ---------- Leading utility columns ---------- */\n\n/* Selection (checkbox) column: fixed width = control + paddings, centered. */\n.selectCell {\n box-sizing: border-box;\n width: var(--dt-select-w);\n min-width: var(--dt-select-w);\n max-width: var(--dt-select-w);\n padding-inline: var(--dt-pad-x);\n line-height: 0;\n text-align: center;\n}\n\n/* The whole cell is the press-and-drag target. */\n.row > .selectCell {\n cursor: pointer;\n}\n\n/* Expand toggle column: the button only; the next cell's padding is the gap to the content. */\n.toggleCell {\n box-sizing: border-box;\n width: var(--dt-toggle-w);\n min-width: var(--dt-toggle-w);\n max-width: var(--dt-toggle-w);\n padding-inline: 0;\n line-height: 0;\n}\n\n.root:not([data-selectable=\"true\"]) .toggleCell {\n padding-inline-start: var(--dt-pad-x);\n}\n\n/* Lead columns read as one block with the content: no column divider inside them. */\n.toggleCell,\n.selectCell + .cell,\n.toggleCell + .cell,\n.selectCell + .headCell,\n.toggleCell + .headCell {\n border-inline-start-width: 0;\n}\n\n.chevron {\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.toggle[aria-expanded=\"true\"] .chevron {\n transform: rotate(90deg);\n}\n\n/* Sub-rows: the first content cell is indented by depth. */\n.row[data-depth] > .cell[data-first-column=\"true\"] {\n padding-inline-start: calc(var(--dt-pad-x) + var(--dt-depth) * var(--dt-indent));\n}\n\n.truncate {\n display: block;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.root[data-striped=\"true\"] .row[data-stripe=\"alt\"] {\n --dt-cell-bg: var(--dt-step);\n}\n\n.root[data-highlight-row=\"true\"] .row:hover {\n --dt-wash: var(--prime-color-fill-subtle);\n}\n\n.root[data-highlight-column=\"true\"] .cell[data-column-hovered=\"true\"],\n.root[data-highlight-column=\"true\"] .headCell[data-column-hovered=\"true\"] {\n background-image: linear-gradient(var(--prime-color-fill-subtle), var(--prime-color-fill-subtle));\n}\n\n/* Expanded parent: one opaque step off the table fill, so its group reads as one. */\n.row[data-expanded=\"true\"] {\n --dt-cell-bg: var(--dt-step);\n}\n\n.row[data-expanded=\"true\"] > .cell[data-first-column=\"true\"] {\n font-weight: var(--prime-font-weight-medium);\n}\n\n/* Rows mounted by an expand slide in from under their parent. */\n.row[data-animate=\"true\"] > .cell {\n animation: dt-row-enter var(--prime-motion-duration-base) var(--prime-motion-easing-enter) both;\n}\n\n@keyframes dt-row-enter {\n from {\n opacity: 0;\n transform: translateY(calc(-1 * var(--prime-space-1)));\n }\n}\n\n/* Detail panel under an expanded row: sunken step, content aligned with the first content column. */\n.detailCell {\n padding: 0;\n background: var(--dt-step);\n border-top: var(--dt-divider-width) var(--dt-divider-style) var(--dt-divider-color);\n}\n\n.detailMotion {\n display: grid;\n grid-template-rows: 1fr;\n}\n\n.detailRow[data-animate=\"true\"] .detailMotion {\n animation: dt-detail-enter var(--prime-motion-duration-slow) var(--prime-motion-easing-enter) both;\n}\n\n@keyframes dt-detail-enter {\n from {\n grid-template-rows: 0fr;\n opacity: 0;\n }\n}\n\n/* Padded content (focus-space kept) inside the clipping wrapper. */\n.detailContent {\n min-height: 0;\n overflow: hidden;\n padding: var(--prime-space-3) var(--dt-pad-x) var(--prime-space-4)\n calc(var(--dt-lead) + var(--dt-pad-x));\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n color: var(--prime-color-text-secondary);\n}\n\n.detailRow + .row .cell {\n border-top: var(--dt-divider-width) var(--dt-divider-style) var(--dt-divider-color);\n}\n\n.row[aria-selected=\"true\"] {\n --dt-cell-bg: var(--prime-color-accent-soft);\n --dt-wash: transparent;\n}\n\n.root[data-highlight-row=\"true\"] .row[aria-selected=\"true\"]:hover {\n --dt-cell-bg: var(--prime-color-accent-soft-hover);\n}\n\n.row[data-clickable=\"true\"] {\n cursor: pointer;\n}\n\n.root[data-highlight-row=\"true\"] .row[data-clickable=\"true\"]:active {\n --dt-wash: var(--prime-color-fill-subtle-active);\n}\n\n.cell[role=\"button\"] {\n cursor: pointer;\n}\n\n.cell[role=\"button\"]:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n/* ---------- Sticky first column ---------- */\n\n.firstColumnSticky {\n position: sticky;\n left: var(--dt-lead, 0);\n z-index: var(--dt-z-sticky-first-column);\n box-shadow: inset calc(-1 * var(--prime-border-width)) 0 0 var(--dt-divider-color);\n}\n\n.headCell.firstColumnSticky {\n z-index: var(--dt-z-sticky-header);\n}\n\n/* Leading utility cells stick together with the first content column. */\n.stickyLead {\n position: sticky;\n left: 0;\n z-index: var(--dt-z-sticky-first-column);\n}\n\n.root[data-selectable=\"true\"] .toggleCell.stickyLead {\n left: var(--dt-select-w);\n}\n\n.headCell.stickyLead {\n z-index: var(--dt-z-sticky-header);\n}\n\n.root[data-sticky-header=\"true\"][data-sticky-first-column=\"true\"]\n .headCell[data-first-column=\"true\"],\n.cornerCellSticky {\n position: sticky;\n top: 0;\n z-index: var(--dt-z-sticky-corner);\n}\n\n/* ---------- States: skeleton, empty, error ---------- */\n\n.skeletonRow {\n pointer-events: none;\n}\n\n.skeleton {\n display: inline-block;\n width: 64%;\n max-width: 100%;\n height: var(--prime-space-2);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-muted);\n vertical-align: middle;\n animation: dt-pulse calc(var(--prime-motion-duration-slow) * 5)\n var(--prime-motion-easing-standard) infinite alternate;\n}\n\n.skeletonRow .cell:nth-child(3n + 2) .skeleton {\n width: 80%;\n}\n\n.skeletonRow .cell:nth-child(3n) .skeleton {\n width: 40%;\n}\n\n.selectCell .skeleton {\n width: var(--dt-choice);\n height: var(--dt-choice);\n border-radius: var(--prime-radius-xs);\n}\n\n@keyframes dt-pulse {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0.4;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skeleton,\n .row[data-animate=\"true\"] > .cell,\n .detailRow[data-animate=\"true\"] .detailMotion {\n animation: none;\n }\n\n .chevron {\n transition: none;\n }\n}\n\n.stateCell {\n padding: var(--prime-space-10) var(--prime-space-4);\n background: var(--dt-surface);\n}\n\n.stateContent {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--prime-space-3);\n max-width: var(--prime-layout-reading-max-width);\n margin-inline: auto;\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n color: var(--prime-color-text-muted);\n text-align: center;\n overflow-wrap: anywhere;\n}\n\n.stateError .stateContent {\n color: var(--prime-color-danger-text);\n}\n\n.sentinel {\n height: var(--prime-space-1);\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ---------- Footer ---------- */\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-2) var(--prime-space-4);\n min-height: var(--prime-table-row-height-s);\n padding: var(--prime-space-2) var(--dt-pad-x);\n border-top: var(--prime-border-width) solid var(--dt-divider-color);\n}\n\n.meta {\n flex: 0 0 auto;\n margin: 0;\n min-width: 0;\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n color: var(--prime-color-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.pagination {\n flex: 1 1 0%;\n min-width: 0;\n}\n\n@container (max-width: 30rem) {\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .footer {\n flex-direction: column;\n align-items: stretch;\n }\n\n .meta {\n text-align: center;\n }\n}\n", "import { addMonths, format, type Locale, startOfMonth, subMonths } from \"date-fns\";\nimport { ru } from \"date-fns/locale\";\nimport { Calendar, ChevronDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Badge } from \"@/components/badge/Badge\";\nimport { Button } from \"@/components/button/Button\";\nimport { Popover } from \"@/components/popover/Popover\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { getViewportPadPx, type PositionAlign } from \"@/hooks/usePosition\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { FieldFrame, type FieldFrameProps, useFieldFrame } from \"@/internal/FieldFrame\";\nimport { remToPx } from \"@/internal/layoutPxFromPrimitives\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\nimport { primitiveTokens } from \"../../../tokens/primitives\";\n\nimport styles from \"./Datepicker.module.css\";\nimport {\n DAY_END_MINUTES,\n DAY_START_MINUTES,\n type DatepickerPreset,\n type DatepickerRange,\n formatDayShort,\n formatTime,\n matchPreset,\n minutesOf,\n monthGrid,\n monthTitle,\n parseTime,\n rowsNeeded,\n sameDay,\n toDay,\n type WeekStart,\n weekdayLabels,\n withMinutes,\n YEARLESS_YEAR,\n} from \"./datepickerModel\";\n\nexport type {\n DatepickerPreset,\n DatepickerRange,\n WeekStart,\n} from \"./datepickerModel\";\nexport {\n DEFAULT_DATEPICKER_PRESETS,\n datepickerPresets,\n YEARLESS_YEAR,\n} from \"./datepickerModel\";\n\n/** \u041A\u043B\u0435\u0442\u043A\u0430 \u0434\u043D\u044F = `--prime-control-<tier>-item-height` (\u0448\u0430\u0433\u0438 \u0441\u0435\u0442\u043A\u0438 4px). */\nconst CELL_STEPS = { xs: 6, s: 7, m: 8, l: 9, xl: 10 } as const satisfies Record<\n ControlSize,\n keyof typeof primitiveTokens.space\n>;\n\n/** \u041A\u043D\u043E\u043F\u043A\u0438 \u0438 \u043F\u043E\u043B\u044F \u043D\u0438\u0436\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u2014 \u043D\u0430 \u0441\u0442\u0443\u043F\u0435\u043D\u044C \u043D\u0438\u0436\u0435 \u044F\u0440\u0443\u0441\u0430 \u043F\u0430\u043D\u0435\u043B\u0438. */\nconst STEP_DOWN: Record<ControlSize, ControlSize> = {\n xs: \"xs\",\n s: \"xs\",\n m: \"s\",\n l: \"m\",\n xl: \"l\",\n};\n\n/** \u0420\u0430\u0441\u043A\u043B\u0430\u0434\u043A\u0430: px \u0438\u0437 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 (`space.*`), \u0447\u0442\u043E\u0431\u044B JS-\u0440\u0435\u0448\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u043B\u0438 \u0441 CSS. */\nfunction panelMetrics(size: ControlSize, embedded: boolean) {\n const space = (n: keyof typeof primitiveTokens.space) => remToPx(primitiveTokens.space[n]);\n const cell = space(CELL_STEPS[size]);\n return {\n month: cell * 7,\n /** \u0417\u0430\u0437\u043E\u0440 \u043C\u0435\u0436\u0434\u0443 \u043C\u0435\u0441\u044F\u0446\u0430\u043C\u0438 (`--prime-space-6`). */\n monthsGap: space(6),\n /**\n * \u041F\u043E\u043B\u044F `.main` \u0441\u043B\u0435\u0432\u0430 \u0438 \u0441\u043F\u0440\u0430\u0432\u0430: \u0432 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0435 `--prime-space-3` \u00D7 2, \u0432\u043E \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438 \u2014\n * \u043F\u043E\u043B\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 `--prime-card-padding-s` (= `space-4`) \u00D7 2.\n */\n chrome: (embedded ? space(4) : space(3)) * 2,\n /** \u041A\u043E\u043B\u043E\u043D\u043A\u0430 \u043F\u0435\u0440\u0438\u043E\u0434\u043E\u0432 \u0441\u0431\u043E\u043A\u0443: 5 \u043A\u043B\u0435\u0442\u043E\u043A + hairline. */\n presets: cell * 5 + 1,\n };\n}\n\nexport type PanelLayoutInput = {\n size: ControlSize;\n /** Requested months (`months` prop). */\n months: 1 | 2;\n hasPresets: boolean;\n /** Embedded panel (`Datepicker.Panel`), not the popover of `Datepicker.Root`. */\n embedded: boolean;\n /** Available inline size in px; `null` \u2014 not measured yet (assume it fits). */\n available: number | null;\n};\n\nexport type PanelLayout = { monthCount: 1 | 2; presetsAside: boolean; compact: boolean };\n\n/**\n * 1 vs 2 months, presets aside vs stacked, compact cells \u2014 from the space AVAILABLE to the panel\n * (the parent's content box for an embedded panel, the viewport for the popover). The panel's own\n * width never feeds back into the decision, so there is no resize loop.\n */\nexport function resolvePanelLayout({\n size,\n months,\n hasPresets,\n embedded,\n available,\n}: PanelLayoutInput): PanelLayout {\n const metrics = panelMetrics(size, embedded);\n const monthsWidth = (n: 1 | 2) => metrics.month * n + (n === 2 ? metrics.monthsGap : 0);\n const fits = (px: number) => available == null || available >= px;\n const monthCount: 1 | 2 = months === 2 && fits(monthsWidth(2) + metrics.chrome) ? 2 : 1;\n const presetsAside =\n hasPresets && fits(monthsWidth(monthCount) + metrics.chrome + metrics.presets);\n /* \u0412\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0430\u044F \u043F\u0430\u043D\u0435\u043B\u044C \u0443\u0436\u0435 \u043E\u0434\u043D\u043E\u0433\u043E \u043C\u0435\u0441\u044F\u0446\u0430 \u0441 \u043F\u043E\u043B\u044F\u043C\u0438 \u2014 \u043A\u043B\u0435\u0442\u043A\u0438 \u0441\u0436\u0438\u043C\u0430\u044E\u0442\u0441\u044F, \u043F\u043E\u043B\u044F \u043C\u0435\u043D\u044C\u0448\u0435. */\n const compact = embedded && available != null && available < monthsWidth(1) + metrics.chrome;\n return { monthCount, presetsAside, compact };\n}\n\n/** Built-in strings; Russian by default. */\nexport type DatepickerLabels = {\n pickStart: string;\n pickEnd: string;\n pickDate: string;\n reset: string;\n apply: string;\n prevMonth: string;\n nextMonth: string;\n rangeStart: string;\n rangeEnd: string;\n date: string;\n timeStart: string;\n timeEnd: string;\n time: string;\n /** \u041F\u0440\u0435\u0444\u0438\u043A\u0441 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430 \u0431\u0435\u0437 \u043D\u0430\u0447\u0430\u043B\u0430: \u00AB\u0434\u043E 6 \u043E\u043A\u0442\u00BB. */\n until: string;\n /** \u041F\u043E\u0434\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u043A\u043E\u043B\u043E\u043D\u043A\u0438 \u043F\u0435\u0440\u0438\u043E\u0434\u043E\u0432. */\n presetsTitle: string;\n /** Muted marker after the field label when `optional`. */\n optional: string;\n};\n\nconst DATEPICKER_LABELS: DatepickerLabels = {\n pickStart: \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0434\u0430\u0442\u0443\",\n pickEnd: \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043A\u043E\u043D\u0435\u0447\u043D\u0443\u044E \u0434\u0430\u0442\u0443\",\n pickDate: \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0430\u0442\u0443\",\n reset: \"\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\",\n apply: \"\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C\",\n prevMonth: \"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u043C\u0435\u0441\u044F\u0446\",\n nextMonth: \"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u043C\u0435\u0441\u044F\u0446\",\n rangeStart: \"\u041D\u0430\u0447\u0430\u043B\u043E \u043F\u0435\u0440\u0438\u043E\u0434\u0430\",\n rangeEnd: \"\u041A\u043E\u043D\u0435\u0446 \u043F\u0435\u0440\u0438\u043E\u0434\u0430\",\n date: \"\u0414\u0430\u0442\u0430\",\n timeStart: \"\u0412\u0440\u0435\u043C\u044F \u043D\u0430\u0447\u0430\u043B\u0430\",\n timeEnd: \"\u0412\u0440\u0435\u043C\u044F \u043A\u043E\u043D\u0446\u0430\",\n time: \"\u0412\u0440\u0435\u043C\u044F\",\n until: \"\u0434\u043E\",\n presetsTitle: \"\u041F\u0435\u0440\u0438\u043E\u0434\",\n optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\",\n};\n\ntype CalendarOptions = {\n /** \u042F\u0440\u0443\u0441: \u043A\u043B\u0435\u0442\u043A\u0430 \u0434\u043D\u044F = \u0432\u044B\u0441\u043E\u0442\u0430 \u043F\u0443\u043D\u043A\u0442\u0430 \u043C\u0435\u043D\u044E \u044F\u0440\u0443\u0441\u0430 (`m` \u2192 32px), \u0442\u0435\u043A\u0441\u0442 \u2014 \u0442\u0435\u043A\u0441\u0442 \u044F\u0440\u0443\u0441\u0430. */\n size?: ControlSize;\n /** \u0421\u043A\u043E\u043B\u044C\u043A\u043E \u043C\u0435\u0441\u044F\u0446\u0435\u0432 \u0440\u044F\u0434\u043E\u043C; \u0435\u0441\u043B\u0438 \u043C\u0435\u0441\u0442\u0430 \u043C\u0430\u043B\u043E \u2014 \u043E\u0434\u0438\u043D. */\n months?: 1 | 2;\n /** \u041A\u043E\u043B\u043E\u043D\u043A\u0430 \u043F\u0435\u0440\u0438\u043E\u0434\u043E\u0432 \u0441\u043B\u0435\u0432\u0430 (\u0442\u043E\u043B\u044C\u043A\u043E `range`). */\n presets?: DatepickerPreset[] | false;\n /** Step prompt under the calendar: \u00AB\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0434\u0430\u0442\u0443\u00BB / \u00AB\u2026 \u043A\u043E\u043D\u0435\u0447\u043D\u0443\u044E \u0434\u0430\u0442\u0443\u00BB. */\n prompt?: boolean;\n /** \u041D\u0438\u0436\u043D\u044F\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u043F\u043E\u043B\u044F \u0434\u0430\u0442 \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u00AB\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\u00BB / \u00AB\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C\u00BB. \u0411\u0435\u0437 \u043D\u0435\u0451 \u0432\u044B\u0431\u043E\u0440 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0441\u0440\u0430\u0437\u0443. */\n footer?: boolean;\n /** \u041F\u043E\u043B\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0432 \u043D\u0438\u0436\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 00:00 \u2014 23:59). */\n withTime?: boolean;\n /** \u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u043D\u0438 (\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u043D\u044B\u0439 \u0434\u0435\u043D\u044C \u2014 Date \u043D\u0430 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u043E\u043B\u043D\u043E\u0447\u044C). */\n isDayDisabled?: (day: Date) => boolean;\n /** \u0411\u0443\u0434\u0443\u0449\u0438\u0435 \u0434\u043D\u0438 \u043F\u0440\u0438\u0433\u043B\u0443\u0448\u0435\u043D\u044B \u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B. */\n disableFuture?: boolean;\n /** \u0415\u0436\u0435\u0433\u043E\u0434\u043D\u0430\u044F \u0434\u0430\u0442\u0430 \u00AB\u0434\u0435\u043D\u044C + \u043C\u0435\u0441\u044F\u0446\u00BB: \u0431\u0435\u0437 \u0433\u043E\u0434\u0430, \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u0435 \u043F\u043E \u043A\u0440\u0443\u0433\u0443 \u0432 \u043F\u0440\u0435\u0434\u0435\u043B\u0430\u0445 YEARLESS_YEAR. */\n yearless?: boolean;\n /** \u00AB\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u00BB \u0434\u043B\u044F \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438, \u043F\u0440\u0435\u0441\u0435\u0442\u043E\u0432 \u0438 disableFuture; \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0434\u0435\u043D\u044C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. */\n today?: Date;\n locale?: Locale;\n weekStartsOn?: WeekStart;\n labels?: Partial<DatepickerLabels>;\n};\n\ntype RangeModeProps = {\n mode: \"range\";\n /** Bounds in wall-clock time; `null` \u2014 the bound is not set. */\n value?: DatepickerRange;\n defaultValue?: DatepickerRange;\n onValueChange?: (value: DatepickerRange) => void;\n /** Value applied by \u00AB\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\u00BB; an empty range by default. */\n resetValue?: DatepickerRange;\n};\n\ntype SingleModeProps = {\n mode: \"single\";\n value?: Date | null;\n defaultValue?: Date | null;\n onValueChange?: (value: Date | null) => void;\n /** Value applied by \u00AB\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\u00BB; `null` by default. */\n resetValue?: Date | null;\n};\n\nexport type DatepickerPanelProps = CalendarOptions &\n (RangeModeProps | SingleModeProps) & {\n className?: string;\n };\n\n/** Resolved (controlled-or-internal) value the panel view works with. */\ntype ResolvedValue =\n | {\n mode: \"range\";\n value: DatepickerRange;\n onChange: (value: DatepickerRange) => void;\n resetValue?: DatepickerRange;\n }\n | {\n mode: \"single\";\n value: Date | null;\n onChange: (value: Date | null) => void;\n resetValue?: Date | null;\n };\n\ntype PanelViewProps = CalendarOptions &\n ResolvedValue & {\n /** After a value is applied (Root closes the popover). */\n onDone?: () => void;\n className?: string;\n };\n\nconst EMPTY_RANGE: DatepickerRange = { from: null, to: null };\n\nfunction useResolvedValue(props: RangeModeProps | SingleModeProps): ResolvedValue {\n const [value, setValue] = useControllableState<DatepickerRange | Date | null>({\n value: props.value,\n defaultValue: props.defaultValue ?? (props.mode === \"range\" ? EMPTY_RANGE : null),\n onChange: props.onValueChange as ((value: DatepickerRange | Date | null) => void) | undefined,\n });\n if (props.mode === \"range\") {\n return {\n mode: \"range\",\n value: value as DatepickerRange,\n onChange: setValue,\n resetValue: props.resetValue,\n };\n }\n return {\n mode: \"single\",\n value: value as Date | null,\n onChange: setValue,\n resetValue: props.resetValue,\n };\n}\n\n/** \u0428\u0438\u0440\u0438\u043D\u0430 \u043E\u043A\u043D\u0430 (px) \u2014 \u0434\u043B\u044F \u043F\u0430\u043D\u0435\u043B\u0438 \u0432 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0435, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043C\u0435\u0440\u0438\u0442\u044C \u0441\u0435\u0431\u044F. */\nfunction useViewportWidth(enabled: boolean): number | null {\n const [width, setWidth] = React.useState<number | null>(() =>\n typeof window === \"undefined\" ? null : window.innerWidth,\n );\n React.useEffect(() => {\n if (!enabled) return;\n const sync = () => setWidth(window.innerWidth);\n sync();\n window.addEventListener(\"resize\", sync);\n return () => window.removeEventListener(\"resize\", sync);\n }, [enabled]);\n return enabled ? width : null;\n}\n\nfunction valueDays(props: ResolvedValue): { a: Date | null; b: Date | null } {\n if (props.mode === \"single\") return { a: props.value ? toDay(props.value) : null, b: null };\n return {\n a: props.value.from ? toDay(props.value.from) : null,\n b: props.value.to ? toDay(props.value.to) : null,\n };\n}\n\nfunction clampYearless(month: Date): Date {\n return new Date(YEARLESS_YEAR, month.getMonth(), 1);\n}\n\n/** \u041F\u0430\u043D\u0435\u043B\u044C \u0432\u043D\u0443\u0442\u0440\u0438 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0430 Root: \u0440\u0430\u0437\u043C\u0435\u0440 \u043F\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443; \u0438\u043D\u0430\u0447\u0435 \u2014 \u0440\u0435\u0437\u0438\u043D\u043E\u0432\u0430\u044F \u043F\u043E \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0443. */\nconst InPopoverContext = React.createContext(false);\n\n/**\n * \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438: content box \u0435\u0451 \u0420\u041E\u0414\u0418\u0422\u0415\u041B\u042F (ResizeObserver), \u043D\u0435 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F\n * \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 (\u043E\u043D\u0430 \u043F\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443) \u2014 \u0438\u043D\u0430\u0447\u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u00AB1 \u0438\u043B\u0438 2 \u043C\u0435\u0441\u044F\u0446\u0430\u00BB \u0437\u0430\u0446\u0438\u043A\u043B\u0438\u043B\u043E\u0441\u044C \u0431\u044B. null \u2014 \u0435\u0449\u0451\n * \u043D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0430.\n */\nexport function useAvailableWidth(node: HTMLElement | null): number | null {\n const [width, setWidth] = React.useState<number | null>(null);\n React.useEffect(() => {\n const parent = node?.parentElement;\n if (!parent || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(([entry]) => {\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(parent);\n return () => observer.disconnect();\n }, [node]);\n return width;\n}\n\n/** \u041C\u043E\u0436\u0435\u0442 \u043B\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u0430\u043C \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C\u0441\u044F \u0432 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0435\u0441\u0430. */\nfunction canScroll(el: HTMLElement, deltaY: number): boolean {\n const { overflowY } = getComputedStyle(el);\n if (overflowY !== \"auto\" && overflowY !== \"scroll\") return false;\n if (el.scrollHeight <= el.clientHeight) return false;\n return deltaY < 0 ? el.scrollTop > 0 : el.scrollTop + el.clientHeight < el.scrollHeight;\n}\n\n/**\n * \u041A\u043E\u043B\u0435\u0441\u043E \u0438 \u0442\u0430\u0447 \u043D\u0430\u0434 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0451\u043C \u043D\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u044E\u0442 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043F\u043E\u0434 \u043D\u0438\u043C;\n * \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043C\u044B\u0435 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0432\u043D\u0443\u0442\u0440\u0438 (\u0441\u043F\u0438\u0441\u043E\u043A \u043F\u0435\u0440\u0438\u043E\u0434\u043E\u0432) \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u043E.\n */\nfunction useContainScroll(node: HTMLElement | null) {\n React.useEffect(() => {\n if (!node) return;\n /* \u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u2014 \u0432\u0435\u0441\u044C \u043F\u043E\u043F\u043E\u0432\u0435\u0440: \u043E\u043D \u0441\u0430\u043C \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F, \u043A\u043E\u0433\u0434\u0430 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0432\u044B\u0448\u0435 \u0432\u044C\u044E\u043F\u043E\u0440\u0442\u0430. */\n const boundary = node.closest<HTMLElement>('[role=\"dialog\"]') ?? node;\n const onWheel = (event: WheelEvent) => {\n for (let el = event.target as HTMLElement | null; el; el = el.parentElement) {\n if (canScroll(el, event.deltaY)) return;\n if (el === boundary) break;\n }\n event.preventDefault();\n };\n node.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => node.removeEventListener(\"wheel\", onWheel);\n }, [node]);\n}\n\n/** WAI-ARIA grid (date picker dialog): \u0441\u0442\u0440\u0435\u043B\u043A\u0438 \u2014 \u0434\u0435\u043D\u044C/\u043D\u0435\u0434\u0435\u043B\u044F, PageUp/Down \u2014 \u043C\u0435\u0441\u044F\u0446 (+Shift \u2014 \u0433\u043E\u0434), Home/End \u2014 \u043D\u0435\u0434\u0435\u043B\u044F. */\nconst DAY_KEYS: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n};\n\n/** Calendar panel without a field: inline in a page or a card. */\nfunction DatepickerPanel({\n mode,\n value,\n defaultValue,\n onValueChange,\n resetValue,\n ...options\n}: DatepickerPanelProps) {\n const resolved = useResolvedValue({\n mode,\n value,\n defaultValue,\n onValueChange,\n resetValue,\n } as RangeModeProps | SingleModeProps);\n return <PanelView {...options} {...resolved} />;\n}\nDatepickerPanel.displayName = \"Datepicker.Panel\";\n\n/** \u041F\u0430\u043D\u0435\u043B\u044C: \u043F\u0440\u0435\u0441\u0435\u0442\u044B \u0441\u043B\u0435\u0432\u0430 (\u0438\u043B\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u043D\u0430 \u0443\u0437\u043A\u043E\u043C), 1\u20132 \u043C\u0435\u0441\u044F\u0446\u0430, \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430, \u043D\u0438\u0436\u043D\u044F\u044F \u0441\u0442\u0440\u043E\u043A\u0430. */\nfunction PanelView(props: PanelViewProps) {\n const {\n size = \"m\",\n months: monthsProp = 1,\n presets = false,\n prompt = false,\n footer = false,\n withTime = false,\n isDayDisabled,\n disableFuture = false,\n yearless = false,\n locale = ru,\n weekStartsOn = 1,\n onDone,\n className,\n } = props;\n const labels = { ...DATEPICKER_LABELS, ...props.labels };\n const isRange = props.mode === \"range\";\n const inPopover = React.useContext(InPopoverContext);\n const [panelNode, setPanelNode] = React.useState<HTMLDivElement | null>(null);\n const parentWidth = useAvailableWidth(inPopover ? null : panelNode);\n const viewportWidth = useViewportWidth(inPopover);\n const hasPresets = Boolean(presets) && isRange;\n\n /*\n * \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: \u0432\u043E \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438 \u2014 content box \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F, \u0432 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0435 \u2014 \u043E\u043A\u043D\u043E \u043C\u0438\u043D\u0443\u0441 \u043F\u043E\u043B\u044F\n * \u0434\u043E \u043A\u0440\u0430\u0451\u0432. null \u2014 \u0435\u0449\u0451 \u043D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043E: \u0441\u0447\u0438\u0442\u0430\u0435\u043C, \u0447\u0442\u043E \u043C\u0435\u0441\u0442\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442.\n */\n const available = inPopover\n ? viewportWidth == null\n ? null\n : viewportWidth - getViewportPadPx() * 2\n : parentWidth;\n const { monthCount, presetsAside, compact } = resolvePanelLayout({\n size,\n months: monthsProp,\n hasPresets,\n embedded: !inPopover,\n available,\n });\n const today = toDay(props.today ?? new Date());\n\n const [dayA, setDayA] = React.useState<Date | null>(() => valueDays(props).a);\n const [dayB, setDayB] = React.useState<Date | null>(() => valueDays(props).b);\n const [hover, setHover] = React.useState<Date | null>(null);\n const [fromTime, setFromTime] = React.useState(() => {\n const v = props.mode === \"single\" ? props.value : props.value.from;\n return formatTime(v ? minutesOf(v) : DAY_START_MINUTES);\n });\n const [toTime, setToTime] = React.useState(() =>\n formatTime(\n props.mode === \"range\" && props.value.to ? minutesOf(props.value.to) : DAY_END_MINUTES,\n ),\n );\n const [focusDay, setFocusDay] = React.useState<Date>(() => {\n const days = valueDays(props);\n const anchor = (isRange ? (days.b ?? days.a) : days.a) ?? today;\n return yearless ? new Date(YEARLESS_YEAR, anchor.getMonth(), anchor.getDate()) : anchor;\n });\n const [month, setMonth] = React.useState(() => {\n const base = yearless ? clampYearless(focusDay) : startOfMonth(focusDay);\n return monthCount === 2 ? subMonths(base, 1) : base;\n });\n const gridRef = React.useRef<HTMLDivElement>(null);\n const focusPending = React.useRef(false);\n\n /* 2 \u2192 1 \u043C\u0435\u0441\u044F\u0446 (\u0441\u0442\u0430\u043B\u043E \u0442\u0435\u0441\u043D\u043E): \u043E\u0441\u0442\u0430\u0451\u043C\u0441\u044F \u043D\u0430 \u043C\u0435\u0441\u044F\u0446\u0435 \u0441 \u0444\u043E\u043A\u0443\u0441-\u0434\u043D\u0451\u043C, \u0430 \u043D\u0435 \u043D\u0430 \u043B\u0435\u0432\u043E\u043C \u0438\u0437 \u0434\u0432\u0443\u0445. */\n const prevMonthCount = React.useRef(monthCount);\n React.useEffect(() => {\n const was = prevMonthCount.current;\n prevMonthCount.current = monthCount;\n if (was !== 2 || monthCount !== 1) return;\n setMonth((current) => {\n const second = yearless ? clampYearless(addMonths(current, 1)) : addMonths(current, 1);\n return focusDay.getTime() >= second.getTime() ? second : current;\n });\n }, [monthCount, focusDay, yearless]);\n\n // \u0411\u0435\u0437 \u043D\u0438\u0436\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432\u043D\u0435\u0448\u043D\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u043F\u0440\u0430\u0432\u0434\u044B (\u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C).\n const valueKey =\n props.mode === \"single\"\n ? String(props.value?.getTime() ?? \"\")\n : `${props.value.from?.getTime() ?? \"\"}-${props.value.to?.getTime() ?? \"\"}`;\n // biome-ignore lint/correctness/useExhaustiveDependencies: \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E \u0441\u043C\u0435\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F\n React.useEffect(() => {\n if (footer) return;\n const next = valueDays(props);\n setDayA(next.a);\n setDayB(next.b);\n }, [valueKey, footer]);\n\n // \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0444\u043E\u043A\u0443\u0441\u0430 \u043F\u043E\u0441\u043B\u0435 \u043B\u0438\u0441\u0442\u0430\u043D\u0438\u044F \u0441\u0442\u0440\u0435\u043B\u043A\u0430\u043C\u0438 (\u043A\u043D\u043E\u043F\u043A\u0430 \u043D\u043E\u0432\u043E\u0433\u043E \u0434\u043D\u044F \u043F\u043E\u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u0430).\n React.useEffect(() => {\n if (!focusPending.current) return;\n focusPending.current = false;\n gridRef.current\n ?.querySelector<HTMLButtonElement>(`[data-day=\"${focusDay.getTime()}\"]`)\n ?.focus();\n });\n\n // \u0412 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0435 \u0444\u043E\u043A\u0443\u0441 \u0441\u0440\u0430\u0437\u0443 \u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 (\u0438\u043B\u0438 \u0441\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0439) \u0434\u0435\u043D\u044C \u2014 \u043A\u0430\u043A \u0432 WAI-ARIA date picker dialog.\n // \u041B\u043E\u0432\u0443\u0448\u043A\u0430 \u0444\u043E\u043A\u0443\u0441\u0430 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0430 \u0441\u0442\u0430\u0432\u0438\u0442 \u0435\u0433\u043E \u043D\u0430 \u043F\u0435\u0440\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432 \u0441\u0432\u043E\u0451\u043C \u044D\u0444\u0444\u0435\u043A\u0442\u0435; \u043A\u0430\u0434\u0440 \u0441\u043F\u0443\u0441\u0442\u044F \u2014 \u043D\u0430 \u0434\u0435\u043D\u044C.\n React.useEffect(() => {\n if (!inPopover) return;\n const id = requestAnimationFrame(() => {\n gridRef.current?.querySelector<HTMLButtonElement>('[data-day][tabindex=\"0\"]')?.focus();\n });\n return () => cancelAnimationFrame(id);\n }, [inPopover]);\n\n const visibleMonths = Array.from({ length: monthCount }, (_, i) => addMonths(month, i));\n const rows = Math.max(...visibleMonths.map((m) => rowsNeeded(m, weekStartsOn)));\n\n const shiftMonth = (delta: number) =>\n setMonth((current) => {\n const next = addMonths(current, delta);\n return yearless ? clampYearless(next) : next;\n });\n\n const dayDisabled = (day: Date) =>\n (disableFuture && day.getTime() > today.getTime()) || (isDayDisabled?.(day) ?? false);\n\n const fromMinutes = withTime ? parseTime(fromTime) : DAY_START_MINUTES;\n const toMinutes = withTime ? parseTime(toTime) : DAY_END_MINUTES;\n\n const commitRange = (from: Date | null, to: Date | null, fromMin: number, toMin: number) => {\n if (props.mode !== \"range\") return;\n props.onChange({\n from: from ? withMinutes(from, fromMin) : null,\n to: to ? withMinutes(to, toMin, true) : null,\n });\n onDone?.();\n };\n\n const commitSingle = (day: Date | null, minutes: number) => {\n if (props.mode !== \"single\") return;\n props.onChange(day ? withMinutes(day, minutes) : null);\n onDone?.();\n };\n\n const pickDay = (day: Date) => {\n if (dayDisabled(day)) return;\n setFocusDay(day);\n if (!isRange) {\n setDayA(day);\n if (!footer) commitSingle(day, DAY_START_MINUTES);\n return;\n }\n if (dayA == null || dayB != null) {\n setDayA(day);\n setDayB(null);\n setHover(day);\n return;\n }\n setDayB(day);\n if (!footer) {\n const [lo, hi] = dayA.getTime() <= day.getTime() ? [dayA, day] : [day, dayA];\n commitRange(lo, hi, DAY_START_MINUTES, DAY_END_MINUTES);\n }\n };\n\n const moveFocus = (next: Date) => {\n const target = yearless ? new Date(YEARLESS_YEAR, next.getMonth(), next.getDate()) : next;\n const first = month.getTime();\n const last = addMonths(month, monthCount).getTime();\n if (target.getTime() < first || target.getTime() >= last) {\n const base = yearless ? clampYearless(target) : startOfMonth(target);\n setMonth(target.getTime() < first ? base : subMonths(base, monthCount - 1));\n }\n focusPending.current = true;\n setFocusDay(target);\n if (isRange && dayA != null && dayB == null) setHover(target);\n };\n\n const onGridKeyDown = (event: React.KeyboardEvent) => {\n const step = DAY_KEYS[event.key];\n const d = focusDay;\n if (step != null) {\n event.preventDefault();\n moveFocus(new Date(d.getFullYear(), d.getMonth(), d.getDate() + step));\n } else if (event.key === \"PageUp\" || event.key === \"PageDown\") {\n event.preventDefault();\n const sign = event.key === \"PageUp\" ? -1 : 1;\n /* Shift \u2014 \u043D\u0430 \u0433\u043E\u0434 (\u0432 yearless \u0433\u043E\u0434 \u043D\u0435 \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F: \u043B\u0438\u0441\u0442\u0430\u0435\u043C \u043C\u0435\u0441\u044F\u0446). */\n moveFocus(addMonths(d, sign * (event.shiftKey && !yearless ? 12 : 1)));\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const col = (d.getDay() - weekStartsOn + 7) % 7;\n const delta = event.key === \"Home\" ? -col : 6 - col;\n moveFocus(new Date(d.getFullYear(), d.getMonth(), d.getDate() + delta));\n }\n };\n\n const sorted: [Date, Date] | null =\n dayA && dayB ? (dayA.getTime() <= dayB.getTime() ? [dayA, dayB] : [dayB, dayA]) : null;\n const canApply = isRange\n ? sorted != null && fromMinutes != null && toMinutes != null\n : dayA != null && fromMinutes != null;\n\n const apply = () => {\n if (!canApply || fromMinutes == null || toMinutes == null) return;\n if (isRange && sorted) commitRange(sorted[0], sorted[1], fromMinutes, toMinutes);\n else commitSingle(dayA, fromMinutes);\n };\n\n const reset = () => {\n if (props.mode === \"range\") props.onChange(props.resetValue ?? { from: null, to: null });\n else props.onChange(props.resetValue ?? null);\n onDone?.();\n };\n\n // \u041B\u0435\u043D\u0442\u0430: \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0438\u043B\u0438 \u043F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440, \u043F\u043E\u043A\u0430 \u0432\u044B\u0431\u0440\u0430\u043D \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0430\u0440\u0442.\n const preview = isRange && dayA != null && dayB == null;\n const edgeB = isRange ? (preview ? (hover ?? dayA) : dayB) : dayA;\n const lo = dayA && edgeB ? (dayA.getTime() <= edgeB.getTime() ? dayA : edgeB) : null;\n const hi = dayA && edgeB ? (dayA.getTime() <= edgeB.getTime() ? edgeB : dayA) : null;\n\n const activePreset =\n presets && isRange && !preview ? matchPreset(presets, dayA, dayB, today) : null;\n const weekdays = weekdayLabels(locale, weekStartsOn);\n\n let promptText: string | null = null;\n if (prompt) {\n if (!isRange) promptText = dayA == null ? labels.pickDate : null;\n else if (dayA == null) promptText = labels.pickStart;\n else if (preview) promptText = labels.pickEnd;\n }\n\n const footerFrom = isRange ? (sorted?.[0] ?? dayA) : dayA;\n const footerTo = isRange ? (sorted?.[1] ?? null) : null;\n const footerFormat = yearless ? \"dd.MM\" : \"dd.MM.yyyy\";\n const controlSize = STEP_DOWN[size];\n /* \u0421\u043E\u0441\u0435\u0434\u043D\u0438\u0435 \u043C\u0435\u0441\u044F\u0446\u044B \u043F\u0440\u0438\u0433\u043B\u0443\u0448\u0451\u043D\u043D\u043E \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043E\u0434\u043D\u043E\u043C\u0435\u0441\u044F\u0447\u043D\u043E\u043C \u0432\u0438\u0434\u0435 (\u0432 \u0434\u0432\u0443\u0445 \u043C\u0435\u0441\u044F\u0446\u0430\u0445 \u0434\u043D\u0438 \u0431\u044B \u0434\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u043B\u0438\u0441\u044C). */\n const showOutside = monthCount === 1;\n\n return (\n <div\n ref={setPanelNode}\n className={cx(styles.panel, className)}\n data-size={size}\n data-embedded={inPopover ? undefined : \"true\"}\n data-compact={compact ? \"true\" : undefined}\n data-layout={presetsAside || !hasPresets ? \"aside\" : \"stacked\"}\n >\n {presets && isRange ? (\n // biome-ignore lint/a11y/useSemanticElements: \u0433\u0440\u0443\u043F\u043F\u0430 \u043A\u043D\u043E\u043F\u043E\u043A-\u043F\u0440\u0435\u0441\u0435\u0442\u043E\u0432, \u043D\u0435 \u043F\u043E\u043B\u044F \u0444\u043E\u0440\u043C\u044B\n <div className={styles.presets} role=\"group\" aria-label={labels.presetsTitle}>\n <p className={styles.presetTitle} aria-hidden>\n {labels.presetsTitle}\n </p>\n {presets.map((preset) => (\n <button\n key={preset.key}\n type=\"button\"\n className={styles.presetItem}\n aria-pressed={activePreset?.key === preset.key}\n onClick={() => {\n const r = preset.days(today);\n commitRange(r.from, r.to, DAY_START_MINUTES, DAY_END_MINUTES);\n }}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n\n <div className={styles.main}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: \u0434\u0435\u043B\u0435\u0433\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u0442\u0440\u0435\u043B\u043E\u043A \u043D\u0430 \u0441\u0435\u0442\u043A\u0443 \u0434\u043D\u0435\u0439 */}\n <div\n ref={gridRef}\n className={styles.months}\n onKeyDown={onGridKeyDown}\n onMouseLeave={() => preview && setHover(null)}\n >\n {visibleMonths.map((m, mi) => {\n const title = monthTitle(m, locale, yearless);\n return (\n <div key={m.getTime()} className={styles.month}>\n <div className={styles.monthHeader}>\n {mi === 0 ? (\n <button\n type=\"button\"\n className={styles.nav}\n aria-label={labels.prevMonth}\n onClick={() => shiftMonth(-1)}\n >\n <ChevronLeft aria-hidden />\n </button>\n ) : (\n <span className={styles.navSpacer} />\n )}\n <span className={styles.monthTitle} aria-live=\"polite\">\n {title}\n </span>\n {mi === visibleMonths.length - 1 ? (\n <button\n type=\"button\"\n className={styles.nav}\n aria-label={labels.nextMonth}\n onClick={() => shiftMonth(1)}\n >\n <ChevronRight aria-hidden />\n </button>\n ) : (\n <span className={styles.navSpacer} />\n )}\n </div>\n <table className={styles.table} aria-label={title}>\n <thead className={styles.rowGroup}>\n <tr className={styles.row}>\n {weekdays.map((w, i) => {\n const weekday = (weekStartsOn + i) % 7;\n return (\n <th\n key={w}\n scope=\"col\"\n className={styles.weekday}\n data-weekend={weekday === 0 || weekday === 6 ? \"true\" : undefined}\n >\n {w}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={styles.rowGroup}>\n {monthGrid(m, rows, weekStartsOn).map((row) => (\n <tr key={row.find((c) => c.day)?.day?.getTime()} className={styles.row}>\n {row.map(({ day, col, outside }) => {\n if (day == null) {\n return (\n <td key={col} className={styles.cell}>\n {showOutside && outside ? (\n <span className={styles.outsideDay} aria-hidden>\n {outside.getDate()}\n </span>\n ) : null}\n </td>\n );\n }\n const n = day.getDate();\n const lastOfMonth =\n n === new Date(day.getFullYear(), day.getMonth() + 1, 0).getDate();\n const inBand = lo != null && hi != null && day >= lo && day <= hi;\n const disabled = dayDisabled(day);\n const isToday = !yearless && sameDay(day, today);\n return (\n <td\n key={col}\n className={styles.cell}\n data-band={inBand ? (preview ? \"preview\" : \"selected\") : undefined}\n data-band-start={\n inBand && (sameDay(day, lo) || col === 0 || n === 1)\n ? \"true\"\n : undefined\n }\n data-band-end={\n inBand && (sameDay(day, hi) || col === 6 || lastOfMonth)\n ? \"true\"\n : undefined\n }\n >\n <button\n type=\"button\"\n className={styles.day}\n data-day={day.getTime()}\n disabled={disabled}\n tabIndex={sameDay(day, focusDay) ? 0 : -1}\n data-edge={\n inBand && !preview && (sameDay(day, lo) || sameDay(day, hi))\n ? \"true\"\n : undefined\n }\n data-today={isToday ? \"true\" : undefined}\n aria-pressed={inBand && !preview}\n aria-current={isToday ? \"date\" : undefined}\n aria-label={format(day, yearless ? \"d MMMM\" : \"d MMMM yyyy\", {\n locale,\n })}\n onClick={() => pickDay(day)}\n onFocus={() => setFocusDay(day)}\n onMouseEnter={() => preview && !disabled && setHover(day)}\n >\n {n}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n })}\n </div>\n\n {promptText ? (\n <p className={styles.hint} aria-live=\"polite\">\n {promptText}\n </p>\n ) : null}\n\n {footer ? (\n <div className={styles.footer}>\n <div className={styles.footerFields}>\n <FooterField\n label={isRange ? labels.rangeStart : labels.date}\n date={footerFrom ? format(footerFrom, footerFormat) : \"\"}\n time={withTime ? fromTime : null}\n timeLabel={isRange ? labels.timeStart : labels.time}\n invalid={fromMinutes == null}\n onTime={setFromTime}\n />\n {isRange ? (\n <>\n <span className={styles.dash} aria-hidden>\n \u2014\n </span>\n <FooterField\n label={labels.rangeEnd}\n date={footerTo ? format(footerTo, footerFormat) : \"\"}\n time={withTime ? toTime : null}\n timeLabel={labels.timeEnd}\n invalid={toMinutes == null}\n onTime={setToTime}\n />\n </>\n ) : null}\n </div>\n <div className={styles.footerActions}>\n <Button.Root\n variant=\"ghost\"\n tone=\"neutral\"\n type=\"button\"\n size={controlSize}\n onClick={reset}\n >\n {labels.reset}\n </Button.Root>\n <Button.Root type=\"button\" size={controlSize} disabled={!canApply} onClick={apply}>\n {labels.apply}\n </Button.Root>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction FooterField({\n label,\n date,\n time,\n timeLabel,\n invalid,\n onTime,\n}: {\n label: string;\n date: string;\n time: string | null;\n timeLabel: string;\n invalid: boolean;\n onTime: (value: string) => void;\n}) {\n return (\n <fieldset className={styles.field} aria-label={label}>\n <span className={styles.fieldDate} data-empty={date ? undefined : \"true\"}>\n {date || \"\u2014\"}\n </span>\n {time != null ? (\n <input\n aria-label={timeLabel}\n aria-invalid={invalid || undefined}\n className={styles.fieldTime}\n value={time}\n inputMode=\"numeric\"\n maxLength={5}\n onChange={(e) => onTime(e.target.value)}\n />\n ) : null}\n </fieldset>\n );\n}\n\n/** \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F: \u043F\u0440\u0435\u0441\u0435\u0442, \u00AB6 \u043E\u043A\u0442 \u2014 3 \u043D\u043E\u044F\u0431\u00BB, \u0441\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0435\u043C, \u0435\u0441\u043B\u0438 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043D\u0435 \u043F\u043E \u0446\u0435\u043B\u044B\u043C \u0434\u043D\u044F\u043C. */\nfunction formatValue(props: CalendarOptions & ResolvedValue): string | null {\n const locale = props.locale ?? ru;\n const labels = { ...DATEPICKER_LABELS, ...props.labels };\n const today = toDay(props.today ?? new Date());\n if (props.mode === \"single\") {\n if (!props.value) return null;\n if (props.yearless) return format(props.value, \"d MMMM\", { locale });\n const time = props.withTime ? ` ${formatTime(minutesOf(props.value))}` : \"\";\n return `${formatDayShort(toDay(props.value), today, locale)}${time}`;\n }\n const { from, to } = props.value;\n if (!to) return null;\n const fromDay = from ? toDay(from) : null;\n const lastDay = toDay(to);\n const wholeDays =\n (from == null || minutesOf(from) === DAY_START_MINUTES) && minutesOf(to) === DAY_END_MINUTES;\n if (wholeDays && props.presets) {\n const preset = matchPreset(props.presets, fromDay, lastDay, today);\n if (preset) return preset.label;\n }\n const time = (d: Date) => (wholeDays ? \"\" : ` ${formatTime(minutesOf(d))}`);\n const toText = `${formatDayShort(lastDay, today, locale)}${time(to)}`;\n if (!from || !fromDay) return `${labels.until} ${toText}`;\n if (wholeDays && sameDay(fromDay, lastDay)) return formatDayShort(fromDay, today, locale);\n return `${formatDayShort(fromDay, today, locale)}${time(from)} \u2014 ${toText}`;\n}\n\n/** Text of a value as the field shows it (preset name, \u00AB6 \u043E\u043A\u0442 \u2014 3 \u043D\u043E\u044F\u0431\u00BB, time when needed). */\nexport function formatDatepickerValue(\n props: CalendarOptions &\n ({ mode: \"range\"; value: DatepickerRange } | { mode: \"single\"; value: Date | null }),\n): string | null {\n return formatValue(\n props.mode === \"range\" ? { ...props, onChange: () => {} } : { ...props, onChange: () => {} },\n );\n}\n\nexport type DatepickerBadgeProps = {\n /** Palette hue of the soft badge. Default `gray`. */\n color?: PaletteColor;\n children: React.ReactNode;\n className?: string;\n};\n\n/**\n * Status inside the field (child of `Datepicker.Root`): a soft Badge one tier below the field, at\n * the trailing edge before the chevron. The value truncates before it; the height is unchanged.\n */\nfunction DatepickerBadge({ color = \"gray\", children, className }: DatepickerBadgeProps) {\n return (\n <Badge.Root color={color} variant=\"soft\" className={className}>\n {children}\n </Badge.Root>\n );\n}\nDatepickerBadge.displayName = \"Datepicker.Badge\";\n\nexport type DatepickerRootProps = DatepickerPanelProps &\n FieldFrameProps & {\n size?: ControlSize;\n /** Field text without a value. Default \u00AB\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0434\u0430\u0442\u0443\u00BB. */\n placeholder?: string;\n /** Text before the value in the field, e.g. \u00AB\u0421\u00BB. */\n valuePrefix?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n /** Danger ring and `aria-invalid`; a non-empty `error` implies it. */\n invalid?: boolean;\n /** Field stretches to the container width; otherwise it fits the text. */\n fullWidth?: boolean;\n /** Popover alignment to the field. */\n align?: PositionAlign;\n /** Id of the field button; generated when omitted. */\n id?: string;\n /** Accessible name when there is no `label`; the current value is appended. */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n /** Field adornments: `Datepicker.Badge` (rendered before the chevron, part of the name). */\n children?: React.ReactNode;\n };\n\n/** \u041F\u043E\u043B\u0435 (\u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u043F\u043E\u043B\u0435\u0439: \u0437\u0430\u043B\u0438\u0432\u043A\u0430, \u0432\u044B\u0441\u043E\u0442\u0430 \u044F\u0440\u0443\u0441\u0430, \u043A\u043E\u043B\u044C\u0446\u0430) \u0441\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C; \u043F\u043E \u043A\u043B\u0438\u043A\u0443 \u2014 \u043F\u0430\u043D\u0435\u043B\u044C \u0432 \u043F\u043E\u043F\u043E\u0432\u0435\u0440\u0435. */\nfunction DatepickerRoot({\n mode,\n value: valueProp,\n defaultValue,\n onValueChange,\n resetValue,\n size = \"m\",\n placeholder = \"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0434\u0430\u0442\u0443\",\n valuePrefix,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n invalid: invalidProp,\n focusRing = true,\n fullWidth = false,\n align = \"start\",\n id,\n label,\n required = false,\n optional,\n hint,\n error,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n children,\n ...options\n}: DatepickerRootProps) {\n const resolved = useResolvedValue({\n mode,\n value: valueProp,\n defaultValue,\n onValueChange,\n resetValue,\n } as RangeModeProps | SingleModeProps);\n const labels = { ...DATEPICKER_LABELS, ...options.labels };\n const ids = useFieldFrame(id, { hint, error, invalid: invalidProp }, ariaDescribedBy);\n const textId = `${ids.controlId}-value`;\n const badgeId = `${ids.controlId}-badge`;\n const hasBadge = children != null && children !== false;\n const [openState, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const open = openState && !disabled;\n const [panelNode, setPanelNode] = React.useState<HTMLDivElement | null>(null);\n useContainScroll(panelNode);\n const value = formatValue({ ...options, size, ...resolved });\n const text = value ? `${valuePrefix ? `${valuePrefix} ` : \"\"}${value}` : placeholder;\n\n return (\n <FieldFrame\n size={size}\n ids={ids}\n label={label}\n required={required}\n optional={optional}\n hint={hint}\n error={error}\n disabled={disabled}\n optionalLabel={labels.optional}\n className={className}\n >\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger>\n <button\n id={ids.controlId}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel ? `${ariaLabel}: ${text}` : undefined}\n aria-labelledby={\n ariaLabel\n ? undefined\n : (ariaLabelledBy ??\n (label != null && label !== false\n ? cx(ids.labelId, textId, hasBadge && badgeId)\n : undefined))\n }\n aria-describedby={ids.describedBy}\n aria-invalid={ids.invalid || undefined}\n className={styles.trigger}\n {...toDataAttributes({\n size,\n empty: value ? undefined : true,\n \"full-width\": fullWidth || undefined,\n invalid: ids.invalid || undefined,\n disabled: disabled || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n >\n <Calendar className={styles.triggerIcon} aria-hidden />\n <span id={textId} className={styles.triggerLabel}>\n {text}\n </span>\n {hasBadge ? (\n <span id={badgeId} className={styles.triggerBadge}>\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </span>\n ) : null}\n <ChevronDown className={cx(styles.triggerIcon, styles.triggerChevron)} aria-hidden />\n </button>\n </Popover.Trigger>\n <Popover.Content\n align={align}\n side=\"bottom\"\n size={size}\n trapFocus\n insetPadding=\"none\"\n insetGap=\"none\"\n className={styles.popover}\n >\n <div ref={setPanelNode} className={styles.popoverBody}>\n <InPopoverContext.Provider value={true}>\n <PanelView {...options} size={size} {...resolved} onDone={() => setOpen(false)} />\n </InPopoverContext.Provider>\n </div>\n </Popover.Content>\n </Popover.Root>\n </FieldFrame>\n );\n}\nDatepickerRoot.displayName = \"Datepicker.Root\";\n\nexport const Datepicker = {\n Root: DatepickerRoot,\n Panel: DatepickerPanel,\n Badge: DatepickerBadge,\n};\n", "/**\n * Primitive layer (`--prime-ref-*`). Raw values only: no meaning, never used by components directly.\n * Everything that has a role lives in `semantic.ts`.\n */\nexport const primitiveTokens = {\n color: {\n white: \"#ffffff\",\n black: \"#000000\",\n /** Graphite: cool neutral, slight blue bias. 0\u2013100 light surfaces, 750\u2013950 dark surfaces. */\n gray: {\n 0: \"#ffffff\",\n 25: \"#f7f8fa\",\n 50: \"#f3f4f6\",\n 75: \"#eef0f3\",\n 100: \"#e8eaee\",\n 150: \"#e0e3e8\",\n 200: \"#d5d9e0\",\n 300: \"#b9bec8\",\n 400: \"#949bab\",\n 500: \"#636a79\",\n 600: \"#575e6d\",\n 700: \"#3b4150\",\n 750: \"#343a44\",\n 800: \"#2a2f38\",\n 825: \"#252a32\",\n 850: \"#20242b\",\n 875: \"#1b1e25\",\n 900: \"#16191f\",\n 925: \"#111318\",\n 950: \"#0d0f13\",\n },\n /** Cobalt: brand accent. */\n cobalt: {\n 50: \"#f0f2fe\",\n 100: \"#e6eafd\",\n 200: \"#cdd5fb\",\n 300: \"#aab6ff\",\n 400: \"#93a3ff\",\n 500: \"#5068f5\",\n 600: \"#3f59f0\",\n 700: \"#2f4ae0\",\n 800: \"#2540c8\",\n 900: \"#1d33a0\",\n 950: \"#1b2249\",\n },\n red: {\n 50: \"#fef2f2\",\n 100: \"#fee2e2\",\n 200: \"#fecaca\",\n 300: \"#fca5a5\",\n 400: \"#f87171\",\n 500: \"#ef4444\",\n 600: \"#dc2626\",\n 700: \"#b91c1c\",\n 800: \"#991b1b\",\n 900: \"#7f1d1d\",\n 950: \"#450a0a\",\n },\n orange: {\n 50: \"#fff7ed\",\n 100: \"#ffedd5\",\n 200: \"#fed7aa\",\n 300: \"#fdba74\",\n 400: \"#fb923c\",\n 500: \"#f97316\",\n 600: \"#ea580c\",\n 700: \"#c2410c\",\n 800: \"#9a3412\",\n 900: \"#7c2d12\",\n 950: \"#431407\",\n },\n yellow: {\n 50: \"#fefce8\",\n 100: \"#fef9c3\",\n 200: \"#fef08a\",\n 300: \"#fde047\",\n 400: \"#facc15\",\n 500: \"#eab308\",\n 600: \"#ca8a04\",\n 700: \"#a16207\",\n 800: \"#854d0e\",\n 900: \"#713f12\",\n 950: \"#422006\",\n },\n green: {\n 50: \"#f0fdf4\",\n 100: \"#dcfce7\",\n 200: \"#bbf7d0\",\n 300: \"#86efac\",\n 400: \"#4ade80\",\n 500: \"#22c55e\",\n 600: \"#16a34a\",\n 700: \"#15803d\",\n 800: \"#166534\",\n 900: \"#14532d\",\n 950: \"#052e16\",\n },\n teal: {\n 50: \"#f0fdfa\",\n 100: \"#ccfbf1\",\n 200: \"#99f6e4\",\n 300: \"#5eead4\",\n 400: \"#2dd4bf\",\n 500: \"#14b8a6\",\n 600: \"#0d9488\",\n 700: \"#0f766e\",\n 800: \"#115e59\",\n 900: \"#134e4a\",\n 950: \"#042f2e\",\n },\n sky: {\n 50: \"#f0f9ff\",\n 100: \"#e0f2fe\",\n 200: \"#bae6fd\",\n 300: \"#7dd3fc\",\n 400: \"#38bdf8\",\n 500: \"#0ea5e9\",\n 600: \"#0284c7\",\n 700: \"#0369a1\",\n 800: \"#075985\",\n 900: \"#0c4a6e\",\n 950: \"#082f49\",\n },\n purple: {\n 50: \"#faf5ff\",\n 100: \"#f3e8ff\",\n 200: \"#e9d5ff\",\n 300: \"#d8b4fe\",\n 400: \"#c084fc\",\n 500: \"#a855f7\",\n 600: \"#9333ea\",\n 700: \"#7e22ce\",\n 800: \"#6b21a8\",\n 900: \"#581c87\",\n 950: \"#3b0764\",\n },\n pink: {\n 50: \"#fdf2f8\",\n 100: \"#fce7f3\",\n 200: \"#fbcfe8\",\n 300: \"#f9a8d4\",\n 400: \"#f472b6\",\n 500: \"#ec4899\",\n 600: \"#db2777\",\n 700: \"#be185d\",\n 800: \"#9d174d\",\n 900: \"#831843\",\n 950: \"#500724\",\n },\n },\n\n /** 4px grid. Key = number of 4px steps (`4` \u2192 16px). */\n space: {\n 0: \"0\",\n 1: \"0.25rem\",\n 2: \"0.5rem\",\n 3: \"0.75rem\",\n 4: \"1rem\",\n 5: \"1.25rem\",\n 6: \"1.5rem\",\n 7: \"1.75rem\",\n 8: \"2rem\",\n 9: \"2.25rem\",\n 10: \"2.5rem\",\n 12: \"3rem\",\n 14: \"3.5rem\",\n 16: \"4rem\",\n 20: \"5rem\",\n 24: \"6rem\",\n },\n\n radius: {\n 0: \"0\",\n 4: \"4px\",\n 6: \"6px\",\n 8: \"8px\",\n 10: \"10px\",\n 12: \"12px\",\n 16: \"16px\",\n 20: \"20px\",\n full: \"9999px\",\n },\n\n font: {\n family: {\n sans: '\"Golos Text\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: '\"JetBrains Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n },\n /** Modular scale, ~1.2 in the body range, ~1.25 for headings. */\n size: {\n 12: \"0.75rem\",\n 13: \"0.8125rem\",\n 14: \"0.875rem\",\n 16: \"1rem\",\n 18: \"1.125rem\",\n 20: \"1.25rem\",\n 24: \"1.5rem\",\n 30: \"1.875rem\",\n 36: \"2.25rem\",\n 48: \"3rem\",\n 60: \"3.75rem\",\n },\n lineHeight: {\n 16: \"1rem\",\n 20: \"1.25rem\",\n 24: \"1.5rem\",\n 28: \"1.75rem\",\n 32: \"2rem\",\n 36: \"2.25rem\",\n 44: \"2.75rem\",\n 56: \"3.5rem\",\n 68: \"4.25rem\",\n },\n weight: {\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n },\n tracking: {\n tightest: \"-0.03em\",\n tighter: \"-0.02em\",\n tight: \"-0.01em\",\n normal: \"0\",\n wide: \"0.01em\",\n caps: \"0.06em\",\n },\n },\n\n icon: {\n 14: \"0.875rem\",\n 16: \"1rem\",\n 20: \"1.25rem\",\n 24: \"1.5rem\",\n 32: \"2rem\",\n },\n\n duration: {\n 0: \"0ms\",\n 100: \"100ms\",\n 120: \"120ms\",\n 200: \"200ms\",\n 300: \"300ms\",\n 400: \"400ms\",\n },\n easing: {\n standard: \"cubic-bezier(0.2, 0, 0, 1)\",\n enter: \"cubic-bezier(0, 0, 0, 1)\",\n exit: \"cubic-bezier(0.3, 0, 1, 1)\",\n },\n\n /** Stacking order. In-overlay layers sit above their host so nested portals stay on top. */\n zIndex: {\n base: \"1\",\n sticky: \"100\",\n popover: \"1000\",\n dropdown: \"1200\",\n tooltip: \"1600\",\n drawer: \"2000\",\n popoverInDrawer: \"2100\",\n dropdownInDrawer: \"2200\",\n tooltipInDrawer: \"2300\",\n modal: \"3000\",\n popoverInModal: \"3100\",\n dropdownInModal: \"3200\",\n tooltipInModal: \"3300\",\n drawerNestedShell: \"3400\",\n popoverInDrawerInModal: \"3500\",\n dropdownInDrawerInModal: \"3600\",\n tooltipInDrawerInModal: \"3700\",\n toast: \"10000\",\n },\n} as const;\n", "/* \u2500\u2500\u2500 Datepicker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Trigger = field system. Panel: square day cells = tier item height, continuous range\n * band (inner cells radius 0, outer ends rounded), presets column, footer with time + actions.\n */\n\n/* \u2500\u2500\u2500 Tier variables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel,\n.trigger {\n --dp-cell: var(--prime-control-m-item-height);\n --dp-text: var(--prime-control-m-text-size);\n --dp-lh: var(--prime-control-m-line-height);\n --dp-icon: var(--prime-control-m-icon);\n --dp-radius: var(--prime-panel-item-radius);\n /* Trigger: field of the same tier. */\n --dp-h: var(--prime-control-m-height);\n --dp-px: var(--prime-control-m-field-padding-x);\n --dp-gap: var(--prime-control-m-gap);\n --dp-field-radius: var(--prime-control-m-radius);\n /* Footer fields: one tier down. */\n --dp-field-h: var(--prime-control-s-height);\n --dp-field-text: var(--prime-control-s-text-size);\n}\n\n[data-size=\"xs\"]:is(.panel, .trigger) {\n --dp-cell: var(--prime-control-xs-item-height);\n --dp-text: var(--prime-control-xs-text-size);\n --dp-lh: var(--prime-control-xs-line-height);\n --dp-icon: var(--prime-control-xs-icon);\n --dp-radius: var(--prime-radius-s);\n --dp-h: var(--prime-control-xs-height);\n --dp-px: var(--prime-control-xs-field-padding-x);\n --dp-gap: var(--prime-control-xs-gap);\n --dp-field-radius: var(--prime-control-xs-radius);\n --dp-field-h: var(--prime-control-xs-height);\n --dp-field-text: var(--prime-control-xs-text-size);\n}\n\n[data-size=\"s\"]:is(.panel, .trigger) {\n --dp-cell: var(--prime-control-s-item-height);\n --dp-text: var(--prime-control-s-text-size);\n --dp-lh: var(--prime-control-s-line-height);\n --dp-icon: var(--prime-control-s-icon);\n --dp-radius: var(--prime-radius-s);\n --dp-h: var(--prime-control-s-height);\n --dp-px: var(--prime-control-s-field-padding-x);\n --dp-gap: var(--prime-control-s-gap);\n --dp-field-radius: var(--prime-control-s-radius);\n --dp-field-h: var(--prime-control-xs-height);\n --dp-field-text: var(--prime-control-xs-text-size);\n}\n\n[data-size=\"l\"]:is(.panel, .trigger) {\n --dp-cell: var(--prime-control-l-item-height);\n --dp-text: var(--prime-control-l-text-size);\n --dp-lh: var(--prime-control-l-line-height);\n --dp-icon: var(--prime-control-l-icon);\n --dp-h: var(--prime-control-l-height);\n --dp-px: var(--prime-control-l-field-padding-x);\n --dp-gap: var(--prime-control-l-gap);\n --dp-field-radius: var(--prime-control-l-radius);\n --dp-field-h: var(--prime-control-m-height);\n --dp-field-text: var(--prime-control-m-text-size);\n}\n\n[data-size=\"xl\"]:is(.panel, .trigger) {\n --dp-cell: var(--prime-control-xl-item-height);\n --dp-text: var(--prime-control-xl-text-size);\n --dp-lh: var(--prime-control-xl-line-height);\n --dp-icon: var(--prime-control-xl-icon);\n --dp-h: var(--prime-control-xl-height);\n --dp-px: var(--prime-control-xl-field-padding-x);\n --dp-gap: var(--prime-control-xl-gap);\n --dp-field-radius: var(--prime-control-xl-radius);\n --dp-field-h: var(--prime-control-l-height);\n --dp-field-text: var(--prime-control-l-text-size);\n}\n\n/* \u2500\u2500\u2500 Trigger (field) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.trigger {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n /* Icons centered between the edge and the text: edge\u2192icon = icon\u2192text = padX (foundation \u00A76). */\n gap: var(--dp-px);\n /* \u0428\u0438\u0440\u0438\u043D\u0430 \u043F\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443, \u043D\u0435 \u0448\u0438\u0440\u0435 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0430. */\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n height: var(--dp-h);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--dp-px);\n border: 0;\n border-radius: var(--dp-field-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--dp-text);\n line-height: var(--dp-lh);\n text-align: start;\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.trigger[data-full-width=\"true\"] {\n display: flex;\n width: 100%;\n}\n\n.trigger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.trigger[data-state=\"open\"],\n.trigger:focus-visible {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.trigger:not([data-focus-ring=\"false\"]):focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.trigger[data-invalid=\"true\"] {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.trigger[data-invalid=\"true\"]:focus-visible {\n outline-color: var(--prime-color-danger-border);\n}\n\n.trigger:disabled {\n background: var(--prime-color-field-bg-disabled);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.triggerIcon {\n flex-shrink: 0;\n width: var(--dp-icon);\n height: var(--dp-icon);\n color: var(--prime-color-text-muted);\n}\n\n.triggerChevron {\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.trigger[data-state=\"open\"] .triggerChevron {\n transform: rotate(180deg);\n}\n\n.trigger:disabled .triggerIcon {\n color: var(--prime-color-text-disabled);\n}\n\n.triggerLabel {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n\n/* Datepicker.Badge: after the value, before the chevron (padX on both sides via the gap). */\n.triggerBadge {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n/* Gray soft is a wash like the field: a stronger wash keeps a neutral badge visible (\u00A74). */\n.triggerBadge > [data-color=\"gray\"]:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-strong);\n}\n\n.trigger[data-empty=\"true\"]:not(:disabled) .triggerLabel {\n color: var(--prime-color-text-placeholder);\n}\n\n/* \u2500\u2500\u2500 Popover shell \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n[role=\"dialog\"].popover {\n width: fit-content;\n max-width: var(--float-max-w, calc(100vw - 2 * var(--prime-space-2)));\n padding: 0;\n}\n\n.popoverBody {\n display: flex;\n min-width: 0;\n min-height: 0;\n}\n\n/* \u2500\u2500\u2500 Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel {\n /* Fields inside a raised surface stay distinguishable (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n display: flex;\n min-width: 0;\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--dp-text);\n line-height: var(--dp-lh);\n}\n\n.panel[data-layout=\"stacked\"] {\n flex-direction: column;\n}\n\n/* \u2500\u2500\u2500 Presets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.presets {\n display: flex;\n flex-shrink: 0;\n flex-direction: column;\n width: calc(var(--dp-cell) * 5);\n padding: var(--prime-panel-padding);\n overflow-y: auto;\n overscroll-behavior: contain;\n border-inline-end: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.presetTitle {\n display: flex;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n margin: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.presetItem {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: var(--dp-cell);\n padding-block: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n border: 0;\n border-radius: var(--prime-panel-item-radius);\n background: transparent;\n color: var(--prime-color-text-secondary);\n font: inherit;\n text-align: start;\n white-space: nowrap;\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.presetItem:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.presetItem:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.presetItem[aria-pressed=\"true\"] {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n font-weight: var(--prime-font-weight-medium);\n}\n\n/* Narrow: presets become a horizontally scrolling row above the calendar. */\n.panel[data-layout=\"stacked\"] .presets {\n flex-direction: row;\n gap: var(--prime-space-1);\n width: auto;\n overflow-x: auto;\n overflow-y: hidden;\n border-inline-end: 0;\n border-bottom: var(--prime-border-width) solid var(--prime-color-border-subtle);\n scrollbar-width: none;\n}\n\n.panel[data-layout=\"stacked\"] .presetTitle {\n display: none;\n}\n\n.panel[data-layout=\"stacked\"] .presetItem {\n background: var(--prime-color-fill-muted);\n}\n\n.panel[data-layout=\"stacked\"] .presetItem:hover {\n background: var(--prime-color-fill-muted-hover);\n}\n\n.panel[data-layout=\"stacked\"] .presetItem[aria-pressed=\"true\"] {\n background: var(--prime-color-accent-soft);\n}\n\n/* \u2500\u2500\u2500 Calendar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.main {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--prime-space-2);\n min-width: 0;\n padding: var(--prime-space-3);\n}\n\n.months {\n display: flex;\n justify-content: flex-start;\n gap: var(--prime-space-6);\n}\n\n.month {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n width: calc(var(--dp-cell) * 7);\n}\n\n.monthHeader {\n display: flex;\n align-items: center;\n height: var(--dp-cell);\n}\n\n.monthTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n font-size: var(--prime-text-title-s-size);\n font-weight: var(--prime-text-title-s-weight);\n line-height: var(--prime-text-title-s-line-height);\n text-align: center;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n}\n\n.nav,\n.navSpacer {\n flex-shrink: 0;\n width: var(--dp-cell);\n height: var(--dp-cell);\n}\n\n/* Ghost icon button. */\n.nav {\n display: grid;\n place-items: center;\n padding: 0;\n border: 0;\n border-radius: var(--dp-radius);\n background: transparent;\n color: var(--prime-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.nav :global(svg) {\n width: var(--dp-icon);\n height: var(--dp-icon);\n}\n\n.nav:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.nav:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n/* \u0421\u0435\u0442\u043A\u0430 \u043C\u0435\u0441\u044F\u0446\u0430: \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0430 \u2014 \u0442\u0430\u0431\u043B\u0438\u0446\u0430 (\u0441\u0435\u043C\u0430\u043D\u0442\u0438\u043A\u0430), \u0440\u0430\u0441\u043A\u043B\u0430\u0434\u043A\u0430 \u2014 CSS Grid \u043D\u0430 7 \u0440\u0430\u0432\u043D\u044B\u0445 \u043A\u043E\u043B\u043E\u043D\u043E\u043A. */\n.table {\n display: flex;\n flex-direction: column;\n width: 100%;\n border-collapse: collapse;\n}\n\n.rowGroup {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n}\n\n.weekday {\n display: grid;\n place-items: center;\n height: var(--prime-panel-group-label-height);\n padding: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-regular);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.weekday[data-weekend=\"true\"] {\n color: var(--prime-color-text-placeholder);\n}\n\n.cell {\n display: grid;\n place-items: center;\n height: var(--dp-cell);\n padding: 0;\n}\n\n/* Continuous band: inner cells square, rounded only on the outer side of each run. */\n.cell[data-band=\"selected\"] {\n background: var(--prime-color-accent-soft);\n}\n\n.cell[data-band=\"preview\"] {\n background: color-mix(in srgb, var(--prime-color-accent-soft) 60%, transparent);\n}\n\n.cell[data-band-start=\"true\"] {\n border-start-start-radius: var(--dp-radius);\n border-end-start-radius: var(--dp-radius);\n}\n\n.cell[data-band-end=\"true\"] {\n border-start-end-radius: var(--dp-radius);\n border-end-end-radius: var(--dp-radius);\n}\n\n.day {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n max-width: var(--dp-cell);\n height: 100%;\n padding: 0;\n border: 0;\n border-radius: var(--dp-radius);\n background: transparent;\n color: inherit;\n font: inherit;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.day:hover:not(:disabled):not([data-edge=\"true\"]) {\n background: var(--prime-color-fill-subtle);\n}\n\n.cell[data-band] .day:hover:not(:disabled):not([data-edge=\"true\"]) {\n background: var(--prime-color-accent-soft-hover);\n}\n\n.day:active:not(:disabled):not([data-edge=\"true\"]) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.day:focus-visible,\n.nav:focus-visible,\n.presetItem:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.day:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.cell[data-band=\"selected\"] .day:not([data-edge=\"true\"]) {\n color: var(--prime-color-accent-text);\n}\n\n/* Today: accent text + semibold; `aria-current=\"date\"` names it for assistive tech. */\n.day[data-today=\"true\"] {\n color: var(--prime-color-accent-text);\n font-weight: var(--prime-font-weight-semibold);\n}\n\n.day[data-today=\"true\"]:disabled {\n color: var(--prime-color-text-disabled);\n}\n\n.day[data-edge=\"true\"] {\n background: var(--prime-color-accent-default);\n color: var(--prime-color-accent-fg);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.day[data-edge=\"true\"]:hover {\n background: var(--prime-color-accent-hover);\n}\n\n/* Days of the neighbouring months: context only, not interactive. */\n.outsideDay {\n color: var(--prime-color-text-disabled);\n font-variant-numeric: tabular-nums;\n user-select: none;\n}\n\n.hint {\n margin: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n/* \u2500\u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* \u041D\u0438\u0436\u043D\u044F\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0438 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430 \u043D\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044F\u044E\u0442 \u043F\u0430\u043D\u0435\u043B\u044C: \u0448\u0438\u0440\u0438\u043D\u0443 \u0437\u0430\u0434\u0430\u044E\u0442 \u043C\u0435\u0441\u044F\u0446\u044B. */\n.footer,\n.hint {\n contain: inline-size;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--prime-space-2) var(--prime-space-3);\n padding-block-start: var(--prime-space-3);\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n/* The fields keep a readable basis: when the row is too narrow they wrap above the actions\n instead of shrinking to empty slivers (foundation \u00A79: nothing clips). */\n.footerFields {\n display: flex;\n flex: 1 1 calc(var(--prime-space-24) * 2);\n align-items: center;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.field {\n box-sizing: border-box;\n display: flex;\n flex: 1 1 0;\n align-items: center;\n min-width: 0;\n height: var(--dp-field-h);\n margin: 0;\n padding: 0;\n overflow: hidden;\n border: 0;\n border-radius: var(--prime-radius-m);\n background: var(--prime-color-field-bg);\n font-size: var(--dp-field-text);\n}\n\n.fieldDate {\n flex: 1 1 auto;\n min-width: 0;\n padding-inline: var(--prime-space-2);\n overflow: hidden;\n color: var(--prime-color-text-primary);\n font-variant-numeric: tabular-nums;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fieldDate[data-empty=\"true\"] {\n color: var(--prime-color-text-placeholder);\n}\n\n.fieldTime {\n box-sizing: border-box;\n flex-shrink: 0;\n width: calc(var(--dp-field-h) * 1.75);\n height: 100%;\n padding-inline: var(--prime-space-2);\n border: 0;\n border-inline-start: var(--prime-border-width) solid var(--prime-color-border-subtle);\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n font-variant-numeric: tabular-nums;\n text-align: center;\n outline: none;\n}\n\n.field:has(.fieldTime:focus-visible) {\n background: var(--prime-color-field-bg-focus);\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.fieldTime[aria-invalid=\"true\"] {\n color: var(--prime-color-danger-text);\n}\n\n.field:has(.fieldTime[aria-invalid=\"true\"]) {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.dash {\n flex-shrink: 0;\n color: var(--prime-color-text-muted);\n}\n\n.footerActions {\n display: flex;\n flex-shrink: 0;\n gap: var(--prime-space-2);\n margin-inline-start: auto;\n}\n\n/* \u2500\u2500\u2500 Embedded panel (Datepicker.Panel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * The embedded panel is itself the bounded block (foundation \u00A74): card fill, radius, padding and\n * shadow from the card context, so it reads on any host. It sizes to its content and never centers\n * months in slack; months (1 or 2) follow the parent's available width (see resolvePanelLayout).\n */\n\n.panel[data-embedded=\"true\"] {\n box-sizing: border-box;\n width: fit-content;\n max-width: 100%;\n border-radius: var(--prime-card-radius);\n background: var(--prime-color-card-bg);\n box-shadow: var(--prime-card-shadow);\n}\n\n.panel[data-embedded=\"true\"] .main {\n padding: var(--prime-card-padding-s);\n}\n\n/* Narrower than one month: the panel takes the column, cells shrink. */\n.panel[data-compact=\"true\"] {\n width: 100%;\n}\n\n.panel[data-compact=\"true\"] .month {\n flex: 1 1 0;\n width: auto;\n min-width: 0;\n max-width: calc(var(--dp-cell) * 7);\n}\n\n/* Narrower than one month: cells shrink, tighter gutters. */\n.panel[data-compact=\"true\"] .main {\n padding: var(--prime-space-2);\n}\n\n.panel[data-compact=\"true\"] .months {\n gap: var(--prime-space-4);\n}\n\n.panel[data-compact=\"true\"] .footerFields {\n flex-basis: 100%;\n}\n\n.panel[data-compact=\"true\"] .footerActions {\n flex: 1 1 100%;\n justify-content: flex-end;\n}\n", "import {\n addDays,\n endOfMonth,\n endOfWeek,\n endOfYear,\n format,\n getDaysInMonth,\n isSameYear,\n type Locale,\n startOfDay,\n startOfMonth,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subWeeks,\n subYears,\n} from \"date-fns\";\n\n/**\n * \u041B\u043E\u0433\u0438\u043A\u0430 Datepicker \u0431\u0435\u0437 \u0447\u0430\u0441\u043E\u0432\u044B\u0445 \u043F\u043E\u044F\u0441\u043E\u0432: \u0432\u0441\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u2014 \u00AB\u043D\u0430\u0441\u0442\u0435\u043D\u043D\u043E\u0435\u00BB \u0432\u0440\u0435\u043C\u044F (\u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u043B\u044F Date).\n * \u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u043D\u044B\u0439 \u0434\u0435\u043D\u044C \u2014 Date \u043D\u0430 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u043E\u043B\u043D\u043E\u0447\u044C. \u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0432 \u043F\u043E\u044F\u0441 \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F.\n */\n\nexport type DatepickerRange = {\n /** null \u2014 \u0431\u0435\u0437 \u043D\u0438\u0436\u043D\u0435\u0439 \u0433\u0440\u0430\u043D\u0438\u0446\u044B (\u00AB\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F\u00BB). */\n from: Date | null;\n to: Date | null;\n};\n\nexport type WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/** \u0412\u0438\u0441\u043E\u043A\u043E\u0441\u043D\u044B\u0439 \u0433\u043E\u0434 \u0434\u043B\u044F \u0435\u0436\u0435\u0433\u043E\u0434\u043D\u044B\u0445 \u0434\u0430\u0442 \u00AB\u0434\u0435\u043D\u044C + \u043C\u0435\u0441\u044F\u0446\u00BB. */\nexport const YEARLESS_YEAR = 2000;\nexport const DAY_START_MINUTES = 0;\nexport const DAY_END_MINUTES = 23 * 60 + 59;\n\nexport function sameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n return a != null && b != null && a.getTime() === b.getTime();\n}\n\nexport function toDay(value: Date): Date {\n return startOfDay(value);\n}\n\nexport function minutesOf(value: Date): number {\n return value.getHours() * 60 + value.getMinutes();\n}\n\n/** \u0414\u0435\u043D\u044C + \u043C\u0438\u043D\u0443\u0442\u044B \u2192 Date; `endOfMinute` \u0434\u043E\u0431\u0438\u0432\u0430\u0435\u0442 \u0434\u043E 59.999 \u0441. */\nexport function withMinutes(day: Date, minutes: number, endOfMinute = false): Date {\n return new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n Math.floor(minutes / 60),\n minutes % 60,\n endOfMinute ? 59 : 0,\n endOfMinute ? 999 : 0,\n );\n}\n\n/**\n * \u041A\u043B\u0435\u0442\u043A\u0430 \u0441\u0435\u0442\u043A\u0438 \u043C\u0435\u0441\u044F\u0446\u0430. `day` \u2014 \u0434\u0435\u043D\u044C \u044D\u0442\u043E\u0433\u043E \u043C\u0435\u0441\u044F\u0446\u0430 \u0438\u043B\u0438 null \u0434\u043B\u044F \u043A\u043B\u0435\u0442\u043A\u0438 \u0441\u043E\u0441\u0435\u0434\u043D\u0435\u0433\u043E \u043C\u0435\u0441\u044F\u0446\u0430;\n * `outside` \u2014 \u0434\u0430\u0442\u0430 \u0441\u043E\u0441\u0435\u0434\u043D\u0435\u0433\u043E \u043C\u0435\u0441\u044F\u0446\u0430 \u0432 \u044D\u0442\u043E\u0439 \u043A\u043B\u0435\u0442\u043A\u0435 (\u0434\u043B\u044F \u043F\u0440\u0438\u0433\u043B\u0443\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430).\n */\nexport type MonthCell = { day: Date | null; col: number; outside: Date | null };\n\nfunction leadingBlanks(month: Date, weekStartsOn: WeekStart): number {\n return (startOfMonth(month).getDay() - weekStartsOn + 7) % 7;\n}\n\nexport function rowsNeeded(month: Date, weekStartsOn: WeekStart): number {\n return Math.ceil((leadingBlanks(month, weekStartsOn) + getDaysInMonth(month)) / 7);\n}\n\n/** \u0421\u0442\u0440\u043E\u043A\u0438 \u043C\u0435\u0441\u044F\u0446\u0430 \u043F\u043E 7 \u043A\u043B\u0435\u0442\u043E\u043A; `rows` \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u0442 \u0432\u044B\u0441\u043E\u0442\u0443 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0445 \u043C\u0435\u0441\u044F\u0446\u0435\u0432. */\nexport function monthGrid(month: Date, rows: number, weekStartsOn: WeekStart): MonthCell[][] {\n const first = startOfMonth(month);\n const lead = leadingBlanks(first, weekStartsOn);\n const dim = getDaysInMonth(first);\n return Array.from({ length: rows }, (_, r) =>\n Array.from({ length: 7 }, (_, c) => {\n const n = r * 7 + c - lead + 1;\n const inMonth = n >= 1 && n <= dim;\n return {\n day: inMonth ? addDays(first, n - 1) : null,\n col: c,\n outside: inMonth ? null : addDays(first, n - 1),\n };\n }),\n );\n}\n\nexport function weekdayLabels(locale: Locale, weekStartsOn: WeekStart): string[] {\n // 1 \u044F\u043D\u0432\u0430\u0440\u044F 2024 \u2014 \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A.\n return Array.from({ length: 7 }, (_, i) => {\n const text = format(new Date(2024, 0, 1 + ((weekStartsOn - 1 + i + 7) % 7)), \"EEEEEE\", {\n locale,\n });\n return text.charAt(0).toUpperCase() + text.slice(1);\n });\n}\n\nexport function monthTitle(month: Date, locale: Locale, yearless = false): string {\n const text = format(month, yearless ? \"LLLL\" : \"LLLL yyyy\", { locale });\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** \u00AB6 \u043E\u043A\u0442\u00BB, \u00AB6 \u043E\u043A\u0442 2025\u00BB \u2014 \u0433\u043E\u0434, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u0442\u0435\u043A\u0443\u0449\u0438\u0439. */\nexport function formatDayShort(day: Date, today: Date, locale: Locale, yearless = false): string {\n const pattern = yearless || isSameYear(day, today) ? \"d MMM\" : \"d MMM yyyy\";\n return format(day, pattern, { locale }).replace(\".\", \"\");\n}\n\n/** \u00ABHH:mm\u00BB \u2192 \u043C\u0438\u043D\u0443\u0442\u044B \u043E\u0442 \u043F\u043E\u043B\u0443\u043D\u043E\u0447\u0438; null \u2014 \u043D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442. */\nexport function parseTime(text: string): number | null {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(text.trim());\n if (!m) return null;\n const h = Number(m[1]);\n const min = Number(m[2]);\n if (h > 23 || min > 59) return null;\n return h * 60 + min;\n}\n\nexport function formatTime(minutes: number): string {\n const h = Math.floor(minutes / 60);\n return `${String(h).padStart(2, \"0\")}:${String(minutes % 60).padStart(2, \"0\")}`;\n}\n\n/* \u2500\u2500\u2500 \u041F\u0440\u0435\u0441\u0435\u0442\u044B \u2500\u2500\u2500 */\n\nexport type DatepickerPreset = {\n key: string;\n label: string;\n /** \u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u043D\u044B\u0435 \u0434\u043D\u0438 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u00AB\u0441\u0435\u0433\u043E\u0434\u043D\u044F\u00BB; from = null \u2014 \u0431\u0435\u0437 \u043D\u0438\u0436\u043D\u0435\u0439 \u0433\u0440\u0430\u043D\u0438\u0446\u044B. */\n days: (today: Date) => { from: Date | null; to: Date };\n};\n\nconst MONDAY = { weekStartsOn: 1 as const };\n\n/** \u0413\u043E\u0442\u043E\u0432\u044B\u0435 \u043F\u0440\u0435\u0441\u0435\u0442\u044B (\u043D\u0435\u0434\u0435\u043B\u044F \u0441 \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A\u0430). \u041F\u043E\u0434\u043F\u0438\u0441\u0438 \u043C\u043E\u0436\u043D\u043E \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0447\u0435\u0440\u0435\u0437 `{ ...preset, label }`. */\nexport const datepickerPresets = {\n today: {\n key: \"today\",\n label: \"\u0421\u0435\u0433\u043E\u0434\u043D\u044F\",\n days: (today) => ({ from: today, to: today }),\n } satisfies DatepickerPreset,\n yesterday: {\n key: \"yesterday\",\n label: \"\u0412\u0447\u0435\u0440\u0430\",\n days: (today) => ({ from: subDays(today, 1), to: subDays(today, 1) }),\n } satisfies DatepickerPreset,\n thisWeek: {\n key: \"thisWeek\",\n label: \"\u042D\u0442\u0430 \u043D\u0435\u0434\u0435\u043B\u044F\",\n days: (today) => ({ from: startOfWeek(today, MONDAY), to: today }),\n } satisfies DatepickerPreset,\n lastWeek: {\n key: \"lastWeek\",\n label: \"\u041F\u0440\u043E\u0448\u043B\u0430\u044F \u043D\u0435\u0434\u0435\u043B\u044F\",\n days: (today) => {\n const ref = subWeeks(today, 1);\n return { from: startOfWeek(ref, MONDAY), to: startOfDay(endOfWeek(ref, MONDAY)) };\n },\n } satisfies DatepickerPreset,\n thisMonth: {\n key: \"thisMonth\",\n label: \"\u042D\u0442\u043E\u0442 \u043C\u0435\u0441\u044F\u0446\",\n days: (today) => ({ from: startOfMonth(today), to: today }),\n } satisfies DatepickerPreset,\n lastMonth: {\n key: \"lastMonth\",\n label: \"\u041F\u0440\u043E\u0448\u043B\u044B\u0439 \u043C\u0435\u0441\u044F\u0446\",\n days: (today) => {\n const ref = subMonths(today, 1);\n return { from: startOfMonth(ref), to: startOfDay(endOfMonth(ref)) };\n },\n } satisfies DatepickerPreset,\n thisYear: {\n key: \"thisYear\",\n label: \"\u042D\u0442\u043E\u0442 \u0433\u043E\u0434\",\n days: (today) => ({ from: startOfYear(today), to: today }),\n } satisfies DatepickerPreset,\n lastYear: {\n key: \"lastYear\",\n label: \"\u041F\u0440\u043E\u0448\u043B\u044B\u0439 \u0433\u043E\u0434\",\n days: (today) => {\n const ref = subYears(today, 1);\n return { from: startOfYear(ref), to: startOfDay(endOfYear(ref)) };\n },\n } satisfies DatepickerPreset,\n /** \u00AB\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F\u00BB: \u0431\u0435\u0437 \u043D\u0438\u0436\u043D\u0435\u0439 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0438\u043B\u0438 \u0441 \u044F\u0432\u043D\u043E\u0439 \u0434\u0430\u0442\u043E\u0439 \u043D\u0430\u0447\u0430\u043B\u0430. */\n allTime: (start: Date | null = null, label = \"\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F\"): DatepickerPreset => ({\n key: \"allTime\",\n label,\n days: (today) => ({ from: start ? startOfDay(start) : null, to: today }),\n }),\n};\n\n/** \u041D\u0430\u0431\u043E\u0440 \u043F\u0435\u0440\u0438\u043E\u0434\u043E\u0432 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. */\nexport const DEFAULT_DATEPICKER_PRESETS: DatepickerPreset[] = [\n datepickerPresets.today,\n datepickerPresets.yesterday,\n datepickerPresets.thisWeek,\n datepickerPresets.thisMonth,\n datepickerPresets.lastWeek,\n datepickerPresets.lastMonth,\n datepickerPresets.thisYear,\n datepickerPresets.lastYear,\n];\n\n/** \u041F\u0440\u0435\u0441\u0435\u0442, \u0440\u043E\u0432\u043D\u043E \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0439 \u0441 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u043D\u044F\u043C\u0438. */\nexport function matchPreset(\n presets: DatepickerPreset[],\n fromDay: Date | null,\n toDay: Date | null,\n today: Date,\n): DatepickerPreset | null {\n if (toDay == null) return null;\n for (const preset of presets) {\n const r = preset.days(today);\n const fromMatches = r.from == null ? fromDay == null : sameDay(r.from, fromDay);\n if (fromMatches && sameDay(r.to, toDay)) return preset;\n }\n return null;\n}\n", "import * as React from \"react\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./DigitInput.module.css\";\n\nexport type DigitInputLabels = {\n /** Accessible name of the group. */\n group: string;\n /** Accessible name of a cell; `{index}` (1-based) and `{length}` are replaced. */\n cell: string;\n};\n\nconst DIGIT_INPUT_LABELS: DigitInputLabels = {\n group: \"\u041A\u043E\u0434\",\n cell: \"\u0426\u0438\u0444\u0440\u0430 {index} \u0438\u0437 {length}\",\n};\n\nexport type DigitInputRootProps = {\n /** Number of cells. */\n length?: number;\n size?: ControlSize;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Called once when the last empty cell is filled. */\n onComplete?: (value: string) => void;\n disabled?: boolean;\n invalid?: boolean;\n /**\n * Draws the focus ring on the focused cell (default). `false` sets `data-focus-ring=\"false\"` on\n * the fieldset and hides only the visual ring \u2014 focus, keyboard and ARIA are unchanged, the error\n * ring still shows. Turn it off only where focus is otherwise obvious; WCAG 2.4.7.\n */\n focusRing?: boolean;\n /** Id(s) of the hint / error text describing the group. */\n \"aria-describedby\"?: string;\n labels?: Partial<DigitInputLabels>;\n className?: string;\n};\n\nfunction normalizeDigits(raw: string, len: number) {\n return raw.replace(/\\D/g, \"\").slice(0, len);\n}\n\nfunction toCells(value: string, len: number): string[] {\n const digits = normalizeDigits(value, len);\n const cells: string[] = [];\n for (let i = 0; i < len; i++) {\n cells.push(digits[i] ?? \"\");\n }\n return cells;\n}\n\nfunction createSlotKeys(len: number) {\n return Array.from({ length: len }, () => crypto.randomUUID());\n}\n\nfunction DigitInputRoot({\n length: lengthProp = 4,\n size = \"m\",\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n onComplete,\n disabled,\n invalid,\n focusRing = true,\n \"aria-describedby\": ariaDescribedBy,\n labels: labelsProp,\n className,\n}: DigitInputRootProps) {\n const length = lengthProp;\n const labels = { ...DIGIT_INPUT_LABELS, ...labelsProp };\n const slotKeysRef = React.useRef<string[] | null>(null);\n if (!slotKeysRef.current || slotKeysRef.current.length !== length) {\n slotKeysRef.current = createSlotKeys(length);\n }\n const slotKeys = slotKeysRef.current;\n const defaultNormalized = normalizeDigits(defaultValue, length);\n const [value, setValue] = useControllableState({\n value: valueProp !== undefined ? normalizeDigits(valueProp, length) : undefined,\n defaultValue: defaultNormalized,\n onChange: onValueChange,\n });\n\n const prevLenRef = React.useRef(0);\n\n React.useEffect(() => {\n prevLenRef.current = normalizeDigits(value, length).length;\n }, [length, value]);\n\n const commit = React.useCallback(\n (nextRaw: string) => {\n const next = normalizeDigits(nextRaw, length);\n const prevLen = prevLenRef.current;\n setValue(next);\n prevLenRef.current = next.length;\n if (next.length === length && prevLen < length) {\n onComplete?.(next);\n }\n },\n [length, onComplete, setValue],\n );\n\n const cells = toCells(value, length);\n const inputRefs = React.useRef<Array<HTMLInputElement | null>>([]);\n\n const setInputRef = React.useCallback((el: HTMLInputElement | null, index: number) => {\n inputRefs.current[index] = el;\n }, []);\n\n const focusAt = React.useCallback((index: number) => {\n const el = inputRefs.current[index];\n if (el) {\n queueMicrotask(() => el.focus());\n }\n }, []);\n\n const handleChangeAt = (index: number, nextChar: string) => {\n const nextCells = [...cells];\n nextCells[index] = nextChar;\n commit(nextCells.join(\"\"));\n if (nextChar && index < length - 1) {\n focusAt(index + 1);\n }\n };\n\n const handlePaste = (startIndex: number, pasted: string) => {\n const digits = normalizeDigits(pasted, length);\n if (digits.length === 0) {\n return;\n }\n const nextCells = [...cells];\n let writeIndex = startIndex;\n for (const d of digits) {\n if (writeIndex >= length) {\n break;\n }\n nextCells[writeIndex] = d;\n writeIndex++;\n }\n commit(nextCells.join(\"\"));\n const focusIndex = Math.min(startIndex + digits.length, length - 1);\n focusAt(focusIndex);\n };\n\n return (\n <fieldset\n aria-label={labels.group}\n aria-describedby={ariaDescribedBy}\n disabled={disabled}\n className={cx(styles.root, className)}\n {...toDataAttributes({\n size,\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n >\n {cells.map((cell, index) => (\n <input\n key={slotKeys[index]}\n ref={(el) => setInputRef(el, index)}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n disabled={disabled}\n className={styles.cell}\n data-size={size}\n data-filled={cell ? \"true\" : undefined}\n value={cell}\n aria-label={labels.cell\n .replace(\"{index}\", String(index + 1))\n .replace(\"{length}\", String(length))}\n aria-invalid={invalid || undefined}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => {\n if (disabled) {\n return;\n }\n const raw = e.target.value;\n const digitsOnly = normalizeDigits(raw, 1);\n const nextChar = digitsOnly.slice(-1) ?? \"\";\n handleChangeAt(index, nextChar);\n }}\n onKeyDown={(e) => {\n if (disabled) {\n return;\n }\n if (e.key === \"Backspace\" && !cells[index] && index > 0) {\n e.preventDefault();\n focusAt(index - 1);\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n e.preventDefault();\n focusAt(index - 1);\n } else if (e.key === \"ArrowRight\" && index < length - 1) {\n e.preventDefault();\n focusAt(index + 1);\n }\n }}\n onPaste={(e) => {\n if (disabled) {\n return;\n }\n e.preventDefault();\n handlePaste(index, e.clipboardData.getData(\"text\"));\n }}\n />\n ))}\n </fieldset>\n );\n}\n\nDigitInputRoot.displayName = \"DigitInput.Root\";\n\nexport const DigitInput = { Root: DigitInputRoot };\n", "/*\n * OTP / PIN cells: square fields of the tier height, field system fills and states\n * (see Input.module.css). Digits are one type step larger than the tier text, tabular.\n */\n.root {\n --prime-digit-cell-size: var(--prime-control-m-height);\n --prime-digit-cell-radius: var(--prime-control-m-radius);\n --prime-digit-cell-text: var(--prime-text-body-l-size);\n --prime-digit-cell-line-height: var(--prime-text-body-l-line-height);\n --prime-digit-gap: var(--prime-control-m-gap);\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--prime-digit-gap);\n min-width: 0;\n min-inline-size: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --prime-digit-cell-size: var(--prime-control-xs-height);\n --prime-digit-cell-radius: var(--prime-control-xs-radius);\n --prime-digit-cell-text: var(--prime-control-xs-text-size);\n --prime-digit-cell-line-height: var(--prime-control-xs-line-height);\n --prime-digit-gap: var(--prime-control-xs-gap);\n}\n\n.root[data-size=\"s\"] {\n --prime-digit-cell-size: var(--prime-control-s-height);\n --prime-digit-cell-radius: var(--prime-control-s-radius);\n --prime-digit-cell-text: var(--prime-text-body-m-size);\n --prime-digit-cell-line-height: var(--prime-text-body-m-line-height);\n --prime-digit-gap: var(--prime-control-s-gap);\n}\n\n.root[data-size=\"l\"] {\n --prime-digit-cell-size: var(--prime-control-l-height);\n --prime-digit-cell-radius: var(--prime-control-l-radius);\n --prime-digit-cell-text: var(--prime-text-title-l-size);\n --prime-digit-cell-line-height: var(--prime-text-title-l-line-height);\n --prime-digit-gap: var(--prime-control-l-gap);\n}\n\n.root[data-size=\"xl\"] {\n --prime-digit-cell-size: var(--prime-control-xl-height);\n --prime-digit-cell-radius: var(--prime-control-xl-radius);\n --prime-digit-cell-text: var(--prime-text-heading-s-size);\n --prime-digit-cell-line-height: var(--prime-text-heading-s-line-height);\n --prime-digit-gap: var(--prime-control-xl-gap);\n}\n\n.cell {\n -webkit-appearance: none;\n appearance: none;\n box-sizing: border-box;\n flex: 0 0 auto;\n width: var(--prime-digit-cell-size);\n height: var(--prime-digit-cell-size);\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-digit-cell-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n caret-color: var(--prime-color-accent-default);\n font: inherit;\n font-size: var(--prime-digit-cell-text);\n line-height: var(--prime-digit-cell-line-height);\n font-weight: var(--prime-font-weight-semibold);\n font-variant-numeric: tabular-nums;\n text-align: center;\n outline: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.cell:hover:not(:focus-visible):not(:disabled) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.cell:focus-visible {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.root:not([data-focus-ring=\"false\"]) .cell:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.root[data-invalid=\"true\"] .cell {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n color: var(--prime-color-danger-text);\n}\n\n.root[data-invalid=\"true\"] .cell:focus-visible {\n outline-color: var(--prime-color-danger-border);\n}\n\n.cell:disabled {\n background: var(--prime-color-field-bg-disabled);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n -webkit-text-fill-color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { DividerContentContext } from \"@/internal/DividerContentContext\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Divider.module.css\";\n\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerAlign = \"start\" | \"center\" | \"end\";\n\nexport type DividerRootProps = {\n orientation?: DividerOrientation;\n /** Position of the label (children) on the line. Default `center`. */\n align?: DividerAlign;\n size?: ControlSize;\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst DividerRoot = React.forwardRef<HTMLDivElement, DividerRootProps>(\n (\n {\n orientation = \"horizontal\",\n align = \"center\",\n size = \"m\",\n children,\n className,\n role = \"separator\",\n ...rest\n },\n ref,\n ) => {\n return (\n <div\n {...rest}\n ref={ref}\n className={cx(styles.root, className)}\n role={role}\n {...(orientation === \"vertical\" ? { \"aria-orientation\": \"vertical\" as const } : {})}\n {...toDataAttributes({ orientation, align, size })}\n >\n {children != null ? (\n <ControlSizeProvider value={size}>\n <DividerContentContext.Provider value>\n <span className={styles.content}>{children}</span>\n </DividerContentContext.Provider>\n </ControlSizeProvider>\n ) : null}\n </div>\n );\n },\n);\n\nDividerRoot.displayName = \"Divider.Root\";\n\nexport const Divider = { Root: DividerRoot };\n", "/*\n * Divider \u2014 a hairline in `--prime-color-border-subtle`, optionally with content.\n * `data-size` follows the surrounding content tier: each tier has its own label type, gap and icon\n * from the control tier tokens, so xs \u2192 xl step visibly:\n * xs 12/16 \u00B7 gap 4 \u00B7 icon 14 s 12/16 \u00B7 gap 8 \u00B7 icon 16 m 13/20 \u00B7 gap 8 \u00B7 icon 16\n * l 14/20 \u00B7 gap 8 \u00B7 icon 20 xl 16/24 \u00B7 gap 12 \u00B7 icon 20\n */\n.root {\n --divider-gap: var(--prime-control-m-gap);\n --divider-icon: var(--prime-control-m-icon);\n --divider-text: var(--prime-control-m-label-size);\n --divider-lh: var(--prime-control-m-label-line-height);\n --divider-tracking: normal;\n\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--divider-gap);\n color: var(--prime-color-text-muted);\n font-size: var(--divider-text);\n line-height: var(--divider-lh);\n letter-spacing: var(--divider-tracking);\n}\n\n.root[data-size=\"xs\"] {\n --divider-gap: var(--prime-control-xs-gap);\n --divider-icon: var(--prime-control-xs-icon);\n --divider-text: var(--prime-control-xs-label-size);\n --divider-lh: var(--prime-control-xs-label-line-height);\n --divider-tracking: var(--prime-text-caption-tracking);\n}\n\n.root[data-size=\"s\"] {\n --divider-gap: var(--prime-control-s-gap);\n --divider-icon: var(--prime-control-s-icon);\n --divider-text: var(--prime-control-s-label-size);\n --divider-lh: var(--prime-control-s-label-line-height);\n --divider-tracking: var(--prime-text-caption-tracking);\n}\n\n.root[data-size=\"l\"] {\n --divider-gap: var(--prime-control-l-gap);\n --divider-icon: var(--prime-control-l-icon);\n --divider-text: var(--prime-control-l-label-size);\n --divider-lh: var(--prime-control-l-label-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --divider-gap: var(--prime-control-xl-gap);\n --divider-icon: var(--prime-control-xl-icon);\n --divider-text: var(--prime-control-xl-text-size);\n --divider-lh: var(--prime-control-xl-line-height);\n}\n\n/* Horizontal dividers span the row inside flex columns (menus, cards). */\n.root:not([data-orientation=\"vertical\"]) {\n width: 100%;\n min-width: 0;\n}\n\n.root::before,\n.root::after {\n content: \"\";\n flex: 1 1 0;\n height: var(--prime-border-width);\n background: var(--prime-color-border-subtle);\n}\n\n/* Start/end: the label sits flush with the content edge, the line takes the rest. */\n.root[data-align=\"start\"]::before {\n display: none;\n}\n\n.root[data-align=\"end\"]::after {\n display: none;\n}\n\n/* No content: one line, no gap. */\n.root:empty {\n gap: 0;\n}\n\n.root:empty::before {\n flex: 1 1 0;\n}\n\n.root:empty::after {\n display: none;\n}\n\n.content {\n display: inline-flex;\n align-items: center;\n gap: var(--divider-gap);\n min-width: 0;\n font-weight: var(--prime-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.root[data-orientation=\"vertical\"] {\n flex-direction: column;\n align-self: stretch;\n width: var(--prime-border-width);\n height: auto;\n}\n\n.root[data-orientation=\"vertical\"]::before,\n.root[data-orientation=\"vertical\"]::after {\n width: var(--prime-border-width);\n height: auto;\n}\n\n.root[data-orientation=\"vertical\"]:not(:empty) {\n width: auto;\n}\n\n/* Icon inside content has no size class (DividerContentContext); the divider sizes it. */\n.root[data-size] .content svg {\n flex-shrink: 0;\n box-sizing: border-box;\n width: var(--divider-icon);\n height: var(--divider-icon);\n}\n", "import * as React from \"react\";\n\nimport {\n DialogBody,\n DialogClose,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogIcon,\n DialogShellProvider,\n DialogTitle,\n dialogShellClassName,\n useDialogShellValue,\n} from \"@/components/modal/DialogParts\";\nimport { useInertSiblings } from \"@/components/modal/useInertSiblings\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { useFocusTrap } from \"@/hooks/useFocusTrap\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport { type PresenceState, usePresence } from \"@/hooks/usePresence\";\nimport { useScrollLock } from \"@/hooks/useScrollLock\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport {\n OverlayPortalLayerProvider,\n useOverlayPortalLayer,\n} from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Drawer.module.css\";\n\nexport type {\n DialogBodyProps as DrawerBodyProps,\n DialogCloseProps as DrawerCloseProps,\n DialogDescriptionProps as DrawerDescriptionProps,\n DialogFooterProps as DrawerFooterProps,\n DialogHeaderProps as DrawerHeaderProps,\n DialogIconProps as DrawerIconProps,\n DialogTitleProps as DrawerTitleProps,\n} from \"@/components/modal/DialogParts\";\n\nexport type DrawerSide = \"left\" | \"right\";\n\nexport type DrawerLabels = {\n /** `aria-label` of the header close button. */\n close: string;\n};\n\nconst DRAWER_LABELS: DrawerLabels = {\n close: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C\",\n};\n\ntype DrawerContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n closeOnEscape: boolean;\n closeOnOutsideClick: boolean;\n labels: DrawerLabels;\n};\n\nconst [DrawerProvider, useDrawerContext] = createComponentContext<DrawerContextValue>(\"Drawer\");\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DrawerRootProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Escape closes the drawer. Default `true`. */\n closeOnEscape?: boolean;\n /** A click on the scrim (any pointerdown outside the panel) closes the drawer. Default `true`. */\n closeOnOutsideClick?: boolean;\n labels?: Partial<DrawerLabels>;\n children?: React.ReactNode;\n};\n\nfunction DrawerRoot({\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnEscape = true,\n closeOnOutsideClick = true,\n labels,\n children,\n}: DrawerRootProps) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const closeLabel = labels?.close ?? DRAWER_LABELS.close;\n const value = React.useMemo<DrawerContextValue>(\n () => ({\n open: isOpen,\n setOpen,\n closeOnEscape,\n closeOnOutsideClick,\n labels: { close: closeLabel },\n }),\n [isOpen, setOpen, closeOnEscape, closeOnOutsideClick, closeLabel],\n );\n\n return <DrawerProvider value={value}>{children}</DrawerProvider>;\n}\nDrawerRoot.displayName = \"Drawer.Root\";\n\n// \u2500\u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DrawerTriggerProps = {\n children: React.ReactElement<{ onClick?: React.MouseEventHandler }>;\n};\n\n/** Opens the drawer on the child's click (unless the child prevents default). */\nfunction DrawerTrigger({ children }: DrawerTriggerProps) {\n const { setOpen } = useDrawerContext();\n const child = React.Children.only(children);\n return React.cloneElement(child, {\n onClick: (event: React.MouseEvent) => {\n child.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen(true);\n },\n });\n}\nDrawerTrigger.displayName = \"Drawer.Trigger\";\n\n// \u2500\u2500\u2500 Content \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type DrawerContentProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Edge the panel slides from. Default `right`. */\n side?: DrawerSide;\n /** Panel width: `s` 360 \u00B7 `m` 480 \u00B7 `l` 640 \u00B7 `xl` 800. Full width below 640px of viewport. */\n size?: Exclude<ControlSize, \"xs\">;\n /** Class on the full-screen scrim. */\n overlayClassName?: string;\n};\n\nfunction DrawerContent(props: DrawerContentProps) {\n const { open } = useDrawerContext();\n // Stays mounted with `data-state=\"closed\"` for the slide-out.\n const presence = usePresence(open, { exitDuration: \"base\" });\n if (!presence.mounted) return null;\n return (\n <Portal>\n <DrawerDialog {...props} state={presence.state} onExitEnd={presence.onExitEnd} />\n </Portal>\n );\n}\n\ntype DrawerDialogProps = DrawerContentProps & {\n state: PresenceState;\n onExitEnd: (event: React.SyntheticEvent<Element>) => void;\n};\n\n/** Mounted inside the portal so focus trap and inert siblings see the attached node. */\nfunction DrawerDialog({\n side = \"right\",\n size = \"m\",\n overlayClassName,\n className,\n children,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n state,\n onExitEnd,\n ...rest\n}: DrawerDialogProps) {\n const { open, setOpen, closeOnEscape, closeOnOutsideClick, labels } = useDrawerContext();\n const onClose = React.useCallback(() => setOpen(false), [setOpen]);\n\n const shell = useDialogShellValue({\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n onClose,\n closeLabel: labels.close,\n footerLayout: \"end\",\n });\n\n const parentLayer = useOverlayPortalLayer();\n // A drawer opened from a Modal (or from a drawer above a Modal) stays above it.\n const nestedInModal = parentLayer === \"modal\" || parentLayer === \"drawerInModal\";\n\n const trapRef = useFocusTrap<HTMLDivElement>({ enabled: open });\n useScrollLock(open);\n useInertSiblings(open, trapRef);\n useEscapeKey({ enabled: open && closeOnEscape, onEscape: onClose });\n // Scrim layer: the press must start and end outside the panel (no drag-to-close, no click-through).\n useOutsideClick({\n refs: [trapRef],\n enabled: open,\n trigger: \"click\",\n onOutsideClick: () => {\n if (closeOnOutsideClick) onClose();\n },\n });\n\n return (\n // One portal root for scrim + panel, so `useInertSiblings` never makes the scrim inert.\n <div className={styles.root}>\n <div\n role=\"presentation\"\n className={cx(styles.overlay, overlayMotion.scrim, overlayClassName)}\n data-testid=\"drawer-overlay\"\n data-state={state}\n data-nested-in-modal={nestedInModal ? \"true\" : undefined}\n />\n <div\n ref={trapRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n className={cx(dialogShellClassName, styles.panel, overlayMotion.drawer, className)}\n data-side={side}\n data-size={size}\n data-state={state}\n data-nested-in-modal={nestedInModal ? \"true\" : undefined}\n onAnimationEnd={onExitEnd}\n {...shell.aria}\n {...rest}\n >\n <DialogShellProvider value={shell.value}>\n <OverlayPortalLayerProvider value={nestedInModal ? \"drawerInModal\" : \"drawer\"}>\n {children}\n </OverlayPortalLayerProvider>\n </DialogShellProvider>\n </div>\n </div>\n );\n}\n\nDrawerContent.displayName = \"Drawer.Content\";\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const Drawer = {\n Root: DrawerRoot,\n Trigger: DrawerTrigger,\n Content: DrawerContent,\n Header: DialogHeader,\n Icon: DialogIcon,\n Title: DialogTitle,\n Description: DialogDescription,\n Body: DialogBody,\n Footer: DialogFooter,\n Close: DialogClose,\n};\n", "/*\n * Drawer \u2014 raised edge panel on a scrim. Same zones as Modal (DialogParts.module.css), each\n * with its own side padding; header and footer stay put, only the body scrolls. Width per size tier; full width below 640px. Nested drawers stack in DOM order on the same\n * layer; inside a Modal the shell moves to `--prime-z-drawer-nested-shell`.\n */\n\n.root {\n display: contents;\n}\n\n.overlay {\n position: fixed;\n inset: 0;\n z-index: var(--prime-z-drawer);\n background: var(--prime-color-bg-scrim);\n}\n\n.overlay[data-nested-in-modal=\"true\"] {\n z-index: var(--prime-z-drawer-nested-shell);\n}\n\n.panel {\n --drawer-width: var(--prime-drawer-width-m);\n /* Fields inside a raised surface use the \"on surface\" fill. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n --dialog-padding: var(--prime-drawer-padding);\n\n position: fixed;\n top: 0;\n bottom: 0;\n z-index: var(--prime-z-drawer);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: min(100vw, var(--drawer-width));\n min-height: 0;\n overflow: hidden;\n /* Avatar.Group rings match this surface. */\n --avatar-ring: var(--prime-color-bg-raised);\n background: var(--prime-color-bg-raised);\n color: var(--prime-color-text-primary);\n box-shadow: var(--prime-shadow-modal);\n outline: none;\n font-size: var(--prime-text-body-m-size);\n line-height: var(--prime-text-body-m-line-height);\n}\n\n.panel[data-size=\"s\"] {\n --drawer-width: var(--prime-drawer-width-s);\n}\n\n.panel[data-size=\"l\"] {\n --drawer-width: var(--prime-drawer-width-l);\n}\n\n.panel[data-size=\"xl\"] {\n --drawer-width: var(--prime-drawer-width-xl);\n}\n\n.panel[data-nested-in-modal=\"true\"] {\n z-index: var(--prime-z-drawer-nested-shell);\n}\n\n/* Rounded only on the edge that faces the page. */\n.panel[data-side=\"right\"] {\n right: 0;\n border-start-start-radius: var(--prime-modal-radius);\n border-end-start-radius: var(--prime-modal-radius);\n}\n\n.panel[data-side=\"left\"] {\n left: 0;\n border-start-end-radius: var(--prime-modal-radius);\n border-end-end-radius: var(--prime-modal-radius);\n}\n\n/* \u2500\u2500\u2500 Narrow viewport: full width, square corners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n@media (max-width: 639px) {\n .panel {\n width: 100vw;\n border-radius: 0;\n }\n\n .panel[data-side=\"left\"],\n .panel[data-side=\"right\"] {\n border-radius: 0;\n }\n}\n\n/* Motion (scrim fade, panel slide from its side) lives in internal/overlayMotion.module.css. */\n", "import * as React from \"react\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { useFocusTrap } from \"@/hooks/useFocusTrap\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport type { PositionAlign, PositionSide } from \"@/hooks/usePosition\";\nimport { usePresence } from \"@/hooks/usePresence\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { remToPx } from \"@/internal/layoutPxFromPrimitives\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\nimport { useOverlayPortalLayer } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\nimport { primitiveTokens } from \"../../../tokens/primitives\";\n\nimport styles from \"./Dropdown.module.css\";\nimport { handleMenuNavigationKeyDown } from \"./menuKeyboard\";\nimport { useDropdownPosition } from \"./useDropdownPosition\";\n\nconst DropdownContentSizeContext = React.createContext<ControlSize>(\"m\");\n\nfunction useDropdownContentSize(): ControlSize {\n return React.useContext(DropdownContentSizeContext);\n}\n\n/** \u0418\u043A\u043E\u043D\u043A\u0430 \u043F\u0443\u043D\u043A\u0442\u0430 = `--prime-control-<tier>-icon` (foundation \u00A76): 14 \u00B7 16 \u00B7 16 \u00B7 20 \u00B7 20. */\nconst DROPDOWN_ICON_BY_SIZE = {\n xs: 14,\n s: 16,\n m: 16,\n l: 20,\n xl: 20,\n} as const satisfies Record<ControlSize, keyof typeof primitiveTokens.icon>;\n\nfunction dropdownItemIconPx(menuSize: ControlSize): number {\n return remToPx(primitiveTokens.icon[DROPDOWN_ICON_BY_SIZE[menuSize]]);\n}\n\ntype Ctx = {\n isOpen: boolean;\n onClose: () => void;\n onToggle: () => void;\n triggerId: string;\n menuId: string;\n triggerRef: React.RefObject<HTMLElement | null>;\n closeOnOutsideClick: boolean;\n};\n\nconst [DropdownProvider, useDropdownContext] = createComponentContext<Ctx>(\"Dropdown\");\n\nexport type DropdownRootProps = {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** A pointerdown outside the panel and its trigger closes it. Default `true`. */\n closeOnOutsideClick?: boolean;\n children: React.ReactNode;\n};\n\nfunction DropdownRoot({\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnOutsideClick = true,\n children,\n}: DropdownRootProps) {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const id = React.useId();\n const triggerId = `${id}-trigger`;\n const menuId = `${id}-menu`;\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const onClose = React.useCallback(() => setIsOpen(false), [setIsOpen]);\n const onToggle = React.useCallback(() => setIsOpen((v) => !v), [setIsOpen]);\n\n const value = React.useMemo(\n () => ({ isOpen, onClose, onToggle, triggerId, menuId, triggerRef, closeOnOutsideClick }),\n [isOpen, onClose, onToggle, triggerId, menuId, closeOnOutsideClick],\n );\n\n return <DropdownProvider value={value}>{children}</DropdownProvider>;\n}\nDropdownRoot.displayName = \"DropdownRoot\";\n\nexport type DropdownTriggerProps = {\n /** The element that opens the panel (usually a Button); it receives ref, ARIA and the click handler. */\n children: React.ReactElement;\n};\n\nfunction DropdownTrigger({ children }: DropdownTriggerProps) {\n const { isOpen, onToggle, triggerId, menuId, triggerRef } = useDropdownContext();\n const toggleRef = React.useRef(onToggle);\n toggleRef.current = onToggle;\n\n const setNode = React.useCallback(\n (el: HTMLElement | null) => {\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current = el;\n },\n [triggerRef],\n );\n\n // biome-ignore lint/suspicious/noExplicitAny: cloneElement \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\n const child = children as React.ReactElement<any>;\n const childRef =\n (child.props as { ref?: React.Ref<HTMLElement | null> }).ref ??\n (child as unknown as { ref?: React.Ref<HTMLElement | null> }).ref;\n const mergedRef = React.useMemo(() => mergeRefs(childRef, setNode), [childRef, setNode]);\n const userClick = child.props?.onClick as React.MouseEventHandler<HTMLElement> | undefined;\n\n return React.cloneElement(child, {\n ref: mergedRef,\n id: triggerId,\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-haspopup\": \"menu\",\n \"aria-controls\": menuId,\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n userClick?.(e);\n toggleRef.current();\n },\n });\n}\nDropdownTrigger.displayName = \"DropdownTrigger\";\n\nexport type DropdownContentProps = {\n align?: PositionAlign;\n side?: PositionSide;\n sameMinWidthAsTrigger?: boolean;\n size?: ControlSize;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction DropdownContent({\n align = \"start\",\n side = \"bottom\",\n sameMinWidthAsTrigger = false,\n size = \"m\",\n children,\n className,\n}: DropdownContentProps) {\n const { isOpen, onClose, triggerRef, menuId, triggerId, closeOnOutsideClick } =\n useDropdownContext();\n const overlayPortalLayer = useOverlayPortalLayer();\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const presence = usePresence(isOpen, { exitDuration: \"fast\" });\n\n const layout = useDropdownPosition({\n // Keeps its position while the exit animation plays.\n open: presence.mounted,\n triggerRef,\n contentRef,\n side,\n align,\n sameMinWidthAsTrigger,\n });\n\n const trapRef = useFocusTrap<HTMLDivElement>({ enabled: isOpen, restoreFocus: true });\n const ref = React.useMemo(() => mergeRefs(contentRef, trapRef), [trapRef]);\n\n useEscapeKey({ enabled: isOpen, onEscape: onClose });\n useOutsideClick({\n refs: [triggerRef, contentRef],\n enabled: isOpen,\n onOutsideClick: () => {\n if (closeOnOutsideClick) onClose();\n },\n });\n\n if (!presence.mounted) return null;\n\n return (\n <Portal>\n <DropdownContentSizeContext.Provider value={size}>\n <ControlSizeProvider value={size}>\n <ScrollContainer\n ref={ref}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n data-react-aria-top-layer=\"true\"\n data-overlay-portal-layer={overlayPortalLayer}\n data-side={layout?.resolvedSide ?? side}\n data-state={presence.state}\n data-size={size}\n className={cx(styles.content, overlayMotion.floating, className)}\n style={layout?.style}\n onAnimationEnd={presence.onExitEnd}\n onKeyDown={(e) => handleMenuNavigationKeyDown(e, e.currentTarget)}\n >\n {children}\n </ScrollContainer>\n </ControlSizeProvider>\n </DropdownContentSizeContext.Provider>\n </Portal>\n );\n}\nDropdownContent.displayName = \"DropdownContent\";\n\nexport type DropdownItemProps = {\n onSelect?: () => void;\n disabled?: boolean;\n /** `danger` \u2014 destructive action (delete, revoke). Default `neutral`. */\n tone?: Extract<Tone, \"neutral\" | \"danger\">;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction DropdownItem({\n onSelect,\n disabled,\n tone = \"neutral\",\n children,\n className,\n}: DropdownItemProps) {\n const { onClose } = useDropdownContext();\n\n const activate = () => {\n if (disabled) return;\n onSelect?.();\n onClose();\n };\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n className={cx(styles.item, className)}\n {...toDataAttributes({ tone, disabled: disabled || undefined })}\n onClick={activate}\n onKeyDown={(e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) {\n e.preventDefault();\n activate();\n }\n }}\n >\n {children}\n </button>\n );\n}\nDropdownItem.displayName = \"DropdownItem\";\n\nexport type DropdownItemIconProps = {\n as?: React.ElementType;\n className?: string;\n children?: React.ReactNode;\n} & Record<string, unknown>;\n\nconst DropdownItemIcon = React.forwardRef<HTMLElement, DropdownItemIconProps>(\n ({ as: As = \"span\", className, children, \"aria-hidden\": ariaHidden, ...rest }, ref) => {\n const menuSize = useDropdownContentSize();\n const { size: explicitSize, ...iconRest } = rest as Record<string, unknown> & { size?: number };\n const iconSize = typeof explicitSize === \"number\" ? explicitSize : dropdownItemIconPx(menuSize);\n const Comp = As as React.ElementType;\n return (\n <Comp\n ref={ref}\n className={cx(styles.itemIcon, className as string | undefined)}\n {...iconRest}\n size={iconSize}\n aria-hidden={ariaHidden ?? true}\n >\n {children}\n </Comp>\n );\n },\n);\nDropdownItemIcon.displayName = \"DropdownItemIcon\";\n\nexport type DropdownItemShortcutProps = React.HTMLAttributes<HTMLElement>;\n\n/** \u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 \u0441\u043F\u0440\u0430\u0432\u0430 \u0432 \u043F\u0443\u043D\u043A\u0442\u0435 (\u0441\u0442\u0438\u043B\u044C Kbd, \u043F\u0440\u0438\u0433\u043B\u0443\u0448\u0451\u043D\u043D\u044B\u0439). \u0422\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430 \u2014 \u043D\u0435 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A. */\nfunction DropdownItemShortcut({ className, ...rest }: DropdownItemShortcutProps) {\n return <kbd className={cx(styles.itemShortcut, className)} {...rest} />;\n}\nDropdownItemShortcut.displayName = \"DropdownItemShortcut\";\n\nexport type DropdownGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownGroup({ className, ...rest }: DropdownGroupProps) {\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" \u0432\u043D\u0443\u0442\u0440\u0438 role=\"menu\"\n return <div role=\"group\" className={cx(styles.group, className)} {...rest} />;\n}\nDropdownGroup.displayName = \"DropdownGroup\";\n\nexport type DropdownGroupLabelProps = { children: React.ReactNode; className?: string };\n\nfunction DropdownGroupLabel({ children, className }: DropdownGroupLabelProps) {\n return (\n <div role=\"presentation\" className={cx(styles.groupLabel, className)}>\n {children}\n </div>\n );\n}\nDropdownGroupLabel.displayName = \"DropdownGroupLabel\";\n\nexport type DropdownSeparatorProps = { className?: string };\n\nfunction DropdownSeparator({ className }: DropdownSeparatorProps) {\n return <hr className={cx(styles.separator, className)} />;\n}\nDropdownSeparator.displayName = \"DropdownSeparator\";\n\nexport type DropdownBlockProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownBlock({ className, ...rest }: DropdownBlockProps) {\n return <div className={cx(styles.block, className)} {...rest} />;\n}\nDropdownBlock.displayName = \"DropdownBlock\";\n\nexport type DropdownHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownHeader({ className, ...rest }: DropdownHeaderProps) {\n return <div className={cx(styles.header, className)} {...rest} />;\n}\nDropdownHeader.displayName = \"DropdownHeader\";\n\nexport type DropdownHeaderRowProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownHeaderRow({ className, ...rest }: DropdownHeaderRowProps) {\n return <div className={cx(styles.headerRow, className)} {...rest} />;\n}\nDropdownHeaderRow.displayName = \"DropdownHeaderRow\";\n\nexport type DropdownHeaderLeadingProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownHeaderLeading({ className, ...rest }: DropdownHeaderLeadingProps) {\n return <div className={cx(styles.headerLeading, className)} {...rest} />;\n}\nDropdownHeaderLeading.displayName = \"DropdownHeaderLeading\";\n\nexport type DropdownHeaderMainProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownHeaderMain({ className, ...rest }: DropdownHeaderMainProps) {\n return <div className={cx(styles.headerMain, className)} {...rest} />;\n}\nDropdownHeaderMain.displayName = \"DropdownHeaderMain\";\n\nexport type DropdownHeaderTitleProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction DropdownHeaderTitle({ className, ...rest }: DropdownHeaderTitleProps) {\n return <div className={cx(styles.headerTitle, className)} {...rest} />;\n}\nDropdownHeaderTitle.displayName = \"DropdownHeaderTitle\";\n\nexport type DropdownHeaderDescriptionProps = React.HTMLAttributes<HTMLDivElement> & {\n truncate?: boolean;\n};\n\nfunction DropdownHeaderDescription({\n className,\n truncate,\n ...rest\n}: DropdownHeaderDescriptionProps) {\n return (\n <div\n className={cx(\n styles.headerDescription,\n truncate ? styles.headerDescriptionTruncate : undefined,\n className,\n )}\n {...rest}\n />\n );\n}\nDropdownHeaderDescription.displayName = \"DropdownHeaderDescription\";\n\nexport type DropdownHeaderTrailingProps = React.HTMLAttributes<HTMLDivElement> & {\n alignSelf?: \"start\" | \"center\";\n};\n\nfunction DropdownHeaderTrailing({\n className,\n alignSelf = \"start\",\n ...rest\n}: DropdownHeaderTrailingProps) {\n return (\n <div\n data-trailing-align={alignSelf === \"center\" ? \"center\" : undefined}\n className={cx(styles.headerTrailing, className)}\n {...rest}\n />\n );\n}\nDropdownHeaderTrailing.displayName = \"DropdownHeaderTrailing\";\n\nexport const Dropdown = {\n Root: DropdownRoot,\n Trigger: DropdownTrigger,\n Content: DropdownContent,\n Block: DropdownBlock,\n Header: DropdownHeader,\n HeaderRow: DropdownHeaderRow,\n HeaderLeading: DropdownHeaderLeading,\n HeaderMain: DropdownHeaderMain,\n HeaderTitle: DropdownHeaderTitle,\n HeaderDescription: DropdownHeaderDescription,\n HeaderTrailing: DropdownHeaderTrailing,\n Item: DropdownItem,\n ItemIcon: DropdownItemIcon,\n ItemShortcut: DropdownItemShortcut,\n Group: DropdownGroup,\n GroupLabel: DropdownGroupLabel,\n Separator: DropdownSeparator,\n};\n", "/* \u2500\u2500\u2500 Dropdown menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Shared floating panel (`--prime-panel-*`): raised fill, radius 12, padding 4,\n * items radius 8 = 12 \u2212 4, item height/text/icon from the menu tier.\n */\n\n.content {\n --dd-item-h: var(--prime-control-m-item-height);\n --dd-text: var(--prime-control-m-text-size);\n --dd-lh: var(--prime-control-m-line-height);\n --dd-icon: var(--prime-control-m-icon);\n --dd-gap: var(--prime-control-m-gap);\n --dd-meta: var(--prime-control-m-label-size);\n --dd-meta-lh: var(--prime-control-m-label-line-height);\n /* Fields inside a raised surface stay distinguishable (foundation \u00A74). */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n position: fixed;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n width: max-content;\n min-width: min(\n max(var(--prime-panel-min-width), var(--float-min-w, 0px)),\n var(--float-max-w, 100vw)\n );\n max-width: min(calc(var(--prime-panel-min-width) * 2), var(--float-max-w, 100vw));\n max-height: min(var(--prime-panel-max-height), var(--float-max-h, var(--prime-panel-max-height)));\n margin: 0;\n padding: var(--prime-panel-padding);\n border: 0;\n border-radius: var(--prime-panel-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--dd-text);\n line-height: var(--dd-lh);\n outline: none;\n}\n\n.content[data-size=\"xs\"] {\n --dd-item-h: var(--prime-control-xs-item-height);\n --dd-text: var(--prime-control-xs-text-size);\n --dd-lh: var(--prime-control-xs-line-height);\n --dd-icon: var(--prime-control-xs-icon);\n --dd-gap: var(--prime-control-xs-gap);\n --dd-meta: var(--prime-control-xs-label-size);\n --dd-meta-lh: var(--prime-control-xs-label-line-height);\n}\n\n.content[data-size=\"s\"] {\n --dd-item-h: var(--prime-control-s-item-height);\n --dd-text: var(--prime-control-s-text-size);\n --dd-lh: var(--prime-control-s-line-height);\n --dd-icon: var(--prime-control-s-icon);\n --dd-gap: var(--prime-control-s-gap);\n --dd-meta: var(--prime-control-s-label-size);\n --dd-meta-lh: var(--prime-control-s-label-line-height);\n}\n\n.content[data-size=\"l\"] {\n --dd-item-h: var(--prime-control-l-item-height);\n --dd-text: var(--prime-control-l-text-size);\n --dd-lh: var(--prime-control-l-line-height);\n --dd-icon: var(--prime-control-l-icon);\n --dd-gap: var(--prime-control-l-gap);\n --dd-meta: var(--prime-control-l-label-size);\n --dd-meta-lh: var(--prime-control-l-label-line-height);\n}\n\n.content[data-size=\"xl\"] {\n --dd-item-h: var(--prime-control-xl-item-height);\n --dd-text: var(--prime-control-xl-text-size);\n --dd-lh: var(--prime-control-xl-line-height);\n --dd-icon: var(--prime-control-xl-icon);\n --dd-gap: var(--prime-control-xl-gap);\n --dd-meta: var(--prime-control-xl-label-size);\n --dd-meta-lh: var(--prime-control-xl-label-line-height);\n}\n\n.content[data-overlay-portal-layer=\"page\"] {\n z-index: var(--prime-z-dropdown);\n}\n\n.content[data-overlay-portal-layer=\"drawer\"] {\n z-index: var(--prime-z-dropdown-in-drawer);\n}\n\n.content[data-overlay-portal-layer=\"modal\"] {\n z-index: var(--prime-z-dropdown-in-modal);\n}\n\n.content[data-overlay-portal-layer=\"drawerInModal\"] {\n z-index: var(--prime-z-dropdown-in-drawer-in-modal);\n}\n\n/* \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.item {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--dd-gap);\n width: 100%;\n min-height: var(--dd-item-h);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n border: 0;\n border-radius: var(--prime-panel-item-radius);\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n text-align: start;\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* \u041A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043D\u044B\u0439 \u0444\u043E\u043A\u0443\u0441 = \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 (roving focus \u0432\u043D\u0443\u0442\u0440\u0438 \u043C\u0435\u043D\u044E). */\n.item:hover,\n.item:focus-visible {\n background: var(--prime-color-fill-subtle);\n}\n\n.item:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.item[data-disabled=\"true\"] {\n background: transparent;\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.item[data-tone=\"danger\"] {\n color: var(--prime-color-danger-text);\n}\n\n.item[data-tone=\"danger\"]:hover,\n.item[data-tone=\"danger\"]:focus-visible {\n background: var(--prime-color-danger-soft);\n}\n\n.item[data-tone=\"danger\"][data-disabled=\"true\"] {\n background: transparent;\n color: var(--prime-color-text-disabled);\n}\n\n.itemIcon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--dd-icon);\n height: var(--dd-icon);\n color: var(--prime-color-text-muted);\n}\n\n.item[data-tone=\"danger\"] .itemIcon {\n color: currentColor;\n}\n\n.item[data-disabled=\"true\"] .itemIcon {\n color: var(--prime-color-text-disabled);\n}\n\n/* Shortcut: Kbd look, muted, pushed to the trailing edge. */\n.itemShortcut {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n margin-inline-start: auto;\n padding-inline-start: var(--prime-space-4);\n color: var(--prime-color-text-muted);\n font-family: var(--prime-font-family-sans);\n /* One step below the item text of the same tier, so it scales with the menu. */\n font-size: var(--dd-meta);\n line-height: var(--dd-meta-lh);\n font-variant-numeric: tabular-nums;\n}\n\n.item[data-disabled=\"true\"] .itemShortcut {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Group / separator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.group,\n.block {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-width: 0;\n}\n\n.groupLabel {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n/* Hairline full-bleed: negative inline margin = panel padding. */\n.separator {\n flex-shrink: 0;\n align-self: stretch;\n height: 0;\n margin-block: var(--prime-panel-padding);\n margin-inline: calc(-1 * var(--prime-panel-padding));\n padding: 0;\n border: 0;\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n/* \u2500\u2500\u2500 Header (user info) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.header {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n min-width: 0;\n}\n\n.headerRow {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--prime-space-3);\n width: 100%;\n min-width: 0;\n padding: var(--prime-space-2) var(--prime-panel-item-padding-x);\n}\n\n.headerLeading {\n display: flex;\n flex-shrink: 0;\n}\n\n.headerMain {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n}\n\n.headerTrailing {\n display: flex;\n flex-shrink: 0;\n align-self: flex-start;\n}\n\n.headerTrailing[data-trailing-align=\"center\"] {\n align-self: center;\n}\n\n.headerTitle {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--prime-color-text-primary);\n font-size: var(--prime-text-body-m-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-body-m-line-height);\n}\n\n.headerDescription {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.headerDescriptionTruncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n", "import type * as React from \"react\";\n\nconst MENU_ITEM_SELECTOR = '[role=\"menuitem\"]:not([data-disabled=\"true\"])';\n\nexport function queryEnabledMenuItems(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR));\n}\n\nexport function handleMenuNavigationKeyDown(\n e: React.KeyboardEvent<HTMLElement>,\n container: HTMLElement,\n): void {\n const items = queryEnabledMenuItems(container);\n if (items.length === 0) return;\n\n const currentIndex = items.indexOf(document.activeElement as HTMLElement);\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n const next = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n items[next]?.focus();\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n const prev = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n items[prev]?.focus();\n break;\n }\n case \"Home\": {\n e.preventDefault();\n items[0]?.focus();\n break;\n }\n case \"End\": {\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n }\n default:\n break;\n }\n}\n", "import * as React from \"react\";\n\nimport type { PositionAlign, PositionSide } from \"@/hooks/usePosition\";\nimport {\n computeFloatingPosition,\n FLOAT_MAX_HEIGHT_VAR,\n FLOAT_MAX_WIDTH_VAR,\n FLOAT_MIN_WIDTH_VAR,\n} from \"@/hooks/usePosition\";\nimport { getScrollContainers } from \"@/internal/scrollAncestors\";\n\nimport {\n getDropdownMaxHeightForAnchorSide,\n getDropdownPanelOffsetPx,\n getDropdownViewportPadPx,\n} from \"./dropdownGeometry\";\n\nexport type DropdownLayout = {\n style: React.CSSProperties;\n resolvedSide: PositionSide;\n};\n\ntype Params = {\n open: boolean;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLDivElement | null>;\n side: PositionSide;\n align: PositionAlign;\n sameMinWidthAsTrigger: boolean;\n};\n\nfunction styleVar(layout: DropdownLayout, name: string): unknown {\n return (layout.style as Record<string, unknown>)[name];\n}\n\nfunction layoutEqual(a: DropdownLayout, b: DropdownLayout): boolean {\n return (\n a.resolvedSide === b.resolvedSide &&\n a.style.top === b.style.top &&\n a.style.left === b.style.left &&\n styleVar(a, FLOAT_MAX_HEIGHT_VAR) === styleVar(b, FLOAT_MAX_HEIGHT_VAR) &&\n styleVar(a, FLOAT_MIN_WIDTH_VAR) === styleVar(b, FLOAT_MIN_WIDTH_VAR) &&\n styleVar(a, FLOAT_MAX_WIDTH_VAR) === styleVar(b, FLOAT_MAX_WIDTH_VAR)\n );\n}\n\n/** \u041F\u043E\u0437\u0438\u0446\u0438\u044F + max-height \u043E\u0434\u043D\u0438\u043C \u043F\u0440\u043E\u0445\u043E\u0434\u043E\u043C; resize / scroll-\u043F\u0440\u0435\u0434\u043A\u0438 / ResizeObserver / visualViewport. */\nexport function useDropdownPosition({\n open,\n triggerRef,\n contentRef,\n side,\n align,\n sameMinWidthAsTrigger,\n}: Params): DropdownLayout | null {\n const [layout, setLayout] = React.useState<DropdownLayout | null>(null);\n\n const commit = React.useCallback(() => {\n const trigger = triggerRef.current;\n const panel = contentRef.current;\n if (!trigger || !panel) return;\n\n const anchorRect = trigger.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const panelOffset = getDropdownPanelOffsetPx();\n const viewportPad = getDropdownViewportPadPx();\n const pos = computeFloatingPosition(anchorRect, panel.offsetWidth, panel.offsetHeight, vw, vh, {\n preferredSide: side,\n align,\n offset: panelOffset,\n viewportPad,\n flip: true,\n matchTriggerMinWidth: sameMinWidthAsTrigger,\n });\n\n const next: DropdownLayout = {\n resolvedSide: pos.resolvedSide,\n style: {\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n [FLOAT_MAX_HEIGHT_VAR]: `${getDropdownMaxHeightForAnchorSide(\n anchorRect,\n pos.resolvedSide,\n vh,\n panelOffset,\n viewportPad,\n )}px`,\n [FLOAT_MAX_WIDTH_VAR]: `${pos.maxWidth}px`,\n ...(pos.minWidth !== undefined ? { [FLOAT_MIN_WIDTH_VAR]: `${pos.minWidth}px` } : {}),\n } as React.CSSProperties,\n };\n\n setLayout((prev) => (prev && layoutEqual(prev, next) ? prev : next));\n }, [triggerRef, contentRef, side, align, sameMinWidthAsTrigger]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setLayout(null);\n return;\n }\n\n let rafCoalesce = 0;\n const schedule = () => {\n cancelAnimationFrame(rafCoalesce);\n rafCoalesce = requestAnimationFrame(commit);\n };\n\n commit();\n const rafFollowUp = requestAnimationFrame(commit);\n\n window.addEventListener(\"resize\", schedule);\n const scrollTargets = getScrollContainers(triggerRef.current);\n for (const t of scrollTargets) {\n t.addEventListener(\"scroll\", schedule, { passive: true });\n }\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n\n const panel = contentRef.current;\n const ro = panel ? new ResizeObserver(schedule) : null;\n if (panel && ro) ro.observe(panel);\n\n return () => {\n cancelAnimationFrame(rafFollowUp);\n cancelAnimationFrame(rafCoalesce);\n window.removeEventListener(\"resize\", schedule);\n for (const t of scrollTargets) {\n t.removeEventListener(\"scroll\", schedule);\n }\n vv?.removeEventListener(\"resize\", schedule);\n ro?.disconnect();\n };\n }, [open, commit, triggerRef, contentRef]);\n\n return layout;\n}\n", "import { getPanelOffsetPx, getViewportPadPx, type PositionSide } from \"@/hooks/usePosition\";\n\nexport const DROPDOWN_MIN_MAX_HEIGHT = 120;\n\n/**\n * \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u044B\u0441\u043E\u0442\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u043F\u043E \u044F\u043A\u043E\u0440\u044E \u0438 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u0435 (\u0434\u043E commit layout \u043F\u0430\u043D\u0435\u043B\u0438).\n * `panelOffsetPx` / `viewportPadPx` \u0434\u043E\u043B\u0436\u043D\u044B \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0442\u044C \u0441 \u0432\u044B\u0437\u043E\u0432\u043E\u043C `computeFloatingPosition`.\n */\nexport function getDropdownMaxHeightForAnchorSide(\n anchor: DOMRectReadOnly,\n side: PositionSide,\n viewportHeight: number,\n panelOffsetPx: number,\n viewportPadPx: number,\n): number {\n const raw =\n side === \"bottom\"\n ? viewportHeight - anchor.bottom - panelOffsetPx - viewportPadPx\n : anchor.top - panelOffsetPx - viewportPadPx;\n return Math.floor(Math.max(DROPDOWN_MIN_MAX_HEIGHT, raw));\n}\n\nexport function getDropdownPanelOffsetPx(): number {\n return getPanelOffsetPx();\n}\n\nexport function getDropdownViewportPadPx(): number {\n return getViewportPadPx();\n}\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./EmptyPage.module.css\";\n\nexport type EmptyPageRootProps = {\n /** \u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043E\u0432, \u043A\u0435\u0433\u043B\u044C \u0438 \u043E\u0442\u0441\u0442\u0443\u043F\u044B; \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E `m`. */\n size?: ControlSize;\n /**\n * `fill` \u2014 \u0431\u043B\u043E\u043A \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E \u0432\u044B\u0441\u043E\u0442\u0435 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044F \u0438 \u0446\u0435\u043D\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 (\u043F\u0443\u0441\u0442\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0432\u043D\u0443\u0442\u0440\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B, \u0441\u043A\u0440\u043E\u043B\u043B\u0430, \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438).\n * `default` \u2014 \u043A\u043E\u043C\u043F\u0430\u043A\u0442\u043D\u044B\u0439 \u0431\u043B\u043E\u043A \u043F\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443.\n */\n layout?: \"default\" | \"fill\";\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst EmptyPageRoot = React.forwardRef<HTMLDivElement, EmptyPageRootProps>(function EmptyPageRoot(\n { size = \"m\", layout = \"default\", className, children, ...rest },\n forwardedRef,\n) {\n return (\n <div\n ref={forwardedRef}\n className={cx(styles.root, className)}\n {...rest}\n {...toDataAttributes({\n size,\n layout: layout === \"fill\" ? \"fill\" : undefined,\n })}\n >\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n );\n});\nEmptyPageRoot.displayName = \"EmptyPage.Root\";\n\nexport type EmptyPageIconProps = {\n /** \u041F\u043E\u0434\u043B\u043E\u0436\u043A\u0430 \u0438\u043A\u043E\u043D\u043A\u0438: `neutral` (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E), `accent` \u2014 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044E, `danger` \u2014 \u043E\u0448\u0438\u0431\u043A\u0430. */\n tone?: Extract<Tone, \"neutral\" | \"accent\" | \"danger\">;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction EmptyPageIcon({ tone = \"neutral\", className, children, ...rest }: EmptyPageIconProps) {\n return (\n <div className={cx(styles.iconWrap, className)} data-tone={tone} {...rest}>\n {children}\n </div>\n );\n}\nEmptyPageIcon.displayName = \"EmptyPage.Icon\";\n\nexport type EmptyPageTitleProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLHeadingElement>;\n\nconst EmptyPageTitle = React.forwardRef<HTMLHeadingElement, EmptyPageTitleProps>(\n function EmptyPageTitle({ className, children, ...rest }, forwardedRef) {\n return (\n <h2 ref={forwardedRef} className={cx(styles.title, className)} {...rest}>\n {children}\n </h2>\n );\n },\n);\nEmptyPageTitle.displayName = \"EmptyPage.Title\";\n\nexport type EmptyPageDescriptionProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLParagraphElement>;\n\nconst EmptyPageDescription = React.forwardRef<HTMLParagraphElement, EmptyPageDescriptionProps>(\n function EmptyPageDescription({ className, children, ...rest }, forwardedRef) {\n return (\n <p ref={forwardedRef} className={cx(styles.description, className)} {...rest}>\n {children}\n </p>\n );\n },\n);\nEmptyPageDescription.displayName = \"EmptyPage.Description\";\n\nexport type EmptyPageActionsProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction EmptyPageActions({ className, children, ...rest }: EmptyPageActionsProps) {\n return (\n <div className={cx(styles.actions, className)} {...rest}>\n {children}\n </div>\n );\n}\nEmptyPageActions.displayName = \"EmptyPage.Actions\";\n\nexport const EmptyPage = {\n Root: EmptyPageRoot,\n Icon: EmptyPageIcon,\n Title: EmptyPageTitle,\n Description: EmptyPageDescription,\n Actions: EmptyPageActions,\n};\n", "/*\n * EmptyPage \u2014 Graphite empty / zero state.\n * Neutral icon tile, title, muted description, actions. Works inside tables, cards and pages.\n */\n\n.root {\n --ep-pad-y: var(--prime-space-10);\n --ep-pad-x: var(--prime-space-4);\n --ep-icon-box: var(--prime-control-xl-height);\n --ep-icon: var(--prime-icon-l);\n --ep-icon-radius: var(--prime-radius-l);\n --ep-title-size: var(--prime-text-title-m-size);\n --ep-title-line-height: var(--prime-text-title-m-line-height);\n --ep-title-tracking: var(--prime-text-title-m-tracking);\n --ep-desc-size: var(--prime-text-body-m-size);\n --ep-desc-line-height: var(--prime-text-body-m-line-height);\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n max-width: 100%;\n padding: var(--ep-pad-y) var(--ep-pad-x);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n text-align: center;\n}\n\n.root[data-size=\"xs\"] {\n --ep-pad-y: var(--prime-space-6);\n --ep-pad-x: var(--prime-space-3);\n --ep-icon-box: var(--prime-control-s-height);\n --ep-icon: var(--prime-icon-s);\n --ep-icon-radius: var(--prime-radius-m);\n --ep-title-size: var(--prime-text-title-s-size);\n --ep-title-line-height: var(--prime-text-title-s-line-height);\n --ep-title-tracking: var(--prime-text-title-s-tracking);\n --ep-desc-size: var(--prime-text-caption-size);\n --ep-desc-line-height: var(--prime-text-caption-line-height);\n}\n\n.root[data-size=\"s\"] {\n --ep-pad-y: var(--prime-space-8);\n --ep-icon-box: var(--prime-control-l-height);\n --ep-icon: var(--prime-icon-m);\n --ep-icon-radius: var(--prime-radius-m);\n --ep-title-size: var(--prime-text-title-s-size);\n --ep-title-line-height: var(--prime-text-title-s-line-height);\n --ep-title-tracking: var(--prime-text-title-s-tracking);\n --ep-desc-size: var(--prime-text-body-s-size);\n --ep-desc-line-height: var(--prime-text-body-s-line-height);\n}\n\n.root[data-size=\"l\"] {\n --ep-pad-y: var(--prime-space-12);\n --ep-pad-x: var(--prime-space-6);\n --ep-icon-box: calc(var(--prime-control-xl-height) + var(--prime-space-2));\n --ep-title-size: var(--prime-text-title-l-size);\n --ep-title-line-height: var(--prime-text-title-l-line-height);\n --ep-title-tracking: var(--prime-text-title-l-tracking);\n}\n\n.root[data-size=\"xl\"] {\n --ep-pad-y: var(--prime-space-16);\n --ep-pad-x: var(--prime-space-8);\n --ep-icon-box: var(--prime-space-16);\n --ep-icon: var(--prime-icon-xl);\n --ep-icon-radius: var(--prime-radius-xl);\n --ep-title-size: var(--prime-text-heading-s-size);\n --ep-title-line-height: var(--prime-text-heading-s-line-height);\n --ep-title-tracking: var(--prime-text-heading-s-tracking);\n --ep-desc-size: var(--prime-text-body-l-size);\n --ep-desc-line-height: var(--prime-text-body-l-line-height);\n}\n\n.root[data-layout=\"fill\"] {\n flex: 1 1 auto;\n align-self: stretch;\n min-height: 0;\n}\n\n.iconWrap {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--ep-icon-box);\n height: var(--ep-icon-box);\n border-radius: var(--ep-icon-radius);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n}\n\n.iconWrap[data-tone=\"accent\"] {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.iconWrap[data-tone=\"danger\"] {\n background: var(--prime-color-danger-soft);\n color: var(--prime-color-danger-text);\n}\n\n.iconWrap svg {\n display: block;\n flex-shrink: 0;\n width: var(--ep-icon);\n height: var(--ep-icon);\n}\n\n.title {\n max-width: min(100%, var(--prime-layout-reading-max-width));\n margin: 0;\n font-size: var(--ep-title-size);\n line-height: var(--ep-title-line-height);\n letter-spacing: var(--ep-title-tracking);\n font-weight: var(--prime-font-weight-semibold);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n/* Icon \u2192 title is a group boundary: more air than title \u2192 description. */\n.iconWrap + .title {\n padding-top: var(--prime-space-2);\n}\n\n.description {\n max-width: min(100%, var(--prime-layout-reading-max-width));\n margin: 0;\n font-size: var(--ep-desc-size);\n line-height: var(--ep-desc-line-height);\n color: var(--prime-color-text-secondary);\n overflow-wrap: anywhere;\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-2);\n padding-top: var(--prime-space-3);\n}\n", "import { Code2, Eye, Monitor, Smartphone, Tablet } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/button/Button\";\nimport { CodeBlock } from \"@/components/code-block/CodeBlock\";\nimport { SegmentedControl } from \"@/components/segmented-control/SegmentedControl\";\nimport { Icon } from \"@/icons\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { suspendTransitions } from \"@/theme/applyTheme\";\n\nimport styles from \"./ExampleFrame.module.css\";\n\ntype Pane = \"preview\" | \"code\";\nexport type ExampleFrameViewport = \"desktop\" | \"tablet\" | \"mobile\";\ntype ColorScheme = \"light\" | \"dark\";\n\n/** \u0420\u0430\u0441\u043A\u043B\u0430\u0434\u043A\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u0440\u0435\u0432\u044C\u044E \u2014 \u0447\u0442\u043E\u0431\u044B \u0432 \u0441\u043D\u0438\u043F\u043F\u0435\u0442\u0430\u0445 \u043D\u0435 \u043E\u0431\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u044B \u0432 div.stack/row. */\nexport type ExampleFramePreviewLayout =\n | \"default\"\n | \"stack\"\n | \"stack-center\"\n | \"stack-narrow\"\n | \"dense-stack\"\n | \"row\"\n | \"row-start\"\n | \"row-wrap\";\n\nexport type ExampleFrameLabels = {\n preview: string;\n code: string;\n desktop: string;\n tablet: string;\n mobile: string;\n copy: string;\n copied: string;\n copyError: string;\n themeDark: string;\n themeLight: string;\n codeRegion: string;\n};\n\nconst EXAMPLE_FRAME_LABELS: ExampleFrameLabels = {\n preview: \"\u041F\u0440\u0435\u0432\u044C\u044E\",\n code: \"\u041A\u043E\u0434\",\n desktop: \"\u0414\u0435\u0441\u043A\u0442\u043E\u043F\",\n tablet: \"\u041F\u043B\u0430\u043D\u0448\u0435\u0442\",\n mobile: \"\u0422\u0435\u043B\u0435\u0444\u043E\u043D\",\n copy: \"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u0434\",\n copied: \"\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E\",\n copyError: \"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C\",\n themeDark: \"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0442\u0451\u043C\u043D\u0443\u044E \u0442\u0435\u043C\u0443\",\n themeLight: \"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0432\u0435\u0442\u043B\u0443\u044E \u0442\u0435\u043C\u0443\",\n codeRegion: \"\u041A\u043E\u0434 \u043F\u0440\u0438\u043C\u0435\u0440\u0430\",\n};\n\ntype ExampleFrameContextValue = {\n code: string;\n labels: ExampleFrameLabels;\n pane: Pane;\n setPane: (p: Pane) => void;\n viewport: ExampleFrameViewport;\n setViewport: (v: ExampleFrameViewport) => void;\n colorScheme: ColorScheme;\n setColorScheme: (s: ColorScheme) => void;\n showThemeToggle: boolean;\n onCopy?: () => void;\n};\n\nconst [ExampleFrameProvider, useExampleFrameContext] =\n createComponentContext<ExampleFrameContextValue>(\"ExampleFrame\");\n\nexport type ExampleFrameRootProps = {\n /** Source shown on the code pane (TS/TSX highlighting) and copied by the copy button. */\n code: string;\n children?: React.ReactNode;\n className?: string;\n /** \u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u043C\u0430\u044F \u0446\u0432\u0435\u0442\u043E\u0432\u0430\u044F \u0441\u0445\u0435\u043C\u0430 \u043F\u0440\u0435\u0432\u044C\u044E (light/dark). */\n colorScheme?: ColorScheme;\n defaultColorScheme?: ColorScheme;\n onColorSchemeChange?: (scheme: ColorScheme) => void;\n /** Preview width (desktop / tablet / mobile). Default `desktop`. */\n viewport?: ExampleFrameViewport;\n defaultViewport?: ExampleFrameViewport;\n onViewportChange?: (v: ExampleFrameViewport) => void;\n /** \u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043B\u0438 \u043A\u043D\u043E\u043F\u043A\u0443 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F light/dark \u0432 \u0442\u0443\u043B\u0431\u0430\u0440\u0435. */\n showThemeToggle?: boolean;\n /** \u0412\u044B\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E\u0433\u043E \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F `code` \u0432 \u0431\u0443\u0444\u0435\u0440. */\n onCopy?: () => void;\n /**\n * \u041A\u0430\u043A \u0432\u044B\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0434\u0435\u0442\u0435\u0439 \u0432\u043D\u0443\u0442\u0440\u0438 \u043F\u0440\u0435\u0432\u044C\u044E. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 \u043F\u043E \u0446\u0435\u043D\u0442\u0440\u0443 (\u043E\u0434\u0438\u043D \u0431\u043B\u043E\u043A).\n * \u0414\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438\u0437 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u0432 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 `stack` / `stack-center` / `row`.\n */\n previewLayout?: ExampleFramePreviewLayout;\n labels?: Partial<ExampleFrameLabels>;\n};\n\nfunction ExampleFrameRoot({\n code,\n children,\n className,\n colorScheme: colorSchemeProp,\n defaultColorScheme = \"light\",\n onColorSchemeChange,\n viewport: viewportProp,\n defaultViewport = \"desktop\",\n onViewportChange,\n showThemeToggle = true,\n onCopy,\n previewLayout = \"default\",\n labels: labelsProp,\n}: ExampleFrameRootProps) {\n const labels = React.useMemo(() => ({ ...EXAMPLE_FRAME_LABELS, ...labelsProp }), [labelsProp]);\n const [pane, setPane] = React.useState<Pane>(\"preview\");\n const [uncontrolledViewport, setUncontrolledViewport] =\n React.useState<ExampleFrameViewport>(defaultViewport);\n const [uncontrolledScheme, setUncontrolledScheme] =\n React.useState<ColorScheme>(defaultColorScheme);\n\n const isSchemeControlled = colorSchemeProp !== undefined;\n const colorScheme = isSchemeControlled ? colorSchemeProp : uncontrolledScheme;\n\n // Theme switch inside the frame is instant: no color transition from the old theme.\n const rootRef = React.useRef<HTMLDivElement>(null);\n const previousScheme = React.useRef(colorScheme);\n React.useLayoutEffect(() => {\n if (previousScheme.current === colorScheme) return;\n previousScheme.current = colorScheme;\n if (rootRef.current) suspendTransitions(rootRef.current);\n }, [colorScheme]);\n\n const isViewportControlled = viewportProp !== undefined;\n const viewport = isViewportControlled ? viewportProp : uncontrolledViewport;\n\n const setColorScheme = React.useCallback(\n (next: ColorScheme) => {\n if (!isSchemeControlled) {\n setUncontrolledScheme(next);\n }\n onColorSchemeChange?.(next);\n },\n [isSchemeControlled, onColorSchemeChange],\n );\n\n const setViewport = React.useCallback(\n (next: ExampleFrameViewport) => {\n if (!isViewportControlled) {\n setUncontrolledViewport(next);\n }\n onViewportChange?.(next);\n },\n [isViewportControlled, onViewportChange],\n );\n\n const ctxValue = React.useMemo<ExampleFrameContextValue>(\n () => ({\n code,\n labels,\n pane,\n setPane,\n viewport,\n setViewport,\n colorScheme,\n setColorScheme,\n showThemeToggle,\n onCopy,\n }),\n [\n code,\n labels,\n pane,\n viewport,\n setViewport,\n colorScheme,\n setColorScheme,\n showThemeToggle,\n onCopy,\n ],\n );\n\n let previewChildren: React.ReactNode = null;\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && child.type === ExampleFrameStage) {\n previewChildren = (child.props as { children?: React.ReactNode }).children ?? null;\n }\n });\n if (previewChildren === null) {\n previewChildren = children;\n }\n\n return (\n <ExampleFrameProvider value={ctxValue}>\n <div ref={rootRef} className={cx(styles.root, className)}>\n <ExampleFrameToolbar />\n {pane === \"preview\" ? (\n <div className={styles.previewShell}>\n <div className={styles.previewViewport} data-viewport={viewport}>\n <div\n className={styles.previewInner}\n data-preview-layout={previewLayout}\n data-theme={colorScheme}\n >\n {previewChildren}\n </div>\n </div>\n </div>\n ) : (\n <ExampleFrameCodePane />\n )}\n </div>\n </ExampleFrameProvider>\n );\n}\n\nExampleFrameRoot.displayName = \"ExampleFrame.Root\";\n\nfunction ExampleFrameToolbar() {\n const ctx = useExampleFrameContext();\n const [copyState, setCopyState] = React.useState<\"idle\" | \"copied\" | \"error\">(\"idle\");\n\n const handleCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(ctx.code);\n setCopyState(\"copied\");\n ctx.onCopy?.();\n window.setTimeout(() => setCopyState(\"idle\"), 2000);\n } catch {\n setCopyState(\"error\");\n window.setTimeout(() => setCopyState(\"idle\"), 2000);\n }\n }, [ctx]);\n\n const toggleScheme = () => {\n ctx.setColorScheme(ctx.colorScheme === \"light\" ? \"dark\" : \"light\");\n };\n\n const { labels } = ctx;\n const copyLabel =\n copyState === \"copied\" ? labels.copied : copyState === \"error\" ? labels.copyError : labels.copy;\n\n return (\n <div className={styles.toolbar}>\n <div className={styles.toolbarLine1}>\n <SegmentedControl.Root\n className={styles.toolbarPaneSegment}\n value={ctx.pane}\n onValueChange={(v) => ctx.setPane(v as Pane)}\n size=\"s\"\n >\n <SegmentedControl.Item value=\"preview\">\n <SegmentedControl.Icon>\n <Eye size={14} strokeWidth={2} aria-hidden />\n </SegmentedControl.Icon>\n {labels.preview}\n </SegmentedControl.Item>\n <SegmentedControl.Item value=\"code\">\n <SegmentedControl.Icon>\n <Code2 size={14} strokeWidth={2} aria-hidden />\n </SegmentedControl.Icon>\n {labels.code}\n </SegmentedControl.Item>\n </SegmentedControl.Root>\n <div className={styles.toolbarLine1End}>\n {ctx.showThemeToggle ? (\n <Button.Root\n variant=\"soft\"\n tone=\"neutral\"\n type=\"button\"\n size=\"s\"\n onClick={toggleScheme}\n aria-label={ctx.colorScheme === \"light\" ? labels.themeDark : labels.themeLight}\n >\n <Button.Icon>\n {ctx.colorScheme === \"light\" ? (\n <Icon name=\"theme.dark\" size=\"s\" tone=\"secondary\" />\n ) : (\n <Icon name=\"theme.light\" size=\"s\" tone=\"secondary\" />\n )}\n </Button.Icon>\n </Button.Root>\n ) : null}\n <Button.Root\n variant=\"soft\"\n tone=\"neutral\"\n type=\"button\"\n size=\"s\"\n onClick={handleCopy}\n aria-label={copyLabel}\n >\n <Button.Icon>\n <Icon name=\"action.copy\" size=\"s\" tone=\"secondary\" />\n </Button.Icon>\n </Button.Root>\n </div>\n </div>\n {ctx.pane === \"preview\" ? (\n <SegmentedControl.Root\n className={styles.toolbarViewportSegment}\n value={ctx.viewport}\n onValueChange={(v) => ctx.setViewport(v as ExampleFrameViewport)}\n size=\"s\"\n >\n <SegmentedControl.Item value=\"desktop\">\n <SegmentedControl.Icon>\n <Monitor size={14} strokeWidth={2} aria-hidden />\n </SegmentedControl.Icon>\n <span className={styles.viewportLabel}>{labels.desktop}</span>\n </SegmentedControl.Item>\n <SegmentedControl.Item value=\"tablet\">\n <SegmentedControl.Icon>\n <Tablet size={14} strokeWidth={2} aria-hidden />\n </SegmentedControl.Icon>\n <span className={styles.viewportLabel}>{labels.tablet}</span>\n </SegmentedControl.Item>\n <SegmentedControl.Item value=\"mobile\">\n <SegmentedControl.Icon>\n <Smartphone size={14} strokeWidth={2} aria-hidden />\n </SegmentedControl.Icon>\n <span className={styles.viewportLabel}>{labels.mobile}</span>\n </SegmentedControl.Item>\n </SegmentedControl.Root>\n ) : null}\n </div>\n );\n}\n\nExampleFrameToolbar.displayName = \"ExampleFrame.Toolbar\";\n\nfunction ExampleFrameCodePane() {\n const ctx = useExampleFrameContext();\n const trimmed = ctx.code.trimEnd();\n\n return (\n // Plain CodeBlock is not focusable itself; the scrolling pane takes keyboard focus instead.\n <section\n className={styles.codePane}\n data-theme={ctx.colorScheme}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: scrollable region must be keyboard-reachable\n tabIndex={0}\n aria-label={ctx.labels.codeRegion}\n >\n <CodeBlock.Root variant=\"ghost\" code={trimmed} colorScheme={ctx.colorScheme} />\n </section>\n );\n}\n\nExampleFrameCodePane.displayName = \"ExampleFrame.CodePane\";\n\nexport type ExampleFrameStageProps = {\n children: React.ReactNode;\n};\n\nfunction ExampleFrameStage({ children }: ExampleFrameStageProps) {\n return <>{children}</>;\n}\n\nExampleFrameStage.displayName = \"ExampleFrame.Stage\";\n\nexport const ExampleFrame = {\n Root: ExampleFrameRoot,\n Stage: ExampleFrameStage,\n};\n", "import * as React from \"react\";\n\nimport { Badge } from \"@/components/badge/Badge\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\n\nimport styles from \"./SegmentedControl.module.css\";\n\n// \u2500\u2500\u2500 Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype SegmentedControlContextValue = {\n value: string;\n /** Value of the item that takes Tab focus (selected, or the first enabled one). */\n focusValue: string;\n onSelect: (value: string) => void;\n rootDisabled: boolean;\n};\n\nconst [SegmentedControlProvider, useSegmentedControlContext] =\n createComponentContext<SegmentedControlContextValue>(\"SegmentedControl\");\n\ntype PillRect = { left: number; top: number; width: number; height: number; color?: string };\n\nconst EMPTY_RECT: PillRect = { left: 0, top: 0, width: 0, height: 0 };\n\nconst ENABLED_ITEM = '[role=\"radio\"]:not([data-disabled=\"true\"])';\n\nfunction prefersReducedMotion() {\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n );\n}\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SegmentedControlRootProps = {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n disabled?: boolean;\n size?: ControlSize;\n /** Stretch to the container width; segments share it equally and truncate their labels. */\n fullWidth?: boolean;\n /** Accessible name of the radiogroup (or use `aria-labelledby`). */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction SegmentedControlRoot({\n value,\n defaultValue = \"\",\n onValueChange,\n disabled = false,\n size = \"m\",\n fullWidth = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n children,\n className,\n}: SegmentedControlRootProps) {\n const [selectedValue, setSelectedValue] = useControllableState<string>({\n value,\n defaultValue,\n onChange: onValueChange,\n });\n\n const rootRef = React.useRef<HTMLDivElement>(null);\n const scrollerRef = React.useRef<HTMLDivElement>(null);\n const [overflow, setOverflow] = React.useState({ start: false, end: false });\n const [pill, setPill] = React.useState<PillRect>(EMPTY_RECT);\n // The pill slides only after a user change; layout changes (resize, fonts) snap it.\n const [animate, setAnimate] = React.useState(false);\n const [firstEnabled, setFirstEnabled] = React.useState(\"\");\n\n const onSelect = React.useCallback(\n (nextValue: string) => {\n if (nextValue === selectedValue) return;\n if (!prefersReducedMotion()) setAnimate(true);\n setSelectedValue(nextValue);\n },\n [selectedValue, setSelectedValue],\n );\n\n const updateOverflow = React.useCallback(() => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n const maxScroll = scroller.scrollWidth - scroller.clientWidth;\n const start = scroller.scrollLeft > 1;\n const end = maxScroll - scroller.scrollLeft > 1;\n setOverflow((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n const measure = React.useCallback(() => {\n const root = rootRef.current;\n if (!root) return;\n updateOverflow();\n const first = root.querySelector<HTMLElement>(ENABLED_ITEM);\n setFirstEnabled(first?.dataset.value ?? \"\");\n const active = root.querySelector<HTMLElement>('[role=\"radio\"][aria-checked=\"true\"]');\n const next = active\n ? {\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n color: active.dataset.color,\n }\n : EMPTY_RECT;\n setPill((prev) =>\n prev.left === next.left &&\n prev.top === next.top &&\n prev.width === next.width &&\n prev.height === next.height &&\n prev.color === next.color\n ? prev\n : next,\n );\n }, [updateOverflow]);\n\n React.useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n measure();\n\n const mo = new MutationObserver(measure);\n mo.observe(root, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"aria-checked\", \"data-disabled\", \"data-color\"],\n });\n\n let ro: ResizeObserver | undefined;\n if (typeof ResizeObserver !== \"undefined\") {\n ro = new ResizeObserver(measure);\n ro.observe(root);\n for (const item of root.querySelectorAll('[role=\"radio\"]')) ro.observe(item);\n }\n\n return () => {\n mo.disconnect();\n ro?.disconnect();\n };\n }, [measure]);\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {\n const items = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>(ENABLED_ITEM));\n if (items.length === 0) return;\n const index = items.indexOf(document.activeElement as HTMLButtonElement);\n\n let target: HTMLButtonElement | undefined;\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n target = items[(index + 1) % items.length];\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n target = items[(index - 1 + items.length) % items.length];\n } else if (event.key === \"Home\") {\n target = items[0];\n } else if (event.key === \"End\") {\n target = items[items.length - 1];\n }\n if (!target) return;\n\n event.preventDefault();\n target.focus();\n if (typeof target.scrollIntoView === \"function\") {\n target.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n onSelect(target.dataset.value ?? \"\");\n }\n\n const hasPill = pill.width > 0 && pill.height > 0;\n const contextValue = React.useMemo<SegmentedControlContextValue>(\n () => ({\n value: selectedValue,\n focusValue: selectedValue || firstEnabled,\n onSelect,\n rootDisabled: disabled,\n }),\n [selectedValue, firstEnabled, onSelect, disabled],\n );\n\n return (\n <SegmentedControlProvider value={contextValue}>\n <div\n ref={rootRef}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-disabled={disabled || undefined}\n className={cx(styles.root, className)}\n onKeyDown={handleKeyDown}\n {...toDataAttributes({\n size,\n disabled: disabled || undefined,\n \"full-width\": fullWidth || undefined,\n })}\n >\n <div\n ref={scrollerRef}\n className={styles.scroller}\n onScroll={updateOverflow}\n {...toDataAttributes({\n \"overflow-start\": overflow.start || undefined,\n \"overflow-end\": overflow.end || undefined,\n })}\n >\n {/* First in DOM order so it always paints below the segments. */}\n <div\n className={styles.pill}\n style={{\n transform: `translate(${pill.left}px, ${pill.top}px)`,\n width: pill.width,\n height: pill.height,\n }}\n aria-hidden=\"true\"\n {...toDataAttributes({\n visible: hasPill,\n animate: animate || undefined,\n color: pill.color,\n })}\n onTransitionEnd={(event) => {\n if (event.propertyName === \"transform\") setAnimate(false);\n }}\n />\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n </div>\n </SegmentedControlProvider>\n );\n}\n\nSegmentedControlRoot.displayName = \"SegmentedControl.Root\";\n\n// \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SegmentedControlItemProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"value\" | \"children\" | \"type\" | \"role\"\n> & {\n value: string;\n disabled?: boolean;\n /**\n * Palette hue of the option (e.g. a status): a dot of that hue before the content, and while\n * selected the sliding thumb takes a soft fill of the hue with a ring of it.\n */\n color?: PaletteColor;\n /**\n * Text, `SegmentedControl.Icon`, `SegmentedControl.Label`, `SegmentedControl.Count`,\n * `SegmentedControl.Description`. A description makes the segment two-line. Only an icon makes the\n * segment square: give it `aria-label` (and wrap it in a Tooltip).\n */\n children: React.ReactNode;\n className?: string;\n};\n\nfunction isIconOnly(children: React.ReactNode): boolean {\n const nodes = React.Children.toArray(children);\n return (\n nodes.length > 0 &&\n nodes.every((node) => React.isValidElement(node) && node.type === SegmentedControlIcon)\n );\n}\n\nfunction hasChildOfType(children: React.ReactNode, type: React.ElementType): boolean {\n return React.Children.toArray(children).some(\n (child) => React.isValidElement(child) && child.type === type,\n );\n}\n\n/** Ids of an item's text parts: name = label + count, description = second line. */\nconst ItemPartsContext = React.createContext<{ itemId: string } | null>(null);\n\n/** Text children get their own span so they can truncate in a `fullWidth` group. */\nfunction wrapText(children: React.ReactNode): React.ReactNode {\n return React.Children.map(children, (child) =>\n (typeof child === \"string\" || typeof child === \"number\") && String(child).trim() !== \"\" ? (\n <span className={styles.label}>{child}</span>\n ) : (\n child\n ),\n );\n}\n\nconst SegmentedControlItem = React.forwardRef<HTMLButtonElement, SegmentedControlItemProps>(\n ({ value, disabled = false, color, children, className, onClick, ...rest }, ref) => {\n const ctx = useSegmentedControlContext();\n const isChecked = ctx.value === value;\n const isDisabled = ctx.rootDisabled || disabled;\n const isTabStop = !isDisabled && ctx.focusValue === value;\n const itemId = React.useId();\n const twoLine = hasChildOfType(children, SegmentedControlDescription);\n const hasCount = hasChildOfType(children, SegmentedControlCount);\n const parts = React.useMemo(() => ({ itemId }), [itemId]);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: radiogroup of buttons with roving tabindex (WAI-ARIA APG)\n <button\n {...rest}\n ref={ref}\n role=\"radio\"\n type=\"button\"\n aria-checked={isChecked}\n aria-labelledby={twoLine ? cx(`${itemId}-label`, hasCount && `${itemId}-count`) : undefined}\n aria-describedby={twoLine ? `${itemId}-description` : undefined}\n {...toDataAttributes({\n state: isChecked ? \"checked\" : \"unchecked\",\n disabled: isDisabled || undefined,\n \"icon-only\": isIconOnly(children) || undefined,\n \"two-line\": twoLine || undefined,\n value,\n color,\n })}\n tabIndex={isTabStop ? 0 : -1}\n disabled={isDisabled}\n className={cx(styles.item, className)}\n onClick={(event) => {\n onClick?.(event);\n if (!isDisabled && !event.defaultPrevented) ctx.onSelect(value);\n }}\n >\n {color ? <span className={styles.dot} aria-hidden=\"true\" /> : null}\n <ItemPartsContext.Provider value={parts}>{wrapText(children)}</ItemPartsContext.Provider>\n </button>\n );\n },\n);\n\nSegmentedControlItem.displayName = \"SegmentedControl.Item\";\n\n// \u2500\u2500\u2500 Icon \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SegmentedControlIconProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nfunction SegmentedControlIcon({ children, className, ...rest }: SegmentedControlIconProps) {\n return (\n <span className={cx(styles.icon, className)} aria-hidden=\"true\" {...rest}>\n {children}\n </span>\n );\n}\n\nSegmentedControlIcon.displayName = \"SegmentedControl.Icon\";\n\n// \u2500\u2500\u2500 Label / Description \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SegmentedControlLabelProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Segment title; truncates with an ellipsis. Plain text children are wrapped automatically. */\nfunction SegmentedControlLabel({ children, className, ...rest }: SegmentedControlLabelProps) {\n const parts = React.useContext(ItemPartsContext);\n return (\n <span\n id={parts ? `${parts.itemId}-label` : undefined}\n className={cx(styles.label, className)}\n {...rest}\n >\n {children}\n </span>\n );\n}\n\nSegmentedControlLabel.displayName = \"SegmentedControl.Label\";\n\nexport type SegmentedControlDescriptionProps = {\n /** Muted second line; wrap the key value in `<strong>` to emphasize it. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Second line of a two-line segment; becomes the segment's accessible description. */\nfunction SegmentedControlDescription({\n children,\n className,\n ...rest\n}: SegmentedControlDescriptionProps) {\n const parts = React.useContext(ItemPartsContext);\n return (\n <span\n id={parts ? `${parts.itemId}-description` : undefined}\n className={cx(styles.description, className)}\n {...rest}\n >\n {children}\n </span>\n );\n}\n\nSegmentedControlDescription.displayName = \"SegmentedControl.Description\";\n\n// \u2500\u2500\u2500 Count \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SegmentedControlCountProps = {\n /** Badge hue. Default `gray`. */\n color?: PaletteColor;\n children: React.ReactNode;\n className?: string;\n};\n\n/** Counter after the label: a soft Badge one tier below the control. */\nfunction SegmentedControlCount({\n color = \"gray\",\n children,\n className,\n}: SegmentedControlCountProps) {\n const parts = React.useContext(ItemPartsContext);\n return (\n <Badge.Root\n id={parts ? `${parts.itemId}-count` : undefined}\n color={color}\n className={cx(styles.count, className)}\n >\n {children}\n </Badge.Root>\n );\n}\n\nSegmentedControlCount.displayName = \"SegmentedControl.Count\";\n\n// \u2500\u2500\u2500 Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const SegmentedControl = {\n Root: SegmentedControlRoot,\n Item: SegmentedControlItem,\n Icon: SegmentedControlIcon,\n Label: SegmentedControlLabel,\n Count: SegmentedControlCount,\n Description: SegmentedControlDescription,\n};\n", "/*\n * SegmentedControl \u2014 Graphite. Choose one value / mode.\n * Track: `fill-muted` (a step off the host in both themes) with a faint 1px ring, padding 2px (xs, s)\n * or 4px (m\u2013xl). Outer height = control height of the tier, so a single-line group lines up with\n * Button / Input of the same size. The selected segment is a floating thumb one step lighter than the\n * track with its own faint ring; it slides between segments. Segment radius = track radius \u2212 padding.\n * Two-line segments (with `SegmentedControl.Description`) grow the track to their content.\n * Narrow containers: segments never wrap; the row scrolls horizontally with edge fades.\n * `fullWidth` stretches the group: single-line segments share the width equally (labels truncate),\n * two-line segments grow from their content width.\n */\n\n/* Selected pill: `--prime-color-control-selected` (white in light, a lighter step above the track in dark). */\n\n.root {\n --seg-pad: var(--prime-space-1);\n --seg-item-gap: var(--prime-space-1);\n --seg-control-height: var(--prime-control-m-height);\n --seg-radius: var(--prime-radius-l);\n --seg-text: var(--prime-control-m-text-size);\n --seg-line-height: var(--prime-control-m-line-height);\n --seg-gap: var(--prime-control-m-gap);\n --seg-icon: var(--prime-control-m-icon);\n --seg-item-pad-x: var(--prime-space-3);\n --seg-height: calc(var(--seg-control-height) - 2 * var(--seg-pad));\n --seg-item-radius: calc(var(--seg-radius) - var(--seg-pad));\n --seg-two-line-min: calc(3 * var(--seg-control-height));\n /* Two-line segment: tier padding; description = tier hint size (one step below the label). */\n --seg-two-line-pad-x: var(--prime-control-m-padding-x);\n --seg-two-line-pad-y: var(--prime-space-2);\n --seg-desc-size: var(--prime-control-m-hint-size);\n --seg-desc-line-height: var(--prime-control-m-hint-line-height);\n /* Faint 1px rings: a wash of the text color, so they read on any fill in both themes. */\n --seg-ring: color-mix(in srgb, var(--prime-color-text-primary) 7%, transparent);\n --seg-thumb-ring: color-mix(in srgb, var(--prime-color-text-primary) 10%, transparent);\n\n position: relative;\n box-sizing: border-box;\n display: flex;\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n height: var(--seg-control-height);\n padding: var(--seg-pad);\n border-radius: var(--seg-radius);\n background: var(--prime-color-fill-muted);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--seg-ring);\n font-family: var(--prime-font-family-sans);\n}\n\n/* Per tier: track padding \u00B7 track radius \u00B7 segment padding-x (inner radius = radius \u2212 padding). */\n.root[data-size=\"xs\"] {\n --seg-control-height: var(--prime-control-xs-height);\n --seg-two-line-pad-x: var(--prime-control-xs-padding-x);\n --seg-two-line-pad-y: var(--prime-space-1);\n --seg-desc-size: var(--prime-control-xs-hint-size);\n --seg-desc-line-height: var(--prime-control-xs-hint-line-height);\n --seg-radius: var(--prime-radius-m);\n --seg-text: var(--prime-control-xs-text-size);\n --seg-line-height: var(--prime-control-xs-line-height);\n --seg-gap: var(--prime-control-xs-gap);\n --seg-icon: var(--prime-control-xs-icon);\n --seg-item-pad-x: var(--prime-space-2);\n}\n\n.root[data-size=\"s\"] {\n --seg-control-height: var(--prime-control-s-height);\n --seg-two-line-pad-x: var(--prime-control-s-padding-x);\n --seg-two-line-pad-y: var(--prime-space-1);\n --seg-desc-size: var(--prime-control-s-hint-size);\n --seg-desc-line-height: var(--prime-control-s-hint-line-height);\n --seg-radius: var(--prime-control-l-radius);\n --seg-text: var(--prime-control-s-text-size);\n --seg-line-height: var(--prime-control-s-line-height);\n --seg-gap: var(--prime-control-s-gap);\n --seg-icon: var(--prime-control-s-icon);\n --seg-item-pad-x: var(--prime-space-3);\n}\n\n.root[data-size=\"m\"] {\n --seg-control-height: var(--prime-control-m-height);\n}\n\n.root[data-size=\"l\"] {\n --seg-control-height: var(--prime-control-l-height);\n --seg-two-line-pad-x: var(--prime-control-l-padding-x);\n --seg-desc-size: var(--prime-control-l-hint-size);\n --seg-desc-line-height: var(--prime-control-l-hint-line-height);\n --seg-text: var(--prime-control-l-text-size);\n --seg-line-height: var(--prime-control-l-line-height);\n --seg-gap: var(--prime-control-l-gap);\n --seg-icon: var(--prime-control-l-icon);\n --seg-item-pad-x: var(--prime-space-4);\n}\n\n.root[data-size=\"xl\"] {\n --seg-control-height: var(--prime-control-xl-height);\n --seg-two-line-pad-x: var(--prime-control-xl-padding-x);\n --seg-two-line-pad-y: var(--prime-space-3);\n --seg-desc-size: var(--prime-control-xl-hint-size);\n --seg-desc-line-height: var(--prime-control-xl-hint-line-height);\n --seg-radius: var(--prime-radius-xl);\n --seg-text: var(--prime-control-xl-text-size);\n --seg-line-height: var(--prime-control-xl-line-height);\n --seg-gap: var(--prime-control-xl-gap);\n --seg-icon: var(--prime-control-xl-icon);\n --seg-item-pad-x: var(--prime-space-5);\n}\n\n.root[data-full-width=\"true\"] {\n width: 100%;\n}\n\n.root:has([data-two-line=\"true\"]) {\n height: auto;\n}\n\n/* \u2500\u2500\u2500 Scroller (holds the thumb and the segments) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.scroller {\n position: relative;\n isolation: isolate;\n display: flex;\n flex: 1 1 auto;\n flex-wrap: nowrap;\n gap: var(--seg-item-gap);\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n border-radius: var(--seg-item-radius);\n}\n\n.scroller::-webkit-scrollbar {\n display: none;\n}\n\n/* Edge fades while the row scrolls (mask is alpha-only; any opaque color works). */\n.scroller[data-overflow-start=\"true\"] {\n mask-image: linear-gradient(\n to right,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8)\n );\n}\n\n.scroller[data-overflow-end=\"true\"] {\n mask-image: linear-gradient(\n to left,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8)\n );\n}\n\n.scroller[data-overflow-start=\"true\"][data-overflow-end=\"true\"] {\n mask-image: linear-gradient(\n to right,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8),\n var(--prime-color-text-primary) calc(100% - var(--prime-space-8)),\n transparent\n );\n}\n\n/* \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.item {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n gap: var(--seg-gap);\n min-width: 0;\n height: var(--seg-height);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--seg-item-pad-x);\n border: 0;\n border-radius: var(--seg-item-radius);\n background: transparent;\n color: var(--prime-color-text-secondary);\n font: inherit;\n font-size: var(--seg-text);\n line-height: var(--seg-line-height);\n font-weight: var(--prime-font-weight-medium);\n text-align: start;\n white-space: nowrap;\n user-select: none;\n cursor: pointer;\n /* Same duration/easing as the sliding pill, so text and fill arrive together. */\n transition: color var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.root[data-full-width=\"true\"] .item {\n flex: 1 1 0;\n}\n\n/* Icon-only segment: square (width = segment height). */\n.item[data-icon-only=\"true\"] {\n width: var(--seg-height);\n min-width: var(--seg-height);\n padding-inline: 0;\n}\n\n/* Two-line segment: label + count on the first line, description on the second. */\n.item[data-two-line=\"true\"] {\n /* Grid, not wrapping flex: the max-content width is the wider line, not both lines summed. */\n display: inline-grid;\n grid-template-columns: minmax(0, auto) auto;\n align-content: center;\n justify-content: start;\n justify-items: start;\n row-gap: 0;\n height: auto;\n min-width: var(--seg-two-line-min);\n padding-block: var(--seg-two-line-pad-y);\n padding-inline: var(--seg-two-line-pad-x);\n}\n\n/* Full width with two-line segments: grow from content, so the row spreads evenly. */\n.root[data-full-width=\"true\"] .item[data-two-line=\"true\"] {\n flex: 1 0 auto;\n}\n\n/* Hover is a text step only: the sliding thumb is the only fill, so nothing fights its motion. */\n.item[aria-checked=\"false\"]:not([data-disabled=\"true\"]):hover {\n color: var(--prime-color-text-primary);\n}\n\n.item[aria-checked=\"true\"] {\n color: var(--prime-color-text-primary);\n}\n\n/* The row scrolls (clips), so the ring is drawn inside the segment. */\n.item:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.item[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u2500\u2500\u2500 Parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--seg-icon);\n height: var(--seg-icon);\n line-height: 0;\n}\n\n.icon > :global(svg) {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.count {\n flex-shrink: 0;\n align-self: center;\n font-variant-numeric: tabular-nums;\n}\n\n/* Gray soft equals the track fill; a text wash keeps a neutral count visible on track and thumb. */\n.item .count[data-color=\"gray\"] {\n background: color-mix(in srgb, var(--prime-color-text-primary) 8%, transparent);\n}\n\n.description {\n grid-column: 1 / -1;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n color: var(--prime-color-text-muted);\n font-size: var(--seg-desc-size);\n line-height: var(--seg-desc-line-height);\n font-weight: var(--prime-font-weight-regular);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.description strong {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.item[data-disabled=\"true\"] .description,\n.item[data-disabled=\"true\"] .description strong {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500\u2500 Color (SegmentedControl.Item color) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n[data-color=\"gray\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-gray-soft);\n --seg-hue-text: var(--prime-color-palette-gray-text);\n}\n\n[data-color=\"blue\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-blue-soft);\n --seg-hue-text: var(--prime-color-palette-blue-text);\n}\n\n[data-color=\"green\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-green-soft);\n --seg-hue-text: var(--prime-color-palette-green-text);\n}\n\n[data-color=\"orange\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-orange-soft);\n --seg-hue-text: var(--prime-color-palette-orange-text);\n}\n\n[data-color=\"red\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-red-soft);\n --seg-hue-text: var(--prime-color-palette-red-text);\n}\n\n[data-color=\"yellow\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-yellow-soft);\n --seg-hue-text: var(--prime-color-palette-yellow-text);\n}\n\n[data-color=\"purple\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-purple-soft);\n --seg-hue-text: var(--prime-color-palette-purple-text);\n}\n\n[data-color=\"sky\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-sky-soft);\n --seg-hue-text: var(--prime-color-palette-sky-text);\n}\n\n[data-color=\"pink\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-pink-soft);\n --seg-hue-text: var(--prime-color-palette-pink-text);\n}\n\n[data-color=\"teal\"]:is(.item, .pill) {\n --seg-hue-soft: var(--prime-color-palette-teal-soft);\n --seg-hue-text: var(--prime-color-palette-teal-text);\n}\n\n/* Hue dot before the content (same size as Badge.Dot). */\n.dot {\n flex-shrink: 0;\n width: calc(var(--prime-space-1) + 2 * var(--prime-border-width));\n height: calc(var(--prime-space-1) + 2 * var(--prime-border-width));\n border-radius: var(--prime-radius-full);\n background: var(--seg-hue-text);\n}\n\n.item[data-disabled=\"true\"] .dot {\n background: var(--prime-color-text-disabled);\n}\n\n/* Two-line segment with a dot: the dot gets its own column, the description aligns with the label. */\n.item[data-two-line=\"true\"]:has(> .dot) {\n grid-template-columns: auto minmax(0, auto) auto;\n column-gap: var(--seg-gap);\n}\n\n.item[data-two-line=\"true\"]:has(> .dot) .description {\n grid-column: 2 / -1;\n}\n\n/* \u2500\u2500\u2500 Thumb (geometry from TS) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.pill {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n border-radius: var(--seg-item-radius);\n background: var(--prime-color-control-selected);\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--seg-thumb-ring),\n var(--prime-shadow-raised);\n pointer-events: none;\n opacity: 0;\n}\n\n.pill[data-visible=\"true\"] {\n opacity: 1;\n}\n\n/* Colored option selected: soft fill of its hue + a 1px ring of the hue text at low alpha. */\n.pill[data-color] {\n background: var(--seg-hue-soft);\n box-shadow:\n inset 0 0 0 var(--prime-border-width) color-mix(in srgb, var(--seg-hue-text) 32%, transparent),\n var(--prime-shadow-raised);\n}\n\n/* Position, size and color travel together with one motion token. */\n.pill[data-animate=\"true\"] {\n transition:\n transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n width var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n height var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n background-color var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.root[data-disabled=\"true\"] .pill {\n background: var(--prime-color-fill-muted-hover);\n box-shadow: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .pill[data-animate=\"true\"] {\n transition: none;\n }\n}\n", "export type ThemeScheme = \"light\" | \"dark\";\n\n/** Attribute that turns transitions off while a theme switch is painted (see globals.css). */\nexport const THEME_SWITCHING_ATTRIBUTE = \"data-theme-switching\";\n\n/**\n * Freezes transitions on `element` and its subtree for the frame in which the theme changes.\n * Without it every element with a color transition would interpolate from the old theme's\n * colors and visibly blink. Call it right before the theme attribute changes.\n */\nexport function suspendTransitions(element: HTMLElement): void {\n element.setAttribute(THEME_SWITCHING_ATTRIBUTE, \"\");\n // Two frames: the first paints the new theme without transitions, the second re-enables them.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => element.removeAttribute(THEME_SWITCHING_ATTRIBUTE));\n });\n}\n\n/**\n * Switches the theme instantly: sets `data-theme` on `element` (default `<html>`) with transitions\n * suspended for that frame. Use it instead of setting the attribute by hand.\n */\nexport function applyTheme(\n scheme: ThemeScheme,\n element: HTMLElement = document.documentElement,\n): void {\n if (element.getAttribute(\"data-theme\") === scheme) return;\n suspendTransitions(element);\n element.setAttribute(\"data-theme\", scheme);\n}\n", "/*\n * Documentation frame: a contained block with its own fill, so it reads on any page background\n * (canvas or surface, both themes). The chrome is the sunken wash with a hairline ring; the\n * preview stage and the code pane are inset wells with concentric radii\n * (radius-xl 16 \u2212 padding 4 = radius-l 12).\n */\n.root {\n /* Fields in the toolbar sit on a wash. The stage resets this through its own data-theme. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n --frame-padding: var(--prime-space-1);\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 0;\n max-width: 100%;\n padding: 0 var(--frame-padding) var(--frame-padding);\n overflow: hidden;\n border-radius: var(--prime-radius-xl);\n background: var(--prime-color-bg-sunken);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-subtle);\n color: var(--prime-color-text-primary);\n text-align: start;\n}\n\n/* Long code lines must not widen the playground column. */\n.root > * {\n min-width: 0;\n}\n\n/*\n * Toolbar: one line while it fits, wraps otherwise. The pane switch keeps its content width;\n * the device switch is pushed to the end and takes the rest of the line after a wrap.\n */\n.toolbar {\n container-type: inline-size;\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-start;\n gap: var(--prime-space-3);\n min-width: 0;\n /* Controls sit 12 from the frame edge: frame padding 4 + toolbar padding 8. */\n padding: var(--prime-space-3) var(--prime-space-2) var(--prime-space-2);\n}\n\n.toolbarLine1 {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n flex: 0 1 auto;\n min-width: 0;\n gap: var(--prime-space-2);\n}\n\n.toolbarLine1End {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--prime-space-2);\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.toolbarPaneSegment {\n flex: 0 1 auto;\n min-width: 0;\n width: fit-content;\n max-width: 100%;\n}\n\n.toolbarViewportSegment {\n flex: 0 1 auto;\n min-width: 0;\n margin-left: auto;\n width: fit-content;\n}\n\n/* \u041F\u0435\u0440\u0435\u0431\u0438\u0442\u044C min-width: max-content \u0443 SegmentedControl.root, \u0438\u043D\u0430\u0447\u0435 \u043F\u0435\u0440\u0435\u043D\u043E\u0441 \u043D\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442 */\n.toolbar .toolbarPaneSegment,\n.toolbar .toolbarViewportSegment {\n min-width: 0;\n}\n\n@container (max-width: 639px) {\n .toolbarLine1 {\n flex: 1 1 100%;\n width: 100%;\n }\n\n .toolbarPaneSegment {\n flex: 1 1 auto;\n width: 100%;\n }\n\n .toolbarViewportSegment {\n flex: 1 1 100%;\n width: 100%;\n margin-left: 0;\n }\n\n /* Stretched groups share the width equally, like `fullWidth`. */\n .toolbarPaneSegment :global([role=\"radio\"]),\n .toolbarViewportSegment :global([role=\"radio\"]) {\n flex: 1 1 0;\n min-width: 0;\n }\n}\n\n/* Phone-width frame: device labels would be cut to \u00AB\u0414\u0435\u0441\u043A\u2026\u00BB; keep icons, labels stay for screen readers. */\n@container (max-width: 399px) {\n .viewportLabel {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n}\n\n.previewShell {\n min-width: 0;\n}\n\n.previewViewport {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n margin-inline: auto;\n transition: max-width var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.previewViewport[data-viewport=\"desktop\"] {\n max-width: none;\n}\n\n/* 768px tablet and 384px phone, expressed on the spacing scale. */\n.previewViewport[data-viewport=\"tablet\"] {\n max-width: calc(var(--prime-space-24) * 8);\n}\n\n.previewViewport[data-viewport=\"mobile\"] {\n max-width: calc(var(--prime-space-24) * 4);\n}\n\n/* Stage: canvas of the previewed theme; layout via flex + data-preview-layout. */\n.previewInner {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n min-height: calc(var(--prime-space-20) * 2);\n padding: var(--prime-space-6) var(--prime-space-4);\n border-radius: var(--prime-radius-l);\n background: var(--prime-color-bg-canvas);\n /* The stage paints the canvas, so cards inside are back in the canvas context. */\n --prime-color-card-bg: var(--prime-color-bg-surface);\n --prime-card-shadow: var(--prime-shadow-raised);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-subtle);\n color: var(--prime-color-text-primary);\n /* Clip content wider than the card (wide button groups, tables without their own scroll). */\n overflow: hidden;\n}\n\n/*\n * Without align-self: center children stretch by default \u2014 fit-content controls would then\n * stick to the logical start.\n */\n.previewInner > * {\n align-self: center;\n min-width: 0;\n max-width: 100%;\n margin-inline: auto;\n}\n\n/* fullWidth in the preview: stretch the direct child that contains it (a capped child stays centered). */\n.previewInner > *:global(:has([data-full-width=\"true\"])) {\n align-self: stretch;\n width: 100%;\n margin-inline: auto;\n}\n\n/* Preview layouts: no wrapper divs needed in snippets. */\n.previewInner[data-preview-layout=\"stack\"] {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-4);\n}\n\n.previewInner[data-preview-layout=\"stack\"]:global(:has([data-full-width=\"true\"])),\n.previewInner[data-preview-layout=\"stack\"]:global(:has(.examplePreviewBleed)) {\n align-items: stretch;\n width: 100%;\n margin-inline: 0;\n}\n\n.previewInner[data-preview-layout=\"stack-center\"] {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-3);\n}\n\n.previewInner[data-preview-layout=\"row\"] {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-3);\n padding-block: clamp(var(--prime-space-6), 4vh, var(--prime-space-12));\n}\n\n.previewInner[data-preview-layout=\"row-start\"] {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: flex-start;\n gap: var(--prime-space-3);\n padding-block: clamp(var(--prime-space-4), 3vh, var(--prime-space-8));\n}\n\n.previewInner[data-preview-layout=\"row-wrap\"] {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: center;\n gap: var(--prime-space-2);\n}\n\n/* Row layouts group their children with gap; the auto margins that center a single child would\n push siblings apart. */\n.previewInner:is(\n [data-preview-layout=\"row\"],\n [data-preview-layout=\"row-start\"],\n [data-preview-layout=\"row-wrap\"]\n)\n> * {\n margin-inline: 0;\n}\n\n/* Narrow column (forms): the stage stays full width, its content is capped and centered. */\n.previewInner[data-preview-layout=\"stack-narrow\"] {\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--prime-space-3);\n}\n\n.previewInner[data-preview-layout=\"dense-stack\"] {\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: var(--prime-space-1);\n width: 100%;\n max-height: calc(var(--prime-space-24) * 3 + var(--prime-space-16));\n overflow: auto;\n padding-inline-end: var(--prime-space-1);\n}\n\n.previewInner[data-preview-layout=\"stack\"] > *:global(:has([data-full-width=\"true\"])),\n.previewInner[data-preview-layout=\"stack\"] > *:global(:has(.examplePreviewBleed)),\n.previewInner[data-preview-layout=\"stack\"] > *:global(:has(table)) {\n align-self: stretch;\n width: 100%;\n max-width: none;\n}\n\n.previewInner[data-preview-layout=\"stack\"] > * {\n flex: 0 1 auto;\n min-width: 0;\n max-width: 100%;\n}\n\n.previewInner[data-preview-layout=\"stack-narrow\"] > * {\n flex: 0 1 auto;\n align-self: center;\n width: 100%;\n min-width: 0;\n max-width: min(100%, calc(var(--prime-space-16) * 7));\n margin-inline: auto;\n}\n\n/* Code tab: an explicit well (the previewed theme's canvas), same inset and radius as the stage. */\n.codePane {\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n max-height: min(calc(var(--prime-space-16) * 8), 70vh);\n margin: 0;\n padding: var(--prime-space-4);\n overflow: auto;\n border-radius: var(--prime-radius-l);\n background: var(--prime-color-bg-canvas);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-subtle);\n color: var(--prime-color-text-primary);\n font-size: var(--prime-text-code-size);\n line-height: var(--prime-text-code-line-height);\n}\n\n.codePane:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n", "import * as React from \"react\";\n\nimport { Hint } from \"@/components/hint/Hint\";\nimport { ProgressBar } from \"@/components/progress-bar/ProgressBar\";\nimport { useMergedRefs } from \"@/hooks/useMergedRefs\";\nimport { Icon } from \"@/icons\";\nimport { ControlSizeProvider, useOptionalControlSize } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor, TextTone } from \"@/internal/states\";\n\nimport styles from \"./FileUpload.module.css\";\n\n/** Drop zone treatment: `dashed` shows the drop affordance line, `solid` keeps only the fill. */\nexport type FileUploadVariant = \"dashed\" | \"solid\";\n\nexport type FileUploadLabels = {\n /** Title of the built-in drop zone body. */\n title: string;\n /** Hint under the title (formats, size limit). An empty string hides it. */\n hint: string;\n /** Decorative \u00ABbrowse\u00BB button text of the built-in body. */\n browse: string;\n};\n\nconst FILE_UPLOAD_LABELS: FileUploadLabels = {\n title: \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0435\u0433\u043E \u0441\u044E\u0434\u0430\",\n hint: \"JPEG, PNG, PDF, MP4 \u0434\u043E 50 \u041C\u0411\",\n browse: \"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0444\u0430\u0439\u043B\",\n};\n\n// \u2500\u2500\u2500 Drop zone slots \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type FileUploadIconProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction FileUploadIcon({ className, children, ...rest }: FileUploadIconProps) {\n return (\n <span className={cx(styles.iconWrap, className)} aria-hidden {...rest}>\n {children}\n </span>\n );\n}\nFileUploadIcon.displayName = \"FileUpload.Icon\";\n\nexport type FileUploadTitleProps = React.HTMLAttributes<HTMLParagraphElement> & {\n /** `muted` \u2014 secondary text color, regular weight (instruction line in custom bodies). */\n tone?: Extract<TextTone, \"default\" | \"muted\">;\n};\n\nfunction FileUploadTitle({ className, children, tone = \"default\", ...rest }: FileUploadTitleProps) {\n return (\n <p className={cx(styles.title, tone === \"muted\" && styles.titleMuted, className)} {...rest}>\n {children}\n </p>\n );\n}\nFileUploadTitle.displayName = \"FileUpload.Title\";\n\nexport type FileUploadHintProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nfunction FileUploadHint({ className, children, ...rest }: FileUploadHintProps) {\n const controlSize = useOptionalControlSize() ?? \"m\";\n return (\n <Hint.Root size={controlSize} className={className} {...rest}>\n {children}\n </Hint.Root>\n );\n}\nFileUploadHint.displayName = \"FileUpload.Hint\";\n\nexport type FileUploadBrowseLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction FileUploadBrowseLabel({ className, children, ...rest }: FileUploadBrowseLabelProps) {\n return (\n <span className={cx(styles.browse, className)} {...rest}>\n {children}\n </span>\n );\n}\nFileUploadBrowseLabel.displayName = \"FileUpload.BrowseLabel\";\n\n/** Inline \u00ABbrowse\u00BB link inside a custom title; does not open the picker by itself \u2014 pass `onClick`. */\nexport type FileUploadBrowseLinkProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst FileUploadBrowseLink = React.forwardRef<HTMLButtonElement, FileUploadBrowseLinkProps>(\n ({ className, type = \"button\", onClick, ...rest }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cx(styles.browseLink, className)}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick?.(e);\n }}\n {...rest}\n />\n ),\n);\nFileUploadBrowseLink.displayName = \"FileUpload.BrowseLink\";\n\n/** Custom body column: `pointer-events: none`; nested buttons and links get `pointer-events: auto`. */\nexport type FileUploadDropBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadDropBody({ className, children, ...rest }: FileUploadDropBodyProps) {\n return (\n <div className={cx(styles.dropBody, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadDropBody.displayName = \"FileUpload.DropBody\";\n\n/** Row of source chips (device, cloud\u2026) \u2014 `pointer-events: auto`. */\nexport type FileUploadActionsRowProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadActionsRow({ className, children, ...rest }: FileUploadActionsRowProps) {\n return (\n <div className={cx(styles.actionsRow, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadActionsRow.displayName = \"FileUpload.ActionsRow\";\n\n/** Source button inside `Root`: stops propagation to the label, does not open the file dialog. */\nexport type FileUploadChipProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst FileUploadChip = React.forwardRef<HTMLButtonElement, FileUploadChipProps>(\n ({ className, type = \"button\", onClick, ...rest }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cx(styles.chip, className)}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick?.(e);\n }}\n {...rest}\n />\n ),\n);\nFileUploadChip.displayName = \"FileUpload.Chip\";\n\nexport type FileUploadChipLabelProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction FileUploadChipLabel({ className, children, ...rest }: FileUploadChipLabelProps) {\n return (\n <span className={cx(styles.chipLabel, className)} {...rest}>\n {children}\n </span>\n );\n}\nFileUploadChipLabel.displayName = \"FileUpload.ChipLabel\";\n\n// \u2500\u2500\u2500 File row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type FileUploadFormatBadgeProps = {\n format: string;\n color?: PaletteColor;\n className?: string;\n};\n\nfunction FileUploadFormatBadge({ format, color = \"gray\", className }: FileUploadFormatBadgeProps) {\n const label = format.trim().slice(0, 8).toUpperCase();\n return (\n <span\n className={cx(styles.formatBadge, className)}\n {...toDataAttributes({ color })}\n aria-hidden\n >\n {label}\n </span>\n );\n}\nFileUploadFormatBadge.displayName = \"FileUpload.FormatBadge\";\n\nexport type FileUploadItemProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Failed upload: danger wash and ring, danger meta text. */\n invalid?: boolean;\n /** Typography, spacing, format badge and status icons follow the control tier. */\n size?: ControlSize;\n};\n\nfunction FileUploadItem({ className, invalid = false, size = \"m\", ...rest }: FileUploadItemProps) {\n return (\n <div\n className={cx(styles.item, className)}\n {...toDataAttributes({ size, invalid: invalid || undefined })}\n {...rest}\n />\n );\n}\nFileUploadItem.displayName = \"FileUpload.Item\";\n\nexport type FileUploadItemRowProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemRow({ className, children, ...rest }: FileUploadItemRowProps) {\n return (\n <div className={cx(styles.itemRow, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemRow.displayName = \"FileUpload.ItemRow\";\n\nexport type FileUploadItemMainProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemMain({ className, children, ...rest }: FileUploadItemMainProps) {\n return (\n <div className={cx(styles.itemMain, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemMain.displayName = \"FileUpload.ItemMain\";\n\n/** Vertical stack inside `ItemMain` (error column: text + retry action). */\nexport type FileUploadItemStackProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemStack({ className, children, ...rest }: FileUploadItemStackProps) {\n return (\n <div className={cx(styles.itemStack, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemStack.displayName = \"FileUpload.ItemStack\";\n\n/** File name + meta line group. */\nexport type FileUploadItemTextGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemTextGroup({ className, children, ...rest }: FileUploadItemTextGroupProps) {\n return (\n <div className={cx(styles.itemTextGroup, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemTextGroup.displayName = \"FileUpload.ItemTextGroup\";\n\nexport type FileUploadItemTryAgainProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst FileUploadItemTryAgain = React.forwardRef<HTMLButtonElement, FileUploadItemTryAgainProps>(\n ({ className, type = \"button\", ...rest }, ref) => (\n <button ref={ref} type={type} className={cx(styles.itemTryAgain, className)} {...rest} />\n ),\n);\nFileUploadItemTryAgain.displayName = \"FileUpload.ItemTryAgain\";\n\nexport type FileUploadItemNameProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemName({ className, children, ...rest }: FileUploadItemNameProps) {\n return (\n <div className={cx(styles.itemName, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemName.displayName = \"FileUpload.ItemName\";\n\nexport type FileUploadItemMetaProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemMeta({ className, children, ...rest }: FileUploadItemMetaProps) {\n return (\n <div className={cx(styles.itemMeta, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemMeta.displayName = \"FileUpload.ItemMeta\";\n\nexport type FileUploadItemMetaSepProps = React.HTMLAttributes<HTMLSpanElement>;\n\nfunction FileUploadItemMetaSep({ className, ...rest }: FileUploadItemMetaSepProps) {\n return (\n <span className={cx(styles.itemMetaSep, className)} aria-hidden {...rest}>\n {\"\\u2219\"}\n </span>\n );\n}\nFileUploadItemMetaSep.displayName = \"FileUpload.ItemMetaSep\";\n\nexport type FileUploadItemActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemActions({ className, children, ...rest }: FileUploadItemActionsProps) {\n return (\n <div className={cx(styles.itemActions, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemActions.displayName = \"FileUpload.ItemActions\";\n\nexport type FileUploadItemFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nfunction FileUploadItemFooter({ className, children, ...rest }: FileUploadItemFooterProps) {\n return (\n <div className={cx(styles.itemFooter, className)} {...rest}>\n {children}\n </div>\n );\n}\nFileUploadItemFooter.displayName = \"FileUpload.ItemFooter\";\n\nexport type FileUploadItemProgressProps = {\n value?: number;\n max?: number;\n className?: string;\n children?: React.ReactNode;\n};\n\nfunction FileUploadItemProgress({ value, max, className, children }: FileUploadItemProgressProps) {\n return (\n <div className={cx(styles.itemProgress, className)}>\n {children ?? (value !== undefined ? <ProgressBar.Root value={value} max={max} /> : null)}\n </div>\n );\n}\nFileUploadItemProgress.displayName = \"FileUpload.ItemProgress\";\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type FileUploadRootProps = Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"children\"> & {\n size?: ControlSize;\n variant?: FileUploadVariant;\n /** Access to the hidden file input (open the picker programmatically). */\n inputRef?: React.Ref<HTMLInputElement>;\n accept?: string;\n multiple?: boolean;\n /** Blocks picking and drag-and-drop. */\n disabled?: boolean;\n /** Invalid state (e.g. a rejected file): danger line and `aria-invalid` on the input. */\n invalid?: boolean;\n /** Name of the hidden input inside a form. */\n name?: string;\n onFilesChange?: (files: File[]) => void;\n /** Texts of the built-in body (used when there are no `children`). */\n labels?: Partial<FileUploadLabels>;\n /** Custom body; replaces the built-in icon, title, hint and browse button. */\n children?: React.ReactNode;\n};\n\nconst FileUploadRoot = React.forwardRef<HTMLLabelElement, FileUploadRootProps>(\n (\n {\n size = \"m\",\n variant = \"dashed\",\n inputRef: inputRefProp,\n accept,\n multiple,\n disabled = false,\n invalid = false,\n name,\n onFilesChange,\n labels: labelsProp,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const labels = { ...FILE_UPLOAD_LABELS, ...labelsProp };\n const [isDragOver, setIsDragOver] = React.useState(false);\n const mergeInputRef = useMergedRefs(inputRefProp);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n onFilesChange?.(list ? Array.from(list) : []);\n e.target.value = \"\";\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) setIsDragOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLLabelElement>) => {\n const related = e.relatedTarget as Node | null;\n if (!related || !e.currentTarget.contains(related)) {\n setIsDragOver(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLLabelElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (!disabled) {\n onFilesChange?.(Array.from(e.dataTransfer.files));\n }\n };\n\n const defaultBody = (\n <div className={styles.inner}>\n <FileUploadIcon>\n <Icon name=\"action.upload\" size={size} tone=\"secondary\" />\n </FileUploadIcon>\n <div className={styles.copy}>\n <FileUploadTitle>{labels.title}</FileUploadTitle>\n {labels.hint ? <FileUploadHint>{labels.hint}</FileUploadHint> : null}\n </div>\n <FileUploadBrowseLabel>{labels.browse}</FileUploadBrowseLabel>\n </div>\n );\n\n return (\n <label\n ref={ref}\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({\n size,\n variant,\n state: isDragOver ? \"active\" : undefined,\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n })}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <input\n ref={mergeInputRef}\n type=\"file\"\n className={styles.input}\n name={name}\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n />\n <ControlSizeProvider value={size}>{children ?? defaultBody}</ControlSizeProvider>\n </label>\n );\n },\n);\n\nFileUploadRoot.displayName = \"FileUpload.Root\";\n\nexport const FileUpload = {\n Root: FileUploadRoot,\n Icon: FileUploadIcon,\n Title: FileUploadTitle,\n Hint: FileUploadHint,\n BrowseLabel: FileUploadBrowseLabel,\n BrowseLink: FileUploadBrowseLink,\n DropBody: FileUploadDropBody,\n ActionsRow: FileUploadActionsRow,\n Chip: FileUploadChip,\n ChipLabel: FileUploadChipLabel,\n FormatBadge: FileUploadFormatBadge,\n Item: FileUploadItem,\n ItemRow: FileUploadItemRow,\n ItemMain: FileUploadItemMain,\n ItemStack: FileUploadItemStack,\n ItemTextGroup: FileUploadItemTextGroup,\n ItemTryAgain: FileUploadItemTryAgain,\n ItemName: FileUploadItemName,\n ItemMeta: FileUploadItemMeta,\n ItemMetaSep: FileUploadItemMetaSep,\n ItemActions: FileUploadItemActions,\n ItemFooter: FileUploadItemFooter,\n ItemProgress: FileUploadItemProgress,\n};\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./ProgressBar.module.css\";\n\nexport type ProgressBarRootProps = {\n value: number;\n max?: number;\n label?: string;\n size?: ControlSize;\n /** \u0426\u0432\u0435\u0442 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E `accent`. */\n tone?: Exclude<Tone, \"neutral\" | \"info\">;\n /** \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043F\u043E\u0434\u043F\u0438\u0441\u0438. */\n showValue?: boolean;\n className?: string;\n};\n\nfunction clampProgress(value: number, max: number): number {\n return Math.min(max, Math.max(value, 0));\n}\n\nconst ProgressBarRoot = React.forwardRef<HTMLProgressElement, ProgressBarRootProps>(\n ({ value, max = 100, label, size = \"m\", tone = \"accent\", showValue = false, className }, ref) => {\n const safeMax = max > 0 ? max : 100;\n const safeValue = clampProgress(value, safeMax);\n const labelId = React.useId();\n const percent = Math.round((safeValue / safeMax) * 100);\n\n return (\n <div className={cx(styles.root, className)} {...toDataAttributes({ size, tone })}>\n {label || showValue ? (\n <div className={styles.header}>\n {label ? (\n <span className={styles.label} id={labelId}>\n {label}\n </span>\n ) : null}\n {showValue ? (\n <span className={styles.value} aria-hidden=\"true\">\n {percent}%\n </span>\n ) : null}\n </div>\n ) : null}\n <progress\n ref={ref}\n value={safeValue}\n max={safeMax}\n aria-labelledby={label ? labelId : undefined}\n className={styles.track}\n />\n </div>\n );\n },\n);\n\nProgressBarRoot.displayName = \"ProgressBarRoot\";\n\nexport const ProgressBar = { Root: ProgressBarRoot };\n", "/* ProgressBar \u2014 Graphite: `fill-strong` track, accent / tone value, pill ends. */\n\n.root {\n --pb-track-h: var(--prime-space-1);\n --pb-label-size: var(--prime-control-m-label-size);\n --pb-label-line-height: var(--prime-control-m-label-line-height);\n --pb-fill: var(--prime-color-accent-default);\n\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --pb-label-size: var(--prime-control-xs-label-size);\n --pb-label-line-height: var(--prime-control-xs-label-line-height);\n gap: var(--prime-space-1);\n}\n\n.root[data-size=\"s\"] {\n --pb-label-size: var(--prime-control-s-label-size);\n --pb-label-line-height: var(--prime-control-s-label-line-height);\n gap: var(--prime-space-1);\n}\n\n.root[data-size=\"l\"] {\n --pb-track-h: var(--prime-space-2);\n --pb-label-size: var(--prime-control-l-label-size);\n --pb-label-line-height: var(--prime-control-l-label-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --pb-track-h: var(--prime-space-2);\n --pb-label-size: var(--prime-control-xl-label-size);\n --pb-label-line-height: var(--prime-control-xl-label-line-height);\n}\n\n.root[data-tone=\"success\"] {\n --pb-fill: var(--prime-color-success-default);\n}\n\n.root[data-tone=\"warning\"] {\n --pb-fill: var(--prime-color-warning-default);\n}\n\n.root[data-tone=\"danger\"] {\n --pb-fill: var(--prime-color-danger-default);\n}\n\n.header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--prime-space-3);\n min-width: 0;\n font-size: var(--pb-label-size);\n line-height: var(--pb-label-line-height);\n}\n\n.label {\n min-width: 0;\n overflow: hidden;\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.value {\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--prime-color-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.track {\n -webkit-appearance: none;\n appearance: none;\n display: block;\n width: 100%;\n height: var(--pb-track-h);\n margin: 0;\n overflow: hidden;\n border: 0;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n color: var(--pb-fill);\n}\n\n.track::-webkit-progress-bar {\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n}\n\n.track::-webkit-progress-value {\n border-radius: var(--prime-radius-full);\n background: var(--pb-fill);\n transition: width var(--prime-motion-duration-slow) var(--prime-motion-easing-standard);\n}\n\n.track::-moz-progress-bar {\n border-radius: var(--prime-radius-full);\n background: var(--pb-fill);\n}\n", "/*\n * Drop zone: the one place where a visible dashed line is part of the design (affordance for\n * \"drop here\"). Fill follows the field context (white on canvas, gray inside surfaces).\n * `variant=\"solid\"` drops the line and keeps only the fill. Drag-over is `data-state=\"active\"`.\n * File rows: transparent wash (works on any surface), tier typography, palette format badge.\n */\n.root {\n --fu-pad: var(--prime-space-6);\n --fu-stack: var(--prime-space-4);\n --fu-copy-gap: var(--prime-space-1);\n --fu-title: var(--prime-control-m-text-size);\n --fu-title-line-height: var(--prime-control-m-line-height);\n --fu-btn-h: var(--prime-control-m-height);\n --fu-btn-px: var(--prime-control-m-padding-x);\n --fu-btn-radius: var(--prime-control-m-radius);\n --fu-btn-text: var(--prime-control-m-text-size);\n --fu-btn-line-height: var(--prime-control-m-line-height);\n --fu-icon-box: var(--prime-control-m-height);\n --fu-radius: var(--prime-radius-l);\n position: relative;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n padding: var(--fu-pad);\n border: var(--prime-border-width) dashed var(--prime-color-border-default);\n border-radius: var(--fu-radius);\n background: var(--prime-color-field-bg);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n text-align: center;\n cursor: pointer;\n transition:\n border-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.root[data-size=\"xs\"] {\n --fu-pad: var(--prime-space-4);\n --fu-stack: var(--prime-space-2);\n --fu-title: var(--prime-control-xs-text-size);\n --fu-title-line-height: var(--prime-control-xs-line-height);\n --fu-btn-h: var(--prime-control-xs-height);\n --fu-btn-px: var(--prime-control-xs-padding-x);\n --fu-btn-radius: var(--prime-control-xs-radius);\n --fu-btn-text: var(--prime-control-xs-text-size);\n --fu-btn-line-height: var(--prime-control-xs-line-height);\n --fu-icon-box: var(--prime-control-xs-height);\n --fu-radius: var(--prime-radius-m);\n}\n\n.root[data-size=\"s\"] {\n --fu-pad: var(--prime-space-5);\n --fu-stack: var(--prime-space-3);\n --fu-title: var(--prime-control-s-text-size);\n --fu-title-line-height: var(--prime-control-s-line-height);\n --fu-btn-h: var(--prime-control-s-height);\n --fu-btn-px: var(--prime-control-s-padding-x);\n --fu-btn-radius: var(--prime-control-s-radius);\n --fu-btn-text: var(--prime-control-s-text-size);\n --fu-btn-line-height: var(--prime-control-s-line-height);\n --fu-icon-box: var(--prime-control-s-height);\n --fu-radius: var(--prime-radius-m);\n}\n\n.root[data-size=\"l\"] {\n --fu-pad: var(--prime-space-8);\n --fu-stack: var(--prime-space-5);\n --fu-title: var(--prime-control-l-text-size);\n --fu-title-line-height: var(--prime-control-l-line-height);\n --fu-btn-h: var(--prime-control-l-height);\n --fu-btn-px: var(--prime-control-l-padding-x);\n --fu-btn-radius: var(--prime-control-l-radius);\n --fu-btn-text: var(--prime-control-l-text-size);\n --fu-btn-line-height: var(--prime-control-l-line-height);\n --fu-icon-box: var(--prime-control-l-height);\n}\n\n.root[data-size=\"xl\"] {\n --fu-pad: var(--prime-space-10);\n --fu-stack: var(--prime-space-6);\n --fu-copy-gap: var(--prime-space-2);\n --fu-title: var(--prime-control-xl-text-size);\n --fu-title-line-height: var(--prime-control-xl-line-height);\n --fu-btn-h: var(--prime-control-xl-height);\n --fu-btn-px: var(--prime-control-xl-padding-x);\n --fu-btn-radius: var(--prime-control-xl-radius);\n --fu-btn-text: var(--prime-control-xl-text-size);\n --fu-btn-line-height: var(--prime-control-xl-line-height);\n --fu-icon-box: var(--prime-control-xl-height);\n --fu-radius: var(--prime-radius-xl);\n}\n\n.root:hover:not([data-disabled=\"true\"]) {\n border-color: var(--prime-color-text-placeholder);\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.root[data-state=\"active\"]:not([data-disabled=\"true\"]) {\n border-color: var(--prime-color-accent-default);\n background: var(--prime-color-accent-soft);\n}\n\n.root:has(.input:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.root[data-invalid=\"true\"]:has(.input:focus-visible) {\n outline-color: var(--prime-color-danger-border);\n}\n\n.root[data-disabled=\"true\"] {\n border-color: var(--prime-color-border-subtle);\n background: var(--prime-color-field-bg-disabled);\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.root[data-invalid=\"true\"]:not([data-state=\"active\"]) {\n border-color: var(--prime-color-danger-border);\n}\n\n.root[data-variant=\"solid\"] {\n border-color: transparent;\n}\n\n/* Hover must not bring the dashed line back on `solid` (beats `.root:hover:not(...)`). */\n.root[data-variant=\"solid\"]:hover:not([data-disabled=\"true\"]) {\n border-color: transparent;\n}\n\n.root[data-variant=\"solid\"][data-invalid=\"true\"]:not([data-state=\"active\"]) {\n border-color: var(--prime-color-danger-border);\n}\n\n.root[data-variant=\"solid\"][data-state=\"active\"]:not([data-disabled=\"true\"]) {\n border-color: var(--prime-color-accent-default);\n}\n\n/* Visually hidden but focusable (keyboard opens the picker via the label). */\n.input {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: 0;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n opacity: 0;\n pointer-events: none;\n}\n\n.inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--fu-stack);\n max-width: 100%;\n min-width: 0;\n}\n\n.iconWrap {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--fu-icon-box);\n height: var(--fu-icon-box);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-muted);\n}\n\n.root[data-state=\"active\"] .iconWrap {\n background: var(--prime-color-bg-surface);\n color: var(--prime-color-accent-text);\n}\n\n.root[data-invalid=\"true\"]:not([data-state=\"active\"]) .iconWrap {\n color: var(--prime-color-danger-text);\n}\n\n.root[data-disabled=\"true\"] .iconWrap {\n color: var(--prime-color-text-disabled);\n}\n\n.copy {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--fu-copy-gap);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--fu-title);\n line-height: var(--fu-title-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n.titleMuted {\n font-weight: var(--prime-font-weight-regular);\n color: var(--prime-color-text-secondary);\n}\n\n.root[data-disabled=\"true\"] :is(.title, .titleMuted) {\n color: var(--prime-color-text-disabled);\n}\n\n/* Decorative \"Browse\" button: neutral filled control of the same tier (the whole zone is the target). */\n.browse {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--fu-btn-h);\n padding-inline: var(--fu-btn-px);\n border-radius: var(--fu-btn-radius);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-primary);\n font-size: var(--fu-btn-text);\n line-height: var(--fu-btn-line-height);\n font-weight: var(--prime-font-weight-medium);\n white-space: nowrap;\n pointer-events: none;\n user-select: none;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.root:hover:not([data-disabled=\"true\"]) .browse {\n background: var(--prime-color-fill-muted-hover);\n}\n\n.root[data-disabled=\"true\"] .browse {\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-disabled);\n}\n\n.browseLink {\n display: inline;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-xs);\n background: none;\n font: inherit;\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-accent-text);\n text-decoration: underline;\n text-underline-offset: var(--prime-focus-offset);\n cursor: pointer;\n pointer-events: auto;\n}\n\n.browseLink:hover {\n color: var(--prime-color-accent-hover);\n}\n\n.browseLink:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* \u2500\u2500\u2500 Modal body: no pointer events, interactive children opt back in \u2500\u2500\u2500 */\n.dropBody {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--fu-stack, var(--prime-space-4));\n width: 100%;\n min-width: 0;\n text-align: center;\n pointer-events: none;\n}\n\n.actionsRow {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--prime-space-2);\n pointer-events: auto;\n}\n\n.chip {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: var(--prime-space-2);\n min-height: var(--fu-btn-h, var(--prime-control-m-height));\n margin: 0;\n padding-block: 0;\n padding-inline: var(--prime-space-1) var(--prime-space-3);\n border: 0;\n border-radius: var(--prime-radius-full);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.chip:hover {\n background: var(--prime-color-fill-subtle);\n}\n\n.chip:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.chip:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.chipLabel {\n font-size: var(--fu-btn-text, var(--prime-control-m-text-size));\n line-height: var(--fu-btn-line-height, var(--prime-control-m-line-height));\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-secondary);\n}\n\n/* \u2500\u2500\u2500 File row \u2500\u2500\u2500 */\n.item {\n --fu-item-pad: var(--prime-space-3);\n --fu-item-gap: var(--prime-space-3);\n --fu-item-name: var(--prime-control-m-text-size);\n --fu-item-name-line-height: var(--prime-control-m-line-height);\n --fu-item-meta: var(--prime-control-m-hint-size);\n --fu-item-meta-line-height: var(--prime-control-m-hint-line-height);\n --fu-item-badge: var(--prime-control-m-height);\n --fu-item-badge-radius: var(--prime-radius-m);\n --fu-item-badge-text: var(--prime-badge-s-text-size);\n --fu-item-icon: var(--prime-control-m-icon);\n --fu-item-radius: var(--prime-radius-l);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--fu-item-gap);\n width: 100%;\n min-width: 0;\n padding: var(--fu-item-pad);\n border-radius: var(--fu-item-radius);\n background: var(--prime-color-fill-subtle);\n font-family: var(--prime-font-family-sans);\n}\n\n.item[data-size=\"xs\"] {\n --fu-item-pad: var(--prime-space-2);\n --fu-item-gap: var(--prime-space-2);\n --fu-item-name: var(--prime-control-xs-text-size);\n --fu-item-name-line-height: var(--prime-control-xs-line-height);\n --fu-item-meta: var(--prime-control-xs-hint-size);\n --fu-item-meta-line-height: var(--prime-control-xs-hint-line-height);\n --fu-item-badge: var(--prime-control-xs-height);\n --fu-item-badge-radius: var(--prime-radius-s);\n --fu-item-badge-text: var(--prime-badge-xs-text-size);\n --fu-item-icon: var(--prime-control-xs-icon);\n --fu-item-radius: var(--prime-radius-m);\n}\n\n.item[data-size=\"s\"] {\n --fu-item-pad: var(--prime-space-2);\n --fu-item-gap: var(--prime-space-2);\n --fu-item-name: var(--prime-control-s-text-size);\n --fu-item-name-line-height: var(--prime-control-s-line-height);\n --fu-item-meta: var(--prime-control-s-hint-size);\n --fu-item-meta-line-height: var(--prime-control-s-hint-line-height);\n --fu-item-badge: var(--prime-control-s-height);\n --fu-item-badge-radius: var(--prime-radius-s);\n --fu-item-icon: var(--prime-control-s-icon);\n --fu-item-radius: var(--prime-radius-m);\n}\n\n.item[data-size=\"l\"] {\n --fu-item-pad: var(--prime-space-4);\n --fu-item-name: var(--prime-control-l-text-size);\n --fu-item-name-line-height: var(--prime-control-l-line-height);\n --fu-item-meta: var(--prime-control-l-hint-size);\n --fu-item-meta-line-height: var(--prime-control-l-hint-line-height);\n --fu-item-badge: var(--prime-control-l-height);\n --fu-item-badge-text: var(--prime-badge-m-text-size);\n --fu-item-icon: var(--prime-control-l-icon);\n}\n\n.item[data-size=\"xl\"] {\n --fu-item-pad: var(--prime-space-4);\n --fu-item-gap: var(--prime-space-4);\n --fu-item-name: var(--prime-control-xl-text-size);\n --fu-item-name-line-height: var(--prime-control-xl-line-height);\n --fu-item-meta: var(--prime-control-xl-hint-size);\n --fu-item-meta-line-height: var(--prime-control-xl-hint-line-height);\n --fu-item-badge: var(--prime-control-xl-height);\n --fu-item-badge-radius: var(--prime-radius-l);\n --fu-item-badge-text: var(--prime-badge-l-text-size);\n --fu-item-icon: var(--prime-control-xl-icon);\n --fu-item-radius: var(--prime-radius-xl);\n}\n\n.item[data-invalid=\"true\"] {\n background: var(--prime-color-danger-soft);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.itemRow {\n display: flex;\n align-items: center;\n gap: var(--fu-item-gap);\n min-width: 0;\n}\n\n.itemMain {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n}\n\n.itemStack {\n flex: 1 1 auto;\n min-width: 0;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--prime-space-2);\n}\n\n.itemTextGroup {\n display: flex;\n flex-direction: column;\n gap: 0;\n width: 100%;\n min-width: 0;\n}\n\n.itemName {\n min-width: 0;\n overflow: hidden;\n font-size: var(--fu-item-name);\n line-height: var(--fu-item-name-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.itemMeta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--prime-space-1);\n min-width: 0;\n font-size: var(--fu-item-meta);\n line-height: var(--fu-item-meta-line-height);\n font-variant-numeric: tabular-nums;\n color: var(--prime-color-text-muted);\n}\n\n.itemMeta strong {\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n}\n\n.item[data-invalid=\"true\"] .itemMeta {\n color: var(--prime-color-danger-text);\n}\n\n.itemMetaSep {\n color: var(--prime-color-text-placeholder);\n user-select: none;\n}\n\n.itemTryAgain {\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-xs);\n background: none;\n font: inherit;\n font-size: var(--fu-item-meta);\n line-height: var(--fu-item-meta-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-danger-text);\n text-decoration: underline;\n text-underline-offset: var(--prime-focus-offset);\n cursor: pointer;\n}\n\n.itemTryAgain:hover {\n color: var(--prime-color-danger-hover);\n}\n\n.itemTryAgain:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.itemActions {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--prime-space-1);\n}\n\n.itemFooter,\n.itemProgress {\n width: 100%;\n min-width: 0;\n}\n\n.formatBadge {\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--fu-item-badge, var(--prime-control-m-height));\n height: var(--fu-item-badge, var(--prime-control-m-height));\n padding: 0;\n border-radius: var(--fu-item-badge-radius, var(--prime-radius-m));\n font-family: var(--prime-font-family-sans);\n font-size: var(--fu-item-badge-text, var(--prime-badge-s-text-size));\n line-height: 1;\n font-weight: var(--prime-font-weight-semibold);\n letter-spacing: var(--prime-text-caption-tracking);\n text-transform: uppercase;\n /* Neutral badge sits on the row's own wash: a stronger wash keeps it visible (foundation \u00A74). */\n background: var(--prime-color-fill-strong);\n color: var(--prime-color-text-secondary);\n}\n\n.formatBadge[data-color=\"red\"] {\n --fu-hue: var(--prime-color-palette-red-text);\n}\n\n.formatBadge[data-color=\"blue\"] {\n --fu-hue: var(--prime-color-palette-blue-text);\n}\n\n.formatBadge[data-color=\"green\"] {\n --fu-hue: var(--prime-color-palette-green-text);\n}\n\n.formatBadge[data-color=\"orange\"] {\n --fu-hue: var(--prime-color-palette-orange-text);\n}\n\n.formatBadge[data-color=\"purple\"] {\n --fu-hue: var(--prime-color-palette-purple-text);\n}\n\n.formatBadge[data-color=\"sky\"] {\n --fu-hue: var(--prime-color-palette-sky-text);\n}\n\n.formatBadge[data-color=\"yellow\"] {\n --fu-hue: var(--prime-color-palette-yellow-text);\n}\n\n.formatBadge[data-color=\"pink\"] {\n --fu-hue: var(--prime-color-palette-pink-text);\n}\n\n.formatBadge[data-color=\"teal\"] {\n --fu-hue: var(--prime-color-palette-teal-text);\n}\n\n/*\n * Hue badges: a translucent wash of the hue text (not the opaque light `soft` tint, which is as light\n * as the row in the light theme), so the badge always steps off the row it sits on (foundation \u00A74).\n */\n.formatBadge:not([data-color=\"gray\"]) {\n background: color-mix(in srgb, var(--fu-hue) 16%, transparent);\n color: var(--fu-hue);\n}\n", "import * as React from \"react\";\nimport { useBadgeTier } from \"@/components/badge/tier\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdRootProps = Omit<React.HTMLAttributes<HTMLElement>, \"size\"> & {\n children: React.ReactNode;\n className?: string;\n size?: ControlSize;\n};\n\nconst KbdRoot = React.forwardRef<HTMLElement, KbdRootProps>(\n ({ children, className, size: sizeProp, ...rest }, ref) => {\n const { size, tier } = useBadgeTier(sizeProp);\n\n return (\n <kbd\n ref={ref}\n className={cx(styles.root, className)}\n {...rest}\n {...toDataAttributes({ size, tier })}\n >\n <ControlSizeProvider value={tier}>{children}</ControlSizeProvider>\n </kbd>\n );\n },\n);\n\nKbdRoot.displayName = \"Kbd.Root\";\n\nexport const Kbd = { Root: KbdRoot };\n", "/*\n * Kbd \u2014 monospace key cap on a sunken wash, no border. Uses the badge tiers\n * (`--prime-badge-<tier>-*`); `data-tier` is the visual tier (see badge/tier.ts).\n * The wash is a translucent fill so the key reads as inset on canvas, cards and panels alike.\n */\n.root {\n --kbd-h: var(--prime-badge-m-height);\n --kbd-px: var(--prime-badge-m-padding-x);\n --kbd-gap: var(--prime-badge-m-gap);\n --kbd-radius: var(--prime-badge-m-radius);\n --kbd-text: var(--prime-badge-m-text-size);\n --prime-icon-size: var(--prime-badge-m-icon);\n\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n gap: var(--kbd-gap);\n height: var(--kbd-h);\n min-width: var(--kbd-h);\n padding-inline: var(--kbd-px);\n border-radius: var(--kbd-radius);\n background: var(--prime-color-fill-subtle-active);\n color: var(--prime-color-text-secondary);\n font-family: var(--prime-font-family-mono);\n font-size: var(--kbd-text);\n line-height: 1;\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.root[data-tier=\"xs\"] {\n --kbd-h: var(--prime-badge-xs-height);\n --kbd-px: var(--prime-badge-xs-padding-x);\n --kbd-gap: var(--prime-badge-xs-gap);\n --kbd-radius: var(--prime-badge-xs-radius);\n --kbd-text: var(--prime-badge-xs-text-size);\n --prime-icon-size: var(--prime-badge-xs-icon);\n}\n\n.root[data-tier=\"s\"] {\n --kbd-h: var(--prime-badge-s-height);\n --kbd-px: var(--prime-badge-s-padding-x);\n --kbd-gap: var(--prime-badge-s-gap);\n --kbd-radius: var(--prime-badge-s-radius);\n --kbd-text: var(--prime-badge-s-text-size);\n --prime-icon-size: var(--prime-badge-s-icon);\n}\n\n.root[data-tier=\"l\"] {\n --kbd-h: var(--prime-badge-l-height);\n --kbd-px: var(--prime-badge-l-padding-x);\n --kbd-gap: var(--prime-badge-l-gap);\n --kbd-radius: var(--prime-badge-l-radius);\n --kbd-text: var(--prime-badge-l-text-size);\n --prime-icon-size: var(--prime-badge-l-icon);\n}\n\n.root[data-tier=\"xl\"] {\n --kbd-h: var(--prime-badge-xl-height);\n --kbd-px: var(--prime-badge-xl-padding-x);\n --kbd-gap: var(--prime-badge-xl-gap);\n --kbd-radius: var(--prime-badge-xl-radius);\n --kbd-text: var(--prime-badge-xl-text-size);\n --prime-icon-size: var(--prime-badge-xl-icon);\n}\n\n.root > * {\n font-size: inherit;\n line-height: inherit;\n}\n\n.root :where(svg) {\n flex-shrink: 0;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n}\n", "import { AlertTriangle, CheckCircle2, Info, X, XCircle } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/button/Button\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./Notification.module.css\";\n\n// Countdown lives in the card so progress re-renders never reach the stack item.\nfunction useCountdown(\n item: NotificationRecord,\n paused: boolean,\n onExpire: (id: string) => void,\n): number {\n const [progress, setProgress] = React.useState(1);\n const remainingRef = React.useRef(item.duration);\n const lastTsRef = React.useRef<number | null>(null);\n const pausedRef = React.useRef(paused);\n const onExpireRef = React.useRef(onExpire);\n\n pausedRef.current = paused;\n onExpireRef.current = onExpire;\n\n React.useEffect(() => {\n if (item.persistent || item.duration <= 0) return;\n\n remainingRef.current = item.duration;\n lastTsRef.current = null;\n setProgress(1);\n\n let frame: number;\n let cancelled = false;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (lastTsRef.current !== null && !pausedRef.current) {\n const delta = now - lastTsRef.current;\n remainingRef.current = Math.max(0, remainingRef.current - delta);\n setProgress(remainingRef.current / item.duration);\n if (remainingRef.current <= 0) {\n onExpireRef.current(item.id);\n return;\n }\n }\n lastTsRef.current = now;\n frame = requestAnimationFrame(tick);\n };\n\n frame = requestAnimationFrame(tick);\n return () => {\n cancelled = true;\n cancelAnimationFrame(frame);\n };\n }, [item.id, item.duration, item.persistent]);\n\n return progress;\n}\n\nexport type NotificationPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n\nexport type NotificationLabels = {\n /** `aria-label` of the close button. */\n close: string;\n /** Accessible names of the toast regions, per position. */\n regions: Record<NotificationPosition, string>;\n};\n\nexport const DEFAULT_NOTIFICATION_LABELS: NotificationLabels = {\n close: \"\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0443\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u0435\",\n regions: {\n \"top-left\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043B\u0435\u0432\u0430\",\n \"top-center\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0445\u0443 \u043F\u043E \u0446\u0435\u043D\u0442\u0440\u0443\",\n \"top-right\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043F\u0440\u0430\u0432\u0430\",\n \"bottom-left\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u043D\u0438\u0437\u0443 \u0441\u043B\u0435\u0432\u0430\",\n \"bottom-center\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u043D\u0438\u0437\u0443 \u043F\u043E \u0446\u0435\u043D\u0442\u0440\u0443\",\n \"bottom-right\": \"\u0423\u0432\u0435\u0434\u043E\u043C\u043B\u0435\u043D\u0438\u044F \u0441\u043D\u0438\u0437\u0443 \u0441\u043F\u0440\u0430\u0432\u0430\",\n },\n};\n\n/** Labels provided by `NotificationProvider`; a standalone card uses the defaults. */\nexport const NotificationLabelsContext = React.createContext<NotificationLabels>(\n DEFAULT_NOTIFICATION_LABELS,\n);\n\nexport type NotificationAction = {\n label: string;\n onClick: () => void;\n};\n\nexport type NotificationOptions = {\n /** Semantic color and default icon. Default `info`. `danger` and `warning` are announced assertively. */\n tone?: Extract<Tone, \"info\" | \"success\" | \"warning\" | \"danger\">;\n title: string;\n description?: string;\n size?: ControlSize;\n position?: NotificationPosition;\n duration?: number;\n persistent?: boolean;\n icon?: React.ReactNode;\n badge?: string | number;\n closable?: boolean;\n action?: NotificationAction;\n};\n\nexport type NotificationRecord = NotificationOptions & {\n id: string;\n tone: NonNullable<NotificationOptions[\"tone\"]>;\n position: NotificationPosition;\n size: ControlSize;\n duration: number;\n persistent: boolean;\n closable: boolean;\n createdAt: number;\n};\n\nexport type NotificationCardProps = {\n item: NotificationRecord;\n className?: string;\n paused: boolean;\n onDismiss: (id: string) => void;\n stackDepth?: number;\n stackExpanded?: boolean;\n};\n\n/** Action button sits one tier below the card (pairing rule for nested controls). */\nconst actionButtonSize: Record<ControlSize, ControlSize> = {\n xs: \"xs\",\n s: \"xs\",\n m: \"s\",\n l: \"m\",\n xl: \"l\",\n};\n\nconst defaultIconByTone: Record<\n NotificationRecord[\"tone\"],\n React.ComponentType<{ className?: string }>\n> = {\n success: CheckCircle2,\n danger: XCircle,\n warning: AlertTriangle,\n info: Info,\n};\n\nexport function NotificationCard({\n item,\n className,\n paused,\n onDismiss,\n stackDepth = 0,\n stackExpanded = false,\n}: NotificationCardProps) {\n const progress = useCountdown(item, paused, onDismiss);\n const labels = React.useContext(NotificationLabelsContext);\n const DefaultIcon = defaultIconByTone[item.tone];\n const liveRole = item.tone === \"danger\" || item.tone === \"warning\" ? \"alert\" : \"status\";\n\n return (\n <article\n className={cx(styles.card, className)}\n role={liveRole}\n aria-live={liveRole === \"alert\" ? \"assertive\" : \"polite\"}\n {...toDataAttributes({\n tone: item.tone,\n size: item.size,\n persistent: item.persistent,\n \"stack-depth\": stackDepth,\n \"stack-expanded\": stackExpanded,\n })}\n >\n <div className={styles.iconWrap} aria-hidden=\"true\">\n {item.icon ?? <DefaultIcon className={styles.icon} />}\n </div>\n <div className={styles.content}>\n <header className={styles.header}>\n <p className={styles.title}>{item.title}</p>\n {item.badge !== undefined ? <span className={styles.badge}>{item.badge}</span> : null}\n </header>\n {item.description ? <p className={styles.description}>{item.description}</p> : null}\n {item.action ? (\n <div className={styles.actionRow}>\n <Button.Root\n variant=\"soft\"\n tone=\"neutral\"\n type=\"button\"\n size={actionButtonSize[item.size]}\n onClick={item.action.onClick}\n >\n {item.action.label}\n </Button.Root>\n </div>\n ) : null}\n </div>\n {item.closable ? (\n <button\n type=\"button\"\n className={styles.closeButton}\n aria-label={labels.close}\n onClick={() => onDismiss(item.id)}\n >\n <X aria-hidden=\"true\" />\n </button>\n ) : null}\n {!item.persistent ? (\n <div className={styles.progressTrack} aria-hidden=\"true\">\n <span className={styles.progressValue} style={{ transform: `scaleX(${progress})` }} />\n </div>\n ) : null}\n </article>\n );\n}\n", "/*\n * Notification (toast) \u2014 Graphite.\n * Raised card (bg-raised, panel radius, shadow-overlay, no border), status icon, title, description,\n * optional action and badge, close button, countdown line.\n */\n\n.viewport {\n position: fixed;\n z-index: var(--prime-z-toast);\n inset: 0;\n pointer-events: none;\n}\n\n.zone {\n --ntf-edge: var(--prime-space-5);\n\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--prime-space-3);\n width: min(100vw - 2 * var(--ntf-edge), calc(var(--prime-space-24) * 4));\n pointer-events: none;\n}\n\n.top {\n top: var(--ntf-edge);\n}\n\n.bottom {\n bottom: var(--ntf-edge);\n flex-direction: column-reverse;\n}\n\n.left {\n left: var(--ntf-edge);\n}\n\n.center {\n left: 50%;\n transform: translateX(-50%);\n}\n\n.right {\n right: var(--ntf-edge);\n}\n\n@media (max-width: 640px) {\n .zone {\n --ntf-edge: var(--prime-space-3);\n }\n}\n\n/* ---------- Stack ---------- */\n\n/*\n * Cards are absolutely positioned at the stack's anchor edge. NotificationStore computes each\n * card's offset / scale / opacity (`--ntf-y`, `--ntf-scale`, `--ntf-opacity`) and the stack height\n * (`--ntf-stack-height`) from measured card heights; CSS transitions them with the motion tokens.\n * Enter / exit play as keyframes on the inner `.motion` wrapper, so they never fight the\n * positioning transform. Durations collapse to 0 under `prefers-reduced-motion` (globals.css).\n */\n.stack {\n position: relative;\n width: 100%;\n height: var(--ntf-stack-height);\n margin: 0;\n padding: 0;\n list-style: none;\n pointer-events: auto;\n transition: height var(--prime-motion-duration-slow) var(--prime-motion-easing-standard);\n}\n\n.item {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n transform: translateY(var(--ntf-y)) scale(var(--ntf-scale));\n transform-origin: top center;\n opacity: var(--ntf-opacity);\n transition:\n transform var(--prime-motion-duration-slow) var(--prime-motion-easing-standard),\n opacity var(--prime-motion-duration-slow) var(--prime-motion-easing-standard);\n}\n\n.bottom .item {\n top: auto;\n bottom: 0;\n transform-origin: bottom center;\n}\n\n/* Cards beyond the peeking ones and cards playing their exit are click-through. */\n.item[data-hidden=\"true\"],\n.item[data-state=\"closed\"] {\n pointer-events: none;\n}\n\n.motion {\n /* Enter shift: from the anchor edge, two peek steps. */\n --ntf-enter-shift: calc(-2 * var(--prime-space-2));\n\n transform-origin: top center;\n}\n\n.bottom .motion {\n --ntf-enter-shift: calc(2 * var(--prime-space-2));\n\n transform-origin: bottom center;\n}\n\n.motion[data-state=\"open\"] {\n animation:\n ntfFadeIn var(--prime-motion-duration-base) var(--prime-motion-easing-enter) both,\n ntfShiftIn var(--prime-motion-duration-slow) var(--prime-motion-easing-enter) both;\n}\n\n.motion[data-state=\"closed\"] {\n animation: ntfExit var(--prime-motion-duration-base) var(--prime-motion-easing-exit) both;\n}\n\n@keyframes ntfFadeIn {\n from {\n opacity: 0;\n }\n}\n\n@keyframes ntfShiftIn {\n from {\n translate: 0 var(--ntf-enter-shift);\n scale: 0.96;\n }\n}\n\n@keyframes ntfExit {\n to {\n opacity: 0;\n scale: 0.96;\n }\n}\n\n/* ---------- Card ---------- */\n\n.card {\n --ntf-accent: var(--prime-color-info-default);\n --ntf-soft: var(--prime-color-info-soft);\n --ntf-text: var(--prime-color-info-text);\n --ntf-pad: var(--prime-space-4);\n --ntf-gap: var(--prime-space-3);\n --ntf-icon: var(--prime-control-m-icon);\n --ntf-title-size: var(--prime-control-m-text-size);\n --ntf-title-line-height: var(--prime-control-m-line-height);\n --ntf-desc-size: var(--prime-text-body-s-size);\n --ntf-desc-line-height: var(--prime-text-body-s-line-height);\n --ntf-close: var(--prime-control-xs-height);\n --ntf-close-icon: var(--prime-control-s-icon);\n\n /* Surface context for fields inside custom content. */\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n position: relative;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: start;\n gap: var(--ntf-gap);\n width: 100%;\n padding: var(--ntf-pad);\n overflow: hidden;\n border-radius: var(--prime-panel-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n}\n\n.card[data-size=\"xs\"] {\n --ntf-pad: var(--prime-space-2);\n --ntf-gap: var(--prime-space-2);\n --ntf-icon: var(--prime-control-xs-icon);\n --ntf-title-size: var(--prime-control-xs-text-size);\n --ntf-title-line-height: var(--prime-control-xs-line-height);\n --ntf-desc-size: var(--prime-text-caption-size);\n --ntf-desc-line-height: var(--prime-text-caption-line-height);\n --ntf-close: var(--prime-space-5);\n --ntf-close-icon: var(--prime-control-xs-icon);\n}\n\n.card[data-size=\"s\"] {\n --ntf-pad: var(--prime-space-3);\n --ntf-gap: var(--prime-space-2);\n --ntf-icon: var(--prime-control-s-icon);\n --ntf-title-size: var(--prime-control-s-text-size);\n --ntf-title-line-height: var(--prime-control-s-line-height);\n --ntf-desc-size: var(--prime-text-caption-size);\n --ntf-desc-line-height: var(--prime-text-caption-line-height);\n --ntf-close: var(--prime-space-6);\n --ntf-close-icon: var(--prime-control-xs-icon);\n}\n\n.card[data-size=\"l\"] {\n --ntf-pad: var(--prime-space-5);\n --ntf-icon: var(--prime-control-l-icon);\n --ntf-title-size: var(--prime-control-l-text-size);\n --ntf-title-line-height: var(--prime-control-l-line-height);\n --ntf-desc-size: var(--prime-text-body-m-size);\n --ntf-desc-line-height: var(--prime-text-body-m-line-height);\n --ntf-close: var(--prime-control-s-height);\n}\n\n.card[data-size=\"xl\"] {\n --ntf-pad: var(--prime-space-6);\n --ntf-gap: var(--prime-space-4);\n --ntf-icon: var(--prime-control-xl-icon);\n --ntf-title-size: var(--prime-control-xl-text-size);\n --ntf-title-line-height: var(--prime-control-xl-line-height);\n --ntf-desc-size: var(--prime-text-body-m-size);\n --ntf-desc-line-height: var(--prime-text-body-m-line-height);\n --ntf-close: var(--prime-control-s-height);\n --ntf-close-icon: var(--prime-control-m-icon);\n}\n\n.card[data-tone=\"success\"] {\n --ntf-accent: var(--prime-color-success-default);\n --ntf-soft: var(--prime-color-success-soft);\n --ntf-text: var(--prime-color-success-text);\n}\n\n.card[data-tone=\"danger\"] {\n --ntf-accent: var(--prime-color-danger-default);\n --ntf-soft: var(--prime-color-danger-soft);\n --ntf-text: var(--prime-color-danger-text);\n}\n\n.card[data-tone=\"warning\"] {\n --ntf-accent: var(--prime-color-warning-default);\n --ntf-soft: var(--prime-color-warning-soft);\n --ntf-text: var(--prime-color-warning-text);\n}\n\n/* Cards peeking behind the first one in a collapsed stack: lighter shadow. */\n.card[data-stack-expanded=\"false\"]:not([data-stack-depth=\"0\"]) {\n box-shadow: var(--prime-shadow-raised);\n}\n\n/* ---------- Slots ---------- */\n\n/* Icon box is as tall as the title line so the glyph centers on the first line. */\n.iconWrap {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--ntf-title-line-height);\n color: var(--ntf-accent);\n}\n\n.iconWrap svg,\n.icon {\n display: block;\n width: var(--ntf-icon);\n height: var(--ntf-icon);\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.title {\n min-width: 0;\n margin: 0;\n font-size: var(--ntf-title-size);\n line-height: var(--ntf-title-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: var(--prime-color-text-primary);\n overflow-wrap: anywhere;\n}\n\n.badge {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n height: var(--prime-badge-xs-height);\n padding-inline: var(--prime-badge-xs-padding-x);\n border-radius: var(--prime-badge-xs-radius);\n background: var(--ntf-soft);\n color: var(--ntf-text);\n font-size: var(--prime-badge-xs-text-size);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n}\n\n.description {\n margin: 0;\n font-size: var(--ntf-desc-size);\n line-height: var(--ntf-desc-line-height);\n color: var(--prime-color-text-secondary);\n overflow-wrap: anywhere;\n}\n\n.actionRow {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--prime-space-2);\n padding-top: var(--prime-space-2);\n}\n\n.closeButton {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--ntf-close);\n height: var(--ntf-close);\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-s);\n background: transparent;\n color: var(--prime-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.closeButton:hover {\n background: var(--prime-color-fill-subtle);\n color: var(--prime-color-text-primary);\n}\n\n.closeButton:active {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.closeButton:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.closeButton svg {\n width: var(--ntf-close-icon);\n height: var(--ntf-close-icon);\n}\n\n/* ---------- Countdown ---------- */\n\n.progressTrack {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: calc(var(--prime-border-width) * 2);\n background: var(--prime-color-fill-muted);\n}\n\n.progressValue {\n display: block;\n width: 100%;\n height: 100%;\n transform-origin: left center;\n background: var(--ntf-accent);\n}\n", "import * as React from \"react\";\n\nimport { exitTimeoutMs, prefersReducedMotion } from \"@/hooks/usePresence\";\nimport { remToPx } from \"@/internal/layoutPxFromPrimitives\";\nimport { Portal } from \"@/internal/Portal\";\nimport { primitiveTokens } from \"../../../tokens/primitives\";\n\nimport {\n DEFAULT_NOTIFICATION_LABELS,\n NotificationCard,\n type NotificationLabels,\n NotificationLabelsContext,\n type NotificationOptions,\n type NotificationPosition,\n type NotificationRecord,\n} from \"./Notification\";\nimport styles from \"./Notification.module.css\";\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type NotificationProviderProps = {\n children: React.ReactNode;\n /** Default position for `notify()` calls without one. Default `top-right`. */\n position?: NotificationPosition;\n /** Max visible toasts per stack (position \u00D7 tone). Default 5. */\n max?: number;\n /** Built-in strings (close button, region names); `regions` merges per position. */\n labels?: {\n close?: string;\n regions?: Partial<NotificationLabels[\"regions\"]>;\n };\n};\n\ntype StoreValue = {\n items: NotificationRecord[];\n notify: (options: NotificationOptions) => string;\n dismiss: (id: string) => void;\n dismissAll: () => void;\n};\n\n// dismissing \u2014 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 \u0444\u043B\u0430\u0433; \u043D\u0435 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u0432 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 StoreValue.items\ntype NotificationEntry = NotificationRecord & { dismissing?: true };\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DEFAULT_DURATION = 5000;\n/** Cards visible in a collapsed stack; older ones are hidden and click-through. */\nconst PEEK_VISIBLE = 3;\n/** Collapsed stack: scale step per depth and its floor. */\nconst SCALE_STEP = 0.04;\nconst MIN_SCALE = 0.88;\n/** Collapsed stack: opacity of the front card and the two peeking behind it. */\nconst PEEK_OPACITY = [1, 0.72, 0.48] as const;\n/** Hover intent: the stack collapses this long after the pointer leaves it. */\nconst COLLAPSE_DELAY_MS = 100;\n/** z-index of the front card inside its stack; older cards sit below it. */\nconst Z_FRONT = 100;\n\n/** Vertical offset of each peeking card in a collapsed stack and the gap of an expanded one: `space.2`. */\nfunction space2Px(): number {\n return remToPx(primitiveTokens.space[2]);\n}\n\nconst POSITIONS: readonly NotificationPosition[] = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n];\nconst TONES: readonly NotificationRecord[\"tone\"][] = [\"success\", \"danger\", \"warning\", \"info\"];\n\n// \u2500\u2500\u2500 Context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst StoreContext = React.createContext<StoreValue | null>(null);\n\nfunction newId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ?? `ntf-${Date.now()}-${Math.random().toString(16).slice(2)}`\n );\n}\n\nfunction isTop(position: NotificationPosition): boolean {\n return position.startsWith(\"top\");\n}\n\n// \u2500\u2500\u2500 NotificationStack \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Motion without a layout library: every card is absolutely positioned at the stack's anchor edge\n// (top or bottom); its offset, scale and opacity are computed here from measured heights and set\n// as CSS custom properties, which CSS transitions with the motion tokens. Enter / exit are CSS\n// keyframes on an inner wrapper so they never fight the positioning transform.\n\ntype ItemLayout = {\n index: number;\n y: number;\n scale: number;\n opacity: number;\n hidden: boolean;\n};\n\nconst RESTING_LAYOUT: ItemLayout = { index: 0, y: 0, scale: 1, opacity: 1, hidden: false };\n\nfunction NotificationStack({\n position,\n items,\n onDismiss,\n onExited,\n}: {\n position: NotificationPosition;\n items: NotificationEntry[];\n onDismiss: (id: string) => void;\n onExited: (id: string) => void;\n}) {\n const labels = React.useContext(NotificationLabelsContext);\n const [expanded, setExpanded] = React.useState(false);\n const [heights, setHeights] = React.useState<Record<string, number>>({});\n const collapseTimerRef = React.useRef<number | null>(null);\n const lastLayoutRef = React.useRef(new Map<string, ItemLayout>());\n const top = isTop(position);\n const step = React.useMemo(space2Px, []);\n\n const handleHover = React.useCallback((hovered: boolean) => {\n if (collapseTimerRef.current !== null) {\n clearTimeout(collapseTimerRef.current);\n collapseTimerRef.current = null;\n }\n if (hovered) {\n setExpanded(true);\n } else {\n collapseTimerRef.current = window.setTimeout(() => setExpanded(false), COLLAPSE_DELAY_MS);\n }\n }, []);\n\n React.useEffect(\n () => () => {\n if (collapseTimerRef.current !== null) clearTimeout(collapseTimerRef.current);\n },\n [],\n );\n\n const reportHeight = React.useCallback((id: string, height: number) => {\n setHeights((prev) => (prev[id] === height ? prev : { ...prev, [id]: height }));\n }, []);\n\n // Forget heights of unmounted cards.\n React.useEffect(() => {\n setHeights((prev) => {\n const ids = new Set(items.map((n) => n.id));\n const stale = Object.keys(prev).filter((id) => !ids.has(id));\n if (stale.length === 0) return prev;\n const next = { ...prev };\n for (const id of stale) delete next[id];\n return next;\n });\n }, [items]);\n\n // Only active cards take part in the layout; a dismissed card keeps its last place while it fades.\n const active = items.filter((n) => !n.dismissing);\n const sign = top ? 1 : -1;\n const layouts = new Map<string, ItemLayout>();\n let flowHeight = 0;\n active.forEach((item, index) => {\n const hidden = !expanded && index >= PEEK_VISIBLE;\n layouts.set(item.id, {\n index,\n y: sign * (expanded ? flowHeight : index * step),\n scale: expanded ? 1 : Math.max(1 - index * SCALE_STEP, MIN_SCALE),\n opacity: hidden ? 0 : expanded ? 1 : PEEK_OPACITY[index],\n hidden,\n });\n flowHeight += (heights[item.id] ?? 0) + step;\n });\n\n const frontHeight = active.length > 0 ? (heights[active[0].id] ?? 0) : 0;\n const stackHeight =\n active.length === 0\n ? 0\n : expanded\n ? flowHeight - step\n : frontHeight + Math.min(active.length - 1, PEEK_VISIBLE - 1) * step;\n\n React.useLayoutEffect(() => {\n for (const [id, layout] of layouts) lastLayoutRef.current.set(id, layout);\n const ids = new Set(items.map((n) => n.id));\n for (const id of lastLayoutRef.current.keys()) {\n if (!ids.has(id)) lastLayoutRef.current.delete(id);\n }\n });\n\n return (\n <ol\n className={styles.stack}\n aria-label={labels.regions[position]}\n data-expanded={String(expanded)}\n style={{ \"--ntf-stack-height\": `${stackHeight}px` } as React.CSSProperties}\n onMouseEnter={() => handleHover(true)}\n onMouseLeave={() => handleHover(false)}\n >\n {items.map((item) => {\n const closing = item.dismissing === true;\n const layout = layouts.get(item.id) ?? lastLayoutRef.current.get(item.id) ?? RESTING_LAYOUT;\n return (\n <NotificationStackItem\n key={item.id}\n item={item}\n index={layout.index}\n y={layout.y}\n scale={layout.scale}\n opacity={layout.opacity}\n hidden={layout.hidden}\n closing={closing}\n expanded={expanded}\n onDismiss={onDismiss}\n onExited={onExited}\n onHeight={reportHeight}\n />\n );\n })}\n </ol>\n );\n}\n\n// React.memo: the card's 60fps countdown re-renders stay inside NotificationCard; the item only\n// re-renders when its place in the stack changes.\nconst NotificationStackItem = React.memo(function NotificationStackItem({\n item,\n index,\n y,\n scale,\n opacity,\n hidden,\n closing,\n expanded,\n onDismiss,\n onExited,\n onHeight,\n}: {\n item: NotificationRecord;\n index: number;\n y: number;\n scale: number;\n opacity: number;\n hidden: boolean;\n closing: boolean;\n expanded: boolean;\n onDismiss: (id: string) => void;\n onExited: (id: string) => void;\n onHeight: (id: string, height: number) => void;\n}) {\n const ref = React.useRef<HTMLLIElement>(null);\n const { id } = item;\n\n // Measure before paint so offsets are right on the first frame; follow later size changes.\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n onHeight(id, el.offsetHeight);\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => onHeight(id, el.offsetHeight));\n observer.observe(el);\n return () => observer.disconnect();\n }, [id, onHeight]);\n\n const state = closing ? \"closed\" : \"open\";\n\n return (\n <li\n ref={ref}\n className={styles.item}\n data-stack-index={index}\n data-hidden={hidden ? \"true\" : undefined}\n data-state={state}\n style={\n {\n \"--ntf-y\": `${y}px`,\n \"--ntf-scale\": scale,\n \"--ntf-opacity\": opacity,\n zIndex: Z_FRONT - index,\n } as React.CSSProperties\n }\n >\n <div\n className={styles.motion}\n data-state={state}\n onAnimationEnd={(event) => {\n if (closing && event.target === event.currentTarget) onExited(id);\n }}\n >\n <NotificationCard\n item={item}\n paused={expanded || closing}\n onDismiss={onDismiss}\n stackDepth={index}\n stackExpanded={expanded}\n />\n </div>\n </li>\n );\n});\n\n// \u2500\u2500\u2500 NotificationToaster \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u041F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 entries \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E \u043E\u0442 \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u2014 \u0432\u043A\u043B\u044E\u0447\u0430\u044F dismissing-\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B,\n// \u0447\u0442\u043E\u0431\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043E\u0441\u0442\u0430\u0432\u0430\u043B\u0430\u0441\u044C \u0441\u043C\u043E\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0439 \u0432\u043E \u0432\u0440\u0435\u043C\u044F exit-\u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438.\n\nfunction NotificationToaster({\n entries,\n onDismiss,\n onExited,\n}: {\n entries: NotificationEntry[];\n onDismiss: (id: string) => void;\n onExited: (id: string) => void;\n}) {\n const grouped = React.useMemo(() => {\n const map = new Map<\n NotificationPosition,\n Map<NotificationRecord[\"tone\"], NotificationEntry[]>\n >();\n for (const entry of entries) {\n if (!map.has(entry.position)) map.set(entry.position, new Map());\n const byTone = map.get(entry.position);\n if (!byTone) continue;\n if (!byTone.has(entry.tone)) byTone.set(entry.tone, []);\n byTone.get(entry.tone)?.push(entry);\n }\n for (const byTone of map.values()) {\n for (const list of byTone.values()) {\n list.sort((a, b) => b.createdAt - a.createdAt);\n }\n }\n return map;\n }, [entries]);\n\n return (\n <Portal>\n <div className={styles.viewport}>\n {POSITIONS.map((pos) => {\n const byTone = grouped.get(pos);\n if (!byTone?.size) return null;\n\n const [vertical, horizontal] = pos.split(\"-\") as [\n \"top\" | \"bottom\",\n \"left\" | \"center\" | \"right\",\n ];\n\n const stacks = TONES.map((tone) => ({ tone, items: byTone.get(tone) ?? [] })).filter(\n (s) => s.items.length > 0,\n );\n\n return (\n <section\n key={pos}\n className={`${styles.zone} ${styles[vertical]} ${styles[horizontal]}`}\n >\n {stacks.map((s) => (\n <NotificationStack\n key={s.tone}\n position={pos}\n items={s.items}\n onDismiss={onDismiss}\n onExited={onExited}\n />\n ))}\n </section>\n );\n })}\n </div>\n </Portal>\n );\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function NotificationProvider({\n children,\n position = \"top-right\",\n max = 5,\n labels: labelsProp,\n}: NotificationProviderProps) {\n const labels = React.useMemo<NotificationLabels>(\n () => ({\n close: labelsProp?.close ?? DEFAULT_NOTIFICATION_LABELS.close,\n regions: { ...DEFAULT_NOTIFICATION_LABELS.regions, ...labelsProp?.regions },\n }),\n [labelsProp?.close, labelsProp?.regions],\n );\n const [entries, setEntries] = React.useState<NotificationEntry[]>([]);\n\n const entriesRef = React.useRef(entries);\n entriesRef.current = entries;\n const exitTimersRef = React.useRef(new Map<string, number>());\n\n React.useEffect(() => {\n const timers = exitTimersRef.current;\n return () => {\n for (const timer of timers.values()) clearTimeout(timer);\n timers.clear();\n };\n }, []);\n\n // Phase 2: drop the entry once its exit animation ended (or the token-based timeout fired).\n const remove = React.useCallback((id: string) => {\n const timer = exitTimersRef.current.get(id);\n if (timer !== undefined) {\n clearTimeout(timer);\n exitTimersRef.current.delete(id);\n }\n setEntries((prev) => prev.filter((n) => n.id !== id));\n }, []);\n\n // Phase 1: mark as dismissing so the card plays its exit; under reduced motion remove at once.\n const startExit = React.useCallback(\n (ids: string[]) => {\n if (ids.length === 0) return;\n const target = new Set(ids);\n if (prefersReducedMotion()) {\n for (const id of ids) {\n const timer = exitTimersRef.current.get(id);\n if (timer !== undefined) clearTimeout(timer);\n exitTimersRef.current.delete(id);\n }\n setEntries((prev) => prev.filter((n) => !target.has(n.id)));\n return;\n }\n setEntries((prev) =>\n prev.map((n) => (target.has(n.id) && !n.dismissing ? { ...n, dismissing: true } : n)),\n );\n const timeout = exitTimeoutMs(\"base\");\n for (const id of ids) {\n if (exitTimersRef.current.has(id)) continue;\n exitTimersRef.current.set(\n id,\n window.setTimeout(() => remove(id), timeout),\n );\n }\n },\n [remove],\n );\n\n const dismiss = React.useCallback((id: string) => startExit([id]), [startExit]);\n\n const dismissAll = React.useCallback(\n () => startExit(entriesRef.current.filter((n) => !n.dismissing).map((n) => n.id)),\n [startExit],\n );\n\n const notify = React.useCallback(\n (options: NotificationOptions): string => {\n const id = newId();\n const record: NotificationEntry = {\n ...options,\n id,\n tone: options.tone ?? \"info\",\n size: options.size ?? \"m\",\n position: options.position ?? position,\n duration: options.duration ?? DEFAULT_DURATION,\n persistent: options.persistent ?? false,\n closable: options.closable ?? true,\n createdAt: Date.now(),\n };\n\n setEntries((prev) => {\n const sameStack = prev.filter(\n (n) => n.position === record.position && n.tone === record.tone && !n.dismissing,\n );\n // Other stacks and cards still playing their exit stay as they are.\n const rest = prev.filter(\n (n) => n.position !== record.position || n.tone !== record.tone || n.dismissing,\n );\n return [...rest, ...[record, ...sameStack].slice(0, max)];\n });\n\n return id;\n },\n [position, max],\n );\n\n // \u041F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0439 items \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 dismissing-\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\n const publicItems = React.useMemo(() => entries.filter((n) => !n.dismissing), [entries]);\n\n const value = React.useMemo(\n () => ({ items: publicItems, notify, dismiss, dismissAll }),\n [publicItems, notify, dismiss, dismissAll],\n );\n\n return (\n <StoreContext.Provider value={value}>\n <NotificationLabelsContext.Provider value={labels}>\n {children}\n <NotificationToaster entries={entries} onDismiss={dismiss} onExited={remove} />\n </NotificationLabelsContext.Provider>\n </StoreContext.Provider>\n );\n}\n\n/** `notify`, `dismiss`, `dismissAll` and the live `items` list of the nearest `NotificationProvider`. */\nexport function useNotifications(): StoreValue {\n const ctx = React.useContext(StoreContext);\n if (!ctx) throw new Error(\"useNotifications must be used within NotificationProvider\");\n return ctx;\n}\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\n\nimport styles from \"./PageContent.module.css\";\n\n/** \u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0435 \u0448\u0438\u0440\u0438\u043D\u044B \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0433\u043E \u0431\u043B\u043E\u043A\u0430 \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u043D\u043A\u0438 `main`. */\nexport type PageContentMaxWidth = \"full\" | \"readable\" | \"wide\";\n\nexport type PageContentRootProps = {\n maxWidth?: PageContentMaxWidth;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nconst PageContentRoot = React.forwardRef<HTMLDivElement, PageContentRootProps>(\n function PageContentRoot({ maxWidth = \"full\", className, children, ...rest }, forwardedRef) {\n return (\n <div\n ref={forwardedRef}\n className={cx(styles.root, className)}\n {...rest}\n {...toDataAttributes({\n \"max-width\": maxWidth === \"full\" ? undefined : maxWidth,\n })}\n >\n {children}\n </div>\n );\n },\n);\nPageContentRoot.displayName = \"PageContent.Root\";\n\nexport type PageContentSectionProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLElement>;\n\nconst PageContentSection = React.forwardRef<HTMLElement, PageContentSectionProps>(\n function PageContentSection({ className, children, ...rest }, forwardedRef) {\n return (\n <section ref={forwardedRef} className={cx(styles.section, className)} {...rest}>\n {children}\n </section>\n );\n },\n);\nPageContentSection.displayName = \"PageContent.Section\";\n\nexport type PageContentHeaderProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nexport type PageContentActionsProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/** Page-level actions (buttons) next to the title; wrap below the heading on narrow columns. */\nfunction PageContentActions({ className, children, ...rest }: PageContentActionsProps) {\n return (\n <div className={cx(styles.actions, className)} {...rest}>\n {children}\n </div>\n );\n}\nPageContentActions.displayName = \"PageContent.Actions\";\n\nfunction PageContentHeader({ className, children, ...rest }: PageContentHeaderProps) {\n const items = React.Children.toArray(children);\n const isActions = (child: React.ReactNode) =>\n React.isValidElement(child) && child.type === PageContentActions;\n const actions = items.filter(isActions);\n const heading = items.filter((child) => !isActions(child));\n\n return (\n <div\n className={cx(styles.header, className)}\n data-has-actions={actions.length > 0 ? \"true\" : undefined}\n {...rest}\n >\n <div className={styles.heading}>{heading}</div>\n {actions}\n </div>\n );\n}\nPageContentHeader.displayName = \"PageContent.Header\";\n\nexport type PageContentTitleProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLHeadingElement>;\n\nconst PageContentTitle = React.forwardRef<HTMLHeadingElement, PageContentTitleProps>(\n function PageContentTitle({ className, children, ...rest }, forwardedRef) {\n return (\n <h1 ref={forwardedRef} className={cx(styles.title, className)} {...rest}>\n {children}\n </h1>\n );\n },\n);\nPageContentTitle.displayName = \"PageContent.Title\";\n\nexport type PageContentDescriptionMeasure = \"readable\" | \"full\";\n\nexport type PageContentDescriptionProps = {\n /** `readable` \u2014 max ~65ch; `full` \u2014 use full width of the parent (e.g. inside an already padded `main`). */\n measure?: PageContentDescriptionMeasure;\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLParagraphElement>;\n\nconst PageContentDescription = React.forwardRef<HTMLParagraphElement, PageContentDescriptionProps>(\n function PageContentDescription(\n { className, children, measure = \"readable\", ...rest },\n forwardedRef,\n ) {\n return (\n <p\n ref={forwardedRef}\n className={cx(styles.description, className)}\n {...rest}\n {...toDataAttributes({\n measure: measure === \"full\" ? \"full\" : undefined,\n })}\n >\n {children}\n </p>\n );\n },\n);\nPageContentDescription.displayName = \"PageContent.Description\";\n\nexport type PageContentBodyProps = {\n className?: string;\n children?: React.ReactNode;\n} & React.HTMLAttributes<HTMLDivElement>;\n\nfunction PageContentBody({ className, children, ...rest }: PageContentBodyProps) {\n return (\n <div className={cx(styles.body, className)} {...rest}>\n {children}\n </div>\n );\n}\nPageContentBody.displayName = \"PageContent.Body\";\n\nexport const PageContent = {\n Root: PageContentRoot,\n Section: PageContentSection,\n Header: PageContentHeader,\n Actions: PageContentActions,\n Title: PageContentTitle,\n Description: PageContentDescription,\n Body: PageContentBody,\n};\n", "/*\n * Page column primitives. Edge gutters come from `AppShell.Main`; here only measure and rhythm:\n * header \u2192 body 32, block \u2192 block inside the body 40 (section \u2192 section, foundation \u00A71.3).\n */\n\n.root,\n.section {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-8);\n width: 100%;\n min-width: 0;\n}\n\n.root {\n margin-inline: auto;\n}\n\n.root[data-max-width=\"readable\"] {\n max-width: var(--prime-layout-reading-max-width);\n}\n\n.root[data-max-width=\"wide\"] {\n max-width: var(--prime-layout-content-max-width);\n}\n\n/*\n * Heading and actions share a row while the heading keeps at least half a reading measure;\n * otherwise actions wrap under it (intrinsic wrap, no breakpoint needed).\n */\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--prime-space-4) var(--prime-space-6);\n min-width: 0;\n}\n\n.heading {\n display: flex;\n flex: 1 1 calc(var(--prime-layout-reading-max-width) / 2);\n flex-direction: column;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.actions {\n display: flex;\n flex: 0 1 auto;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n color: var(--prime-color-text-primary);\n font-size: var(--prime-text-heading-m-size);\n line-height: var(--prime-text-heading-m-line-height);\n font-weight: var(--prime-text-heading-m-weight);\n letter-spacing: var(--prime-text-heading-m-tracking);\n overflow-wrap: anywhere;\n text-wrap: balance;\n}\n\n.description {\n margin: 0;\n max-width: var(--prime-layout-reading-max-width);\n color: var(--prime-color-text-secondary);\n font-size: var(--prime-text-body-m-size);\n line-height: var(--prime-text-body-m-line-height);\n font-weight: var(--prime-text-body-m-weight);\n overflow-wrap: anywhere;\n text-wrap: pretty;\n}\n\n/* When the content column is already inset by a parent, avoid a second measure column. */\n.description[data-measure=\"full\"] {\n max-width: none;\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-10);\n min-width: 0;\n}\n", "import * as React from \"react\";\nimport { cx } from \"@/internal/cx\";\nimport { remToPx } from \"@/internal/layoutPxFromPrimitives\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./ProgressCircle.module.css\";\n\n/**\n * Ring geometry per size. Diameters sit on the 4px grid (rem, so they scale with the root font size);\n * stroke widths are line weights in CSS px.\n */\nconst PROGRESS_CIRCLE_SIZES = {\n xs: { diameter: \"1.5rem\", strokeWidth: 3 },\n s: { diameter: \"2rem\", strokeWidth: 4 },\n m: { diameter: \"3rem\", strokeWidth: 4 },\n l: { diameter: \"4rem\", strokeWidth: 6 },\n xl: { diameter: \"5rem\", strokeWidth: 8 },\n} as const satisfies Record<ControlSize, { diameter: string; strokeWidth: number }>;\n\n/** Rings below `m` are too small for readable inner text: `children` are not rendered there. */\nconst SIZES_WITHOUT_INNER: ReadonlySet<ControlSize> = new Set([\"xs\", \"s\"]);\n\nexport type ProgressCircleRootProps = {\n value: number;\n max?: number;\n size?: ControlSize;\n /** \u0426\u0432\u0435\u0442 \u0434\u0443\u0433\u0438. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E `accent`. */\n tone?: Exclude<Tone, \"neutral\" | \"info\">;\n label?: string;\n /**\n * \u0426\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 (\u0447\u0438\u0441\u043B\u043E, \u043F\u0440\u043E\u0446\u0435\u043D\u0442, \u0438\u043A\u043E\u043D\u043A\u0430). \u041D\u0430 `xs` / `s` \u043D\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u0438\u0442\u0441\u044F \u2014 \u043A\u043E\u043B\u044C\u0446\u043E\n * \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u043E; \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u043E\u0435 / \u0447\u0438\u0441\u043B\u043E\u0432\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C \u0447\u0435\u0440\u0435\u0437 `aria-valuetext`.\n */\n children?: React.ReactNode;\n className?: string;\n};\n\nfunction clampProgress(value: number, max: number): number {\n return Math.min(max, Math.max(value, 0));\n}\n\nconst ProgressCircleRoot = React.forwardRef<HTMLDivElement, ProgressCircleRootProps>(\n ({ value, max = 100, size = \"m\", tone = \"accent\", label, children, className }, ref) => {\n const safeMax = max > 0 ? max : 100;\n const safeValue = clampProgress(value, safeMax);\n const tier = PROGRESS_CIRCLE_SIZES[size];\n const sizeVal = remToPx(tier.diameter);\n const strokeWidth = tier.strokeWidth;\n const radius = (sizeVal - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference * (1 - safeValue / safeMax);\n const center = sizeVal / 2;\n const innerSize = sizeVal - strokeWidth * 2;\n const showInner = children != null && children !== false && !SIZES_WITHOUT_INNER.has(size);\n const valueText =\n typeof children === \"string\" || typeof children === \"number\" ? String(children) : undefined;\n\n return (\n <div\n ref={ref}\n className={cx(styles.root, className)}\n data-size={size}\n data-tone={tone}\n style={\n {\n \"--progress-circle-inner-size\": `${innerSize}px`,\n } as React.CSSProperties\n }\n >\n <svg\n width={sizeVal}\n height={sizeVal}\n viewBox={`0 0 ${sizeVal} ${sizeVal}`}\n role=\"progressbar\"\n aria-valuenow={safeValue}\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-label={label}\n aria-valuetext={valueText}\n >\n <circle\n cx={center}\n cy={center}\n r={radius}\n className={styles.track}\n fill=\"none\"\n strokeWidth={strokeWidth}\n />\n <circle\n cx={center}\n cy={center}\n r={radius}\n className={styles.fill}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${center} ${center})`}\n opacity={safeValue === 0 ? 0 : undefined}\n />\n </svg>\n {showInner ? (\n <div className={styles.inner} aria-hidden={valueText !== undefined ? true : undefined}>\n {children}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nProgressCircleRoot.displayName = \"ProgressCircleRoot\";\n\nexport const ProgressCircle = { Root: ProgressCircleRoot };\n", "/* ProgressCircle \u2014 Graphite: `fill-strong` ring, accent / tone arc with round caps. */\n\n.root {\n --pc-fill: var(--prime-color-accent-default);\n /* m (48px): caption keeps \u00AB100%\u00BB clear of the ring. */\n --pc-text-size: var(--prime-text-caption-size);\n --pc-line-height: var(--prime-text-caption-line-height);\n\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"l\"] {\n --pc-text-size: var(--prime-text-title-m-size);\n --pc-line-height: var(--prime-text-title-m-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --pc-text-size: var(--prime-text-title-l-size);\n --pc-line-height: var(--prime-text-title-l-line-height);\n}\n\n.root[data-tone=\"success\"] {\n --pc-fill: var(--prime-color-success-default);\n}\n\n.root[data-tone=\"warning\"] {\n --pc-fill: var(--prime-color-warning-default);\n}\n\n.root[data-tone=\"danger\"] {\n --pc-fill: var(--prime-color-danger-default);\n}\n\n.root svg {\n display: block;\n}\n\n.track {\n stroke: var(--prime-color-fill-strong);\n}\n\n.fill {\n stroke: var(--pc-fill);\n stroke-linecap: round;\n transition: stroke-dashoffset var(--prime-motion-duration-slow)\n var(--prime-motion-easing-standard);\n}\n\n.inner {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--progress-circle-inner-size);\n height: var(--progress-circle-inner-size);\n overflow: hidden;\n color: var(--prime-color-text-primary);\n font-size: var(--pc-text-size);\n line-height: var(--pc-line-height);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n", "import * as React from \"react\";\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\nimport { type FieldDescriptions, useFieldDescriptions } from \"@/internal/useFieldDescriptions\";\n\nimport styles from \"./Radio.module.css\";\n\n// \u2500\u2500\u2500 Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype RadioGroupContextValue = {\n name: string;\n value: string | undefined;\n setValue: (value: string) => void;\n size: ControlSize;\n disabled: boolean;\n invalid: boolean;\n required: boolean;\n fullWidth: boolean;\n};\n\nconst [RadioGroupProvider, useRadioGroupContext] =\n createComponentContext<RadioGroupContextValue>(\"Radio.Group\");\n\nexport type RadioGroupProps = Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"defaultValue\" | \"onChange\" | \"dir\"\n> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Native `name` shared by the radios; generated when omitted. */\n name?: string;\n size?: ControlSize;\n disabled?: boolean;\n /** Invalid state for every radio in the group (`aria-invalid` on the group and inputs). */\n invalid?: boolean;\n /** Native `required` on the radios and `aria-required` on the group. */\n required?: boolean;\n /** `vertical` stacks the options, `horizontal` lays them out in a wrapping row. */\n orientation?: \"vertical\" | \"horizontal\";\n /** Stretch every option to the container width. */\n fullWidth?: boolean;\n};\n\nconst RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n name: nameProp,\n size = \"m\",\n disabled = false,\n invalid = false,\n required = false,\n orientation = \"vertical\",\n fullWidth = false,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const generatedName = React.useId();\n const name = nameProp ?? generatedName;\n const [value, setValue] = useControllableState<string | undefined>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange as ((value: string | undefined) => void) | undefined,\n });\n\n const ctxValue = React.useMemo(\n () => ({ name, value, setValue, size, disabled, invalid, required, fullWidth }),\n [name, value, setValue, size, disabled, invalid, required, fullWidth],\n );\n\n return (\n <RadioGroupProvider value={ctxValue}>\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-disabled={disabled || undefined}\n aria-orientation={orientation}\n className={cx(styles.group, className)}\n {...toDataAttributes({\n size,\n orientation,\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n })}\n {...rest}\n >\n {children}\n </div>\n </RadioGroupProvider>\n );\n },\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n\n// \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype InputPassthrough = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"checked\" | \"defaultChecked\" | \"onChange\" | \"name\" | \"value\" | \"children\"\n>;\n\ntype RadioContextValue = FieldDescriptions & {\n inputId: string;\n value: string;\n checked: boolean;\n size: ControlSize;\n inputRef: React.Ref<HTMLInputElement>;\n invalid: boolean;\n disabled: boolean;\n inputPropsRef: React.MutableRefObject<InputPassthrough>;\n};\n\nconst [RadioProvider, useRadioContext] = createComponentContext<RadioContextValue>(\"Radio\");\n\nexport type RadioRootProps = InputPassthrough & {\n /** Value reported to `Radio.Group` when this option is chosen. */\n value: string;\n /** Invalid state for this option; also set by the group or a mounted `Radio.Error`. */\n invalid?: boolean;\n children?: React.ReactNode;\n};\n\nconst RadioRoot = React.forwardRef<HTMLInputElement, RadioRootProps>(\n (\n {\n id,\n value,\n invalid: invalidProp = false,\n disabled: disabledProp = false,\n className,\n \"aria-describedby\": ariaDescribedBy,\n children,\n ...inputRest\n },\n ref,\n ) => {\n const group = useRadioGroupContext();\n const rawId = React.useId();\n const inputId = id ?? rawId;\n const descriptions = useFieldDescriptions(inputId, ariaDescribedBy);\n\n const invalid = group.invalid || invalidProp || descriptions.hasError;\n const disabled = group.disabled || disabledProp;\n const checked = group.value === value;\n\n const inputPropsRef = React.useRef<InputPassthrough>(inputRest);\n inputPropsRef.current = inputRest;\n\n const ctxValue = React.useMemo(\n () => ({\n ...descriptions,\n inputId,\n value,\n checked,\n size: group.size,\n inputRef: ref,\n invalid,\n disabled,\n inputPropsRef,\n }),\n [descriptions, inputId, value, checked, group.size, ref, invalid, disabled],\n );\n\n return (\n <RadioProvider value={ctxValue}>\n <ControlSizeProvider value={group.size}>\n <div\n className={cx(styles.field, className)}\n {...toDataAttributes({\n size: group.size,\n state: checked ? \"checked\" : \"unchecked\",\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n \"full-width\": group.fullWidth || undefined,\n })}\n >\n {children}\n </div>\n </ControlSizeProvider>\n </RadioProvider>\n );\n },\n);\n\nRadioRoot.displayName = \"RadioRoot\";\n\n// \u2500\u2500\u2500 Label \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type RadioLabelProps = {\n children?: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLLabelElement>, \"htmlFor\" | \"size\">;\n\nconst RadioLabel = React.forwardRef<HTMLLabelElement, RadioLabelProps>(function RadioLabel(\n { children, className, ...rest },\n ref,\n) {\n const group = useRadioGroupContext();\n const { inputId, inputRef, value, checked, invalid, disabled, describedBy, inputPropsRef, size } =\n useRadioContext();\n\n return (\n <Label.Root\n ref={ref}\n htmlFor={inputId}\n size={size}\n disabled={disabled}\n className={cx(styles.labelRow, className)}\n {...rest}\n >\n <span className={styles.controlCell}>\n <input\n {...inputPropsRef.current}\n ref={inputRef}\n id={inputId}\n type=\"radio\"\n name={group.name}\n value={value}\n checked={checked}\n onChange={() => group.setValue(value)}\n required={group.required || undefined}\n className={styles.input}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n />\n <span className={styles.control} aria-hidden=\"true\">\n <span className={styles.dot} />\n </span>\n </span>\n {children != null ? <span className={styles.text}>{children}</span> : null}\n </Label.Root>\n );\n});\n\nRadioLabel.displayName = \"RadioLabel\";\n\n// \u2500\u2500\u2500 Hint / Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type RadioHintProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLParagraphElement>, \"id\">;\n\nfunction RadioHint({ children, className, ...rest }: RadioHintProps) {\n const { hintId, registerHint, size, disabled } = useRadioContext();\n React.useLayoutEffect(registerHint, [registerHint]);\n\n return (\n <Hint.Root\n id={hintId}\n size={size}\n disabled={disabled}\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nRadioHint.displayName = \"RadioHint\";\n\nexport type RadioErrorProps = RadioHintProps;\n\nfunction RadioError({ children, className, ...rest }: RadioErrorProps) {\n const { errorId, registerError, size } = useRadioContext();\n React.useLayoutEffect(registerError, [registerError]);\n\n return (\n <Hint.Root\n id={errorId}\n size={size}\n invalid\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nRadioError.displayName = \"RadioError\";\n\nexport const Radio = {\n Group: RadioGroup,\n Root: RadioRoot,\n Label: RadioLabel,\n Hint: RadioHint,\n Error: RadioError,\n};\n", "/*\n * Same choice layout as Checkbox (grid [control][text] / [ ][hint], label row as subgrid).\n * Circle: unchecked = fill-strong, checked = accent with a thumb-colored dot (40%) that pops in.\n */\n.field {\n --prime-choice-size: var(--prime-control-m-choice);\n --prime-choice-gap: var(--prime-control-m-gap);\n --prime-choice-text: var(--prime-control-m-text-size);\n --prime-choice-line-height: var(--prime-control-m-line-height);\n box-sizing: border-box;\n /* Shrink to content (so choices sit side by side in horizontal groups); text still wraps\n * within the container. `fullWidth` stretches the field. */\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n column-gap: var(--prime-choice-gap);\n row-gap: 0;\n align-content: start;\n}\n\n.field[data-full-width=\"true\"] {\n width: 100%;\n}\n\n.field[data-size=\"xs\"] {\n --prime-choice-size: var(--prime-control-xs-choice);\n --prime-choice-gap: var(--prime-control-xs-gap);\n --prime-choice-text: var(--prime-control-xs-text-size);\n --prime-choice-line-height: var(--prime-control-xs-line-height);\n}\n\n.field[data-size=\"s\"] {\n --prime-choice-size: var(--prime-control-s-choice);\n --prime-choice-gap: var(--prime-control-s-gap);\n --prime-choice-text: var(--prime-control-s-text-size);\n --prime-choice-line-height: var(--prime-control-s-line-height);\n}\n\n.field[data-size=\"l\"] {\n --prime-choice-size: var(--prime-control-l-choice);\n --prime-choice-gap: var(--prime-control-l-gap);\n --prime-choice-text: var(--prime-control-l-text-size);\n --prime-choice-line-height: var(--prime-control-l-line-height);\n}\n\n.field[data-size=\"xl\"] {\n --prime-choice-size: var(--prime-control-xl-choice);\n --prime-choice-gap: var(--prime-control-xl-gap);\n --prime-choice-text: var(--prime-control-xl-text-size);\n --prime-choice-line-height: var(--prime-control-xl-line-height);\n}\n\n.field .labelRow {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n column-gap: var(--prime-choice-gap);\n align-items: start;\n width: 100%;\n font-size: var(--prime-choice-text);\n line-height: var(--prime-choice-line-height);\n font-weight: var(--prime-font-weight-regular);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n}\n\n.controlCell {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--prime-choice-size);\n height: max(var(--prime-choice-size), var(--prime-choice-line-height));\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.control {\n box-sizing: border-box;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--prime-choice-size);\n height: var(--prime-choice-size);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.dot {\n width: 40%;\n height: 40%;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-control-thumb);\n transform: scale(0);\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-enter);\n}\n\n.text {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* ---- hover / active ---- */\n.labelRow:hover .control {\n background: var(--prime-color-fill-strong-hover);\n}\n\n.labelRow:active .control {\n transform: scale(0.92);\n}\n\n/* ---- checked ---- */\n.input:checked + .control,\n.labelRow:hover .input:checked + .control {\n background: var(--prime-color-accent-default);\n}\n\n.labelRow:hover .input:checked + .control {\n background: var(--prime-color-accent-hover);\n}\n\n.input:checked + .control .dot {\n transform: scale(1);\n}\n\n/* ---- focus-visible ---- */\n.input:focus-visible + .control {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* ---- invalid ---- */\n.field[data-invalid=\"true\"] .input:not(:checked) + .control {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.field[data-invalid=\"true\"] .input:focus-visible + .control {\n outline-color: var(--prime-color-danger-border);\n}\n\n/* ---- disabled ---- */\n.field[data-disabled=\"true\"] .labelRow {\n cursor: not-allowed;\n}\n\n.field[data-disabled=\"true\"] .control,\n.field[data-disabled=\"true\"] .labelRow:hover .input + .control {\n background: var(--prime-color-fill-muted);\n box-shadow: none;\n transform: none;\n}\n\n.field[data-disabled=\"true\"] .dot {\n background: var(--prime-color-text-disabled);\n}\n\n.hintSlot {\n grid-column: 2;\n min-width: 0;\n}\n\n/* ---- Radio.Group: a stack (or wrapping row) of options ---- */\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.group[data-orientation=\"horizontal\"] {\n flex-direction: row;\n flex-wrap: wrap;\n column-gap: var(--prime-space-5);\n row-gap: var(--prime-space-2);\n}\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, Tone } from \"@/internal/states\";\n\nimport styles from \"./SegmentedProgressBar.module.css\";\n\nexport type SegmentedProgressBarLabels = {\n /** Accessible description when `segments` is empty. */\n empty: string;\n /** Accessible description when every segment weighs zero. */\n allEmpty: string;\n};\n\nconst DEFAULT_LABELS: SegmentedProgressBarLabels = {\n empty: \"\u041D\u0435\u0442 \u0441\u0435\u0433\u043C\u0435\u043D\u0442\u043E\u0432\",\n allEmpty: \"\u0412\u0441\u0435 \u0441\u0435\u0433\u043C\u0435\u043D\u0442\u044B \u043F\u0443\u0441\u0442\u044B\",\n};\n\nexport type SegmentedProgressSegment = {\n /** Non-negative weight; segments are sized proportionally to the sum of all weights. */\n value: number;\n label?: string;\n /** Segment fill. Default `accent`. */\n tone?: Exclude<Tone, \"info\">;\n};\n\nexport type SegmentedProgressBarRootProps = {\n segments: SegmentedProgressSegment[];\n label?: string;\n size?: ControlSize;\n /** Visual gap between segments; `hairline` separates them with a 4px gap showing the surface behind. */\n segmentGap?: \"none\" | \"hairline\";\n /** Built-in accessible strings. */\n labels?: Partial<SegmentedProgressBarLabels>;\n className?: string;\n};\n\nfunction clampNonNegative(n: number): number {\n return Number.isFinite(n) && n > 0 ? n : 0;\n}\n\nfunction buildDistributionDescription(\n segments: SegmentedProgressSegment[],\n total: number,\n labels: SegmentedProgressBarLabels,\n): string {\n if (segments.length === 0) {\n return labels.empty;\n }\n if (total <= 0) {\n return labels.allEmpty;\n }\n const parts = segments.map((s) => {\n const pct = Math.round((clampNonNegative(s.value) / total) * 100);\n return s.label ? `${s.label}: ${pct}%` : `${pct}%`;\n });\n return parts.join(\", \");\n}\n\nconst SegmentedProgressBarRoot = React.forwardRef<HTMLDivElement, SegmentedProgressBarRootProps>(\n ({ segments, label, size = \"m\", segmentGap = \"none\", labels: labelsProp, className }, ref) => {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n const labelId = React.useId();\n const descriptionId = React.useId();\n const safe = React.useMemo(\n () => segments.map((s) => ({ ...s, value: clampNonNegative(s.value) })),\n [segments],\n );\n const total = React.useMemo(() => safe.reduce((acc, s) => acc + s.value, 0), [safe]);\n\n const distributionText = buildDistributionDescription(safe, total, labels);\n\n const trackA11y = label\n ? { \"aria-labelledby\": labelId, \"aria-describedby\": descriptionId }\n : { \"aria-label\": distributionText };\n\n return (\n <div\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, \"segment-gap\": segmentGap })}\n >\n {label ? (\n <span className={styles.label} id={labelId}>\n {label}\n </span>\n ) : null}\n {label ? (\n <span id={descriptionId} className={styles.visuallyHidden}>\n {distributionText}\n </span>\n ) : null}\n {/* biome-ignore lint/a11y/useSemanticElements: distribution track is not a form fieldset; role=\"group\" matches WAI-ARIA grouping */}\n <div ref={ref} className={styles.track} role=\"group\" {...trackA11y}>\n {total > 0\n ? safe.map((seg, i) => {\n /* flex-grow \u043F\u043E \u0432\u0435\u0441\u0443 \u2014 \u043D\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F % \u0448\u0438\u0440\u0438\u043D\u044B \u043F\u0440\u0438 shrink-to-fit \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u0435 (playground stack). */\n return (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: segments are presentational bars in source order; no reorder/dnd\n key={i}\n className={styles.segment}\n style={{ flex: `${seg.value} 1 0%` }}\n {...toDataAttributes({ tone: seg.tone ?? \"accent\" })}\n title={seg.label}\n />\n );\n })\n : null}\n </div>\n </div>\n );\n },\n);\n\nSegmentedProgressBarRoot.displayName = \"SegmentedProgressBarRoot\";\n\nexport const SegmentedProgressBar = { Root: SegmentedProgressBarRoot };\n", "/* SegmentedProgressBar \u2014 Graphite: `fill-strong` track, proportional segments in accent / status fills. */\n\n.root {\n --seg-track-h: var(--prime-space-1);\n --seg-label-size: var(--prime-control-m-label-size);\n --seg-label-line-height: var(--prime-control-m-label-line-height);\n\n position: relative;\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-2);\n width: 100%;\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --seg-label-size: var(--prime-control-xs-label-size);\n --seg-label-line-height: var(--prime-control-xs-label-line-height);\n gap: var(--prime-space-1);\n}\n\n.root[data-size=\"s\"] {\n --seg-label-size: var(--prime-control-s-label-size);\n --seg-label-line-height: var(--prime-control-s-label-line-height);\n gap: var(--prime-space-1);\n}\n\n.root[data-size=\"l\"] {\n --seg-track-h: var(--prime-space-2);\n --seg-label-size: var(--prime-control-l-label-size);\n --seg-label-line-height: var(--prime-control-l-label-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --seg-track-h: var(--prime-space-2);\n --seg-label-size: var(--prime-control-xl-label-size);\n --seg-label-line-height: var(--prime-control-xl-label-line-height);\n}\n\n.label {\n min-width: 0;\n overflow: hidden;\n color: var(--prime-color-text-primary);\n font-size: var(--seg-label-size);\n line-height: var(--seg-label-line-height);\n font-weight: var(--prime-font-weight-medium);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.visuallyHidden {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.track {\n display: flex;\n width: 100%;\n min-height: var(--seg-track-h);\n overflow: hidden;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n}\n\n/* `hairline`: segments separated by a clear gap (one grid step) that shows the surface behind the bar. */\n.root[data-segment-gap=\"hairline\"] .track {\n gap: var(--prime-space-1);\n background: transparent;\n}\n\n.segment {\n box-sizing: border-box;\n min-width: 0;\n height: var(--seg-track-h);\n transition:\n flex-grow var(--prime-motion-duration-slow) var(--prime-motion-easing-standard),\n background-color var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.root[data-segment-gap=\"hairline\"] .segment {\n border-radius: var(--prime-radius-full);\n}\n\n.segment[data-tone=\"accent\"] {\n background: var(--prime-color-accent-default);\n}\n\n.segment[data-tone=\"success\"] {\n background: var(--prime-color-success-default);\n}\n\n.segment[data-tone=\"warning\"] {\n background: var(--prime-color-warning-default);\n}\n\n.segment[data-tone=\"danger\"] {\n background: var(--prime-color-danger-default);\n}\n\n.segment[data-tone=\"neutral\"] {\n background: var(--prime-color-fill-strong-hover);\n}\n", "import * as React from \"react\";\n\nimport { Label } from \"@/components/label/Label\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Slider.module.css\";\n\nexport type SliderRootProps = {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n onValueChange?: (value: number) => void;\n /** Visible label linked to the range input. Without it, set `aria-label`. */\n label?: React.ReactNode;\n /** Shows the current value at the end of the label row (tabular numbers). */\n showValue?: boolean;\n /** Formats the displayed value and `aria-valuetext` (e.g. `(v) => \\`${v} \u00B0C\\``). */\n formatValue?: (value: number) => string;\n size?: ControlSize;\n className?: string;\n \"aria-label\"?: string;\n};\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.min(max, Math.max(min, n));\n}\n\nfunction SliderRoot({\n value: valueProp,\n defaultValue,\n min: minProp,\n max: maxProp,\n step: stepProp,\n disabled,\n onValueChange,\n label,\n showValue = false,\n formatValue,\n size = \"m\",\n className,\n \"aria-label\": ariaLabel,\n}: SliderRootProps) {\n const min = minProp ?? 0;\n const max = maxProp ?? 100;\n const step = stepProp ?? 1;\n const initialDefault = defaultValue ?? min;\n const [value, setValue] = useControllableState({\n value: valueProp,\n defaultValue: clamp(initialDefault, min, max),\n onChange: onValueChange,\n });\n\n const id = React.useId();\n const safeValue = clamp(value, min, max);\n const percent = max > min ? ((safeValue - min) / (max - min)) * 100 : 0;\n const valueText = formatValue ? formatValue(safeValue) : String(safeValue);\n\n const applyValueFromInput = (el: HTMLInputElement) => {\n const next = Number.parseFloat(el.value);\n if (Number.isNaN(next)) {\n return;\n }\n setValue(next);\n };\n\n const handleRangeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n applyValueFromInput(e.currentTarget);\n };\n\n const handleRangeInput = (e: React.FormEvent<HTMLInputElement>) => {\n applyValueFromInput(e.currentTarget);\n };\n\n const showHeader = label != null || showValue;\n\n return (\n <div\n className={cx(styles.root, className)}\n style={{ \"--slider-percent\": `${percent}%` } as React.CSSProperties}\n {...toDataAttributes({ size, disabled: disabled || undefined })}\n >\n <ControlSizeProvider value={size}>\n {showHeader ? (\n <div className={styles.header}>\n {label != null ? (\n <Label.Root htmlFor={id} size={size} disabled={disabled} className={styles.label}>\n {label}\n </Label.Root>\n ) : (\n <span />\n )}\n {showValue ? (\n <output className={styles.value} htmlFor={id} aria-hidden=\"true\">\n {valueText}\n </output>\n ) : null}\n </div>\n ) : null}\n <input\n id={id}\n type=\"range\"\n className={styles.track}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n value={safeValue}\n onChange={handleRangeChange}\n onInput={handleRangeInput}\n aria-label={ariaLabel}\n aria-valuetext={formatValue ? valueText : undefined}\n />\n </ControlSizeProvider>\n </div>\n );\n}\n\nSliderRoot.displayName = \"Slider.Root\";\n\nexport const Slider = { Root: SliderRoot };\n", "/*\n * Native range input. Track = fill-strong, range = accent (gradient up to --slider-percent,\n * set inline from the value), thumb = control-thumb with overlay shadow.\n * Thumb size follows the choice size of the tier, label row follows the field label system.\n */\n.root {\n --slider-track-h: var(--prime-space-1);\n --slider-thumb-size: var(--prime-control-m-choice);\n --slider-label-gap: var(--prime-control-m-label-gap);\n --slider-value-size: var(--prime-control-m-label-size);\n --slider-value-line-height: var(--prime-control-m-label-line-height);\n --slider-track-bg: var(--prime-color-fill-strong);\n --slider-range-bg: var(--prime-color-accent-default);\n display: flex;\n flex-direction: column;\n gap: var(--slider-label-gap);\n width: 100%;\n min-width: 0;\n}\n\n.root[data-size=\"xs\"] {\n --slider-thumb-size: var(--prime-control-xs-choice);\n --slider-label-gap: var(--prime-control-xs-label-gap);\n --slider-value-size: var(--prime-control-xs-label-size);\n --slider-value-line-height: var(--prime-control-xs-label-line-height);\n}\n\n.root[data-size=\"s\"] {\n --slider-thumb-size: var(--prime-control-s-choice);\n --slider-label-gap: var(--prime-control-s-label-gap);\n --slider-value-size: var(--prime-control-s-label-size);\n --slider-value-line-height: var(--prime-control-s-label-line-height);\n}\n\n.root[data-size=\"l\"] {\n --slider-thumb-size: var(--prime-control-l-choice);\n --slider-label-gap: var(--prime-control-l-label-gap);\n --slider-value-size: var(--prime-control-l-label-size);\n --slider-value-line-height: var(--prime-control-l-label-line-height);\n}\n\n.root[data-size=\"xl\"] {\n --slider-track-h: var(--prime-space-2);\n --slider-thumb-size: var(--prime-control-xl-choice);\n --slider-label-gap: var(--prime-control-xl-label-gap);\n --slider-value-size: var(--prime-control-xl-label-size);\n --slider-value-line-height: var(--prime-control-xl-label-line-height);\n}\n\n.root[data-disabled=\"true\"] {\n --slider-track-bg: var(--prime-color-fill-muted);\n --slider-range-bg: var(--prime-color-text-disabled);\n}\n\n.header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.label {\n min-width: 0;\n}\n\n.value {\n flex-shrink: 0;\n font-family: var(--prime-font-family-sans);\n font-size: var(--slider-value-size);\n line-height: var(--slider-value-line-height);\n font-variant-numeric: tabular-nums;\n color: var(--prime-color-text-secondary);\n}\n\n.root[data-disabled=\"true\"] .value {\n color: var(--prime-color-text-disabled);\n}\n\n/* ---- input ---- */\n.track {\n -webkit-appearance: none;\n appearance: none;\n display: block;\n width: 100%;\n height: var(--slider-thumb-size);\n margin: 0;\n padding: 0;\n background: transparent;\n cursor: pointer;\n outline: none;\n}\n\n.track:disabled {\n cursor: not-allowed;\n}\n\n/* WebKit: track with accent range, thumb centred on it. */\n.track::-webkit-slider-runnable-track {\n height: var(--slider-track-h);\n border-radius: var(--prime-radius-full);\n background: linear-gradient(\n to right,\n var(--slider-range-bg) 0 var(--slider-percent, 0%),\n var(--slider-track-bg) var(--slider-percent, 0%) 100%\n );\n}\n\n.track::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n box-sizing: border-box;\n width: var(--slider-thumb-size);\n height: var(--slider-thumb-size);\n margin-top: calc((var(--slider-track-h) - var(--slider-thumb-size)) / 2);\n border: 0;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-control-thumb);\n /* Hairline edge: a white thumb on a white surface would otherwise be only a soft shadow. */\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--prime-color-border-default),\n var(--prime-shadow-overlay);\n transition:\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.track:not(:disabled):hover::-webkit-slider-thumb {\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--prime-color-border-default),\n var(--prime-shadow-overlay),\n 0 0 0 var(--prime-space-1) var(--prime-color-accent-soft);\n}\n\n.track:not(:disabled):active::-webkit-slider-thumb {\n transform: scale(1.1);\n}\n\n.track:focus-visible::-webkit-slider-thumb {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.track:disabled::-webkit-slider-thumb {\n box-shadow: none;\n background: var(--prime-color-fill-strong);\n}\n\n/* Firefox */\n.track::-moz-range-track {\n height: var(--slider-track-h);\n border: 0;\n border-radius: var(--prime-radius-full);\n background: var(--slider-track-bg);\n}\n\n.track::-moz-range-progress {\n height: var(--slider-track-h);\n border-radius: var(--prime-radius-full);\n background: var(--slider-range-bg);\n}\n\n.track::-moz-range-thumb {\n box-sizing: border-box;\n width: var(--slider-thumb-size);\n height: var(--slider-thumb-size);\n border: 0;\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-control-thumb);\n /* Hairline edge: a white thumb on a white surface would otherwise be only a soft shadow. */\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--prime-color-border-default),\n var(--prime-shadow-overlay);\n transition:\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n transform var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.track:not(:disabled):hover::-moz-range-thumb {\n box-shadow:\n inset 0 0 0 var(--prime-border-width) var(--prime-color-border-default),\n var(--prime-shadow-overlay),\n 0 0 0 var(--prime-space-1) var(--prime-color-accent-soft);\n}\n\n.track:not(:disabled):active::-moz-range-thumb {\n transform: scale(1.1);\n}\n\n.track:focus-visible::-moz-range-thumb {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.track:disabled::-moz-range-thumb {\n box-shadow: none;\n background: var(--prime-color-fill-strong);\n}\n", "import * as React from \"react\";\n\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { IconChevronRight } from \"@/icons\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Stepper.module.css\";\n\n/** Step state: derived from the Root `value` (before \u2192 `completed`, equal \u2192 `active`, after \u2192 `pending`) unless set on the step. */\nexport type StepperStepStatus = \"pending\" | \"active\" | \"completed\" | \"error\";\n\ntype StepperRootContextValue = {\n orientation: \"horizontal\" | \"vertical\";\n value: number;\n select: (index: number) => void;\n};\n\nconst [StepperRootProvider, useStepperRootContext] =\n createComponentContext<StepperRootContextValue>(\"Stepper\");\n\ntype StepperStepContextValue = { index: number; status: StepperStepStatus };\n\nconst [StepperStepProvider, useStepperStepContext] =\n createComponentContext<StepperStepContextValue>(\"Stepper.Step\");\n\n/** Index of a step, assigned by `Stepper.Root` from the order of its direct `Stepper.Step` children. */\nconst StepperIndexContext = React.createContext<number | null>(null);\n\nfunction deriveStatus(index: number, current: number): StepperStepStatus {\n if (index < current) return \"completed\";\n if (index === current) return \"active\";\n return \"pending\";\n}\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type StepperRootProps = {\n /** Default `vertical`. A horizontal stepper stacks vertically in containers narrower than 480px. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Current step (0-based), controlled. */\n value?: number;\n /** Initial step when uncontrolled. Default `0`. */\n defaultValue?: number;\n /** Called with the step index when a step is clicked. */\n onValueChange?: (index: number) => void;\n size?: ControlSize;\n /** `Stepper.Step` elements as direct children (an array from `map` is fine). */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.OlHTMLAttributes<HTMLOListElement>, \"children\" | \"defaultValue\" | \"onChange\">;\n\nfunction StepperRoot({\n orientation = \"vertical\",\n value: valueProp,\n defaultValue = 0,\n onValueChange,\n size = \"m\",\n children,\n className,\n ...rest\n}: StepperRootProps) {\n const [value, setValue] = useControllableState({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n const contextValue = React.useMemo(\n () => ({ orientation, value, select: setValue }),\n [orientation, value, setValue],\n );\n\n let nextIndex = 0;\n const items: React.ReactNode[] = [];\n for (const child of React.Children.toArray(children)) {\n if (!React.isValidElement(child) || child.type !== StepperStep) {\n items.push(child);\n continue;\n }\n const index = nextIndex;\n nextIndex += 1;\n if (orientation === \"horizontal\" && index > 0) {\n items.push(\n <li key={`separator-${child.key}`} className={styles.separator} aria-hidden=\"true\">\n <IconChevronRight className={styles.separatorIcon} strokeWidth={2} />\n </li>,\n );\n }\n items.push(\n <StepperIndexContext.Provider key={child.key} value={index}>\n {child}\n </StepperIndexContext.Provider>,\n );\n }\n\n return (\n <StepperRootProvider value={contextValue}>\n <ControlSizeProvider value={size}>\n <ol\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ orientation, size })}\n >\n {items}\n </ol>\n </ControlSizeProvider>\n </StepperRootProvider>\n );\n}\nStepperRoot.displayName = \"Stepper.Root\";\n\n// \u2500\u2500\u2500 Step \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type StepperStepProps = {\n /** Overrides the status derived from the Root `value` (e.g. `error`). */\n status?: StepperStepStatus;\n children: React.ReactNode;\n} & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"children\">;\n\nconst StepperStep = React.forwardRef<HTMLButtonElement, StepperStepProps>(function StepperStep(\n { status: statusProp, children, className, disabled, onClick, ...rest },\n ref,\n) {\n const { value, select } = useStepperRootContext();\n const index = React.useContext(StepperIndexContext);\n if (index === null) {\n throw new Error(\"Stepper.Step must be a direct child of Stepper.Root\");\n }\n const status = statusProp ?? deriveStatus(index, value);\n const stepContext = React.useMemo(() => ({ index, status }), [index, status]);\n\n return (\n <StepperStepProvider value={stepContext}>\n <li className={styles.item}>\n <button\n {...rest}\n ref={ref}\n type=\"button\"\n disabled={disabled}\n className={cx(styles.step, className)}\n {...toDataAttributes({ status, disabled: disabled || undefined })}\n aria-current={status === \"active\" ? \"step\" : undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) select(index);\n }}\n >\n {children}\n </button>\n </li>\n </StepperStepProvider>\n );\n});\nStepperStep.displayName = \"Stepper.Step\";\n\n// \u2500\u2500\u2500 Parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction CheckIcon() {\n return (\n <svg\n className={styles.check}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5.5 12.5l4.25 4.25L18.5 8\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type StepperIndicatorProps = {\n /** Replaces the default content (step number, or a check when completed). */\n children?: React.ReactNode;\n className?: string;\n};\n\nfunction StepperIndicator({ children, className }: StepperIndicatorProps) {\n const { status, index } = useStepperStepContext();\n return (\n <span className={cx(styles.indicator, className)} data-status={status} aria-hidden=\"true\">\n {children ?? (status === \"completed\" ? <CheckIcon /> : index + 1)}\n </span>\n );\n}\nStepperIndicator.displayName = \"Stepper.Indicator\";\n\nexport type StepperContentProps = {\n children: React.ReactNode;\n className?: string;\n};\n\n/** Text column: `Stepper.Title` and optional `Stepper.Description`. */\nfunction StepperContent({ children, className }: StepperContentProps) {\n return <span className={cx(styles.content, className)}>{children}</span>;\n}\nStepperContent.displayName = \"Stepper.Content\";\n\nexport type StepperTitleProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nfunction StepperTitle({ children, className }: StepperTitleProps) {\n return <span className={cx(styles.title, className)}>{children}</span>;\n}\nStepperTitle.displayName = \"Stepper.Title\";\n\nexport type StepperDescriptionProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nfunction StepperDescription({ children, className }: StepperDescriptionProps) {\n return <span className={cx(styles.description, className)}>{children}</span>;\n}\nStepperDescription.displayName = \"Stepper.Description\";\n\nexport type StepperArrowProps = {\n className?: string;\n};\n\n/** Trailing chevron for vertical steps that open a page or panel. */\nfunction StepperArrow({ className }: StepperArrowProps) {\n return <IconChevronRight className={cx(styles.arrow, className)} strokeWidth={2} aria-hidden />;\n}\nStepperArrow.displayName = \"Stepper.Arrow\";\n\nexport const Stepper = {\n Root: StepperRoot,\n Step: StepperStep,\n Indicator: StepperIndicator,\n Content: StepperContent,\n Title: StepperTitle,\n Description: StepperDescription,\n Arrow: StepperArrow,\n};\n", "/*\n * Stepper \u2014 Graphite. Semantic `ol` of step buttons.\n * Indicator: pending = fill-muted, active = accent with soft halo, completed = accent-soft + check,\n * error = danger-soft. Horizontal: chevron separators between steps, stacks vertically under 480px\n * of container width. Vertical: full-width rows, active row on fill-subtle.\n */\n\n.root {\n --st-circle: var(--prime-control-xs-height);\n --st-check: var(--prime-icon-s);\n --st-chevron: var(--prime-icon-s);\n --st-ind-size: var(--prime-text-caption-size);\n --st-ind-line-height: var(--prime-text-caption-line-height);\n --st-text: var(--prime-control-m-text-size);\n --st-line-height: var(--prime-control-m-line-height);\n --st-support: var(--prime-control-m-hint-size);\n --st-support-line-height: var(--prime-control-m-hint-line-height);\n --st-radius: var(--prime-control-m-radius);\n --st-gap: var(--prime-space-3);\n --st-v-pad: var(--prime-space-2);\n --st-root-h-gap: var(--prime-space-4);\n --st-root-v-gap: var(--prime-space-1);\n\n /* Fill the available width: an inline-size container has no intrinsic width and would\n * collapse to 0 inside shrink-wrapped / flex parents. */\n container-type: inline-size;\n inline-size: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --st-circle: var(--prime-space-5);\n --st-check: var(--prime-icon-xs);\n --st-chevron: var(--prime-icon-xs);\n --st-text: var(--prime-control-xs-text-size);\n --st-line-height: var(--prime-control-xs-line-height);\n --st-support: var(--prime-control-xs-hint-size);\n --st-support-line-height: var(--prime-control-xs-hint-line-height);\n --st-radius: var(--prime-control-xs-radius);\n --st-gap: var(--prime-space-2);\n --st-v-pad: var(--prime-space-1);\n --st-root-h-gap: var(--prime-space-2);\n}\n\n.root[data-size=\"s\"] {\n --st-circle: var(--prime-space-6);\n --st-check: var(--prime-icon-xs);\n --st-chevron: var(--prime-icon-xs);\n --st-text: var(--prime-control-s-text-size);\n --st-line-height: var(--prime-control-s-line-height);\n --st-support: var(--prime-control-s-hint-size);\n --st-support-line-height: var(--prime-control-s-hint-line-height);\n --st-radius: var(--prime-control-s-radius);\n --st-gap: var(--prime-space-2);\n --st-root-h-gap: var(--prime-space-3);\n}\n\n.root[data-size=\"l\"] {\n --st-circle: var(--prime-control-s-height);\n --st-ind-size: var(--prime-text-body-s-size);\n --st-ind-line-height: var(--prime-text-body-s-line-height);\n --st-text: var(--prime-control-l-text-size);\n --st-line-height: var(--prime-control-l-line-height);\n --st-support: var(--prime-control-l-hint-size);\n --st-support-line-height: var(--prime-control-l-hint-line-height);\n --st-radius: var(--prime-control-l-radius);\n --st-v-pad: var(--prime-space-3);\n --st-root-h-gap: var(--prime-space-5);\n}\n\n.root[data-size=\"xl\"] {\n --st-circle: var(--prime-control-m-height);\n --st-check: var(--prime-icon-m);\n --st-chevron: var(--prime-icon-m);\n --st-ind-size: var(--prime-text-body-s-size);\n --st-ind-line-height: var(--prime-text-body-s-line-height);\n --st-text: var(--prime-control-xl-text-size);\n --st-line-height: var(--prime-control-xl-line-height);\n --st-support: var(--prime-control-xl-hint-size);\n --st-support-line-height: var(--prime-control-xl-hint-line-height);\n --st-radius: var(--prime-control-xl-radius);\n --st-gap: var(--prime-space-4);\n --st-v-pad: var(--prime-space-3);\n --st-root-h-gap: var(--prime-space-6);\n --st-root-v-gap: var(--prime-space-2);\n}\n\n/* ---------- Layout ---------- */\n\n.root[data-orientation=\"horizontal\"] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--st-root-v-gap) var(--st-root-h-gap);\n}\n\n.root[data-orientation=\"vertical\"] {\n display: flex;\n flex-direction: column;\n gap: var(--st-root-v-gap);\n}\n\n.item {\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.root[data-orientation=\"horizontal\"] .item {\n flex: 0 1 auto;\n}\n\n.separator {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style: none;\n color: var(--prime-color-text-placeholder);\n}\n\n.separatorIcon {\n flex-shrink: 0;\n width: var(--st-chevron);\n height: var(--st-chevron);\n}\n\n/* ---------- Step ---------- */\n\n.step {\n appearance: none;\n box-sizing: border-box;\n min-width: 0;\n margin: 0;\n border: 0;\n border-radius: var(--st-radius);\n background: transparent;\n color: var(--prime-color-text-secondary);\n font: inherit;\n font-size: var(--st-text);\n line-height: var(--st-line-height);\n font-weight: var(--prime-font-weight-regular);\n text-align: start;\n cursor: pointer;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.root[data-orientation=\"horizontal\"] .step {\n display: flex;\n align-items: center;\n gap: var(--st-gap);\n padding: var(--prime-space-1);\n}\n\n.root[data-orientation=\"horizontal\"] .step:hover:not(:disabled) {\n color: var(--prime-color-text-primary);\n}\n\n.root[data-orientation=\"vertical\"] .step {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--st-gap);\n width: 100%;\n padding: var(--st-v-pad);\n}\n\n.root[data-orientation=\"vertical\"] .step:hover:not(:disabled) {\n background: var(--prime-color-fill-subtle);\n}\n\n.root[data-orientation=\"vertical\"] .step:active:not(:disabled) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.step[data-status=\"active\"],\n.step[data-status=\"completed\"] {\n color: var(--prime-color-text-primary);\n}\n\n.root[data-orientation=\"vertical\"] .step[data-status=\"active\"] {\n background: var(--prime-color-fill-subtle);\n}\n\n.step[data-status=\"error\"] {\n color: var(--prime-color-danger-text);\n}\n\n.root[data-orientation=\"vertical\"] .step[data-status=\"error\"] {\n background: var(--prime-color-danger-soft);\n}\n\n.step:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.step:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* ---------- Indicator ---------- */\n\n.indicator {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--st-circle);\n height: var(--st-circle);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-secondary);\n font-size: var(--st-ind-size);\n line-height: var(--st-ind-line-height);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n transition:\n background-color var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.indicator[data-status=\"active\"] {\n background: var(--prime-color-accent-default);\n color: var(--prime-color-accent-fg);\n box-shadow: 0 0 0 var(--prime-space-1) var(--prime-color-accent-soft);\n}\n\n.indicator[data-status=\"completed\"] {\n background: var(--prime-color-accent-soft);\n color: var(--prime-color-accent-text);\n}\n\n.indicator[data-status=\"error\"] {\n background: var(--prime-color-danger-soft);\n color: var(--prime-color-danger-text);\n}\n\n.root[data-orientation=\"vertical\"] .indicator[data-status=\"error\"] {\n background: var(--prime-color-danger-default);\n color: var(--prime-color-danger-fg);\n}\n\n.step:disabled .indicator {\n background: var(--prime-color-fill-muted);\n color: var(--prime-color-text-disabled);\n box-shadow: none;\n}\n\n.check {\n display: block;\n width: var(--st-check);\n height: var(--st-check);\n}\n\n/* ---------- Text ---------- */\n\n.content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--prime-space-0);\n min-width: 0;\n}\n\n.title {\n font-size: var(--st-text);\n line-height: var(--st-line-height);\n font-weight: var(--prime-font-weight-medium);\n color: inherit;\n overflow-wrap: anywhere;\n}\n\n.description {\n font-size: var(--st-support);\n line-height: var(--st-support-line-height);\n font-weight: var(--prime-font-weight-regular);\n color: var(--prime-color-text-muted);\n overflow-wrap: anywhere;\n}\n\n.arrow {\n flex-shrink: 0;\n width: var(--st-chevron);\n height: var(--st-chevron);\n color: var(--prime-color-text-placeholder);\n}\n\n/* ---------- Narrow container: horizontal \u2192 vertical ---------- */\n\n@container (max-width: 30rem) {\n .root[data-orientation=\"horizontal\"] .item {\n flex-basis: 100%;\n }\n\n .root[data-orientation=\"horizontal\"] .separator {\n display: none;\n }\n\n .root[data-orientation=\"horizontal\"] .step {\n width: 100%;\n padding: var(--st-v-pad);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .indicator {\n transition: none;\n }\n}\n", "import * as React from \"react\";\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize } from \"@/internal/states\";\nimport { type FieldDescriptions, useFieldDescriptions } from \"@/internal/useFieldDescriptions\";\n\nimport styles from \"./Switch.module.css\";\n\ntype InputPassthrough = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\" | \"checked\" | \"defaultChecked\" | \"onChange\" | \"children\"\n>;\n\ntype SwitchContextValue = FieldDescriptions & {\n inputId: string;\n size: ControlSize;\n inputRef: React.Ref<HTMLInputElement>;\n checked: boolean;\n invalid: boolean;\n disabled: boolean;\n readOnly: boolean;\n handleChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n inputPropsRef: React.MutableRefObject<InputPassthrough>;\n};\n\nconst [SwitchProvider, useSwitchContext] = createComponentContext<SwitchContextValue>(\"Switch\");\n\nexport type SwitchRootProps = InputPassthrough & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** Invalid state; also set while a `Switch.Error` is mounted. */\n invalid?: boolean;\n size?: ControlSize;\n /** Stretch to the container width. By default the field is as wide as its content. */\n fullWidth?: boolean;\n children?: React.ReactNode;\n};\n\nconst SwitchRoot = React.forwardRef<HTMLInputElement, SwitchRootProps>(\n (\n {\n id,\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n invalid: invalidProp = false,\n size = \"m\",\n fullWidth = false,\n disabled = false,\n readOnly = false,\n className,\n \"aria-describedby\": ariaDescribedBy,\n children,\n ...inputRest\n },\n ref,\n ) => {\n const rawId = React.useId();\n const inputId = id ?? rawId;\n const descriptions = useFieldDescriptions(inputId, ariaDescribedBy);\n const invalid = invalidProp || descriptions.hasError;\n\n const [checked, setChecked] = useControllableState<boolean>({\n value: checkedProp,\n defaultValue: defaultChecked,\n onChange: onCheckedChange,\n });\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (readOnly) return;\n setChecked(event.target.checked);\n },\n [readOnly, setChecked],\n );\n\n const inputPropsRef = React.useRef<InputPassthrough>(inputRest);\n inputPropsRef.current = inputRest;\n\n const ctxValue = React.useMemo(\n () => ({\n ...descriptions,\n inputId,\n size,\n inputRef: ref,\n checked,\n invalid,\n disabled,\n readOnly,\n handleChange,\n inputPropsRef,\n }),\n [descriptions, inputId, size, ref, checked, invalid, disabled, readOnly, handleChange],\n );\n\n return (\n <SwitchProvider value={ctxValue}>\n <ControlSizeProvider value={size}>\n <div\n className={cx(styles.field, className)}\n {...toDataAttributes({\n size,\n state: checked ? \"checked\" : \"unchecked\",\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n \"full-width\": fullWidth || undefined,\n })}\n >\n {children}\n </div>\n </ControlSizeProvider>\n </SwitchProvider>\n );\n },\n);\n\nSwitchRoot.displayName = \"SwitchRoot\";\n\n// \u2500\u2500\u2500 Label \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SwitchLabelProps = {\n children?: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLLabelElement>, \"htmlFor\" | \"size\">;\n\nconst SwitchLabel = React.forwardRef<HTMLLabelElement, SwitchLabelProps>(function SwitchLabel(\n { children, className, ...rest },\n ref,\n) {\n const {\n inputId,\n inputRef,\n checked,\n invalid,\n disabled,\n readOnly,\n describedBy,\n handleChange,\n inputPropsRef,\n size,\n } = useSwitchContext();\n\n return (\n <Label.Root\n ref={ref}\n htmlFor={inputId}\n size={size}\n disabled={disabled}\n className={cx(styles.labelRow, className)}\n {...rest}\n >\n <span className={styles.controlCell}>\n <input\n {...inputPropsRef.current}\n ref={inputRef}\n id={inputId}\n className={styles.input}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n aria-checked={checked}\n aria-invalid={invalid || undefined}\n aria-readonly={readOnly || undefined}\n aria-describedby={describedBy}\n onChange={handleChange}\n />\n <span className={styles.track} aria-hidden=\"true\" />\n </span>\n {children != null ? <span className={styles.text}>{children}</span> : null}\n </Label.Root>\n );\n});\n\nSwitchLabel.displayName = \"SwitchLabel\";\n\n// \u2500\u2500\u2500 Hint / Error \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SwitchHintProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLParagraphElement>, \"id\">;\n\nfunction SwitchHint({ children, className, ...rest }: SwitchHintProps) {\n const { hintId, registerHint, size, disabled } = useSwitchContext();\n React.useLayoutEffect(registerHint, [registerHint]);\n\n return (\n <Hint.Root\n id={hintId}\n size={size}\n disabled={disabled}\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nSwitchHint.displayName = \"SwitchHint\";\n\nexport type SwitchErrorProps = SwitchHintProps;\n\nfunction SwitchError({ children, className, ...rest }: SwitchErrorProps) {\n const { errorId, registerError, size } = useSwitchContext();\n React.useLayoutEffect(registerError, [registerError]);\n\n return (\n <Hint.Root\n id={errorId}\n size={size}\n invalid\n className={cx(styles.hintSlot, className)}\n {...rest}\n >\n {children}\n </Hint.Root>\n );\n}\n\nSwitchError.displayName = \"SwitchError\";\n\nexport const Switch = {\n Root: SwitchRoot,\n Label: SwitchLabel,\n Hint: SwitchHint,\n Error: SwitchError,\n};\n", "/*\n * Same choice layout as Checkbox/Radio (grid [control][text] / [ ][hint], label row as subgrid).\n * Track/thumb from `--prime-switch-<tier>-*`. Thumb inset = (height \u2212 thumb) / 2,\n * travel = width \u2212 height.\n */\n.field {\n --prime-switch-w: var(--prime-switch-m-width);\n --prime-switch-h: var(--prime-switch-m-height);\n --prime-switch-thumb: var(--prime-switch-m-thumb);\n --prime-switch-gap: var(--prime-control-m-gap);\n --prime-switch-text: var(--prime-control-m-text-size);\n --prime-switch-line-height: var(--prime-control-m-line-height);\n --prime-switch-inset: calc((var(--prime-switch-h) - var(--prime-switch-thumb)) / 2);\n --prime-switch-travel: calc(var(--prime-switch-w) - var(--prime-switch-h));\n box-sizing: border-box;\n /* Shrink to content; text still wraps within the container. `fullWidth` stretches the field. */\n width: fit-content;\n max-width: 100%;\n min-width: 0;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n column-gap: var(--prime-switch-gap);\n row-gap: 0;\n align-content: start;\n}\n\n.field[data-full-width=\"true\"] {\n width: 100%;\n}\n\n.field[data-size=\"xs\"] {\n --prime-switch-w: var(--prime-switch-xs-width);\n --prime-switch-h: var(--prime-switch-xs-height);\n --prime-switch-thumb: var(--prime-switch-xs-thumb);\n --prime-switch-gap: var(--prime-control-xs-gap);\n --prime-switch-text: var(--prime-control-xs-text-size);\n --prime-switch-line-height: var(--prime-control-xs-line-height);\n}\n\n.field[data-size=\"s\"] {\n --prime-switch-w: var(--prime-switch-s-width);\n --prime-switch-h: var(--prime-switch-s-height);\n --prime-switch-thumb: var(--prime-switch-s-thumb);\n --prime-switch-gap: var(--prime-control-s-gap);\n --prime-switch-text: var(--prime-control-s-text-size);\n --prime-switch-line-height: var(--prime-control-s-line-height);\n}\n\n.field[data-size=\"l\"] {\n --prime-switch-w: var(--prime-switch-l-width);\n --prime-switch-h: var(--prime-switch-l-height);\n --prime-switch-thumb: var(--prime-switch-l-thumb);\n --prime-switch-gap: var(--prime-control-l-gap);\n --prime-switch-text: var(--prime-control-l-text-size);\n --prime-switch-line-height: var(--prime-control-l-line-height);\n}\n\n.field[data-size=\"xl\"] {\n --prime-switch-w: var(--prime-switch-xl-width);\n --prime-switch-h: var(--prime-switch-xl-height);\n --prime-switch-thumb: var(--prime-switch-xl-thumb);\n --prime-switch-gap: var(--prime-control-xl-gap);\n --prime-switch-text: var(--prime-control-xl-text-size);\n --prime-switch-line-height: var(--prime-control-xl-line-height);\n}\n\n.field .labelRow {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: subgrid;\n column-gap: var(--prime-switch-gap);\n align-items: start;\n width: 100%;\n font-size: var(--prime-switch-text);\n line-height: var(--prime-switch-line-height);\n font-weight: var(--prime-font-weight-regular);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n}\n\n.controlCell {\n position: relative;\n display: flex;\n align-items: center;\n height: max(var(--prime-switch-h), var(--prime-switch-line-height));\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.track {\n position: relative;\n box-sizing: border-box;\n flex-shrink: 0;\n display: block;\n width: var(--prime-switch-w);\n height: var(--prime-switch-h);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-fill-strong);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n transition:\n background-color var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.track::before {\n content: \"\";\n position: absolute;\n top: var(--prime-switch-inset);\n left: var(--prime-switch-inset);\n width: var(--prime-switch-thumb);\n height: var(--prime-switch-thumb);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-control-thumb);\n box-shadow: var(--prime-shadow-raised);\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.text {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* ---- hover ---- */\n.labelRow:hover .track {\n background: var(--prime-color-fill-strong-hover);\n}\n\n/* ---- on ---- */\n.input:checked + .track {\n background: var(--prime-color-accent-default);\n}\n\n.labelRow:hover .input:checked + .track {\n background: var(--prime-color-accent-hover);\n}\n\n.input:checked + .track::before {\n transform: translateX(var(--prime-switch-travel));\n}\n\n/* ---- focus-visible ---- */\n.input:focus-visible + .track {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* ---- invalid ---- */\n.field[data-invalid=\"true\"] .input:not(:checked) + .track {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.field[data-invalid=\"true\"] .input:focus-visible + .track {\n outline-color: var(--prime-color-danger-border);\n}\n\n/* ---- read-only: state is visible, interaction is not ---- */\n.field:has(.input[aria-readonly=\"true\"]) .labelRow {\n cursor: default;\n}\n\n.field:has(.input[aria-readonly=\"true\"]) .labelRow:hover .track {\n background: var(--prime-color-fill-strong);\n}\n\n.field:has(.input[aria-readonly=\"true\"]) .labelRow:hover .input:checked + .track {\n background: var(--prime-color-accent-default);\n}\n\n/* ---- disabled (not dimmed with opacity: fills carry the state) ---- */\n.field[data-disabled=\"true\"] .labelRow {\n cursor: not-allowed;\n}\n\n.field[data-disabled=\"true\"] .track,\n.field[data-disabled=\"true\"] .labelRow:hover .track {\n background: var(--prime-color-fill-muted);\n box-shadow: none;\n}\n\n.field[data-disabled=\"true\"] .input:checked + .track,\n.field[data-disabled=\"true\"] .labelRow:hover .input:checked + .track {\n background: var(--prime-color-accent-soft);\n}\n\n.field[data-disabled=\"true\"] .track::before {\n box-shadow: none;\n}\n\n.hintSlot {\n grid-column: 2;\n min-width: 0;\n}\n", "import * as React from \"react\";\n\nimport { Badge } from \"@/components/badge/Badge\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\n\nimport styles from \"./Tabs.module.css\";\n\ntype TabsContextValue = {\n activeValue: string;\n onSelect: (value: string) => void;\n orientation: \"horizontal\" | \"vertical\";\n rootId: string;\n size: ControlSize;\n};\n\nconst [TabsProvider, useTabsContext] = createComponentContext<TabsContextValue>(\"Tabs\");\n\n/** Ids of the trigger's text parts, used to keep the description out of the accessible name. */\ntype TriggerContextValue = { triggerId: string };\n\nconst TriggerContext = React.createContext<TriggerContextValue | null>(null);\n\nfunction tabId(rootId: string, value: string) {\n return `prime-ui-kit-tab-${rootId}-${value}`;\n}\n\nfunction panelId(rootId: string, value: string) {\n return `prime-ui-kit-panel-${rootId}-${value}`;\n}\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TabsRootProps = {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Default `horizontal`. A vertical list stacks above the panel in containers narrower than 600px. */\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"children\">;\n\nfunction TabsRoot({\n value,\n defaultValue = \"\",\n onValueChange,\n orientation = \"horizontal\",\n size = \"m\",\n children,\n className,\n ...rest\n}: TabsRootProps) {\n const rootId = React.useId();\n\n const [activeValue, setActiveValue] = useControllableState({\n value,\n defaultValue,\n onChange: onValueChange,\n });\n\n const contextValue = React.useMemo<TabsContextValue>(\n () => ({ activeValue, onSelect: setActiveValue, orientation, rootId, size }),\n [activeValue, setActiveValue, orientation, rootId, size],\n );\n\n return (\n <TabsProvider value={contextValue}>\n <div\n {...rest}\n className={cx(styles.root, className)}\n {...toDataAttributes({ orientation, size })}\n >\n <div className={styles.layout}>{children}</div>\n </div>\n </TabsProvider>\n );\n}\nTabsRoot.displayName = \"TabsRoot\";\n\n// \u2500\u2500\u2500 List \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TabsListProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">;\n\ntype IndicatorRect = { left: number; top: number; width: number; height: number };\n\nconst EMPTY_RECT: IndicatorRect = { left: 0, top: 0, width: 0, height: 0 };\n\nfunction TabsList({ children, className, ...rest }: TabsListProps) {\n const { orientation, activeValue, onSelect, size } = useTabsContext();\n const listRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<IndicatorRect>(EMPTY_RECT);\n const [overflow, setOverflow] = React.useState({ start: false, end: false });\n\n const updateOverflow = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return;\n const maxScroll = list.scrollWidth - list.clientWidth;\n const start = list.scrollLeft > 1;\n const end = maxScroll - list.scrollLeft > 1;\n setOverflow((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n const updateIndicator = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return;\n updateOverflow();\n const active = list.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]');\n let next = EMPTY_RECT;\n if (active) {\n next = {\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n };\n // The underline bar spans the trigger's content box so it lines up with the text.\n if (orientation === \"horizontal\") {\n const style = getComputedStyle(active);\n const padStart = Number.parseFloat(style.paddingLeft) || 0;\n const padEnd = Number.parseFloat(style.paddingRight) || 0;\n next = { ...next, left: next.left + padStart, width: next.width - padStart - padEnd };\n }\n }\n setIndicator((prev) =>\n prev.left === next.left &&\n prev.top === next.top &&\n prev.width === next.width &&\n prev.height === next.height\n ? prev\n : next,\n );\n }, [updateOverflow, orientation]);\n\n React.useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n\n updateIndicator();\n\n const mo = new MutationObserver(updateIndicator);\n mo.observe(list, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"aria-selected\", \"data-disabled\"],\n });\n\n let ro: ResizeObserver | undefined;\n if (typeof ResizeObserver !== \"undefined\") {\n ro = new ResizeObserver(updateIndicator);\n ro.observe(list);\n }\n\n return () => {\n mo.disconnect();\n ro?.disconnect();\n };\n }, [updateIndicator]);\n\n // Keep the active tab visible inside a scrolling list.\n React.useEffect(() => {\n const list = listRef.current;\n if (!list || !activeValue) return;\n const active = list.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]');\n if (!active || typeof active.scrollIntoView !== \"function\") return;\n if (list.scrollWidth <= list.clientWidth) return;\n const reduceMotion =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n active.scrollIntoView({\n block: \"nearest\",\n inline: \"nearest\",\n behavior: reduceMotion ? \"auto\" : \"smooth\",\n });\n }, [activeValue]);\n\n // Horizontal: a bar on the list edge under the text. Vertical: a pill behind the active item.\n const isBar = orientation === \"horizontal\";\n const hasIndicator = indicator.width > 0 && indicator.height > 0;\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {\n const tabs = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n '[role=\"tab\"]:not([data-disabled=\"true\"])',\n ),\n );\n if (tabs.length === 0) return;\n\n const currentIndex = tabs.findIndex((tab) => tab.dataset.value === activeValue);\n // A vertical list may be shown as a horizontal row on narrow containers: accept both axes.\n const prevKeys = orientation === \"horizontal\" ? [\"ArrowLeft\"] : [\"ArrowUp\", \"ArrowLeft\"];\n const nextKeys = orientation === \"horizontal\" ? [\"ArrowRight\"] : [\"ArrowDown\", \"ArrowRight\"];\n\n let target: HTMLButtonElement | undefined;\n if (nextKeys.includes(event.key)) {\n target = tabs[(currentIndex + 1) % tabs.length];\n } else if (prevKeys.includes(event.key)) {\n target = tabs[(currentIndex - 1 + tabs.length) % tabs.length];\n } else if (event.key === \"Home\") {\n target = tabs[0];\n } else if (event.key === \"End\") {\n target = tabs[tabs.length - 1];\n }\n\n if (target) {\n event.preventDefault();\n onSelect(target.dataset.value ?? \"\");\n target.focus();\n }\n }\n\n return (\n <div\n {...rest}\n ref={listRef}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cx(styles.list, className)}\n {...toDataAttributes({\n indicator: isBar ? \"bar\" : \"pill\",\n \"overflow-start\": overflow.start || undefined,\n \"overflow-end\": overflow.end || undefined,\n })}\n onKeyDown={handleKeyDown}\n onScroll={updateOverflow}\n >\n {/* First in DOM order so it always paints below the triggers. */}\n <div\n className={cx(styles.indicator, isBar ? styles.indicatorBar : styles.indicatorPill)}\n style={\n isBar\n ? { transform: `translateX(${indicator.left}px)`, width: indicator.width }\n : {\n transform: `translate(${indicator.left}px, ${indicator.top}px)`,\n width: indicator.width,\n height: indicator.height,\n }\n }\n aria-hidden=\"true\"\n data-visible={hasIndicator ? \"true\" : \"false\"}\n />\n <ControlSizeProvider value={size}>{children}</ControlSizeProvider>\n </div>\n );\n}\nTabsList.displayName = \"TabsList\";\n\n// \u2500\u2500\u2500 Trigger \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TabsTriggerProps = {\n value: string;\n disabled?: boolean;\n /**\n * Plain text, or parts: `Tabs.Icon`, `Tabs.Label`, `Tabs.Count`, `Tabs.Description`.\n * A `Tabs.Description` makes the trigger two-line and becomes its accessible description.\n */\n children: React.ReactNode;\n className?: string;\n} & Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"value\" | \"children\" | \"type\" | \"role\" | \"onClick\"\n>;\n\nfunction hasChildOfType(children: React.ReactNode, type: React.ElementType): boolean {\n return React.Children.toArray(children).some(\n (child) => React.isValidElement(child) && child.type === type,\n );\n}\n\n/** Plain text children become a `Tabs.Label` so they get truncation and a stable bold width. */\nfunction wrapText(children: React.ReactNode): React.ReactNode {\n return React.Children.map(children, (child) =>\n typeof child === \"string\" || typeof child === \"number\" ? (\n String(child).trim() === \"\" ? (\n child\n ) : (\n <TabsLabel>{child}</TabsLabel>\n )\n ) : (\n child\n ),\n );\n}\n\nfunction TabsTrigger({ value, disabled = false, children, className, ...rest }: TabsTriggerProps) {\n const { activeValue, onSelect, rootId } = useTabsContext();\n const isSelected = activeValue === value;\n const id = tabId(rootId, value);\n const twoLine = hasChildOfType(children, TabsDescription);\n const hasCount = hasChildOfType(children, TabsCount);\n const triggerContext = React.useMemo(() => ({ triggerId: id }), [id]);\n\n return (\n <button\n {...rest}\n role=\"tab\"\n id={id}\n aria-selected={isSelected}\n aria-controls={panelId(rootId, value)}\n aria-labelledby={twoLine ? cx(`${id}-label`, hasCount && `${id}-count`) : undefined}\n aria-describedby={twoLine ? `${id}-description` : undefined}\n tabIndex={isSelected ? 0 : -1}\n data-value={value}\n {...toDataAttributes({\n state: isSelected ? \"active\" : \"inactive\",\n disabled: disabled || undefined,\n \"two-line\": twoLine || undefined,\n })}\n disabled={disabled}\n className={cx(styles.tab, className)}\n onClick={() => onSelect(value)}\n type=\"button\"\n >\n <TriggerContext.Provider value={triggerContext}>{wrapText(children)}</TriggerContext.Provider>\n </button>\n );\n}\nTabsTrigger.displayName = \"TabsTrigger\";\n\n// \u2500\u2500\u2500 Trigger parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TabsIconProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nfunction TabsIcon({ children, className, ...rest }: TabsIconProps) {\n return (\n <span className={cx(styles.icon, className)} aria-hidden=\"true\" {...rest}>\n {children}\n </span>\n );\n}\nTabsIcon.displayName = \"TabsIcon\";\n\nexport type TabsLabelProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/**\n * Trigger title; truncates with an ellipsis in a constrained row. Text labels reserve the width of\n * the medium weight, so the row does not shift when a tab becomes active.\n */\nfunction TabsLabel({ children, className, ...rest }: TabsLabelProps) {\n const trigger = React.useContext(TriggerContext);\n const text = typeof children === \"string\" || typeof children === \"number\" ? String(children) : \"\";\n return (\n <span\n id={trigger ? `${trigger.triggerId}-label` : undefined}\n className={cx(styles.label, className)}\n data-text={text || undefined}\n {...rest}\n >\n <span className={styles.labelText}>{children}</span>\n </span>\n );\n}\nTabsLabel.displayName = \"TabsLabel\";\n\nexport type TabsCountProps = {\n /** Badge hue. Default `gray`. */\n color?: PaletteColor;\n children: React.ReactNode;\n className?: string;\n};\n\n/** Counter next to the label: a soft badge one tier below the tabs size. */\nfunction TabsCount({ color = \"gray\", children, className }: TabsCountProps) {\n const trigger = React.useContext(TriggerContext);\n return (\n <Badge.Root\n id={trigger ? `${trigger.triggerId}-count` : undefined}\n color={color}\n className={cx(styles.count, className)}\n >\n {children}\n </Badge.Root>\n );\n}\nTabsCount.displayName = \"TabsCount\";\n\nexport type TabsDescriptionProps = {\n /** Muted second line; wrap a key value in `<strong>` to emphasize it. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\nfunction TabsDescription({ children, className, ...rest }: TabsDescriptionProps) {\n const trigger = React.useContext(TriggerContext);\n return (\n <span\n id={trigger ? `${trigger.triggerId}-description` : undefined}\n className={cx(styles.description, className)}\n {...rest}\n >\n {children}\n </span>\n );\n}\nTabsDescription.displayName = \"TabsDescription\";\n\n// \u2500\u2500\u2500 Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TabsPanelProps = {\n value: string;\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">;\n\nfunction TabsPanel({ value, children, className, ...rest }: TabsPanelProps) {\n const { activeValue, rootId } = useTabsContext();\n if (activeValue !== value) return null;\n\n return (\n <div\n {...rest}\n role=\"tabpanel\"\n id={panelId(rootId, value)}\n aria-labelledby={tabId(rootId, value)}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: WAI-ARIA APG \u2014 a tabpanel is focusable so keyboard users can reach its content\n tabIndex={0}\n className={cx(styles.panel, className)}\n >\n {children}\n </div>\n );\n}\nTabsPanel.displayName = \"TabsPanel\";\n\nexport const Tabs = {\n Root: TabsRoot,\n List: TabsList,\n Trigger: TabsTrigger,\n Icon: TabsIcon,\n Label: TabsLabel,\n Count: TabsCount,\n Description: TabsDescription,\n Panel: TabsPanel,\n};\n", "/*\n * Tabs \u2014 Graphite. Navigation between content panels.\n * Horizontal: text tabs over a hairline; a 2px accent bar under the active text slides between\n * triggers. Vertical: rounded items without a rail; the active item is a `fill-muted` pill with a\n * short accent mark. Stacks into a scrolling row under 600px of container width.\n * Two-line triggers (with `Tabs.Description`) size to content with a minimum width.\n * Heights follow control tiers so Tabs line up with Button / Input of the same size.\n */\n\n.root {\n --tabs-height: var(--prime-control-m-height);\n --tabs-text-size: var(--prime-control-m-text-size);\n --tabs-line-height: var(--prime-control-m-line-height);\n --tabs-gap: var(--prime-control-m-gap);\n --tabs-icon: var(--prime-control-m-icon);\n --tabs-radius: var(--prime-control-m-radius);\n --tabs-pad-x: var(--prime-control-m-padding-x);\n --tabs-item-gap: var(--prime-space-5);\n --tabs-two-line-min: calc(4 * var(--tabs-height));\n\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --tabs-height: var(--prime-control-xs-height);\n --tabs-text-size: var(--prime-control-xs-text-size);\n --tabs-line-height: var(--prime-control-xs-line-height);\n --tabs-gap: var(--prime-control-xs-gap);\n --tabs-icon: var(--prime-control-xs-icon);\n --tabs-radius: var(--prime-control-xs-radius);\n --tabs-pad-x: var(--prime-control-xs-padding-x);\n --tabs-item-gap: var(--prime-space-3);\n}\n\n.root[data-size=\"s\"] {\n --tabs-height: var(--prime-control-s-height);\n --tabs-text-size: var(--prime-control-s-text-size);\n --tabs-line-height: var(--prime-control-s-line-height);\n --tabs-gap: var(--prime-control-s-gap);\n --tabs-icon: var(--prime-control-s-icon);\n --tabs-radius: var(--prime-control-s-radius);\n --tabs-pad-x: var(--prime-control-s-padding-x);\n --tabs-item-gap: var(--prime-space-4);\n}\n\n.root[data-size=\"l\"] {\n --tabs-height: var(--prime-control-l-height);\n --tabs-text-size: var(--prime-control-l-text-size);\n --tabs-line-height: var(--prime-control-l-line-height);\n --tabs-gap: var(--prime-control-l-gap);\n --tabs-icon: var(--prime-control-l-icon);\n --tabs-radius: var(--prime-control-l-radius);\n --tabs-pad-x: var(--prime-control-l-padding-x);\n --tabs-item-gap: var(--prime-space-6);\n}\n\n.root[data-size=\"xl\"] {\n --tabs-height: var(--prime-control-xl-height);\n --tabs-text-size: var(--prime-control-xl-text-size);\n --tabs-line-height: var(--prime-control-xl-line-height);\n --tabs-gap: var(--prime-control-xl-gap);\n --tabs-icon: var(--prime-control-xl-icon);\n --tabs-radius: var(--prime-control-xl-radius);\n --tabs-pad-x: var(--prime-control-xl-padding-x);\n --tabs-item-gap: var(--prime-space-8);\n}\n\n/* ---------- Layout ---------- */\n\n.layout {\n display: flex;\n flex-direction: column;\n gap: var(--prime-space-4);\n min-width: 0;\n}\n\n.root[data-orientation=\"vertical\"] {\n container-type: inline-size;\n}\n\n.root[data-orientation=\"vertical\"] .layout {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--prime-space-6);\n}\n\n/* ---------- List ---------- */\n\n.list {\n position: relative;\n isolation: isolate;\n display: flex;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n flex-wrap: nowrap;\n align-items: stretch;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n}\n\n.list::-webkit-scrollbar {\n display: none;\n}\n\n/* Edge fade while the list scrolls (mask is alpha-only; any opaque color works). */\n.list[data-overflow-start=\"true\"] {\n mask-image: linear-gradient(\n to right,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8)\n );\n}\n\n.list[data-overflow-end=\"true\"] {\n mask-image: linear-gradient(\n to left,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8)\n );\n}\n\n.list[data-overflow-start=\"true\"][data-overflow-end=\"true\"] {\n mask-image: linear-gradient(\n to right,\n transparent,\n var(--prime-color-text-primary) var(--prime-space-8),\n var(--prime-color-text-primary) calc(100% - var(--prime-space-8)),\n transparent\n );\n}\n\n.root[data-orientation=\"vertical\"] .list {\n flex-direction: column;\n flex-shrink: 0;\n gap: var(--prime-space-1);\n min-width: var(--tabs-two-line-min);\n overflow: visible;\n}\n\n/* Horizontal: text tabs over a hairline. */\n.root[data-orientation=\"horizontal\"] .list {\n gap: var(--tabs-item-gap);\n box-shadow: inset 0 calc(-1 * var(--prime-border-width)) 0 var(--prime-color-border-subtle);\n}\n\n/* ---------- Indicator ---------- */\n\n.indicator {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n pointer-events: none;\n opacity: 0;\n transition:\n transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n width var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n height var(--prime-motion-duration-base) var(--prime-motion-easing-standard),\n opacity var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.indicator[data-visible=\"true\"] {\n opacity: 1;\n}\n\n/* 2px accent bar under the text of the active trigger. */\n.indicatorBar {\n top: auto;\n bottom: 0;\n width: 0;\n height: var(--prime-focus-width);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-accent-default);\n}\n\n/* Vertical: `fill-muted` pill with a short accent mark at the inline start. */\n.indicatorPill {\n border-radius: var(--tabs-radius);\n background: var(--prime-color-fill-muted);\n}\n\n.indicatorPill::before {\n content: \"\";\n position: absolute;\n inset-block: var(--prime-space-2);\n inset-inline-start: var(--prime-space-1);\n width: var(--prime-focus-width);\n border-radius: var(--prime-radius-full);\n background: var(--prime-color-accent-default);\n}\n\n/* ---------- Trigger ---------- */\n\n.tab {\n position: relative;\n z-index: 1;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n gap: var(--tabs-gap);\n box-sizing: border-box;\n min-width: 0;\n height: var(--tabs-height);\n margin: 0;\n padding: 0 var(--prime-space-1);\n border: 0;\n border-radius: var(--prime-radius-xs);\n background: none;\n color: var(--prime-color-text-secondary);\n font-family: inherit;\n font-size: var(--tabs-text-size);\n line-height: var(--tabs-line-height);\n font-weight: var(--prime-font-weight-regular);\n text-align: start;\n white-space: nowrap;\n cursor: pointer;\n transition:\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.root[data-orientation=\"vertical\"] .tab {\n justify-content: flex-start;\n padding: 0 var(--tabs-pad-x);\n border-radius: var(--tabs-radius);\n}\n\n/* Two-line trigger: label + count on the first line, description on the second. */\n.tab[data-two-line=\"true\"] {\n /* Grid, not wrapping flex: the max-content width is the wider line, not both lines summed. */\n display: inline-grid;\n grid-template-columns: minmax(0, auto) auto;\n align-content: center;\n justify-content: start;\n justify-items: start;\n column-gap: var(--tabs-gap);\n row-gap: 0;\n height: auto;\n padding-block: var(--prime-space-2) var(--prime-space-3);\n}\n\n/* Vertical items get a minimum width; horizontal ones hug their text so the bar matches it. */\n.root[data-orientation=\"vertical\"] .tab[data-two-line=\"true\"] {\n min-width: var(--tabs-two-line-min);\n padding-block: var(--prime-space-2);\n}\n\n.tab:hover:not([data-disabled=\"true\"]) {\n color: var(--prime-color-text-primary);\n}\n\n.root[data-orientation=\"vertical\"] .tab:hover:not([data-disabled=\"true\"], [aria-selected=\"true\"]) {\n background: var(--prime-color-fill-subtle);\n}\n\n.tab[aria-selected=\"true\"] {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.tab:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.tab[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* ---------- Trigger parts ---------- */\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--tabs-icon);\n height: var(--tabs-icon);\n line-height: 0;\n color: var(--prime-color-text-muted);\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.icon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.tab:hover:not([data-disabled=\"true\"]) .icon,\n.tab[aria-selected=\"true\"] .icon {\n color: inherit;\n}\n\n.tab[aria-selected=\"true\"] .icon:first-child {\n color: var(--prime-color-accent-text);\n}\n\n.tab[data-disabled=\"true\"] .icon {\n color: var(--prime-color-text-disabled);\n}\n\n/* The hidden medium-weight copy keeps the width stable between inactive and active. */\n.label {\n display: inline-grid;\n min-width: 0;\n font: inherit;\n}\n\n.labelText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.label[data-text]::after {\n /* Empty alt text keeps the copy out of the accessible name. */\n content: attr(data-text) / \"\";\n height: 0;\n overflow: hidden;\n visibility: hidden;\n font-weight: var(--prime-font-weight-medium);\n white-space: nowrap;\n user-select: none;\n pointer-events: none;\n}\n\n.count {\n flex-shrink: 0;\n}\n\n.description {\n grid-column: 1 / -1;\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-body-s-size);\n line-height: var(--prime-text-body-s-line-height);\n font-weight: var(--prime-font-weight-regular);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.description strong {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.tab[data-disabled=\"true\"] .description,\n.tab[data-disabled=\"true\"] .description strong {\n color: var(--prime-color-text-disabled);\n}\n\n/* ---------- Panel ---------- */\n\n.panel {\n box-sizing: border-box;\n min-width: 0;\n flex: 1 1 auto;\n font-size: var(--tabs-text-size);\n line-height: var(--tabs-line-height);\n color: var(--prime-color-text-primary);\n}\n\n.panel:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n border-radius: var(--prime-radius-xs);\n}\n\n.panel :where(p, ul, ol) {\n margin: 0;\n}\n\n/* ---------- Vertical \u2192 horizontal row in narrow containers ---------- */\n\n@container (max-width: 37.5rem) {\n .root[data-orientation=\"vertical\"] .layout {\n flex-direction: column;\n align-items: stretch;\n gap: var(--prime-space-4);\n }\n\n .root[data-orientation=\"vertical\"] .list {\n flex-direction: row;\n min-width: 0;\n overflow-x: auto;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .indicator {\n transition: none;\n }\n}\n", "import * as React from \"react\";\n\nimport { useBadgeTier } from \"@/components/badge/tier\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { ControlSize, PaletteColor, Variant } from \"@/internal/states\";\n\nimport styles from \"./Tag.module.css\";\n\nexport type TagLabels = {\n /** Accessible name of the remove button; include the tag text, e.g. \u00AB\u0423\u0434\u0430\u043B\u0438\u0442\u044C Design\u00BB. */\n remove: string;\n};\n\nconst TAG_LABELS: TagLabels = { remove: \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C\" };\n\nexport type TagRootProps = {\n /** Palette hue. Default `gray`. */\n color?: PaletteColor;\n /** Treatment. Default `soft`. */\n variant?: Extract<Variant, \"soft\" | \"outline\">;\n /** Badge tier; without it the tag follows the surrounding control one tier down. */\n size?: ControlSize;\n /** Shows the remove button. */\n onRemove?: () => void;\n labels?: Partial<TagLabels>;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLSpanElement>;\n\nexport type TagIconProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nconst TagRoot = React.forwardRef<HTMLSpanElement, TagRootProps>(\n (\n {\n color = \"gray\",\n variant = \"soft\",\n size: sizeProp,\n onRemove,\n labels,\n disabled,\n children,\n className,\n ...rest\n },\n ref,\n ) => {\n const { size, tier } = useBadgeTier(sizeProp);\n\n return (\n <span\n ref={ref}\n className={cx(styles.root, className)}\n aria-disabled={disabled || undefined}\n {...toDataAttributes({\n color,\n variant,\n size,\n tier,\n removable: onRemove ? true : undefined,\n disabled: disabled ? true : undefined,\n })}\n {...rest}\n >\n <span className={styles.body}>\n <ControlSizeProvider value={tier}>{children}</ControlSizeProvider>\n </span>\n {onRemove ? (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={labels?.remove ?? TAG_LABELS.remove}\n onClick={onRemove}\n disabled={disabled}\n >\n <svg className={styles.removeIcon} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.5 4.5l7 7M11.5 4.5l-7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </span>\n );\n },\n);\n\nTagRoot.displayName = \"TagRoot\";\n\nfunction TagIcon({ children, className }: TagIconProps) {\n return <span className={cx(styles.icon, className)}>{children}</span>;\n}\n\nTagIcon.displayName = \"TagIcon\";\n\nexport const Tag = { Root: TagRoot, Icon: TagIcon };\n", "/*\n * Tag \u2014 a chip in the soft badge style: palette hue fill, no border (`outline` draws a hue line).\n * Dimensions follow the badge tiers (`--prime-badge-<tier>-*`); `data-tier` is the visual tier\n * (see badge/tier.ts).\n */\n.root {\n --tag-h: var(--prime-badge-m-height);\n --tag-px: var(--prime-badge-m-padding-x);\n --tag-gap: var(--prime-badge-m-gap);\n --tag-radius: var(--prime-badge-m-radius);\n --tag-text: var(--prime-badge-m-text-size);\n --tag-lh: var(--prime-text-caption-line-height);\n --prime-icon-size: var(--prime-badge-m-icon);\n --hue-soft: var(--prime-color-palette-gray-soft);\n --hue-text: var(--prime-color-palette-gray-text);\n\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: var(--tag-gap);\n /* Do not stretch inside a column flex/grid parent. */\n width: fit-content;\n max-width: 100%;\n height: var(--tag-h);\n padding-inline: var(--tag-px);\n border-radius: var(--tag-radius);\n background: var(--hue-soft);\n color: var(--hue-text);\n font-size: var(--tag-text);\n line-height: var(--tag-lh);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.root[data-tier=\"xs\"] {\n --tag-h: var(--prime-badge-xs-height);\n --tag-px: var(--prime-badge-xs-padding-x);\n --tag-gap: var(--prime-badge-xs-gap);\n --tag-radius: var(--prime-badge-xs-radius);\n --tag-text: var(--prime-badge-xs-text-size);\n --prime-icon-size: var(--prime-badge-xs-icon);\n}\n\n.root[data-tier=\"s\"] {\n --tag-h: var(--prime-badge-s-height);\n --tag-px: var(--prime-badge-s-padding-x);\n --tag-gap: var(--prime-badge-s-gap);\n --tag-radius: var(--prime-badge-s-radius);\n --tag-text: var(--prime-badge-s-text-size);\n --prime-icon-size: var(--prime-badge-s-icon);\n}\n\n.root[data-tier=\"l\"] {\n --tag-h: var(--prime-badge-l-height);\n --tag-px: var(--prime-badge-l-padding-x);\n --tag-gap: var(--prime-badge-l-gap);\n --tag-radius: var(--prime-badge-l-radius);\n --tag-text: var(--prime-badge-l-text-size);\n --tag-lh: var(--prime-text-body-s-line-height);\n --prime-icon-size: var(--prime-badge-l-icon);\n}\n\n.root[data-tier=\"xl\"] {\n --tag-h: var(--prime-badge-xl-height);\n --tag-px: var(--prime-badge-xl-padding-x);\n --tag-gap: var(--prime-badge-xl-gap);\n --tag-radius: var(--prime-badge-xl-radius);\n --tag-text: var(--prime-badge-xl-text-size);\n --tag-lh: var(--prime-text-body-m-line-height);\n --prime-icon-size: var(--prime-badge-xl-icon);\n}\n\n/* \u2500\u2500\u2500 Hues and variants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-color=\"red\"] {\n --hue-soft: var(--prime-color-palette-red-soft);\n --hue-text: var(--prime-color-palette-red-text);\n}\n\n.root[data-color=\"blue\"] {\n --hue-soft: var(--prime-color-palette-blue-soft);\n --hue-text: var(--prime-color-palette-blue-text);\n}\n\n.root[data-color=\"green\"] {\n --hue-soft: var(--prime-color-palette-green-soft);\n --hue-text: var(--prime-color-palette-green-text);\n}\n\n.root[data-color=\"orange\"] {\n --hue-soft: var(--prime-color-palette-orange-soft);\n --hue-text: var(--prime-color-palette-orange-text);\n}\n\n.root[data-color=\"yellow\"] {\n --hue-soft: var(--prime-color-palette-yellow-soft);\n --hue-text: var(--prime-color-palette-yellow-text);\n}\n\n.root[data-color=\"purple\"] {\n --hue-soft: var(--prime-color-palette-purple-soft);\n --hue-text: var(--prime-color-palette-purple-text);\n}\n\n.root[data-color=\"sky\"] {\n --hue-soft: var(--prime-color-palette-sky-soft);\n --hue-text: var(--prime-color-palette-sky-text);\n}\n\n.root[data-color=\"pink\"] {\n --hue-soft: var(--prime-color-palette-pink-soft);\n --hue-text: var(--prime-color-palette-pink-text);\n}\n\n.root[data-color=\"teal\"] {\n --hue-soft: var(--prime-color-palette-teal-soft);\n --hue-text: var(--prime-color-palette-teal-text);\n}\n\n.root[data-variant=\"outline\"] {\n background: transparent;\n box-shadow: inset 0 0 0 var(--prime-border-width)\n color-mix(in srgb, var(--hue-text) 32%, transparent);\n}\n\n/* The remove button sits closer to the edge: it carries its own visual padding. */\n.root[data-removable=\"true\"] {\n padding-inline-end: var(--prime-space-1);\n}\n\n.root[data-disabled=\"true\"] {\n background: var(--prime-color-fill-muted);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n}\n\n.body {\n display: inline-flex;\n align-items: center;\n gap: var(--tag-gap);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n color: inherit;\n}\n\n.root[data-disabled=\"true\"] .icon {\n color: inherit;\n}\n\n.icon > * {\n width: 100%;\n height: 100%;\n}\n\n/* Remove: visual box = icon size; hit area extends by 4px on every side. */\n.remove {\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--prime-icon-size);\n height: var(--prime-icon-size);\n padding: 0;\n margin: 0;\n border: 0;\n border-radius: var(--prime-radius-xs);\n background: transparent;\n color: color-mix(in srgb, currentColor 72%, transparent);\n font: inherit;\n cursor: pointer;\n appearance: none;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.remove::before {\n content: \"\";\n position: absolute;\n inset: calc(-1 * var(--prime-space-1));\n}\n\n.remove:hover:not(:disabled) {\n background: var(--prime-color-fill-subtle-active);\n color: inherit;\n}\n\n.remove:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: 0;\n color: inherit;\n}\n\n.remove:disabled {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.removeIcon {\n display: block;\n width: 100%;\n height: 100%;\n}\n", "import * as React from \"react\";\nimport { Button } from \"@/components/button/Button\";\nimport { Input } from \"@/components/input/Input\";\nimport { Popover } from \"@/components/popover/Popover\";\nimport { ScrollContainer } from \"@/components/scroll-container/ScrollContainer\";\nimport { Tag } from \"@/components/tag/Tag\";\nimport { useControllableState } from \"@/hooks/useControllableState\";\nimport { useEscapeKey } from \"@/hooks/useEscapeKey\";\nimport { useOutsideClick } from \"@/hooks/useOutsideClick\";\nimport { usePosition } from \"@/hooks/usePosition\";\nimport { usePresence } from \"@/hooks/usePresence\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { FieldFrame, type FieldFrameProps, useFieldFrame } from \"@/internal/FieldFrame\";\nimport { useOverlayPortalLayer } from \"@/internal/OverlayPortalLayerContext\";\nimport overlayMotion from \"@/internal/overlayMotion.module.css\";\nimport { Portal } from \"@/internal/Portal\";\nimport { getScrollContainers } from \"@/internal/scrollAncestors\";\nimport type { ControlSize, PaletteColor } from \"@/internal/states\";\nimport { CheckIcon, ChevronIcon } from \"../select/selectIcons\";\nimport { handleSelectListboxKeyDown, queryEnabledSelectOptions } from \"../select/selectListbox\";\nimport styles from \"./TagSelect.module.css\";\n\nexport type TagSelectOption = {\n value: string;\n label: string;\n color?: PaletteColor;\n disabled?: boolean;\n};\n\nconst CREATE_VALUE = \"__prime_tag_select_create__\";\n\nfunction tagOptionDomId(listboxId: string, value: string): string {\n return `${listboxId}-opt-${value.replace(/\\s+/g, \"_\")}`;\n}\n\nfunction PlusIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M12 6v12M6 12h12\"\n stroke=\"currentColor\"\n strokeWidth={1.7}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n );\n}\n\n/**\n * \u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0447\u0438\u043F\u043E\u0432 \u043F\u043E\u043C\u0435\u0449\u0430\u0435\u0442\u0441\u044F \u0432 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u043B\u044F; \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u2014 \u0432 \u0447\u0438\u043F \u00AB+N\u00BB.\n * \u0428\u0438\u0440\u0438\u043D\u044B \u0431\u0435\u0440\u0443\u0442\u0441\u044F \u0438\u0437 \u043D\u0435\u0432\u0438\u0434\u0438\u043C\u043E\u0433\u043E \u0440\u044F\u0434\u0430 `measureRef` (\u0432\u0441\u0435 \u0447\u0438\u043F\u044B + \u043E\u0431\u0440\u0430\u0437\u0435\u0446 \u00AB+N\u00BB).\n */\nfunction useChipOverflow({\n rowRef,\n measureRef,\n inputRef,\n count,\n inputCollapsed,\n}: {\n rowRef: React.RefObject<HTMLDivElement | null>;\n measureRef: React.RefObject<HTMLDivElement | null>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n count: number;\n inputCollapsed: boolean;\n}): number {\n const [visible, setVisible] = React.useState(count);\n\n const recompute = React.useCallback(() => {\n const row = rowRef.current;\n const measure = measureRef.current;\n if (!row || !measure) return;\n const nodes = Array.from(measure.children) as HTMLElement[];\n const more = nodes.pop();\n const widths = nodes.map((n) => n.offsetWidth);\n const gap = Number.parseFloat(getComputedStyle(row).columnGap) || 0;\n const input = inputRef.current;\n const inputReserve =\n input && !inputCollapsed ? Number.parseFloat(getComputedStyle(input).minWidth) || 0 : 0;\n const available = row.clientWidth - inputReserve;\n const total = widths.reduce((sum, w, i) => sum + w + (i > 0 ? gap : 0), 0);\n let next = widths.length;\n if (total > available) {\n const moreW = (more?.offsetWidth ?? 0) + gap;\n let used = 0;\n next = 0;\n for (const w of widths) {\n const add = w + (next > 0 ? gap : 0);\n if (used + add + moreW > available) break;\n used += add;\n next += 1;\n }\n /* \u0425\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u0438\u043D \u0447\u0438\u043F: \u043E\u043D \u0441\u0436\u0438\u043C\u0430\u0435\u0442\u0441\u044F \u0441 \u043C\u043D\u043E\u0433\u043E\u0442\u043E\u0447\u0438\u0435\u043C, \u00AB+N\u00BB \u043D\u0435 \u0441\u0436\u0438\u043C\u0430\u0435\u0442\u0441\u044F. */\n next = Math.max(1, next);\n }\n setVisible((prev) => (prev === next ? prev : next));\n }, [rowRef, measureRef, inputRef, inputCollapsed]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: \u043F\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043F\u0440\u0438 \u0441\u043C\u0435\u043D\u0435 \u043D\u0430\u0431\u043E\u0440\u0430 \u0447\u0438\u043F\u043E\u0432\n React.useLayoutEffect(() => {\n recompute();\n }, [recompute, count]);\n\n React.useEffect(() => {\n const row = rowRef.current;\n if (!row || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => recompute());\n ro.observe(row);\n return () => ro.disconnect();\n }, [rowRef, recompute]);\n\n return Math.min(visible, count);\n}\n\nexport type TagSelectLabels = {\n /** Line above the list; `\"\"` hides it. */\n panelHint: string;\n /** Action text before the preview of a new tag (`creatable`). */\n create: string;\n /** Accessible name of a chip's remove button; `{label}` is the tag text. */\n remove: string;\n /** Accessible name of the \u00AB+N\u00BB button; `{count}` is the number of hidden tags. */\n more: string;\n /** Screen-reader announcement after a tag is removed; `{label}` is the tag text. */\n removed: string;\n /** Accessible name of a row's \u00AB\u22EF\u00BB menu; `{label}` is the tag text. */\n edit: string;\n /** Accessible name of the tag name field in the menu. */\n name: string;\n /** Delete button in the menu. */\n delete: string;\n /** Heading of the color list in the menu. */\n colors: string;\n /** Names of the palette colors in the menu. */\n colorNames: Record<PaletteColor, string>;\n /** Muted marker after the label when `optional`. */\n optional: string;\n};\n\nconst TAG_SELECT_LABELS: TagSelectLabels = {\n panelHint: \"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0438\u043B\u0438 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043D\u043E\u0432\u044B\u0439\",\n create: \"\u0421\u043E\u0437\u0434\u0430\u0442\u044C\",\n remove: \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C {label}\",\n more: \"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451 {count}\",\n removed: \"\u0423\u0434\u0430\u043B\u0435\u043D\u043E: {label}\",\n edit: \"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0442\u0435\u0433 {label}\",\n name: \"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u0433\u0430\",\n delete: \"\u0423\u0434\u0430\u043B\u0438\u0442\u044C\",\n colors: \"\u0426\u0432\u0435\u0442\u0430\",\n colorNames: {\n gray: \"\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E\",\n red: \"\u041A\u0440\u0430\u0441\u043D\u044B\u0439\",\n orange: \"\u041E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439\",\n yellow: \"\u0416\u0451\u043B\u0442\u044B\u0439\",\n green: \"\u0417\u0435\u043B\u0451\u043D\u044B\u0439\",\n blue: \"\u0421\u0438\u043D\u0438\u0439\",\n purple: \"\u0424\u0438\u043E\u043B\u0435\u0442\u043E\u0432\u044B\u0439\",\n pink: \"\u0420\u043E\u0437\u043E\u0432\u044B\u0439\",\n sky: \"\u0413\u043E\u043B\u0443\u0431\u043E\u0439\",\n teal: \"\u0411\u0438\u0440\u044E\u0437\u043E\u0432\u044B\u0439\",\n },\n optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\",\n};\n\n/** \u041F\u0430\u043B\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043E\u0432 \u0432 \u043C\u0435\u043D\u044E \u0442\u0435\u0433\u0430 (\u043A\u0430\u043A \u0432 Notion): \u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0443 \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 `PaletteColor`. */\nconst TAG_COLOR_ORDER: PaletteColor[] = [\n \"gray\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"pink\",\n \"sky\",\n \"teal\",\n];\n\nfunction withLabel(template: string, label: string): string {\n return template.replace(\"{label}\", label);\n}\n\nexport type TagSelectOptionUpdate = { label?: string; color?: PaletteColor };\n\nexport type TagSelectRootProps = FieldFrameProps & {\n /** Available tags: value, label and chip color. */\n options: TagSelectOption[];\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Allow adding a value that is not in `options`. */\n creatable?: boolean;\n /** A new value was created (Create row or Enter), not picked from `options`. */\n onCreate?: (value: string) => void;\n /** Chip color of values without an option color, including created ones. Default `gray`. */\n defaultColor?: PaletteColor;\n /** Enables the \u00AB\u22EF\u00BB row menu: tag name and color. `value` never changes. */\n onOptionUpdate?: (value: string, updates: TagSelectOptionUpdate) => void;\n /** Enables \u00AB\u0423\u0434\u0430\u043B\u0438\u0442\u044C\u00BB in the row menu; the value is also removed from the selection. */\n onOptionDelete?: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n /** Danger ring and `aria-invalid`; a non-empty `error` implies it. */\n invalid?: boolean;\n /** Field tier; the list uses the same tier, chips one tier down. */\n size?: ControlSize;\n /** Id of the text input; generated when omitted. */\n id?: string;\n labels?: Partial<TagSelectLabels>;\n className?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n};\n\nfunction normalizeList(\n selected: string[],\n options: TagSelectOption[],\n defaultTagColor: PaletteColor,\n): { value: string; label: string; color: PaletteColor }[] {\n return selected.map((v) => {\n const o = options.find((x) => x.value === v);\n return {\n value: v,\n label: o?.label ?? v,\n color: o?.color ?? defaultTagColor,\n };\n });\n}\n\nfunction filterOptions(options: TagSelectOption[], query: string): TagSelectOption[] {\n const q = query.trim().toLowerCase();\n if (q.length === 0) return options;\n return options.filter((o) => {\n if (o.disabled) return false;\n return o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q);\n });\n}\n\n/**\n * \u0421\u0442\u0440\u043E\u043A\u0438 \u0441\u043F\u0438\u0441\u043A\u0430: \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435 \u043F\u043E \u043F\u043E\u0438\u0441\u043A\u0443, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435 (\u043E\u0442\u043C\u0435\u0447\u0435\u043D\u044B \u2014 \u0441\u043D\u044F\u0442\u0438\u0435 \u0433\u0430\u043B\u043E\u0447\u043A\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0435\u0433),\n * \u0437\u0430\u0442\u0435\u043C \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435. \u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u043D\u0443\u0436\u043D\u044B: \u043F\u0440\u0438 \u043C\u043D\u043E\u0433\u0438\u0445 \u0442\u0435\u0433\u0430\u0445 \u0447\u0430\u0441\u0442\u044C \u0438\u0437 \u043D\u0438\u0445 \u0441\u0432\u0451\u0440\u043D\u0443\u0442\u0430 \u0432 \u00AB+N\u00BB, \u0438\n * \u0441\u043D\u044F\u0442\u044C \u0438\u0445 \u043C\u043E\u0436\u043D\u043E \u0438 \u043E\u0442\u0441\u044E\u0434\u0430.\n */\nfunction optionsForList(\n options: TagSelectOption[],\n query: string,\n selected: string[],\n): TagSelectOption[] {\n const matched = filterOptions(options, query);\n return [\n ...matched.filter((o) => selected.includes(o.value)),\n ...matched.filter((o) => !selected.includes(o.value)),\n ];\n}\n\nfunction shouldShowCreate(\n creatable: boolean,\n inputTrim: string,\n selected: string[],\n options: TagSelectOption[],\n): boolean {\n if (!creatable || inputTrim.length === 0) return false;\n if (selected.includes(inputTrim)) return false;\n const lower = inputTrim.toLowerCase();\n const exists = options.some(\n (o) =>\n o.value === inputTrim || o.label.toLowerCase() === lower || o.value.toLowerCase() === lower,\n );\n return !exists;\n}\n\n/**\n * \u041E\u043F\u0446\u0438\u0438 \u0438\u0437 `props.options` + \u0441\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0435 \u0447\u0435\u0440\u0435\u0437 creatable (\u043F\u043E\u043B\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A\u0430 \u0432 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438,\n * \u0431\u0435\u0437 localStorage \u2014 \u0434\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0438\u043B\u0438 \u043F\u043E\u043A\u0430 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u043D\u0435 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043E \u0436\u0435 \u0432 `options`).\n */\nfunction mergeOptionsWithCreated(\n options: TagSelectOption[],\n created: readonly TagSelectOption[],\n): TagSelectOption[] {\n const existing = new Set(options.map((o) => o.value));\n const extra = created.filter((c) => !existing.has(c.value));\n return extra.length === 0 ? options : [...options, ...extra];\n}\n\ntype TagOptionManagePopoverProps = {\n option: TagSelectOption;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n defaultColor: PaletteColor;\n onUpdate?: (value: string, updates: TagSelectOptionUpdate) => void;\n onDelete?: (value: string) => void;\n labels: TagSelectLabels;\n disabled: boolean;\n};\n\nfunction TagOptionManagePopover({\n option,\n open,\n onOpenChange,\n defaultColor,\n onUpdate,\n onDelete,\n labels,\n disabled,\n}: TagOptionManagePopoverProps) {\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const resolvedColor = option.color ?? defaultColor;\n const [draftLabel, setDraftLabel] = React.useState(option.label);\n\n React.useEffect(() => {\n if (open) {\n setDraftLabel(option.label);\n }\n }, [open, option.label]);\n\n React.useEffect(() => {\n if (!open || !onUpdate) return;\n const id = requestAnimationFrame(() => inputRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }, [open, onUpdate]);\n\n const commitLabel = () => {\n const next = draftLabel.trim();\n if (next.length > 0 && next !== option.label) {\n onUpdate?.(option.value, { label: next });\n }\n if (next.length === 0) {\n setDraftLabel(option.label);\n }\n };\n\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Popover.Trigger>\n <button\n type=\"button\"\n className={styles.optionMenuTrigger}\n aria-label={withLabel(labels.edit, option.label)}\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {/* biome-ignore lint/a11y/noSvgWithoutTitle: \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0430\u044F \u0438\u043A\u043E\u043D\u043A\u0430, \u0438\u043C\u044F \u2014 \u0443 \u043A\u043D\u043E\u043F\u043A\u0438 */}\n <svg\n className={styles.optionMenuDots}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden\n >\n <circle cx=\"4\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"8\" r=\"1.5\" />\n </svg>\n </button>\n </Popover.Trigger>\n <Popover.Content\n side=\"bottom\"\n align=\"end\"\n trapFocus={false}\n insetPadding=\"none\"\n insetGap=\"none\"\n size=\"s\"\n stackAboveDropdown\n className={styles.managePopoverSurface}\n >\n <fieldset\n className={styles.managePopoverShell}\n onKeyDown={(e) => {\n /* \u0418\u043D\u0430\u0447\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0442 \u043A listbox (\u043F\u043E\u0440\u0442\u0430\u043B \u0432 body, \u043D\u043E \u043F\u0440\u0435\u0434\u043E\u043A \u0432 React \u2014 ScrollContainer) \u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u044E\u0442 \u0432\u044B\u0431\u043E\u0440 */\n e.stopPropagation();\n }}\n >\n {onUpdate ? (\n <div className={styles.manageField}>\n <Input.Root size=\"s\">\n <Input.Wrapper>\n <Input.Field\n ref={inputRef}\n value={draftLabel}\n onValueChange={setDraftLabel}\n onBlur={commitLabel}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitLabel();\n onOpenChange(false);\n }\n }}\n aria-label={labels.name}\n />\n </Input.Wrapper>\n </Input.Root>\n </div>\n ) : null}\n {onDelete ? (\n <Button.Root\n variant=\"ghost\"\n tone=\"danger\"\n type=\"button\"\n size=\"s\"\n className={styles.manageDelete}\n onClick={() => {\n onDelete(option.value);\n onOpenChange(false);\n }}\n >\n {/* biome-ignore lint/a11y/noSvgWithoutTitle: \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0430\u044F \u0438\u043A\u043E\u043D\u043A\u0430 \u0443 \u043A\u043D\u043E\u043F\u043A\u0438 \u0441 \u0442\u0435\u043A\u0441\u0442\u043E\u043C */}\n <svg className={styles.manageDeleteIcon} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M4 4h8M6 4V3h4v1m2 0v9a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V4h10zM6 7v4M10 7v4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {labels.delete}\n </Button.Root>\n ) : null}\n {onUpdate ? (\n <>\n <hr className={styles.manageSeparator} />\n <span className={styles.manageColorsHeading}>{labels.colors}</span>\n <div className={styles.manageColorList}>\n {TAG_COLOR_ORDER.map((color) => {\n const selected = resolvedColor === color;\n return (\n <button\n key={color}\n type=\"button\"\n aria-pressed={selected}\n className={styles.manageColorRow}\n onClick={() => {\n onUpdate(option.value, { color });\n }}\n >\n <span\n className={styles.manageColorSwatch}\n aria-hidden\n {...toDataAttributes({ color })}\n />\n <span className={styles.manageColorLabel}>{labels.colorNames[color]}</span>\n {selected ? (\n <CheckIcon className={styles.manageCheck} />\n ) : (\n <span className={styles.manageCheckPlaceholder} aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </fieldset>\n </Popover.Content>\n </Popover.Root>\n );\n}\n\nfunction TagSelectRoot({\n options,\n value: valueProp,\n defaultValue = [],\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n creatable = false,\n onCreate,\n defaultColor = \"gray\",\n onOptionUpdate,\n onOptionDelete,\n disabled = false,\n placeholder = \"\",\n invalid: invalidProp,\n focusRing = true,\n size = \"m\",\n label,\n required = false,\n optional,\n hint,\n error,\n id: idProp,\n labels: labelsProp,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}: TagSelectRootProps) {\n const labels = React.useMemo(\n () => ({\n ...TAG_SELECT_LABELS,\n ...labelsProp,\n colorNames: { ...TAG_SELECT_LABELS.colorNames, ...labelsProp?.colorNames },\n }),\n [labelsProp],\n );\n const ids = useFieldFrame(idProp, { hint, error, invalid: invalidProp });\n const invalid = ids.invalid;\n const inputId = ids.controlId;\n const listboxId = `${inputId}-listbox`;\n\n const [selected, setSelected] = useControllableState<string[]>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n const [open, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const [inputValue, setInputValue] = React.useState(\"\");\n /** \u0424\u043E\u043A\u0443\u0441 \u0432\u043D\u0443\u0442\u0440\u0438 \u043F\u043E\u043B\u044F (\u0432\u0432\u043E\u0434 \u0438\u043B\u0438 \u0447\u0438\u043F): \u043F\u043E\u043B\u0435 \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0438 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0435\u0433\u0438. */\n const [focusWithin, setFocusWithin] = React.useState(false);\n const [announcement, setAnnouncement] = React.useState(\"\");\n /** \u041A\u0443\u0434\u0430 \u043F\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0444\u043E\u043A\u0443\u0441 \u043F\u043E\u0441\u043B\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0447\u0438\u043F\u0430 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B: \u0438\u043D\u0434\u0435\u043A\u0441 \u0447\u0438\u043F\u0430 \u0438\u043B\u0438 -1 \u2014 \u0432\u0432\u043E\u0434. */\n const pendingChipFocus = React.useRef<number | null>(null);\n const [highlightedValue, setHighlightedValue] = React.useState<string | undefined>(undefined);\n const [manageOpenValue, setManageOpenValue] = React.useState<string | null>(null);\n /** \u0421\u043E\u0437\u0434\u0430\u043D\u043D\u044B\u0435 \u0447\u0435\u0440\u0435\u0437 creatable (\u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u043E\u043F\u0446\u0438\u0438: label, color, \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432 \u043C\u0435\u043D\u044E \u22EF) */\n const [createdOptions, setCreatedOptions] = React.useState<TagSelectOption[]>([]);\n\n const triggerRef = React.useRef<HTMLDivElement | null>(null);\n const chipsRef = React.useRef<HTMLDivElement | null>(null);\n const measureRef = React.useRef<HTMLDivElement | null>(null);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const listboxRef = React.useRef<HTMLDivElement | null>(null);\n\n const overlayPortalLayer = useOverlayPortalLayer();\n\n const { resolvedSide, update } = usePosition(triggerRef, listboxRef, {\n side: \"bottom\",\n align: \"start\",\n });\n\n const updateRef = React.useRef(update);\n updateRef.current = update;\n\n const inputTrim = inputValue.trim();\n const mergedOptions = React.useMemo(\n () => mergeOptionsWithCreated(options, createdOptions),\n [options, createdOptions],\n );\n\n /** \u041A\u043E\u0433\u0434\u0430 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u0442\u043E\u0442 \u0436\u0435 `value` \u0432 `options`, \u0443\u0431\u0438\u0440\u0430\u0435\u043C \u0434\u0443\u0431\u043B\u0438\u043A\u0430\u0442 \u0438\u0437 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0430. */\n React.useEffect(() => {\n setCreatedOptions((prev) => {\n const next = prev.filter((c) => !options.some((o) => o.value === c.value));\n return next.length === prev.length ? prev : next;\n });\n }, [options]);\n const filteredForPick = React.useMemo(\n () => optionsForList(mergedOptions, inputValue, selected),\n [mergedOptions, inputValue, selected],\n );\n const showCreate = shouldShowCreate(creatable, inputTrim, selected, mergedOptions);\n\n const manageable = Boolean(onOptionUpdate || onOptionDelete);\n const handleOptionUpdate = React.useMemo(() => {\n if (!onOptionUpdate) return undefined;\n return (value: string, updates: TagSelectOptionUpdate) => {\n if (!options.some((o) => o.value === value)) {\n setCreatedOptions((prev) =>\n prev.map((o) => (o.value === value ? { ...o, ...updates } : o)),\n );\n }\n onOptionUpdate(value, updates);\n };\n }, [onOptionUpdate, options]);\n const handleOptionDelete = React.useMemo(() => {\n if (!onOptionDelete) return undefined;\n return (value: string) => {\n setSelected((prev) => prev.filter((x) => x !== value));\n setCreatedOptions((prev) => prev.filter((o) => o.value !== value));\n onOptionDelete(value);\n };\n }, [onOptionDelete, setSelected]);\n\n /** \u041F\u0430\u043D\u0435\u043B\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C \u043E\u043F\u0446\u0438\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F (\u043F\u043E\u0441\u043B\u0435 \u0432\u0432\u043E\u0434\u0430). */\n const hasPanelContent = filteredForPick.length > 0 || showCreate;\n\n const flatOptionValues = React.useMemo(() => {\n const v: string[] = [];\n if (showCreate) v.push(CREATE_VALUE);\n for (const o of filteredForPick) {\n if (!o.disabled) v.push(o.value);\n }\n return v;\n }, [filteredForPick, showCreate]);\n\n React.useLayoutEffect(() => {\n if (!open) return;\n updateRef.current();\n const raf = requestAnimationFrame(() => updateRef.current());\n return () => cancelAnimationFrame(raf);\n }, [open]);\n\n React.useEffect(() => {\n if (!open) return;\n\n let rafCoalesce = 0;\n const schedule = () => {\n cancelAnimationFrame(rafCoalesce);\n rafCoalesce = requestAnimationFrame(() => updateRef.current());\n };\n\n window.addEventListener(\"resize\", schedule);\n const scrollTargets = getScrollContainers(triggerRef.current);\n for (const t of scrollTargets) {\n t.addEventListener(\"scroll\", schedule, { passive: true });\n }\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n\n const panel = listboxRef.current;\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\" && panel) {\n ro = new ResizeObserver(schedule);\n ro.observe(panel);\n /* \u041F\u043E\u043B\u0435 \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u0442\u0441\u044F / \u0441\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u2014 \u043F\u0430\u043D\u0435\u043B\u044C \u0435\u0434\u0435\u0442 \u0437\u0430 \u043D\u0438\u043C. */\n if (triggerRef.current) ro.observe(triggerRef.current);\n }\n\n return () => {\n cancelAnimationFrame(rafCoalesce);\n window.removeEventListener(\"resize\", schedule);\n for (const t of scrollTargets) {\n t.removeEventListener(\"scroll\", schedule);\n }\n vv?.removeEventListener(\"resize\", schedule);\n ro?.disconnect();\n };\n }, [open]);\n\n React.useEffect(() => {\n if (!open) {\n setHighlightedValue(undefined);\n return;\n }\n if (flatOptionValues.length === 0) {\n setHighlightedValue(undefined);\n return;\n }\n setHighlightedValue((prev) =>\n prev && flatOptionValues.includes(prev) ? prev : flatOptionValues[0],\n );\n }, [open, flatOptionValues]);\n\n React.useEffect(() => {\n if (!open) return;\n if (!hasPanelContent) setOpen(false);\n }, [open, hasPanelContent, setOpen]);\n\n React.useEffect(() => {\n if (!open) setManageOpenValue(null);\n }, [open]);\n\n useEscapeKey({ enabled: open && manageOpenValue === null, onEscape: () => setOpen(false) });\n // The manage Popover opened from a row is its own (topmost) layer, so clicks inside it never\n // reach this panel's outside-click handler.\n useOutsideClick({\n refs: [triggerRef, listboxRef],\n enabled: open,\n onOutsideClick: () => setOpen(false),\n });\n const presence = usePresence(open, { exitDuration: \"fast\" });\n\n const toggleValue = React.useCallback(\n (value: string) => {\n setSelected((prev) => {\n if (prev.includes(value)) {\n return prev.filter((x) => x !== value);\n }\n return [...prev, value];\n });\n },\n [setSelected],\n );\n\n const handleSelectFromList = React.useCallback(\n (rawValue: string) => {\n if (rawValue === CREATE_VALUE) {\n const v = inputTrim;\n if (v.length === 0) return;\n setSelected((prev) => {\n if (prev.includes(v)) return prev;\n onCreate?.(v);\n return [...prev, v];\n });\n setCreatedOptions((prev) => {\n if (prev.some((o) => o.value === v) || options.some((o) => o.value === v)) {\n return prev;\n }\n return [...prev, { value: v, label: v, color: defaultColor }];\n });\n setInputValue(\"\");\n return;\n }\n toggleValue(rawValue);\n setInputValue(\"\");\n },\n [defaultColor, inputTrim, onCreate, options, setSelected, toggleValue],\n );\n\n const getItems = React.useCallback(() => queryEnabledSelectOptions(listboxRef.current), []);\n\n const removeValue = React.useCallback(\n (value: string, labelText: string) => {\n setSelected((prev) => prev.filter((x) => x !== value));\n setAnnouncement(withLabel(labels.removed, labelText));\n },\n [labels.removed, setSelected],\n );\n\n const chipElements = () =>\n Array.from(chipsRef.current?.querySelectorAll<HTMLElement>(\"[data-chip-value]\") ?? []);\n\n /* \u041F\u043E\u0441\u043B\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u2014 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0439 \u0447\u0438\u043F \u0438\u043B\u0438 \u0432 \u0432\u0432\u043E\u0434. */\n React.useLayoutEffect(() => {\n const target = pendingChipFocus.current;\n if (target === null) return;\n pendingChipFocus.current = null;\n const chipsNow = chipElements();\n const chip = target >= 0 ? (chipsNow[target] ?? chipsNow[chipsNow.length - 1]) : undefined;\n (chip ?? inputRef.current)?.focus();\n });\n\n const onListboxKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n handleSelectListboxKeyDown(e, {\n items: getItems(),\n highlightedValue,\n setHighlightedValue,\n onSelect: (v) => {\n handleSelectFromList(v);\n },\n onClose: () => setOpen(false),\n });\n };\n\n const onInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n if (e.key === \"Backspace\" && inputValue.length === 0 && selected.length > 0) {\n e.preventDefault();\n const last = chips[chips.length - 1];\n if (last) removeValue(last.value, last.label);\n return;\n }\n\n /* \u0421\u0442\u0440\u0435\u043B\u043A\u0430 \u0432\u043B\u0435\u0432\u043E \u0441 \u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0432\u043E\u0434\u0430 \u2014 \u043A \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u043C\u0443 \u0442\u0435\u0433\u0443. */\n const input = e.currentTarget;\n if (\n e.key === \"ArrowLeft\" &&\n input.selectionStart === 0 &&\n input.selectionEnd === 0 &&\n selected.length > 0\n ) {\n e.preventDefault();\n chipElements().at(-1)?.focus();\n return;\n }\n\n if (e.key === \"Escape\") {\n if (open) {\n e.preventDefault();\n setOpen(false);\n }\n return;\n }\n\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Enter\" || e.key === \" \") {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n if (filteredForPick.length > 0 || showCreate) {\n setOpen(true);\n }\n }\n return;\n }\n if (flatOptionValues.length === 0) return;\n\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n const hv = highlightedValue ?? flatOptionValues[0];\n if (hv === CREATE_VALUE) {\n handleSelectFromList(CREATE_VALUE);\n } else if (hv) {\n const o = mergedOptions.find((x) => x.value === hv);\n if (o && !o.disabled) {\n handleSelectFromList(o.value);\n }\n }\n return;\n }\n\n handleSelectListboxKeyDown(e as unknown as React.KeyboardEvent<HTMLDivElement>, {\n items: getItems(),\n highlightedValue,\n setHighlightedValue,\n onSelect: (v) => handleSelectFromList(v),\n onClose: () => setOpen(false),\n });\n }\n };\n\n const chips = normalizeList(selected, mergedOptions, defaultColor);\n /** \u0420\u0430\u0441\u043A\u0440\u044B\u0442\u043E (\u0444\u043E\u043A\u0443\u0441 \u0432\u043D\u0443\u0442\u0440\u0438 \u0438\u043B\u0438 \u043E\u0442\u043A\u0440\u044B\u0442 \u0441\u043F\u0438\u0441\u043E\u043A): \u0432\u0441\u0435 \u0442\u0435\u0433\u0438 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A, \u0431\u0435\u0437 \u00AB+N\u00BB. */\n const expanded = !disabled && (focusWithin || open);\n /** \u0421\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044C \u0438\u043D\u043F\u0443\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044C \u0442\u0435\u0433\u0438 \u0438 \u0444\u0438\u043B\u044C\u0442\u0440 \u043F\u0443\u0441\u0442 (\u043F\u0443\u0441\u0442\u043E\u0435 \u043F\u043E\u043B\u0435 \u0431\u0435\u0437 \u0442\u0435\u0433\u043E\u0432 \u2014 \u0438\u043D\u043F\u0443\u0442 \u0441 \u043F\u043B\u0435\u0439\u0441\u0445\u043E\u043B\u0434\u0435\u0440\u043E\u043C \u043D\u0430 \u0432\u0441\u044E \u0448\u0438\u0440\u0438\u043D\u0443). */\n const inputCollapsed = !expanded && inputTrim.length === 0 && selected.length > 0;\n\n const visibleCount = useChipOverflow({\n rowRef: chipsRef,\n measureRef,\n inputRef,\n count: chips.length,\n inputCollapsed,\n });\n const visibleChips = expanded ? chips : chips.slice(0, visibleCount);\n const hiddenChips = expanded ? [] : chips.slice(visibleCount);\n\n /* \u0420\u0430\u0441\u043A\u0440\u044B\u043B\u043E\u0441\u044C \u2014 \u0432\u0432\u043E\u0434 \u0432\u0438\u0434\u0435\u043D (\u043E\u043D \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 \u0432 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043C\u043E\u043C \u0440\u044F\u0434\u0443). */\n React.useEffect(() => {\n if (!expanded) return;\n const row = chipsRef.current;\n if (row) row.scrollTop = row.scrollHeight;\n }, [expanded]);\n\n const focusInput = () => {\n inputRef.current?.focus();\n };\n\n const handleControlBlur = React.useCallback((e: React.FocusEvent<HTMLDivElement>) => {\n const inside = (node: unknown) =>\n node instanceof Node &&\n (triggerRef.current?.contains(node) || listboxRef.current?.contains(node));\n if (inside(e.relatedTarget)) return;\n window.requestAnimationFrame(() => {\n if (inside(document.activeElement)) return;\n setFocusWithin(false);\n setInputValue(\"\");\n });\n }, []);\n\n const onChipKeyDown = (e: React.KeyboardEvent<HTMLElement>, index: number) => {\n if (e.target !== e.currentTarget) return;\n const all = chipElements();\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n all[Math.max(0, index - 1)]?.focus();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n (all[index + 1] ?? inputRef.current)?.focus();\n } else if ((e.key === \"Delete\" || e.key === \"Backspace\") && !disabled) {\n e.preventDefault();\n const chip = chips[index];\n if (!chip) return;\n /* Backspace \u2014 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0442\u0435\u0433\u0443, Delete \u2014 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443; \u0431\u0435\u0437 \u0442\u0435\u0433\u043E\u0432 \u2014 \u0432 \u0432\u0432\u043E\u0434. */\n const nextIndex = e.key === \"Backspace\" ? index - 1 : index;\n pendingChipFocus.current = chips.length > 1 ? Math.max(0, nextIndex) : -1;\n removeValue(chip.value, chip.label);\n }\n };\n\n const renderChip = (\n c: { value: string; label: string; color: PaletteColor },\n measure = false,\n index = 0,\n ) => (\n <Tag.Root\n key={c.value}\n color={c.color}\n disabled={disabled}\n className={styles.chip}\n labels={{ remove: withLabel(labels.remove, c.label) }}\n /* \u0424\u043E\u043A\u0443\u0441 \u043F\u043E \u0441\u0442\u0440\u0435\u043B\u043A\u0430\u043C \u0438\u0437 \u0432\u0432\u043E\u0434\u0430 (\u043D\u0435 \u0442\u0430\u0431-\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430); Delete / Backspace \u0443\u0434\u0430\u043B\u044F\u044E\u0442. */\n tabIndex={measure || disabled ? undefined : -1}\n data-chip-value={measure ? undefined : c.value}\n onKeyDown={measure ? undefined : (e) => onChipKeyDown(e, index)}\n onRemove={() => {\n if (!measure) removeValue(c.value, c.label);\n }}\n /* \u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0432\u043E\u0434\u0438\u0442 \u0444\u043E\u043A\u0443\u0441 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438 \u043D\u0435 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A. */\n onMouseDown={(e) => {\n if ((e.target as Element).closest(\"button\")) e.preventDefault();\n }}\n onClick={(e) => {\n if ((e.target as Element).closest(\"button\")) e.stopPropagation();\n }}\n >\n <span className={styles.chipLabel}>{c.label}</span>\n </Tag.Root>\n );\n\n return (\n <FieldFrame\n size={size}\n ids={ids}\n label={label}\n required={required}\n optional={optional}\n hint={hint}\n error={error}\n disabled={disabled}\n optionalLabel={labels.optional}\n className={className}\n >\n <ControlSizeProvider value={size}>\n {/* \u0421\u043E\u0441\u0442\u0430\u0432\u043D\u043E\u0439 \u043A\u043E\u043D\u0442\u0440\u043E\u043B: \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0442\u0430\u0431-\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u2014 input[role=combobox]; \u043A\u043B\u0438\u043A \u043F\u043E \u043F\u043E\u043B\u044E \u0432\u0435\u0434\u0451\u0442 \u043A \u0444\u043E\u043A\u0443\u0441\u0443 \u0432\u0432\u043E\u0434\u0430. */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: \u043C\u0443\u043B\u044C\u0442\u0438\u0432\u044B\u0431\u043E\u0440 \u0441 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u043C combobox */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u0430 input \u0438 listbox */}\n <div\n ref={triggerRef}\n className={styles.control}\n onClick={(e) => {\n if (disabled) return;\n /* \u041A\u043B\u0438\u043A \u043F\u043E \u0447\u0438\u043F\u0443 \u0441\u0442\u0430\u0432\u0438\u0442 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0447\u0438\u043F (\u0434\u043B\u044F \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B), \u043F\u043E \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u043F\u043E\u043B\u044E \u2014 \u0432 \u0432\u0432\u043E\u0434. */\n if (!(e.target as Element).closest(\"[data-chip-value]\")) focusInput();\n if (hasPanelContent) setOpen(true);\n }}\n onFocus={() => setFocusWithin(true)}\n onBlur={handleControlBlur}\n {...toDataAttributes({\n size,\n expanded: expanded || undefined,\n state: open ? \"open\" : \"closed\",\n disabled: disabled || undefined,\n invalid: invalid || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n >\n <div ref={chipsRef} className={styles.chips}>\n {visibleChips.map((c, index) => renderChip(c, false, index))}\n {hiddenChips.length > 0 ? (\n /* \u041D\u0430\u0441\u0442\u043E\u044F\u0449\u0430\u044F \u043A\u043D\u043E\u043F\u043A\u0430: \u043A\u043B\u0438\u043A \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u0435\u0442 \u043A \u043F\u043E\u043B\u044E \u2014 \u043E\u043D\u043E \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0438 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A. */\n <button\n type=\"button\"\n className={styles.moreButton}\n disabled={disabled}\n aria-label={labels.more.replace(\"{count}\", String(hiddenChips.length))}\n title={hiddenChips.map((c) => c.label).join(\", \")}\n >\n <Tag.Root disabled={disabled} className={styles.chipMore} aria-hidden>\n +{hiddenChips.length}\n </Tag.Root>\n </button>\n ) : null}\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n aria-describedby={ids.describedBy}\n aria-activedescendant={\n open && highlightedValue ? tagOptionDomId(listboxId, highlightedValue) : undefined\n }\n disabled={disabled}\n placeholder={selected.length === 0 ? placeholder : undefined}\n className={cx(styles.input, inputCollapsed && styles.inputCollapsed)}\n value={inputValue}\n onChange={(e) => {\n const next = e.target.value;\n setInputValue(next);\n const nextTrim = next.trim();\n const nextMerged = mergeOptionsWithCreated(options, createdOptions);\n const nextPick = optionsForList(nextMerged, next, selected);\n const nextShowCreate = shouldShowCreate(creatable, nextTrim, selected, nextMerged);\n if (nextPick.length > 0 || nextShowCreate) {\n setOpen(true);\n } else {\n setOpen(false);\n }\n }}\n onKeyDown={onInputKeyDown}\n onFocus={() => {\n if (!disabled && hasPanelContent) setOpen(true);\n }}\n />\n </div>\n <span className={styles.srOnly} role=\"status\" aria-live=\"polite\">\n {announcement}\n </span>\n\n {/* \u041D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0439 \u0440\u044F\u0434 \u0432\u0441\u0435\u0445 \u0447\u0438\u043F\u043E\u0432 \u2014 \u0448\u0438\u0440\u0438\u043D\u044B \u0434\u043B\u044F \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u00AB+N\u00BB. */}\n <div ref={measureRef} className={styles.measure} aria-hidden inert>\n {chips.map((c) => renderChip(c, true))}\n <Tag.Root className={styles.chipMore}>+{Math.max(chips.length, 9)}</Tag.Root>\n </div>\n\n <span className={styles.chevronSlot} aria-hidden>\n <ChevronIcon />\n </span>\n </div>\n\n <Portal>\n <ScrollContainer\n ref={listboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-hidden={!open}\n tabIndex={-1}\n data-react-aria-top-layer=\"true\"\n data-overlay-portal-layer={overlayPortalLayer}\n className={cx(styles.panel, overlayMotion.floating)}\n onKeyDown={onListboxKeyDown}\n onAnimationEnd={presence.onExitEnd}\n style={{ display: presence.mounted ? undefined : \"none\" }}\n {...toDataAttributes({ side: resolvedSide, size, state: presence.state })}\n >\n {labels.panelHint ? <div className={styles.hint}>{labels.panelHint}</div> : null}\n\n {showCreate ? (\n <button\n key={CREATE_VALUE}\n id={tagOptionDomId(listboxId, CREATE_VALUE)}\n type=\"button\"\n role=\"option\"\n aria-selected={false}\n tabIndex={-1}\n className={styles.option}\n {...toDataAttributes({\n value: CREATE_VALUE,\n label: inputTrim,\n highlighted: highlightedValue === CREATE_VALUE,\n disabled: false,\n })}\n onMouseDown={(e) => {\n e.preventDefault();\n }}\n onMouseMove={() => setHighlightedValue(CREATE_VALUE)}\n onClick={() => handleSelectFromList(CREATE_VALUE)}\n >\n <span className={styles.optionLead} aria-hidden>\n <PlusIcon />\n </span>\n <span className={styles.createLabel}>{labels.create}</span>\n <Tag.Root color={defaultColor} className={styles.chip}>\n <span className={styles.chipLabel}>{inputTrim}</span>\n </Tag.Root>\n </button>\n ) : null}\n\n {filteredForPick.map((o) => {\n const chip = (\n <Tag.Root\n color={o.color ?? defaultColor}\n disabled={o.disabled}\n className={styles.chip}\n >\n <span className={styles.chipLabel}>{o.label}</span>\n </Tag.Root>\n );\n const isSelected = selected.includes(o.value);\n const checkbox = (\n <span className={styles.optionCheckbox} aria-hidden>\n {isSelected ? <CheckIcon /> : null}\n </span>\n );\n const rowData = toDataAttributes({\n value: o.value,\n label: o.label,\n highlighted: highlightedValue === o.value,\n selected: isSelected,\n disabled: Boolean(o.disabled),\n });\n if (manageable) {\n return (\n <div\n key={o.value}\n id={tagOptionDomId(listboxId, o.value)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n aria-disabled={o.disabled || undefined}\n className={cx(styles.option, styles.optionManaged)}\n {...rowData}\n onMouseMove={() => !o.disabled && setHighlightedValue(o.value)}\n >\n <button\n type=\"button\"\n tabIndex={-1}\n className={styles.optionSelect}\n disabled={o.disabled}\n onMouseDown={(e) => {\n if (!o.disabled) e.preventDefault();\n }}\n onClick={() => !o.disabled && handleSelectFromList(o.value)}\n >\n {checkbox}\n {chip}\n </button>\n {!o.disabled ? (\n <TagOptionManagePopover\n option={o}\n open={manageOpenValue === o.value}\n onOpenChange={(next) => setManageOpenValue(next ? o.value : null)}\n defaultColor={defaultColor}\n onUpdate={handleOptionUpdate}\n onDelete={handleOptionDelete}\n labels={labels}\n disabled={disabled}\n />\n ) : null}\n </div>\n );\n }\n return (\n <button\n key={o.value}\n id={tagOptionDomId(listboxId, o.value)}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n disabled={o.disabled}\n className={styles.option}\n {...rowData}\n onMouseDown={(e) => {\n if (!o.disabled) e.preventDefault();\n }}\n onMouseMove={() => !o.disabled && setHighlightedValue(o.value)}\n onClick={() => !o.disabled && handleSelectFromList(o.value)}\n >\n {checkbox}\n {chip}\n </button>\n );\n })}\n </ScrollContainer>\n </Portal>\n </ControlSizeProvider>\n </FieldFrame>\n );\n}\n\nTagSelectRoot.displayName = \"TagSelect.Root\";\n\nexport const TagSelect = {\n Root: TagSelectRoot,\n};\n", "/* \u2500\u2500\u2500 TagSelect \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Field = field system (same fill, height, padding, states as Select/Input).\n * At rest the field is one row: chips that do not fit collapse into a \"+N\" button. Focused or open\n * (`data-expanded`) it grows to show every chip on wrapped rows (up to 3, then it scrolls inside)\n * and collapses back on blur / close; the height animates with the motion tokens.\n * Chips are `Tag` in the badge tier one step below the field.\n */\n\n.control,\n.panel {\n --ts-h: var(--prime-control-m-height);\n --ts-px: var(--prime-control-m-field-padding-x);\n --ts-gap: var(--prime-control-m-gap);\n --ts-icon: var(--prime-control-m-icon);\n --ts-radius: var(--prime-control-m-radius);\n --ts-text: var(--prime-control-m-text-size);\n --ts-lh: var(--prime-control-m-line-height);\n --ts-item-h: var(--prime-control-m-item-height);\n --ts-choice: var(--prime-control-s-choice);\n /* Chip row = badge tier one step down (foundation \u00A76). */\n --ts-row: var(--prime-badge-s-height);\n}\n\n[data-size=\"xs\"]:is(.control, .panel) {\n --ts-h: var(--prime-control-xs-height);\n --ts-px: var(--prime-control-xs-field-padding-x);\n --ts-gap: var(--prime-control-xs-gap);\n --ts-icon: var(--prime-control-xs-icon);\n --ts-radius: var(--prime-control-xs-radius);\n --ts-text: var(--prime-control-xs-text-size);\n --ts-lh: var(--prime-control-xs-line-height);\n --ts-item-h: var(--prime-control-xs-item-height);\n --ts-choice: var(--prime-control-xs-choice);\n --ts-row: var(--prime-badge-xs-height);\n}\n\n[data-size=\"s\"]:is(.control, .panel) {\n --ts-h: var(--prime-control-s-height);\n --ts-px: var(--prime-control-s-field-padding-x);\n --ts-gap: var(--prime-control-s-gap);\n --ts-icon: var(--prime-control-s-icon);\n --ts-radius: var(--prime-control-s-radius);\n --ts-text: var(--prime-control-s-text-size);\n --ts-lh: var(--prime-control-s-line-height);\n --ts-item-h: var(--prime-control-s-item-height);\n --ts-choice: var(--prime-control-xs-choice);\n --ts-row: var(--prime-badge-xs-height);\n}\n\n[data-size=\"l\"]:is(.control, .panel) {\n --ts-h: var(--prime-control-l-height);\n --ts-px: var(--prime-control-l-field-padding-x);\n --ts-gap: var(--prime-control-l-gap);\n --ts-icon: var(--prime-control-l-icon);\n --ts-radius: var(--prime-control-l-radius);\n --ts-text: var(--prime-control-l-text-size);\n --ts-lh: var(--prime-control-l-line-height);\n --ts-item-h: var(--prime-control-l-item-height);\n --ts-choice: var(--prime-control-m-choice);\n --ts-row: var(--prime-badge-m-height);\n}\n\n[data-size=\"xl\"]:is(.control, .panel) {\n --ts-h: var(--prime-control-xl-height);\n --ts-px: var(--prime-control-xl-field-padding-x);\n --ts-gap: var(--prime-control-xl-gap);\n --ts-icon: var(--prime-control-xl-icon);\n --ts-radius: var(--prime-control-xl-radius);\n --ts-text: var(--prime-control-xl-text-size);\n --ts-lh: var(--prime-control-xl-line-height);\n --ts-item-h: var(--prime-control-xl-item-height);\n --ts-choice: var(--prime-control-l-choice);\n --ts-row: var(--prime-badge-l-height);\n}\n\n/* \u2500\u2500\u2500 Field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.control {\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n /* Chevron centered between the text and the edge: text\u2192icon = icon\u2192edge = padX (foundation \u00A76). */\n gap: var(--ts-px);\n width: 100%;\n min-width: 0;\n height: var(--ts-h);\n padding-block: 0;\n /* Chips sit closer to the edge than text (padX \u2212 4); the chevron side keeps padX. */\n padding-inline: calc(var(--ts-px) - var(--prime-space-1)) var(--ts-px);\n border-radius: var(--ts-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--ts-text);\n line-height: var(--ts-lh);\n cursor: text;\n /* `height: auto` of the expanded field animates where the browser supports it. */\n interpolate-size: allow-keywords;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n height var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n/* \u041F\u0443\u0441\u0442\u043E\u0435 \u043F\u043E\u043B\u0435: \u043F\u043B\u0435\u0439\u0441\u0445\u043E\u043B\u0434\u0435\u0440 \u0441\u0442\u043E\u0438\u0442 \u043D\u0430 \u043C\u0435\u0441\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u043E\u043B\u044F. */\n.control:not(:has(.chips > .chip)) {\n padding-inline-start: var(--ts-px);\n}\n\n.control:hover:not([data-disabled=\"true\"]) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.control:focus-within:not([data-disabled=\"true\"]),\n.control[data-state=\"open\"] {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.control:not([data-focus-ring=\"false\"]):has(.input:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.control[data-invalid=\"true\"] {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.control[data-invalid=\"true\"]:has(.input:focus-visible) {\n outline-color: var(--prime-color-danger-border);\n}\n\n.control[data-disabled=\"true\"] {\n background: var(--prime-color-field-bg-disabled);\n box-shadow: none;\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* Clips / scrolls focusable chips: padded by the focus space so rings are never cut (\u00A77 a);\n the negative margin keeps the chips where they were. */\n.chips {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--prime-space-1);\n min-width: 0;\n margin: calc(-1 * var(--prime-focus-space));\n padding: var(--prime-focus-space);\n overflow: hidden;\n}\n\n.input {\n flex: 1 0 var(--prime-space-12);\n min-width: var(--prime-space-12);\n height: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n outline: none;\n}\n\n/* \u0421\u0432\u0451\u0440\u043D\u0443\u0442\u044B\u0439 \u0432\u0432\u043E\u0434: \u043C\u0435\u0441\u0442\u043E \u043F\u043E\u0434 \u0447\u0438\u043F\u044B, \u043D\u043E \u043F\u043E\u043B\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441\u0438\u0440\u0443\u0435\u043C\u044B\u043C. */\n.inputCollapsed {\n flex: 1 1 0;\n min-width: 0;\n width: 0;\n}\n\n.input::placeholder {\n color: var(--prime-color-text-placeholder);\n}\n\n.input:disabled {\n cursor: not-allowed;\n}\n\n.chevronSlot {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--ts-icon);\n height: var(--ts-icon);\n color: var(--prime-color-text-muted);\n pointer-events: none;\n}\n\n.chevronSlot svg {\n display: block;\n width: 100%;\n height: 100%;\n transition: transform var(--prime-motion-duration-base) var(--prime-motion-easing-standard);\n}\n\n.control[data-state=\"open\"] .chevronSlot svg {\n transform: rotate(180deg);\n}\n\n.control[data-disabled=\"true\"] .chevronSlot {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u041D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0439 \u0440\u044F\u0434 \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u044F \u0448\u0438\u0440\u0438\u043D \u0447\u0438\u043F\u043E\u0432. */\n.measure {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n display: flex;\n gap: var(--prime-space-1);\n visibility: hidden;\n pointer-events: none;\n white-space: nowrap;\n}\n\n/* \u2500\u2500\u2500 Expanded (focused / open): every chip, wrapped rows, max 3 rows then scroll \u2500\u2500\u2500 */\n\n.control[data-expanded=\"true\"] {\n align-items: flex-start;\n height: auto;\n min-height: var(--ts-h);\n padding-block: calc((var(--ts-h) - var(--ts-row)) / 2);\n}\n\n.control[data-expanded=\"true\"] .chips {\n flex-wrap: wrap;\n max-height: calc(3 * var(--ts-row) + 2 * var(--prime-space-1) + 2 * var(--prime-focus-space));\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-width: thin;\n}\n\n.control[data-expanded=\"true\"] .input {\n height: var(--ts-row);\n}\n\n.control[data-expanded=\"true\"] .chevronSlot {\n margin-block-start: calc((var(--ts-row) - var(--ts-icon)) / 2);\n}\n\n/* \u2500\u2500\u2500 Chips: `Tag` (soft badge, tier one step below the field) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* A chip may shrink to an ellipsis; \"+N\" never does. */\n.chip {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.chipLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chipMore {\n flex-shrink: 0;\n}\n\n/* Chip focused with the arrow keys (outer ring; the row is padded by the focus space). */\n.chip:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n/* \"+N\" is a real button around a Tag. */\n.moreButton {\n display: inline-flex;\n flex-shrink: 0;\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-s);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n}\n\n.moreButton:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset);\n}\n\n.moreButton:disabled {\n cursor: not-allowed;\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n margin: calc(-1 * var(--prime-border-width));\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/*\n * Chips sit on the field's own wash (foundation \u00A74): neutral chips take a stronger wash, hue chips a\n * wash of their hue, so every chip clearly steps off the field in both themes.\n */\n.control .chip[data-color=\"gray\"]:not([data-disabled=\"true\"]),\n.control .chipMore:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-strong);\n}\n\n/* Hue chips: a translucent wash of the hue text instead of the opaque light tint, which is as light\n as the field wash in the light theme. */\n.control .chip:not([data-color=\"gray\"], [data-disabled=\"true\"]) {\n background: color-mix(in srgb, currentColor 16%, transparent);\n}\n\n/* \u2500\u2500\u2500 Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel {\n --prime-color-field-bg: var(--prime-color-field-bg-surface);\n\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: max-content;\n min-width: min(\n max(var(--prime-panel-min-width), var(--float-min-w, 0px)),\n var(--float-max-w, 100vw)\n );\n max-width: min(calc(var(--prime-panel-min-width) * 2), var(--float-max-w, 100vw));\n max-height: min(var(--prime-panel-max-height), var(--float-max-h, var(--prime-panel-max-height)));\n padding: var(--prime-panel-padding);\n border-radius: var(--prime-panel-radius);\n background: var(--prime-color-bg-raised);\n box-shadow: var(--prime-shadow-overlay);\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--ts-text);\n line-height: var(--ts-lh);\n outline: none;\n}\n\n.panel[aria-hidden=\"true\"] {\n pointer-events: none;\n}\n\n.panel[data-overlay-portal-layer=\"page\"] {\n z-index: var(--prime-z-dropdown);\n}\n\n.panel[data-overlay-portal-layer=\"drawer\"] {\n z-index: var(--prime-z-dropdown-in-drawer);\n}\n\n.panel[data-overlay-portal-layer=\"modal\"] {\n z-index: var(--prime-z-dropdown-in-modal);\n}\n\n.panel[data-overlay-portal-layer=\"drawerInModal\"] {\n z-index: var(--prime-z-dropdown-in-drawer-in-modal);\n}\n\n.hint {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.option {\n box-sizing: border-box;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--ts-gap);\n width: 100%;\n min-height: var(--ts-item-h);\n margin: 0;\n padding-block: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n border: 0;\n border-radius: var(--prime-panel-item-radius);\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n text-align: start;\n cursor: pointer;\n outline: none;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.option[data-highlighted=\"true\"]:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-subtle);\n}\n\n.option:active:not([data-disabled=\"true\"]) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n.option[data-disabled=\"true\"] {\n color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n/* \u0421\u0442\u0440\u043E\u043A\u0430 \u0441 \u043C\u0435\u043D\u044E \u22EF: \u043A\u043D\u043E\u043F\u043A\u0430 \u0432\u044B\u0431\u043E\u0440\u0430 \u043D\u0430 \u0432\u0441\u044E \u0448\u0438\u0440\u0438\u043D\u0443 + \u043A\u043D\u043E\u043F\u043A\u0430 \u0441\u043F\u0440\u0430\u0432\u0430. */\n.optionManaged {\n padding-inline-end: var(--prime-space-1);\n cursor: default;\n}\n\n.optionSelect {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: var(--ts-gap);\n min-width: 0;\n height: var(--ts-item-h);\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.optionSelect:disabled {\n cursor: not-allowed;\n}\n\n/* Fixed leading column: checkbox (add to selection) / plus (create). */\n.optionCheckbox,\n.optionLead {\n box-sizing: border-box;\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: var(--ts-choice);\n height: var(--ts-choice);\n}\n\n.optionCheckbox {\n border-radius: var(--prime-radius-xs);\n background: var(--prime-color-fill-strong);\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.option[data-highlighted=\"true\"] .optionCheckbox {\n background: var(--prime-color-fill-strong-hover);\n}\n\n/* Selected option: checked box (unchecking removes the tag). */\n.option[data-selected=\"true\"] .optionCheckbox {\n background: var(--prime-color-accent-default);\n color: var(--prime-color-accent-fg);\n}\n\n.optionCheckbox svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.option[data-disabled=\"true\"] .optionCheckbox {\n background: var(--prime-color-fill-muted);\n}\n\n.optionLead {\n color: var(--prime-color-text-muted);\n}\n\n.optionLead svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.createLabel {\n flex-shrink: 0;\n color: var(--prime-color-text-muted);\n}\n\n.optionMenuTrigger {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: calc(var(--ts-item-h) - var(--prime-space-2));\n height: calc(var(--ts-item-h) - var(--prime-space-2));\n padding: 0;\n border: 0;\n border-radius: var(--prime-radius-s);\n background: transparent;\n color: var(--prime-color-text-muted);\n cursor: pointer;\n opacity: 0;\n transition:\n opacity var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.option[data-highlighted=\"true\"] .optionMenuTrigger,\n.optionMenuTrigger:focus-visible,\n.optionMenuTrigger[aria-expanded=\"true\"] {\n opacity: 1;\n}\n\n@media (hover: none) {\n .optionMenuTrigger {\n opacity: 1;\n }\n}\n\n.optionMenuTrigger:hover:not(:disabled) {\n background: var(--prime-color-fill-subtle-active);\n color: var(--prime-color-text-primary);\n}\n\n.optionMenuTrigger:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: 0;\n}\n\n.optionMenuTrigger:disabled {\n cursor: not-allowed;\n}\n\n.optionMenuDots {\n display: block;\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n}\n\n/* \u2500\u2500\u2500 Manage popover (rename, delete, color) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.managePopoverSurface {\n min-width: var(--prime-panel-min-width);\n padding: var(--prime-panel-padding);\n}\n\n.managePopoverShell {\n display: flex;\n flex-direction: column;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.manageField {\n padding: var(--prime-space-1);\n}\n\n.manageDelete {\n justify-content: flex-start;\n width: 100%;\n}\n\n.manageDeleteIcon {\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n}\n\n.manageSeparator {\n height: 0;\n margin-block: var(--prime-panel-padding);\n margin-inline: calc(-1 * var(--prime-panel-padding));\n border: 0;\n border-top: var(--prime-border-width) solid var(--prime-color-border-subtle);\n}\n\n.manageColorsHeading {\n display: flex;\n align-items: center;\n min-height: var(--prime-panel-group-label-height);\n padding-inline: var(--prime-panel-item-padding-x);\n color: var(--prime-color-text-muted);\n font-size: var(--prime-text-caption-size);\n font-weight: var(--prime-font-weight-medium);\n line-height: var(--prime-text-caption-line-height);\n letter-spacing: var(--prime-text-caption-tracking);\n}\n\n.manageColorList {\n display: flex;\n flex-direction: column;\n}\n\n.manageColorRow {\n display: flex;\n align-items: center;\n gap: var(--prime-control-s-gap);\n width: 100%;\n min-height: var(--prime-control-s-item-height);\n padding-block: 0;\n padding-inline: var(--prime-panel-item-padding-x);\n border: 0;\n border-radius: var(--prime-panel-item-radius);\n background: transparent;\n color: var(--prime-color-text-primary);\n font-family: inherit;\n font-size: var(--prime-control-s-text-size);\n line-height: var(--prime-control-s-line-height);\n text-align: start;\n cursor: pointer;\n}\n\n.manageColorRow:hover {\n background: var(--prime-color-fill-subtle);\n}\n\n.manageColorRow:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.manageColorSwatch {\n flex-shrink: 0;\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n border-radius: var(--prime-radius-xs);\n background: var(--prime-color-palette-gray-solid);\n}\n\n.manageColorSwatch[data-color=\"red\"] {\n background: var(--prime-color-palette-red-solid);\n}\n\n.manageColorSwatch[data-color=\"blue\"] {\n background: var(--prime-color-palette-blue-solid);\n}\n\n.manageColorSwatch[data-color=\"green\"] {\n background: var(--prime-color-palette-green-solid);\n}\n\n.manageColorSwatch[data-color=\"orange\"] {\n background: var(--prime-color-palette-orange-solid);\n}\n\n.manageColorSwatch[data-color=\"yellow\"] {\n background: var(--prime-color-palette-yellow-solid);\n}\n\n.manageColorSwatch[data-color=\"purple\"] {\n background: var(--prime-color-palette-purple-solid);\n}\n\n.manageColorSwatch[data-color=\"sky\"] {\n background: var(--prime-color-palette-sky-solid);\n}\n\n.manageColorSwatch[data-color=\"pink\"] {\n background: var(--prime-color-palette-pink-solid);\n}\n\n.manageColorSwatch[data-color=\"teal\"] {\n background: var(--prime-color-palette-teal-solid);\n}\n\n.manageColorLabel {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.manageCheck,\n.manageCheckPlaceholder {\n flex-shrink: 0;\n width: var(--prime-icon-s);\n height: var(--prime-icon-s);\n color: var(--prime-color-accent-text);\n}\n", "import * as React from \"react\";\nimport { Hint } from \"@/components/hint/Hint\";\nimport { Label } from \"@/components/label/Label\";\nimport { useFieldIds } from \"@/hooks/useFieldIds\";\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { createComponentContext } from \"@/internal/context\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { mergeRefs } from \"@/internal/mergeRefs\";\nimport type { ControlSize } from \"@/internal/states\";\n\nimport styles from \"./Textarea.module.css\";\n\nexport type TextareaLabels = {\n /** Muted marker after the label when `optional`. */\n optional: string;\n /** Screen-reader text of `Textarea.Counter`; `{current}` and `{max}` are replaced. */\n counter: string;\n};\n\nconst TEXTAREA_LABELS: TextareaLabels = {\n optional: \"\u043D\u0435\u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E\",\n counter: \"{current} \u0438\u0437 {max} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432\",\n};\n\nconst [TextareaProvider, useTextareaContext] = createComponentContext<{ labels: TextareaLabels }>(\n \"Textarea\",\n);\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TextareaRootProps = Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"size\" | \"children\"\n> & {\n size?: ControlSize;\n /** Invalid state: danger ring and `aria-invalid`. A non-empty `error` implies it. */\n invalid?: boolean;\n /**\n * Draws the focus ring on the field box (default). `false` hides only the visual ring \u2014 focus,\n * keyboard and ARIA are unchanged, the error ring still shows. Turn it off only where focus is\n * otherwise obvious (a single search field with a caret, e.g. a command palette); WCAG 2.4.7.\n */\n focusRing?: boolean;\n label?: React.ReactNode;\n /** Shows the muted optional marker after the label text (`labels.optional`). */\n optional?: boolean;\n hint?: React.ReactNode;\n /** Error message; replaces the hint in the same slot and implies `invalid`. */\n error?: React.ReactNode;\n /** Right-aligned slot of the support row, e.g. `<Textarea.Counter current={n} max={500} />`. */\n counter?: React.ReactNode;\n /** Always render the support row so an appearing error does not shift the layout. */\n reserveSupportRow?: boolean;\n /** Height follows the content. `false` \u2192 fixed height with native vertical resize. */\n autoResize?: boolean;\n /** Called with the new string value; native `onChange` still fires. */\n onValueChange?: (value: string) => void;\n labels?: Partial<TextareaLabels>;\n};\n\nconst TextareaRoot = React.forwardRef<HTMLTextAreaElement, TextareaRootProps>(\n (\n {\n id,\n className,\n size = \"m\",\n invalid: invalidProp = false,\n focusRing = true,\n label,\n required,\n optional = false,\n hint,\n error,\n counter,\n reserveSupportRow = false,\n autoResize = true,\n disabled,\n readOnly,\n value,\n onInput,\n onChange,\n onValueChange,\n labels: labelsProp,\n \"aria-describedby\": ariaDescribedBy,\n ...rest\n },\n ref,\n ) => {\n const showError = error != null && error !== false && error !== \"\";\n const invalid = invalidProp || showError;\n const showHint = !showError && hint != null && hint !== false;\n const { inputId, hintId, errorId, describedBy } = useFieldIds(id, {\n hasHint: showHint,\n hasError: showError,\n extraDescribedBy: ariaDescribedBy,\n });\n const labels = React.useMemo(() => ({ ...TEXTAREA_LABELS, ...labelsProp }), [labelsProp]);\n const showSupport = showHint || showError || counter != null || reserveSupportRow;\n\n const innerRef = React.useRef<HTMLTextAreaElement | null>(null);\n const setRefs = React.useMemo(() => mergeRefs(innerRef, ref), [ref]);\n const mirrorRef = React.useRef<HTMLDivElement>(null);\n\n // The auto-resize mirror copies the text; sync it on mount and on controlled value changes.\n React.useLayoutEffect(() => {\n if (!autoResize || !mirrorRef.current || !innerRef.current) return;\n mirrorRef.current.dataset.value = typeof value === \"string\" ? value : innerRef.current.value;\n }, [autoResize, value]);\n\n // Clicking the padding of the field focuses the textarea (the box is a div, not a label,\n // so the counter and hints never leak into the accessible name).\n const handleControlMouseDown = React.useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const textarea = innerRef.current;\n if (!textarea || e.target === textarea || textarea.disabled) return;\n e.preventDefault();\n textarea.focus();\n }, []);\n\n const textarea = (\n <textarea\n ref={setRefs}\n id={inputId}\n className={cx(styles.textarea, autoResize && styles.textareaAutoResize)}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n value={value}\n onInput={(event) => {\n if (autoResize && mirrorRef.current) {\n mirrorRef.current.dataset.value = event.currentTarget.value;\n }\n onInput?.(event);\n }}\n onChange={(event) => {\n onChange?.(event);\n onValueChange?.(event.target.value);\n }}\n {...rest}\n />\n );\n\n const contextValue = React.useMemo(() => ({ labels }), [labels]);\n\n return (\n <TextareaProvider value={contextValue}>\n <ControlSizeProvider value={size}>\n <div\n className={styles.field}\n {...toDataAttributes({ size, invalid: invalid || undefined })}\n >\n {label != null ? (\n <div className={styles.header}>\n <Label.Root\n htmlFor={inputId}\n size={size}\n disabled={disabled}\n required={required}\n optional={optional}\n labels={{ optional: labels.optional }}\n >\n {label}\n </Label.Root>\n </div>\n ) : null}\n <div className={styles.body}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: pointer convenience only; the textarea itself is the focus target */}\n <div\n className={cx(styles.control, className)}\n onMouseDown={handleControlMouseDown}\n {...toDataAttributes({\n size,\n invalid: invalid || undefined,\n disabled: disabled || undefined,\n readonly: readOnly || undefined,\n \"focus-ring\": focusRing ? undefined : false,\n })}\n >\n {autoResize ? (\n <div ref={mirrorRef} className={styles.autoResize} data-value=\"\">\n {textarea}\n </div>\n ) : (\n textarea\n )}\n </div>\n {showSupport ? (\n <div className={styles.support} data-reserve={reserveSupportRow || undefined}>\n {showError ? (\n <Hint.Root id={errorId} size={size} invalid className={styles.supportText}>\n {error}\n </Hint.Root>\n ) : showHint ? (\n <Hint.Root\n id={hintId}\n size={size}\n disabled={disabled}\n className={styles.supportText}\n >\n {hint}\n </Hint.Root>\n ) : (\n <span className={styles.supportText} />\n )}\n {counter != null ? <div className={styles.supportCounter}>{counter}</div> : null}\n </div>\n ) : null}\n </div>\n </div>\n </ControlSizeProvider>\n </TextareaProvider>\n );\n },\n);\n\nTextareaRoot.displayName = \"Textarea.Root\";\n\n// \u2500\u2500\u2500 Counter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TextareaCounterProps = {\n current: number;\n max: number;\n className?: string;\n};\n\n/** Character counter for the `counter` slot; turns danger when `current > max`. */\nfunction TextareaCounter({ current, max, className }: TextareaCounterProps) {\n const { labels } = useTextareaContext();\n const spoken = labels.counter.replace(\"{current}\", String(current)).replace(\"{max}\", String(max));\n return (\n <span\n className={cx(styles.counter, className)}\n data-invalid={current > max ? \"true\" : undefined}\n aria-live=\"polite\"\n >\n <span aria-hidden=\"true\">\n {current}/{max}\n </span>\n <span className={styles.srOnly}>{spoken}</span>\n </span>\n );\n}\n\nTextareaCounter.displayName = \"Textarea.Counter\";\n\nexport const Textarea = {\n Root: TextareaRoot,\n Counter: TextareaCounter,\n};\n", "/*\n * Textarea follows the Input field system (see Input.module.css): fill-based box, tier text,\n * label above (label-gap), support row below (hint-gap) with hint | error and a right-aligned counter.\n * Vertical padding = (control height \u2212 line height) / 2, so one line sits exactly like an Input.\n */\n.field {\n --prime-textarea-height: var(--prime-control-m-height);\n --prime-textarea-padding-x: var(--prime-control-m-field-padding-x);\n --prime-textarea-radius: var(--prime-control-m-radius);\n --prime-textarea-body-size: var(--prime-control-m-text-size);\n --prime-textarea-line-height: var(--prime-control-m-line-height);\n --prime-textarea-label-size: var(--prime-control-m-label-size);\n --prime-textarea-label-line-height: var(--prime-control-m-label-line-height);\n --prime-textarea-hint-size: var(--prime-control-m-hint-size);\n --prime-textarea-hint-line-height: var(--prime-control-m-hint-line-height);\n --prime-textarea-label-gap: var(--prime-control-m-label-gap);\n --prime-textarea-hint-gap: var(--prime-control-m-hint-gap);\n --prime-textarea-padding-y: calc(\n (var(--prime-textarea-height) - var(--prime-textarea-line-height)) /\n 2\n );\n /* Minimum content height: three lines. */\n --prime-textarea-inner-min-height: calc(var(--prime-textarea-line-height) * 3);\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--prime-textarea-label-gap);\n font-family: var(--prime-font-family-sans);\n}\n\n.field[data-size=\"xs\"] {\n --prime-textarea-height: var(--prime-control-xs-height);\n --prime-textarea-padding-x: var(--prime-control-xs-field-padding-x);\n --prime-textarea-radius: var(--prime-control-xs-radius);\n --prime-textarea-body-size: var(--prime-control-xs-text-size);\n --prime-textarea-line-height: var(--prime-control-xs-line-height);\n --prime-textarea-label-size: var(--prime-control-xs-label-size);\n --prime-textarea-label-line-height: var(--prime-control-xs-label-line-height);\n --prime-textarea-hint-size: var(--prime-control-xs-hint-size);\n --prime-textarea-hint-line-height: var(--prime-control-xs-hint-line-height);\n --prime-textarea-label-gap: var(--prime-control-xs-label-gap);\n --prime-textarea-hint-gap: var(--prime-control-xs-hint-gap);\n}\n\n.field[data-size=\"s\"] {\n --prime-textarea-height: var(--prime-control-s-height);\n --prime-textarea-padding-x: var(--prime-control-s-field-padding-x);\n --prime-textarea-radius: var(--prime-control-s-radius);\n --prime-textarea-body-size: var(--prime-control-s-text-size);\n --prime-textarea-line-height: var(--prime-control-s-line-height);\n --prime-textarea-label-size: var(--prime-control-s-label-size);\n --prime-textarea-label-line-height: var(--prime-control-s-label-line-height);\n --prime-textarea-hint-size: var(--prime-control-s-hint-size);\n --prime-textarea-hint-line-height: var(--prime-control-s-hint-line-height);\n --prime-textarea-label-gap: var(--prime-control-s-label-gap);\n --prime-textarea-hint-gap: var(--prime-control-s-hint-gap);\n}\n\n.field[data-size=\"l\"] {\n --prime-textarea-height: var(--prime-control-l-height);\n --prime-textarea-padding-x: var(--prime-control-l-field-padding-x);\n --prime-textarea-radius: var(--prime-control-l-radius);\n --prime-textarea-body-size: var(--prime-control-l-text-size);\n --prime-textarea-line-height: var(--prime-control-l-line-height);\n --prime-textarea-label-size: var(--prime-control-l-label-size);\n --prime-textarea-label-line-height: var(--prime-control-l-label-line-height);\n --prime-textarea-hint-size: var(--prime-control-l-hint-size);\n --prime-textarea-hint-line-height: var(--prime-control-l-hint-line-height);\n --prime-textarea-label-gap: var(--prime-control-l-label-gap);\n --prime-textarea-hint-gap: var(--prime-control-l-hint-gap);\n}\n\n.field[data-size=\"xl\"] {\n --prime-textarea-height: var(--prime-control-xl-height);\n --prime-textarea-padding-x: var(--prime-control-xl-field-padding-x);\n --prime-textarea-radius: var(--prime-control-xl-radius);\n --prime-textarea-body-size: var(--prime-control-xl-text-size);\n --prime-textarea-line-height: var(--prime-control-xl-line-height);\n --prime-textarea-label-size: var(--prime-control-xl-label-size);\n --prime-textarea-label-line-height: var(--prime-control-xl-label-line-height);\n --prime-textarea-hint-size: var(--prime-control-xl-hint-size);\n --prime-textarea-hint-line-height: var(--prime-control-xl-hint-line-height);\n --prime-textarea-label-gap: var(--prime-control-xl-label-gap);\n --prime-textarea-hint-gap: var(--prime-control-xl-hint-gap);\n}\n\n/* \u2500\u2500 Header \u2500\u2500 */\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n column-gap: var(--prime-space-1);\n min-width: 0;\n}\n\n.body {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--prime-textarea-hint-gap);\n}\n\n/* \u2500\u2500 Field box \u2500\u2500 */\n.control {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n display: flex;\n flex-direction: column;\n padding: var(--prime-textarea-padding-y) var(--prime-textarea-padding-x);\n border-radius: var(--prime-textarea-radius);\n background: var(--prime-color-field-bg);\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-border-control);\n color: var(--prime-color-text-primary);\n cursor: text;\n transition:\n background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard),\n box-shadow var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.control:hover:not(:focus-within):not([data-disabled=\"true\"]):not([data-readonly=\"true\"]) {\n background: color-mix(in srgb, var(--prime-color-field-bg) 94%, var(--prime-color-text-primary));\n}\n\n.control:has(textarea:focus-visible) {\n background: var(--prime-color-field-bg-focus);\n}\n\n/* `focusRing={false}` (data-focus-ring=\"false\") hides only the ring; the error ring stays. */\n.control:not([data-focus-ring=\"false\"]):has(textarea:focus-visible) {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.control[data-invalid=\"true\"] {\n box-shadow: inset 0 0 0 var(--prime-border-width) var(--prime-color-danger-border);\n}\n\n.control[data-invalid=\"true\"]:has(textarea:focus-visible) {\n outline-color: var(--prime-color-danger-border);\n}\n\n.control[data-disabled=\"true\"] {\n background: var(--prime-color-field-bg-disabled);\n color: var(--prime-color-text-disabled);\n box-shadow: none;\n cursor: not-allowed;\n}\n\n.control[data-readonly=\"true\"] {\n cursor: default;\n}\n\n/* \u2500\u2500 Auto-resize wrapper (CSS grid mirror trick) \u2500\u2500 */\n.autoResize {\n display: grid;\n min-width: 0;\n width: 100%;\n}\n\n.autoResize::after {\n content: attr(data-value) \" \";\n grid-area: 1 / 1 / 2 / 2;\n visibility: hidden;\n min-width: 0;\n min-height: var(--prime-textarea-inner-min-height);\n /* Must match .textarea exactly, otherwise the mirror and the text differ in height. */\n padding: 0;\n border: 0;\n font-family: inherit;\n font-size: var(--prime-textarea-body-size);\n font-weight: inherit;\n line-height: var(--prime-textarea-line-height);\n letter-spacing: inherit;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/* \u2500\u2500 Textarea element \u2500\u2500 */\n.textarea {\n -webkit-appearance: none;\n appearance: none;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n outline: none;\n box-shadow: none;\n resize: vertical;\n font: inherit;\n font-size: var(--prime-textarea-body-size);\n line-height: var(--prime-textarea-line-height);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.textarea:focus,\n.textarea:focus-visible {\n outline: none;\n}\n\n/* autoResize: the textarea shares the grid cell with the mirror and never scrolls. */\n.textareaAutoResize {\n grid-area: 1 / 1 / 2 / 2;\n resize: none;\n overflow: hidden;\n}\n\n.textarea:not(.textareaAutoResize) {\n min-height: var(--prime-textarea-inner-min-height);\n}\n\n.textarea::placeholder {\n color: var(--prime-color-text-placeholder);\n opacity: 1;\n}\n\n.textarea:disabled {\n color: var(--prime-color-text-disabled);\n -webkit-text-fill-color: var(--prime-color-text-disabled);\n cursor: not-allowed;\n}\n\n.textarea:disabled::placeholder {\n color: var(--prime-color-text-disabled);\n}\n\n/* \u2500\u2500 Support row: hint | error \u00B7 counter \u2500\u2500 */\n.support {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--prime-space-2);\n min-width: 0;\n}\n\n.support[data-reserve=\"true\"] {\n min-height: var(--prime-textarea-hint-line-height);\n}\n\n.supportText {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.supportCounter {\n flex-shrink: 0;\n}\n\n.counter {\n display: block;\n font-size: var(--prime-textarea-hint-size);\n line-height: var(--prime-textarea-hint-line-height);\n font-variant-numeric: tabular-nums;\n color: var(--prime-color-text-muted);\n white-space: nowrap;\n}\n\n.counter[data-invalid=\"true\"] {\n color: var(--prime-color-danger-text);\n}\n\n.srOnly {\n position: absolute;\n width: var(--prime-border-width);\n height: var(--prime-border-width);\n padding: 0;\n margin: calc(-1 * var(--prime-border-width));\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n", "import * as React from \"react\";\n\nimport { ControlSizeProvider } from \"@/internal/ControlSizeContext\";\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport { Slot } from \"@/internal/slot\";\nimport type { ControlSize, PaletteColor, Tone } from \"@/internal/states\";\n\nimport styles from \"./Timeline.module.css\";\n\n// \u2500\u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TimelineRootProps = {\n /** Tier of text, dots and row rhythm. Default `m` (rows 64px). */\n size?: ControlSize;\n /**\n * Who gets the highlighted look (pill, accent title and dot):\n * `selected` (default) \u2014 the `active` row keeps it; interactive rows get a faint hover wash.\n * `hover` \u2014 the row under the pointer or with keyboard focus, transiently; `active` keeps only\n * its semantics (`aria-current`), no persistent highlight.\n */\n highlight?: \"selected\" | \"hover\";\n /** `Timeline.Group` elements. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">;\n\nconst TimelineRoot = React.forwardRef<HTMLDivElement, TimelineRootProps>(function TimelineRoot(\n { size = \"m\", highlight = \"selected\", children, className, ...rest },\n ref,\n) {\n return (\n <ControlSizeProvider value={size}>\n <div\n {...rest}\n ref={ref}\n className={cx(styles.root, className)}\n {...toDataAttributes({ size, highlight })}\n >\n {children}\n </div>\n </ControlSizeProvider>\n );\n});\nTimelineRoot.displayName = \"Timeline.Root\";\n\n// \u2500\u2500\u2500 Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TimelineGroupProps = {\n /** Group heading (e.g. \u00AB\u041D\u0435\u0434\u0430\u0432\u043D\u043E\u00BB); labels the list via `aria-labelledby`. */\n label?: React.ReactNode;\n /** `Timeline.Item` and `Timeline.Gap` elements. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.OlHTMLAttributes<HTMLOListElement>, \"children\">;\n\n/** One labelled `<ol>` of events. The connecting line runs from its first dot to its last. */\nconst TimelineGroup = React.forwardRef<HTMLOListElement, TimelineGroupProps>(function TimelineGroup(\n { label, children, className, ...rest },\n ref,\n) {\n const labelId = React.useId();\n const hasLabel = label !== undefined && label !== null && label !== false;\n return (\n <div className={styles.group}>\n {hasLabel ? (\n <div id={labelId} className={styles.groupLabel}>\n {label}\n </div>\n ) : null}\n <ol\n aria-labelledby={hasLabel ? labelId : undefined}\n {...rest}\n ref={ref}\n className={cx(styles.list, className)}\n >\n {children}\n </ol>\n </div>\n );\n});\nTimelineGroup.displayName = \"Timeline.Group\";\n\n// \u2500\u2500\u2500 Item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TimelineItemProps = {\n /** Decorative dot hue (categorization). Default `blue`, shown at reduced emphasis. */\n color?: PaletteColor;\n /** Semantic dot color (status). Wins over `color`; shown at full emphasis. */\n tone?: Tone;\n /** Highlighted / selected row: soft pill, accent title and dot; `data-state=\"active\"`, `aria-current`. */\n active?: boolean;\n /** Renders the row as a link. */\n href?: string;\n /** Renders the row as the single child element (router link etc.); the dot is prepended to its children. */\n asChild?: boolean;\n /** Renders the row as a `button` (unless `href` / `asChild`). */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** `Timeline.Title`, `Timeline.Meta`, `Timeline.Value`. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLElement>, \"children\" | \"color\" | \"onClick\"> &\n Pick<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"target\" | \"rel\" | \"download\">;\n\nconst TimelineItem = React.forwardRef<HTMLElement, TimelineItemProps>(function TimelineItem(\n { color = \"blue\", tone, active = false, href, asChild, onClick, children, className, ...rest },\n ref,\n) {\n const interactive = Boolean(asChild || href || onClick);\n const state = active ? \"active\" : \"inactive\";\n const rowProps = {\n ...rest,\n className: cx(styles.row, className),\n \"aria-current\": active ? (\"true\" as const) : undefined,\n ...toDataAttributes({\n state,\n color: tone ? undefined : color,\n tone,\n interactive: interactive || undefined,\n }),\n };\n const dot = <span className={styles.dot} aria-hidden=\"true\" />;\n\n let row: React.ReactNode;\n if (asChild) {\n const child = React.Children.only(children) as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n row = (\n <Slot {...rowProps} ref={ref} onClick={onClick}>\n {React.cloneElement(\n child,\n undefined,\n <>\n {dot}\n {child.props.children}\n </>,\n )}\n </Slot>\n );\n } else if (href) {\n row = (\n <a {...rowProps} ref={ref as React.Ref<HTMLAnchorElement>} href={href} onClick={onClick}>\n {dot}\n {children}\n </a>\n );\n } else if (onClick) {\n row = (\n <button\n {...(rowProps as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick}\n >\n {dot}\n {children}\n </button>\n );\n } else {\n row = (\n <div {...rowProps} ref={ref as React.Ref<HTMLDivElement>}>\n {dot}\n {children}\n </div>\n );\n }\n\n return (\n <li className={styles.item} data-state={state}>\n {row}\n </li>\n );\n});\nTimelineItem.displayName = \"Timeline.Item\";\n\n// \u2500\u2500\u2500 Parts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TimelineTitleProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** First line: the event. Medium, primary (accent on the active row); wraps when narrow. */\nfunction TimelineTitle({ children, className, ...rest }: TimelineTitleProps) {\n return (\n <span {...rest} className={cx(styles.title, className)}>\n {children}\n </span>\n );\n}\nTimelineTitle.displayName = \"Timeline.Title\";\n\nexport type TimelineMetaProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Second line: date and relative time, muted, tabular numbers. Emphasize a part with `Timeline.MetaPrimary` or `<strong>`. */\nfunction TimelineMeta({ children, className, ...rest }: TimelineMetaProps) {\n return (\n <span {...rest} className={cx(styles.meta, className)}>\n {children}\n </span>\n );\n}\nTimelineMeta.displayName = \"Timeline.Meta\";\n\nexport type TimelineMetaPrimaryProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Emphasized part of the meta line (the date): primary, medium. */\nfunction TimelineMetaPrimary({ children, className, ...rest }: TimelineMetaPrimaryProps) {\n return (\n <span {...rest} className={cx(styles.metaPrimary, className)}>\n {children}\n </span>\n );\n}\nTimelineMetaPrimary.displayName = \"Timeline.MetaPrimary\";\n\nexport type TimelineValueProps = {\n /** Text color. Default `neutral` (primary text). */\n tone?: Tone;\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/**\n * Trailing amount: right-aligned, vertically centered, tabular numbers. Add `Timeline.ValueMeta` for a\n * muted second line. Moves under the meta below 20rem.\n */\nfunction TimelineValue({ tone = \"neutral\", children, className, ...rest }: TimelineValueProps) {\n return (\n <span {...rest} className={cx(styles.value, className)} {...toDataAttributes({ tone })}>\n {children}\n </span>\n );\n}\nTimelineValue.displayName = \"Timeline.Value\";\n\nexport type TimelineValueMetaProps = {\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">;\n\n/** Second line inside `Timeline.Value` (category, unit): meta size, muted, right-aligned under the value. */\nfunction TimelineValueMeta({ children, className, ...rest }: TimelineValueMetaProps) {\n return (\n <span {...rest} className={cx(styles.valueMeta, className)}>\n {children}\n </span>\n );\n}\nTimelineValueMeta.displayName = \"Timeline.ValueMeta\";\n\n// \u2500\u2500\u2500 Gap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type TimelineGapProps = {\n /** Caption color and hollow dot. Default `neutral` (muted); `warning` / `danger` flag a long interval. */\n tone?: Tone;\n /** Optional trailing caption on the right (e.g. \u00AB\u0441\u0435\u0439\u0447\u0430\u0441\u00BB). */\n trailing?: React.ReactNode;\n /** Interval caption, e.g. \u00AB40 \u0434\u043D\u0435\u0439 \u00B7 2 200 \u043A\u043C \u0431\u0435\u0437 \u043E\u0431\u0441\u043B\u0443\u0436\u0438\u0432\u0430\u043D\u0438\u044F\u00BB. */\n children: React.ReactNode;\n className?: string;\n} & Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">;\n\n/**\n * Interval between two events: a shorter row with a small hollow dot on a dashed segment and a\n * muted caption. Renders an `li`, so it goes inside `Timeline.Group` between items.\n */\nconst TimelineGap = React.forwardRef<HTMLDivElement, TimelineGapProps>(function TimelineGap(\n { tone = \"neutral\", trailing, children, className, ...rest },\n ref,\n) {\n const hasTrailing = trailing !== undefined && trailing !== null && trailing !== false;\n return (\n <li className={cx(styles.item, styles.gapItem)}>\n <div\n {...rest}\n ref={ref}\n className={cx(styles.gapRow, className)}\n {...toDataAttributes({ tone })}\n >\n <span className={styles.gapDot} aria-hidden=\"true\" />\n <span className={styles.gapCaption}>{children}</span>\n {hasTrailing ? <span className={styles.gapTrailing}>{trailing}</span> : null}\n </div>\n </li>\n );\n});\nTimelineGap.displayName = \"Timeline.Gap\";\n\nexport const Timeline = {\n Root: TimelineRoot,\n Group: TimelineGroup,\n Item: TimelineItem,\n Title: TimelineTitle,\n Meta: TimelineMeta,\n MetaPrimary: TimelineMetaPrimary,\n Value: TimelineValue,\n ValueMeta: TimelineValueMeta,\n Gap: TimelineGap,\n};\n", "/*\n * Timeline \u2014 Graphite. Activity feed: labelled `ol` groups of rows.\n * Row grid: dot column \u00B7 text (title over meta) \u00B7 value (centered on the row, right-aligned).\n * The 2px `border-subtle` line is drawn per `li` around the dot and spans the first to the last dot.\n * Active row: `fill-subtle-active` pill (radius l), accent title and dot. Interactive rows:\n * hover `fill-subtle`, inset focus ring. Below 20rem of root width the value moves under the meta.\n */\n\n.root {\n --tl-title-size: var(--prime-control-m-text-size);\n --tl-title-line-height: var(--prime-control-m-line-height);\n --tl-meta-size: var(--prime-text-body-s-size);\n --tl-meta-line-height: var(--prime-text-body-s-line-height);\n --tl-label-size: var(--prime-text-title-s-size);\n --tl-label-line-height: var(--prime-text-title-s-line-height);\n --tl-label-tracking: var(--prime-text-title-s-tracking);\n --tl-label-gap: var(--prime-space-2);\n --tl-group-gap: var(--prime-space-4);\n --tl-dot: calc(var(--prime-space-2) + var(--prime-border-width) * 2);\n --tl-gap-dot: var(--prime-space-2);\n --tl-gap-pad-y: var(--prime-space-2);\n --tl-dot-col: var(--prime-space-6);\n --tl-gap: var(--prime-space-4);\n --tl-pad-y: var(--prime-space-3);\n --tl-pad-start: var(--prime-space-2);\n --tl-pad-end: var(--prime-space-4);\n --tl-line: calc(var(--prime-border-width) * 2);\n\n /* Fill the available width: an inline-size container collapses inside shrink-wrapped parents. */\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n gap: var(--tl-group-gap);\n inline-size: 100%;\n min-width: 0;\n font-family: var(--prime-font-family-sans);\n}\n\n.root[data-size=\"xs\"] {\n --tl-title-size: var(--prime-control-xs-text-size);\n --tl-title-line-height: var(--prime-control-xs-line-height);\n --tl-meta-size: var(--prime-text-caption-size);\n --tl-meta-line-height: var(--prime-text-caption-line-height);\n --tl-label-size: var(--prime-text-caption-size);\n --tl-label-line-height: var(--prime-text-caption-line-height);\n --tl-label-tracking: var(--prime-text-caption-tracking);\n --tl-label-gap: var(--prime-space-1);\n --tl-group-gap: var(--prime-space-3);\n --tl-dot: var(--prime-space-2);\n --tl-gap-pad-y: var(--prime-space-1);\n --tl-dot-col: var(--prime-space-4);\n --tl-gap: var(--prime-space-2);\n --tl-pad-y: var(--prime-space-1);\n --tl-pad-start: var(--prime-space-1);\n --tl-pad-end: var(--prime-space-2);\n}\n\n.root[data-size=\"s\"] {\n --tl-title-size: var(--prime-control-s-text-size);\n --tl-title-line-height: var(--prime-control-s-line-height);\n --tl-meta-size: var(--prime-text-caption-size);\n --tl-meta-line-height: var(--prime-text-caption-line-height);\n --tl-label-size: var(--prime-text-body-s-size);\n --tl-label-line-height: var(--prime-text-body-s-line-height);\n --tl-label-gap: var(--prime-space-1);\n --tl-dot: var(--prime-space-2);\n --tl-gap-pad-y: var(--prime-space-1);\n --tl-dot-col: var(--prime-space-5);\n --tl-gap: var(--prime-space-3);\n --tl-pad-y: var(--prime-space-2);\n --tl-pad-start: var(--prime-space-1);\n --tl-pad-end: var(--prime-space-3);\n}\n\n.root[data-size=\"l\"] {\n --tl-title-size: var(--prime-control-l-text-size);\n --tl-title-line-height: var(--prime-control-l-line-height);\n --tl-meta-size: var(--prime-text-body-m-size);\n --tl-meta-line-height: var(--prime-text-body-m-line-height);\n --tl-label-size: var(--prime-text-title-m-size);\n --tl-label-line-height: var(--prime-text-title-m-line-height);\n --tl-label-tracking: var(--prime-text-title-m-tracking);\n --tl-label-gap: var(--prime-space-2);\n --tl-group-gap: var(--prime-space-5);\n --tl-dot: var(--prime-space-3);\n --tl-gap-dot: calc(var(--prime-space-2) + var(--prime-border-width) * 2);\n --tl-dot-col: var(--prime-space-7);\n}\n\n.root[data-size=\"xl\"] {\n --tl-title-size: var(--prime-control-xl-text-size);\n --tl-title-line-height: var(--prime-control-xl-line-height);\n --tl-meta-size: var(--prime-text-body-m-size);\n --tl-meta-line-height: var(--prime-text-body-m-line-height);\n --tl-label-size: var(--prime-text-title-m-size);\n --tl-label-line-height: var(--prime-text-title-m-line-height);\n --tl-label-tracking: var(--prime-text-title-m-tracking);\n --tl-label-gap: var(--prime-space-3);\n --tl-group-gap: var(--prime-space-5);\n --tl-dot: var(--prime-space-3);\n --tl-gap-dot: calc(var(--prime-space-2) + var(--prime-border-width) * 2);\n --tl-gap-pad-y: var(--prime-space-3);\n --tl-dot-col: var(--prime-space-8);\n --tl-gap: var(--prime-space-5);\n --tl-pad-y: var(--prime-space-4);\n --tl-pad-start: var(--prime-space-3);\n --tl-pad-end: var(--prime-space-5);\n}\n\n/* ---------- Group ---------- */\n\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--tl-label-gap);\n min-width: 0;\n}\n\n.groupLabel {\n /* Starts at the dots' leading edge, so heading and dots share one vertical edge. */\n padding-inline: calc(var(--tl-pad-start) + (var(--tl-dot-col) - var(--tl-dot)) / 2)\n var(--tl-pad-end);\n color: var(--prime-color-text-primary);\n font-size: var(--tl-label-size);\n line-height: var(--tl-label-line-height);\n font-weight: var(--prime-font-weight-semibold);\n letter-spacing: var(--tl-label-tracking);\n overflow-wrap: anywhere;\n}\n\n.list {\n display: flex;\n flex-direction: column;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n/* ---------- Item + connecting line ---------- */\n\n.item {\n position: relative;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n/* Rows touch (no gap), so per-row segments form one line between the first and last dot centers.\n * `::before` runs from the row top to the dot, `::after` from the dot to the row bottom; the line\n * stops at the dot edge, so a translucent dot never shows the line through it. */\n.item::before,\n.item::after {\n content: \"\";\n position: absolute;\n inset-inline-start: calc(var(--tl-pad-start) + (var(--tl-dot-col) - var(--tl-line)) / 2);\n width: var(--tl-line);\n background: var(--prime-color-border-subtle);\n pointer-events: none;\n}\n\n.item::before {\n top: 0;\n bottom: calc(50% + var(--tl-dot) / 2);\n}\n\n.item::after {\n top: calc(50% + var(--tl-dot) / 2);\n bottom: 0;\n}\n\n.item:first-child::before,\n.item:last-child::after {\n display: none;\n}\n\n/* The interval around a `Timeline.Gap` is dashed end to end: the gap's own segments and the\n * neighbouring events' segments that face it. */\n.gapItem {\n --tl-dot: var(--tl-gap-dot);\n}\n\n.gapItem::before,\n.gapItem::after,\n.gapItem + .item::before,\n.item:has(+ .gapItem)::after {\n background: repeating-linear-gradient(\n to bottom,\n var(--prime-color-border-default) 0 var(--prime-space-1),\n transparent var(--prime-space-1) var(--prime-space-2)\n );\n}\n\n/* ---------- Row ---------- */\n\n.row {\n --tl-hue: var(--prime-color-palette-blue-solid);\n /* Decorative hues sit at reduced emphasis; tones and the active row use full color. */\n --tl-dot-color: color-mix(in srgb, var(--tl-hue) 55%, transparent);\n\n appearance: none;\n box-sizing: border-box;\n display: grid;\n grid-template-columns: var(--tl-dot-col) minmax(0, 1fr) auto;\n grid-template-areas:\n \"dot title value\"\n \"dot meta value\";\n grid-template-rows: auto auto;\n align-content: center;\n column-gap: var(--tl-gap);\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: var(--tl-pad-y) var(--tl-pad-end) var(--tl-pad-y) var(--tl-pad-start);\n border: 0;\n border-radius: var(--prime-radius-l);\n background: transparent;\n color: var(--prime-color-text-primary);\n font: inherit;\n font-size: var(--tl-title-size);\n line-height: var(--tl-title-line-height);\n text-align: start;\n text-decoration: none;\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.row[data-color=\"gray\"] {\n --tl-hue: var(--prime-color-palette-gray-solid);\n}\n\n.row[data-color=\"green\"] {\n --tl-hue: var(--prime-color-palette-green-solid);\n}\n\n.row[data-color=\"orange\"] {\n --tl-hue: var(--prime-color-palette-orange-solid);\n}\n\n.row[data-color=\"red\"] {\n --tl-hue: var(--prime-color-palette-red-solid);\n}\n\n.row[data-color=\"yellow\"] {\n --tl-hue: var(--prime-color-palette-yellow-solid);\n}\n\n.row[data-color=\"purple\"] {\n --tl-hue: var(--prime-color-palette-purple-solid);\n}\n\n.row[data-color=\"sky\"] {\n --tl-hue: var(--prime-color-palette-sky-solid);\n}\n\n.row[data-color=\"pink\"] {\n --tl-hue: var(--prime-color-palette-pink-solid);\n}\n\n.row[data-color=\"teal\"] {\n --tl-hue: var(--prime-color-palette-teal-solid);\n}\n\n.row[data-tone=\"neutral\"] {\n --tl-dot-color: var(--prime-color-text-muted);\n}\n\n.row[data-tone=\"accent\"] {\n --tl-dot-color: var(--prime-color-accent-default);\n}\n\n.row[data-tone=\"success\"] {\n --tl-dot-color: var(--prime-color-success-default);\n}\n\n.row[data-tone=\"warning\"] {\n --tl-dot-color: var(--prime-color-warning-default);\n}\n\n.row[data-tone=\"danger\"] {\n --tl-dot-color: var(--prime-color-danger-default);\n}\n\n.row[data-tone=\"info\"] {\n --tl-dot-color: var(--prime-color-info-default);\n}\n\n/*\n * Highlighted look: `fill-subtle-active` pill, accent title, accent dot (a `tone` keeps its dot).\n * `highlight=\"selected\"`: the `active` row keeps it; interactive rows get a faint hover wash.\n * `highlight=\"hover\"`: the row under the pointer or with keyboard focus gets it, transiently.\n */\n.root[data-highlight=\"selected\"] .row[data-state=\"active\"],\n.root[data-highlight=\"hover\"] .row:is(:hover, :focus-visible) {\n --tl-title-color: var(--prime-color-accent-text);\n\n background: var(--prime-color-fill-subtle-active);\n}\n\n.root[data-highlight=\"selected\"] .row[data-state=\"active\"]:not([data-tone]),\n.root[data-highlight=\"hover\"] .row:is(:hover, :focus-visible):not([data-tone]) {\n --tl-dot-color: var(--prime-color-accent-default);\n}\n\n.row[data-interactive=\"true\"] {\n cursor: pointer;\n}\n\n.root[data-highlight=\"selected\"] .row[data-interactive=\"true\"]:hover:not([data-state=\"active\"]) {\n background: var(--prime-color-fill-subtle);\n}\n\n.root[data-highlight=\"selected\"] .row[data-interactive=\"true\"]:active:not([data-state=\"active\"]) {\n background: var(--prime-color-fill-subtle-active);\n}\n\n/* Full-width list row: the ring is drawn inside its edge. */\n.row:focus-visible {\n outline: var(--prime-focus-width) solid var(--prime-color-focus-ring);\n outline-offset: var(--prime-focus-offset-inset);\n}\n\n.dot {\n grid-area: dot;\n align-self: center;\n justify-self: center;\n box-sizing: border-box;\n width: var(--tl-dot);\n height: var(--tl-dot);\n border-radius: 50%;\n background: var(--tl-dot-color);\n transition: background-color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n/* ---------- Text ---------- */\n\n.title {\n grid-area: title;\n min-width: 0;\n color: var(--tl-title-color, var(--prime-color-text-primary));\n font-weight: var(--prime-font-weight-medium);\n overflow-wrap: anywhere;\n transition: color var(--prime-motion-duration-fast) var(--prime-motion-easing-standard);\n}\n\n.meta {\n grid-area: meta;\n min-width: 0;\n color: var(--prime-color-text-muted);\n font-size: var(--tl-meta-size);\n line-height: var(--tl-meta-line-height);\n font-weight: var(--prime-font-weight-regular);\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n\n.metaPrimary,\n.meta strong {\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n}\n\n.value {\n grid-area: value;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n align-self: center;\n justify-self: end;\n color: var(--prime-color-text-primary);\n font-weight: var(--prime-font-weight-medium);\n font-variant-numeric: tabular-nums;\n text-align: end;\n white-space: nowrap;\n}\n\n.value[data-tone=\"accent\"] {\n color: var(--prime-color-accent-text);\n}\n\n.value[data-tone=\"success\"] {\n color: var(--prime-color-success-text);\n}\n\n.value[data-tone=\"warning\"] {\n color: var(--prime-color-warning-text);\n}\n\n.value[data-tone=\"danger\"] {\n color: var(--prime-color-danger-text);\n}\n\n.value[data-tone=\"info\"] {\n color: var(--prime-color-info-text);\n}\n\n/* Second line under the value (category, unit): meta size, muted, regular. */\n.valueMeta {\n color: var(--prime-color-text-muted);\n font-size: var(--tl-meta-size);\n line-height: var(--tl-meta-line-height);\n font-weight: var(--prime-font-weight-regular);\n}\n\n/* ---------- Gap: interval between events ---------- */\n\n.gapRow {\n --tl-gap-color: var(--prime-color-text-muted);\n --tl-gap-dot-color: var(--prime-color-text-muted);\n\n box-sizing: border-box;\n display: grid;\n grid-template-columns: var(--tl-dot-col) minmax(0, 1fr) auto;\n grid-template-areas: \"dot caption trailing\";\n align-items: center;\n column-gap: var(--tl-gap);\n width: 100%;\n min-width: 0;\n padding: var(--tl-gap-pad-y) var(--tl-pad-end) var(--tl-gap-pad-y) var(--tl-pad-start);\n color: var(--tl-gap-color);\n font-size: var(--tl-meta-size);\n line-height: var(--tl-meta-line-height);\n font-variant-numeric: tabular-nums;\n}\n\n.gapRow[data-tone=\"accent\"] {\n --tl-gap-color: var(--prime-color-accent-text);\n --tl-gap-dot-color: var(--prime-color-accent-default);\n}\n\n.gapRow[data-tone=\"success\"] {\n --tl-gap-color: var(--prime-color-success-text);\n --tl-gap-dot-color: var(--prime-color-success-default);\n}\n\n.gapRow[data-tone=\"warning\"] {\n --tl-gap-color: var(--prime-color-warning-text);\n --tl-gap-dot-color: var(--prime-color-warning-default);\n}\n\n.gapRow[data-tone=\"danger\"] {\n --tl-gap-color: var(--prime-color-danger-text);\n --tl-gap-dot-color: var(--prime-color-danger-default);\n}\n\n.gapRow[data-tone=\"info\"] {\n --tl-gap-color: var(--prime-color-info-text);\n --tl-gap-dot-color: var(--prime-color-info-default);\n}\n\n.gapDot {\n grid-area: dot;\n justify-self: center;\n box-sizing: border-box;\n width: var(--tl-dot);\n height: var(--tl-dot);\n border: var(--tl-line) solid var(--tl-gap-dot-color);\n border-radius: 50%;\n}\n\n.gapCaption {\n grid-area: caption;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.gapTrailing {\n grid-area: trailing;\n text-align: end;\n white-space: nowrap;\n}\n\n/* ---------- Narrow container: value under the meta ---------- */\n\n@container (max-width: 20rem) {\n .row {\n grid-template-columns: var(--tl-dot-col) minmax(0, 1fr);\n grid-template-areas:\n \"dot title\"\n \"dot meta\"\n \"dot value\";\n grid-template-rows: auto auto auto;\n }\n\n .value {\n align-items: flex-start;\n justify-self: start;\n text-align: start;\n white-space: normal;\n overflow-wrap: anywhere;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .row,\n .dot,\n .title {\n transition: none;\n }\n}\n", "import * as React from \"react\";\n\nimport { cx } from \"@/internal/cx\";\nimport { toDataAttributes } from \"@/internal/data-attributes\";\nimport type { TextTone } from \"@/internal/states\";\n\nimport styles from \"./Typography.module.css\";\n\n/** Text roles from the foundation (`--prime-text-<role>-*`). */\nexport type TypographyRole =\n | \"caption\"\n | \"body-s\"\n | \"body-m\"\n | \"body-l\"\n | \"title-s\"\n | \"title-m\"\n | \"title-l\"\n | \"heading-s\"\n | \"heading-m\"\n | \"heading-l\"\n | \"display-s\"\n | \"display-m\"\n | \"display-l\"\n | \"code\";\n\nexport type TypographyWeight = \"regular\" | \"medium\" | \"semibold\";\n\nexport type TypographyTracking = \"normal\" | \"tight\" | \"tighter\" | \"wide\";\n\nexport type TypographyAs =\n | \"p\"\n | \"span\"\n | \"div\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | \"small\"\n | \"blockquote\"\n | \"article\"\n | \"section\"\n | \"header\"\n | \"footer\"\n | \"aside\"\n | \"nav\"\n | \"main\";\n\nexport type TypographyRootProps = {\n as?: TypographyAs;\n /** Text role (`--prime-text-<role>-*`). */\n variant: TypographyRole;\n /** Overrides the role's weight. Omit to use the role's own weight. */\n weight?: TypographyWeight;\n /** Overrides the role's tracking. Omit to use the role's own tracking. */\n tracking?: TypographyTracking;\n /** Clamp to one line with an ellipsis (set `title` when the full text matters). */\n truncate?: boolean;\n italic?: boolean;\n /** Text color. Default `default` (primary text). */\n tone?: TextTone;\n children?: React.ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLElement>;\n\nconst TypographyRoot = React.forwardRef<HTMLElement, TypographyRootProps>(\n (\n {\n as: Tag = \"p\",\n variant,\n weight,\n tracking,\n truncate = false,\n italic = false,\n tone = \"default\",\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n return (\n <Tag\n ref={ref as never}\n className={cx(styles.root, className)}\n {...rest}\n {...toDataAttributes({\n variant,\n weight,\n tracking,\n tone: tone === \"default\" ? undefined : tone,\n ...(italic ? { italic: true } : {}),\n ...(truncate ? { truncate: true } : {}),\n })}\n >\n {children}\n </Tag>\n );\n },\n);\n\nTypographyRoot.displayName = \"Typography.Root\";\n\nexport const Typography = { Root: TypographyRoot };\n", "/*\n * Typography \u2014 one element per text role (`--prime-text-<role>-*`), exposed as `data-variant`.\n */\n.root {\n --t-size: var(--prime-text-body-m-size);\n --t-lh: var(--prime-text-body-m-line-height);\n --t-weight: var(--prime-text-body-m-weight);\n --t-tracking: var(--prime-text-body-m-tracking);\n\n margin: 0;\n color: var(--prime-color-text-primary);\n font-family: var(--prime-font-family-sans);\n font-size: var(--t-size);\n line-height: var(--t-lh);\n font-weight: var(--t-weight);\n letter-spacing: var(--t-tracking);\n font-style: normal;\n overflow-wrap: break-word;\n}\n\n/* Headings and titles balance their lines; reading text keeps natural rag. */\n.root:is([data-variant^=\"title-\"], [data-variant^=\"heading-\"], [data-variant^=\"display-\"]) {\n text-wrap: balance;\n}\n\n.root:is([data-variant^=\"body-\"], [data-variant=\"caption\"]) {\n text-wrap: pretty;\n}\n\n/* \u2500\u2500\u2500 Roles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-variant=\"caption\"] {\n --t-size: var(--prime-text-caption-size);\n --t-lh: var(--prime-text-caption-line-height);\n --t-weight: var(--prime-text-caption-weight);\n --t-tracking: var(--prime-text-caption-tracking);\n}\n\n.root[data-variant=\"body-s\"] {\n --t-size: var(--prime-text-body-s-size);\n --t-lh: var(--prime-text-body-s-line-height);\n --t-weight: var(--prime-text-body-s-weight);\n --t-tracking: var(--prime-text-body-s-tracking);\n}\n\n.root[data-variant=\"body-l\"] {\n --t-size: var(--prime-text-body-l-size);\n --t-lh: var(--prime-text-body-l-line-height);\n --t-weight: var(--prime-text-body-l-weight);\n --t-tracking: var(--prime-text-body-l-tracking);\n}\n\n.root[data-variant=\"title-s\"] {\n --t-size: var(--prime-text-title-s-size);\n --t-lh: var(--prime-text-title-s-line-height);\n --t-weight: var(--prime-text-title-s-weight);\n --t-tracking: var(--prime-text-title-s-tracking);\n}\n\n.root[data-variant=\"title-m\"] {\n --t-size: var(--prime-text-title-m-size);\n --t-lh: var(--prime-text-title-m-line-height);\n --t-weight: var(--prime-text-title-m-weight);\n --t-tracking: var(--prime-text-title-m-tracking);\n}\n\n.root[data-variant=\"title-l\"] {\n --t-size: var(--prime-text-title-l-size);\n --t-lh: var(--prime-text-title-l-line-height);\n --t-weight: var(--prime-text-title-l-weight);\n --t-tracking: var(--prime-text-title-l-tracking);\n}\n\n.root[data-variant=\"heading-s\"] {\n --t-size: var(--prime-text-heading-s-size);\n --t-lh: var(--prime-text-heading-s-line-height);\n --t-weight: var(--prime-text-heading-s-weight);\n --t-tracking: var(--prime-text-heading-s-tracking);\n}\n\n.root[data-variant=\"heading-m\"] {\n --t-size: var(--prime-text-heading-m-size);\n --t-lh: var(--prime-text-heading-m-line-height);\n --t-weight: var(--prime-text-heading-m-weight);\n --t-tracking: var(--prime-text-heading-m-tracking);\n}\n\n.root[data-variant=\"heading-l\"] {\n --t-size: var(--prime-text-heading-l-size);\n --t-lh: var(--prime-text-heading-l-line-height);\n --t-weight: var(--prime-text-heading-l-weight);\n --t-tracking: var(--prime-text-heading-l-tracking);\n}\n\n.root[data-variant=\"display-s\"] {\n --t-size: var(--prime-text-display-s-size);\n --t-lh: var(--prime-text-display-s-line-height);\n --t-weight: var(--prime-text-display-s-weight);\n --t-tracking: var(--prime-text-display-s-tracking);\n}\n\n.root[data-variant=\"display-m\"] {\n --t-size: var(--prime-text-display-m-size);\n --t-lh: var(--prime-text-display-m-line-height);\n --t-weight: var(--prime-text-display-m-weight);\n --t-tracking: var(--prime-text-display-m-tracking);\n}\n\n.root[data-variant=\"display-l\"] {\n --t-size: var(--prime-text-display-l-size);\n --t-lh: var(--prime-text-display-l-line-height);\n --t-weight: var(--prime-text-display-l-weight);\n --t-tracking: var(--prime-text-display-l-tracking);\n}\n\n.root[data-variant=\"code\"] {\n --t-size: var(--prime-text-code-size);\n --t-lh: var(--prime-text-code-line-height);\n --t-weight: var(--prime-text-code-weight);\n --t-tracking: var(--prime-text-code-tracking);\n\n font-family: var(--prime-font-family-mono);\n}\n\n/* \u2500\u2500\u2500 Overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.root[data-weight=\"regular\"] {\n --t-weight: var(--prime-font-weight-regular);\n}\n\n.root[data-weight=\"medium\"] {\n --t-weight: var(--prime-font-weight-medium);\n}\n\n.root[data-weight=\"semibold\"] {\n --t-weight: var(--prime-font-weight-semibold);\n}\n\n/* Tracking steps reuse the role scale: normal 0 \u00B7 tight \u22120.01em \u00B7 tighter \u22120.02em \u00B7 wide +0.01em. */\n.root[data-tracking=\"normal\"] {\n --t-tracking: var(--prime-text-body-m-tracking);\n}\n\n.root[data-tracking=\"tight\"] {\n --t-tracking: var(--prime-text-title-m-tracking);\n}\n\n.root[data-tracking=\"tighter\"] {\n --t-tracking: var(--prime-text-heading-m-tracking);\n}\n\n.root[data-tracking=\"wide\"] {\n --t-tracking: var(--prime-text-caption-tracking);\n}\n\n.root[data-italic=\"true\"] {\n font-style: italic;\n}\n\n.root[data-tone=\"secondary\"] {\n color: var(--prime-color-text-secondary);\n}\n\n.root[data-tone=\"muted\"] {\n color: var(--prime-color-text-muted);\n}\n\n.root[data-tone=\"accent\"] {\n color: var(--prime-color-accent-text);\n}\n\n.root[data-tone=\"success\"] {\n color: var(--prime-color-success-text);\n}\n\n.root[data-tone=\"warning\"] {\n color: var(--prime-color-warning-text);\n}\n\n.root[data-tone=\"danger\"] {\n color: var(--prime-color-danger-text);\n}\n\n.root[data-truncate=\"true\"] {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n}\n", "/**\n * Shared API vocabulary (docs/foundation.md \u00A710). One name per concept; components import\n * these types instead of declaring their own aliases.\n */\n\n/** Control size tiers: xs 28 \u00B7 s 32 \u00B7 m 36 \u00B7 l 40 \u00B7 xl 48. Default is always `m`. */\nexport const controlSizes = [\"xs\", \"s\", \"m\", \"l\", \"xl\"] as const;\nexport type ControlSize = (typeof controlSizes)[number];\n\n/** Visual treatment. */\nexport const variants = [\"solid\", \"soft\", \"outline\", \"ghost\"] as const;\nexport type Variant = (typeof variants)[number];\n\n/** Semantic color. Destructive is `danger`. */\nexport const tones = [\"neutral\", \"accent\", \"success\", \"warning\", \"danger\", \"info\"] as const;\nexport type Tone = (typeof tones)[number];\n\n/** Decorative palette color (Badge, Tag, Avatar). */\nexport const paletteColors = [\n \"gray\",\n \"blue\",\n \"green\",\n \"orange\",\n \"red\",\n \"yellow\",\n \"purple\",\n \"sky\",\n \"pink\",\n \"teal\",\n] as const;\nexport type PaletteColor = (typeof paletteColors)[number];\n\n/** Values of `data-state`. */\nexport const dataStates = [\n \"open\",\n \"closed\",\n \"checked\",\n \"unchecked\",\n \"indeterminate\",\n \"active\",\n \"inactive\",\n] as const;\nexport type DataState = (typeof dataStates)[number];\n\n/**\n * Text color (Typography, Icon). `default` is primary text, `secondary` and `muted` are the\n * two quieter steps; the rest map to the semantic `*-text` colors.\n */\nexport const textTones = [\n \"default\",\n \"secondary\",\n \"muted\",\n \"accent\",\n \"success\",\n \"warning\",\n \"danger\",\n] as const;\nexport type TextTone = (typeof textTones)[number];\n"],
5
- "mappings": "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",
6
- "names": ["React", "jsx", "React", "React", "root", "vertical", "horizontal", "both", "overscrollContain", "overscrollNone", "jsx", "ScrollContainer", "root", "nav", "panel", "header", "main", "jsx", "AppShellRoot", "AppShellHeader", "AppShellMain", "AppShellTemplate", "React", "React", "React", "React", "React", "React", "React", "dialog", "drawer", "floating", "scrim", "overlayFadeIn", "overlayFadeOut", "overlayDialogIn", "overlayDialogOut", "overlaySheetIn", "overlaySheetOut", "overlayDrawerIn", "overlayDrawerOut", "overlayFloatIn", "overlayFloatOut", "React", "content", "jsx", "React", "React", "React", "React", "jsx", "root", "panel", "header", "content", "group", "footer", "groupLabel", "item", "icon", "label", "badge", "shortcut", "scrim", "Fragment", "jsx", "jsxs", "SidebarRoot", "jsx", "jsxs", "SidebarContent", "Fragment", "SidebarItem", "SidebarToggle", "React", "root", "item", "header", "trigger", "icon", "arrow", "arrowIcon", "arrowIconOpen", "arrowIconRotate", "arrowIconClosed", "content", "contentInner", "jsx", "jsxs", "AccordionRoot", "AccordionItem", "AccordionHeader", "AccordionTrigger", "AccordionContent", "Icon", "React", "root", "groupOverflow", "image", "fallback", "status", "groupRoot", "jsx", "React", "root", "dot", "icon", "jsx", "React", "React", "root", "icon", "spinner", "prime-button-spin", "jsx", "jsxs", "root", "closeButton", "content", "icon", "title", "description", "actions", "actionsClose", "closeIcon", "jsx", "jsxs", "BannerRoot", "BannerCloseButton", "React", "X", "React", "React", "React", "root", "sizeXs", "sizeS", "sizeM", "sizeL", "sizeXl", "inherit", "jsx", "X", "React", "root", "jsx", "root", "list", "item", "text", "breadcrumbLink", "itemHome", "itemCurrent", "separator", "ellipsis", "autoCollapse", "srOnly", "Fragment", "jsx", "jsxs", "DEFAULT_LABELS", "React", "root", "item", "icon", "jsx", "React", "root", "iconBox", "lead", "headerRow", "stack", "label", "value", "description", "ctaBody", "media", "title", "sectionTitle", "delta", "actions", "sectionHeader", "sectionTrailing", "body", "chart", "list", "listHeader", "listItem", "split", "splitCell", "cover", "jsx", "CardRoot", "Tag", "CardList", "CardListItem", "React", "root", "icon", "jsx", "React", "root", "iconSlot", "asterisk", "sub", "optional", "jsx", "jsxs", "React", "React", "field", "labelRow", "controlCell", "input", "control", "svg", "checkPath", "indeterminateLine", "text", "hintSlot", "jsx", "jsxs", "CheckboxLabel", "React", "root", "code", "jsx", "CodeBlockRoot", "React", "React", "React", "root", "header", "body", "wrapper", "affix", "field", "inlineAffix", "icon", "badge", "action", "meta", "metaHint", "metaCounter", "counter", "srOnly", "jsx", "jsxs", "React", "React", "root", "label", "body", "jsx", "jsxs", "trigger", "nativeSelect", "nativeChevron", "content", "spinner", "selectSpin", "triggerMain", "triggerValue", "valueBody", "badge", "triggerIcon", "triggerChevronSlot", "triggerClear", "nativeWrap", "listbox", "search", "searchIcon", "searchInput", "item", "itemText", "itemIcon", "itemTitle", "itemDescription", "itemMeta", "itemMedia", "itemCheckSlot", "itemCheckbox", "group", "groupLabel", "separator", "status", "empty", "emptyText", "emptyHint", "jsx", "jsxs", "jsx", "jsxs", "placeholder", "display", "query", "panel", "slider", "sliderHeader", "sliderLabel", "sliderValue", "sliderTrack", "thumb", "thumbArea", "area", "formatSelectWrap", "channelStrip", "channelStripLead", "channelStripEyedropperBtn", "channelCell", "channelInput", "channelCellHex", "channelSuffix", "swatchPicker", "swatchItem", "swatch", "triggerSwatch", "triggerSwatchSvg", "field", "eyeDropperSquare", "Fragment", "jsx", "jsxs", "format", "jsx", "jsxs", "Fragment", "Panel", "EyeDropperButton", "Check", "React", "parseColor", "React", "popoverScroll", "header", "title", "description", "actions", "React", "jsx", "fill", "checker", "trigger", "option", "swatch", "label", "grid", "check", "Fragment", "jsx", "jsxs", "parseColor", "Swatch", "Trigger", "Check", "React", "shell", "prime-dialog", "header", "icon", "close", "title", "description", "body", "footer", "React", "React", "React", "jsx", "jsxs", "overlay", "content", "React", "jsx", "dialogOverlay", "dialogContent", "root", "tier", "dialogTitle", "dialogDescription", "inputRow", "inputIcon", "input", "item", "group", "list", "groupHeading", "groupHeadingRich", "itemIcon", "itemText", "itemLabel", "itemDescription", "itemShortcut", "empty", "emptyText", "emptyHint", "tagSection", "tagSectionLabel", "tagRow", "footer", "footerHintItem", "footerHint", "key", "jsx", "jsxs", "ChevronRight", "React", "ChevronRight", "root", "list", "button", "icon", "ellipsis", "summary", "summaryCurrent", "pageItem", "srOnly", "jsx", "jsxs", "ChevronRight", "root", "toolbar", "viewport", "table", "headCell", "headLabel", "sortButton", "sortIcon", "sortGlyph", "row", "cell", "selectCell", "toggleCell", "chevron", "toggle", "truncate", "dt-row-enter", "detailCell", "detailMotion", "detailRow", "dt-detail-enter", "detailContent", "firstColumnSticky", "stickyLead", "cornerCellSticky", "skeletonRow", "skeleton", "dt-pulse", "stateCell", "stateContent", "stateError", "sentinel", "srOnly", "footer", "meta", "pagination", "jsx", "jsxs", "DEFAULT_LABELS", "ChevronRight", "format", "startOfMonth", "subMonths", "ChevronDown", "ChevronLeft", "ChevronRight", "React", "panel", "trigger", "triggerIcon", "triggerChevron", "triggerLabel", "triggerBadge", "popover", "popoverBody", "presets", "presetTitle", "presetItem", "main", "months", "month", "monthHeader", "monthTitle", "nav", "navSpacer", "table", "rowGroup", "row", "weekday", "cell", "day", "outsideDay", "hint", "footer", "footerFields", "field", "fieldDate", "fieldTime", "dash", "footerActions", "_", "toDay", "Fragment", "jsx", "jsxs", "STEP_DOWN", "startOfMonth", "subMonths", "lo", "hi", "ChevronLeft", "ChevronRight", "format", "time", "ChevronDown", "React", "root", "cell", "jsx", "React", "root", "content", "jsx", "React", "root", "overlay", "panel", "jsx", "jsxs", "React", "content", "item", "itemIcon", "itemShortcut", "group", "block", "groupLabel", "separator", "header", "headerRow", "headerLeading", "headerMain", "headerTrailing", "headerTitle", "headerDescription", "headerDescriptionTruncate", "React", "layoutEqual", "jsx", "React", "root", "iconWrap", "title", "description", "actions", "jsx", "EmptyPageRoot", "EmptyPageTitle", "EmptyPageDescription", "Eye", "React", "React", "root", "scroller", "item", "label", "icon", "count", "description", "pill", "dot", "jsx", "jsxs", "prefersReducedMotion", "root", "toolbar", "toolbarLine1", "toolbarLine1End", "toolbarPaneSegment", "toolbarViewportSegment", "viewportLabel", "previewShell", "previewViewport", "previewInner", "codePane", "Fragment", "jsx", "jsxs", "Eye", "React", "React", "root", "header", "label", "value", "track", "jsx", "jsxs", "root", "input", "inner", "iconWrap", "copy", "title", "titleMuted", "browse", "browseLink", "dropBody", "actionsRow", "chip", "chipLabel", "item", "itemRow", "itemMain", "itemStack", "itemTextGroup", "itemName", "itemMeta", "itemMetaSep", "itemTryAgain", "itemActions", "itemFooter", "itemProgress", "formatBadge", "jsx", "jsxs", "format", "React", "root", "jsx", "X", "React", "viewport", "zone", "top", "bottom", "left", "center", "right", "stack", "item", "motion", "ntfFadeIn", "ntfShiftIn", "ntfExit", "card", "iconWrap", "icon", "content", "header", "title", "badge", "description", "actionRow", "closeButton", "progressTrack", "progressValue", "jsx", "jsxs", "X", "React", "jsx", "jsxs", "NotificationStackItem", "React", "root", "section", "header", "heading", "actions", "title", "description", "body", "jsx", "jsxs", "PageContentRoot", "PageContentSection", "PageContentTitle", "PageContentDescription", "React", "root", "track", "fill", "inner", "jsx", "jsxs", "clampProgress", "React", "field", "labelRow", "controlCell", "input", "control", "dot", "text", "hintSlot", "group", "jsx", "jsxs", "RadioLabel", "React", "root", "label", "visuallyHidden", "track", "segment", "jsx", "jsxs", "DEFAULT_LABELS", "React", "root", "header", "label", "value", "track", "jsx", "jsxs", "clamp", "formatValue", "Slider", "React", "root", "item", "separator", "separatorIcon", "step", "indicator", "check", "content", "title", "description", "arrow", "jsx", "StepperStep", "CheckIcon", "React", "field", "labelRow", "controlCell", "input", "track", "text", "hintSlot", "jsx", "jsxs", "SwitchLabel", "React", "root", "layout", "list", "indicator", "indicatorBar", "indicatorPill", "tab", "icon", "label", "labelText", "count", "description", "panel", "jsx", "jsxs", "EMPTY_RECT", "hasChildOfType", "wrapText", "React", "root", "body", "icon", "remove", "removeIcon", "jsx", "jsxs", "React", "control", "panel", "chips", "chip", "input", "inputCollapsed", "chevronSlot", "measure", "chipLabel", "chipMore", "moreButton", "srOnly", "hint", "option", "optionManaged", "optionSelect", "optionCheckbox", "optionLead", "createLabel", "optionMenuTrigger", "optionMenuDots", "managePopoverSurface", "managePopoverShell", "manageField", "manageDelete", "manageDeleteIcon", "manageSeparator", "manageColorsHeading", "manageColorList", "manageColorRow", "manageColorSwatch", "manageColorLabel", "manageCheck", "manageCheckPlaceholder", "Fragment", "jsx", "jsxs", "React", "field", "header", "body", "control", "autoResize", "textarea", "textareaAutoResize", "support", "supportText", "supportCounter", "counter", "srOnly", "jsx", "jsxs", "textarea", "React", "root", "group", "groupLabel", "list", "item", "gapItem", "row", "dot", "title", "meta", "metaPrimary", "value", "valueMeta", "gapRow", "gapDot", "gapCaption", "gapTrailing", "Fragment", "jsx", "jsxs", "TimelineRoot", "TimelineGroup", "TimelineItem", "TimelineGap", "React", "root", "jsx", "Tag"]
7
- }