@ryuzaki13/react-foundation-ui 1.12.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/package.json +5 -5
  2. package/src/styles/_base.scss +5 -2
  3. package/storybook-static/assets/{Badge-Bb-Tlpnk.js → Badge-DTLs_n8R.js} +1 -1
  4. package/storybook-static/assets/{Badge.stories-53iRTNYI.js → Badge.stories-CovEhEDD.js} +1 -1
  5. package/storybook-static/assets/{BadgeList-CRHWJedI.js → BadgeList-DjTg_9cc.js} +1 -1
  6. package/storybook-static/assets/{BarcodeScannerDialog.stories-BFy1-vDi.js → BarcodeScannerDialog.stories-C5rK3W2F.js} +1 -1
  7. package/storybook-static/assets/{Button-mtj3cku4.js → Button-DMPKoI7-.js} +1 -1
  8. package/storybook-static/assets/{Button-Bz8g5Qo6.js → Button-xWt087rv.js} +1 -1
  9. package/storybook-static/assets/{Button.stories-C-242Bt8.js → Button.stories-ClLOimQw.js} +1 -1
  10. package/storybook-static/assets/{CalendarView-DyBmkFcO.js → CalendarView-C8D421Nm.js} +1 -1
  11. package/storybook-static/assets/{CheckBox-CBV2_V1l.js → CheckBox-ByaB_AWI.js} +1 -1
  12. package/storybook-static/assets/{CheckBox-DfopNSxZ.js → CheckBox-CHNYWbr9.js} +1 -1
  13. package/storybook-static/assets/{CheckBox.stories-Br3wnAPu.js → CheckBox.stories-DMFiXHJV.js} +1 -1
  14. package/storybook-static/assets/{Color-6AOWCN3U-CFesUjaK.js → Color-6AOWCN3U-CP9Nd4vj.js} +1 -1
  15. package/storybook-static/assets/{ContextMenu-C3CX-kh1.js → ContextMenu-68QC2EAu.js} +1 -1
  16. package/storybook-static/assets/{ContextMenu-DcTk4-3g.js → ContextMenu-DSg2_txz.js} +1 -1
  17. package/storybook-static/assets/{ContextMenu.stories-Da_mFHxI.js → ContextMenu.stories-C8CldSPG.js} +1 -1
  18. package/storybook-static/assets/{CustomOptionButton-DtyvPLYF.js → CustomOptionButton-xAusSjnU.js} +1 -1
  19. package/storybook-static/assets/{DateInput-Cd_a0vtG.js → DateInput-2ESK1wDg.js} +1 -1
  20. package/storybook-static/assets/{DateInput-BsNZw1U8.js → DateInput-DOuoBC8j.js} +1 -1
  21. package/storybook-static/assets/{DateInput.stories-KsFLAVoc.js → DateInput.stories-D5t5QnTV.js} +1 -1
  22. package/storybook-static/assets/{DateRangePresetSelect-DCJo3NSl.js → DateRangePresetSelect-C8k5BN7p.js} +1 -1
  23. package/storybook-static/assets/{DateRangePresetSelect-BTOSe7F8.js → DateRangePresetSelect-CD2n8zWv.js} +1 -1
  24. package/storybook-static/assets/{DateRangePresetSelect.stories-DLPXXHNi.js → DateRangePresetSelect.stories-COktncMK.js} +1 -1
  25. package/storybook-static/assets/{Detail-Bst4J2J-.js → Detail-oc_R1sEu.js} +1 -1
  26. package/storybook-static/assets/{Detail.stories-B_djgU9X.js → Detail.stories-1XrWL_s3.js} +1 -1
  27. package/storybook-static/assets/{Dialog-C_sQvgfz.js → Dialog-CLTQa6Kw.js} +1 -1
  28. package/storybook-static/assets/{Dialog-Bywt8Bmy.js → Dialog-CfnOq258.js} +1 -1
  29. package/storybook-static/assets/{Dialog.stories-D0lOVWN2.js → Dialog.stories-D5PPDse-.js} +1 -1
  30. package/storybook-static/assets/{Disclosure-D5dicvdj.js → Disclosure-ByNKoHvP.js} +1 -1
  31. package/storybook-static/assets/{Disclosure.stories-phvJ-bLv.js → Disclosure.stories-CBdZfYjY.js} +1 -1
  32. package/storybook-static/assets/{DisclosureGroup-D7sFS4CC.js → DisclosureGroup-D3XWBJXQ.js} +1 -1
  33. package/storybook-static/assets/{DocsRenderer-JROSPFPF-DPZk5iqJ.js → DocsRenderer-JROSPFPF-gxuFq2Pd.js} +1 -1
  34. package/storybook-static/assets/{DropZone-CAAvh0I0.js → DropZone-BxLXKfqY.js} +1 -1
  35. package/storybook-static/assets/{DropZone-0YS9qFM0.js → DropZone-C6xiwfG-.js} +1 -1
  36. package/storybook-static/assets/{DropZone.stories-BL5jgI8z.js → DropZone.stories-BpRrpoAa.js} +1 -1
  37. package/storybook-static/assets/{DropdownMenu-CJr8Erdo.js → DropdownMenu-CmzYr9oI.js} +1 -1
  38. package/storybook-static/assets/{ExpandableActionPanel-C0f0nIzL.js → ExpandableActionPanel-YeKyHEkM.js} +1 -1
  39. package/storybook-static/assets/{ExpandableActionPanel.stories-CQfNPLRJ.js → ExpandableActionPanel.stories-D2Kz4YaV.js} +1 -1
  40. package/storybook-static/assets/{Flex-3hWAPxhz.js → Flex-QTek1QSS.js} +1 -1
  41. package/storybook-static/assets/{Flex.stories-CyQLgkGM.js → Flex.stories-DbQJjxyG.js} +1 -1
  42. package/storybook-static/assets/{FloatingPopover-D_atQsG0.js → FloatingPopover-Z_pT8RTr.js} +1 -1
  43. package/storybook-static/assets/{FormattedTableCell-C_nFynfE.js → FormattedTableCell-sTTQO4a-.js} +3 -3
  44. package/storybook-static/assets/{Grid-BcSq0Nr3.js → Grid-BplOAlTQ.js} +1 -1
  45. package/storybook-static/assets/{Grid.stories-DiClkuyA.js → Grid.stories-3z3Ey-d3.js} +1 -1
  46. package/storybook-static/assets/{ImageCropper.stories-BhIYMKhb.js → ImageCropper.stories-CRS_mYqv.js} +1 -1
  47. package/storybook-static/assets/{ImageRenderer-vcayxSYK.js → ImageRenderer-B-6CUiXT.js} +1 -1
  48. package/storybook-static/assets/{ImageRenderer.stories-CD6CufDR.js → ImageRenderer.stories-r1qsDpQo.js} +1 -1
  49. package/storybook-static/assets/{ImageView.stories-CwaY5K3d.js → ImageView.stories-JTwPOvTV.js} +1 -1
  50. package/storybook-static/assets/{ImageViewer.stories-iUxUAbWU.js → ImageViewer.stories-EXX-1Tq3.js} +2 -2
  51. package/storybook-static/assets/{ImageViewerRuntime-CE78ivMF.js → ImageViewerRuntime-D9mEsiiW.js} +1 -1
  52. package/storybook-static/assets/{Input-B6o8599q.js → Input-o_oY36pr.js} +1 -1
  53. package/storybook-static/assets/{Input-Ckq5T_SF.js → Input-t9m3sVNs.js} +1 -1
  54. package/storybook-static/assets/{Input.stories-DxwML4Uj.js → Input.stories-BWFSZL_N.js} +1 -1
  55. package/storybook-static/assets/{InputDateTime-Nt13Hoba.js → InputDateTime-lu3pzt-n.js} +1 -1
  56. package/storybook-static/assets/{InputDateTime.stories-p-wH1C1b.js → InputDateTime.stories-DhWcuSxT.js} +1 -1
  57. package/storybook-static/assets/{InputFile-BgaMJ6pf.js → InputFile-B5JzTYSK.js} +1 -1
  58. package/storybook-static/assets/{InputFile-Cp73dufk.js → InputFile-DR6qGFRh.js} +1 -1
  59. package/storybook-static/assets/{InputFile.stories-DiFRFN8-.js → InputFile.stories-BDkbSn8C.js} +1 -1
  60. package/storybook-static/assets/{InputFiles-k2CUZgQh.js → InputFiles-CQU1IgFq.js} +1 -1
  61. package/storybook-static/assets/{InputFiles-BEvr3Tgw.js → InputFiles-D1flVl2f.js} +1 -1
  62. package/storybook-static/assets/{InputFiles.stories-C0ro4k-g.js → InputFiles.stories-DyNBsbIL.js} +1 -1
  63. package/storybook-static/assets/{InputFilesList-C1LGsI3P.js → InputFilesList-DcnsEkjI.js} +1 -1
  64. package/storybook-static/assets/{InputImage-D79gzzHU.js → InputImage-DyS8prBK.js} +1 -1
  65. package/storybook-static/assets/{InputImage-BVCYEdHK.js → InputImage-trdfpmT-.js} +1 -1
  66. package/storybook-static/assets/{InputImage.stories-DoyHYjFk.js → InputImage.stories-DEk-50bc.js} +1 -1
  67. package/storybook-static/assets/{InteractiveComponents-0V31mRaw.js → InteractiveComponents-CJQb2Kqe.js} +1 -1
  68. package/storybook-static/assets/{InteractiveComponents.stories-CHFTAdsJ.js → InteractiveComponents.stories-A25AcgXi.js} +1 -1
  69. package/storybook-static/assets/{LayoutPicker-OCUToVfB.js → LayoutPicker-Cyr59f6W.js} +1 -1
  70. package/storybook-static/assets/{LayoutPicker-gb4E6L0c.js → LayoutPicker-DmMkNRCR.js} +1 -1
  71. package/storybook-static/assets/{LayoutPicker.stories-C2Ymz0-o.js → LayoutPicker.stories-BN6ES2FK.js} +1 -1
  72. package/storybook-static/assets/{Listbox-D-eqdnKK.js → Listbox-BL6exIiK.js} +1 -1
  73. package/storybook-static/assets/{Listbox-BMVbwKBm.js → Listbox-CpOkTSus.js} +1 -1
  74. package/storybook-static/assets/{Listbox.stories-C_-Gw4Ya.js → Listbox.stories-CuJAPNNF.js} +1 -1
  75. package/storybook-static/assets/{Modal-C9GzRRz6.js → Modal-0h4g26vg.js} +1 -1
  76. package/storybook-static/assets/{Modal-B-3lmf7r.js → Modal-BDbbUiVP.js} +1 -1
  77. package/storybook-static/assets/{Modal.stories-6W74wLRQ.js → Modal.stories-BJTQMX6r.js} +1 -1
  78. package/storybook-static/assets/{ModalManagerProvider-DP-tasgF.js → ModalManagerProvider-CKUlkLye.js} +1 -1
  79. package/storybook-static/assets/{MultiSelect-BRxJc0uc.js → MultiSelect-DOFS5VMw.js} +1 -1
  80. package/storybook-static/assets/{MultiSelect-DTmvc0Sm.js → MultiSelect-jTomHycE.js} +1 -1
  81. package/storybook-static/assets/{MultiSelect.stories-BWs0Us3D.js → MultiSelect.stories-KUrIgYcH.js} +1 -1
  82. package/storybook-static/assets/{NoData-BmxGFtEL.js → NoData-Cg-72gvD.js} +1 -1
  83. package/storybook-static/assets/{NotificationsHost-DAhr6Z4I.js → NotificationsHost-BGUy6Nwm.js} +1 -1
  84. package/storybook-static/assets/{NotificationsHost.stories-DgSOu02u.js → NotificationsHost.stories-UqcdAxbV.js} +1 -1
  85. package/storybook-static/assets/{ODataMultiSelect-CPEupmc0.js → ODataMultiSelect-ogSmpbiq.js} +1 -1
  86. package/storybook-static/assets/{ODataMultiSelect.stories-B1M4I6Mo.js → ODataMultiSelect.stories-CFSWPA1t.js} +1 -1
  87. package/storybook-static/assets/{ODataSelect-Br_qXUiI.js → ODataSelect-XrSMzI_c.js} +1 -1
  88. package/storybook-static/assets/{ODataSelect.stories-DGJZUwUv.js → ODataSelect.stories-DzQ8kx1B.js} +1 -1
  89. package/storybook-static/assets/{ODataTreeMultiSelect-D-5c8C9z.js → ODataTreeMultiSelect-Bd6N1nUD.js} +1 -1
  90. package/storybook-static/assets/{ODataTreeMultiSelect.stories-DdjePs5T.js → ODataTreeMultiSelect.stories-BL3LegRZ.js} +1 -1
  91. package/storybook-static/assets/{ODataTreeSelect-tD4un2s_.js → ODataTreeSelect-LP9MrILe.js} +1 -1
  92. package/storybook-static/assets/{ODataTreeSelect.stories-neC0wK7F.js → ODataTreeSelect.stories-B1xaZzaX.js} +1 -1
  93. package/storybook-static/assets/{OneStepScroller-r-dCCkMo.js → OneStepScroller-Ccn3TcUI.js} +1 -1
  94. package/storybook-static/assets/{Option-DnDHcghu.js → Option-CdzPub1C.js} +1 -1
  95. package/storybook-static/assets/{OptionButton-BPJ77vb9.js → OptionButton-BmRyJTuO.js} +1 -1
  96. package/storybook-static/assets/PeriodSelect-BngzAU_C.js +5 -0
  97. package/storybook-static/assets/{PeriodSelect-0bPQBeca.js → PeriodSelect-kQAjEWSH.js} +1 -1
  98. package/storybook-static/assets/{PeriodSelect.stories-CZq2FnBo.js → PeriodSelect.stories-BRvyn_JH.js} +1 -1
  99. package/storybook-static/assets/{PickerTriggerActions-CGn6LdIJ.js → PickerTriggerActions-C0nuR9kw.js} +1 -1
  100. package/storybook-static/assets/{Popover-CgMNWmOI.js → Popover-CsDztf-o.js} +1 -1
  101. package/storybook-static/assets/{Popover-B5OuO-K7.js → Popover-GYtSL_1f.js} +1 -1
  102. package/storybook-static/assets/{Popover.stories-OMuOLt7a.js → Popover.stories-Bqt_2L3Y.js} +1 -1
  103. package/storybook-static/assets/{PresetRangeDateInput--t_WB4Xn.js → PresetRangeDateInput-BSssho5H.js} +1 -1
  104. package/storybook-static/assets/{PresetRangeDateInput-m9AGDd9F.js → PresetRangeDateInput-C9G9Gebd.js} +1 -1
  105. package/storybook-static/assets/{PresetRangeDateInput.stories-DoumFweG.js → PresetRangeDateInput.stories-CwdMXBFw.js} +1 -1
  106. package/storybook-static/assets/{PresetSelect-C4W2pt8e.js → PresetSelect-BPsCLuct.js} +1 -1
  107. package/storybook-static/assets/{README-bHXns8Ve.js → README-5RP00KZZ.js} +1 -1
  108. package/storybook-static/assets/{README-3jiOAjxm.js → README-9XRn3-ED.js} +1 -1
  109. package/storybook-static/assets/{README-h-98fubh.js → README-BIqQ7jYg.js} +1 -1
  110. package/storybook-static/assets/{README-uolWGEC3.js → README-BLXGXOo5.js} +1 -1
  111. package/storybook-static/assets/{README-DbQa33tw.js → README-BOBlSnDn.js} +1 -1
  112. package/storybook-static/assets/{README-DOllumUi.js → README-BRpdVUr9.js} +1 -1
  113. package/storybook-static/assets/{README-CIZLQQcA.js → README-BXb7J1i8.js} +1 -1
  114. package/storybook-static/assets/{README-5OGR2Idk.js → README-BYHSzLwv.js} +1 -1
  115. package/storybook-static/assets/{README-BnR3ISRZ.js → README-Ba0tB6ZN.js} +1 -1
  116. package/storybook-static/assets/{README-C_ak9GBM.js → README-Bc8lHbXV.js} +1 -1
  117. package/storybook-static/assets/{README-DCf_OFhT.js → README-BhoxLtlr.js} +9 -2
  118. package/storybook-static/assets/{README-BjYF32H7.js → README-BmzSVH7U.js} +1 -1
  119. package/storybook-static/assets/{README-Cj-oAGOW.js → README-BpmlhmtG.js} +1 -1
  120. package/storybook-static/assets/README-Bq38hDzk.js +37 -0
  121. package/storybook-static/assets/{README-C4vNkSIZ.js → README-C07t0NIU.js} +1 -1
  122. package/storybook-static/assets/{README-BYqax1tk.js → README-C53FAkdN.js} +1 -1
  123. package/storybook-static/assets/{README-CTsukJjV.js → README-C7j7n7jq.js} +1 -1
  124. package/storybook-static/assets/{README-DPkd1E6y.js → README-CJtOh4Sd.js} +1 -1
  125. package/storybook-static/assets/{README-N4hwMOQa.js → README-CV61J_JK.js} +1 -1
  126. package/storybook-static/assets/{README-Bw0WNKXa.js → README-CVql_W36.js} +1 -1
  127. package/storybook-static/assets/{README-CErN8ivh.js → README-CXq89IOI.js} +1 -1
  128. package/storybook-static/assets/{README-DPP90ptQ.js → README-Ckp4sw5f.js} +1 -1
  129. package/storybook-static/assets/{README-BYz8QgnD.js → README-CxDM046q.js} +107 -28
  130. package/storybook-static/assets/{README-BXR7jq_-.js → README-D-fVNtRb.js} +1 -1
  131. package/storybook-static/assets/{README-Dobb_68B.js → README-D43Puppu.js} +1 -1
  132. package/storybook-static/assets/README-D67Ndgh9.js +121 -0
  133. package/storybook-static/assets/{README-B_7lghc6.js → README-DFCutGv3.js} +1 -1
  134. package/storybook-static/assets/{README-59WYy693.js → README-DQysVKmM.js} +1 -1
  135. package/storybook-static/assets/{README-DDawnRvx.js → README-DS_nuTod.js} +1 -1
  136. package/storybook-static/assets/{README-B_r0a-8W.js → README-DXBpQ2ho.js} +1 -1
  137. package/storybook-static/assets/{README-Co__w5yZ.js → README-DXRNhATk.js} +1 -1
  138. package/storybook-static/assets/{README-_hmkmeNS.js → README-D_a06RNK.js} +1 -1
  139. package/storybook-static/assets/{README-QlGGPMq8.js → README-DcWifa4y.js} +1 -1
  140. package/storybook-static/assets/{README-hTXC2gCB.js → README-Del1wUfr.js} +1 -1
  141. package/storybook-static/assets/{README-DPlmMvoG.js → README-Do7nnQ_n.js} +1 -1
  142. package/storybook-static/assets/{README-BVb_gVDX.js → README-DoPWzeQH.js} +1 -1
  143. package/storybook-static/assets/{README-Bnpspv-W.js → README-DqbwD6RO.js} +4 -2
  144. package/storybook-static/assets/{README-BAh5Xus0.js → README-DtQcSyrT.js} +37 -8
  145. package/storybook-static/assets/{README-BFaqbIdb.js → README-Dz8_KWoz.js} +1 -1
  146. package/storybook-static/assets/{README-Sr1IKAzc.js → README-GLir3V8b.js} +1 -1
  147. package/storybook-static/assets/{README-qa-yOB1-.js → README-HY5c2Bbn.js} +1 -1
  148. package/storybook-static/assets/{README-tQpBd04D.js → README-PcQNwv17.js} +1 -1
  149. package/storybook-static/assets/{README-S62e_HzW.js → README-Tw0ZHHwr.js} +1 -1
  150. package/storybook-static/assets/{README-nkCvXl2d.js → README-V9DD9H9z.js} +1 -1
  151. package/storybook-static/assets/{README-kw2yQ8Ly.js → README-XW0y0mGh.js} +1 -1
  152. package/storybook-static/assets/{README-BUcEfAaT.js → README-Y1Smckdh.js} +1 -1
  153. package/storybook-static/assets/{README-CeUtVNHb.js → README-ZguU3X5y.js} +1 -1
  154. package/storybook-static/assets/{README-CKv69_JF.js → README-e8EWTIws.js} +1 -1
  155. package/storybook-static/assets/{README-C4OysABl.js → README-n1zI-vYE.js} +45 -1
  156. package/storybook-static/assets/{README-BhckV3_p.js → README-oKCgmTdw.js} +12 -4
  157. package/storybook-static/assets/{README-BQ7AtNNR.js → README-pexCW3yI.js} +1 -1
  158. package/storybook-static/assets/{README-BAZjnIqN.js → README-vDg-39Yq.js} +1 -1
  159. package/storybook-static/assets/{README-BWsH4rJw.js → README-wKqwiHb4.js} +1 -1
  160. package/storybook-static/assets/{RadioButton-CfX3osFJ.js → RadioButton-DGT616TU.js} +1 -1
  161. package/storybook-static/assets/{RadioButton-BUnpjers.js → RadioButton-DvDDf9wn.js} +1 -1
  162. package/storybook-static/assets/{RadioButton.stories-H8zzkkO1.js → RadioButton.stories-BSA2eNrW.js} +1 -1
  163. package/storybook-static/assets/{RadioGroup-DqXzJFTf.js → RadioGroup-C_ZapH6C.js} +1 -1
  164. package/storybook-static/assets/{RadioGroup-qEBEahRK.js → RadioGroup-Cj-zQisA.js} +1 -1
  165. package/storybook-static/assets/{RadioGroup.stories-Fw903xfW.js → RadioGroup.stories-B6HK1X-8.js} +1 -1
  166. package/storybook-static/assets/{Scrollable-hz1NQNaK.js → Scrollable-DCvN6Jjw.js} +1 -1
  167. package/storybook-static/assets/{Select-Bx7jfO8v.js → Select-DPdZSw3l.js} +1 -1
  168. package/storybook-static/assets/{Select-DMfWBkBz.js → Select-DY9-upm8.js} +1 -1
  169. package/storybook-static/assets/{Select.stories-Du-OjTNW.js → Select.stories-CZ_QR5HG.js} +1 -1
  170. package/storybook-static/assets/{SerializableSelect-qHSRjx3u.js → SerializableSelect-11vTkd0H.js} +1 -1
  171. package/storybook-static/assets/{SerializableSelect.stories-psdGMsQh.js → SerializableSelect.stories-BguIknSO.js} +1 -1
  172. package/storybook-static/assets/{SingleDateTimeInput-CgM7dvqm.js → SingleDateTimeInput-BoGhy8Ht.js} +1 -1
  173. package/storybook-static/assets/SingleDateTimeInput-DCsz6UCV.js +1 -0
  174. package/storybook-static/assets/{SingleDateTimeInput.stories-DZuJywm7.js → SingleDateTimeInput.stories-DxuSYUFA.js} +1 -1
  175. package/storybook-static/assets/{Slider-DrlH-Yc8.js → Slider-CysM6SsH.js} +1 -1
  176. package/storybook-static/assets/{Slider-BOrjmti5.js → Slider-OjWEFAVX.js} +1 -1
  177. package/storybook-static/assets/{Slider.stories-zGf5JH7B.js → Slider.stories-D9yfMGAr.js} +1 -1
  178. package/storybook-static/assets/{SliderInput-BXhb-G_f.js → SliderInput-CI_NLQ0q.js} +1 -1
  179. package/storybook-static/assets/{SliderInput-8tBsLdl3.js → SliderInput-DBTFSE4e.js} +1 -1
  180. package/storybook-static/assets/{SliderInput.stories-Bfh2gqKd.js → SliderInput.stories-D0oX3RFL.js} +1 -1
  181. package/storybook-static/assets/{Sortable-CmIfgixe.js → Sortable-wMgs80Np.js} +1 -1
  182. package/storybook-static/assets/{Sortable.stories-C78JlelK.js → Sortable.stories-CzLFp8Yi.js} +1 -1
  183. package/storybook-static/assets/{Splitter-BTSXnqj_.js → Splitter-BKw_fa4-.js} +1 -1
  184. package/storybook-static/assets/{Splitter.stories-Dh7hL3px.js → Splitter.stories-BESoJ6o1.js} +1 -1
  185. package/storybook-static/assets/{StateSelect-CoJ39Kdx.js → StateSelect-BO-jFCLn.js} +1 -1
  186. package/storybook-static/assets/StateSelect-BwNBFERr.js +4 -0
  187. package/storybook-static/assets/{StateSelect.stories-DeWav8T9.js → StateSelect.stories-BK7SyuXQ.js} +1 -1
  188. package/storybook-static/assets/{StringToggle.stories-CPBa-lFY.js → StringToggle.stories-A6pkEO-O.js} +1 -1
  189. package/storybook-static/assets/{Switch-BAJOte6Q.js → Switch-8JotpfFf.js} +1 -1
  190. package/storybook-static/assets/{Switch-Bi2pIHDI.js → Switch-Ca3gnf5f.js} +1 -1
  191. package/storybook-static/assets/{Switch.stories-ByhJBHq4.js → Switch.stories-o3vvp8L8.js} +1 -1
  192. package/storybook-static/assets/{Table-DH0AckX2.js → Table-C_IPJbR2.js} +1 -1
  193. package/storybook-static/assets/{Table.stories-C5HKyd7X.js → Table.stories-DOFEu7Ua.js} +1 -1
  194. package/storybook-static/assets/{Tabs-COnb8huQ.js → Tabs-BLBo4OAv.js} +1 -1
  195. package/storybook-static/assets/{Tabs.stories-gaBFPOqg.js → Tabs.stories-RBnCQrM-.js} +1 -1
  196. package/storybook-static/assets/{TabsBox-DGmKDKFT.js → TabsBox-apqD4XLH.js} +1 -1
  197. package/storybook-static/assets/{TagInput-fiG22GmX.js → TagInput-CSYOG896.js} +1 -1
  198. package/storybook-static/assets/{TagInput.stories-BOvucwBk.js → TagInput.stories-BnGuMi6T.js} +1 -1
  199. package/storybook-static/assets/{Text-CrffLlt2.js → Text-mRhkARXu.js} +1 -1
  200. package/storybook-static/assets/{Textarea-Bk_2AVYG.js → Textarea-Covk__BL.js} +1 -1
  201. package/storybook-static/assets/{Textarea-DlBIfLlw.js → Textarea-DS1hM5rM.js} +1 -1
  202. package/storybook-static/assets/{Textarea.stories-O7urUyHw.js → Textarea.stories-BdpsMxDY.js} +1 -1
  203. package/storybook-static/assets/{TimePanel-Dla4JAOt.js → TimePanel-PDYyBCbF.js} +1 -1
  204. package/storybook-static/assets/{TimePanel.stories-D5SMqIsI.js → TimePanel.stories-BFS31y6L.js} +1 -1
  205. package/storybook-static/assets/{Toggle-bq8UTDMZ.js → Toggle-DTX4Q7y6.js} +1 -1
  206. package/storybook-static/assets/{Toggle-Cbkn8Hau.js → Toggle-zWHGLyKm.js} +1 -1
  207. package/storybook-static/assets/{Toggle.stories-Ds55x4cO.js → Toggle.stories-fZ7WRE_7.js} +1 -1
  208. package/storybook-static/assets/{TreeMultiSelect-CZX9pAkb.js → TreeMultiSelect-BSZO9xe1.js} +1 -1
  209. package/storybook-static/assets/{TreeMultiSelect-D4B4pqZz.js → TreeMultiSelect-C4y6p4PX.js} +1 -1
  210. package/storybook-static/assets/{TreeMultiSelect.stories-BWpPvnJl.js → TreeMultiSelect.stories-DXKBBf5r.js} +1 -1
  211. package/storybook-static/assets/{TreePickerBase-BKCLqkhB.js → TreePickerBase-CMHFqHVa.js} +1 -1
  212. package/storybook-static/assets/{TreeSelect-0jFcLZm3.js → TreeSelect-DGXveWx3.js} +1 -1
  213. package/storybook-static/assets/{TreeSelect-BNpVo2oN.js → TreeSelect-Dh5uT4_T.js} +1 -1
  214. package/storybook-static/assets/{TreeSelect.stories-D0M--uBR.js → TreeSelect.stories-Byy-mMTP.js} +1 -1
  215. package/storybook-static/assets/{TreeTable-DzUNzP-c.js → TreeTable-BN7J72I8.js} +1 -1
  216. package/storybook-static/assets/{TreeTable.stories-CRHUMdfS.js → TreeTable.stories-FYHTdBr3.js} +1 -1
  217. package/storybook-static/assets/{array-D-_yMMUK-BQ0uu1hZ.js → array-D-_yMMUK-DYqn1Ozn.js} +1 -1
  218. package/storybook-static/assets/{blocks-BJgKfTeb.js → blocks-o5-z1BZu.js} +3 -3
  219. package/storybook-static/assets/{check-BzkxQ8WU.js → check-C4AaNZYo.js} +1 -1
  220. package/storybook-static/assets/{chevron-down-DGvYv14U.js → chevron-down-DvNqUDlQ.js} +1 -1
  221. package/storybook-static/assets/{chevron-left-BPaDbp9T.js → chevron-left-DjMG1A8Y.js} +1 -1
  222. package/storybook-static/assets/{chevron-right-DMTjVndT.js → chevron-right-Mitq9JQN.js} +1 -1
  223. package/storybook-static/assets/{chunk-W22LQPXL-B730-y87.js → chunk-W22LQPXL-DNwhYDee.js} +1 -1
  224. package/storybook-static/assets/{circle-alert-C27j3MuB.js → circle-alert-RsaUYk8p.js} +1 -1
  225. package/storybook-static/assets/{circle-check-H9j-t9F9.js → circle-check-Bf5GP89g.js} +1 -1
  226. package/storybook-static/assets/{components-DFWEBfcy.js → components-B4tZ3-vQ.js} +3 -3
  227. package/storybook-static/assets/{contextMenu-CnvFzk6C.js → contextMenu-Ftv13fjh.js} +1 -1
  228. package/storybook-static/assets/{defaultRenderers-Dinv2uRZ.js → defaultRenderers-CyUQG_f-.js} +1 -1
  229. package/storybook-static/assets/{download-D53jj6OB.js → download-BmjzCCZo.js} +1 -1
  230. package/storybook-static/assets/{floating-ui.react-BldWHyvZ.js → floating-ui.react-BY7cYh9B.js} +1 -1
  231. package/storybook-static/assets/formatters-DVE1YVNQ-CMsbb5-m.js +1 -0
  232. package/storybook-static/assets/{foundationApi-DUPa0kJf.js → foundationApi-C7zGaHuR.js} +4 -4
  233. package/storybook-static/assets/{foundationLib-BgsO8s2Q.js → foundationLib-CQpPkJlc.js} +1 -1
  234. package/storybook-static/assets/{hooks-CItSQalB.js → hooks-DQXnNniA.js} +2 -2
  235. package/storybook-static/assets/iframe-B-sjM2X5.js +1 -0
  236. package/storybook-static/assets/{iframe-8t-iSZRw.js → iframe-Cb11iJVP.js} +4 -4
  237. package/storybook-static/assets/iframe-IhWQT6NX.css +1 -0
  238. package/storybook-static/assets/{info-D6YLTeJv.js → info-BmiY6Ur5.js} +1 -1
  239. package/storybook-static/assets/odata-D-cQAIdp.js +1 -0
  240. package/storybook-static/assets/odata-service-CWkHASdw-DAt28ZWr.js +50 -0
  241. package/storybook-static/assets/{odataStoryFixtures-DkfxDG-j.js → odataStoryFixtures-BddSr1SB.js} +1 -1
  242. package/storybook-static/assets/{react-C5Qye0r6.js → react-wmXnhrTV.js} +1 -1
  243. package/storybook-static/assets/{refresh-cw-BirMeJd2.js → refresh-cw-BoUt7cjC.js} +1 -1
  244. package/storybook-static/assets/{settings-2-CyWHqbgu.js → settings-2-BnEmfu4n.js} +1 -1
  245. package/storybook-static/assets/{sortable-DhM5eZtm.js → sortable-BG6M9j0E.js} +1 -1
  246. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-1DmtB-7j.js → syntaxhighlighter-QEQV7K2Y-DTU-Nj55.js} +1 -1
  247. package/storybook-static/assets/{trash-2-CTWGv9x4.js → trash-2-CEuSrdHe.js} +1 -1
  248. package/storybook-static/assets/{triangle-alert-0JLo0Lt9.js → triangle-alert-BB6HrHL-.js} +1 -1
  249. package/storybook-static/assets/{useODataSelectBase-Bij1tnHS.js → useODataSelectBase-DiMVVy-k.js} +1 -1
  250. package/storybook-static/assets/{useODataTreeData-BkicHJRI.js → useODataTreeData-DiV_gN4z.js} +1 -1
  251. package/storybook-static/assets/{usePickerDefaultFilter-5Q1pAV4d.js → usePickerDefaultFilter-BMBLqfz8.js} +1 -1
  252. package/storybook-static/assets/{usePickerQuery-DI3kx12L.js → usePickerQuery-Dc3Jdhg0.js} +1 -1
  253. package/storybook-static/assets/{usePickerTriggerController-fbTOudOs.js → usePickerTriggerController-BjY_AiUm.js} +1 -1
  254. package/storybook-static/assets/validators-D82aYLRK.js +1 -0
  255. package/storybook-static/assets/{x-Dl2v2p0F.js → x-CcdATVNL.js} +1 -1
  256. package/storybook-static/iframe.html +3 -3
  257. package/storybook-static/index.json +1 -1
  258. package/storybook-static/project.json +1 -1
  259. package/storybook-static/assets/PeriodSelect-Cg7KGZji.js +0 -5
  260. package/storybook-static/assets/README-Ak1zhbTl.js +0 -324
  261. package/storybook-static/assets/SingleDateTimeInput-ByD1qCqD.js +0 -1
  262. package/storybook-static/assets/StateSelect-CBBFuY4Y.js +0 -4
  263. package/storybook-static/assets/formatters-D33Uh3si-Df97arf9.js +0 -1
  264. package/storybook-static/assets/iframe-DUr12u4y.js +0 -1
  265. package/storybook-static/assets/iframe-DjMdxawD.css +0 -1
  266. package/storybook-static/assets/odata-Dl5qN0UA.js +0 -1
  267. package/storybook-static/assets/odata-service-CWkHASdw-CXhFi03v.js +0 -3
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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-8
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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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/Formulas`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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/Formulas`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`табличные-формулы`,children:`Табличные формулы`}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/formulas`}),` предоставляет безопасную инфраструктуру для заранее написанных клиентских формул таблицы.`]}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Формула получает значения других полей текущей строки, выполняет синхронный расчёт и возвращает конечное JavaScript-число. Например, она может вычислить сумму, разницу, отношение или процент для calculated-колонки.`}),`
@@ -0,0 +1,37 @@
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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 API/WebSocket`}),`
2
+ `,(0,c.jsxs)(t.h1,{id:`websocket-transport-через-ryuzaki13react-foundation-apiwebsocket`,children:[`WebSocket transport через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/websocket`})]}),`
3
+ `,(0,c.jsx)(t.p,{children:`Entrypoint содержит только предметно-независимый transport lifecycle:`}),`
4
+ `,(0,c.jsxs)(t.ul,{children:[`
5
+ `,(0,c.jsx)(t.li,{children:`один активный socket;`}),`
6
+ `,(0,c.jsx)(t.li,{children:`bounded exponential reconnect с jitter;`}),`
7
+ `,(0,c.jsx)(t.li,{children:`наблюдаемый connection snapshot;`}),`
8
+ `,(0,c.jsxs)(t.li,{children:[`проверку браузерного `,(0,c.jsx)(t.code,{children:`Origin`}),` на серверном upgrade boundary.`]}),`
9
+ `]}),`
10
+ `,(0,c.jsx)(t.p,{children:`Доменный event envelope, авторизация, подписки, replay/resync и обновление TanStack Query принадлежат host-приложению.`}),`
11
+ `,(0,c.jsx)(t.h2,{id:`управляемое-соединение`,children:`Управляемое соединение`}),`
12
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { createManagedWebSocket } from "@ryuzaki13/react-foundation-api/websocket";
13
+
14
+ const connection = createManagedWebSocket({
15
+ url: () => new URL("/ws/events", window.location.href).href.replace(/^http/, "ws"),
16
+ onMessage(event) {
17
+ console.log(event.data);
18
+ }
19
+ });
20
+
21
+ const unsubscribe = connection.subscribe(() => {
22
+ console.log(connection.getSnapshot());
23
+ });
24
+
25
+ connection.connect();
26
+ connection.stop();
27
+ unsubscribe();
28
+ `})}),`
29
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`send`}),` возвращает `,(0,c.jsx)(t.code,{children:`false`}),`, если socket ещё не открыт. Normal close `,(0,c.jsx)(t.code,{children:`1000`}),` и policy violation `,(0,c.jsx)(t.code,{children:`1008`}),` по умолчанию не запускают reconnect; это можно переопределить через `,(0,c.jsx)(t.code,{children:`reconnect.shouldReconnect`}),`.`]}),`
30
+ `,(0,c.jsxs)(t.p,{children:[`В SSR `,(0,c.jsx)(t.code,{children:`WebSocket`}),` обычно отсутствует. Создавайте соединение только в браузерном lifecycle либо передайте совместимый `,(0,c.jsx)(t.code,{children:`socketFactory`}),`.`]}),`
31
+ `,(0,c.jsx)(t.h2,{id:`origin-policy-на-upgrade`,children:`Origin policy на upgrade`}),`
32
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import { evaluateWebSocketRequestOrigin } from "@ryuzaki13/react-foundation-api/websocket";
33
+
34
+ const decision = evaluateWebSocketRequestOrigin(request);
35
+ if (!decision.allowed) return new Response("Forbidden", { status: 403 });
36
+ `})}),`
37
+ `,(0,c.jsxs)(t.p,{children:[`По умолчанию обязателен `,(0,c.jsx)(t.code,{children:`Origin`}),`, равный origin request URL. За reverse proxy следует сохранять внешний `,(0,c.jsx)(t.code,{children:`Host`}),` и protocol; альтернативные origins передаются только явным allowlist. `,(0,c.jsx)(t.code,{children:`allowMissingOrigin`}),` предназначен для отдельно доверенных non-browser clients и по умолчанию выключен.`]})]})}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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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/React/Virtualizer Pagination`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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/React/Virtualizer Pagination`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`дозагрузка-virtualized-списка`,children:`Дозагрузка virtualized списка`}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`useFetchNextPageEffect`}),` вызывает `,(0,c.jsx)(t.code,{children:`fetchNextPage`}),`, когда последняя отрендеренная virtual item достигает конца уже загруженного списка.`]}),`
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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.js";function o(e){let t={a:`a`,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 API/Query/Persisted Records`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={a:`a`,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 API/Query/Persisted Records`}),`
2
2
  `,(0,c.jsxs)(t.h1,{id:`сохранённые-записи-через-ryuzaki13react-foundation-apipersisted`,children:[`Сохранённые записи через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/persisted`})]}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`persisted`}),` — специализированный слой поверх TanStack Query для данных, которые пользователь сохраняет и позднее восстанавливает: presets, variants, view configs и другие versioned records.`]}),`
