@ryuzaki13/react-foundation-ui 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/COLOR_TOKENS_MIGRATION.md +224 -0
  2. package/README.md +14 -18
  3. package/dist/advanced-search/index.js +8 -8
  4. package/dist/badge/index.js +1 -1
  5. package/dist/barcode-scanner/index.js +2 -2
  6. package/dist/base-table/index.js +1 -1
  7. package/dist/button/index.js +1 -1
  8. package/dist/check-box/index.js +1 -1
  9. package/dist/chunks/{CalendarView-Bhaov_XE.js → CalendarView-Dm55k0bN.js} +2 -2
  10. package/dist/chunks/CalendarView-Dm55k0bN.js.map +1 -0
  11. package/dist/chunks/ImageViewerRuntime-HGBWp9NM.js.map +1 -1
  12. package/dist/chunks/{TextEditorLexicalClient-CSXZQOYo.js → TextEditorLexicalClient-D46Zed55.js} +6 -6
  13. package/dist/chunks/TextEditorLexicalClient-D46Zed55.js.map +1 -0
  14. package/dist/chunks/{badge-DUI2ET6q.js → badge-6mXO9BWP.js} +2 -2
  15. package/dist/chunks/badge-6mXO9BWP.js.map +1 -0
  16. package/dist/chunks/{base-table-BqW1n7tv.js → base-table-BWvKfI2W.js} +2 -2
  17. package/dist/chunks/{base-table-BqW1n7tv.js.map → base-table-BWvKfI2W.js.map} +1 -1
  18. package/dist/chunks/{button-BaUlN-nt.js → button-DF21yxVp.js} +3 -3
  19. package/dist/chunks/{button-BaUlN-nt.js.map → button-DF21yxVp.js.map} +1 -1
  20. package/dist/chunks/{check-box-CC8CDnSR.js → check-box-CZyhzmR0.js} +3 -3
  21. package/dist/chunks/{check-box-CC8CDnSR.js.map → check-box-CZyhzmR0.js.map} +1 -1
  22. package/dist/chunks/{context-menu-Dj6MXgv6.js → context-menu-DgvXGCuI.js} +3 -3
  23. package/dist/chunks/context-menu-DgvXGCuI.js.map +1 -0
  24. package/dist/chunks/{date-input-DkLfO3Ng.js → date-input-BwLOiGXp.js} +5 -5
  25. package/dist/chunks/{date-input-DkLfO3Ng.js.map → date-input-BwLOiGXp.js.map} +1 -1
  26. package/dist/chunks/{input-D1jOxm0t.js → input-DSPKgiCK.js} +2 -2
  27. package/dist/chunks/input-DSPKgiCK.js.map +1 -0
  28. package/dist/chunks/{input-files-CDGpJaUm.js → input-files-tIS17-zX.js} +3 -3
  29. package/dist/chunks/input-files-tIS17-zX.js.map +1 -0
  30. package/dist/chunks/{input-search-Ci1ubGox.js → input-search-Cat4c7SM.js} +2 -2
  31. package/dist/chunks/{input-search-Ci1ubGox.js.map → input-search-Cat4c7SM.js.map} +1 -1
  32. package/dist/chunks/misc-DeGboAt-.js.map +1 -1
  33. package/dist/chunks/{modal-CbAwLHlM.js → modal-dplfAaER.js} +2 -2
  34. package/dist/chunks/{modal-CbAwLHlM.js.map → modal-dplfAaER.js.map} +1 -1
  35. package/dist/chunks/{multi-select-V7SLAduU.js → multi-select-BZ9N6Dal.js} +4 -4
  36. package/dist/chunks/{multi-select-V7SLAduU.js.map → multi-select-BZ9N6Dal.js.map} +1 -1
  37. package/dist/chunks/{picker-DZ4-1BvK.js → picker-lvm82d0A.js} +3 -3
  38. package/dist/chunks/picker-lvm82d0A.js.map +1 -0
  39. package/dist/chunks/popover-Bne-Ljbs.js.map +1 -1
  40. package/dist/chunks/{radio-group-DhpP7JSJ.js → radio-group-CRk_1ODZ.js} +2 -2
  41. package/dist/chunks/radio-group-CRk_1ODZ.js.map +1 -0
  42. package/dist/chunks/{select-B7cWlJxL.js → select-aTGupQan.js} +4 -4
  43. package/dist/chunks/{select-B7cWlJxL.js.map → select-aTGupQan.js.map} +1 -1
  44. package/dist/chunks/{table-DMLFUBlb.js → table-DxoSOvQK.js} +2 -2
  45. package/dist/chunks/table-DxoSOvQK.js.map +1 -0
  46. package/dist/chunks/{ui.module-BsDio9A3.js → ui.module-oRwY3Zli.js} +2 -1
  47. package/dist/chunks/ui.module-oRwY3Zli.js.map +1 -0
  48. package/dist/chunks/{uiClasses-BVwFzzsr.js → uiClasses-CQj47jkF.js} +11 -2
  49. package/dist/chunks/uiClasses-CQj47jkF.js.map +1 -0
  50. package/dist/chunks/wheel-picker-FS58cRsQ.js.map +1 -1
  51. package/dist/context-menu/index.js +1 -1
  52. package/dist/date-input/index.js +2 -2
  53. package/dist/date-time-input/index.js +3 -3
  54. package/dist/disclosure/index.js +2 -2
  55. package/dist/disclosure/index.js.map +1 -1
  56. package/dist/drop-zone/index.js +1 -1
  57. package/dist/drop-zone/index.js.map +1 -1
  58. package/dist/errors/index.js +4 -4
  59. package/dist/errors/index.js.map +1 -1
  60. package/dist/expandable-action-panel/index.js +1 -1
  61. package/dist/image/index.js +5 -5
  62. package/dist/image/index.js.map +1 -1
  63. package/dist/input/index.js +1 -1
  64. package/dist/input-date-time/index.js +2 -2
  65. package/dist/input-file/index.js +2 -2
  66. package/dist/input-files/index.js +1 -1
  67. package/dist/input-image/index.js +2 -2
  68. package/dist/input-search/index.js +1 -1
  69. package/dist/layout-picker/index.js +1 -1
  70. package/dist/layout-picker/index.js.map +1 -1
  71. package/dist/listbox/index.js +1 -1
  72. package/dist/modal/index.js +1 -1
  73. package/dist/multi-select/index.js +1 -1
  74. package/dist/notifications/index.js +1 -1
  75. package/dist/notifications/index.js.map +1 -1
  76. package/dist/option/index.js +1 -1
  77. package/dist/picker/index.js +1 -1
  78. package/dist/preset-range-date-input/index.js +1 -1
  79. package/dist/preset-select/index.js +1 -1
  80. package/dist/radio-button/index.js +2 -2
  81. package/dist/radio-group/index.js +1 -1
  82. package/dist/select/index.js +1 -1
  83. package/dist/simple-table/index.js +1 -1
  84. package/dist/slider/index.js +3 -3
  85. package/dist/slider/index.js.map +1 -1
  86. package/dist/state-select/index.js +1 -1
  87. package/dist/status-indicator/StatusIndicator.d.ts.map +1 -1
  88. package/dist/status-indicator/index.js +2 -0
  89. package/dist/status-indicator/index.js.map +1 -1
  90. package/dist/styles.css +1 -1
  91. package/dist/switch/index.js +1 -1
  92. package/dist/table/index.js +1 -1
  93. package/dist/table-sorting/index.js +1 -1
  94. package/dist/tabs/index.js +2 -2
  95. package/dist/tabs/index.js.map +1 -1
  96. package/dist/tag-input/index.js +2 -2
  97. package/dist/tag-input/index.js.map +1 -1
  98. package/dist/text-editor/index.js +1 -1
  99. package/dist/textarea/index.js +2 -2
  100. package/dist/toggle/index.js +1 -1
  101. package/dist/toggle/index.js.map +1 -1
  102. package/dist/tree-select/index.js +3 -3
  103. package/dist/tree-select/index.js.map +1 -1
  104. package/dist/tree-table/index.js +1 -1
  105. package/dist/tree-table/index.js.map +1 -1
  106. package/dist/types.d.ts +3 -3
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/uiClasses.d.ts.map +1 -1
  109. package/package.json +2 -1
  110. package/src/styles/_border.scss +2 -2
  111. package/src/styles/_color.scss +8 -8
  112. package/src/styles/_components.scss +2 -2
  113. package/src/styles/_normalize.scss +4 -4
  114. package/src/styles/config/_index.scss +95 -182
  115. package/src/styles/mixins/_controls.scss +43 -26
  116. package/src/styles/mixins/_mixin.scss +0 -187
  117. package/src/styles/mixins/controls.test.ts +28 -6
  118. package/src/styles/themes/_interactive-surface.scss +12 -12
  119. package/src/styles/themes/_theme.scss +21 -157
  120. package/src/styles/themes/theme.test.ts +66 -48
  121. package/storybook-static/assets/{Badge-BXbiidny.js → Badge-S6BbyfeX.js} +8 -2
  122. package/storybook-static/assets/{Badge.stories-DCOkVsyk.js → Badge.stories-mio0RhpX.js} +7 -1
  123. package/storybook-static/assets/{BadgeList-CD5894x5.css → BadgeList-DbjeNuw0.css} +1 -1
  124. package/storybook-static/assets/{BadgeList-DgUScGRc.js → BadgeList-rtyargPY.js} +2 -2
  125. package/storybook-static/assets/{BarcodeScannerDialog.stories-7Bv_TejN.js → BarcodeScannerDialog.stories-DRdXaVuW.js} +1 -1
  126. package/storybook-static/assets/{Button-0UDcBhBt.js → Button-CNH5M6QU.js} +12 -2
  127. package/storybook-static/assets/{Button-BpQRrzrS.js → Button-EVzvXVPh.js} +4 -2
  128. package/storybook-static/assets/Button.stories-VUvnWRnm.js +106 -0
  129. package/storybook-static/assets/{CalendarView-B93LI4f_.js → CalendarView-CfSvCqCr.js} +1 -1
  130. package/storybook-static/assets/CalendarView-dgpVDRJR.css +1 -0
  131. package/storybook-static/assets/{CheckBox-CFusvDS8.js → CheckBox-Bynxp5UW.js} +1 -1
  132. package/storybook-static/assets/{CheckBox-BaAouU5d.js → CheckBox-C3n5T66c.js} +2 -2
  133. package/storybook-static/assets/{CheckBox.stories-Bdr_GC0M.js → CheckBox.stories-BoF97wxK.js} +1 -1
  134. package/storybook-static/assets/{Color-6AOWCN3U-B8A6Hc7V.js → Color-6AOWCN3U-D-Jlgqzt.js} +1 -1
  135. package/storybook-static/assets/{ContextMenu-BcNU89-b.js → ContextMenu-Dg65Ha7g.js} +1 -1
  136. package/storybook-static/assets/{ContextMenu-CvHpWBGV.js → ContextMenu-DwwW3EyB.js} +1 -1
  137. package/storybook-static/assets/ContextMenu-yhWq2uJ3.css +1 -0
  138. package/storybook-static/assets/{ContextMenu.stories-DQDlVNxB.js → ContextMenu.stories-D-jRdIZD.js} +1 -1
  139. package/storybook-static/assets/{CustomOptionButton-DkGlBvWP.js → CustomOptionButton-vfj1vLJM.js} +1 -1
  140. package/storybook-static/assets/{DateInput-CWsb-NhT.js → DateInput-BpuC_NWD.js} +1 -1
  141. package/storybook-static/assets/{DateInput-NkrPSWMl.js → DateInput-DJdh5B2X.js} +1 -1
  142. package/storybook-static/assets/{DateInput.stories-Bvz465d-.js → DateInput.stories-C9hB_vFy.js} +1 -1
  143. package/storybook-static/assets/{DateRangePresetSelect-DC6_r8SQ.js → DateRangePresetSelect-CDgQfOdZ.js} +1 -1
  144. package/storybook-static/assets/{DateRangePresetSelect-DQlphKzc.js → DateRangePresetSelect-DYPoeqC2.js} +1 -1
  145. package/storybook-static/assets/{DateRangePresetSelect.stories-DVfqPYN5.js → DateRangePresetSelect.stories-Bx40H_O0.js} +1 -1
  146. package/storybook-static/assets/{Detail-CXQYyd94.js → Detail-DWFfdNJH.js} +1 -1
  147. package/storybook-static/assets/{Detail.stories-BEXByYXt.js → Detail.stories-C9y_rsbc.js} +1 -1
  148. package/storybook-static/assets/{Dialog-CyYTYgbp.js → Dialog-D8GPZi6H.js} +1 -1
  149. package/storybook-static/assets/{Dialog-B2UTbDCv.js → Dialog-XbR8HVsJ.js} +1 -1
  150. package/storybook-static/assets/{Dialog.stories-BWluB4Ya.js → Dialog.stories-CoU_PusF.js} +1 -1
  151. package/storybook-static/assets/{Disclosure-Dv5XOsna.js → Disclosure-DrGfFwQt.js} +1 -1
  152. package/storybook-static/assets/{Disclosure.stories-BxK_fmJE.js → Disclosure.stories-CsR1_XK7.js} +1 -1
  153. package/storybook-static/assets/DisclosureGroup-D_ldcGgp.css +1 -0
  154. package/storybook-static/assets/{DisclosureGroup-B2O8D8CG.js → DisclosureGroup-DvB5K7gZ.js} +1 -1
  155. package/storybook-static/assets/{DocsRenderer-JROSPFPF-7N0jH0Oi.js → DocsRenderer-JROSPFPF-B7AkTp2I.js} +1 -1
  156. package/storybook-static/assets/{DropZone-C7HIN5ml.css → DropZone-C4gPTIz0.css} +1 -1
  157. package/storybook-static/assets/{DropZone-ZlPjdEuO.js → DropZone-DZi2WVu9.js} +1 -1
  158. package/storybook-static/assets/{DropZone-DL34ooyF.js → DropZone-DesGY4BW.js} +1 -1
  159. package/storybook-static/assets/{DropZone.stories-BT9JvF9d.js → DropZone.stories-KVDb6pHQ.js} +1 -1
  160. package/storybook-static/assets/{DropdownMenu-BhC5f2Qc.js → DropdownMenu-CRoQARS5.js} +1 -1
  161. package/storybook-static/assets/{ExpandableActionPanel-C77qVHBP.js → ExpandableActionPanel-CWKJIcbQ.js} +1 -1
  162. package/storybook-static/assets/{ExpandableActionPanel.stories-D1MJEw6F.js → ExpandableActionPanel.stories-D-MYdCJ4.js} +1 -1
  163. package/storybook-static/assets/{Flex-BHt3-yoh.js → Flex-CMPSlVVy.js} +1 -1
  164. package/storybook-static/assets/{Flex.stories-M8QVGuVA.js → Flex.stories-DQH0Q5EF.js} +1 -1
  165. package/storybook-static/assets/{FloatingPopover-Dch6_6e0.js → FloatingPopover-CBWu6Gxj.js} +1 -1
  166. package/storybook-static/assets/FloatingPopover-Di16BZj-.css +1 -0
  167. package/storybook-static/assets/{FormattedTableCell-CXyG4Yj2.js → FormattedTableCell-CIp2ULPe.js} +1 -1
  168. package/storybook-static/assets/FormattedTableCell-CTIL_ueu.css +1 -0
  169. package/storybook-static/assets/{Grid-CcyaioK_.js → Grid-BlQE5E_9.js} +1 -1
  170. package/storybook-static/assets/{Grid.stories-CTHcYkKa.js → Grid.stories-CwUCPClP.js} +1 -1
  171. package/storybook-static/assets/{ImageCropper.stories-B84lQIPy.js → ImageCropper.stories-DjaRavSL.js} +1 -1
  172. package/storybook-static/assets/{ImageRenderer-kTsPC-b5.js → ImageRenderer-JGxgpvv2.js} +1 -1
  173. package/storybook-static/assets/{ImageRenderer.stories-pozsCEPL.js → ImageRenderer.stories-DwH6FgEc.js} +1 -1
  174. package/storybook-static/assets/{ImageView.stories-CNttofCE.js → ImageView.stories-DgYPiNil.js} +1 -1
  175. package/storybook-static/assets/{ImageViewer.stories-D_7oQpyX.js → ImageViewer.stories-_y7d3coa.js} +2 -2
  176. package/storybook-static/assets/{ImageViewerRuntime-Dnc70fBS.js → ImageViewerRuntime-CA6JhQ31.js} +1 -1
  177. package/storybook-static/assets/ImageViewerRuntime-MxAd4mC-.css +1 -0
  178. package/storybook-static/assets/{Input-BO9q-b1i.js → Input-95LKm7aK.js} +1 -1
  179. package/storybook-static/assets/{Input-DvRmrrtj.js → Input-CET6HfZH.js} +1 -1
  180. package/storybook-static/assets/{Input-CYgnggvb.css → Input-CIA3PkB4.css} +1 -1
  181. package/storybook-static/assets/{Input.stories-DeKdGxIC.js → Input.stories-BDTI2nIV.js} +1 -1
  182. package/storybook-static/assets/{InputDateTime-hqRtizlN.js → InputDateTime-DsRJZVCO.js} +1 -1
  183. package/storybook-static/assets/{InputDateTime.stories-BpGhWbRp.js → InputDateTime.stories-Dah3F9Fq.js} +1 -1
  184. package/storybook-static/assets/{InputFile-CExDbGYJ.js → InputFile-CF3DRyTX.js} +1 -1
  185. package/storybook-static/assets/{InputFile-CTDHdo2g.js → InputFile-_65sKWXa.js} +1 -1
  186. package/storybook-static/assets/{InputFile.stories-BIinoG-U.js → InputFile.stories-B1PFNFPf.js} +1 -1
  187. package/storybook-static/assets/{InputFiles-BWeRuTCh.js → InputFiles-CUYGDig8.js} +1 -1
  188. package/storybook-static/assets/{InputFiles-Cvdn_5IV.js → InputFiles-RV6K6GmT.js} +1 -1
  189. package/storybook-static/assets/{InputFiles.stories-J2bb48sN.js → InputFiles.stories-ZCzYnboY.js} +1 -1
  190. package/storybook-static/assets/{InputFilesList-ByK52qUe.css → InputFilesList-BbwB0oHE.css} +1 -1
  191. package/storybook-static/assets/{InputFilesList-DO6IJW98.js → InputFilesList-Co__UO8B.js} +1 -1
  192. package/storybook-static/assets/{InputImage-BtsIbqEc.js → InputImage-900lIdui.js} +1 -1
  193. package/storybook-static/assets/{InputImage-C7zaIkCa.js → InputImage-De56Jwx9.js} +1 -1
  194. package/storybook-static/assets/{InputImage.stories--ewdBKin.js → InputImage.stories-B_R_kcCD.js} +1 -1
  195. package/storybook-static/assets/{InteractiveComponents-Cy9Y2J_q.js → InteractiveComponents-DGTx8enm.js} +1 -1
  196. package/storybook-static/assets/{InteractiveComponents.stories-CgC4nhd3.js → InteractiveComponents.stories-CDZsFUga.js} +1 -1
  197. package/storybook-static/assets/{LayoutPicker-DhJgMxdf.js → LayoutPicker-BMO8qfbL.js} +1 -1
  198. package/storybook-static/assets/{LayoutPicker-CfgWKTDC.js → LayoutPicker-CllhDO8J.js} +1 -1
  199. package/storybook-static/assets/{LayoutPicker-BY4-fUQa.css → LayoutPicker-DaPDA0_s.css} +1 -1
  200. package/storybook-static/assets/{LayoutPicker.stories-Bli7rQRh.js → LayoutPicker.stories-F7K4tSxT.js} +1 -1
  201. package/storybook-static/assets/{Listbox-_MNXWNW7.js → Listbox-0kjmvCe-.js} +1 -1
  202. package/storybook-static/assets/{Listbox-bq5sSQnZ.js → Listbox-D_2t3NpM.js} +1 -1
  203. package/storybook-static/assets/{Listbox.stories-BP9mqHoo.js → Listbox.stories-Cp1Eq7Bz.js} +1 -1
  204. package/storybook-static/assets/{Modal-CNt7-iWI.js → Modal-vdSwQ6xw.js} +1 -1
  205. package/storybook-static/assets/{Modal-Dwqp7agw.js → Modal-zf0JQ124.js} +1 -1
  206. package/storybook-static/assets/{Modal.stories-D2Hj75pl.js → Modal.stories-Cz47rY2B.js} +1 -1
  207. package/storybook-static/assets/{ModalManagerProvider-BoCpnUex.js → ModalManagerProvider-C_zd0fqC.js} +1 -1
  208. package/storybook-static/assets/{MultiSelect-CTfbXQVD.js → MultiSelect-Bl3q6kCP.js} +1 -1
  209. package/storybook-static/assets/{MultiSelect-B1BckUGX.js → MultiSelect-DE13Ak4N.js} +1 -1
  210. package/storybook-static/assets/{MultiSelect.stories-BdMJk22c.js → MultiSelect.stories-DG6LGTC9.js} +1 -1
  211. package/storybook-static/assets/{NoData-CNK8-UBc.js → NoData-B4AGZs5Q.js} +1 -1
  212. package/storybook-static/assets/NotificationsHost-BIyd1XQ0.css +1 -0
  213. package/storybook-static/assets/{NotificationsHost-Cczj_pFY.js → NotificationsHost-CFD2_BpZ.js} +1 -1
  214. package/storybook-static/assets/{NotificationsHost.stories-BPB6hfSI.js → NotificationsHost.stories-CiSu7Vly.js} +1 -1
  215. package/storybook-static/assets/{ODataMultiSelect-CahWMsCQ.js → ODataMultiSelect-PcZYhXlN.js} +1 -1
  216. package/storybook-static/assets/{ODataMultiSelect.stories-Dnyu2-gz.js → ODataMultiSelect.stories-xodpVftn.js} +1 -1
  217. package/storybook-static/assets/{ODataSelect-DxbjbdNx.js → ODataSelect-BuuZhINP.js} +1 -1
  218. package/storybook-static/assets/{ODataSelect.stories-DfK9yHK7.js → ODataSelect.stories-nr7GqOTz.js} +1 -1
  219. package/storybook-static/assets/{ODataTreeMultiSelect-DOgHyKon.js → ODataTreeMultiSelect-BRNITq-6.js} +1 -1
  220. package/storybook-static/assets/{ODataTreeMultiSelect.stories-Dv0-ackb.js → ODataTreeMultiSelect.stories-Baxtdxte.js} +1 -1
  221. package/storybook-static/assets/{ODataTreeSelect-DIoygv27.js → ODataTreeSelect-BKcyKJr8.js} +1 -1
  222. package/storybook-static/assets/{ODataTreeSelect.stories-D4mZcW9Z.js → ODataTreeSelect.stories-n6LATF6z.js} +1 -1
  223. package/storybook-static/assets/{OneStepScroller-DNTilSDM.js → OneStepScroller-DXykOSPw.js} +1 -1
  224. package/storybook-static/assets/{Option-qcKM13Ly.js → Option-Cr3vYgCL.js} +1 -1
  225. package/storybook-static/assets/Option-DD2t6DLq.css +1 -0
  226. package/storybook-static/assets/{OptionButton-DrNo-DMV.js → OptionButton-v-MO3VgJ.js} +1 -1
  227. package/storybook-static/assets/{PeriodSelect-DjzmUohy.js → PeriodSelect-BQ9_EM63.js} +1 -1
  228. package/storybook-static/assets/{PeriodSelect-Dk-_iKeR.js → PeriodSelect-DQXZWIBX.js} +1 -1
  229. package/storybook-static/assets/{PeriodSelect.stories-d58Lz3DJ.js → PeriodSelect.stories-S2ndHVEQ.js} +1 -1
  230. package/storybook-static/assets/{PickerField-Dv1S8Wit.js → PickerField-BeAXSQmp.js} +1 -1
  231. package/storybook-static/assets/{PickerTriggerActions-dbXPGPRy.js → PickerTriggerActions-D6BjZkrN.js} +1 -1
  232. package/storybook-static/assets/{Popover-DMrefrsO.js → Popover-BAp50b4b.js} +1 -1
  233. package/storybook-static/assets/{Popover-tPH8grZD.js → Popover-CTCfa72M.js} +1 -1
  234. package/storybook-static/assets/{Popover.stories-BGgMddUi.js → Popover.stories-CZIBppwE.js} +1 -1
  235. package/storybook-static/assets/{PresetRangeDateInput-Bi5D7AvA.js → PresetRangeDateInput-BLAAcq8Y.js} +1 -1
  236. package/storybook-static/assets/{PresetRangeDateInput-Bi01AT1-.js → PresetRangeDateInput-EIlQEGr0.js} +1 -1
  237. package/storybook-static/assets/{PresetRangeDateInput.stories-BK9PG5Us.js → PresetRangeDateInput.stories-CShR-Eub.js} +1 -1
  238. package/storybook-static/assets/{PresetSelect-Bo_urWXj.js → PresetSelect-BcD8EsSb.js} +1 -1
  239. package/storybook-static/assets/{README-DRTv3qN5.js → README-5i5ZfRuh.js} +1 -1
  240. package/storybook-static/assets/{README-DNkooR8C.js → README-6iRo8dKK.js} +1 -1
  241. package/storybook-static/assets/{README-G5BEMzLO.js → README-6vpPfmdC.js} +1 -1
  242. package/storybook-static/assets/{README-D7IkoGLE.js → README-B2J2ATaW.js} +1 -1
  243. package/storybook-static/assets/{README-Bccm-jZn.js → README-B8qFKwiq.js} +1 -1
  244. package/storybook-static/assets/{README-CHOXjCGT.js → README-BBS739kV.js} +1 -1
  245. package/storybook-static/assets/{README-Bsm0nJfv.js → README-BDMWo0qS.js} +1 -1
  246. package/storybook-static/assets/{README-DqTSHU_3.js → README-BIpHKVKI.js} +1 -1
  247. package/storybook-static/assets/{README-DnE0W6xN.js → README-BQHgBs-J.js} +1 -1
  248. package/storybook-static/assets/{README-iy7SbqPS.js → README-BUlc8wGR.js} +1 -1
  249. package/storybook-static/assets/{README-CSkB_qWo.js → README-BW1oyMu_.js} +1 -1
  250. package/storybook-static/assets/{README-C9LAWG5A.js → README-BdBeQtXQ.js} +1 -1
  251. package/storybook-static/assets/{README-DXV0j4Y9.js → README-BkX7iDLJ.js} +1 -1
  252. package/storybook-static/assets/{README-CLfxQA5V.js → README-BnTk0DyO.js} +1 -1
  253. package/storybook-static/assets/{README-WDknu02X.js → README-Bwv6SU5o.js} +1 -1
  254. package/storybook-static/assets/{README-CiRdh2G1.js → README-CLiuh-fF.js} +1 -1
  255. package/storybook-static/assets/{README-cmKi-NfO.js → README-CLv4OeWw.js} +1 -1
  256. package/storybook-static/assets/{README-BatM3k6o.js → README-CMBk39py.js} +1 -1
  257. package/storybook-static/assets/{README-CDXBNJlU.js → README-CQUlYRLa.js} +1 -1
  258. package/storybook-static/assets/{README-CIy0Pj6l.js → README-CVX-4uJ_.js} +1 -1
  259. package/storybook-static/assets/{README-BOY9oCZ5.js → README-CWeupyTO.js} +1 -1
  260. package/storybook-static/assets/{README-CgvojwYv.js → README-CZJvbdGv.js} +1 -1
  261. package/storybook-static/assets/{README-DJeVd42x.js → README-CaECsCl2.js} +1 -1
  262. package/storybook-static/assets/{README-Bzz8tDjY.js → README-Cntj7my4.js} +1 -1
  263. package/storybook-static/assets/{README-DQzhOQJs.js → README-CuGPdc3G.js} +1 -1
  264. package/storybook-static/assets/{README-B2NTIwVC.js → README-D7pP2Sxx.js} +1 -1
  265. package/storybook-static/assets/{README-CAYUX5Nb.js → README-D9Og-Y7l.js} +1 -1
  266. package/storybook-static/assets/{README-DI6PuVn_.js → README-DDtdZa9N.js} +1 -1
  267. package/storybook-static/assets/{README-C1EYYUCN.js → README-DLQvRDdd.js} +1 -1
  268. package/storybook-static/assets/{README-DnjCb77l.js → README-DQpji8GH.js} +1 -1
  269. package/storybook-static/assets/{README-CUw7AGFv.js → README-DUfqdm0p.js} +1 -1
  270. package/storybook-static/assets/{README-oTjX8jJr.js → README-Dd3MCsf2.js} +1 -1
  271. package/storybook-static/assets/{README-BRxnSb_H.js → README-DehKWpx2.js} +1 -1
  272. package/storybook-static/assets/{README-CvomZuv4.js → README-DgFtCu8B.js} +1 -1
  273. package/storybook-static/assets/{README-BCXhBI3h.js → README-DhZbllv1.js} +1 -1
  274. package/storybook-static/assets/{README-lyLRoc9A.js → README-Dj9EXnja.js} +1 -1
  275. package/storybook-static/assets/{README-BO0pPMhH.js → README-DkCWpyid.js} +1 -1
  276. package/storybook-static/assets/{README-BPDYLPfh.js → README-Dn2AIjeS.js} +1 -1
  277. package/storybook-static/assets/{README-BTCDTs4l.js → README-DoZCaKAx.js} +1 -1
  278. package/storybook-static/assets/{README-CsYvQc-H.js → README-DsLoV4ax.js} +1 -1
  279. package/storybook-static/assets/{README-DENkRq75.js → README-DwvyizD7.js} +1 -1
  280. package/storybook-static/assets/{README-DSx__uJY.js → README-DwyqrR4I.js} +1 -1
  281. package/storybook-static/assets/{README-BxY8B5jC.js → README-N-Gy0UYM.js} +1 -1
  282. package/storybook-static/assets/{README-XlmyqVIs.js → README-Wd5wEw-J.js} +1 -1
  283. package/storybook-static/assets/{README-DCitesDJ.js → README-Y4OGhQbo.js} +1 -1
  284. package/storybook-static/assets/{README-ChyNimpn.js → README-ZZiicHm9.js} +1 -1
  285. package/storybook-static/assets/{README-5MsrC0tc.js → README-bAu0Uk5O.js} +1 -1
  286. package/storybook-static/assets/{README-BrnWLQ7I.js → README-cuvbXAuG.js} +1 -1
  287. package/storybook-static/assets/{README-BbwNWG_A.js → README-jHuA2mq2.js} +1 -1
  288. package/storybook-static/assets/{README-DLL_V1qq.js → README-pvA4fK1E.js} +1 -1
  289. package/storybook-static/assets/{README-BIYrg5Jw.js → README-sEbspuLw.js} +1 -1
  290. package/storybook-static/assets/{README-qyGL-RQj.js → README-v3TOC_aE.js} +1 -1
  291. package/storybook-static/assets/{README-DOqinQqt.js → README-wizqrRgs.js} +1 -1
  292. package/storybook-static/assets/{RadioButton-_-grgF60.js → RadioButton-BUPEsqwH.js} +1 -1
  293. package/storybook-static/assets/{RadioButton-C5lYvVIl.js → RadioButton-Ca0kZdMV.js} +1 -1
  294. package/storybook-static/assets/{RadioButton.stories-BNifE29D.js → RadioButton.stories-aBnizEak.js} +1 -1
  295. package/storybook-static/assets/{RadioGroup-DWfHyBaQ.js → RadioGroup-34jH28Sk.js} +1 -1
  296. package/storybook-static/assets/{RadioGroup-BU95Hbl0.css → RadioGroup-DHnDIEgi.css} +1 -1
  297. package/storybook-static/assets/{RadioGroup-CmDrRqLi.js → RadioGroup-dq6CbxB6.js} +1 -1
  298. package/storybook-static/assets/{RadioGroup.stories-1PW9Krj9.js → RadioGroup.stories--lDrmS8V.js} +1 -1
  299. package/storybook-static/assets/{Scrollable-CWkMU4wH.js → Scrollable-BJRiyp9q.js} +1 -1
  300. package/storybook-static/assets/{Select-BCGnO525.js → Select-CwNDJSmq.js} +1 -1
  301. package/storybook-static/assets/{Select-DYtEG5uI.js → Select-DmwCwS8a.js} +1 -1
  302. package/storybook-static/assets/{Select.stories-CgldXYRU.js → Select.stories-BXj7A2gM.js} +1 -1
  303. package/storybook-static/assets/{SerializableSelect-MmvKHZiv.js → SerializableSelect-IAtBSK9P.js} +1 -1
  304. package/storybook-static/assets/{SerializableSelect.stories-Di0iM37P.js → SerializableSelect.stories-D8F5WGtk.js} +1 -1
  305. package/storybook-static/assets/{SingleDateTimeInput-Ds5YsLHg.js → SingleDateTimeInput-CbyyGlmi.js} +1 -1
  306. package/storybook-static/assets/{SingleDateTimeInput-Cz2Y7KEq.js → SingleDateTimeInput-oN2P3eYx.js} +1 -1
  307. package/storybook-static/assets/{SingleDateTimeInput.stories-BnuERNSZ.js → SingleDateTimeInput.stories-BU_wyTmo.js} +1 -1
  308. package/storybook-static/assets/{Slider-CiZ7R_NX.js → Slider-CDJhhSWj.js} +1 -1
  309. package/storybook-static/assets/{Slider-Csaz4BeY.js → Slider-ClZTrtRk.js} +1 -1
  310. package/storybook-static/assets/Slider-DxdPx1Pb.css +1 -0
  311. package/storybook-static/assets/{Slider.stories-7Heg0Pgz.js → Slider.stories-PfQf9es7.js} +1 -1
  312. package/storybook-static/assets/{SliderInput-qWpLFzxj.js → SliderInput-BxFUjetO.js} +1 -1
  313. package/storybook-static/assets/{SliderInput-bTh2JTHG.js → SliderInput-C7TRql6-.js} +1 -1
  314. package/storybook-static/assets/{SliderInput.stories-DR_zyE-u.js → SliderInput.stories-yX8DU5pZ.js} +1 -1
  315. package/storybook-static/assets/{Sortable-P86Ancoa.js → Sortable-D8cVwatT.js} +1 -1
  316. package/storybook-static/assets/{Sortable.stories-iiOkIM-G.js → Sortable.stories-BI6_E5k7.js} +1 -1
  317. package/storybook-static/assets/{Splitter-mG3bB-U4.js → Splitter-B958Wj4G.js} +1 -1
  318. package/storybook-static/assets/{Splitter.stories-WhQOQVRq.js → Splitter.stories-Dl2YOk9H.js} +1 -1
  319. package/storybook-static/assets/{StateSelect-u1kaZwdD.js → StateSelect-Cs9-kDRC.js} +1 -1
  320. package/storybook-static/assets/{StateSelect-De2PQDzp.js → StateSelect-DbV1mGhQ.js} +1 -1
  321. package/storybook-static/assets/{StateSelect.stories-BO-C9UTF.js → StateSelect.stories-D6atguQ6.js} +1 -1
  322. package/storybook-static/assets/{StatusIndicator-BiTbPB5o.js → StatusIndicator--Y-QdjQI.js} +1 -1
  323. package/storybook-static/assets/StatusIndicator-CpCGmnO7.css +1 -0
  324. package/storybook-static/assets/StatusIndicator.stories-DxkpP6C1.js +31 -0
  325. package/storybook-static/assets/{StringToggle.stories-CBt8bXzz.js → StringToggle.stories-C3mdK5Wx.js} +1 -1
  326. package/storybook-static/assets/{Switch-BC2KYLX2.js → Switch-BTFpnXV9.js} +1 -1
  327. package/storybook-static/assets/{Switch-BRKFbtp4.js → Switch-OPzpWcJw.js} +1 -1
  328. package/storybook-static/assets/{Switch.stories-BAmX4W8J.js → Switch.stories-C0rVHcRq.js} +1 -1
  329. package/storybook-static/assets/{Table-D1OJnVmO.js → Table-bWKgagHH.js} +1 -1
  330. package/storybook-static/assets/Table-j_3ID7Xq.css +1 -0
  331. package/storybook-static/assets/{Table.stories-C_JSdhJl.js → Table.stories-DOuV4G3p.js} +1 -1
  332. package/storybook-static/assets/{Tabs-DiUKiz-h.js → Tabs-ae4daDEA.js} +1 -1
  333. package/storybook-static/assets/{Tabs.stories-DGys1vSD.js → Tabs.stories-Br4RCZKR.js} +1 -1
  334. package/storybook-static/assets/{TabsBox-D-bkJX9j.css → TabsBox-B3REnb6D.css} +1 -1
  335. package/storybook-static/assets/{TabsBox-D4yfPiDY.js → TabsBox-X_7yoTw3.js} +1 -1
  336. package/storybook-static/assets/{TagInput-ZyC-89b3.js → TagInput-B2w5W05Z.js} +1 -1
  337. package/storybook-static/assets/{TagInput-ChmW4s9O.css → TagInput-RJbbcfoR.css} +1 -1
  338. package/storybook-static/assets/{TagInput.stories-hVoLW5qr.js → TagInput.stories-Db9DaNpW.js} +1 -1
  339. package/storybook-static/assets/{Text-CMJA_7QZ.js → Text-BT0cn3Bk.js} +1 -1
  340. package/storybook-static/assets/{Textarea-DjKw5r4e.js → Textarea-B9MNOgmF.js} +1 -1
  341. package/storybook-static/assets/{Textarea-Du012ObX.js → Textarea-C_6iOQ3k.js} +1 -1
  342. package/storybook-static/assets/{Textarea.stories-ShFda4o7.js → Textarea.stories-Ctjb3d47.js} +1 -1
  343. package/storybook-static/assets/{TimePanel-Bfkpbjrx.js → TimePanel-C5AucKln.js} +1 -1
  344. package/storybook-static/assets/{TimePanel-Bh98qsCo.css → TimePanel-D9_hb7w4.css} +1 -1
  345. package/storybook-static/assets/{TimePanel.stories-4pV3fQVB.js → TimePanel.stories-CiQAJcB_.js} +1 -1
  346. package/storybook-static/assets/Toggle-ClE8Zovo.css +1 -0
  347. package/storybook-static/assets/{Toggle-CPohFihI.js → Toggle-DxA-Q1KZ.js} +1 -1
  348. package/storybook-static/assets/{Toggle-ChC8G1Et.js → Toggle-q8hxq-LP.js} +1 -1
  349. package/storybook-static/assets/{Toggle.stories-B3H1M8Ra.js → Toggle.stories-C6Jf_KTc.js} +1 -1
  350. package/storybook-static/assets/{TreeMultiSelect-BpuHCHgJ.js → TreeMultiSelect-BKF7COzn.js} +1 -1
  351. package/storybook-static/assets/{TreeMultiSelect-CbNz09Jk.js → TreeMultiSelect-BfduPrgB.js} +1 -1
  352. package/storybook-static/assets/{TreeMultiSelect.stories-Cmt05HgT.js → TreeMultiSelect.stories-C-uztFex.js} +1 -1
  353. package/storybook-static/assets/{TreePickerBase-B6DED6Hz.css → TreePickerBase-CmFF9pWE.css} +1 -1
  354. package/storybook-static/assets/{TreePickerBase-DGvBAQiy.js → TreePickerBase-SVDNn9QY.js} +1 -1
  355. package/storybook-static/assets/{TreeSelect-C_GCYsA3.js → TreeSelect-Bu9HRTvX.js} +1 -1
  356. package/storybook-static/assets/{TreeSelect-DvAlRur3.js → TreeSelect-ClJGLBA8.js} +1 -1
  357. package/storybook-static/assets/{TreeSelect.stories-Cch2A2z5.js → TreeSelect.stories-C0TeLbpZ.js} +1 -1
  358. package/storybook-static/assets/{TreeTable-CmVxMvld.js → TreeTable-BXia_Imm.js} +1 -1
  359. package/storybook-static/assets/TreeTable-BvB3kj4h.css +1 -0
  360. package/storybook-static/assets/{TreeTable.stories-B46N8o8E.js → TreeTable.stories-Cwo8yjNI.js} +1 -1
  361. package/storybook-static/assets/{blocks-Bu5I-6jJ.js → blocks-BmNU_R5E.js} +3 -3
  362. package/storybook-static/assets/{check-BdRTIK6S.js → check-HCQdrq3c.js} +1 -1
  363. package/storybook-static/assets/{chevron-down-EtmpBUf8.js → chevron-down-DHrZ_6vS.js} +1 -1
  364. package/storybook-static/assets/{chevron-left-CTLa8HIb.js → chevron-left-CaIBhYcr.js} +1 -1
  365. package/storybook-static/assets/{chevron-right-D_c_Cvi0.js → chevron-right-BpmEWiwv.js} +1 -1
  366. package/storybook-static/assets/{chunk-W22LQPXL-B7ERYz6B.js → chunk-W22LQPXL-DSMfJqhe.js} +1 -1
  367. package/storybook-static/assets/{circle-alert-Dj1kZNNX.js → circle-alert-DuupFIr9.js} +1 -1
  368. package/storybook-static/assets/{circle-check-B1w7Ls8y.js → circle-check-LYBfAR-E.js} +1 -1
  369. package/storybook-static/assets/{components-DqRn1i2k.js → components-CBnjb8pL.js} +3 -3
  370. package/storybook-static/assets/{contextMenu-ylNgC9hS.js → contextMenu-BZ-iSJtD.js} +1 -1
  371. package/storybook-static/assets/{download-dw_WzNlC.js → download-CsLGqkEl.js} +1 -1
  372. package/storybook-static/assets/{floating-ui.react-C9sdi3nv.js → floating-ui.react-VNDOEKPt.js} +1 -1
  373. package/storybook-static/assets/{foundationApi-BJETphYp.js → foundationApi-BMy7_pDS.js} +1 -1
  374. package/storybook-static/assets/{foundationLib-DfRlYoD7.js → foundationLib-o95OqhXl.js} +1 -1
  375. package/storybook-static/assets/{hooks-B-ZW7F36.js → hooks-DMFMD13m.js} +1 -1
  376. package/storybook-static/assets/iframe-BT_jngkf.css +1 -0
  377. package/storybook-static/assets/{iframe-D0R9pFj7.js → iframe-BaXmcmyl.js} +3 -3
  378. package/storybook-static/assets/iframe-D5qmKm51.js +1 -0
  379. package/storybook-static/assets/{info-B0qzF0Mr.js → info-ZuWgcD4m.js} +1 -1
  380. package/storybook-static/assets/{odata-tqjAk19x.js → odata-Brls3R5b.js} +1 -1
  381. package/storybook-static/assets/{odataStoryFixtures-D2yHs_jK.js → odataStoryFixtures-BmQo4rAJ.js} +2 -2
  382. package/storybook-static/assets/{react-ClkCNz5L.js → react-BnjGKE7V.js} +1 -1
  383. package/storybook-static/assets/{refresh-cw-K68D1zRy.js → refresh-cw-vj55o5c3.js} +1 -1
  384. package/storybook-static/assets/{settings-2-D0jFfhpt.js → settings-2-PPom9XND.js} +1 -1
  385. package/storybook-static/assets/{sortable-fWu4d9fl.js → sortable-CztGPJOI.js} +1 -1
  386. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-Cs3Bxe3I.js → syntaxhighlighter-QEQV7K2Y-uXmnHQP7.js} +1 -1
  387. package/storybook-static/assets/{trash-2-Bj60L0sq.js → trash-2-DEnKoJjZ.js} +1 -1
  388. package/storybook-static/assets/{triangle-alert-CmzQ-r9i.js → triangle-alert-D-oyPLJL.js} +1 -1
  389. package/storybook-static/assets/ui-DSS1yTEO.css +1 -0
  390. package/storybook-static/assets/ui.module-SH8ehXul.js +1 -0
  391. package/storybook-static/assets/uiClasses-e9OQfdw2.js +1 -0
  392. package/storybook-static/assets/{useODataSelectBase-CC4MnYeK.js → useODataSelectBase-DxsvigTC.js} +1 -1
  393. package/storybook-static/assets/{useODataTreeData-DsQmGQij.js → useODataTreeData-Dzxb75-h.js} +1 -1
  394. package/storybook-static/assets/{usePickerQuery-Qg7qGfmP.js → usePickerQuery-SCKPS_0f.js} +1 -1
  395. package/storybook-static/assets/{usePickerTriggerController-D-mhhmpS.js → usePickerTriggerController-DMA4hla_.js} +1 -1
  396. package/storybook-static/assets/{x-DU3Tpzms.js → x-C5QCK6Ts.js} +1 -1
  397. package/storybook-static/iframe.html +3 -3
  398. package/storybook-static/project.json +1 -1
  399. package/dist/chunks/CalendarView-Bhaov_XE.js.map +0 -1
  400. package/dist/chunks/TextEditorLexicalClient-CSXZQOYo.js.map +0 -1
  401. package/dist/chunks/badge-DUI2ET6q.js.map +0 -1
  402. package/dist/chunks/context-menu-Dj6MXgv6.js.map +0 -1
  403. package/dist/chunks/input-D1jOxm0t.js.map +0 -1
  404. package/dist/chunks/input-files-CDGpJaUm.js.map +0 -1
  405. package/dist/chunks/picker-DZ4-1BvK.js.map +0 -1
  406. package/dist/chunks/radio-group-DhpP7JSJ.js.map +0 -1
  407. package/dist/chunks/table-DMLFUBlb.js.map +0 -1
  408. package/dist/chunks/ui.module-BsDio9A3.js.map +0 -1
  409. package/dist/chunks/uiClasses-BVwFzzsr.js.map +0 -1
  410. package/storybook-static/assets/Button.stories-CLMnxj3w.js +0 -93
  411. package/storybook-static/assets/CalendarView-DKvrkS40.css +0 -1
  412. package/storybook-static/assets/ContextMenu-CFPrlO2u.css +0 -1
  413. package/storybook-static/assets/DisclosureGroup-CVFMwx22.css +0 -1
  414. package/storybook-static/assets/FloatingPopover-jwILx9b0.css +0 -1
  415. package/storybook-static/assets/FormattedTableCell-AZc2IHfK.css +0 -1
  416. package/storybook-static/assets/ImageViewerRuntime-CRmlrtpL.css +0 -1
  417. package/storybook-static/assets/NotificationsHost-D5Pvn4eu.css +0 -1
  418. package/storybook-static/assets/Option-DXh7BISz.css +0 -1
  419. package/storybook-static/assets/Slider-CK-W2ZTO.css +0 -1
  420. package/storybook-static/assets/StatusIndicator-CU9ICMrC.css +0 -1
  421. package/storybook-static/assets/StatusIndicator.stories-COaZnrFa.js +0 -31
  422. package/storybook-static/assets/Table-BGvRn9y0.css +0 -1
  423. package/storybook-static/assets/Toggle-fKG2dFY0.css +0 -1
  424. package/storybook-static/assets/TreeTable--ZoksUiw.css +0 -1
  425. package/storybook-static/assets/iframe-COgZ5GwG.js +0 -1
  426. package/storybook-static/assets/iframe-IhWQT6NX.css +0 -1
  427. package/storybook-static/assets/ui-C3BskXT9.css +0 -1
  428. package/storybook-static/assets/ui.module-31LPbZGK.js +0 -1
  429. package/storybook-static/assets/uiClasses-Bz6cvlDQ.js +0 -1
