@ryuzaki13/react-foundation-ui 1.0.15 → 1.0.17

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 (263) hide show
  1. package/dist/advanced-search/index.js +7 -7
  2. package/dist/badge/index.js +1 -1
  3. package/dist/base-table/index.js +1 -1
  4. package/dist/chunks/{TextEditorLexicalClient-jQ7V9jFm.js → TextEditorLexicalClient-B1kQnKrU.js} +3 -3
  5. package/dist/chunks/{TextEditorLexicalClient-jQ7V9jFm.js.map → TextEditorLexicalClient-B1kQnKrU.js.map} +1 -1
  6. package/dist/chunks/{badge-BfbLPk0z.js → badge-Cri0-kVK.js} +2 -2
  7. package/dist/chunks/{badge-BfbLPk0z.js.map → badge-Cri0-kVK.js.map} +1 -1
  8. package/dist/chunks/{base-table-CiYSRI_J.js → base-table-DghNJ6ss.js} +3 -3
  9. package/dist/chunks/{base-table-CiYSRI_J.js.map → base-table-DghNJ6ss.js.map} +1 -1
  10. package/dist/chunks/{flex-CPO6xlPR.js → flex-DYZ0IbU6.js} +76 -14
  11. package/dist/chunks/flex-DYZ0IbU6.js.map +1 -0
  12. package/dist/chunks/{grid-ByIIytjh.js → grid-dI94AAbi.js} +63 -45
  13. package/dist/chunks/grid-dI94AAbi.js.map +1 -0
  14. package/dist/chunks/{misc-1PxS8OWD.js → misc-ClXJygTj.js} +2 -2
  15. package/dist/chunks/{misc-1PxS8OWD.js.map → misc-ClXJygTj.js.map} +1 -1
  16. package/dist/chunks/{modal-4vYSSbAa.js → modal-QGp5CjB9.js} +4 -4
  17. package/dist/chunks/{modal-4vYSSbAa.js.map → modal-QGp5CjB9.js.map} +1 -1
  18. package/dist/chunks/{multi-select-r0ekR6Bh.js → multi-select-DkfdFYm4.js} +2 -2
  19. package/dist/chunks/{multi-select-r0ekR6Bh.js.map → multi-select-DkfdFYm4.js.map} +1 -1
  20. package/dist/chunks/{table-BR2VqeEg.js → table-tBQ_FOs3.js} +2 -2
  21. package/dist/chunks/{table-BR2VqeEg.js.map → table-tBQ_FOs3.js.map} +1 -1
  22. package/dist/errors/index.js +1 -1
  23. package/dist/expandable-action-panel/index.js +1 -1
  24. package/dist/flex/FlexCenter.d.ts +4 -5
  25. package/dist/flex/FlexCenter.d.ts.map +1 -1
  26. package/dist/flex/FlexContainer.d.ts.map +1 -1
  27. package/dist/flex/FlexItem.d.ts.map +1 -1
  28. package/dist/flex/FlexSpacer.d.ts +3 -2
  29. package/dist/flex/FlexSpacer.d.ts.map +1 -1
  30. package/dist/flex/index.js +1 -1
  31. package/dist/flex/types.d.ts +5 -3
  32. package/dist/flex/types.d.ts.map +1 -1
  33. package/dist/flex/useFlexClasses.d.ts +4 -4
  34. package/dist/flex/useFlexClasses.d.ts.map +1 -1
  35. package/dist/grid/GridContainer.d.ts.map +1 -1
  36. package/dist/grid/index.js +1 -1
  37. package/dist/grid/types.d.ts +5 -3
  38. package/dist/grid/types.d.ts.map +1 -1
  39. package/dist/grid/useGridClasses.d.ts +3 -3
  40. package/dist/grid/useGridClasses.d.ts.map +1 -1
  41. package/dist/image/index.d.ts +14 -5
  42. package/dist/image/index.d.ts.map +1 -1
  43. package/dist/image/index.js +258 -254
  44. package/dist/image/index.js.map +1 -1
  45. package/dist/image/lib/buildImageSources.d.ts +4 -0
  46. package/dist/image/lib/buildImageSources.d.ts.map +1 -0
  47. package/dist/image/lib/buildImageSrcSet.d.ts +4 -0
  48. package/dist/image/lib/buildImageSrcSet.d.ts.map +1 -0
  49. package/dist/image/lib/getImageCropPreviewStyle.d.ts +9 -0
  50. package/dist/image/lib/getImageCropPreviewStyle.d.ts.map +1 -0
  51. package/dist/image/lib/getImageSelectionKey.d.ts +4 -0
  52. package/dist/image/lib/getImageSelectionKey.d.ts.map +1 -0
  53. package/dist/image/model/imageCropTypes.d.ts +35 -0
  54. package/dist/image/model/imageCropTypes.d.ts.map +1 -0
  55. package/dist/image/model/imageSelectionTypes.d.ts +53 -0
  56. package/dist/image/model/imageSelectionTypes.d.ts.map +1 -0
  57. package/dist/image/model/imageTypes.d.ts +41 -0
  58. package/dist/image/model/imageTypes.d.ts.map +1 -0
  59. package/dist/image/model/useImageSelectionState.d.ts +7 -0
  60. package/dist/image/model/useImageSelectionState.d.ts.map +1 -0
  61. package/dist/image/ui/ImageCropper.d.ts +6 -12
  62. package/dist/image/ui/ImageCropper.d.ts.map +1 -1
  63. package/dist/image/ui/ImagePlaceholder.d.ts +1 -2
  64. package/dist/image/ui/ImagePlaceholder.d.ts.map +1 -1
  65. package/dist/image/ui/ImageRenderer.d.ts +8 -7
  66. package/dist/image/ui/ImageRenderer.d.ts.map +1 -1
  67. package/dist/image/ui/ImageSelectionFields.d.ts +8 -0
  68. package/dist/image/ui/ImageSelectionFields.d.ts.map +1 -0
  69. package/dist/image/ui/ImageSelectionModal.d.ts +4 -0
  70. package/dist/image/ui/ImageSelectionModal.d.ts.map +1 -0
  71. package/dist/image/ui/ImageSelectionPanel.d.ts +4 -0
  72. package/dist/image/ui/ImageSelectionPanel.d.ts.map +1 -0
  73. package/dist/image/ui/ImageView.d.ts +8 -35
  74. package/dist/image/ui/ImageView.d.ts.map +1 -1
  75. package/dist/list/index.js +2 -2
  76. package/dist/misc/index.js +1 -1
  77. package/dist/modal/index.js +1 -1
  78. package/dist/multi-select/index.js +1 -1
  79. package/dist/notifications/index.js +1 -1
  80. package/dist/preset-range-date-input/index.js +1 -1
  81. package/dist/simple-table/index.js +1 -1
  82. package/dist/table/index.js +1 -1
  83. package/dist/tabs/index.js +1 -1
  84. package/dist/text-editor/index.js +2 -2
  85. package/dist/toolbar/index.js +2 -2
  86. package/dist/tree-table/index.js +1 -1
  87. package/package.json +1 -1
  88. package/storybook-static/assets/{Badge-BJuMBcdz.js → Badge-DhbMuuXm.js} +1 -1
  89. package/storybook-static/assets/{Badge.stories-IgBcw1Cf.js → Badge.stories-Cn2OwyNl.js} +1 -1
  90. package/storybook-static/assets/{Button-B_GEc_r4.js → Button-BCO6drLh.js} +1 -1
  91. package/storybook-static/assets/{Button-DRBTSyRM.js → Button-CK0YS5UI.js} +1 -1
  92. package/storybook-static/assets/{Button.stories-Di4OQvY8.js → Button.stories-PvBecpMR.js} +1 -1
  93. package/storybook-static/assets/{CheckBox-WHmt7FbU.js → CheckBox-CH7PEkzn.js} +1 -1
  94. package/storybook-static/assets/{CheckBox-57qzcUkX.js → CheckBox-DgMj1d8n.js} +1 -1
  95. package/storybook-static/assets/{CheckBox.stories-BItLovUs.js → CheckBox.stories-D6ItCkPg.js} +1 -1
  96. package/storybook-static/assets/{Color-KMSTOMOX-CWP56kfm.js → Color-KMSTOMOX-GfidB0cg.js} +1 -1
  97. package/storybook-static/assets/{ContextMenu-DKl_ZfMI.js → ContextMenu-D3lrcJcF.js} +1 -1
  98. package/storybook-static/assets/{ContextMenu.stories-D-Xnld63.js → ContextMenu.stories-eH4W7mHM.js} +1 -1
  99. package/storybook-static/assets/{DateInput-BSyYH-et.js → DateInput-B1DsTxcV.js} +1 -1
  100. package/storybook-static/assets/{DateInput-B2X74zQf.js → DateInput-BlmssZge.js} +1 -1
  101. package/storybook-static/assets/{DateInput.stories-Dwk-9ZjA.js → DateInput.stories-CXftqoBw.js} +1 -1
  102. package/storybook-static/assets/{DateRangePresetSelect-CPeX_HRn.js → DateRangePresetSelect-CL0hlHRZ.js} +1 -1
  103. package/storybook-static/assets/{DateRangePresetSelect-DTSWmoT_.js → DateRangePresetSelect-DIrJMADf.js} +1 -1
  104. package/storybook-static/assets/{DateRangePresetSelect.stories-CGNvBg03.js → DateRangePresetSelect.stories-DcSm9soa.js} +1 -1
  105. package/storybook-static/assets/{Detail-BQwyVo2M.js → Detail-CoabkYcs.js} +1 -1
  106. package/storybook-static/assets/{Detail.stories-x4juDK19.js → Detail.stories-DQYXxRp4.js} +1 -1
  107. package/storybook-static/assets/{Dialog-CH9J4tmL.js → Dialog-BMqJ2cWE.js} +1 -1
  108. package/storybook-static/assets/{Dialog.stories-Cp3J86ce.js → Dialog.stories-UMGlcMlF.js} +1 -1
  109. package/storybook-static/assets/{Disclosure-B7i9P4YG.js → Disclosure-KB4xjsXl.js} +1 -1
  110. package/storybook-static/assets/{Disclosure.stories-DzZ5RLXm.js → Disclosure.stories-BebcX5Iz.js} +1 -1
  111. package/storybook-static/assets/{DocsRenderer-JROSPFPF-D61SC7UY.js → DocsRenderer-JROSPFPF-DuKHOivk.js} +2 -2
  112. package/storybook-static/assets/{DropZone-MiBUScxG.js → DropZone-nfS8G3Hn.js} +1 -1
  113. package/storybook-static/assets/{DropZone.stories-C2qhbfNj.js → DropZone.stories-CfXfUPEJ.js} +1 -1
  114. package/storybook-static/assets/{DropdownMenu-X7PLdfVp.js → DropdownMenu-DnrqkJwd.js} +1 -1
  115. package/storybook-static/assets/{ExpandableActionPanel.stories-Ca2AoCI0.js → ExpandableActionPanel.stories-BoiZuwQW.js} +1 -1
  116. package/storybook-static/assets/{Flex-BaD8FRom.js → Flex-CTKFA_mG.js} +1 -1
  117. package/storybook-static/assets/Flex-Cmb3839O.js +3 -0
  118. package/storybook-static/assets/{Flex.stories-F8YaKEO0.js → Flex.stories-CP95d38j.js} +1 -1
  119. package/storybook-static/assets/{Grid-BewDzBtv.js → Grid-DNKooHvc.js} +3 -3
  120. package/storybook-static/assets/{Grid-ZTR_R-m1.js → Grid-Xy7dV3bL.js} +1 -1
  121. package/storybook-static/assets/{Grid.stories-Cu78z_oE.js → Grid.stories-CzW_QizU.js} +1 -1
  122. package/storybook-static/assets/ImageCropper.stories-BTXQ94Gl.js +115 -0
  123. package/storybook-static/assets/ImageRenderer-BoaYYmBZ.js +2 -0
  124. package/storybook-static/assets/ImageRenderer.stories-BbzcY9qz.js +22 -0
  125. package/storybook-static/assets/ImageView.stories-BxeA_KDn.js +9 -0
  126. package/storybook-static/assets/{Input-D6z--4tm.js → Input-23s-lKOn.js} +1 -1
  127. package/storybook-static/assets/{Input-DjRjmBbJ.js → Input-E_LkqP6a.js} +1 -1
  128. package/storybook-static/assets/{Input.stories-CBkJ60Z3.js → Input.stories-uG22uEFU.js} +1 -1
  129. package/storybook-static/assets/{InputDateTime-B2V4I801.js → InputDateTime-zIw8NrCi.js} +1 -1
  130. package/storybook-static/assets/{InputDateTime.stories-gepL7zcB.js → InputDateTime.stories-CRyGwLn7.js} +1 -1
  131. package/storybook-static/assets/{InputFile-B_rtgdVs.js → InputFile-Dt4Qf9UO.js} +1 -1
  132. package/storybook-static/assets/{InputFile.stories-CVD-PTav.js → InputFile.stories-CVHdaQXL.js} +1 -1
  133. package/storybook-static/assets/{InputFiles-CFlxBgsw.js → InputFiles-BqrOxvD8.js} +1 -1
  134. package/storybook-static/assets/{InputFiles-Cy_fvMYT.js → InputFiles-Bwk_tH4A.js} +1 -1
  135. package/storybook-static/assets/{InputFiles.stories-DIbO_ACP.js → InputFiles.stories-eNwGWGc6.js} +1 -1
  136. package/storybook-static/assets/{InputImage-BWbT8pGH.js → InputImage-DpX3d6wQ.js} +1 -1
  137. package/storybook-static/assets/{InputImage.stories-SyFATair.js → InputImage.stories-DBYvsQrj.js} +1 -1
  138. package/storybook-static/assets/{LayoutPicker-0dJNS0bb.js → LayoutPicker-CfSu2g4Z.js} +1 -1
  139. package/storybook-static/assets/{LayoutPicker.stories-BUohHOWt.js → LayoutPicker.stories-D1lUyF06.js} +1 -1
  140. package/storybook-static/assets/{Listbox-Cn1Z-r2n.js → Listbox-uDkRdf67.js} +1 -1
  141. package/storybook-static/assets/{Listbox.stories-c1NSeGUa.js → Listbox.stories-6yyYujhd.js} +1 -1
  142. package/storybook-static/assets/{Modal-Db2Ne_PP.js → Modal-J42YPjEH.js} +1 -1
  143. package/storybook-static/assets/{Modal.stories-CZum1nVD.js → Modal.stories-Nmp6akCZ.js} +1 -1
  144. package/storybook-static/assets/{MultiSelect-D-r3_Bry.js → MultiSelect-BJGmqmIo.js} +1 -1
  145. package/storybook-static/assets/{MultiSelect-CkHso-Za.js → MultiSelect-UF351F4G.js} +1 -1
  146. package/storybook-static/assets/{MultiSelect.stories-CjNtbPvc.js → MultiSelect.stories-DkzP-YMA.js} +1 -1
  147. package/storybook-static/assets/{NotificationsHost-DcsexLl8.js → NotificationsHost-C7ZbgRdj.js} +1 -1
  148. package/storybook-static/assets/{NotificationsHost.stories-DxB9wp4P.js → NotificationsHost.stories-DtE5nY4I.js} +1 -1
  149. package/storybook-static/assets/{ODataMultiSelect-BB6pa_2a.js → ODataMultiSelect-A28BQBXe.js} +1 -1
  150. package/storybook-static/assets/{ODataMultiSelect.stories-D4108lSt.js → ODataMultiSelect.stories-CleaUAky.js} +1 -1
  151. package/storybook-static/assets/{ODataSelect-BcrPaLAR.js → ODataSelect-CgPTwZze.js} +1 -1
  152. package/storybook-static/assets/{ODataSelect-BppTAIqx.js → ODataSelect-CidLsWhU.js} +1 -1
  153. package/storybook-static/assets/{ODataSelect.stories-DteYVpiQ.js → ODataSelect.stories-CnjZKsYR.js} +1 -1
  154. package/storybook-static/assets/{ODataTreeMultiSelect-CVjcPuI1.js → ODataTreeMultiSelect-BcXe8UV0.js} +1 -1
  155. package/storybook-static/assets/{ODataTreeMultiSelect.stories-C6xU81uc.js → ODataTreeMultiSelect.stories-Cy6URpNZ.js} +1 -1
  156. package/storybook-static/assets/{ODataTreeSelect-BRHxD-vG.js → ODataTreeSelect-B79mkiqm.js} +1 -1
  157. package/storybook-static/assets/{ODataTreeSelect.stories-CyqwAaqI.js → ODataTreeSelect.stories-BmS9Kslk.js} +1 -1
  158. package/storybook-static/assets/{PeriodSelect-oi5rAN2N.js → PeriodSelect-Dvd_n0px.js} +1 -1
  159. package/storybook-static/assets/{PeriodSelect.stories-C7UftRku.js → PeriodSelect.stories-DeB7vL4v.js} +1 -1
  160. package/storybook-static/assets/{Popover-DFJPXALP.js → Popover-CF6lPz2I.js} +1 -1
  161. package/storybook-static/assets/{Popover.stories-DTNaGax4.js → Popover.stories-CxldfZVc.js} +1 -1
  162. package/storybook-static/assets/{PresetRangeDateInput-Cm4EbMNS.js → PresetRangeDateInput-CMkWDbAV.js} +1 -1
  163. package/storybook-static/assets/{PresetRangeDateInput.stories-Y5uojvsz.js → PresetRangeDateInput.stories-CNYGpwHh.js} +1 -1
  164. package/storybook-static/assets/{RadioButton-B1xWc03x.js → RadioButton-BhV-iR7A.js} +1 -1
  165. package/storybook-static/assets/{RadioButton.stories-CFZrSdeX.js → RadioButton.stories-BBGp713e.js} +1 -1
  166. package/storybook-static/assets/{RadioGroup-dt4vRt66.js → RadioGroup-CFQmZbmE.js} +1 -1
  167. package/storybook-static/assets/{RadioGroup-CRnLGdRq.js → RadioGroup-_xQT2nsR.js} +1 -1
  168. package/storybook-static/assets/{RadioGroup.stories-Cq8jrT3o.js → RadioGroup.stories-B20ktIVa.js} +1 -1
  169. package/storybook-static/assets/{Select-CWfg857u.js → Select-CXqDj36V.js} +1 -1
  170. package/storybook-static/assets/{Select-COzu9R1S.js → Select-jIsVhwD3.js} +1 -1
  171. package/storybook-static/assets/{Select.stories-ajlw6UD7.js → Select.stories-C0VB6D4d.js} +1 -1
  172. package/storybook-static/assets/{SelectOptionContent-5fpSAPpp.js → SelectOptionContent-COxwEiax.js} +1 -1
  173. package/storybook-static/assets/{SerializableSelect-D7k-0rpL.js → SerializableSelect-BPHsbeTD.js} +1 -1
  174. package/storybook-static/assets/{SerializableSelect-CtF_5hDV.js → SerializableSelect-J1rOw5PY.js} +1 -1
  175. package/storybook-static/assets/{SerializableSelect.stories-DXink3F3.js → SerializableSelect.stories-DsPARybj.js} +1 -1
  176. package/storybook-static/assets/{SingleDateTimeInput-CiZs4GCq.js → SingleDateTimeInput-BpQ4pLpY.js} +1 -1
  177. package/storybook-static/assets/{SingleDateTimeInput.stories-5QJlrw4f.js → SingleDateTimeInput.stories-iX__aO9q.js} +1 -1
  178. package/storybook-static/assets/{Slider-CxK-n_Qh.js → Slider-DBT0NGzG.js} +1 -1
  179. package/storybook-static/assets/{Slider.stories-B0tho-fR.js → Slider.stories-B2eK8XJA.js} +1 -1
  180. package/storybook-static/assets/{SliderInput-ZN9vpT2S.js → SliderInput-ChSw_jKg.js} +1 -1
  181. package/storybook-static/assets/{SliderInput.stories-B9oU6kyp.js → SliderInput.stories-Ydlqkpul.js} +1 -1
  182. package/storybook-static/assets/{Sortable-Cyr7iTZO.js → Sortable-BNdP7m0c.js} +1 -1
  183. package/storybook-static/assets/{Sortable.stories-BhF3AZgC.js → Sortable.stories-DN3EmT5j.js} +1 -1
  184. package/storybook-static/assets/{Splitter-peLMiwre.js → Splitter-CcmZ1RhL.js} +1 -1
  185. package/storybook-static/assets/{Splitter.stories-nr3eJ5GM.js → Splitter.stories-8_bdaQBx.js} +1 -1
  186. package/storybook-static/assets/{StateSelect-B_fxrXNN.js → StateSelect-b7_i5AYO.js} +1 -1
  187. package/storybook-static/assets/{StateSelect.stories-CDdWdRLe.js → StateSelect.stories-8HzaiOPq.js} +1 -1
  188. package/storybook-static/assets/{Switch-DM50QWxA.js → Switch-B6iIA_Sa.js} +1 -1
  189. package/storybook-static/assets/{Switch.stories-D5LjDVPS.js → Switch.stories-C0C1FC4S.js} +1 -1
  190. package/storybook-static/assets/{Table-5aluIGdo.js → Table-ClcldA-z.js} +1 -1
  191. package/storybook-static/assets/{Table.stories-DGKBAzL2.js → Table.stories-BiJfbbFS.js} +1 -1
  192. package/storybook-static/assets/{Tabs-CO7DsnUr.js → Tabs-SS9HB-vC.js} +1 -1
  193. package/storybook-static/assets/{Tabs.stories-DTgCMxUb.js → Tabs.stories-BRcexZE0.js} +1 -1
  194. package/storybook-static/assets/{Textarea-DSvLZptc.js → Textarea-DMbVI72I.js} +1 -1
  195. package/storybook-static/assets/{Textarea.stories-kqd0YbmQ.js → Textarea.stories-DSgmFgdA.js} +1 -1
  196. package/storybook-static/assets/{TimePanel-DDaX01do.js → TimePanel-AqEGPwAi.js} +1 -1
  197. package/storybook-static/assets/{TimePanel.stories-CerMQLRf.js → TimePanel.stories-C7GxLG8Y.js} +1 -1
  198. package/storybook-static/assets/{Toggle-t1lVxQz6.js → Toggle-BGonS5_k.js} +1 -1
  199. package/storybook-static/assets/{Toggle.stories-CeJwV-Ek.js → Toggle.stories-fg1rL2w5.js} +1 -1
  200. package/storybook-static/assets/{TreeMultiSelect-Cqt4O9BU.js → TreeMultiSelect-cfKLgsPQ.js} +1 -1
  201. package/storybook-static/assets/{TreeMultiSelect-D6Au72K2.js → TreeMultiSelect-m1Jc0UmH.js} +1 -1
  202. package/storybook-static/assets/{TreeMultiSelect.stories-C_BIcIv6.js → TreeMultiSelect.stories-CcoijQYD.js} +1 -1
  203. package/storybook-static/assets/{TreePickerBase-DLVYUhCD.js → TreePickerBase-D8LeBNby.js} +1 -1
  204. package/storybook-static/assets/{TreeSelect-CIWXiLSp.js → TreeSelect-CLrdAJA-.js} +1 -1
  205. package/storybook-static/assets/{TreeSelect-CgDLk4ka.js → TreeSelect-CYJ5zvKm.js} +1 -1
  206. package/storybook-static/assets/{TreeSelect.stories-DJJQpAG-.js → TreeSelect.stories-C_uly8NB.js} +1 -1
  207. package/storybook-static/assets/{TreeTable-6VwdbiOA.js → TreeTable-CPTxegC1.js} +1 -1
  208. package/storybook-static/assets/{TreeTable.stories-CexcAFDG.js → TreeTable.stories-BjUwwZjp.js} +1 -1
  209. package/storybook-static/assets/{WithTooltip-7X4HQR7L-CceOi7V4.js → WithTooltip-7X4HQR7L-CUFIZPaf.js} +1 -1
  210. package/storybook-static/assets/{base-table-C0Zyxki6.js → base-table-cOtSkLXv.js} +1 -1
  211. package/storybook-static/assets/{blocks-CcO3Y_Rh.js → blocks-Ca82jrBU.js} +6 -6
  212. package/storybook-static/assets/{button-0yIdCp_-.js → button-BFuY_BqY.js} +1 -1
  213. package/storybook-static/assets/{check-box-vfk8jzFK.js → check-box-CmlDA0Xq.js} +1 -1
  214. package/storybook-static/assets/{chunk-3LY4VQVK-CZm0s4iL.js → chunk-3LY4VQVK-CDA9ib8M.js} +1 -1
  215. package/storybook-static/assets/{chunk-LITCR56V-C1XleE0V.js → chunk-LITCR56V-Mcli8zWg.js} +1 -1
  216. package/storybook-static/assets/{contextMenu-DJTYsh3u.js → contextMenu-BJxw-pJj.js} +1 -1
  217. package/storybook-static/assets/{error-7f4bI5b8.js → error-BwxipWa_.js} +1 -1
  218. package/storybook-static/assets/flex-BPTt9N_D.js +1 -0
  219. package/storybook-static/assets/{floating-ui.react-C-t718F2.js → floating-ui.react-CA8LXveu.js} +1 -1
  220. package/storybook-static/assets/formatter-L2YTDE3Q-CiF3j9Xe.js +1 -0
  221. package/storybook-static/assets/{formatters-c68ZHiVV.js → formatters-BSZSiQe7.js} +1 -1
  222. package/storybook-static/assets/grid-C5nOHfpH.js +1 -0
  223. package/storybook-static/assets/{hooks-Cia2yw95.js → hooks-rW6LwSJF.js} +1 -1
  224. package/storybook-static/assets/{iframe-B1ZJmGrq.js → iframe-DBBiRbws.js} +4 -4
  225. package/storybook-static/assets/{input-Bfb8MLis.js → input-DQGrA_Iz.js} +1 -1
  226. package/storybook-static/assets/{lucide-react-Cw6QPvVA.js → lucide-react-DbhedXaa.js} +1 -1
  227. package/storybook-static/assets/{mdx-react-shim-BGEl8pi6.js → mdx-react-shim-B-pYVQSG.js} +1 -1
  228. package/storybook-static/assets/{media-DsA0K_ZS.js → media-D2fdlN5C.js} +1 -1
  229. package/storybook-static/assets/{misc-zL4hFipW.js → misc-B5Fq527b.js} +1 -1
  230. package/storybook-static/assets/{notifications-BYXcjAgk.js → notifications-CdinTHBe.js} +1 -1
  231. package/storybook-static/assets/{odata-CZ14RE2x.js → odata-CpEOYNKi.js} +1 -1
  232. package/storybook-static/assets/odata-service-C0Syx7b6.js +1 -0
  233. package/storybook-static/assets/{odataStoryFixtures-Cv8XAuzz.js → odataStoryFixtures-dUEdLQNZ.js} +1 -1
  234. package/storybook-static/assets/{picker-DBhG__oJ.js → picker-Cuzrli2L.js} +1 -1
  235. package/storybook-static/assets/{popover-CahYWIfo.js → popover-BiSsB8FW.js} +1 -1
  236. package/storybook-static/assets/{preset-select-C5XCvtZE.js → preset-select-VPhuOafv.js} +1 -1
  237. package/storybook-static/assets/{react-18-BpKMg-Cr.js → react-18-Dj98SmrN.js} +1 -1
  238. package/storybook-static/assets/{react-DzMAKl9o.js → react-BuNie9Jj.js} +1 -1
  239. package/storybook-static/assets/{react-dom-BfFG7H_X.js → react-dom-H_XMZTBP.js} +1 -1
  240. package/storybook-static/assets/select-C0acjPk-.js +1 -0
  241. package/storybook-static/assets/{slider-CWiv9HFe.js → slider-DJkr9biy.js} +1 -1
  242. package/storybook-static/assets/{sortable-D_PcZ-1o.js → sortable-Wp4NkSxC.js} +1 -1
  243. package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-DatthS1s.js → syntaxhighlighter-RTCFPKCB-Bmk5Bc5f.js} +1 -1
  244. package/storybook-static/assets/{text-6oBGbhcX.js → text-TQB-LeS7.js} +1 -1
  245. package/storybook-static/assets/{theming-c9hibVvV.js → theming-BSLvozk8.js} +1 -1
  246. package/storybook-static/assets/ui-DaejdOMA.js +1 -0
  247. package/storybook-static/assets/{useODataSelectBase-BP43aYQp.js → useODataSelectBase-DTU8LMxW.js} +1 -1
  248. package/storybook-static/assets/{useODataTreeData-D-13yhFk.js → useODataTreeData-BIA97pbg.js} +1 -1
  249. package/storybook-static/assets/{utils-B7W0zPTP.js → utils-CJ9XKy2b.js} +1 -1
  250. package/storybook-static/iframe.html +1 -1
  251. package/storybook-static/index.json +1 -1
  252. package/storybook-static/project.json +1 -1
  253. package/dist/chunks/flex-CPO6xlPR.js.map +0 -1
  254. package/dist/chunks/grid-ByIIytjh.js.map +0 -1
  255. package/dist/image/ui/ImageSelection.d.ts +0 -40
  256. package/dist/image/ui/ImageSelection.d.ts.map +0 -1
  257. package/storybook-static/assets/Flex-CML6WrKV.js +0 -3
  258. package/storybook-static/assets/flex-fN9xAXRx.js +0 -1
  259. package/storybook-static/assets/formatter-L2YTDE3Q-BYPWeXB6.js +0 -1
  260. package/storybook-static/assets/grid-DnGlfdqF.js +0 -1
  261. package/storybook-static/assets/odata-service-FtP1kYQx.js +0 -1
  262. package/storybook-static/assets/select-C1fXLf5x.js +0 -1
  263. package/storybook-static/assets/ui-Cq8WdcMq.js +0 -1
