@ryuzaki13/react-foundation-ui 1.12.4 → 2.0.1
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/listbox/Listbox.d.ts +3 -1
- package/dist/listbox/Listbox.d.ts.map +1 -1
- package/dist/listbox/index.js +69 -60
- package/dist/listbox/index.js.map +1 -1
- package/package.json +5 -5
- package/storybook-static/assets/{Badge-D34jY6Gi.js → Badge-DTV2OL5k.js} +1 -1
- package/storybook-static/assets/{Badge.stories-BviYPkwq.js → Badge.stories-D4zH_nK5.js} +1 -1
- package/storybook-static/assets/{BadgeList-D1opuTdU.js → BadgeList-CnmQ4zmg.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-CGdzqa8a.js → BarcodeScannerDialog.stories-Cm7ouwg8.js} +1 -1
- package/storybook-static/assets/{Button-GlOmKXxP.js → Button-6JuiM3Sj.js} +1 -1
- package/storybook-static/assets/{Button-TDS2LnG9.js → Button-HheQm8vu.js} +1 -1
- package/storybook-static/assets/{Button.stories-DZc3uOlJ.js → Button.stories-B3Q5B_2w.js} +1 -1
- package/storybook-static/assets/{CalendarView-BZUnLT-3.js → CalendarView-CEfB4HLd.js} +1 -1
- package/storybook-static/assets/{CheckBox-nJdvYZhM.js → CheckBox-CWGCGHUS.js} +1 -1
- package/storybook-static/assets/{CheckBox-CLBqWi7z.js → CheckBox-CzvA4ttT.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CYOLxCPI.js → CheckBox.stories-D2lA5F8B.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-D18f6KeQ.js → Color-6AOWCN3U-RvvVvZ9f.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CQSxlBWi.js → ContextMenu-BJnj7lO4.js} +1 -1
- package/storybook-static/assets/{ContextMenu-sE3MNnCR.js → ContextMenu-DCpglNe4.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-BLY5Ujpn.js → ContextMenu.stories-CZabvzR6.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-Dskg5LhM.js → CustomOptionButton-B9bzr3ba.js} +1 -1
- package/storybook-static/assets/{DateInput-C1ICOvMl.js → DateInput-Cud2arem.js} +1 -1
- package/storybook-static/assets/{DateInput-Bzodnz-9.js → DateInput-DoMGeEvO.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BzVMkjA3.js → DateInput.stories-DFd5wyMy.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-Br2__e-_.js → DateRangePresetSelect-C8jA3mur.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-D4nDDXcv.js → DateRangePresetSelect-DfGcFHV8.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-BGjTzO7y.js → DateRangePresetSelect.stories-DtR83uwx.js} +1 -1
- package/storybook-static/assets/{Detail-0FlptHQe.js → Detail-CMcVxOrr.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BxrUGFvI.js → Detail.stories-DGT8An8z.js} +1 -1
- package/storybook-static/assets/{Dialog-DkLXNVzZ.js → Dialog-BPzpu7Iw.js} +1 -1
- package/storybook-static/assets/{Dialog-BfPgyIcU.js → Dialog-DBh-yDZW.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-D949y8s0.js → Dialog.stories-DU3SgOkL.js} +1 -1
- package/storybook-static/assets/{Disclosure-Cyh5B4JR.js → Disclosure-BGsPaAxH.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-CvuTZlF_.js → Disclosure.stories-DpwyYh7T.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-Wae8qmS8.js → DisclosureGroup-CJI8B2x_.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CGjmbQhP.js → DocsRenderer-JROSPFPF-Cf85Uxwt.js} +1 -1
- package/storybook-static/assets/{DropZone-BFX_F_oU.js → DropZone-C7qTrvkq.js} +1 -1
- package/storybook-static/assets/{DropZone-fvEwB1kz.js → DropZone-cYl1w3wQ.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-BKXYN11y.js → DropZone.stories-o02bE6DI.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-eld8h4zt.js → DropdownMenu-DqqPU9RU.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-CsulBc_X.js → ExpandableActionPanel-B_pjHQ5m.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-DorKO7Y7.js → ExpandableActionPanel.stories-C7dJ5dht.js} +1 -1
- package/storybook-static/assets/{Flex-Bos8Qsbf.js → Flex-CIHkkwFK.js} +1 -1
- package/storybook-static/assets/{Flex.stories-uMO88BD-.js → Flex.stories-DteEPY0y.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-Cc604wgC.js → FloatingPopover-yB9tTk9G.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-BBvQf7q4.js → FormattedTableCell-QVYQepjk.js} +3 -3
- package/storybook-static/assets/{Grid-DEWQZjLv.js → Grid-BUVtGaZY.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BLE0L0zk.js → Grid.stories-CWGqCVB2.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BW7Ozi0T.js → ImageCropper.stories-D8l7iHQA.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BejoR1lv.js → ImageRenderer-BcPmp9P9.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-DP10_K4c.js → ImageRenderer.stories-CcLUz8Ml.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-Bw13WxSu.js → ImageView.stories-BwvjVmuF.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-B0crB6gM.js → ImageViewer.stories-BjT782dr.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-B7phOl_8.js → ImageViewerRuntime-DnQ-rQ_M.js} +1 -1
- package/storybook-static/assets/{Input-DiBxtZDI.js → Input-CmEkIaR0.js} +1 -1
- package/storybook-static/assets/{Input-B5POVG-l.js → Input-DebpyMJg.js} +1 -1
- package/storybook-static/assets/{Input.stories-BBu0KoQ3.js → Input.stories-y2LCVkT2.js} +1 -1
- package/storybook-static/assets/{InputDateTime-CF1I9kaz.js → InputDateTime-B5oKuCea.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-COzwJ_xA.js → InputDateTime.stories-Cwi0acf9.js} +1 -1
- package/storybook-static/assets/{InputFile-Czxpud9Y.js → InputFile-B2dVbDrE.js} +1 -1
- package/storybook-static/assets/{InputFile-DV4LbiGx.js → InputFile-DbRU7crz.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-C4UrANxS.js → InputFile.stories-DrXG5hWA.js} +1 -1
- package/storybook-static/assets/{InputFiles-B93BMp0i.js → InputFiles-CsgKJXOD.js} +1 -1
- package/storybook-static/assets/{InputFiles-B_WMnvSr.js → InputFiles-DEBKMzlt.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CTun1-En.js → InputFiles.stories-EZDcefG0.js} +1 -1
- package/storybook-static/assets/{InputFilesList-ChdmhHw0.js → InputFilesList-GjMJ14Ln.js} +1 -1
- package/storybook-static/assets/{InputImage-xpaTZ7wq.js → InputImage-CFFK9MbG.js} +1 -1
- package/storybook-static/assets/{InputImage-DR7Ed0Vu.js → InputImage-qjJ7xrKX.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DTvBlwrQ.js → InputImage.stories-B32AtBda.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-BYjJFrHD.js → InteractiveComponents-DustBT4l.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-CTbNtPbV.js → InteractiveComponents.stories-J-7t7y-v.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CInTlBMe.js → LayoutPicker-DlzXd6kS.js} +1 -1
- package/storybook-static/assets/LayoutPicker-DwNtjoeb.js +376 -0
- package/storybook-static/assets/{LayoutPicker.stories-DQ_lYy0l.js → LayoutPicker.stories-2bG0TvXm.js} +1 -1
- package/storybook-static/assets/{Listbox-D4HihpJQ.js → Listbox-BAhrUu_I.js} +16 -4
- package/storybook-static/assets/Listbox-C9qCMY31.js +1 -0
- package/storybook-static/assets/{Listbox.stories-CzP9_sD-.js → Listbox.stories-BfakOrPT.js} +1 -1
- package/storybook-static/assets/{Modal-DUYVQZu5.js → Modal-D5znEvBs.js} +1 -1
- package/storybook-static/assets/{Modal-LmkJ7CHS.js → Modal-wGyoEzau.js} +1 -1
- package/storybook-static/assets/{Modal.stories-BGui6fT5.js → Modal.stories-DotZ88Ut.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-DOLfRB2E.js → ModalManagerProvider-DXPaYU4j.js} +1 -1
- package/storybook-static/assets/MultiSelect-BxKmL7sF.js +2 -0
- package/storybook-static/assets/{MultiSelect-CWIM68HY.js → MultiSelect-DN1NhXH9.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-C45HfpYj.js → MultiSelect.stories-Cdrx9hhT.js} +1 -1
- package/storybook-static/assets/{NoData-BFixErI8.js → NoData-mAjM6Vuy.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-DSFid0wi.js → NotificationsHost-gBWuk9v-.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BRb4w9We.js → NotificationsHost.stories-DONKtSKb.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-BWAo87rZ.js → ODataMultiSelect-Daq3ksSA.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-9JY7dCz7.js → ODataMultiSelect.stories-De0WwTKp.js} +1 -1
- package/storybook-static/assets/{ODataSelect-CNaZGImQ.js → ODataSelect-BUO-vyqK.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DmUKhDNz.js → ODataSelect.stories-CJ2RCZGP.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-C_qAbPca.js → ODataTreeMultiSelect-Ctyo-uib.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CEfHC6t_.js → ODataTreeMultiSelect.stories-BX4wjGkG.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-BSFpOn9W.js → ODataTreeSelect-BZzwG_Ve.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-caU47o0f.js → ODataTreeSelect.stories-B0jQNyMj.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-Bs7JuMLb.js → OneStepScroller-BL3gxJh1.js} +1 -1
- package/storybook-static/assets/{Option-CSnKA-Xd.js → Option-JgQ-duDq.js} +1 -1
- package/storybook-static/assets/{OptionButton-DIGMZVy9.js → OptionButton-CATaxLh0.js} +1 -1
- package/storybook-static/assets/PeriodSelect-4LpRQDP5.js +5 -0
- package/storybook-static/assets/{PeriodSelect-Cd0ESjew.js → PeriodSelect-BIsC_Ew6.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-Dir9DbtU.js → PeriodSelect.stories-D5fKpF2P.js} +1 -1
- package/storybook-static/assets/PickerField-BkqWIWZw.js +1 -0
- package/storybook-static/assets/{PickerTriggerActions-CJMxsesn.js → PickerTriggerActions-BVrXKKJ9.js} +1 -1
- package/storybook-static/assets/{Popover-CRhHLoew.js → Popover-BTrxASXR.js} +1 -1
- package/storybook-static/assets/{Popover-D6-lu_yc.js → Popover-DZlEnjse.js} +1 -1
- package/storybook-static/assets/{Popover.stories-BCMMP7px.js → Popover.stories-BdyB4Q7K.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CrZgAMBR.js → PresetRangeDateInput-Cp66aUGT.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BlRfDcUL.js → PresetRangeDateInput-DUES355B.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-Zl5sur2x.js → PresetRangeDateInput.stories-D4jLrF6o.js} +1 -1
- package/storybook-static/assets/{PresetSelect-wNDulYVW.js → PresetSelect-CmRrk7FZ.js} +1 -1
- package/storybook-static/assets/{README-D65oLCnS.js → README--fYBobJK.js} +1 -1
- package/storybook-static/assets/{README-Bdm71C27.js → README-4AGJG--w.js} +1 -1
- package/storybook-static/assets/{README-BB-q729e.js → README-52AHLz83.js} +1 -1
- package/storybook-static/assets/{README-DFlnpjEv.js → README-55mkSTZb.js} +1 -1
- package/storybook-static/assets/README-B00ewV67.js +37 -0
- package/storybook-static/assets/{README-C9cYGWK6.js → README-B20cH-BV.js} +1 -1
- package/storybook-static/assets/{README-BZdQ6muO.js → README-B4CJVRtX.js} +1 -1
- package/storybook-static/assets/{README-DKMmI4G2.js → README-B7BK3gkk.js} +1 -1
- package/storybook-static/assets/{README-BdNMeUCv.js → README-B9foBRQ-.js} +1 -1
- package/storybook-static/assets/{README-BJ7S9lBU.js → README-BCNsNQNj.js} +1 -1
- package/storybook-static/assets/{README-z6dqmkvs.js → README-BGA2Ek3H.js} +1 -1
- package/storybook-static/assets/{README-BT0TE4lM.js → README-BUknkyU6.js} +1 -1
- package/storybook-static/assets/{README-D55OX9pN.js → README-BfGp1q9n.js} +1 -1
- package/storybook-static/assets/{README-Cfj0BoXs.js → README-BhRGrTHx.js} +1 -1
- package/storybook-static/assets/{README-BEZWi2C2.js → README-Bh_zrJ_j.js} +1 -1
- package/storybook-static/assets/{README-lN1Ljv0O.js → README-BlWMNqE5.js} +1 -1
- package/storybook-static/assets/{README-CcRUd05A.js → README-BmKEL3jy.js} +1 -1
- package/storybook-static/assets/{README-CN8Y6HC2.js → README-BoGNjKgW.js} +1 -1
- package/storybook-static/assets/README-Bq8FLza7.js +121 -0
- package/storybook-static/assets/{README-DP8Jhu4s.js → README-BrJaVHU_.js} +1 -1
- package/storybook-static/assets/{README-Csisl067.js → README-BsUvf6lk.js} +37 -8
- package/storybook-static/assets/{README-BWVWcDb4.js → README-C28SDMRx.js} +1 -1
- package/storybook-static/assets/{README-DC6IHyBW.js → README-C8Xo5jEX.js} +1 -1
- package/storybook-static/assets/{README-Cf-es484.js → README-CHw6-PVx.js} +9 -2
- package/storybook-static/assets/{README-D35QrmDs.js → README-CPYFZwZE.js} +1 -1
- package/storybook-static/assets/{README-CaQ_OfNG.js → README-CU_f1CMq.js} +1 -1
- package/storybook-static/assets/{README-j3HSmhET.js → README-C_SQjJtW.js} +1 -1
- package/storybook-static/assets/{README-Des11J57.js → README-C_WyDQDz.js} +1 -1
- package/storybook-static/assets/{README-D93oAq59.js → README-CmK6hELS.js} +1 -1
- package/storybook-static/assets/{README-DIgOgGI7.js → README-CnRKlFuJ.js} +1 -1
- package/storybook-static/assets/{README-B7i5ChbN.js → README-CoD7FHU_.js} +1 -1
- package/storybook-static/assets/{README-CJy-3cCT.js → README-Cs-dnvtW.js} +1 -1
- package/storybook-static/assets/{README-CR0j-jFh.js → README-CzKPWsNs.js} +1 -1
- package/storybook-static/assets/{README-COQcoKT9.js → README-D-TgbUSA.js} +1 -1
- package/storybook-static/assets/{README-CCHc0Xyu.js → README-D6pLFtqL.js} +45 -1
- package/storybook-static/assets/{README-CDaOPhz8.js → README-D7jyja4l.js} +1 -1
- package/storybook-static/assets/{README-DPYg_Acv.js → README-D8YPmvQw.js} +1 -1
- package/storybook-static/assets/{README-Ch7v2uGS.js → README-DG5knhc9.js} +1 -1
- package/storybook-static/assets/{README-LyF6lMIs.js → README-DK-Bw1l1.js} +1 -1
- package/storybook-static/assets/{README-BRfBuhla.js → README-DK-US_zR.js} +1 -1
- package/storybook-static/assets/{README-8YjqwqnH.js → README-DNUrBjgg.js} +1 -1
- package/storybook-static/assets/{README-r-4LRVav.js → README-DPuLgYuK.js} +12 -4
- package/storybook-static/assets/{README-CaM6cf-O.js → README-DgudM-2t.js} +1 -1
- package/storybook-static/assets/{README-iF0ok9Vi.js → README-Ds6OSOC0.js} +1 -1
- package/storybook-static/assets/{README-B6h01Pmu.js → README-DsfBjN9N.js} +1 -1
- package/storybook-static/assets/{README-Rjv-h87w.js → README-Duppk6f6.js} +4 -2
- package/storybook-static/assets/{README-C3jNJJpP.js → README-DvZ8ZhlH.js} +1 -1
- package/storybook-static/assets/{README-CRga2fgb.js → README-DyLt9P77.js} +1 -1
- package/storybook-static/assets/{README-GIOQUZhr.js → README-DzVNZdfo.js} +1 -1
- package/storybook-static/assets/{README-CsYG82LK.js → README-E5QziGK8.js} +1 -1
- package/storybook-static/assets/{README-BRKMZAGf.js → README-EIhMMZ0t.js} +107 -28
- package/storybook-static/assets/{README-Bubi5gTJ.js → README-LqD1V5ru.js} +1 -1
- package/storybook-static/assets/{README-B_NLFfpp.js → README-lgRhlVsq.js} +1 -1
- package/storybook-static/assets/{RadioButton-CCR0zu3W.js → RadioButton-BLHXpf6L.js} +1 -1
- package/storybook-static/assets/{RadioButton-SDIHkMqE.js → RadioButton-CmcExRQs.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-CWlAzbso.js → RadioButton.stories-P1SEMdJ1.js} +1 -1
- package/storybook-static/assets/{RadioGroup-B8dC3Beb.js → RadioGroup-BBv2Na1n.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CvMAbZis.js → RadioGroup-DkCSA8me.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-B7g9iK7V.js → RadioGroup.stories-5-uFHs1b.js} +1 -1
- package/storybook-static/assets/{Scrollable-Duhb4hgF.js → Scrollable-XhGz9dwJ.js} +1 -1
- package/storybook-static/assets/Select-BEMtNq5M.js +12 -0
- package/storybook-static/assets/{Select-HfN2ur_G.js → Select-CyA-PHrU.js} +1 -1
- package/storybook-static/assets/{Select.stories-B9ulZxEn.js → Select.stories-B_GbDG58.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-CnOm3Egr.js → SerializableSelect-CJ74e_Vc.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Ct4iR6JB.js → SerializableSelect.stories-PUXPFPFx.js} +1 -1
- package/storybook-static/assets/SingleDateTimeInput-BlpQ8t9f.js +1 -0
- package/storybook-static/assets/{SingleDateTimeInput-CoW7Kbyn.js → SingleDateTimeInput-wqb75Yrz.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-CSMgGAWO.js → SingleDateTimeInput.stories-CdogRh5M.js} +1 -1
- package/storybook-static/assets/{Slider-N8mF8qmG.js → Slider-CZa1f0vP.js} +1 -1
- package/storybook-static/assets/{Slider-B8CLVfcP.js → Slider-r8Be9wJ4.js} +1 -1
- package/storybook-static/assets/{Slider.stories-KBmRK3s8.js → Slider.stories-BUwg0h15.js} +1 -1
- package/storybook-static/assets/{SliderInput-BDJi-cgo.js → SliderInput-BWFbcA5R.js} +1 -1
- package/storybook-static/assets/{SliderInput-BkiUt9jK.js → SliderInput-BaZBNhhF.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-BYJemRSZ.js → SliderInput.stories-Cbxo0ku_.js} +1 -1
- package/storybook-static/assets/{Sortable-B9KSdQoM.js → Sortable-JfLmQUdm.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-DkgQcmlF.js → Sortable.stories-Cz9xM3Tw.js} +1 -1
- package/storybook-static/assets/{Splitter-RwtbhIP_.js → Splitter-BkQcPRYJ.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-C7WMeiBU.js → Splitter.stories-zQf1fK4D.js} +1 -1
- package/storybook-static/assets/StateSelect-DxH1oWnK.js +4 -0
- package/storybook-static/assets/{StateSelect-Cu3-TJjY.js → StateSelect-TLRMUmko.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-C1SXNtZm.js → StateSelect.stories-CReLNG_6.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CSWTlbeH.js → StringToggle.stories-BYqTdRbD.js} +1 -1
- package/storybook-static/assets/{Switch-C0VQpcAN.js → Switch-ChsLVAse.js} +1 -1
- package/storybook-static/assets/{Switch-CMm26s02.js → Switch-DE9rqHmp.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BdeMw5vh.js → Switch.stories-BaVgLi3_.js} +1 -1
- package/storybook-static/assets/{Table-BdN7l9nU.js → Table-qoMvYV1q.js} +1 -1
- package/storybook-static/assets/{Table.stories-n1jzcEtU.js → Table.stories-BdLScKfS.js} +1 -1
- package/storybook-static/assets/{Tabs-3QRIKQu4.js → Tabs-CuALrdgt.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-Br_vn86G.js → Tabs.stories-BrLtxZ_a.js} +1 -1
- package/storybook-static/assets/{TabsBox-oUhSAA8j.js → TabsBox-DzfWhIHb.js} +1 -1
- package/storybook-static/assets/{TagInput-CXLkDkGR.js → TagInput-Tyn5Jgus.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-Oug-n_Cc.js → TagInput.stories-Bbs3olyB.js} +1 -1
- package/storybook-static/assets/{Text-EA5QyBz4.js → Text-B4GUKigV.js} +1 -1
- package/storybook-static/assets/{Textarea-BhnGClU1.js → Textarea-CNu-scX8.js} +1 -1
- package/storybook-static/assets/{Textarea-JWCJNKsl.js → Textarea-D3iwzB-S.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-nyyWW7AG.js → Textarea.stories-CE2gt74x.js} +1 -1
- package/storybook-static/assets/{TimePanel-CWnqPBjv.js → TimePanel-BESMLCVl.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-C-iXXNjE.js → TimePanel.stories-BYhTpaoS.js} +1 -1
- package/storybook-static/assets/{Toggle-C_aM5aMQ.js → Toggle-0-SlfDXC.js} +1 -1
- package/storybook-static/assets/{Toggle-DSSRTisC.js → Toggle-BexBc-UO.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-mFCOmo4Y.js → Toggle.stories-CG4rBYOZ.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CyW6oUN_.js → TreeMultiSelect-Cne9qXjN.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CxOnGdzT.js → TreeMultiSelect-QId1DJUn.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CC1X33-d.js → TreeMultiSelect.stories-D6ElJY8Y.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B5pChx5i.js → TreePickerBase-Dq3HMrua.js} +2 -2
- package/storybook-static/assets/{TreeSelect-LtUUGYjX.js → TreeSelect-BJKtAh4x.js} +1 -1
- package/storybook-static/assets/{TreeSelect-PjRafYC5.js → TreeSelect-q4gdFfBH.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-kT556sYJ.js → TreeSelect.stories-DfCxZuVy.js} +1 -1
- package/storybook-static/assets/{TreeTable-MLb4c6PD.js → TreeTable-5fAWCnhQ.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-CAiwbwxz.js → TreeTable.stories-B1fSfYHg.js} +1 -1
- package/storybook-static/assets/{array-D-_yMMUK-BQ0uu1hZ.js → array-D-_yMMUK-DYqn1Ozn.js} +1 -1
- package/storybook-static/assets/{blocks-DxyL_jCu.js → blocks-B_u8Yt1Z.js} +3 -3
- package/storybook-static/assets/{check-BXD_Pkw4.js → check-r01NGn4c.js} +1 -1
- package/storybook-static/assets/{chevron-down-PsXs4TLU.js → chevron-down-DxMviYn3.js} +1 -1
- package/storybook-static/assets/{chevron-left-C4gxRcJZ.js → chevron-left-mKnQH53V.js} +1 -1
- package/storybook-static/assets/{chevron-right-BoNNSE4i.js → chevron-right-CeJNqWTb.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-Bw8Gaqb1.js → chunk-W22LQPXL-DorleiwX.js} +1 -1
- package/storybook-static/assets/{circle-alert-C0KskPN2.js → circle-alert-H7OZyDmF.js} +1 -1
- package/storybook-static/assets/{circle-check-BU7bRDDY.js → circle-check-my8Ev6ar.js} +1 -1
- package/storybook-static/assets/{components-BCyH0mtu.js → components-CDMhSXUo.js} +3 -3
- package/storybook-static/assets/{contextMenu-CI7IuUSN.js → contextMenu-fMt3iyZv.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-Dinv2uRZ.js → defaultRenderers-CyUQG_f-.js} +1 -1
- package/storybook-static/assets/{download-Ba6RrPW1.js → download-BCwj5k1S.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-CzenezcL.js → floating-ui.react-Cy32mouo.js} +1 -1
- package/storybook-static/assets/formatters-DVE1YVNQ-CMsbb5-m.js +1 -0
- package/storybook-static/assets/{foundationApi-Cjni4JEg.js → foundationApi-BtZYXGDY.js} +4 -4
- package/storybook-static/assets/{foundationLib-C3-64Grv.js → foundationLib-CHOUG7NK.js} +1 -1
- package/storybook-static/assets/{hooks-DNb8U9od.js → hooks-CEvNG7IN.js} +2 -2
- package/storybook-static/assets/iframe-CDVsimPQ.js +1 -0
- package/storybook-static/assets/{iframe-I7-gyNVJ.js → iframe-DWvPB8Sk.js} +4 -4
- package/storybook-static/assets/{info-HJuo7Txr.js → info-CA6M6l6h.js} +1 -1
- package/storybook-static/assets/odata-CHl7sWAn.js +1 -0
- package/storybook-static/assets/odata-service-CWkHASdw-DAt28ZWr.js +50 -0
- package/storybook-static/assets/{odataStoryFixtures-BlAGWLfC.js → odataStoryFixtures-BvjpoqqT.js} +1 -1
- package/storybook-static/assets/{react-DOm5uwVv.js → react-B37E__uI.js} +1 -1
- package/storybook-static/assets/{refresh-cw-CgbYtCzg.js → refresh-cw-Bt4yd-lG.js} +1 -1
- package/storybook-static/assets/{settings-2-B96G1M3R.js → settings-2-B7Uyk4j8.js} +1 -1
- package/storybook-static/assets/{sortable-CsGAvVat.js → sortable-B8UMQCaH.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-CJHmYDVV.js → syntaxhighlighter-QEQV7K2Y-QGUDFNNj.js} +1 -1
- package/storybook-static/assets/{trash-2-NFv7s58u.js → trash-2-Bhjh1o0B.js} +1 -1
- package/storybook-static/assets/{triangle-alert-DVmi0Yoe.js → triangle-alert-D1c-iB00.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-DRX6eayS.js → useODataSelectBase-CYnvX8wM.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-D7aS01Or.js → useODataTreeData-C2risfo7.js} +1 -1
- package/storybook-static/assets/{usePickerDefaultFilter-5Q1pAV4d.js → usePickerDefaultFilter-BMBLqfz8.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-D5WukLFG.js → usePickerQuery-CjSFlUmn.js} +1 -1
- package/storybook-static/assets/usePickerTriggerController-Bqo5fhOa.js +6 -0
- package/storybook-static/assets/validators-D82aYLRK.js +1 -0
- package/storybook-static/assets/{x-DlvQAqG5.js → x-B3GmOByS.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/LayoutPicker-BIB30zdc.js +0 -376
- package/storybook-static/assets/Listbox-hDPss1Hf.js +0 -1
- package/storybook-static/assets/MultiSelect-BuWgggHX.js +0 -2
- package/storybook-static/assets/PeriodSelect-DIIe0NfH.js +0 -5
- package/storybook-static/assets/README-C5s5K0h_.js +0 -324
- package/storybook-static/assets/Select-B-zeXEgK.js +0 -12
- package/storybook-static/assets/SingleDateTimeInput-BmEpx1-W.js +0 -1
- package/storybook-static/assets/StateSelect-BrgGuYMY.js +0 -4
- package/storybook-static/assets/formatters-D33Uh3si-Df97arf9.js +0 -1
- package/storybook-static/assets/iframe-BHNt9Av8.js +0 -1
- package/storybook-static/assets/odata-6-rqoXfe.js +0 -1
- package/storybook-static/assets/odata-service-CWkHASdw-CXhFi03v.js +0 -3
- package/storybook-static/assets/usePickerTriggerController-e8hbwGar.js +0 -6
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Errors/Error Report Delivery`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`durable-delivery-через-ryuzaki13react-foundation-apierror-report`,children:[`Durable delivery через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/error-report`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль доставляет versioned payload из IndexedDB queue `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),`. Он владеет lease processing, timeout, retry/terminal policy и browser lifecycle, но не знает endpoint, auth и DB contract приложения.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`foundation-lib/error-report foundation-api/error-report app adapter/backend
|
|
5
|
+
capture + sanitize + IndexedDB ─────► lease + retry coordinator ─────────► serverFn / HTTP
|
|
6
|
+
`})}),`
|
|
7
|
+
`,(0,c.jsx)(t.h2,{id:`установка-и-импорт`,children:`Установка и импорт`}),`
|
|
8
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-api \\
|
|
9
|
+
@ryuzaki13/react-foundation-lib
|
|
10
|
+
`})}),`
|
|
11
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { captureRuntimeErrorReport, createErrorReportQueue } from "@ryuzaki13/react-foundation-lib/error-report";
|
|
12
|
+
import {
|
|
13
|
+
createErrorReportDeliveryCoordinator,
|
|
14
|
+
ErrorReportDeliveryHttpError,
|
|
15
|
+
type ErrorReportDeliveryAdapter
|
|
16
|
+
} from "@ryuzaki13/react-foundation-api/error-report";
|
|
17
|
+
`})}),`
|
|
18
|
+
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
19
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const queue = createErrorReportQueue();
|
|
20
|
+
if (!queue) {
|
|
21
|
+
// IndexedDB недоступен: app фиксирует bounded fallback без рекурсивного report.
|
|
22
|
+
return () => undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const adapter: ErrorReportDeliveryAdapter = async (body, { signal }) => {
|
|
26
|
+
const response = await fetch("/api/error-reports", {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
signal
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const retryAfterSeconds = Number(response.headers.get("Retry-After"));
|
|
35
|
+
throw new ErrorReportDeliveryHttpError(response.status, Number.isFinite(retryAfterSeconds) ? retryAfterSeconds * 1_000 : undefined);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const coordinator = createErrorReportDeliveryCoordinator({ queue, adapter });
|
|
40
|
+
const stop = coordinator.start();
|
|
41
|
+
|
|
42
|
+
const draft = await captureRuntimeErrorReport(error, context, queryClient);
|
|
43
|
+
if (draft) {
|
|
44
|
+
await coordinator.enqueue(draft.payload);
|
|
45
|
+
}
|
|
46
|
+
`})}),`
|
|
47
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`coordinator.enqueue`}),` будит delivery в текущей вкладке. Другие вкладки обнаружат запись через bounded poll; correctness не зависит от `,(0,c.jsx)(t.code,{children:`BroadcastChannel`}),`.`]}),`
|
|
48
|
+
`,(0,c.jsx)(t.h2,{id:`delivery-body`,children:`Delivery body`}),`
|
|
49
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createErrorReportDeliveryBody(payload)`}),` повторно runtime-валидирует payload и возвращает:`]}),`
|
|
50
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ErrorReportDeliveryBody = {
|
|
51
|
+
payloadVersion: number;
|
|
52
|
+
application: string;
|
|
53
|
+
buildId?: string;
|
|
54
|
+
reportId: string;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
createdUtc: string;
|
|
57
|
+
category: ErrorReportCategory;
|
|
58
|
+
errorClass: string;
|
|
59
|
+
errorMessage: string;
|
|
60
|
+
stackTrace?: string;
|
|
61
|
+
payload: string;
|
|
62
|
+
};
|
|
63
|
+
`})}),`
|
|
64
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`application`}),`, `,(0,c.jsx)(t.code,{children:`buildId`}),` и `,(0,c.jsx)(t.code,{children:`payloadVersion`}),` дублируются с JSON для bounded DB columns и поиска. `,(0,c.jsx)(t.code,{children:`payload`}),` уже является JSON string; при сериализации внешнего HTTP body его не нужно stringify-ить отдельно второй раз.`]}),`
|
|
65
|
+
`,(0,c.jsxs)(t.p,{children:[`Пустой `,(0,c.jsx)(t.code,{children:`error.message`}),` получает fallback `,(0,c.jsx)(t.code,{children:`Неизвестная ошибка`}),` одновременно в `,(0,c.jsx)(t.code,{children:`errorMessage`}),` и сериализованном payload. Future/unversioned payload отклоняется до adapter-а.`]}),`
|
|
66
|
+
`,(0,c.jsx)(t.h2,{id:`retry-и-terminal-policy`,children:`Retry и terminal policy`}),`
|
|
67
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Failure`}),(0,c.jsx)(t.th,{children:`Результат`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`network `,(0,c.jsx)(t.code,{children:`TypeError`}),`, timeout/abort, неизвестная ошибка`]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`408`}),`, `,(0,c.jsx)(t.code,{children:`425`}),`, `,(0,c.jsx)(t.code,{children:`429`})]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`5xx`})]}),(0,c.jsx)(t.td,{children:`retry`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsxs)(t.td,{children:[`остальные HTTP `,(0,c.jsx)(t.code,{children:`4xx`})]}),(0,c.jsx)(t.td,{children:`terminal discard`})]})]})]}),`
|
|
68
|
+
`,(0,c.jsxs)(t.p,{children:[`Для status-aware результата adapter бросает `,(0,c.jsx)(t.code,{children:`ErrorReportDeliveryHttpError(status, retryAfterMs?)`}),`. Произвольный server response body и текст exception не сохраняются в IndexedDB.`]}),`
|
|
69
|
+
`,(0,c.jsx)(t.p,{children:`Retry использует exponential backoff:`}),`
|
|
70
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
71
|
+
`,(0,c.jsx)(t.li,{children:`база 5 секунд;`}),`
|
|
72
|
+
`,(0,c.jsxs)(t.li,{children:[`multiplicative jitter `,(0,c.jsx)(t.code,{children:`0.5–1.5`}),`;`]}),`
|
|
73
|
+
`,(0,c.jsx)(t.li,{children:`максимум 15 минут;`}),`
|
|
74
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Retry-After`}),` может увеличить задержку, но тоже ограничен 15 минутами.`]}),`
|
|
75
|
+
`]}),`
|
|
76
|
+
`,(0,c.jsxs)(t.p,{children:[`Неизвестная transport-ошибка считается retryable: временный сбой не должен необратимо уничтожить отчёт. Невалидный запрос server должен отвечать `,(0,c.jsx)(t.code,{children:`4xx`}),`, чтобы запись была удалена как terminal.`]}),`
|
|
77
|
+
`,(0,c.jsx)(t.h2,{id:`lease-timeout-и-idempotency`,children:`Lease, timeout и idempotency`}),`
|
|
78
|
+
`,(0,c.jsx)(t.p,{children:`Coordinator по умолчанию использует:`}),`
|
|
79
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
80
|
+
`,(0,c.jsx)(t.li,{children:`lease 30 секунд;`}),`
|
|
81
|
+
`,(0,c.jsx)(t.li,{children:`timeout одной отправки 20 секунд;`}),`
|
|
82
|
+
`,(0,c.jsx)(t.li,{children:`последовательный batch максимум 10 записей;`}),`
|
|
83
|
+
`,(0,c.jsx)(t.li,{children:`fallback poll 30 секунд.`}),`
|
|
84
|
+
`]}),`
|
|
85
|
+
`,(0,c.jsxs)(t.p,{children:[`Timeout обязан быть меньше lease. При закрытии/crash вкладки запись снова доступна после истечения lease. `,(0,c.jsx)(t.code,{children:`acknowledge`}),`, `,(0,c.jsx)(t.code,{children:`reschedule`}),` и `,(0,c.jsx)(t.code,{children:`discard`}),` выполняются только владельцем текущего lease.`]}),`
|
|
86
|
+
`,(0,c.jsxs)(t.p,{children:[`Backend обязан быть идемпотентным по `,(0,c.jsx)(t.code,{children:`reportId`}),`. Если server сохранил отчёт, а network acknowledgement или IndexedDB delete потерялись, queue отправит тот же ID повторно. Успешный duplicate request должен считаться server success, а не terminal conflict.`]}),`
|
|
87
|
+
`,(0,c.jsx)(t.h2,{id:`browser-lifecycle`,children:`Browser lifecycle`}),`
|
|
88
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`start()`}),` устанавливает только client-side listeners:`]}),`
|
|
89
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
90
|
+
`,(0,c.jsx)(t.li,{children:`немедленный flush при старте;`}),`
|
|
91
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`online`}),` и `,(0,c.jsx)(t.code,{children:`pageshow`}),` ускоряют следующую попытку;`]}),`
|
|
92
|
+
`,(0,c.jsx)(t.li,{children:`возврат вкладки в visible state ускоряет попытку;`}),`
|
|
93
|
+
`,(0,c.jsx)(t.li,{children:`bounded timer гарантирует progress без browser events.`}),`
|
|
94
|
+
`]}),`
|
|
95
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`navigator.onLine`}),` не используется как запрет отправки: браузер может ошибочно сообщать offline/online. Единственный владелец конкретной попытки определяется IndexedDB lease.`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.p,{children:[`На SSR `,(0,c.jsx)(t.code,{children:`start()`}),` возвращает no-op cleanup и не устанавливает timer. При размонтировании/HMR нужно вызвать возвращённый `,(0,c.jsx)(t.code,{children:`stop`}),`; активный fetch получает abort signal.`]}),`
|
|
97
|
+
`,(0,c.jsx)(t.h2,{id:`coordinator-events-и-storage-failures`,children:`Coordinator events и storage failures`}),`
|
|
98
|
+
`,(0,c.jsxs)(t.p,{children:[`Optional `,(0,c.jsx)(t.code,{children:`onEvent`}),` получает только bounded технические события:`]}),`
|
|
99
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
100
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`delivered`}),`;`]}),`
|
|
101
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`retry-scheduled`}),`;`]}),`
|
|
102
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`discarded`}),` с optional HTTP status;`]}),`
|
|
103
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`lease-lost`}),` и стадия перехода;`]}),`
|
|
104
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`storage-failure`}),` и стадия операции.`]}),`
|
|
105
|
+
`]}),`
|
|
106
|
+
`,(0,c.jsx)(t.p,{children:`Raw error, response text и payload в события не входят. Исключение самого observer подавляется, чтобы observability не создавала рекурсивный error report.`}),`
|
|
107
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`coordinator.enqueue`}),` преобразует IndexedDB quota/open/write failure в `,(0,c.jsx)(t.code,{children:`{ status: "storage-error" }`}),`. Background `,(0,c.jsx)(t.code,{children:`flush`}),` не выбрасывает storage failure наружу, а увеличивает `,(0,c.jsx)(t.code,{children:`storageFailures`}),` в результате. После успешной server delivery и неуспешного local acknowledgement запись остаётся под lease и позже повторяется с тем же `,(0,c.jsx)(t.code,{children:`reportId`}),`.`]}),`
|
|
108
|
+
`,(0,c.jsx)(t.h2,{id:`тестирование-adapter-а-приложения`,children:`Тестирование adapter-а приложения`}),`
|
|
109
|
+
`,(0,c.jsx)(t.p,{children:`Обязательно проверить:`}),`
|
|
110
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
111
|
+
`,(0,c.jsx)(t.li,{children:`успешный ответ и server duplicate acknowledgement;`}),`
|
|
112
|
+
`,(0,c.jsxs)(t.li,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`400/401/403/422`}),` как terminal;`]}),`
|
|
113
|
+
`,(0,c.jsxs)(t.li,{children:[`HTTP `,(0,c.jsx)(t.code,{children:`408/425/429/5xx`}),` как retryable;`]}),`
|
|
114
|
+
`,(0,c.jsxs)(t.li,{children:[`передачу `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` в фактический fetch/serverFn transport;`]}),`
|
|
115
|
+
`,(0,c.jsx)(t.li,{children:`потерю acknowledgement после server insert;`}),`
|
|
116
|
+
`,(0,c.jsx)(t.li,{children:`отсутствие report recursion при ошибке endpoint;`}),`
|
|
117
|
+
`,(0,c.jsx)(t.li,{children:`отсутствие raw response body в queue/events/logs.`}),`
|
|
118
|
+
`]}),`
|
|
119
|
+
`,(0,c.jsx)(t.p,{children:`Package tests дополнительно покрывают crash recovery, two-tab lease race, TTL, capacity, reopen, offline/online signal и quota failure.`}),`
|
|
120
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
121
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Export`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorReportDeliveryBody`})}),(0,c.jsx)(t.td,{children:`Строит validated server body из payload`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorReportDeliveryCoordinator`})}),(0,c.jsx)(t.td,{children:`Управляет browser lifecycle, lease processing и delivery`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`classifyErrorReportDeliveryFailure`})}),(0,c.jsx)(t.td,{children:`Единая retry/terminal policy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`calculateErrorReportRetryDelay`})}),(0,c.jsx)(t.td,{children:`Exponential backoff с jitter и cap`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryHttpError`})}),(0,c.jsx)(t.td,{children:`Status-aware ошибка app adapter-а`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryTimeoutError`})}),(0,c.jsx)(t.td,{children:`Технический timeout одной попытки`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryAdapter`})}),(0,c.jsx)(t.td,{children:`Узкий contract transport-а приложения`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ErrorReportDeliveryCoordinatorEvent`})}),(0,c.jsx)(t.td,{children:`Bounded observable lifecycle events`})]})]})]})]})}function s(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,c.jsx)(t,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}var c;function l(){return(l=e((()=>{c=t(),r(),a()})))()}l();export{s as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Strings`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`строковые-форматтеры`,children:`Строковые форматтеры`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль содержит небольшие предсказуемые функции для подготовки пользовательского текста: обрезки пробелов, безопасного преобразования в строку, удаления ведущих нулей, сокращения длинного текста и выбора русской формы слова.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Все функции экспортируются через один публичный entrypoint:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Infrastructure/Query Client`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`query-client`,children:`Query Client`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/query-client`}),` предоставляет общую инфраструктуру TanStack Query для browser-приложения:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -184,8 +184,9 @@ queryClient.cancelQueries({ queryKey });
|
|
|
184
184
|
`]}),`
|
|
185
185
|
`,(0,c.jsx)(t.h2,{id:`как-выбрать-cache-strategy`,children:`Как выбрать cache strategy`}),`
|
|
186
186
|
`,(0,c.jsx)(t.p,{children:`Перед созданием query ответьте на вопросы:`}),`
|
|
187
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Вопрос`}),(0,c.jsx)(t.th,{children:`Решение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужны данные только пока открыта вкладка?`}),(0,c.jsxs)(t.td,{children:[`Обычная query без `,(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Данные публичные, тяжёлые и могут пережить reload?`}),(0,c.jsxs)(t.td,{children:[`Рассмотреть `,(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Данные зависят от пользователя, роли или server session?`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужно передать обновление другой открытой вкладке?`}),(0,c.jsx)(t.td,{children:`Broadcast installation и подходящее cache event.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`UI должен измениться до ответа mutation?`}),(0,c.jsx)(t.td,{children:`Optimistic update с обязательным rollback policy.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Server response авторитетен и уже содержит новое состояние?`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setQueryData`}),`/`,(0,c.jsx)(t.code,{children:`onSuccessOptimistic`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`После mutation нужен свежий server snapshot?`}),(0,c.jsxs)(t.td,{children:[`Scoped `,(0,c.jsx)(t.code,{children:`invalidateQueries`}),` с выбранным `,(0,c.jsx)(t.code,{children:`refetchType`}),`.`]})]})]})]}),`
|
|
188
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),` и `,(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`}),` взаимоисключающие.
|
|
187
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Вопрос`}),(0,c.jsx)(t.th,{children:`Решение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужны данные только пока открыта вкладка?`}),(0,c.jsxs)(t.td,{children:[`Обычная query без `,(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Данные публичные, тяжёлые и могут пережить reload?`}),(0,c.jsxs)(t.td,{children:[`Рассмотреть `,(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Данные зависят от пользователя, роли или server session?`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Session snapshot явно разрешено читать offline?`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createSessionQueryPersistenceMeta`}),` + active scope.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Нужно передать обновление другой открытой вкладке?`}),(0,c.jsx)(t.td,{children:`Broadcast installation и подходящее cache event.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`UI должен измениться до ответа mutation?`}),(0,c.jsx)(t.td,{children:`Optimistic update с обязательным rollback policy.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Server response авторитетен и уже содержит новое состояние?`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setQueryData`}),`/`,(0,c.jsx)(t.code,{children:`onSuccessOptimistic`}),`.`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`После mutation нужен свежий server snapshot?`}),(0,c.jsxs)(t.td,{children:[`Scoped `,(0,c.jsx)(t.code,{children:`invalidateQueries`}),` с выбранным `,(0,c.jsx)(t.code,{children:`refetchType`}),`.`]})]})]})]}),`
|
|
188
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),` и `,(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`}),` взаимоисключающие. Для узкого offline allowlist session data используется
|
|
189
|
+
отдельный `,(0,c.jsx)(t.code,{children:`sessionPersistence`}),` contract: он требует активную server-session identity и абсолютный `,(0,c.jsx)(t.code,{children:`expiresAt`}),`.`]}),`
|
|
189
190
|
`,(0,c.jsx)(t.h2,{id:`быстрый-старт`,children:`Быстрый старт`}),`
|
|
190
191
|
`,(0,c.jsx)(t.h3,{id:`bootstrap`,children:`Bootstrap`}),`
|
|
191
192
|
`,(0,c.jsx)(t.p,{children:`Инициализация выполняется один раз до обычного render приложения:`}),`
|
|
@@ -341,7 +342,8 @@ console.log(first === second); // false
|
|
|
341
342
|
}
|
|
342
343
|
});
|
|
343
344
|
`})}),`
|
|
344
|
-
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`Record<string, unknown>`}),` разрешает consumer-проекту добавлять собственную metadata. Infrastructure этого модуля читает
|
|
345
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`Record<string, unknown>`}),` разрешает consumer-проекту добавлять собственную metadata. Infrastructure этого модуля читает
|
|
346
|
+
`,(0,c.jsx)(t.code,{children:`persist`}),`, `,(0,c.jsx)(t.code,{children:`sessionScoped`}),` и явный `,(0,c.jsx)(t.code,{children:`sessionPersistence`}),` contract.`]}),`
|
|
345
347
|
`,(0,c.jsx)(t.h3,{id:`persistedquerymeta`,children:(0,c.jsx)(t.code,{children:`persistedQueryMeta`})}),`
|
|
346
348
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const persistedQueryMeta = { persist: true } as const;
|
|
347
349
|
`})}),`
|
|
@@ -370,6 +372,31 @@ export function dictionaryQueryOptions(dictionaryId: string) {
|
|
|
370
372
|
});
|
|
371
373
|
`})}),`
|
|
372
374
|
`,(0,c.jsxs)(t.p,{children:[`При смене сессии host обязан вызвать `,(0,c.jsx)(t.code,{children:`resetSessionScopedQueries`}),`.`]}),`
|
|
375
|
+
`,(0,c.jsx)(t.h3,{id:`session-scoped-offline-persistence`,children:`Session-scoped offline persistence`}),`
|
|
376
|
+
`,(0,c.jsx)(t.p,{children:`Только для явно согласованного offline allowlist создайте bounded metadata:`}),`
|
|
377
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
378
|
+
createSessionQueryPersistenceMeta,
|
|
379
|
+
setSessionQueryPersistenceScope
|
|
380
|
+
} from "@ryuzaki13/react-foundation-lib/query-client";
|
|
381
|
+
|
|
382
|
+
await setSessionQueryPersistenceScope({
|
|
383
|
+
id: session.id,
|
|
384
|
+
expiresAt: session.expiresAt
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
queryOptions({
|
|
388
|
+
queryKey: ["opened-week", weekStart],
|
|
389
|
+
queryFn: fetchWeek,
|
|
390
|
+
meta: createSessionQueryPersistenceMeta({
|
|
391
|
+
cacheName: "opened-weeks",
|
|
392
|
+
maxEntries: 24
|
|
393
|
+
}),
|
|
394
|
+
networkMode: "offlineFirst"
|
|
395
|
+
});
|
|
396
|
+
`})}),`
|
|
397
|
+
`,(0,c.jsxs)(t.p,{children:[`Scope устанавливается отдельно от query contract, не содержит cookie secret/access token и меняет in-memory границу до очистки IndexedDB.
|
|
398
|
+
При `,(0,c.jsx)(t.code,{children:`null`}),`, истёкшем `,(0,c.jsx)(t.code,{children:`expiresAt`}),` или смене `,(0,c.jsx)(t.code,{children:`id`}),` старые session snapshots удаляются. `,(0,c.jsx)(t.code,{children:`networkMode: "offlineFirst"`}),` нужен, чтобы
|
|
399
|
+
TanStack вызвал persister до network pause. Cached data остаётся неавторитетным: write после reconnect обязан повторно получить серверный state.`]}),`
|
|
373
400
|
`,(0,c.jsx)(t.h3,{id:`meta-нельзя-совмещать`,children:`Meta нельзя совмещать`}),`
|
|
374
401
|
`,(0,c.jsx)(t.p,{children:`Неверно:`}),`
|
|
375
402
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`meta: {
|
|
@@ -382,11 +409,12 @@ export function dictionaryQueryOptions(dictionaryId: string) {
|
|
|
382
409
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
383
410
|
`,(0,c.jsxs)(t.li,{children:[`публичный/безопасный долгоживущий справочник → `,(0,c.jsx)(t.code,{children:`persistedQueryMeta`}),`;`]}),`
|
|
384
411
|
`,(0,c.jsxs)(t.li,{children:[`auth/session dependent data → `,(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`}),`;`]}),`
|
|
412
|
+
`,(0,c.jsxs)(t.li,{children:[`разрешённый bounded offline snapshot → `,(0,c.jsx)(t.code,{children:`createSessionQueryPersistenceMeta`}),`;`]}),`
|
|
385
413
|
`,(0,c.jsx)(t.li,{children:`обычные transient data → meta не нужна.`}),`
|
|
386
414
|
`]}),`
|
|
387
415
|
`,(0,c.jsx)(t.h2,{id:`настройка-project-adapter`,children:`Настройка project adapter`}),`
|
|
388
416
|
`,(0,c.jsx)(t.h3,{id:`зачем-нужен-adapter`,children:`Зачем нужен adapter`}),`
|
|
389
|
-
`,(0,c.jsxs)(t.p,{children:[`Foundation-пакет не знает имя SAP system, client, tenant или окружение конкретного приложения. `,(0,c.jsx)(t.code,{children:`QueryPersistenceProjectAdapter`}),` позволяет host передать устойчивый namespace и собственный buster:`]}),`
|
|
417
|
+
`,(0,c.jsxs)(t.p,{children:[`Foundation-пакет не знает имя SAP system, client, tenant или окружение конкретного приложения. `,(0,c.jsx)(t.code,{children:`QueryPersistenceProjectAdapter`}),` позволяет host передать устойчивый namespace и собственный buster. Текущая session identity задаётся отдельным runtime API и не входит в adapter:`]}),`
|
|
390
418
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type QueryPersistenceProjectAdapter = {
|
|
391
419
|
persistenceBuster?: string;
|
|
392
420
|
resolveSystemIdentifier?: () => string | null | undefined;
|
|
@@ -531,7 +559,8 @@ if (storage) {
|
|
|
531
559
|
`,(0,c.jsx)(t.h3,{id:`createreactquerypersister`,children:(0,c.jsx)(t.code,{children:`createReactQueryPersister`})}),`
|
|
532
560
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const persister = createReactQueryPersister();
|
|
533
561
|
`})}),`
|
|
534
|
-
`,(0,c.jsxs)(t.p,{children:[`Возвращает
|
|
562
|
+
`,(0,c.jsxs)(t.p,{children:[`Возвращает routing-обёртку над `,(0,c.jsx)(t.code,{children:`experimental_createQueryPersister`}),` либо `,(0,c.jsx)(t.code,{children:`undefined`}),`, если IndexedDB недоступен. Обычные public query
|
|
563
|
+
идут в прежний persister, а query с `,(0,c.jsx)(t.code,{children:`sessionPersistence`}),` — в отдельный cache активной сессии с независимым `,(0,c.jsx)(t.code,{children:`maxEntries`}),`.`]}),`
|
|
535
564
|
`,(0,c.jsx)(t.p,{children:`Настройки foundation wrapper:`}),`
|
|
536
565
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`{
|
|
537
566
|
serialize: (query) => query,
|
|
@@ -1634,11 +1663,11 @@ npm run build
|
|
|
1634
1663
|
`,(0,c.jsx)(t.h3,{id:`queryclient-1`,children:`QueryClient`}),`
|
|
1635
1664
|
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`QueryBroadcastOptions`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.jsx)(t.td,{children:`Global query/mutation error callbacks.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createQueryClient`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Создаёт новый настроенный QueryClient.`})]})]})]}),`
|
|
1636
1665
|
`,(0,c.jsx)(t.h3,{id:`query-metadata-1`,children:`Query metadata`}),`
|
|
1637
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`AppQueryMeta`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.
|
|
1666
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`AppQueryMeta`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.jsx)(t.td,{children:`Public/session persistence и consumer metadata.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SessionQueryPersistencePolicy`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.jsx)(t.td,{children:`Имя и bounded limit session cache.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`persistedQueryMeta`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Opt-in public persistence marker.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`sessionScopedQueryMeta`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Session reset marker без browser persistence.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createSessionQueryPersistenceMeta`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Явный opt-in bounded persistence текущей server session.`})]})]})]}),`
|
|
1638
1667
|
`,(0,c.jsx)(t.h3,{id:`persistence-project-adapter`,children:`Persistence project adapter`}),`
|
|
1639
1668
|
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`QueryPersistenceProjectAdapter`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.jsx)(t.td,{children:`Buster и system identifier resolver.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`configureQueryPersistenceProjectAdapter`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Заменяет global adapter.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getQueryPersistenceProjectAdapter`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Возвращает текущий adapter.`})]})]})]}),`
|
|
1640
1669
|
`,(0,c.jsx)(t.h3,{id:`indexeddb-persistence-1`,children:`IndexedDB persistence`}),`
|
|
1641
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`REACT_QUERY_PERSISTENCE_BUSTER`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Build-time default buster.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`REACT_QUERY_PERSISTENCE_MAX_AGE`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Persistent max age: 90 дней.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`shouldPersistQuery`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Opt-in predicate с session safety.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createIndexedDbQueryStorage`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`AsyncStorage поверх IndexedDB.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createReactQueryPersister`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Настроенный per-query TanStack persister.`})]})]})]}),`
|
|
1670
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`REACT_QUERY_PERSISTENCE_BUSTER`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Build-time default buster.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`REACT_QUERY_PERSISTENCE_MAX_AGE`})}),(0,c.jsx)(t.td,{children:`const`}),(0,c.jsx)(t.td,{children:`Persistent max age: 90 дней.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`shouldPersistQuery`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Opt-in predicate с session safety.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createIndexedDbQueryStorage`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`AsyncStorage поверх IndexedDB.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createReactQueryPersister`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Настроенный per-query TanStack persister.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`SessionQueryPersistenceScope`})}),(0,c.jsx)(t.td,{children:`type`}),(0,c.jsx)(t.td,{children:`Public session id и абсолютный expiresAt.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`getSessionQueryPersistenceScope`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Читает валидный активный browser scope.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`setSessionQueryPersistenceScope`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Меняет scope и очищает чужие snapshots.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`clearSessionQueryPersistence`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Удаляет один или все session snapshots.`})]})]})]}),`
|
|
1642
1671
|
`,(0,c.jsxs)(t.p,{children:[`Options type `,(0,c.jsx)(t.code,{children:`createIndexedDbQueryStorage`}),` не экспортируется отдельным symbol; используйте структурный object или `,(0,c.jsx)(t.code,{children:`Parameters<typeof createIndexedDbQueryStorage>[0]`}),`.`]}),`
|
|
1643
1672
|
`,(0,c.jsx)(t.h3,{id:`broadcast`,children:`Broadcast`}),`
|
|
1644
1673
|
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Symbol`}),(0,c.jsx)(t.th,{children:`Вид`}),(0,c.jsx)(t.th,{children:`Назначение`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`installReactQueryBroadcast`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Устанавливает data + event channels.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`setBroadcastFn`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Устанавливает global imperative sender.`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`broadcastCacheEvent`})}),(0,c.jsx)(t.td,{children:`function`}),(0,c.jsx)(t.td,{children:`Отправляет event через текущий sender.`})]})]})]}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Infrastructure/Notifications`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`notifications`,children:`Notifications`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/notifications`}),` хранит очередь коротких уведомлений и предоставляет два способа управления ею:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Bounded Copy Stack`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`ограниченный-стек-копий`,children:`Ограниченный стек копий`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль хранит небольшой список последних скопированных сущностей. Новый элемент помещается в начало, повтор по `,(0,c.jsx)(t.code,{children:`fingerprint`}),` обновляет существующую запись, а старые записи удаляются при превышении лимита.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Date`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`даты-время-и-календарные-диапазоны`,children:`Даты, время и календарные диапазоны`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль решает четыре связанные задачи:`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -10,6 +10,7 @@ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-I
|
|
|
10
10
|
`,(0,c.jsx)(t.p,{children:`Все функции и типы экспортируются через общий entrypoint:`}),`
|
|
11
11
|
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
12
12
|
formatDateAsDate,
|
|
13
|
+
formatInstantDateTime,
|
|
13
14
|
getCalendarPeriod,
|
|
14
15
|
normalizeDateRange,
|
|
15
16
|
parseDate,
|
|
@@ -35,6 +36,12 @@ date?.getHours(); // 18
|
|
|
35
36
|
date?.toISOString(); // "2026-03-03T13:03:50.000Z"
|
|
36
37
|
`})}),`
|
|
37
38
|
`,(0,c.jsxs)(t.p,{children:[`Локальные getters такого `,(0,c.jsx)(t.code,{children:`Date`}),` зависят от timezone среды. Используйте TZ-вариант, когда значение означает настоящий момент события: timestamp аудита, время серверного события, instant для сортировки между часовыми поясами.`]}),`
|
|
39
|
+
`,(0,c.jsx)(t.p,{children:`Для одинакового отображения абсолютной метки времени на SSR-сервере и в браузере
|
|
40
|
+
используйте явный часовой пояс IANA:`}),`
|
|
41
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`formatInstantDateTime("2026-09-04T10:22:28Z", {
|
|
42
|
+
timeZone: "Asia/Yekaterinburg"
|
|
43
|
+
}); // "4 сент. 2026 г., 15:22:28"
|
|
44
|
+
`})}),`
|
|
38
45
|
`,(0,c.jsx)(t.h3,{id:`простое-правило-выбора`,children:`Простое правило выбора`}),`
|
|
39
46
|
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Значение означает`}),(0,c.jsx)(t.th,{children:`Использовать`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Видимую календарную дату/время`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseDate`}),`, `,(0,c.jsx)(t.code,{children:`parseDateValue`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Абсолютный момент времени`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseDateTZ`}),`, `,(0,c.jsx)(t.code,{children:`parseDateValueTZ`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Строку для обычного UI`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDate*`}),` — внутри floating parser`]})]})]})]}),`
|
|
40
47
|
`,(0,c.jsxs)(t.p,{children:[`Не выбирайте вариант по наличию буквы `,(0,c.jsx)(t.code,{children:`Z`}),` во входе. Выбирайте по бизнес-смыслу данных.`]}),`
|
|
@@ -402,7 +409,7 @@ const unixMs = eventInstant?.getTime();
|
|
|
402
409
|
`,(0,c.jsx)(t.h3,{id:`регистрировать-preset-при-каждом-рендере`,children:`Регистрировать preset при каждом рендере`}),`
|
|
403
410
|
`,(0,c.jsx)(t.p,{children:`Реестр глобальный, а компиляция должна выполняться один раз. Настраивайте presets на bootstrap-stage.`}),`
|
|
404
411
|
`,(0,c.jsx)(t.h2,{id:`api-справка`,children:`API-справка`}),`
|
|
405
|
-
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Семейство`}),(0,c.jsx)(t.th,{children:`Публичный API`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Parsing`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseDateValue`}),`, `,(0,c.jsx)(t.code,{children:`parseDateValueTZ`}),`, `,(0,c.jsx)(t.code,{children:`parseDate`}),`, `,(0,c.jsx)(t.code,{children:`parseDateTZ`}),`, `,(0,c.jsx)(t.code,{children:`parseDateByPattern`}),`, `,(0,c.jsx)(t.code,{children:`parseDateByFormat`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Universal format`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`UI wrappers`}),(0,c.jsxs)(t.td,{children:[`все `,(0,c.jsx)(t.code,{children:`formatDateAsDate*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsMonth*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsTime*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDatetime*`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Machine wrappers`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsAbapYear`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapMonth`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDatetime`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataDatetime`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataTime`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Presets`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DATE_FORMAT_DEFAULTS`}),`, `,(0,c.jsx)(t.code,{children:`DEFAULT_DATE_PRESET_NAMES`}),`, `,(0,c.jsx)(t.code,{children:`DATE_FORMAT_STYLE_PRESET_NAMES`}),`, `,(0,c.jsx)(t.code,{children:`getDatePreset`}),`, `,(0,c.jsx)(t.code,{children:`getDatePresetNames`}),`, `,(0,c.jsx)(t.code,{children:`registerDatePreset`}),`, `,(0,c.jsx)(t.code,{children:`resetDatePresets`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateFormatName`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateFormatPreset`}),`, type guards`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Calendar`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createCalendarDate`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getEndOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfWeek`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfMonth`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfYear`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarDays`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarMonths`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarYears`}),`, `,(0,c.jsx)(t.code,{children:`isSameCalendarDay`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ranges`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isValidDate`}),`, `,(0,c.jsx)(t.code,{children:`isDateRangeTuple`}),`, `,(0,c.jsx)(t.code,{children:`cloneDate`}),`, `,(0,c.jsx)(t.code,{children:`orderDates`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateRangePair`}),`, `,(0,c.jsx)(t.code,{children:`normalizeDateRange`}),`, `,(0,c.jsx)(t.code,{children:`requireDateRange`}),`, `,(0,c.jsx)(t.code,{children:`countCalendarDaysInDateRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Periods`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`isDateInsideCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`isCalendarPeriodWithinDateBounds`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Relative ranges`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeDateRangeReferenceDate`}),`, `,(0,c.jsx)(t.code,{children:`resolveTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveYesterdayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToYesterdayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthAgoRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Education`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`formatEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`formatEducationTimeKey`}),`, `,(0,c.jsx)(t.code,{children:`createEducationDateTime`}),`, `,(0,c.jsx)(t.code,{children:`getEducationYear`}),`, `,(0,c.jsx)(t.code,{children:`getEducationYearRange`}),`, `,(0,c.jsx)(t.code,{children:`isEducationDateInCurrentYear`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekStartDate`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekRange`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekDays`}),`, `,(0,c.jsx)(t.code,{children:`getCurrentEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`normalizeEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`resolveEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`isCurrentEducationWeek`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Pattern metadata`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DATE_PATTERN_DATE_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TIME_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKEN_RE`})]})]})]})]}),`
|
|
412
|
+
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Семейство`}),(0,c.jsx)(t.th,{children:`Публичный API`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Parsing`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseDateValue`}),`, `,(0,c.jsx)(t.code,{children:`parseDateValueTZ`}),`, `,(0,c.jsx)(t.code,{children:`parseDate`}),`, `,(0,c.jsx)(t.code,{children:`parseDateTZ`}),`, `,(0,c.jsx)(t.code,{children:`parseDateByPattern`}),`, `,(0,c.jsx)(t.code,{children:`parseDateByFormat`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Universal format`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateRange`}),`, `,(0,c.jsx)(t.code,{children:`formatInstantDateTime`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`UI wrappers`}),(0,c.jsxs)(t.td,{children:[`все `,(0,c.jsx)(t.code,{children:`formatDateAsDate*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsMonth*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsTime*`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsDatetime*`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Machine wrappers`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`formatDateAsAbapYear`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapMonth`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsAbapDatetime`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataDate`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataDatetime`}),`, `,(0,c.jsx)(t.code,{children:`formatDateAsODataTime`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Presets`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DATE_FORMAT_DEFAULTS`}),`, `,(0,c.jsx)(t.code,{children:`DEFAULT_DATE_PRESET_NAMES`}),`, `,(0,c.jsx)(t.code,{children:`DATE_FORMAT_STYLE_PRESET_NAMES`}),`, `,(0,c.jsx)(t.code,{children:`getDatePreset`}),`, `,(0,c.jsx)(t.code,{children:`getDatePresetNames`}),`, `,(0,c.jsx)(t.code,{children:`registerDatePreset`}),`, `,(0,c.jsx)(t.code,{children:`resetDatePresets`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateFormatName`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateFormatPreset`}),`, type guards`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Calendar`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createCalendarDate`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getEndOfDay`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfWeek`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfMonth`}),`, `,(0,c.jsx)(t.code,{children:`getStartOfYear`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarDays`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarMonths`}),`, `,(0,c.jsx)(t.code,{children:`addCalendarYears`}),`, `,(0,c.jsx)(t.code,{children:`isSameCalendarDay`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Ranges`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isValidDate`}),`, `,(0,c.jsx)(t.code,{children:`isDateRangeTuple`}),`, `,(0,c.jsx)(t.code,{children:`cloneDate`}),`, `,(0,c.jsx)(t.code,{children:`orderDates`}),`, `,(0,c.jsx)(t.code,{children:`resolveDateRangePair`}),`, `,(0,c.jsx)(t.code,{children:`normalizeDateRange`}),`, `,(0,c.jsx)(t.code,{children:`requireDateRange`}),`, `,(0,c.jsx)(t.code,{children:`countCalendarDaysInDateRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Periods`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`isDateInsideCalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`isCalendarPeriodWithinDateBounds`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Relative ranges`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`normalizeDateRangeReferenceDate`}),`, `,(0,c.jsx)(t.code,{children:`resolveTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveYesterdayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToTodayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthStartToYesterdayRange`}),`, `,(0,c.jsx)(t.code,{children:`resolveMonthAgoRange`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Education`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`parseEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`formatEducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`formatEducationTimeKey`}),`, `,(0,c.jsx)(t.code,{children:`createEducationDateTime`}),`, `,(0,c.jsx)(t.code,{children:`getEducationYear`}),`, `,(0,c.jsx)(t.code,{children:`getEducationYearRange`}),`, `,(0,c.jsx)(t.code,{children:`isEducationDateInCurrentYear`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekStartDate`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekRange`}),`, `,(0,c.jsx)(t.code,{children:`getEducationWeekDays`}),`, `,(0,c.jsx)(t.code,{children:`getCurrentEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`normalizeEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`resolveEducationWeekKey`}),`, `,(0,c.jsx)(t.code,{children:`isCurrentEducationWeek`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Pattern metadata`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DATE_PATTERN_DATE_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TIME_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKENS`}),`, `,(0,c.jsx)(t.code,{children:`DATE_PATTERN_TOKEN_RE`})]})]})]})]}),`
|
|
406
413
|
`,(0,c.jsxs)(t.p,{children:[`Соответствующие types (`,(0,c.jsx)(t.code,{children:`DateFormatPreset`}),`, `,(0,c.jsx)(t.code,{children:`FormatDateOptions`}),`, range/period/education types и parse options) экспортируются из того же `,(0,c.jsx)(t.code,{children:`/formatters`}),` entrypoint.`]}),`
|
|
407
414
|
`,(0,c.jsx)(t.h3,{id:`каталог-публичных-типов`,children:`Каталог публичных типов`}),`
|
|
408
415
|
`,(0,c.jsxs)(t.table,{children:[(0,c.jsx)(t.thead,{children:(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.th,{children:`Область`}),(0,c.jsx)(t.th,{children:`Типы`})]})}),(0,c.jsxs)(t.tbody,{children:[(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Parsing и format`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`DateInputSource`}),`, `,(0,c.jsx)(t.code,{children:`ParsedDateValue`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPattern`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatStyle`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPrecision`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPreset`}),`, `,(0,c.jsx)(t.code,{children:`DateFormatPresetConfig`}),`, `,(0,c.jsx)(t.code,{children:`FormatDateOptions`}),`, `,(0,c.jsx)(t.code,{children:`ParseDateByPatternOptions`}),`, `,(0,c.jsx)(t.code,{children:`ParseDateByFormatOptions`}),`, `,(0,c.jsx)(t.code,{children:`ResolveDateFormatPresetOptions`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Диапазоны`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`NullableDateRange`}),`, `,(0,c.jsx)(t.code,{children:`DateRange`}),`, `,(0,c.jsx)(t.code,{children:`DateRangeInput`}),`, `,(0,c.jsx)(t.code,{children:`DateRangeTimeMode`}),`, `,(0,c.jsx)(t.code,{children:`NormalizeDateRangeOptions`}),`, `,(0,c.jsx)(t.code,{children:`DateRangeReferenceContext`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Периоды`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`CalendarPeriod`}),`, `,(0,c.jsx)(t.code,{children:`CalendarPeriodOptions`}),`, `,(0,c.jsx)(t.code,{children:`CalendarPeriodSelectionMode`}),`, `,(0,c.jsx)(t.code,{children:`CalendarWeekEndDay`}),`, `,(0,c.jsx)(t.code,{children:`CalendarPeriodDateBounds`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Учебный календарь`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`EducationDateKey`}),`, `,(0,c.jsx)(t.code,{children:`EducationYearRange`}),`, `,(0,c.jsx)(t.code,{children:`EducationWeekRange`})]})]})]})]}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/SAP/Transport Requests`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`sap-transport-requests-через-ryuzaki13react-foundation-apitransport`,children:[`SAP transport requests через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/transport`})]}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль получает transport requests текущего пользователя из SAP UI2 OData endpoints и нормализует workbench/customizing records.`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.blockquote,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Transport/HTTP`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`обычный-http-через-ryuzaki13react-foundation-apihttp`,children:[`Обычный HTTP через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/http`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль выполняет нейтральные HTTP/REST запросы и создаёт функции, совместимые с TanStack Query. Внешний payload остаётся `,(0,c.jsx)(t.code,{children:`unknown`}),`, пока consumer явно не проверит его через `,(0,c.jsx)(t.code,{children:`parse`}),`.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Boolean`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`boolean-и-abap-boolean`,children:`Boolean и ABAP boolean`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Подмодуль `,(0,c.jsx)(t.code,{children:`boolean`}),` преобразует значения между JavaScript `,(0,c.jsx)(t.code,{children:`boolean`}),` и двухсимвольным ABAP-контрактом:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Pipeline`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`formatter-pipeline`,children:`Formatter pipeline`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Formatter pipeline — конфигурируемая последовательность преобразований значения ячейки. Она умеет:`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Contracts/Common Types`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`общие-технические-типы`,children:`Общие технические типы`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль содержит небольшие общие TypeScript-контракты для value state, ABAP boolean, базовых значений, диапазонов и строк таблицы. Единственная runtime-функция — `,(0,c.jsx)(t.code,{children:`isBaseType`}),`.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Number Scale`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`number-scale`,children:`Number Scale`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/number-scale`}),` содержит чистую математику для slider, range, числовой шкалы и управления значением с клавиатуры. Модуль не содержит React-компонентов и не рисует ползунок.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Он решает четыре связанные задачи:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Copy`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`копирование-текста`,children:`Копирование текста`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`copy`}),` содержит React hooks для копирования текста в системный буфер обмена, чтения текста из DOM-элемента и показа короткого состояния «скопировано».`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Основные сценарии:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Range Output`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`подстановка-открытых-границ`,children:`Подстановка открытых границ`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль хранит в UI открытые границы диапазона как `,(0,c.jsx)(t.code,{children:`null`}),`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`содержание`,children:`Содержание`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Array`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`работа-с-массивами`,children:`Работа с массивами`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`array`}),` содержит небольшие типизированные функции для типовых операций с массивами:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Media`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`адаптивность-и-media-queries`,children:`Адаптивность и media queries`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`media`}),` содержит общий низкоуровневый контракт адаптивности для React-приложений:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Excel`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`excel`,children:`Excel`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/excel`}),` формирует и скачивает `,(0,c.jsx)(t.code,{children:`.xlsx`}),`-файлы в браузере. Он поддерживает:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -159,6 +159,50 @@ buildExcelAutoFilterRef(0, 10); // undefined
|
|
|
159
159
|
`,(0,c.jsx)(t.p,{children:`Каждый лист имеет собственные колонки, ширины, строки, стили и filter. Порядок массива — порядок вкладок Excel.`}),`
|
|
160
160
|
`,(0,c.jsxs)(t.p,{children:[`Пустой массив `,(0,c.jsx)(t.code,{children:`sheets`}),` приводит к ошибке: «Для формирования Excel-книги нужен минимум один лист».`]}),`
|
|
161
161
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`fileName`}),` передаётся browser writer. Рекомендуется явно добавлять расширение `,(0,c.jsx)(t.code,{children:`.xlsx`}),` и заранее очищать пользовательский ввод от нежелательных символов имени файла.`]}),`
|
|
162
|
+
`,(0,c.jsx)(t.h2,{id:`произвольная-матрица-и-параметры-печати`,children:`Произвольная матрица и параметры печати`}),`
|
|
163
|
+
`,(0,c.jsxs)(t.p,{children:[`Для расписаний, печатных форм и других документов без обычной строки колонок
|
|
164
|
+
используйте `,(0,c.jsx)(t.code,{children:`createExcelMatrixWorkbookBlob`}),` или `,(0,c.jsx)(t.code,{children:`downloadExcelMatrixWorkbook`}),`.
|
|
165
|
+
Доменный consumer передаёт уже готовые строки и стили ячеек, а foundation API
|
|
166
|
+
отвечает за имена листов, объединения, OpenXML print area, повтор заголовков и
|
|
167
|
+
ручные разрывы страниц.`]}),`
|
|
168
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { downloadExcelMatrixWorkbook } from "@ryuzaki13/react-foundation-lib/excel";
|
|
169
|
+
|
|
170
|
+
await downloadExcelMatrixWorkbook("Расписание.xlsx", {
|
|
171
|
+
// Базовый шрифт Normal определяет, сколько пикселей занимает символьная
|
|
172
|
+
// ширина из \`columns[].width\`, даже если ячейки используют другой шрифт.
|
|
173
|
+
defaultFont: { fontFamily: "Verdana", fontSize: 12 },
|
|
174
|
+
sheets: [
|
|
175
|
+
{
|
|
176
|
+
name: "Неделя",
|
|
177
|
+
rows: [[{ value: "Расписание", type: String, columnSpan: 2 }, null]],
|
|
178
|
+
columns: [{ width: 8 }, { width: 24 }],
|
|
179
|
+
showGridLines: false,
|
|
180
|
+
print: {
|
|
181
|
+
orientation: "portrait",
|
|
182
|
+
paperSize: "a4",
|
|
183
|
+
fitToWidthPages: 0,
|
|
184
|
+
fitToHeightPages: 1,
|
|
185
|
+
repeatRows: [1, 1],
|
|
186
|
+
columnBreaksAfter: [12],
|
|
187
|
+
printArea: { firstRow: 1, lastRow: 20, firstColumn: 1, lastColumn: 24 },
|
|
188
|
+
footer: { left: "Отчёт 7c9134", includePageNumber: true }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
`})}),`
|
|
194
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`columnBreaksAfter`}),` и `,(0,c.jsx)(t.code,{children:`rowBreaksAfter`}),` используют one-based номер последней
|
|
195
|
+
колонки или строки страницы. Например, `,(0,c.jsx)(t.code,{children:`columnBreaksAfter: [12]`}),` переносит
|
|
196
|
+
колонку `,(0,c.jsx)(t.code,{children:`M`}),` на следующую страницу. `,(0,c.jsx)(t.code,{children:`fitToHeightPages`}),` и `,(0,c.jsx)(t.code,{children:`fitToWidthPages`}),` должны
|
|
197
|
+
быть целыми неотрицательными: ноль означает автоматическое число страниц по
|
|
198
|
+
этой оси.`]}),`
|
|
199
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`defaultFont`}),` задаёт шрифт стиля Normal всей книги. Excel измеряет символьную
|
|
200
|
+
ширину столбца относительно этого шрифта, поэтому одинаковое значение
|
|
201
|
+
`,(0,c.jsx)(t.code,{children:`columns[].width`}),` при разных базовых шрифтах может давать разную ширину в
|
|
202
|
+
пикселях. Стили отдельных ячеек при этом остаются независимыми.`]}),`
|
|
203
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`createExcelMatrixWorkbookBlob`}),` не инициирует скачивание и подходит для preview
|
|
204
|
+
и проверки сформированного файла. `,(0,c.jsx)(t.code,{children:`downloadExcelMatrixWorkbook`}),` делегирует
|
|
205
|
+
browser download общему `,(0,c.jsx)(t.code,{children:`downloadFileFromBlob`}),`.`]}),`
|
|
162
206
|
`,(0,c.jsx)(t.h2,{id:`имена-листов`,children:`Имена листов`}),`
|
|
163
207
|
`,(0,c.jsx)(t.h3,{id:`resolveexcelsheetnamesnames`,children:(0,c.jsx)(t.code,{children:`resolveExcelSheetNames(names)`})}),`
|
|
164
208
|
`,(0,c.jsxs)(t.p,{children:[`Excel ограничивает имя листа 31 символом и запрещает управляющие символы, `,(0,c.jsx)(t.code,{children:`[ ] / \\ : * ?`}),`. Helper:`]}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Formatters/Обзор`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`ryuzaki13react-foundation-libformatters`,children:(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formatters`})}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`formatters`}),` — большой модуль подготовки значений для интерфейса и transport-контрактов. Он работает с датами, числами, строками, boolean/ABAP-флагами, ФИО, российскими телефонами, ведущими нулями и семантическими состояниями. Для таблиц модуль также предоставляет конфигурируемый formatter pipeline и row-based формулы.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Документация разделена по предметным областям, чтобы разработчику не приходилось читать один огромный файл. Этот README объясняет общие правила, помогает выбрать API и подробно описывает небольшие helpers верхнего уровня.`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/API/Crypto`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`идентификаторы-и-строковые-hash`,children:`Идентификаторы и строковые hash`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`crypto`}),` предоставляет небольшие функции для двух разных задач:`]}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,blockquote:`blockquote`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,h4:`h4`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/Table and Tree Table`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`table-и-tree-table`,children:`Table и Tree Table`}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Эта страница описывает два связанных публичных модуля:`}),`
|
|
4
4
|
`,(0,c.jsxs)(t.ul,{children:[`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Data/String Comparison`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`сравнение-строк`,children:`Сравнение строк`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`compareStrings`}),` задаёт единый порядок строк для русскоязычных UI-списков, смешанной кириллицы/латиницы и числовых суффиксов.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={code:`code`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation Lib/Browser/Client Fingerprint`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`client-fingerprint`,children:`Client fingerprint`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`getClientFingerprint`}),` лениво загружает FingerprintJS, получает `,(0,c.jsx)(t.code,{children:`visitorId`}),` и кеширует Promise на всё время жизни JavaScript-модуля.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-DWvPB8Sk.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-B_u8Yt1Z.js";function o(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...n(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(i,{title:`Foundation API/Query/Generic Resource`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`generic-resources-через-ryuzaki13react-foundation-apiresource`,children:[`Generic resources через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/resource`})]}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль описывает transport-agnostic ресурс поверх TanStack Query: стабильные query keys, проверку scope, произвольные read/write operations и cache strategies после mutation.`}),`
|
|
4
4
|
`,(0,c.jsx)(t.h2,{id:`для-кого-этот-документ`,children:`Для кого этот документ`}),`
|