@@ -0,0 +1,224 @@
1
+ # Замена цветовых токенов
2
+
3
+ Новый контракт темы содержит семь схем: `accent`, `brand`, `neutral`, `error`, `warning`, `success`, `info`. Каждая схема имеет четыре роли:
4
+
5
+ - `--<tone>-text` — текст и иконка на обычной поверхности;
6
+ - `--<tone>-border` — рамка;
7
+ - `--<tone>-fill` — заливка;
8
+ - `--<tone>-on-fill` — текст и иконка поверх заливки.
9
+
10
+ Ниже приведена полная карта прежнего публичного контракта. Совместимые aliases в UI-пакете намеренно не оставлены.
11
+
12
+ ## Основные роли
13
+
14
+ ```text
15
+ --status-brand-text: --brand-text
16
+ --status-brand-border: --brand-border
17
+ --status-brand-fill: --brand-fill
18
+ --status-brand-on-fill: --brand-on-fill
19
+ --status-neutral-text: --neutral-text
20
+ --status-neutral-border: --neutral-border
21
+ --status-neutral-fill: --neutral-fill
22
+ --status-neutral-on-fill: --neutral-on-fill
23
+ --status-error-text: --error-text
24
+ --status-error-border: --error-border
25
+ --status-error-fill: --error-fill
26
+ --status-error-on-fill: --error-on-fill
27
+ --status-warning-text: --warning-text
28
+ --status-warning-border: --warning-border
29
+ --status-warning-fill: --warning-fill
30
+ --status-warning-on-fill: --warning-on-fill
31
+ --status-success-text: --success-text
32
+ --status-success-border: --success-border
33
+ --status-success-fill: --success-fill
34
+ --status-success-on-fill: --success-on-fill
35
+ --status-info-text: --info-text
36
+ --status-info-border: --info-border
37
+ --status-info-fill: --info-fill
38
+ --status-info-on-fill: --info-on-fill
39
+ ```
40
+
41
+ ## Производные состояния
42
+
43
+ Hover, active и soft больше не являются токенами темы. UI-компоненты вычисляют их через `color-mix(in srgb, ...)` из четырёх основных ролей.
44
+
45
+ ```text
46
+ --status-brand-text-hover: удалён; вычисляется из --brand-text
47
+ --status-brand-text-active: удалён; вычисляется из --brand-text
48
+ --status-brand-border-hover: удалён; вычисляется из --brand-border
49
+ --status-brand-border-active: удалён; вычисляется из --brand-border
50
+ --status-brand-border-focus: --focus-ring
51
+ --status-brand-fill-hover: удалён; вычисляется из --brand-fill
52
+ --status-brand-fill-active: удалён; вычисляется из --brand-fill
53
+ --status-brand-soft: удалён; вычисляется из --brand-fill
54
+ --status-neutral-text-hover: удалён; вычисляется из --neutral-text
55
+ --status-neutral-text-active: удалён; вычисляется из --neutral-text
56
+ --status-neutral-border-hover: удалён; вычисляется из --neutral-border
57
+ --status-neutral-border-active: удалён; вычисляется из --neutral-border
58
+ --status-neutral-border-focus: --focus-ring
59
+ --status-neutral-fill-hover: удалён; вычисляется из --neutral-fill
60
+ --status-neutral-fill-active: удалён; вычисляется из --neutral-fill
61
+ --status-neutral-soft: удалён; вычисляется из --neutral-fill
62
+ --status-error-text-hover: удалён; вычисляется из --error-text
63
+ --status-error-text-active: удалён; вычисляется из --error-text
64
+ --status-error-border-hover: удалён; вычисляется из --error-border
65
+ --status-error-border-active: удалён; вычисляется из --error-border
66
+ --status-error-border-focus: --focus-ring
67
+ --status-error-fill-hover: удалён; вычисляется из --error-fill
68
+ --status-error-fill-active: удалён; вычисляется из --error-fill
69
+ --status-error-soft: удалён; вычисляется из --error-fill
70
+ --status-warning-text-hover: удалён; вычисляется из --warning-text
71
+ --status-warning-text-active: удалён; вычисляется из --warning-text
72
+ --status-warning-border-hover: удалён; вычисляется из --warning-border
73
+ --status-warning-border-active: удалён; вычисляется из --warning-border
74
+ --status-warning-border-focus: --focus-ring
75
+ --status-warning-fill-hover: удалён; вычисляется из --warning-fill
76
+ --status-warning-fill-active: удалён; вычисляется из --warning-fill
77
+ --status-warning-soft: удалён; вычисляется из --warning-fill
78
+ --status-success-text-hover: удалён; вычисляется из --success-text
79
+ --status-success-text-active: удалён; вычисляется из --success-text
80
+ --status-success-border-hover: удалён; вычисляется из --success-border
81
+ --status-success-border-active: удалён; вычисляется из --success-border
82
+ --status-success-border-focus: --focus-ring
83
+ --status-success-fill-hover: удалён; вычисляется из --success-fill
84
+ --status-success-fill-active: удалён; вычисляется из --success-fill
85
+ --status-success-soft: удалён; вычисляется из --success-fill
86
+ --status-info-text-hover: удалён; вычисляется из --info-text
87
+ --status-info-text-active: удалён; вычисляется из --info-text
88
+ --status-info-border-hover: удалён; вычисляется из --info-border
89
+ --status-info-border-active: удалён; вычисляется из --info-border
90
+ --status-info-border-focus: --focus-ring
91
+ --status-info-fill-hover: удалён; вычисляется из --info-fill
92
+ --status-info-fill-active: удалён; вычисляется из --info-fill
93
+ --status-info-soft: удалён; вычисляется из --info-fill
94
+ ```
95
+
96
+ ## Accent и прежние interactive-токены
97
+
98
+ ```text
99
+ --content-accent: --accent-text
100
+ --border-accent: --accent-border
101
+ --surface-accent: --accent-fill
102
+ --interactive-color: удалён; обычное свойство color самого компонента
103
+ --interactive-surface: удалён; обычное свойство background-color самого компонента
104
+ --interactive-border: удалён; обычное свойство border-color самого компонента
105
+ --interactive-hover-color: --accent-on-fill
106
+ --interactive-active-color: --accent-on-fill
107
+ --interactive-selected-color: --accent-on-fill
108
+ --interactive-hover-surface: --accent-fill
109
+ --interactive-active-surface: --accent-fill
110
+ --interactive-selected-surface: --accent-fill
111
+ --interactive-hover-border: --accent-border
112
+ --interactive-active-border: --accent-border
113
+ --interactive-selected-border: --accent-border
114
+ отсутствовал: --accent-on-fill
115
+ ```
116
+
117
+ ## High contrast
118
+
119
+ ```text
120
+ --hc-status-brand-text: --hc-brand-text
121
+ --hc-status-brand-border: --hc-brand-border
122
+ --hc-status-brand-fill: --hc-brand-fill
123
+ --hc-status-brand-on-fill: --hc-brand-on-fill
124
+ --hc-status-brand-soft: удалён; мягкая заливка вычисляется из --brand-fill
125
+ --hc-status-neutral-text: --hc-neutral-text
126
+ --hc-status-neutral-border: --hc-neutral-border
127
+ --hc-status-neutral-fill: --hc-neutral-fill
128
+ --hc-status-neutral-on-fill: --hc-neutral-on-fill
129
+ --hc-status-neutral-soft: удалён; мягкая заливка вычисляется из --neutral-fill
130
+ --hc-status-error-text: --hc-error-text
131
+ --hc-status-error-border: --hc-error-border
132
+ --hc-status-error-fill: --hc-error-fill
133
+ --hc-status-error-on-fill: --hc-error-on-fill
134
+ --hc-status-error-soft: удалён; мягкая заливка вычисляется из --error-fill
135
+ --hc-status-warning-text: --hc-warning-text
136
+ --hc-status-warning-border: --hc-warning-border
137
+ --hc-status-warning-fill: --hc-warning-fill
138
+ --hc-status-warning-on-fill: --hc-warning-on-fill
139
+ --hc-status-warning-soft: удалён; мягкая заливка вычисляется из --warning-fill
140
+ --hc-status-success-text: --hc-success-text
141
+ --hc-status-success-border: --hc-success-border
142
+ --hc-status-success-fill: --hc-success-fill
143
+ --hc-status-success-on-fill: --hc-success-on-fill
144
+ --hc-status-success-soft: удалён; мягкая заливка вычисляется из --success-fill
145
+ --hc-status-info-text: --hc-info-text
146
+ --hc-status-info-border: --hc-info-border
147
+ --hc-status-info-fill: --hc-info-fill
148
+ --hc-status-info-on-fill: --hc-info-on-fill
149
+ --hc-status-info-soft: удалён; мягкая заливка вычисляется из --info-fill
150
+
151
+ --hc-content-accent: --hc-accent-text
152
+ --hc-border-accent: --hc-accent-border
153
+ --hc-surface-accent: --hc-accent-fill
154
+ отсутствовал: --hc-accent-on-fill
155
+
156
+ --hc-surface: --hc-surface-0, --hc-surface-1, --hc-surface-2
157
+ --hc-content: --hc-content-0, --hc-content-1, --hc-content-2
158
+ --hc-border: --hc-border-0, --hc-border-1, --hc-border-2
159
+
160
+ отсутствовал: --hc-white
161
+ отсутствовал: --hc-black
162
+ отсутствовал: --hc-shadow-xs
163
+ отсутствовал: --hc-shadow-sm
164
+ отсутствовал: --hc-shadow-md
165
+ отсутствовал: --hc-shadow-lg
166
+ ```
167
+
168
+ `--hc-focus-ring`, `--hc-border-focus`, `--hc-overlay-backdrop` и `--hc-overlay-glass` сохраняют имена.
169
+
170
+ ## Полный новый контракт семантических схем
171
+
172
+ ```text
173
+ --accent-text
174
+ --accent-border
175
+ --accent-fill
176
+ --accent-on-fill
177
+ --brand-text
178
+ --brand-border
179
+ --brand-fill
180
+ --brand-on-fill
181
+ --neutral-text
182
+ --neutral-border
183
+ --neutral-fill
184
+ --neutral-on-fill
185
+ --error-text
186
+ --error-border
187
+ --error-fill
188
+ --error-on-fill
189
+ --warning-text
190
+ --warning-border
191
+ --warning-fill
192
+ --warning-on-fill
193
+ --success-text
194
+ --success-border
195
+ --success-fill
196
+ --success-on-fill
197
+ --info-text
198
+ --info-border
199
+ --info-fill
200
+ --info-on-fill
201
+ ```
202
+
203
+ Первичное объявление каждого цвета имеет форму `--token: var(--hc-token, #hex)`. Это правило автоматически применяется к цветовым значениям в картах `tokens` и `status`. Contrast-режим задаёт только `--hc-*`, а обычная тема продолжает использовать hex fallback.
204
+
205
+ ## Sass-конфигурация
206
+
207
+ Прежние OKLCH seeds, вложенные scales и отдельная карта `accent` удалены. Новая форма переопределения:
208
+
209
+ ```scss
210
+ status: (
211
+ accent: (
212
+ text: #9a3412,
213
+ border: #ea580c,
214
+ fill: #ffedd5,
215
+ on-fill: #431407
216
+ ),
217
+ error: (
218
+ text: #b91c1c,
219
+ border: #b91c1c,
220
+ fill: #dc2626,
221
+ on-fill: #ffffff
222
+ )
223
+ );
224
+ ```
package/README.md CHANGED
@@ -108,7 +108,9 @@ import "@ryuzaki13/react-foundation-ui/styles.css";
108
108
 
