@ryuzaki13/react-foundation-ui 1.4.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/dist/advanced-search/index.js +12 -11
  2. package/dist/advanced-search/index.js.map +1 -1
  3. package/dist/badge/index.js +1 -1
  4. package/dist/base-table/index.js +2 -2
  5. package/dist/button/index.js +1 -1
  6. package/dist/chunks/{CalendarView-KCkhCtK-.js → CalendarView-Z_XWk7aI.js} +8 -8
  7. package/dist/chunks/{CalendarView-KCkhCtK-.js.map → CalendarView-Z_XWk7aI.js.map} +1 -1
  8. package/dist/chunks/{ImageViewerRuntime-RN49by8Y.js → ImageViewerRuntime-BMs3BBkV.js} +4 -4
  9. package/dist/chunks/{ImageViewerRuntime-RN49by8Y.js.map → ImageViewerRuntime-BMs3BBkV.js.map} +1 -1
  10. package/dist/chunks/{TextEditorLexicalClient-CVTrglWP.js → TextEditorLexicalClient-CK8j3RA4.js} +16 -18
  11. package/dist/chunks/{TextEditorLexicalClient-CVTrglWP.js.map → TextEditorLexicalClient-CK8j3RA4.js.map} +1 -1
  12. package/dist/chunks/{badge-Cri0-kVK.js → badge-DwIUjH0a.js} +2 -2
  13. package/dist/chunks/{badge-Cri0-kVK.js.map → badge-DwIUjH0a.js.map} +1 -1
  14. package/dist/chunks/{base-table-D5IqsjQD.js → base-table-BFsVwXg3.js} +13 -12
  15. package/dist/chunks/{base-table-D5IqsjQD.js.map → base-table-BFsVwXg3.js.map} +1 -1
  16. package/dist/chunks/{button-CC0Jdx1j.js → button-BU2kRzwu.js} +2 -2
  17. package/dist/chunks/{button-CC0Jdx1j.js.map → button-BU2kRzwu.js.map} +1 -1
  18. package/dist/chunks/check-box-Dd3YFuxd.js.map +1 -1
  19. package/dist/chunks/{context-menu-DQeR3y7M.js → context-menu-C6RO7soI.js} +7 -2
  20. package/dist/chunks/{context-menu-DQeR3y7M.js.map → context-menu-C6RO7soI.js.map} +1 -1
  21. package/dist/chunks/{date-input-DBJisPRz.js → date-input-BzExUQnc.js} +5 -5
  22. package/dist/chunks/{date-input-DBJisPRz.js.map → date-input-BzExUQnc.js.map} +1 -1
  23. package/dist/chunks/{flex-DYZ0IbU6.js → flex-C7njxZ74.js} +10 -7
  24. package/dist/chunks/{flex-DYZ0IbU6.js.map → flex-C7njxZ74.js.map} +1 -1
  25. package/dist/chunks/floating-arrow-BE-z4QkE.js.map +1 -1
  26. package/dist/chunks/{input-BCJfUdK_.js → input-Bp6_Ucgr.js} +15 -15
  27. package/dist/chunks/{input-BCJfUdK_.js.map → input-Bp6_Ucgr.js.map} +1 -1
  28. package/dist/chunks/{input-files-Dcc5K-_1.js → input-files-D1JzSw_Y.js} +2 -2
  29. package/dist/chunks/{input-files-Dcc5K-_1.js.map → input-files-D1JzSw_Y.js.map} +1 -1
  30. package/dist/chunks/{input-search-B7HmrAM7.js → input-search-Bkhcinru.js} +2 -2
  31. package/dist/chunks/{input-search-B7HmrAM7.js.map → input-search-Bkhcinru.js.map} +1 -1
  32. package/dist/chunks/{misc-DIF5h9ba.js → misc-BYxxlJz6.js} +3 -3
  33. package/dist/chunks/{misc-DIF5h9ba.js.map → misc-BYxxlJz6.js.map} +1 -1
  34. package/dist/chunks/{modal-DXHX_sA-.js → modal-paexEF0j.js} +4 -5
  35. package/dist/chunks/{modal-DXHX_sA-.js.map → modal-paexEF0j.js.map} +1 -1
  36. package/dist/chunks/{multi-select-CWx12rgb.js → multi-select-COa6-owj.js} +3 -3
  37. package/dist/chunks/{multi-select-CWx12rgb.js.map → multi-select-COa6-owj.js.map} +1 -1
  38. package/dist/chunks/{picker-BAQ9NeHe.js → picker-e6IsrMUG.js} +3 -3
  39. package/dist/chunks/{picker-BAQ9NeHe.js.map → picker-e6IsrMUG.js.map} +1 -1
  40. package/dist/chunks/{popover-xJJqy1v6.js → popover-CGU3MlsH.js} +14 -14
  41. package/dist/chunks/{popover-xJJqy1v6.js.map → popover-CGU3MlsH.js.map} +1 -1
  42. package/dist/chunks/radio-group-CM9Lg_nc.js.map +1 -1
  43. package/dist/chunks/{select-BPb-eL3O.js → select-C95db02j.js} +32 -31
  44. package/dist/chunks/{select-BPb-eL3O.js.map → select-C95db02j.js.map} +1 -1
  45. package/dist/chunks/sortable-DcTIAbjD.js.map +1 -1
  46. package/dist/chunks/{table-xMAjqtcY.js → table-Dd5BcC0k.js} +3 -3
  47. package/dist/chunks/{table-xMAjqtcY.js.map → table-Dd5BcC0k.js.map} +1 -1
  48. package/dist/chunks/{table-column-interactions-BGd5Lwy9.js → table-column-interactions-DzEvVuXe.js} +8 -5
  49. package/dist/chunks/{table-column-interactions-BGd5Lwy9.js.map → table-column-interactions-DzEvVuXe.js.map} +1 -1
  50. package/dist/chunks/useODataSelectBase-CKe1AVMI.js.map +1 -1
  51. package/dist/chunks/wheel-picker-FS58cRsQ.js.map +1 -1
  52. package/dist/context-menu/index.js +1 -1
  53. package/dist/date-input/index.js +2 -2
  54. package/dist/date-time-input/index.js +4 -4
  55. package/dist/date-time-input/index.js.map +1 -1
  56. package/dist/detail/index.js.map +1 -1
  57. package/dist/dialog/index.js.map +1 -1
  58. package/dist/disclosure/index.js +1 -1
  59. package/dist/disclosure/index.js.map +1 -1
  60. package/dist/drop-zone/index.js +1 -1
  61. package/dist/drop-zone/index.js.map +1 -1
  62. package/dist/errors/index.js +1 -1
  63. package/dist/errors/index.js.map +1 -1
  64. package/dist/expandable-action-panel/index.js +2 -2
  65. package/dist/expandable-action-panel/index.js.map +1 -1
  66. package/dist/flex/index.js +1 -1
  67. package/dist/fullscreen-portal/index.js +3 -3
  68. package/dist/fullscreen-portal/index.js.map +1 -1
  69. package/dist/image/index.js +5 -5
  70. package/dist/image/index.js.map +1 -1
  71. package/dist/input/index.js +1 -1
  72. package/dist/input-date-time/index.js +1 -1
  73. package/dist/input-date-time/index.js.map +1 -1
  74. package/dist/input-file/index.js +1 -1
  75. package/dist/input-file/index.js.map +1 -1
  76. package/dist/input-files/index.js +1 -1
  77. package/dist/input-image/index.js +1 -1
  78. package/dist/input-image/index.js.map +1 -1
  79. package/dist/input-search/index.js +1 -1
  80. package/dist/layout-picker/index.js +3 -3
  81. package/dist/layout-picker/index.js.map +1 -1
  82. package/dist/list/index.js +7 -7
  83. package/dist/list/index.js.map +1 -1
  84. package/dist/listbox/index.js.map +1 -1
  85. package/dist/misc/index.js +1 -1
  86. package/dist/modal/index.js +1 -1
  87. package/dist/multi-select/index.js +1 -1
  88. package/dist/notifications/index.js +13 -11
  89. package/dist/notifications/index.js.map +1 -1
  90. package/dist/pages/index.js.map +1 -1
  91. package/dist/panel/index.js.map +1 -1
  92. package/dist/picker/index.js +1 -1
  93. package/dist/popover/index.js +1 -1
  94. package/dist/preset-range-date-input/index.js +2 -2
  95. package/dist/preset-range-date-input/index.js.map +1 -1
  96. package/dist/preset-select/index.js +1 -1
  97. package/dist/radio-button/index.js.map +1 -1
  98. package/dist/select/index.js +1 -1
  99. package/dist/simple-table/index.js +1 -1
  100. package/dist/slider/index.js +27 -24
  101. package/dist/slider/index.js.map +1 -1
  102. package/dist/splitter/index.js.map +1 -1
  103. package/dist/state-select/index.js +12 -10
  104. package/dist/state-select/index.js.map +1 -1
  105. package/dist/switch/index.js +1 -1
  106. package/dist/switch/index.js.map +1 -1
  107. package/dist/table/index.js +1 -1
  108. package/dist/table-column-interactions/index.js +1 -1
  109. package/dist/table-sorting/index.js +1 -1
  110. package/dist/table-sorting/index.js.map +1 -1
  111. package/dist/tabs/index.js +6 -6
  112. package/dist/tabs/index.js.map +1 -1
  113. package/dist/tag-input/index.js +1 -1
  114. package/dist/tag-input/index.js.map +1 -1
  115. package/dist/text/index.js +10 -8
  116. package/dist/text/index.js.map +1 -1
  117. package/dist/text-editor/index.js +2 -2
  118. package/dist/textarea/index.js +1 -1
  119. package/dist/textarea/index.js.map +1 -1
  120. package/dist/toggle/index.js.map +1 -1
  121. package/dist/toolbar/index.js +1 -2
  122. package/dist/toolbar/index.js.map +1 -1
  123. package/dist/tree/index.js.map +1 -1
  124. package/dist/tree-select/index.js +83 -80
  125. package/dist/tree-select/index.js.map +1 -1
  126. package/dist/tree-table/index.js +2 -2
  127. package/dist/tree-table/index.js.map +1 -1
  128. package/package.json +51 -59
  129. package/storybook-static/assets/{Badge-SZ48u9qp.js → Badge-DHexWW92.js} +11 -11
  130. package/storybook-static/assets/Badge.stories-CeWDekpP.js +54 -0
  131. package/storybook-static/assets/Button-VdPdxcvG.js +12 -0
  132. package/storybook-static/assets/{Button-CFCpYiPy.js → Button-kybsFNS9.js} +10 -10
  133. package/storybook-static/assets/Button.stories-DhgYDM_q.js +75 -0
  134. package/storybook-static/assets/{DateInput-BfFTwd_P.css → CalendarView-DKvrkS40.css} +1 -1
  135. package/storybook-static/assets/CalendarView-DTX0eO8t.js +1 -0
  136. package/storybook-static/assets/CheckBox-B6rTemHK.js +2 -0
  137. package/storybook-static/assets/{CheckBox-FoMSruZC.js → CheckBox-CDwboiFD.js} +11 -11
  138. package/storybook-static/assets/CheckBox.module-BBzuj5He.js +1 -0
  139. package/storybook-static/assets/CheckBox.stories-BSMihxpY.js +60 -0
  140. package/storybook-static/assets/Color-6AOWCN3U-D5F38IUU.js +1 -0
  141. package/storybook-static/assets/{ContextMenu-CU_1kOzV.js → ContextMenu-2ZQAeo_p.js} +9 -9
  142. package/storybook-static/assets/ContextMenu-CQtvL8kx.js +1 -0
  143. package/storybook-static/assets/ContextMenu.stories-Dtz2YIGk.js +90 -0
  144. package/storybook-static/assets/{DateInput-BeZ5esVE.js → DateInput-D41aWZ7_.js} +11 -11
  145. package/storybook-static/assets/DateInput-DBwgBhFj.js +1 -0
  146. package/storybook-static/assets/DateInput-pmGiwdvw.css +1 -0
  147. package/storybook-static/assets/{DateInput.stories-Bkw2r8CD.js → DateInput.stories-CMV96t-8.js} +2 -2
  148. package/storybook-static/assets/{DateRangePresetSelect-C_mLvEoK.js → DateRangePresetSelect-BLKJkg8X.js} +8 -8
  149. package/storybook-static/assets/DateRangePresetSelect-DXYYFJJn.js +3 -0
  150. package/storybook-static/assets/DateRangePresetSelect.stories-BNtFx_iG.js +11 -0
  151. package/storybook-static/assets/{Detail-WzciiK9S.js → Detail-BHcGLZok.js} +11 -11
  152. package/storybook-static/assets/Detail.stories-C4smn8Uu.js +44 -0
  153. package/storybook-static/assets/{Dialog-CwLsVxJY.js → Dialog-kji1ho-G.js} +9 -9
  154. package/storybook-static/assets/Dialog.stories-DYzrVcIT.js +31 -0
  155. package/storybook-static/assets/{Disclosure-BlRuGrk2.js → Disclosure-BVLfp53o.js} +10 -10
  156. package/storybook-static/assets/Disclosure.stories-DcV1pGCt.js +41 -0
  157. package/storybook-static/assets/DocsRenderer-JROSPFPF-CCwX0YiR.js +2 -0
  158. package/storybook-static/assets/{DropZone-Cr3nfCWA.js → DropZone-6iWHt6C_.js} +10 -10
  159. package/storybook-static/assets/DropZone.stories-bASZNbD5.js +44 -0
  160. package/storybook-static/assets/ExpandableActionPanel.stories-CMMbHs_d.js +20 -0
  161. package/storybook-static/assets/{Flex-C10912WS.js → Flex-BJViOwhH.js} +18 -18
  162. package/storybook-static/assets/Flex.stories-CI6DdxU7.js +300 -0
  163. package/storybook-static/assets/FlexContainer-LmZIdhq2.js +1 -0
  164. package/storybook-static/assets/FlexItem-vkDYa5tA.js +3 -0
  165. package/storybook-static/assets/FloatingPopover-CPLOruAY.js +1 -0
  166. package/storybook-static/assets/FloatingPopover-DC84VrV3.css +1 -0
  167. package/storybook-static/assets/FormattedTableCell-CV4yLuxl.js +18 -0
  168. package/storybook-static/assets/FormattedTableCell-CY3E21k8.css +1 -0
  169. package/storybook-static/assets/Grid-BCzygAqy.js +52 -0
  170. package/storybook-static/assets/{Grid-G88y3oB_.js → Grid-CNEn2bRE.js} +18 -18
  171. package/storybook-static/assets/{Grid.stories-BV7zL-6n.js → Grid.stories-qFo5E3qE.js} +2 -2
  172. package/storybook-static/assets/{Grid-Bb0gH6CX.js → GridContainer-qDguE1HS.js} +2 -53
  173. package/storybook-static/assets/ImageCropper.stories-BeQI7oKQ.js +115 -0
  174. package/storybook-static/assets/ImageRenderer-DK2ibQyr.js +2 -0
  175. package/storybook-static/assets/ImageRenderer.stories-C1T4ne0G.js +22 -0
  176. package/storybook-static/assets/ImageView.stories-D_Q-ZBtQ.js +9 -0
  177. package/storybook-static/assets/{ImageViewer.stories-PlFXSB5n.js → ImageViewer.stories-boombTJI.js} +5 -5
  178. package/storybook-static/assets/ImageViewerRuntime-D8KSESgf.js +51 -0
  179. package/storybook-static/assets/{Input-pyUNDVtk.js → Input-CGHba0oM.js} +11 -11
  180. package/storybook-static/assets/Input-DtOsW7ur.js +3 -0
  181. package/storybook-static/assets/Input.stories-C0qWd6SH.js +38 -0
  182. package/storybook-static/assets/{InputDateTime-CWk5KBwD.js → InputDateTime-CgYkmVYu.js} +11 -11
  183. package/storybook-static/assets/InputDateTime.stories-Brxo7Chn.js +35 -0
  184. package/storybook-static/assets/{InputFile-BLQq7mY9.js → InputFile-Bsxafe88.js} +10 -10
  185. package/storybook-static/assets/InputFile.stories-BzEV7ybE.js +36 -0
  186. package/storybook-static/assets/{InputFiles-B6J4XBdP.js → InputFiles-KJFUsmSS.js} +10 -10
  187. package/storybook-static/assets/InputFiles.stories-ffjxiHSh.js +33 -0
  188. package/storybook-static/assets/InputFilesList-D6B5g99M.js +1 -0
  189. package/storybook-static/assets/{InputImage--2PSB_E_.js → InputImage-Cd39V4Vc.js} +10 -10
  190. package/storybook-static/assets/InputImage.stories-n-tpY8OO.js +51 -0
  191. package/storybook-static/assets/{LayoutPicker-RZDisgZ_.js → LayoutPicker-CGQFfQk6.js} +13 -13
  192. package/storybook-static/assets/LayoutPicker.stories-xSL2qafC.js +449 -0
  193. package/storybook-static/assets/{Listbox-xwfNjBpV.js → Listbox-CxISK8c5.js} +10 -10
  194. package/storybook-static/assets/Listbox.stories-BdQBmVFI.js +47 -0
  195. package/storybook-static/assets/{Modal-HJt_Y-a6.js → Modal-BiaAWMdV.js} +12 -12
  196. package/storybook-static/assets/Modal.stories-GV7fGqyd.js +180 -0
  197. package/storybook-static/assets/MultiSelect-D5XFosSU.js +2 -0
  198. package/storybook-static/assets/{MultiSelect-CvNsFdE4.js → MultiSelect-Df2CpyNH.js} +11 -11
  199. package/storybook-static/assets/MultiSelect.stories-BEVQF6hO.js +29 -0
  200. package/storybook-static/assets/MultiSelectToken-CrVawISu.js +1 -0
  201. package/storybook-static/assets/NoData-C7KqaHUh.css +1 -0
  202. package/storybook-static/assets/NoData-Fm23iF4n.js +1 -0
  203. package/storybook-static/assets/{NotificationsHost-DXCf3CQX.js → NotificationsHost-C2vSwAjz.js} +9 -9
  204. package/storybook-static/assets/NotificationsHost.stories-IbgayDlM.js +25 -0
  205. package/storybook-static/assets/{ODataMultiSelect-CIJNiwGb.js → ODataMultiSelect-oW3kW0nO.js} +15 -15
  206. package/storybook-static/assets/ODataMultiSelect.stories-CP6_jGSr.js +73 -0
  207. package/storybook-static/assets/{ODataSelect-BDga9TUb.js → ODataSelect-CrGF8fyC.js} +15 -15
  208. package/storybook-static/assets/ODataSelect.stories-DTv31Rkv.js +73 -0
  209. package/storybook-static/assets/ODataTreeMultiSelect-D0h8H3gw.js +19 -0
  210. package/storybook-static/assets/ODataTreeMultiSelect.stories-CM8QjG8r.js +30 -0
  211. package/storybook-static/assets/ODataTreeSelect-PWn0-hI4.js +17 -0
  212. package/storybook-static/assets/ODataTreeSelect.stories-2UkFTnbE.js +24 -0
  213. package/storybook-static/assets/OneStepScroller-CH6K7wiO.js +5 -0
  214. package/storybook-static/assets/OneStepScroller-NRYd-egY.css +1 -0
  215. package/storybook-static/assets/{PeriodSelect-BJbjl62O.js → PeriodSelect-BtwJuAO6.js} +13 -13
  216. package/storybook-static/assets/PeriodSelect.stories-BH8I5Wmg.js +64 -0
  217. package/storybook-static/assets/PickerSelectionToolbar-BcL8-O6n.js +2 -0
  218. package/storybook-static/assets/PickerTriggerActions-C8Asdp5e.js +1 -0
  219. package/storybook-static/assets/{Popover-Dg2T0DoN.js → Popover-Ch5btFhR.js} +11 -11
  220. package/storybook-static/assets/Popover-DGX7JNNK.css +1 -0
  221. package/storybook-static/assets/Popover-Djns7yXR.js +2 -0
  222. package/storybook-static/assets/Popover.stories-Bask2I1I.js +69 -0
  223. package/storybook-static/assets/{PresetRangeDateInput-CNmTMNHF.js → PresetRangeDateInput-DvsTjQNP.js} +8 -8
  224. package/storybook-static/assets/PresetRangeDateInput.stories-BNfOUWgp.js +15 -0
  225. package/storybook-static/assets/PresetSelect-9zitP0-V.js +5 -0
  226. package/storybook-static/assets/{RadioButton-2rfUPkwC.js → RadioButton-Yb9bQKYe.js} +10 -10
  227. package/storybook-static/assets/RadioButton.stories-FIFxXFVP.js +36 -0
  228. package/storybook-static/assets/RadioGroup-CWsVqwtm.js +1 -0
  229. package/storybook-static/assets/{RadioGroup-BduGGVKj.js → RadioGroup-Dn0zL838.js} +10 -10
  230. package/storybook-static/assets/RadioGroup.stories-B_drop9x.js +42 -0
  231. package/storybook-static/assets/Scrollable-3Z6b5g0Z.js +1 -0
  232. package/storybook-static/assets/{Select-DnZ83aZs.js → Select-BaR8D89E.js} +13 -13
  233. package/storybook-static/assets/Select-BiOxxy0y.js +12 -0
  234. package/storybook-static/assets/Select.stories-CMlWu7vC.js +46 -0
  235. package/storybook-static/assets/SelectOptionContent-DhtCMwz6.js +1 -0
  236. package/storybook-static/assets/{SerializableSelect-BiFhAxAJ.js → SerializableSelect-BDiZo_-M.js} +12 -12
  237. package/storybook-static/assets/SerializableSelect.stories-DgC6oiRx.js +46 -0
  238. package/storybook-static/assets/{SingleDateTimeInput-Bc-ifbML.js → SingleDateTimeInput-Dx1fvzyr.js} +12 -12
  239. package/storybook-static/assets/SingleDateTimeInput.stories-NRUE7nnA.js +78 -0
  240. package/storybook-static/assets/Slider-DJpzPo7f.js +1 -0
  241. package/storybook-static/assets/{Slider-DfjBSsR3.js → Slider-aiFcrSGY.js} +15 -15
  242. package/storybook-static/assets/Slider.stories-B0YHmFf5.js +77 -0
  243. package/storybook-static/assets/{SliderInput-o9uCcVMP.js → SliderInput-sOoxvdku.js} +16 -16
  244. package/storybook-static/assets/SliderInput.stories-BYk1V19Z.js +68 -0
  245. package/storybook-static/assets/{Sortable-B6Y9Q9Yn.js → Sortable-CuVT40f8.js} +13 -13
  246. package/storybook-static/assets/Sortable.stories-KSWGoKrN.js +141 -0
  247. package/storybook-static/assets/{Splitter-CfUVnAs7.js → Splitter-EoNOj4XF.js} +11 -11
  248. package/storybook-static/assets/Splitter.stories-CuAZab2y.js +22 -0
  249. package/storybook-static/assets/{StateSelect-h0i4M4vO.js → StateSelect-B_M50HZl.js} +10 -10
  250. package/storybook-static/assets/StateSelect.stories-DQ_MzvL4.js +47 -0
  251. package/storybook-static/assets/StringToggle.stories-BbRysCKA.js +6 -0
  252. package/storybook-static/assets/{Switch-CPKaENqL.js → Switch-DO_tyZIc.js} +10 -10
  253. package/storybook-static/assets/Switch.stories-BQakMoPp.js +26 -0
  254. package/storybook-static/assets/{Table-xV66crR1.js → Table-CVK5rwmT.js} +22 -22
  255. package/storybook-static/assets/Table.stories-IZaleOjp.js +122 -0
  256. package/storybook-static/assets/{Tabs-v9YZeJoc.js → Tabs-DAaWUQb4.js} +15 -15
  257. package/storybook-static/assets/Tabs.stories-BC8LwG22.js +58 -0
  258. package/storybook-static/assets/TagInput.stories-CrXD57LV.js +18 -0
  259. package/storybook-static/assets/Text-cVBcGheg.js +1 -0
  260. package/storybook-static/assets/{Textarea-CRThqX0z.js → Textarea-9VdIC6G0.js} +10 -10
  261. package/storybook-static/assets/Textarea.stories-CEaMwEau.js +27 -0
  262. package/storybook-static/assets/TimePanel-vx1aOwT4.js +1 -0
  263. package/storybook-static/assets/TimePanel.stories-BKyiLEgy.js +25 -0
  264. package/storybook-static/assets/Toggle-CyajrRVE.js +1 -0
  265. package/storybook-static/assets/{Toggle-CzopviU2.js → Toggle-DrNoVpGe.js} +10 -10
  266. package/storybook-static/assets/Toggle.stories-CT0mQbdm.js +30 -0
  267. package/storybook-static/assets/TreeMultiSelect-CtDZ1cXU.js +1 -0
  268. package/storybook-static/assets/TreeMultiSelect-ag5i_Hw_.js +19 -0
  269. package/storybook-static/assets/TreeMultiSelect.stories-BxrbKopS.js +35 -0
  270. package/storybook-static/assets/TreePickerBase-DQzUtuAm.js +22 -0
  271. package/storybook-static/assets/TreeSelect-BNuJBo9x.js +1 -0
  272. package/storybook-static/assets/TreeSelect-CL8REXC5.js +16 -0
  273. package/storybook-static/assets/TreeSelect.stories-CsWGc9X0.js +18 -0
  274. package/storybook-static/assets/{TreeTable-DbzoCcR5.js → TreeTable-DrIFC4Oh.js} +22 -22
  275. package/storybook-static/assets/TreeTable.stories-Dq5c4_qe.js +83 -0
  276. package/storybook-static/assets/WithTooltip-7X4HQR7L-Cakt_JaX.js +9 -0
  277. package/storybook-static/assets/array-BBSjoTRy-CIRmlF93.js +1 -0
  278. package/storybook-static/assets/{async-D27PcxoG.js → async-0-Te_uje.js} +3 -3
  279. package/storybook-static/assets/axe-Bq-2xuso.js +20 -0
  280. package/storybook-static/assets/blocks-Dz3dJBcm.js +48 -0
  281. package/storybook-static/assets/browserAndReact-kZBm3nQe.js +105 -0
  282. package/storybook-static/assets/check-BMyoSD8F.js +1 -0
  283. package/storybook-static/assets/chevron-down-QDFtnGcg.js +1 -0
  284. package/storybook-static/assets/chevron-left-BoVuWD4h.js +1 -0
  285. package/storybook-static/assets/chevron-right-DS62_o_9.js +1 -0
  286. package/storybook-static/assets/chunk-242VQQM5-BMWWiybC.js +1 -0
  287. package/storybook-static/assets/chunk-DRQKCCAG-CqE-Zrl9.js +1 -0
  288. package/storybook-static/assets/chunk-IMSF75WX-yvVUwIQZ.js +6 -0
  289. package/storybook-static/assets/chunk-KJHJLCBK-D-yQfkOi.js +1 -0
  290. package/storybook-static/assets/chunk-QQBDHPVZ-B98qboss.js +1 -0
  291. package/storybook-static/assets/chunk-W22LQPXL-DDIvKskF.js +18 -0
  292. package/storybook-static/assets/circle-alert-CXg50Gb0.js +1 -0
  293. package/storybook-static/assets/circle-check-BPfYNWmz.js +1 -0
  294. package/storybook-static/assets/components-BejapTpU.js +241 -0
  295. package/storybook-static/assets/contextMenu-DtXkMNr6.js +2 -0
  296. package/storybook-static/assets/date-segments-D3HouZ37.js +1 -0
  297. package/storybook-static/assets/dom-B3G_GtJw.js +1 -0
  298. package/storybook-static/assets/download-DnZ6jhvY.js +1 -0
  299. package/storybook-static/assets/error-BZrNlEUO.js +1 -0
  300. package/storybook-static/assets/file-vPGnhPr-.js +1 -0
  301. package/storybook-static/assets/filesAndExcel-CXMXtMjq.js +122 -0
  302. package/storybook-static/assets/floating-ui.react-PN45KvBS.js +1 -0
  303. package/storybook-static/assets/formatter-L2YTDE3Q-x0raBH34.js +1 -0
  304. package/storybook-static/assets/formatters--mhLir82-v41eaI4a.js +1 -0
  305. package/storybook-static/assets/formatters-DGXR8csR.js +291 -0
  306. package/storybook-static/assets/formatters-runtime-GsS-hTg9.js +384 -0
  307. package/storybook-static/assets/foundationLib-XrLbqi3r.js +82 -0
  308. package/storybook-static/assets/hooks-Ddmw7JMF.js +5 -0
  309. package/storybook-static/assets/iframe-CrnMVMTc.js +1151 -0
  310. package/storybook-static/assets/iframe-FUHzX0Mr.js +1 -0
  311. package/storybook-static/assets/info-Dqq5QHG7.js +1 -0
  312. package/storybook-static/assets/{matchers-JIUQ3HVY-BPS-eazD.js → matchers-JIUQ3HVY-DvR2XErZ.js} +3 -3
  313. package/storybook-static/assets/media-BycWpjAl.js +1 -0
  314. package/storybook-static/assets/odata-BaxgzNGj.js +1 -0
  315. package/storybook-static/assets/odata-service-DnPlNGpU-Bpd4Zh9L.js +3 -0
  316. package/storybook-static/assets/odataAndTables-OEVW-gFK.js +126 -0
  317. package/storybook-static/assets/{odataFetchFn-BVgXXKgx.js → odataFetchFn-BLWeF0ZQ.js} +3 -3
  318. package/storybook-static/assets/odataStoryFixtures-BbswaX_5.js +25 -0
  319. package/storybook-static/assets/{persisted-D8qUQbts.js → persisted-BpFojVXw.js} +3 -3
  320. package/storybook-static/assets/preload-helper-BHmFeTtP.js +1 -0
  321. package/storybook-static/assets/pureUtilities-3afQk5ld.js +69 -0
  322. package/storybook-static/assets/react-18-CgkwBzTo.js +9 -0
  323. package/storybook-static/assets/react-C21x__mS.js +1 -0
  324. package/storybook-static/assets/react-CpOcCp9T.js +9 -0
  325. package/storybook-static/assets/react-CvkUhHUq.js +1 -0
  326. package/storybook-static/assets/react-dom-2o2phaJG.js +1 -0
  327. package/storybook-static/assets/react-qN2cStNd.js +1 -0
  328. package/storybook-static/assets/refresh-cw-B2VU4UNA.js +1 -0
  329. package/storybook-static/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  330. package/storybook-static/assets/runtimeAndState-BEFDbOiZ.js +117 -0
  331. package/storybook-static/assets/settings-2-CLJhjWJl.js +1 -0
  332. package/storybook-static/assets/sortable-DW_Veba0.js +1 -0
  333. package/storybook-static/assets/syntaxhighlighter-T5IQBZDB-D0RhvxXU.js +6 -0
  334. package/storybook-static/assets/theming-mTWhffkp.js +39 -0
  335. package/storybook-static/assets/trash-2-yLqdtpz8.js +1 -0
  336. package/storybook-static/assets/treeStoryFixtures-Ci7STpiz.js +1 -0
  337. package/storybook-static/assets/triangle-alert-wI8Cd8tI.js +1 -0
  338. package/storybook-static/assets/ui.module-DoMIk8Oc.js +1 -0
  339. package/storybook-static/assets/uiClasses-CO3Cdv1E.js +1 -0
  340. package/storybook-static/assets/useFlexClasses-Gn9spXEB.js +1 -0
  341. package/storybook-static/assets/useODataSelectBase-WnxdcAM4.js +1 -0
  342. package/storybook-static/assets/useODataTreeData-C7L5TOjl.js +1 -0
  343. package/storybook-static/assets/usePickerDefaultFilter-DdxyE_i8.js +1 -0
  344. package/storybook-static/assets/usePickerQuery-CAWYFpCv.js +1 -0
  345. package/storybook-static/assets/usePickerTriggerController-BRXUlggw.js +1 -0
  346. package/storybook-static/assets/utils-DUM89eIj.js +1 -0
  347. package/storybook-static/assets/x-CyFk00QC.js +1 -0
  348. package/storybook-static/iframe.html +8 -3
  349. package/storybook-static/index.html +6 -0
  350. package/storybook-static/index.json +1 -1
  351. package/storybook-static/project.json +1 -1
  352. package/storybook-static/sb-addons/a11y-3/manager-bundle.js +3 -3
  353. package/storybook-static/sb-addons/chromatic-com-storybook-1/manager-bundle.js +17 -17
  354. package/storybook-static/sb-addons/docs-2/manager-bundle.js +16 -1
  355. package/storybook-static/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +85 -83
  356. package/storybook-static/sb-addons/vitest-4/manager-bundle.js +1 -1
  357. package/storybook-static/sb-manager/globals-runtime.js +9939 -7695
  358. package/storybook-static/sb-manager/runtime.js +16128 -15326
  359. package/storybook-static/vite-inject-mocker-entry.js +2 -2
  360. package/storybook-static/assets/Badge.stories-CzsgAfG9.js +0 -51
  361. package/storybook-static/assets/Button-MoWVKehO.js +0 -12
  362. package/storybook-static/assets/Button.stories-wwep4c2p.js +0 -75
  363. package/storybook-static/assets/CheckBox-DHvne_6w.js +0 -2
  364. package/storybook-static/assets/CheckBox.module-ezWPE2pa.js +0 -1
  365. package/storybook-static/assets/CheckBox.stories-C14Axs5p.js +0 -60
  366. package/storybook-static/assets/Color-KMSTOMOX-CmMBFN4-.js +0 -1
  367. package/storybook-static/assets/ContextMenu.stories-Dr-tkpqd.js +0 -90
  368. package/storybook-static/assets/DateInput-erobPRG_.js +0 -1
  369. package/storybook-static/assets/DateRangePresetSelect-Cg90Kc_w.js +0 -3
  370. package/storybook-static/assets/DateRangePresetSelect.stories-BVap0joC.js +0 -11
  371. package/storybook-static/assets/Detail.stories-CLdtvJ7q.js +0 -44
  372. package/storybook-static/assets/Dialog.stories-Dx0jZO19.js +0 -31
  373. package/storybook-static/assets/Disclosure.stories-DhUdeDK6.js +0 -41
  374. package/storybook-static/assets/DocsRenderer-JROSPFPF-Dd1n83Uq.js +0 -2
  375. package/storybook-static/assets/DropZone.stories-6yYrwQOe.js +0 -44
  376. package/storybook-static/assets/DropdownMenu-D_2LfViU.js +0 -1
  377. package/storybook-static/assets/ExpandableActionPanel.stories-DVOFSOlm.js +0 -20
  378. package/storybook-static/assets/Flex-V-qg6Ejw.js +0 -3
  379. package/storybook-static/assets/Flex.stories-BZv94LD8.js +0 -300
  380. package/storybook-static/assets/ImageCropper.stories-MLFZyJxZ.js +0 -115
  381. package/storybook-static/assets/ImageRenderer-DHhD7mUz.js +0 -2
  382. package/storybook-static/assets/ImageRenderer.stories-ChcPymk2.js +0 -22
  383. package/storybook-static/assets/ImageView.stories-DszVNgC8.js +0 -9
  384. package/storybook-static/assets/ImageViewerRuntime-D8wFAKx5.js +0 -51
  385. package/storybook-static/assets/Input-BGdz8TmT.js +0 -3
  386. package/storybook-static/assets/Input.stories-Ban0Gnck.js +0 -38
  387. package/storybook-static/assets/InputDateTime.stories-DgKVmf54.js +0 -35
  388. package/storybook-static/assets/InputFile.stories-VnRv_q2r.js +0 -36
  389. package/storybook-static/assets/InputFiles-Dn9afnyd.js +0 -1
  390. package/storybook-static/assets/InputFiles.stories-CLVn5Xfq.js +0 -33
  391. package/storybook-static/assets/InputImage.stories-D__QcSho.js +0 -51
  392. package/storybook-static/assets/LayoutPicker.stories-BCnR-zBu.js +0 -449
  393. package/storybook-static/assets/Listbox.stories-B0HctqVp.js +0 -47
  394. package/storybook-static/assets/Modal.stories-BE-VpK-a.js +0 -180
  395. package/storybook-static/assets/MultiSelect-CaCNRNIe.js +0 -2
  396. package/storybook-static/assets/MultiSelect.stories-CNkbVGsb.js +0 -29
  397. package/storybook-static/assets/NotificationsHost.stories-BgqvZzT3.js +0 -25
  398. package/storybook-static/assets/ODataMultiSelect-CMyI4yYs.js +0 -1
  399. package/storybook-static/assets/ODataMultiSelect.stories-DTGCC6np.js +0 -73
  400. package/storybook-static/assets/ODataSelect-CGplYBh_.js +0 -1
  401. package/storybook-static/assets/ODataSelect.stories-CsxqRAvn.js +0 -73
  402. package/storybook-static/assets/ODataTreeMultiSelect-4ZiAtFZk.js +0 -19
  403. package/storybook-static/assets/ODataTreeMultiSelect.stories-B29Od8BL.js +0 -30
  404. package/storybook-static/assets/ODataTreeSelect-yZy7MBsZ.js +0 -17
  405. package/storybook-static/assets/ODataTreeSelect.stories-H7eaj1Sz.js +0 -24
  406. package/storybook-static/assets/PeriodSelect.stories-6CEzS2_H.js +0 -64
  407. package/storybook-static/assets/Popover.stories-BNgWOHlJ.js +0 -69
  408. package/storybook-static/assets/PresetRangeDateInput.stories-6UPVDF62.js +0 -15
  409. package/storybook-static/assets/RadioButton.stories-DbdFfJqO.js +0 -36
  410. package/storybook-static/assets/RadioGroup-BA21indC.js +0 -1
  411. package/storybook-static/assets/RadioGroup.stories-Ce6x0WUN.js +0 -42
  412. package/storybook-static/assets/Select-DyO25wSA.js +0 -12
  413. package/storybook-static/assets/Select.stories-CQ8f9fY9.js +0 -46
  414. package/storybook-static/assets/SelectOptionContent-fC4HFG5Q.js +0 -1
  415. package/storybook-static/assets/SerializableSelect-ki4BThj7.js +0 -4
  416. package/storybook-static/assets/SerializableSelect.stories-BzXBkWPI.js +0 -43
  417. package/storybook-static/assets/SingleDateTimeInput.stories-CI2yrD-f.js +0 -78
  418. package/storybook-static/assets/Slider.stories-D3O3_tqE.js +0 -77
  419. package/storybook-static/assets/SliderInput.stories-D1puleZB.js +0 -67
  420. package/storybook-static/assets/Sortable.stories-BoaL4W6r.js +0 -141
  421. package/storybook-static/assets/Splitter.stories-DJpFzZVJ.js +0 -22
  422. package/storybook-static/assets/StateSelect.stories-Ch2Gzzmd.js +0 -47
  423. package/storybook-static/assets/StringToggle.stories-B8qIG0M3.js +0 -6
  424. package/storybook-static/assets/Switch.stories-BysIhUHa.js +0 -26
  425. package/storybook-static/assets/Table.stories-CBpgmq7b.js +0 -122
  426. package/storybook-static/assets/Tabs.stories-BPYZuvzR.js +0 -58
  427. package/storybook-static/assets/TagInput.stories-BwOEnVpz.js +0 -18
  428. package/storybook-static/assets/Textarea.stories-BSJGz7JF.js +0 -27
  429. package/storybook-static/assets/TimePanel-ClMfq_py.js +0 -1
  430. package/storybook-static/assets/TimePanel.stories-_FqWdmta.js +0 -25
  431. package/storybook-static/assets/Toggle-BFhzeK2e.js +0 -1
  432. package/storybook-static/assets/Toggle.stories-Dw5UkD_b.js +0 -30
  433. package/storybook-static/assets/TreeMultiSelect-CerqHY2K.js +0 -19
  434. package/storybook-static/assets/TreeMultiSelect-Dw7FI3ic.js +0 -1
  435. package/storybook-static/assets/TreeMultiSelect.stories-BTQKFbeP.js +0 -35
  436. package/storybook-static/assets/TreePickerBase-rJISGJBT.js +0 -22
  437. package/storybook-static/assets/TreeSelect-CQ1vj_c9.js +0 -16
  438. package/storybook-static/assets/TreeSelect-Cp_lX0-B.js +0 -1
  439. package/storybook-static/assets/TreeSelect.stories-D6Q02Phx.js +0 -18
  440. package/storybook-static/assets/TreeTable.stories-YfyhkqH9.js +0 -83
  441. package/storybook-static/assets/WithTooltip-7X4HQR7L-BSQyvCOM.js +0 -9
  442. package/storybook-static/assets/axe-GLfyhAYL.js +0 -20
  443. package/storybook-static/assets/base-table-BNO0lnTL.css +0 -1
  444. package/storybook-static/assets/base-table-Dy3fEhQe.js +0 -18
  445. package/storybook-static/assets/blocks-ixiC6_NZ.js +0 -285
  446. package/storybook-static/assets/button-DZpTIXz2.js +0 -1
  447. package/storybook-static/assets/check-box-DByHwJGx.js +0 -1
  448. package/storybook-static/assets/chunk-242VQQM5-Dtm7LRbQ.js +0 -1
  449. package/storybook-static/assets/chunk-3LY4VQVK-BohfESrT.js +0 -6
  450. package/storybook-static/assets/chunk-LITCR56V-XaMGADKk.js +0 -18
  451. package/storybook-static/assets/contextMenu-BbMrBF3b.js +0 -2
  452. package/storybook-static/assets/date-7kR6zFX5.js +0 -461
  453. package/storybook-static/assets/date-segments-CzU9k5bl.js +0 -1
  454. package/storybook-static/assets/error-BRUjWXbJ.js +0 -1
  455. package/storybook-static/assets/file-CI_sonB1.js +0 -291
  456. package/storybook-static/assets/file-hArYcyES.js +0 -1
  457. package/storybook-static/assets/flex-C--89Z3g.js +0 -1
  458. package/storybook-static/assets/floating-ui.react-DLXcGGFR.js +0 -1
  459. package/storybook-static/assets/formatter-L2YTDE3Q-DgyzUf7M.js +0 -1
  460. package/storybook-static/assets/formatters-BtIOYENB.js +0 -3
  461. package/storybook-static/assets/formulas-DRh9I2eS.js +0 -2
  462. package/storybook-static/assets/grid-DLxeTZJe.js +0 -1
  463. package/storybook-static/assets/hooks-DWeJq8G1.js +0 -5
  464. package/storybook-static/assets/iframe-BJGIOdSH.js +0 -1119
  465. package/storybook-static/assets/input-DXi75xv1.js +0 -1
  466. package/storybook-static/assets/mdx-react-shim-CmoAsjhK.js +0 -1
  467. package/storybook-static/assets/media-DWFaNgLM.js +0 -1
  468. package/storybook-static/assets/misc-BElIqBdV.css +0 -1
  469. package/storybook-static/assets/misc-DNZTbWc6.js +0 -5
  470. package/storybook-static/assets/notifications-DjtgzFqT.js +0 -1
  471. package/storybook-static/assets/number-Xkw1yPJo.js +0 -2
  472. package/storybook-static/assets/odata-C4Liwkjx.js +0 -1
  473. package/storybook-static/assets/odata-service-C2oJ-ZmZ.js +0 -1
  474. package/storybook-static/assets/odataStoryFixtures-eEGvvtmw.js +0 -25
  475. package/storybook-static/assets/picker-DsP4xCcJ.js +0 -2
  476. package/storybook-static/assets/popover-BiQHI7Wi.css +0 -1
  477. package/storybook-static/assets/popover-CuFTypCp.js +0 -2
  478. package/storybook-static/assets/preload-helper-B45gAKPr.js +0 -1
  479. package/storybook-static/assets/preset-select-SPNHA-mp.js +0 -5
  480. package/storybook-static/assets/pwa-B7uYfAPd.js +0 -640
  481. package/storybook-static/assets/queryClient-CA0puYc0.js +0 -567
  482. package/storybook-static/assets/react-18-CaNSmcD-.js +0 -9
  483. package/storybook-static/assets/react-3qMIUlAf.js +0 -9
  484. package/storybook-static/assets/react-dom-BC7xZNHy.js +0 -1
  485. package/storybook-static/assets/select-sUla5-3b.js +0 -1
  486. package/storybook-static/assets/slider--Yp_sa_W.js +0 -2
  487. package/storybook-static/assets/sortable-jALaQqYE.js +0 -1
  488. package/storybook-static/assets/syntaxhighlighter-RTCFPKCB-u_WDwfDn.js +0 -6
  489. package/storybook-static/assets/text-D5xgciF8.js +0 -4
  490. package/storybook-static/assets/theming-oB64gsjY.js +0 -39
  491. package/storybook-static/assets/treeStoryFixtures-Y_nnjz0_.js +0 -1
  492. package/storybook-static/assets/ui-DWDaBPQx.js +0 -1
  493. package/storybook-static/assets/ui.module-wFHXkJzp.js +0 -1
  494. package/storybook-static/assets/uiClasses-CaHp0EWd.js +0 -1
  495. package/storybook-static/assets/useODataSelectBase-DjlPxmxr.js +0 -1
  496. package/storybook-static/assets/useODataTreeData-1W6cbuec.js +0 -1
  497. package/storybook-static/assets/utils-DzbSigQl.js +0 -1
  498. package/storybook-static/assets/valueState-GnkKWBTr.js +0 -277
  499. /package/storybook-static/assets/{DropdownMenu-BgzIzwzM.css → ContextMenu-BgzIzwzM.css} +0 -0
  500. /package/storybook-static/assets/{Grid-K9R_IHaw.css → GridContainer-K9R_IHaw.css} +0 -0
  501. /package/storybook-static/assets/{InputFiles-ByK52qUe.css → InputFilesList-ByK52qUe.css} +0 -0
  502. /package/storybook-static/assets/{MultiSelect-BoIwmje6.css → MultiSelectToken-BoIwmje6.css} +0 -0
  503. /package/storybook-static/assets/{slider-DMDFRH6B.css → Slider-DMDFRH6B.css} +0 -0
  504. /package/storybook-static/assets/{Flex-IXK2se1Y.css → useFlexClasses-IXK2se1Y.css} +0 -0
  505. /package/storybook-static/assets/{picker-DzBkX15M.css → usePickerTriggerController-DzBkX15M.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"table-column-interactions-BGd5Lwy9.js","names":[],"sources":["../../src/table-column-interactions/TableColumnInteractions.module.scss","../../src/table-column-interactions/TableColumnResizeHandle.tsx","../../src/table-column-interactions/TableHeaderInteractionCell.tsx"],"sourcesContent":[".resizeHandle {\n\tcursor: col-resize;\n\ttouch-action: none;\n\tuser-select: none;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\twidth: 6px;\n\tz-index: 1;\n\n\t&:hover,\n\t&:focus-visible {\n\t\tbackground: var(--focus-ring);\n\t}\n\n\t&:focus-visible {\n\t\toutline: var(--focus);\n\t\toutline-offset: calc(var(--focus-offset) * -1);\n\t}\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type PointerEvent as ReactPointerEvent } from \"react\";\n\nimport { DEFAULT_TABLE_COLUMN_MIN_WIDTH, normalizeTableColumnWidth } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./TableColumnInteractions.module.scss\";\n\nconst DEFAULT_KEYBOARD_RESIZE_STEP = 8;\n\nexport type TableColumnResizeHandleProps = {\n\tcolumnId: string;\n\tclassName?: string;\n\tminWidth?: number;\n\tkeyboardStep?: number;\n\tariaLabel?: string;\n\tgetStartWidth?: (columnId: string, element: HTMLElement) => number;\n\tonResize: (columnId: string, width: number) => void;\n\tonResizeEnd?: (columnId: string, width: number) => void;\n\tonReset?: (columnId: string) => void;\n};\n\nfunction resolveHeaderCellWidth(element: HTMLElement, minWidth: number): number {\n\tconst headerCell = element.closest(\"th\");\n\tconst width = headerCell?.getBoundingClientRect().width;\n\n\treturn normalizeTableColumnWidth(typeof width === \"number\" && Number.isFinite(width) ? width : minWidth, minWidth);\n}\n\nexport function TableColumnResizeHandle({\n\tcolumnId,\n\tclassName,\n\tminWidth,\n\tkeyboardStep = DEFAULT_KEYBOARD_RESIZE_STEP,\n\tariaLabel = \"Изменить ширину колонки\",\n\tgetStartWidth,\n\tonResize,\n\tonResizeEnd,\n\tonReset\n}: TableColumnResizeHandleProps) {\n\tconst resolvedMinWidth = minWidth ?? DEFAULT_TABLE_COLUMN_MIN_WIDTH;\n\tconst startXRef = useRef(0);\n\tconst startWidthRef = useRef(0);\n\tconst lastWidthRef = useRef(0);\n\tconst activeRef = useRef(false);\n\tconst movedRef = useRef(false);\n\n\tconst resolveStartWidth = (element: HTMLElement) => {\n\t\tconst width = getStartWidth?.(columnId, element) ?? resolveHeaderCellWidth(element, resolvedMinWidth);\n\n\t\treturn normalizeTableColumnWidth(width, resolvedMinWidth);\n\t};\n\n\tconst handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (event.button !== 0 && event.pointerType === \"mouse\") return;\n\n\t\tactiveRef.current = true;\n\t\tmovedRef.current = false;\n\t\tstartXRef.current = event.clientX;\n\t\tstartWidthRef.current = resolveStartWidth(event.currentTarget);\n\t\tlastWidthRef.current = startWidthRef.current;\n\t\tevent.currentTarget.setPointerCapture(event.pointerId);\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!activeRef.current) return;\n\n\t\tconst nextWidth = normalizeTableColumnWidth(startWidthRef.current + event.clientX - startXRef.current, resolvedMinWidth);\n\t\tlastWidthRef.current = nextWidth;\n\t\tmovedRef.current = true;\n\t\tonResize(columnId, nextWidth);\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst finishPointerResize = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!activeRef.current) return;\n\n\t\tactiveRef.current = false;\n\n\t\tif (movedRef.current) {\n\t\t\tonResizeEnd?.(columnId, lastWidthRef.current);\n\t\t}\n\n\t\ttry {\n\t\t\tevent.currentTarget.releasePointerCapture(event.pointerId);\n\t\t} catch {\n\t\t\t// Pointer capture мог быть сброшен браузером при отмене жеста.\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n\t\tif (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\" && event.key !== \"Home\") {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (event.key === \"Home\") {\n\t\t\tonReset?.(columnId);\n\t\t\treturn;\n\t\t}\n\n\t\tconst direction = event.key === \"ArrowRight\" ? 1 : -1;\n\t\tconst currentWidth = resolveStartWidth(event.currentTarget);\n\t\tconst nextWidth = normalizeTableColumnWidth(currentWidth + direction * keyboardStep, resolvedMinWidth);\n\t\tonResize(columnId, nextWidth);\n\t\tonResizeEnd?.(columnId, nextWidth);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\trole=\"separator\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-orientation=\"vertical\"\n\t\t\ttabIndex={0}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={finishPointerResize}\n\t\t\tonPointerCancel={finishPointerResize}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonDoubleClick={(event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tonReset?.(columnId);\n\t\t\t}}\n\t\t\tclassName={cn(styles.resizeHandle, className)}\n\t\t/>\n\t);\n}\n","import { type ComponentPropsWithoutRef, type CSSProperties, type ReactNode } from \"react\";\n\nimport { type DraggableAttributes, type DraggableSyntheticListeners, type UniqueIdentifier } from \"@dnd-kit/core\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TableColumnResizeHandle, type TableColumnResizeHandleProps } from \"./TableColumnResizeHandle\";\n\nexport type TableHeaderCellDragState = {\n\tattributes: DraggableAttributes;\n\tlisteners: DraggableSyntheticListeners;\n\tsetActivatorElement: (element: HTMLElement | null) => void;\n\tdisabled: boolean;\n\tisDragging: boolean;\n};\n\nexport type TableHeaderInteractionCellProps = Omit<ComponentPropsWithoutRef<\"th\">, \"children\" | \"id\"> & {\n\tcolumnId: UniqueIdentifier;\n\tchildren: ReactNode | ((dragState: TableHeaderCellDragState) => ReactNode);\n\tdragDisabled?: boolean;\n\tdraggingClassName?: string;\n\tresizeHandle?: TableColumnResizeHandleProps;\n};\n\nfunction renderChildren(children: TableHeaderInteractionCellProps[\"children\"], dragState: TableHeaderCellDragState): ReactNode {\n\treturn typeof children === \"function\" ? children(dragState) : children;\n}\n\nexport function TableHeaderInteractionCell({\n\tcolumnId,\n\tchildren,\n\tdragDisabled = false,\n\tdraggingClassName,\n\tresizeHandle,\n\tclassName,\n\tstyle,\n\t...thProps\n}: TableHeaderInteractionCellProps) {\n\tconst { attributes, listeners, setActivatorNodeRef, setNodeRef, transform, /*transition,*/ isDragging, rect } = useSortable({\n\t\tid: columnId,\n\t\tdisabled: dragDisabled\n\t});\n\tconst lockedWidth = isDragging ? rect.current?.width : undefined;\n\tconst sortableStyle: CSSProperties = {\n\t\ttransform: CSS.Translate.toString(transform),\n\t\t// transition,\n\t\tzIndex: isDragging ? \"calc(var(--z-header) + 1)\" : undefined,\n\t\t...(lockedWidth ? { width: lockedWidth, minWidth: lockedWidth } : {}),\n\t\t...style\n\t};\n\tconst dragState: TableHeaderCellDragState = {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetActivatorElement: setActivatorNodeRef,\n\t\tdisabled: dragDisabled,\n\t\tisDragging\n\t};\n\n\treturn (\n\t\t<th {...thProps} ref={setNodeRef} className={cn(className, isDragging && draggingClassName)} style={sortableStyle}>\n\t\t\t{renderChildren(children, dragState)}\n\n\t\t\t{resizeHandle ? <TableColumnResizeHandle {...resizeHandle} /> : null}\n\t\t</th>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-column-interactions-DzEvVuXe.js","names":[],"sources":["../../src/table-column-interactions/TableColumnInteractions.module.scss","../../src/table-column-interactions/TableColumnResizeHandle.tsx","../../src/table-column-interactions/TableHeaderInteractionCell.tsx"],"sourcesContent":[".resizeHandle {\n\tcursor: col-resize;\n\ttouch-action: none;\n\tuser-select: none;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\theight: 100%;\n\twidth: 6px;\n\tz-index: 1;\n\n\t&:hover,\n\t&:focus-visible {\n\t\tbackground: var(--focus-ring);\n\t}\n\n\t&:focus-visible {\n\t\toutline: var(--focus);\n\t\toutline-offset: calc(var(--focus-offset) * -1);\n\t}\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type PointerEvent as ReactPointerEvent } from \"react\";\n\nimport { DEFAULT_TABLE_COLUMN_MIN_WIDTH, normalizeTableColumnWidth } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./TableColumnInteractions.module.scss\";\n\nconst DEFAULT_KEYBOARD_RESIZE_STEP = 8;\n\nexport type TableColumnResizeHandleProps = {\n\tcolumnId: string;\n\tclassName?: string;\n\tminWidth?: number;\n\tkeyboardStep?: number;\n\tariaLabel?: string;\n\tgetStartWidth?: (columnId: string, element: HTMLElement) => number;\n\tonResize: (columnId: string, width: number) => void;\n\tonResizeEnd?: (columnId: string, width: number) => void;\n\tonReset?: (columnId: string) => void;\n};\n\nfunction resolveHeaderCellWidth(element: HTMLElement, minWidth: number): number {\n\tconst headerCell = element.closest(\"th\");\n\tconst width = headerCell?.getBoundingClientRect().width;\n\n\treturn normalizeTableColumnWidth(typeof width === \"number\" && Number.isFinite(width) ? width : minWidth, minWidth);\n}\n\nexport function TableColumnResizeHandle({\n\tcolumnId,\n\tclassName,\n\tminWidth,\n\tkeyboardStep = DEFAULT_KEYBOARD_RESIZE_STEP,\n\tariaLabel = \"Изменить ширину колонки\",\n\tgetStartWidth,\n\tonResize,\n\tonResizeEnd,\n\tonReset\n}: TableColumnResizeHandleProps) {\n\tconst resolvedMinWidth = minWidth ?? DEFAULT_TABLE_COLUMN_MIN_WIDTH;\n\tconst startXRef = useRef(0);\n\tconst startWidthRef = useRef(0);\n\tconst lastWidthRef = useRef(0);\n\tconst activeRef = useRef(false);\n\tconst movedRef = useRef(false);\n\n\tconst resolveStartWidth = (element: HTMLElement) => {\n\t\tconst width = getStartWidth?.(columnId, element) ?? resolveHeaderCellWidth(element, resolvedMinWidth);\n\n\t\treturn normalizeTableColumnWidth(width, resolvedMinWidth);\n\t};\n\n\tconst handlePointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (event.button !== 0 && event.pointerType === \"mouse\") return;\n\n\t\tactiveRef.current = true;\n\t\tmovedRef.current = false;\n\t\tstartXRef.current = event.clientX;\n\t\tstartWidthRef.current = resolveStartWidth(event.currentTarget);\n\t\tlastWidthRef.current = startWidthRef.current;\n\t\tevent.currentTarget.setPointerCapture(event.pointerId);\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!activeRef.current) return;\n\n\t\tconst nextWidth = normalizeTableColumnWidth(startWidthRef.current + event.clientX - startXRef.current, resolvedMinWidth);\n\t\tlastWidthRef.current = nextWidth;\n\t\tmovedRef.current = true;\n\t\tonResize(columnId, nextWidth);\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst finishPointerResize = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (!activeRef.current) return;\n\n\t\tactiveRef.current = false;\n\n\t\tif (movedRef.current) {\n\t\t\tonResizeEnd?.(columnId, lastWidthRef.current);\n\t\t}\n\n\t\ttry {\n\t\t\tevent.currentTarget.releasePointerCapture(event.pointerId);\n\t\t} catch {\n\t\t\t// Pointer capture мог быть сброшен браузером при отмене жеста.\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\tconst handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n\t\tif (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\" && event.key !== \"Home\") {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (event.key === \"Home\") {\n\t\t\tonReset?.(columnId);\n\t\t\treturn;\n\t\t}\n\n\t\tconst direction = event.key === \"ArrowRight\" ? 1 : -1;\n\t\tconst currentWidth = resolveStartWidth(event.currentTarget);\n\t\tconst nextWidth = normalizeTableColumnWidth(currentWidth + direction * keyboardStep, resolvedMinWidth);\n\t\tonResize(columnId, nextWidth);\n\t\tonResizeEnd?.(columnId, nextWidth);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\trole=\"separator\"\n\t\t\taria-label={ariaLabel}\n\t\t\taria-orientation=\"vertical\"\n\t\t\ttabIndex={0}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={handlePointerMove}\n\t\t\tonPointerUp={finishPointerResize}\n\t\t\tonPointerCancel={finishPointerResize}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonDoubleClick={(event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tonReset?.(columnId);\n\t\t\t}}\n\t\t\tclassName={cn(styles.resizeHandle, className)}\n\t\t/>\n\t);\n}\n","import { type ComponentPropsWithoutRef, type CSSProperties, type ReactNode } from \"react\";\n\nimport { type DraggableAttributes, type DraggableSyntheticListeners, type UniqueIdentifier } from \"@dnd-kit/core\";\nimport { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TableColumnResizeHandle, type TableColumnResizeHandleProps } from \"./TableColumnResizeHandle\";\n\nexport type TableHeaderCellDragState = {\n\tattributes: DraggableAttributes;\n\tlisteners: DraggableSyntheticListeners;\n\tsetActivatorElement: (element: HTMLElement | null) => void;\n\tdisabled: boolean;\n\tisDragging: boolean;\n};\n\nexport type TableHeaderInteractionCellProps = Omit<ComponentPropsWithoutRef<\"th\">, \"children\" | \"id\"> & {\n\tcolumnId: UniqueIdentifier;\n\tchildren: ReactNode | ((dragState: TableHeaderCellDragState) => ReactNode);\n\tdragDisabled?: boolean;\n\tdraggingClassName?: string;\n\tresizeHandle?: TableColumnResizeHandleProps;\n};\n\nfunction renderChildren(children: TableHeaderInteractionCellProps[\"children\"], dragState: TableHeaderCellDragState): ReactNode {\n\treturn typeof children === \"function\" ? children(dragState) : children;\n}\n\nexport function TableHeaderInteractionCell({\n\tcolumnId,\n\tchildren,\n\tdragDisabled = false,\n\tdraggingClassName,\n\tresizeHandle,\n\tclassName,\n\tstyle,\n\t...thProps\n}: TableHeaderInteractionCellProps) {\n\tconst { attributes, listeners, setActivatorNodeRef, setNodeRef, transform, /*transition,*/ isDragging, rect } = useSortable({\n\t\tid: columnId,\n\t\tdisabled: dragDisabled\n\t});\n\tconst lockedWidth = isDragging ? rect.current?.width : undefined;\n\tconst sortableStyle: CSSProperties = {\n\t\ttransform: CSS.Translate.toString(transform),\n\t\t// transition,\n\t\tzIndex: isDragging ? \"calc(var(--z-header) + 1)\" : undefined,\n\t\t...(lockedWidth ? { width: lockedWidth, minWidth: lockedWidth } : {}),\n\t\t...style\n\t};\n\tconst dragState: TableHeaderCellDragState = {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetActivatorElement: setActivatorNodeRef,\n\t\tdisabled: dragDisabled,\n\t\tisDragging\n\t};\n\n\treturn (\n\t\t<th {...thProps} ref={setNodeRef} className={cn(className, isDragging && draggingClassName)} style={sortableStyle}>\n\t\t\t{renderChildren(children, dragState)}\n\n\t\t\t{resizeHandle ? <TableColumnResizeHandle {...resizeHandle} /> : null}\n\t\t</th>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useODataSelectBase-CKe1AVMI.js","names":[],"sources":["../../src/select/SelectOptionContent.tsx","../../src/select/model/useODataSelectBase.ts"],"sourcesContent":["import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { HighlightText } from \"../text\";\nimport uiStyles from \"../ui.module.scss\";\n\ninterface OptionContentProps {\n\tlabel: string;\n\tcode?: string;\n\thighlight?: string;\n\t/** Приватный визуальный modifier label для специализированного владельца option. */\n\tlabelClassName?: string;\n\t/** Отдельный modifier code, потому что code задаёт собственный variable-font weight. */\n\tcodeClassName?: string;\n}\n\n/**\n * Универсальный рендерер опции. Используется и в single-select, и в multi-select.\n */\nexport function SelectOptionContent({ label, code, highlight, labelClassName, codeClassName }: OptionContentProps) {\n\treturn (\n\t\t<div className={uiStyles.uiOptionBase}>\n\t\t\t<div className={cn(uiStyles.uiOptionText, \"flexEllipsis\", labelClassName)}>\n\t\t\t\t<HighlightText text={label} highlight={highlight} />\n\t\t\t</div>\n\t\t\t{code && (\n\t\t\t\t<div className={cn(uiStyles.uiOptionCode, codeClassName)}>\n\t\t\t\t\t<HighlightText text={code} highlight={highlight} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport { ODataCollectionModel, ODataSelectBaseProps, useODataCollection } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { startsWithIgnoringZeros } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface UseODataSelectBaseOptions extends Omit<ODataSelectBaseProps, \"model\" | \"value\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tvalue?: string[];\n}\n\nconst DEPENDENCY_KEY_SEPARATOR = \"\\u0002\";\nconst DEPENDENCY_VALUE_SEPARATOR = \"\\u0001\";\n\nfunction normalizeDependencyValues(values?: readonly string[]) {\n\tif (!values?.length) return [];\n\treturn [...new Set(values)].sort();\n}\n\nfunction createDependencySignature(codeKey: string, availableKeys: Record<string, unknown>, dependencies?: Record<string, string[]>) {\n\tconst parts: string[] = [];\n\n\tfor (const key of Object.keys(availableKeys).sort()) {\n\t\tif (key === codeKey) continue;\n\n\t\tconst values = normalizeDependencyValues(dependencies?.[key]);\n\t\tif (!values.length) continue;\n\n\t\tparts.push(`${key}:${values.join(DEPENDENCY_VALUE_SEPARATOR)}`);\n\t}\n\n\treturn parts.join(DEPENDENCY_KEY_SEPARATOR);\n}\n\nfunction parseDependencySignature(signature: string) {\n\tconst dependencies = new Map<string, string[]>();\n\tif (!signature) return dependencies;\n\n\tfor (const part of signature.split(DEPENDENCY_KEY_SEPARATOR)) {\n\t\tconst separatorIndex = part.indexOf(\":\");\n\t\tif (separatorIndex < 0) continue;\n\n\t\tconst key = part.slice(0, separatorIndex);\n\t\tconst values = part\n\t\t\t.slice(separatorIndex + 1)\n\t\t\t.split(DEPENDENCY_VALUE_SEPARATOR)\n\t\t\t.filter(Boolean);\n\t\tif (key && values.length) {\n\t\t\tdependencies.set(key, values);\n\t\t}\n\t}\n\n\treturn dependencies;\n}\n\nexport function useODataSelectBase({ odata, segment, model, value, dependencies }: UseODataSelectBaseOptions) {\n\tconst [query, setQuery] = useState(\"\");\n\tconst [debouncedQuery, setDebouncedQuery] = useState(\"\");\n\n\tconst { codeKey, searchDebounceDelay, minSearchCodeLength, minSearchTextLength: minSearchLength } = model;\n\n\tconst {\n\t\tdata: rawData,\n\t\ttextKey,\n\t\tisLoading,\n\t\tisError,\n\t\tgetItems,\n\t\tseparatedItems,\n\t\tfindSourceItemsByKeys,\n\t\tsetFilteredItems,\n\t\tdebounce\n\t} = useODataCollection({ odata, model });\n\n\tconst itemsCount = separatedItems.length;\n\tconst selectionKey = segment.selectText && textKey ? textKey : codeKey;\n\n\tconst dependencySignature = useMemo(() => {\n\t\tif (!rawData) return \"\";\n\t\treturn createDependencySignature(codeKey, rawData.keyPairsMap, dependencies);\n\t}, [rawData, codeKey, dependencies]);\n\n\tuseEffect(() => {\n\t\tif (!rawData) return;\n\n\t\tconst selfIndex = rawData.chain.findIndex((c) => c.codeKey === codeKey);\n\t\tconst currentDependencies = parseDependencySignature(dependencySignature);\n\n\t\tconst resolveFilteredItems = (index: number) => {\n\t\t\tconst key = rawData.chain[index].codeKey;\n\t\t\tconst dependenciesValues = currentDependencies.get(key);\n\t\t\tif (dependenciesValues?.length) {\n\t\t\t\treturn findSourceItemsByKeys(key, dependenciesValues);\n\t\t\t}\n\t\t};\n\n\t\tfor (let i = rawData.chain.length - 1; i > selfIndex; i--) {\n\t\t\tconst filteredItems = resolveFilteredItems(i);\n\t\t\tif (filteredItems) {\n\t\t\t\tsetFilteredItems(filteredItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < selfIndex; i++) {\n\t\t\tconst filteredItems = resolveFilteredItems(i);\n\t\t\tif (filteredItems) {\n\t\t\t\tsetFilteredItems(filteredItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tsetFilteredItems(undefined);\n\t}, [rawData, dependencySignature, codeKey, findSourceItemsByKeys, setFilteredItems]);\n\n\tuseEffect(() => {\n\t\tdebounce(\n\t\t\t\"search\",\n\t\t\t() => {\n\t\t\t\tsetDebouncedQuery(query.trim().toLowerCase());\n\t\t\t},\n\t\t\tsearchDebounceDelay\n\t\t);\n\t}, [debounce, query, searchDebounceDelay]);\n\n\tconst selectedItems = useMemo(() => {\n\t\tif (!value?.length || !selectionKey) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst selectedValues = new Set(value);\n\t\treturn separatedItems.filter((item) => selectedValues.has(item[selectionKey]));\n\t}, [separatedItems, selectionKey, value]);\n\n\tconst filteredItems = useMemo(() => {\n\t\tif (!rawData) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst isFiltered = debouncedQuery.length >= minSearchLength;\n\n\t\tif (!isFiltered) {\n\t\t\treturn getItems(undefined, selectedItems);\n\t\t}\n\n\t\tconst isAheadText = debouncedQuery.length >= minSearchLength;\n\t\tconst isAheadCode = !segment.hideCode && debouncedQuery.length >= minSearchCodeLength && !Number.isNaN(Number(debouncedQuery));\n\n\t\treturn getItems((codeValue: string, textValue: string) => {\n\t\t\tif (codeValue && textValue) {\n\t\t\t\tif (isAheadCode && startsWithIgnoringZeros(codeValue, debouncedQuery)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (isAheadText && textValue.toLowerCase().includes(debouncedQuery)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}, selectedItems);\n\t}, [debouncedQuery, getItems, minSearchCodeLength, minSearchLength, rawData, segment.hideCode, selectedItems]);\n\n\tconst placeholder = useMemo(() => {\n\t\tconst filteredItemsLength = filteredItems.length;\n\n\t\tif (!itemsCount) {\n\t\t\treturn `${segment.placeholder} <пусто>`;\n\t\t}\n\n\t\tif (filteredItemsLength < itemsCount) {\n\t\t\treturn `${segment.placeholder} <${filteredItemsLength}+>`;\n\t\t}\n\n\t\treturn `${segment.placeholder} <${itemsCount > model.maxVisibleItems ? `${model.maxVisibleItems}+` : itemsCount}>`;\n\t}, [filteredItems.length, itemsCount, model.maxVisibleItems, segment.placeholder]);\n\n\treturn {\n\t\tquery,\n\t\tsetQuery,\n\t\tdebouncedQuery,\n\t\tselectedItems,\n\t\tfilteredItems,\n\t\titemsCount,\n\t\tisLoading,\n\t\tisError,\n\t\tcodeKey,\n\t\ttextKey,\n\t\tselectionKey,\n\t\tplaceholder\n\t};\n}\n\nexport type ODataSelectBaseModel = ReturnType<typeof useODataSelectBase>;\n\nexport function mapSelectedItemsToValues(items: CollectionItem[], selectionKey: string) {\n\treturn items.map((item) => item[selectionKey]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useODataSelectBase-CKe1AVMI.js","names":[],"sources":["../../src/select/SelectOptionContent.tsx","../../src/select/model/useODataSelectBase.ts"],"sourcesContent":["import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { HighlightText } from \"../text\";\nimport uiStyles from \"../ui.module.scss\";\n\ninterface OptionContentProps {\n\tlabel: string;\n\tcode?: string;\n\thighlight?: string;\n\t/** Приватный визуальный modifier label для специализированного владельца option. */\n\tlabelClassName?: string;\n\t/** Отдельный modifier code, потому что code задаёт собственный variable-font weight. */\n\tcodeClassName?: string;\n}\n\n/**\n * Универсальный рендерер опции. Используется и в single-select, и в multi-select.\n */\nexport function SelectOptionContent({ label, code, highlight, labelClassName, codeClassName }: OptionContentProps) {\n\treturn (\n\t\t<div className={uiStyles.uiOptionBase}>\n\t\t\t<div className={cn(uiStyles.uiOptionText, \"flexEllipsis\", labelClassName)}>\n\t\t\t\t<HighlightText text={label} highlight={highlight} />\n\t\t\t</div>\n\t\t\t{code && (\n\t\t\t\t<div className={cn(uiStyles.uiOptionCode, codeClassName)}>\n\t\t\t\t\t<HighlightText text={code} highlight={highlight} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useEffect, useMemo, useState } from \"react\";\n\nimport { ODataCollectionModel, ODataSelectBaseProps, useODataCollection } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { startsWithIgnoringZeros } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface UseODataSelectBaseOptions extends Omit<ODataSelectBaseProps, \"model\" | \"value\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tvalue?: string[];\n}\n\nconst DEPENDENCY_KEY_SEPARATOR = \"\\u0002\";\nconst DEPENDENCY_VALUE_SEPARATOR = \"\\u0001\";\n\nfunction normalizeDependencyValues(values?: readonly string[]) {\n\tif (!values?.length) return [];\n\treturn [...new Set(values)].sort();\n}\n\nfunction createDependencySignature(codeKey: string, availableKeys: Record<string, unknown>, dependencies?: Record<string, string[]>) {\n\tconst parts: string[] = [];\n\n\tfor (const key of Object.keys(availableKeys).sort()) {\n\t\tif (key === codeKey) continue;\n\n\t\tconst values = normalizeDependencyValues(dependencies?.[key]);\n\t\tif (!values.length) continue;\n\n\t\tparts.push(`${key}:${values.join(DEPENDENCY_VALUE_SEPARATOR)}`);\n\t}\n\n\treturn parts.join(DEPENDENCY_KEY_SEPARATOR);\n}\n\nfunction parseDependencySignature(signature: string) {\n\tconst dependencies = new Map<string, string[]>();\n\tif (!signature) return dependencies;\n\n\tfor (const part of signature.split(DEPENDENCY_KEY_SEPARATOR)) {\n\t\tconst separatorIndex = part.indexOf(\":\");\n\t\tif (separatorIndex < 0) continue;\n\n\t\tconst key = part.slice(0, separatorIndex);\n\t\tconst values = part\n\t\t\t.slice(separatorIndex + 1)\n\t\t\t.split(DEPENDENCY_VALUE_SEPARATOR)\n\t\t\t.filter(Boolean);\n\t\tif (key && values.length) {\n\t\t\tdependencies.set(key, values);\n\t\t}\n\t}\n\n\treturn dependencies;\n}\n\nexport function useODataSelectBase({ odata, segment, model, value, dependencies }: UseODataSelectBaseOptions) {\n\tconst [query, setQuery] = useState(\"\");\n\tconst [debouncedQuery, setDebouncedQuery] = useState(\"\");\n\n\tconst { codeKey, searchDebounceDelay, minSearchCodeLength, minSearchTextLength: minSearchLength } = model;\n\n\tconst {\n\t\tdata: rawData,\n\t\ttextKey,\n\t\tisLoading,\n\t\tisError,\n\t\tgetItems,\n\t\tseparatedItems,\n\t\tfindSourceItemsByKeys,\n\t\tsetFilteredItems,\n\t\tdebounce\n\t} = useODataCollection({ odata, model });\n\n\tconst itemsCount = separatedItems.length;\n\tconst selectionKey = segment.selectText && textKey ? textKey : codeKey;\n\n\tconst dependencySignature = useMemo(() => {\n\t\tif (!rawData) return \"\";\n\t\treturn createDependencySignature(codeKey, rawData.keyPairsMap, dependencies);\n\t}, [rawData, codeKey, dependencies]);\n\n\tuseEffect(() => {\n\t\tif (!rawData) return;\n\n\t\tconst selfIndex = rawData.chain.findIndex((c) => c.codeKey === codeKey);\n\t\tconst currentDependencies = parseDependencySignature(dependencySignature);\n\n\t\tconst resolveFilteredItems = (index: number) => {\n\t\t\tconst key = rawData.chain[index].codeKey;\n\t\t\tconst dependenciesValues = currentDependencies.get(key);\n\t\t\tif (dependenciesValues?.length) {\n\t\t\t\treturn findSourceItemsByKeys(key, dependenciesValues);\n\t\t\t}\n\t\t};\n\n\t\tfor (let i = rawData.chain.length - 1; i > selfIndex; i--) {\n\t\t\tconst filteredItems = resolveFilteredItems(i);\n\t\t\tif (filteredItems) {\n\t\t\t\tsetFilteredItems(filteredItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < selfIndex; i++) {\n\t\t\tconst filteredItems = resolveFilteredItems(i);\n\t\t\tif (filteredItems) {\n\t\t\t\tsetFilteredItems(filteredItems);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tsetFilteredItems(undefined);\n\t}, [rawData, dependencySignature, codeKey, findSourceItemsByKeys, setFilteredItems]);\n\n\tuseEffect(() => {\n\t\tdebounce(\n\t\t\t\"search\",\n\t\t\t() => {\n\t\t\t\tsetDebouncedQuery(query.trim().toLowerCase());\n\t\t\t},\n\t\t\tsearchDebounceDelay\n\t\t);\n\t}, [debounce, query, searchDebounceDelay]);\n\n\tconst selectedItems = useMemo(() => {\n\t\tif (!value?.length || !selectionKey) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst selectedValues = new Set(value);\n\t\treturn separatedItems.filter((item) => selectedValues.has(item[selectionKey]));\n\t}, [separatedItems, selectionKey, value]);\n\n\tconst filteredItems = useMemo(() => {\n\t\tif (!rawData) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst isFiltered = debouncedQuery.length >= minSearchLength;\n\n\t\tif (!isFiltered) {\n\t\t\treturn getItems(undefined, selectedItems);\n\t\t}\n\n\t\tconst isAheadText = debouncedQuery.length >= minSearchLength;\n\t\tconst isAheadCode = !segment.hideCode && debouncedQuery.length >= minSearchCodeLength && !Number.isNaN(Number(debouncedQuery));\n\n\t\treturn getItems((codeValue: string, textValue: string) => {\n\t\t\tif (codeValue && textValue) {\n\t\t\t\tif (isAheadCode && startsWithIgnoringZeros(codeValue, debouncedQuery)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif (isAheadText && textValue.toLowerCase().includes(debouncedQuery)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}, selectedItems);\n\t}, [debouncedQuery, getItems, minSearchCodeLength, minSearchLength, rawData, segment.hideCode, selectedItems]);\n\n\tconst placeholder = useMemo(() => {\n\t\tconst filteredItemsLength = filteredItems.length;\n\n\t\tif (!itemsCount) {\n\t\t\treturn `${segment.placeholder} <пусто>`;\n\t\t}\n\n\t\tif (filteredItemsLength < itemsCount) {\n\t\t\treturn `${segment.placeholder} <${filteredItemsLength}+>`;\n\t\t}\n\n\t\treturn `${segment.placeholder} <${itemsCount > model.maxVisibleItems ? `${model.maxVisibleItems}+` : itemsCount}>`;\n\t}, [filteredItems.length, itemsCount, model.maxVisibleItems, segment.placeholder]);\n\n\treturn {\n\t\tquery,\n\t\tsetQuery,\n\t\tdebouncedQuery,\n\t\tselectedItems,\n\t\tfilteredItems,\n\t\titemsCount,\n\t\tisLoading,\n\t\tisError,\n\t\tcodeKey,\n\t\ttextKey,\n\t\tselectionKey,\n\t\tplaceholder\n\t};\n}\n\nexport type ODataSelectBaseModel = ReturnType<typeof useODataSelectBase>;\n\nexport function mapSelectedItemsToValues(items: CollectionItem[], selectionKey: string) {\n\treturn items.map((item) => item[selectionKey]);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wheel-picker-FS58cRsQ.js","names":[],"sources":["../../src/wheel-picker/lib/wheelPickerMath.ts","../../src/wheel-picker/WheelPicker.module.scss","../../src/wheel-picker/WheelPicker.tsx"],"sourcesContent":["/**\n * Возвращает безопасный индекс внутри диапазона элементов wheel-picker.\n */\nexport function clampWheelIndex(index: number, itemsCount: number): number {\n\tif (itemsCount <= 0) return 0;\n\tif (index < 0) return 0;\n\tif (index > itemsCount - 1) return itemsCount - 1;\n\n\treturn index;\n}\n\n/**\n * Возвращает высоту viewport wheel-picker с учётом минимального значения.\n */\nexport function resolveWheelViewportHeight(measuredHeight: number, minHeight: number): number {\n\tif (!Number.isFinite(measuredHeight) || measuredHeight <= 0) return minHeight;\n\treturn Math.max(measuredHeight, minHeight);\n}\n\n/**\n * Возвращает высоту одной строки picker-а.\n */\nexport function resolveWheelItemHeight(viewportHeight: number, visibleRows: number): number {\n\tconst safeVisibleRows = Math.max(1, visibleRows);\n\treturn Math.max(1, Math.round(viewportHeight / safeVisibleRows));\n}\n\n/**\n * Возвращает отступы сверху и снизу, чтобы выбранное значение всегда было по центру.\n */\nexport function resolveWheelEdgePadding(viewportHeight: number, itemHeight: number): number {\n\treturn Math.max(0, Math.round(viewportHeight / 2 - itemHeight / 2));\n}\n\n/**\n * Возвращает scrollTop, при котором значение с данным индексом окажется в центре viewport.\n */\nexport function resolveWheelScrollTop(index: number, itemHeight: number): number {\n\treturn Math.max(0, Math.round(index * itemHeight));\n}\n\n/**\n * Возвращает ближайший индекс по текущему положению scrollTop.\n */\nexport function resolveClosestWheelIndex(scrollTop: number, itemHeight: number, itemsCount: number): number {\n\tif (itemsCount <= 0 || itemHeight <= 0) return 0;\n\treturn clampWheelIndex(Math.round(scrollTop / itemHeight), itemsCount);\n}\n","@use \"@/styles/mixins\" as *;\n\n.wheelPicker {\n\t--wheel-picker-min-height: 10em;\n\t--wheel-picker-viewport-height: var(--wheel-picker-min-height);\n\t--wheel-picker-item-height: calc(var(--wheel-picker-viewport-height) / 7);\n\t--wheel-picker-edge-padding: calc((var(--wheel-picker-viewport-height) / 2) - (var(--wheel-picker-item-height) / 2));\n\n\tposition: relative;\n\tmin-height: var(--wheel-picker-min-height);\n\theight: 100%;\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tbackground: linear-gradient(to bottom, var(--surface-0), transparent 18%, transparent 82%, var(--surface-0)), var(--surface-1);\n\toverflow: hidden;\n}\n\n.viewport {\n\tposition: relative;\n\theight: var(--wheel-picker-viewport-height);\n}\n\n.scroller {\n\theight: 100%;\n\toverflow-y: auto;\n\toverscroll-behavior: contain;\n\tscroll-snap-type: y mandatory;\n\tscrollbar-width: none;\n\tpadding-block: var(--wheel-picker-edge-padding);\n\toutline: none;\n\n\t&::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n}\n\n.items {\n\tdisplay: grid;\n}\n\n.item {\n\theight: var(--wheel-picker-item-height);\n\tpadding: 0 var(--space-sm);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tscroll-snap-align: center;\n\tbackground: transparent;\n\tcolor: var(--content-2);\n\tfont-family: var(--font-family-mono);\n\tfont-variant-numeric: tabular-nums;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tfont-variation-settings var(--transition-fast) ease;\n\n\t&[data-selected] {\n\t\tcolor: var(--content-0);\n\t\tfont-weight: 600;\n\t\tfont-variation-settings: \"wght\" 600;\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tbackground: color-mix(in srgb, var(--surface-accent) 40%, transparent);\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t}\n}\n\n.selectionFrame {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\tright: 0;\n\theight: var(--wheel-picker-item-height);\n\ttransform: translateY(-50%);\n\tborder-top: var(--border);\n\tborder-bottom: var(--border);\n\t// border-radius: var(--radius-xs);\n\tbackground: color-mix(in srgb, var(--surface-accent) 28%, transparent);\n\tpointer-events: none;\n}\n","import type { CSSProperties, Key, KeyboardEvent, ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport {\n\tclampWheelIndex,\n\tresolveClosestWheelIndex,\n\tresolveWheelEdgePadding,\n\tresolveWheelItemHeight,\n\tresolveWheelScrollTop,\n\tresolveWheelViewportHeight\n} from \"./lib/wheelPickerMath\";\nimport styles from \"./WheelPicker.module.scss\";\n\n/**\n * Пропсы внутреннего wheel-picker.\n */\nexport interface WheelPickerProps<T> {\n\titems: readonly T[];\n\tvalue: T;\n\tonChange: (value: T) => void;\n\tariaLabel: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tminHeight?: number;\n\tvisibleRows?: number;\n\tformatItem?: (item: T) => ReactNode;\n\tgetItemKey?: (item: T, index: number) => Key;\n}\n\nconst DEFAULT_MIN_HEIGHT = 192;\nconst DEFAULT_VISIBLE_ROWS = 7;\nconst SNAP_TIMEOUT_MS = 96;\n\n/**\n * Внутренний wheel-picker со snap-кареткой по центру и блокировкой page scroll.\n */\nexport function WheelPicker<T>({\n\titems,\n\tvalue,\n\tonChange,\n\tariaLabel,\n\tdisabled,\n\tclassName,\n\tminHeight = DEFAULT_MIN_HEIGHT,\n\tvisibleRows = DEFAULT_VISIBLE_ROWS,\n\tformatItem,\n\tgetItemKey\n}: WheelPickerProps<T>) {\n\tconst rootRef = useRef<HTMLDivElement | null>(null);\n\tconst scrollerRef = useRef<HTMLDivElement | null>(null);\n\tconst snapTimeoutRef = useRef<number | null>(null);\n\tconst valueIndex = useMemo(\n\t\t() =>\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\titems.findIndex((item) => Object.is(item, value))\n\t\t\t),\n\t\t[items, value]\n\t);\n\tconst [measuredHeight, setMeasuredHeight] = useState(0);\n\tconst viewportHeight = resolveWheelViewportHeight(measuredHeight, minHeight);\n\tconst itemHeight = resolveWheelItemHeight(viewportHeight, visibleRows);\n\tconst edgePadding = resolveWheelEdgePadding(viewportHeight, itemHeight);\n\tconst lastAppliedIndexRef = useRef(valueIndex);\n\n\t/**\n\t * Возвращает высоту контентной области wheel без рамок, чтобы избежать накопления высоты.\n\t */\n\tconst readContentHeight = useCallback((element: HTMLDivElement) => Math.round(element.clientHeight), []);\n\n\t/**\n\t * Доводит scroll до ближайшего центра и синхронизирует выбранное значение.\n\t */\n\tconst snapToClosestValue = useCallback(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller || items.length === 0) return;\n\n\t\tconst nextIndex = resolveClosestWheelIndex(scroller.scrollTop, itemHeight, items.length);\n\t\tscroller.scrollTo({\n\t\t\ttop: resolveWheelScrollTop(nextIndex, itemHeight),\n\t\t\tbehavior: \"smooth\"\n\t\t});\n\n\t\tif (nextIndex !== lastAppliedIndexRef.current) {\n\t\t\tlastAppliedIndexRef.current = nextIndex;\n\t\t\tonChange(items[nextIndex]);\n\t\t}\n\t}, [itemHeight, items, onChange]);\n\n\t/**\n\t * Планирует мягкую доводку wheel после завершения scroll/wheel.\n\t */\n\tconst scheduleSnap = useCallback(() => {\n\t\tif (snapTimeoutRef.current !== null) {\n\t\t\twindow.clearTimeout(snapTimeoutRef.current);\n\t\t}\n\n\t\tsnapTimeoutRef.current = window.setTimeout(() => {\n\t\t\tsnapTimeoutRef.current = null;\n\t\t\tsnapToClosestValue();\n\t\t}, SNAP_TIMEOUT_MS);\n\t}, [snapToClosestValue]);\n\n\tuseEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || typeof ResizeObserver === \"undefined\") return;\n\n\t\tconst syncMeasuredHeight = (nextHeight: number) => {\n\t\t\tsetMeasuredHeight((prevHeight) => (prevHeight === nextHeight ? prevHeight : nextHeight));\n\t\t};\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst entry = entries[0];\n\t\t\tconst nextHeight = Math.round(entry?.contentRect.height ?? readContentHeight(root));\n\n\t\t\tsyncMeasuredHeight(nextHeight);\n\t\t});\n\n\t\tobserver.observe(root);\n\t\tsyncMeasuredHeight(readContentHeight(root));\n\n\t\treturn () => observer.disconnect();\n\t}, [readContentHeight]);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller || items.length === 0) return;\n\n\t\tconst targetIndex = clampWheelIndex(valueIndex, items.length);\n\t\tlastAppliedIndexRef.current = targetIndex;\n\t\tscroller.scrollTo({\n\t\t\ttop: resolveWheelScrollTop(targetIndex, itemHeight),\n\t\t\tbehavior: \"auto\"\n\t\t});\n\t}, [itemHeight, items.length, valueIndex]);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst handleScroll = () => {\n\t\t\tif (disabled) return;\n\t\t\tscheduleSnap();\n\t\t};\n\n\t\tconst handleWheel = (event: WheelEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tscroller.scrollTop += event.deltaY;\n\t\t\tscheduleSnap();\n\t\t};\n\n\t\tscroller.addEventListener(\"scroll\", handleScroll, { passive: true });\n\t\tscroller.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n\t\treturn () => {\n\t\t\tscroller.removeEventListener(\"scroll\", handleScroll);\n\t\t\tscroller.removeEventListener(\"wheel\", handleWheel);\n\t\t};\n\t}, [disabled, items, onChange, scheduleSnap]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (snapTimeoutRef.current !== null) {\n\t\t\t\twindow.clearTimeout(snapTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t/**\n\t * Меняет значение по стрелкам вверх и вниз.\n\t */\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (disabled || items.length === 0) return;\n\n\t\tif (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n\t\tevent.preventDefault();\n\n\t\tconst delta = event.key === \"ArrowUp\" ? -1 : 1;\n\t\tconst nextIndex = clampWheelIndex(valueIndex + delta, items.length);\n\t\tif (nextIndex === valueIndex) return;\n\n\t\tlastAppliedIndexRef.current = nextIndex;\n\t\tonChange(items[nextIndex]);\n\t};\n\n\tconst cssVars = {\n\t\t\"--wheel-picker-min-height\": `${minHeight}px`,\n\t\t\"--wheel-picker-viewport-height\": `${viewportHeight}px`,\n\t\t\"--wheel-picker-item-height\": `${itemHeight}px`,\n\t\t\"--wheel-picker-edge-padding\": `${edgePadding}px`\n\t} as CSSProperties;\n\n\treturn (\n\t\t<div ref={rootRef} className={cn(styles.wheelPicker, className)} style={cssVars}>\n\t\t\t<div className={styles.viewport}>\n\t\t\t\t<div\n\t\t\t\t\tref={scrollerRef}\n\t\t\t\t\tclassName={styles.scroller}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t\t\t<div className={styles.items}>\n\t\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\t\tconst selected = index === valueIndex;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={getItemKey?.(item, index) ?? index}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\tclassName={styles.item}\n\t\t\t\t\t\t\t\t\tdata-selected={selected ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tlastAppliedIndexRef.current = index;\n\t\t\t\t\t\t\t\t\t\tonChange(item);\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t{formatItem?.(item) ?? String(item)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div className={styles.selectionFrame} aria-hidden=\"true\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"wheel-picker-FS58cRsQ.js","names":[],"sources":["../../src/wheel-picker/lib/wheelPickerMath.ts","../../src/wheel-picker/WheelPicker.module.scss","../../src/wheel-picker/WheelPicker.tsx"],"sourcesContent":["/**\n * Возвращает безопасный индекс внутри диапазона элементов wheel-picker.\n */\nexport function clampWheelIndex(index: number, itemsCount: number): number {\n\tif (itemsCount <= 0) return 0;\n\tif (index < 0) return 0;\n\tif (index > itemsCount - 1) return itemsCount - 1;\n\n\treturn index;\n}\n\n/**\n * Возвращает высоту viewport wheel-picker с учётом минимального значения.\n */\nexport function resolveWheelViewportHeight(measuredHeight: number, minHeight: number): number {\n\tif (!Number.isFinite(measuredHeight) || measuredHeight <= 0) return minHeight;\n\treturn Math.max(measuredHeight, minHeight);\n}\n\n/**\n * Возвращает высоту одной строки picker-а.\n */\nexport function resolveWheelItemHeight(viewportHeight: number, visibleRows: number): number {\n\tconst safeVisibleRows = Math.max(1, visibleRows);\n\treturn Math.max(1, Math.round(viewportHeight / safeVisibleRows));\n}\n\n/**\n * Возвращает отступы сверху и снизу, чтобы выбранное значение всегда было по центру.\n */\nexport function resolveWheelEdgePadding(viewportHeight: number, itemHeight: number): number {\n\treturn Math.max(0, Math.round(viewportHeight / 2 - itemHeight / 2));\n}\n\n/**\n * Возвращает scrollTop, при котором значение с данным индексом окажется в центре viewport.\n */\nexport function resolveWheelScrollTop(index: number, itemHeight: number): number {\n\treturn Math.max(0, Math.round(index * itemHeight));\n}\n\n/**\n * Возвращает ближайший индекс по текущему положению scrollTop.\n */\nexport function resolveClosestWheelIndex(scrollTop: number, itemHeight: number, itemsCount: number): number {\n\tif (itemsCount <= 0 || itemHeight <= 0) return 0;\n\treturn clampWheelIndex(Math.round(scrollTop / itemHeight), itemsCount);\n}\n","@use \"@/styles/mixins\" as *;\n\n.wheelPicker {\n\t--wheel-picker-min-height: 10em;\n\t--wheel-picker-viewport-height: var(--wheel-picker-min-height);\n\t--wheel-picker-item-height: calc(var(--wheel-picker-viewport-height) / 7);\n\t--wheel-picker-edge-padding: calc((var(--wheel-picker-viewport-height) / 2) - (var(--wheel-picker-item-height) / 2));\n\n\tposition: relative;\n\tmin-height: var(--wheel-picker-min-height);\n\theight: 100%;\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tbackground: linear-gradient(to bottom, var(--surface-0), transparent 18%, transparent 82%, var(--surface-0)), var(--surface-1);\n\toverflow: hidden;\n}\n\n.viewport {\n\tposition: relative;\n\theight: var(--wheel-picker-viewport-height);\n}\n\n.scroller {\n\theight: 100%;\n\toverflow-y: auto;\n\toverscroll-behavior: contain;\n\tscroll-snap-type: y mandatory;\n\tscrollbar-width: none;\n\tpadding-block: var(--wheel-picker-edge-padding);\n\toutline: none;\n\n\t&::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n}\n\n.items {\n\tdisplay: grid;\n}\n\n.item {\n\theight: var(--wheel-picker-item-height);\n\tpadding: 0 var(--space-sm);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tscroll-snap-align: center;\n\tbackground: transparent;\n\tcolor: var(--content-2);\n\tfont-family: var(--font-family-mono);\n\tfont-variant-numeric: tabular-nums;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tfont-variation-settings var(--transition-fast) ease;\n\n\t&[data-selected] {\n\t\tcolor: var(--content-0);\n\t\tfont-weight: 600;\n\t\tfont-variation-settings: \"wght\" 600;\n\t}\n\n\t&:hover:not(:disabled) {\n\t\tbackground: color-mix(in srgb, var(--surface-accent) 40%, transparent);\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t}\n}\n\n.selectionFrame {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\tright: 0;\n\theight: var(--wheel-picker-item-height);\n\ttransform: translateY(-50%);\n\tborder-top: var(--border);\n\tborder-bottom: var(--border);\n\t// border-radius: var(--radius-xs);\n\tbackground: color-mix(in srgb, var(--surface-accent) 28%, transparent);\n\tpointer-events: none;\n}\n","import type { CSSProperties, Key, KeyboardEvent, ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport {\n\tclampWheelIndex,\n\tresolveClosestWheelIndex,\n\tresolveWheelEdgePadding,\n\tresolveWheelItemHeight,\n\tresolveWheelScrollTop,\n\tresolveWheelViewportHeight\n} from \"./lib/wheelPickerMath\";\nimport styles from \"./WheelPicker.module.scss\";\n\n/**\n * Пропсы внутреннего wheel-picker.\n */\nexport interface WheelPickerProps<T> {\n\titems: readonly T[];\n\tvalue: T;\n\tonChange: (value: T) => void;\n\tariaLabel: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tminHeight?: number;\n\tvisibleRows?: number;\n\tformatItem?: (item: T) => ReactNode;\n\tgetItemKey?: (item: T, index: number) => Key;\n}\n\nconst DEFAULT_MIN_HEIGHT = 192;\nconst DEFAULT_VISIBLE_ROWS = 7;\nconst SNAP_TIMEOUT_MS = 96;\n\n/**\n * Внутренний wheel-picker со snap-кареткой по центру и блокировкой page scroll.\n */\nexport function WheelPicker<T>({\n\titems,\n\tvalue,\n\tonChange,\n\tariaLabel,\n\tdisabled,\n\tclassName,\n\tminHeight = DEFAULT_MIN_HEIGHT,\n\tvisibleRows = DEFAULT_VISIBLE_ROWS,\n\tformatItem,\n\tgetItemKey\n}: WheelPickerProps<T>) {\n\tconst rootRef = useRef<HTMLDivElement | null>(null);\n\tconst scrollerRef = useRef<HTMLDivElement | null>(null);\n\tconst snapTimeoutRef = useRef<number | null>(null);\n\tconst valueIndex = useMemo(\n\t\t() =>\n\t\t\tMath.max(\n\t\t\t\t0,\n\t\t\t\titems.findIndex((item) => Object.is(item, value))\n\t\t\t),\n\t\t[items, value]\n\t);\n\tconst [measuredHeight, setMeasuredHeight] = useState(0);\n\tconst viewportHeight = resolveWheelViewportHeight(measuredHeight, minHeight);\n\tconst itemHeight = resolveWheelItemHeight(viewportHeight, visibleRows);\n\tconst edgePadding = resolveWheelEdgePadding(viewportHeight, itemHeight);\n\tconst lastAppliedIndexRef = useRef(valueIndex);\n\n\t/**\n\t * Возвращает высоту контентной области wheel без рамок, чтобы избежать накопления высоты.\n\t */\n\tconst readContentHeight = useCallback((element: HTMLDivElement) => Math.round(element.clientHeight), []);\n\n\t/**\n\t * Доводит scroll до ближайшего центра и синхронизирует выбранное значение.\n\t */\n\tconst snapToClosestValue = useCallback(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller || items.length === 0) return;\n\n\t\tconst nextIndex = resolveClosestWheelIndex(scroller.scrollTop, itemHeight, items.length);\n\t\tscroller.scrollTo({\n\t\t\ttop: resolveWheelScrollTop(nextIndex, itemHeight),\n\t\t\tbehavior: \"smooth\"\n\t\t});\n\n\t\tif (nextIndex !== lastAppliedIndexRef.current) {\n\t\t\tlastAppliedIndexRef.current = nextIndex;\n\t\t\tonChange(items[nextIndex]);\n\t\t}\n\t}, [itemHeight, items, onChange]);\n\n\t/**\n\t * Планирует мягкую доводку wheel после завершения scroll/wheel.\n\t */\n\tconst scheduleSnap = useCallback(() => {\n\t\tif (snapTimeoutRef.current !== null) {\n\t\t\twindow.clearTimeout(snapTimeoutRef.current);\n\t\t}\n\n\t\tsnapTimeoutRef.current = window.setTimeout(() => {\n\t\t\tsnapTimeoutRef.current = null;\n\t\t\tsnapToClosestValue();\n\t\t}, SNAP_TIMEOUT_MS);\n\t}, [snapToClosestValue]);\n\n\tuseEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || typeof ResizeObserver === \"undefined\") return;\n\n\t\tconst syncMeasuredHeight = (nextHeight: number) => {\n\t\t\tsetMeasuredHeight((prevHeight) => (prevHeight === nextHeight ? prevHeight : nextHeight));\n\t\t};\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst entry = entries[0];\n\t\t\tconst nextHeight = Math.round(entry?.contentRect.height ?? readContentHeight(root));\n\n\t\t\tsyncMeasuredHeight(nextHeight);\n\t\t});\n\n\t\tobserver.observe(root);\n\t\tsyncMeasuredHeight(readContentHeight(root));\n\n\t\treturn () => observer.disconnect();\n\t}, [readContentHeight]);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller || items.length === 0) return;\n\n\t\tconst targetIndex = clampWheelIndex(valueIndex, items.length);\n\t\tlastAppliedIndexRef.current = targetIndex;\n\t\tscroller.scrollTo({\n\t\t\ttop: resolveWheelScrollTop(targetIndex, itemHeight),\n\t\t\tbehavior: \"auto\"\n\t\t});\n\t}, [itemHeight, items.length, valueIndex]);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst handleScroll = () => {\n\t\t\tif (disabled) return;\n\t\t\tscheduleSnap();\n\t\t};\n\n\t\tconst handleWheel = (event: WheelEvent) => {\n\t\t\tif (disabled) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tscroller.scrollTop += event.deltaY;\n\t\t\tscheduleSnap();\n\t\t};\n\n\t\tscroller.addEventListener(\"scroll\", handleScroll, { passive: true });\n\t\tscroller.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n\t\treturn () => {\n\t\t\tscroller.removeEventListener(\"scroll\", handleScroll);\n\t\t\tscroller.removeEventListener(\"wheel\", handleWheel);\n\t\t};\n\t}, [disabled, items, onChange, scheduleSnap]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (snapTimeoutRef.current !== null) {\n\t\t\t\twindow.clearTimeout(snapTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t/**\n\t * Меняет значение по стрелкам вверх и вниз.\n\t */\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (disabled || items.length === 0) return;\n\n\t\tif (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n\t\tevent.preventDefault();\n\n\t\tconst delta = event.key === \"ArrowUp\" ? -1 : 1;\n\t\tconst nextIndex = clampWheelIndex(valueIndex + delta, items.length);\n\t\tif (nextIndex === valueIndex) return;\n\n\t\tlastAppliedIndexRef.current = nextIndex;\n\t\tonChange(items[nextIndex]);\n\t};\n\n\tconst cssVars = {\n\t\t\"--wheel-picker-min-height\": `${minHeight}px`,\n\t\t\"--wheel-picker-viewport-height\": `${viewportHeight}px`,\n\t\t\"--wheel-picker-item-height\": `${itemHeight}px`,\n\t\t\"--wheel-picker-edge-padding\": `${edgePadding}px`\n\t} as CSSProperties;\n\n\treturn (\n\t\t<div ref={rootRef} className={cn(styles.wheelPicker, className)} style={cssVars}>\n\t\t\t<div className={styles.viewport}>\n\t\t\t\t<div\n\t\t\t\t\tref={scrollerRef}\n\t\t\t\t\tclassName={styles.scroller}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t\t\t<div className={styles.items}>\n\t\t\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\t\t\tconst selected = index === valueIndex;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={getItemKey?.(item, index) ?? index}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\tclassName={styles.item}\n\t\t\t\t\t\t\t\t\tdata-selected={selected ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tlastAppliedIndexRef.current = index;\n\t\t\t\t\t\t\t\t\t\tonChange(item);\n\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t{formatItem?.(item) ?? String(item)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div className={styles.selectionFrame} aria-hidden=\"true\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/context-menu-DQeR3y7M.js";
1
+ import { n as e, t } from "../chunks/context-menu-C6RO7soI.js";
2
2
  export { e as ContextMenu, t as DropdownMenu };
@@ -1,3 +1,3 @@
1
- import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../chunks/CalendarView-KCkhCtK-.js";
2
- import { a as c, c as l, d as u, f as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S } from "../chunks/date-input-DBJisPRz.js";
1
+ import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../chunks/CalendarView-Z_XWk7aI.js";
2
+ import { a as c, c as l, d as u, f as d, h as f, i as p, l as m, m as h, n as g, o as _, p as v, r as y, s as b, t as x, u as S } from "../chunks/date-input-BzExUQnc.js";
3
3
  export { s as CalendarView, r as DATE_INPUT_SELECTION_MODES, a as DATE_INPUT_WEEK_END_DAYS, n as DATE_PICKER_LEVELS, y as DEFAULT_DATE_INPUT_FORMAT, p as DEFAULT_DATE_INPUT_PRESET, x as RangeDateInput, g as SingleDateInput, c as areRangeDateValuesEqual, _ as areSingleDateValuesEqual, b as formatDateInputValue, l as formatRangeDateValue, m as formatSingleDateValue, e as getDatePickerLevelForSelectionMode, i as isDatePickerLevelAvailable, S as normalizeRangeDateValue, u as normalizeRangeEndDateValue, d as normalizeSingleDateValue, v as parseRangeDateValue, h as parseRangeEndDateValue, f as parseSingleDateValue, o as resolveAvailableDatePickerLevel, t as resolveDateInputPeriodRangeState };
@@ -1,8 +1,8 @@
1
- import { r as e } from "../chunks/popover-xJJqy1v6.js";
1
+ import { r as e } from "../chunks/popover-CGU3MlsH.js";
2
2
  import { t } from "../chunks/ui.module-BisoTevy.js";
3
- import { n } from "../chunks/button-CC0Jdx1j.js";
4
- import { i as r, l as i, s as a } from "../chunks/input-BCJfUdK_.js";
5
- import { t as o } from "../chunks/CalendarView-KCkhCtK-.js";
3
+ import { n } from "../chunks/button-BU2kRzwu.js";
4
+ import { i as r, l as i, s as a } from "../chunks/input-Bp6_Ucgr.js";
5
+ import { t as o } from "../chunks/CalendarView-Z_XWk7aI.js";
6
6
  import { t as s } from "../chunks/wheel-picker-FS58cRsQ.js";
7
7
  import { useCallback as c, useEffect as l, useEffectEvent as u, useMemo as d, useRef as f, useState as p } from "react";
8
8
  import { cn as m } from "@ryuzaki13/react-foundation-lib/utils";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/date-time-input/lib/dateTimeValue.ts","../../src/date-time-input/lib/timePanelState.ts","../../src/date-time-input/model/useDateTimeSegments.ts","../../src/date-time-input/ui/SingleDateTimeInput.module.scss","../../src/date-time-input/ui/TimePanel.module.scss","../../src/date-time-input/ui/TimePanel.tsx","../../src/date-time-input/ui/SingleDateTimeInput.tsx"],"sourcesContent":["import { dateToIndexedSegmentValues, indexedSegmentsToDate, parseDateSegmentMask } from \"@ryuzaki13/react-foundation-lib/date-segments\";\nimport {\n\tcreateCalendarDate,\n\ttype DateFormatPreset,\n\tformatDate,\n\tparseDate,\n\tparseDateByPattern\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport type DateTimeInputMode = \"date-time\" | \"time\";\n\n/**\n * Фиксированный формат нового поля даты-времени.\n */\nexport const DATE_TIME_INPUT_FORMAT = \"dd.MM.yyyy HH:mm\";\nexport const TIME_INPUT_FORMAT = \"HH:mm\";\n\nconst DATE_TIME_INPUT_PRESET_NAME = \"__date_time_input__\";\nconst TIME_INPUT_PRESET_NAME = \"__time_input__\";\nconst TIME_ONLY_BASE_YEAR = 1970;\nconst TIME_ONLY_BASE_MONTH = 0;\nconst TIME_ONLY_BASE_DAY = 1;\nconst TIME_SEGMENTS = parseDateSegmentMask(TIME_INPUT_FORMAT);\n\n/**\n * Создаёт техническую базовую дату для режима выбора только времени.\n */\nexport function createTimeOnlyBaseDate(hours = 0, minutes = 0): Date {\n\treturn createCalendarDate(TIME_ONLY_BASE_YEAR, TIME_ONLY_BASE_MONTH, TIME_ONLY_BASE_DAY, hours, minutes, 0, 0);\n}\n\n/**\n * Возвращает формат пользовательского ввода для выбранного режима.\n */\nexport function getDateTimeInputFormat(mode: DateTimeInputMode = \"date-time\"): string {\n\treturn mode === \"time\" ? TIME_INPUT_FORMAT : DATE_TIME_INPUT_FORMAT;\n}\n\n/**\n * Создаёт временную предустановку форматирования для нового поля даты-времени.\n */\nexport function createDateTimeInputPreset(mode: DateTimeInputMode = \"date-time\"): DateFormatPreset {\n\treturn {\n\t\tname: mode === \"time\" ? TIME_INPUT_PRESET_NAME : DATE_TIME_INPUT_PRESET_NAME,\n\t\tpattern: getDateTimeInputFormat(mode),\n\t\tlocale: \"ru-RU\",\n\t\tinvalidFallback: \"\"\n\t};\n}\n\n/**\n * Нормализует внешнее значение к валидному Date без timezone-сдвига.\n */\nexport function normalizeDateTimeValue(value: Date | null | undefined, mode: DateTimeInputMode = \"date-time\"): Date | null {\n\tif (value == null) return null;\n\n\tconst parsedValue = parseDate(value);\n\tif (!parsedValue) return null;\n\n\tif (mode === \"time\") {\n\t\treturn createTimeOnlyBaseDate(parsedValue.getHours(), parsedValue.getMinutes());\n\t}\n\n\treturn parsedValue;\n}\n\n/**\n * Форматирует значение поля даты-времени в фиксированный пользовательский формат.\n */\nexport function formatDateTimeInputValue(value: Date | null | undefined, mode: DateTimeInputMode = \"date-time\"): string {\n\tif (!value) return \"\";\n\treturn formatDate(normalizeDateTimeValue(value, mode), createDateTimeInputPreset(mode));\n}\n\n/**\n * Строго парсит строку пользовательского ввода в Date.\n */\nexport function parseDateTimeInputValue(value: string, mode: DateTimeInputMode = \"date-time\"): Date | null {\n\tif (mode === \"time\") {\n\t\tconst match = /^\\d{2}:\\d{2}$/.exec(value.trim());\n\t\tif (!match) return null;\n\n\t\tconst values = dateToIndexedSegmentValues(createTimeOnlyBaseDate(), TIME_SEGMENTS);\n\t\tvalues.set(0, value.slice(0, 2));\n\t\tvalues.set(2, value.slice(3, 5));\n\n\t\treturn indexedSegmentsToDate(TIME_SEGMENTS, values, {\n\t\t\tdefaultDate: createTimeOnlyBaseDate()\n\t\t});\n\t}\n\n\tconst parsed = parseDateByPattern(value, DATE_TIME_INPUT_FORMAT);\n\tif (!parsed || parsed.kind !== \"date-time\") return null;\n\n\treturn parsed.date;\n}\n\n/**\n * Проверяет, попадает ли дата-время в допустимый диапазон.\n */\nexport function isDateTimeWithinRange(value: Date, minDate?: Date, maxDate?: Date, mode: DateTimeInputMode = \"date-time\"): boolean {\n\tconst normalizedValue = normalizeDateTimeValue(value, mode);\n\tif (!normalizedValue) return false;\n\n\tif (mode === \"time\") {\n\t\tconst valueMinutes = normalizedValue.getHours() * 60 + normalizedValue.getMinutes();\n\t\tconst normalizedMinDate = minDate ? normalizeDateTimeValue(minDate, \"time\") : null;\n\t\tconst normalizedMaxDate = maxDate ? normalizeDateTimeValue(maxDate, \"time\") : null;\n\n\t\tif (normalizedMinDate) {\n\t\t\tconst minMinutes = normalizedMinDate.getHours() * 60 + normalizedMinDate.getMinutes();\n\t\t\tif (valueMinutes < minMinutes) return false;\n\t\t}\n\n\t\tif (normalizedMaxDate) {\n\t\t\tconst maxMinutes = normalizedMaxDate.getHours() * 60 + normalizedMaxDate.getMinutes();\n\t\t\tif (valueMinutes > maxMinutes) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif (minDate && normalizedValue < minDate) return false;\n\tif (maxDate && normalizedValue > maxDate) return false;\n\n\treturn true;\n}\n\n/**\n * Переносит дату выбранного дня, сохраняя часы и минуты базового значения.\n */\nexport function mergeDateWithTime(datePart: Date, timeSource?: Date | null): Date {\n\tconst source = normalizeDateTimeValue(timeSource);\n\tconst hours = source?.getHours() ?? 0;\n\tconst minutes = source?.getMinutes() ?? 0;\n\n\treturn createCalendarDate(datePart.getFullYear(), datePart.getMonth(), datePart.getDate(), hours, minutes, 0, 0);\n}\n\n/**\n * Переносит часы и минуты в базовую календарную дату.\n */\nexport function mergeTimeIntoDate(baseDate: Date, hours: number, minutes: number, mode: DateTimeInputMode = \"date-time\"): Date {\n\tif (mode === \"time\") {\n\t\treturn createTimeOnlyBaseDate(hours, minutes);\n\t}\n\n\treturn createCalendarDate(baseDate.getFullYear(), baseDate.getMonth(), baseDate.getDate(), hours, minutes, 0, 0);\n}\n\n/**\n * Создаёт рабочую дату для picker-сценариев без выбранного значения.\n */\nexport function resolvePickerBaseDate(value: Date | null | undefined, fallbackDate: Date, mode: DateTimeInputMode = \"date-time\"): Date {\n\tif (mode === \"time\") {\n\t\treturn normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate();\n\t}\n\n\treturn normalizeDateTimeValue(value, mode) ?? fallbackDate;\n}\n\n/**\n * Возвращает границы часов и минут для выбранного календарного дня.\n */\nexport function getTimeRangeForDay(\n\tday: Date,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tmode: DateTimeInputMode = \"date-time\"\n): {\n\tdisabled: boolean;\n\tminHour: number;\n\tmaxHour: number;\n\tminMinuteByHour: (hour: number) => number;\n\tmaxMinuteByHour: (hour: number) => number;\n} {\n\tconst normalizedDay = normalizeDateTimeValue(day, mode) ?? day;\n\tconst normalizedMinDate = minDate ? normalizeDateTimeValue(minDate, mode) : null;\n\tconst normalizedMaxDate = maxDate ? normalizeDateTimeValue(maxDate, mode) : null;\n\tconst isSameMinDay =\n\t\t!!normalizedMinDate &&\n\t\tnormalizedDay.getFullYear() === normalizedMinDate.getFullYear() &&\n\t\tnormalizedDay.getMonth() === normalizedMinDate.getMonth() &&\n\t\tnormalizedDay.getDate() === normalizedMinDate.getDate();\n\tconst isSameMaxDay =\n\t\t!!normalizedMaxDate &&\n\t\tnormalizedDay.getFullYear() === normalizedMaxDate.getFullYear() &&\n\t\tnormalizedDay.getMonth() === normalizedMaxDate.getMonth() &&\n\t\tnormalizedDay.getDate() === normalizedMaxDate.getDate();\n\n\tconst minHour = isSameMinDay ? normalizedMinDate!.getHours() : 0;\n\tconst maxHour = isSameMaxDay ? normalizedMaxDate!.getHours() : 23;\n\tconst minMinuteAtBoundary = isSameMinDay && minHour === maxHour ? normalizedMinDate!.getMinutes() : 0;\n\tconst maxMinuteAtBoundary = isSameMaxDay && minHour === maxHour ? normalizedMaxDate!.getMinutes() : 59;\n\tconst disabled = minHour > maxHour || (minHour === maxHour && minMinuteAtBoundary > maxMinuteAtBoundary);\n\n\treturn {\n\t\tdisabled,\n\t\tminHour,\n\t\tmaxHour,\n\t\tminMinuteByHour: (hour) => {\n\t\t\tif (disabled) return 0;\n\t\t\treturn isSameMinDay && hour === minHour ? normalizedMinDate!.getMinutes() : 0;\n\t\t},\n\t\tmaxMinuteByHour: (hour) => {\n\t\t\tif (disabled) return 59;\n\t\t\treturn isSameMaxDay && hour === maxHour ? normalizedMaxDate!.getMinutes() : 59;\n\t\t}\n\t};\n}\n\n/**\n * Ограничивает часы и минуты допустимым диапазоном текущего дня.\n */\nexport function clampTimeForDay(\n\tday: Date,\n\thours: number,\n\tminutes: number,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tmode: DateTimeInputMode = \"date-time\"\n): { hours: number; minutes: number } {\n\tconst range = getTimeRangeForDay(day, minDate, maxDate, mode);\n\tif (range.disabled) {\n\t\treturn { hours: 0, minutes: 0 };\n\t}\n\n\tconst clampedHour = Math.min(Math.max(hours, range.minHour), range.maxHour);\n\tconst minMinute = range.minMinuteByHour(clampedHour);\n\tconst maxMinute = range.maxMinuteByHour(clampedHour);\n\tconst clampedMinute = Math.min(Math.max(minutes, minMinute), maxMinute);\n\n\treturn {\n\t\thours: clampedHour,\n\t\tminutes: clampedMinute\n\t};\n}\n","import { getTimeRangeForDay } from \"./dateTimeValue\";\n\nimport type { DateTimeInputMode } from \"./dateTimeValue\";\n\n/**\n * Состояние и доступные значения для панели выбора времени.\n */\nexport interface TimePanelState {\n\tdisabled: boolean;\n\tselectedHour: number;\n\tselectedMinute: number;\n\thours: number[];\n\tminutes: number[];\n}\n\n/**\n * Собирает состояние часов и минут для панели выбора времени.\n */\nexport function buildTimePanelState(value: Date, minDate?: Date, maxDate?: Date, mode: DateTimeInputMode = \"date-time\"): TimePanelState {\n\tconst timeRange = getTimeRangeForDay(value, minDate, maxDate, mode);\n\tconst selectedHour = value.getHours();\n\tconst selectedMinute = value.getMinutes();\n\tconst minuteMin = timeRange.minMinuteByHour(selectedHour);\n\tconst minuteMax = timeRange.maxMinuteByHour(selectedHour);\n\n\tif (timeRange.disabled) {\n\t\treturn {\n\t\t\tdisabled: true,\n\t\t\tselectedHour,\n\t\t\tselectedMinute,\n\t\t\thours: [],\n\t\t\tminutes: []\n\t\t};\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tselectedHour,\n\t\tselectedMinute,\n\t\thours: Array.from({ length: timeRange.maxHour - timeRange.minHour + 1 }, (_, index) => timeRange.minHour + index),\n\t\tminutes: Array.from({ length: minuteMax - minuteMin + 1 }, (_, index) => minuteMin + index)\n\t};\n}\n","import type { ChangeEvent, FocusEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport {\n\tareAllDateSegmentsEmpty,\n\tdateToIndexedSegmentValues,\n\ttype EditableDateSegment,\n\tindexedSegmentsToDate,\n\tparseDateSegmentMask\n} from \"@ryuzaki13/react-foundation-lib/date-segments\";\n\nimport { createTimeOnlyBaseDate, getDateTimeInputFormat, isDateTimeWithinRange, normalizeDateTimeValue } from \"../lib\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\ninterface UseDateTimeSegmentsOptions {\n\tvalue: Date | null | undefined;\n\tonChange: (value: Date | null) => void;\n\tonClearError?: () => void;\n\tdisabled?: boolean;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tmode?: DateTimeInputMode;\n}\n\nfunction resolveEditableIndices(segments: readonly { kind: string }[]): number[] {\n\tconst indices: number[] = [];\n\n\tsegments.forEach((segment, index) => {\n\t\tif (segment.kind === \"editable\") {\n\t\t\tindices.push(index);\n\t\t}\n\t});\n\n\treturn indices;\n}\n\n/**\n * Управляет сегментным вводом фиксированного формата даты-времени или только времени.\n */\nexport function useDateTimeSegments({\n\tvalue,\n\tonChange,\n\tonClearError,\n\tdisabled,\n\tminDate,\n\tmaxDate,\n\tmode = \"date-time\"\n}: UseDateTimeSegmentsOptions) {\n\tconst inputFormat = useMemo(() => getDateTimeInputFormat(mode), [mode]);\n\tconst segments = useMemo(() => parseDateSegmentMask(inputFormat), [inputFormat]);\n\tconst editableIndices = useMemo(() => resolveEditableIndices(segments), [segments]);\n\tconst committedValues = useMemo(() => dateToIndexedSegmentValues(value ?? null, segments), [segments, value]);\n\tconst [dirtyValues, setDirtyValues] = useState<Map<number, string> | null>(null);\n\tconst currentValueTime = value?.getTime() ?? null;\n\n\tconst syncDirtyValues = useEffectEvent((values: Map<number, string> | null) => setDirtyValues(values));\n\n\tuseEffect(() => {\n\t\tsyncDirtyValues(null);\n\t}, [currentValueTime, mode]);\n\n\tconst segmentValues = dirtyValues ?? committedValues;\n\tconst refsMap = useRef<Map<number, HTMLInputElement>>(new Map());\n\tconst blurTimeout = useRef<number>(0);\n\n\t/**\n\t * Пытается собрать и отдать наружу новое значение поля.\n\t */\n\tconst tryCommit = useCallback(\n\t\t(updatedValues: Map<number, string>) => {\n\t\t\tif (areAllDateSegmentsEmpty(segments, updatedValues)) {\n\t\t\t\tonChange(null);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst nextDate = indexedSegmentsToDate(segments, updatedValues, {\n\t\t\t\tdefaultDate: mode === \"time\" ? (normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate()) : undefined\n\t\t\t});\n\t\t\tif (!nextDate) return null;\n\t\t\tif (!isDateTimeWithinRange(nextDate, minDate, maxDate, mode)) return null;\n\n\t\t\tonChange(nextDate);\n\t\t\treturn nextDate;\n\t\t},\n\t\t[maxDate, minDate, mode, onChange, segments, value]\n\t);\n\n\t/**\n\t * Фокусирует конкретный редактируемый сегмент.\n\t */\n\tconst focusSegment = useCallback((index: number, selectAll = true) => {\n\t\tconst element = refsMap.current.get(index);\n\t\tif (!element) return;\n\n\t\telement.focus();\n\t\tif (selectAll) {\n\t\t\trequestAnimationFrame(() => element.select());\n\t\t}\n\t}, []);\n\n\t/**\n\t * Возвращает индекс следующего редактируемого сегмента.\n\t */\n\tconst getNextEditable = useCallback(\n\t\t(currentIndex: number): number | null => {\n\t\t\tconst position = editableIndices.indexOf(currentIndex);\n\t\t\treturn position < editableIndices.length - 1 ? editableIndices[position + 1] : null;\n\t\t},\n\t\t[editableIndices]\n\t);\n\n\t/**\n\t * Возвращает индекс предыдущего редактируемого сегмента.\n\t */\n\tconst getPreviousEditable = useCallback(\n\t\t(currentIndex: number): number | null => {\n\t\t\tconst position = editableIndices.indexOf(currentIndex);\n\t\t\treturn position > 0 ? editableIndices[position - 1] : null;\n\t\t},\n\t\t[editableIndices]\n\t);\n\n\t/**\n\t * Дополняет неполный сегмент ведущими нулями.\n\t */\n\tconst padValue = useCallback((valueToPad: string, segment: EditableDateSegment) => valueToPad.padStart(segment.length, \"0\"), []);\n\n\t/**\n\t * Регистрирует DOM-ссылку сегмента по индексу.\n\t */\n\tconst registerRef = useCallback(\n\t\t(index: number) => (element: HTMLInputElement | null) => {\n\t\t\tif (element) {\n\t\t\t\trefsMap.current.set(index, element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trefsMap.current.delete(index);\n\t\t},\n\t\t[]\n\t);\n\n\t/**\n\t * Обрабатывает печать внутри отдельного сегмента.\n\t */\n\tconst handleInput = useCallback(\n\t\t(index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (disabled) return;\n\n\t\t\tconst segment = segments[index];\n\t\t\tif (segment.kind !== \"editable\") return;\n\n\t\t\tconst rawValue = event.target.value.replace(/\\D/g, \"\");\n\t\t\tconst clampedValue = rawValue.slice(0, segment.length);\n\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\tupdatedValues.set(index, clampedValue);\n\t\t\tsetDirtyValues(updatedValues);\n\t\t\tonClearError?.();\n\n\t\t\tif (clampedValue.length === segment.length) {\n\t\t\t\tconst nextIndex = getNextEditable(index);\n\t\t\t\tif (nextIndex !== null) {\n\t\t\t\t\trequestAnimationFrame(() => focusSegment(nextIndex));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttryCommit(updatedValues);\n\t\t},\n\t\t[disabled, focusSegment, getNextEditable, onClearError, segmentValues, segments, tryCommit]\n\t);\n\n\t/**\n\t * Обрабатывает клавиатурную навигацию и шаговые изменения сегментов.\n\t */\n\tconst handleKeyDown = useCallback(\n\t\t(index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (disabled) return;\n\n\t\t\tconst segment = segments[index];\n\t\t\tif (segment.kind !== \"editable\") return;\n\n\t\t\tconst currentValue = segmentValues.get(index) ?? \"\";\n\t\t\tconst element = event.currentTarget;\n\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowRight\": {\n\t\t\t\t\tif (element.selectionStart === currentValue.length || currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst nextIndex = getNextEditable(index);\n\t\t\t\t\t\tif (nextIndex !== null) focusSegment(nextIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowLeft\": {\n\t\t\t\t\tif (element.selectionStart === 0 || currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst previousIndex = getPreviousEditable(index);\n\t\t\t\t\t\tif (previousIndex !== null) focusSegment(previousIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tlet numericValue = currentValue === \"\" ? segment.min : Number.parseInt(currentValue, 10) + 1;\n\t\t\t\t\tif (numericValue > segment.max) numericValue = segment.min;\n\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, padValue(String(numericValue), segment));\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\trequestAnimationFrame(() => element.select());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tlet numericValue = currentValue === \"\" ? segment.max : Number.parseInt(currentValue, 10) - 1;\n\t\t\t\t\tif (numericValue < segment.min) numericValue = segment.max;\n\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, padValue(String(numericValue), segment));\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\trequestAnimationFrame(() => element.select());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Backspace\": {\n\t\t\t\t\tif (currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst previousIndex = getPreviousEditable(index);\n\t\t\t\t\t\tif (previousIndex !== null) focusSegment(previousIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Delete\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, \"\");\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[disabled, focusSegment, getNextEditable, getPreviousEditable, padValue, segmentValues, segments, tryCommit]\n\t);\n\n\t/**\n\t * Выделяет содержимое сегмента при фокусе.\n\t */\n\tconst handleFocus = useCallback(\n\t\t() => (event: FocusEvent<HTMLInputElement>) => {\n\t\t\tevent.target.select();\n\t\t},\n\t\t[]\n\t);\n\n\t/**\n\t * Сбрасывает таймер blur, когда контейнер получает фокус.\n\t */\n\tconst handleContainerFocus = useCallback(() => {\n\t\tclearTimeout(blurTimeout.current);\n\t}, []);\n\n\t/**\n\t * На blur оставляет только committed-значение либо полностью пустое состояние.\n\t */\n\tconst handleContainerBlur = useCallback(() => {\n\t\tconst currentValues = new Map(segmentValues);\n\n\t\tblurTimeout.current = window.setTimeout(() => {\n\t\t\tif (areAllDateSegmentsEmpty(segments, currentValues)) {\n\t\t\t\tonChange(null);\n\t\t\t\tsetDirtyValues(currentValues);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextDate = indexedSegmentsToDate(segments, currentValues, {\n\t\t\t\tdefaultDate: mode === \"time\" ? (normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate()) : undefined\n\t\t\t});\n\t\t\tif (!nextDate || !isDateTimeWithinRange(nextDate, minDate, maxDate, mode)) {\n\t\t\t\tsetDirtyValues(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDirtyValues(currentValues);\n\t\t}, 0);\n\t}, [maxDate, minDate, mode, onChange, segmentValues, segments, value]);\n\n\t/**\n\t * Фокусирует первый пустой сегмент либо последний редактируемый.\n\t */\n\tconst focusFirstEmpty = useCallback(() => {\n\t\tconst firstEmpty = editableIndices.find((index) => !(segmentValues.get(index) ?? \"\"));\n\t\tconst targetIndex = firstEmpty ?? editableIndices[editableIndices.length - 1];\n\t\tif (targetIndex !== undefined) {\n\t\t\tfocusSegment(targetIndex);\n\t\t}\n\t}, [editableIndices, focusSegment, segmentValues]);\n\n\treturn {\n\t\tsegments,\n\t\tsegmentValues,\n\t\tregisterRef,\n\t\thandleInput,\n\t\thandleKeyDown,\n\t\thandleFocus,\n\t\thandleContainerFocus,\n\t\thandleContainerBlur,\n\t\tfocusFirstEmpty\n\t};\n}\n","@use \"@/styles/mixins\" as *;\n\n.segmentInput {\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\toutline: none;\n\tpadding: 0;\n\tmargin: 0;\n\tfont-family: var(--font-family-mono);\n\tcolor: inherit;\n\ttext-align: center;\n\tcaret-color: var(--content-0);\n\tfont-variant-numeric: tabular-nums;\n\n\t&::placeholder {\n\t\tcolor: var(--content-2);\n\t\t// font-size: var(--font-size-sm);\n\t}\n\n\t&::selection {\n\t\tbackground-color: var(--focus-ring);\n\t\tcolor: var(--surface-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.25;\n\t}\n}\n\n.separator {\n\tuser-select: none;\n\tcolor: var(--content-1);\n\tflex-shrink: 0;\n\n\t&[data-disabled] {\n\t\topacity: 0.25;\n\t}\n}\n\n.calendarButton {\n\t&:hover {\n\t\tcolor: var(--focus-ring);\n\t}\n}\n\n.popoverContent {\n\tdisplay: grid;\n\tgap: var(--space-md);\n}\n\n.bottom {\n\tgrid-template-columns: minmax(0, 1fr);\n}\n\n.right {\n\tgrid-template-columns: auto calc(9em + var(--width-add));\n\talign-items: stretch;\n}\n\n.calendarPane {\n\tmin-width: 0;\n}\n\n.timePanelPane {\n\tmin-width: 0;\n}\n\n.timeOnlyPopoverContent {\n\tmin-width: calc(9em + var(--width-add));\n}\n\n.timePanelPaneBottom {\n\tpadding-top: var(--space-md);\n\tborder-top: var(--border);\n}\n\n.timePanelPaneRight {\n\tpadding-left: var(--space-md);\n\tborder-left: var(--border);\n}\n",".timePanel {\n\theight: 100%;\n}\n\n.hint {\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--content-1);\n}\n\n.fields {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: var(--space-sm);\n\tmin-height: 10em;\n\theight: 100%;\n}\n\n.field {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tgap: var(--space-xs);\n\tmin-height: 0;\n}\n\n.label {\n\t// font-size: var(--font-size-sm);\n\tcolor: var(--content-1);\n}\n\n.wheel {\n\tmin-height: 10em;\n}\n","import { WheelPicker } from \"../../wheel-picker\";\nimport { buildTimePanelState } from \"../lib/timePanelState\";\n\nimport styles from \"./TimePanel.module.scss\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\n/**\n * Пропсы панели выбора времени.\n */\nexport interface TimePanelProps {\n\tvalue: Date;\n\tdisabled?: boolean;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tmode?: DateTimeInputMode;\n\tonChange: (hours: number, minutes: number) => void;\n}\n\n/**\n * Переиспользуемая панель выбора времени поверх internal wheel-picker.\n */\nexport function TimePanel({ value, disabled, minDate, maxDate, mode = \"date-time\", onChange }: TimePanelProps) {\n\tconst state = buildTimePanelState(value, minDate, maxDate, mode);\n\n\t/**\n\t * Форматирует двузначное значение времени.\n\t */\n\tconst formatValue = (timePart: number) => String(timePart).padStart(2, \"0\");\n\n\tif (state.disabled) {\n\t\treturn (\n\t\t\t<div className={styles.timePanel}>\n\t\t\t\t<p className={styles.hint}>Для выбранного дня нет доступного времени в заданном диапазоне.</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={styles.timePanel}>\n\t\t\t<div className={styles.fields}>\n\t\t\t\t<label className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Часы</span>\n\t\t\t\t\t<WheelPicker\n\t\t\t\t\t\tclassName={styles.wheel}\n\t\t\t\t\t\titems={state.hours}\n\t\t\t\t\t\tvalue={state.selectedHour}\n\t\t\t\t\t\tonChange={(hours) => onChange(hours, state.selectedMinute)}\n\t\t\t\t\t\tariaLabel=\"Выбор часов\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tformatItem={formatValue}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\n\t\t\t\t<label className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Минуты</span>\n\t\t\t\t\t<WheelPicker\n\t\t\t\t\t\tclassName={styles.wheel}\n\t\t\t\t\t\titems={state.minutes}\n\t\t\t\t\t\tvalue={state.selectedMinute}\n\t\t\t\t\t\tonChange={(minutes) => onChange(state.selectedHour, minutes)}\n\t\t\t\t\t\tariaLabel=\"Выбор минут\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tformatItem={formatValue}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { JSX, useEffect, useEffectEvent, useMemo, useState } from \"react\";\n\nimport { getStartOfDay, isDateRangeTuple, NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CalendarDaysIcon, Clock3Icon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { CalendarView } from \"../../date-input/ui\";\nimport { InputControl, InputUI, useInputFieldIds } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport {\n\tclampTimeForDay,\n\tisDateTimeWithinRange,\n\tmergeDateWithTime,\n\tmergeTimeIntoDate,\n\tnormalizeDateTimeValue,\n\tresolvePickerBaseDate\n} from \"../lib\";\nimport { useDateTimeSegments } from \"../model\";\n\nimport styles from \"./SingleDateTimeInput.module.scss\";\nimport { TimePanel } from \"./TimePanel\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\ninterface BaseSingleDateTimeInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\ttimePanelPlacement?: \"bottom\" | \"right\";\n\tmode?: DateTimeInputMode;\n}\n\nexport interface SingleDateTimeInputProps extends BaseSingleDateTimeInputProps, UiBaseProps<Date | null> {}\n\n/**\n * Поле выбора даты-времени со строгой сегментной маской и popover-пикером.\n */\nexport function SingleDateTimeInput({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tdisabled,\n\tsize,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\ttimePanelPlacement = \"right\",\n\tmode = \"date-time\"\n}: SingleDateTimeInputProps): JSX.Element {\n\tconst normalizedValue = normalizeDateTimeValue(value, mode);\n\tconst normalizedValueTime = normalizedValue?.getTime() ?? null;\n\n\tconst fallbackPickerDate = useMemo(() => getStartOfDay(new Date()), []);\n\n\tconst [open, setOpen] = useState(false);\n\tconst [draftValue, setDraftValue] = useState<Date | null>(normalizedValue ?? null);\n\tconst [calendarView, setCalendarView] = useState<\"day\" | \"month\" | \"year\">(\"day\");\n\tconst [pickerDate, setPickerDate] = useState<Date>(() => resolvePickerBaseDate(normalizedValue, fallbackPickerDate, mode));\n\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\tconst syncDraftDate = useEffectEvent((date: Date | null) => setDraftValue(date));\n\tconst syncPickerDate = useEffectEvent((date: Date) => setPickerDate(date));\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\tsyncDraftDate(normalizedValue ?? null);\n\t\t}\n\n\t\tif (normalizedValue) {\n\t\t\tsyncPickerDate(normalizedValue);\n\t\t}\n\t}, [normalizedValue, normalizedValueTime, open]);\n\n\tuseEffect(() => {\n\t\tif (!normalizedValue) return;\n\t\tsyncPickerDate(normalizedValue);\n\t}, [normalizedValue, normalizedValueTime]);\n\n\tconst {\n\t\tsegments,\n\t\tsegmentValues,\n\t\tregisterRef,\n\t\thandleInput,\n\t\thandleKeyDown,\n\t\thandleFocus,\n\t\thandleContainerFocus,\n\t\thandleContainerBlur,\n\t\tfocusFirstEmpty\n\t} = useDateTimeSegments({\n\t\tvalue: normalizedValue,\n\t\tonChange,\n\t\tonClearError,\n\t\tdisabled,\n\t\tminDate,\n\t\tmaxDate,\n\t\tmode\n\t});\n\n\t/**\n\t * Выбирает дату в календаре и сохраняет текущее время.\n\t */\n\tconst handleCalendarSelect = (nextDate: Date | NullableDateRange) => {\n\t\tif (mode === \"time\" || isDateRangeTuple(nextDate) || disabled) return;\n\n\t\tconst baseValue = draftValue ?? normalizedValue ?? pickerDate;\n\t\tconst mergedDate = mergeDateWithTime(nextDate, baseValue);\n\t\tconst { hours, minutes } = clampTimeForDay(nextDate, mergedDate.getHours(), mergedDate.getMinutes(), minDate, maxDate, mode);\n\t\tconst nextValue = mergeTimeIntoDate(nextDate, hours, minutes);\n\n\t\tif (!isDateTimeWithinRange(nextValue, minDate, maxDate, mode)) return;\n\n\t\tonClearError?.();\n\t\tsetDraftValue(nextValue);\n\t\tsetPickerDate(nextValue);\n\t};\n\n\t/**\n\t * Выбирает время для текущего рабочего дня picker-а.\n\t */\n\tconst handleTimeChange = (hours: number, minutes: number) => {\n\t\tif (disabled) return;\n\n\t\tconst baseDate = draftValue ?? normalizedValue ?? pickerDate;\n\t\tconst clampedTime = clampTimeForDay(baseDate, hours, minutes, minDate, maxDate, mode);\n\t\tconst nextValue = mergeTimeIntoDate(baseDate, clampedTime.hours, clampedTime.minutes, mode);\n\n\t\tif (!isDateTimeWithinRange(nextValue, minDate, maxDate, mode)) return;\n\n\t\tonClearError?.();\n\t\tsetDraftValue(nextValue);\n\t\tsetPickerDate(nextValue);\n\t};\n\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (nextOpen) {\n\t\t\tsetDraftValue(normalizedValue ?? null);\n\t\t\tsetPickerDate(resolvePickerBaseDate(normalizedValue, fallbackPickerDate, mode));\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\n\tconst handlePopoverClose = () => {\n\t\tconst prevTime = normalizedValue?.getTime() ?? null;\n\t\tconst draftTime = draftValue?.getTime() ?? null;\n\n\t\tif (prevTime !== draftTime) {\n\t\t\tonChange(draftValue);\n\t\t}\n\t};\n\n\tconst panelPlacementClass = timePanelPlacement === \"right\" ? styles.timePanelPaneRight : styles.timePanelPaneBottom;\n\tconst buttonAriaLabel = mode === \"time\" ? \"Открыть выбор времени\" : \"Открыть календарь даты и времени\";\n\tconst inputPlaceholder = placeholder ?? (mode === \"time\" ? \"чч:мм\" : \"дд.мм.гггг чч:мм\");\n\tconst pickerValue = draftValue ?? normalizedValue ?? pickerDate;\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<InputUI\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tsize={size}\n\t\t\t\terror={error}\n\t\t\t\tcontrolId={controlId}\n\t\t\t\tlabelId={labelId}\n\t\t\t\tdescriptionId={descriptionId}\n\t\t\t\terrorId={errorId}>\n\t\t\t\t<InputControl\n\t\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={styles.calendarButton}\n\t\t\t\t\t\t\t\ticon={mode === \"time\" ? <Clock3Icon /> : <CalendarDaysIcon />}\n\t\t\t\t\t\t\t\taria-label={buttonAriaLabel}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiInputControlFake, controlClassName)}\n\t\t\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\t\t\t\trole=\"group\"\n\t\t\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\t\t\taria-placeholder={inputPlaceholder}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\tonFocus={handleContainerFocus}\n\t\t\t\t\t\t\tonBlur={handleContainerBlur}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tif (event.target === event.currentTarget) {\n\t\t\t\t\t\t\t\t\tfocusFirstEmpty();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t{segments.map((segment, index) => {\n\t\t\t\t\t\t\t\tif (segment.kind === \"literal\") {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<span key={index} className={styles.separator} data-disabled={disabled || undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\t\tref={registerRef(index)}\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.segmentInput}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${segment.length + 0.5}ch` }}\n\t\t\t\t\t\t\t\t\t\tvalue={segmentValues.get(index) ?? \"\"}\n\t\t\t\t\t\t\t\t\t\tplaceholder={segment.placeholder}\n\t\t\t\t\t\t\t\t\t\tmaxLength={segment.length}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\taria-label={segment.ariaLabel}\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\t\t\tonChange={handleInput(index)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown(index)}\n\t\t\t\t\t\t\t\t\t\tonFocus={handleFocus()}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t</InputUI>\n\n\t\t\t<Popover.Content background=\"primary\" onClose={handlePopoverClose}>\n\t\t\t\t{mode === \"time\" ? (\n\t\t\t\t\t<div className={styles.timeOnlyPopoverContent}>\n\t\t\t\t\t\t<TimePanel\n\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\tonChange={handleTimeChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className={cn(styles.popoverContent, styles[timePanelPlacement])}>\n\t\t\t\t\t\t<div className={styles.calendarPane}>\n\t\t\t\t\t\t\t<CalendarView\n\t\t\t\t\t\t\t\tview={calendarView}\n\t\t\t\t\t\t\t\tdatePickerLevel=\"day\"\n\t\t\t\t\t\t\t\tselectionMode=\"day\"\n\t\t\t\t\t\t\t\tonViewChange={setCalendarView}\n\t\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\t\tonChange={handleCalendarSelect}\n\t\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\t\tcurrentDate={pickerDate}\n\t\t\t\t\t\t\t\tonCurrentDateChange={setPickerDate}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className={cn(styles.timePanelPane, panelPlacementClass)}>\n\t\t\t\t\t\t\t<TimePanel\n\t\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\t\tonChange={handleTimeChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,IAAyB,oBACzB,IAAoB,SAI3B,IAAsB,MACtB,IAAuB,GACvB,IAAqB;AACL,EAAqB,CAAiB;AAK5D,SAAgB,EAAuB,IAAQ,GAAG,IAAU,GAAS;CACpE,OAAO,EAAmB,GAAqB,GAAsB,GAAoB,GAAO,GAAS,GAAG,CAAC;AAC9G;AAKA,SAAgB,EAAuB,IAA0B,aAAqB;CACrF,OAAO,MAAS,SAAS,IAAoB;AAC9C;AAiBA,SAAgB,EAAuB,GAAgC,IAA0B,aAA0B;CAC1H,IAAI,KAAS,MAAM,OAAO;CAE1B,IAAM,IAAc,EAAU,CAAK;CAOnC,OANK,IAED,MAAS,SACL,EAAuB,EAAY,SAAS,GAAG,EAAY,WAAW,CAAC,IAGxE,IANkB;AAO1B;AAoCA,SAAgB,EAAsB,GAAa,GAAgB,GAAgB,IAA0B,aAAsB;CAClI,IAAM,IAAkB,EAAuB,GAAO,CAAI;CAC1D,IAAI,CAAC,GAAiB,OAAO;CAE7B,IAAI,MAAS,QAAQ;EACpB,IAAM,IAAe,EAAgB,SAAS,IAAI,KAAK,EAAgB,WAAW,GAC5E,IAAoB,IAAU,EAAuB,GAAS,MAAM,IAAI,MACxE,IAAoB,IAAU,EAAuB,GAAS,MAAM,IAAI;EAY9E,OALA,EALI,KAEC,IADe,EAAkB,SAAS,IAAI,KAAK,EAAkB,WAAW,KAIjF,KAEC,IADe,EAAkB,SAAS,IAAI,KAAK,EAAkB,WAAW;CAKtF;CAKA,OAFA,EADI,KAAW,IAAkB,KAC7B,KAAW,IAAkB;AAGlC;AAKA,SAAgB,EAAkB,GAAgB,GAAgC;CACjF,IAAM,IAAS,EAAuB,CAAU,GAC1C,IAAQ,GAAQ,SAAS,KAAK,GAC9B,IAAU,GAAQ,WAAW,KAAK;CAExC,OAAO,EAAmB,EAAS,YAAY,GAAG,EAAS,SAAS,GAAG,EAAS,QAAQ,GAAG,GAAO,GAAS,GAAG,CAAC;AAChH;AAKA,SAAgB,EAAkB,GAAgB,GAAe,GAAiB,IAA0B,aAAmB;CAK9H,OAJI,MAAS,SACL,EAAuB,GAAO,CAAO,IAGtC,EAAmB,EAAS,YAAY,GAAG,EAAS,SAAS,GAAG,EAAS,QAAQ,GAAG,GAAO,GAAS,GAAG,CAAC;AAChH;AAKA,SAAgB,EAAsB,GAAgC,GAAoB,IAA0B,aAAmB;CAKtI,OAJI,MAAS,SACL,EAAuB,GAAO,MAAM,KAAK,EAAuB,IAGjE,EAAuB,GAAO,CAAI,KAAK;AAC/C;AAKA,SAAgB,EACf,GACA,GACA,GACA,IAA0B,aAOzB;CACD,IAAM,IAAgB,EAAuB,GAAK,CAAI,KAAK,GACrD,IAAoB,IAAU,EAAuB,GAAS,CAAI,IAAI,MACtE,IAAoB,IAAU,EAAuB,GAAS,CAAI,IAAI,MACtE,IACL,CAAC,CAAC,KACF,EAAc,YAAY,MAAM,EAAkB,YAAY,KAC9D,EAAc,SAAS,MAAM,EAAkB,SAAS,KACxD,EAAc,QAAQ,MAAM,EAAkB,QAAQ,GACjD,IACL,CAAC,CAAC,KACF,EAAc,YAAY,MAAM,EAAkB,YAAY,KAC9D,EAAc,SAAS,MAAM,EAAkB,SAAS,KACxD,EAAc,QAAQ,MAAM,EAAkB,QAAQ,GAEjD,IAAU,IAAe,EAAmB,SAAS,IAAI,GACzD,IAAU,IAAe,EAAmB,SAAS,IAAI,IACzD,IAAsB,KAAgB,MAAY,IAAU,EAAmB,WAAW,IAAI,GAC9F,IAAsB,KAAgB,MAAY,IAAU,EAAmB,WAAW,IAAI,IAC9F,IAAW,IAAU,KAAY,MAAY,KAAW,IAAsB;CAEpF,OAAO;EACN;EACA;EACA;EACA,kBAAkB,MACb,IAAiB,IACd,KAAgB,MAAS,IAAU,EAAmB,WAAW,IAAI;EAE7E,kBAAkB,MACb,IAAiB,KACd,KAAgB,MAAS,IAAU,EAAmB,WAAW,IAAI;CAE9E;AACD;AAKA,SAAgB,EACf,GACA,GACA,GACA,GACA,GACA,IAA0B,aACW;CACrC,IAAM,IAAQ,EAAmB,GAAK,GAAS,GAAS,CAAI;CAC5D,IAAI,EAAM,UACT,OAAO;EAAE,OAAO;EAAG,SAAS;CAAE;CAG/B,IAAM,IAAc,KAAK,IAAI,KAAK,IAAI,GAAO,EAAM,OAAO,GAAG,EAAM,OAAO,GACpE,IAAY,EAAM,gBAAgB,CAAW,GAC7C,IAAY,EAAM,gBAAgB,CAAW;CAGnD,OAAO;EACN,OAAO;EACP,SAJqB,KAAK,IAAI,KAAK,IAAI,GAAS,CAAS,GAAG,CAInD;CACV;AACD;;;AC1NA,SAAgB,EAAoB,GAAa,GAAgB,GAAgB,IAA0B,aAA6B;CACvI,IAAM,IAAY,EAAmB,GAAO,GAAS,GAAS,CAAI,GAC5D,IAAe,EAAM,SAAS,GAC9B,IAAiB,EAAM,WAAW,GAClC,IAAY,EAAU,gBAAgB,CAAY,GAClD,IAAY,EAAU,gBAAgB,CAAY;CAYxD,OAVI,EAAU,WACN;EACN,UAAU;EACV;EACA;EACA,OAAO,CAAC;EACR,SAAS,CAAC;CACX,IAGM;EACN,UAAU;EACV;EACA;EACA,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAU,UAAU,EAAU,UAAU,EAAE,IAAI,GAAG,MAAU,EAAU,UAAU,CAAK;EAChH,SAAS,MAAM,KAAK,EAAE,QAAQ,IAAY,IAAY,EAAE,IAAI,GAAG,MAAU,IAAY,CAAK;CAC3F;AACD;;;ACjBA,SAAS,EAAuB,GAAiD;CAChF,IAAM,IAAoB,CAAC;CAQ3B,OANA,EAAS,SAAS,GAAS,MAAU;EACpC,AAAI,EAAQ,SAAS,cACpB,EAAQ,KAAK,CAAK;CAEpB,CAAC,GAEM;AACR;AAKA,SAAgB,GAAoB,EACnC,UACA,aACA,iBACA,aACA,YACA,YACA,UAAO,eACuB;CAC9B,IAAM,IAAc,QAAc,EAAuB,CAAI,GAAG,CAAC,CAAI,CAAC,GAChE,IAAW,QAAc,EAAqB,CAAW,GAAG,CAAC,CAAW,CAAC,GACzE,IAAkB,QAAc,EAAuB,CAAQ,GAAG,CAAC,CAAQ,CAAC,GAC5E,IAAkB,QAAc,EAA2B,KAAS,MAAM,CAAQ,GAAG,CAAC,GAAU,CAAK,CAAC,GACtG,CAAC,GAAa,KAAkB,EAAqC,IAAI,GACzE,IAAmB,GAAO,QAAQ,KAAK,MAEvC,IAAkB,GAAgB,MAAuC,EAAe,CAAM,CAAC;CAErG,QAAgB;EACf,EAAgB,IAAI;CACrB,GAAG,CAAC,GAAkB,CAAI,CAAC;CAE3B,IAAM,IAAgB,KAAe,GAC/B,IAAU,kBAAsC,IAAI,IAAI,CAAC,GACzD,IAAc,EAAe,CAAC,GAK9B,IAAY,GAChB,MAAuC;EACvC,IAAI,EAAwB,GAAU,CAAa,GAElD,OADA,EAAS,IAAI,GACN;EAGR,IAAM,IAAW,EAAsB,GAAU,GAAe,EAC/D,aAAa,MAAS,SAAU,EAAuB,GAAO,MAAM,KAAK,EAAuB,IAAK,KAAA,EACtG,CAAC;EAKD,OAJI,CAAC,KACD,CAAC,EAAsB,GAAU,GAAS,GAAS,CAAI,IAAU,QAErE,EAAS,CAAQ,GACV;CACR,GACA;EAAC;EAAS;EAAS;EAAM;EAAU;EAAU;CAAK,CACnD,GAKM,IAAe,GAAa,GAAe,IAAY,OAAS;EACrE,IAAM,IAAU,EAAQ,QAAQ,IAAI,CAAK;EACpC,MAEL,EAAQ,MAAM,GACV,KACH,4BAA4B,EAAQ,OAAO,CAAC;CAE9C,GAAG,CAAC,CAAC,GAKC,IAAkB,GACtB,MAAwC;EACxC,IAAM,IAAW,EAAgB,QAAQ,CAAY;EACrD,OAAO,IAAW,EAAgB,SAAS,IAAI,EAAgB,IAAW,KAAK;CAChF,GACA,CAAC,CAAe,CACjB,GAKM,IAAsB,GAC1B,MAAwC;EACxC,IAAM,IAAW,EAAgB,QAAQ,CAAY;EACrD,OAAO,IAAW,IAAI,EAAgB,IAAW,KAAK;CACvD,GACA,CAAC,CAAe,CACjB,GAKM,IAAW,GAAa,GAAoB,MAAiC,EAAW,SAAS,EAAQ,QAAQ,GAAG,GAAG,CAAC,CAAC;CA8K/H,OAAO;EACN;EACA;EACA,aA5KmB,GAClB,OAAmB,MAAqC;GACxD,IAAI,GAAS;IACZ,EAAQ,QAAQ,IAAI,GAAO,CAAO;IAClC;GACD;GAEA,EAAQ,QAAQ,OAAO,CAAK;EAC7B,GACA,CAAC,CAmKD;EACA,aA9JmB,GAClB,OAAmB,MAAyC;GAC5D,IAAI,GAAU;GAEd,IAAM,IAAU,EAAS;GACzB,IAAI,EAAQ,SAAS,YAAY;GAGjC,IAAM,IADW,EAAM,OAAO,MAAM,QAAQ,OAAO,EAC9B,CAAA,CAAS,MAAM,GAAG,EAAQ,MAAM,GAC/C,IAAgB,IAAI,IAAI,CAAa;GAK3C,IAJA,EAAc,IAAI,GAAO,CAAY,GACrC,EAAe,CAAa,GAC5B,IAAe,GAEX,EAAa,WAAW,EAAQ,QAAQ;IAC3C,IAAM,IAAY,EAAgB,CAAK;IACvC,AAAI,MAAc,QACjB,4BAA4B,EAAa,CAAS,CAAC;GAErD;GAEA,EAAU,CAAa;EACxB,GACA;GAAC;GAAU;GAAc;GAAiB;GAAc;GAAe;GAAU;EAAS,CAuI1F;EACA,eAlIqB,GACpB,OAAmB,MAA2C;GAC9D,IAAI,GAAU;GAEd,IAAM,IAAU,EAAS;GACzB,IAAI,EAAQ,SAAS,YAAY;GAEjC,IAAM,IAAe,EAAc,IAAI,CAAK,KAAK,IAC3C,IAAU,EAAM;GAEtB,QAAQ,EAAM,KAAd;IACC,KAAK;KACJ,IAAI,EAAQ,mBAAmB,EAAa,UAAU,MAAiB,IAAI;MAC1E,EAAM,eAAe;MACrB,IAAM,IAAY,EAAgB,CAAK;MACvC,AAAI,MAAc,QAAM,EAAa,CAAS;KAC/C;KACA;IAED,KAAK;KACJ,IAAI,EAAQ,mBAAmB,KAAK,MAAiB,IAAI;MACxD,EAAM,eAAe;MACrB,IAAM,IAAgB,EAAoB,CAAK;MAC/C,AAAI,MAAkB,QAAM,EAAa,CAAa;KACvD;KACA;IAED,KAAK,WAAW;KACf,EAAM,eAAe;KACrB,IAAI,IAAe,MAAiB,KAAK,EAAQ,MAAM,OAAO,SAAS,GAAc,EAAE,IAAI;KAC3F,AAAI,IAAe,EAAQ,QAAK,IAAe,EAAQ;KAEvD,IAAM,IAAgB,IAAI,IAAI,CAAa;KAI3C,AAHA,EAAc,IAAI,GAAO,EAAS,OAAO,CAAY,GAAG,CAAO,CAAC,GAChE,EAAe,CAAa,GAC5B,EAAU,CAAa,GACvB,4BAA4B,EAAQ,OAAO,CAAC;KAC5C;IACD;IACA,KAAK,aAAa;KACjB,EAAM,eAAe;KACrB,IAAI,IAAe,MAAiB,KAAK,EAAQ,MAAM,OAAO,SAAS,GAAc,EAAE,IAAI;KAC3F,AAAI,IAAe,EAAQ,QAAK,IAAe,EAAQ;KAEvD,IAAM,IAAgB,IAAI,IAAI,CAAa;KAI3C,AAHA,EAAc,IAAI,GAAO,EAAS,OAAO,CAAY,GAAG,CAAO,CAAC,GAChE,EAAe,CAAa,GAC5B,EAAU,CAAa,GACvB,4BAA4B,EAAQ,OAAO,CAAC;KAC5C;IACD;IACA,KAAK;KACJ,IAAI,MAAiB,IAAI;MACxB,EAAM,eAAe;MACrB,IAAM,IAAgB,EAAoB,CAAK;MAC/C,AAAI,MAAkB,QAAM,EAAa,CAAa;KACvD;KACA;IAED,KAAK,UAAU;KACd,EAAM,eAAe;KACrB,IAAM,IAAgB,IAAI,IAAI,CAAa;KAG3C,AAFA,EAAc,IAAI,GAAO,EAAE,GAC3B,EAAe,CAAa,GAC5B,EAAU,CAAa;KACvB;IACD;GACD;EACD,GACA;GAAC;GAAU;GAAc;GAAiB;GAAqB;GAAU;GAAe;GAAU;EAAS,CA6D3G;EACA,aAxDmB,SACZ,MAAwC;GAC9C,EAAM,OAAO,OAAO;EACrB,GACA,CAAC,CAoDD;EACA,sBA/C4B,QAAkB;GAC9C,aAAa,EAAY,OAAO;EACjC,GAAG,CAAC,CA6CH;EACA,qBAzC2B,QAAkB;GAC7C,IAAM,IAAgB,IAAI,IAAI,CAAa;GAE3C,EAAY,UAAU,OAAO,iBAAiB;IAC7C,IAAI,EAAwB,GAAU,CAAa,GAAG;KAErD,AADA,EAAS,IAAI,GACb,EAAe,CAAa;KAC5B;IACD;IAEA,IAAM,IAAW,EAAsB,GAAU,GAAe,EAC/D,aAAa,MAAS,SAAU,EAAuB,GAAO,MAAM,KAAK,EAAuB,IAAK,KAAA,EACtG,CAAC;IACD,IAAI,CAAC,KAAY,CAAC,EAAsB,GAAU,GAAS,GAAS,CAAI,GAAG;KAC1E,EAAe,IAAI;KACnB;IACD;IAEA,EAAe,CAAa;GAC7B,GAAG,CAAC;EACL,GAAG;GAAC;GAAS;GAAS;GAAM;GAAU;GAAe;GAAU;EAAK,CAqBnE;EACA,iBAjBuB,QAAkB;GAEzC,IAAM,IADa,EAAgB,MAAM,MAAU,EAAE,EAAc,IAAI,CAAK,KAAK,GAC7D,KAAc,EAAgB,EAAgB,SAAS;GAC3E,AAAI,MAAgB,KAAA,KACnB,EAAa,CAAW;EAE1B,GAAG;GAAC;GAAiB;GAAc;EAAa,CAW/C;CACD;AACD;;;;;;;;;;;;;;;;;;;;;;;AGjSA,SAAgB,EAAU,EAAE,UAAO,aAAU,YAAS,YAAS,UAAO,aAAa,eAA4B;CAC9G,IAAM,IAAQ,EAAoB,GAAO,GAAS,GAAS,CAAI,GAKzD,KAAe,MAAqB,OAAO,CAAQ,CAAC,CAAC,SAAS,GAAG,GAAG;CAU1E,OARI,EAAM,WAER,kBAAC,OAAD;EAAK,WAAW,EAAO;YACtB,kBAAC,KAAD;GAAG,WAAW,EAAO;aAAM;EAAkE,CAAA;CACzF,CAAA,IAKN,kBAAC,OAAD;EAAK,WAAW,EAAO;YACtB,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB,CACC,kBAAC,SAAD;IAAO,WAAW,EAAO;cAAzB,CACC,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAO;IAAU,CAAA,GACzC,kBAAC,GAAD;KACC,WAAW,EAAO;KAClB,OAAO,EAAM;KACb,OAAO,EAAM;KACb,WAAW,MAAU,EAAS,GAAO,EAAM,cAAc;KACzD,WAAU;KACA;KACV,YAAY;IACZ,CAAA,CACK;OAEP,kBAAC,SAAD;IAAO,WAAW,EAAO;cAAzB,CACC,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAO;IAAY,CAAA,GAC3C,kBAAC,GAAD;KACC,WAAW,EAAO;KAClB,OAAO,EAAM;KACb,OAAO,EAAM;KACb,WAAW,MAAY,EAAS,EAAM,cAAc,CAAO;KAC3D,WAAU;KACA;KACV,YAAY;IACZ,CAAA,CACK;KACH;;CACD,CAAA;AAEP;;;AC5BA,SAAgB,EAAoB,EACnC,UACA,aACA,UACA,gBACA,gBACA,aACA,SACA,UACA,iBACA,YACA,YACA,wBAAqB,SACrB,UAAO,eACkC;CACzC,IAAM,IAAkB,EAAuB,GAAO,CAAI,GACpD,IAAsB,GAAiB,QAAQ,KAAK,MAEpD,IAAqB,QAAc,kBAAc,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,GAEhE,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,CAAC,GAAY,KAAiB,EAAsB,KAAmB,IAAI,GAC3E,CAAC,GAAc,MAAmB,EAAmC,KAAK,GAC1E,CAAC,GAAY,KAAiB,QAAqB,EAAsB,GAAiB,GAAoB,CAAI,CAAC,GAEnH,EAAE,cAAW,YAAS,mBAAe,aAAS,oBAAgB,EAAiB;EACpF,UAAU,KAAiC;EAC3C,gBAAgB,CAAC,CAAC;EAClB,UAAU,CAAC,CAAC;CACb,CAAC,GAEK,KAAgB,GAAgB,MAAsB,EAAc,CAAI,CAAC,GACzE,IAAiB,GAAgB,MAAe,EAAc,CAAI,CAAC;CAYzE,AAVA,QAAgB;EAKf,AAJK,KACJ,GAAc,KAAmB,IAAI,GAGlC,KACH,EAAe,CAAe;CAEhC,GAAG;EAAC;EAAiB;EAAqB;CAAI,CAAC,GAE/C,QAAgB;EACV,KACL,EAAe,CAAe;CAC/B,GAAG,CAAC,GAAiB,CAAmB,CAAC;CAEzC,IAAM,EACL,cACA,mBACA,iBACA,iBACA,mBACA,iBACA,0BACA,yBACA,wBACG,GAAoB;EACvB,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;CACD,CAAC,GAKK,MAAwB,MAAuC;EACpE,IAAI,MAAS,UAAU,EAAiB,CAAQ,KAAK,GAAU;EAG/D,IAAM,IAAa,EAAkB,GADnB,KAAc,KAAmB,CACK,GAClD,EAAE,UAAO,eAAY,EAAgB,GAAU,EAAW,SAAS,GAAG,EAAW,WAAW,GAAG,GAAS,GAAS,CAAI,GACrH,IAAY,EAAkB,GAAU,GAAO,CAAO;EAEvD,EAAsB,GAAW,GAAS,GAAS,CAAI,MAE5D,IAAe,GACf,EAAc,CAAS,GACvB,EAAc,CAAS;CACxB,GAKM,KAAoB,GAAe,MAAoB;EAC5D,IAAI,GAAU;EAEd,IAAM,IAAW,KAAc,KAAmB,GAC5C,IAAc,EAAgB,GAAU,GAAO,GAAS,GAAS,GAAS,CAAI,GAC9E,IAAY,EAAkB,GAAU,EAAY,OAAO,EAAY,SAAS,CAAI;EAErF,EAAsB,GAAW,GAAS,GAAS,CAAI,MAE5D,IAAe,GACf,EAAc,CAAS,GACvB,EAAc,CAAS;CACxB,GAEM,MAAoB,MAAsB;EAM/C,AALI,MACH,EAAc,KAAmB,IAAI,GACrC,EAAc,EAAsB,GAAiB,GAAoB,CAAI,CAAC,IAG/E,EAAQ,CAAQ;CACjB,GAEM,WAA2B;EAIhC,CAHiB,GAAiB,QAAQ,KAAK,WAC7B,GAAY,QAAQ,KAAK,SAG1C,EAAS,CAAU;CAErB,GAEM,KAAsB,MAAuB,UAAU,EAAO,qBAAqB,EAAO,qBAC1F,KAAkB,MAAS,SAAS,0BAA0B,oCAC9D,KAAmB,MAAgB,MAAS,SAAS,UAAU,qBAC/D,IAAc,KAAc,KAAmB;CAErD,OACC,kBAAC,GAAD;EAAe;EAAM,cAAc;YAAnC,CACC,kBAAC,GAAD;GACQ;GACM;GACH;GACJ;GACC;GACI;GACF;GACM;GACN;aACT,kBAAC,GAAD;IACC,mBAAkB;IAClB,cACC,kBAAC,EAAQ,SAAT,EAAA,UACC,kBAAC,GAAD;KACC,SAAQ;KACE;KACV,WAAW,EAAO;KAClB,MAAwB,EAAlB,MAAS,SAAU,IAAiB,GAAlB,CAAa,CAAuB;KAC5D,cAAY;IACZ,CAAA,EACe,CAAA;eAEhB,EAAE,0BACH,kBAAC,OAAD;KACC,IAAI;KACJ,WAAW,EAAG,EAAS,oBAAoB,CAAgB;KAC3D,iBAAe,KAAY,KAAA;KAC3B,gBAAc,IAAQ,KAAK,KAAA;KAC3B,MAAK;KACL,gBAAc,CAAC,CAAC,KAAS,KAAA;KACzB,oBAAkB;KAClB,mBAAiB;KACjB,oBAAkB;KAClB,SAAS;KACT,QAAQ;KACR,UAAU,MAAU;MACnB,AAAI,EAAM,WAAW,EAAM,iBAC1B,GAAgB;KAElB;eACC,GAAS,KAAK,GAAS,MACnB,EAAQ,SAAS,YAEnB,kBAAC,QAAD;MAAkB,WAAW,EAAO;MAAW,iBAAe,KAAY,KAAA;gBACxE,EAAQ;KACJ,GAFK,CAEL,IAKP,kBAAC,SAAD;MAEC,KAAK,GAAY,CAAK;MACtB,MAAK;MACL,WAAU;MACV,WAAW,EAAO;MAClB,OAAO,EAAE,OAAO,GAAG,EAAQ,SAAS,GAAI,IAAI;MAC5C,OAAO,GAAc,IAAI,CAAK,KAAK;MACnC,aAAa,EAAQ;MACrB,WAAW,EAAQ;MACT;MACV,cAAY,EAAQ;MACpB,cAAa;MACb,UAAU,GAAY,CAAK;MAC3B,WAAW,GAAc,CAAK;MAC9B,SAAS,GAAY;KACrB,GAfK,CAeL,CAEF;IACG,CAAA;GAEO,CAAA;EACN,CAAA,GAET,kBAAC,EAAQ,SAAT;GAAiB,YAAW;GAAU,SAAS;aAC7C,MAAS,SACT,kBAAC,OAAD;IAAK,WAAW,EAAO;cACtB,kBAAC,GAAD;KACC,OAAO;KACG;KACD;KACA;KACH;KACN,UAAU;IACV,CAAA;GACG,CAAA,IAEL,kBAAC,OAAD;IAAK,WAAW,EAAG,EAAO,gBAAgB,EAAO,EAAmB;cAApE,CACC,kBAAC,OAAD;KAAK,WAAW,EAAO;eACtB,kBAAC,GAAD;MACC,MAAM;MACN,iBAAgB;MAChB,eAAc;MACd,cAAc;MACd,OAAO;MACP,UAAU;MACD;MACA;MACT,aAAa;MACb,qBAAqB;KACrB,CAAA;IACG,CAAA,GAEL,kBAAC,OAAD;KAAK,WAAW,EAAG,EAAO,eAAe,EAAmB;eAC3D,kBAAC,GAAD;MACC,OAAO;MACG;MACD;MACA;MACH;MACN,UAAU;KACV,CAAA;IACG,CAAA,CACD;;EAEU,CAAA,CACT;;AAEX"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/date-time-input/lib/dateTimeValue.ts","../../src/date-time-input/lib/timePanelState.ts","../../src/date-time-input/model/useDateTimeSegments.ts","../../src/date-time-input/ui/SingleDateTimeInput.module.scss","../../src/date-time-input/ui/TimePanel.module.scss","../../src/date-time-input/ui/TimePanel.tsx","../../src/date-time-input/ui/SingleDateTimeInput.tsx"],"sourcesContent":["import { dateToIndexedSegmentValues, indexedSegmentsToDate, parseDateSegmentMask } from \"@ryuzaki13/react-foundation-lib/date-segments\";\nimport {\n\tcreateCalendarDate,\n\ttype DateFormatPreset,\n\tformatDate,\n\tparseDate,\n\tparseDateByPattern\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport type DateTimeInputMode = \"date-time\" | \"time\";\n\n/**\n * Фиксированный формат нового поля даты-времени.\n */\nexport const DATE_TIME_INPUT_FORMAT = \"dd.MM.yyyy HH:mm\";\nexport const TIME_INPUT_FORMAT = \"HH:mm\";\n\nconst DATE_TIME_INPUT_PRESET_NAME = \"__date_time_input__\";\nconst TIME_INPUT_PRESET_NAME = \"__time_input__\";\nconst TIME_ONLY_BASE_YEAR = 1970;\nconst TIME_ONLY_BASE_MONTH = 0;\nconst TIME_ONLY_BASE_DAY = 1;\nconst TIME_SEGMENTS = parseDateSegmentMask(TIME_INPUT_FORMAT);\n\n/**\n * Создаёт техническую базовую дату для режима выбора только времени.\n */\nexport function createTimeOnlyBaseDate(hours = 0, minutes = 0): Date {\n\treturn createCalendarDate(TIME_ONLY_BASE_YEAR, TIME_ONLY_BASE_MONTH, TIME_ONLY_BASE_DAY, hours, minutes, 0, 0);\n}\n\n/**\n * Возвращает формат пользовательского ввода для выбранного режима.\n */\nexport function getDateTimeInputFormat(mode: DateTimeInputMode = \"date-time\"): string {\n\treturn mode === \"time\" ? TIME_INPUT_FORMAT : DATE_TIME_INPUT_FORMAT;\n}\n\n/**\n * Создаёт временную предустановку форматирования для нового поля даты-времени.\n */\nexport function createDateTimeInputPreset(mode: DateTimeInputMode = \"date-time\"): DateFormatPreset {\n\treturn {\n\t\tname: mode === \"time\" ? TIME_INPUT_PRESET_NAME : DATE_TIME_INPUT_PRESET_NAME,\n\t\tpattern: getDateTimeInputFormat(mode),\n\t\tlocale: \"ru-RU\",\n\t\tinvalidFallback: \"\"\n\t};\n}\n\n/**\n * Нормализует внешнее значение к валидному Date без timezone-сдвига.\n */\nexport function normalizeDateTimeValue(value: Date | null | undefined, mode: DateTimeInputMode = \"date-time\"): Date | null {\n\tif (value == null) return null;\n\n\tconst parsedValue = parseDate(value);\n\tif (!parsedValue) return null;\n\n\tif (mode === \"time\") {\n\t\treturn createTimeOnlyBaseDate(parsedValue.getHours(), parsedValue.getMinutes());\n\t}\n\n\treturn parsedValue;\n}\n\n/**\n * Форматирует значение поля даты-времени в фиксированный пользовательский формат.\n */\nexport function formatDateTimeInputValue(value: Date | null | undefined, mode: DateTimeInputMode = \"date-time\"): string {\n\tif (!value) return \"\";\n\treturn formatDate(normalizeDateTimeValue(value, mode), createDateTimeInputPreset(mode));\n}\n\n/**\n * Строго парсит строку пользовательского ввода в Date.\n */\nexport function parseDateTimeInputValue(value: string, mode: DateTimeInputMode = \"date-time\"): Date | null {\n\tif (mode === \"time\") {\n\t\tconst match = /^\\d{2}:\\d{2}$/.exec(value.trim());\n\t\tif (!match) return null;\n\n\t\tconst values = dateToIndexedSegmentValues(createTimeOnlyBaseDate(), TIME_SEGMENTS);\n\t\tvalues.set(0, value.slice(0, 2));\n\t\tvalues.set(2, value.slice(3, 5));\n\n\t\treturn indexedSegmentsToDate(TIME_SEGMENTS, values, {\n\t\t\tdefaultDate: createTimeOnlyBaseDate()\n\t\t});\n\t}\n\n\tconst parsed = parseDateByPattern(value, DATE_TIME_INPUT_FORMAT);\n\tif (!parsed || parsed.kind !== \"date-time\") return null;\n\n\treturn parsed.date;\n}\n\n/**\n * Проверяет, попадает ли дата-время в допустимый диапазон.\n */\nexport function isDateTimeWithinRange(value: Date, minDate?: Date, maxDate?: Date, mode: DateTimeInputMode = \"date-time\"): boolean {\n\tconst normalizedValue = normalizeDateTimeValue(value, mode);\n\tif (!normalizedValue) return false;\n\n\tif (mode === \"time\") {\n\t\tconst valueMinutes = normalizedValue.getHours() * 60 + normalizedValue.getMinutes();\n\t\tconst normalizedMinDate = minDate ? normalizeDateTimeValue(minDate, \"time\") : null;\n\t\tconst normalizedMaxDate = maxDate ? normalizeDateTimeValue(maxDate, \"time\") : null;\n\n\t\tif (normalizedMinDate) {\n\t\t\tconst minMinutes = normalizedMinDate.getHours() * 60 + normalizedMinDate.getMinutes();\n\t\t\tif (valueMinutes < minMinutes) return false;\n\t\t}\n\n\t\tif (normalizedMaxDate) {\n\t\t\tconst maxMinutes = normalizedMaxDate.getHours() * 60 + normalizedMaxDate.getMinutes();\n\t\t\tif (valueMinutes > maxMinutes) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif (minDate && normalizedValue < minDate) return false;\n\tif (maxDate && normalizedValue > maxDate) return false;\n\n\treturn true;\n}\n\n/**\n * Переносит дату выбранного дня, сохраняя часы и минуты базового значения.\n */\nexport function mergeDateWithTime(datePart: Date, timeSource?: Date | null): Date {\n\tconst source = normalizeDateTimeValue(timeSource);\n\tconst hours = source?.getHours() ?? 0;\n\tconst minutes = source?.getMinutes() ?? 0;\n\n\treturn createCalendarDate(datePart.getFullYear(), datePart.getMonth(), datePart.getDate(), hours, minutes, 0, 0);\n}\n\n/**\n * Переносит часы и минуты в базовую календарную дату.\n */\nexport function mergeTimeIntoDate(baseDate: Date, hours: number, minutes: number, mode: DateTimeInputMode = \"date-time\"): Date {\n\tif (mode === \"time\") {\n\t\treturn createTimeOnlyBaseDate(hours, minutes);\n\t}\n\n\treturn createCalendarDate(baseDate.getFullYear(), baseDate.getMonth(), baseDate.getDate(), hours, minutes, 0, 0);\n}\n\n/**\n * Создаёт рабочую дату для picker-сценариев без выбранного значения.\n */\nexport function resolvePickerBaseDate(value: Date | null | undefined, fallbackDate: Date, mode: DateTimeInputMode = \"date-time\"): Date {\n\tif (mode === \"time\") {\n\t\treturn normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate();\n\t}\n\n\treturn normalizeDateTimeValue(value, mode) ?? fallbackDate;\n}\n\n/**\n * Возвращает границы часов и минут для выбранного календарного дня.\n */\nexport function getTimeRangeForDay(\n\tday: Date,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tmode: DateTimeInputMode = \"date-time\"\n): {\n\tdisabled: boolean;\n\tminHour: number;\n\tmaxHour: number;\n\tminMinuteByHour: (hour: number) => number;\n\tmaxMinuteByHour: (hour: number) => number;\n} {\n\tconst normalizedDay = normalizeDateTimeValue(day, mode) ?? day;\n\tconst normalizedMinDate = minDate ? normalizeDateTimeValue(minDate, mode) : null;\n\tconst normalizedMaxDate = maxDate ? normalizeDateTimeValue(maxDate, mode) : null;\n\tconst isSameMinDay =\n\t\t!!normalizedMinDate &&\n\t\tnormalizedDay.getFullYear() === normalizedMinDate.getFullYear() &&\n\t\tnormalizedDay.getMonth() === normalizedMinDate.getMonth() &&\n\t\tnormalizedDay.getDate() === normalizedMinDate.getDate();\n\tconst isSameMaxDay =\n\t\t!!normalizedMaxDate &&\n\t\tnormalizedDay.getFullYear() === normalizedMaxDate.getFullYear() &&\n\t\tnormalizedDay.getMonth() === normalizedMaxDate.getMonth() &&\n\t\tnormalizedDay.getDate() === normalizedMaxDate.getDate();\n\n\tconst minHour = isSameMinDay ? normalizedMinDate!.getHours() : 0;\n\tconst maxHour = isSameMaxDay ? normalizedMaxDate!.getHours() : 23;\n\tconst minMinuteAtBoundary = isSameMinDay && minHour === maxHour ? normalizedMinDate!.getMinutes() : 0;\n\tconst maxMinuteAtBoundary = isSameMaxDay && minHour === maxHour ? normalizedMaxDate!.getMinutes() : 59;\n\tconst disabled = minHour > maxHour || (minHour === maxHour && minMinuteAtBoundary > maxMinuteAtBoundary);\n\n\treturn {\n\t\tdisabled,\n\t\tminHour,\n\t\tmaxHour,\n\t\tminMinuteByHour: (hour) => {\n\t\t\tif (disabled) return 0;\n\t\t\treturn isSameMinDay && hour === minHour ? normalizedMinDate!.getMinutes() : 0;\n\t\t},\n\t\tmaxMinuteByHour: (hour) => {\n\t\t\tif (disabled) return 59;\n\t\t\treturn isSameMaxDay && hour === maxHour ? normalizedMaxDate!.getMinutes() : 59;\n\t\t}\n\t};\n}\n\n/**\n * Ограничивает часы и минуты допустимым диапазоном текущего дня.\n */\nexport function clampTimeForDay(\n\tday: Date,\n\thours: number,\n\tminutes: number,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tmode: DateTimeInputMode = \"date-time\"\n): { hours: number; minutes: number } {\n\tconst range = getTimeRangeForDay(day, minDate, maxDate, mode);\n\tif (range.disabled) {\n\t\treturn { hours: 0, minutes: 0 };\n\t}\n\n\tconst clampedHour = Math.min(Math.max(hours, range.minHour), range.maxHour);\n\tconst minMinute = range.minMinuteByHour(clampedHour);\n\tconst maxMinute = range.maxMinuteByHour(clampedHour);\n\tconst clampedMinute = Math.min(Math.max(minutes, minMinute), maxMinute);\n\n\treturn {\n\t\thours: clampedHour,\n\t\tminutes: clampedMinute\n\t};\n}\n","import { getTimeRangeForDay } from \"./dateTimeValue\";\n\nimport type { DateTimeInputMode } from \"./dateTimeValue\";\n\n/**\n * Состояние и доступные значения для панели выбора времени.\n */\nexport interface TimePanelState {\n\tdisabled: boolean;\n\tselectedHour: number;\n\tselectedMinute: number;\n\thours: number[];\n\tminutes: number[];\n}\n\n/**\n * Собирает состояние часов и минут для панели выбора времени.\n */\nexport function buildTimePanelState(value: Date, minDate?: Date, maxDate?: Date, mode: DateTimeInputMode = \"date-time\"): TimePanelState {\n\tconst timeRange = getTimeRangeForDay(value, minDate, maxDate, mode);\n\tconst selectedHour = value.getHours();\n\tconst selectedMinute = value.getMinutes();\n\tconst minuteMin = timeRange.minMinuteByHour(selectedHour);\n\tconst minuteMax = timeRange.maxMinuteByHour(selectedHour);\n\n\tif (timeRange.disabled) {\n\t\treturn {\n\t\t\tdisabled: true,\n\t\t\tselectedHour,\n\t\t\tselectedMinute,\n\t\t\thours: [],\n\t\t\tminutes: []\n\t\t};\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tselectedHour,\n\t\tselectedMinute,\n\t\thours: Array.from({ length: timeRange.maxHour - timeRange.minHour + 1 }, (_, index) => timeRange.minHour + index),\n\t\tminutes: Array.from({ length: minuteMax - minuteMin + 1 }, (_, index) => minuteMin + index)\n\t};\n}\n","import type { ChangeEvent, FocusEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport {\n\tareAllDateSegmentsEmpty,\n\tdateToIndexedSegmentValues,\n\ttype EditableDateSegment,\n\tindexedSegmentsToDate,\n\tparseDateSegmentMask\n} from \"@ryuzaki13/react-foundation-lib/date-segments\";\n\nimport { createTimeOnlyBaseDate, getDateTimeInputFormat, isDateTimeWithinRange, normalizeDateTimeValue } from \"../lib\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\ninterface UseDateTimeSegmentsOptions {\n\tvalue: Date | null | undefined;\n\tonChange: (value: Date | null) => void;\n\tonClearError?: () => void;\n\tdisabled?: boolean;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tmode?: DateTimeInputMode;\n}\n\nfunction resolveEditableIndices(segments: readonly { kind: string }[]): number[] {\n\tconst indices: number[] = [];\n\n\tsegments.forEach((segment, index) => {\n\t\tif (segment.kind === \"editable\") {\n\t\t\tindices.push(index);\n\t\t}\n\t});\n\n\treturn indices;\n}\n\n/**\n * Управляет сегментным вводом фиксированного формата даты-времени или только времени.\n */\nexport function useDateTimeSegments({\n\tvalue,\n\tonChange,\n\tonClearError,\n\tdisabled,\n\tminDate,\n\tmaxDate,\n\tmode = \"date-time\"\n}: UseDateTimeSegmentsOptions) {\n\tconst inputFormat = useMemo(() => getDateTimeInputFormat(mode), [mode]);\n\tconst segments = useMemo(() => parseDateSegmentMask(inputFormat), [inputFormat]);\n\tconst editableIndices = useMemo(() => resolveEditableIndices(segments), [segments]);\n\tconst committedValues = useMemo(() => dateToIndexedSegmentValues(value ?? null, segments), [segments, value]);\n\tconst [dirtyValues, setDirtyValues] = useState<Map<number, string> | null>(null);\n\tconst currentValueTime = value?.getTime() ?? null;\n\n\tconst syncDirtyValues = useEffectEvent((values: Map<number, string> | null) => setDirtyValues(values));\n\n\tuseEffect(() => {\n\t\tsyncDirtyValues(null);\n\t}, [currentValueTime, mode]);\n\n\tconst segmentValues = dirtyValues ?? committedValues;\n\tconst refsMap = useRef<Map<number, HTMLInputElement>>(new Map());\n\tconst blurTimeout = useRef<number>(0);\n\n\t/**\n\t * Пытается собрать и отдать наружу новое значение поля.\n\t */\n\tconst tryCommit = useCallback(\n\t\t(updatedValues: Map<number, string>) => {\n\t\t\tif (areAllDateSegmentsEmpty(segments, updatedValues)) {\n\t\t\t\tonChange(null);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst nextDate = indexedSegmentsToDate(segments, updatedValues, {\n\t\t\t\tdefaultDate: mode === \"time\" ? (normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate()) : undefined\n\t\t\t});\n\t\t\tif (!nextDate) return null;\n\t\t\tif (!isDateTimeWithinRange(nextDate, minDate, maxDate, mode)) return null;\n\n\t\t\tonChange(nextDate);\n\t\t\treturn nextDate;\n\t\t},\n\t\t[maxDate, minDate, mode, onChange, segments, value]\n\t);\n\n\t/**\n\t * Фокусирует конкретный редактируемый сегмент.\n\t */\n\tconst focusSegment = useCallback((index: number, selectAll = true) => {\n\t\tconst element = refsMap.current.get(index);\n\t\tif (!element) return;\n\n\t\telement.focus();\n\t\tif (selectAll) {\n\t\t\trequestAnimationFrame(() => element.select());\n\t\t}\n\t}, []);\n\n\t/**\n\t * Возвращает индекс следующего редактируемого сегмента.\n\t */\n\tconst getNextEditable = useCallback(\n\t\t(currentIndex: number): number | null => {\n\t\t\tconst position = editableIndices.indexOf(currentIndex);\n\t\t\treturn position < editableIndices.length - 1 ? editableIndices[position + 1] : null;\n\t\t},\n\t\t[editableIndices]\n\t);\n\n\t/**\n\t * Возвращает индекс предыдущего редактируемого сегмента.\n\t */\n\tconst getPreviousEditable = useCallback(\n\t\t(currentIndex: number): number | null => {\n\t\t\tconst position = editableIndices.indexOf(currentIndex);\n\t\t\treturn position > 0 ? editableIndices[position - 1] : null;\n\t\t},\n\t\t[editableIndices]\n\t);\n\n\t/**\n\t * Дополняет неполный сегмент ведущими нулями.\n\t */\n\tconst padValue = useCallback((valueToPad: string, segment: EditableDateSegment) => valueToPad.padStart(segment.length, \"0\"), []);\n\n\t/**\n\t * Регистрирует DOM-ссылку сегмента по индексу.\n\t */\n\tconst registerRef = useCallback(\n\t\t(index: number) => (element: HTMLInputElement | null) => {\n\t\t\tif (element) {\n\t\t\t\trefsMap.current.set(index, element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trefsMap.current.delete(index);\n\t\t},\n\t\t[]\n\t);\n\n\t/**\n\t * Обрабатывает печать внутри отдельного сегмента.\n\t */\n\tconst handleInput = useCallback(\n\t\t(index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (disabled) return;\n\n\t\t\tconst segment = segments[index];\n\t\t\tif (segment.kind !== \"editable\") return;\n\n\t\t\tconst rawValue = event.target.value.replace(/\\D/g, \"\");\n\t\t\tconst clampedValue = rawValue.slice(0, segment.length);\n\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\tupdatedValues.set(index, clampedValue);\n\t\t\tsetDirtyValues(updatedValues);\n\t\t\tonClearError?.();\n\n\t\t\tif (clampedValue.length === segment.length) {\n\t\t\t\tconst nextIndex = getNextEditable(index);\n\t\t\t\tif (nextIndex !== null) {\n\t\t\t\t\trequestAnimationFrame(() => focusSegment(nextIndex));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttryCommit(updatedValues);\n\t\t},\n\t\t[disabled, focusSegment, getNextEditable, onClearError, segmentValues, segments, tryCommit]\n\t);\n\n\t/**\n\t * Обрабатывает клавиатурную навигацию и шаговые изменения сегментов.\n\t */\n\tconst handleKeyDown = useCallback(\n\t\t(index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (disabled) return;\n\n\t\t\tconst segment = segments[index];\n\t\t\tif (segment.kind !== \"editable\") return;\n\n\t\t\tconst currentValue = segmentValues.get(index) ?? \"\";\n\t\t\tconst element = event.currentTarget;\n\n\t\t\tswitch (event.key) {\n\t\t\t\tcase \"ArrowRight\": {\n\t\t\t\t\tif (element.selectionStart === currentValue.length || currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst nextIndex = getNextEditable(index);\n\t\t\t\t\t\tif (nextIndex !== null) focusSegment(nextIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowLeft\": {\n\t\t\t\t\tif (element.selectionStart === 0 || currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst previousIndex = getPreviousEditable(index);\n\t\t\t\t\t\tif (previousIndex !== null) focusSegment(previousIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tlet numericValue = currentValue === \"\" ? segment.min : Number.parseInt(currentValue, 10) + 1;\n\t\t\t\t\tif (numericValue > segment.max) numericValue = segment.min;\n\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, padValue(String(numericValue), segment));\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\trequestAnimationFrame(() => element.select());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tlet numericValue = currentValue === \"\" ? segment.max : Number.parseInt(currentValue, 10) - 1;\n\t\t\t\t\tif (numericValue < segment.min) numericValue = segment.max;\n\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, padValue(String(numericValue), segment));\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\trequestAnimationFrame(() => element.select());\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Backspace\": {\n\t\t\t\t\tif (currentValue === \"\") {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tconst previousIndex = getPreviousEditable(index);\n\t\t\t\t\t\tif (previousIndex !== null) focusSegment(previousIndex);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"Delete\": {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst updatedValues = new Map(segmentValues);\n\t\t\t\t\tupdatedValues.set(index, \"\");\n\t\t\t\t\tsetDirtyValues(updatedValues);\n\t\t\t\t\ttryCommit(updatedValues);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[disabled, focusSegment, getNextEditable, getPreviousEditable, padValue, segmentValues, segments, tryCommit]\n\t);\n\n\t/**\n\t * Выделяет содержимое сегмента при фокусе.\n\t */\n\tconst handleFocus = useCallback(\n\t\t() => (event: FocusEvent<HTMLInputElement>) => {\n\t\t\tevent.target.select();\n\t\t},\n\t\t[]\n\t);\n\n\t/**\n\t * Сбрасывает таймер blur, когда контейнер получает фокус.\n\t */\n\tconst handleContainerFocus = useCallback(() => {\n\t\tclearTimeout(blurTimeout.current);\n\t}, []);\n\n\t/**\n\t * На blur оставляет только committed-значение либо полностью пустое состояние.\n\t */\n\tconst handleContainerBlur = useCallback(() => {\n\t\tconst currentValues = new Map(segmentValues);\n\n\t\tblurTimeout.current = window.setTimeout(() => {\n\t\t\tif (areAllDateSegmentsEmpty(segments, currentValues)) {\n\t\t\t\tonChange(null);\n\t\t\t\tsetDirtyValues(currentValues);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextDate = indexedSegmentsToDate(segments, currentValues, {\n\t\t\t\tdefaultDate: mode === \"time\" ? (normalizeDateTimeValue(value, \"time\") ?? createTimeOnlyBaseDate()) : undefined\n\t\t\t});\n\t\t\tif (!nextDate || !isDateTimeWithinRange(nextDate, minDate, maxDate, mode)) {\n\t\t\t\tsetDirtyValues(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDirtyValues(currentValues);\n\t\t}, 0);\n\t}, [maxDate, minDate, mode, onChange, segmentValues, segments, value]);\n\n\t/**\n\t * Фокусирует первый пустой сегмент либо последний редактируемый.\n\t */\n\tconst focusFirstEmpty = useCallback(() => {\n\t\tconst firstEmpty = editableIndices.find((index) => !(segmentValues.get(index) ?? \"\"));\n\t\tconst targetIndex = firstEmpty ?? editableIndices[editableIndices.length - 1];\n\t\tif (targetIndex !== undefined) {\n\t\t\tfocusSegment(targetIndex);\n\t\t}\n\t}, [editableIndices, focusSegment, segmentValues]);\n\n\treturn {\n\t\tsegments,\n\t\tsegmentValues,\n\t\tregisterRef,\n\t\thandleInput,\n\t\thandleKeyDown,\n\t\thandleFocus,\n\t\thandleContainerFocus,\n\t\thandleContainerBlur,\n\t\tfocusFirstEmpty\n\t};\n}\n","@use \"@/styles/mixins\" as *;\n\n.segmentInput {\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\toutline: none;\n\tpadding: 0;\n\tmargin: 0;\n\tfont-family: var(--font-family-mono);\n\tcolor: inherit;\n\ttext-align: center;\n\tcaret-color: var(--content-0);\n\tfont-variant-numeric: tabular-nums;\n\n\t&::placeholder {\n\t\tcolor: var(--content-2);\n\t\t// font-size: var(--font-size-sm);\n\t}\n\n\t&::selection {\n\t\tbackground-color: var(--focus-ring);\n\t\tcolor: var(--surface-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.25;\n\t}\n}\n\n.separator {\n\tuser-select: none;\n\tcolor: var(--content-1);\n\tflex-shrink: 0;\n\n\t&[data-disabled] {\n\t\topacity: 0.25;\n\t}\n}\n\n.calendarButton {\n\t&:hover {\n\t\tcolor: var(--focus-ring);\n\t}\n}\n\n.popoverContent {\n\tdisplay: grid;\n\tgap: var(--space-md);\n}\n\n.bottom {\n\tgrid-template-columns: minmax(0, 1fr);\n}\n\n.right {\n\tgrid-template-columns: auto calc(9em + var(--width-add));\n\talign-items: stretch;\n}\n\n.calendarPane {\n\tmin-width: 0;\n}\n\n.timePanelPane {\n\tmin-width: 0;\n}\n\n.timeOnlyPopoverContent {\n\tmin-width: calc(9em + var(--width-add));\n}\n\n.timePanelPaneBottom {\n\tpadding-top: var(--space-md);\n\tborder-top: var(--border);\n}\n\n.timePanelPaneRight {\n\tpadding-left: var(--space-md);\n\tborder-left: var(--border);\n}\n",".timePanel {\n\theight: 100%;\n}\n\n.hint {\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--content-1);\n}\n\n.fields {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n\tgap: var(--space-sm);\n\tmin-height: 10em;\n\theight: 100%;\n}\n\n.field {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tgap: var(--space-xs);\n\tmin-height: 0;\n}\n\n.label {\n\t// font-size: var(--font-size-sm);\n\tcolor: var(--content-1);\n}\n\n.wheel {\n\tmin-height: 10em;\n}\n","import { WheelPicker } from \"../../wheel-picker\";\nimport { buildTimePanelState } from \"../lib/timePanelState\";\n\nimport styles from \"./TimePanel.module.scss\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\n/**\n * Пропсы панели выбора времени.\n */\nexport interface TimePanelProps {\n\tvalue: Date;\n\tdisabled?: boolean;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tmode?: DateTimeInputMode;\n\tonChange: (hours: number, minutes: number) => void;\n}\n\n/**\n * Переиспользуемая панель выбора времени поверх internal wheel-picker.\n */\nexport function TimePanel({ value, disabled, minDate, maxDate, mode = \"date-time\", onChange }: TimePanelProps) {\n\tconst state = buildTimePanelState(value, minDate, maxDate, mode);\n\n\t/**\n\t * Форматирует двузначное значение времени.\n\t */\n\tconst formatValue = (timePart: number) => String(timePart).padStart(2, \"0\");\n\n\tif (state.disabled) {\n\t\treturn (\n\t\t\t<div className={styles.timePanel}>\n\t\t\t\t<p className={styles.hint}>Для выбранного дня нет доступного времени в заданном диапазоне.</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={styles.timePanel}>\n\t\t\t<div className={styles.fields}>\n\t\t\t\t<label className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Часы</span>\n\t\t\t\t\t<WheelPicker\n\t\t\t\t\t\tclassName={styles.wheel}\n\t\t\t\t\t\titems={state.hours}\n\t\t\t\t\t\tvalue={state.selectedHour}\n\t\t\t\t\t\tonChange={(hours) => onChange(hours, state.selectedMinute)}\n\t\t\t\t\t\tariaLabel=\"Выбор часов\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tformatItem={formatValue}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\n\t\t\t\t<label className={styles.field}>\n\t\t\t\t\t<span className={styles.label}>Минуты</span>\n\t\t\t\t\t<WheelPicker\n\t\t\t\t\t\tclassName={styles.wheel}\n\t\t\t\t\t\titems={state.minutes}\n\t\t\t\t\t\tvalue={state.selectedMinute}\n\t\t\t\t\t\tonChange={(minutes) => onChange(state.selectedHour, minutes)}\n\t\t\t\t\t\tariaLabel=\"Выбор минут\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tformatItem={formatValue}\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { JSX, useEffect, useEffectEvent, useMemo, useState } from \"react\";\n\nimport { getStartOfDay, isDateRangeTuple, NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CalendarDaysIcon, Clock3Icon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { CalendarView } from \"../../date-input/ui\";\nimport { InputControl, InputUI, useInputFieldIds } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport {\n\tclampTimeForDay,\n\tisDateTimeWithinRange,\n\tmergeDateWithTime,\n\tmergeTimeIntoDate,\n\tnormalizeDateTimeValue,\n\tresolvePickerBaseDate\n} from \"../lib\";\nimport { useDateTimeSegments } from \"../model\";\n\nimport styles from \"./SingleDateTimeInput.module.scss\";\nimport { TimePanel } from \"./TimePanel\";\n\nimport type { DateTimeInputMode } from \"../lib\";\n\ninterface BaseSingleDateTimeInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\ttimePanelPlacement?: \"bottom\" | \"right\";\n\tmode?: DateTimeInputMode;\n}\n\nexport interface SingleDateTimeInputProps extends BaseSingleDateTimeInputProps, UiBaseProps<Date | null> {}\n\n/**\n * Поле выбора даты-времени со строгой сегментной маской и popover-пикером.\n */\nexport function SingleDateTimeInput({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tdisabled,\n\tsize,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\ttimePanelPlacement = \"right\",\n\tmode = \"date-time\"\n}: SingleDateTimeInputProps): JSX.Element {\n\tconst normalizedValue = normalizeDateTimeValue(value, mode);\n\tconst normalizedValueTime = normalizedValue?.getTime() ?? null;\n\n\tconst fallbackPickerDate = useMemo(() => getStartOfDay(new Date()), []);\n\n\tconst [open, setOpen] = useState(false);\n\tconst [draftValue, setDraftValue] = useState<Date | null>(normalizedValue ?? null);\n\tconst [calendarView, setCalendarView] = useState<\"day\" | \"month\" | \"year\">(\"day\");\n\tconst [pickerDate, setPickerDate] = useState<Date>(() => resolvePickerBaseDate(normalizedValue, fallbackPickerDate, mode));\n\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\tconst syncDraftDate = useEffectEvent((date: Date | null) => setDraftValue(date));\n\tconst syncPickerDate = useEffectEvent((date: Date) => setPickerDate(date));\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\tsyncDraftDate(normalizedValue ?? null);\n\t\t}\n\n\t\tif (normalizedValue) {\n\t\t\tsyncPickerDate(normalizedValue);\n\t\t}\n\t}, [normalizedValue, normalizedValueTime, open]);\n\n\tuseEffect(() => {\n\t\tif (!normalizedValue) return;\n\t\tsyncPickerDate(normalizedValue);\n\t}, [normalizedValue, normalizedValueTime]);\n\n\tconst {\n\t\tsegments,\n\t\tsegmentValues,\n\t\tregisterRef,\n\t\thandleInput,\n\t\thandleKeyDown,\n\t\thandleFocus,\n\t\thandleContainerFocus,\n\t\thandleContainerBlur,\n\t\tfocusFirstEmpty\n\t} = useDateTimeSegments({\n\t\tvalue: normalizedValue,\n\t\tonChange,\n\t\tonClearError,\n\t\tdisabled,\n\t\tminDate,\n\t\tmaxDate,\n\t\tmode\n\t});\n\n\t/**\n\t * Выбирает дату в календаре и сохраняет текущее время.\n\t */\n\tconst handleCalendarSelect = (nextDate: Date | NullableDateRange) => {\n\t\tif (mode === \"time\" || isDateRangeTuple(nextDate) || disabled) return;\n\n\t\tconst baseValue = draftValue ?? normalizedValue ?? pickerDate;\n\t\tconst mergedDate = mergeDateWithTime(nextDate, baseValue);\n\t\tconst { hours, minutes } = clampTimeForDay(nextDate, mergedDate.getHours(), mergedDate.getMinutes(), minDate, maxDate, mode);\n\t\tconst nextValue = mergeTimeIntoDate(nextDate, hours, minutes);\n\n\t\tif (!isDateTimeWithinRange(nextValue, minDate, maxDate, mode)) return;\n\n\t\tonClearError?.();\n\t\tsetDraftValue(nextValue);\n\t\tsetPickerDate(nextValue);\n\t};\n\n\t/**\n\t * Выбирает время для текущего рабочего дня picker-а.\n\t */\n\tconst handleTimeChange = (hours: number, minutes: number) => {\n\t\tif (disabled) return;\n\n\t\tconst baseDate = draftValue ?? normalizedValue ?? pickerDate;\n\t\tconst clampedTime = clampTimeForDay(baseDate, hours, minutes, minDate, maxDate, mode);\n\t\tconst nextValue = mergeTimeIntoDate(baseDate, clampedTime.hours, clampedTime.minutes, mode);\n\n\t\tif (!isDateTimeWithinRange(nextValue, minDate, maxDate, mode)) return;\n\n\t\tonClearError?.();\n\t\tsetDraftValue(nextValue);\n\t\tsetPickerDate(nextValue);\n\t};\n\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (nextOpen) {\n\t\t\tsetDraftValue(normalizedValue ?? null);\n\t\t\tsetPickerDate(resolvePickerBaseDate(normalizedValue, fallbackPickerDate, mode));\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\n\tconst handlePopoverClose = () => {\n\t\tconst prevTime = normalizedValue?.getTime() ?? null;\n\t\tconst draftTime = draftValue?.getTime() ?? null;\n\n\t\tif (prevTime !== draftTime) {\n\t\t\tonChange(draftValue);\n\t\t}\n\t};\n\n\tconst panelPlacementClass = timePanelPlacement === \"right\" ? styles.timePanelPaneRight : styles.timePanelPaneBottom;\n\tconst buttonAriaLabel = mode === \"time\" ? \"Открыть выбор времени\" : \"Открыть календарь даты и времени\";\n\tconst inputPlaceholder = placeholder ?? (mode === \"time\" ? \"чч:мм\" : \"дд.мм.гггг чч:мм\");\n\tconst pickerValue = draftValue ?? normalizedValue ?? pickerDate;\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<InputUI\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tsize={size}\n\t\t\t\terror={error}\n\t\t\t\tcontrolId={controlId}\n\t\t\t\tlabelId={labelId}\n\t\t\t\tdescriptionId={descriptionId}\n\t\t\t\terrorId={errorId}>\n\t\t\t\t<InputControl\n\t\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tclassName={styles.calendarButton}\n\t\t\t\t\t\t\t\ticon={mode === \"time\" ? <Clock3Icon /> : <CalendarDaysIcon />}\n\t\t\t\t\t\t\t\taria-label={buttonAriaLabel}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t\t}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiInputControlFake, controlClassName)}\n\t\t\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\t\t\t\trole=\"group\"\n\t\t\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\t\t\taria-placeholder={inputPlaceholder}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\tonFocus={handleContainerFocus}\n\t\t\t\t\t\t\tonBlur={handleContainerBlur}\n\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\tif (event.target === event.currentTarget) {\n\t\t\t\t\t\t\t\t\tfocusFirstEmpty();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t{segments.map((segment, index) => {\n\t\t\t\t\t\t\t\tif (segment.kind === \"literal\") {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<span key={index} className={styles.separator} data-disabled={disabled || undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{segment.text}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\t\tref={registerRef(index)}\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.segmentInput}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${segment.length + 0.5}ch` }}\n\t\t\t\t\t\t\t\t\t\tvalue={segmentValues.get(index) ?? \"\"}\n\t\t\t\t\t\t\t\t\t\tplaceholder={segment.placeholder}\n\t\t\t\t\t\t\t\t\t\tmaxLength={segment.length}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\taria-label={segment.ariaLabel}\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\t\t\tonChange={handleInput(index)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown(index)}\n\t\t\t\t\t\t\t\t\t\tonFocus={handleFocus()}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t</InputUI>\n\n\t\t\t<Popover.Content background=\"primary\" onClose={handlePopoverClose}>\n\t\t\t\t{mode === \"time\" ? (\n\t\t\t\t\t<div className={styles.timeOnlyPopoverContent}>\n\t\t\t\t\t\t<TimePanel\n\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\tonChange={handleTimeChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className={cn(styles.popoverContent, styles[timePanelPlacement])}>\n\t\t\t\t\t\t<div className={styles.calendarPane}>\n\t\t\t\t\t\t\t<CalendarView\n\t\t\t\t\t\t\t\tview={calendarView}\n\t\t\t\t\t\t\t\tdatePickerLevel=\"day\"\n\t\t\t\t\t\t\t\tselectionMode=\"day\"\n\t\t\t\t\t\t\t\tonViewChange={setCalendarView}\n\t\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\t\tonChange={handleCalendarSelect}\n\t\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\t\tcurrentDate={pickerDate}\n\t\t\t\t\t\t\t\tonCurrentDateChange={setPickerDate}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className={cn(styles.timePanelPane, panelPlacementClass)}>\n\t\t\t\t\t\t\t<TimePanel\n\t\t\t\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tminDate={minDate}\n\t\t\t\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\t\t\t\tmode={mode}\n\t\t\t\t\t\t\t\tonChange={handleTimeChange}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/detail/Detail.module.scss","../../src/detail/Detail.tsx"],"sourcesContent":[".detailList {\n\tcolumn-gap: var(--space-sm);\n\n\t&.none {\n\t\t--row-gap: 0;\n\t}\n\n\t&.small {\n\t\t--row-gap: var(--space-xs);\n\t}\n\n\t&.normal {\n\t\t--row-gap: var(--space-sm);\n\t}\n\n\t&.large {\n\t\t--row-gap: var(--space-md);\n\t}\n}\n\n.detail {\n\t.dt {\n\t\tfont-weight: 700;\n\t\tfont-variation-settings: \"wght\" 700;\n\t}\n\n\t.dd {\n\t\tfont-weight: 500;\n\t\tfont-variation-settings: \"wght\" 500;\n\t}\n\n\t&.textCenter {\n\t\ttext-align: center;\n\n\t\t.dt,\n\t\t.dd {\n\t\t\tflex: 1;\n\t\t}\n\t}\n\n\t&.inline {\n\t\tdisplay: flex;\n\n\t\t.dt {\n\t\t\ttext-align: right;\n\t\t\tpadding-right: var(--space-sm);\n\t\t}\n\n\t\t.dd {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t&.start {\n\t\t\talign-items: flex-start;\n\t\t}\n\t\t&.center {\n\t\t\talign-items: center;\n\t\t}\n\t\t&.end {\n\t\t\talign-items: flex-end;\n\t\t}\n\t}\n\n\t&.noWrap {\n\t\t.dt,\n\t\t.dd {\n\t\t\twhite-space: nowrap;\n\t\t\tword-break: normal;\n\t\t}\n\n\t\t.dd {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tmargin-bottom: var(--row-gap);\n\t}\n}\n","import { createContext, CSSProperties, FC, ReactNode, useContext } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Detail.module.scss\";\n\nexport type DetailType = \"detail\" | \"list\";\n\nexport interface DetailContextType {\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nconst DetailContext = createContext<DetailContextType>({});\n\nexport interface DetailItemProps {\n\tlabel: ReactNode;\n\tvalue: ReactNode;\n\twithColon?: boolean;\n\trequired?: boolean;\n}\n\nfunction Item({ label, value, withColon, required }: DetailItemProps) {\n\tconst { semantic, inline, noWrap, center, vertical = \"center\", withColon: withColonParent = true } = useContext(DetailContext);\n\tconst detailClass = cn(styles.detail, center && styles.textCenter, inline && styles.inline, noWrap && styles.noWrap, styles[vertical]);\n\n\tconst labelContent = (\n\t\t<>\n\t\t\t{label}\n\t\t\t{required && <span className=\"statusError\">*</span>}\n\t\t\t{(typeof withColon === \"boolean\" ? withColon : withColonParent) && \":\"}\n\t\t</>\n\t);\n\n\tswitch (semantic) {\n\t\tcase \"detail\":\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<dt className={styles.dt}>{labelContent}</dt>\n\t\t\t\t\t<dd className={styles.dd}>{value}</dd>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"list\":\n\t\t\treturn (\n\t\t\t\t<li className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</li>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t}\n}\n\nexport interface DetailProps {\n\tcolumnCount?: number;\n\trowGap?: \"none\" | \"small\" | \"normal\" | \"large\";\n\tchildren: ReactNode;\n\tclassName?: string;\n\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nexport interface DetailComponent extends FC<DetailProps> {\n\tItem: FC<DetailItemProps>;\n}\n\n/**\n * Компонент для вывода пар «заголовок-значение» в одну или несколько колонок. Подходит для карточек сущностей, сводок и страниц просмотра.\n */\nexport const Detail: DetailComponent = ({ children, columnCount = 1, rowGap = \"none\", semantic = \"list\", className, ...itemProps }) => {\n\tconst classes = cn(styles.detailList, styles[rowGap], className);\n\tconst style = { columnCount: Math.min(5, Math.max(1, columnCount)) } as CSSProperties;\n\tconst content =\n\t\tsemantic === \"detail\" ? (\n\t\t\t<dl className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</dl>\n\t\t) : (\n\t\t\t<ul className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</ul>\n\t\t);\n\n\treturn <DetailContext.Provider value={{ ...itemProps, semantic }}>{content}</DetailContext.Provider>;\n};\n\nDetail.Item = Item;\n"],"mappings":";;;;;;;;;;;;;;;;;;GCiBM,IAAgB,EAAiC,CAAC,CAAC;AASzD,SAAS,EAAK,EAAE,UAAO,UAAO,cAAW,eAA6B;CACrE,IAAM,EAAE,aAAU,WAAQ,WAAQ,WAAQ,cAAW,UAAU,WAAW,IAAkB,OAAS,EAAW,CAAa,GACvH,IAAc,EAAG,EAAO,QAAQ,KAAU,EAAO,YAAY,KAAU,EAAO,QAAQ,KAAU,EAAO,QAAQ,EAAO,EAAS,GAE/H,IACL,kBAAA,GAAA,EAAA,UAAA;EACE;EACA,KAAY,kBAAC,QAAD;GAAM,WAAU;aAAc;EAAO,CAAA;GAChD,OAAO,KAAc,YAAY,IAAY,MAAoB;CAClE,EAAA,CAAA;CAGH,QAAQ,GAAR;EACC,KAAK,UACJ,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAiB,CAAA,GAC5C,kBAAC,MAAD;IAAI,WAAW,EAAO;cAAK;GAAU,CAAA,CACjC;;EAGP,KAAK,QACJ,OACC,kBAAC,MAAD;GAAI,WAAW;aAAf,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACpC;;EAGN,SACC,OACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAK;GAAW,CAAA,CACnC;;CAER;AACD;AAuBA,IAAa,KAA2B,EAAE,aAAU,iBAAc,GAAG,YAAS,QAAQ,cAAW,QAAQ,cAAW,GAAG,QAAgB;CACtI,IAAM,IAAU,EAAG,EAAO,YAAY,EAAO,IAAS,CAAS,GAEzD,IAEJ,EADD,MAAa,WACX,OAIA,MAJD;EAAI,WAAW;EAAgB,SAHjB,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAW,CAAC,EAGhC;EAC7B;CACE,CAIA;CAGN,OAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;GAAE,GAAG;GAAW;EAAS;YAAI;CAAgC,CAAA;AACpG;AAEA,EAAO,OAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/detail/Detail.module.scss","../../src/detail/Detail.tsx"],"sourcesContent":[".detailList {\n\tcolumn-gap: var(--space-sm);\n\n\t&.none {\n\t\t--row-gap: 0;\n\t}\n\n\t&.small {\n\t\t--row-gap: var(--space-xs);\n\t}\n\n\t&.normal {\n\t\t--row-gap: var(--space-sm);\n\t}\n\n\t&.large {\n\t\t--row-gap: var(--space-md);\n\t}\n}\n\n.detail {\n\t.dt {\n\t\tfont-weight: 700;\n\t\tfont-variation-settings: \"wght\" 700;\n\t}\n\n\t.dd {\n\t\tfont-weight: 500;\n\t\tfont-variation-settings: \"wght\" 500;\n\t}\n\n\t&.textCenter {\n\t\ttext-align: center;\n\n\t\t.dt,\n\t\t.dd {\n\t\t\tflex: 1;\n\t\t}\n\t}\n\n\t&.inline {\n\t\tdisplay: flex;\n\n\t\t.dt {\n\t\t\ttext-align: right;\n\t\t\tpadding-right: var(--space-sm);\n\t\t}\n\n\t\t.dd {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t&.start {\n\t\t\talign-items: flex-start;\n\t\t}\n\t\t&.center {\n\t\t\talign-items: center;\n\t\t}\n\t\t&.end {\n\t\t\talign-items: flex-end;\n\t\t}\n\t}\n\n\t&.noWrap {\n\t\t.dt,\n\t\t.dd {\n\t\t\twhite-space: nowrap;\n\t\t\tword-break: normal;\n\t\t}\n\n\t\t.dd {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tmargin-bottom: var(--row-gap);\n\t}\n}\n","import { createContext, CSSProperties, FC, ReactNode, useContext } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Detail.module.scss\";\n\nexport type DetailType = \"detail\" | \"list\";\n\nexport interface DetailContextType {\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nconst DetailContext = createContext<DetailContextType>({});\n\nexport interface DetailItemProps {\n\tlabel: ReactNode;\n\tvalue: ReactNode;\n\twithColon?: boolean;\n\trequired?: boolean;\n}\n\nfunction Item({ label, value, withColon, required }: DetailItemProps) {\n\tconst { semantic, inline, noWrap, center, vertical = \"center\", withColon: withColonParent = true } = useContext(DetailContext);\n\tconst detailClass = cn(styles.detail, center && styles.textCenter, inline && styles.inline, noWrap && styles.noWrap, styles[vertical]);\n\n\tconst labelContent = (\n\t\t<>\n\t\t\t{label}\n\t\t\t{required && <span className=\"statusError\">*</span>}\n\t\t\t{(typeof withColon === \"boolean\" ? withColon : withColonParent) && \":\"}\n\t\t</>\n\t);\n\n\tswitch (semantic) {\n\t\tcase \"detail\":\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<dt className={styles.dt}>{labelContent}</dt>\n\t\t\t\t\t<dd className={styles.dd}>{value}</dd>\n\t\t\t\t</div>\n\t\t\t);\n\n\t\tcase \"list\":\n\t\t\treturn (\n\t\t\t\t<li className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</li>\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className={detailClass}>\n\t\t\t\t\t<div className={styles.dt}>{labelContent}</div>\n\t\t\t\t\t<div className={styles.dd}>{value}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t}\n}\n\nexport interface DetailProps {\n\tcolumnCount?: number;\n\trowGap?: \"none\" | \"small\" | \"normal\" | \"large\";\n\tchildren: ReactNode;\n\tclassName?: string;\n\n\tsemantic?: DetailType;\n\tinline?: boolean;\n\tcenter?: boolean;\n\tvertical?: \"start\" | \"center\" | \"end\";\n\tnoWrap?: boolean;\n\twithColon?: boolean;\n}\n\nexport interface DetailComponent extends FC<DetailProps> {\n\tItem: FC<DetailItemProps>;\n}\n\n/**\n * Компонент для вывода пар «заголовок-значение» в одну или несколько колонок. Подходит для карточек сущностей, сводок и страниц просмотра.\n */\nexport const Detail: DetailComponent = ({ children, columnCount = 1, rowGap = \"none\", semantic = \"list\", className, ...itemProps }) => {\n\tconst classes = cn(styles.detailList, styles[rowGap], className);\n\tconst style = { columnCount: Math.min(5, Math.max(1, columnCount)) } as CSSProperties;\n\tconst content =\n\t\tsemantic === \"detail\" ? (\n\t\t\t<dl className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</dl>\n\t\t) : (\n\t\t\t<ul className={classes} style={style}>\n\t\t\t\t{children}\n\t\t\t</ul>\n\t\t);\n\n\treturn <DetailContext.Provider value={{ ...itemProps, semantic }}>{content}</DetailContext.Provider>;\n};\n\nDetail.Item = Item;\n"],"mappings":";;;;;;;;;;;;;;;;;;GCiBM,IAAgB,EAAiC,CAAC,CAAC;AASzD,SAAS,EAAK,EAAE,UAAO,UAAO,cAAW,eAA6B;CACrE,IAAM,EAAE,aAAU,WAAQ,WAAQ,WAAQ,cAAW,UAAU,WAAW,IAAkB,OAAS,EAAW,CAAa,GACvH,IAAc,EAAG,EAAO,QAAQ,KAAU,EAAO,YAAY,KAAU,EAAO,QAAQ,KAAU,EAAO,QAAQ,EAAO,EAAS,GAE/H,IACL,kBAAA,GAAA,EAAA,UAAA;EACE;EACA,KAAY,kBAAC,QAAD;GAAM,WAAU;GAAc,UAAA;EAAO,CAAA;GAChD,OAAO,KAAc,YAAY,IAAY,MAAoB;CAClE,EAAA,CAAA;CAGH,QAAQ,GAAR;EACC,KAAK,UACJ,OACC,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA,CACC,kBAAC,MAAD;IAAI,WAAW,EAAO;IAAK,UAAA;GAAiB,CAAA,GAC5C,kBAAC,MAAD;IAAI,WAAW,EAAO;IAAK,UAAA;GAAU,CAAA,CACjC;;EAGP,KAAK,QACJ,OACC,kBAAC,MAAD;GAAI,WAAW;GAAf,UAAA,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAK,UAAA;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAK,UAAA;GAAW,CAAA,CACpC;;EAGN,SACC,OACC,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA,CACC,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAK,UAAA;GAAkB,CAAA,GAC9C,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAK,UAAA;GAAW,CAAA,CACnC;;CAER;AACD;AAuBA,IAAa,KAA2B,EAAE,aAAU,iBAAc,GAAG,YAAS,QAAQ,cAAW,QAAQ,cAAW,GAAG,QAAgB;CACtI,IAAM,IAAU,EAAG,EAAO,YAAY,EAAO,IAAS,CAAS,GAEzD,IAEJ,EADD,MAAa,WACX,OAIA,MAJD;EAAI,WAAW;EAAgB,SAHjB,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAW,CAAC,EAGhC;EAC7B;CACE,CAIA;CAGN,OAAO,kBAAC,EAAc,UAAf;EAAwB,OAAO;GAAE,GAAG;GAAW;EAAS;EAAI,UAAA;CAAgC,CAAA;AACpG;AAEA,EAAO,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import React, { PropsWithChildren, useId } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { createPortal } from \"react-dom\";\n\ninterface DialogProps extends PropsWithChildren {\n\ttitle: React.ReactNode;\n\tdescription: string;\n\topen: boolean;\n\tonClose: () => void;\n\tminWidth?: string | number;\n}\n\n/**\n * Модальное диалоговое окно для важных подтверждений и коротких пользовательских сценариев.\n */\nexport function Dialog({ title, description, open, onClose, minWidth, children }: DialogProps) {\n\tconst titleId = useId();\n\tconst descriptionId = useId();\n\tconst panelRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\ttrapFocus: true,\n\t\trestoreFocus: true,\n\t\tinitialFocus: \"auto\"\n\t});\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: panelRef\n\t});\n\n\tif (!open) {\n\t\treturn null;\n\t}\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\tconst portalTarget = getOrCreatePortalRoot(\"dialog-root\");\n\n\tif (!portalTarget) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div\n\t\t\tclassName=\"fixed inset0 flexCenter surfaceBackdrop\"\n\t\t\tstyle={{ zIndex: \"var(--z-dialog)\" }}\n\t\t\tonMouseDown={(event) => event.target === event.currentTarget && onClose()}>\n\t\t\t<div\n\t\t\t\tref={panelRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={title ? titleId : undefined}\n\t\t\t\taria-describedby={description ? descriptionId : undefined}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tclassName=\"surface0 shadowMd paddingLg radiusSm\"\n\t\t\t\tstyle={{ minWidth }}>\n\t\t\t\t{title && (\n\t\t\t\t\t<h2 id={titleId} className=\"margin0\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t)}\n\t\t\t\t{description && <p id={descriptionId}>{description}</p>}\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>,\n\t\tportalTarget\n\t);\n}\n"],"mappings":";;;;;AAgBA,SAAgB,EAAO,EAAE,UAAO,gBAAa,SAAM,YAAS,aAAU,eAAyB;CAC9F,IAAM,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAW,EAAgC;EAChD,QAAQ;EACR,WAAW;EACX,cAAc;EACd,cAAc;CACf,CAAC;CAYD,IAVA,EAAiB;EAChB,QAAQ;EACR,WAAW;EACX,cAAc;CACf,CAAC,GAEG,CAAC,KAID,OAAO,WAAa,KACvB,OAAO;CAGR,IAAM,IAAe,EAAsB,aAAa;CAMxD,OAJK,IAIE,EACN,kBAAC,OAAD;EACC,WAAU;EACV,OAAO,EAAE,QAAQ,kBAAkB;EACnC,cAAc,MAAU,EAAM,WAAW,EAAM,iBAAiB,EAAQ;YACxE,kBAAC,OAAD;GACC,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,oBAAkB,IAAc,IAAgB,KAAA;GAChD,UAAU;GACV,WAAU;GACV,OAAO,EAAE,YAAS;aARnB;IASE,KACA,kBAAC,MAAD;KAAI,IAAI;KAAS,WAAU;eACzB;IACE,CAAA;IAEJ,KAAe,kBAAC,KAAD;KAAG,IAAI;eAAgB;IAAe,CAAA;IACrD;GACG;;CACD,CAAA,GACL,CACD,IA3BQ;AA4BT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import React, { PropsWithChildren, useId } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { createPortal } from \"react-dom\";\n\ninterface DialogProps extends PropsWithChildren {\n\ttitle: React.ReactNode;\n\tdescription: string;\n\topen: boolean;\n\tonClose: () => void;\n\tminWidth?: string | number;\n}\n\n/**\n * Модальное диалоговое окно для важных подтверждений и коротких пользовательских сценариев.\n */\nexport function Dialog({ title, description, open, onClose, minWidth, children }: DialogProps) {\n\tconst titleId = useId();\n\tconst descriptionId = useId();\n\tconst panelRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\ttrapFocus: true,\n\t\trestoreFocus: true,\n\t\tinitialFocus: \"auto\"\n\t});\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: panelRef\n\t});\n\n\tif (!open) {\n\t\treturn null;\n\t}\n\n\tif (typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\tconst portalTarget = getOrCreatePortalRoot(\"dialog-root\");\n\n\tif (!portalTarget) {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<div\n\t\t\tclassName=\"fixed inset0 flexCenter surfaceBackdrop\"\n\t\t\tstyle={{ zIndex: \"var(--z-dialog)\" }}\n\t\t\tonMouseDown={(event) => event.target === event.currentTarget && onClose()}>\n\t\t\t<div\n\t\t\t\tref={panelRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={title ? titleId : undefined}\n\t\t\t\taria-describedby={description ? descriptionId : undefined}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tclassName=\"surface0 shadowMd paddingLg radiusSm\"\n\t\t\t\tstyle={{ minWidth }}>\n\t\t\t\t{title && (\n\t\t\t\t\t<h2 id={titleId} className=\"margin0\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t)}\n\t\t\t\t{description && <p id={descriptionId}>{description}</p>}\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>,\n\t\tportalTarget\n\t);\n}\n"],"mappings":";;;;;AAgBA,SAAgB,EAAO,EAAE,UAAO,gBAAa,SAAM,YAAS,aAAU,eAAyB;CAC9F,IAAM,IAAU,EAAM,GAChB,IAAgB,EAAM,GACtB,IAAW,EAAgC;EAChD,QAAQ;EACR,WAAW;EACX,cAAc;EACd,cAAc;CACf,CAAC;CAYD,IAVA,EAAiB;EAChB,QAAQ;EACR,WAAW;EACX,cAAc;CACf,CAAC,GAEG,CAAC,KAID,OAAO,WAAa,KACvB,OAAO;CAGR,IAAM,IAAe,EAAsB,aAAa;CAMxD,OAJK,IAIE,EACN,kBAAC,OAAD;EACC,WAAU;EACV,OAAO,EAAE,QAAQ,kBAAkB;EACnC,cAAc,MAAU,EAAM,WAAW,EAAM,iBAAiB,EAAQ;EACxE,UAAA,kBAAC,OAAD;GACC,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,oBAAkB,IAAc,IAAgB,KAAA;GAChD,UAAU;GACV,WAAU;GACV,OAAO,EAAE,YAAS;GARnB,UAAA;IASE,KACA,kBAAC,MAAD;KAAI,IAAI;KAAS,WAAU;KACzB,UAAA;IACE,CAAA;IAEJ,KAAe,kBAAC,KAAD;KAAG,IAAI;KAAgB,UAAA;IAAe,CAAA;IACrD;GACG;;CACD,CAAA,GACL,CACD,IA3BQ;AA4BT"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "../chunks/ui.module-BisoTevy.js";
2
- import { t } from "../chunks/flex-DYZ0IbU6.js";
2
+ import { t } from "../chunks/flex-C7njxZ74.js";
3
3
  import { useId as n, useState as r } from "react";
4
4
  import { cn as i } from "@ryuzaki13/react-foundation-lib/utils";
5
5
  import { ChevronDownIcon as a, ChevronUpIcon as o } from "lucide-react";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/disclosure/Disclosure.module.scss","../../src/disclosure/Disclosure.tsx","../../src/disclosure/DisclosureGroup.tsx"],"sourcesContent":[".disclosure {\n\t--ui-panel-background: var(--surface-2);\n\n\tbox-shadow: none;\n}\n\n.disclosureHeader {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.disclosureButton {\n\t// flex: 1 1 auto;\n\tmin-width: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.disclosureActions {\n\t// flex: 0 0 auto;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding-inline-end: var(--space-sm);\n}\n\n.disclosureGroup {\n\t> .disclosure {\n\t\tborder-radius: 0;\n\n\t\t&:not(:first-child) {\n\t\t\tborder-top: none;\n\t\t}\n\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: var(--radius-sm);\n\t\t\tborder-top-right-radius: var(--radius-sm);\n\t\t}\n\n\t\t&:last-child {\n\t\t\tborder-bottom-left-radius: var(--radius-sm);\n\t\t\tborder-bottom-right-radius: var(--radius-sm);\n\t\t}\n\t}\n}\n","import React, { PropsWithChildren, useId, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport { FlexSpacer } from \"../flex\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Disclosure.module.scss\";\n\nexport interface DisclosureProps extends PropsWithChildren {\n\tlabel: React.ReactNode;\n\tdefaultOpen?: boolean;\n\t/** Независимые действия в правой части заголовка, расположенные вне кнопки раскрытия. */\n\theaderActions?: React.ReactNode;\n}\n\n/**\n * Раскрывающийся блок с заголовком и скрываемым содержимым. Используется для FAQ, настроек и компактного размещения второстепенной информации.\n */\nexport function Disclosure({ label, defaultOpen, headerActions, children }: DisclosureProps) {\n\tconst [open, setOpen] = useState(defaultOpen === true);\n\tconst panelId = useId();\n\tconst buttonId = useId();\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, uiStyles.uiPanel, styles.disclosure)}>\n\t\t\t<div className={styles.disclosureHeader}>\n\t\t\t\t<button\n\t\t\t\t\tid={buttonId}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={panelId}\n\t\t\t\t\tclassName={cn(styles.disclosureButton, \"fontBold radiusSm paddingSm gapSm\")}\n\t\t\t\t\tdata-ui=\"disclosure-toggle\"\n\t\t\t\t\tdata-action={open ? \"collapse-disclosure\" : \"expand-disclosure\"}\n\t\t\t\t\tonClick={() => setOpen((prevOpen) => !prevOpen)}>\n\t\t\t\t\t{open ? <ChevronUpIcon /> : <ChevronDownIcon />}\n\t\t\t\t\t{label}\n\t\t\t\t</button>\n\t\t\t\t{headerActions ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<FlexSpacer />\n\t\t\t\t\t\t{headerActions}\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{open && (\n\t\t\t\t<div id={panelId} role=\"region\" aria-labelledby={buttonId}>\n\t\t\t\t\t<div className={\"paddingMd\"}>{children}</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Disclosure, DisclosureProps } from \"./Disclosure\";\nimport styles from \"./Disclosure.module.scss\";\n\ninterface DisclosureGroupProps {\n\tchildren?:\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)[];\n\tclassName?: string;\n}\n\n/**\n * Групповой контейнер для нескольких `Disclosure`. Помогает выстраивать последовательный список раскрывающихся секций.\n */\nexport function DisclosureGroup({ className, children }: DisclosureGroupProps) {\n\treturn <div className={cn(styles.disclosureGroup, className)}>{children}</div>;\n}\n"],"mappings":";;;;;;;;;;;;;;;ACoBA,SAAgB,EAAW,EAAE,UAAO,gBAAa,kBAAe,eAA6B;CAC5F,IAAM,CAAC,GAAM,KAAW,EAAS,MAAgB,EAAI,GAC/C,IAAU,EAAM,GAChB,IAAW,EAAM;CAEvB,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,EAAS,SAAS,EAAO,UAAU;YAA1E,CACC,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB,CACC,kBAAC,UAAD;IACC,IAAI;IACJ,MAAK;IACL,iBAAe;IACf,iBAAe;IACf,WAAW,EAAG,EAAO,kBAAkB,mCAAmC;IAC1E,WAAQ;IACR,eAAa,IAAO,wBAAwB;IAC5C,eAAe,GAAS,MAAa,CAAC,CAAQ;cAR/C,CASS,EAAP,IAAQ,IAAoB,GAArB,CAAgB,CAAsB,GAC7C,CACM;OACP,IACA,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD,CAAa,CAAA,GACZ,CACA,EAAA,CAAA,IACC,IACA;MAEJ,KACA,kBAAC,OAAD;GAAK,IAAI;GAAS,MAAK;GAAS,mBAAiB;aAChD,kBAAC,OAAD;IAAK,WAAW;IAAc;GAAc,CAAA;EACxC,CAAA,CAEF;;AAEP;;;ACtCA,SAAgB,EAAgB,EAAE,cAAW,eAAkC;CAC9E,OAAO,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,iBAAiB,CAAS;EAAI;CAAc,CAAA;AAC9E"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/disclosure/Disclosure.module.scss","../../src/disclosure/Disclosure.tsx","../../src/disclosure/DisclosureGroup.tsx"],"sourcesContent":[".disclosure {\n\t--ui-panel-background: var(--surface-2);\n\n\tbox-shadow: none;\n}\n\n.disclosureHeader {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.disclosureButton {\n\t// flex: 1 1 auto;\n\tmin-width: 0;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t}\n}\n\n.disclosureActions {\n\t// flex: 0 0 auto;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding-inline-end: var(--space-sm);\n}\n\n.disclosureGroup {\n\t> .disclosure {\n\t\tborder-radius: 0;\n\n\t\t&:not(:first-child) {\n\t\t\tborder-top: none;\n\t\t}\n\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: var(--radius-sm);\n\t\t\tborder-top-right-radius: var(--radius-sm);\n\t\t}\n\n\t\t&:last-child {\n\t\t\tborder-bottom-left-radius: var(--radius-sm);\n\t\t\tborder-bottom-right-radius: var(--radius-sm);\n\t\t}\n\t}\n}\n","import React, { PropsWithChildren, useId, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\n\nimport { FlexSpacer } from \"../flex\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Disclosure.module.scss\";\n\nexport interface DisclosureProps extends PropsWithChildren {\n\tlabel: React.ReactNode;\n\tdefaultOpen?: boolean;\n\t/** Независимые действия в правой части заголовка, расположенные вне кнопки раскрытия. */\n\theaderActions?: React.ReactNode;\n}\n\n/**\n * Раскрывающийся блок с заголовком и скрываемым содержимым. Используется для FAQ, настроек и компактного размещения второстепенной информации.\n */\nexport function Disclosure({ label, defaultOpen, headerActions, children }: DisclosureProps) {\n\tconst [open, setOpen] = useState(defaultOpen === true);\n\tconst panelId = useId();\n\tconst buttonId = useId();\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, uiStyles.uiPanel, styles.disclosure)}>\n\t\t\t<div className={styles.disclosureHeader}>\n\t\t\t\t<button\n\t\t\t\t\tid={buttonId}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-expanded={open}\n\t\t\t\t\taria-controls={panelId}\n\t\t\t\t\tclassName={cn(styles.disclosureButton, \"fontBold radiusSm paddingSm gapSm\")}\n\t\t\t\t\tdata-ui=\"disclosure-toggle\"\n\t\t\t\t\tdata-action={open ? \"collapse-disclosure\" : \"expand-disclosure\"}\n\t\t\t\t\tonClick={() => setOpen((prevOpen) => !prevOpen)}>\n\t\t\t\t\t{open ? <ChevronUpIcon /> : <ChevronDownIcon />}\n\t\t\t\t\t{label}\n\t\t\t\t</button>\n\t\t\t\t{headerActions ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<FlexSpacer />\n\t\t\t\t\t\t{headerActions}\n\t\t\t\t\t</>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{open && (\n\t\t\t\t<div id={panelId} role=\"region\" aria-labelledby={buttonId}>\n\t\t\t\t\t<div className={\"paddingMd\"}>{children}</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Disclosure, DisclosureProps } from \"./Disclosure\";\nimport styles from \"./Disclosure.module.scss\";\n\ninterface DisclosureGroupProps {\n\tchildren?:\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)\n\t\t| (React.ReactElement<DisclosureProps, typeof Disclosure> | null | undefined | false)[];\n\tclassName?: string;\n}\n\n/**\n * Групповой контейнер для нескольких `Disclosure`. Помогает выстраивать последовательный список раскрывающихся секций.\n */\nexport function DisclosureGroup({ className, children }: DisclosureGroupProps) {\n\treturn <div className={cn(styles.disclosureGroup, className)}>{children}</div>;\n}\n"],"mappings":";;;;;;;;;;;;;;;ACoBA,SAAgB,EAAW,EAAE,UAAO,gBAAa,kBAAe,eAA6B;CAC5F,IAAM,CAAC,GAAM,KAAW,EAAS,MAAgB,EAAI,GAC/C,IAAU,EAAM,GAChB,IAAW,EAAM;CAEvB,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,EAAS,SAAS,EAAO,UAAU;EAA1E,UAAA,CACC,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAvB,UAAA,CACC,kBAAC,UAAD;IACC,IAAI;IACJ,MAAK;IACL,iBAAe;IACf,iBAAe;IACf,WAAW,EAAG,EAAO,kBAAkB,mCAAmC;IAC1E,WAAQ;IACR,eAAa,IAAO,wBAAwB;IAC5C,eAAe,GAAS,MAAa,CAAC,CAAQ;IAR/C,UAAA,CASS,EAAP,IAAQ,IAAoB,GAArB,CAAgB,CAAsB,GAC7C,CACM;GACP,CAAA,GAAA,IACA,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD,CAAa,CAAA,GACZ,CACA,EAAA,CAAA,IACC,IACA;EAEJ,CAAA,GAAA,KACA,kBAAC,OAAD;GAAK,IAAI;GAAS,MAAK;GAAS,mBAAiB;GAChD,UAAA,kBAAC,OAAD;IAAK,WAAW;IAAc;GAAc,CAAA;EACxC,CAAA,CAEF;;AAEP;;;ACtCA,SAAgB,EAAgB,EAAE,cAAW,eAAkC;CAC9E,OAAO,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,iBAAiB,CAAS;EAAI;CAAc,CAAA;AAC9E"}
@@ -1,4 +1,4 @@
1
- import { n as e } from "../chunks/input-files-Dcc5K-_1.js";
1
+ import { n as e } from "../chunks/input-files-D1JzSw_Y.js";
2
2
  import { useCallback as t, useMemo as n, useRef as r, useState as i } from "react";
3
3
  import { cn as a, handleKeyboardActivation as o } from "@ryuzaki13/react-foundation-lib/utils";
4
4
  import { UploadIcon as s } from "lucide-react";