4
4
  `,(0,c.jsxs)(t.p,{children:[`Слово `,(0,c.jsx)(t.code,{children:`persisted`}),` здесь означает backend-сущности «сохранённая запись». Это не то же самое, что persistence TanStack Query cache в IndexedDB.`]}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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/Interaction/Context Menu State`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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/Interaction/Context Menu State`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`состояние-и-anchors-контекстного-меню`,children:`Состояние и anchors контекстного меню`}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Модуль описывает открытое/закрытое состояние контекстного меню, источник открытия и два вида anchor: DOM element или экранная точка. Также он создаёт virtual anchor для Floating UI.`}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Модуль не содержит React hook и не рисует меню.`}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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/Number`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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/Number`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`числовые-форматтеры`,children:`Числовые форматтеры`}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Модуль форматирует числа для интерфейса, читает распространённые SAP-подобные числовые строки и управляет реестром именованных presets.`}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Все API доступны через один публичный entrypoint:`}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.js";function o(e){let t={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/Orchestration/Async Tasks`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.js";function o(e){let t={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/Orchestration/Async Tasks`}),`
2
2
  `,(0,c.jsxs)(t.h1,{id:`асинхронные-задачи-через-ryuzaki13react-foundation-apiasync`,children:[`Асинхронные задачи через `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/async`})]}),`
3
3
  `,(0,c.jsx)(t.p,{children:`Модуль запускает независимые Promise-задачи, сохраняет связь результата с исходным элементом и формирует удобную сводку для UI/логов.`}),`
4
4
  `,(0,c.jsx)(t.h2,{id:`какой-runner-выбрать`,children:`Какой runner выбрать`}),`
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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,6 +1,6 @@
1
- import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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
- `,(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`}),`.`]}),`
3
+ `,(0,c.jsxs)(t.p,{children:[`Модуль `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-lib/error-report`}),` собирает клиентскую диагностику ошибки в versioned bounded draft, временно хранит последние drafts в `,(0,c.jsx)(t.code,{children:`sessionStorage`}),` и предоставляет durable IndexedDB queue для отложенной доставки.`]}),`
4
4
  `,(0,c.jsx)(t.p,{children:`Он умеет объединить:`}),`
5
5
  `,(0,c.jsxs)(t.ul,{children:[`
6
6
  `,(0,c.jsx)(t.li,{children:`нормализованную ошибку и stack trace;`}),`
@@ -10,20 +10,24 @@ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8
10
10
  `,(0,c.jsx)(t.li,{children:`состояние TanStack Query без полного query data;`}),`
11
11
  `,(0,c.jsx)(t.li,{children:`технические сведения о persisted queries;`}),`
12
12
  `,(0,c.jsx)(t.li,{children:`контекст React/runtime/transport;`}),`
13
- `,(0,c.jsxs)(t.li,{children:[`lifecycle доставки: `,(0,c.jsx)(t.code,{children:`pending`}),`, `,(0,c.jsx)(t.code,{children:`sending`}),`, `,(0,c.jsx)(t.code,{children:`sent`}),`, `,(0,c.jsx)(t.code,{children:`failed`}),`.`]}),`
13
+ `,(0,c.jsxs)(t.li,{children:[`локальный draft lifecycle: `,(0,c.jsx)(t.code,{children:`pending`}),`, `,(0,c.jsx)(t.code,{children:`sending`}),`, `,(0,c.jsx)(t.code,{children:`sent`}),`, `,(0,c.jsx)(t.code,{children:`failed`}),`;`]}),`
14
+ `,(0,c.jsx)(t.li,{children:`durable queue с TTL, bounded capacity и атомарным межвкладочным lease.`}),`
14
15
  `]}),`
15
- `,(0,c.jsxs)(t.p,{children:[`Важная граница: `,(0,c.jsx)(t.strong,{children:`lib-пакет не отправляет отчёт на сервер`}),`. Он формирует draft и предоставляет точки подключения. Авторизация, HTTP/API delivery, retry, пользовательское согласие и UI принадлежат приложению либо API-пакету.`]}),`
16
+ `,(0,c.jsxs)(t.p,{children:[`Важная граница: `,(0,c.jsx)(t.strong,{children:`lib-пакет не отправляет отчёт на сервер`}),`. Он формирует draft, хранит queue и предоставляет атомарные переходы. Авторизация, HTTP/API delivery, retry, пользовательское согласие и UI принадлежат приложению либо API-пакету.`]}),`
16
17
  `,(0,c.jsx)(t.h2,{id:`установка`,children:`Установка`}),`
17
18
  `,(0,c.jsx)(t.p,{children:`Модуль интегрируется с TanStack Query и query persistence.`}),`
18
19
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-bash`,children:`npm install @ryuzaki13/react-foundation-lib \\
19
20
  @tanstack/react-query \\
20
- @tanstack/query-persist-client-core
21
+ @tanstack/query-persist-client-core \\
22
+ zod
21
23
  `})}),`
22
24
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`import {
23
25
  captureRuntimeErrorReport,
26
+ createErrorReportQueue,
24
27
  createErrorInfo,
25
28
  installErrorReportBrowserBreadcrumbs,
26
29
  setErrorReportRuntimeErrorReporter,
30
+ setErrorReportSanitizer,
27
31
  type ErrorReportDraft
28
32
  } from "@ryuzaki13/react-foundation-lib/error-report";