109
109
  ### Точные палитры host-приложения
110
110
 
111
- Если одной OKLCH-точки недостаточно для воспроизведения брендовой палитры, публичный mixin `theme` принимает точные accent/status scales. Неуказанные значения наследуются из настроенного baseline схемы; границы статуса по умолчанию повторяют text scale, а `soft` вычисляется из точного fill. Карта `tokens` выводится последней и предназначена для точечных semantic-token overrides. Для custom theme без отдельных `brand` и `neutral` scales эти тона связываются с её accent и базовыми content/surface/border tokens; недостающие border/soft tokens остальных статусов также следуют за их точными text/fill значениями.
111
+ Публичный mixin `theme` принимает обычные hex-цвета для семантических схем `accent`, `brand`, `neutral`, `error`, `warning`, `success` и `info`. У каждой схемы четыре обязательные роли: `text`, `border`, `fill` и `on-fill`. Неуказанные значения наследуются из baseline выбранного light/dark-режима, поэтому host может переопределить одну роль без копирования всей палитры. Hover, active и мягкие заливки вычисляются внутри компонентов и не расширяют публичный контракт темы.
112
+
113
+ Каждый первичный цветовой токен использует одноимённый high-contrast token перед hex fallback: например, `--error-text: var(--hc-error-text, #b91c1c)`. Цветовые значения из карты `tokens` получают такой wrapper автоматически. Это позволяет будущему contrast-режиму заменить палитру без повторной компиляции темы. Карта `tokens` выводится последней и остаётся escape hatch для точечных semantic-token overrides.
112
114
 
