@ryuzaki13/react-foundation-ui 1.6.9 → 1.6.10

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 (221) hide show
  1. package/dist/chunks/{TextEditorLexicalClient-Dcd6OD8n.js → TextEditorLexicalClient-CK9nZ-xo.js} +2 -2
  2. package/dist/chunks/{TextEditorLexicalClient-Dcd6OD8n.js.map → TextEditorLexicalClient-CK9nZ-xo.js.map} +1 -1
  3. package/dist/chunks/{date-input-DEHI8-wq.js → date-input-jlNk62cO.js} +2 -2
  4. package/dist/chunks/{date-input-DEHI8-wq.js.map → date-input-jlNk62cO.js.map} +1 -1
  5. package/dist/chunks/{radio-group-BRR1ZQDA.js → radio-group-NhBL3fkD.js} +43 -30
  6. package/dist/chunks/radio-group-NhBL3fkD.js.map +1 -0
  7. package/dist/date-input/index.js +1 -1
  8. package/dist/preset-range-date-input/index.js +1 -1
  9. package/dist/radio-group/RadioGroup.d.ts.map +1 -1
  10. package/dist/radio-group/index.js +1 -1
  11. package/dist/styles.css +1 -1
  12. package/dist/text-editor/index.js +1 -1
  13. package/package.json +1 -1
  14. package/storybook-static/assets/{Badge-BjBJb0mU.js → Badge-DnnIzscV.js} +1 -1
  15. package/storybook-static/assets/{Badge.stories-bIfUH-yy.js → Badge.stories-BHoq-6Hl.js} +1 -1
  16. package/storybook-static/assets/{BadgeList-CSME5ioE.js → BadgeList-D1yZfcj3.js} +1 -1
  17. package/storybook-static/assets/{Button-BPMeIixh.js → Button-CFY0i6K5.js} +1 -1
  18. package/storybook-static/assets/{Button-Co85wvGY.js → Button-Ccjkmsfe.js} +1 -1
  19. package/storybook-static/assets/{Button.stories-B9rrXaof.js → Button.stories-DAiDlLNe.js} +1 -1
  20. package/storybook-static/assets/{CalendarView-BMz3z7jD.js → CalendarView-kmgPHiBr.js} +1 -1
  21. package/storybook-static/assets/{CheckBox-BResPjSq.js → CheckBox-D-Okklnt.js} +1 -1
  22. package/storybook-static/assets/{CheckBox-B72Cmtaf.js → CheckBox-DauEfEu9.js} +1 -1
  23. package/storybook-static/assets/{CheckBox.stories-Cqtm9UBg.js → CheckBox.stories-Dkiw8qFE.js} +1 -1
  24. package/storybook-static/assets/{Color-6AOWCN3U-6zQ0aDDt.js → Color-6AOWCN3U-B4AxDzH3.js} +1 -1
  25. package/storybook-static/assets/{ContextMenu-BV-OLyX_.js → ContextMenu-DbJJ6fqN.js} +1 -1
  26. package/storybook-static/assets/{ContextMenu-C9WykyIU.js → ContextMenu-Di2Fs5Yl.js} +1 -1
  27. package/storybook-static/assets/{ContextMenu.stories-U1W_lMGh.js → ContextMenu.stories-Cpf2GtvP.js} +1 -1
  28. package/storybook-static/assets/DateInput-B8ghw74S.js +1 -0
  29. package/storybook-static/assets/{DateInput-C5w1-hy7.js → DateInput-olBEeMlo.js} +1 -1
  30. package/storybook-static/assets/{DateInput.stories-Dyyz7UMz.js → DateInput.stories-CkPUufbH.js} +1 -1
  31. package/storybook-static/assets/{DateRangePresetSelect-Df0irmdA.js → DateRangePresetSelect-CHqILMyE.js} +1 -1
  32. package/storybook-static/assets/{DateRangePresetSelect-DhMe-m4i.js → DateRangePresetSelect-Cmte_g8w.js} +1 -1
  33. package/storybook-static/assets/{DateRangePresetSelect.stories-CvwoJ7lD.js → DateRangePresetSelect.stories-CpQfW6DV.js} +1 -1
  34. package/storybook-static/assets/{Detail-Cdh9fyyH.js → Detail-BCH_ucGF.js} +1 -1
  35. package/storybook-static/assets/{Detail.stories-B6G_j_6A.js → Detail.stories-BnWXPYnV.js} +1 -1
  36. package/storybook-static/assets/{Dialog-9xARsvHJ.js → Dialog-A3Gs1xTy.js} +1 -1
  37. package/storybook-static/assets/{Dialog-CKNXp8KO.js → Dialog-Bv5IPdD-.js} +1 -1
  38. package/storybook-static/assets/{Dialog.stories-Dre5cUMx.js → Dialog.stories-DXanPD2Y.js} +1 -1
  39. package/storybook-static/assets/{Disclosure-vbRaiYkK.js → Disclosure-B-DUTxbB.js} +1 -1
  40. package/storybook-static/assets/{Disclosure.stories-C4VRChtc.js → Disclosure.stories-D2OJer1r.js} +1 -1
  41. package/storybook-static/assets/{DisclosureGroup-ZZhbeIRB.js → DisclosureGroup-BqXb6GJ3.js} +1 -1
  42. package/storybook-static/assets/{DocsRenderer-JROSPFPF-BHLHzELP.js → DocsRenderer-JROSPFPF-miyuaM_3.js} +1 -1
  43. package/storybook-static/assets/{DropZone-DYD8m-WY.js → DropZone-BMh-7-mB.js} +1 -1
  44. package/storybook-static/assets/{DropZone-CdzJFmF_.js → DropZone-CHjEWnwx.js} +1 -1
  45. package/storybook-static/assets/{DropZone.stories-DRzuE2vU.js → DropZone.stories-Dyy0IWxa.js} +1 -1
  46. package/storybook-static/assets/{DropdownMenu-BdTz_Ptj.js → DropdownMenu-BU_QX2pz.js} +1 -1
  47. package/storybook-static/assets/{ExpandableActionPanel-DEPmrsnk.js → ExpandableActionPanel-BASo0JGw.js} +1 -1
  48. package/storybook-static/assets/{ExpandableActionPanel.stories-BE7mdinl.js → ExpandableActionPanel.stories-BbRAYtSA.js} +1 -1
  49. package/storybook-static/assets/{Flex-XJLvKVvt.js → Flex-mgZeAymN.js} +1 -1
  50. package/storybook-static/assets/{Flex.stories-BSuqTMzF.js → Flex.stories-Dlggi_9g.js} +1 -1
  51. package/storybook-static/assets/{FloatingPopover-knMoS2qC.js → FloatingPopover-CLP6oMZ6.js} +1 -1
  52. package/storybook-static/assets/{FormattedTableCell-BfFlODcQ.js → FormattedTableCell-BSHTgPMG.js} +1 -1
  53. package/storybook-static/assets/{Grid-BQhpngv4.js → Grid-C1QhUZ48.js} +1 -1
  54. package/storybook-static/assets/{Grid.stories-D_y1SBc8.js → Grid.stories-CVWT3Ci0.js} +1 -1
  55. package/storybook-static/assets/{ImageCropper.stories-FZOA4MDm.js → ImageCropper.stories-B4TCmmi-.js} +1 -1
  56. package/storybook-static/assets/{ImageRenderer-YCNRUsf3.js → ImageRenderer-DG95Genl.js} +1 -1
  57. package/storybook-static/assets/{ImageRenderer.stories-w_O5AorR.js → ImageRenderer.stories-CdGgwPFd.js} +1 -1
  58. package/storybook-static/assets/{ImageView.stories-DHpZpY6i.js → ImageView.stories-CN3pGawv.js} +1 -1
  59. package/storybook-static/assets/{ImageViewer.stories-DVur88oi.js → ImageViewer.stories-CJcY-lKw.js} +2 -2
  60. package/storybook-static/assets/{ImageViewerRuntime-DHsDOTkI.js → ImageViewerRuntime-Cq66TmOq.js} +1 -1
  61. package/storybook-static/assets/{Input-cLIPWJ3S.js → Input-D_ZgMF5i.js} +1 -1
  62. package/storybook-static/assets/{Input-DmyHUqFK.js → Input-NY67M82H.js} +1 -1
  63. package/storybook-static/assets/{Input.stories-DKi7fLm4.js → Input.stories-BATUG7aL.js} +1 -1
  64. package/storybook-static/assets/{InputDateTime-0x_60nGl.js → InputDateTime-DPSeogym.js} +1 -1
  65. package/storybook-static/assets/{InputDateTime.stories--EVU3NN2.js → InputDateTime.stories-DRfLZgCH.js} +1 -1
  66. package/storybook-static/assets/{InputFile-iHlVGdes.js → InputFile-8n7UMrhQ.js} +1 -1
  67. package/storybook-static/assets/{InputFile-BsJB40TL.js → InputFile-P1CoCcBa.js} +1 -1
  68. package/storybook-static/assets/{InputFile.stories-CCHijHkw.js → InputFile.stories-C2k4Vgkg.js} +1 -1
  69. package/storybook-static/assets/{InputFiles-CUWYjhS9.js → InputFiles-BBni3vyF.js} +1 -1
  70. package/storybook-static/assets/{InputFiles-B8KyPoQv.js → InputFiles-BaekSGF2.js} +1 -1
  71. package/storybook-static/assets/{InputFiles.stories-DKvTOpt2.js → InputFiles.stories-CTxT59Tw.js} +1 -1
  72. package/storybook-static/assets/{InputFilesList-D234NNsd.js → InputFilesList-pMmnnjMt.js} +1 -1
  73. package/storybook-static/assets/{InputImage-BLuKH0cM.js → InputImage-CXi6p_v_.js} +1 -1
  74. package/storybook-static/assets/{InputImage-BZBVXOzi.js → InputImage-JlbbfGfE.js} +1 -1
  75. package/storybook-static/assets/{InputImage.stories-CGyRVsxr.js → InputImage.stories-Cb_preM7.js} +1 -1
  76. package/storybook-static/assets/{InteractiveComponents-CZAi65Yc.js → InteractiveComponents-Bc8Xhhjx.js} +1 -1
  77. package/storybook-static/assets/{InteractiveComponents.stories-Dr_qTuv_.js → InteractiveComponents.stories-CEQD-5ax.js} +1 -1
  78. package/storybook-static/assets/{LayoutPicker-oODyGDhs.js → LayoutPicker-CzTXHZ99.js} +1 -1
  79. package/storybook-static/assets/{LayoutPicker-BJC6CkZA.js → LayoutPicker-DUFqKx3a.js} +1 -1
  80. package/storybook-static/assets/{LayoutPicker.stories-B7SBNaJ5.js → LayoutPicker.stories-CFrH1_Lp.js} +1 -1
  81. package/storybook-static/assets/{Listbox-B0oP0kP_.js → Listbox-BqN5IF-5.js} +1 -1
  82. package/storybook-static/assets/{Listbox-4deIYtd5.js → Listbox-BzaFkRhh.js} +1 -1
  83. package/storybook-static/assets/{Listbox.stories-DBsGzxTf.js → Listbox.stories-BWTPmMmD.js} +1 -1
  84. package/storybook-static/assets/{Modal-DmvMGAbn.js → Modal-B4D-veXg.js} +1 -1
  85. package/storybook-static/assets/{Modal.stories-B5m-QmoV.js → Modal.stories-Cmzg1A84.js} +1 -1
  86. package/storybook-static/assets/{ModalManagerProvider-BrXUxhsr.js → ModalManagerProvider-qUFPZmq_.js} +1 -1
  87. package/storybook-static/assets/{MultiSelect-GauKopyh.js → MultiSelect-Dg7QHYhM.js} +1 -1
  88. package/storybook-static/assets/{MultiSelect-z7BbE2br.js → MultiSelect-aXpgpeWb.js} +1 -1
  89. package/storybook-static/assets/{MultiSelect.stories-Bkv3L4gA.js → MultiSelect.stories-BGyVF8sg.js} +1 -1
  90. package/storybook-static/assets/{NoData-DzRjocEa.js → NoData-PhEXKwAq.js} +1 -1
  91. package/storybook-static/assets/{NotificationsHost-DnaDUaBo.js → NotificationsHost-D-vnN-hh.js} +1 -1
  92. package/storybook-static/assets/{NotificationsHost.stories-kMde5O1r.js → NotificationsHost.stories-B84iG1qJ.js} +1 -1
  93. package/storybook-static/assets/{ODataMultiSelect-Bxwuucyq.js → ODataMultiSelect-rAhzZ09q.js} +1 -1
  94. package/storybook-static/assets/{ODataMultiSelect.stories-BZ9GpyO6.js → ODataMultiSelect.stories-BgRLp_ST.js} +1 -1
  95. package/storybook-static/assets/{ODataSelect-B3YW1vMn.js → ODataSelect-CG54trvM.js} +1 -1
  96. package/storybook-static/assets/{ODataSelect.stories-DdZPvlZQ.js → ODataSelect.stories-COep43rf.js} +1 -1
  97. package/storybook-static/assets/{ODataTreeMultiSelect-ABvp9Jw2.js → ODataTreeMultiSelect-DLf6k0wp.js} +1 -1
  98. package/storybook-static/assets/{ODataTreeMultiSelect.stories-BpA3BGs6.js → ODataTreeMultiSelect.stories-gy2rxVB_.js} +1 -1
  99. package/storybook-static/assets/{ODataTreeSelect-Dd4cEOJ2.js → ODataTreeSelect-Ci9LIOir.js} +1 -1
  100. package/storybook-static/assets/{ODataTreeSelect.stories-D0jNx9Fx.js → ODataTreeSelect.stories-BnvUjPcq.js} +1 -1
  101. package/storybook-static/assets/{OneStepScroller-LWKPQ4zF.js → OneStepScroller-1mihvlxv.js} +1 -1
  102. package/storybook-static/assets/{PeriodSelect-CUZPOFyO.js → PeriodSelect-B2Hg1mxE.js} +1 -1
  103. package/storybook-static/assets/{PeriodSelect-DQuQU6G9.js → PeriodSelect-CCrS6vvE.js} +1 -1
  104. package/storybook-static/assets/{PeriodSelect.stories-D1wcws2m.js → PeriodSelect.stories-7EzhEf6n.js} +1 -1
  105. package/storybook-static/assets/{PickerSelectionToolbar-BrcD45PX.js → PickerSelectionToolbar-Cnid4alk.js} +1 -1
  106. package/storybook-static/assets/{PickerTriggerActions-DXHW51rc.js → PickerTriggerActions-Dzm0fGlQ.js} +1 -1
  107. package/storybook-static/assets/{Popover-W94COpwE.js → Popover-Ch6HySgl.js} +1 -1
  108. package/storybook-static/assets/{Popover-Dqz0kSoL.js → Popover-DvelaPQh.js} +1 -1
  109. package/storybook-static/assets/{Popover.stories-VVPYIdc2.js → Popover.stories-BR5BVyoa.js} +1 -1
  110. package/storybook-static/assets/{PresetRangeDateInput-CzXyY5S_.js → PresetRangeDateInput-GplH0r6a.js} +1 -1
  111. package/storybook-static/assets/{PresetRangeDateInput-BueHzRgF.js → PresetRangeDateInput-QHtNyYJA.js} +1 -1
  112. package/storybook-static/assets/{PresetRangeDateInput.stories-CtZCYqqV.js → PresetRangeDateInput.stories-BVmvAtuU.js} +1 -1
  113. package/storybook-static/assets/{PresetSelect-C1qu4z5K.js → PresetSelect-BXi0TbMc.js} +1 -1
  114. package/storybook-static/assets/{RadioButton-BK7izxPZ.js → RadioButton-BLiATOSQ.js} +1 -1
  115. package/storybook-static/assets/{RadioButton-C1ifDEJ8.js → RadioButton-BMiNe9MX.js} +1 -1
  116. package/storybook-static/assets/{RadioButton.stories-D0WqG_6J.js → RadioButton.stories-DTTGcMA9.js} +1 -1
  117. package/storybook-static/assets/{RadioGroup-C9PyWYee.js → RadioGroup-C6AVoBON.js} +1 -1
  118. package/storybook-static/assets/RadioGroup-D7MClwWV.js +1 -0
  119. package/storybook-static/assets/RadioGroup-FhI9JeuU.css +1 -0
  120. package/storybook-static/assets/{RadioGroup.stories-cekjemmK.js → RadioGroup.stories-B3U4iHk3.js} +1 -1
  121. package/storybook-static/assets/{Scrollable-DcHx886P.js → Scrollable-CJW4TGT-.js} +1 -1
  122. package/storybook-static/assets/{Select-CBMrYzkw.js → Select-40dnhr2I.js} +1 -1
  123. package/storybook-static/assets/{Select-BoTu6Otb.js → Select-Dc3hr9Jz.js} +1 -1
  124. package/storybook-static/assets/{Select.stories-3hgLOUNU.js → Select.stories-B8naPyjC.js} +1 -1
  125. package/storybook-static/assets/{SelectOptionContent-DqKMbr5G.js → SelectOptionContent-DIGFQAWX.js} +1 -1
  126. package/storybook-static/assets/{SerializableSelect-CYcxpdIe.js → SerializableSelect-DqnkMj5o.js} +1 -1
  127. package/storybook-static/assets/{SerializableSelect.stories-CnZnjtjD.js → SerializableSelect.stories-CuRa1-Ro.js} +1 -1
  128. package/storybook-static/assets/{SingleDateTimeInput-rbNU_KO-.js → SingleDateTimeInput-CIdjXTPm.js} +1 -1
  129. package/storybook-static/assets/{SingleDateTimeInput-DMfEsPu5.js → SingleDateTimeInput-nMQCuT7L.js} +1 -1
  130. package/storybook-static/assets/{SingleDateTimeInput.stories-TgTOUo-Y.js → SingleDateTimeInput.stories-B7cRNcF9.js} +1 -1
  131. package/storybook-static/assets/{Slider-DCIIkWz_.js → Slider-DeAmWQO_.js} +1 -1
  132. package/storybook-static/assets/{Slider-Dxecri8F.js → Slider-eYsdAZH7.js} +1 -1
  133. package/storybook-static/assets/{Slider.stories-BRipjSIm.js → Slider.stories-Cr7MTPFV.js} +1 -1
  134. package/storybook-static/assets/{SliderInput-PQ5uxXHE.js → SliderInput-B2RO08h8.js} +1 -1
  135. package/storybook-static/assets/{SliderInput-TPGWb2cl.js → SliderInput-DcPYxz0m.js} +1 -1
  136. package/storybook-static/assets/{SliderInput.stories-CmANlT0P.js → SliderInput.stories-Bi4W590S.js} +1 -1
  137. package/storybook-static/assets/{Sortable-DAjL5x6G.js → Sortable-CjF1l2MO.js} +1 -1
  138. package/storybook-static/assets/{Sortable.stories-Dl2wApfw.js → Sortable.stories-D5UmA1pJ.js} +1 -1
  139. package/storybook-static/assets/{Splitter-BHBHUJKu.js → Splitter-YR2rAfco.js} +1 -1
  140. package/storybook-static/assets/{Splitter.stories-Nj66s6aD.js → Splitter.stories-8jBFEiH3.js} +1 -1
  141. package/storybook-static/assets/{StateSelect-BfQIK04A.js → StateSelect-CnHu_xAW.js} +1 -1
  142. package/storybook-static/assets/{StateSelect-CHXGACeH.js → StateSelect-DmzwKn-U.js} +1 -1
  143. package/storybook-static/assets/{StateSelect.stories-DXiKDU0l.js → StateSelect.stories-CZlHA-Fl.js} +1 -1
  144. package/storybook-static/assets/{StringToggle.stories-DaCHu-59.js → StringToggle.stories-CVdgIzhD.js} +1 -1
  145. package/storybook-static/assets/{Switch-BY9fB1md.js → Switch-CxeG787q.js} +1 -1
  146. package/storybook-static/assets/{Switch-Ct_ConVp.js → Switch-E68YY2rp.js} +1 -1
  147. package/storybook-static/assets/{Switch.stories-JemVigGs.js → Switch.stories-DDlniUif.js} +1 -1
  148. package/storybook-static/assets/{Table-C-7NAuof.js → Table-G4VubWji.js} +1 -1
  149. package/storybook-static/assets/{Table.stories-Ch8DZ1Er.js → Table.stories-D2n_Y5vc.js} +1 -1
  150. package/storybook-static/assets/{Tabs-5dAPoFdD.js → Tabs-C2n0v5po.js} +1 -1
  151. package/storybook-static/assets/{Tabs.stories-8N-qDmwD.js → Tabs.stories-BzrndKOk.js} +1 -1
  152. package/storybook-static/assets/{TabsBox-ah2I0RzK.js → TabsBox-DdaJEuvL.js} +1 -1
  153. package/storybook-static/assets/{TagInput-BSBy6FGI.js → TagInput-CKb9ceOo.js} +1 -1
  154. package/storybook-static/assets/{TagInput.stories-Cp4NH6uS.js → TagInput.stories-D_dlbmh2.js} +1 -1
  155. package/storybook-static/assets/{Text-Zfl1pnOB.js → Text-D3ywiBsZ.js} +1 -1
  156. package/storybook-static/assets/{Textarea-CQ5OWkWr.js → Textarea-Bk4KZGKW.js} +1 -1
  157. package/storybook-static/assets/{Textarea-Ci63XMCS.js → Textarea-D48QOI9G.js} +1 -1
  158. package/storybook-static/assets/{Textarea.stories-x8s51N7A.js → Textarea.stories-CGktrasz.js} +1 -1
  159. package/storybook-static/assets/{TimePanel-VuyMHXDo.js → TimePanel-Dwdp8Rux.js} +1 -1
  160. package/storybook-static/assets/{TimePanel.stories-BcH1OpQi.js → TimePanel.stories-DFZS8o8M.js} +1 -1
  161. package/storybook-static/assets/{Toggle-aHeH-OSg.js → Toggle-BOYRoy4d.js} +1 -1
  162. package/storybook-static/assets/{Toggle-6WG03vXI.js → Toggle-BZSRDrip.js} +1 -1
  163. package/storybook-static/assets/{Toggle.stories-DXCkI5KF.js → Toggle.stories-BHFWDyUf.js} +1 -1
  164. package/storybook-static/assets/{TreeMultiSelect-CXLNh_oz.js → TreeMultiSelect-CQZdepaf.js} +1 -1
  165. package/storybook-static/assets/{TreeMultiSelect-Y9IFldJK.js → TreeMultiSelect-DvmPJ57x.js} +1 -1
  166. package/storybook-static/assets/{TreeMultiSelect.stories-B0kD_upG.js → TreeMultiSelect.stories-DhICY4PY.js} +1 -1
  167. package/storybook-static/assets/{TreePickerBase-CahwOsJC.js → TreePickerBase-BjA8T07X.js} +1 -1
  168. package/storybook-static/assets/{TreeSelect-BP7Vf-2A.js → TreeSelect-Cj1pwNqe.js} +1 -1
  169. package/storybook-static/assets/{TreeSelect-DvH-ZFOI.js → TreeSelect-tXVS8YG0.js} +1 -1
  170. package/storybook-static/assets/{TreeSelect.stories-CgWNFu8e.js → TreeSelect.stories-tiHcI5io.js} +1 -1
  171. package/storybook-static/assets/{TreeTable-CIC71Y88.js → TreeTable-D_uAcnNc.js} +1 -1
  172. package/storybook-static/assets/{TreeTable.stories-_Dq5sw-X.js → TreeTable.stories-93B5XKxY.js} +1 -1
  173. package/storybook-static/assets/{async-DJAT8q-R.js → async-DEUD6n36.js} +1 -1
  174. package/storybook-static/assets/{blocks-D9lz1ATD.js → blocks-BcMkLvd1.js} +3 -3
  175. package/storybook-static/assets/{browserAndReact-C6DrL5k_.js → browserAndReact-qKlFbjJj.js} +1 -1
  176. package/storybook-static/assets/{check-D-pRbifd.js → check-3-SRFJyA.js} +1 -1
  177. package/storybook-static/assets/{chevron-down-BAJeUu08.js → chevron-down-BZbfqBQh.js} +1 -1
  178. package/storybook-static/assets/{chevron-left-HD9WWs57.js → chevron-left-_vcKuAp5.js} +1 -1
  179. package/storybook-static/assets/{chevron-right-CZrNP4jX.js → chevron-right-BAAXYJ2E.js} +1 -1
  180. package/storybook-static/assets/{chunk-W22LQPXL-Dx-maav9.js → chunk-W22LQPXL-CfL2PyUl.js} +1 -1
  181. package/storybook-static/assets/{circle-alert-BFyuxfnG.js → circle-alert-DTPBhENY.js} +1 -1
  182. package/storybook-static/assets/{circle-check-Dq-oIKf6.js → circle-check-D7b8E3mW.js} +1 -1
  183. package/storybook-static/assets/{components-CUSaaeSo.js → components-BnZIwq8w.js} +3 -3
  184. package/storybook-static/assets/{contextMenu-D5WMcaLg.js → contextMenu-pvmuHe53.js} +1 -1
  185. package/storybook-static/assets/{defaultRenderers-CAnjhfBP.js → defaultRenderers-D6T6JpdW.js} +1 -1
  186. package/storybook-static/assets/{download-C_38uliq.js → download-lwI8cHgy.js} +1 -1
  187. package/storybook-static/assets/{filesAndExcel-Bekt15pL.js → filesAndExcel-Q-wmkH6Y.js} +1 -1
  188. package/storybook-static/assets/{floating-ui.react-DoVJpX2x.js → floating-ui.react-DLR5jnN2.js} +1 -1
  189. package/storybook-static/assets/{formatters-BRSUcXAN.js → formatters-CWktRR9z.js} +1 -1
  190. package/storybook-static/assets/{formatters-runtime-CF_Luo6h.js → formatters-runtime-D6QFFJBF.js} +1 -1
  191. package/storybook-static/assets/{foundationLib-BDGsEERi.js → foundationLib-B7nxMYYh.js} +1 -1
  192. package/storybook-static/assets/{hooks-BCpfqVmW.js → hooks-BWUDxzY0.js} +1 -1
  193. package/storybook-static/assets/iframe-B72v60rl.js +1 -0
  194. package/storybook-static/assets/{iframe-B47EHFYA.js → iframe-CIellu9v.js} +3 -3
  195. package/storybook-static/assets/{info-CO0GTW6b.js → info-CuoGznVe.js} +1 -1
  196. package/storybook-static/assets/{odata-BsYWUKHK.js → odata-Cq0bbI-3.js} +1 -1
  197. package/storybook-static/assets/{odataAndTables-BeDyprZ5.js → odataAndTables-C0h3xqdz.js} +1 -1
  198. package/storybook-static/assets/{odataFetchFn-CQDzz9jw.js → odataFetchFn-CY1sR78d.js} +1 -1
  199. package/storybook-static/assets/{odataStoryFixtures-Lbk9-G1n.js → odataStoryFixtures-_HZ5M5fp.js} +1 -1
  200. package/storybook-static/assets/{persisted-n9lLAGen.js → persisted-CIHYsH5h.js} +1 -1
  201. package/storybook-static/assets/{pureUtilities-Cjep-9ME.js → pureUtilities-Dv18ql_4.js} +1 -1
  202. package/storybook-static/assets/{react-Dum50wFM.js → react-CLuaYg_3.js} +1 -1
  203. package/storybook-static/assets/{refresh-cw-Z-vaBKRi.js → refresh-cw-CFCqE9XP.js} +1 -1
  204. package/storybook-static/assets/{runtimeAndState-Bpzlfw-r.js → runtimeAndState-S43KHhCI.js} +1 -1
  205. package/storybook-static/assets/{settings-2-jRmpHiGC.js → settings-2-CzNtf8Lk.js} +1 -1
  206. package/storybook-static/assets/{sortable-0-RVrtIo.js → sortable-DA9DwkQa.js} +1 -1
  207. package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-DpT8XIiL.js → syntaxhighlighter-T5IQBZDB-C1KV56kZ.js} +1 -1
  208. package/storybook-static/assets/{trash-2-Bzm5QETq.js → trash-2-D56gwmuR.js} +1 -1
  209. package/storybook-static/assets/{triangle-alert-CSo2X-iA.js → triangle-alert-CgwCAcNK.js} +1 -1
  210. package/storybook-static/assets/{useODataSelectBase-CET7yfip.js → useODataSelectBase-aQn55F6I.js} +1 -1
  211. package/storybook-static/assets/{useODataTreeData-BZz-oUoz.js → useODataTreeData-CSlbz8V8.js} +1 -1
  212. package/storybook-static/assets/{usePickerQuery-He2zO5LX.js → usePickerQuery-C-D9DFII.js} +1 -1
  213. package/storybook-static/assets/{usePickerTriggerController-CZp4AJvd.js → usePickerTriggerController-BlJxBmyk.js} +1 -1
  214. package/storybook-static/assets/{x-WX7BqMFr.js → x-BqKLZDBl.js} +1 -1
  215. package/storybook-static/iframe.html +2 -2
  216. package/storybook-static/project.json +1 -1
  217. package/dist/chunks/radio-group-BRR1ZQDA.js.map +0 -1
  218. package/storybook-static/assets/DateInput-DaTeTS3s.js +0 -1
  219. package/storybook-static/assets/RadioGroup-DJ1xoaNp.css +0 -1
  220. package/storybook-static/assets/RadioGroup-omXMMa0q.js +0 -1
  221. package/storybook-static/assets/iframe-vD_yRY8M.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"date-input-DEHI8-wq.js","names":[],"sources":["../../src/date-input/lib/dateInputValue.ts","../../src/date-input/model/useDateInput.ts","../../src/date-input/ui/DateInput.module.scss","../../src/date-input/ui/DateInput.tsx"],"sourcesContent":["import {\n\tDEFAULT_DATE_PRESET_NAMES,\n\tformatDate,\n\tformatDateRange,\n\tgetCalendarPeriod,\n\tgetDatePreset,\n\tisDateRangeTuple,\n\tparseDateByFormat,\n\tresolveDateFormatName,\n\ttype CalendarPeriodOptions,\n\ttype DateFormatPrecision,\n\ttype DateRangeInput,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Пресет даты по умолчанию для текстового поля.\n */\nexport const DEFAULT_DATE_INPUT_PRESET = DEFAULT_DATE_PRESET_NAMES.date;\n\n/**\n * @deprecated Используйте `DEFAULT_DATE_INPUT_PRESET`.\n */\nexport const DEFAULT_DATE_INPUT_FORMAT = \"dd.MM.yyyy\";\n\nconst RANGE_SEPARATOR = \" - \";\n\nexport type DateInputValueOptions = {\n\t/**\n\t * Имя пресета форматирования даты.\n\t */\n\tdatePreset?: string;\n\t/**\n\t * Точность календарного значения.\n\t */\n\tdatePickerLevel?: DateFormatPrecision;\n\t/**\n\t * Размер периода, который выбирается и нормализуется полем.\n\t */\n\tselectionMode?: CalendarPeriodOptions[\"selectionMode\"];\n\t/**\n\t * Последний включённый день недели для режима выбора недели.\n\t */\n\tweekEndDay?: CalendarPeriodOptions[\"weekEndDay\"];\n\t/**\n\t * Опорная дата для пресетов без года, например `month-long`.\n\t */\n\treferenceDate?: Date;\n};\n\nexport type DateInputValueOptionsInput = string | DateInputValueOptions | undefined;\n\n/**\n * Возвращает точность форматирования поля даты.\n */\nfunction resolveDateInputPrecision(options: DateInputValueOptions): DateFormatPrecision {\n\tif (options.selectionMode === \"day\" || options.selectionMode === \"week\") {\n\t\treturn \"day\";\n\t}\n\n\tif (options.selectionMode === \"month\" || options.selectionMode === \"year\") {\n\t\treturn options.selectionMode;\n\t}\n\n\treturn options.datePickerLevel ?? \"day\";\n}\n\nfunction resolveCalendarPeriodOptions(options?: DateInputValueOptions): CalendarPeriodOptions {\n\treturn {\n\t\tselectionMode: options?.selectionMode,\n\t\tweekEndDay: options?.weekEndDay\n\t};\n}\n\n/**\n * Нормализует объектные опции и позиционный вызов с именем пресета.\n */\nfunction normalizeDateInputValueOptions(\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): DateInputValueOptions {\n\tif (typeof optionsOrPreset === \"string\" || optionsOrPreset === undefined) {\n\t\treturn {\n\t\t\tdatePreset: optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\tif (datePickerLevel && optionsOrPreset.datePickerLevel === undefined) {\n\t\treturn {\n\t\t\t...optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\treturn optionsOrPreset;\n}\n\n/**\n * Проверяет новый `datePreset` и возвращает только зарегистрированное имя пресета.\n */\nfunction resolveDateInputPresetName(datePreset?: string): string {\n\tconst resolvedPresetName = resolveDateFormatName(datePreset, DEFAULT_DATE_INPUT_PRESET);\n\treturn getDatePreset(resolvedPresetName) ? resolvedPresetName : DEFAULT_DATE_INPUT_PRESET;\n}\n\n/**\n * Приводит результат универсального парсинга к календарной дате.\n */\nfunction parseDateTimeValue(value: string, options: DateInputValueOptions): Date | null {\n\treturn (\n\t\tparseDateByFormat(value, resolveDateInputPresetName(options.datePreset), {\n\t\t\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\t\t\tprecision: resolveDateInputPrecision(options),\n\t\t\treferenceDate: options.referenceDate\n\t\t})?.date ?? null\n\t);\n}\n\n/**\n * Приводит одиночную дату к началу выбранного календарного периода.\n */\nexport function normalizeSingleDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.start ?? null;\n}\n\n/**\n * Приводит диапазон дат к границам выбранных календарных периодов.\n */\nexport function normalizeRangeDateValue(range: NullableDateRange | null, options?: DateInputValueOptions): NullableDateRange | null {\n\tif (!isDateRangeTuple(range)) return null;\n\n\tconst [startDate, endDate] = range;\n\treturn [normalizeSingleDateValue(startDate, options), normalizeRangeEndDateValue(endDate, options)];\n}\n\n/**\n * Приводит конечную дату диапазона к концу выбранного календарного периода.\n */\nexport function normalizeRangeEndDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.end ?? null;\n}\n\nfunction getDateTime(date: Date | null): number | null {\n\treturn date?.getTime() ?? null;\n}\n\n/**\n * Сравнивает одиночные даты после нормализации к точности поля ввода.\n */\nexport function areSingleDateValuesEqual(left: Date | null, right: Date | null, options?: DateInputValueOptions): boolean {\n\treturn getDateTime(normalizeSingleDateValue(left, options)) === getDateTime(normalizeSingleDateValue(right, options));\n}\n\n/**\n * Сравнивает диапазоны дат после нормализации к границам выбранных периодов.\n */\nexport function areRangeDateValuesEqual(\n\tleft: NullableDateRange | null,\n\tright: NullableDateRange | null,\n\toptions?: DateInputValueOptions\n): boolean {\n\tconst normalizedLeft = normalizeRangeDateValue(left, options);\n\tconst normalizedRight = normalizeRangeDateValue(right, options);\n\n\treturn (\n\t\tgetDateTime(normalizedLeft?.[0] ?? null) === getDateTime(normalizedRight?.[0] ?? null) &&\n\t\tgetDateTime(normalizedLeft?.[1] ?? null) === getDateTime(normalizedRight?.[1] ?? null)\n\t);\n}\n\n/**\n * Форматирует одиночную дату для текстового поля.\n */\nexport function formatSingleDateValue(\n\tdate: Date | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!date) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst period = getCalendarPeriod(date, resolveCalendarPeriodOptions(options));\n\n\t// Single-поле хранит начало недели, но показывает обе включительные границы выбранного периода.\n\tif (options.selectionMode === \"week\" && period) {\n\t\treturn formatDateRange(period.start, period.end, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\treturn formatDate(date, resolveDateInputPresetName(options.datePreset), {\n\t\tprecision: resolveDateInputPrecision(options)\n\t});\n}\n\n/**\n * Форматирует диапазон дат для текстового поля.\n */\nexport function formatRangeDateValue(\n\trange: NullableDateRange | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!isDateRangeTuple(range)) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startDate, endDate] = range;\n\tif (startDate && endDate) {\n\t\treturn formatDateRange(startDate, endDate, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\tif (startDate) {\n\t\treturn `${formatDate(startDate, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t})}${RANGE_SEPARATOR}`;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Унифицирует форматирование значения поля даты.\n */\nexport function formatDateInputValue(\n\tvalue: DateRangeInput,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (isDateRangeTuple(value)) {\n\t\treturn formatRangeDateValue(value, optionsOrPreset, datePickerLevel);\n\t}\n\n\treturn formatSingleDateValue(value, optionsOrPreset, datePickerLevel);\n}\n\n/**\n * Парсит строку одиночной даты по заданному пресету.\n */\nexport function parseSingleDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\t// Для отображаемого диапазона single-week источником значения остаётся его первая граница.\n\tconst singleValue = options.selectionMode === \"week\" ? (value.split(RANGE_SEPARATOR)[0] ?? \"\") : value;\n\n\treturn normalizeSingleDateValue(parseDateTimeValue(singleValue, options), options);\n}\n\n/**\n * Парсит строку диапазона дат по заданному пресету.\n */\nexport function parseRangeDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): NullableDateRange {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startPart = \"\", endPart = \"\"] = value.split(RANGE_SEPARATOR);\n\n\treturn [parseSingleDateValue(startPart, options), parseRangeEndDateValue(endPart, options)];\n}\n\n/**\n * Парсит конечную дату диапазона и нормализует её к концу суток.\n */\nexport function parseRangeEndDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\treturn normalizeRangeEndDateValue(parseDateTimeValue(value, options), options);\n}\n","import { useMemo, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport {\n\tDateInputValueOptions,\n\tformatDateInputValue,\n\tnormalizeRangeDateValue,\n\tnormalizeRangeEndDateValue,\n\tnormalizeSingleDateValue,\n\tparseRangeDateValue,\n\tparseSingleDateValue,\n\ttype DateInputOptions\n} from \"../lib\";\n\nfunction resolveReferenceDate(value: Date | NullableDateRange | null): Date | undefined {\n\tif (isDateRangeTuple(value)) {\n\t\treturn value[0] ?? value[1] ?? undefined;\n\t}\n\n\treturn value ?? undefined;\n}\n\n/**\n * Хук управляет текстовым представлением и выбранным значением поля даты.\n */\nexport const useDateInput = (options: DateInputOptions) => {\n\tconst externalSelectedDate = useMemo(() => {\n\t\tconst selectionOptions: DateInputValueOptions = {\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn normalizeRangeDateValue(options.value as NullableDateRange | null, selectionOptions);\n\t\t}\n\n\t\treturn normalizeSingleDateValue(options.value as Date | null, selectionOptions);\n\t}, [options.selectsRange, options.selectionMode, options.value, options.weekEndDay]);\n\tconst formatOptions = useMemo<DateInputValueOptions>(\n\t\t() => ({\n\t\t\tdatePreset: options.datePreset,\n\t\t\tdatePickerLevel: options.datePickerLevel,\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t}),\n\t\t[options.datePickerLevel, options.datePreset, options.selectionMode, options.weekEndDay]\n\t);\n\tconst externalInputValue = formatDateInputValue(externalSelectedDate, formatOptions);\n\tconst externalStateSignature = JSON.stringify([\n\t\toptions.selectsRange,\n\t\toptions.datePreset ?? null,\n\t\toptions.datePickerLevel ?? null,\n\t\toptions.selectionMode ?? null,\n\t\toptions.weekEndDay ?? null,\n\t\tisDateRangeTuple(externalSelectedDate)\n\t\t\t? [externalSelectedDate[0]?.getTime() ?? null, externalSelectedDate[1]?.getTime() ?? null]\n\t\t\t: (externalSelectedDate?.getTime() ?? null)\n\t]);\n\tconst [draftState, setDraftState] = useState(() => ({\n\t\tsourceSignature: externalStateSignature,\n\t\tselectedDate: externalSelectedDate,\n\t\tinputValue: externalInputValue\n\t}));\n\tconst hasCurrentDraft = draftState.sourceSignature === externalStateSignature;\n\tconst selectedDate = hasCurrentDraft ? draftState.selectedDate : externalSelectedDate;\n\tconst inputValue = hasCurrentDraft ? draftState.inputValue : externalInputValue;\n\n\t/**\n\t * Сохраняет пользовательский текст только относительно текущего controlled-снимка.\n\t * При внешней смене value или формата отображение сразу выводится из новых props.\n\t */\n\tconst setInputValue = (nextInputValue: string) => {\n\t\tsetDraftState((currentState) => {\n\t\t\tconst currentSelectedDate =\n\t\t\t\tcurrentState.sourceSignature === externalStateSignature ? currentState.selectedDate : externalSelectedDate;\n\n\t\t\treturn {\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: currentSelectedDate,\n\t\t\t\tinputValue: nextInputValue\n\t\t\t};\n\t\t});\n\t};\n\n\t/**\n\t * Обновляет локальный незавершённый выбор, не зеркаля controlled value через effect.\n\t */\n\tconst setSelectedDate = (nextSelectedDate: Date | NullableDateRange | null) => {\n\t\tsetDraftState((currentState) => {\n\t\t\tconst currentInputValue =\n\t\t\t\tcurrentState.sourceSignature === externalStateSignature ? currentState.inputValue : externalInputValue;\n\n\t\t\treturn {\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: nextSelectedDate,\n\t\t\t\tinputValue: currentInputValue\n\t\t\t};\n\t\t});\n\t};\n\n\t/**\n\t * Форматирует значение поля даты согласно текущему пресету.\n\t */\n\tconst formatValue = (value: Date | NullableDateRange | null): string => formatDateInputValue(value, formatOptions);\n\n\t/**\n\t * Парсит строковое значение поля в дату или диапазон дат.\n\t */\n\tconst parseDate = (dateString: string): Date | NullableDateRange | null => {\n\t\tconst parseOptions: DateInputValueOptions = {\n\t\t\t...formatOptions,\n\t\t\treferenceDate: resolveReferenceDate(selectedDate)\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn parseRangeDateValue(dateString, parseOptions);\n\t\t}\n\n\t\treturn parseSingleDateValue(dateString, parseOptions);\n\t};\n\n\t/**\n\t * Обрабатывает выбор даты из календаря.\n\t */\n\tconst handleSelect = (date: Date | NullableDateRange) => {\n\t\tconst [selectedStartDate, selectedEndDate] = (Array.isArray(date) ? date : [date, null]) as NullableDateRange;\n\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedStartDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\t\tconst normalizedEndDate = normalizeRangeEndDateValue(selectedEndDate, formatOptions);\n\n\t\t\tif (normalizedStartDate && normalizedEndDate) {\n\t\t\t\tif (normalizedEndDate < normalizedStartDate) {\n\t\t\t\t\tconst swappedRange: NullableDateRange = [\n\t\t\t\t\t\tnormalizeSingleDateValue(selectedEndDate, formatOptions),\n\t\t\t\t\t\tnormalizeRangeEndDateValue(selectedStartDate, formatOptions)\n\t\t\t\t\t];\n\t\t\t\t\tsetDraftState({\n\t\t\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\t\t\tselectedDate: swappedRange,\n\t\t\t\t\t\tinputValue: formatValue(swappedRange)\n\t\t\t\t\t});\n\t\t\t\t\toptions.onChange(swappedRange);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, normalizedEndDate];\n\t\t\t\t\tsetDraftState({\n\t\t\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\t\t\tselectedDate: nextRange,\n\t\t\t\t\t\tinputValue: formatValue(nextRange)\n\t\t\t\t\t});\n\t\t\t\t\toptions.onChange(nextRange);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, null];\n\t\t\tsetDraftState({\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: nextRange,\n\t\t\t\tinputValue: formatValue(nextRange)\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\tsetDraftState({\n\t\t\tsourceSignature: externalStateSignature,\n\t\t\tselectedDate: normalizedDate,\n\t\t\tinputValue: formatValue(normalizedDate)\n\t\t});\n\t\toptions.onChange(normalizedDate);\n\n\t\treturn true;\n\t};\n\n\treturn {\n\t\tinputValue,\n\t\tsetInputValue,\n\t\tselectedDate,\n\t\tsetSelectedDate,\n\t\thandleSelect,\n\t\tformatDate: formatValue,\n\t\tparseDate\n\t};\n};\n",".selectionModeControl {\n\tmargin-top: var(--space-sm);\n\tpadding-top: var(--space-sm);\n\tborder-top: var(--border);\n}\n","import { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CalendarDaysIcon } from \"lucide-react\";\n\nimport { InputText } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { RadioGroup } from \"../../radio-group\";\nimport { UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport {\n\tareRangeDateValuesEqual,\n\tareSingleDateValuesEqual,\n\tDATE_INPUT_SELECTION_MODES,\n\tisDatePickerLevelAvailable,\n\tresolveAvailableDatePickerLevel,\n\ttype DateInputSelectionMode,\n\ttype DateInputWeekEndDay,\n\ttype DatePickerLevel\n} from \"../lib\";\nimport { useDateInput } from \"../model\";\n\nimport { CalendarView } from \"./CalendarView\";\nimport styles from \"./DateInput.module.scss\";\n\ninterface BaseDateInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\n\tminDate?: Date;\n\tmaxDate?: Date;\n\n\tdatePreset?: string;\n\n\t/**\n\t * Минимальный уровень календарной навигации. Размер выбранного периода задаёт `selectionMode`.\n\t */\n\tdatePickerLevel?: DatePickerLevel;\n\t/**\n\t * Размер периода, который выбирает поле: день, неделя, месяц или год.\n\t */\n\tselectionMode?: DateInputSelectionMode;\n\t/**\n\t * Последний включённый день недели для `selectionMode=\"week\"`.\n\t */\n\tweekEndDay?: DateInputWeekEndDay;\n\t/**\n\t * Показывает переключатель `selectionMode` под календарём.\n\t */\n\tallowSelectionModeChange?: boolean;\n\t/**\n\t * Ограничивает набор режимов в runtime-переключателе.\n\t */\n\tselectionModeOptions?: readonly DateInputSelectionMode[];\n\t/**\n\t * Сообщает наружу о runtime-смене режима выбора.\n\t */\n\tonSelectionModeChange?: (selectionMode: DateInputSelectionMode) => void;\n}\n\nexport interface DateSingleInputProps extends BaseDateInputProps, UiBaseProps<Date | null> {\n\tselectsRange?: false;\n}\nexport interface DateRangeInputProps extends BaseDateInputProps, UiBaseProps<NullableDateRange | null> {\n\tselectsRange: true;\n}\n\ntype DateInputProps = DateSingleInputProps | DateRangeInputProps;\n\ninterface CalendarTypeState {\n\treadonly view: DatePickerLevel;\n\treadonly selectionMode: DateInputSelectionMode;\n\treadonly minDatePickerLevel: DatePickerLevel;\n}\n\nconst selectionModeLabels: Record<DateInputSelectionMode, string> = {\n\tday: \"День\",\n\tweek: \"Неделя\",\n\tmonth: \"Месяц\",\n\tyear: \"Год\"\n};\n\nfunction resolveSelectionModeOptions(\n\tselectionModeOptions: readonly DateInputSelectionMode[] | undefined,\n\tselectionMode: DateInputSelectionMode\n): readonly DateInputSelectionMode[] {\n\tconst enabledModes = new Set(selectionModeOptions?.length ? selectionModeOptions : DATE_INPUT_SELECTION_MODES);\n\tenabledModes.add(selectionMode);\n\n\treturn DATE_INPUT_SELECTION_MODES.filter((mode) => enabledModes.has(mode));\n}\n\nfunction DateInput(props: DateSingleInputProps): JSX.Element;\nfunction DateInput(props: DateRangeInputProps): JSX.Element;\nfunction DateInput({\n\tplaceholder,\n\tdisabled,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\tdatePickerLevel,\n\tselectionMode: controlledSelectionMode,\n\tweekEndDay = \"sunday\",\n\tallowSelectionModeChange,\n\tselectionModeOptions,\n\tonSelectionModeChange,\n\t...props\n}: DateInputProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst [uncontrolledSelectionMode, setUncontrolledSelectionMode] = useState<DateInputSelectionMode>(controlledSelectionMode ?? \"day\");\n\tconst selectionMode = controlledSelectionMode ?? uncontrolledSelectionMode;\n\tconst minDatePickerLevel = datePickerLevel ?? \"day\";\n\tconst preferredCalendarType = resolveAvailableDatePickerLevel(selectionMode, minDatePickerLevel);\n\tconst [calendarTypeState, setCalendarTypeState] = useState<CalendarTypeState>(() => ({\n\t\tview: preferredCalendarType,\n\t\tselectionMode,\n\t\tminDatePickerLevel\n\t}));\n\tconst calendarType =\n\t\tcalendarTypeState.selectionMode === selectionMode &&\n\t\tcalendarTypeState.minDatePickerLevel === minDatePickerLevel &&\n\t\tisDatePickerLevelAvailable(calendarTypeState.view, minDatePickerLevel)\n\t\t\t? calendarTypeState.view\n\t\t\t: preferredCalendarType;\n\n\tconst initialDateRef = useRef(props.value);\n\tconst dateInputValueOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\tconst { inputValue, setInputValue, selectedDate, setSelectedDate, handleSelect, formatDate, parseDate } = useDateInput({\n\t\t...props,\n\t\tdatePickerLevel: minDatePickerLevel,\n\t\tselectionMode,\n\t\tweekEndDay\n\t});\n\tconst rangeOnChange = props.selectsRange ? props.onChange : undefined;\n\n\tconst updateCalendarType = useCallback(\n\t\t(calendarType: DatePickerLevel) => {\n\t\t\tif (isDatePickerLevelAvailable(calendarType, minDatePickerLevel)) {\n\t\t\t\tsetCalendarTypeState({\n\t\t\t\t\tview: calendarType,\n\t\t\t\t\tselectionMode,\n\t\t\t\t\tminDatePickerLevel\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[minDatePickerLevel, selectionMode]\n\t);\n\n\tuseEffect(() => {\n\t\tinitialDateRef.current = props.value;\n\t}, [props.value]);\n\n\tconst handleInputBlur = () => {\n\t\tif (inputValue) {\n\t\t\tconst parsedDate = parseDate(inputValue);\n\t\t\tif (parsedDate) {\n\t\t\t\tsetInputValue(formatDate(parsedDate));\n\n\t\t\t\tif (props.selectsRange && isDateRangeTuple(parsedDate)) {\n\t\t\t\t\tconst selectedRange = isDateRangeTuple(selectedDate) ? selectedDate : null;\n\n\t\t\t\t\tif (areRangeDateValuesEqual(parsedDate, selectedRange, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t} else if (!props.selectsRange && parsedDate instanceof Date) {\n\t\t\t\t\tconst selectedSingleDate = selectedDate instanceof Date ? selectedDate : null;\n\n\t\t\t\t\tif (areSingleDateValuesEqual(parsedDate, selectedSingleDate, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleInputBlur();\n\t\t}\n\t};\n\n\tconst handleCalendarDateSelect = useCallback(\n\t\t(value: Date | NullableDateRange) => {\n\t\t\tif (handleSelect(value)) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[handleSelect]\n\t);\n\n\tconst handleSelectionModeChange = useCallback(\n\t\t(nextSelectionMode: DateInputSelectionMode) => {\n\t\t\tif (controlledSelectionMode === undefined) {\n\t\t\t\tsetUncontrolledSelectionMode(nextSelectionMode);\n\t\t\t}\n\n\t\t\tonSelectionModeChange?.(nextSelectionMode);\n\t\t\tsetCalendarTypeState({\n\t\t\t\tview: resolveAvailableDatePickerLevel(nextSelectionMode, minDatePickerLevel),\n\t\t\t\tselectionMode: nextSelectionMode,\n\t\t\t\tminDatePickerLevel\n\t\t\t});\n\t\t},\n\t\t[controlledSelectionMode, minDatePickerLevel, onSelectionModeChange]\n\t);\n\n\tconst handleCancel = useCallback(() => {\n\t\t// Восстановить исходное состояние при отмене\n\t\tif (rangeOnChange) {\n\t\t\tconst [, selectedEndDate] = isDateRangeTuple(selectedDate) ? selectedDate : [null, null];\n\n\t\t\tif (!selectedEndDate) {\n\t\t\t\t// Восстановить исходное состояние диапазона\n\t\t\t\tconst initialValue = initialDateRef.current;\n\t\t\t\tconst initialRange = Array.isArray(initialValue) ? initialValue : null;\n\t\t\t\tconst initialStart = initialRange?.[0] ?? null;\n\t\t\t\tconst initialEnd = initialRange?.[1] ?? null;\n\n\t\t\t\tif (initialStart && initialEnd) {\n\t\t\t\t\tconst initialSelectedDate: NullableDateRange = [initialStart, initialEnd];\n\t\t\t\t\tsetSelectedDate(initialSelectedDate);\n\t\t\t\t\tsetInputValue(formatDate(initialSelectedDate));\n\n\t\t\t\t\trangeOnChange(initialSelectedDate);\n\t\t\t\t} else {\n\t\t\t\t\t// Если начального диапазона нет, очистить всё\n\t\t\t\t\tsetSelectedDate([null, null]);\n\t\t\t\t\tsetInputValue(\"\");\n\n\t\t\t\t\trangeOnChange([null, null]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [rangeOnChange, selectedDate, setSelectedDate, setInputValue, formatDate]);\n\n\tconst availableSelectionModes = resolveSelectionModeOptions(selectionModeOptions, selectionMode);\n\tconst showSelectionModeControl = allowSelectionModeChange && availableSelectionModes.length > 1;\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tonOpenChange={(value) => {\n\t\t\t\tsetOpen(value);\n\t\t\t\tif (!value) {\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t}}>\n\t\t\t<InputText\n\t\t\t\tlabel={props.label}\n\t\t\t\tdescription={props.description}\n\t\t\t\tsize={props.size}\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={setInputValue}\n\t\t\t\tonBlur={handleInputBlur}\n\t\t\t\tonKeyUp={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\terror={error}\n\t\t\t\tonClearError={onClearError}\n\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\tendAdornment={\n\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t<div className={uiStyles.uiToggleButtonContainer}>\n\t\t\t\t\t\t\t<button type=\"button\" disabled={disabled} aria-label=\"Открыть календарь\" className={uiStyles.uiToggleButton}>\n\t\t\t\t\t\t\t\t<CalendarDaysIcon />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<CalendarView\n\t\t\t\t\tview={calendarType}\n\t\t\t\t\tdatePickerLevel={minDatePickerLevel}\n\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\tonViewChange={updateCalendarType}\n\t\t\t\t\tvalue={selectedDate ?? null}\n\t\t\t\t\tonChange={handleCalendarDateSelect}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tselectsRange={!!props.selectsRange}\n\t\t\t\t/>\n\t\t\t\t{showSelectionModeControl && (\n\t\t\t\t\t<div className={styles.selectionModeControl}>\n\t\t\t\t\t\t<RadioGroup<DateInputSelectionMode>\n\t\t\t\t\t\t\tvalue={selectionMode}\n\t\t\t\t\t\t\tonChange={handleSelectionModeChange}\n\t\t\t\t\t\t\tnoWrap\n\t\t\t\t\t\t\taria-label=\"Режим выбора даты\">\n\t\t\t\t\t\t\t{availableSelectionModes.map((mode) => (\n\t\t\t\t\t\t\t\t<RadioGroup.Option key={mode} value={mode} label={selectionModeLabels[mode]} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\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\nexport function SingleDateInput(props: Omit<DateSingleInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} />;\n}\n\nexport function RangeDateInput(props: Omit<DateRangeInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} selectsRange={true} />;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-input-jlNk62cO.js","names":[],"sources":["../../src/date-input/lib/dateInputValue.ts","../../src/date-input/model/useDateInput.ts","../../src/date-input/ui/DateInput.module.scss","../../src/date-input/ui/DateInput.tsx"],"sourcesContent":["import {\n\tDEFAULT_DATE_PRESET_NAMES,\n\tformatDate,\n\tformatDateRange,\n\tgetCalendarPeriod,\n\tgetDatePreset,\n\tisDateRangeTuple,\n\tparseDateByFormat,\n\tresolveDateFormatName,\n\ttype CalendarPeriodOptions,\n\ttype DateFormatPrecision,\n\ttype DateRangeInput,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Пресет даты по умолчанию для текстового поля.\n */\nexport const DEFAULT_DATE_INPUT_PRESET = DEFAULT_DATE_PRESET_NAMES.date;\n\n/**\n * @deprecated Используйте `DEFAULT_DATE_INPUT_PRESET`.\n */\nexport const DEFAULT_DATE_INPUT_FORMAT = \"dd.MM.yyyy\";\n\nconst RANGE_SEPARATOR = \" - \";\n\nexport type DateInputValueOptions = {\n\t/**\n\t * Имя пресета форматирования даты.\n\t */\n\tdatePreset?: string;\n\t/**\n\t * Точность календарного значения.\n\t */\n\tdatePickerLevel?: DateFormatPrecision;\n\t/**\n\t * Размер периода, который выбирается и нормализуется полем.\n\t */\n\tselectionMode?: CalendarPeriodOptions[\"selectionMode\"];\n\t/**\n\t * Последний включённый день недели для режима выбора недели.\n\t */\n\tweekEndDay?: CalendarPeriodOptions[\"weekEndDay\"];\n\t/**\n\t * Опорная дата для пресетов без года, например `month-long`.\n\t */\n\treferenceDate?: Date;\n};\n\nexport type DateInputValueOptionsInput = string | DateInputValueOptions | undefined;\n\n/**\n * Возвращает точность форматирования поля даты.\n */\nfunction resolveDateInputPrecision(options: DateInputValueOptions): DateFormatPrecision {\n\tif (options.selectionMode === \"day\" || options.selectionMode === \"week\") {\n\t\treturn \"day\";\n\t}\n\n\tif (options.selectionMode === \"month\" || options.selectionMode === \"year\") {\n\t\treturn options.selectionMode;\n\t}\n\n\treturn options.datePickerLevel ?? \"day\";\n}\n\nfunction resolveCalendarPeriodOptions(options?: DateInputValueOptions): CalendarPeriodOptions {\n\treturn {\n\t\tselectionMode: options?.selectionMode,\n\t\tweekEndDay: options?.weekEndDay\n\t};\n}\n\n/**\n * Нормализует объектные опции и позиционный вызов с именем пресета.\n */\nfunction normalizeDateInputValueOptions(\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): DateInputValueOptions {\n\tif (typeof optionsOrPreset === \"string\" || optionsOrPreset === undefined) {\n\t\treturn {\n\t\t\tdatePreset: optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\tif (datePickerLevel && optionsOrPreset.datePickerLevel === undefined) {\n\t\treturn {\n\t\t\t...optionsOrPreset,\n\t\t\tdatePickerLevel\n\t\t};\n\t}\n\n\treturn optionsOrPreset;\n}\n\n/**\n * Проверяет новый `datePreset` и возвращает только зарегистрированное имя пресета.\n */\nfunction resolveDateInputPresetName(datePreset?: string): string {\n\tconst resolvedPresetName = resolveDateFormatName(datePreset, DEFAULT_DATE_INPUT_PRESET);\n\treturn getDatePreset(resolvedPresetName) ? resolvedPresetName : DEFAULT_DATE_INPUT_PRESET;\n}\n\n/**\n * Приводит результат универсального парсинга к календарной дате.\n */\nfunction parseDateTimeValue(value: string, options: DateInputValueOptions): Date | null {\n\treturn (\n\t\tparseDateByFormat(value, resolveDateInputPresetName(options.datePreset), {\n\t\t\tdefaultFormat: DEFAULT_DATE_INPUT_PRESET,\n\t\t\tprecision: resolveDateInputPrecision(options),\n\t\t\treferenceDate: options.referenceDate\n\t\t})?.date ?? null\n\t);\n}\n\n/**\n * Приводит одиночную дату к началу выбранного календарного периода.\n */\nexport function normalizeSingleDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.start ?? null;\n}\n\n/**\n * Приводит диапазон дат к границам выбранных календарных периодов.\n */\nexport function normalizeRangeDateValue(range: NullableDateRange | null, options?: DateInputValueOptions): NullableDateRange | null {\n\tif (!isDateRangeTuple(range)) return null;\n\n\tconst [startDate, endDate] = range;\n\treturn [normalizeSingleDateValue(startDate, options), normalizeRangeEndDateValue(endDate, options)];\n}\n\n/**\n * Приводит конечную дату диапазона к концу выбранного календарного периода.\n */\nexport function normalizeRangeEndDateValue(date: Date | null, options?: DateInputValueOptions): Date | null {\n\treturn getCalendarPeriod(date, resolveCalendarPeriodOptions(options))?.end ?? null;\n}\n\nfunction getDateTime(date: Date | null): number | null {\n\treturn date?.getTime() ?? null;\n}\n\n/**\n * Сравнивает одиночные даты после нормализации к точности поля ввода.\n */\nexport function areSingleDateValuesEqual(left: Date | null, right: Date | null, options?: DateInputValueOptions): boolean {\n\treturn getDateTime(normalizeSingleDateValue(left, options)) === getDateTime(normalizeSingleDateValue(right, options));\n}\n\n/**\n * Сравнивает диапазоны дат после нормализации к границам выбранных периодов.\n */\nexport function areRangeDateValuesEqual(\n\tleft: NullableDateRange | null,\n\tright: NullableDateRange | null,\n\toptions?: DateInputValueOptions\n): boolean {\n\tconst normalizedLeft = normalizeRangeDateValue(left, options);\n\tconst normalizedRight = normalizeRangeDateValue(right, options);\n\n\treturn (\n\t\tgetDateTime(normalizedLeft?.[0] ?? null) === getDateTime(normalizedRight?.[0] ?? null) &&\n\t\tgetDateTime(normalizedLeft?.[1] ?? null) === getDateTime(normalizedRight?.[1] ?? null)\n\t);\n}\n\n/**\n * Форматирует одиночную дату для текстового поля.\n */\nexport function formatSingleDateValue(\n\tdate: Date | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!date) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst period = getCalendarPeriod(date, resolveCalendarPeriodOptions(options));\n\n\t// Single-поле хранит начало недели, но показывает обе включительные границы выбранного периода.\n\tif (options.selectionMode === \"week\" && period) {\n\t\treturn formatDateRange(period.start, period.end, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\treturn formatDate(date, resolveDateInputPresetName(options.datePreset), {\n\t\tprecision: resolveDateInputPrecision(options)\n\t});\n}\n\n/**\n * Форматирует диапазон дат для текстового поля.\n */\nexport function formatRangeDateValue(\n\trange: NullableDateRange | null,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (!isDateRangeTuple(range)) return \"\";\n\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startDate, endDate] = range;\n\tif (startDate && endDate) {\n\t\treturn formatDateRange(startDate, endDate, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t});\n\t}\n\n\tif (startDate) {\n\t\treturn `${formatDate(startDate, resolveDateInputPresetName(options.datePreset), {\n\t\t\tprecision: resolveDateInputPrecision(options)\n\t\t})}${RANGE_SEPARATOR}`;\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Унифицирует форматирование значения поля даты.\n */\nexport function formatDateInputValue(\n\tvalue: DateRangeInput,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): string {\n\tif (isDateRangeTuple(value)) {\n\t\treturn formatRangeDateValue(value, optionsOrPreset, datePickerLevel);\n\t}\n\n\treturn formatSingleDateValue(value, optionsOrPreset, datePickerLevel);\n}\n\n/**\n * Парсит строку одиночной даты по заданному пресету.\n */\nexport function parseSingleDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\t// Для отображаемого диапазона single-week источником значения остаётся его первая граница.\n\tconst singleValue = options.selectionMode === \"week\" ? (value.split(RANGE_SEPARATOR)[0] ?? \"\") : value;\n\n\treturn normalizeSingleDateValue(parseDateTimeValue(singleValue, options), options);\n}\n\n/**\n * Парсит строку диапазона дат по заданному пресету.\n */\nexport function parseRangeDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): NullableDateRange {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\tconst [startPart = \"\", endPart = \"\"] = value.split(RANGE_SEPARATOR);\n\n\treturn [parseSingleDateValue(startPart, options), parseRangeEndDateValue(endPart, options)];\n}\n\n/**\n * Парсит конечную дату диапазона и нормализует её к концу суток.\n */\nexport function parseRangeEndDateValue(\n\tvalue: string,\n\toptionsOrPreset?: DateInputValueOptionsInput,\n\tdatePickerLevel?: DateFormatPrecision\n): Date | null {\n\tconst options = normalizeDateInputValueOptions(optionsOrPreset, datePickerLevel);\n\treturn normalizeRangeEndDateValue(parseDateTimeValue(value, options), options);\n}\n","import { useMemo, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport {\n\tDateInputValueOptions,\n\tformatDateInputValue,\n\tnormalizeRangeDateValue,\n\tnormalizeRangeEndDateValue,\n\tnormalizeSingleDateValue,\n\tparseRangeDateValue,\n\tparseSingleDateValue,\n\ttype DateInputOptions\n} from \"../lib\";\n\nfunction resolveReferenceDate(value: Date | NullableDateRange | null): Date | undefined {\n\tif (isDateRangeTuple(value)) {\n\t\treturn value[0] ?? value[1] ?? undefined;\n\t}\n\n\treturn value ?? undefined;\n}\n\n/**\n * Хук управляет текстовым представлением и выбранным значением поля даты.\n */\nexport const useDateInput = (options: DateInputOptions) => {\n\tconst externalSelectedDate = useMemo(() => {\n\t\tconst selectionOptions: DateInputValueOptions = {\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn normalizeRangeDateValue(options.value as NullableDateRange | null, selectionOptions);\n\t\t}\n\n\t\treturn normalizeSingleDateValue(options.value as Date | null, selectionOptions);\n\t}, [options.selectsRange, options.selectionMode, options.value, options.weekEndDay]);\n\tconst formatOptions = useMemo<DateInputValueOptions>(\n\t\t() => ({\n\t\t\tdatePreset: options.datePreset,\n\t\t\tdatePickerLevel: options.datePickerLevel,\n\t\t\tselectionMode: options.selectionMode,\n\t\t\tweekEndDay: options.weekEndDay\n\t\t}),\n\t\t[options.datePickerLevel, options.datePreset, options.selectionMode, options.weekEndDay]\n\t);\n\tconst externalInputValue = formatDateInputValue(externalSelectedDate, formatOptions);\n\tconst externalStateSignature = JSON.stringify([\n\t\toptions.selectsRange,\n\t\toptions.datePreset ?? null,\n\t\toptions.datePickerLevel ?? null,\n\t\toptions.selectionMode ?? null,\n\t\toptions.weekEndDay ?? null,\n\t\tisDateRangeTuple(externalSelectedDate)\n\t\t\t? [externalSelectedDate[0]?.getTime() ?? null, externalSelectedDate[1]?.getTime() ?? null]\n\t\t\t: (externalSelectedDate?.getTime() ?? null)\n\t]);\n\tconst [draftState, setDraftState] = useState(() => ({\n\t\tsourceSignature: externalStateSignature,\n\t\tselectedDate: externalSelectedDate,\n\t\tinputValue: externalInputValue\n\t}));\n\tconst hasCurrentDraft = draftState.sourceSignature === externalStateSignature;\n\tconst selectedDate = hasCurrentDraft ? draftState.selectedDate : externalSelectedDate;\n\tconst inputValue = hasCurrentDraft ? draftState.inputValue : externalInputValue;\n\n\t/**\n\t * Сохраняет пользовательский текст только относительно текущего controlled-снимка.\n\t * При внешней смене value или формата отображение сразу выводится из новых props.\n\t */\n\tconst setInputValue = (nextInputValue: string) => {\n\t\tsetDraftState((currentState) => {\n\t\t\tconst currentSelectedDate =\n\t\t\t\tcurrentState.sourceSignature === externalStateSignature ? currentState.selectedDate : externalSelectedDate;\n\n\t\t\treturn {\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: currentSelectedDate,\n\t\t\t\tinputValue: nextInputValue\n\t\t\t};\n\t\t});\n\t};\n\n\t/**\n\t * Обновляет локальный незавершённый выбор, не зеркаля controlled value через effect.\n\t */\n\tconst setSelectedDate = (nextSelectedDate: Date | NullableDateRange | null) => {\n\t\tsetDraftState((currentState) => {\n\t\t\tconst currentInputValue =\n\t\t\t\tcurrentState.sourceSignature === externalStateSignature ? currentState.inputValue : externalInputValue;\n\n\t\t\treturn {\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: nextSelectedDate,\n\t\t\t\tinputValue: currentInputValue\n\t\t\t};\n\t\t});\n\t};\n\n\t/**\n\t * Форматирует значение поля даты согласно текущему пресету.\n\t */\n\tconst formatValue = (value: Date | NullableDateRange | null): string => formatDateInputValue(value, formatOptions);\n\n\t/**\n\t * Парсит строковое значение поля в дату или диапазон дат.\n\t */\n\tconst parseDate = (dateString: string): Date | NullableDateRange | null => {\n\t\tconst parseOptions: DateInputValueOptions = {\n\t\t\t...formatOptions,\n\t\t\treferenceDate: resolveReferenceDate(selectedDate)\n\t\t};\n\n\t\tif (options.selectsRange) {\n\t\t\treturn parseRangeDateValue(dateString, parseOptions);\n\t\t}\n\n\t\treturn parseSingleDateValue(dateString, parseOptions);\n\t};\n\n\t/**\n\t * Обрабатывает выбор даты из календаря.\n\t */\n\tconst handleSelect = (date: Date | NullableDateRange) => {\n\t\tconst [selectedStartDate, selectedEndDate] = (Array.isArray(date) ? date : [date, null]) as NullableDateRange;\n\n\t\tif (options.selectsRange) {\n\t\t\tconst normalizedStartDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\t\tconst normalizedEndDate = normalizeRangeEndDateValue(selectedEndDate, formatOptions);\n\n\t\t\tif (normalizedStartDate && normalizedEndDate) {\n\t\t\t\tif (normalizedEndDate < normalizedStartDate) {\n\t\t\t\t\tconst swappedRange: NullableDateRange = [\n\t\t\t\t\t\tnormalizeSingleDateValue(selectedEndDate, formatOptions),\n\t\t\t\t\t\tnormalizeRangeEndDateValue(selectedStartDate, formatOptions)\n\t\t\t\t\t];\n\t\t\t\t\tsetDraftState({\n\t\t\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\t\t\tselectedDate: swappedRange,\n\t\t\t\t\t\tinputValue: formatValue(swappedRange)\n\t\t\t\t\t});\n\t\t\t\t\toptions.onChange(swappedRange);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, normalizedEndDate];\n\t\t\t\t\tsetDraftState({\n\t\t\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\t\t\tselectedDate: nextRange,\n\t\t\t\t\t\tinputValue: formatValue(nextRange)\n\t\t\t\t\t});\n\t\t\t\t\toptions.onChange(nextRange);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst nextRange: NullableDateRange = [normalizedStartDate, null];\n\t\t\tsetDraftState({\n\t\t\t\tsourceSignature: externalStateSignature,\n\t\t\t\tselectedDate: nextRange,\n\t\t\t\tinputValue: formatValue(nextRange)\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\tconst normalizedDate = normalizeSingleDateValue(selectedStartDate, formatOptions);\n\t\tsetDraftState({\n\t\t\tsourceSignature: externalStateSignature,\n\t\t\tselectedDate: normalizedDate,\n\t\t\tinputValue: formatValue(normalizedDate)\n\t\t});\n\t\toptions.onChange(normalizedDate);\n\n\t\treturn true;\n\t};\n\n\treturn {\n\t\tinputValue,\n\t\tsetInputValue,\n\t\tselectedDate,\n\t\tsetSelectedDate,\n\t\thandleSelect,\n\t\tformatDate: formatValue,\n\t\tparseDate\n\t};\n};\n",".selectionModeControl {\n\tmargin-top: var(--space-sm);\n\tpadding-top: var(--space-sm);\n\tborder-top: var(--border);\n}\n","import { JSX, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { isDateRangeTuple, type NullableDateRange } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { CalendarDaysIcon } from \"lucide-react\";\n\nimport { InputText } from \"../../input\";\nimport { Popover } from \"../../popover\";\nimport { RadioGroup } from \"../../radio-group\";\nimport { UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\nimport {\n\tareRangeDateValuesEqual,\n\tareSingleDateValuesEqual,\n\tDATE_INPUT_SELECTION_MODES,\n\tisDatePickerLevelAvailable,\n\tresolveAvailableDatePickerLevel,\n\ttype DateInputSelectionMode,\n\ttype DateInputWeekEndDay,\n\ttype DatePickerLevel\n} from \"../lib\";\nimport { useDateInput } from \"../model\";\n\nimport { CalendarView } from \"./CalendarView\";\nimport styles from \"./DateInput.module.scss\";\n\ninterface BaseDateInputProps {\n\terror?: string;\n\tonClearError?: () => void;\n\n\tminDate?: Date;\n\tmaxDate?: Date;\n\n\tdatePreset?: string;\n\n\t/**\n\t * Минимальный уровень календарной навигации. Размер выбранного периода задаёт `selectionMode`.\n\t */\n\tdatePickerLevel?: DatePickerLevel;\n\t/**\n\t * Размер периода, который выбирает поле: день, неделя, месяц или год.\n\t */\n\tselectionMode?: DateInputSelectionMode;\n\t/**\n\t * Последний включённый день недели для `selectionMode=\"week\"`.\n\t */\n\tweekEndDay?: DateInputWeekEndDay;\n\t/**\n\t * Показывает переключатель `selectionMode` под календарём.\n\t */\n\tallowSelectionModeChange?: boolean;\n\t/**\n\t * Ограничивает набор режимов в runtime-переключателе.\n\t */\n\tselectionModeOptions?: readonly DateInputSelectionMode[];\n\t/**\n\t * Сообщает наружу о runtime-смене режима выбора.\n\t */\n\tonSelectionModeChange?: (selectionMode: DateInputSelectionMode) => void;\n}\n\nexport interface DateSingleInputProps extends BaseDateInputProps, UiBaseProps<Date | null> {\n\tselectsRange?: false;\n}\nexport interface DateRangeInputProps extends BaseDateInputProps, UiBaseProps<NullableDateRange | null> {\n\tselectsRange: true;\n}\n\ntype DateInputProps = DateSingleInputProps | DateRangeInputProps;\n\ninterface CalendarTypeState {\n\treadonly view: DatePickerLevel;\n\treadonly selectionMode: DateInputSelectionMode;\n\treadonly minDatePickerLevel: DatePickerLevel;\n}\n\nconst selectionModeLabels: Record<DateInputSelectionMode, string> = {\n\tday: \"День\",\n\tweek: \"Неделя\",\n\tmonth: \"Месяц\",\n\tyear: \"Год\"\n};\n\nfunction resolveSelectionModeOptions(\n\tselectionModeOptions: readonly DateInputSelectionMode[] | undefined,\n\tselectionMode: DateInputSelectionMode\n): readonly DateInputSelectionMode[] {\n\tconst enabledModes = new Set(selectionModeOptions?.length ? selectionModeOptions : DATE_INPUT_SELECTION_MODES);\n\tenabledModes.add(selectionMode);\n\n\treturn DATE_INPUT_SELECTION_MODES.filter((mode) => enabledModes.has(mode));\n}\n\nfunction DateInput(props: DateSingleInputProps): JSX.Element;\nfunction DateInput(props: DateRangeInputProps): JSX.Element;\nfunction DateInput({\n\tplaceholder,\n\tdisabled,\n\terror,\n\tonClearError,\n\tminDate,\n\tmaxDate,\n\tdatePickerLevel,\n\tselectionMode: controlledSelectionMode,\n\tweekEndDay = \"sunday\",\n\tallowSelectionModeChange,\n\tselectionModeOptions,\n\tonSelectionModeChange,\n\t...props\n}: DateInputProps) {\n\tconst [open, setOpen] = useState(false);\n\tconst [uncontrolledSelectionMode, setUncontrolledSelectionMode] = useState<DateInputSelectionMode>(controlledSelectionMode ?? \"day\");\n\tconst selectionMode = controlledSelectionMode ?? uncontrolledSelectionMode;\n\tconst minDatePickerLevel = datePickerLevel ?? \"day\";\n\tconst preferredCalendarType = resolveAvailableDatePickerLevel(selectionMode, minDatePickerLevel);\n\tconst [calendarTypeState, setCalendarTypeState] = useState<CalendarTypeState>(() => ({\n\t\tview: preferredCalendarType,\n\t\tselectionMode,\n\t\tminDatePickerLevel\n\t}));\n\tconst calendarType =\n\t\tcalendarTypeState.selectionMode === selectionMode &&\n\t\tcalendarTypeState.minDatePickerLevel === minDatePickerLevel &&\n\t\tisDatePickerLevelAvailable(calendarTypeState.view, minDatePickerLevel)\n\t\t\t? calendarTypeState.view\n\t\t\t: preferredCalendarType;\n\n\tconst initialDateRef = useRef(props.value);\n\tconst dateInputValueOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\tconst { inputValue, setInputValue, selectedDate, setSelectedDate, handleSelect, formatDate, parseDate } = useDateInput({\n\t\t...props,\n\t\tdatePickerLevel: minDatePickerLevel,\n\t\tselectionMode,\n\t\tweekEndDay\n\t});\n\tconst rangeOnChange = props.selectsRange ? props.onChange : undefined;\n\n\tconst updateCalendarType = useCallback(\n\t\t(calendarType: DatePickerLevel) => {\n\t\t\tif (isDatePickerLevelAvailable(calendarType, minDatePickerLevel)) {\n\t\t\t\tsetCalendarTypeState({\n\t\t\t\t\tview: calendarType,\n\t\t\t\t\tselectionMode,\n\t\t\t\t\tminDatePickerLevel\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[minDatePickerLevel, selectionMode]\n\t);\n\n\tuseEffect(() => {\n\t\tinitialDateRef.current = props.value;\n\t}, [props.value]);\n\n\tconst handleInputBlur = () => {\n\t\tif (inputValue) {\n\t\t\tconst parsedDate = parseDate(inputValue);\n\t\t\tif (parsedDate) {\n\t\t\t\tsetInputValue(formatDate(parsedDate));\n\n\t\t\t\tif (props.selectsRange && isDateRangeTuple(parsedDate)) {\n\t\t\t\t\tconst selectedRange = isDateRangeTuple(selectedDate) ? selectedDate : null;\n\n\t\t\t\t\tif (areRangeDateValuesEqual(parsedDate, selectedRange, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t} else if (!props.selectsRange && parsedDate instanceof Date) {\n\t\t\t\t\tconst selectedSingleDate = selectedDate instanceof Date ? selectedDate : null;\n\n\t\t\t\t\tif (areSingleDateValuesEqual(parsedDate, selectedSingleDate, dateInputValueOptions)) return;\n\n\t\t\t\t\tsetSelectedDate(parsedDate);\n\t\t\t\t\tprops.onChange(parsedDate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tconst handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault();\n\t\t\thandleInputBlur();\n\t\t}\n\t};\n\n\tconst handleCalendarDateSelect = useCallback(\n\t\t(value: Date | NullableDateRange) => {\n\t\t\tif (handleSelect(value)) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[handleSelect]\n\t);\n\n\tconst handleSelectionModeChange = useCallback(\n\t\t(nextSelectionMode: DateInputSelectionMode) => {\n\t\t\tif (controlledSelectionMode === undefined) {\n\t\t\t\tsetUncontrolledSelectionMode(nextSelectionMode);\n\t\t\t}\n\n\t\t\tonSelectionModeChange?.(nextSelectionMode);\n\t\t\tsetCalendarTypeState({\n\t\t\t\tview: resolveAvailableDatePickerLevel(nextSelectionMode, minDatePickerLevel),\n\t\t\t\tselectionMode: nextSelectionMode,\n\t\t\t\tminDatePickerLevel\n\t\t\t});\n\t\t},\n\t\t[controlledSelectionMode, minDatePickerLevel, onSelectionModeChange]\n\t);\n\n\tconst handleCancel = useCallback(() => {\n\t\t// Восстановить исходное состояние при отмене\n\t\tif (rangeOnChange) {\n\t\t\tconst [, selectedEndDate] = isDateRangeTuple(selectedDate) ? selectedDate : [null, null];\n\n\t\t\tif (!selectedEndDate) {\n\t\t\t\t// Восстановить исходное состояние диапазона\n\t\t\t\tconst initialValue = initialDateRef.current;\n\t\t\t\tconst initialRange = Array.isArray(initialValue) ? initialValue : null;\n\t\t\t\tconst initialStart = initialRange?.[0] ?? null;\n\t\t\t\tconst initialEnd = initialRange?.[1] ?? null;\n\n\t\t\t\tif (initialStart && initialEnd) {\n\t\t\t\t\tconst initialSelectedDate: NullableDateRange = [initialStart, initialEnd];\n\t\t\t\t\tsetSelectedDate(initialSelectedDate);\n\t\t\t\t\tsetInputValue(formatDate(initialSelectedDate));\n\n\t\t\t\t\trangeOnChange(initialSelectedDate);\n\t\t\t\t} else {\n\t\t\t\t\t// Если начального диапазона нет, очистить всё\n\t\t\t\t\tsetSelectedDate([null, null]);\n\t\t\t\t\tsetInputValue(\"\");\n\n\t\t\t\t\trangeOnChange([null, null]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [rangeOnChange, selectedDate, setSelectedDate, setInputValue, formatDate]);\n\n\tconst availableSelectionModes = resolveSelectionModeOptions(selectionModeOptions, selectionMode);\n\tconst showSelectionModeControl = allowSelectionModeChange && availableSelectionModes.length > 1;\n\n\treturn (\n\t\t<Popover\n\t\t\topen={open}\n\t\t\tonOpenChange={(value) => {\n\t\t\t\tsetOpen(value);\n\t\t\t\tif (!value) {\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t}}>\n\t\t\t<InputText\n\t\t\t\tlabel={props.label}\n\t\t\t\tdescription={props.description}\n\t\t\t\tsize={props.size}\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={setInputValue}\n\t\t\t\tonBlur={handleInputBlur}\n\t\t\t\tonKeyUp={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\terror={error}\n\t\t\t\tonClearError={onClearError}\n\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\tendAdornment={\n\t\t\t\t\t<Popover.Trigger>\n\t\t\t\t\t\t<div className={uiStyles.uiToggleButtonContainer}>\n\t\t\t\t\t\t\t<button type=\"button\" disabled={disabled} aria-label=\"Открыть календарь\" className={uiStyles.uiToggleButton}>\n\t\t\t\t\t\t\t\t<CalendarDaysIcon />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover.Trigger>\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<CalendarView\n\t\t\t\t\tview={calendarType}\n\t\t\t\t\tdatePickerLevel={minDatePickerLevel}\n\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\tonViewChange={updateCalendarType}\n\t\t\t\t\tvalue={selectedDate ?? null}\n\t\t\t\t\tonChange={handleCalendarDateSelect}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t\tselectsRange={!!props.selectsRange}\n\t\t\t\t/>\n\t\t\t\t{showSelectionModeControl && (\n\t\t\t\t\t<div className={styles.selectionModeControl}>\n\t\t\t\t\t\t<RadioGroup<DateInputSelectionMode>\n\t\t\t\t\t\t\tvalue={selectionMode}\n\t\t\t\t\t\t\tonChange={handleSelectionModeChange}\n\t\t\t\t\t\t\tnoWrap\n\t\t\t\t\t\t\taria-label=\"Режим выбора даты\">\n\t\t\t\t\t\t\t{availableSelectionModes.map((mode) => (\n\t\t\t\t\t\t\t\t<RadioGroup.Option key={mode} value={mode} label={selectionModeLabels[mode]} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\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\nexport function SingleDateInput(props: Omit<DateSingleInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} />;\n}\n\nexport function RangeDateInput(props: Omit<DateRangeInputProps, \"selectsRange\">) {\n\treturn <DateInput {...props} selectsRange={true} />;\n}\n"],"mappings":"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"}