29
33
  `})}),`
@@ -33,7 +37,8 @@ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-8
33
37
  → нормализация + diagnostics + breadcrumbs
34
38
  → ErrorReportDraft(status = pending)
35
39
  → sessionStorage, максимум 10 drafts
36
- → app/API delivery
40
+ → enqueue payload в IndexedDB, максимум 50 записей / 7 суток
41
+ → app/API delivery через lease
37
42
  → updateErrorReportDraft(status = sending/sent/failed)
38
43
  `})}),`
39
44
  `,(0,c.jsx)(t.p,{children:`Сбор отчёта — дополнительный диагностический сценарий. Ошибка репортера не должна заменять исходную ошибку и ломать основной пользовательский поток.`}),`
@@ -55,12 +60,12 @@ isErrorReportingEnabled({ isDev: false });
55
60
  declare const __APP_ID__: string;
56
61
  declare const __APP_BUILD_ID__: string;
57
62
  `})}),`
58
- `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`__APP_ID__`}),` входит в ключи `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`, а `,(0,c.jsx)(t.code,{children:`__APP_BUILD_ID__`}),` помогает связать ошибку с деплоем.`]}),`
63
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`__APP_ID__`}),` входит в payload как `,(0,c.jsx)(t.code,{children:`application`}),` и в ключи `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`, а `,(0,c.jsx)(t.code,{children:`__APP_BUILD_ID__`}),` помогает связать ошибку с деплоем. Приложение обязано использовать устойчивый deployment identifier, а не display name. Например, KTK-приложения используют `,(0,c.jsx)(t.code,{children:`ru.education-system`}),` и `,(0,c.jsx)(t.code,{children:`ru.ktk-website`}),`.`]}),`
59
64
  `,(0,c.jsx)(t.p,{children:`Пример Vite:`}),`
60
65
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`define: {
61
66
  __DEV__: JSON.stringify(mode !== "production"),
62
- __APP_ID__: JSON.stringify("education-arm"),
63
- __APP_BUILD_ID__: JSON.stringify(process.env.BUILD_ID ?? "local"),
67
+ __APP_ID__: JSON.stringify("ru.education-system"),
68
+ __APP_BUILD_ID__: JSON.stringify(process.env.GIT_COMMIT_SHA ?? "local"),
64
69
  }