113
115
  ```scss
114
116
  @use "@ryuzaki13/react-foundation-ui/styles/themes" as foundationThemes;
@@ -122,24 +124,18 @@ import "@ryuzaki13/react-foundation-ui/styles.css";
122
124
  "--surface-1": #f8ecd9,
123
125
  "--focus-ring": #c2410c
124
126
  ),
125
- accent: (
126
- content: #9a3412,
127
- surface: #ffedd5,
128
- border: #ea580c
129
- ),
130
127
  status: (
128
+ accent: (
129
+ text: #9a3412,
130
+ border: #ea580c,
131
+ fill: #ffedd5,
132
+ on-fill: #431407
133
+ ),
131
134
  error: (
132
- text: (
133
- base: #b91c1c,
134
- hover: #991b1b,
135
- active: #7f1d1d
136
- ),
137
- fill: (
138
- base: #dc2626,
139
- hover: #b91c1c,
140
- active: #991b1b,
141
- on-fill: #ffffff
142
- )
135
+ text: #b91c1c,
136
+ border: #b91c1c,
137
+ fill: #dc2626,
138
+ on-fill: #ffffff
143
139
  )
144
140
  )
145
141
  )
@@ -147,7 +143,7 @@ import "@ryuzaki13/react-foundation-ui/styles.css";
147
143
  }
148
144
  ```
149
145
 
150
- Для `accent` точная форма содержит `content`, `surface` и `border`. Для статуса обязательна карта `text` с `base`; `hover` и `active` имеют последовательные fallback. Карта `fill` и её поля опциональны, а `border` может отдельно задать `base`, `hover`, `active` и `focus`. Такой контракт позволяет переносить существующие темы без аппроксимации цветов и при этом сохраняет все новые semantic-токены foundation UI.
146
+ `accent` больше не является отдельной экспериментальной системой `--interactive-*`: это полноценная семантическая схема с теми же четырьмя ролями. Компоненты используют её для текущего, выбранного и наведённого состояния. Полная карта переименований вынесена в `COLOR_TOKENS_MIGRATION.md`.
151
147
 
152
148
  ## Сканирование штрихкодов
153
149
 
@@ -1,14 +1,14 @@
1
- import { t as e } from "../chunks/ui.module-BsDio9A3.js";
2
- import { n as t } from "../chunks/button-BaUlN-nt.js";
1
+ import { t as e } from "../chunks/ui.module-oRwY3Zli.js";
2
+ import { n as t } from "../chunks/button-DF21yxVp.js";
3
3
  import { c as n, g as r, h as i } from "../chunks/misc-DeGboAt-.js";
4
4
  import { o as a } from "../chunks/flex-C7njxZ74.js";
5
5
  import { r as o } from "../chunks/grid-dI94AAbi.js";
6
- import { a as s, i as c, n as l, r as u } from "../chunks/modal-CbAwLHlM.js";
7
- import { n as d, t as f } from "../chunks/badge-DUI2ET6q.js";
8
- import { d as p, f as m } from "../chunks/input-D1jOxm0t.js";
9
- import { t as h } from "../chunks/input-search-Ci1ubGox.js";
10
- import { n as g } from "../chunks/multi-select-V7SLAduU.js";
11
- import { t as _ } from "../chunks/table-DMLFUBlb.js";
6
+ import { a as s, i as c, n as l, r as u } from "../chunks/modal-dplfAaER.js";
7
+ import { n as d, t as f } from "../chunks/badge-6mXO9BWP.js";
8
+ import { d as p, f as m } from "../chunks/input-DSPKgiCK.js";
9
+ import { t as h } from "../chunks/input-search-Cat4c7SM.js";
10
+ import { n as g } from "../chunks/multi-select-BZ9N6Dal.js";
11
+ import { t as _ } from "../chunks/table-DxoSOvQK.js";
12
12
  import { useCallback as v, useMemo as y, useState as b } from "react";
13
13
  import { odataQueryFn as x, useODataTableColumns as S } from "@ryuzaki13/react-foundation-api/odata";
14
14
  import { createFilterContains as C, createFilterEqual as w, unwrapODataQueryResult as T } from "@ryuzaki13/react-foundation-lib/odata-service";
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/badge-DUI2ET6q.js";
1
+ import { n as e, t } from "../chunks/badge-6mXO9BWP.js";
2
2
  export { e as Badge, t as BadgeList };
@@ -1,5 +1,5 @@
1
- import { n as e } from "../chunks/button-BaUlN-nt.js";
2
- import { n as t, r as n } from "../chunks/modal-CbAwLHlM.js";
1
+ import { n as e } from "../chunks/button-DF21yxVp.js";
2
+ import { n as t, r as n } from "../chunks/modal-dplfAaER.js";
3
3
  import { useCallback as r, useEffect as i, useRef as a, useState as o } from "react";
4
4
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
5
  import { Scanner as l, prepareZXingModule as u } from "@yudiel/react-qr-scanner";
@@ -1,3 +1,3 @@
1
1
  import { n as e, t } from "../chunks/table-column-interactions-DzEvVuXe.js";