@@ -2,15 +2,18 @@ import { t as e } from "./ui.module-DHVTOqZ0.js";
2
2
  import { createContext as t, useCallback as n, useContext as r, useId as i, useLayoutEffect as a, useMemo as o, useState as s } from "react";
3
3
  import { cn as c, getRovingFocusTargetIndex as l, handleKeyboardActivation as u } from "@ryuzaki13/react-foundation-lib/utils";
4
4
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
5
- var p = {
5
+ import { CheckCircleIcon as p } from "lucide-react";
6
+ var m = {
6
7
  radioGroup: "nINbA6",
7
8
  noWrap: "GL-UWx",
8
9
  horizontal: "_6PeF-i",
9
10
  vertical: "_5wP4aR",
10
11
  radioItem: "S3MnZI",
11
- checked: "KHJ0ja"
12
- }, m = t(null);
13
- function h({ value: t, onChange: r, label: a, description: l, disabled: u, className: h, noWrap: g, orientation: _ = "horizontal", "aria-label": v, children: y }) {
12
+ checked: "KHJ0ja",
13
+ radioItemContent: "oGmcQH",
14
+ radioItemIcon: "k2z8AN"
15
+ }, h = t(null);
16
+ function g({ value: t, onChange: r, label: a, description: l, disabled: u, className: p, noWrap: g, orientation: _ = "horizontal", "aria-label": v, children: y }) {
14
17
  let b = i(), x = a ? `${b}-label` : void 0, S = l ? `${b}-description` : void 0, [C, w] = s([]), T = n((e) => r?.(e), [r]), E = n((e) => (w((t) => t.includes(e) ? t : [...t, e]), () => {
15
18
  w((t) => t.filter((t) => t !== e));
16
19
  }), []), D = o(() => ({
@@ -35,7 +38,7 @@ function h({ value: t, onChange: r, label: a, description: l, disabled: u, class
35
38
  t
36
39
  ]);
37
40
  return /* @__PURE__ */ f("div", {
38
- className: c(e.uiElement, u && e.disabled, h),
41
+ className: c(e.uiElement, u && e.disabled, p),
39
42
  children: [
40
43
  a && /* @__PURE__ */ d("div", {
41
44
  id: x,
@@ -47,7 +50,7 @@ function h({ value: t, onChange: r, label: a, description: l, disabled: u, class
47
50
  className: e.uiDescription,
48
51
  children: l
49
52
  }),
50
- /* @__PURE__ */ d(m.Provider, {
53
+ /* @__PURE__ */ d(h.Provider, {
51
54
  value: D,
52
55
  children: /* @__PURE__ */ d("div", {
53
56
  role: "radiogroup",
@@ -56,19 +59,19 @@ function h({ value: t, onChange: r, label: a, description: l, disabled: u, class
56
59
  "aria-describedby": S,
57
60
  "aria-disabled": u || void 0,
58
61
  "data-disabled": u || void 0,
59
- className: c(e.uiInputControl, p.radioGroup, g && p.noWrap, p[_]),
62
+ className: c(e.uiInputControl, m.radioGroup, g && m.noWrap, m[_]),
60
63
  children: y
61
64
  })
62
65
  })
63
66
  ]
64
67
  });
65
68
  }
66
- function g({ value: e, label: t, description: n, className: o }) {
67
- let s = r(m), h = i(), g = s?.registerOption;
69
+ function _({ value: e, label: t, description: n, className: o }) {
70
+ let s = r(h), g = i(), _ = s?.registerOption;
68
71
  if (a(() => {
69
- if (g) return g(h);
70
- }, [g, h]), !s) return /* @__PURE__ */ f("div", {
71
- className: c(p.radioItem, o),
72
+ if (_) return _(g);
73
+ }, [_, g]), !s) return /* @__PURE__ */ f("div", {
74
+ className: c(m.radioItem, o),
72
75
  children: [/* @__PURE__ */ d("p", {
73
76
  className: "textNoWrap",
74
77
  children: t
@@ -77,22 +80,22 @@ function g({ value: e, label: t, description: n, className: o }) {
77
80
  children: n
78
81
  })]
79
82
  });
80
- let _ = Object.is(s.value, e), v = s.disabled === !0, y = s.value === void 0 && s.firstOptionId === h, b = () => {
81
- v || _ || s.onChange?.(e);
83
+ let v = Object.is(s.value, e), y = s.disabled === !0, b = s.value === void 0 && s.firstOptionId === g, x = () => {
84
+ y || v || s.onChange?.(e);
82
85
  };
83
86
  return /* @__PURE__ */ f("button", {
84
- id: `${s.groupId}-option-${h}`,
87
+ id: `${s.groupId}-option-${g}`,
85
88
  type: "button",
86
89
  role: "radio",
87
- "aria-checked": _,
88
- disabled: v,
89
- tabIndex: _ || y ? 0 : -1,
90
- className: c(p.radioItem, _ && p.checked, o),
90
+ "aria-checked": v,
91
+ disabled: y,
92
+ tabIndex: v || b ? 0 : -1,
93
+ className: c(m.radioItem, v && m.checked, o),
91
94
  "data-ui": "radio-option",
92
95
  "data-action": "select-radio-option",
93
- onClick: b,
96
+ onClick: x,
94
97
  onKeyDown: (e) => {
95
- if (v || u(e, b)) return;
98
+ if (y || u(e, x)) return;
96
99
  let t = e.currentTarget, n = t.closest("[role=\"radiogroup\"]"), r = Array.from(n?.querySelectorAll("[role=\"radio\"]:not([disabled])") ?? []);
97
100
  if (!r.length) return;
98
101
  let i = r.indexOf(t);
@@ -105,17 +108,27 @@ function g({ value: e, label: t, description: n, className: o }) {
105
108
  });
106
109
  a !== null && (e.preventDefault(), r[a]?.focus(), r[a]?.click());
107
110
  },
108
- children: [/* @__PURE__ */ d("span", {
109
- className: "textNoWrap",
110
- children: t
111
- }), n && /* @__PURE__ */ d("span", {
112
- className: "fontSizeSm",
113
- children: n
111
+ children: [/* @__PURE__ */ f("span", {
112
+ className: m.radioItemContent,
113
+ children: [/* @__PURE__ */ d("span", {
114
+ className: "textNoWrap",
115
+ children: t
116
+ }), n && /* @__PURE__ */ d("span", {
117
+ className: "fontSizeSm",
118
+ children: n
119
+ })]
120
+ }), /* @__PURE__ */ d("span", {
121
+ className: m.radioItemIcon,
122
+ children: /* @__PURE__ */ d(p, { style: {
123
+ display: "block",
124
+ visibility: v ? "visible" : "hidden",
125
+ strokeWidth: 2
126
+ } })
114
127
  })]
115
128
  });
116
129
  }
117
- h.Option = g;
130
+ g.Option = _;
118
131
  //#endregion
119
- export { h as n, g as t };
132
+ export { g as n, _ as t };
120
133
 
121
- //# sourceMappingURL=radio-group-BRR1ZQDA.js.map
134
+ //# sourceMappingURL=radio-group-NhBL3fkD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group-NhBL3fkD.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tflex: 1 0 0%;\n\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-sm);\n\n\tcolor: var(--content-2);\n\t// border: var(--border-width) solid transparent;\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-1);\n\t\tbackground-color: var(--surface-2);\n\t\t// border-color: var(--border-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-brand-on-fill);\n\t\tbackground-color: var(--status-brand-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n\n.radioItemContent {\n\tflex: 1 0 0%;\n\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n}\n\n.radioItemIcon {\n\tflex: 0 0 0%;\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckCircleIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className={styles.radioItemContent}>\n\t\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t\t</span>\n\t\t\t<span className={styles.radioItemIcon}>\n\t\t\t\t<CheckCircleIcon style={{ display: \"block\", visibility: isChecked ? \"visible\" : \"hidden\", strokeWidth: 2 }} />\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
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-DGElHRTJ.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-DEHI8-wq.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-jlNk62cO.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,5 +1,5 @@
1
1
  import { o as e } from "../chunks/flex-C7njxZ74.js";
2
- import { t } from "../chunks/date-input-DEHI8-wq.js";
2
+ import { t } from "../chunks/date-input-jlNk62cO.js";
3
3
  import { c as n, l as r, r as i, s as a, t as o, u as s } from "../chunks/date-range-preset-select-BLnY47cv.js";
4
4
  import { useCallback as c, useMemo as l, useRef as u, useState as d } from "react";
5
5
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/radio-group/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAgC,SAAS,EAAsE,MAAM,OAAO,CAAC;AAsB3I,UAAU,eAAe,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAC7B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAA0B,EAC1B,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,EAAE,eAAe,CAAC,CAAC,CAAC,qBA6DpB;yBAxEe,UAAU;;;AA0E1B,UAAU,WAAW,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,qBA0FjF"}
1
+ {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/radio-group/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAgC,SAAS,EAAsE,MAAM,OAAO,CAAC;AAuB3I,UAAU,eAAe,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAC7B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAA0B,EAC1B,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,EAAE,eAAe,CAAC,CAAC,CAAC,qBA6DpB;yBAxEe,UAAU;;;AA0E1B,UAAU,WAAW,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,qBA+FjF"}
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/radio-group-BRR1ZQDA.js";
1
+ import { n as e, t } from "../chunks/radio-group-NhBL3fkD.js";
2
2
  export { t as Option, e as RadioGroup };