65
70
  `})}),`
66
71
  `,(0,c.jsxs)(t.p,{children:[`Модуль persisted diagnostics использует инфраструктуру `,(0,c.jsx)(t.code,{children:`/query-client`}),`; её compile-time persistence-константы тоже должны быть настроены, если приложение включает соответствующую часть query persistence.`]}),`
@@ -115,7 +120,7 @@ declare const __APP_BUILD_ID__: string;
115
120
  httpStatus?: number;
116
121
  };
117
122
  `})}),`
118
- `,(0,c.jsxs)(t.p,{children:[`Для обычного `,(0,c.jsx)(t.code,{children:`Error`}),` сохраняются `,(0,c.jsx)(t.code,{children:`name`}),`, непустой `,(0,c.jsx)(t.code,{children:`message`}),` и полный `,(0,c.jsx)(t.code,{children:`stack`}),`.`]}),`
123
+ `,(0,c.jsxs)(t.p,{children:[`Для обычного `,(0,c.jsx)(t.code,{children:`Error`}),` сохраняются `,(0,c.jsx)(t.code,{children:`name`}),`, непустой `,(0,c.jsx)(t.code,{children:`message`}),` и `,(0,c.jsx)(t.code,{children:`stack`}),` до 64 KiB.`]}),`
119
124
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createErrorInfo(new Error("Не удалось сохранить"));
120
125
  // { name: "Error", message: "Не удалось сохранить", stackTrace: "..." }
