@ryuzaki13/react-foundation-ui 2.1.0 → 3.0.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.
- package/COLOR_TOKENS_MIGRATION.md +224 -0
- package/README.md +14 -18
- package/dist/advanced-search/index.js +8 -8
- package/dist/badge/index.js +1 -1
- package/dist/barcode-scanner/index.js +2 -2
- package/dist/base-table/index.js +1 -1
- package/dist/button/index.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/chunks/{CalendarView-Bhaov_XE.js → CalendarView-Dm55k0bN.js} +2 -2
- package/dist/chunks/CalendarView-Dm55k0bN.js.map +1 -0
- package/dist/chunks/ImageViewerRuntime-HGBWp9NM.js.map +1 -1
- package/dist/chunks/{TextEditorLexicalClient-CSXZQOYo.js → TextEditorLexicalClient-D46Zed55.js} +6 -6
- package/dist/chunks/TextEditorLexicalClient-D46Zed55.js.map +1 -0
- package/dist/chunks/{badge-DUI2ET6q.js → badge-6mXO9BWP.js} +2 -2
- package/dist/chunks/badge-6mXO9BWP.js.map +1 -0
- package/dist/chunks/{base-table-BqW1n7tv.js → base-table-BWvKfI2W.js} +2 -2
- package/dist/chunks/{base-table-BqW1n7tv.js.map → base-table-BWvKfI2W.js.map} +1 -1
- package/dist/chunks/{button-BaUlN-nt.js → button-DF21yxVp.js} +3 -3
- package/dist/chunks/{button-BaUlN-nt.js.map → button-DF21yxVp.js.map} +1 -1
- package/dist/chunks/{check-box-CC8CDnSR.js → check-box-CZyhzmR0.js} +3 -3
- package/dist/chunks/{check-box-CC8CDnSR.js.map → check-box-CZyhzmR0.js.map} +1 -1
- package/dist/chunks/{context-menu-Dj6MXgv6.js → context-menu-DgvXGCuI.js} +3 -3
- package/dist/chunks/context-menu-DgvXGCuI.js.map +1 -0
- package/dist/chunks/{date-input-DkLfO3Ng.js → date-input-BwLOiGXp.js} +5 -5
- package/dist/chunks/{date-input-DkLfO3Ng.js.map → date-input-BwLOiGXp.js.map} +1 -1
- package/dist/chunks/dialog-Dqq8ZN99.js +50 -0
- package/dist/chunks/dialog-Dqq8ZN99.js.map +1 -0
- package/dist/chunks/{input-D1jOxm0t.js → input-DSPKgiCK.js} +2 -2
- package/dist/chunks/input-DSPKgiCK.js.map +1 -0
- package/dist/chunks/{input-files-CDGpJaUm.js → input-files-tIS17-zX.js} +3 -3
- package/dist/chunks/input-files-tIS17-zX.js.map +1 -0
- package/dist/chunks/{input-search-Ci1ubGox.js → input-search-Cat4c7SM.js} +2 -2
- package/dist/chunks/{input-search-Ci1ubGox.js.map → input-search-Cat4c7SM.js.map} +1 -1
- package/dist/chunks/misc-DeGboAt-.js.map +1 -1
- package/dist/chunks/{modal-CbAwLHlM.js → modal-dplfAaER.js} +2 -2
- package/dist/chunks/{modal-CbAwLHlM.js.map → modal-dplfAaER.js.map} +1 -1
- package/dist/chunks/{multi-select-V7SLAduU.js → multi-select-BZ9N6Dal.js} +4 -4
- package/dist/chunks/{multi-select-V7SLAduU.js.map → multi-select-BZ9N6Dal.js.map} +1 -1
- package/dist/chunks/{picker-DZ4-1BvK.js → picker-lvm82d0A.js} +3 -3
- package/dist/chunks/picker-lvm82d0A.js.map +1 -0
- package/dist/chunks/popover-Bne-Ljbs.js.map +1 -1
- package/dist/chunks/{radio-group-DhpP7JSJ.js → radio-group-CRk_1ODZ.js} +2 -2
- package/dist/chunks/radio-group-CRk_1ODZ.js.map +1 -0
- package/dist/chunks/{select-B7cWlJxL.js → select-aTGupQan.js} +4 -4
- package/dist/chunks/{select-B7cWlJxL.js.map → select-aTGupQan.js.map} +1 -1
- package/dist/chunks/{table-DMLFUBlb.js → table-DxoSOvQK.js} +2 -2
- package/dist/chunks/table-DxoSOvQK.js.map +1 -0
- package/dist/chunks/{ui.module-BsDio9A3.js → ui.module-oRwY3Zli.js} +2 -1
- package/dist/chunks/ui.module-oRwY3Zli.js.map +1 -0
- package/dist/chunks/{uiClasses-BVwFzzsr.js → uiClasses-CQj47jkF.js} +11 -2
- package/dist/chunks/uiClasses-CQj47jkF.js.map +1 -0
- package/dist/chunks/wheel-picker-FS58cRsQ.js.map +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-time-input/index.js +3 -3
- package/dist/dialog/index.js +2 -50
- package/dist/disclosure/index.js +2 -2
- package/dist/disclosure/index.js.map +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/index.js.map +1 -1
- package/dist/errors/index.js +4 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/image/index.js +5 -5
- package/dist/image/index.js.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +2 -2
- package/dist/input-file/index.js +2 -2
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +2 -2
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +1 -1
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/listbox/index.js +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +1 -1
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/option/index.js +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js +2 -2
- package/dist/radio-group/index.js +1 -1
- package/dist/select/index.js +1 -1
- package/dist/simple-table/index.js +1 -1
- package/dist/slider/index.js +3 -3
- package/dist/slider/index.js.map +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/status-indicator/StatusIndicator.d.ts.map +1 -1
- package/dist/status-indicator/index.js +2 -0
- package/dist/status-indicator/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table-editor/index.d.ts +3 -0
- package/dist/table-editor/index.d.ts.map +1 -0
- package/dist/table-editor/index.js +462 -0
- package/dist/table-editor/index.js.map +1 -0
- package/dist/table-editor/model/useTableEditor.d.ts +25 -0
- package/dist/table-editor/model/useTableEditor.d.ts.map +1 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts +10 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditor.d.ts +21 -0
- package/dist/table-editor/ui/TableEditor.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts +14 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts +10 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts +11 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts.map +1 -0
- package/dist/table-sorting/index.js +1 -1
- package/dist/tabs/index.js +2 -2
- package/dist/tabs/index.js.map +1 -1
- package/dist/tag-input/index.js +2 -2
- package/dist/tag-input/index.js.map +1 -1
- package/dist/text-editor/index.js +1 -1
- package/dist/textarea/index.js +2 -2
- package/dist/toggle/index.js +1 -1
- package/dist/toggle/index.js.map +1 -1
- package/dist/tree-select/index.js +3 -3
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +1 -1
- package/dist/tree-table/index.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/uiClasses.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/styles/_border.scss +2 -2
- package/src/styles/_color.scss +8 -8
- package/src/styles/_components.scss +2 -2
- package/src/styles/_normalize.scss +4 -4
- package/src/styles/config/_index.scss +95 -182
- package/src/styles/mixins/_controls.scss +43 -26
- package/src/styles/mixins/_mixin.scss +0 -187
- package/src/styles/mixins/controls.test.ts +28 -6
- package/src/styles/themes/_interactive-surface.scss +12 -12
- package/src/styles/themes/_theme.scss +21 -157
- package/src/styles/themes/theme.test.ts +66 -48
- package/storybook-static/assets/{Badge-BXbiidny.js → Badge-DLpkFLAr.js} +8 -2
- package/storybook-static/assets/{Badge.stories-DCOkVsyk.js → Badge.stories-DwwZ0O7j.js} +7 -1
- package/storybook-static/assets/{BadgeList-DgUScGRc.js → BadgeList-C0bhovUR.js} +2 -2
- package/storybook-static/assets/{BadgeList-CD5894x5.css → BadgeList-DbjeNuw0.css} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-7Bv_TejN.js → BarcodeScannerDialog.stories-DYXaW4Vw.js} +1 -1
- package/storybook-static/assets/{Button-0UDcBhBt.js → Button-B1nvnaMI.js} +12 -2
- package/storybook-static/assets/{Button-BpQRrzrS.js → Button-PAj4mH8o.js} +4 -2
- package/storybook-static/assets/Button.stories-CNvWyh5M.js +106 -0
- package/storybook-static/assets/{CalendarView-B93LI4f_.js → CalendarView-WUXapLvN.js} +1 -1
- package/storybook-static/assets/CalendarView-dgpVDRJR.css +1 -0
- package/storybook-static/assets/{CheckBox-BaAouU5d.js → CheckBox-B9f_n0Nh.js} +2 -2
- package/storybook-static/assets/{CheckBox-CFusvDS8.js → CheckBox-C3r_FdXc.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-Bdr_GC0M.js → CheckBox.stories-B5CFQBFx.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-B8A6Hc7V.js → Color-6AOWCN3U-tYUAsbHo.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CvHpWBGV.js → ContextMenu-C-T3O2d9.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BcNU89-b.js → ContextMenu-PIvPPvq1.js} +1 -1
- package/storybook-static/assets/ContextMenu-yhWq2uJ3.css +1 -0
- package/storybook-static/assets/{ContextMenu.stories-DQDlVNxB.js → ContextMenu.stories-Bmy_0Oug.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-DkGlBvWP.js → CustomOptionButton-D_qTIop3.js} +1 -1
- package/storybook-static/assets/{DateInput-NkrPSWMl.js → DateInput-B7GZSkR3.js} +1 -1
- package/storybook-static/assets/{DateInput-CWsb-NhT.js → DateInput-C-goSdP-.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-Bvz465d-.js → DateInput.stories-CeAMz_x1.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DC6_r8SQ.js → DateRangePresetSelect-BZ9U_l_x.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DQlphKzc.js → DateRangePresetSelect-BmjgWIxM.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-DVfqPYN5.js → DateRangePresetSelect.stories-5UGP9HcH.js} +1 -1
- package/storybook-static/assets/{Detail-CXQYyd94.js → Detail-C6duvCft.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BEXByYXt.js → Detail.stories-DQZciNeZ.js} +1 -1
- package/storybook-static/assets/{Dialog-CyYTYgbp.js → Dialog-87D5Shqd.js} +1 -1
- package/storybook-static/assets/{Dialog-B2UTbDCv.js → Dialog-Bx4-acbv.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-BWluB4Ya.js → Dialog.stories-BgOQABzP.js} +1 -1
- package/storybook-static/assets/{Disclosure-Dv5XOsna.js → Disclosure-ZctFZjdw.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-BxK_fmJE.js → Disclosure.stories-BioI8Dpv.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-B2O8D8CG.js → DisclosureGroup-Cn2EEocA.js} +1 -1
- package/storybook-static/assets/DisclosureGroup-D_ldcGgp.css +1 -0
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-7N0jH0Oi.js → DocsRenderer-JROSPFPF-CoppGUHs.js} +1 -1
- package/storybook-static/assets/{DropZone-DL34ooyF.js → DropZone-68BioqBN.js} +1 -1
- package/storybook-static/assets/{DropZone-ZlPjdEuO.js → DropZone-BpInQyuE.js} +1 -1
- package/storybook-static/assets/{DropZone-C7HIN5ml.css → DropZone-C4gPTIz0.css} +1 -1
- package/storybook-static/assets/{DropZone.stories-BT9JvF9d.js → DropZone.stories-DhVyaedf.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-BhC5f2Qc.js → DropdownMenu-Dw-i5abQ.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-C77qVHBP.js → ExpandableActionPanel-Bb7Eo_iW.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-D1MJEw6F.js → ExpandableActionPanel.stories-B0XABlVT.js} +1 -1
- package/storybook-static/assets/{Flex-BHt3-yoh.js → Flex-CG5yKEBH.js} +1 -1
- package/storybook-static/assets/{Flex.stories-M8QVGuVA.js → Flex.stories-Cfx4TAqp.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-Dch6_6e0.js → FloatingPopover-B8zZ8eYf.js} +1 -1
- package/storybook-static/assets/FloatingPopover-Di16BZj-.css +1 -0
- package/storybook-static/assets/FormattedTableCell-BzBZlmxd.js +15 -0
- package/storybook-static/assets/FormattedTableCell-CTIL_ueu.css +1 -0
- package/storybook-static/assets/{Grid-CcyaioK_.js → Grid-3MdRiyY4.js} +1 -1
- package/storybook-static/assets/{Grid.stories-CTHcYkKa.js → Grid.stories-DUfosHcu.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-B84lQIPy.js → ImageCropper.stories-DBLj9S4C.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-kTsPC-b5.js → ImageRenderer-bZHWE6lq.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-pozsCEPL.js → ImageRenderer.stories-BU2tt9QR.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-CNttofCE.js → ImageView.stories-t_ree_kB.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-D_7oQpyX.js → ImageViewer.stories-kodL93QT.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-Dnc70fBS.js → ImageViewerRuntime-Dkw7fwZ1.js} +1 -1
- package/storybook-static/assets/ImageViewerRuntime-MxAd4mC-.css +1 -0
- package/storybook-static/assets/{Input-DvRmrrtj.js → Input-C-Q_V0Uc.js} +1 -1
- package/storybook-static/assets/{Input-CYgnggvb.css → Input-CIA3PkB4.css} +1 -1
- package/storybook-static/assets/{Input-BO9q-b1i.js → Input-Ckb0G4jj.js} +1 -1
- package/storybook-static/assets/{Input.stories-DeKdGxIC.js → Input.stories-BZITY0Np.js} +1 -1
- package/storybook-static/assets/{InputDateTime-hqRtizlN.js → InputDateTime-DF-R-IPb.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BpGhWbRp.js → InputDateTime.stories-2ELFc29n.js} +1 -1
- package/storybook-static/assets/{InputFile-CExDbGYJ.js → InputFile-3Sn8IwRI.js} +1 -1
- package/storybook-static/assets/{InputFile-CTDHdo2g.js → InputFile-Xo-rxvud.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-BIinoG-U.js → InputFile.stories-B4EHuTtj.js} +1 -1
- package/storybook-static/assets/{InputFiles-Cvdn_5IV.js → InputFiles-CRFuoEBd.js} +1 -1
- package/storybook-static/assets/{InputFiles-BWeRuTCh.js → InputFiles-DzdnkOiD.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-J2bb48sN.js → InputFiles.stories-BRCSXgg-.js} +1 -1
- package/storybook-static/assets/{InputFilesList-ByK52qUe.css → InputFilesList-BbwB0oHE.css} +1 -1
- package/storybook-static/assets/{InputFilesList-DO6IJW98.js → InputFilesList-CvL4pjsZ.js} +1 -1
- package/storybook-static/assets/{InputImage-C7zaIkCa.js → InputImage-B1v_PWfN.js} +1 -1
- package/storybook-static/assets/{InputImage-BtsIbqEc.js → InputImage-qAzSyHzj.js} +1 -1
- package/storybook-static/assets/{InputImage.stories--ewdBKin.js → InputImage.stories-4NLpODaa.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-Cy9Y2J_q.js → InteractiveComponents-Bdy-KTOF.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-CgC4nhd3.js → InteractiveComponents.stories-C_ZAVn0R.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CfgWKTDC.js → LayoutPicker-8wwVLPom.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-DhJgMxdf.js → LayoutPicker-B4eblsaF.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BY4-fUQa.css → LayoutPicker-DaPDA0_s.css} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Bli7rQRh.js → LayoutPicker.stories-BkA-VmHP.js} +1 -1
- package/storybook-static/assets/{Listbox-bq5sSQnZ.js → Listbox-ChaW3JrO.js} +1 -1
- package/storybook-static/assets/{Listbox-_MNXWNW7.js → Listbox-CyH7MftX.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-BP9mqHoo.js → Listbox.stories-_31FVhoW.js} +1 -1
- package/storybook-static/assets/{Modal-CNt7-iWI.js → Modal-CaGOliEb.js} +1 -1
- package/storybook-static/assets/{Modal-Dwqp7agw.js → Modal-DGR9lZ4E.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D2Hj75pl.js → Modal.stories-C1yvEVNj.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-BoCpnUex.js → ModalManagerProvider-BrPY3nRM.js} +1 -1
- package/storybook-static/assets/{MultiSelect-B1BckUGX.js → MultiSelect-D-O71OBm.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CTfbXQVD.js → MultiSelect-D4S4B3va.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-BdMJk22c.js → MultiSelect.stories-B0QY0_Ru.js} +1 -1
- package/storybook-static/assets/{NoData-CNK8-UBc.js → NoData-B6xgAMXh.js} +1 -1
- package/storybook-static/assets/NotificationsHost-BIyd1XQ0.css +1 -0
- package/storybook-static/assets/{NotificationsHost-Cczj_pFY.js → NotificationsHost-DJ3Y-Bov.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BPB6hfSI.js → NotificationsHost.stories-B2ULIi8d.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-CahWMsCQ.js → ODataMultiSelect-0SfdyLn9.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-Dnyu2-gz.js → ODataMultiSelect.stories-BLq2Lzuq.js} +1 -1
- package/storybook-static/assets/{ODataSelect-DxbjbdNx.js → ODataSelect-CkdBSdJ6.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DfK9yHK7.js → ODataSelect.stories-OLMZHd_q.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-DOgHyKon.js → ODataTreeMultiSelect-DMLCMhQn.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-Dv0-ackb.js → ODataTreeMultiSelect.stories-aY5Q0IHe.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-DIoygv27.js → ODataTreeSelect-ME1K7NL2.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-D4mZcW9Z.js → ODataTreeSelect.stories-C7UPHKEr.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-DNTilSDM.js → OneStepScroller-RRsghqzx.js} +1 -1
- package/storybook-static/assets/{Option-qcKM13Ly.js → Option-CcZ3aKLZ.js} +1 -1
- package/storybook-static/assets/Option-DD2t6DLq.css +1 -0
- package/storybook-static/assets/{OptionButton-DrNo-DMV.js → OptionButton-B-RTb3Ua.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-Dk-_iKeR.js → PeriodSelect-B-89h-o8.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DjzmUohy.js → PeriodSelect-CUUixF0M.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-d58Lz3DJ.js → PeriodSelect.stories-CU1V-pP4.js} +1 -1
- package/storybook-static/assets/{PickerField-Dv1S8Wit.js → PickerField-DykK8Xgu.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-dbXPGPRy.js → PickerTriggerActions-C2qYXlH1.js} +1 -1
- package/storybook-static/assets/{Popover-tPH8grZD.js → Popover-Bg-XuklM.js} +1 -1
- package/storybook-static/assets/{Popover-DMrefrsO.js → Popover-D_MNKdnD.js} +1 -1
- package/storybook-static/assets/{Popover.stories-BGgMddUi.js → Popover.stories-D2Asjc6d.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Bi01AT1-.js → PresetRangeDateInput-B1KqD3aB.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Bi5D7AvA.js → PresetRangeDateInput-CYXkpgts.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-BK9PG5Us.js → PresetRangeDateInput.stories-CTML1dIg.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Bo_urWXj.js → PresetSelect-4PvR0s4U.js} +1 -1
- package/storybook-static/assets/{README-CsYvQc-H.js → README--I7LDhOP.js} +1 -1
- package/storybook-static/assets/{README-DQzhOQJs.js → README-1Ks0ldtQ.js} +1 -1
- package/storybook-static/assets/{README-BCXhBI3h.js → README-44qHXI_X.js} +1 -1
- package/storybook-static/assets/{README-oTjX8jJr.js → README-B3Q9ZlQz.js} +1 -1
- package/storybook-static/assets/{README-C1EYYUCN.js → README-B5MLKvrO.js} +1 -1
- package/storybook-static/assets/{README-CvomZuv4.js → README-B5vVbHbw.js} +1 -1
- package/storybook-static/assets/{README-CiRdh2G1.js → README-BJsszjH8.js} +1 -1
- package/storybook-static/assets/{README-CAYUX5Nb.js → README-BK-2_7T4.js} +1 -1
- package/storybook-static/assets/{README-qyGL-RQj.js → README-BKGcgtnD.js} +1 -1
- package/storybook-static/assets/{README-DJeVd42x.js → README-BNUdkNxv.js} +1 -1
- package/storybook-static/assets/{README-CUw7AGFv.js → README-BSSrY3Ri.js} +1 -1
- package/storybook-static/assets/{README-Bccm-jZn.js → README-BVOzG1wf.js} +1 -1
- package/storybook-static/assets/{README-BatM3k6o.js → README-BZbDJrol.js} +1 -1
- package/storybook-static/assets/{README-BrnWLQ7I.js → README-BcReoeGQ.js} +1 -1
- package/storybook-static/assets/{README-C9LAWG5A.js → README-BdgUDdVT.js} +1 -1
- package/storybook-static/assets/{README-DnE0W6xN.js → README-BpSdRy6R.js} +1 -1
- package/storybook-static/assets/{README-CHOXjCGT.js → README-BrduLUi1.js} +1 -1
- package/storybook-static/assets/{README-WDknu02X.js → README-Bt44WdOn.js} +1 -1
- package/storybook-static/assets/{README-DXV0j4Y9.js → README-Bta2DZoW.js} +1 -1
- package/storybook-static/assets/{README-BbwNWG_A.js → README-Bwa8ai1X.js} +1 -1
- package/storybook-static/assets/{README-DRTv3qN5.js → README-C1TqCBPf.js} +1 -1
- package/storybook-static/assets/{README-B2NTIwVC.js → README-C5Cq8Lo7.js} +1 -1
- package/storybook-static/assets/{README-BOY9oCZ5.js → README-CE0sa_3S.js} +1 -1
- package/storybook-static/assets/{README-DENkRq75.js → README-COnopkzM.js} +1 -1
- package/storybook-static/assets/{README-BRxnSb_H.js → README-CUEwtG21.js} +1 -1
- package/storybook-static/assets/{README-DOqinQqt.js → README-CVEiXGCU.js} +1 -1
- package/storybook-static/assets/{README-CSkB_qWo.js → README-CWxf5v2C.js} +1 -1
- package/storybook-static/assets/{README-DNkooR8C.js → README-CjbqfpYX.js} +1 -1
- package/storybook-static/assets/{README-XlmyqVIs.js → README-CnE5ZG98.js} +1 -1
- package/storybook-static/assets/{README-CLfxQA5V.js → README-Co-LXT0Y.js} +1 -1
- package/storybook-static/assets/{README-BPDYLPfh.js → README-CoJlt7mW.js} +1 -1
- package/storybook-static/assets/{README-G5BEMzLO.js → README-DFiFAUAq.js} +1 -1
- package/storybook-static/assets/{README-cmKi-NfO.js → README-DMCaXjMn.js} +1 -1
- package/storybook-static/assets/{README-ChyNimpn.js → README-DecmlELk.js} +3 -3
- package/storybook-static/assets/{README-Bsm0nJfv.js → README-Diow36TX.js} +1 -1
- package/storybook-static/assets/{README-BO0pPMhH.js → README-DlE5gepf.js} +1 -1
- package/storybook-static/assets/{README-DLL_V1qq.js → README-Dl_id19k.js} +1 -1
- package/storybook-static/assets/{README-D7IkoGLE.js → README-DpxWpc-I.js} +1 -1
- package/storybook-static/assets/{README-DI6PuVn_.js → README-Dqpnap9b.js} +1 -1
- package/storybook-static/assets/{README-DSx__uJY.js → README-DrSuJ2Ll.js} +1 -1
- package/storybook-static/assets/{README-CIy0Pj6l.js → README-Dtb7kJXX.js} +1 -1
- package/storybook-static/assets/{README-CgvojwYv.js → README-Ib9AxEso.js} +1 -1
- package/storybook-static/assets/{README-5MsrC0tc.js → README-NCp7adRE.js} +1 -1
- package/storybook-static/assets/{README-CDXBNJlU.js → README-SHZwgJhZ.js} +1 -1
- package/storybook-static/assets/{README-Bzz8tDjY.js → README-VY7CL7vi.js} +1 -1
- package/storybook-static/assets/{README-BIYrg5Jw.js → README-Ve2RJTbZ.js} +1 -1
- package/storybook-static/assets/{README-BTCDTs4l.js → README-bU5ZgdrN.js} +1 -1
- package/storybook-static/assets/{README-DqTSHU_3.js → README-kpAlQZLM.js} +1 -1
- package/storybook-static/assets/{README-iy7SbqPS.js → README-l0W43XHl.js} +1 -1
- package/storybook-static/assets/{README-BxY8B5jC.js → README-tetbJraG.js} +1 -1
- package/storybook-static/assets/{README-DnjCb77l.js → README-vUJFU3Tw.js} +1 -1
- package/storybook-static/assets/{README-lyLRoc9A.js → README-vjP8Z9fC.js} +1 -1
- package/storybook-static/assets/{README-DCitesDJ.js → README-ypHLhhny.js} +1 -1
- package/storybook-static/assets/{RadioButton-C5lYvVIl.js → RadioButton-ByRN6fXm.js} +1 -1
- package/storybook-static/assets/{RadioButton-_-grgF60.js → RadioButton-DRIJvobR.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BNifE29D.js → RadioButton.stories-C6lOZsje.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DWfHyBaQ.js → RadioGroup-5P3FMqFW.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BU95Hbl0.css → RadioGroup-DHnDIEgi.css} +1 -1
- package/storybook-static/assets/{RadioGroup-CmDrRqLi.js → RadioGroup-Dskh-JZM.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-1PW9Krj9.js → RadioGroup.stories-BDbOjwVa.js} +1 -1
- package/storybook-static/assets/{Scrollable-CWkMU4wH.js → Scrollable-Cat0ixOK.js} +1 -1
- package/storybook-static/assets/{Select-BCGnO525.js → Select-BiIixkSk.js} +1 -1
- package/storybook-static/assets/{Select-DYtEG5uI.js → Select-ImY9WR7I.js} +1 -1
- package/storybook-static/assets/{Select.stories-CgldXYRU.js → Select.stories-DR8qQrXW.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-MmvKHZiv.js → SerializableSelect-C2swvXju.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Di0iM37P.js → SerializableSelect.stories-CvoyFECC.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Ds5YsLHg.js → SingleDateTimeInput-CjixqW_K.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Cz2Y7KEq.js → SingleDateTimeInput-hV5Om2LV.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BnuERNSZ.js → SingleDateTimeInput.stories-CPDP-M6P.js} +1 -1
- package/storybook-static/assets/Slider-DxdPx1Pb.css +1 -0
- package/storybook-static/assets/{Slider-Csaz4BeY.js → Slider-FbV_mr1Y.js} +1 -1
- package/storybook-static/assets/{Slider-CiZ7R_NX.js → Slider-PcbxPCWE.js} +1 -1
- package/storybook-static/assets/{Slider.stories-7Heg0Pgz.js → Slider.stories-CH9grPep.js} +1 -1
- package/storybook-static/assets/{SliderInput-bTh2JTHG.js → SliderInput-DPYcLCwD.js} +1 -1
- package/storybook-static/assets/{SliderInput-qWpLFzxj.js → SliderInput-iqnLqNiU.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-DR_zyE-u.js → SliderInput.stories-qVDa0KhJ.js} +1 -1
- package/storybook-static/assets/{Sortable-P86Ancoa.js → Sortable-DzJSN0MG.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-iiOkIM-G.js → Sortable.stories-BaQ2T15L.js} +1 -1
- package/storybook-static/assets/{Splitter-mG3bB-U4.js → Splitter-Ka7c1ZDV.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-WhQOQVRq.js → Splitter.stories-BbjjUT39.js} +1 -1
- package/storybook-static/assets/{StateSelect-De2PQDzp.js → StateSelect-CfyyDUiq.js} +1 -1
- package/storybook-static/assets/{StateSelect-u1kaZwdD.js → StateSelect-DSzDU5Jy.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-BO-C9UTF.js → StateSelect.stories-0c32Rlr2.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-BiTbPB5o.js → StatusIndicator-CcCdDffH.js} +1 -1
- package/storybook-static/assets/StatusIndicator-CpCGmnO7.css +1 -0
- package/storybook-static/assets/StatusIndicator.stories-Bazi6rxF.js +31 -0
- package/storybook-static/assets/{StringToggle.stories-CBt8bXzz.js → StringToggle.stories-Bl6HAr4o.js} +1 -1
- package/storybook-static/assets/{Switch-BRKFbtp4.js → Switch-BqAkQzIJ.js} +1 -1
- package/storybook-static/assets/{Switch-BC2KYLX2.js → Switch-Vl7s55bO.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BAmX4W8J.js → Switch.stories-Cq2n8Vr4.js} +1 -1
- package/storybook-static/assets/{Table-D1OJnVmO.js → Table-BgxoZKJs.js} +1 -1
- package/storybook-static/assets/Table-j_3ID7Xq.css +1 -0
- package/storybook-static/assets/{Table.stories-C_JSdhJl.js → Table.stories-DxnnXMZX.js} +3 -3
- package/storybook-static/assets/TableEditor-CaZCZgKf.css +1 -0
- package/storybook-static/assets/TableEditor.stories-D5Ke41-O.js +61 -0
- package/storybook-static/assets/{Tabs-DiUKiz-h.js → Tabs-BPJG7wBI.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-DGys1vSD.js → Tabs.stories-cQ4RTo0w.js} +1 -1
- package/storybook-static/assets/{TabsBox-D-bkJX9j.css → TabsBox-B3REnb6D.css} +1 -1
- package/storybook-static/assets/{TabsBox-D4yfPiDY.js → TabsBox-CGgEovb9.js} +1 -1
- package/storybook-static/assets/{TagInput-ZyC-89b3.js → TagInput-CGHC-7Rv.js} +1 -1
- package/storybook-static/assets/{TagInput-ChmW4s9O.css → TagInput-RJbbcfoR.css} +1 -1
- package/storybook-static/assets/{TagInput.stories-hVoLW5qr.js → TagInput.stories-BSy_dJ5n.js} +1 -1
- package/storybook-static/assets/{Text-CMJA_7QZ.js → Text-D5fn4NbN.js} +1 -1
- package/storybook-static/assets/{Textarea-Du012ObX.js → Textarea-CbWAz4J8.js} +1 -1
- package/storybook-static/assets/{Textarea-DjKw5r4e.js → Textarea-pXxz-925.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-ShFda4o7.js → Textarea.stories-BkPejDdf.js} +1 -1
- package/storybook-static/assets/{TimePanel-Bfkpbjrx.js → TimePanel-BJulRHL2.js} +1 -1
- package/storybook-static/assets/{TimePanel-Bh98qsCo.css → TimePanel-D9_hb7w4.css} +1 -1
- package/storybook-static/assets/{TimePanel.stories-4pV3fQVB.js → TimePanel.stories-CJmuKdfu.js} +1 -1
- package/storybook-static/assets/{Toggle-CPohFihI.js → Toggle-B2S8eW_z.js} +1 -1
- package/storybook-static/assets/Toggle-ClE8Zovo.css +1 -0
- package/storybook-static/assets/{Toggle-ChC8G1Et.js → Toggle-DjqQBHtJ.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-B3H1M8Ra.js → Toggle.stories-7KRSUGU9.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CbNz09Jk.js → TreeMultiSelect-B7Dd0sH5.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BpuHCHgJ.js → TreeMultiSelect-DfvInPvn.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-Cmt05HgT.js → TreeMultiSelect.stories-DrokeiS6.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-DGvBAQiy.js → TreePickerBase-CN9UeNWV.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B6DED6Hz.css → TreePickerBase-CmFF9pWE.css} +1 -1
- package/storybook-static/assets/{TreeSelect-DvAlRur3.js → TreeSelect-D3s-_McF.js} +1 -1
- package/storybook-static/assets/{TreeSelect-C_GCYsA3.js → TreeSelect-DPX2Q1Sv.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-Cch2A2z5.js → TreeSelect.stories-DvUGVU34.js} +1 -1
- package/storybook-static/assets/TreeTable-BvB3kj4h.css +1 -0
- package/storybook-static/assets/{TreeTable-CmVxMvld.js → TreeTable-By3223dp.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-B46N8o8E.js → TreeTable.stories-DKAKV_e2.js} +2 -2
- package/storybook-static/assets/{array-D-_yMMUK-DYqn1Ozn.js → array-D-_yMMUK-DnJ_b27D.js} +1 -1
- package/storybook-static/assets/{blocks-Bu5I-6jJ.js → blocks-C4R1QC9R.js} +3 -3
- package/storybook-static/assets/{check-BdRTIK6S.js → check-DkXl--jW.js} +1 -1
- package/storybook-static/assets/{chevron-down-EtmpBUf8.js → chevron-down-DnX0I3Pg.js} +1 -1
- package/storybook-static/assets/{chevron-left-CTLa8HIb.js → chevron-left-18ya0d2d.js} +1 -1
- package/storybook-static/assets/{chevron-right-D_c_Cvi0.js → chevron-right-DilGYzJ6.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-B7ERYz6B.js → chunk-W22LQPXL-WTP7vHyr.js} +1 -1
- package/storybook-static/assets/{circle-alert-Dj1kZNNX.js → circle-alert-DVNv_dVS.js} +1 -1
- package/storybook-static/assets/{circle-check-B1w7Ls8y.js → circle-check-vIdCi5Zq.js} +1 -1
- package/storybook-static/assets/{components-DqRn1i2k.js → components-BtEbmBZQ.js} +3 -3
- package/storybook-static/assets/{contextMenu-ylNgC9hS.js → contextMenu-1dx6rzYN.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-CyUQG_f-.js → defaultRenderers-UxEpV_2H.js} +1 -1
- package/storybook-static/assets/{download-dw_WzNlC.js → download-37V1rEcU.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-C9sdi3nv.js → floating-ui.react-DT-xu5am.js} +1 -1
- package/storybook-static/assets/{formatters-DVE1YVNQ-CMsbb5-m.js → formatters-DVE1YVNQ-YIdRxgw-.js} +1 -1
- package/storybook-static/assets/{foundationApi-BJETphYp.js → foundationApi-FaYaPMaR.js} +1 -1
- package/storybook-static/assets/{foundationLib-DfRlYoD7.js → foundationLib-DLCLUXOF.js} +1 -1
- package/storybook-static/assets/{hooks-B-ZW7F36.js → hooks-BuU9-pEZ.js} +1 -1
- package/storybook-static/assets/{iframe-D0R9pFj7.js → iframe-0M2vpakb.js} +4 -4
- package/storybook-static/assets/iframe-BMXB4CtM.js +1 -0
- package/storybook-static/assets/iframe-BT_jngkf.css +1 -0
- package/storybook-static/assets/{info-B0qzF0Mr.js → info-2PUHH67D.js} +1 -1
- package/storybook-static/assets/odata-DIkxH78d.js +1 -0
- package/storybook-static/assets/odataStoryFixtures-BDQiSxyk.js +25 -0
- package/storybook-static/assets/{react-ClkCNz5L.js → react-CfjIdTfH.js} +1 -1
- package/storybook-static/assets/{refresh-cw-K68D1zRy.js → refresh-cw-CHFG8NIc.js} +1 -1
- package/storybook-static/assets/{settings-2-D0jFfhpt.js → settings-2-CYde2-4U.js} +1 -1
- package/storybook-static/assets/{sortable-fWu4d9fl.js → sortable-Cy9ZqA3f.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-Cs3Bxe3I.js → syntaxhighlighter-QEQV7K2Y-C2U-3XXV.js} +1 -1
- package/storybook-static/assets/tableFeatures-Dx3U-F9E.js +1 -0
- package/storybook-static/assets/{trash-2-Bj60L0sq.js → trash-2-7-oMZEr8.js} +1 -1
- package/storybook-static/assets/{triangle-alert-CmzQ-r9i.js → triangle-alert-BSmuthen.js} +1 -1
- package/storybook-static/assets/ui-DSS1yTEO.css +1 -0
- package/storybook-static/assets/ui.module-SH8ehXul.js +1 -0
- package/storybook-static/assets/uiClasses-e9OQfdw2.js +1 -0
- package/storybook-static/assets/{useODataSelectBase-CC4MnYeK.js → useODataSelectBase-C3B3Xw87.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-DsQmGQij.js → useODataTreeData-deUW5mSv.js} +1 -1
- package/storybook-static/assets/{usePickerDefaultFilter-BMBLqfz8.js → usePickerDefaultFilter-ien2ZY7g.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Qg7qGfmP.js → usePickerQuery-DdE3I7AV.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-D-mhhmpS.js → usePickerTriggerController-ZRvj4FHy.js} +1 -1
- package/storybook-static/assets/useTable-CK68Q4S4.js +1 -0
- package/storybook-static/assets/{x-DU3Tpzms.js → x-NXcyLtyX.js} +1 -1
- package/storybook-static/iframe.html +3 -3
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/chunks/CalendarView-Bhaov_XE.js.map +0 -1
- package/dist/chunks/TextEditorLexicalClient-CSXZQOYo.js.map +0 -1
- package/dist/chunks/badge-DUI2ET6q.js.map +0 -1
- package/dist/chunks/context-menu-Dj6MXgv6.js.map +0 -1
- package/dist/chunks/input-D1jOxm0t.js.map +0 -1
- package/dist/chunks/input-files-CDGpJaUm.js.map +0 -1
- package/dist/chunks/picker-DZ4-1BvK.js.map +0 -1
- package/dist/chunks/radio-group-DhpP7JSJ.js.map +0 -1
- package/dist/chunks/table-DMLFUBlb.js.map +0 -1
- package/dist/chunks/ui.module-BsDio9A3.js.map +0 -1
- package/dist/chunks/uiClasses-BVwFzzsr.js.map +0 -1
- package/dist/dialog/index.js.map +0 -1
- package/storybook-static/assets/Button.stories-CLMnxj3w.js +0 -93
- package/storybook-static/assets/CalendarView-DKvrkS40.css +0 -1
- package/storybook-static/assets/ContextMenu-CFPrlO2u.css +0 -1
- package/storybook-static/assets/DisclosureGroup-CVFMwx22.css +0 -1
- package/storybook-static/assets/FloatingPopover-jwILx9b0.css +0 -1
- package/storybook-static/assets/FormattedTableCell-AZc2IHfK.css +0 -1
- package/storybook-static/assets/FormattedTableCell-CXyG4Yj2.js +0 -15
- package/storybook-static/assets/ImageViewerRuntime-CRmlrtpL.css +0 -1
- package/storybook-static/assets/NotificationsHost-D5Pvn4eu.css +0 -1
- package/storybook-static/assets/Option-DXh7BISz.css +0 -1
- package/storybook-static/assets/Slider-CK-W2ZTO.css +0 -1
- package/storybook-static/assets/StatusIndicator-CU9ICMrC.css +0 -1
- package/storybook-static/assets/StatusIndicator.stories-COaZnrFa.js +0 -31
- package/storybook-static/assets/Table-BGvRn9y0.css +0 -1
- package/storybook-static/assets/Toggle-fKG2dFY0.css +0 -1
- package/storybook-static/assets/TreeTable--ZoksUiw.css +0 -1
- package/storybook-static/assets/iframe-COgZ5GwG.js +0 -1
- package/storybook-static/assets/iframe-IhWQT6NX.css +0 -1
- package/storybook-static/assets/odata-tqjAk19x.js +0 -1
- package/storybook-static/assets/odataStoryFixtures-D2yHs_jK.js +0 -25
- package/storybook-static/assets/ui-C3BskXT9.css +0 -1
- package/storybook-static/assets/ui.module-31LPbZGK.js +0 -1
- 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
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
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-
|
|
2
|
-
import { n as t } from "../chunks/button-
|
|
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-
|
|
7
|
-
import { n as d, t as f } from "../chunks/badge-
|
|
8
|
-
import { d as p, f as m } from "../chunks/input-
|
|
9
|
-
import { t as h } from "../chunks/input-search-
|
|
10
|
-
import { n as g } from "../chunks/multi-select-
|
|
11
|
-
import { t as _ } from "../chunks/table-
|
|
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";
|
package/dist/badge/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "../chunks/badge-
|
|
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-
|
|
2
|
-
import { n as t, r as n } from "../chunks/modal-
|
|
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";
|
package/dist/base-table/index.js
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/button/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "../chunks/button-
|
|
1
|
+
import { n as e, t } from "../chunks/button-DF21yxVp.js";
|
|
2
2
|
export { e as Button, t as ButtonRemove };
|
package/dist/check-box/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "../chunks/check-box-
|
|
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-
|
|
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-
|
|
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":";;;;;;;;;;;;AAMA,SAAS,EAAiB,GAAwB;CACjD,OAAO,OAAO,SAAS,CAAK,KAAK,IAAQ;AAC1C;AAMA,SAAS,EAAsB,GAA2B,GAAuC;CAChG,IAAM,IACL,EAAU,UAAU,KAAA,IAA8B,EAAU,YAAY,KAAA,IAAiD,IAArC,IAAiB,EAAU,UAA/E,EAAU;CAE3C,OAAO,EAAiB,CAAK,IAAI,KAAK,MAAM,CAAK,IAAI;AACtD;AAOA,SAAS,EAAoB,GAA0C;CACtE,IAAM,EAAE,mBAAgB,uBAAoB;CAE5C,IACC,MAAmB,KAAA,KACnB,MAAoB,KAAA,KACpB,CAAC,EAAiB,CAAc,KAChC,CAAC,EAAiB,CAAe,GAEjC;CAGD,IAAM,oBAAoB,IAAI,IAA4D;CAE1F,KAAK,IAAM,KAAa,EAAM,cAAc,CAAC,GAAG;EAC/C,IAAM,IAAiB,EAAsB,GAAW,CAAc;EAElE,MAAmB,QAAQ,EAAkB,IAAI,CAAc,KAEnE,EAAkB,IAAI,GAAgB;GACrC,KAAK,EAAU;GACf,OAAO;GACP,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAO,IAAiB,IAAmB,CAAc,CAAC;EACpF,CAAC;CACF;CAEA,IAAM,IAAa,CAAC,GAAG,EAAkB,OAAO,CAAC,CAAC,CAAC,MAAM,GAAM,MAAU,EAAK,QAAQ,EAAM,KAAK;CACjG,OAAO,EAAW,SAAS,IAAI,IAAa,KAAA;AAC7C;AAMA,SAAgB,EAAuB,GAA8C;CACpF,OAAO,EAAO,KAAK,MAAU;EAC5B,IAAM,IAAmB,EAAiB,EAAM,kBAAkB,CAAC,KAAK,EAAiB,EAAM,mBAAmB,CAAC;EAEnH,OAAO;GACN,KAAK,EAAM;GACX,KAAK,EAAM;GACX,OAAO,IAAmB,EAAM,iBAAiB,KAAA;GACjD,QAAQ,IAAmB,EAAM,kBAAkB,KAAA;GACnD,QAAQ,EAAoB,CAAK;GACjC,OAAO,EAAM,UAAU,KAAA,IAAY,EAAM,MAAM,EAAM;GACrD,aAAa,EAAM;GACnB,WAAW,EAAM;GACjB,UAAU,EAAM;EACjB;CACD,CAAC;AACF;;;AC1EA,IAAM,IAAiD;CACtD,UAAU;CACV,MAAM;CACN,OAAO;CACP,OAAO;CACP,UAAU;CACV,UAAU;CACV,cAAc;CACd,cAAc;CACd,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,cAAc;CACd,UAAU;AACX;AAGA,SAAgB,EAAyB,GAAmD;CAC3F,IAAM,IAAS;EAAE,GAAG;EAA6B,GAAG;CAAU;CAE9D,OAAO;EACN,UAAU,EAAO;EACjB,MAAM,EAAO;EACb,OAAO,EAAO;EACd,OAAO,EAAO;EACd,UAAU,EAAO;EACjB,UAAU,EAAO;EACjB,iBAAiB,EAAO;EACxB,sBAAsB,EAAO;EAC7B,WAAW,EAAO;EAClB,YAAY,EAAO;EACnB,oBAAoB,EAAO;EAC3B,mBAAmB,EAAO;EAC1B,YAAY,EAAO;EACnB,mBAAmB,EAAO;EAC1B,mBAAmB,EAAO;EAC1B,SAAS,EAAO;EAChB,iBAAiB,EAAO;EACxB,iBAAiB,EAAO;EACxB,UAAU,EAAO;CAClB;AACD;;;;;;GEZM,IAA8B;AAMpC,SAAwB,EAAmB,EAC1C,SACA,WACA,WAAQ,GACR,YACA,kBACA,aACA,UAAO,IACP,0BAAuB,IACvB,qBAAkB,IAClB,WACA,cACA,UACA,uBAC2B;CAC3B,QAAgB;EAEf,EAAiB;CAClB,GAAG,CAAC,CAAgB,CAAC;CAGrB,IAAM,IAAS,QAAc,EAAuB,CAAM,GAAG,CAAC,CAAM,CAAC,GAC/D,IAAiB,OAAO,SAAS,CAAK,IAAI,KAAK,MAAM,CAAK,IAAI,GAC9D,IAAgB,EAAO,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,GAAgB,CAAC,GAAG,EAAO,SAAS,CAAC,IAAI,GAC/F,IAAc,EAAO,MAAM,OAClB,EAAM,UAAU,KAAA,IAAY,EAAM,MAAM,EAAM,UACnB,QAAU,EAAM,gBAAgB,KAAA,KAAa,EAAM,gBAAgB,IAC5G,GACK,IAAkB,GAAU,YAAY,GACxC,IAAiB,GAAU,WAAW,EAAO,SAAS,GACtD,IAAkB,GAAU,YAAY,IACxC,IAAoB,GAAU,cAAc,IAC5C,IAAoB,GAAU,cAAc,EAAO,SAAS,GAC5D,IAAc,GAAU,QAAQ,IAChC,IAAU,QACT;EACL,GAAI,IAAkB,CAAC,CAAQ,IAAI,CAAC;EACpC,GAAI,IAAiB,CAAC,CAAO,IAAI,CAAC;EAClC,GAAI,IAAkB,CAAC,CAAQ,IAAI,CAAC;EACpC,GAAI,IAAoB,CAAC,CAAU,IAAI,CAAC;EACxC,GAAI,IAAoB,CAAC,CAAU,IAAI,CAAC;EACxC,GAAI,IAAc,CAAC,CAAI,IAAI,CAAC;CAC7B,GACA;EAAC;EAAiB;EAAgB;EAAiB;EAAmB;EAAmB;CAAW,CACrG,GACM,IAAiB,QAAc,EAAyB,CAAM,GAAG,CAAC,CAAM,CAAC,GACzE,KAAuC;EAC5C,MAAM,KAAQ,EAAO,SAAS;EAC9B,OAAO;EACP,OAAO;EACP;EACA;EACA,WAAW,EAAG,EAAO,QAAQ,CAAS;EACtC,QAAQ,EAAE,WAAW,EAAE,SAAM,EAAE;EAC/B,QAAQ;EACR,UAAU,EAAE,QAAQ,CAAC,EAAK;EAC1B,YAAY;GAAE;GAAsB;EAAgB;EACpD,UAAU,EAAE,YAAY,GAAK;EAC7B,SAAS;GACR,WAAW;GACX,WAAW,EAEV,OAAO,IAAkB,EAAE,KAAK,EAA4B,IAAI,KAAA,EACjE;EACD;EACA,YAAY,EAAE,YAAY,GAAK;EAC/B,UAAU,EACT,WAAW,EAAE,UAAO,gBAAa;GAC5B,OAAC,EAAa,CAAK,KAAK,EAAM,aAAa,KAE/C;QAAI,OAAO,EAAM,YAAa,UAAU;KACvC,EAAO,EAAM,QAAQ;KACrB;IACD;IAEA,IAAI,OAAO,EAAM,YAAa,UAAU;KACvC,EAAO,EAAM,SAAS,KAAK,EAAM,SAAS,QAAQ;KAClD;IACD;IAEA,EAAO,EAAM,GAAG;GAPhB;EAQD,EACD;EACA,IAAI,EACH,OAAO,EAAE,OAAO,QAAgB;GAC/B,AAAI,MAAc,KAAe,IAAgB,CAAS;EAC3D,EACD;EACA,QAAQ;GACP,gBAAgB,kBAAC,GAAD;IAAiB,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC7E,gBAAgB,kBAAC,GAAD;IAAkB,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC9E,iBAAiB,kBAAC,GAAD;IAAO,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GACpE,mBAAmB,kBAAC,GAAD;IAAkB,eAAY;IAAO,WAAW,EAAG,EAAO,MAAM,EAAO,WAAW;GAAI,CAAA;GACzG,iBAAiB,kBAAC,GAAD;IAAc,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC3E,kBAAkB,kBAAC,GAAD;IAAY,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC1E,mBAAmB,kBAAC,GAAD;IAAa,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC5E,2BAA2B,kBAAC,GAAD;IAAe,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GACtF,0BAA0B,kBAAC,GAAD;IAAe,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GACrF,6BAA6B,kBAAC,GAAD;IAAuB,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAChG,4BAA4B,kBAAC,GAAD;IAAuB,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GAC/F,2BAA2B,kBAAC,GAAD;IAAc,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GACrF,0BAA0B,kBAAC,GAAD;IAAiB,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;GACvF,oBAAoB,kBAAC,GAAD;IAAc,eAAY;IAAO,WAAW,EAAO;GAAO,CAAA;EAC/E;CACD;CAEA,OAAO,kBAAC,GAAD,EAAU,GAAI,GAAgB,CAAA;AACtC"}
|
package/dist/chunks/{TextEditorLexicalClient-CSXZQOYo.js → TextEditorLexicalClient-D46Zed55.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as e } from "./button-
|
|
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-
|
|
4
|
-
import { n as a } from "./input-
|
|
5
|
-
import { t as o } from "./check-box-
|
|
6
|
-
import { n as s } from "./radio-group-
|
|
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-
|
|
1443
|
+
//# sourceMappingURL=TextEditorLexicalClient-D46Zed55.js.map
|