@ryuzaki13/react-foundation-ui 1.8.12 → 1.8.13
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/package.json +2 -2
- package/storybook-static/assets/{Badge-CveIo2LZ.js → Badge-BFhBl7yM.js} +1 -1
- package/storybook-static/assets/{Badge.stories-Bd8M64xJ.js → Badge.stories-BEu55X4s.js} +1 -1
- package/storybook-static/assets/{BadgeList-xT41a0VL.js → BadgeList-mqmnGtRR.js} +1 -1
- package/storybook-static/assets/{Button-C5bBSb3k.js → Button-CESdnWrO.js} +1 -1
- package/storybook-static/assets/{Button-DkDgfpHL.js → Button-_YPAu9sd.js} +1 -1
- package/storybook-static/assets/{Button.stories-CeKPeGK5.js → Button.stories-B0Y_T17B.js} +1 -1
- package/storybook-static/assets/{CalendarView-CEqcrblx.js → CalendarView-DLuO2Ywz.js} +1 -1
- package/storybook-static/assets/{CheckBox-DKeFkdOt.js → CheckBox-CGiNmAPT.js} +1 -1
- package/storybook-static/assets/{CheckBox-OVvAarW-.js → CheckBox-l0pbBm9z.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CfZ0p1yo.js → CheckBox.stories-ROPAnqh8.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-BWW7zrfs.js → Color-6AOWCN3U-kPaRN0HS.js} +1 -1
- package/storybook-static/assets/{ContextMenu-xn2GtiLR.js → ContextMenu-Bob4DtRn.js} +1 -1
- package/storybook-static/assets/{ContextMenu-kia7is1N.js → ContextMenu-DxfUAeJS.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-CYuy9uXF.js → ContextMenu.stories-DCJmWy5n.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-C4w-APws.js → CustomOptionButton-DuEz9CXt.js} +1 -1
- package/storybook-static/assets/{DateInput-BiUFIihm.js → DateInput-BQ8SoeLE.js} +1 -1
- package/storybook-static/assets/{DateInput-DAzE5mCE.js → DateInput-DmNLD4Dz.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BcowGCRD.js → DateInput.stories-sTpYf7Ob.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CQm4dNLR.js → DateRangePresetSelect-DRq4eJ2n.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-RIyqNBk9.js → DateRangePresetSelect-fgJfLaLO.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-ypGyuGfy.js → DateRangePresetSelect.stories-ib7Qh_BB.js} +1 -1
- package/storybook-static/assets/{Detail-CEypL2Nh.js → Detail-CJniLn1R.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DNkT7B-u.js → Detail.stories-BXjdNaL-.js} +1 -1
- package/storybook-static/assets/{Dialog-BVFFQJDH.js → Dialog-D6a_qzr3.js} +1 -1
- package/storybook-static/assets/{Dialog-DD0grLG3.js → Dialog-DOYnnXlU.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-DSCypHqR.js → Dialog.stories-B1cZLRK3.js} +1 -1
- package/storybook-static/assets/{Disclosure-DauUgrev.js → Disclosure-Chh5o_0s.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-B1qB8vQZ.js → Disclosure.stories-Cvdvf7V8.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-D9oCCeHf.js → DisclosureGroup-CRnQOgVj.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CmSf6tXp.js → DocsRenderer-JROSPFPF-BBiErkeC.js} +1 -1
- package/storybook-static/assets/{DropZone-D8hbPCAv.js → DropZone-Bm5gqdi9.js} +1 -1
- package/storybook-static/assets/{DropZone-D42ueN1w.js → DropZone-C4L7JAlq.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-DO-T_Bh4.js → DropZone.stories-BhA9q8Qv.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CknJDoji.js → DropdownMenu-DtZNSUHF.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Dqi_bo3c.js → ExpandableActionPanel-0ugXlJy_.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-BD9QZGZN.js → ExpandableActionPanel.stories-CLgMlA9k.js} +1 -1
- package/storybook-static/assets/{Flex-CaVn1IOP.js → Flex-CJlia-8f.js} +1 -1
- package/storybook-static/assets/{Flex.stories-Bp9Y6q6b.js → Flex.stories-DCvfi1EY.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-U7tx-Jlw.js → FloatingPopover-CsnfPiwV.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-pmmhsAbN.js → FormattedTableCell-Dz5xWVYO.js} +1 -1
- package/storybook-static/assets/{Grid-CEpMNurH.js → Grid-C-KwTRAM.js} +1 -1
- package/storybook-static/assets/{Grid.stories-BM-gO5DN.js → Grid.stories-CzbqknNR.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BWz5XU6U.js → ImageCropper.stories-DaE-gm-b.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BTYZEX5t.js → ImageRenderer-IsNCXCrZ.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-Dz2STM95.js → ImageRenderer.stories-BbsjUEfJ.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DBVe0an3.js → ImageView.stories-DY0UITYz.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-C4Px97lD.js → ImageViewer.stories--9q9b9nv.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-TJtlJVfa.js → ImageViewerRuntime-CNEH3XGN.js} +1 -1
- package/storybook-static/assets/{Input-CIPgijvW.js → Input-DLubbE7P.js} +1 -1
- package/storybook-static/assets/{Input-D8io9jVS.js → Input-Dw2JblYt.js} +1 -1
- package/storybook-static/assets/{Input.stories-SUk3aYaC.js → Input.stories-DQeyDULG.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DA5pIDuE.js → InputDateTime-BRzl8Vrt.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-DeudzDSU.js → InputDateTime.stories-BJTj5v8J.js} +1 -1
- package/storybook-static/assets/{InputFile-CGAC7ruP.js → InputFile-B8UroZji.js} +1 -1
- package/storybook-static/assets/{InputFile-C5mp5Y5I.js → InputFile-DPftxjGw.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-Cx1xQ6PE.js → InputFile.stories-C7yyqHqc.js} +1 -1
- package/storybook-static/assets/{InputFiles-B7OBcPJN.js → InputFiles-BQVXHVLy.js} +1 -1
- package/storybook-static/assets/{InputFiles-Hzl89Ghf.js → InputFiles-UD_9S7-N.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CG6QjDZH.js → InputFiles.stories-DjjJS5pZ.js} +1 -1
- package/storybook-static/assets/{InputFilesList-B6htWHF1.js → InputFilesList-BNjijD3Y.js} +1 -1
- package/storybook-static/assets/{InputImage-BTa4S4Wp.js → InputImage-C-pHr-Sx.js} +1 -1
- package/storybook-static/assets/{InputImage-CQnoblAE.js → InputImage-DbcbqIhY.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-CEI44Eyz.js → InputImage.stories-D-TC9r9t.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-B0ypWz1x.js → InteractiveComponents-DbhWgM9y.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-BadApta9.js → InteractiveComponents.stories-B4mkVSea.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-C_Uz7Tnj.js → LayoutPicker-BoV_E3qt.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-COB9GlV_.js → LayoutPicker-w1EsRpYP.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Btp0IcaL.js → LayoutPicker.stories--ChGnGxf.js} +1 -1
- package/storybook-static/assets/{Listbox-AAaZGSAl.js → Listbox-CzZRsr6a.js} +1 -1
- package/storybook-static/assets/{Listbox-CyfuZw7w.js → Listbox-qZdTi11b.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-NDKQmjyQ.js → Listbox.stories-C9k_1850.js} +1 -1
- package/storybook-static/assets/{Modal-BJDnJ4zv.js → Modal-DCpul8QM.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D_X5lTLO.js → Modal.stories-Cy0Xd4LF.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-ShDjozpW.js → ModalManagerProvider-BrPVMcHV.js} +1 -1
- package/storybook-static/assets/{MultiSelect-DqXfrjcH.js → MultiSelect-BEQdl-F4.js} +1 -1
- package/storybook-static/assets/{MultiSelect-B5CElQ3-.js → MultiSelect-Dy4X94E2.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-fB3mcFmx.js → MultiSelect.stories-FuzejJmz.js} +1 -1
- package/storybook-static/assets/{NoData-DDb0G7T8.js → NoData-BsQ9EfkA.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-CIGL-pKX.js → NotificationsHost-BSrODvw7.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-B_MRb3fs.js → NotificationsHost.stories-DeiWspcY.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-DQAitH4N.js → ODataMultiSelect-BEz9gcd2.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-DwW221S9.js → ODataMultiSelect.stories-BwMgAkbE.js} +1 -1
- package/storybook-static/assets/{ODataSelect-tiZhOIhE.js → ODataSelect-BgC7GHOv.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-BhaatPjK.js → ODataSelect.stories-DEIRAB-s.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-B9WqJ-Un.js → ODataTreeMultiSelect-WyZZuX0_.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-CAfKuhfU.js → ODataTreeMultiSelect.stories-B6cxuagy.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-Cel1phxZ.js → ODataTreeSelect-OJGi3-S7.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-BpBCpBA9.js → ODataTreeSelect.stories-wGRGErCH.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-BSeGbz02.js → OneStepScroller-DycQ3RuL.js} +1 -1
- package/storybook-static/assets/{Option-BBtQ3GdK.js → Option-taxbFfjo.js} +1 -1
- package/storybook-static/assets/{OptionButton-B9nZuqqW.js → OptionButton-Q0QaPCII.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DA_zjcdA.js → PeriodSelect-DUJ2nF3F.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-BGvhR3to.js → PeriodSelect-DnM7x-uC.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-DDP1eXyM.js → PeriodSelect.stories-Db0bqe3J.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-BgvzqRBd.js → PickerTriggerActions-CGJd7xmR.js} +1 -1
- package/storybook-static/assets/{Popover-C0NebUMz.js → Popover-B6oidz5p.js} +1 -1
- package/storybook-static/assets/{Popover-BQql18MF.js → Popover-Tbhf8T81.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CIyDUtlz.js → Popover.stories-DE1LxZvv.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-BsgzPwCV.js → PresetRangeDateInput-CQ5FfmrL.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-htbxc3ni.js → PresetRangeDateInput-DfgoR0My.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-ClHM5Kah.js → PresetRangeDateInput.stories-CgoYAYBG.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Dcx0BOTx.js → PresetSelect-BPtAknAr.js} +1 -1
- package/storybook-static/assets/{README-BSh5XUR9.js → README--TpGcM95.js} +1 -1
- package/storybook-static/assets/{README-ByALXSEH.js → README-4iBHWAP5.js} +1 -1
- package/storybook-static/assets/{README-CHbo4O3Z.js → README-98KIgy5G.js} +1 -1
- package/storybook-static/assets/{README-eHCINzP3.js → README-B6II8p0W.js} +1 -1
- package/storybook-static/assets/{README-DDBqoI-T.js → README-B6vU5_7I.js} +1 -1
- package/storybook-static/assets/README-BFJVjjZR.js +325 -0
- package/storybook-static/assets/README-BIT4HlFP.js +441 -0
- package/storybook-static/assets/{README-DvAlDsh9.js → README-BK6Epio1.js} +1 -1
- package/storybook-static/assets/{README-5M8ajrJp.js → README-BRlPB5_k.js} +1 -1
- package/storybook-static/assets/{README-CH_6ZIO2.js → README-BTFpEaXG.js} +1 -1
- package/storybook-static/assets/{README-DnA-4W65.js → README-BWhXgC_o.js} +1 -1
- package/storybook-static/assets/{README-Byo6DxIF.js → README-BbNHvOoR.js} +1 -1
- package/storybook-static/assets/{README-Bqnqu1bC.js → README-BbunUo8b.js} +1 -1
- package/storybook-static/assets/{README-CsoHGRve.js → README-BmYpfZKr.js} +1 -1
- package/storybook-static/assets/{README-C8E1O7DQ.js → README-Bu5uvhAT.js} +1 -1
- package/storybook-static/assets/{README-DE2wk9-v.js → README-Bx6fvSBE.js} +1 -1
- package/storybook-static/assets/{README-Am6Fa6-b.js → README-Bx6gIGiA.js} +1 -1
- package/storybook-static/assets/README-ByhxsX44.js +324 -0
- package/storybook-static/assets/{README-qHKxXU95.js → README-Byi1FFpw.js} +1 -1
- package/storybook-static/assets/{README-D9OypaFB.js → README-C3Is3a3B.js} +1 -1
- package/storybook-static/assets/{README-CNHemCS2.js → README-C6prwAXw.js} +1 -1
- package/storybook-static/assets/{README-BmhhWWEk.js → README-C9S83J_G.js} +1 -1
- package/storybook-static/assets/{README-CM-7E-Jf.js → README-CGgxP5Zo.js} +1 -1
- package/storybook-static/assets/{README-BIq-FXcN.js → README-CJ2ZVG2U.js} +1 -1
- package/storybook-static/assets/{README-B45Cwj2a.js → README-CNGCAm5d.js} +1 -1
- package/storybook-static/assets/{README-CAGQnLsv.js → README-Cb_q420B.js} +1 -1
- package/storybook-static/assets/{README-BxjYCoYA.js → README-CtIDPNJ3.js} +1 -1
- package/storybook-static/assets/{README-C9eh0JLs.js → README-CzO3Dchr.js} +1 -1
- package/storybook-static/assets/{README-DEj2wSK0.js → README-D0rzQthv.js} +1 -1
- package/storybook-static/assets/{README-Dl92E69Z.js → README-DEQu7djz.js} +1 -1
- package/storybook-static/assets/{README-BYSgTTZt.js → README-DFihT_sm.js} +1 -1
- package/storybook-static/assets/{README-CIGfHKKE.js → README-DMiWsyv_.js} +1 -1
- package/storybook-static/assets/{README-B3bFglqG.js → README-DOx8lXXk.js} +1 -1
- package/storybook-static/assets/{README-CWfPiPIB.js → README-DPhDjr43.js} +1 -1
- package/storybook-static/assets/{README-DJHVgrpj.js → README-D_NqWPa9.js} +1 -1
- package/storybook-static/assets/README-DhJ5Rb1w.js +355 -0
- package/storybook-static/assets/{README-DV4fCpqN.js → README-DlwhWCvQ.js} +1 -1
- package/storybook-static/assets/README-Dxi73a2Q.js +740 -0
- package/storybook-static/assets/README-Dycov6NP.js +583 -0
- package/storybook-static/assets/README-GTBkSG4_.js +3591 -0
- package/storybook-static/assets/{README-ui-uanyg.js → README-Gfd9tLTw.js} +1 -1
- package/storybook-static/assets/{README-B6ltJiw3.js → README-Kfawetke.js} +1 -1
- package/storybook-static/assets/{README-DjCArsA5.js → README-UDBM7ZMT.js} +1 -1
- package/storybook-static/assets/{README-DIbfpC-2.js → README-VTWQxLm_.js} +1 -1
- package/storybook-static/assets/README-YHNWrTZv.js +400 -0
- package/storybook-static/assets/README-_0Otw0eD.js +448 -0
- package/storybook-static/assets/{README-Ss-3t1nX.js → README-aw2Xu9xu.js} +1 -1
- package/storybook-static/assets/{README-BuMMG4_N.js → README-eg1emlll.js} +1 -1
- package/storybook-static/assets/{README-B6Nq7NCU.js → README-iqQHdhZ4.js} +1 -1
- package/storybook-static/assets/{README-BB_JPejH.js → README-llxZAtCj.js} +1 -1
- package/storybook-static/assets/{README-5NhzH8VL.js → README-wFnEIGl4.js} +1 -1
- package/storybook-static/assets/{README-CeK4kfFO.js → README-webB1yH0.js} +1 -1
- package/storybook-static/assets/{README-C3UcjOGB.js → README-wtreGRCe.js} +1 -1
- package/storybook-static/assets/{RadioButton-YIQXt0wx.js → RadioButton-CNOLDk_o.js} +1 -1
- package/storybook-static/assets/{RadioButton-CWtjclwT.js → RadioButton-Ce05_q7s.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-Ah-CBpeC.js → RadioButton.stories-CPd4lTl0.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BnO-GL7A.js → RadioGroup-BtfD5Szd.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CUS0etBD.js → RadioGroup-Ccm7G-dv.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-DGwCawtU.js → RadioGroup.stories-D-RRPHwi.js} +1 -1
- package/storybook-static/assets/{Scrollable-D85fA6pO.js → Scrollable-DvdBIeig.js} +1 -1
- package/storybook-static/assets/{Select-gRnfvfGh.js → Select-8PV9PBKF.js} +1 -1
- package/storybook-static/assets/{Select-CGCxJjL9.js → Select-G04B41FM.js} +1 -1
- package/storybook-static/assets/{Select.stories-CMwt4F9i.js → Select.stories-Cf6CBhV8.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-BLXfKJ38.js → SerializableSelect-CdQdHIVp.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Bca1a9ZU.js → SerializableSelect.stories-0AKUGpbS.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CyeQN0Rd.js → SingleDateTimeInput-DWT1ORhL.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-xrmZckzw.js → SingleDateTimeInput-DattLt6w.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BYFTQM9z.js → SingleDateTimeInput.stories-BLJV3jzV.js} +1 -1
- package/storybook-static/assets/{Slider-D8GtXVGI.js → Slider-DKEI4cDd.js} +1 -1
- package/storybook-static/assets/{Slider-1yJ3uVeR.js → Slider-Dci-mJt_.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CyQ3ns_C.js → Slider.stories-Dp7oQueF.js} +1 -1
- package/storybook-static/assets/{SliderInput-ISSx9vH_.js → SliderInput-BGPQmlgY.js} +1 -1
- package/storybook-static/assets/{SliderInput-BOzHhEUA.js → SliderInput-BhjqGOKt.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-7ooTghrS.js → SliderInput.stories-DXNhRU3X.js} +1 -1
- package/storybook-static/assets/{Sortable-CCLiMmfZ.js → Sortable-CMd9l1Gd.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-B36szI6t.js → Sortable.stories-BN1cFEFJ.js} +1 -1
- package/storybook-static/assets/{Splitter-DQGhgRwx.js → Splitter-GL65TlI9.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Hsq1wYaq.js → Splitter.stories-q5PlI6rB.js} +1 -1
- package/storybook-static/assets/{StateSelect-C6hldFgO.js → StateSelect-Byik5-iZ.js} +1 -1
- package/storybook-static/assets/{StateSelect-DieNn4VC.js → StateSelect-CT0JF2V6.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CvAhDMix.js → StateSelect.stories-pPEPmgnN.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CUT1tvt-.js → StringToggle.stories-BQlFmCE7.js} +1 -1
- package/storybook-static/assets/{Switch-CX9p_uYU.js → Switch--xGPiYk-.js} +1 -1
- package/storybook-static/assets/{Switch-nEMRtcWe.js → Switch-DhaLI9CG.js} +1 -1
- package/storybook-static/assets/{Switch.stories-CPsHa2_m.js → Switch.stories-5DisgIyj.js} +1 -1
- package/storybook-static/assets/{Table-BhtITVtj.js → Table-Bf6MicdG.js} +1 -1
- package/storybook-static/assets/{Table.stories-nWNhSydG.js → Table.stories-CS7rQgj9.js} +1 -1
- package/storybook-static/assets/{Tabs-DMQFh2BJ.js → Tabs-B4y4y8Ap.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-D23_xvom.js → Tabs.stories-C0SpdGkh.js} +1 -1
- package/storybook-static/assets/{TabsBox-B5BsD_j_.js → TabsBox-C5LLLhnj.js} +1 -1
- package/storybook-static/assets/{TagInput-DO17z100.js → TagInput-D4BpuCoH.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-CMMFnIzb.js → TagInput.stories-rn2wtZP_.js} +1 -1
- package/storybook-static/assets/{Text-ClnbDqRk.js → Text-BhBt9e7C.js} +1 -1
- package/storybook-static/assets/{Textarea-DkhohiNc.js → Textarea-B-Hz7ujq.js} +1 -1
- package/storybook-static/assets/{Textarea-C2IO_zsP.js → Textarea-BHHxY5sd.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-NL6Aq8Vc.js → Textarea.stories-CZ2kWz20.js} +1 -1
- package/storybook-static/assets/{TimePanel-DNEPDlSW.js → TimePanel-Cg8fgFsn.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-DlfdPsz1.js → TimePanel.stories-BxdwtK2e.js} +1 -1
- package/storybook-static/assets/{Toggle-Cc6Ca-HI.js → Toggle-BWwfk9fi.js} +1 -1
- package/storybook-static/assets/{Toggle-3U5CceQN.js → Toggle-Ce9rbjBc.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-BR-hVLDp.js → Toggle.stories-0fzcmzKy.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-D9hMQN2O.js → TreeMultiSelect-B06Y0lIc.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-B0oBc-4y.js → TreeMultiSelect-CrAdR_jM.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-CslpbvPR.js → TreeMultiSelect.stories-CAVoj56E.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B_dMCe45.js → TreePickerBase-qU2xPlar.js} +1 -1
- package/storybook-static/assets/{TreeSelect-2lj0Q8gm.js → TreeSelect-BIHydJFy.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DEKNYF2b.js → TreeSelect-BKnWu0C7.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-CVDxn8Vm.js → TreeSelect.stories-Dp_8ybAf.js} +1 -1
- package/storybook-static/assets/{TreeTable-CBIpzYRL.js → TreeTable-pVXjU9dG.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-BMzrr2Kc.js → TreeTable.stories-CV_8Ui6R.js} +1 -1
- package/storybook-static/assets/{blocks-B5YBxaaS.js → blocks-BY40djCc.js} +3 -3
- package/storybook-static/assets/{check-BjtdCRaW.js → check-CVkPTDzp.js} +1 -1
- package/storybook-static/assets/{chevron-down-B4u-y8Z1.js → chevron-down-BtNO4Vhe.js} +1 -1
- package/storybook-static/assets/{chevron-left-BQfWs7Ah.js → chevron-left-kceSK3sZ.js} +1 -1
- package/storybook-static/assets/{chevron-right-ChokKd-f.js → chevron-right-BA_LO2El.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-meOkhzk4.js → chunk-W22LQPXL-yJiFPv6e.js} +1 -1
- package/storybook-static/assets/{circle-alert-B1AnDRf_.js → circle-alert-B2m4a1zz.js} +1 -1
- package/storybook-static/assets/{circle-check-JYnlcC1F.js → circle-check-Cfjhotlm.js} +1 -1
- package/storybook-static/assets/{components-C_wl1sL5.js → components-D6yV8PLX.js} +3 -3
- package/storybook-static/assets/{contextMenu-B-TUGs_1.js → contextMenu-B0pQBIW0.js} +1 -1
- package/storybook-static/assets/{download-eR3X8I-h.js → download-Lba8elK9.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-D95VPQ0b.js → floating-ui.react-BFNvfMpU.js} +1 -1
- package/storybook-static/assets/{foundationApi-QhHXpYLB.js → foundationApi-DZhnQ2cC.js} +1 -1
- package/storybook-static/assets/{foundationLib-CEAjnstw.js → foundationLib-CoVTo22U.js} +1 -1
- package/storybook-static/assets/{hooks-awde7r2r.js → hooks-Cc6eXN6U.js} +1 -1
- package/storybook-static/assets/iframe-BXM-JBuH.js +1 -0
- package/storybook-static/assets/{iframe-FSp_AjJa.js → iframe-o7sH2IXC.js} +3 -3
- package/storybook-static/assets/{info-12vmb1sT.js → info-BpsVP_dM.js} +1 -1
- package/storybook-static/assets/{odata-C0Kpvttz.js → odata-CXsbxsRY.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-BXZnk_C7.js → odataStoryFixtures-Dj_bzRqh.js} +1 -1
- package/storybook-static/assets/{react-BlCqWuXr.js → react-DeJ0JTHb.js} +1 -1
- package/storybook-static/assets/{refresh-cw-Bf5ufPte.js → refresh-cw-BvGyjEXe.js} +1 -1
- package/storybook-static/assets/{settings-2-DR-dTXIC.js → settings-2-BdXxnHos.js} +1 -1
- package/storybook-static/assets/{sortable-B5e5yb_-.js → sortable-XkyN-9r5.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-EVJARTec.js → syntaxhighlighter-QEQV7K2Y-Cafn3LV1.js} +1 -1
- package/storybook-static/assets/{trash-2-QP7TS18H.js → trash-2-uPH9-fND.js} +1 -1
- package/storybook-static/assets/{triangle-alert-qw19mxHr.js → triangle-alert-tT01vSMw.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-Csu_Cct9.js → useODataSelectBase-B2LlOwPZ.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-BAv-Twqf.js → useODataTreeData-CU7Rqcb9.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Da-XM_Y0.js → usePickerQuery-D8GHQ6KR.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-C0TdC2Pz.js → usePickerTriggerController-CcK1jmDy.js} +1 -1
- package/storybook-static/assets/{x-aCjYTirW.js → x-BlAURbAH.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/README--LCKbep-.js +0 -110
- package/storybook-static/assets/README-BXJneZAJ.js +0 -147
- package/storybook-static/assets/README-C6BOdXNV.js +0 -322
- package/storybook-static/assets/README-CC00hlZK.js +0 -527
- package/storybook-static/assets/README-Cj2e6HrF.js +0 -178
- package/storybook-static/assets/README-DN9HKtp_.js +0 -124
- package/storybook-static/assets/README-DNricOkt.js +0 -136
- package/storybook-static/assets/README-DoCA4JXf.js +0 -273
- package/storybook-static/assets/README-tm9QH9cF.js +0 -103
- package/storybook-static/assets/iframe-DzQq_POR.js +0 -1
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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 API/Adapters/Server Function`}),`
|
|
2
|
+
`,(0,c.jsxs)(t.h1,{id:`server-function-adapters-через-ryuzaki13react-foundation-apiserver-fn`,children:[`Server-function adapters через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/server-fn`})]}),`
|
|
3
|
+
`,(0,c.jsxs)(t.p,{children:[`Модуль адаптирует функцию с публичной формой `,(0,c.jsx)(t.code,{children:`serverFn({ data })`}),` к query/mutation operation из `,(0,c.jsx)(t.a,{href:`../resource/README.mdx`,children:(0,c.jsx)(t.code,{children:`/resource`})}),`. Сам пакет не импортирует TanStack Start и не запускает сервер.`]}),`
|
|
4
|
+
`,(0,c.jsx)(t.h2,{id:`модель`,children:`Модель`}),`
|
|
5
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`scope + args/input
|
|
6
|
+
│ buildData
|
|
7
|
+
▼
|
|
8
|
+
{ data }
|
|
9
|
+
│ serverFn или custom executor
|
|
10
|
+
▼
|
|
11
|
+
response
|
|
12
|
+
│ optional transform
|
|
13
|
+
▼
|
|
14
|
+
resource operation result
|
|
15
|
+
`})}),`
|
|
16
|
+
`,(0,c.jsx)(t.p,{children:`Подходит любая async-функция такого контракта:`}),`
|
|
17
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type ServerFnTransport<TData, TResponse> = (
|
|
18
|
+
request: { data: TData }
|
|
19
|
+
) => Promise<TResponse>;
|
|
20
|
+
`})}),`
|
|
21
|
+
`,(0,c.jsxs)(t.p,{children:[`Название `,(0,c.jsx)(t.code,{children:`server-fn`}),` описывает типичный источник функции. Оно не гарантирует server-only выполнение и не создаёт security boundary.`]}),`
|
|
22
|
+
`,(0,c.jsx)(t.p,{children:`Для начинающего разработчика:`}),`
|
|
23
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
24
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`serverFn`}),` — transport function framework-а;`]}),`
|
|
25
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`buildData`}),` — явный mapper application inputs в transport DTO;`]}),`
|
|
26
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`transform`}),` — mapper transport response в application result;`]}),`
|
|
27
|
+
`,(0,c.jsxs)(t.li,{children:[`resource operation — описание того, как generic `,(0,c.jsx)(t.code,{children:`/resource`}),` должен выполнить query/mutation.`]}),`
|
|
28
|
+
`]}),`
|
|
29
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`React component
|
|
30
|
+
│ useResourceQuery/useResourceMutation
|
|
31
|
+
▼
|
|
32
|
+
resource descriptor
|
|
33
|
+
│ execute context
|
|
34
|
+
▼
|
|
35
|
+
server-fn adapter
|
|
36
|
+
│ { data }
|
|
37
|
+
▼
|
|
38
|
+
framework server function stub
|
|
39
|
+
│ network/server boundary framework-а
|
|
40
|
+
▼
|
|
41
|
+
server handler
|
|
42
|
+
`})}),`
|
|
43
|
+
`,(0,c.jsxs)(t.p,{children:[`Этот package адаптирует только участок `,(0,c.jsx)(t.code,{children:`execute context → { data }`}),`. Он не реализует network protocol framework-а.`]}),`
|
|
44
|
+
`,(0,c.jsx)(t.h2,{id:`импорт`,children:`Импорт`}),`
|
|
45
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
46
|
+
createServerFnMutationOperation,
|
|
47
|
+
createServerFnQueryOperation
|
|
48
|
+
} from "@ryuzaki13/react-foundation-api/server-fn";
|
|
49
|
+
|
|
50
|
+
import type {
|
|
51
|
+
ServerFnTransport,
|
|
52
|
+
ServerFnTransportExecutor,
|
|
53
|
+
ServerFnTransportExecutorContext,
|
|
54
|
+
ServerFnTransportRequest
|
|
55
|
+
} from "@ryuzaki13/react-foundation-api/server-fn";
|
|
56
|
+
`})}),`
|
|
57
|
+
`,(0,c.jsxs)(t.p,{children:[`Нужен `,(0,c.jsx)(t.code,{children:`@tanstack/react-query`}),`; созданные operations обычно подключаются через `,(0,c.jsx)(t.code,{children:`/resource`}),` или `,(0,c.jsx)(t.code,{children:`/persisted`}),` descriptor.`]}),`
|
|
58
|
+
`,(0,c.jsx)(t.p,{children:`Пакет не имеет root import. Не импортируйте внутренний файл:`}),`
|
|
59
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`// Правильно.
|
|
60
|
+
import { createServerFnQueryOperation } from "@ryuzaki13/react-foundation-api/server-fn";
|
|
61
|
+
|
|
62
|
+
// Неправильно.
|
|
63
|
+
import { createServerFnQueryOperation } from "@ryuzaki13/react-foundation-api/src/server-fn/serverFn";
|
|
64
|
+
`})}),`
|
|
65
|
+
`,(0,c.jsx)(t.h2,{id:`query-operation`,children:`Query operation`}),`
|
|
66
|
+
`,(0,c.jsx)(t.p,{children:`Предположим, сгенерированная framework-функция принимает:`}),`
|
|
67
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type LoadOrdersData = {
|
|
68
|
+
companyId: string;
|
|
69
|
+
search: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
declare const loadOrdersServerFn: ServerFnTransport<
|
|
73
|
+
LoadOrdersData,
|
|
74
|
+
{ items: OrderDto[] }
|
|
75
|
+
>;
|
|
76
|
+
`})}),`
|
|
77
|
+
`,(0,c.jsx)(t.p,{children:`Adapter:`}),`
|
|
78
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const searchOrdersOperation = createServerFnQueryOperation({
|
|
79
|
+
serverFn: loadOrdersServerFn,
|
|
80
|
+
buildData: (companyId: string, args: { search: string }) => ({
|
|
81
|
+
companyId,
|
|
82
|
+
search: args.search
|
|
83
|
+
}),
|
|
84
|
+
transform: (response) => response.items.map(mapOrderDto),
|
|
85
|
+
staleTime: 60_000,
|
|
86
|
+
gcTime: 5 * 60_000,
|
|
87
|
+
isEnabled: (companyId, args) => Boolean(companyId && args.search.trim())
|
|
88
|
+
});
|
|
89
|
+
`})}),`
|
|
90
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildData`}),` получает валидный scope и query args. `,(0,c.jsx)(t.code,{children:`transform`}),` получает response и `,(0,c.jsx)(t.code,{children:`{ scope, args }`}),`; без transform result равен response.`]}),`
|
|
91
|
+
`,(0,c.jsxs)(t.p,{children:[`Созданный объект соответствует `,(0,c.jsx)(t.code,{children:`ResourceQueryOperation`}),`:`]}),`
|
|
92
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
93
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`execute({ scope, args, client, signal })`}),`;`]}),`
|
|
94
|
+
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`isEnabled`}),`;`]}),`
|
|
95
|
+
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`staleTime`}),`;`]}),`
|
|
96
|
+
`,(0,c.jsxs)(t.li,{children:[`optional `,(0,c.jsx)(t.code,{children:`gcTime`}),`.`]}),`
|
|
97
|
+
`]}),`
|
|
98
|
+
`,(0,c.jsx)(t.h3,{id:`полный-query-lifecycle`,children:`Полный query lifecycle`}),`
|
|
99
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`Resource проверяет scope/isEnabled
|
|
100
|
+
│
|
|
101
|
+
▼
|
|
102
|
+
operation.execute({ scope, args, client, signal })
|
|
103
|
+
│
|
|
104
|
+
▼
|
|
105
|
+
buildData(scope, args)
|
|
106
|
+
│
|
|
107
|
+
▼
|
|
108
|
+
executor(serverFn, { data }, { client, signal })
|
|
109
|
+
│
|
|
110
|
+
▼
|
|
111
|
+
server response
|
|
112
|
+
│
|
|
113
|
+
├─ transform задан ──► transform(response, { scope, args })
|
|
114
|
+
└─ transform нет ────► response
|
|
115
|
+
`})}),`
|
|
116
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`buildData`}),` вызывается на каждом фактическом execute, а не при создании descriptor-а.`]}),`
|
|
117
|
+
`,(0,c.jsx)(t.h3,{id:`scope-args-и-data--разные-вещи`,children:`Scope, args и data — разные вещи`}),`
|
|
118
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type Scope = string; // companyId
|
|
119
|
+
type Args = { search: string; page: number };
|
|
120
|
+
type Data = {
|
|
121
|
+
company: string;
|
|
122
|
+
query: string;
|
|
123
|
+
offset: number;
|
|
124
|
+
};
|
|
125
|
+
`})}),`
|
|
126
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`buildData: (companyId, args) => ({
|
|
127
|
+
company: companyId,
|
|
128
|
+
query: args.search.trim(),
|
|
129
|
+
offset: args.page * 50
|
|
130
|
+
})
|
|
131
|
+
`})}),`
|
|
132
|
+
`,(0,c.jsx)(t.p,{children:`Не передавайте args как data автоматически: имена/форматы transport DTO могут отличаться, а scope часто должен попасть внутрь request.`}),`
|
|
133
|
+
`,(0,c.jsx)(t.h3,{id:`isenabled`,children:(0,c.jsx)(t.code,{children:`isEnabled`})}),`
|
|
134
|
+
`,(0,c.jsx)(t.p,{children:`Callback получает nullable scope, потому что hook может быть вызван до готовности route/form state:`}),`
|
|
135
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isEnabled: (companyId, args) =>
|
|
136
|
+
Boolean(companyId && args.search.trim().length >= 2)
|
|
137
|
+
`})}),`
|
|
138
|
+
`,(0,c.jsxs)(t.p,{children:[`Сам adapter просто сохраняет callback в operation. Проверку выполняет `,(0,c.jsx)(t.code,{children:`/resource`}),` при построении query options. Не вызывайте `,(0,c.jsx)(t.code,{children:`operation.execute`}),` вручную с invalid scope и не ожидайте, что `,(0,c.jsx)(t.code,{children:`isEnabled`}),` внутри остановит его.`]}),`
|
|
139
|
+
`,(0,c.jsxs)(t.h3,{id:`staletime-и-gctime`,children:[(0,c.jsx)(t.code,{children:`staleTime`}),` и `,(0,c.jsx)(t.code,{children:`gcTime`})]}),`
|
|
140
|
+
`,(0,c.jsx)(t.p,{children:`Это hints TanStack Query lifecycle, а не transport timeout:`}),`
|
|
141
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
142
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`staleTime`}),` — сколько snapshot считается fresh;`]}),`
|
|
143
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`gcTime`}),` — когда неактивный snapshot можно удалить;`]}),`
|
|
144
|
+
`,(0,c.jsx)(t.li,{children:`они не прерывают network request;`}),`
|
|
145
|
+
`,(0,c.jsx)(t.li,{children:`они не определяют server cache.`}),`
|
|
146
|
+
`]}),`
|
|
147
|
+
`,(0,c.jsx)(t.h3,{id:`transform-и-runtime-validation`,children:`Transform и runtime validation`}),`
|
|
148
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`transform: (response, { scope, args }) => {
|
|
149
|
+
if (!response || !Array.isArray(response.items)) {
|
|
150
|
+
throw new Error("ServerFn response не содержит items");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return response.items.map((item) => mapOrderDto(item, scope, args));
|
|
154
|
+
}
|
|
155
|
+
`})}),`
|
|
156
|
+
`,(0,c.jsx)(t.p,{children:`TypeScript generic не проверяет response framework-а. Если server/client могут иметь разные versions или endpoint получает внешние данные, выполняйте runtime validation.`}),`
|
|
157
|
+
`,(0,c.jsxs)(t.p,{children:[`Ошибка `,(0,c.jsx)(t.code,{children:`buildData`}),`, executor или transform становится query error.`]}),`
|
|
158
|
+
`,(0,c.jsx)(t.h2,{id:`mutation-operation`,children:`Mutation operation`}),`
|
|
159
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`declare const saveOrderServerFn: ServerFnTransport<
|
|
160
|
+
{ companyId: string; order: SaveOrderDto },
|
|
161
|
+
{ order: OrderDto }
|
|
162
|
+
>;
|
|
163
|
+
|
|
164
|
+
const saveOrderOperation = createServerFnMutationOperation({
|
|
165
|
+
serverFn: saveOrderServerFn,
|
|
166
|
+
buildData: (companyId: string, input: SaveOrderInput) => ({
|
|
167
|
+
companyId,
|
|
168
|
+
order: mapSaveOrder(input)
|
|
169
|
+
}),
|
|
170
|
+
transform: (response) => mapOrderDto(response.order),
|
|
171
|
+
cacheStrategy: createInvalidateResourceScopeCacheStrategy()
|
|
172
|
+
});
|
|
173
|
+
`})}),`
|
|
174
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`transform`}),` получает `,(0,c.jsx)(t.code,{children:`{ scope, input }`}),`. `,(0,c.jsx)(t.code,{children:`cacheStrategy`}),` прикрепляется к operation и выполняется владельцем resource mutation после успешного ответа.`]}),`
|
|
175
|
+
`,(0,c.jsxs)(t.p,{children:[`Mutation operation не имеет `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` в generic resource contract. Custom executor получает `,(0,c.jsx)(t.code,{children:`{ client }`}),` без signal.`]}),`
|
|
176
|
+
`,(0,c.jsx)(t.h3,{id:`полный-mutation-lifecycle`,children:`Полный mutation lifecycle`}),`
|
|
177
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`useResourceMutation(...).mutate(input)
|
|
178
|
+
│
|
|
179
|
+
▼
|
|
180
|
+
operation.execute({ scope, input, client })
|
|
181
|
+
│
|
|
182
|
+
▼
|
|
183
|
+
buildData(scope, input)
|
|
184
|
+
│
|
|
185
|
+
▼
|
|
186
|
+
executor(serverFn, { data }, { client })
|
|
187
|
+
│
|
|
188
|
+
▼
|
|
189
|
+
optional transform(response, { scope, input })
|
|
190
|
+
│
|
|
191
|
+
▼
|
|
192
|
+
resource применяет cacheStrategy
|
|
193
|
+
`})}),`
|
|
194
|
+
`,(0,c.jsxs)(t.p,{children:[`Cache strategy выполняется только после успешного `,(0,c.jsx)(t.code,{children:`execute`}),`. Если `,(0,c.jsx)(t.code,{children:`transform`}),` бросил error, mutation считается failed и strategy не должна применяться.`]}),`
|
|
195
|
+
`,(0,c.jsx)(t.h3,{id:`body-mapping-без-mutation-input-leakage`,children:`Body mapping без mutation input leakage`}),`
|
|
196
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`type SaveOrderInput = {
|
|
197
|
+
localDraftId: string;
|
|
198
|
+
name: string;
|
|
199
|
+
amount: number;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
buildData: (companyId, input) => ({
|
|
203
|
+
companyId,
|
|
204
|
+
order: {
|
|
205
|
+
name: input.name.trim(),
|
|
206
|
+
amount: input.amount
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
`})}),`
|
|
210
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`localDraftId`}),` не уходит на server, если он не является частью transport contract.`]}),`
|
|
211
|
+
`,(0,c.jsx)(t.h3,{id:`cache-strategy-выбирается-явно`,children:`Cache strategy выбирается явно`}),`
|
|
212
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`cacheStrategy: createInvalidateResourceScopeCacheStrategy()
|
|
213
|
+
`})}),`
|
|
214
|
+
`,(0,c.jsxs)(t.p,{children:[`или точечный `,(0,c.jsx)(t.code,{children:`setQueryData`}),` strategy из `,(0,c.jsx)(t.code,{children:`/resource`}),`. Adapter только прикрепляет strategy к operation; выполняет её resource mutation layer.`]}),`
|
|
215
|
+
`,(0,c.jsx)(t.p,{children:`Без strategy server mutation может успешно завершиться, но cached lists/details останутся stale.`}),`
|
|
216
|
+
`,(0,c.jsx)(t.h2,{id:`подключение-к-resource-descriptor`,children:`Подключение к resource descriptor`}),`
|
|
217
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const ordersResource = createResourceDescriptor({
|
|
218
|
+
namespace: "sales",
|
|
219
|
+
resource: "orders",
|
|
220
|
+
operations: {
|
|
221
|
+
queries: { search: searchOrdersOperation },
|
|
222
|
+
mutations: { save: saveOrderOperation }
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const query = useResourceQuery(
|
|
227
|
+
ordersResource,
|
|
228
|
+
"search",
|
|
229
|
+
companyId,
|
|
230
|
+
{ search }
|
|
231
|
+
);
|
|
232
|
+
`})}),`
|
|
233
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`server-fn`}),` не экспортирует resource hooks повторно. Импортируйте их из `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/resource`}),`.`]}),`
|
|
234
|
+
`,(0,c.jsx)(t.h3,{id:`полный-descriptor-example`,children:`Полный descriptor example`}),`
|
|
235
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
|
|
236
|
+
createResourceDescriptor,
|
|
237
|
+
useResourceMutation,
|
|
238
|
+
useResourceQuery
|
|
239
|
+
} from "@ryuzaki13/react-foundation-api/resource";
|
|
240
|
+
import {
|
|
241
|
+
createServerFnMutationOperation,
|
|
242
|
+
createServerFnQueryOperation
|
|
243
|
+
} from "@ryuzaki13/react-foundation-api/server-fn";
|
|
244
|
+
|
|
245
|
+
const ordersResource = createResourceDescriptor({
|
|
246
|
+
namespace: "sales",
|
|
247
|
+
resource: "orders",
|
|
248
|
+
operations: {
|
|
249
|
+
queries: {
|
|
250
|
+
search: createServerFnQueryOperation({
|
|
251
|
+
serverFn: loadOrdersServerFn,
|
|
252
|
+
buildData: (companyId: string, args: { search: string }) => ({
|
|
253
|
+
companyId,
|
|
254
|
+
search: args.search
|
|
255
|
+
}),
|
|
256
|
+
transform: (response) => response.items.map(mapOrderDto),
|
|
257
|
+
isEnabled: (scope, args) => Boolean(scope && args.search.trim())
|
|
258
|
+
})
|
|
259
|
+
},
|
|
260
|
+
mutations: {
|
|
261
|
+
save: createServerFnMutationOperation({
|
|
262
|
+
serverFn: saveOrderServerFn,
|
|
263
|
+
buildData: (companyId: string, input: SaveOrderInput) => ({
|
|
264
|
+
companyId,
|
|
265
|
+
order: mapSaveOrder(input)
|
|
266
|
+
}),
|
|
267
|
+
transform: (response) => mapOrderDto(response.order),
|
|
268
|
+
cacheStrategy: createInvalidateResourceScopeCacheStrategy()
|
|
269
|
+
})
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
function Orders({ companyId, search }: { companyId: string; search: string }) {
|
|
275
|
+
const orders = useResourceQuery(
|
|
276
|
+
ordersResource,
|
|
277
|
+
"search",
|
|
278
|
+
companyId,
|
|
279
|
+
{ search }
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
const save = useResourceMutation(
|
|
283
|
+
ordersResource,
|
|
284
|
+
"save",
|
|
285
|
+
companyId
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// render loading/error/data and invoke save.mutate(input)
|
|
289
|
+
}
|
|
290
|
+
`})}),`
|
|
291
|
+
`,(0,c.jsx)(t.h2,{id:`custom-executor`,children:`Custom executor`}),`
|
|
292
|
+
`,(0,c.jsx)(t.p,{children:`По умолчанию adapter вызывает только:`}),`
|
|
293
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`serverFn({ data })
|
|
294
|
+
`})}),`
|
|
295
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`QueryClient`}),` и `,(0,c.jsx)(t.code,{children:`AbortSignal`}),` не передаются внутрь `,(0,c.jsx)(t.code,{children:`serverFn`}),`. Если transport/framework умеет использовать дополнительный context, задайте executor:`]}),`
|
|
296
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const executor: ServerFnTransportExecutor<Input, Output> = async (
|
|
297
|
+
serverFn,
|
|
298
|
+
request,
|
|
299
|
+
{ signal }
|
|
300
|
+
) => {
|
|
301
|
+
if (signal?.aborted) throw signal.reason;
|
|
302
|
+
return serverFn(request);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const operation = createServerFnQueryOperation({
|
|
306
|
+
serverFn,
|
|
307
|
+
buildData,
|
|
308
|
+
executor
|
|
309
|
+
});
|
|
310
|
+
`})}),`
|
|
311
|
+
`,(0,c.jsxs)(t.p,{children:[`Executor получает саму функцию, нормализованный request `,(0,c.jsx)(t.code,{children:`{ data }`}),` и `,(0,c.jsx)(t.code,{children:`{ client, signal? }`}),`. Он полезен для tracing, тестов и framework adapter-а. Не используйте его для бизнес-логики конкретной entity.`]}),`
|
|
312
|
+
`,(0,c.jsx)(t.h3,{id:`default-executor`,children:`Default executor`}),`
|
|
313
|
+
`,(0,c.jsxs)(t.p,{children:[`Без option `,(0,c.jsx)(t.code,{children:`executor`}),` фактически выполняется:`]}),`
|
|
314
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`await serverFn({ data });
|
|
315
|
+
`})}),`
|
|
316
|
+
`,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`client`}),` и `,(0,c.jsx)(t.code,{children:`signal`}),` доступны adapter layer, но не добавляются в transport data.`]}),`
|
|
317
|
+
`,(0,c.jsx)(t.h3,{id:`tracing-executor`,children:`Tracing executor`}),`
|
|
318
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const tracingExecutor: ServerFnTransportExecutor<Input, Output> = async (
|
|
319
|
+
serverFn,
|
|
320
|
+
request,
|
|
321
|
+
context
|
|
322
|
+
) => {
|
|
323
|
+
const startedAt = performance.now();
|
|
324
|
+
|
|
325
|
+
try {
|
|
326
|
+
if (context.signal?.aborted) {
|
|
327
|
+
throw context.signal.reason;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return await serverFn(request);
|
|
331
|
+
} finally {
|
|
332
|
+
console.debug("serverFn duration", performance.now() - startedAt);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
`})}),`
|
|
336
|
+
`,(0,c.jsxs)(t.p,{children:[`Не логируйте `,(0,c.jsx)(t.code,{children:`request.data`}),` целиком: он может содержать personal/auth-sensitive fields.`]}),`
|
|
337
|
+
`,(0,c.jsx)(t.h3,{id:`test-executor`,children:`Test executor`}),`
|
|
338
|
+
`,(0,c.jsx)(t.p,{children:`Custom executor позволяет проверить request без real framework runtime:`}),`
|
|
339
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const executor = vi.fn(async (_serverFn, request) => ({
|
|
340
|
+
items: [{ id: request.data.companyId }]
|
|
341
|
+
}));
|
|
342
|
+
|
|
343
|
+
const operation = createServerFnQueryOperation({
|
|
344
|
+
serverFn: vi.fn(),
|
|
345
|
+
buildData: (scope: string, args: { search: string }) => ({
|
|
346
|
+
companyId: scope,
|
|
347
|
+
search: args.search
|
|
348
|
+
}),
|
|
349
|
+
executor
|
|
350
|
+
});
|
|
351
|
+
`})}),`
|
|
352
|
+
`,(0,c.jsx)(t.h2,{id:`security-boundary`,children:`Security boundary`}),`
|
|
353
|
+
`,(0,c.jsxs)(t.p,{children:[`Public client type `,(0,c.jsx)(t.code,{children:`{ data }`}),` не означает, что data доверена. Server handler обязан повторно выполнить:`]}),`
|
|
354
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
355
|
+
`,(0,c.jsx)(t.li,{children:`authentication;`}),`
|
|
356
|
+
`,(0,c.jsx)(t.li,{children:`authorization на scope/entity/action;`}),`
|
|
357
|
+
`,(0,c.jsx)(t.li,{children:`runtime schema validation;`}),`
|
|
358
|
+
`,(0,c.jsx)(t.li,{children:`ограничения размера/частоты;`}),`
|
|
359
|
+
`,(0,c.jsx)(t.li,{children:`sanitization перед DB/HTML/logs;`}),`
|
|
360
|
+
`,(0,c.jsx)(t.li,{children:`безопасную обработку errors.`}),`
|
|
361
|
+
`]}),`
|
|
362
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-text`,children:`TypeScript type на client ≠ проверенный server input
|
|
363
|
+
`})}),`
|
|
364
|
+
`,(0,c.jsxs)(t.p,{children:[`Не передавайте secrets server-а в `,(0,c.jsx)(t.code,{children:`buildData`}),`: этот mapper выполняется на client side operation boundary.`]}),`
|
|
365
|
+
`,(0,c.jsx)(t.h2,{id:`query-cache-и-server-cache`,children:`Query cache и server cache`}),`
|
|
366
|
+
`,(0,c.jsx)(t.p,{children:`Resource query key владеет identity client snapshot. ServerFn/framework может дополнительно кэшировать server response, но это другой слой.`}),`
|
|
367
|
+
`,(0,c.jsx)(t.p,{children:`После mutation:`}),`
|
|
368
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
369
|
+
`,(0,c.jsx)(t.li,{children:`resource cache strategy синхронизирует QueryClient;`}),`
|
|
370
|
+
`,(0,c.jsx)(t.li,{children:`server-side invalidation управляется framework/backend;`}),`
|
|
371
|
+
`,(0,c.jsx)(t.li,{children:`одно не заменяет другое.`}),`
|
|
372
|
+
`]}),`
|
|
373
|
+
`,(0,c.jsx)(t.h2,{id:`тестирование`,children:`Тестирование`}),`
|
|
374
|
+
`,(0,c.jsx)(t.h3,{id:`query-operation-1`,children:`Query operation`}),`
|
|
375
|
+
`,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`it("строит { data } и преобразует response", async () => {
|
|
376
|
+
const serverFn = vi.fn(async ({ data }) => ({
|
|
377
|
+
items: [{ id: data.companyId }]
|
|
378
|
+
}));
|
|
379
|
+
|
|
380
|
+
const operation = createServerFnQueryOperation({
|
|
381
|
+
serverFn,
|
|
382
|
+
buildData: (scope: string, args: { search: string }) => ({
|
|
383
|
+
companyId: scope,
|
|
384
|
+
search: args.search
|
|
385
|
+
}),
|
|
386
|
+
transform: (response) => response.items
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
const result = await operation.execute({
|
|
390
|
+
scope: "1000",
|
|
391
|
+
args: { search: "test" },
|
|
392
|
+
client: queryClient,
|
|
393
|
+
signal: new AbortController().signal
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
expect(serverFn).toHaveBeenCalledWith({
|
|
397
|
+
data: { companyId: "1000", search: "test" }
|
|
398
|
+
});
|
|
399
|
+
expect(result).toEqual([{ id: "1000" }]);
|
|
400
|
+
});
|
|
401
|
+
`})}),`
|
|
402
|
+
`,(0,c.jsx)(t.p,{children:`Проверяйте:`}),`
|
|
403
|
+
`,(0,c.jsxs)(t.ul,{children:[`
|
|
404
|
+
`,(0,c.jsx)(t.li,{children:`buildData получает scope и args/input;`}),`
|
|
405
|
+
`,(0,c.jsxs)(t.li,{children:[`serverFn получает ровно `,(0,c.jsx)(t.code,{children:`{ data }`}),`;`]}),`
|
|
406
|
+
`,(0,c.jsx)(t.li,{children:`transform context правильный;`}),`
|
|
407
|
+
`,(0,c.jsx)(t.li,{children:`без transform response возвращается как есть;`}),`
|
|
408
|
+
`,(0,c.jsx)(t.li,{children:`query executor видит signal;`}),`
|
|
409
|
+
`,(0,c.jsx)(t.li,{children:`mutation executor не получает signal;`}),`
|
|
410
|
+
`,(0,c.jsx)(t.li,{children:`errors mapper/executor/transform пробрасываются;`}),`
|
|
411
|
+
`,(0,c.jsx)(t.li,{children:`cache strategy прикреплена к mutation operation;`}),`
|
|
412
|
+
`,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`isEnabled`}),`, `,(0,c.jsx)(t.code,{children:`staleTime`}),`, `,(0,c.jsx)(t.code,{children:`gcTime`}),` сохранены в query operation.`]}),`
|
|
413
|
+
`]}),`
|
|
414
|
+
`,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
|
|
415
|
+
`,(0,c.jsx)(t.h3,{id:`выполнять-serverfn-при-создании-operation`,children:`Выполнять serverFn при создании operation`}),`
|
|
416
|
+
`,(0,c.jsx)(t.p,{children:`Factory должна получить функцию, а не Promise/result.`}),`
|
|
417
|
+
`,(0,c.jsx)(t.h3,{id:`смешивать-transport-dto-и-domain-model`,children:`Смешивать transport DTO и domain model`}),`
|
|
418
|
+
`,(0,c.jsxs)(t.p,{children:[`Используйте `,(0,c.jsx)(t.code,{children:`buildData`}),` и `,(0,c.jsx)(t.code,{children:`transform`}),` как явные boundaries.`]}),`
|
|
419
|
+
`,(0,c.jsx)(t.h3,{id:`хранить-бизнес-логику-в-generic-executor`,children:`Хранить бизнес-логику в generic executor`}),`
|
|
420
|
+
`,(0,c.jsx)(t.p,{children:`Executor — infrastructure wrapper. Entity mapping принадлежит operation/owner entity.`}),`
|
|
421
|
+
`,(0,c.jsx)(t.h3,{id:`ожидать-cache-update-без-strategy`,children:`Ожидать cache update без strategy`}),`
|
|
422
|
+
`,(0,c.jsx)(t.p,{children:`Mutation operation сама не угадывает затронутые queries.`}),`
|
|
423
|
+
`,(0,c.jsxs)(t.h3,{id:`передавать-signal-внутрь--data-`,children:[`Передавать signal внутрь `,(0,c.jsx)(t.code,{children:`{ data }`})]}),`
|
|
424
|
+
`,(0,c.jsx)(t.p,{children:`AbortSignal не сериализуемый business payload. Используйте executor/framework capability.`}),`
|
|
425
|
+
`,(0,c.jsx)(t.h2,{id:`типичные-ошибки`,children:`Типичные ошибки`}),`
|
|
426
|
+
`,(0,c.jsx)(t.h3,{id:`передавать-args-напрямую`,children:`Передавать args напрямую`}),`
|
|
427
|
+
`,(0,c.jsxs)(t.p,{children:[`Неверно предполагать, что query args автоматически становятся data. Их явно преобразует `,(0,c.jsx)(t.code,{children:`buildData`}),`, потому что scope/args и transport DTO — разные контракты.`]}),`
|
|
428
|
+
`,(0,c.jsx)(t.h3,{id:`ожидать-автоматическую-отмену`,children:`Ожидать автоматическую отмену`}),`
|
|
429
|
+
`,(0,c.jsxs)(t.p,{children:[`Default executor не передаёт signal в функцию, поскольку её публичный contract содержит только `,(0,c.jsx)(t.code,{children:`{ data }`}),`. Отмена TanStack Query остановит дальнейшее использование результата на уровне query, но transport должен поддерживать abort отдельно.`]}),`
|
|
430
|
+
`,(0,c.jsx)(t.h3,{id:`считать-функцию-доверенной`,children:`Считать функцию доверенной`}),`
|
|
431
|
+
`,(0,c.jsx)(t.p,{children:`Если функция вызывается из browser bundle, её input контролирует пользователь. Backend обязан повторно проверить authentication, authorization и payload schema.`}),`
|
|
432
|
+
`,(0,c.jsx)(t.h3,{id:`использовать-без-descriptor-а`,children:`Использовать без descriptor-а`}),`
|
|
433
|
+
`,(0,c.jsxs)(t.p,{children:[`Factory возвращает operation, а не готовый React hook. Подключите её к resource/persisted descriptor или вызовите `,(0,c.jsx)(t.code,{children:`execute`}),` через корректный orchestration layer.`]}),`
|
|
434
|
+
`,(0,c.jsx)(t.h2,{id:`faq`,children:`FAQ`}),`
|
|
435
|
+
`,(0,c.jsx)(t.h3,{id:`обязательно-ли-использовать-tanstack-start`,children:`Обязательно ли использовать TanStack Start?`}),`
|
|
436
|
+
`,(0,c.jsxs)(t.p,{children:[`Нет. Подходит любая async function с contract `,(0,c.jsx)(t.code,{children:`({ data }) => Promise<response>`}),`.`]}),`
|
|
437
|
+
`,(0,c.jsxs)(t.h3,{id:`где-выполняется-builddata`,children:[`Где выполняется `,(0,c.jsx)(t.code,{children:`buildData`}),`?`]}),`
|
|
438
|
+
`,(0,c.jsx)(t.p,{children:`На стороне, где выполняется resource operation, обычно в client bundle.`}),`
|
|
439
|
+
`,(0,c.jsx)(t.h3,{id:`передаётся-ли-queryclient-в-serverfn`,children:`Передаётся ли QueryClient в serverFn?`}),`
|
|
440
|
+
`,(0,c.jsx)(t.p,{children:`Нет. Только custom executor получает QueryClient как infrastructure context.`}),`
|
|
441
|
+
`,(0,c.jsx)(t.h3,{id:`работает-ли-query-cancellation`,children:`Работает ли query cancellation?`}),`
|
|
442
|
+
`,(0,c.jsx)(t.p,{children:`Signal доходит до executor. Default serverFn contract его не использует; реальный abort зависит от framework/custom executor.`}),`
|
|
443
|
+
`,(0,c.jsx)(t.h3,{id:`почему-mutation-не-получает-signal`,children:`Почему mutation не получает signal?`}),`
|
|
444
|
+
`,(0,c.jsxs)(t.p,{children:[`Таков generic `,(0,c.jsx)(t.code,{children:`ResourceMutationOperation`}),` contract. Если нужен abort, проектируйте отдельный controlled transport boundary.`]}),`
|
|
445
|
+
`,(0,c.jsx)(t.h3,{id:`можно-ли-вернуть-domain-model-из-transform`,children:`Можно ли вернуть domain model из transform?`}),`
|
|
446
|
+
`,(0,c.jsx)(t.p,{children:`Да. Generic result type будет выведен из transform.`}),`
|
|
447
|
+
`,(0,c.jsx)(t.h2,{id:`полный-api`,children:`Полный API`}),`
|
|
448
|
+
`,(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:`createServerFnQueryOperation`})}),(0,c.jsx)(t.td,{children:`Создаёт read operation, optional transform/lifetime/isEnabled`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createServerFnMutationOperation`})}),(0,c.jsx)(t.td,{children:`Создаёт write operation, optional transform/cache strategy`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransport`})}),(0,c.jsxs)(t.td,{children:[`Контракт функции `,(0,c.jsx)(t.code,{children:`(request) => Promise`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportRequest`})}),(0,c.jsxs)(t.td,{children:[`Обёртка `,(0,c.jsx)(t.code,{children:`{ data }`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportExecutor`})}),(0,c.jsx)(t.td,{children:`Контракт custom execution`})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`ServerFnTransportExecutorContext`})}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`QueryClient`}),` и optional signal`]})]})]})]})]})}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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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/Browser/Three Scene`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`three-scene`,children:`Three Scene`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/three-scene`}),` проверяет, можно ли безопасно показывать необязательную Three.js/WebGL-сцену, и помогает отключить её до конца браузерной сессии.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Модуль не импортирует Three.js, не создаёт renderer и не управляет canvas. Его задача — принять раннее решение: загружать тяжёлую 3D-сцену или показать облегчённую альтернативу.`}),`
|
|
@@ -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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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/HTTP/SEO`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`seo`,children:`SEO`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/seo`}),` собирает единый набор SEO-описаний страницы:`]}),`
|
|
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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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/Errors/Error Report`}),`
|
|
2
2
|
`,(0,c.jsx)(t.h1,{id:`error-report`,children:`Error Report`}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),` собирает клиентскую диагностику ошибки в структурированный draft и временно хранит последние drafts в `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`.`]}),`
|
|
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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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/Presets`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`общие-preset-helpers-через-ryuzaki13react-foundation-libpresets`,children:[`Общие preset helpers через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/presets`})]}),`
|
|
3
3
|
`,(0,c.jsx)(t.p,{children:`Модуль проверяет восстановленные preset ids, сопоставляет их с option objects и ищет одну option по id.`}),`
|
|
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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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:[`
|
|
@@ -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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BY40djCc.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/Date/Segments`}),`
|
|
2
2
|
`,(0,c.jsxs)(t.h1,{id:`сегменты-даты-и-времени-через-ryuzaki13react-foundation-libdate-segments`,children:[`Сегменты даты и времени через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/date-segments`})]}),`
|
|
3
3
|
`,(0,c.jsxs)(t.p,{children:[`Модуль разбирает строковую маску на редактируемые сегменты и литералы, преобразует `,(0,c.jsx)(t.code,{children:`Date`}),` в значения полей и строго собирает `,(0,c.jsx)(t.code,{children:`Date`}),` обратно. Он предназначен для segment-based date/time inputs.`]}),`
|
|
4
4
|
`,(0,c.jsx)(t.p,{children:`Документ объясняет маски, индексы, local time, двухзначный год, неполный ввод и все публичные типы.`}),`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{i as r,n as i,r as a}from"./iframe-
|
|
1
|
+
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{i as r,n as i,r as a}from"./iframe-o7sH2IXC.js";import{a as o,i as s}from"./utils-tg3ibbzi.js";import{n as c,t as l}from"./ui.module-Cat84Nza.js";import{i as u,r as d}from"./uiClasses-B9c6dZuu.js";import{n as f,t as p}from"./CheckBox.module-BOAVN-Ny.js";var m,h;function g(){return(g=t((()=>{r(),m=[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]],h=a(`circle`,m)})))()}var _,v;function y(){return(y=t((()=>{_=`gu8UMB`,v={radioInput:_}})))()}var b,x,S;function C(){return(C=t((()=>{b=e(n(),1),s(),g(),f(),l(),u(),y(),x=i(),S=({label:e,description:t,placeholder:n,disabled:r,size:i,className:a,onChange:s,value:l,id:u,tone:f=`neutral`,...m})=>{let g=(0,b.useId)(),_=u??g,y=t?`${_}-description`:void 0,S=e??n,C=l??!1;return(0,x.jsxs)(`div`,{className:o(c.uiElement,i&&c.uiSizable,i&&c[i],r&&c.disabled,a),children:[(0,x.jsxs)(`div`,{className:p.row,children:[(0,x.jsxs)(`div`,{className:o(p.wrapper,d(f)),children:[(0,x.jsx)(`input`,{...m,id:_,type:`radio`,checked:C,disabled:r,"aria-disabled":r,"aria-describedby":y,className:o(c.uiSelectionControl,p.input,v.radioInput),onChange:e=>s?.(e.currentTarget.checked)}),(0,x.jsx)(`div`,{className:o(c.uiSelectionIcon,p.icon),"aria-hidden":`true`,children:(0,x.jsx)(h,{fill:`currentColor`})})]}),S&&(0,x.jsx)(`label`,{htmlFor:_,className:c.uiLabel,children:S})]}),t&&(0,x.jsx)(`p`,{id:y,className:c.uiDescription,children:t})]})},S.__docgenInfo={description:'Компонент радиокнопки для выбора одного варианта.\nНативный `input[type="radio"]` обеспечивает взаимоисключение элементов с\nобщим `name`, а controlled API продолжает публиковать булево состояние.\nПоддерживает tone + appearance и использует общие selection utility-классы из ui.module.scss.',methods:[],displayName:`RadioButton`,props:{label:{required:!1,tsType:{name:`ReactNode`},description:``},description:{required:!1,tsType:{name:`string`},description:``},placeholder:{required:!1,tsType:{name:`string`},description:``},disabled:{required:!1,tsType:{name:`boolean`},description:``},size:{required:!1,tsType:{name:`union`,raw:`"xs" | "sm" | "md" | "lg" | "xl"`,elements:[{name:`literal`,value:`"xs"`},{name:`literal`,value:`"sm"`},{name:`literal`,value:`"md"`},{name:`literal`,value:`"lg"`},{name:`literal`,value:`"xl"`}]},description:``},value:{required:!0,tsType:{name:`V`},description:"Если начальное состояние может быть `null | undefined`\nзначит `onChange` тоже должен ументь сбрасывать.\nПоэтому такой контрол явно должен передавать `UiBaseProps<AnyType | undefined>`"},onChange:{required:!0,tsType:{name:`signature`,type:`function`,raw:`(value: T) => void`,signature:{arguments:[{type:{name:`C`},name:`value`}],return:{name:`void`}}},description:``},tone:{required:!1,tsType:{name:`union`,raw:`"neutral" | "brand" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"neutral"`},{name:`literal`,value:`"brand"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"info"`}]},description:``,defaultValue:{value:`"neutral"`,computed:!1}}},composes:[`Omit`]}})))()}export{C as n,S as t};
|
|
@@ -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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{a as p,i as m,n as h,r as g,t as _}from"./RadioButton.stories-CPd4lTl0.js";function v(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(s,{of:m,parameters:{docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,b.jsx)(u,{children:`RadioButton`}),`
|
|
3
3
|
`,(0,b.jsx)(o,{children:`Одиночная radio-кнопка для ручной сборки наборов выбора и специальных компоновок`}),`
|
|
4
4
|
`,(0,b.jsx)(t.p,{children:`RadioButton уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
|
package/storybook-static/assets/{RadioButton.stories-Ah-CBpeC.js → RadioButton.stories-CPd4lTl0.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r,t as i}from"./RadioButton-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r,t as i}from"./RadioButton-CNOLDk_o.js";import{n as a}from"./iframe-o7sH2IXC.js";import{n as o,t as s}from"./createControlledStoryRender-BouhvX-R.js";var c=t({Controlled:()=>p,Disabled:()=>h,Group:()=>m,__namedExportsOrder:()=>g,default:()=>f}),l,u,d,f,p,m,h,g;function _(){return(_=e((()=>{l=n(),o(),r(),u=a(),d=s((e,t)=>(0,u.jsx)(i,{...e,value:e.value??!1,onChange:n=>{e.onChange?.(n),t({value:n})}})),f={title:`Shared/UI/RadioButton`,component:i,args:{value:!1,onChange:()=>{}},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{label:{description:`Текст подписи радиокнопки.`,control:`text`},description:{description:`Дополнительное описание под элементом.`,control:`text`},placeholder:{description:"Резервная подпись, если `label` не задан.",control:`text`},value:{description:`Признак выбранного состояния.`,control:`boolean`},onChange:{description:`Вызывается при изменении выбранности.`,control:!1},disabled:{description:`Блокирует взаимодействие.`,control:`boolean`},size:{description:`Размер визуального контрола и подписи.`,control:`select`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Цветовой тон радиокнопки.`,control:`inline-radio`,options:[`neutral`,`brand`,`error`,`warning`,`success`,`info`]}}},p={render:d,args:{label:`Выбрать опцию`,description:`Одиночная радиокнопка в controlled-режиме.`,value:!1,tone:`neutral`}},m={render:()=>{let[e,t]=(0,l.useState)(`email`);return(0,u.jsxs)(`div`,{role:`radiogroup`,"aria-label":`Канал уведомлений`,style:{display:`grid`,gap:12},children:[(0,u.jsx)(i,{name:`notification-channel`,label:`Email`,value:e===`email`,onChange:e=>e&&t(`email`),tone:`info`}),(0,u.jsx)(i,{name:`notification-channel`,label:`SMS`,value:e===`sms`,onChange:e=>e&&t(`sms`),tone:`info`})]})},args:{value:void 0}},h={render:d,args:{label:`Недоступная опция`,description:`Заблокировано политикой конфигурации.`,value:!0,disabled:!0,tone:`neutral`}},p.parameters={...p.parameters,docs:{...p.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: renderRadioButtonStory,
|
|
3
3
|
args: {
|
|
4
4
|
label: "Выбрать опцию",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{i as r,n as i,r as a}from"./iframe-
|
|
1
|
+
import{a as e,n as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{i as r,n as i,r as a}from"./iframe-o7sH2IXC.js";import{a as o,i as s,n as c,o as l}from"./utils-tg3ibbzi.js";import{n as u,t as d}from"./ui.module-Cat84Nza.js";var f,p;function m(){return(m=t((()=>{r(),f=[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`,key:`yps3ct`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]],p=a(`circle-check-big`,f)})))()}var h,g,_,v,y,b,x,S,C;function w(){return(w=t((()=>{h=`nINbA6`,g=`GL-UWx`,_=`_6PeF-i`,v=`_5wP4aR`,y=`S3MnZI`,b=`KHJ0ja`,x=`oGmcQH`,S=`k2z8AN`,C={radioGroup:h,noWrap:g,horizontal:_,vertical:v,radioItem:y,checked:b,radioItemContent:x,radioItemIcon:S}})))()}function T({value:e,onChange:t,label:n,description:r,disabled:i,className:a,noWrap:s,orientation:c=`horizontal`,"aria-label":l,children:d}){let f=(0,D.useId)(),p=n?`${f}-label`:void 0,m=r?`${f}-description`:void 0,[h,g]=(0,D.useState)([]),_=(0,D.useCallback)(e=>t?.(e),[t]),v=(0,D.useCallback)(e=>(g(t=>t.includes(e)?t:[...t,e]),()=>{g(t=>t.filter(t=>t!==e))}),[]),y=(0,D.useMemo)(()=>({value:e,onChange:_,disabled:i,orientation:c,groupId:f,labelId:p,descriptionId:m,firstOptionId:h[0],registerOption:v}),[m,i,f,_,p,c,v,h,e]);return(0,O.jsxs)(`div`,{className:o(u.uiElement,i&&u.disabled,a),children:[n&&(0,O.jsx)(`div`,{id:p,className:u.uiLabel,children:n}),r&&(0,O.jsx)(`div`,{id:m,className:u.uiDescription,children:r}),(0,O.jsx)(k.Provider,{value:y,children:(0,O.jsx)(`div`,{role:`radiogroup`,"aria-labelledby":p,"aria-label":p?void 0:l,"aria-describedby":m,"aria-disabled":i||void 0,"data-disabled":i||void 0,className:o(u.uiInputControl,C.radioGroup,s&&C.noWrap,C[c]),children:d})})]})}function E({value:e,label:t,description:n,className:r}){let i=(0,D.useContext)(k),a=(0,D.useId)(),s=i?.registerOption;if((0,D.useLayoutEffect)(()=>{if(s)return s(a)},[s,a]),!i)return(0,O.jsxs)(`div`,{className:o(C.radioItem,r),children:[(0,O.jsx)(`p`,{className:`textNoWrap`,children:t}),n&&(0,O.jsx)(`div`,{className:`fontSizeSm content2`,children:n})]});let u=Object.is(i.value,e),d=i.disabled===!0,f=i.value===void 0&&i.firstOptionId===a,m=()=>{d||u||i.onChange?.(e)};return(0,O.jsxs)(`button`,{id:`${i.groupId}-option-${a}`,type:`button`,role:`radio`,"aria-checked":u,disabled:d,tabIndex:u||f?0:-1,className:o(C.radioItem,u&&C.checked,r),"data-ui":`radio-option`,"data-action":`select-radio-option`,onClick:m,onKeyDown:e=>{if(d||c(e,m))return;let t=e.currentTarget,n=t.closest(`[role="radiogroup"]`),r=Array.from(n?.querySelectorAll(`[role="radio"]:not([disabled])`)??[]);if(!r.length)return;let a=r.indexOf(t);if(a===-1)return;let o=l({currentIndex:a,itemCount:r.length,key:e.key,orientation:i.orientation});o!==null&&(e.preventDefault(),r[o]?.focus(),r[o]?.click())},children:[(0,O.jsxs)(`span`,{className:C.radioItemContent,children:[(0,O.jsx)(`span`,{className:`textNoWrap`,children:t}),n&&(0,O.jsx)(`span`,{className:`fontSizeSm`,children:n})]}),(0,O.jsx)(`span`,{className:C.radioItemIcon,children:(0,O.jsx)(p,{style:{display:`block`,visibility:u?`visible`:`hidden`}})})]})}var D,O,k;function A(){return(A=t((()=>{D=e(n(),1),s(),m(),d(),w(),O=i(),k=(0,D.createContext)(null),T.Option=E,T.__docgenInfo={description:`Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.`,methods:[{name:`Option`,docblock:null,modifiers:[`static`],params:[{name:`{ value, label, description, className }: OptionProps<T>`,optional:!1,type:{name:`OptionProps`,elements:[{name:`T`}],raw:`OptionProps<T>`,alias:`OptionProps`}}],returns:null}],displayName:`RadioGroup`,props:{value:{required:!1,tsType:{name:`T`},description:``},onChange:{required:!1,tsType:{name:`signature`,type:`function`,raw:`(value: T) => void`,signature:{arguments:[{type:{name:`T`},name:`value`}],return:{name:`void`}}},description:``},label:{required:!1,tsType:{name:`string`},description:``},description:{required:!1,tsType:{name:`string`},description:``},disabled:{required:!1,tsType:{name:`boolean`},description:``},className:{required:!1,tsType:{name:`string`},description:``},noWrap:{required:!1,tsType:{name:`literal`,value:`true`},description:``},orientation:{required:!1,tsType:{name:`union`,raw:`"vertical" | "horizontal"`,elements:[{name:`literal`,value:`"vertical"`},{name:`literal`,value:`"horizontal"`}]},description:``,defaultValue:{value:`"horizontal"`,computed:!1}},"aria-label":{required:!1,tsType:{name:`string`},description:``},children:{required:!0,tsType:{name:`ReactReactNode`,raw:`React.ReactNode`},description:``}}},E.__docgenInfo={description:"Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.",methods:[],displayName:`Option`,props:{value:{required:!0,tsType:{name:`T`},description:``},label:{required:!0,tsType:{name:`ReactNode`},description:``},description:{required:!1,tsType:{name:`ReactNode`},description:``},className:{required:!1,tsType:{name:`string`},description:``}}}})))()}export{A as n,T as t};
|
|
@@ -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-o7sH2IXC.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-BY40djCc.js";import{a as p,i as m,n as h,r as g,t as _}from"./RadioGroup.stories-D-RRPHwi.js";function v(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(s,{of:g,parameters:{docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,b.jsx)(u,{children:`RadioGroup`}),`
|
|
3
3
|
`,(0,b.jsx)(o,{children:`Группа взаимоисключающих опций с поддержкой горизонтальной и вертикальной раскладки`}),`
|
|
4
4
|
`,(0,b.jsx)(t.p,{children:`RadioGroup уже имеет живые stories, а эта страница собирает их в структурированную документацию с краткими рекомендациями, примерами подключения и API.
|
package/storybook-static/assets/{RadioGroup.stories-DGwCawtU.js → RadioGroup.stories-D-RRPHwi.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{n,t as r}from"./RadioGroup-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{n,t as r}from"./RadioGroup-BtfD5Szd.js";import{n as i}from"./iframe-o7sH2IXC.js";import{n as a,t as o}from"./createControlledStoryRender-BouhvX-R.js";var s=t({Controlled:()=>g,Disabled:()=>v,Vertical:()=>_,__namedExportsOrder:()=>y,default:()=>h});function c(e){return(0,d.jsx)(r,{...e})}function l({args:e,updateArgs:t,options:n,showValue:i=!1}){return(0,d.jsxs)(`div`,{style:{display:`grid`,gap:10},children:[(0,d.jsx)(c,{...e,onChange:n=>{e.onChange?.(n),t({value:n})},children:n.map(e=>(0,d.jsx)(r.Option,{value:e.value,label:e.label,description:e.description},e.value))}),i&&(0,d.jsxs)(`div`,{children:[`Выбрано: `,e.value??`не выбрано`]})]})}function u(e,t=!1){return o((n,r)=>(0,d.jsx)(l,{args:n,updateArgs:r,options:e,showValue:t}))}var d,f,p,m,h,g,_,v,y;function b(){return(b=e((()=>{a(),n(),d=i(),f=[{value:`email`,label:`Email`,description:`Письма на корпоративную почту`},{value:`sms`,label:`SMS`,description:`Сообщения на телефон`},{value:`push`,label:`Push`,description:`Уведомления в приложении`}],p=[{value:`draft`,label:`Черновик`},{value:`review`,label:`На согласовании`},{value:`approved`,label:`Утвержден`}],m=[{value:`yes`,label:`Да`},{value:`no`,label:`Нет`}],h={title:`Shared/UI/RadioGroup`,component:c,args:{value:`email`,onChange:()=>{},orientation:`horizontal`,label:`Канал уведомлений`,description:`Выберите основной канал доставки`,disabled:!1},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{value:{description:`Текущее выбранное значение.`,control:`text`},onChange:{description:`Вызывается при смене выбранной опции.`,control:!1},label:{description:`Заголовок группы опций.`,control:`text`},description:{description:`Описание под заголовком.`,control:`text`},disabled:{description:`Блокирует выбор опций.`,control:`boolean`},noWrap:{description:`Запрещает перенос опций на новую строку.`,control:`boolean`},orientation:{description:`Ориентация расположения опций.`,control:`inline-radio`,options:[`horizontal`,`vertical`]},children:{description:"Элементы `RadioGroup.Option` внутри группы.",control:!1}}},g={render:u(f,!0),args:{}},_={render:u(p),args:{orientation:`vertical`,label:`Статус документа`,value:`draft`}},v={render:u(m),args:{disabled:!0,value:`yes`}},g.parameters={...g.parameters,docs:{...g.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: createRadioGroupStoryRender(notificationOptions, true),
|
|
3
3
|
args: {}
|
|
4
4
|
}`,...g.parameters?.docs?.source}}},_.parameters={..._.parameters,docs:{..._.parameters?.docs,source:{originalSource:`{
|