121
126
  `})}),`
@@ -130,14 +135,27 @@ declare const __APP_BUILD_ID__: string;
130
135
  `,(0,c.jsx)(t.li,{children:`максимальная глубина — 4;`}),`
131
136
  `,(0,c.jsx)(t.li,{children:`максимум 20 элементов массива;`}),`
132
137
  `,(0,c.jsx)(t.li,{children:`максимум 40 ключей объекта;`}),`
138
+ `,(0,c.jsx)(t.li,{children:`строка — не более 4096 символов;`}),`
133
139
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`undefined`}),`, function, symbol и усечённая ветка получают специальные объекты `,(0,c.jsx)(t.code,{children:`{ type: ... }`}),`;`]}),`
140
+ `,(0,c.jsxs)(t.li,{children:[`циклическая ссылка получает `,(0,c.jsx)(t.code,{children:`{ type: "circular" }`}),`;`]}),`
134
141
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`bigint`}),` превращается в строку;`]}),`
135
142
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`Date`}),` — в ISO-строку.`]}),`
143
+ `,(0,c.jsxs)(t.li,{children:[`известные secret-like keys (`,(0,c.jsx)(t.code,{children:`authorization`}),`, `,(0,c.jsx)(t.code,{children:`cookie`}),`, `,(0,c.jsx)(t.code,{children:`password`}),`, `,(0,c.jsx)(t.code,{children:`token`}),`, `,(0,c.jsx)(t.code,{children:`secret`}),`, CSRF/API keys) получают `,(0,c.jsx)(t.code,{children:`[REDACTED]`}),`;`]}),`
144
+ `,(0,c.jsxs)(t.li,{children:[`email в свободной строке заменяется на `,(0,c.jsx)(t.code,{children:`[REDACTED_EMAIL]`}),`;`]}),`
145
+ `,(0,c.jsxs)(t.li,{children:[`значения полей с именем `,(0,c.jsx)(t.code,{children:`*Url`}),` сохраняются без search/hash.`]}),`
136
146
  `]}),`
137
147
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`createDiagnosticValue({ retry: 2, handler: () => undefined });
138
148
  // { retry: 2, handler: { type: "function" } }
139
149
  `})}),`
