@ryuzaki13/react-foundation-ui 1.2.15 → 1.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/radio-group-CM9Lg_nc.js.map +1 -1
- package/dist/period-select/PeriodSelect.d.ts +12 -2
- package/dist/period-select/PeriodSelect.d.ts.map +1 -1
- package/dist/period-select/index.js +39 -31
- package/dist/period-select/index.js.map +1 -1
- package/dist/period-select/lib/periodSelect.d.ts +18 -1
- package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-DPudGUPM.js → Badge-DlOE1PL3.js} +1 -1
- package/storybook-static/assets/{Badge.stories-CySszSFq.js → Badge.stories-D1bH0m9O.js} +1 -1
- package/storybook-static/assets/{Button-BCgOhtLd.js → Button-CIHP8GL5.js} +1 -1
- package/storybook-static/assets/{Button-Cioc8XN8.js → Button-CUUmqyln.js} +1 -1
- package/storybook-static/assets/{Button.stories-Ca-X2wZk.js → Button.stories-CMU3X7cj.js} +1 -1
- package/storybook-static/assets/{CheckBox-C_1_y_qK.js → CheckBox-C6zlsrBS.js} +1 -1
- package/storybook-static/assets/{CheckBox-DKky4Sm8.js → CheckBox-CBzdOOEW.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-Bo3GYhXf.js → CheckBox.stories-SKHAwilL.js} +1 -1
- package/storybook-static/assets/{Color-KMSTOMOX-Byzq56AJ.js → Color-KMSTOMOX-BlIGpnz5.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CQkCWOmg.js → ContextMenu-Dei3lMiR.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-D5Pe5K7O.js → ContextMenu.stories-S1bfdR-U.js} +1 -1
- package/storybook-static/assets/{DateInput-Gjeob0uP.js → DateInput-BExLKhNc.js} +1 -1
- package/storybook-static/assets/{DateInput-DBGCdSH5.js → DateInput-Dvc3YqPR.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-CUknz_9Y.js → DateInput.stories-BwQJw6Nk.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-D7HFhBq0.js → DateRangePresetSelect-DltIJMNV.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-C9EXy002.js → DateRangePresetSelect-tM9eTXr4.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-BT1dvYZ6.js → DateRangePresetSelect.stories-Btm2T4we.js} +1 -1
- package/storybook-static/assets/{Detail-Ch9XzeCR.js → Detail-zNlr2vao.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DADltM7f.js → Detail.stories-BCvglcDR.js} +1 -1
- package/storybook-static/assets/{Dialog-garYl1LG.js → Dialog-DcJ74IA2.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-DrhVmPDV.js → Dialog.stories-dBQuWoev.js} +1 -1
- package/storybook-static/assets/{Disclosure-CZkieq8d.js → Disclosure-rD7l-ryn.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-C5Zwfyws.js → Disclosure.stories-Cm_FGUDk.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CQrgMypq.js → DocsRenderer-JROSPFPF-BZnROPfp.js} +2 -2
- package/storybook-static/assets/{DropZone-D2adV-iu.js → DropZone-DYuLw7pf.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-BoapusnJ.js → DropZone.stories-af6iKB6z.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-LFAjhade.js → DropdownMenu-DNq8lO9a.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-CJNWaY9S.js → ExpandableActionPanel.stories-C7_h22h_.js} +1 -1
- package/storybook-static/assets/{Flex-Cse0VN8u.js → Flex-Ce9EOO1x.js} +1 -1
- package/storybook-static/assets/{Flex-DYOC7sAL.js → Flex-_4gPq6na.js} +1 -1
- package/storybook-static/assets/{Flex.stories-BiwoSTPH.js → Flex.stories-D684nCwx.js} +1 -1
- package/storybook-static/assets/{Grid-BNqNouvQ.js → Grid-BTDgF-Ab.js} +1 -1
- package/storybook-static/assets/{Grid-DyOMixwp.js → Grid-OtV6IMgW.js} +1 -1
- package/storybook-static/assets/{Grid.stories-CaN_BXma.js → Grid.stories-CzA_r82M.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-DVYZBRFp.js → ImageCropper.stories-CHtjXTYu.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-DDQvFB-L.js → ImageRenderer-Bjkod2SH.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-DCaueisy.js → ImageRenderer.stories-xD4Ew93V.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-CUwMmYMX.js → ImageView.stories-BhwDfQM6.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-K8ssHQwr.js → ImageViewer.stories-BQ-4hW_0.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-C-86ifkD.js → ImageViewerRuntime-Cf13coTe.js} +1 -1
- package/storybook-static/assets/{Input-DLp1Xuxw.js → Input-CV2ksn3v.js} +1 -1
- package/storybook-static/assets/{Input-B0WWnS8-.js → Input-DlHZzq5Y.js} +1 -1
- package/storybook-static/assets/{Input.stories-_T7lqWLB.js → Input.stories-2CI9YPCA.js} +1 -1
- package/storybook-static/assets/{InputDateTime-B56pUSY7.js → InputDateTime-oSebVboT.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-CmoN5agb.js → InputDateTime.stories-DGy4hjx5.js} +1 -1
- package/storybook-static/assets/{InputFile-CjQC4Uiz.js → InputFile-D-BOeOTf.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-CiZaLKkz.js → InputFile.stories-Dar5VpM9.js} +1 -1
- package/storybook-static/assets/{InputFiles-CCBWXGHR.js → InputFiles-BNTiJfh6.js} +1 -1
- package/storybook-static/assets/{InputFiles-B_JpXc7C.js → InputFiles-CFsYLucT.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-3f1nEfnt.js → InputFiles.stories-CxqK8_dO.js} +1 -1
- package/storybook-static/assets/{InputImage-CAL9aF33.js → InputImage-CHB0vCnN.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-qAgfOzAM.js → InputImage.stories-PtPDPSl3.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-Be6oYJGS.js → LayoutPicker-BbPL6ufg.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories--kaHXujk.js → LayoutPicker.stories-BMmWhn3o.js} +1 -1
- package/storybook-static/assets/{Listbox-BkMRJ6oY.js → Listbox-OX44W-71.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CWugqDby.js → Listbox.stories-CuOrf29F.js} +1 -1
- package/storybook-static/assets/{Modal-VTHP1-uJ.js → Modal-CQwZZAV5.js} +1 -1
- package/storybook-static/assets/{Modal.stories-B3Fl_4cE.js → Modal.stories-BmYTX9PH.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DceNb4aL.js → MultiSelect-Bn0FIcvw.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CksiHS1Y.js → MultiSelect-PRj03xAT.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-CBs3n6gv.js → MultiSelect.stories-BIojHXn-.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-CWEMg8I6.js → NotificationsHost-CQRo66d5.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BVstyHIE.js → NotificationsHost.stories-Cac6umEq.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-CiHvaVGJ.js → ODataMultiSelect-ChPI5ChL.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-BlzjynBY.js → ODataMultiSelect-D7G_-wVz.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-BT7GaQLE.js → ODataMultiSelect.stories-C7tvdLZQ.js} +1 -1
- package/storybook-static/assets/{ODataSelect-Cr4pQYI1.js → ODataSelect-Bud6EPRs.js} +1 -1
- package/storybook-static/assets/{ODataSelect-BLoDn2Ub.js → ODataSelect-DGC7M6FX.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-Dbl26XTe.js → ODataSelect.stories-9wfa4MLo.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-Cby4c-Gk.js → ODataTreeMultiSelect-BEo4THC6.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CfgGInk1.js → ODataTreeMultiSelect.stories-CdPPxYoG.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-CG8bNnL0.js → ODataTreeSelect-CINkGKF2.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-CpFCv3b9.js → ODataTreeSelect.stories-CDnr3yBr.js} +1 -1
- package/storybook-static/assets/PeriodSelect-Br5hOkEI.js +56 -0
- package/storybook-static/assets/PeriodSelect.stories-DAUswFdG.js +64 -0
- package/storybook-static/assets/{Popover-zQXQnFFL.js → Popover-CDzgXa4V.js} +1 -1
- package/storybook-static/assets/{Popover.stories-W7lIz2B6.js → Popover.stories-ClNesSyC.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DK2_y4cN.js → PresetRangeDateInput-CNoFkoLu.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-BViLBb14.js → PresetRangeDateInput.stories-BlaueL-5.js} +1 -1
- package/storybook-static/assets/{RadioButton-Yt0oZf4E.js → RadioButton-B1k9FvOR.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-D8P25EBk.js → RadioButton.stories-D8juR7Vr.js} +1 -1
- package/storybook-static/assets/{RadioGroup-YP2iYAd2.js → RadioGroup-BFsOnCa7.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CKf9WzZb.js → RadioGroup-Dyd_fnx3.js} +1 -1
- package/storybook-static/assets/RadioGroup-DzkFQ83G.css +1 -0
- package/storybook-static/assets/{RadioGroup.stories-teL45YTN.js → RadioGroup.stories-CttPwhuV.js} +1 -1
- package/storybook-static/assets/{Select-m_NZjQxo.js → Select-B51YYvpF.js} +1 -1
- package/storybook-static/assets/{Select-CPhI2DEf.js → Select-CToEwWi-.js} +1 -1
- package/storybook-static/assets/{Select.stories-DW2ASeOv.js → Select.stories-Da97qanC.js} +1 -1
- package/storybook-static/assets/{SelectOptionContent-Cz6dUsCB.js → SelectOptionContent-n8C0XOW0.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-BcQRwjYS.js → SerializableSelect-DO_D_X0t.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-Nbt0c5ng.js → SerializableSelect-bno_aDnV.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-5b1p6hng.js → SerializableSelect.stories-BrC_EWfJ.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-D6ZC9JpP.js → SingleDateTimeInput-PhaFkr5D.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BgzkQbkx.js → SingleDateTimeInput.stories-D7qhYGWm.js} +1 -1
- package/storybook-static/assets/{Slider-C9Z6txLW.js → Slider-BjAqpKKW.js} +1 -1
- package/storybook-static/assets/{Slider.stories-Bdo3_1nw.js → Slider.stories-D3bBV7fZ.js} +1 -1
- package/storybook-static/assets/{SliderInput-DmbajIqV.js → SliderInput-gsJCguhM.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-rYLzdKpu.js → SliderInput.stories-B1BFbny4.js} +1 -1
- package/storybook-static/assets/{Sortable-CCch31vS.js → Sortable-Cb0bGLdt.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-Cu3zI5h9.js → Sortable.stories-CSbebwRr.js} +1 -1
- package/storybook-static/assets/{Splitter-BR8joAqy.js → Splitter-DU8KgKee.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Bb99GQy0.js → Splitter.stories-CAIjEYhd.js} +1 -1
- package/storybook-static/assets/{StateSelect-C5teWzIJ.js → StateSelect-C8firqxE.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-C2IUonaW.js → StateSelect.stories-l0hf_pvW.js} +1 -1
- package/storybook-static/assets/{Switch-Cs48CpN6.js → Switch-DRXTkuo_.js} +1 -1
- package/storybook-static/assets/{Switch.stories-Dmv2GoIE.js → Switch.stories-DZuqAeZh.js} +1 -1
- package/storybook-static/assets/{Table-D55A8YRw.js → Table-DsR5b5Wc.js} +1 -1
- package/storybook-static/assets/{Table.stories-BpXSCglO.js → Table.stories-CCFmQuZ0.js} +1 -1
- package/storybook-static/assets/{Tabs-D3e7tAEn.js → Tabs-qpvOS6hB.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-C4EvmBpl.js → Tabs.stories-BWWxpgIH.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-BMj7neM4.js → TagInput.stories-86z8Isqk.js} +1 -1
- package/storybook-static/assets/{Textarea-BVs8Ri47.js → Textarea-BfY3eqft.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-EwmwDVzx.js → Textarea.stories-iJ51BBwG.js} +1 -1
- package/storybook-static/assets/{TimePanel-CctgF-Ba.js → TimePanel-D6XkjW1u.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-1Dtp0mYJ.js → TimePanel.stories-DnMrhK0T.js} +1 -1
- package/storybook-static/assets/{Toggle-rD-lp1O7.js → Toggle-BThNScPL.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-C10m-ZA8.js → Toggle.stories-D8OUfUhn.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-C27k2fak.js → TreeMultiSelect-CAacpNty.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CgHeDrIO.js → TreeMultiSelect-DHQk6qbq.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-ciaCVIUg.js → TreeMultiSelect.stories-b_DL4tYH.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-DqF5FvNY.js → TreePickerBase-Cw_OuAIE.js} +1 -1
- package/storybook-static/assets/{TreeSelect-D-FubCvR.js → TreeSelect-BJzeENxO.js} +1 -1
- package/storybook-static/assets/{TreeSelect-Bv_3N7qS.js → TreeSelect-CXGfHd25.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-Cnyjx3Cr.js → TreeSelect.stories-D8It7ooF.js} +1 -1
- package/storybook-static/assets/{TreeTable-Dakv6rya.js → TreeTable-B34oKMD_.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DqdpfiaO.js → TreeTable.stories-B1Jvm6tF.js} +1 -1
- package/storybook-static/assets/{WithTooltip-7X4HQR7L-Cpew3aNg.js → WithTooltip-7X4HQR7L-D3seWjv7.js} +1 -1
- package/storybook-static/assets/{async-CBST-rZJ.js → async-BF6xXX6d.js} +1 -1
- package/storybook-static/assets/{base-table-DiV3aUkm.js → base-table-YB9g-nh2.js} +1 -1
- package/storybook-static/assets/{blocks-DxtpVRwM.js → blocks-DL53U25u.js} +6 -6
- package/storybook-static/assets/{button-BPrqDvuC.js → button-hDHY9UNC.js} +1 -1
- package/storybook-static/assets/{check-box-DwrLBs8K.js → check-box-CnAwa9Vf.js} +1 -1
- package/storybook-static/assets/{chunk-3LY4VQVK-CLQHTufZ.js → chunk-3LY4VQVK-ib5HhImT.js} +1 -1
- package/storybook-static/assets/{chunk-LITCR56V-DMdBikCE.js → chunk-LITCR56V-DEXp-tCY.js} +1 -1
- package/storybook-static/assets/{contextMenu-_I6pGXYT.js → contextMenu-CaS_hyuj.js} +1 -1
- package/storybook-static/assets/{date-CQ9wheTT.js → date-CQQLfg61.js} +1 -1
- package/storybook-static/assets/{error-CNPNEAVP.js → error-Ccue1ygz.js} +1 -1
- package/storybook-static/assets/{file-DjJWNuBz.js → file-GxZfZD3a.js} +1 -1
- package/storybook-static/assets/{flex-CQVMFWMW.js → flex-Nc707d8E.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-C3rg5XLp.js → floating-ui.react-DXtlkQ0E.js} +1 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-1Z_S6_cP.js +1 -0
- package/storybook-static/assets/{formatters-BsP6CA0a.js → formatters-CBKXGdxW.js} +1 -1
- package/storybook-static/assets/{formulas-DK4vpKA_.js → formulas-CBG-Fv2U.js} +1 -1
- package/storybook-static/assets/grid-B5wFuI9b.js +1 -0
- package/storybook-static/assets/{hooks-CVLEDvfo.js → hooks-DthAIzhv.js} +1 -1
- package/storybook-static/assets/{iframe-BTDZjw05.js → iframe-BELJUFEG.js} +3 -3
- package/storybook-static/assets/{input-DD29rPF2.js → input-jMKpHvI6.js} +1 -1
- package/storybook-static/assets/{mdx-react-shim-CMkpiwEc.js → mdx-react-shim-BohxAhrB.js} +1 -1
- package/storybook-static/assets/{media-DNbfoulg.js → media-DC-_2IME.js} +1 -1
- package/storybook-static/assets/{misc-C0wxz-AU.js → misc-D24pROUZ.js} +1 -1
- package/storybook-static/assets/{notifications-B3BSUy0j.js → notifications-BkXYacfr.js} +1 -1
- package/storybook-static/assets/{number-RnQqsbNa.js → number-BIdRgNp3.js} +1 -1
- package/storybook-static/assets/{odata-DtsLX2ND.js → odata-BKwXeura.js} +1 -1
- package/storybook-static/assets/odata-service-BmiAbJ1W.js +1 -0
- package/storybook-static/assets/{odataFetchFn-DKHdlA48.js → odataFetchFn-DehEn_bI.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-DRl-0jvY.js → odataStoryFixtures-VAWqB9aU.js} +1 -1
- package/storybook-static/assets/{persisted-DBno8ICw.js → persisted-DK9mlKQF.js} +1 -1
- package/storybook-static/assets/{picker-BekQHdO_.js → picker-CVajfHNv.js} +1 -1
- package/storybook-static/assets/{popover-nKXcgOys.js → popover-Cf9VbxYF.js} +1 -1
- package/storybook-static/assets/{preset-select-CPLTHazi.js → preset-select-BjRx7pJj.js} +1 -1
- package/storybook-static/assets/{pwa-BP4Qxdcf.js → pwa-DxzxLP5W.js} +1 -1
- package/storybook-static/assets/{queryClient-D8_xdGZ2.js → queryClient-c_JPM4tX.js} +1 -1
- package/storybook-static/assets/{react-18-BY7O2bU-.js → react-18-BRqN5uvA.js} +1 -1
- package/storybook-static/assets/{react-dom-BBNjM9Mb.js → react-dom-CKN5ltzP.js} +1 -1
- package/storybook-static/assets/{react-_DDQf-KJ.js → react-n0X4LXhO.js} +1 -1
- package/storybook-static/assets/select-BnceydtW.js +1 -0
- package/storybook-static/assets/{slider-C94P2mzP.js → slider-BZHvrngb.js} +1 -1
- package/storybook-static/assets/{sortable-Bciuck7B.js → sortable-aZCd2eNR.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-D4jCnS_i.js → syntaxhighlighter-RTCFPKCB-DCDHKlJe.js} +1 -1
- package/storybook-static/assets/{text-DR70nwXc.js → text-DBP6Nk-L.js} +1 -1
- package/storybook-static/assets/{theming-CzVm4PtY.js → theming-B1wx0Umg.js} +1 -1
- package/storybook-static/assets/ui-n-ZQCOmF.js +1 -0
- package/storybook-static/assets/{useODataSelectBase-D8bA7nx-.js → useODataSelectBase-6ldkptA_.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-CtDrXYzn.js → useODataTreeData-BR4Hub8F.js} +1 -1
- package/storybook-static/assets/{utils-C8AvFbMG.js → utils-BWfd4Vbj.js} +1 -1
- package/storybook-static/assets/{valueState-n2Sm8Yt_.js → valueState-BUyTcaAU.js} +1 -1
- package/storybook-static/iframe.html +1 -1
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/PeriodSelect-LNejclnW.js +0 -51
- package/storybook-static/assets/PeriodSelect.stories-7MgS4zdv.js +0 -47
- package/storybook-static/assets/RadioGroup-DSogQ0Gh.css +0 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-BQMDlvN_.js +0 -1
- package/storybook-static/assets/grid-nZIniTeh.js +0 -1
- package/storybook-static/assets/odata-service-B63qvxEy.js +0 -1
- package/storybook-static/assets/select-BDiqR6E9.js +0 -1
- package/storybook-static/assets/ui-CbXWeydL.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group-CM9Lg_nc.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-info-on-fill);\n\t\tbackground-color: var(--status-info-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radio-group-CM9Lg_nc.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-info-on-fill);\n\t\tbackground-color: var(--status-info-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import { type PeriodSelectOption, type PeriodSelectPresetId } from "./lib";
|
|
1
|
+
import { type PeriodSelectLabels, type PeriodSelectOption, type PeriodSelectPresetId } from "./lib";
|
|
2
2
|
import type { UiBaseProps } from "../types";
|
|
3
3
|
import type { DateRangeInput } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
4
4
|
export interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption["id"] | undefined> {
|
|
5
|
+
/**
|
|
6
|
+
* Полный список custom options с высшим приоритетом. При его передаче
|
|
7
|
+
* встроенные `presetIds`, `labels` и пороги диапазона не применяются.
|
|
8
|
+
*/
|
|
5
9
|
options?: readonly PeriodSelectOption[];
|
|
10
|
+
/**
|
|
11
|
+
* Частично заменяет подписи встроенных вариантов, не изменяя их id,
|
|
12
|
+
* канонический порядок и правила доступности.
|
|
13
|
+
* Не применяется, когда передан собственный `options`.
|
|
14
|
+
*/
|
|
15
|
+
labels?: Partial<PeriodSelectLabels>;
|
|
6
16
|
/**
|
|
7
17
|
* Разрешенные встроенные варианты периода. Значение нормализуется в канонический
|
|
8
18
|
* порядок, а пустой либо невалидный список безопасно заменяется полным набором.
|
|
@@ -16,5 +26,5 @@ export interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption["id"]
|
|
|
16
26
|
/**
|
|
17
27
|
* Select периода детализации, который может ограничивать доступные варианты по диапазону дат.
|
|
18
28
|
*/
|
|
19
|
-
export declare function PeriodSelect({ value, onChange, options, presetIds, dateRange, maxDayRangeDays, maxWeekRangeWeeks, ...props }: PeriodSelectProps): import("react").JSX.Element;
|
|
29
|
+
export declare function PeriodSelect({ value, onChange, options, labels, presetIds, dateRange, maxDayRangeDays, maxWeekRangeWeeks, ...props }: PeriodSelectProps): import("react").JSX.Element;
|
|
20
30
|
//# sourceMappingURL=PeriodSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeriodSelect.d.ts","sourceRoot":"","sources":["../../src/period-select/PeriodSelect.tsx"],"names":[],"mappings":"AAIA,OAAO,EAMN,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,MAAM,WAAW,iBAAkB,SAAQ,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3F,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,GAAG,KAAK,EACR,EAAE,iBAAiB,+BAqDnB"}
|
|
1
|
+
{"version":3,"file":"PeriodSelect.d.ts","sourceRoot":"","sources":["../../src/period-select/PeriodSelect.tsx"],"names":[],"mappings":"AAIA,OAAO,EAMN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,MAAM,WAAW,iBAAkB,SAAQ,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3F;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,GAAG,KAAK,EACR,EAAE,iBAAiB,+BAqDnB"}
|
|
@@ -44,15 +44,21 @@ function C(e, t = _) {
|
|
|
44
44
|
function w(e) {
|
|
45
45
|
return b(e) ? e : "day";
|
|
46
46
|
}
|
|
47
|
-
function T({ maxDayRangeDays: e, maxWeekRangeWeeks: t } = {}) {
|
|
48
|
-
let
|
|
49
|
-
return _.map((e) =>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
function T({ maxDayRangeDays: e, maxWeekRangeWeeks: t, labels: n } = {}) {
|
|
48
|
+
let r = c(e), i = c(t);
|
|
49
|
+
return _.map((e) => {
|
|
50
|
+
let t = {
|
|
51
|
+
...e,
|
|
52
|
+
label: n?.[e.id] ?? e.label
|
|
53
|
+
};
|
|
54
|
+
return e.id === "day" && r !== void 0 ? {
|
|
55
|
+
...t,
|
|
56
|
+
maxRangeDays: r
|
|
57
|
+
} : e.id === "week" && i !== void 0 ? {
|
|
58
|
+
...t,
|
|
59
|
+
maxRangeDays: i * 7
|
|
60
|
+
} : t;
|
|
61
|
+
});
|
|
56
62
|
}
|
|
57
63
|
function E(e, t) {
|
|
58
64
|
let n = c(e.maxRangeDays);
|
|
@@ -75,38 +81,40 @@ function O(e) {
|
|
|
75
81
|
}
|
|
76
82
|
//#endregion
|
|
77
83
|
//#region src/period-select/PeriodSelect.tsx
|
|
78
|
-
function k({ value: o, onChange: s, options: c,
|
|
79
|
-
let
|
|
80
|
-
maxDayRangeDays:
|
|
81
|
-
maxWeekRangeWeeks:
|
|
84
|
+
function k({ value: o, onChange: s, options: c, labels: l, presetIds: u, dateRange: d, maxDayRangeDays: f, maxWeekRangeWeeks: p, ...m }) {
|
|
85
|
+
let h = r(() => c ?? S(x(u), T({
|
|
86
|
+
maxDayRangeDays: f,
|
|
87
|
+
maxWeekRangeWeeks: p,
|
|
88
|
+
labels: l
|
|
82
89
|
})), [
|
|
83
|
-
|
|
90
|
+
l,
|
|
84
91
|
f,
|
|
92
|
+
p,
|
|
85
93
|
c,
|
|
86
|
-
|
|
87
|
-
]),
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
u
|
|
95
|
+
]), g = r(() => D(o, h, d), [
|
|
96
|
+
d,
|
|
97
|
+
h,
|
|
90
98
|
o
|
|
91
|
-
]),
|
|
92
|
-
if (
|
|
93
|
-
|
|
99
|
+
]), _ = i(null), v = n(() => {
|
|
100
|
+
if (g === void 0 || g === o) {
|
|
101
|
+
_.current = null;
|
|
94
102
|
return;
|
|
95
103
|
}
|
|
96
|
-
let e =
|
|
97
|
-
e && e.value === o && e.availableValue ===
|
|
104
|
+
let e = _.current;
|
|
105
|
+
e && e.value === o && e.availableValue === g || (_.current = {
|
|
98
106
|
value: o,
|
|
99
|
-
availableValue:
|
|
100
|
-
}, s(
|
|
107
|
+
availableValue: g
|
|
108
|
+
}, s(g));
|
|
101
109
|
});
|
|
102
110
|
return t(() => {
|
|
103
|
-
|
|
104
|
-
}, [
|
|
105
|
-
...
|
|
106
|
-
options:
|
|
107
|
-
value:
|
|
111
|
+
v();
|
|
112
|
+
}, [g, o]), /* @__PURE__ */ a(e, {
|
|
113
|
+
...m,
|
|
114
|
+
options: h,
|
|
115
|
+
value: g,
|
|
108
116
|
onChange: s,
|
|
109
|
-
getOptionDisabled: (e) => E(e,
|
|
117
|
+
getOptionDisabled: (e) => E(e, d)
|
|
110
118
|
});
|
|
111
119
|
}
|
|
112
120
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/period-select/lib/constants.ts","../../src/period-select/lib/periodSelect.ts","../../src/period-select/PeriodSelect.tsx"],"sourcesContent":["export const PERIOD_SELECT_COMPONENT_ID = \"period-select\";\n","import {\n\tcountCalendarDaysInDateRange,\n\ttype DateRangeInput,\n\tnormalizeText,\n\ttoPositiveInteger\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\nimport { isRecord } from \"@ryuzaki13/react-foundation-lib/validators\";\n\n/**\n * Идентификаторы встроенных уровней детализации периода.\n */\nexport type PeriodSelectPresetId = \"day\" | \"week\" | \"month\" | \"year\";\nexport type PeriodSelectId = PeriodSelectPresetId | (string & {});\n\nexport interface PeriodSelectOption extends PresetOption<PeriodSelectId> {\n\tmaxRangeDays?: number;\n}\n\ntype BuiltInPeriodSelectOption = PeriodSelectOption & {\n\tid: PeriodSelectPresetId;\n};\n\nexport type PeriodSelectDateRangeConnectors = Readonly<{\n\tstart: string;\n\tend: string;\n}>;\n\nexport type PeriodSelectThresholds = {\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n};\n\nexport const DEFAULT_PERIOD_SELECT_PRESET_ID = \"day\" satisfies PeriodSelectPresetId;\nexport const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;\nexport const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;\n\n/**\n * Канонический каталог встроенных вариантов. Порядок элементов задает порядок\n * отображения и автоматического перехода к следующему доступному уровню.\n */\nexport const PERIOD_SELECT_OPTIONS: readonly BuiltInPeriodSelectOption[] = Object.freeze([\n\t{\n\t\tid: \"day\",\n\t\tlabel: \"по дням\"\n\t},\n\t{\n\t\tid: \"week\",\n\t\tlabel: \"по неделям\"\n\t},\n\t{\n\t\tid: \"month\",\n\t\tlabel: \"по месяцам\"\n\t},\n\t{\n\t\tid: \"year\",\n\t\tlabel: \"по годам\"\n\t}\n]);\n\n/**\n * Полный набор встроенных вариантов, доступный при отсутствии явного allow-list.\n */\nexport const DEFAULT_PERIOD_SELECT_PRESET_IDS = Object.freeze([\n\t\"day\",\n\t\"week\",\n\t\"month\",\n\t\"year\"\n] as const satisfies readonly PeriodSelectPresetId[]);\n\nconst PERIOD_SELECT_PRESET_ID_SET: ReadonlySet<string> = new Set(PERIOD_SELECT_OPTIONS.map((option) => option.id));\n\nexport function isPeriodSelectPresetId(value: unknown): value is PeriodSelectPresetId {\n\treturn typeof value === \"string\" && PERIOD_SELECT_PRESET_ID_SET.has(value);\n}\n\nexport function normalizePeriodSelectPresetIds(\n\tvalue: unknown,\n\tfallbackIds: readonly PeriodSelectPresetId[] = DEFAULT_PERIOD_SELECT_PRESET_IDS\n): PeriodSelectPresetId[] {\n\tconst normalizedIds = normalizePresetIds(value, isPeriodSelectPresetId, fallbackIds);\n\tconst resolvedIds = normalizedIds.length > 0 ? normalizedIds : DEFAULT_PERIOD_SELECT_PRESET_IDS;\n\tconst resolvedIdSet = new Set<PeriodSelectPresetId>(resolvedIds);\n\n\t// Порядок runtime-опций является частью контракта: конфигурация только ограничивает\n\t// каталог и не может переставить уровни либо оставить контрол без вариантов.\n\treturn DEFAULT_PERIOD_SELECT_PRESET_IDS.filter((presetId) => resolvedIdSet.has(presetId));\n}\n\nexport function resolvePeriodSelectOptionsByIds(\n\tpresetIds: readonly PeriodSelectOption[\"id\"][],\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\nexport function getPeriodSelectOption(\n\tid: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption | null {\n\treturn getPresetOption(id, options);\n}\n\nexport function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId {\n\treturn isPeriodSelectPresetId(value) ? value : DEFAULT_PERIOD_SELECT_PRESET_ID;\n}\n\nexport function createPeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks }: PeriodSelectThresholds = {}): PeriodSelectOption[] {\n\tconst dayLimit = toPositiveInteger(maxDayRangeDays);\n\tconst weekLimit = toPositiveInteger(maxWeekRangeWeeks);\n\n\treturn PERIOD_SELECT_OPTIONS.map((option) => {\n\t\tif (option.id === \"day\" && dayLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...option,\n\t\t\t\tmaxRangeDays: dayLimit\n\t\t\t};\n\t\t}\n\n\t\tif (option.id === \"week\" && weekLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...option,\n\t\t\t\tmaxRangeDays: weekLimit * 7\n\t\t\t};\n\t\t}\n\n\t\treturn { ...option };\n\t});\n}\n\nexport function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean {\n\tconst maxRangeDays = toPositiveInteger(option.maxRangeDays);\n\tif (maxRangeDays === undefined || dateRange === undefined) {\n\t\treturn false;\n\t}\n\n\tconst rangeDays = countCalendarDaysInDateRange(dateRange);\n\treturn rangeDays !== null && rangeDays > maxRangeDays;\n}\n\nexport function resolvePeriodSelectAvailableValue(\n\tvalue: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[],\n\tdateRange: DateRangeInput | undefined\n): PeriodSelectOption[\"id\"] | undefined {\n\tif (options.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst selectedIndex = value === undefined ? -1 : options.findIndex((option) => option.id === value);\n\tconst selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n\tif (selectedOption && !isPeriodSelectOptionDisabled(selectedOption, dateRange)) {\n\t\treturn selectedOption.id;\n\t}\n\n\tconst nextOptions = selectedIndex >= 0 ? options.slice(selectedIndex + 1) : options;\n\tconst nextAvailableOption = nextOptions.find((option) => !isPeriodSelectOptionDisabled(option, dateRange));\n\n\treturn nextAvailableOption?.id ?? options.find((option) => !isPeriodSelectOptionDisabled(option, dateRange))?.id;\n}\n\nexport function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst startConnector = normalizeText(value.start);\n\tconst endConnector = normalizeText(value.end);\n\n\treturn startConnector && endConnector ? { start: startConnector, end: endConnector } : undefined;\n}\n","import { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tcreatePeriodSelectOptions,\n\tisPeriodSelectOptionDisabled,\n\tnormalizePeriodSelectPresetIds,\n\tresolvePeriodSelectAvailableValue,\n\tresolvePeriodSelectOptionsByIds,\n\ttype PeriodSelectOption,\n\ttype PeriodSelectPresetId\n} from \"./lib\";\n\nimport type { UiBaseProps } from \"../types\";\nimport type { DateRangeInput } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption[\"id\"] | undefined> {\n\toptions?: readonly PeriodSelectOption[];\n\t/**\n\t * Разрешенные встроенные варианты периода. Значение нормализуется в канонический\n\t * порядок, а пустой либо невалидный список безопасно заменяется полным набором.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tpresetIds?: readonly PeriodSelectPresetId[];\n\tdateRange?: DateRangeInput;\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n}\n\n/**\n * Select периода детализации, который может ограничивать доступные варианты по диапазону дат.\n */\nexport function PeriodSelect({\n\tvalue,\n\tonChange,\n\toptions,\n\tpresetIds,\n\tdateRange,\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\t...props\n}: PeriodSelectProps) {\n\tconst resolvedOptions = useMemo(\n\t\t() =>\n\t\t\toptions ??\n\t\t\tresolvePeriodSelectOptionsByIds(\n\t\t\t\tnormalizePeriodSelectPresetIds(presetIds),\n\t\t\t\tcreatePeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks })\n\t\t\t),\n\t\t[maxDayRangeDays, maxWeekRangeWeeks, options, presetIds]\n\t);\n\tconst availableValue = useMemo(\n\t\t() => resolvePeriodSelectAvailableValue(value, resolvedOptions, dateRange),\n\t\t[dateRange, resolvedOptions, value]\n\t);\n\tconst lastEmittedTransitionRef = useRef<{\n\t\tvalue: PeriodSelectOption[\"id\"] | undefined;\n\t\tavailableValue: PeriodSelectOption[\"id\"] | undefined;\n\t} | null>(null);\n\n\tconst emitAvailableValue = useEffectEvent(() => {\n\t\tif (availableValue === undefined || availableValue === value) {\n\t\t\t// После принятия controlled-значения либо временной блокировки всех опций\n\t\t\t// такой же переход должен снова стать допустимым при следующем изменении условий.\n\t\t\tlastEmittedTransitionRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastTransition = lastEmittedTransitionRef.current;\n\t\tif (lastTransition && lastTransition.value === value && lastTransition.availableValue === availableValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tlastEmittedTransitionRef.current = { value, availableValue };\n\n\t\t// Сигнатура перехода защищает reconciliation от повтора в React StrictMode.\n\t\t// При временной блокировке всех опций внешний controlled-id сохраняется,\n\t\t// поэтому выбор восстановится без потери runtime-параметра после смены диапазона.\n\t\tonChange(availableValue);\n\t});\n\n\tuseEffect(() => {\n\t\temitAvailableValue();\n\t}, [availableValue, value]);\n\n\treturn (\n\t\t<PresetSelect\n\t\t\t{...props}\n\t\t\toptions={resolvedOptions}\n\t\t\tvalue={availableValue}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionDisabled={(option) => isPeriodSelectOptionDisabled(option, dateRange)}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/period-select/lib/constants.ts","../../src/period-select/lib/periodSelect.ts","../../src/period-select/PeriodSelect.tsx"],"sourcesContent":["export const PERIOD_SELECT_COMPONENT_ID = \"period-select\";\n","import {\n\tcountCalendarDaysInDateRange,\n\ttype DateRangeInput,\n\tnormalizeText,\n\ttoPositiveInteger\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getPresetOption, normalizePresetIds, type PresetOption, resolvePresetOptionsByIds } from \"@ryuzaki13/react-foundation-lib/presets\";\nimport { isRecord } from \"@ryuzaki13/react-foundation-lib/validators\";\n\n/**\n * Идентификаторы встроенных уровней детализации периода.\n */\nexport type PeriodSelectPresetId = \"day\" | \"week\" | \"month\" | \"year\";\nexport type PeriodSelectId = PeriodSelectPresetId | (string & {});\n\n/**\n * Полный типизированный набор подписей встроенных уровней детализации.\n * Потребитель может передать его частично, сохранив канонические подписи\n * для всех отсутствующих ключей.\n */\nexport type PeriodSelectLabels = Readonly<Record<PeriodSelectPresetId, string>>;\n\nexport interface PeriodSelectOption extends PresetOption<PeriodSelectId> {\n\tmaxRangeDays?: number;\n}\n\ntype BuiltInPeriodSelectOption = PeriodSelectOption & {\n\tid: PeriodSelectPresetId;\n};\n\nexport type PeriodSelectDateRangeConnectors = Readonly<{\n\tstart: string;\n\tend: string;\n}>;\n\nexport type PeriodSelectThresholds = {\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n};\n\n/**\n * Настройки формирования встроенных options. `labels` изменяет только\n * отображаемый текст и не влияет на id, порядок или ограничения диапазона.\n */\nexport type PeriodSelectOptionsConfig = PeriodSelectThresholds & {\n\tlabels?: Partial<PeriodSelectLabels>;\n};\n\nexport const DEFAULT_PERIOD_SELECT_PRESET_ID = \"day\" satisfies PeriodSelectPresetId;\nexport const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;\nexport const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;\n\n/**\n * Канонический каталог встроенных вариантов. Порядок элементов задает порядок\n * отображения и автоматического перехода к следующему доступному уровню.\n */\nexport const PERIOD_SELECT_OPTIONS: readonly BuiltInPeriodSelectOption[] = Object.freeze([\n\t{\n\t\tid: \"day\",\n\t\tlabel: \"по дням\"\n\t},\n\t{\n\t\tid: \"week\",\n\t\tlabel: \"по неделям\"\n\t},\n\t{\n\t\tid: \"month\",\n\t\tlabel: \"по месяцам\"\n\t},\n\t{\n\t\tid: \"year\",\n\t\tlabel: \"по годам\"\n\t}\n]);\n\n/**\n * Полный набор встроенных вариантов, доступный при отсутствии явного allow-list.\n */\nexport const DEFAULT_PERIOD_SELECT_PRESET_IDS = Object.freeze([\n\t\"day\",\n\t\"week\",\n\t\"month\",\n\t\"year\"\n] as const satisfies readonly PeriodSelectPresetId[]);\n\nconst PERIOD_SELECT_PRESET_ID_SET: ReadonlySet<string> = new Set(PERIOD_SELECT_OPTIONS.map((option) => option.id));\n\nexport function isPeriodSelectPresetId(value: unknown): value is PeriodSelectPresetId {\n\treturn typeof value === \"string\" && PERIOD_SELECT_PRESET_ID_SET.has(value);\n}\n\nexport function normalizePeriodSelectPresetIds(\n\tvalue: unknown,\n\tfallbackIds: readonly PeriodSelectPresetId[] = DEFAULT_PERIOD_SELECT_PRESET_IDS\n): PeriodSelectPresetId[] {\n\tconst normalizedIds = normalizePresetIds(value, isPeriodSelectPresetId, fallbackIds);\n\tconst resolvedIds = normalizedIds.length > 0 ? normalizedIds : DEFAULT_PERIOD_SELECT_PRESET_IDS;\n\tconst resolvedIdSet = new Set<PeriodSelectPresetId>(resolvedIds);\n\n\t// Порядок runtime-опций является частью контракта: конфигурация только ограничивает\n\t// каталог и не может переставить уровни либо оставить контрол без вариантов.\n\treturn DEFAULT_PERIOD_SELECT_PRESET_IDS.filter((presetId) => resolvedIdSet.has(presetId));\n}\n\nexport function resolvePeriodSelectOptionsByIds(\n\tpresetIds: readonly PeriodSelectOption[\"id\"][],\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption[] {\n\treturn resolvePresetOptionsByIds(presetIds, options);\n}\n\nexport function getPeriodSelectOption(\n\tid: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[] = PERIOD_SELECT_OPTIONS\n): PeriodSelectOption | null {\n\treturn getPresetOption(id, options);\n}\n\nexport function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId {\n\treturn isPeriodSelectPresetId(value) ? value : DEFAULT_PERIOD_SELECT_PRESET_ID;\n}\n\n/**\n * Создает независимый список встроенных options с порогами доступности и\n * частичными подписями потребителя поверх канонического каталога.\n */\nexport function createPeriodSelectOptions({\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\tlabels\n}: PeriodSelectOptionsConfig = {}): PeriodSelectOption[] {\n\tconst dayLimit = toPositiveInteger(maxDayRangeDays);\n\tconst weekLimit = toPositiveInteger(maxWeekRangeWeeks);\n\n\treturn PERIOD_SELECT_OPTIONS.map((option) => {\n\t\tconst resolvedOption = {\n\t\t\t...option,\n\t\t\tlabel: labels?.[option.id] ?? option.label\n\t\t};\n\n\t\tif (option.id === \"day\" && dayLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...resolvedOption,\n\t\t\t\tmaxRangeDays: dayLimit\n\t\t\t};\n\t\t}\n\n\t\tif (option.id === \"week\" && weekLimit !== undefined) {\n\t\t\treturn {\n\t\t\t\t...resolvedOption,\n\t\t\t\tmaxRangeDays: weekLimit * 7\n\t\t\t};\n\t\t}\n\n\t\treturn resolvedOption;\n\t});\n}\n\nexport function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean {\n\tconst maxRangeDays = toPositiveInteger(option.maxRangeDays);\n\tif (maxRangeDays === undefined || dateRange === undefined) {\n\t\treturn false;\n\t}\n\n\tconst rangeDays = countCalendarDaysInDateRange(dateRange);\n\treturn rangeDays !== null && rangeDays > maxRangeDays;\n}\n\nexport function resolvePeriodSelectAvailableValue(\n\tvalue: PeriodSelectOption[\"id\"] | undefined,\n\toptions: readonly PeriodSelectOption[],\n\tdateRange: DateRangeInput | undefined\n): PeriodSelectOption[\"id\"] | undefined {\n\tif (options.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst selectedIndex = value === undefined ? -1 : options.findIndex((option) => option.id === value);\n\tconst selectedOption = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n\tif (selectedOption && !isPeriodSelectOptionDisabled(selectedOption, dateRange)) {\n\t\treturn selectedOption.id;\n\t}\n\n\tconst nextOptions = selectedIndex >= 0 ? options.slice(selectedIndex + 1) : options;\n\tconst nextAvailableOption = nextOptions.find((option) => !isPeriodSelectOptionDisabled(option, dateRange));\n\n\treturn nextAvailableOption?.id ?? options.find((option) => !isPeriodSelectOptionDisabled(option, dateRange))?.id;\n}\n\nexport function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst startConnector = normalizeText(value.start);\n\tconst endConnector = normalizeText(value.end);\n\n\treturn startConnector && endConnector ? { start: startConnector, end: endConnector } : undefined;\n}\n","import { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { PresetSelect } from \"../preset-select\";\n\nimport {\n\tcreatePeriodSelectOptions,\n\tisPeriodSelectOptionDisabled,\n\tnormalizePeriodSelectPresetIds,\n\tresolvePeriodSelectAvailableValue,\n\tresolvePeriodSelectOptionsByIds,\n\ttype PeriodSelectLabels,\n\ttype PeriodSelectOption,\n\ttype PeriodSelectPresetId\n} from \"./lib\";\n\nimport type { UiBaseProps } from \"../types\";\nimport type { DateRangeInput } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\nexport interface PeriodSelectProps extends UiBaseProps<PeriodSelectOption[\"id\"] | undefined> {\n\t/**\n\t * Полный список custom options с высшим приоритетом. При его передаче\n\t * встроенные `presetIds`, `labels` и пороги диапазона не применяются.\n\t */\n\toptions?: readonly PeriodSelectOption[];\n\t/**\n\t * Частично заменяет подписи встроенных вариантов, не изменяя их id,\n\t * канонический порядок и правила доступности.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tlabels?: Partial<PeriodSelectLabels>;\n\t/**\n\t * Разрешенные встроенные варианты периода. Значение нормализуется в канонический\n\t * порядок, а пустой либо невалидный список безопасно заменяется полным набором.\n\t * Не применяется, когда передан собственный `options`.\n\t */\n\tpresetIds?: readonly PeriodSelectPresetId[];\n\tdateRange?: DateRangeInput;\n\tmaxDayRangeDays?: number;\n\tmaxWeekRangeWeeks?: number;\n}\n\n/**\n * Select периода детализации, который может ограничивать доступные варианты по диапазону дат.\n */\nexport function PeriodSelect({\n\tvalue,\n\tonChange,\n\toptions,\n\tlabels,\n\tpresetIds,\n\tdateRange,\n\tmaxDayRangeDays,\n\tmaxWeekRangeWeeks,\n\t...props\n}: PeriodSelectProps) {\n\tconst resolvedOptions = useMemo(\n\t\t() =>\n\t\t\toptions ??\n\t\t\tresolvePeriodSelectOptionsByIds(\n\t\t\t\tnormalizePeriodSelectPresetIds(presetIds),\n\t\t\t\tcreatePeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks, labels })\n\t\t\t),\n\t\t[labels, maxDayRangeDays, maxWeekRangeWeeks, options, presetIds]\n\t);\n\tconst availableValue = useMemo(\n\t\t() => resolvePeriodSelectAvailableValue(value, resolvedOptions, dateRange),\n\t\t[dateRange, resolvedOptions, value]\n\t);\n\tconst lastEmittedTransitionRef = useRef<{\n\t\tvalue: PeriodSelectOption[\"id\"] | undefined;\n\t\tavailableValue: PeriodSelectOption[\"id\"] | undefined;\n\t} | null>(null);\n\n\tconst emitAvailableValue = useEffectEvent(() => {\n\t\tif (availableValue === undefined || availableValue === value) {\n\t\t\t// После принятия controlled-значения либо временной блокировки всех опций\n\t\t\t// такой же переход должен снова стать допустимым при следующем изменении условий.\n\t\t\tlastEmittedTransitionRef.current = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastTransition = lastEmittedTransitionRef.current;\n\t\tif (lastTransition && lastTransition.value === value && lastTransition.availableValue === availableValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tlastEmittedTransitionRef.current = { value, availableValue };\n\n\t\t// Сигнатура перехода защищает reconciliation от повтора в React StrictMode.\n\t\t// При временной блокировке всех опций внешний controlled-id сохраняется,\n\t\t// поэтому выбор восстановится без потери runtime-параметра после смены диапазона.\n\t\tonChange(availableValue);\n\t});\n\n\tuseEffect(() => {\n\t\temitAvailableValue();\n\t}, [availableValue, value]);\n\n\treturn (\n\t\t<PresetSelect\n\t\t\t{...props}\n\t\t\toptions={resolvedOptions}\n\t\t\tvalue={availableValue}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionDisabled={(option) => isPeriodSelectOptionDisabled(option, dateRange)}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@ import { type PresetOption } from "@ryuzaki13/react-foundation-lib/presets";
|
|
|
5
5
|
*/
|
|
6
6
|
export type PeriodSelectPresetId = "day" | "week" | "month" | "year";
|
|
7
7
|
export type PeriodSelectId = PeriodSelectPresetId | (string & {});
|
|
8
|
+
/**
|
|
9
|
+
* Полный типизированный набор подписей встроенных уровней детализации.
|
|
10
|
+
* Потребитель может передать его частично, сохранив канонические подписи
|
|
11
|
+
* для всех отсутствующих ключей.
|
|
12
|
+
*/
|
|
13
|
+
export type PeriodSelectLabels = Readonly<Record<PeriodSelectPresetId, string>>;
|
|
8
14
|
export interface PeriodSelectOption extends PresetOption<PeriodSelectId> {
|
|
9
15
|
maxRangeDays?: number;
|
|
10
16
|
}
|
|
@@ -19,6 +25,13 @@ export type PeriodSelectThresholds = {
|
|
|
19
25
|
maxDayRangeDays?: number;
|
|
20
26
|
maxWeekRangeWeeks?: number;
|
|
21
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Настройки формирования встроенных options. `labels` изменяет только
|
|
30
|
+
* отображаемый текст и не влияет на id, порядок или ограничения диапазона.
|
|
31
|
+
*/
|
|
32
|
+
export type PeriodSelectOptionsConfig = PeriodSelectThresholds & {
|
|
33
|
+
labels?: Partial<PeriodSelectLabels>;
|
|
34
|
+
};
|
|
22
35
|
export declare const DEFAULT_PERIOD_SELECT_PRESET_ID = "day";
|
|
23
36
|
export declare const DEFAULT_PERIOD_SELECT_MAX_DAY_RANGE_DAYS = 31;
|
|
24
37
|
export declare const DEFAULT_PERIOD_SELECT_MAX_WEEK_RANGE_WEEKS = 26;
|
|
@@ -36,7 +49,11 @@ export declare function normalizePeriodSelectPresetIds(value: unknown, fallbackI
|
|
|
36
49
|
export declare function resolvePeriodSelectOptionsByIds(presetIds: readonly PeriodSelectOption["id"][], options?: readonly PeriodSelectOption[]): PeriodSelectOption[];
|
|
37
50
|
export declare function getPeriodSelectOption(id: PeriodSelectOption["id"] | undefined, options?: readonly PeriodSelectOption[]): PeriodSelectOption | null;
|
|
38
51
|
export declare function resolvePeriodSelectDefaultValue(value: unknown): PeriodSelectPresetId;
|
|
39
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Создает независимый список встроенных options с порогами доступности и
|
|
54
|
+
* частичными подписями потребителя поверх канонического каталога.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createPeriodSelectOptions({ maxDayRangeDays, maxWeekRangeWeeks, labels }?: PeriodSelectOptionsConfig): PeriodSelectOption[];
|
|
40
57
|
export declare function isPeriodSelectOptionDisabled(option: PeriodSelectOption, dateRange: DateRangeInput | undefined): boolean;
|
|
41
58
|
export declare function resolvePeriodSelectAvailableValue(value: PeriodSelectOption["id"] | undefined, options: readonly PeriodSelectOption[], dateRange: DateRangeInput | undefined): PeriodSelectOption["id"] | undefined;
|
|
42
59
|
export declare function normalizePeriodSelectDateRangeConnectors(value: unknown): PeriodSelectDateRangeConnectors | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"periodSelect.d.ts","sourceRoot":"","sources":["../../../src/period-select/lib/periodSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,cAAc,EAGnB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuC,KAAK,YAAY,EAA6B,MAAM,yCAAyC,CAAC;AAG5I;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,cAAc,CAAC;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG,kBAAkB,GAAG;IACrD,EAAE,EAAE,oBAAoB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAuC,CAAC;AACpF,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,yBAAyB,EAiBpE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gCAAgC,2CAKQ,CAAC;AAItD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,SAAS,oBAAoB,EAAqC,GAC7E,oBAAoB,EAAE,CAQxB;AAED,wBAAgB,+BAA+B,CAC9C,SAAS,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9C,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EACxC,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAEpF;AAED,wBAAgB,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"periodSelect.d.ts","sourceRoot":"","sources":["../../../src/period-select/lib/periodSelect.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,cAAc,EAGnB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAuC,KAAK,YAAY,EAA6B,MAAM,yCAAyC,CAAC;AAG5I;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,cAAc,CAAC;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,yBAAyB,GAAG,kBAAkB,GAAG;IACrD,EAAE,EAAE,oBAAoB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,GAAG;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAuC,CAAC;AACpF,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,yBAAyB,EAiBpE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gCAAgC,2CAKQ,CAAC;AAItD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,SAAS,oBAAoB,EAAqC,GAC7E,oBAAoB,EAAE,CAQxB;AAED,wBAAgB,+BAA+B,CAC9C,SAAS,EAAE,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9C,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,EAAE,CAEtB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EACxC,OAAO,GAAE,SAAS,kBAAkB,EAA0B,GAC5D,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAEpF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EACzC,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,GAAE,yBAA8B,GAAG,kBAAkB,EAAE,CA0BvD;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAQvH;AAED,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,SAAS,kBAAkB,EAAE,EACtC,SAAS,EAAE,cAAc,GAAG,SAAS,GACnC,kBAAkB,CAAC,IAAI,CAAC,GAAG,SAAS,CAgBtC;AAED,wBAAgB,wCAAwC,CAAC,KAAK,EAAE,OAAO,GAAG,+BAA+B,GAAG,SAAS,CASpH"}
|