2
- import { a as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "../chunks/base-table-BqW1n7tv.js";
2
+ import { a as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "../chunks/base-table-BWvKfI2W.js";
3
3
  export { d as BaseTable, g as FormattedTableCell, e as TableColumnResizeHandle, t as TableHeaderInteractionCell, a as buildBaseTableColumnLayout, h as buildBaseTableMergedCellsLayout, r as buildTableFormattingSnapshot, p as getOrderedVisibleLeafColumns, u as getStartPinnedColumnOffsets, l as hasTableColumnCustomCellRenderer, s as normalizeTableColumnPinning, o as resolveBaseTableColumnWidth, _ as resolveTableFormattingColumnId, i as shouldUseTableFormatting, f as useTableColumnOrder, n as useTableColumnPinning, c as useTableColumnSizing, m as useTableColumnVisibility };
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "../chunks/button-BaUlN-nt.js";
1
+ import { n as e, t } from "../chunks/button-DF21yxVp.js";
2
2
  export { e as Button, t as ButtonRemove };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../chunks/check-box-CC8CDnSR.js";
1
+ import { t as e } from "../chunks/check-box-CZyhzmR0.js";
2
2
  export { e as CheckBox };
@@ -1,4 +1,4 @@
1
- import { n as e } from "./button-BaUlN-nt.js";
1
+ import { n as e } from "./button-DF21yxVp.js";
2
2
  import { useState as t } from "react";
3
3
  import { cn as n } from "@ryuzaki13/react-foundation-lib/utils";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
@@ -431,4 +431,4 @@ function I({ view: n, datePickerLevel: l, selectionMode: p = "day", weekEndDay:
431
431
  //#endregion
432
432
  export { y as a, v as i, _ as n, b as o, g as r, C as s, I as t };
433
433
 
434
- //# sourceMappingURL=CalendarView-Bhaov_XE.js.map
434
+ //# sourceMappingURL=CalendarView-Dm55k0bN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarView-Dm55k0bN.js","names":[],"sources":["../../src/date-input/lib/dateInputCalendar.ts","../../src/date-input/ui/CalendarDayView.module.scss","../../src/date-input/ui/CalendarDayView.tsx","../../src/date-input/ui/CalendarMonthView.module.scss","../../src/date-input/ui/CalendarMonthView.tsx","../../src/date-input/ui/CalendarView.module.scss","../../src/date-input/ui/CalendarYearView.module.scss","../../src/date-input/ui/CalendarYearView.tsx","../../src/date-input/ui/CalendarView.tsx"],"sourcesContent":["import {\n\tgetCalendarPeriod,\n\tisDateInsideCalendarPeriod,\n\ttype CalendarPeriod,\n\ttype CalendarPeriodOptions,\n\ttype DateRangeInput,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nimport type { DateInputSelectionMode, DateInputWeekEndDay, DatePickerLevel } from \"./types\";\n\nexport const DATE_PICKER_LEVELS = [\"day\", \"month\", \"year\"] as const satisfies readonly DatePickerLevel[];\nexport const DATE_INPUT_WEEK_END_DAYS = [\"friday\", \"saturday\", \"sunday\"] as const satisfies readonly DateInputWeekEndDay[];\n\n/**\n * Возвращает календарный вид, который удобнее всего открывать для выбранного размера периода.\n */\nexport function getDatePickerLevelForSelectionMode(selectionMode: DateInputSelectionMode): DatePickerLevel {\n\tif (selectionMode === \"month\") return \"month\";\n\tif (selectionMode === \"year\") return \"year\";\n\n\treturn \"day\";\n}\n\n/**\n * Проверяет, разрешён ли календарный вид относительно минимального уровня навигации.\n */\nexport function isDatePickerLevelAvailable(level: DatePickerLevel, minLevel: DatePickerLevel): boolean {\n\treturn DATE_PICKER_LEVELS.indexOf(level) >= DATE_PICKER_LEVELS.indexOf(minLevel);\n}\n\n/**\n * Подбирает вид календаря для режима выбора с учётом ограничения `datePickerLevel`.\n */\nexport function resolveAvailableDatePickerLevel(selectionMode: DateInputSelectionMode, minLevel: DatePickerLevel): DatePickerLevel {\n\tconst preferredLevel = getDatePickerLevelForSelectionMode(selectionMode);\n\n\treturn isDatePickerLevelAvailable(preferredLevel, minLevel) ? preferredLevel : minLevel;\n}\n\nexport interface DateInputPeriodRangeStateOptions {\n\treadonly date: Date;\n\treadonly value: DateRangeInput;\n\treadonly hoveredDate?: Date | null;\n\treadonly selectsRange?: boolean;\n\treadonly selectionOptions?: CalendarPeriodOptions;\n}\n\nexport interface DateInputPeriodRangeState {\n\treadonly selected: boolean;\n\treadonly range: boolean;\n\treadonly rangeStart: boolean;\n\treadonly rangeEnd: boolean;\n}\n\nfunction isSameCalendarPeriod(left: CalendarPeriod | null, right: CalendarPeriod | null): boolean {\n\tif (!left || !right) return false;\n\n\treturn left.start.getTime() === right.start.getTime() && left.end.getTime() === right.end.getTime();\n}\n\nfunction isCalendarPeriodInsideRange(\n\tperiod: CalendarPeriod | null,\n\tstartPeriod: CalendarPeriod | null,\n\tendPeriod: CalendarPeriod | null\n): boolean {\n\tif (!period || !startPeriod || !endPeriod) return false;\n\n\tconst startTime = Math.min(startPeriod.start.getTime(), endPeriod.start.getTime());\n\tconst endTime = Math.max(startPeriod.end.getTime(), endPeriod.end.getTime());\n\n\treturn period.start.getTime() >= startTime && period.end.getTime() <= endTime;\n}\n\n/**\n * Рассчитывает visual-state ячейки календарного периода для single/range режима.\n */\nexport function resolveDateInputPeriodRangeState({\n\tdate,\n\tvalue,\n\thoveredDate,\n\tselectsRange,\n\tselectionOptions\n}: DateInputPeriodRangeStateOptions): DateInputPeriodRangeState {\n\tconst period = getCalendarPeriod(date, selectionOptions);\n\tconst selectedDate = !selectsRange && value instanceof Date ? value : null;\n\tconst selectedSinglePeriod = getCalendarPeriod(selectedDate, selectionOptions);\n\n\tif (!selectsRange || !Array.isArray(value)) {\n\t\treturn {\n\t\t\tselected: isDateInsideCalendarPeriod(date, selectedSinglePeriod),\n\t\t\trange: false,\n\t\t\trangeStart: false,\n\t\t\trangeEnd: false\n\t\t};\n\t}\n\n\tconst [selectedStartDate, selectedEndDate] = value as NullableDateRange;\n\tconst selectedStartPeriod = getCalendarPeriod(selectedStartDate, selectionOptions);\n\tconst previewEndPeriod = getCalendarPeriod(selectedEndDate ?? (selectedStartDate ? hoveredDate : null), selectionOptions);\n\tconst rangeStart = isSameCalendarPeriod(period, selectedStartPeriod);\n\tconst rangeEnd = isSameCalendarPeriod(period, previewEndPeriod);\n\tconst range = isCalendarPeriodInsideRange(period, selectedStartPeriod, previewEndPeriod);\n\n\treturn {\n\t\tselected: false,\n\t\trange: range && !rangeStart && !rangeEnd,\n\t\trangeStart,\n\t\trangeEnd\n\t};\n}\n",".dayView {\n\tpadding: 0;\n}\n\n.weekdays {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(7, 1fr);\n\ttext-align: center;\n\tmargin-bottom: var(--space-sm);\n\tcolor: var(--content-1);\n}\n\n.weekday {\n\tfont-size: var(--font-size-xs);\n}\n\n.daysGrid {\n\tdisplay: grid;\n\tgap: var(--border-width);\n}\n\n.week {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(7, 1fr);\n\tgap: var(--border-width);\n}\n\n.day {\n\t--range-radius: calc(var(--control-height) / 2);\n\n\theight: var(--control-height);\n\tcursor: pointer;\n\tborder-radius: var(--radius-xs);\n\t// font-size: var(--font-size-sm);\n\n\tbackground-color: var(--surface-1);\n\n\t&:hover:not(.disabled) {\n\t\tbackground-color: var(--accent-fill);\n\t}\n\n\t&.outsideMonth {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--content-2);\n\t}\n\n\t&.periodSelection:hover:not(.disabled):not(.periodPreview):not(.selected) {\n\t\tbackground-color: var(--surface-1);\n\t}\n\n\t&.periodSelection.outsideMonth:hover:not(.disabled):not(.periodPreview):not(.selected) {\n\t\tbackground-color: transparent;\n\t}\n\n\t&.periodPreview {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--content-0);\n\t}\n\n\t&.range {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--content-0);\n\t}\n\n\t&.rangeStart {\n\t\t// border-top-left-radius: var(--range-radius);\n\t\t// border-bottom-left-radius: var(--range-radius);\n\t}\n\n\t&.rangeEnd {\n\t\t// border-top-right-radius: var(--range-radius);\n\t\t// border-bottom-right-radius: var(--range-radius);\n\t}\n\n\t&.selected,\n\t&.rangeStart,\n\t&.rangeEnd {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--accent-text);\n\t\tfont-weight: 600;\n\t\tfont-variation-settings: \"wght\" 600;\n\t}\n\n\t&.weekend:not(.selected):not(.range):not(.rangeStart):not(.rangeEnd) {\n\t\tcolor: var(--error-fill);\n\t}\n\n\t&.disabled {\n\t\tcolor: var(--content-2);\n\t\tcursor: not-allowed;\n\n\t\t&:hover {\n\t\t\tbackground: none;\n\t\t}\n\t}\n\n\t&.now {\n\t\tborder: var(--border);\n\t\tcolor: var(--info-text);\n\t\tborder-color: var(--info-text);\n\t}\n}\n","import { useState } from \"react\";\n\nimport {\n\tcreateCalendarDate,\n\tgetCalendarPeriod,\n\tgetStartOfDay,\n\tisCalendarPeriodWithinDateBounds,\n\tisDateInsideCalendarPeriod,\n\tisSameCalendarDay,\n\ttype CalendarPeriodOptions,\n\ttype DateRangeInput\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { type DateInputSelectionMode, type DateInputWeekEndDay } from \"../lib\";\n\nimport styles from \"./CalendarDayView.module.scss\";\n\nconst weekDays = [\"Пн\", \"Вт\", \"Ср\", \"Чт\", \"Пт\", \"Сб\", \"Вс\"];\nconst dayLabelFormatter = new Intl.DateTimeFormat(\"ru-RU\", {\n\tweekday: \"long\",\n\tyear: \"numeric\",\n\tmonth: \"long\",\n\tday: \"numeric\"\n});\n\ninterface DayViewProps {\n\tnow: Date;\n\tcurrentDate: Date;\n\tvalue: DateRangeInput;\n\tonChange: (date: Date) => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tselectsRange?: boolean;\n\tselectionMode?: DateInputSelectionMode;\n\tweekEndDay?: DateInputWeekEndDay;\n}\n\n/**\n * Отображает сетку дней месяца в календарной семантике без timezone-сдвига.\n */\nexport const CalendarDayView: React.FC<DayViewProps> = ({\n\tnow,\n\tcurrentDate,\n\tvalue,\n\tonChange,\n\tminDate,\n\tmaxDate,\n\tselectsRange,\n\tselectionMode = \"day\",\n\tweekEndDay = \"sunday\"\n}) => {\n\tconst [hoveredDate, setHoveredDate] = useState<Date | null>(null);\n\tconst selectionOptions: CalendarPeriodOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\t/**\n\t * Генерирует недели для текущего месяца с учётом дней соседних месяцев.\n\t */\n\tconst generateCalendarDays = () => {\n\t\tconst year = currentDate.getFullYear();\n\t\tconst month = currentDate.getMonth();\n\n\t\tconst firstDay = createCalendarDate(year, month, 1);\n\t\tconst lastDay = createCalendarDate(year, month + 1, 0);\n\t\tconst prevMonthDays = firstDay.getDay() === 0 ? 6 : firstDay.getDay() - 1;\n\t\tconst nextMonthDays = 6 * 7 - (prevMonthDays + lastDay.getDate());\n\n\t\tconst days: Date[] = [];\n\t\tconst prevMonthLastDay = createCalendarDate(year, month, 0).getDate();\n\n\t\tfor (let index = prevMonthDays; index > 0; index -= 1) {\n\t\t\tdays.push(createCalendarDate(year, month - 1, prevMonthLastDay - index + 1));\n\t\t}\n\n\t\tfor (let day = 1; day <= lastDay.getDate(); day += 1) {\n\t\t\tdays.push(createCalendarDate(year, month, day));\n\t\t}\n\n\t\tfor (let day = 1; day <= nextMonthDays; day += 1) {\n\t\t\tdays.push(createCalendarDate(year, month + 1, day));\n\t\t}\n\n\t\tconst weeks: Date[][] = [];\n\t\tfor (let index = 0; index < days.length; index += 7) {\n\t\t\tweeks.push(days.slice(index, index + 7));\n\t\t}\n\n\t\treturn weeks;\n\t};\n\n\tconst weeks = generateCalendarDays();\n\tconst selectedStartDate = selectsRange && Array.isArray(value) ? value[0] : null;\n\tconst selectedEndDate = selectsRange && Array.isArray(value) ? value[1] : null;\n\tconst selectedDate = !selectsRange ? (value as Date | null) : null;\n\tconst selectedSinglePeriod = getCalendarPeriod(selectedDate, selectionOptions);\n\tconst hoveredPeriod = getCalendarPeriod(hoveredDate, selectionOptions);\n\tconst previewEndDate = selectedEndDate ?? (selectedStartDate ? (hoveredPeriod?.end ?? null) : null);\n\tconst previewsWeekPeriod = selectionMode === \"week\";\n\tconst previewsStandalonePeriod = previewsWeekPeriod && (!selectsRange || !selectedStartDate);\n\n\t/**\n\t * Проверяет, лежит ли день внутри выбранного или preview-диапазона.\n\t */\n\tconst isInRange = (date: Date) => {\n\t\tif (!selectsRange || !selectedStartDate || !previewEndDate) return false;\n\n\t\tconst dateMs = getStartOfDay(date).getTime();\n\t\tconst startMs = selectedStartDate.getTime();\n\t\tconst endMs = previewEndDate.getTime();\n\n\t\treturn dateMs >= Math.min(startMs, endMs) && dateMs <= Math.max(startMs, endMs);\n\t};\n\n\t/**\n\t * Проверяет ограничения на выбор даты.\n\t */\n\tconst isDisabled = (date: Date) => {\n\t\treturn !isCalendarPeriodWithinDateBounds(getCalendarPeriod(date, selectionOptions), { minDate, maxDate });\n\t};\n\n\t/**\n\t * Обновляет preview-конец диапазона при движении мыши.\n\t */\n\tconst handleDayHover = (date: Date, disabled: boolean) => {\n\t\tif (disabled) return;\n\n\t\tif (previewsWeekPeriod) {\n\t\t\tsetHoveredDate(date);\n\t\t}\n\n\t\tif (!selectsRange || !selectedStartDate || selectedEndDate) return;\n\t\tif (!previewsWeekPeriod) setHoveredDate(date);\n\t};\n\n\t/**\n\t * Сбрасывает preview незавершённого диапазона при уходе курсора.\n\t */\n\tconst handleGridLeave = () => {\n\t\tif (previewsWeekPeriod || !selectedEndDate) {\n\t\t\tsetHoveredDate(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.dayView}>\n\t\t\t<div className={styles.weekdays}>\n\t\t\t\t{weekDays.map((day) => (\n\t\t\t\t\t<div key={day} className={styles.weekday}>\n\t\t\t\t\t\t{day}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t<div className={styles.daysGrid} onMouseLeave={handleGridLeave}>\n\t\t\t\t{weeks.map((week, weekIndex) => (\n\t\t\t\t\t<div key={weekIndex} className={styles.week}>\n\t\t\t\t\t\t{week.map((day, dayIndex) => {\n\t\t\t\t\t\t\tconst isCurrentMonth = day.getMonth() === currentDate.getMonth();\n\t\t\t\t\t\t\tconst isSelected = isDateInsideCalendarPeriod(day, selectedSinglePeriod);\n\t\t\t\t\t\t\tconst isPeriodPreview = previewsStandalonePeriod && isDateInsideCalendarPeriod(day, hoveredPeriod);\n\t\t\t\t\t\t\tconst isRange = isInRange(day);\n\t\t\t\t\t\t\tconst isStart = isSameCalendarDay(day, selectedStartDate);\n\t\t\t\t\t\t\tconst isEnd = isSameCalendarDay(day, previewEndDate);\n\t\t\t\t\t\t\tconst isNow = isSameCalendarDay(day, now);\n\t\t\t\t\t\t\tconst disabled = isDisabled(day);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={`${weekIndex}-${dayIndex}`}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => !disabled && onChange(day)}\n\t\t\t\t\t\t\t\t\tonMouseEnter={() => handleDayHover(day, disabled)}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tdata-ui=\"calendar-day-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"select-calendar-day\"\n\t\t\t\t\t\t\t\t\tclassName={cn(styles.day, {\n\t\t\t\t\t\t\t\t\t\t[styles.outsideMonth]: !isCurrentMonth,\n\t\t\t\t\t\t\t\t\t\t[styles.periodSelection]: selectionMode === \"week\",\n\t\t\t\t\t\t\t\t\t\t[styles.periodPreview]: isPeriodPreview && !isSelected,\n\t\t\t\t\t\t\t\t\t\t[styles.selected]: isSelected,\n\t\t\t\t\t\t\t\t\t\t[styles.range]: isRange && !isStart && !isEnd,\n\t\t\t\t\t\t\t\t\t\t[styles.rangeStart]: isStart,\n\t\t\t\t\t\t\t\t\t\t[styles.rangeEnd]: isEnd,\n\t\t\t\t\t\t\t\t\t\t[styles.disabled]: disabled,\n\t\t\t\t\t\t\t\t\t\t[styles.weekend]: dayIndex > 4,\n\t\t\t\t\t\t\t\t\t\t[styles.now]: isNow\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\taria-label={dayLabelFormatter.format(day)}\n\t\t\t\t\t\t\t\t\taria-pressed={isSelected || isRange || isStart || isEnd}>\n\t\t\t\t\t\t\t\t\t{day.getDate()}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n",".monthView {\n\tpadding: 0;\n}\n\n.monthsGrid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, 1fr);\n\tgap: var(--border-width);\n\talign-content: center;\n\n\t// min-height: calc(12em * var(--line-height));\n}\n\n.month {\n\theight: var(--control-height);\n\tcursor: pointer;\n\tborder-radius: var(--radius-xs);\n\t// font-size: var(--font-size-sm);\n\ttext-transform: capitalize;\n\n\tbackground-color: var(--surface-1);\n\n\t&:hover:not(.disabled) {\n\t\tbackground-color: var(--accent-fill);\n\t}\n\n\t&.range {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--content-0);\n\t}\n\n\t&.selected,\n\t&.rangeStart,\n\t&.rangeEnd {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--accent-text);\n\t\tfont-weight: 600;\n\t\tfont-variation-settings: \"wght\" 600;\n\t}\n\n\t&.disabled {\n\t\tcolor: var(--content-2);\n\t\tcursor: not-allowed;\n\n\t\t&:hover {\n\t\t\tbackground: none;\n\t\t}\n\t}\n}\n","import { useState } from \"react\";\n\nimport {\n\tcreateCalendarDate,\n\tgetCalendarPeriod,\n\tisCalendarPeriodWithinDateBounds,\n\ttype CalendarPeriodOptions,\n\ttype DateRangeInput\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { resolveDateInputPeriodRangeState } from \"../lib\";\n\nimport styles from \"./CalendarMonthView.module.scss\";\n\nimport type { DateInputSelectionMode, DateInputWeekEndDay } from \"../lib\";\n\nconst monthLabelFormatter = new Intl.DateTimeFormat(\"ru-RU\", { month: \"short\" });\nconst monthAriaFormatter = new Intl.DateTimeFormat(\"ru-RU\", { month: \"long\", year: \"numeric\" });\n\ninterface MonthViewProps {\n\tcurrentDate: Date;\n\tvalue: DateRangeInput;\n\tonChange: (date: Date) => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tselectsRange?: boolean;\n\tselectsPeriod?: boolean;\n\tselectionMode?: DateInputSelectionMode;\n\tweekEndDay?: DateInputWeekEndDay;\n}\n\n/**\n * Отображает выбор месяца в календарной семантике без timezone-сдвига.\n */\nexport const CalendarMonthView: React.FC<MonthViewProps> = ({\n\tcurrentDate,\n\tvalue,\n\tonChange,\n\tminDate,\n\tmaxDate,\n\tselectsRange,\n\tselectsPeriod,\n\tselectionMode = \"day\",\n\tweekEndDay = \"sunday\"\n}) => {\n\tconst [hoveredDate, setHoveredDate] = useState<Date | null>(null);\n\tconst months = Array.from({ length: 12 }, (_, index) => index);\n\tconst currentYear = currentDate.getFullYear();\n\tconst selectionOptions: CalendarPeriodOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\tconst selectedStartDate = selectsRange && Array.isArray(value) ? value[0] : null;\n\tconst selectedEndDate = selectsRange && Array.isArray(value) ? value[1] : null;\n\n\t/**\n\t * Возвращает сокращённое имя месяца.\n\t */\n\tconst getMonthName = (monthIndex: number) => monthLabelFormatter.format(createCalendarDate(currentYear, monthIndex, 1));\n\n\t/**\n\t * Проверяет, запрещён ли выбор месяца по ограничениям.\n\t */\n\tconst isDisabled = (monthIndex: number) => {\n\t\tif (!minDate && !maxDate) return false;\n\n\t\tconst monthStart = createCalendarDate(currentYear, monthIndex, 1);\n\t\tconst monthEnd = createCalendarDate(currentYear, monthIndex + 1, 0, 23, 59, 59);\n\n\t\tif (selectsPeriod) {\n\t\t\treturn !isCalendarPeriodWithinDateBounds(getCalendarPeriod(monthStart, selectionOptions), { minDate, maxDate });\n\t\t}\n\n\t\tif (minDate && monthEnd < minDate) return true;\n\t\tif (maxDate && monthStart > maxDate) return true;\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Обновляет preview-конец диапазона при движении мыши.\n\t */\n\tconst handleMonthHover = (date: Date, disabled: boolean) => {\n\t\tif (!selectsRange || !selectedStartDate || selectedEndDate || disabled) return;\n\t\tsetHoveredDate(date);\n\t};\n\n\t/**\n\t * Сбрасывает preview незавершённого диапазона при уходе курсора.\n\t */\n\tconst handleGridLeave = () => {\n\t\tif (!selectedEndDate) {\n\t\t\tsetHoveredDate(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.monthView}>\n\t\t\t<div className={styles.monthsGrid} onMouseLeave={handleGridLeave}>\n\t\t\t\t{months.map((monthIndex) => {\n\t\t\t\t\tconst disabled = isDisabled(monthIndex);\n\t\t\t\t\tconst monthDate = createCalendarDate(currentYear, monthIndex, 1);\n\t\t\t\t\tconst rangeState = resolveDateInputPeriodRangeState({\n\t\t\t\t\t\tdate: monthDate,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\thoveredDate,\n\t\t\t\t\t\tselectsRange,\n\t\t\t\t\t\tselectionOptions\n\t\t\t\t\t});\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={monthIndex}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => !disabled && onChange(monthDate)}\n\t\t\t\t\t\t\tonMouseEnter={() => handleMonthHover(monthDate, disabled)}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tdata-ui=\"calendar-month-button\"\n\t\t\t\t\t\t\tdata-action=\"select-calendar-month\"\n\t\t\t\t\t\t\tclassName={cn(styles.month, {\n\t\t\t\t\t\t\t\t[styles.selected]: rangeState.selected,\n\t\t\t\t\t\t\t\t[styles.range]: rangeState.range,\n\t\t\t\t\t\t\t\t[styles.rangeStart]: rangeState.rangeStart,\n\t\t\t\t\t\t\t\t[styles.rangeEnd]: rangeState.rangeEnd,\n\t\t\t\t\t\t\t\t[styles.disabled]: disabled\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\taria-label={monthAriaFormatter.format(monthDate)}\n\t\t\t\t\t\t\taria-pressed={rangeState.selected || rangeState.range || rangeState.rangeStart || rangeState.rangeEnd}>\n\t\t\t\t\t\t\t{getMonthName(monthIndex)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n",".calendarView {\n\twidth: calc(18em + var(--width-add));\n}\n\n.calendarHeader {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-bottom: var(--space-sm);\n\tmargin-bottom: var(--space-sm);\n\tgap: var(--space-sm);\n\tborder-bottom: var(--border);\n}\n",".yearView {\n\tpadding: 0;\n}\n\n.yearsGrid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, 1fr);\n\tgap: var(--border-width);\n}\n\n.year {\n\theight: var(--control-height);\n\tcursor: pointer;\n\tborder-radius: var(--radius-xs);\n\t// font-size: var(--font-size-sm);\n\n\tbackground-color: var(--surface-1);\n\n\t&:hover:not(.disabled) {\n\t\tbackground-color: var(--accent-fill);\n\t}\n\n\t&.range {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--content-0);\n\t}\n\n\t&.selected,\n\t&.rangeStart,\n\t&.rangeEnd {\n\t\tbackground-color: var(--accent-fill);\n\t\tcolor: var(--accent-text);\n\t\tfont-weight: 600;\n\t\tfont-variation-settings: \"wght\" 600;\n\t}\n\n\t&.disabled {\n\t\tcolor: var(--content-2);\n\t\tcursor: not-allowed;\n\n\t\t&:hover {\n\t\t\tbackground: none;\n\t\t}\n\t}\n}\n","import { useState } from \"react\";\n\nimport {\n\tcreateCalendarDate,\n\tgetCalendarPeriod,\n\tisCalendarPeriodWithinDateBounds,\n\ttype CalendarPeriodOptions,\n\ttype DateRangeInput\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { resolveDateInputPeriodRangeState } from \"../lib\";\n\nimport styles from \"./CalendarYearView.module.scss\";\n\nimport type { DateInputSelectionMode, DateInputWeekEndDay } from \"../lib\";\n\ninterface YearViewProps {\n\tcurrentDate: Date;\n\tvalue: DateRangeInput;\n\tonChange: (date: Date) => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tselectsRange?: boolean;\n\tselectsPeriod?: boolean;\n\tselectionMode?: DateInputSelectionMode;\n\tweekEndDay?: DateInputWeekEndDay;\n}\n\n/**\n * Отображает выбор года в календарной семантике без timezone-сдвига.\n */\nexport const CalendarYearView: React.FC<YearViewProps> = ({\n\tcurrentDate,\n\tvalue,\n\tonChange,\n\tminDate,\n\tmaxDate,\n\tselectsRange,\n\tselectsPeriod,\n\tselectionMode = \"day\",\n\tweekEndDay = \"sunday\"\n}) => {\n\tconst [hoveredDate, setHoveredDate] = useState<Date | null>(null);\n\tconst startYear = Math.floor(currentDate.getFullYear() / 12) * 12;\n\tconst years = Array.from({ length: 12 }, (_, index) => startYear + index);\n\tconst selectionOptions: CalendarPeriodOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\tconst selectedStartDate = selectsRange && Array.isArray(value) ? value[0] : null;\n\tconst selectedEndDate = selectsRange && Array.isArray(value) ? value[1] : null;\n\n\t/**\n\t * Проверяет ограничения на выбор года.\n\t */\n\tconst isDisabled = (year: number) => {\n\t\tif (!minDate && !maxDate) return false;\n\n\t\tconst yearStart = createCalendarDate(year, 0, 1);\n\t\tconst yearEnd = createCalendarDate(year, 11, 31, 23, 59, 59);\n\n\t\tif (selectsPeriod) {\n\t\t\treturn !isCalendarPeriodWithinDateBounds(getCalendarPeriod(yearStart, selectionOptions), { minDate, maxDate });\n\t\t}\n\n\t\tif (minDate && yearEnd < minDate) return true;\n\t\tif (maxDate && yearStart > maxDate) return true;\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Обновляет preview-конец диапазона при движении мыши.\n\t */\n\tconst handleYearHover = (date: Date, disabled: boolean) => {\n\t\tif (!selectsRange || !selectedStartDate || selectedEndDate || disabled) return;\n\t\tsetHoveredDate(date);\n\t};\n\n\t/**\n\t * Сбрасывает preview незавершённого диапазона при уходе курсора.\n\t */\n\tconst handleGridLeave = () => {\n\t\tif (!selectedEndDate) {\n\t\t\tsetHoveredDate(null);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.yearView}>\n\t\t\t<div className={styles.yearsGrid} onMouseLeave={handleGridLeave}>\n\t\t\t\t{years.map((year) => {\n\t\t\t\t\tconst disabled = isDisabled(year);\n\t\t\t\t\tconst yearDate = createCalendarDate(year, 0, 1);\n\t\t\t\t\tconst rangeState = resolveDateInputPeriodRangeState({\n\t\t\t\t\t\tdate: yearDate,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\thoveredDate,\n\t\t\t\t\t\tselectsRange,\n\t\t\t\t\t\tselectionOptions\n\t\t\t\t\t});\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={year}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => !disabled && onChange(yearDate)}\n\t\t\t\t\t\t\tonMouseEnter={() => handleYearHover(yearDate, disabled)}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tdata-ui=\"calendar-year-button\"\n\t\t\t\t\t\t\tdata-action=\"select-calendar-year\"\n\t\t\t\t\t\t\tclassName={cn(styles.year, {\n\t\t\t\t\t\t\t\t[styles.selected]: rangeState.selected,\n\t\t\t\t\t\t\t\t[styles.range]: rangeState.range,\n\t\t\t\t\t\t\t\t[styles.rangeStart]: rangeState.rangeStart,\n\t\t\t\t\t\t\t\t[styles.rangeEnd]: rangeState.rangeEnd,\n\t\t\t\t\t\t\t\t[styles.disabled]: disabled\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\taria-label={year.toString()}\n\t\t\t\t\t\t\taria-pressed={rangeState.selected || rangeState.range || rangeState.rangeStart || rangeState.rangeEnd}>\n\t\t\t\t\t\t\t{year}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport {\n\taddCalendarMonths,\n\taddCalendarYears,\n\tgetCalendarPeriod,\n\tgetStartOfDay,\n\tisCalendarPeriodWithinDateBounds,\n\tisDateRangeTuple,\n\ttype CalendarPeriodOptions,\n\ttype NullableDateRange\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { isDatePickerLevelAvailable, type CalendarType, type DateInputSelectionMode, type DateInputWeekEndDay } from \"../lib\";\n\nimport { CalendarDayView } from \"./CalendarDayView\";\nimport { CalendarMonthView } from \"./CalendarMonthView\";\nimport styles from \"./CalendarView.module.scss\";\nimport { CalendarYearView } from \"./CalendarYearView\";\n\ninterface BaseCalendarViewProps {\n\tview: CalendarType;\n\tdatePickerLevel: CalendarType;\n\tselectionMode?: DateInputSelectionMode;\n\tweekEndDay?: DateInputWeekEndDay;\n\tonViewChange: (view: CalendarType) => void;\n}\n\ninterface CalendarViewProps extends BaseCalendarViewProps {\n\tselectsRange?: boolean;\n\tvalue: Date | NullableDateRange | null;\n\tonChange: (date: Date | NullableDateRange) => void;\n\tminDate?: Date;\n\tmaxDate?: Date;\n\tcurrentDate?: Date;\n\tonCurrentDateChange?: (date: Date) => void;\n}\n\n/** Возвращает дату, к периоду которой должен перейти uncontrolled-календарь после внешней смены value. */\nfunction resolveValueCurrentDate(value: Date | NullableDateRange | null, selectsRange?: boolean): Date | undefined {\n\tif (selectsRange && isDateRangeTuple(value) && value[0] instanceof Date) {\n\t\treturn value[0];\n\t}\n\n\tif (!selectsRange && value instanceof Date) {\n\t\treturn value;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Отображает календарь выбора даты в календарной семантике без timezone-сдвига.\n */\nexport function CalendarView({\n\tview,\n\tdatePickerLevel,\n\tselectionMode = \"day\",\n\tweekEndDay = \"sunday\",\n\tonViewChange,\n\t...props\n}: CalendarViewProps) {\n\tconst [dateNow] = useState(() => getStartOfDay(new Date()));\n\tconst valueCurrentDate = resolveValueCurrentDate(props.value, props.selectsRange);\n\tconst valueCurrentDateTime = valueCurrentDate?.getTime() ?? null;\n\tconst [uncontrolledState, setUncontrolledState] = useState(() => ({\n\t\tsourceValueTime: valueCurrentDateTime,\n\t\tcurrentDate: valueCurrentDate ?? getStartOfDay(new Date())\n\t}));\n\tconst uncontrolledCurrentDate =\n\t\tvalueCurrentDate && uncontrolledState.sourceValueTime !== valueCurrentDateTime ? valueCurrentDate : uncontrolledState.currentDate;\n\tconst currentDate = props.currentDate ?? uncontrolledCurrentDate;\n\tconst selectionOptions: CalendarPeriodOptions = {\n\t\tselectionMode,\n\t\tweekEndDay\n\t};\n\n\t/**\n\t * Обновляет видимую календарную дату в управляемом или неуправляемом режиме.\n\t */\n\tconst setCurrentDate = (value: Date | ((prevValue: Date) => Date)) => {\n\t\tconst nextValue = typeof value === \"function\" ? value(currentDate) : value;\n\n\t\tif (props.currentDate === undefined) {\n\t\t\tsetUncontrolledState({\n\t\t\t\tsourceValueTime: valueCurrentDateTime,\n\t\t\t\tcurrentDate: nextValue\n\t\t\t});\n\t\t}\n\n\t\tprops.onCurrentDateChange?.(nextValue);\n\t};\n\n\t/**\n\t * Переключает видимую область календаря назад.\n\t */\n\tconst goToPrevious = () => {\n\t\tif (view === \"day\") {\n\t\t\tsetCurrentDate((prev) => addCalendarMonths(prev, -1));\n\t\t\treturn;\n\t\t}\n\n\t\tif (view === \"month\") {\n\t\t\tsetCurrentDate((prev) => addCalendarYears(prev, -1));\n\t\t\treturn;\n\t\t}\n\n\t\tsetCurrentDate((prev) => addCalendarYears(prev, -12));\n\t};\n\n\t/**\n\t * Переключает видимую область календаря вперёд.\n\t */\n\tconst goToNext = () => {\n\t\tif (view === \"day\") {\n\t\t\tsetCurrentDate((prev) => addCalendarMonths(prev, 1));\n\t\t\treturn;\n\t\t}\n\n\t\tif (view === \"month\") {\n\t\t\tsetCurrentDate((prev) => addCalendarYears(prev, 1));\n\t\t\treturn;\n\t\t}\n\n\t\tsetCurrentDate((prev) => addCalendarYears(prev, 12));\n\t};\n\n\t/**\n\t * Возвращает заголовок текущего календарного вида.\n\t */\n\tconst renderHeader = () => {\n\t\tlet title = \"\";\n\t\tif (view === \"day\") {\n\t\t\ttitle = currentDate.toLocaleDateString(\"ru-RU\", {\n\t\t\t\tmonth: \"long\",\n\t\t\t\tyear: \"numeric\"\n\t\t\t});\n\t\t} else if (view === \"month\") {\n\t\t\ttitle = currentDate.getFullYear().toString();\n\t\t} else {\n\t\t\tconst startYear = Math.floor(currentDate.getFullYear() / 12) * 12;\n\t\t\tconst endYear = startYear + 11;\n\t\t\ttitle = `${startYear} - ${endYear}`;\n\t\t}\n\n\t\treturn (\n\t\t\t<div className={styles.calendarHeader}>\n\t\t\t\t<Button\n\t\t\t\t\ticon={<ChevronLeft />}\n\t\t\t\t\tonClick={goToPrevious}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\taria-label=\"Предыдущий\"\n\t\t\t\t\tdata-action=\"calendar-previous\"\n\t\t\t\t/>\n\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (view === \"day\") onViewChange(\"month\");\n\t\t\t\t\t\telse if (view === \"month\") onViewChange(\"year\");\n\t\t\t\t\t}}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tclassName=\"flex1\"\n\t\t\t\t\tdata-ui=\"calendar-view-switch-button\"\n\t\t\t\t\tdata-action=\"calendar-switch-view\">\n\t\t\t\t\t{title}\n\t\t\t\t</Button>\n\n\t\t\t\t<Button\n\t\t\t\t\ticon={<ChevronRight />}\n\t\t\t\t\tonClick={goToNext}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\taria-label=\"Следующий\"\n\t\t\t\t\tdata-ui=\"calendar-next-button\"\n\t\t\t\t\tdata-action=\"calendar-next\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\t/**\n\t * Отрисовывает активный режим календаря.\n\t */\n\tconst renderView = () => {\n\t\tconst handleDateSelect = (date: Date) => {\n\t\t\tconst selectedPeriod = getCalendarPeriod(date, selectionOptions);\n\t\t\tif (!selectedPeriod || !isCalendarPeriodWithinDateBounds(selectedPeriod, { minDate: props.minDate, maxDate: props.maxDate }))\n\t\t\t\treturn;\n\n\t\t\tif (props.selectsRange) {\n\t\t\t\tlet selectedStartDate: Date | null = null;\n\t\t\t\tlet selectedEndDate: Date | null = null;\n\n\t\t\t\tif (Array.isArray(props.value)) {\n\t\t\t\t\t[selectedStartDate, selectedEndDate] = props.value;\n\t\t\t\t}\n\n\t\t\t\tif (!selectedStartDate || selectedEndDate) {\n\t\t\t\t\tprops.onChange([selectedPeriod.start, null]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst startPeriod = getCalendarPeriod(selectedStartDate, selectionOptions);\n\t\t\t\tif (!startPeriod) return;\n\n\t\t\t\tif (selectedPeriod.start < startPeriod.start) {\n\t\t\t\t\tprops.onChange([selectedPeriod.start, startPeriod.end]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tprops.onChange([startPeriod.start, selectedPeriod.end]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprops.onChange(selectedPeriod.start);\n\t\t};\n\n\t\tconst handleMonthSelect = (date: Date) => {\n\t\t\tsetCurrentDate(date);\n\n\t\t\tif (selectionMode === \"month\" || !isDatePickerLevelAvailable(\"day\", datePickerLevel)) {\n\t\t\t\thandleDateSelect(date);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonViewChange(\"day\");\n\t\t};\n\n\t\tconst handleYearSelect = (date: Date) => {\n\t\t\tsetCurrentDate(date);\n\n\t\t\tif (selectionMode === \"year\" || !isDatePickerLevelAvailable(\"month\", datePickerLevel)) {\n\t\t\t\thandleDateSelect(date);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonViewChange(\"month\");\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase \"day\":\n\t\t\t\treturn (\n\t\t\t\t\t<CalendarDayView\n\t\t\t\t\t\tnow={dateNow}\n\t\t\t\t\t\tcurrentDate={currentDate}\n\t\t\t\t\t\tvalue={props.value}\n\t\t\t\t\t\tonChange={handleDateSelect}\n\t\t\t\t\t\tminDate={props.minDate}\n\t\t\t\t\t\tmaxDate={props.maxDate}\n\t\t\t\t\t\tselectsRange={props.selectsRange}\n\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"month\":\n\t\t\t\treturn (\n\t\t\t\t\t<CalendarMonthView\n\t\t\t\t\t\tcurrentDate={currentDate}\n\t\t\t\t\t\tvalue={props.value}\n\t\t\t\t\t\tonChange={handleMonthSelect}\n\t\t\t\t\t\tminDate={props.minDate}\n\t\t\t\t\t\tmaxDate={props.maxDate}\n\t\t\t\t\t\tselectsRange={props.selectsRange}\n\t\t\t\t\t\tselectsPeriod={selectionMode === \"month\" || !isDatePickerLevelAvailable(\"day\", datePickerLevel)}\n\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"year\":\n\t\t\t\treturn (\n\t\t\t\t\t<CalendarYearView\n\t\t\t\t\t\tcurrentDate={currentDate}\n\t\t\t\t\t\tvalue={props.value}\n\t\t\t\t\t\tonChange={handleYearSelect}\n\t\t\t\t\t\tminDate={props.minDate}\n\t\t\t\t\t\tmaxDate={props.maxDate}\n\t\t\t\t\t\tselectsRange={props.selectsRange}\n\t\t\t\t\t\tselectsPeriod={selectionMode === \"year\" || !isDatePickerLevelAvailable(\"month\", datePickerLevel)}\n\t\t\t\t\t\tselectionMode={selectionMode}\n\t\t\t\t\t\tweekEndDay={weekEndDay}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={styles.calendarView}>\n\t\t\t{renderHeader()}\n\t\t\t{renderView()}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageViewerRuntime-HGBWp9NM.js","names":[],"sources":["../../src/image/lib/buildImageViewerSlides.ts","../../src/image/lib/resolveImageViewerLabels.ts","../../src/image/ui/ImageViewer.module.scss","../../src/image/ui/ImageViewerRuntime.tsx"],"sourcesContent":["import { type Slide } from \"yet-another-react-lightbox\";\n\nimport { type ImageCandidate } from \"../model/imageTypes\";\nimport { type ImageViewerImage } from \"../model/imageViewerTypes\";\n\n/** Проверяет размер до передачи в srcset внешней lightbox-библиотеки. */\nfunction isPositiveFinite(value: number): boolean {\n\treturn Number.isFinite(value) && value > 0;\n}\n\n/**\n * Преобразует width- и density-кандидат в физическую ширину.\n * Density имеет смысл только вместе с известной intrinsic-шириной базового изображения.\n */\nfunction resolveCandidateWidth(candidate: ImageCandidate, intrinsicWidth: number): number | null {\n\tconst width =\n\t\tcandidate.width !== undefined ? candidate.width : candidate.density !== undefined ? intrinsicWidth * candidate.density : 0;\n\n\treturn isPositiveFinite(width) ? Math.round(width) : null;\n}\n\n/**\n * Строит srcSet YARL, которому для каждого варианта нужны одновременно width и height.\n * Альтернативные picture sources намеренно остаются контрактом ImageView: YARL 3.x не поддерживает их\n * в стандартном image slide, а custom slide лишает viewer встроенного responsive preload и Zoom.\n */\nfunction buildLightboxSrcSet(image: ImageViewerImage): Slide[\"srcSet\"] {\n\tconst { intrinsicWidth, intrinsicHeight } = image;\n\n\tif (\n\t\tintrinsicWidth === undefined ||\n\t\tintrinsicHeight === undefined ||\n\t\t!isPositiveFinite(intrinsicWidth) ||\n\t\t!isPositiveFinite(intrinsicHeight)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst candidatesByWidth = new Map<number, { src: string; width: number; height: number }>();\n\n\tfor (const candidate of image.candidates ?? []) {\n\t\tconst candidateWidth = resolveCandidateWidth(candidate, intrinsicWidth);\n\n\t\tif (candidateWidth === null || candidatesByWidth.has(candidateWidth)) continue;\n\n\t\tcandidatesByWidth.set(candidateWidth, {\n\t\t\tsrc: candidate.src,\n\t\t\twidth: candidateWidth,\n\t\t\theight: Math.max(1, Math.round((candidateWidth * intrinsicHeight) / intrinsicWidth))\n\t\t});\n\t}\n\n\tconst candidates = [...candidatesByWidth.values()].sort((left, right) => left.width - right.width);\n\treturn candidates.length > 0 ? candidates : undefined;\n}\n\n/**\n * Адаптирует storage-agnostic ResponsiveImageData к image slides Yet Another React Lightbox.\n * Функция остаётся приватной для `/image`, чтобы vendor contract не становился public API пакета.\n */\nexport function buildImageViewerSlides(images: readonly ImageViewerImage[]): Slide[] {\n\treturn images.map((image) => {\n\t\tconst hasIntrinsicSize = isPositiveFinite(image.intrinsicWidth ?? 0) && isPositiveFinite(image.intrinsicHeight ?? 0);\n\n\t\treturn {\n\t\t\tsrc: image.src,\n\t\t\talt: image.alt,\n\t\t\twidth: hasIntrinsicSize ? image.intrinsicWidth : undefined,\n\t\t\theight: hasIntrinsicSize ? image.intrinsicHeight : undefined,\n\t\t\tsrcSet: buildLightboxSrcSet(image),\n\t\t\ttitle: image.title === undefined ? image.alt : image.title,\n\t\t\tdescription: image.description,\n\t\t\tthumbnail: image.thumbnail,\n\t\t\tdownload: image.download\n\t\t};\n\t});\n}\n","import { type ImageViewerLabels } from \"../model/imageViewerTypes\";\n\nconst DEFAULT_IMAGE_VIEWER_LABELS: ImageViewerLabels = {\n\tprevious: \"Предыдущее изображение\",\n\tnext: \"Следующее изображение\",\n\tclose: \"Закрыть просмотр\",\n\tslide: \"Изображение\",\n\tcarousel: \"Карусель изображений\",\n\tlightbox: \"Просмотр изображений\",\n\tphotoGallery: \"Галерея изображений\",\n\tslideCounter: \"{index} из {total}\",\n\tzoomIn: \"Увеличить\",\n\tzoomOut: \"Уменьшить\",\n\tenterFullscreen: \"Перейти в полноэкранный режим\",\n\texitFullscreen: \"Выйти из полноэкранного режима\",\n\tthumbnails: \"Миниатюры\",\n\tshowThumbnails: \"Показать миниатюры\",\n\thideThumbnails: \"Скрыть миниатюры\",\n\tcaption: \"Подпись изображения\",\n\tshowCaptions: \"Показать подписи\",\n\thideCaptions: \"Скрыть подписи\",\n\tdownload: \"Скачать изображение\"\n};\n\n/** Преобразует стабильные semantic labels foundation в ключи локализации YARL. */\nexport function resolveImageViewerLabels(overrides: Partial<ImageViewerLabels> | undefined) {\n\tconst labels = { ...DEFAULT_IMAGE_VIEWER_LABELS, ...overrides };\n\n\treturn {\n\t\tPrevious: labels.previous,\n\t\tNext: labels.next,\n\t\tClose: labels.close,\n\t\tSlide: labels.slide,\n\t\tCarousel: labels.carousel,\n\t\tLightbox: labels.lightbox,\n\t\t\"Photo gallery\": labels.photoGallery,\n\t\t\"{index} of {total}\": labels.slideCounter,\n\t\t\"Zoom in\": labels.zoomIn,\n\t\t\"Zoom out\": labels.zoomOut,\n\t\t\"Enter Fullscreen\": labels.enterFullscreen,\n\t\t\"Exit Fullscreen\": labels.exitFullscreen,\n\t\tThumbnails: labels.thumbnails,\n\t\t\"Show thumbnails\": labels.showThumbnails,\n\t\t\"Hide thumbnails\": labels.hideThumbnails,\n\t\tCaption: labels.caption,\n\t\t\"Show captions\": labels.showCaptions,\n\t\t\"Hide captions\": labels.hideCaptions,\n\t\tDownload: labels.download\n\t};\n}\n",".viewer {\n\t// Переменные YARL остаются внутренней деталью; потребители настраивают только стабильное пространство image-viewer.\n\t--_image-viewer-top-row-height: calc(\n\t\tvar(--image-viewer-icon-size, 1.75rem) + var(--image-viewer-toolbar-padding, var(--space-md, 0.625rem)) +\n\t\t\tvar(--image-viewer-toolbar-padding, var(--space-md, 0.625rem)) + 1rem\n\t);\n\t--yarl__portal_zindex: var(--image-viewer-z-index, var(--z-image-viewer, 300));\n\t--yarl__color_backdrop: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__container_background_color: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__color_button: var(--image-viewer-control-color, rgb(255 255 255 / 82%));\n\t--yarl__color_button_active: var(--image-viewer-control-active-color, var(--white, #fff));\n\t--yarl__color_button_disabled: var(--image-viewer-control-disabled-color, rgb(255 255 255 / 38%));\n\t--yarl__button_background_color: var(--image-viewer-control-background, transparent);\n\t--yarl__button_border: var(--image-viewer-control-border, 0);\n\t--yarl__button_filter: var(--image-viewer-control-filter, drop-shadow(0 0.125rem 0.25rem rgb(0 0 0 / 70%)));\n\t--yarl__icon_size: var(--image-viewer-icon-size, 1.75rem);\n\t--yarl__toolbar_padding: var(--image-viewer-toolbar-padding, var(--space-md, 0.625rem));\n\t--yarl__slide_icon_loading_color: var(--image-viewer-loading-color, var(--image-viewer-control-color, rgb(255 255 255 / 82%)));\n\t--yarl__slide_icon_error_color: var(--image-viewer-error-color, var(--status-error-fill, #d32f2f));\n\t--yarl__slide_captions_container_background: var(--image-viewer-caption-background, rgb(0 0 0 / 62%));\n\t--yarl__slide_title_color: var(--image-viewer-caption-color, var(--white, #fff));\n\t--yarl__slide_description_color: var(--image-viewer-caption-color, var(--white, #fff));\n\t--yarl__counter_color: var(--image-viewer-counter-color, var(--image-viewer-control-color, rgb(255 255 255 / 82%)));\n\t--yarl__thumbnails_container_background_color: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__thumbnails_thumbnail_background: var(--image-viewer-thumbnail-background, rgb(255 255 255 / 8%));\n\t--yarl__thumbnails_thumbnail_border_color: var(\n\t\t--image-viewer-thumbnail-border-color,\n\t\tvar(--image-viewer-control-color, rgb(255 255 255 / 82%))\n\t);\n\t--yarl__thumbnails_thumbnail_active_border_color: var(\n\t\t--image-viewer-thumbnail-active-border-color,\n\t\tvar(--image-viewer-control-active-color, var(--white, #fff))\n\t);\n\n\tfont-family: var(--font-family-base, sans-serif);\n}\n\n.viewer :global(.yarl__button) {\n\tborder-radius: var(--image-viewer-control-radius, var(--radius-sm, 0.3125rem));\n\ttransition:\n\t\tcolor var(--transition-fast, 0.2s) ease,\n\t\tbackground-color var(--transition-fast, 0.2s) ease;\n}\n\n.viewer :global(.yarl__button):focus-visible,\n.viewer :global(.yarl__thumbnails_thumbnail):focus-visible {\n\toutline: var(--image-viewer-focus, var(--focus, 0.125rem solid currentColor));\n\toutline-offset: var(--image-viewer-focus-offset, var(--focus-offset, 0.125rem));\n}\n\n.viewer :global(.yarl__thumbnails_thumbnail):focus-visible {\n\tbox-shadow: none;\n}\n\n.viewer :global(.yarl__slide_image) {\n\tborder-radius: var(--image-viewer-image-radius, var(--radius-sm, 0.3125rem));\n}\n\n.viewer :global(.yarl__slide_title_container) {\n\tbox-sizing: border-box;\n\theight: var(--_image-viewer-top-row-height);\n\toverflow: hidden;\n}\n\n.icon {\n\twidth: var(--image-viewer-icon-size, 1.75rem);\n\theight: var(--image-viewer-icon-size, 1.75rem);\n\tstroke-width: var(--image-viewer-icon-stroke-width, 2);\n}\n\n.loadingIcon {\n\tanimation: imageViewerSpin 1s linear infinite;\n}\n\n@keyframes imageViewerSpin {\n\tto {\n\t\ttransform: rotate(1turn);\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.loadingIcon {\n\t\tanimation: none;\n\t}\n}\n","import { useEffect, useMemo } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport {\n\tCaptionsIcon,\n\tCaptionsOffIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tDownloadIcon,\n\tGalleryThumbnailsIcon,\n\tImageOffIcon,\n\tLoaderCircleIcon,\n\tMaximize2Icon,\n\tMinimize2Icon,\n\tXIcon,\n\tZoomInIcon,\n\tZoomOutIcon\n} from \"lucide-react\";\nimport Lightbox, { isImageSlide, type LightboxExternalProps, type Plugin } from \"yet-another-react-lightbox\";\nimport Captions from \"yet-another-react-lightbox/plugins/captions\";\nimport Counter from \"yet-another-react-lightbox/plugins/counter\";\nimport Download from \"yet-another-react-lightbox/plugins/download\";\nimport Fullscreen from \"yet-another-react-lightbox/plugins/fullscreen\";\nimport Thumbnails from \"yet-another-react-lightbox/plugins/thumbnails\";\nimport Zoom from \"yet-another-react-lightbox/plugins/zoom\";\n\nimport { buildImageViewerSlides } from \"../lib/buildImageViewerSlides\";\nimport { resolveImageViewerLabels } from \"../lib/resolveImageViewerLabels\";\nimport { type ImageViewerProps } from \"../model/imageViewerTypes\";\n\nimport styles from \"./ImageViewer.module.scss\";\n\ntype ImageViewerRuntimeProps = ImageViewerProps & {\n\treadonly onRuntimeMounted: () => void;\n};\n\n/** Внутренняя высота резервируемой верхней строки не является публичной CSS-переменной viewer. */\nconst IMAGE_VIEWER_TOP_ROW_HEIGHT = \"var(--_image-viewer-top-row-height)\";\n\n/**\n * Тяжёлый runtime ImageViewer, изолированный в отдельном динамическом chunk.\n * Компонент приватен для `/image`: YARL-типы и plugin-контракты не должны становиться API foundation.\n */\nexport default function ImageViewerRuntime({\n\topen,\n\timages,\n\tindex = 0,\n\tonClose,\n\tonIndexChange,\n\tfeatures,\n\tloop = false,\n\tcloseOnBackdropClick = true,\n\tcloseOnPullDown = true,\n\tlabels,\n\tclassName,\n\tstyle,\n\tonRuntimeMounted\n}: ImageViewerRuntimeProps) {\n\tuseEffect(() => {\n\t\t// Оболочка сохраняет runtime после первого commit, чтобы не прерывать внутренний close lifecycle YARL.\n\t\tonRuntimeMounted();\n\t}, [onRuntimeMounted]);\n\n\t// Стабильная ссылка предотвращает внешний reset текущего slide при несвязанном rerender родителя.\n\tconst slides = useMemo(() => buildImageViewerSlides(images), [images]);\n\tconst requestedIndex = Number.isFinite(index) ? Math.trunc(index) : 0;\n\tconst resolvedIndex = slides.length > 0 ? Math.min(Math.max(requestedIndex, 0), slides.length - 1) : 0;\n\tconst hasCaptions = images.some((image) => {\n\t\tconst title = image.title === undefined ? image.alt : image.title;\n\t\treturn (title !== undefined && title !== null) || (image.description !== undefined && image.description !== null);\n\t});\n\tconst captionsEnabled = features?.captions ?? hasCaptions;\n\tconst counterEnabled = features?.counter ?? slides.length > 1;\n\tconst downloadEnabled = features?.download ?? false;\n\tconst fullscreenEnabled = features?.fullscreen ?? true;\n\tconst thumbnailsEnabled = features?.thumbnails ?? slides.length > 1;\n\tconst zoomEnabled = features?.zoom ?? true;\n\tconst plugins = useMemo<Plugin[]>(\n\t\t() => [\n\t\t\t...(captionsEnabled ? [Captions] : []),\n\t\t\t...(counterEnabled ? [Counter] : []),\n\t\t\t...(downloadEnabled ? [Download] : []),\n\t\t\t...(fullscreenEnabled ? [Fullscreen] : []),\n\t\t\t...(thumbnailsEnabled ? [Thumbnails] : []),\n\t\t\t...(zoomEnabled ? [Zoom] : [])\n\t\t],\n\t\t[captionsEnabled, counterEnabled, downloadEnabled, fullscreenEnabled, thumbnailsEnabled, zoomEnabled]\n\t);\n\tconst resolvedLabels = useMemo(() => resolveImageViewerLabels(labels), [labels]);\n\tconst lightboxProps: LightboxExternalProps = {\n\t\topen: open && slides.length > 0,\n\t\tclose: onClose,\n\t\tindex: resolvedIndex,\n\t\tslides,\n\t\tplugins,\n\t\tclassName: cn(styles.viewer, className),\n\t\tportal: { container: { style } },\n\t\tlabels: resolvedLabels,\n\t\tcarousel: { finite: !loop },\n\t\tcontroller: { closeOnBackdropClick, closeOnPullDown },\n\t\tcaptions: { showToggle: true },\n\t\tcounter: {\n\t\t\tseparator: \" / \",\n\t\t\tcontainer: {\n\t\t\t\t// При captions счётчик занимает отдельную строку и не пересекается с title в левом верхнем углу.\n\t\t\t\tstyle: captionsEnabled ? { top: IMAGE_VIEWER_TOP_ROW_HEIGHT } : undefined\n\t\t\t}\n\t\t},\n\t\tthumbnails: { showToggle: true },\n\t\tdownload: {\n\t\t\tdownload: ({ slide, saveAs }) => {\n\t\t\t\tif (!isImageSlide(slide) || slide.download === false) return;\n\n\t\t\t\tif (typeof slide.download === \"string\") {\n\t\t\t\t\tsaveAs(slide.download);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (typeof slide.download === \"object\") {\n\t\t\t\t\tsaveAs(slide.download.url, slide.download.filename);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsaveAs(slide.src);\n\t\t\t}\n\t\t},\n\t\ton: {\n\t\t\tview: ({ index: nextIndex }) => {\n\t\t\t\tif (nextIndex !== resolvedIndex) onIndexChange?.(nextIndex);\n\t\t\t}\n\t\t},\n\t\trender: {\n\t\t\ticonPrev: () => <ChevronLeftIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonNext: () => <ChevronRightIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonClose: () => <XIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonLoading: () => <LoaderCircleIcon aria-hidden=\"true\" className={cn(styles.icon, styles.loadingIcon)} />,\n\t\t\ticonError: () => <ImageOffIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonZoomIn: () => <ZoomInIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonZoomOut: () => <ZoomOutIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonEnterFullscreen: () => <Maximize2Icon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonExitFullscreen: () => <Minimize2Icon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonThumbnailsVisible: () => <GalleryThumbnailsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonThumbnailsHidden: () => <GalleryThumbnailsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonCaptionsVisible: () => <CaptionsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonCaptionsHidden: () => <CaptionsOffIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonDownload: () => <DownloadIcon aria-hidden=\"true\" className={styles.icon} />\n\t\t}\n\t};\n\n\treturn <Lightbox {...lightboxProps} />;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ImageViewerRuntime-HGBWp9NM.js","names":[],"sources":["../../src/image/lib/buildImageViewerSlides.ts","../../src/image/lib/resolveImageViewerLabels.ts","../../src/image/ui/ImageViewer.module.scss","../../src/image/ui/ImageViewerRuntime.tsx"],"sourcesContent":["import { type Slide } from \"yet-another-react-lightbox\";\n\nimport { type ImageCandidate } from \"../model/imageTypes\";\nimport { type ImageViewerImage } from \"../model/imageViewerTypes\";\n\n/** Проверяет размер до передачи в srcset внешней lightbox-библиотеки. */\nfunction isPositiveFinite(value: number): boolean {\n\treturn Number.isFinite(value) && value > 0;\n}\n\n/**\n * Преобразует width- и density-кандидат в физическую ширину.\n * Density имеет смысл только вместе с известной intrinsic-шириной базового изображения.\n */\nfunction resolveCandidateWidth(candidate: ImageCandidate, intrinsicWidth: number): number | null {\n\tconst width =\n\t\tcandidate.width !== undefined ? candidate.width : candidate.density !== undefined ? intrinsicWidth * candidate.density : 0;\n\n\treturn isPositiveFinite(width) ? Math.round(width) : null;\n}\n\n/**\n * Строит srcSet YARL, которому для каждого варианта нужны одновременно width и height.\n * Альтернативные picture sources намеренно остаются контрактом ImageView: YARL 3.x не поддерживает их\n * в стандартном image slide, а custom slide лишает viewer встроенного responsive preload и Zoom.\n */\nfunction buildLightboxSrcSet(image: ImageViewerImage): Slide[\"srcSet\"] {\n\tconst { intrinsicWidth, intrinsicHeight } = image;\n\n\tif (\n\t\tintrinsicWidth === undefined ||\n\t\tintrinsicHeight === undefined ||\n\t\t!isPositiveFinite(intrinsicWidth) ||\n\t\t!isPositiveFinite(intrinsicHeight)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst candidatesByWidth = new Map<number, { src: string; width: number; height: number }>();\n\n\tfor (const candidate of image.candidates ?? []) {\n\t\tconst candidateWidth = resolveCandidateWidth(candidate, intrinsicWidth);\n\n\t\tif (candidateWidth === null || candidatesByWidth.has(candidateWidth)) continue;\n\n\t\tcandidatesByWidth.set(candidateWidth, {\n\t\t\tsrc: candidate.src,\n\t\t\twidth: candidateWidth,\n\t\t\theight: Math.max(1, Math.round((candidateWidth * intrinsicHeight) / intrinsicWidth))\n\t\t});\n\t}\n\n\tconst candidates = [...candidatesByWidth.values()].sort((left, right) => left.width - right.width);\n\treturn candidates.length > 0 ? candidates : undefined;\n}\n\n/**\n * Адаптирует storage-agnostic ResponsiveImageData к image slides Yet Another React Lightbox.\n * Функция остаётся приватной для `/image`, чтобы vendor contract не становился public API пакета.\n */\nexport function buildImageViewerSlides(images: readonly ImageViewerImage[]): Slide[] {\n\treturn images.map((image) => {\n\t\tconst hasIntrinsicSize = isPositiveFinite(image.intrinsicWidth ?? 0) && isPositiveFinite(image.intrinsicHeight ?? 0);\n\n\t\treturn {\n\t\t\tsrc: image.src,\n\t\t\talt: image.alt,\n\t\t\twidth: hasIntrinsicSize ? image.intrinsicWidth : undefined,\n\t\t\theight: hasIntrinsicSize ? image.intrinsicHeight : undefined,\n\t\t\tsrcSet: buildLightboxSrcSet(image),\n\t\t\ttitle: image.title === undefined ? image.alt : image.title,\n\t\t\tdescription: image.description,\n\t\t\tthumbnail: image.thumbnail,\n\t\t\tdownload: image.download\n\t\t};\n\t});\n}\n","import { type ImageViewerLabels } from \"../model/imageViewerTypes\";\n\nconst DEFAULT_IMAGE_VIEWER_LABELS: ImageViewerLabels = {\n\tprevious: \"Предыдущее изображение\",\n\tnext: \"Следующее изображение\",\n\tclose: \"Закрыть просмотр\",\n\tslide: \"Изображение\",\n\tcarousel: \"Карусель изображений\",\n\tlightbox: \"Просмотр изображений\",\n\tphotoGallery: \"Галерея изображений\",\n\tslideCounter: \"{index} из {total}\",\n\tzoomIn: \"Увеличить\",\n\tzoomOut: \"Уменьшить\",\n\tenterFullscreen: \"Перейти в полноэкранный режим\",\n\texitFullscreen: \"Выйти из полноэкранного режима\",\n\tthumbnails: \"Миниатюры\",\n\tshowThumbnails: \"Показать миниатюры\",\n\thideThumbnails: \"Скрыть миниатюры\",\n\tcaption: \"Подпись изображения\",\n\tshowCaptions: \"Показать подписи\",\n\thideCaptions: \"Скрыть подписи\",\n\tdownload: \"Скачать изображение\"\n};\n\n/** Преобразует стабильные semantic labels foundation в ключи локализации YARL. */\nexport function resolveImageViewerLabels(overrides: Partial<ImageViewerLabels> | undefined) {\n\tconst labels = { ...DEFAULT_IMAGE_VIEWER_LABELS, ...overrides };\n\n\treturn {\n\t\tPrevious: labels.previous,\n\t\tNext: labels.next,\n\t\tClose: labels.close,\n\t\tSlide: labels.slide,\n\t\tCarousel: labels.carousel,\n\t\tLightbox: labels.lightbox,\n\t\t\"Photo gallery\": labels.photoGallery,\n\t\t\"{index} of {total}\": labels.slideCounter,\n\t\t\"Zoom in\": labels.zoomIn,\n\t\t\"Zoom out\": labels.zoomOut,\n\t\t\"Enter Fullscreen\": labels.enterFullscreen,\n\t\t\"Exit Fullscreen\": labels.exitFullscreen,\n\t\tThumbnails: labels.thumbnails,\n\t\t\"Show thumbnails\": labels.showThumbnails,\n\t\t\"Hide thumbnails\": labels.hideThumbnails,\n\t\tCaption: labels.caption,\n\t\t\"Show captions\": labels.showCaptions,\n\t\t\"Hide captions\": labels.hideCaptions,\n\t\tDownload: labels.download\n\t};\n}\n",".viewer {\n\t// Переменные YARL остаются внутренней деталью; потребители настраивают только стабильное пространство image-viewer.\n\t--_image-viewer-top-row-height: calc(\n\t\tvar(--image-viewer-icon-size, 1.75rem) + var(--image-viewer-toolbar-padding, var(--space-md, 0.625rem)) +\n\t\t\tvar(--image-viewer-toolbar-padding, var(--space-md, 0.625rem)) + 1rem\n\t);\n\t--yarl__portal_zindex: var(--image-viewer-z-index, var(--z-image-viewer, 300));\n\t--yarl__color_backdrop: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__container_background_color: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__color_button: var(--image-viewer-control-color, rgb(255 255 255 / 82%));\n\t--yarl__color_button_active: var(--image-viewer-control-active-color, var(--white, #fff));\n\t--yarl__color_button_disabled: var(--image-viewer-control-disabled-color, rgb(255 255 255 / 38%));\n\t--yarl__button_background_color: var(--image-viewer-control-background, transparent);\n\t--yarl__button_border: var(--image-viewer-control-border, 0);\n\t--yarl__button_filter: var(--image-viewer-control-filter, drop-shadow(0 0.125rem 0.25rem rgb(0 0 0 / 70%)));\n\t--yarl__icon_size: var(--image-viewer-icon-size, 1.75rem);\n\t--yarl__toolbar_padding: var(--image-viewer-toolbar-padding, var(--space-md, 0.625rem));\n\t--yarl__slide_icon_loading_color: var(--image-viewer-loading-color, var(--image-viewer-control-color, rgb(255 255 255 / 82%)));\n\t--yarl__slide_icon_error_color: var(--image-viewer-error-color, var(--error-fill, #d32f2f));\n\t--yarl__slide_captions_container_background: var(--image-viewer-caption-background, rgb(0 0 0 / 62%));\n\t--yarl__slide_title_color: var(--image-viewer-caption-color, var(--white, #fff));\n\t--yarl__slide_description_color: var(--image-viewer-caption-color, var(--white, #fff));\n\t--yarl__counter_color: var(--image-viewer-counter-color, var(--image-viewer-control-color, rgb(255 255 255 / 82%)));\n\t--yarl__thumbnails_container_background_color: var(--image-viewer-backdrop, rgb(0 0 0 / 92%));\n\t--yarl__thumbnails_thumbnail_background: var(--image-viewer-thumbnail-background, rgb(255 255 255 / 8%));\n\t--yarl__thumbnails_thumbnail_border_color: var(\n\t\t--image-viewer-thumbnail-border-color,\n\t\tvar(--image-viewer-control-color, rgb(255 255 255 / 82%))\n\t);\n\t--yarl__thumbnails_thumbnail_active_border_color: var(\n\t\t--image-viewer-thumbnail-active-border-color,\n\t\tvar(--image-viewer-control-active-color, var(--white, #fff))\n\t);\n\n\tfont-family: var(--font-family-base, sans-serif);\n}\n\n.viewer :global(.yarl__button) {\n\tborder-radius: var(--image-viewer-control-radius, var(--radius-sm, 0.3125rem));\n\ttransition:\n\t\tcolor var(--transition-fast, 0.2s) ease,\n\t\tbackground-color var(--transition-fast, 0.2s) ease;\n}\n\n.viewer :global(.yarl__button):focus-visible,\n.viewer :global(.yarl__thumbnails_thumbnail):focus-visible {\n\toutline: var(--image-viewer-focus, var(--focus, 0.125rem solid currentColor));\n\toutline-offset: var(--image-viewer-focus-offset, var(--focus-offset, 0.125rem));\n}\n\n.viewer :global(.yarl__thumbnails_thumbnail):focus-visible {\n\tbox-shadow: none;\n}\n\n.viewer :global(.yarl__slide_image) {\n\tborder-radius: var(--image-viewer-image-radius, var(--radius-sm, 0.3125rem));\n}\n\n.viewer :global(.yarl__slide_title_container) {\n\tbox-sizing: border-box;\n\theight: var(--_image-viewer-top-row-height);\n\toverflow: hidden;\n}\n\n.icon {\n\twidth: var(--image-viewer-icon-size, 1.75rem);\n\theight: var(--image-viewer-icon-size, 1.75rem);\n\tstroke-width: var(--image-viewer-icon-stroke-width, 2);\n}\n\n.loadingIcon {\n\tanimation: imageViewerSpin 1s linear infinite;\n}\n\n@keyframes imageViewerSpin {\n\tto {\n\t\ttransform: rotate(1turn);\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.loadingIcon {\n\t\tanimation: none;\n\t}\n}\n","import { useEffect, useMemo } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport {\n\tCaptionsIcon,\n\tCaptionsOffIcon,\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tDownloadIcon,\n\tGalleryThumbnailsIcon,\n\tImageOffIcon,\n\tLoaderCircleIcon,\n\tMaximize2Icon,\n\tMinimize2Icon,\n\tXIcon,\n\tZoomInIcon,\n\tZoomOutIcon\n} from \"lucide-react\";\nimport Lightbox, { isImageSlide, type LightboxExternalProps, type Plugin } from \"yet-another-react-lightbox\";\nimport Captions from \"yet-another-react-lightbox/plugins/captions\";\nimport Counter from \"yet-another-react-lightbox/plugins/counter\";\nimport Download from \"yet-another-react-lightbox/plugins/download\";\nimport Fullscreen from \"yet-another-react-lightbox/plugins/fullscreen\";\nimport Thumbnails from \"yet-another-react-lightbox/plugins/thumbnails\";\nimport Zoom from \"yet-another-react-lightbox/plugins/zoom\";\n\nimport { buildImageViewerSlides } from \"../lib/buildImageViewerSlides\";\nimport { resolveImageViewerLabels } from \"../lib/resolveImageViewerLabels\";\nimport { type ImageViewerProps } from \"../model/imageViewerTypes\";\n\nimport styles from \"./ImageViewer.module.scss\";\n\ntype ImageViewerRuntimeProps = ImageViewerProps & {\n\treadonly onRuntimeMounted: () => void;\n};\n\n/** Внутренняя высота резервируемой верхней строки не является публичной CSS-переменной viewer. */\nconst IMAGE_VIEWER_TOP_ROW_HEIGHT = \"var(--_image-viewer-top-row-height)\";\n\n/**\n * Тяжёлый runtime ImageViewer, изолированный в отдельном динамическом chunk.\n * Компонент приватен для `/image`: YARL-типы и plugin-контракты не должны становиться API foundation.\n */\nexport default function ImageViewerRuntime({\n\topen,\n\timages,\n\tindex = 0,\n\tonClose,\n\tonIndexChange,\n\tfeatures,\n\tloop = false,\n\tcloseOnBackdropClick = true,\n\tcloseOnPullDown = true,\n\tlabels,\n\tclassName,\n\tstyle,\n\tonRuntimeMounted\n}: ImageViewerRuntimeProps) {\n\tuseEffect(() => {\n\t\t// Оболочка сохраняет runtime после первого commit, чтобы не прерывать внутренний close lifecycle YARL.\n\t\tonRuntimeMounted();\n\t}, [onRuntimeMounted]);\n\n\t// Стабильная ссылка предотвращает внешний reset текущего slide при несвязанном rerender родителя.\n\tconst slides = useMemo(() => buildImageViewerSlides(images), [images]);\n\tconst requestedIndex = Number.isFinite(index) ? Math.trunc(index) : 0;\n\tconst resolvedIndex = slides.length > 0 ? Math.min(Math.max(requestedIndex, 0), slides.length - 1) : 0;\n\tconst hasCaptions = images.some((image) => {\n\t\tconst title = image.title === undefined ? image.alt : image.title;\n\t\treturn (title !== undefined && title !== null) || (image.description !== undefined && image.description !== null);\n\t});\n\tconst captionsEnabled = features?.captions ?? hasCaptions;\n\tconst counterEnabled = features?.counter ?? slides.length > 1;\n\tconst downloadEnabled = features?.download ?? false;\n\tconst fullscreenEnabled = features?.fullscreen ?? true;\n\tconst thumbnailsEnabled = features?.thumbnails ?? slides.length > 1;\n\tconst zoomEnabled = features?.zoom ?? true;\n\tconst plugins = useMemo<Plugin[]>(\n\t\t() => [\n\t\t\t...(captionsEnabled ? [Captions] : []),\n\t\t\t...(counterEnabled ? [Counter] : []),\n\t\t\t...(downloadEnabled ? [Download] : []),\n\t\t\t...(fullscreenEnabled ? [Fullscreen] : []),\n\t\t\t...(thumbnailsEnabled ? [Thumbnails] : []),\n\t\t\t...(zoomEnabled ? [Zoom] : [])\n\t\t],\n\t\t[captionsEnabled, counterEnabled, downloadEnabled, fullscreenEnabled, thumbnailsEnabled, zoomEnabled]\n\t);\n\tconst resolvedLabels = useMemo(() => resolveImageViewerLabels(labels), [labels]);\n\tconst lightboxProps: LightboxExternalProps = {\n\t\topen: open && slides.length > 0,\n\t\tclose: onClose,\n\t\tindex: resolvedIndex,\n\t\tslides,\n\t\tplugins,\n\t\tclassName: cn(styles.viewer, className),\n\t\tportal: { container: { style } },\n\t\tlabels: resolvedLabels,\n\t\tcarousel: { finite: !loop },\n\t\tcontroller: { closeOnBackdropClick, closeOnPullDown },\n\t\tcaptions: { showToggle: true },\n\t\tcounter: {\n\t\t\tseparator: \" / \",\n\t\t\tcontainer: {\n\t\t\t\t// При captions счётчик занимает отдельную строку и не пересекается с title в левом верхнем углу.\n\t\t\t\tstyle: captionsEnabled ? { top: IMAGE_VIEWER_TOP_ROW_HEIGHT } : undefined\n\t\t\t}\n\t\t},\n\t\tthumbnails: { showToggle: true },\n\t\tdownload: {\n\t\t\tdownload: ({ slide, saveAs }) => {\n\t\t\t\tif (!isImageSlide(slide) || slide.download === false) return;\n\n\t\t\t\tif (typeof slide.download === \"string\") {\n\t\t\t\t\tsaveAs(slide.download);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (typeof slide.download === \"object\") {\n\t\t\t\t\tsaveAs(slide.download.url, slide.download.filename);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsaveAs(slide.src);\n\t\t\t}\n\t\t},\n\t\ton: {\n\t\t\tview: ({ index: nextIndex }) => {\n\t\t\t\tif (nextIndex !== resolvedIndex) onIndexChange?.(nextIndex);\n\t\t\t}\n\t\t},\n\t\trender: {\n\t\t\ticonPrev: () => <ChevronLeftIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonNext: () => <ChevronRightIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonClose: () => <XIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonLoading: () => <LoaderCircleIcon aria-hidden=\"true\" className={cn(styles.icon, styles.loadingIcon)} />,\n\t\t\ticonError: () => <ImageOffIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonZoomIn: () => <ZoomInIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonZoomOut: () => <ZoomOutIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonEnterFullscreen: () => <Maximize2Icon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonExitFullscreen: () => <Minimize2Icon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonThumbnailsVisible: () => <GalleryThumbnailsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonThumbnailsHidden: () => <GalleryThumbnailsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonCaptionsVisible: () => <CaptionsIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonCaptionsHidden: () => <CaptionsOffIcon aria-hidden=\"true\" className={styles.icon} />,\n\t\t\ticonDownload: () => <DownloadIcon aria-hidden=\"true\" className={styles.icon} />\n\t\t}\n\t};\n\n\treturn <Lightbox {...lightboxProps} />;\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { n as e } from "./button-BaUlN-nt.js";
1
+ import { n as e } from "./button-DF21yxVp.js";
2
2
  import { r as t } from "./grid-dI94AAbi.js";
3
- import { i as n, n as r, r as i } from "./modal-CbAwLHlM.js";
4
- import { n as a } from "./input-D1jOxm0t.js";
5
- import { t as o } from "./check-box-CC8CDnSR.js";
6
- import { n as s } from "./radio-group-DhpP7JSJ.js";
3
+ import { i as n, n as r, r as i } from "./modal-dplfAaER.js";
4
+ import { n as a } from "./input-DSPKgiCK.js";
5
+ import { t as o } from "./check-box-CZyhzmR0.js";
6
+ import { n as s } from "./radio-group-CRk_1ODZ.js";
7
7
  import { a as c, i as l, n as u, r as d, t as f } from "./types-D9Wj9wrg.js";
8
8
  import { useCallback as p, useEffect as m, useMemo as h, useRef as g, useState as _ } from "react";
9
9
  import { cn as v } from "@ryuzaki13/react-foundation-lib/utils";
@@ -1440,4 +1440,4 @@ function ct({ initialData: e, onChange: t, toolbarComponents: n, businessAdapter
1440
1440
  //#endregion
1441
1441
  export { ct as TextEditorLexicalClient };
1442
1442
 
1443
- //# sourceMappingURL=TextEditorLexicalClient-CSXZQOYo.js.map
1443
+ //# sourceMappingURL=TextEditorLexicalClient-D46Zed55.js.map