140
- `,(0,c.jsxs)(t.p,{children:[`Критически важно: функция `,(0,c.jsx)(t.strong,{children:`не скрывает значения по имени ключа`}),`. Поля `,(0,c.jsx)(t.code,{children:`token`}),`, `,(0,c.jsx)(t.code,{children:`password`}),`, `,(0,c.jsx)(t.code,{children:`authorization`}),`, email и другие секреты сохранятся, если их передать. Это ограничитель размера и типа, а не security sanitizer.`]}),`
150
+ `,(0,c.jsx)(t.p,{children:`Built-in redaction является страховочной сеткой и не распознаёт ФИО, телефоны и все предметные идентификаторы. Он не заменяет app-level allow-list.`}),`
151
+ `,(0,c.jsx)(t.h3,{id:`seterrorreportsanitizersanitizer`,children:(0,c.jsx)(t.code,{children:`setErrorReportSanitizer(sanitizer?)`})}),`
152
+ `,(0,c.jsxs)(t.p,{children:[`Регистрирует единственный sanitizer приложения для error message/stack, delivery failure reason, query/mutation keys, meta, context, data shape и breadcrumb detail. Callback получает уже bounded `,(0,c.jsx)(t.code,{children:`ErrorReportSafeValue`}),` и scope, возвращает разрешённое значение либо `,(0,c.jsx)(t.code,{children:`undefined`}),`, чтобы удалить секцию. Результат повторно нормализуется foundation-ограничителями.`]}),`
153
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`setErrorReportSanitizer((value, context) => {
154
+ if (context.scope !== "context" || !value || Array.isArray(value) || typeof value !== "object") return value;
155
+ return "operation" in value ? { operation: value.operation } : undefined;
156
+ });
157
+ `})}),`
158
+ `,(0,c.jsxs)(t.p,{children:[`Callback должен быть чистым и идемпотентным: capture может повторно применить его к уже подготовленной секции перед storage write. Если callback бросает исключение, рискованная секция удаляется. При teardown/hot reload вызовите `,(0,c.jsx)(t.code,{children:`setErrorReportSanitizer(undefined)`}),`.`]}),`
141
159
  `,(0,c.jsx)(t.h3,{id:`sanitizedetaildetail`,children:(0,c.jsx)(t.code,{children:`sanitizeDetail(detail)`})}),`
142
160
  `,(0,c.jsxs)(t.p,{children:[`Применяет `,(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),` к первым 40 полям объекта. Для `,(0,c.jsx)(t.code,{children:`undefined`}),` или пустого объекта возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
143
161
  `,(0,c.jsx)(t.p,{children:`Передавайте только заранее отобранные технические данные:`}),`
@@ -177,7 +195,7 @@ declare const __APP_BUILD_ID__: string;
177
195
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`getErrorReportBreadcrumbs();
178
196
  clearErrorReportBreadcrumbs();
179
197
  `})}),`
180
- `,(0,c.jsx)(t.p,{children:`Возвращаемый массив является текущим внутренним массивом, а не глубокой копией. Считайте его readonly и не меняйте элементы вручную.`}),`
198
+ `,(0,c.jsx)(t.p,{children:`Возвращаемый массив является shallow copy. Вложенные элементы считайте readonly и не меняйте вручную.`}),`
181
199
  `,(0,c.jsx)(t.h3,{id:`автоматические-browser-breadcrumbs`,children:`Автоматические browser breadcrumbs`}),`
182
200
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const uninstallBreadcrumbs = installErrorReportBrowserBreadcrumbs();
183
201
 
@@ -189,14 +207,14 @@ uninstallBreadcrumbs();
189
207
  `,(0,c.jsx)(t.li,{children:`click в capture phase;`}),`
190
208
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`document.visibilitychange`}),`.`]}),`
191
209
  `]}),`
192
- `,(0,c.jsx)(t.p,{children:`Для click сохраняются координаты/модификаторы и ограниченное описание meaningful target: tag, стабильные атрибуты, короткий текст и цепочка родителей. Глубина DOM-цепочки ограничена 20, текст — 80 символами, атрибут — 120.`}),`
193
- `,(0,c.jsxs)(t.p,{children:[`Код не читает `,(0,c.jsx)(t.code,{children:`input.value`}),` и не копирует CSS class list, но текст/ARIA/title/data-атрибуты тоже могут содержать чувствительные данные. Не помещайте секреты в DOM-атрибуты и UI-текст.`]}),`
210
+ `,(0,c.jsxs)(t.p,{children:[`Для click сохраняются координаты/модификаторы и ограниченное техническое описание meaningful target: tag, role, input type и цепочка родителей. Приложение может явно добавить slug-like `,(0,c.jsx)(t.code,{children:`data-error-report-target`}),`, например `,(0,c.jsx)(t.code,{children:`student-save`}),`. Глубина DOM-цепочки ограничена 20, атрибут — 120 символами.`]}),`
211
+ `,(0,c.jsxs)(t.p,{children:[`Код не читает `,(0,c.jsx)(t.code,{children:`input.value`}),`, DOM text, `,(0,c.jsx)(t.code,{children:`id`}),`, `,(0,c.jsx)(t.code,{children:`title`}),`, `,(0,c.jsx)(t.code,{children:`aria-*`}),`, CSS classes, `,(0,c.jsx)(t.code,{children:`data-ui`}),`, `,(0,c.jsx)(t.code,{children:`data-action`}),` и произвольные `,(0,c.jsx)(t.code,{children:`data-*`}),`. Значение `,(0,c.jsx)(t.code,{children:`data-error-report-target`}),` принимается только из латинских букв, цифр и символов `,(0,c.jsx)(t.code,{children:`._:/-`}),`; свободный текст в него помещать нельзя.`]}),`
194
212
  `,(0,c.jsx)(t.p,{children:`На сервере установщик возвращает пустую cleanup-функцию.`}),`
195
213
  `,(0,c.jsx)(t.h2,{id:`диагностика-tanstack-query`,children:`Диагностика TanStack Query`}),`
196
214
  `,(0,c.jsx)(t.h3,{id:`collectquerydiagnosticsquery`,children:(0,c.jsx)(t.code,{children:`collectQueryDiagnostics(query)`})}),`
197
215
  `,(0,c.jsx)(t.p,{children:`Собирает:`}),`
198
216
  `,(0,c.jsxs)(t.ul,{children:[`
199
- `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`queryHash`}),` и диагностическое представление `,(0,c.jsx)(t.code,{children:`queryKey`}),`;`]}),`
217
+ `,(0,c.jsx)(t.li,{children:`безопасный hash уже очищенного query key и его диагностическое представление;`}),`
200
218
  `,(0,c.jsx)(t.li,{children:`status/fetchStatus;`}),`
201
219
  `,(0,c.jsx)(t.li,{children:`timestamps обновления data/error;`}),`
202
220
  `,(0,c.jsx)(t.li,{children:`failure count, invalidation и observer count;`}),`
@@ -204,14 +222,14 @@ uninstallBreadcrumbs();
204
222
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`dataShape`}),` вместо data;`]}),`
205
223
  `,(0,c.jsx)(t.li,{children:`нормализованную query error.`}),`
206
224
  `]}),`
207
- `,(0,c.jsxs)(t.p,{children:[`Значения `,(0,c.jsx)(t.code,{children:`queryKey`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),` сохраняются. Если туда попал token или персональный идентификатор, он попадёт в отчёт. Проектируйте query keys как диагностически безопасный контракт.`]}),`
225
+ `,(0,c.jsxs)(t.p,{children:[`Значения `,(0,c.jsx)(t.code,{children:`queryKey`}),` и `,(0,c.jsx)(t.code,{children:`meta`}),` проходят built-in redaction и app sanitizer. Предметные персональные идентификаторы всё равно должны удаляться policy приложения.`]}),`
208
226
  `,(0,c.jsx)(t.h3,{id:`collectmutationdiagnosticsmutation`,children:(0,c.jsx)(t.code,{children:`collectMutationDiagnostics(mutation)`})}),`
209
227
  `,(0,c.jsx)(t.p,{children:`Собирает mutation key, status, failure count, submitted timestamp, meta и error. Mutation variables/data не копируются.`}),`