@@ -81,69 +81,87 @@ var a = {
81
81
  e.area,
82
82
  e.column,
83
83
  e.row
84
- ]), u = t(({ children: t, className: a = "", as: c, style: l, templateColumns: u, templateRows: d, autoColumns: f, autoRows: p, areas: m, ...h }, g) => {
85
- let { activeBreakpoint: _ } = i(), v = n(() => ({
86
- ...h,
87
- inline: r(h.inline, _),
88
- row: r(h.row, _),
89
- column: r(h.column, _),
90
- dense: r(h.dense, _),
91
- gap: r(h.gap, _),
92
- gapRow: r(h.gapRow, _),
93
- gapColumn: r(h.gapColumn, _),
94
- align: r(h.align, _),
95
- justify: r(h.justify, _),
96
- alignContent: r(h.alignContent, _),
97
- justifyContent: r(h.justifyContent, _),
98
- variant: r(h.variant, _)
99
- }), [_, h]), y = n(() => ({
100
- templateColumns: r(u, _),
101
- templateRows: r(d, _),
102
- autoColumns: r(f, _),
103
- autoRows: r(p, _),
104
- areas: r(m, _)
84
+ ]), u = t(({ children: t, className: a = "", as: c, style: l, inline: u, row: d, column: f, dense: p, gap: m, gapRow: h, gapColumn: g, align: _, justify: v, alignContent: y, justifyContent: b, templateColumns: x, templateRows: S, autoColumns: C, autoRows: w, areas: T, variant: E, ...D }, O) => {
85
+ let { activeBreakpoint: k } = i(), A = n(() => ({
86
+ inline: r(u, k),
87
+ row: r(d, k),
88
+ column: r(f, k),
89
+ dense: r(p, k),
90
+ gap: r(m, k),
91
+ gapRow: r(h, k),
92
+ gapColumn: r(g, k),
93
+ align: r(_, k),
94
+ justify: r(v, k),
95
+ alignContent: r(y, k),
96
+ justifyContent: r(b, k),
97
+ variant: r(E, k)
105
98
  }), [
99
+ k,
106
100
  _,
107
- u,
108
- d,
101
+ y,
109
102
  f,
110
103
  p,
111
- m
112
- ]), b = o(v), x = s(y), S = [b, a].filter(Boolean).join(" "), C = {
113
- ...x,
104
+ m,
105
+ g,
106
+ h,
107
+ u,
108
+ v,
109
+ b,
110
+ d,
111
+ E
112
+ ]), j = n(() => ({
113
+ templateColumns: r(x, k),
114
+ templateRows: r(S, k),
115
+ autoColumns: r(C, k),
116
+ autoRows: r(w, k),
117
+ areas: r(T, k)
118
+ }), [
119
+ k,
120
+ x,
121
+ S,
122
+ C,
123
+ w,
124
+ T
125
+ ]), M = o(A), N = s(j), P = [M, a].filter(Boolean).join(" "), F = {
126
+ ...N,
114
127
  ...l
115
128
  };
116
129
  return e(c || "div", {
117
- ref: g,
118
- className: S,
119
- style: C
130
+ ...D,
131
+ ref: O,
132
+ className: P,
133
+ style: F
120
134
  }, t);
121
135
  });
122
136
  u.displayName = "GridContainer";
123
137
  //#endregion
124
138
  //#region src/grid/GridItem.tsx
125
- var d = t(({ children: t, className: a = "", as: o, style: s, area: u, column: d, row: f, ...p }, m) => {
126
- let { activeBreakpoint: h } = i(), g = n(() => ({
127
- ...p,
128
- alignSelf: r(p.alignSelf, h),
129
- justifySelf: r(p.justifySelf, h)
130
- }), [h, p]), _ = n(() => ({
131
- area: r(u, h),
132
- column: r(d, h),
133
- row: r(f, h)
139
+ var d = t(({ children: t, className: a = "", as: o, style: s, area: u, column: d, row: f, alignSelf: p, justifySelf: m, ...h }, g) => {
140
+ let { activeBreakpoint: _ } = i(), v = n(() => ({
141
+ alignSelf: r(p, _),
142
+ justifySelf: r(m, _)
134
143
  }), [
135
- h,
144
+ _,
145
+ p,
146
+ m
147
+ ]), y = n(() => ({
148
+ area: r(u, _),
149
+ column: r(d, _),
150
+ row: r(f, _)
151
+ }), [
152
+ _,
136
153
  u,
137
154
  d,
138
155
  f
139
- ]), v = c(g), y = l(_), b = [v, a].filter(Boolean).join(" "), x = {
140
- ...y,
156
+ ]), b = c(v), x = l(y), S = [b, a].filter(Boolean).join(" "), C = {
157
+ ...x,
141
158
  ...s
142
159
  };
143
160
  return e(o || "div", {
144
- ref: m,
145
- className: b,
146
- style: x
161
+ ...h,
162
+ ref: g,
163
+ className: S,
164
+ style: C
147
165
  }, t);
148
166
  });
149
167
  d.displayName = "GridItem";
@@ -156,4 +174,4 @@ var f = {
156
174
  //#endregion
157
175
  export { d as n, u as r, f as t };
158
176
 
159
- //# sourceMappingURL=grid-ByIIytjh.js.map
177
+ //# sourceMappingURL=grid-dI94AAbi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-dI94AAbi.js","names":[],"sources":["../../src/grid/Grid.module.scss","../../src/grid/useGridClasses.ts","../../src/grid/GridContainer.tsx","../../src/grid/GridItem.tsx","../../src/grid/Grid.tsx"],"sourcesContent":[".grid {\n\tdisplay: grid;\n\n\t// Display variants\n\t&.inline {\n\t\tdisplay: inline-grid;\n\t\tvertical-align: middle;\n\t}\n\n\t// Auto flow\n\t&.row {\n\t\tgrid-auto-flow: row;\n\t}\n\t&.column {\n\t\tgrid-auto-flow: column;\n\t}\n\t&.dense {\n\t\tgrid-auto-flow: dense;\n\t}\n\n\t// Gap properties (аналогично Flex)\n\t&.gapNone {\n\t\tgap: unset;\n\t}\n\n\t// Row gaps\n\t&.gapRowXs {\n\t\trow-gap: var(--space-xs);\n\t}\n\t&.gapRowSm {\n\t\trow-gap: var(--space-sm);\n\t}\n\t&.gapRowMd {\n\t\trow-gap: var(--space-md);\n\t}\n\t&.gapRowLg {\n\t\trow-gap: var(--space-lg);\n\t}\n\t&.gapRowXl {\n\t\trow-gap: var(--space-xl);\n\t}\n\n\t// Column gaps\n\t&.gapColumnXs {\n\t\tcolumn-gap: var(--space-xs);\n\t}\n\t&.gapColumnSm {\n\t\tcolumn-gap: var(--space-sm);\n\t}\n\t&.gapColumnMd {\n\t\tcolumn-gap: var(--space-md);\n\t}\n\t&.gapColumnLg {\n\t\tcolumn-gap: var(--space-lg);\n\t}\n\t&.gapColumnXl {\n\t\tcolumn-gap: var(--space-xl);\n\t}\n\n\t// Combined gaps\n\t&.gapXs {\n\t\trow-gap: var(--space-xs);\n\t\tcolumn-gap: var(--space-xs);\n\t}\n\t&.gapSm {\n\t\trow-gap: var(--space-sm);\n\t\tcolumn-gap: var(--space-sm);\n\t}\n\t&.gapMd {\n\t\trow-gap: var(--space-md);\n\t\tcolumn-gap: var(--space-md);\n\t}\n\t&.gapLg {\n\t\trow-gap: var(--space-lg);\n\t\tcolumn-gap: var(--space-lg);\n\t}\n\t&.gapXl {\n\t\trow-gap: var(--space-xl);\n\t\tcolumn-gap: var(--space-xl);\n\t}\n\n\t// Align items\n\t&.alignStart {\n\t\talign-items: start;\n\t}\n\t&.alignCenter {\n\t\talign-items: center;\n\t}\n\t&.alignEnd {\n\t\talign-items: end;\n\t}\n\t&.alignStretch {\n\t\talign-items: stretch;\n\t}\n\t&.alignBaseline {\n\t\talign-items: baseline;\n\t}\n\n\t// Justify items\n\t&.justifyStart {\n\t\tjustify-items: start;\n\t}\n\t&.justifyCenter {\n\t\tjustify-items: center;\n\t}\n\t&.justifyEnd {\n\t\tjustify-items: end;\n\t}\n\t&.justifyStretch {\n\t\tjustify-items: stretch;\n\t}\n\n\t// Align content\n\t&.alignContentStart {\n\t\talign-content: start;\n\t}\n\t&.alignContentCenter {\n\t\talign-content: center;\n\t}\n\t&.alignContentEnd {\n\t\talign-content: end;\n\t}\n\t&.alignContentStretch {\n\t\talign-content: stretch;\n\t}\n\t&.alignContentBetween {\n\t\talign-content: space-between;\n\t}\n\t&.alignContentAround {\n\t\talign-content: space-around;\n\t}\n\t&.alignContentEvenly {\n\t\talign-content: space-evenly;\n\t}\n\n\t// Justify content\n\t&.justifyContentStart {\n\t\tjustify-content: start;\n\t}\n\t&.justifyContentCenter {\n\t\tjustify-content: center;\n\t}\n\t&.justifyContentEnd {\n\t\tjustify-content: end;\n\t}\n\t&.justifyContentStretch {\n\t\tjustify-content: stretch;\n\t}\n\t&.justifyContentBetween {\n\t\tjustify-content: space-between;\n\t}\n\t&.justifyContentAround {\n\t\tjustify-content: space-around;\n\t}\n\t&.justifyContentEvenly {\n\t\tjustify-content: space-evenly;\n\t}\n}\n\n// Grid Item\n.item {\n\t// Grid placement\n\t&.areaAuto {\n\t\tgrid-area: auto;\n\t}\n\n\t// Align self\n\t&.alignSelfStart {\n\t\talign-self: start;\n\t}\n\t&.alignSelfCenter {\n\t\talign-self: center;\n\t}\n\t&.alignSelfEnd {\n\t\talign-self: end;\n\t}\n\t&.alignSelfStretch {\n\t\talign-self: stretch;\n\t}\n\t&.alignSelfBaseline {\n\t\talign-self: baseline;\n\t}\n\n\t// Justify self\n\t&.justifySelfStart {\n\t\tjustify-self: start;\n\t}\n\t&.justifySelfCenter {\n\t\tjustify-self: center;\n\t}\n\t&.justifySelfEnd {\n\t\tjustify-self: end;\n\t}\n\t&.justifySelfStretch {\n\t\tjustify-self: stretch;\n\t}\n}\n\n// Предопределенные композиции\n.autoRows1fr {\n\tgrid-auto-rows: 1fr;\n}\n\n.columnsAuto1fr {\n\tgrid-template-columns: auto 1fr;\n\tgrid-auto-rows: auto;\n}\n\n.singleColumn {\n\tgrid-template-columns: 100%;\n\tgrid-auto-rows: auto 1fr;\n}\n","import { CSSProperties, useMemo } from \"react\";\n\nimport { ResolvedProps } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport styles from \"./Grid.module.scss\";\n\nimport type { GridContainerLayoutProps, GridItemLayoutProps } from \"./types\";\n\ntype ClassName = string | undefined | null | false;\n\nexport type ResolvedGridContainerProps = ResolvedProps<GridContainerLayoutProps>;\nexport type ResolvedGridItemProps = ResolvedProps<GridItemLayoutProps>;\n\nexport const useGridContainerClasses = (props: ResolvedGridContainerProps) => {\n\treturn useMemo(() => {\n\t\tconst classes: ClassName[] = [styles.grid];\n\n\t\t// Display\n\t\tif (props.inline) classes.push(styles.inline);\n\n\t\t// Auto flow\n\t\tif (props.column) classes.push(styles.column);\n\t\telse if (props.dense) classes.push(styles.dense);\n\t\telse if (props.row) classes.push(styles.row);\n\n\t\t// Alignment\n\t\tif (props.align) classes.push(styles[`align${props.align.charAt(0).toUpperCase() + props.align.slice(1)}` as keyof typeof styles]);\n\n\t\t// Justify items\n\t\tif (props.justify)\n\t\t\tclasses.push(styles[`justify${props.justify.charAt(0).toUpperCase() + props.justify.slice(1)}` as keyof typeof styles]);\n\n\t\t// Justify content\n\t\tif (props.justifyContent)\n\t\t\tclasses.push(\n\t\t\t\tstyles[\n\t\t\t\t\t`justifyContent${props.justifyContent.charAt(0).toUpperCase() + props.justifyContent.slice(1)}` as keyof typeof styles\n\t\t\t\t]\n\t\t\t);\n\n\t\t// Align content\n\t\tif (props.alignContent)\n\t\t\tclasses.push(\n\t\t\t\tstyles[`alignContent${props.alignContent.charAt(0).toUpperCase() + props.alignContent.slice(1)}` as keyof typeof styles]\n\t\t\t);\n\n\t\t// Gap properties\n\t\tif (props.gap === \"none\") classes.push(styles.gapNone);\n\t\telse if (props.gap) classes.push(styles[`gap${props.gap.charAt(0).toUpperCase() + props.gap.slice(1)}` as keyof typeof styles]);\n\n\t\tif (props.gapRow)\n\t\t\tclasses.push(styles[`gapRow${props.gapRow.charAt(0).toUpperCase() + props.gapRow.slice(1)}` as keyof typeof styles]);\n\t\tif (props.gapColumn)\n\t\t\tclasses.push(styles[`gapColumn${props.gapColumn.charAt(0).toUpperCase() + props.gapColumn.slice(1)}` as keyof typeof styles]);\n\n\t\t// Предопределенные варианты\n\t\tif (props.variant === \"single-column\") classes.push(styles.singleColumn);\n\t\telse if (props.variant === \"auto-1fr\") classes.push(styles.autoRows1fr);\n\t\telse if (props.variant === \"auto1fr-rows-auto\") classes.push(styles.columnsAuto1fr);\n\n\t\treturn classes.filter(Boolean).join(\" \");\n\t}, [props]);\n};\n\nexport const useGridContainerStyles = (\n\tprops: Pick<ResolvedGridContainerProps, \"templateColumns\" | \"templateRows\" | \"autoColumns\" | \"autoRows\" | \"areas\">\n) => {\n\treturn useMemo(() => {\n\t\tconst styles: CSSProperties = {};\n\n\t\tif (props.templateColumns) {\n\t\t\t// if (typeof props.templateColumns === \"object\") {\n\t\t\t// styles.gridTemplateColumns = props.templateColumns;\n\t\t\t// } else {\n\t\t\tstyles.gridTemplateColumns = props.templateColumns;\n\t\t\t// }\n\t\t}\n\t\tif (props.templateRows) {\n\t\t\tstyles.gridTemplateRows = props.templateRows;\n\t\t}\n\t\tif (props.autoColumns) {\n\t\t\tstyles.gridAutoColumns = props.autoColumns;\n\t\t}\n\t\tif (props.autoRows) {\n\t\t\tstyles.gridAutoRows = props.autoRows;\n\t\t}\n\t\tif (props.areas) {\n\t\t\tstyles.gridTemplateAreas = props.areas;\n\t\t}\n\n\t\treturn styles;\n\t}, [props.templateColumns, props.templateRows, props.autoColumns, props.autoRows, props.areas]);\n};\n\nexport const useGridItemClasses = (props: ResolvedGridItemProps) => {\n\treturn useMemo(() => {\n\t\tconst classes: ClassName[] = [styles.item];\n\n\t\t// Self alignment\n\t\tif (props.alignSelf)\n\t\t\tclasses.push(styles[`alignSelf${props.alignSelf.charAt(0).toUpperCase() + props.alignSelf.slice(1)}` as keyof typeof styles]);\n\n\t\t// Justify self\n\t\tif (props.justifySelf)\n\t\t\tclasses.push(\n\t\t\t\tstyles[`justifySelf${props.justifySelf.charAt(0).toUpperCase() + props.justifySelf.slice(1)}` as keyof typeof styles]\n\t\t\t);\n\n\t\treturn classes.filter(Boolean).join(\" \");\n\t}, [props]);\n};\n\nexport const useGridItemStyles = (props: Pick<ResolvedGridItemProps, \"area\" | \"column\" | \"row\">) => {\n\treturn useMemo(() => {\n\t\tconst styles: CSSProperties = {};\n\n\t\tif (props.area) {\n\t\t\tstyles.gridArea = props.area;\n\t\t}\n\t\tif (props.column) {\n\t\t\tstyles.gridColumn = props.column;\n\t\t}\n\t\tif (props.row) {\n\t\t\tstyles.gridRow = props.row;\n\t\t}\n\n\t\treturn styles;\n\t}, [props.area, props.column, props.row]);\n};\n","import { createElement, forwardRef, useMemo } from \"react\";\n\nimport { resolveResponsiveValue, useMatchMedia } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport { GridContainerProps } from \"./types\";\nimport { useGridContainerClasses, useGridContainerStyles } from \"./useGridClasses\";\n\nexport const GridContainer = forwardRef<HTMLElement, GridContainerProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclassName = \"\",\n\t\t\tas,\n\t\t\tstyle,\n\t\t\tinline,\n\t\t\trow,\n\t\t\tcolumn,\n\t\t\tdense,\n\t\t\tgap,\n\t\t\tgapRow,\n\t\t\tgapColumn,\n\t\t\talign,\n\t\t\tjustify,\n\t\t\talignContent,\n\t\t\tjustifyContent,\n\t\t\ttemplateColumns,\n\t\t\ttemplateRows,\n\t\t\tautoColumns,\n\t\t\tautoRows,\n\t\t\tareas,\n\t\t\tvariant,\n\t\t\t...htmlProps\n\t\t},\n\t\tref\n\t) => {\n\t\tconst { activeBreakpoint } = useMatchMedia();\n\n\t\tconst resolved = useMemo(() => {\n\t\t\treturn {\n\t\t\t\tinline: resolveResponsiveValue(inline, activeBreakpoint),\n\n\t\t\t\trow: resolveResponsiveValue(row, activeBreakpoint),\n\t\t\t\tcolumn: resolveResponsiveValue(column, activeBreakpoint),\n\t\t\t\tdense: resolveResponsiveValue(dense, activeBreakpoint),\n\n\t\t\t\tgap: resolveResponsiveValue(gap, activeBreakpoint),\n\t\t\t\tgapRow: resolveResponsiveValue(gapRow, activeBreakpoint),\n\t\t\t\tgapColumn: resolveResponsiveValue(gapColumn, activeBreakpoint),\n\n\t\t\t\talign: resolveResponsiveValue(align, activeBreakpoint),\n\t\t\t\tjustify: resolveResponsiveValue(justify, activeBreakpoint),\n\t\t\t\talignContent: resolveResponsiveValue(alignContent, activeBreakpoint),\n\t\t\t\tjustifyContent: resolveResponsiveValue(justifyContent, activeBreakpoint),\n\n\t\t\t\tvariant: resolveResponsiveValue(variant, activeBreakpoint)\n\t\t\t};\n\t\t}, [activeBreakpoint, align, alignContent, column, dense, gap, gapColumn, gapRow, inline, justify, justifyContent, row, variant]);\n\n\t\tconst resolvedStyles = useMemo(() => {\n\t\t\treturn {\n\t\t\t\ttemplateColumns: resolveResponsiveValue(templateColumns, activeBreakpoint),\n\t\t\t\ttemplateRows: resolveResponsiveValue(templateRows, activeBreakpoint),\n\t\t\t\tautoColumns: resolveResponsiveValue(autoColumns, activeBreakpoint),\n\t\t\t\tautoRows: resolveResponsiveValue(autoRows, activeBreakpoint),\n\t\t\t\tareas: resolveResponsiveValue(areas, activeBreakpoint)\n\t\t\t};\n\t\t}, [activeBreakpoint, templateColumns, templateRows, autoColumns, autoRows, areas]);\n\n\t\tconst gridClasses = useGridContainerClasses(resolved);\n\t\tconst gridStyles = useGridContainerStyles(resolvedStyles);\n\n\t\tconst finalClassName = [gridClasses, className].filter(Boolean).join(\" \");\n\t\tconst finalStyle = { ...gridStyles, ...style };\n\t\tconst Component = as || \"div\";\n\n\t\treturn createElement(\n\t\t\tComponent,\n\n\t\t\t{\n\t\t\t\t...htmlProps,\n\t\t\t\tref,\n\t\t\t\tclassName: finalClassName,\n\t\t\t\tstyle: finalStyle\n\t\t\t},\n\t\t\tchildren\n\t\t);\n\t}\n);\n\nGridContainer.displayName = \"GridContainer\";\n","import { createElement, forwardRef, useMemo } from \"react\";\n\nimport { resolveResponsiveValue, useMatchMedia } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport { GridItemProps } from \"./types\";\nimport { useGridItemClasses, useGridItemStyles } from \"./useGridClasses\";\n\nexport const GridItem = forwardRef<HTMLElement, GridItemProps>(\n\t({ children, className = \"\", as, style, area, column, row, alignSelf, justifySelf, ...htmlProps }, ref) => {\n\t\tconst { activeBreakpoint } = useMatchMedia();\n\n\t\tconst resolvedProps = useMemo(() => {\n\t\t\treturn {\n\t\t\t\talignSelf: resolveResponsiveValue(alignSelf, activeBreakpoint),\n\t\t\t\tjustifySelf: resolveResponsiveValue(justifySelf, activeBreakpoint)\n\t\t\t};\n\t\t}, [activeBreakpoint, alignSelf, justifySelf]);\n\n\t\tconst resolvedPlacement = useMemo(() => {\n\t\t\treturn {\n\t\t\t\tarea: resolveResponsiveValue(area, activeBreakpoint),\n\t\t\t\tcolumn: resolveResponsiveValue(column, activeBreakpoint),\n\t\t\t\trow: resolveResponsiveValue(row, activeBreakpoint)\n\t\t\t};\n\t\t}, [activeBreakpoint, area, column, row]);\n\n\t\tconst gridClasses = useGridItemClasses(resolvedProps);\n\t\tconst gridStyles = useGridItemStyles(resolvedPlacement);\n\n\t\tconst finalClassName = [gridClasses, className].filter(Boolean).join(\" \");\n\t\tconst finalStyle = { ...gridStyles, ...style };\n\t\tconst Component = as || \"div\";\n\n\t\treturn createElement(\n\t\t\tComponent,\n\n\t\t\t{\n\t\t\t\t...htmlProps,\n\t\t\t\tref,\n\t\t\t\tclassName: finalClassName,\n\t\t\t\tstyle: finalStyle\n\t\t\t},\n\t\t\tchildren\n\t\t);\n\t}\n);\n\nGridItem.displayName = \"GridItem\";\n","import { GridContainer } from \"./GridContainer\";\nimport { GridItem } from \"./GridItem\";\n\nexport const Grid = {\n\tContainer: GridContainer,\n\tItem: GridItem\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as e } from "./popover-xJJqy1v6.js";
2
2
  import { Text as t } from "../text/index.js";
3
- import { n } from "./flex-CPO6xlPR.js";
3
+ import { n } from "./flex-DYZ0IbU6.js";
4
4
  import { PolymorphicComponent as r } from "../polymorphic/index.js";
5
5
  import { Suspense as i, forwardRef as a, useCallback as o, useEffect as s, useRef as c, useState as l, useSyncExternalStore as u } from "react";
6
6
  import { cn as d } from "@ryuzaki13/react-foundation-lib/utils";
@@ -295,4 +295,4 @@ function Z({ as: e, state: t, className: n, ...i }) {
295
295
  //#endregion
296
296
  export { D as _, G as a, U as c, L as d, I as f, k as g, A as h, K as i, H as l, P as m, q as n, Y as o, F as p, X as r, J as s, Z as t, R as u, T as v, w as y };
297
297
 
298
- //# sourceMappingURL=misc-1PxS8OWD.js.map
298
+ //# sourceMappingURL=misc-ClXJygTj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"misc-1PxS8OWD.js","names":[],"sources":["../../src/misc/AnimatedLogo.tsx","../../src/misc/CopyTextWrapper.tsx","../../src/misc/IconWrapper.module.scss","../../src/misc/IconWrapper.tsx","../../src/misc/LoadingMessage.module.scss","../../src/misc/Message.tsx","../../src/misc/LoadingMessage.tsx","../../src/misc/LazyDynamicComponent.tsx","../../src/misc/SkeletonLine.tsx","../../src/misc/LazyValue.tsx","../../src/misc/NoData.tsx","../../src/misc/Notice.tsx","../../src/misc/OneStepScroller.module.scss","../../src/misc/OneStepScroller.tsx","../../src/misc/Scrollable.tsx","../../src/misc/State.module.scss","../../src/misc/StateIcon.tsx","../../src/misc/StateWrapper.tsx"],"sourcesContent":["export function AnimatedLogo() {\n\treturn (\n\t\t<div className=\"logoAnimated\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"588\" height=\"696\" viewBox=\"0 0 588 696\" role=\"img\" aria-label=\"Загрузка\">\n\t\t\t\t<path className=\"logoSegment logoOutline logoS1\" d=\"M15,15v225.37l136.14-.23c44.13-.07,79.86-35.87,79.86-80V15H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS2\" d=\"M15,285v396s216,0,216,0v-316c0-44.18-35.82-80-80-80H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS3\" d=\"M276,15h297s0,225,0,225h-217c-44.18,0-80-35.82-80-80V15Z\" />\n\t\t\t\t<path\n\t\t\t\t\tclassName=\"logoSegment logoFill logoS4\"\n\t\t\t\t\td=\"M573,285v108h-169c-11.05,0-20,8.95-20,20v268h-108v-316c0-44.18,35.82-80,80-80h217Z\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport { useCopyElementTextWithFeedback } from \"@ryuzaki13/react-foundation-lib/copy\";\nimport { CheckCheckIcon, CopyIcon } from \"lucide-react\";\n\nimport { FloatingPopover } from \"../popover\";\n\ninterface CopyTextWrapperProps {\n\tchildren: React.ReactNode;\n\tposition?: Placement;\n\tshowOnHover?: boolean;\n\tclassName?: string;\n}\n\nexport const CopyTextWrapper: React.FC<CopyTextWrapperProps> = ({ children, position = \"top\", showOnHover = true, className }) => {\n\tconst { containerRef, copyElementText, isCopied } = useCopyElementTextWithFeedback<HTMLSpanElement>();\n\n\treturn (\n\t\t<span ref={containerRef} className={className}>\n\t\t\t{children}\n\t\t\t<FloatingPopover openOnHover={showOnHover} placement={position} content={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t<button onClick={copyElementText} aria-label={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t\t{isCopied ? <CheckCheckIcon className=\"block statusSuccess\" /> : <CopyIcon className=\"block statusInfo\" />}\n\t\t\t\t</button>\n\t\t\t</FloatingPopover>\n\t\t</span>\n\t);\n};\n",".wrapper {\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tmargin: auto;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./IconWrapper.module.scss\";\n\ninterface IconWrapperProps {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nexport function IconWrapper({ className, children }: IconWrapperProps) {\n\treturn <div className={cn(styles.wrapper, className)}>{children}</div>;\n}\n",".componentLoader {\n\tmin-height: 10em;\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { FlexCenter } from \"../flex\";\nimport { Text, TextColor } from \"../text\";\n\ninterface MessageProps extends PropsWithChildren {\n\tclassName?: string;\n\tcolor?: TextColor;\n\tminHeight?: string | number;\n\tuppercase?: boolean;\n}\n\nexport const Message: React.FC<MessageProps> = ({ className, children, color = \"muted\", minHeight, uppercase = true }) => (\n\t<FlexCenter className={cn(\"paddingMd textCenter\", className)} minHeight={minHeight}>\n\t\t<Text as=\"div\" weight=\"bold\" color={color} uppercase={uppercase}>\n\t\t\t{children}\n\t\t</Text>\n\t</FlexCenter>\n);\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { AnimatedLogo } from \"./AnimatedLogo\";\nimport styles from \"./LoadingMessage.module.scss\";\nimport { Message } from \"./Message\";\n\ninterface LoadingMessageProps {\n\tclassName?: string;\n\ttext?: string;\n\twithLogo?: boolean;\n}\n\nexport function LoadingMessage({ className, text, withLogo }: LoadingMessageProps) {\n\treturn (\n\t\t<Message className={cn(styles.componentLoader, withLogo ? \"\" : \"skeletonLine\", className)}>\n\t\t\t{withLogo && <AnimatedLogo />}\n\n\t\t\t{text || \"Загрузка...\"}\n\t\t</Message>\n\t);\n}\n","import { Suspense, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\n\nimport { useLazyComponent } from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { LoadingMessage } from \"./LoadingMessage\";\n\ntype LazyDynamicComponentProps<T extends object> = {\n\timportFunc: () => Promise<Record<string, ComponentType<T>> | null>;\n\tcomponentName: string;\n\tcacheKey?: string;\n\tclientOnly?: boolean;\n\tfallback?: ReactNode;\n\tprops?: T;\n};\n\nconst subscribeClientOnlyMount = (onStoreChange: () => void) => {\n\tonStoreChange();\n\n\treturn () => undefined;\n};\n\nconst getClientSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\n/**\n * Компонент ленивой загрузки динамически импортируемого React-компонента. Позволяет отложить загрузку тяжелых частей интерфейса до момента использования.\n */\nexport function LazyDynamicComponent<T extends object>({\n\tfallback,\n\timportFunc,\n\tcomponentName,\n\tclientOnly = false,\n\tcacheKey,\n\tprops\n}: LazyDynamicComponentProps<T>) {\n\tconst Component = useLazyComponent(importFunc, componentName, cacheKey);\n\tconst isClient = useSyncExternalStore(subscribeClientOnlyMount, getClientSnapshot, getServerSnapshot);\n\n\tconst fallbackNode = fallback ?? <LoadingMessage text=\"Ожидание компонента...\" />;\n\n\t// Client-only режим нужен для браузерных модулей, которые нельзя даже пытаться импортировать во время SSR.\n\tif (clientOnly && !isClient) return fallbackNode;\n\n\treturn (\n\t\t<Suspense fallback={fallbackNode}>\n\t\t\t{/* eslint-disable-next-line react-hooks/static-components */}\n\t\t\t<Component {...(props ?? ({} as T))} />\n\t\t</Suspense>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\ntype SkeletonLineOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tclassName?: string;\n};\n\ntype SkeletonLineProps<E extends React.ElementType> = SkeletonLineOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof SkeletonLineOwnProps>;\n\nexport const SkeletonLine = <E extends React.ElementType>({ as, className, ...props }: SkeletonLineProps<E>) => {\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(\"skeletonLine colorTransparent radiusSm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n","import React from \"react\";\n\nimport { SkeletonLine } from \"./SkeletonLine\";\n\ninterface LazyValueProps {\n\tvalue: React.ReactNode;\n\tisLoading?: boolean;\n}\n\nexport function LazyValue({ value, isLoading }: LazyValueProps) {\n\treturn isLoading ? <SkeletonLine>Загрузка...</SkeletonLine> : (value ?? \"-\");\n}\n","import { Message } from \"./Message\";\n\ninterface NoDataProps {\n\tclassName?: string;\n\ttext?: string;\n\tminHeight?: string | number;\n}\n\nexport const NoData = ({ className, text, minHeight = \"5em\" }: NoDataProps) => {\n\treturn (\n\t\t<Message className={className} color=\"muted\" minHeight={minHeight}>\n\t\t\t{text || \"Нет данных\"}\n\t\t</Message>\n\t);\n};\n","import { PropsWithChildren } from \"react\";\n\nimport { Message } from \"./Message\";\n\ninterface NoticeProps extends PropsWithChildren {\n\tisError?: boolean;\n\tclassName?: string;\n}\n\nexport const Notice: React.FC<NoticeProps> = ({ className, isError, children }) => (\n\t<Message className={className} color={isError ? \"error\" : \"secondary\"}>\n\t\t{children}\n\t</Message>\n);\n",".oneStepScroller {\n\toverflow: hidden;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmin-width: 0;\n}\n\n.ossViewport {\n\toverflow: hidden;\n\toutline: none;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.ossScroller {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tgap: var(--space-sm);\n\talign-items: end;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tscroll-behavior: smooth;\n\t-webkit-overflow-scrolling: touch;\n\tscrollbar-width: none; /* firefox */\n\n\t::-webkit-scrollbar {\n\t\theight: 0;\n\t}\n}\n\n.ossButton {\n\t// position: absolute;\n\ttop: 0;\n\tz-index: 10;\n\twidth: var(--control-height);\n\theight: 100%;\n\tflex: 0 0 var(--control-height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\t// border: var(--border);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\t// background-color: var(--surface-0);\n\t// opacity: 0.75;\n\n\ttransition-property: opacity, color;\n\ttransition-duration: var(--transition-fast);\n\n\t&:hover {\n\t\topacity: 1;\n\t\tcolor: var(--content-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t// &.prev {\n\t// \tleft: 0;\n\t// }\n\n\t// &.next {\n\t// \tright: 0;\n\t// }\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\n\nimport styles from \"./OneStepScroller.module.scss\";\n\ninterface OneStepScrollerProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t/**\n\t * CSS-селектор элементов, которые считаются \"шагами\" скролла.\n\t * По умолчанию используются прямые потомки скроллера.\n\t */\n\titemSelector?: string;\n\t/**\n\t * Дополнительный внутренний отступ (px) при прокрутке к фокусируемому элементу.\n\t */\n\tscrollPadding?: number;\n\t/**\n\t * Плавная прокрутка для кнопок и авто-доводки до видимости.\n\t */\n\tsmooth?: boolean;\n}\n\nconst EDGE_EPSILON_PX = 1;\n\nfunction maxScrollLeft(scroller: HTMLElement) {\n\treturn Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n}\n\n/**\n * Горизонтальный скроллер \"по одному элементу\".\n *\n * Ожидает элементы фиксированной ширины (или близкой к фиксированной),\n * чтобы шаг скролла соответствовал ширине одного элемента.\n */\nexport const OneStepScroller: React.FC<OneStepScrollerProps> = ({\n\tchildren,\n\tclassName,\n\titemSelector,\n\tscrollPadding = 6,\n\tsmooth = true\n}) => {\n\tconst scrollerRef = useRef<HTMLDivElement | null>(null);\n\tconst rafIdRef = useRef<number | null>(null);\n\n\tconst [canScrollPrev, setCanScrollPrev] = useState(false);\n\tconst [canScrollNext, setCanScrollNext] = useState(false);\n\n\t/**\n\t * Получить список элементов-\"шагов\".\n\t *\n\t * Оптимизация: для дефолтного поведения используем `children` DOM-узла,\n\t * чтобы не выполнять `querySelectorAll` на каждый вызов.\n\t */\n\tconst getItems = useCallback((): HTMLElement[] => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return [];\n\n\t\tif (!itemSelector) {\n\t\t\treturn Array.from(scroller.children).filter((node): node is HTMLElement => node instanceof HTMLElement);\n\t\t}\n\n\t\treturn Array.from(scroller.querySelectorAll<HTMLElement>(itemSelector));\n\t}, [itemSelector]);\n\n\t/**\n\t * Найти \"элемент шага\" для произвольного target внутри скроллера.\n\t */\n\tconst findItemForTarget = useCallback(\n\t\t(target: HTMLElement): HTMLElement | null => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return null;\n\n\t\t\tif (itemSelector) {\n\t\t\t\tconst item = target.closest<HTMLElement>(itemSelector);\n\t\t\t\tif (item && scroller.contains(item)) return item;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet node: HTMLElement | null = target;\n\t\t\twhile (node && node.parentElement && node.parentElement !== scroller) {\n\t\t\t\tnode = node.parentElement;\n\t\t\t}\n\n\t\t\tif (node && node.parentElement === scroller) return node;\n\t\t\treturn null;\n\t\t},\n\t\t[itemSelector]\n\t);\n\n\t/**\n\t * Обновить состояние кнопок \"назад/вперед\".\n\t * Состояние меняется только при реальном отличии, чтобы не триггерить\n\t * лишние перерисовки на каждом событии scroll.\n\t */\n\tconst updateScrollButtons = useCallback(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) {\n\t\t\tsetCanScrollPrev(false);\n\t\t\tsetCanScrollNext(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\tconst current = Math.max(0, Math.min(scroller.scrollLeft, maxScrollLeft));\n\n\t\tconst nextCanScrollPrev = current > EDGE_EPSILON_PX;\n\t\tconst nextCanScrollNext = current < maxScrollLeft - EDGE_EPSILON_PX;\n\n\t\tsetCanScrollPrev((prev) => (prev === nextCanScrollPrev ? prev : nextCanScrollPrev));\n\t\tsetCanScrollNext((prev) => (prev === nextCanScrollNext ? prev : nextCanScrollNext));\n\t}, []);\n\n\t/**\n\t * Запланировать обновление кнопок в следующий animation frame.\n\t * Это снижает частоту вычислений при интенсивном scroll/resize.\n\t */\n\tconst scheduleUpdateScrollButtons = useCallback(() => {\n\t\tif (rafIdRef.current !== null) return;\n\n\t\trafIdRef.current = requestAnimationFrame(() => {\n\t\t\trafIdRef.current = null;\n\t\t\tupdateScrollButtons();\n\t\t});\n\t}, [updateScrollButtons]);\n\n\t/**\n\t * Прокрутка на N элементов (N может быть отрицательным).\n\t */\n\tconst scrollByItems = useCallback(\n\t\t(count: number) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst firstItem = getItems()[0];\n\t\t\tif (!firstItem) return;\n\n\t\t\tconst step = firstItem.getBoundingClientRect().width;\n\t\t\tif (!step) return;\n\n\t\t\tconst delta = Math.round(count * step);\n\t\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\t\tconst target = Math.max(0, Math.min(scroller.scrollLeft + delta, maxScrollLeft));\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: target,\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[getItems, smooth]\n\t);\n\n\t/**\n\t * Гарантировать полную видимость элемента в пределах viewport скроллера.\n\t */\n\tconst ensureFullyVisible = useCallback(\n\t\t(el: HTMLElement) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst scrollerRect = scroller.getBoundingClientRect();\n\t\t\tconst elementRect = el.getBoundingClientRect();\n\n\t\t\tconst elementLeft = elementRect.left - scrollerRect.left + scroller.scrollLeft;\n\t\t\tconst elementRight = elementLeft + elementRect.width;\n\n\t\t\tconst visibleLeft = scroller.scrollLeft;\n\t\t\tconst visibleRight = scroller.scrollLeft + scroller.clientWidth;\n\n\t\t\tif (elementLeft >= visibleLeft + EDGE_EPSILON_PX && elementRight <= visibleRight - EDGE_EPSILON_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet targetScrollLeft = scroller.scrollLeft;\n\t\t\tif (elementLeft < visibleLeft) {\n\t\t\t\ttargetScrollLeft = Math.max(0, elementLeft - scrollPadding);\n\t\t\t} else if (elementRight > visibleRight) {\n\t\t\t\ttargetScrollLeft = Math.min(maxScrollLeft(scroller), elementRight - scroller.clientWidth + scrollPadding);\n\t\t\t}\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: Math.round(targetScrollLeft),\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[scrollPadding, smooth]\n\t);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst handleFocusIn = (event: FocusEvent) => {\n\t\t\tconst target = event.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\tconst item = findItemForTarget(target);\n\t\t\tif (item) ensureFullyVisible(item);\n\t\t};\n\n\t\tscroller.addEventListener(\"focusin\", handleFocusIn);\n\t\treturn () => scroller.removeEventListener(\"focusin\", handleFocusIn);\n\t}, [ensureFullyVisible, findItemForTarget]);\n\n\t/**\n\t * Наблюдаем только за размером скроллера и изменением его DOM-структуры.\n\t * Это дешевле, чем подписка ResizeObserver на каждый элемент + IntersectionObserver.\n\t */\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst onScroll = () => scheduleUpdateScrollButtons();\n\t\tscroller.addEventListener(\"scroll\", onScroll, { passive: true });\n\n\t\tlet resizeObserver: ResizeObserver | null = null;\n\t\tif (typeof ResizeObserver !== \"undefined\") {\n\t\t\tresizeObserver = new ResizeObserver(scheduleUpdateScrollButtons);\n\t\t\tresizeObserver.observe(scroller);\n\t\t}\n\n\t\tlet mutationObserver: MutationObserver | null = null;\n\t\tif (typeof MutationObserver !== \"undefined\") {\n\t\t\tmutationObserver = new MutationObserver(scheduleUpdateScrollButtons);\n\t\t\tmutationObserver.observe(scroller, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: false\n\t\t\t});\n\t\t}\n\n\t\tscheduleUpdateScrollButtons();\n\n\t\treturn () => {\n\t\t\tscroller.removeEventListener(\"scroll\", onScroll);\n\t\t\tresizeObserver?.disconnect();\n\t\t\tmutationObserver?.disconnect();\n\n\t\t\tif (rafIdRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(rafIdRef.current);\n\t\t\t\trafIdRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [scheduleUpdateScrollButtons]);\n\n\t/**\n\t * При изменении children просим пересчитать видимость кнопок.\n\t */\n\tuseEffect(() => {\n\t\tscheduleUpdateScrollButtons();\n\t}, [children, scheduleUpdateScrollButtons]);\n\n\tconst handlePrev = () => scrollByItems(-1);\n\tconst handleNext = () => scrollByItems(1);\n\n\t/**\n\t * Клавиатурная доступность: стрелки влево/вправо двигают на один шаг.\n\t */\n\tconst onWrapperKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\thandlePrev();\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\thandleNext();\n\t\t}\n\t};\n\n\tconst hasScroll = canScrollPrev || canScrollNext;\n\n\treturn (\n\t\t<div className={cn(styles.oneStepScroller, className)} style={{ position: \"relative\" }}>\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг влево\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handlePrev}\n\t\t\t\t\tdisabled={!canScrollPrev}>\n\t\t\t\t\t<ChevronLeftIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t<div className={styles.ossViewport} onKeyDown={onWrapperKeyDown} role=\"group\" aria-label=\"Элементы прокрутки\">\n\t\t\t\t<div className={styles.ossScroller} ref={scrollerRef} aria-live=\"polite\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг вправо\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handleNext}\n\t\t\t\t\tdisabled={!canScrollNext}>\n\t\t\t\t\t<ChevronRightIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { forwardRef, PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\ninterface ScrollableProps extends PropsWithChildren {\n\tclassName?: string;\n\theight?: string | number;\n\tstable?: boolean;\n\toverscroll?: boolean;\n}\n\nexport const Scrollable = forwardRef<HTMLDivElement, ScrollableProps>(({ children, height, stable, overscroll, className }, ref) => {\n\treturn (\n\t\t<div ref={ref} className={cn(\"scrollable\", stable && \"stable\", overscroll && \"overscroll\", className)} style={{ height }}>\n\t\t\t{children}\n\t\t</div>\n\t);\n});\n\ninterface ScrollableBlockProps extends ScrollableProps {\n\tblockClassName?: string;\n}\n\nexport const ScrollableBlock = forwardRef<HTMLDivElement, ScrollableBlockProps>(({ blockClassName, ...props }, ref) => {\n\treturn (\n\t\t<div className={cn(blockClassName, \"overflowHidden w100 h100\")}>\n\t\t\t<Scrollable ref={ref} {...props} />\n\t\t</div>\n\t);\n});\n",".stateWrapper {\n\ttext-decoration: none;\n\tcolor: inherit;\n\tdisplay: block;\n\n\t// border: var(--border-width) solid var(--state-border-color, transparent);\n\tborder-left-style: solid;\n\tborder-left-color: var(--state-border-color, transparent);\n\tborder-left-width: 0.0625em; // 1px\n\tpadding-left: 0.25em; // 4px + 1px border\n\n\t&.status {\n\t\tborder-left-width: 0.3125em; // 5px\n\t\tpadding-left: 0;\n\n\t\t&.information {\n\t\t\tborder-left-color: var(--status-info-fill);\n\t\t}\n\n\t\t&.success {\n\t\t\tborder-left-color: var(--status-success-fill);\n\t\t}\n\n\t\t&.warning {\n\t\t\tborder-left-color: var(--status-warning-fill);\n\t\t}\n\n\t\t&.error {\n\t\t\tborder-left-color: var(--status-error-fill);\n\t\t}\n\t}\n}\n\n.state {\n\t&.information {\n\t\tcolor: var(--status-info-text);\n\n\t\tfill: var(--status-info-fill);\n\t\tstroke: var(--status-info-on-fill);\n\t}\n\n\t&.success {\n\t\tcolor: var(--status-success-text);\n\n\t\tfill: var(--status-success-fill);\n\t\tstroke: var(--status-success-on-fill);\n\t}\n\n\t&.warning {\n\t\tcolor: var(--status-warning-text);\n\n\t\tfill: var(--status-warning-fill);\n\t\tstroke: var(--status-warning-on-fill);\n\t\tstroke-width: 2px;\n\t}\n\n\t&.error {\n\t\tcolor: var(--status-error-text);\n\n\t\tfill: var(--status-error-fill);\n\t\tstroke: var(--status-error-on-fill);\n\t}\n}\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CircleAlertIcon, CircleCheckIcon, CircleXIcon, InfoIcon } from \"lucide-react\";\n\nimport styles from \"./State.module.scss\";\n\ninterface StateIconProps {\n\tstate: State;\n\ttext: string;\n\tclassName?: string;\n}\n\nexport const StateIcon: React.FC<StateIconProps> = ({ state = \"none\", text, className }) => {\n\tconst renderIcon = () => {\n\t\tswitch (state) {\n\t\t\tcase \"error\":\n\t\t\t\treturn <ErrorIcon />;\n\t\t\tcase \"warning\":\n\t\t\t\treturn <WarningIcon />;\n\t\t\tcase \"success\":\n\t\t\t\treturn <SuccessIcon />;\n\t\t\tcase \"information\":\n\t\t\t\treturn <InformationIcon />;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={cn(\"flexCenter gapSm\", className)}>\n\t\t\t{renderIcon()}\n\t\t\t{text}\n\t\t</div>\n\t);\n};\n\ninterface RenderStateIconProps {\n\tstate?: State;\n}\n\nexport const RenderStateIcon: React.FC<RenderStateIconProps> = ({ state }) => {\n\tswitch (state) {\n\t\tcase \"error\":\n\t\t\treturn <ErrorIcon />;\n\t\tcase \"warning\":\n\t\t\treturn <WarningIcon />;\n\t\tcase \"success\":\n\t\t\treturn <SuccessIcon />;\n\t\tcase \"information\":\n\t\t\treturn <InformationIcon />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const ErrorIcon = () => {\n\treturn <CircleXIcon className={cn(styles.state, styles.error)} />;\n};\nexport const WarningIcon = () => {\n\treturn <CircleAlertIcon className={cn(styles.state, styles.warning)} />;\n};\nexport const SuccessIcon = () => {\n\treturn <CircleCheckIcon className={cn(styles.state, styles.success)} />;\n};\nexport const InformationIcon = () => {\n\treturn <InfoIcon className={cn(styles.state, styles.information)} />;\n};\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\nimport styles from \"./State.module.scss\";\n\ntype StateWrapperOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tstate?: State;\n\tclassName?: string;\n};\n\ntype StateWrapperProps<E extends React.ElementType> = StateWrapperOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof StateWrapperOwnProps>;\n\nexport function StateWrapper<E extends React.ElementType>({ as, state, className, ...props }: StateWrapperProps<E>) {\n\tconst status = state?.toLowerCase() ?? \"none\";\n\tconst statusClass = styles[status as keyof typeof styles];\n\tconst isStatused = status && status !== \"none\";\n\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(styles.stateWrapper, isStatused && styles.status, statusClass, className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"misc-ClXJygTj.js","names":[],"sources":["../../src/misc/AnimatedLogo.tsx","../../src/misc/CopyTextWrapper.tsx","../../src/misc/IconWrapper.module.scss","../../src/misc/IconWrapper.tsx","../../src/misc/LoadingMessage.module.scss","../../src/misc/Message.tsx","../../src/misc/LoadingMessage.tsx","../../src/misc/LazyDynamicComponent.tsx","../../src/misc/SkeletonLine.tsx","../../src/misc/LazyValue.tsx","../../src/misc/NoData.tsx","../../src/misc/Notice.tsx","../../src/misc/OneStepScroller.module.scss","../../src/misc/OneStepScroller.tsx","../../src/misc/Scrollable.tsx","../../src/misc/State.module.scss","../../src/misc/StateIcon.tsx","../../src/misc/StateWrapper.tsx"],"sourcesContent":["export function AnimatedLogo() {\n\treturn (\n\t\t<div className=\"logoAnimated\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"588\" height=\"696\" viewBox=\"0 0 588 696\" role=\"img\" aria-label=\"Загрузка\">\n\t\t\t\t<path className=\"logoSegment logoOutline logoS1\" d=\"M15,15v225.37l136.14-.23c44.13-.07,79.86-35.87,79.86-80V15H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS2\" d=\"M15,285v396s216,0,216,0v-316c0-44.18-35.82-80-80-80H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS3\" d=\"M276,15h297s0,225,0,225h-217c-44.18,0-80-35.82-80-80V15Z\" />\n\t\t\t\t<path\n\t\t\t\t\tclassName=\"logoSegment logoFill logoS4\"\n\t\t\t\t\td=\"M573,285v108h-169c-11.05,0-20,8.95-20,20v268h-108v-316c0-44.18,35.82-80,80-80h217Z\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport { useCopyElementTextWithFeedback } from \"@ryuzaki13/react-foundation-lib/copy\";\nimport { CheckCheckIcon, CopyIcon } from \"lucide-react\";\n\nimport { FloatingPopover } from \"../popover\";\n\ninterface CopyTextWrapperProps {\n\tchildren: React.ReactNode;\n\tposition?: Placement;\n\tshowOnHover?: boolean;\n\tclassName?: string;\n}\n\nexport const CopyTextWrapper: React.FC<CopyTextWrapperProps> = ({ children, position = \"top\", showOnHover = true, className }) => {\n\tconst { containerRef, copyElementText, isCopied } = useCopyElementTextWithFeedback<HTMLSpanElement>();\n\n\treturn (\n\t\t<span ref={containerRef} className={className}>\n\t\t\t{children}\n\t\t\t<FloatingPopover openOnHover={showOnHover} placement={position} content={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t<button onClick={copyElementText} aria-label={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t\t{isCopied ? <CheckCheckIcon className=\"block statusSuccess\" /> : <CopyIcon className=\"block statusInfo\" />}\n\t\t\t\t</button>\n\t\t\t</FloatingPopover>\n\t\t</span>\n\t);\n};\n",".wrapper {\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tmargin: auto;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./IconWrapper.module.scss\";\n\ninterface IconWrapperProps {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nexport function IconWrapper({ className, children }: IconWrapperProps) {\n\treturn <div className={cn(styles.wrapper, className)}>{children}</div>;\n}\n",".componentLoader {\n\tmin-height: 10em;\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { FlexCenter } from \"../flex\";\nimport { Text, TextColor } from \"../text\";\n\ninterface MessageProps extends PropsWithChildren {\n\tclassName?: string;\n\tcolor?: TextColor;\n\tminHeight?: string | number;\n\tuppercase?: boolean;\n}\n\nexport const Message: React.FC<MessageProps> = ({ className, children, color = \"muted\", minHeight, uppercase = true }) => (\n\t<FlexCenter className={cn(\"paddingMd textCenter\", className)} minHeight={minHeight}>\n\t\t<Text as=\"div\" weight=\"bold\" color={color} uppercase={uppercase}>\n\t\t\t{children}\n\t\t</Text>\n\t</FlexCenter>\n);\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { AnimatedLogo } from \"./AnimatedLogo\";\nimport styles from \"./LoadingMessage.module.scss\";\nimport { Message } from \"./Message\";\n\ninterface LoadingMessageProps {\n\tclassName?: string;\n\ttext?: string;\n\twithLogo?: boolean;\n}\n\nexport function LoadingMessage({ className, text, withLogo }: LoadingMessageProps) {\n\treturn (\n\t\t<Message className={cn(styles.componentLoader, withLogo ? \"\" : \"skeletonLine\", className)}>\n\t\t\t{withLogo && <AnimatedLogo />}\n\n\t\t\t{text || \"Загрузка...\"}\n\t\t</Message>\n\t);\n}\n","import { Suspense, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\n\nimport { useLazyComponent } from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { LoadingMessage } from \"./LoadingMessage\";\n\ntype LazyDynamicComponentProps<T extends object> = {\n\timportFunc: () => Promise<Record<string, ComponentType<T>> | null>;\n\tcomponentName: string;\n\tcacheKey?: string;\n\tclientOnly?: boolean;\n\tfallback?: ReactNode;\n\tprops?: T;\n};\n\nconst subscribeClientOnlyMount = (onStoreChange: () => void) => {\n\tonStoreChange();\n\n\treturn () => undefined;\n};\n\nconst getClientSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\n/**\n * Компонент ленивой загрузки динамически импортируемого React-компонента. Позволяет отложить загрузку тяжелых частей интерфейса до момента использования.\n */\nexport function LazyDynamicComponent<T extends object>({\n\tfallback,\n\timportFunc,\n\tcomponentName,\n\tclientOnly = false,\n\tcacheKey,\n\tprops\n}: LazyDynamicComponentProps<T>) {\n\tconst Component = useLazyComponent(importFunc, componentName, cacheKey);\n\tconst isClient = useSyncExternalStore(subscribeClientOnlyMount, getClientSnapshot, getServerSnapshot);\n\n\tconst fallbackNode = fallback ?? <LoadingMessage text=\"Ожидание компонента...\" />;\n\n\t// Client-only режим нужен для браузерных модулей, которые нельзя даже пытаться импортировать во время SSR.\n\tif (clientOnly && !isClient) return fallbackNode;\n\n\treturn (\n\t\t<Suspense fallback={fallbackNode}>\n\t\t\t{/* eslint-disable-next-line react-hooks/static-components */}\n\t\t\t<Component {...(props ?? ({} as T))} />\n\t\t</Suspense>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\ntype SkeletonLineOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tclassName?: string;\n};\n\ntype SkeletonLineProps<E extends React.ElementType> = SkeletonLineOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof SkeletonLineOwnProps>;\n\nexport const SkeletonLine = <E extends React.ElementType>({ as, className, ...props }: SkeletonLineProps<E>) => {\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(\"skeletonLine colorTransparent radiusSm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n","import React from \"react\";\n\nimport { SkeletonLine } from \"./SkeletonLine\";\n\ninterface LazyValueProps {\n\tvalue: React.ReactNode;\n\tisLoading?: boolean;\n}\n\nexport function LazyValue({ value, isLoading }: LazyValueProps) {\n\treturn isLoading ? <SkeletonLine>Загрузка...</SkeletonLine> : (value ?? \"-\");\n}\n","import { Message } from \"./Message\";\n\ninterface NoDataProps {\n\tclassName?: string;\n\ttext?: string;\n\tminHeight?: string | number;\n}\n\nexport const NoData = ({ className, text, minHeight = \"5em\" }: NoDataProps) => {\n\treturn (\n\t\t<Message className={className} color=\"muted\" minHeight={minHeight}>\n\t\t\t{text || \"Нет данных\"}\n\t\t</Message>\n\t);\n};\n","import { PropsWithChildren } from \"react\";\n\nimport { Message } from \"./Message\";\n\ninterface NoticeProps extends PropsWithChildren {\n\tisError?: boolean;\n\tclassName?: string;\n}\n\nexport const Notice: React.FC<NoticeProps> = ({ className, isError, children }) => (\n\t<Message className={className} color={isError ? \"error\" : \"secondary\"}>\n\t\t{children}\n\t</Message>\n);\n",".oneStepScroller {\n\toverflow: hidden;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmin-width: 0;\n}\n\n.ossViewport {\n\toverflow: hidden;\n\toutline: none;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.ossScroller {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tgap: var(--space-sm);\n\talign-items: end;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tscroll-behavior: smooth;\n\t-webkit-overflow-scrolling: touch;\n\tscrollbar-width: none; /* firefox */\n\n\t::-webkit-scrollbar {\n\t\theight: 0;\n\t}\n}\n\n.ossButton {\n\t// position: absolute;\n\ttop: 0;\n\tz-index: 10;\n\twidth: var(--control-height);\n\theight: 100%;\n\tflex: 0 0 var(--control-height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\t// border: var(--border);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\t// background-color: var(--surface-0);\n\t// opacity: 0.75;\n\n\ttransition-property: opacity, color;\n\ttransition-duration: var(--transition-fast);\n\n\t&:hover {\n\t\topacity: 1;\n\t\tcolor: var(--content-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t// &.prev {\n\t// \tleft: 0;\n\t// }\n\n\t// &.next {\n\t// \tright: 0;\n\t// }\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\n\nimport styles from \"./OneStepScroller.module.scss\";\n\ninterface OneStepScrollerProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t/**\n\t * CSS-селектор элементов, которые считаются \"шагами\" скролла.\n\t * По умолчанию используются прямые потомки скроллера.\n\t */\n\titemSelector?: string;\n\t/**\n\t * Дополнительный внутренний отступ (px) при прокрутке к фокусируемому элементу.\n\t */\n\tscrollPadding?: number;\n\t/**\n\t * Плавная прокрутка для кнопок и авто-доводки до видимости.\n\t */\n\tsmooth?: boolean;\n}\n\nconst EDGE_EPSILON_PX = 1;\n\nfunction maxScrollLeft(scroller: HTMLElement) {\n\treturn Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n}\n\n/**\n * Горизонтальный скроллер \"по одному элементу\".\n *\n * Ожидает элементы фиксированной ширины (или близкой к фиксированной),\n * чтобы шаг скролла соответствовал ширине одного элемента.\n */\nexport const OneStepScroller: React.FC<OneStepScrollerProps> = ({\n\tchildren,\n\tclassName,\n\titemSelector,\n\tscrollPadding = 6,\n\tsmooth = true\n}) => {\n\tconst scrollerRef = useRef<HTMLDivElement | null>(null);\n\tconst rafIdRef = useRef<number | null>(null);\n\n\tconst [canScrollPrev, setCanScrollPrev] = useState(false);\n\tconst [canScrollNext, setCanScrollNext] = useState(false);\n\n\t/**\n\t * Получить список элементов-\"шагов\".\n\t *\n\t * Оптимизация: для дефолтного поведения используем `children` DOM-узла,\n\t * чтобы не выполнять `querySelectorAll` на каждый вызов.\n\t */\n\tconst getItems = useCallback((): HTMLElement[] => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return [];\n\n\t\tif (!itemSelector) {\n\t\t\treturn Array.from(scroller.children).filter((node): node is HTMLElement => node instanceof HTMLElement);\n\t\t}\n\n\t\treturn Array.from(scroller.querySelectorAll<HTMLElement>(itemSelector));\n\t}, [itemSelector]);\n\n\t/**\n\t * Найти \"элемент шага\" для произвольного target внутри скроллера.\n\t */\n\tconst findItemForTarget = useCallback(\n\t\t(target: HTMLElement): HTMLElement | null => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return null;\n\n\t\t\tif (itemSelector) {\n\t\t\t\tconst item = target.closest<HTMLElement>(itemSelector);\n\t\t\t\tif (item && scroller.contains(item)) return item;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet node: HTMLElement | null = target;\n\t\t\twhile (node && node.parentElement && node.parentElement !== scroller) {\n\t\t\t\tnode = node.parentElement;\n\t\t\t}\n\n\t\t\tif (node && node.parentElement === scroller) return node;\n\t\t\treturn null;\n\t\t},\n\t\t[itemSelector]\n\t);\n\n\t/**\n\t * Обновить состояние кнопок \"назад/вперед\".\n\t * Состояние меняется только при реальном отличии, чтобы не триггерить\n\t * лишние перерисовки на каждом событии scroll.\n\t */\n\tconst updateScrollButtons = useCallback(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) {\n\t\t\tsetCanScrollPrev(false);\n\t\t\tsetCanScrollNext(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\tconst current = Math.max(0, Math.min(scroller.scrollLeft, maxScrollLeft));\n\n\t\tconst nextCanScrollPrev = current > EDGE_EPSILON_PX;\n\t\tconst nextCanScrollNext = current < maxScrollLeft - EDGE_EPSILON_PX;\n\n\t\tsetCanScrollPrev((prev) => (prev === nextCanScrollPrev ? prev : nextCanScrollPrev));\n\t\tsetCanScrollNext((prev) => (prev === nextCanScrollNext ? prev : nextCanScrollNext));\n\t}, []);\n\n\t/**\n\t * Запланировать обновление кнопок в следующий animation frame.\n\t * Это снижает частоту вычислений при интенсивном scroll/resize.\n\t */\n\tconst scheduleUpdateScrollButtons = useCallback(() => {\n\t\tif (rafIdRef.current !== null) return;\n\n\t\trafIdRef.current = requestAnimationFrame(() => {\n\t\t\trafIdRef.current = null;\n\t\t\tupdateScrollButtons();\n\t\t});\n\t}, [updateScrollButtons]);\n\n\t/**\n\t * Прокрутка на N элементов (N может быть отрицательным).\n\t */\n\tconst scrollByItems = useCallback(\n\t\t(count: number) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst firstItem = getItems()[0];\n\t\t\tif (!firstItem) return;\n\n\t\t\tconst step = firstItem.getBoundingClientRect().width;\n\t\t\tif (!step) return;\n\n\t\t\tconst delta = Math.round(count * step);\n\t\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\t\tconst target = Math.max(0, Math.min(scroller.scrollLeft + delta, maxScrollLeft));\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: target,\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[getItems, smooth]\n\t);\n\n\t/**\n\t * Гарантировать полную видимость элемента в пределах viewport скроллера.\n\t */\n\tconst ensureFullyVisible = useCallback(\n\t\t(el: HTMLElement) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst scrollerRect = scroller.getBoundingClientRect();\n\t\t\tconst elementRect = el.getBoundingClientRect();\n\n\t\t\tconst elementLeft = elementRect.left - scrollerRect.left + scroller.scrollLeft;\n\t\t\tconst elementRight = elementLeft + elementRect.width;\n\n\t\t\tconst visibleLeft = scroller.scrollLeft;\n\t\t\tconst visibleRight = scroller.scrollLeft + scroller.clientWidth;\n\n\t\t\tif (elementLeft >= visibleLeft + EDGE_EPSILON_PX && elementRight <= visibleRight - EDGE_EPSILON_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet targetScrollLeft = scroller.scrollLeft;\n\t\t\tif (elementLeft < visibleLeft) {\n\t\t\t\ttargetScrollLeft = Math.max(0, elementLeft - scrollPadding);\n\t\t\t} else if (elementRight > visibleRight) {\n\t\t\t\ttargetScrollLeft = Math.min(maxScrollLeft(scroller), elementRight - scroller.clientWidth + scrollPadding);\n\t\t\t}\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: Math.round(targetScrollLeft),\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[scrollPadding, smooth]\n\t);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst handleFocusIn = (event: FocusEvent) => {\n\t\t\tconst target = event.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\tconst item = findItemForTarget(target);\n\t\t\tif (item) ensureFullyVisible(item);\n\t\t};\n\n\t\tscroller.addEventListener(\"focusin\", handleFocusIn);\n\t\treturn () => scroller.removeEventListener(\"focusin\", handleFocusIn);\n\t}, [ensureFullyVisible, findItemForTarget]);\n\n\t/**\n\t * Наблюдаем только за размером скроллера и изменением его DOM-структуры.\n\t * Это дешевле, чем подписка ResizeObserver на каждый элемент + IntersectionObserver.\n\t */\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst onScroll = () => scheduleUpdateScrollButtons();\n\t\tscroller.addEventListener(\"scroll\", onScroll, { passive: true });\n\n\t\tlet resizeObserver: ResizeObserver | null = null;\n\t\tif (typeof ResizeObserver !== \"undefined\") {\n\t\t\tresizeObserver = new ResizeObserver(scheduleUpdateScrollButtons);\n\t\t\tresizeObserver.observe(scroller);\n\t\t}\n\n\t\tlet mutationObserver: MutationObserver | null = null;\n\t\tif (typeof MutationObserver !== \"undefined\") {\n\t\t\tmutationObserver = new MutationObserver(scheduleUpdateScrollButtons);\n\t\t\tmutationObserver.observe(scroller, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: false\n\t\t\t});\n\t\t}\n\n\t\tscheduleUpdateScrollButtons();\n\n\t\treturn () => {\n\t\t\tscroller.removeEventListener(\"scroll\", onScroll);\n\t\t\tresizeObserver?.disconnect();\n\t\t\tmutationObserver?.disconnect();\n\n\t\t\tif (rafIdRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(rafIdRef.current);\n\t\t\t\trafIdRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [scheduleUpdateScrollButtons]);\n\n\t/**\n\t * При изменении children просим пересчитать видимость кнопок.\n\t */\n\tuseEffect(() => {\n\t\tscheduleUpdateScrollButtons();\n\t}, [children, scheduleUpdateScrollButtons]);\n\n\tconst handlePrev = () => scrollByItems(-1);\n\tconst handleNext = () => scrollByItems(1);\n\n\t/**\n\t * Клавиатурная доступность: стрелки влево/вправо двигают на один шаг.\n\t */\n\tconst onWrapperKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\thandlePrev();\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\thandleNext();\n\t\t}\n\t};\n\n\tconst hasScroll = canScrollPrev || canScrollNext;\n\n\treturn (\n\t\t<div className={cn(styles.oneStepScroller, className)} style={{ position: \"relative\" }}>\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг влево\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handlePrev}\n\t\t\t\t\tdisabled={!canScrollPrev}>\n\t\t\t\t\t<ChevronLeftIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t<div className={styles.ossViewport} onKeyDown={onWrapperKeyDown} role=\"group\" aria-label=\"Элементы прокрутки\">\n\t\t\t\t<div className={styles.ossScroller} ref={scrollerRef} aria-live=\"polite\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг вправо\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handleNext}\n\t\t\t\t\tdisabled={!canScrollNext}>\n\t\t\t\t\t<ChevronRightIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { forwardRef, PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\ninterface ScrollableProps extends PropsWithChildren {\n\tclassName?: string;\n\theight?: string | number;\n\tstable?: boolean;\n\toverscroll?: boolean;\n}\n\nexport const Scrollable = forwardRef<HTMLDivElement, ScrollableProps>(({ children, height, stable, overscroll, className }, ref) => {\n\treturn (\n\t\t<div ref={ref} className={cn(\"scrollable\", stable && \"stable\", overscroll && \"overscroll\", className)} style={{ height }}>\n\t\t\t{children}\n\t\t</div>\n\t);\n});\n\ninterface ScrollableBlockProps extends ScrollableProps {\n\tblockClassName?: string;\n}\n\nexport const ScrollableBlock = forwardRef<HTMLDivElement, ScrollableBlockProps>(({ blockClassName, ...props }, ref) => {\n\treturn (\n\t\t<div className={cn(blockClassName, \"overflowHidden w100 h100\")}>\n\t\t\t<Scrollable ref={ref} {...props} />\n\t\t</div>\n\t);\n});\n",".stateWrapper {\n\ttext-decoration: none;\n\tcolor: inherit;\n\tdisplay: block;\n\n\t// border: var(--border-width) solid var(--state-border-color, transparent);\n\tborder-left-style: solid;\n\tborder-left-color: var(--state-border-color, transparent);\n\tborder-left-width: 0.0625em; // 1px\n\tpadding-left: 0.25em; // 4px + 1px border\n\n\t&.status {\n\t\tborder-left-width: 0.3125em; // 5px\n\t\tpadding-left: 0;\n\n\t\t&.information {\n\t\t\tborder-left-color: var(--status-info-fill);\n\t\t}\n\n\t\t&.success {\n\t\t\tborder-left-color: var(--status-success-fill);\n\t\t}\n\n\t\t&.warning {\n\t\t\tborder-left-color: var(--status-warning-fill);\n\t\t}\n\n\t\t&.error {\n\t\t\tborder-left-color: var(--status-error-fill);\n\t\t}\n\t}\n}\n\n.state {\n\t&.information {\n\t\tcolor: var(--status-info-text);\n\n\t\tfill: var(--status-info-fill);\n\t\tstroke: var(--status-info-on-fill);\n\t}\n\n\t&.success {\n\t\tcolor: var(--status-success-text);\n\n\t\tfill: var(--status-success-fill);\n\t\tstroke: var(--status-success-on-fill);\n\t}\n\n\t&.warning {\n\t\tcolor: var(--status-warning-text);\n\n\t\tfill: var(--status-warning-fill);\n\t\tstroke: var(--status-warning-on-fill);\n\t\tstroke-width: 2px;\n\t}\n\n\t&.error {\n\t\tcolor: var(--status-error-text);\n\n\t\tfill: var(--status-error-fill);\n\t\tstroke: var(--status-error-on-fill);\n\t}\n}\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CircleAlertIcon, CircleCheckIcon, CircleXIcon, InfoIcon } from \"lucide-react\";\n\nimport styles from \"./State.module.scss\";\n\ninterface StateIconProps {\n\tstate: State;\n\ttext: string;\n\tclassName?: string;\n}\n\nexport const StateIcon: React.FC<StateIconProps> = ({ state = \"none\", text, className }) => {\n\tconst renderIcon = () => {\n\t\tswitch (state) {\n\t\t\tcase \"error\":\n\t\t\t\treturn <ErrorIcon />;\n\t\t\tcase \"warning\":\n\t\t\t\treturn <WarningIcon />;\n\t\t\tcase \"success\":\n\t\t\t\treturn <SuccessIcon />;\n\t\t\tcase \"information\":\n\t\t\t\treturn <InformationIcon />;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={cn(\"flexCenter gapSm\", className)}>\n\t\t\t{renderIcon()}\n\t\t\t{text}\n\t\t</div>\n\t);\n};\n\ninterface RenderStateIconProps {\n\tstate?: State;\n}\n\nexport const RenderStateIcon: React.FC<RenderStateIconProps> = ({ state }) => {\n\tswitch (state) {\n\t\tcase \"error\":\n\t\t\treturn <ErrorIcon />;\n\t\tcase \"warning\":\n\t\t\treturn <WarningIcon />;\n\t\tcase \"success\":\n\t\t\treturn <SuccessIcon />;\n\t\tcase \"information\":\n\t\t\treturn <InformationIcon />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const ErrorIcon = () => {\n\treturn <CircleXIcon className={cn(styles.state, styles.error)} />;\n};\nexport const WarningIcon = () => {\n\treturn <CircleAlertIcon className={cn(styles.state, styles.warning)} />;\n};\nexport const SuccessIcon = () => {\n\treturn <CircleCheckIcon className={cn(styles.state, styles.success)} />;\n};\nexport const InformationIcon = () => {\n\treturn <InfoIcon className={cn(styles.state, styles.information)} />;\n};\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\nimport styles from \"./State.module.scss\";\n\ntype StateWrapperOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tstate?: State;\n\tclassName?: string;\n};\n\ntype StateWrapperProps<E extends React.ElementType> = StateWrapperOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof StateWrapperOwnProps>;\n\nexport function StateWrapper<E extends React.ElementType>({ as, state, className, ...props }: StateWrapperProps<E>) {\n\tconst status = state?.toLowerCase() ?? \"none\";\n\tconst statusClass = styles[status as keyof typeof styles];\n\tconst isStatused = status && status !== \"none\";\n\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(styles.stateWrapper, isStatused && styles.status, statusClass, className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { o as e } from "./flex-CPO6xlPR.js";
1
+ import { o as e } from "./flex-DYZ0IbU6.js";
2
2
  import { n as t } from "./button-CC0Jdx1j.js";
3
- import { r as n } from "./grid-ByIIytjh.js";
4
- import { c as r } from "./misc-1PxS8OWD.js";
3
+ import { r as n } from "./grid-dI94AAbi.js";
4
+ import { c as r } from "./misc-ClXJygTj.js";
5
5
  import { Children as i, createContext as a, useCallback as o, useContext as s, useEffect as c, useEffectEvent as l, useId as u, useRef as d, useState as f } from "react";
6
6
  import { cn as p } from "@ryuzaki13/react-foundation-lib/utils";
7
7
  import { X as m } from "lucide-react";
@@ -150,4 +150,4 @@ function k({ children: e, compensateScrollbar: t = !1 }) {
150
150
  //#endregion
151
151
  export { T as a, D as i, O as n, C as o, E as r, w as s, k as t };
152
152
 
153
- //# sourceMappingURL=modal-4vYSSbAa.js.map
153
+ //# sourceMappingURL=modal-QGp5CjB9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modal-4vYSSbAa.js","names":[],"sources":["../../src/modal/Modal.module.scss","../../src/modal/useModalManager.ts","../../src/modal/Modal.tsx","../../src/modal/ModalManagerProvider.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.modal {\n\tdisplay: grid;\n\tgrid-auto-rows: auto 1fr;\n\n\tposition: fixed;\n\tinset: 0;\n\tmargin: auto;\n\tz-index: var(--z-modal);\n\twidth: 90%;\n\theight: fit-content;\n\tmax-height: calc(100dvh - var(--space-lg));\n\tborder: var(--border);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-1);\n\tbox-shadow: var(--shadow-lg);\n\n\t&:not(:last-child) {\n\t\tpointer-events: none;\n\t\tfilter: grayscale(0.5) opacity(0.75);\n\t\t// opacity: 0.5;\n\t}\n\n\t&.sm {\n\t\tmax-width: min(30em, 93dvw);\n\t}\n\n\t&.md {\n\t\tmax-width: min(50em, 93dvw);\n\t}\n\n\t&.lg {\n\t\tmax-width: min(70em, 93dvw);\n\t}\n\n\t&.xl {\n\t\tmax-width: min(80em, 93dvw);\n\t}\n\n\t&.xxl {\n\t\twidth: 93dvw;\n\t\theight: 90dvh;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t}\n\n\t&.inside {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\n\t\t.header,\n\t\t.body {\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbackground-color: var(--surface-2);\n\tborder-top-left-radius: var(--radius-md);\n\tborder-top-right-radius: var(--radius-md);\n}\n\n.headerText {\n\tmargin: 0;\n\tpadding-inline: var(--space-md);\n\tfont-size: var(--font-size-md);\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.headerButton {\n\tmargin-block: var(--space-xs);\n\tmargin-inline: var(--space-sm);\n\tflex: 0;\n}\n\n.body {\n\toverflow: hidden;\n\tborder-bottom-left-radius: var(--radius-md);\n\tborder-bottom-right-radius: var(--radius-md);\n}\n","import { createContext, useContext } from \"react\";\n\nexport const ModalManagerContext = createContext<{\n\tmodals: string[];\n\topenModal: (id: string) => void;\n\tcloseModal: (id: string) => void;\n\tisTopModal: (id: string) => boolean;\n}>({\n\tmodals: [],\n\topenModal: () => {},\n\tcloseModal: () => {},\n\tisTopModal: () => false\n});\n\nexport const useModalManager = () => useContext(ModalManagerContext);\n","import React, { Children, useEffect, useEffectEvent, useId, useState } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useFocusTrap } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { X } from \"lucide-react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Button } from \"../button\";\nimport { FlexContainer } from \"../flex\";\nimport { GridContainer } from \"../grid\";\nimport { Scrollable } from \"../misc\";\n\nimport styles from \"./Modal.module.scss\";\nimport { ModalSize } from \"./types\";\nimport { useModalManager } from \"./useModalManager\";\n\n// Подкомпоненты\nexport interface ModalCompositionProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}\n\nexport const ModalToolbar: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn <div className={cn(\"surface2 paddingMd borderBottom\", className)}>{children}</div>;\n};\nModalToolbar.displayName = \"Modal.Toolbar\";\n\nexport const ModalContent: React.FC<ModalCompositionProps & { scrollable?: boolean }> = ({ children, className, scrollable }) => {\n\treturn (\n\t\t<div className={cn(\"paddingMd h100 overflowHidden\", className)}>\n\t\t\t{scrollable ? <Scrollable className=\"h100\">{children}</Scrollable> : children}\n\t\t</div>\n\t);\n};\nModalContent.displayName = \"Modal.Content\";\n\nexport const ModalFooter: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn (\n\t\t<div className={cn(\"surface2 borderTop paddingMd\", className)}>\n\t\t\t<FlexContainer gap=\"sm\" align=\"center\" justify=\"end\">\n\t\t\t\t{children}\n\t\t\t</FlexContainer>\n\t\t</div>\n\t);\n};\nModalFooter.displayName = \"Modal.Footer\";\n\ntype ToolbarElement = React.ReactElement<ModalCompositionProps, typeof ModalToolbar>;\ntype ContentElement = React.ReactElement<ModalCompositionProps, typeof ModalContent>;\ntype FooterElement = React.ReactElement<ModalCompositionProps, typeof ModalFooter>;\n\ntype ModalChildren =\n\t[ToolbarElement, ContentElement, FooterElement] | [ToolbarElement, ContentElement] | [ContentElement, FooterElement] | ContentElement;\n\nexport interface ModalProps {\n\t/** Открыто ли модальное окно */\n\tisOpen?: boolean;\n\t/** Заголовок */\n\ttitle?: string;\n\t/** Размер модального окна */\n\tsize?: keyof typeof ModalSize;\n\theight?: string;\n\t/** Обработчик закрытия */\n\tonClose: () => void;\n\tchildren: ModalChildren;\n}\n\nexport const Modal: React.FC<ModalProps> = ({ isOpen, title, size = \"sm\", height, onClose, children }) => {\n\tconst modalId = useId();\n\tconst titleId = useId();\n\n\tconst { modals, openModal, closeModal, isTopModal } = useModalManager();\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst mountModal = useEffectEvent(() => setIsMounted(true));\n\tconst unmountModal = useEffectEvent(() => setIsMounted(false));\n\n\t/**\n\t * Если provider менеджера не подключен, считаем одиночную модалку активной,\n\t * иначе логика Escape/focus trap никогда не включится.\n\t */\n\tconst isActive = isOpen && (modals.length === 0 || isTopModal(modalId));\n\n\tconst modalRef = useFocusTrap(isOpen || false);\n\n\tuseEscapeDismiss({\n\t\tactive: isActive || false,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: modalRef\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\topenModal(modalId);\n\t\t\tmountModal();\n\t\t}\n\n\t\treturn () => {\n\t\t\tcloseModal(modalId);\n\t\t\tunmountModal();\n\t\t};\n\t}, [closeModal, isOpen, modalId, openModal]);\n\n\tif (!isMounted) return null;\n\n\tconst modalRoot = getOrCreatePortalRoot(\"modal-root\");\n\n\tif (!modalRoot) {\n\t\treturn null;\n\t}\n\n\tlet toolbar: React.ReactNode = null;\n\tlet content: React.ReactNode = null;\n\tlet footer: React.ReactNode = null;\n\n\tconst childArray = Children.toArray(children) as (ToolbarElement | ContentElement | FooterElement)[];\n\n\tfor (const child of childArray) {\n\t\tconst typeName = child.type.displayName;\n\n\t\tswitch (typeName) {\n\t\t\tcase ModalToolbar.displayName:\n\t\t\t\tif (toolbar) throw new Error(\"Modal: duplicate <Toolbar> found\");\n\t\t\t\ttoolbar = child; //.props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalFooter.displayName:\n\t\t\t\tif (footer) throw new Error(\"Modal: duplicate <Footer> found\");\n\t\t\t\tfooter = child; //props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalContent.displayName:\n\t\t\t\tif (content) throw new Error(\"Modal: duplicate <Content> found\");\n\t\t\t\tcontent = child; //.props.children;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn createPortal(\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={modalRef}\n\t\t\t\tclassName={cn(styles.modal, styles[size])}\n\t\t\t\tstyle={{ height }}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={titleId}\n\t\t\t\taria-describedby={`${titleId}-content`}>\n\t\t\t\t<div className={cn(styles.header, toolbar ? \"\" : \"borderBottom\")}>\n\t\t\t\t\t<h3 className={styles.headerText} id={titleId}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ticon={<X />}\n\t\t\t\t\t\tclassName={styles.headerButton}\n\t\t\t\t\t\tvariant={\"ghost\"}\n\t\t\t\t\t\tautoFocus={true}\n\t\t\t\t\t\taria-label={\"Закрыть модальное окно\"}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<GridContainer\n\t\t\t\t\tid={`${titleId}-content`}\n\t\t\t\t\ttemplateRows={`${toolbar ? \"auto\" : \"\"} 1fr ${footer ? \"auto\" : \"\"}`.trim()}\n\t\t\t\t\t// gap=\"md\"\n\t\t\t\t\tclassName={styles.body}>\n\t\t\t\t\t{toolbar}\n\t\t\t\t\t{content}\n\t\t\t\t\t{footer}\n\t\t\t\t</GridContainer>\n\t\t\t</div>\n\t\t</>,\n\t\tmodalRoot\n\t);\n};\n","// ModalManagerContext.tsx\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { ModalManagerContext } from \"./useModalManager\";\n\nexport interface ModalManagerProviderProps {\n\tchildren: React.ReactNode;\n\t/** Компенсирует исчезновение скроллбара правым padding у body. */\n\tcompensateScrollbar?: boolean;\n}\n\n/**\n * Провайдер для централизованного управления стеком модальных окон. Дает вложенным компонентам доступ к открытию и закрытию модалок через контекст.\n */\nexport function ModalManagerProvider({ children, compensateScrollbar = false }: ModalManagerProviderProps) {\n\tconst [modals, setModals] = useState<string[]>([]);\n\tconst prevModalsLength = useRef(0);\n\tconst scrollbarWidth = useRef(0);\n\tconst bodyPaddingRight = useRef(\"\");\n\tconst isScrollbarCompensated = useRef(false);\n\n\tconst openModal = useCallback((id: string) => {\n\t\tsetModals((prev) => [...prev, id]);\n\t}, []);\n\n\tconst closeModal = useCallback((id: string) => {\n\t\tsetModals((prev) => prev.filter((mid) => mid !== id));\n\t}, []);\n\n\tconst isTopModal = useCallback(\n\t\t(id: string) => {\n\t\t\treturn modals[modals.length - 1] === id;\n\t\t},\n\t\t[modals]\n\t);\n\n\tuseEffect(() => {\n\t\tconst wasEmpty = prevModalsLength.current === 0;\n\n\t\tif (wasEmpty && modals.length > 0) {\n\t\t\t// первая модалка открыта — ставим стили\n\t\t\tconst scrollY = window.scrollY;\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tscrollbarWidth.current = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\n\t\t\tbodyPaddingRight.current = document.body.style.paddingRight;\n\n\t\t\tdocument.body.style.position = \"fixed\";\n\t\t\tdocument.body.style.top = `-${scrollY}px`;\n\t\t\tdocument.body.style.width = \"100%\";\n\n\t\t\tif (compensateScrollbar) {\n\t\t\t\tdocument.body.style.paddingRight = `${scrollbarWidth.current}px`;\n\t\t\t\tisScrollbarCompensated.current = true;\n\t\t\t}\n\n\t\t\tappRoot?.setAttribute(\"inert\", \"true\");\n\n\t\t\tprevModalsLength.current = modals.length;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length > 0 && compensateScrollbar !== isScrollbarCompensated.current) {\n\t\t\tdocument.body.style.paddingRight = compensateScrollbar ? `${scrollbarWidth.current}px` : bodyPaddingRight.current;\n\t\t\tisScrollbarCompensated.current = compensateScrollbar;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length === 0) {\n\t\t\t// последняя модалка закрыта — снимаем стили\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tconst scrollY = parseInt(document.body.style.top || \"0\") * -1;\n\n\t\t\tdocument.body.style.position = \"\";\n\t\t\tdocument.body.style.top = \"\";\n\t\t\tdocument.body.style.width = \"\";\n\n\t\t\tif (isScrollbarCompensated.current) {\n\t\t\t\tdocument.body.style.paddingRight = bodyPaddingRight.current;\n\t\t\t\tisScrollbarCompensated.current = false;\n\t\t\t}\n\n\t\t\tappRoot?.removeAttribute(\"inert\");\n\n\t\t\twindow.scrollTo({ top: scrollY, left: 0, behavior: \"instant\" });\n\t\t}\n\n\t\tprevModalsLength.current = modals.length;\n\t}, [compensateScrollbar, modals.length]);\n\n\treturn <ModalManagerContext.Provider value={{ modals, openModal, closeModal, isTopModal }}>{children}</ModalManagerContext.Provider>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"modal-QGp5CjB9.js","names":[],"sources":["../../src/modal/Modal.module.scss","../../src/modal/useModalManager.ts","../../src/modal/Modal.tsx","../../src/modal/ModalManagerProvider.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.modal {\n\tdisplay: grid;\n\tgrid-auto-rows: auto 1fr;\n\n\tposition: fixed;\n\tinset: 0;\n\tmargin: auto;\n\tz-index: var(--z-modal);\n\twidth: 90%;\n\theight: fit-content;\n\tmax-height: calc(100dvh - var(--space-lg));\n\tborder: var(--border);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-1);\n\tbox-shadow: var(--shadow-lg);\n\n\t&:not(:last-child) {\n\t\tpointer-events: none;\n\t\tfilter: grayscale(0.5) opacity(0.75);\n\t\t// opacity: 0.5;\n\t}\n\n\t&.sm {\n\t\tmax-width: min(30em, 93dvw);\n\t}\n\n\t&.md {\n\t\tmax-width: min(50em, 93dvw);\n\t}\n\n\t&.lg {\n\t\tmax-width: min(70em, 93dvw);\n\t}\n\n\t&.xl {\n\t\tmax-width: min(80em, 93dvw);\n\t}\n\n\t&.xxl {\n\t\twidth: 93dvw;\n\t\theight: 90dvh;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t}\n\n\t&.inside {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\n\t\t.header,\n\t\t.body {\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbackground-color: var(--surface-2);\n\tborder-top-left-radius: var(--radius-md);\n\tborder-top-right-radius: var(--radius-md);\n}\n\n.headerText {\n\tmargin: 0;\n\tpadding-inline: var(--space-md);\n\tfont-size: var(--font-size-md);\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.headerButton {\n\tmargin-block: var(--space-xs);\n\tmargin-inline: var(--space-sm);\n\tflex: 0;\n}\n\n.body {\n\toverflow: hidden;\n\tborder-bottom-left-radius: var(--radius-md);\n\tborder-bottom-right-radius: var(--radius-md);\n}\n","import { createContext, useContext } from \"react\";\n\nexport const ModalManagerContext = createContext<{\n\tmodals: string[];\n\topenModal: (id: string) => void;\n\tcloseModal: (id: string) => void;\n\tisTopModal: (id: string) => boolean;\n}>({\n\tmodals: [],\n\topenModal: () => {},\n\tcloseModal: () => {},\n\tisTopModal: () => false\n});\n\nexport const useModalManager = () => useContext(ModalManagerContext);\n","import React, { Children, useEffect, useEffectEvent, useId, useState } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useFocusTrap } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { X } from \"lucide-react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Button } from \"../button\";\nimport { FlexContainer } from \"../flex\";\nimport { GridContainer } from \"../grid\";\nimport { Scrollable } from \"../misc\";\n\nimport styles from \"./Modal.module.scss\";\nimport { ModalSize } from \"./types\";\nimport { useModalManager } from \"./useModalManager\";\n\n// Подкомпоненты\nexport interface ModalCompositionProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}\n\nexport const ModalToolbar: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn <div className={cn(\"surface2 paddingMd borderBottom\", className)}>{children}</div>;\n};\nModalToolbar.displayName = \"Modal.Toolbar\";\n\nexport const ModalContent: React.FC<ModalCompositionProps & { scrollable?: boolean }> = ({ children, className, scrollable }) => {\n\treturn (\n\t\t<div className={cn(\"paddingMd h100 overflowHidden\", className)}>\n\t\t\t{scrollable ? <Scrollable className=\"h100\">{children}</Scrollable> : children}\n\t\t</div>\n\t);\n};\nModalContent.displayName = \"Modal.Content\";\n\nexport const ModalFooter: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn (\n\t\t<div className={cn(\"surface2 borderTop paddingMd\", className)}>\n\t\t\t<FlexContainer gap=\"sm\" align=\"center\" justify=\"end\">\n\t\t\t\t{children}\n\t\t\t</FlexContainer>\n\t\t</div>\n\t);\n};\nModalFooter.displayName = \"Modal.Footer\";\n\ntype ToolbarElement = React.ReactElement<ModalCompositionProps, typeof ModalToolbar>;\ntype ContentElement = React.ReactElement<ModalCompositionProps, typeof ModalContent>;\ntype FooterElement = React.ReactElement<ModalCompositionProps, typeof ModalFooter>;\n\ntype ModalChildren =\n\t[ToolbarElement, ContentElement, FooterElement] | [ToolbarElement, ContentElement] | [ContentElement, FooterElement] | ContentElement;\n\nexport interface ModalProps {\n\t/** Открыто ли модальное окно */\n\tisOpen?: boolean;\n\t/** Заголовок */\n\ttitle?: string;\n\t/** Размер модального окна */\n\tsize?: keyof typeof ModalSize;\n\theight?: string;\n\t/** Обработчик закрытия */\n\tonClose: () => void;\n\tchildren: ModalChildren;\n}\n\nexport const Modal: React.FC<ModalProps> = ({ isOpen, title, size = \"sm\", height, onClose, children }) => {\n\tconst modalId = useId();\n\tconst titleId = useId();\n\n\tconst { modals, openModal, closeModal, isTopModal } = useModalManager();\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst mountModal = useEffectEvent(() => setIsMounted(true));\n\tconst unmountModal = useEffectEvent(() => setIsMounted(false));\n\n\t/**\n\t * Если provider менеджера не подключен, считаем одиночную модалку активной,\n\t * иначе логика Escape/focus trap никогда не включится.\n\t */\n\tconst isActive = isOpen && (modals.length === 0 || isTopModal(modalId));\n\n\tconst modalRef = useFocusTrap(isOpen || false);\n\n\tuseEscapeDismiss({\n\t\tactive: isActive || false,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: modalRef\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\topenModal(modalId);\n\t\t\tmountModal();\n\t\t}\n\n\t\treturn () => {\n\t\t\tcloseModal(modalId);\n\t\t\tunmountModal();\n\t\t};\n\t}, [closeModal, isOpen, modalId, openModal]);\n\n\tif (!isMounted) return null;\n\n\tconst modalRoot = getOrCreatePortalRoot(\"modal-root\");\n\n\tif (!modalRoot) {\n\t\treturn null;\n\t}\n\n\tlet toolbar: React.ReactNode = null;\n\tlet content: React.ReactNode = null;\n\tlet footer: React.ReactNode = null;\n\n\tconst childArray = Children.toArray(children) as (ToolbarElement | ContentElement | FooterElement)[];\n\n\tfor (const child of childArray) {\n\t\tconst typeName = child.type.displayName;\n\n\t\tswitch (typeName) {\n\t\t\tcase ModalToolbar.displayName:\n\t\t\t\tif (toolbar) throw new Error(\"Modal: duplicate <Toolbar> found\");\n\t\t\t\ttoolbar = child; //.props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalFooter.displayName:\n\t\t\t\tif (footer) throw new Error(\"Modal: duplicate <Footer> found\");\n\t\t\t\tfooter = child; //props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalContent.displayName:\n\t\t\t\tif (content) throw new Error(\"Modal: duplicate <Content> found\");\n\t\t\t\tcontent = child; //.props.children;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn createPortal(\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={modalRef}\n\t\t\t\tclassName={cn(styles.modal, styles[size])}\n\t\t\t\tstyle={{ height }}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={titleId}\n\t\t\t\taria-describedby={`${titleId}-content`}>\n\t\t\t\t<div className={cn(styles.header, toolbar ? \"\" : \"borderBottom\")}>\n\t\t\t\t\t<h3 className={styles.headerText} id={titleId}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ticon={<X />}\n\t\t\t\t\t\tclassName={styles.headerButton}\n\t\t\t\t\t\tvariant={\"ghost\"}\n\t\t\t\t\t\tautoFocus={true}\n\t\t\t\t\t\taria-label={\"Закрыть модальное окно\"}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<GridContainer\n\t\t\t\t\tid={`${titleId}-content`}\n\t\t\t\t\ttemplateRows={`${toolbar ? \"auto\" : \"\"} 1fr ${footer ? \"auto\" : \"\"}`.trim()}\n\t\t\t\t\t// gap=\"md\"\n\t\t\t\t\tclassName={styles.body}>\n\t\t\t\t\t{toolbar}\n\t\t\t\t\t{content}\n\t\t\t\t\t{footer}\n\t\t\t\t</GridContainer>\n\t\t\t</div>\n\t\t</>,\n\t\tmodalRoot\n\t);\n};\n","// ModalManagerContext.tsx\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { ModalManagerContext } from \"./useModalManager\";\n\nexport interface ModalManagerProviderProps {\n\tchildren: React.ReactNode;\n\t/** Компенсирует исчезновение скроллбара правым padding у body. */\n\tcompensateScrollbar?: boolean;\n}\n\n/**\n * Провайдер для централизованного управления стеком модальных окон. Дает вложенным компонентам доступ к открытию и закрытию модалок через контекст.\n */\nexport function ModalManagerProvider({ children, compensateScrollbar = false }: ModalManagerProviderProps) {\n\tconst [modals, setModals] = useState<string[]>([]);\n\tconst prevModalsLength = useRef(0);\n\tconst scrollbarWidth = useRef(0);\n\tconst bodyPaddingRight = useRef(\"\");\n\tconst isScrollbarCompensated = useRef(false);\n\n\tconst openModal = useCallback((id: string) => {\n\t\tsetModals((prev) => [...prev, id]);\n\t}, []);\n\n\tconst closeModal = useCallback((id: string) => {\n\t\tsetModals((prev) => prev.filter((mid) => mid !== id));\n\t}, []);\n\n\tconst isTopModal = useCallback(\n\t\t(id: string) => {\n\t\t\treturn modals[modals.length - 1] === id;\n\t\t},\n\t\t[modals]\n\t);\n\n\tuseEffect(() => {\n\t\tconst wasEmpty = prevModalsLength.current === 0;\n\n\t\tif (wasEmpty && modals.length > 0) {\n\t\t\t// первая модалка открыта — ставим стили\n\t\t\tconst scrollY = window.scrollY;\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tscrollbarWidth.current = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\n\t\t\tbodyPaddingRight.current = document.body.style.paddingRight;\n\n\t\t\tdocument.body.style.position = \"fixed\";\n\t\t\tdocument.body.style.top = `-${scrollY}px`;\n\t\t\tdocument.body.style.width = \"100%\";\n\n\t\t\tif (compensateScrollbar) {\n\t\t\t\tdocument.body.style.paddingRight = `${scrollbarWidth.current}px`;\n\t\t\t\tisScrollbarCompensated.current = true;\n\t\t\t}\n\n\t\t\tappRoot?.setAttribute(\"inert\", \"true\");\n\n\t\t\tprevModalsLength.current = modals.length;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length > 0 && compensateScrollbar !== isScrollbarCompensated.current) {\n\t\t\tdocument.body.style.paddingRight = compensateScrollbar ? `${scrollbarWidth.current}px` : bodyPaddingRight.current;\n\t\t\tisScrollbarCompensated.current = compensateScrollbar;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length === 0) {\n\t\t\t// последняя модалка закрыта — снимаем стили\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tconst scrollY = parseInt(document.body.style.top || \"0\") * -1;\n\n\t\t\tdocument.body.style.position = \"\";\n\t\t\tdocument.body.style.top = \"\";\n\t\t\tdocument.body.style.width = \"\";\n\n\t\t\tif (isScrollbarCompensated.current) {\n\t\t\t\tdocument.body.style.paddingRight = bodyPaddingRight.current;\n\t\t\t\tisScrollbarCompensated.current = false;\n\t\t\t}\n\n\t\t\tappRoot?.removeAttribute(\"inert\");\n\n\t\t\twindow.scrollTo({ top: scrollY, left: 0, behavior: \"instant\" });\n\t\t}\n\n\t\tprevModalsLength.current = modals.length;\n\t}, [compensateScrollbar, modals.length]);\n\n\treturn <ModalManagerContext.Provider value={{ modals, openModal, closeModal, isTopModal }}>{children}</ModalManagerContext.Provider>;\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { i as e, o as t, t as n } from "./SelectOptionContent-lfEtHXfO.js";
2
2
  import { Text as r } from "../text/index.js";
3
3
  import { t as i } from "./ui.module-BisoTevy.js";
4
- import { t as a } from "./grid-ByIIytjh.js";
4
+ import { t as a } from "./grid-dI94AAbi.js";
5
5
  import { t as o } from "./check-box-BowNqqd3.js";
6
6
  import { a as s, c, d as l, f as u, i as d, l as f, n as p, r as ee, t as m, u as h } from "./picker-beNX-cW9.js";
7
7
  import { t as g } from "./separator-B72Aq-6a.js";
@@ -538,4 +538,4 @@ function _e({ label: e, description: t, disabled: n, placeholder: r, size: i, op
538
538
  //#endregion
539
539
  export { k as a, j as i, N as n, w as o, M as r, _e as t };
540
540
 
541
- //# sourceMappingURL=multi-select-r0ekR6Bh.js.map
541
+ //# sourceMappingURL=multi-select-DkfdFYm4.js.map