210
228
  `,(0,c.jsx)(t.h3,{id:`collectqueryclientdiagnosticsqueryclient`,children:(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics(queryClient)`})}),`
211
229
  `,(0,c.jsx)(t.p,{children:`Возвращает последние 40 query и последние 40 mutations из соответствующих cache. Это синхронный snapshot текущего QueryClient.`}),`
212
230
  `,(0,c.jsx)(t.h3,{id:`collectpersistedquerydiagnostics`,children:(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics()`})}),`
213
231
  `,(0,c.jsxs)(t.p,{children:[`Асинхронно читает IndexedDB persistence из `,(0,c.jsx)(t.code,{children:`/query-client`}),` и возвращает максимум 40 записей.`]}),`
214
- `,(0,c.jsxs)(t.p,{children:[`Сохраняются storage key, buster, query hash/key, statuses, timestamps, failure count и error. `,(0,c.jsx)(t.code,{children:`state.data`}),` намеренно исключён полностью.`]}),`
232
+ `,(0,c.jsxs)(t.p,{children:[`Сохраняются buster, безопасный hash/key, statuses, timestamps, failure count и error. IndexedDB storage key и `,(0,c.jsx)(t.code,{children:`state.data`}),` намеренно исключены полностью.`]}),`
215
233
  `,(0,c.jsx)(t.p,{children:`Если IndexedDB/persistence недоступны или чтение бросает ошибку, возвращается пустой массив — сбор отчёта не падает.`}),`
216
234
  `,(0,c.jsx)(t.h2,{id:`capture-query-ошибки`,children:`Capture query-ошибки`}),`
217
235
  `,(0,c.jsx)(t.h3,{id:`capturequeryerrorreporterror-query-queryclient-context`,children:(0,c.jsx)(t.code,{children:`captureQueryErrorReport(error, query, queryClient, context?)`})}),`
@@ -236,7 +254,7 @@ uninstallBreadcrumbs();
236
254
  `,(0,c.jsx)(t.p,{children:`Работает аналогично query capture: подавляет дублирующий transport-report, добавляет mutation breadcrumb и собирает QueryClient/persistence snapshot.`}),`
237
255
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = await captureMutationErrorReport(error, mutation, queryClient, { source: "save-order", detail: { form: "order-edit" } });
238
256
  `})}),`
239
- `,(0,c.jsxs)(t.p,{children:[`Текущая реализация включает `,(0,c.jsx)(t.code,{children:`detail`}),` в breadcrumb, но не переносит его в `,(0,c.jsx)(t.code,{children:`payload.context`}),` mutation draft. Если этот контекст критичен для доставки, добавьте безопасные данные в app-level envelope либо используйте явную согласованную модель до capture.`]}),`
257
+ `,(0,c.jsxs)(t.p,{children:[`Текущая реализация включает очищенный `,(0,c.jsx)(t.code,{children:`detail`}),` и в breadcrumb, и в `,(0,c.jsx)(t.code,{children:`payload.context`}),` mutation draft.`]}),`
240
258
  `,(0,c.jsx)(t.h2,{id:`capture-runtimereact-ошибки`,children:`Capture runtime/React-ошибки`}),`
241
259
  `,(0,c.jsx)(t.h3,{id:`captureruntimeerrorreporterror-context-queryclient`,children:(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport(error, context?, queryClient?)`})}),`
242
260
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = await captureRuntimeErrorReport(
@@ -269,10 +287,72 @@ type ErrorReportDraft = {
269
287
  `})}),`
270
288
  `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`reportId`}),` — UUID отдельного отчёта. `,(0,c.jsx)(t.code,{children:`sessionId`}),` стабилен в текущем `,(0,c.jsx)(t.code,{children:`sessionStorage`}),`. `,(0,c.jsx)(t.code,{children:`createdUtc`}),` формируется как OData datetime UTC.`]}),`
271
289
  `,(0,c.jsx)(t.p,{children:`Payload содержит category/source/error, build environment, client, location, viewport, breadcrumbs и optional секции query/mutation/react/context.`}),`
290
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),` содержит обязательные `,(0,c.jsx)(t.code,{children:`payloadVersion: 1`}),` и `,(0,c.jsx)(t.code,{children:`application`}),`. Runtime parser принимает только текущую версию; unversioned и будущие формы не интерпретируются эвристически.`]}),`
291
+ `,(0,c.jsx)(t.h3,{id:`runtime-parsing`,children:`Runtime parsing`}),`
292
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`parseErrorReportPayload(value);
293
+ parseErrorReportDraft(value);
294
+ parseErrorReportDrafts(value);
295
+ `})}),`
296
+ `,(0,c.jsxs)(t.p,{children:[`Первые две функции возвращают текущий typed contract либо `,(0,c.jsx)(t.code,{children:`undefined`}),`. Parser массива независимо отбрасывает повреждённые элементы, сохраняя соседние валидные drafts. Дополнительно проверяется совпадение identity полей draft и payload и фактический размер payload.`]}),`
297
+ `,(0,c.jsx)(t.h3,{id:`bounded-payload`,children:`Bounded payload`}),`
298
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`limitErrorReportPayload(payload)`}),` сначала повторно применяет sanitization, затем проверяет UTF-8 размер `,(0,c.jsx)(t.code,{children:`JSON.stringify`}),`. Предел — `,(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_MAX_BYTES`}),` (256 KiB). При превышении optional diagnostics удаляются в фиксированном порядке, а `,(0,c.jsx)(t.code,{children:`payload.truncation`}),` фиксирует исходный размер, limit и список удалённых секций. `,(0,c.jsx)(t.code,{children:`getErrorReportPayloadSize(payload)`}),` возвращает фактический сериализованный размер в байтах.`]}),`
272
299
  `,(0,c.jsx)(t.h3,{id:`хранение`,children:`Хранение`}),`
273
- `,(0,c.jsxs)(t.p,{children:[`Drafts сохраняются под ключом `,(0,c.jsx)(t.code,{children:"${__APP_ID__}.errorReport.drafts.v1"}),`. В одной вкладке остаются последние 10 элементов. Старые удаляются с начала массива.`]}),`
300
+ `,(0,c.jsxs)(t.p,{children:[`Versioned drafts сохраняются под ключом `,(0,c.jsx)(t.code,{children:"${__APP_ID__}.errorReport.drafts.v2"}),`. В одной вкладке остаются последние 10 элементов. Старые удаляются с начала массива. Предыдущая unversioned storage-форма не загружается.`]}),`
274
301
  `,(0,c.jsx)(t.p,{children:`Storage errors и некорректный JSON подавляются. При переполнении sessionStorage текущее in-memory состояние обновится, но запись на диск может не сохраниться.`}),`
275
302
  `,(0,c.jsx)(t.p,{children:`Модуль загружает drafts при первом импорте. Это модульное состояние, общее для всех consumers одного bundle.`}),`
303
+ `,(0,c.jsx)(t.h2,{id:`durable-indexeddb-queue`,children:`Durable IndexedDB queue`}),`
304
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`sessionStorage`}),` draft остаётся кратким диагностическим lifecycle текущей вкладки. Надёжную отложенную доставку обеспечивает отдельная queue:`]}),`
305
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const queue = createErrorReportQueue();
306
+ if (!queue) {
307
+ // IndexedDB отсутствует: app фиксирует безопасную деградацию без рекурсии report flow.
308
+ return;
309
+ }
310
+
311
+ const draft = await captureRuntimeErrorReport(error, context, queryClient);
312
+ if (draft) {
313
+ await queue.enqueue(draft.payload);
314
+ }
315
+ `})}),`
316
+ `,(0,c.jsxs)(t.p,{children:[`Создание возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`, когда IndexedDB недоступен. Ошибки открывания, quota и транзакций не поглощаются: coordinator обязан отделить storage failure от исходной пользовательской ошибки и применить безопасную recovery policy.`]}),`
317
+ `,(0,c.jsx)(t.h3,{id:`storage-schema-и-limits`,children:`Storage schema и limits`}),`
318
+ `,(0,c.jsxs)(t.ul,{children:[`
319
+ `,(0,c.jsxs)(t.li,{children:[`база: `,(0,c.jsx)(t.code,{children:"${__APP_ID__}.error-report.queue.v1"}),`;`]}),`
320
+ `,(0,c.jsxs)(t.li,{children:[`object store: `,(0,c.jsx)(t.code,{children:`records`}),`;`]}),`
321
+ `,(0,c.jsxs)(t.li,{children:[`атомарная envelope-запись: `,(0,c.jsx)(t.code,{children:`queue.v1`}),`;`]}),`
322
+ `,(0,c.jsxs)(t.li,{children:[`queue schema: `,(0,c.jsx)(t.code,{children:`queueVersion: 1`}),`;`]}),`
323
+ `,(0,c.jsx)(t.li,{children:`максимум: 50 записей;`}),`
324
+ `,(0,c.jsxs)(t.li,{children:[`TTL каждой записи: 7 суток от `,(0,c.jsx)(t.code,{children:`enqueue`}),`, независимо от client `,(0,c.jsx)(t.code,{children:`createdUtc`}),`;`]}),`
325
+ `,(0,c.jsx)(t.li,{children:`lease по умолчанию: 30 секунд.`}),`
326
+ `]}),`
327
+ `,(0,c.jsxs)(t.p,{children:[`Одна bounded envelope используется намеренно: `,(0,c.jsx)(t.code,{children:`createIndexedDbQueryStorage.updateItem`}),` изменяет её в одной `,(0,c.jsx)(t.code,{children:`readwrite`}),` транзакции, поэтому две вкладки не могут одновременно получить один report. Payload уже ограничен 256 KiB, а число записей — 50; отдельная база не смешивается с persisted Query cache.`]}),`
328
+ `,(0,c.jsxs)(t.p,{children:[`При заполнении удаляется самый старый отчёт без активного lease, чтобы сохранить более свежую диагностику. Активные leases не вытесняются; если все 50 записей leased, `,(0,c.jsx)(t.code,{children:`enqueue`}),` возвращает `,(0,c.jsx)(t.code,{children:`capacity-exceeded`}),`. Повторный `,(0,c.jsx)(t.code,{children:`reportId`}),` возвращает `,(0,c.jsx)(t.code,{children:`duplicate`}),` и не заменяет сохранённый payload.`]}),`
329
+ `,(0,c.jsx)(t.h3,{id:`lease-flow`,children:`Lease flow`}),`
330
+ `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const lease = await queue.leaseNext({ ownerId: tabId });
331
+ if (!lease) return;
332
+
333
+ try {
334
+ await deliver(lease.payload);
335
+ await queue.acknowledge(lease.reportId, tabId);
336
+ } catch {
337
+ await queue.reschedule(lease.reportId, tabId, {
338
+ nextAttemptUtc,
339
+ failure: { utc: new Date().toISOString(), kind: "network" }
340
+ });
341
+ }
342
+ `})}),`
343
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`acknowledge`}),`, `,(0,c.jsx)(t.code,{children:`reschedule`}),` и `,(0,c.jsx)(t.code,{children:`discard`}),` изменяют запись только при совпадении `,(0,c.jsx)(t.code,{children:`ownerId`}),`. После crash/закрытия вкладки lease автоматически снова становится доступным по `,(0,c.jsx)(t.code,{children:`expiresUtc`}),`. Если server принял отчёт, а acknowledgement потерялся, клиент повторит тот же `,(0,c.jsx)(t.code,{children:`reportId`}),`; backend обязан быть идемпотентным.`]}),`
344
+ `,(0,c.jsxs)(t.p,{children:[(0,c.jsx)(t.code,{children:`lastFailure`}),` хранит только технический класс, UTC и optional HTTP status. Текст transport error не попадает в durable storage.`]}),`
345
+ `,(0,c.jsx)(t.h3,{id:`queue-api`,children:`Queue API`}),`
346
+ `,(0,c.jsxs)(t.ul,{children:[`
347
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`enqueue(payload, now?)`}),` — runtime-валидирует payload, удаляет expired и добавляет запись;`]}),`
348
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`leaseNext({ ownerId, now?, leaseDurationMs? })`}),` — атомарно выбирает ближайшую due-запись;`]}),`
349
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`acknowledge(reportId, ownerId)`}),` — удаляет подтверждённую запись;`]}),`
350
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`reschedule(reportId, ownerId, retry)`}),` — снимает lease и задаёт следующую попытку;`]}),`
351
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`discard(reportId, ownerId)`}),` — удаляет terminal-запись;`]}),`
352
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`getRecords(now?)`}),` — bounded диагностический snapshot;`]}),`
353
+ `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`getNextWakeUtc(now?)`}),` — ближайшее due/lease-expiry время для scheduler-а.`]}),`
354
+ `]}),`
355
+ `,(0,c.jsxs)(t.p,{children:[`Queue не использует `,(0,c.jsx)(t.code,{children:`navigator.onLine`}),` как источник истины и не владеет timer/event lifecycle. Этим занимается delivery coordinator из `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/error-report`}),`.`]}),`
276
356
  `,(0,c.jsxs)(t.h2,{id:`низкоуровневый-captureerrorreportdraftargs`,children:[`Низкоуровневый `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft(args)`})]}),`
277
357
  `,(0,c.jsx)(t.p,{children:`Используйте, когда все diagnostic sections уже подготовлены вручную:`}),`
278
358
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`const draft = captureErrorReportDraft({
@@ -304,7 +384,7 @@ try {
304
384
  });
305
385
  }
306
386
  `})}),`
307
- `,(0,c.jsxs)(t.p,{children:[`Для неизвестного ID update возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`. Обновление поверхностное и принимает `,(0,c.jsx)(t.code,{children:`Partial<ErrorReportDraft>`}),`: библиотека не проверяет разрешённые переходы статусов. App delivery обязан не менять `,(0,c.jsx)(t.code,{children:`reportId`}),`, payload и другие identity-поля без необходимости.`]}),`
387
+ `,(0,c.jsxs)(t.p,{children:[`Для неизвестного ID update возвращает `,(0,c.jsx)(t.code,{children:`undefined`}),`. Функция принимает только lifecycle-поля `,(0,c.jsx)(t.code,{children:`status`}),`, `,(0,c.jsx)(t.code,{children:`sentUtc`}),`, `,(0,c.jsx)(t.code,{children:`failedReason`}),`; identity и payload изменить через неё нельзя. Runtime parser повторно проверяет draft, а свободный текст причины ограничивается и очищается перед storage write. Семантику разрешённых переходов статусов задаст delivery coordinator.`]}),`
308
388
  `,(0,c.jsx)(t.h2,{id:`environment-api`,children:`Environment API`}),`
309
389
  `,(0,c.jsx)(t.h3,{id:`geterrorreportenvironment`,children:(0,c.jsx)(t.code,{children:`getErrorReportEnvironment()`})}),`
310
390
  `,(0,c.jsxs)(t.p,{children:[`Возвращает mode из `,(0,c.jsx)(t.code,{children:`__DEV__`}),` и build ID.`]}),`
@@ -331,7 +411,7 @@ try {
331
411
  `})}),`
332
412
  `,(0,c.jsxs)(t.p,{children:[`Для отключения передайте `,(0,c.jsx)(t.code,{children:`undefined`}),`. Регистрация очищает недавние transport keys.`]}),`
333
413
  `,(0,c.jsx)(t.h3,{id:`reporttransporterrorerror-context`,children:(0,c.jsx)(t.code,{children:`reportTransportError(error, context)`})}),`
334
- `,(0,c.jsxs)(t.p,{children:[`Context имеет source `,(0,c.jsx)(t.code,{children:`fetch.parseResponse`}),` или `,(0,c.jsx)(t.code,{children:`fetch.buildHttpError`}),` и может содержать URL, method, SAP client, status/content type, redirect/response type и безопасное summary HTML-response.`]}),`
414
+ `,(0,c.jsxs)(t.p,{children:[`Context имеет source `,(0,c.jsx)(t.code,{children:`fetch.parseResponse`}),` или `,(0,c.jsx)(t.code,{children:`fetch.buildHttpError`}),` и может содержать URL, method, SAP client, status/content type, redirect/response type и только техническое summary HTML-response. HTML title и text preview больше не входят в контракт, потому что являются содержимым response body.`]}),`
335
415
  `,(0,c.jsxs)(t.p,{children:[`Вызов планирует reporter через 250 мс. Задержка позволяет TanStack Query перехватить тот же `,(0,c.jsx)(t.code,{children:`Error`}),` и создать более полезный query/mutation report.`]}),`
336
416
  `,(0,c.jsx)(t.h3,{id:`подавление-дубля`,children:`Подавление дубля`}),`
337
417
  `,(0,c.jsx)(t.pre,{children:(0,c.jsx)(t.code,{className:`language-ts`,children:`isTransportErrorReportScheduled(error);
@@ -381,11 +461,10 @@ suppressTransportErrorReport(error);
381
461
  `,(0,c.jsx)(t.li,{children:`queryKey и mutationKey;`}),`
382
462
  `,(0,c.jsx)(t.li,{children:`query/mutation meta;`}),`
383
463
  `,(0,c.jsxs)(t.li,{children:[(0,c.jsx)(t.code,{children:`context.detail`}),`;`]}),`
384
- `,(0,c.jsx)(t.li,{children:`URL и pathname;`}),`
464
+ `,(0,c.jsx)(t.li,{children:`pathname без search/hash;`}),`
385
465
  `,(0,c.jsx)(t.li,{children:`error message/stack;`}),`
386
- `,(0,c.jsx)(t.li,{children:`UI text, ARIA/title/data attributes breadcrumbs;`}),`
466
+ `,(0,c.jsx)(t.li,{children:`app-provided context, если policy ошибочно разрешила предметные данные;`}),`
387
467
  `,(0,c.jsx)(t.li,{children:`user agent, language, timezone;`}),`
388
- `,(0,c.jsx)(t.li,{children:`имена persisted storage keys.`}),`
389
468
  `]}),`
390
469
  `,(0,c.jsx)(t.p,{children:`Поэтому:`}),`
391
470
  `,(0,c.jsxs)(t.ol,{children:[`
@@ -399,9 +478,9 @@ suppressTransportErrorReport(error);
399
478
  `]}),`
400
479
  `,(0,c.jsx)(t.h2,{id:`частые-ошибки`,children:`Частые ошибки`}),`
401
480
  `,(0,c.jsx)(t.h3,{id:`ожидать-автоматическую-отправку`,children:`Ожидать автоматическую отправку`}),`
402
- `,(0,c.jsx)(t.p,{children:`Capture только создаёт draft. Delivery нужно явно подключить.`}),`
403
- `,(0,c.jsxs)(t.h3,{id:`использовать-creatediagnosticvalue-как-redactor`,children:[`Использовать `,(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),` как redactor`]}),`
404
- `,(0,c.jsx)(t.p,{children:`Он ограничивает размер, но сохраняет значения независимо от имени поля.`}),`
481
+ `,(0,c.jsx)(t.p,{children:`Capture только создаёт draft. Приложение должно enqueue-ить его payload и один раз запустить API coordinator в client lifecycle.`}),`
482
+ `,(0,c.jsx)(t.h3,{id:`считать-built-in-redaction-полной-privacy-policy`,children:`Считать built-in redaction полной privacy policy`}),`
483
+ `,(0,c.jsx)(t.p,{children:`Foundation удаляет известные secret-like keys и email, но не умеет надёжно распознавать ФИО, телефоны и предметные IDs. Настройте app sanitizer по allow-list.`}),`
405
484
  `,(0,c.jsx)(t.h3,{id:`вызывать-production-capture-в-development-и-ждать-draft`,children:`Вызывать production capture в development и ждать draft`}),`
406
485
  `,(0,c.jsxs)(t.p,{children:[`По контракту вернётся `,(0,c.jsx)(t.code,{children:`undefined`}),`.`]}),`
407
486
  `,(0,c.jsx)(t.h3,{id:`не-очищать-глобальные-reporters`,children:`Не очищать глобальные reporters`}),`
@@ -413,4 +492,4 @@ suppressTransportErrorReport(error);
413
492
  `,(0,c.jsx)(t.h3,{id:`создать-цикл-отчётов`,children:`Создать цикл отчётов`}),`
414
493
  `,(0,c.jsx)(t.p,{children:`Ошибка endpoint доставки не должна снова проходить через тот же автоматический transport reporter. Пометьте/исключите delivery transport или используйте отдельный канал.`}),`
415
494
  `,(0,c.jsx)(t.h2,{id:`краткая-карта-api`,children:`Краткая карта API`}),`
416
- `,(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:`Capture`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`captureQueryErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureMutationErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Errors`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorInfo`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Safe values`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),`, `,(0,c.jsx)(t.code,{children:`createDataShape`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeDetail`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Breadcrumbs`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`addErrorReportBreadcrumb`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`clearErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`installErrorReportBrowserBreadcrumbs`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Diagnostics`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`collectQueryDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectMutationDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Drafts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportDrafts`}),`, `,(0,c.jsx)(t.code,{children:`updateErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Environment`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isErrorReportingEnabled`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportEnvironment`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportClientEnvironment`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Runtime facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportRuntimeErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportRuntimeError`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Transport facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportTransportErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportTransportError`}),`, `,(0,c.jsx)(t.code,{children:`isTransportErrorReportScheduled`}),`, `,(0,c.jsx)(t.code,{children:`suppressTransportErrorReport`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Contracts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),`, contexts, diagnostics и transport types`]})]})]})]})]})}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};
495
+ `,(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:`Capture`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`captureQueryErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureMutationErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureRuntimeErrorReport`}),`, `,(0,c.jsx)(t.code,{children:`captureErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Errors`}),(0,c.jsx)(t.td,{children:(0,c.jsx)(t.code,{children:`createErrorInfo`})})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Safe values`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createDiagnosticValue`}),`, `,(0,c.jsx)(t.code,{children:`createDataShape`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeDetail`}),`, `,(0,c.jsx)(t.code,{children:`sanitizeErrorReportValue`}),`, `,(0,c.jsx)(t.code,{children:`setErrorReportSanitizer`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Payload contract`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_VERSION`}),`, `,(0,c.jsx)(t.code,{children:`ERROR_REPORT_PAYLOAD_MAX_BYTES`}),`, `,(0,c.jsx)(t.code,{children:`limitErrorReportPayload`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportPayloadSize`}),`, parsers`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Durable queue`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`createErrorReportQueue`}),`, queue limits, record/parser и atomic lease transitions`]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Breadcrumbs`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`addErrorReportBreadcrumb`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`clearErrorReportBreadcrumbs`}),`, `,(0,c.jsx)(t.code,{children:`installErrorReportBrowserBreadcrumbs`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Diagnostics`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`collectQueryDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectMutationDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectQueryClientDiagnostics`}),`, `,(0,c.jsx)(t.code,{children:`collectPersistedQueryDiagnostics`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Drafts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`getErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportDrafts`}),`, `,(0,c.jsx)(t.code,{children:`updateErrorReportDraft`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Environment`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`isErrorReportingEnabled`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportEnvironment`}),`, `,(0,c.jsx)(t.code,{children:`getErrorReportClientEnvironment`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Runtime facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportRuntimeErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportRuntimeError`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Transport facade`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`setErrorReportTransportErrorReporter`}),`, `,(0,c.jsx)(t.code,{children:`reportTransportError`}),`, `,(0,c.jsx)(t.code,{children:`isTransportErrorReportScheduled`}),`, `,(0,c.jsx)(t.code,{children:`suppressTransportErrorReport`})]})]}),(0,c.jsxs)(t.tr,{children:[(0,c.jsx)(t.td,{children:`Contracts`}),(0,c.jsxs)(t.td,{children:[(0,c.jsx)(t.code,{children:`ErrorReportDraft`}),`, `,(0,c.jsx)(t.code,{children:`ErrorReportPayload`}),`, contexts, diagnostics и transport types`]})]})]})]})]})}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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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/OData/OData V2 and SAP Gateway`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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/OData/OData V2 and SAP Gateway`}),`
2
2
  `,(0,c.jsx)(t.h1,{id:`odata-v2-и-sap-gateway`,children:`OData V2 и SAP Gateway`}),`
3
3
  `,(0,c.jsxs)(t.p,{children:[`Entrypoint `,(0,c.jsx)(t.code,{children:`@ryuzaki13/react-foundation-api/odata`}),` — основной API-модуль для browser-приложений, работающих с SAP Gateway и OData V2.`]}),`
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-8t-iSZRw.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-BJgKfTeb.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`}),`
1
+ import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Cb11iJVP.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{l as i,m as a}from"./blocks-o5-z1BZu.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:[`