@ryuzaki13/react-foundation-ui 1.2.13 → 1.2.15

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 (200) hide show
  1. package/dist/chunks/{TextEditorLexicalClient-D4hmfP5B.js → TextEditorLexicalClient-CVTrglWP.js} +2 -2
  2. package/dist/chunks/{TextEditorLexicalClient-D4hmfP5B.js.map → TextEditorLexicalClient-CVTrglWP.js.map} +1 -1
  3. package/dist/chunks/{date-input-BcVfIUJT.js → date-input-DBJisPRz.js} +2 -2
  4. package/dist/chunks/{date-input-BcVfIUJT.js.map → date-input-DBJisPRz.js.map} +1 -1
  5. package/dist/chunks/{radio-group-CEY_kdz8.js → radio-group-CM9Lg_nc.js} +3 -3
  6. package/dist/chunks/radio-group-CM9Lg_nc.js.map +1 -0
  7. package/dist/date-input/index.js +1 -1
  8. package/dist/preset-range-date-input/index.js +1 -1
  9. package/dist/radio-group/index.js +1 -1
  10. package/dist/styles.css +1 -1
  11. package/dist/text-editor/index.js +1 -1
  12. package/package.json +3 -3
  13. package/storybook-static/assets/{Badge--DWHr76D.js → Badge-DPudGUPM.js} +1 -1
  14. package/storybook-static/assets/{Badge.stories-B4cYG9l9.js → Badge.stories-CySszSFq.js} +1 -1
  15. package/storybook-static/assets/{Button-jmEmtzCG.js → Button-BCgOhtLd.js} +1 -1
  16. package/storybook-static/assets/{Button-Cx8ZZnYK.js → Button-Cioc8XN8.js} +1 -1
  17. package/storybook-static/assets/{Button.stories-SiBMniHM.js → Button.stories-Ca-X2wZk.js} +1 -1
  18. package/storybook-static/assets/{CheckBox-BHzxm5ud.js → CheckBox-C_1_y_qK.js} +1 -1
  19. package/storybook-static/assets/{CheckBox-CgMbsXwW.js → CheckBox-DKky4Sm8.js} +1 -1
  20. package/storybook-static/assets/{CheckBox.stories-CZ1wcKEl.js → CheckBox.stories-Bo3GYhXf.js} +1 -1
  21. package/storybook-static/assets/{Color-KMSTOMOX-DO0YdKFU.js → Color-KMSTOMOX-Byzq56AJ.js} +1 -1
  22. package/storybook-static/assets/{ContextMenu-DkGOpD2L.js → ContextMenu-CQkCWOmg.js} +1 -1
  23. package/storybook-static/assets/{ContextMenu.stories-ubSyKcEY.js → ContextMenu.stories-D5Pe5K7O.js} +1 -1
  24. package/storybook-static/assets/{DateInput-CaPaYBwV.js → DateInput-DBGCdSH5.js} +1 -1
  25. package/storybook-static/assets/{DateInput-CoMvPBgw.js → DateInput-Gjeob0uP.js} +1 -1
  26. package/storybook-static/assets/{DateInput.stories-BrmRRP3u.js → DateInput.stories-CUknz_9Y.js} +1 -1
  27. package/storybook-static/assets/{DateRangePresetSelect-Cqo8FN4l.js → DateRangePresetSelect-C9EXy002.js} +1 -1
  28. package/storybook-static/assets/{DateRangePresetSelect-DNbWJch4.js → DateRangePresetSelect-D7HFhBq0.js} +1 -1
  29. package/storybook-static/assets/{DateRangePresetSelect.stories-fSd0WyN7.js → DateRangePresetSelect.stories-BT1dvYZ6.js} +1 -1
  30. package/storybook-static/assets/{Detail-CUN5whdJ.js → Detail-Ch9XzeCR.js} +1 -1
  31. package/storybook-static/assets/{Detail.stories-X4YzNqXX.js → Detail.stories-DADltM7f.js} +1 -1
  32. package/storybook-static/assets/{Dialog-1KYB9IIO.js → Dialog-garYl1LG.js} +1 -1
  33. package/storybook-static/assets/{Dialog.stories-Bm-mh3pV.js → Dialog.stories-DrhVmPDV.js} +1 -1
  34. package/storybook-static/assets/{Disclosure-Cl7Usm1K.js → Disclosure-CZkieq8d.js} +1 -1
  35. package/storybook-static/assets/{Disclosure.stories-Dv0ZFbAG.js → Disclosure.stories-C5Zwfyws.js} +1 -1
  36. package/storybook-static/assets/{DocsRenderer-JROSPFPF-DpEJB6Iu.js → DocsRenderer-JROSPFPF-CQrgMypq.js} +2 -2
  37. package/storybook-static/assets/{DropZone-Dr4Z-pE1.js → DropZone-D2adV-iu.js} +1 -1
  38. package/storybook-static/assets/{DropZone.stories-BZvwPSUW.js → DropZone.stories-BoapusnJ.js} +1 -1
  39. package/storybook-static/assets/{DropdownMenu-DBpOoYuB.js → DropdownMenu-LFAjhade.js} +1 -1
  40. package/storybook-static/assets/{ExpandableActionPanel.stories-HS05XvKj.js → ExpandableActionPanel.stories-CJNWaY9S.js} +1 -1
  41. package/storybook-static/assets/{Flex-BLPSitUR.js → Flex-Cse0VN8u.js} +1 -1
  42. package/storybook-static/assets/{Flex-BLkaMY8A.js → Flex-DYOC7sAL.js} +1 -1
  43. package/storybook-static/assets/{Flex.stories-DHkOsjKa.js → Flex.stories-BiwoSTPH.js} +1 -1
  44. package/storybook-static/assets/{Grid-9nPVBakE.js → Grid-BNqNouvQ.js} +1 -1
  45. package/storybook-static/assets/{Grid-WyYCZl75.js → Grid-DyOMixwp.js} +1 -1
  46. package/storybook-static/assets/{Grid.stories-D1Aq5mKr.js → Grid.stories-CaN_BXma.js} +1 -1
  47. package/storybook-static/assets/{ImageCropper.stories-Bwl9JdxT.js → ImageCropper.stories-DVYZBRFp.js} +1 -1
  48. package/storybook-static/assets/{ImageRenderer-Bkf4dO-v.js → ImageRenderer-DDQvFB-L.js} +1 -1
  49. package/storybook-static/assets/{ImageRenderer.stories-BvhAt_-E.js → ImageRenderer.stories-DCaueisy.js} +1 -1
  50. package/storybook-static/assets/{ImageView.stories-DdWSfdOI.js → ImageView.stories-CUwMmYMX.js} +1 -1
  51. package/storybook-static/assets/{ImageViewer.stories-C8J6Buc-.js → ImageViewer.stories-K8ssHQwr.js} +2 -2
  52. package/storybook-static/assets/{ImageViewerRuntime-BMG0f_9d.js → ImageViewerRuntime-C-86ifkD.js} +1 -1
  53. package/storybook-static/assets/{Input-DQV1VhD-.js → Input-B0WWnS8-.js} +1 -1
  54. package/storybook-static/assets/{Input-DbaCFiCC.js → Input-DLp1Xuxw.js} +1 -1
  55. package/storybook-static/assets/{Input.stories-BtYgjKBn.js → Input.stories-_T7lqWLB.js} +1 -1
  56. package/storybook-static/assets/{InputDateTime-CY3ajtZ5.js → InputDateTime-B56pUSY7.js} +1 -1
  57. package/storybook-static/assets/{InputDateTime.stories-DnkeVay0.js → InputDateTime.stories-CmoN5agb.js} +1 -1
  58. package/storybook-static/assets/{InputFile-Dws7a0vW.js → InputFile-CjQC4Uiz.js} +1 -1
  59. package/storybook-static/assets/{InputFile.stories-BX2ZuwvI.js → InputFile.stories-CiZaLKkz.js} +1 -1
  60. package/storybook-static/assets/{InputFiles-CfDCHQCt.js → InputFiles-B_JpXc7C.js} +1 -1
  61. package/storybook-static/assets/{InputFiles-DZ8nXKan.js → InputFiles-CCBWXGHR.js} +1 -1
  62. package/storybook-static/assets/{InputFiles.stories-BrjhEuBb.js → InputFiles.stories-3f1nEfnt.js} +1 -1
  63. package/storybook-static/assets/{InputImage-BQrV_wZ5.js → InputImage-CAL9aF33.js} +1 -1
  64. package/storybook-static/assets/{InputImage.stories-DvPfY0EM.js → InputImage.stories-qAgfOzAM.js} +1 -1
  65. package/storybook-static/assets/{LayoutPicker-BmZiWK2i.js → LayoutPicker-Be6oYJGS.js} +1 -1
  66. package/storybook-static/assets/{LayoutPicker.stories-BR48XqPQ.js → LayoutPicker.stories--kaHXujk.js} +1 -1
  67. package/storybook-static/assets/{Listbox-DFx4qsG9.js → Listbox-BkMRJ6oY.js} +1 -1
  68. package/storybook-static/assets/{Listbox.stories-mYx37peV.js → Listbox.stories-CWugqDby.js} +1 -1
  69. package/storybook-static/assets/{Modal-B7_ZT1rl.js → Modal-VTHP1-uJ.js} +1 -1
  70. package/storybook-static/assets/{Modal.stories-eFt2-JCE.js → Modal.stories-B3Fl_4cE.js} +1 -1
  71. package/storybook-static/assets/{MultiSelect-Cc_sEash.js → MultiSelect-CksiHS1Y.js} +1 -1
  72. package/storybook-static/assets/{MultiSelect-6VhijuY2.js → MultiSelect-DceNb4aL.js} +1 -1
  73. package/storybook-static/assets/{MultiSelect.stories-DaxMx_BY.js → MultiSelect.stories-CBs3n6gv.js} +1 -1
  74. package/storybook-static/assets/{NotificationsHost-BjXsC4gT.js → NotificationsHost-CWEMg8I6.js} +1 -1
  75. package/storybook-static/assets/{NotificationsHost.stories-DEptWGP2.js → NotificationsHost.stories-BVstyHIE.js} +1 -1
  76. package/storybook-static/assets/{ODataMultiSelect-CLOq8OX8.js → ODataMultiSelect-BlzjynBY.js} +1 -1
  77. package/storybook-static/assets/{ODataMultiSelect-BMPMk3d7.js → ODataMultiSelect-CiHvaVGJ.js} +1 -1
  78. package/storybook-static/assets/{ODataMultiSelect.stories-BFPGEQ_E.js → ODataMultiSelect.stories-BT7GaQLE.js} +1 -1
  79. package/storybook-static/assets/{ODataSelect-CCLfT40q.js → ODataSelect-BLoDn2Ub.js} +1 -1
  80. package/storybook-static/assets/{ODataSelect-Civ1XLjx.js → ODataSelect-Cr4pQYI1.js} +1 -1
  81. package/storybook-static/assets/{ODataSelect.stories-D4RUITpS.js → ODataSelect.stories-Dbl26XTe.js} +1 -1
  82. package/storybook-static/assets/{ODataTreeMultiSelect-C2doZqfr.js → ODataTreeMultiSelect-Cby4c-Gk.js} +1 -1
  83. package/storybook-static/assets/{ODataTreeMultiSelect.stories-C4xMNCvZ.js → ODataTreeMultiSelect.stories-CfgGInk1.js} +1 -1
  84. package/storybook-static/assets/{ODataTreeSelect-BQmfQn0r.js → ODataTreeSelect-CG8bNnL0.js} +1 -1
  85. package/storybook-static/assets/{ODataTreeSelect.stories-BRY9vCtH.js → ODataTreeSelect.stories-CpFCv3b9.js} +1 -1
  86. package/storybook-static/assets/{PeriodSelect-BJ53Ykfv.js → PeriodSelect-LNejclnW.js} +1 -1
  87. package/storybook-static/assets/{PeriodSelect.stories--Hl4uIWl.js → PeriodSelect.stories-7MgS4zdv.js} +2 -2
  88. package/storybook-static/assets/{Popover-B4nkvxoX.js → Popover-zQXQnFFL.js} +1 -1
  89. package/storybook-static/assets/{Popover.stories-C43SSnlF.js → Popover.stories-W7lIz2B6.js} +1 -1
  90. package/storybook-static/assets/{PresetRangeDateInput-3iN63kX-.js → PresetRangeDateInput-DK2_y4cN.js} +1 -1
  91. package/storybook-static/assets/{PresetRangeDateInput.stories-CwBVhPU5.js → PresetRangeDateInput.stories-BViLBb14.js} +1 -1
  92. package/storybook-static/assets/{RadioButton-DZ8Nl-n6.js → RadioButton-Yt0oZf4E.js} +1 -1
  93. package/storybook-static/assets/{RadioButton.stories-C41d4mz9.js → RadioButton.stories-D8P25EBk.js} +1 -1
  94. package/storybook-static/assets/{RadioGroup-DlSrHkDR.js → RadioGroup-CKf9WzZb.js} +1 -1
  95. package/storybook-static/assets/RadioGroup-DSogQ0Gh.css +1 -0
  96. package/storybook-static/assets/RadioGroup-YP2iYAd2.js +1 -0
  97. package/storybook-static/assets/{RadioGroup.stories--96Mw_u5.js → RadioGroup.stories-teL45YTN.js} +1 -1
  98. package/storybook-static/assets/{Select-D3lBHJR0.js → Select-CPhI2DEf.js} +1 -1
  99. package/storybook-static/assets/{Select-BLiUsVjX.js → Select-m_NZjQxo.js} +1 -1
  100. package/storybook-static/assets/{Select.stories-CZX39tWX.js → Select.stories-DW2ASeOv.js} +1 -1
  101. package/storybook-static/assets/{SelectOptionContent-g6ApRTfm.js → SelectOptionContent-Cz6dUsCB.js} +1 -1
  102. package/storybook-static/assets/{SerializableSelect-lGqY5rI5.js → SerializableSelect-BcQRwjYS.js} +1 -1
  103. package/storybook-static/assets/{SerializableSelect-DYHTxerP.js → SerializableSelect-Nbt0c5ng.js} +1 -1
  104. package/storybook-static/assets/{SerializableSelect.stories-BtU5K_Lb.js → SerializableSelect.stories-5b1p6hng.js} +1 -1
  105. package/storybook-static/assets/{SingleDateTimeInput-DDkU8stn.js → SingleDateTimeInput-D6ZC9JpP.js} +1 -1
  106. package/storybook-static/assets/{SingleDateTimeInput.stories-B6uM5uBj.js → SingleDateTimeInput.stories-BgzkQbkx.js} +1 -1
  107. package/storybook-static/assets/{Slider-aV7w62Rn.js → Slider-C9Z6txLW.js} +1 -1
  108. package/storybook-static/assets/{Slider.stories-jIBFIiup.js → Slider.stories-Bdo3_1nw.js} +1 -1
  109. package/storybook-static/assets/{SliderInput-D0yRSdH6.js → SliderInput-DmbajIqV.js} +1 -1
  110. package/storybook-static/assets/{SliderInput.stories-5L9nhmYE.js → SliderInput.stories-rYLzdKpu.js} +1 -1
  111. package/storybook-static/assets/{Sortable-Bj-ITRmD.js → Sortable-CCch31vS.js} +1 -1
  112. package/storybook-static/assets/{Sortable.stories-BccPy88q.js → Sortable.stories-Cu3zI5h9.js} +1 -1
  113. package/storybook-static/assets/{Splitter-0MFVK6eX.js → Splitter-BR8joAqy.js} +1 -1
  114. package/storybook-static/assets/{Splitter.stories-Cnmcpah6.js → Splitter.stories-Bb99GQy0.js} +1 -1
  115. package/storybook-static/assets/{StateSelect-EXJTsIib.js → StateSelect-C5teWzIJ.js} +1 -1
  116. package/storybook-static/assets/{StateSelect.stories-DpeIOomk.js → StateSelect.stories-C2IUonaW.js} +1 -1
  117. package/storybook-static/assets/{Switch-Bouzf5T9.js → Switch-Cs48CpN6.js} +1 -1
  118. package/storybook-static/assets/{Switch.stories-DufwfHRc.js → Switch.stories-Dmv2GoIE.js} +1 -1
  119. package/storybook-static/assets/{Table-nRBkJNjN.js → Table-D55A8YRw.js} +1 -1
  120. package/storybook-static/assets/{Table.stories-T4Bh15-x.js → Table.stories-BpXSCglO.js} +1 -1
  121. package/storybook-static/assets/{Tabs-BbF0G8pl.js → Tabs-D3e7tAEn.js} +1 -1
  122. package/storybook-static/assets/{Tabs.stories-BPTit-WQ.js → Tabs.stories-C4EvmBpl.js} +1 -1
  123. package/storybook-static/assets/{TagInput.stories-DUx50IDO.js → TagInput.stories-BMj7neM4.js} +1 -1
  124. package/storybook-static/assets/{Textarea-DdP0_9Ku.js → Textarea-BVs8Ri47.js} +1 -1
  125. package/storybook-static/assets/{Textarea.stories-BIIl1zXa.js → Textarea.stories-EwmwDVzx.js} +1 -1
  126. package/storybook-static/assets/{TimePanel-P5OLY82H.js → TimePanel-CctgF-Ba.js} +1 -1
  127. package/storybook-static/assets/{TimePanel.stories-DYIjVXe-.js → TimePanel.stories-1Dtp0mYJ.js} +1 -1
  128. package/storybook-static/assets/{Toggle-BQ9vj1yQ.js → Toggle-rD-lp1O7.js} +1 -1
  129. package/storybook-static/assets/{Toggle.stories-DEirDiOG.js → Toggle.stories-C10m-ZA8.js} +1 -1
  130. package/storybook-static/assets/{TreeMultiSelect-BjQyOyQM.js → TreeMultiSelect-C27k2fak.js} +1 -1
  131. package/storybook-static/assets/{TreeMultiSelect-DbR73SDr.js → TreeMultiSelect-CgHeDrIO.js} +1 -1
  132. package/storybook-static/assets/{TreeMultiSelect.stories-CI8OYQ28.js → TreeMultiSelect.stories-ciaCVIUg.js} +1 -1
  133. package/storybook-static/assets/{TreePickerBase-BaaAg1C0.js → TreePickerBase-DqF5FvNY.js} +1 -1
  134. package/storybook-static/assets/{TreeSelect-Zx9nX92Z.js → TreeSelect-Bv_3N7qS.js} +1 -1
  135. package/storybook-static/assets/{TreeSelect-XN67-Ugz.js → TreeSelect-D-FubCvR.js} +1 -1
  136. package/storybook-static/assets/{TreeSelect.stories-4R0G5LPS.js → TreeSelect.stories-Cnyjx3Cr.js} +1 -1
  137. package/storybook-static/assets/{TreeTable-Z6jR0E4u.js → TreeTable-Dakv6rya.js} +1 -1
  138. package/storybook-static/assets/{TreeTable.stories-D_A4GmP1.js → TreeTable.stories-DqdpfiaO.js} +1 -1
  139. package/storybook-static/assets/{WithTooltip-7X4HQR7L-CxbHW8vk.js → WithTooltip-7X4HQR7L-Cpew3aNg.js} +1 -1
  140. package/storybook-static/assets/async-CBST-rZJ.js +625 -0
  141. package/storybook-static/assets/{base-table-BAybCumM.js → base-table-DiV3aUkm.js} +1 -1
  142. package/storybook-static/assets/{blocks-6H7dheWg.js → blocks-DxtpVRwM.js} +6 -6
  143. package/storybook-static/assets/{button-BW8g57jt.js → button-BPrqDvuC.js} +1 -1
  144. package/storybook-static/assets/{check-box-dDflWCAW.js → check-box-DwrLBs8K.js} +1 -1
  145. package/storybook-static/assets/{chunk-3LY4VQVK-CvprVBEE.js → chunk-3LY4VQVK-CLQHTufZ.js} +1 -1
  146. package/storybook-static/assets/{chunk-LITCR56V-ColyGaTs.js → chunk-LITCR56V-DMdBikCE.js} +1 -1
  147. package/storybook-static/assets/{contextMenu-BM_w29N2.js → contextMenu-_I6pGXYT.js} +1 -1
  148. package/storybook-static/assets/date-CQ9wheTT.js +461 -0
  149. package/storybook-static/assets/{error-Dd72Ltdx.js → error-CNPNEAVP.js} +1 -1
  150. package/storybook-static/assets/file-DjJWNuBz.js +291 -0
  151. package/storybook-static/assets/{flex-BQUmlc5s.js → flex-CQVMFWMW.js} +1 -1
  152. package/storybook-static/assets/{floating-ui.react-Cgv_gdpO.js → floating-ui.react-C3rg5XLp.js} +1 -1
  153. package/storybook-static/assets/formatter-L2YTDE3Q-BQMDlvN_.js +1 -0
  154. package/storybook-static/assets/formatters-BsP6CA0a.js +3 -0
  155. package/storybook-static/assets/formulas-DK4vpKA_.js +2 -0
  156. package/storybook-static/assets/grid-nZIniTeh.js +1 -0
  157. package/storybook-static/assets/{hooks-CksDwali.js → hooks-CVLEDvfo.js} +1 -1
  158. package/storybook-static/assets/{iframe-8yiaZsxV.js → iframe-BTDZjw05.js} +4 -4
  159. package/storybook-static/assets/{input-BDfX2ZJN.js → input-DD29rPF2.js} +1 -1
  160. package/storybook-static/assets/{mdx-react-shim-CR1Sqe7O.js → mdx-react-shim-CMkpiwEc.js} +1 -1
  161. package/storybook-static/assets/{media-Hxn--irs.js → media-DNbfoulg.js} +1 -1
  162. package/storybook-static/assets/{misc-C4JomW3A.js → misc-C0wxz-AU.js} +1 -1
  163. package/storybook-static/assets/{notifications-DHYp1_8F.js → notifications-B3BSUy0j.js} +1 -1
  164. package/storybook-static/assets/number-RnQqsbNa.js +2 -0
  165. package/storybook-static/assets/{odata-Beh7LPwF.js → odata-DtsLX2ND.js} +1 -1
  166. package/storybook-static/assets/odata-service-B63qvxEy.js +1 -0
  167. package/storybook-static/assets/odataFetchFn-DKHdlA48.js +763 -0
  168. package/storybook-static/assets/{odataStoryFixtures-C_NsAWws.js → odataStoryFixtures-DRl-0jvY.js} +1 -1
  169. package/storybook-static/assets/persisted-DBno8ICw.js +600 -0
  170. package/storybook-static/assets/{picker-BF69i-Xf.js → picker-BekQHdO_.js} +1 -1
  171. package/storybook-static/assets/{popover-BDRQLBEp.js → popover-nKXcgOys.js} +1 -1
  172. package/storybook-static/assets/{preset-select-C-Xm2xmD.js → preset-select-CPLTHazi.js} +1 -1
  173. package/storybook-static/assets/pwa-BP4Qxdcf.js +640 -0
  174. package/storybook-static/assets/queryClient-D8_xdGZ2.js +567 -0
  175. package/storybook-static/assets/{react-18-CqASmMhK.js → react-18-BY7O2bU-.js} +1 -1
  176. package/storybook-static/assets/{react-v2wz2Yxr.js → react-_DDQf-KJ.js} +1 -1
  177. package/storybook-static/assets/{react-dom-CXms0ASb.js → react-dom-BBNjM9Mb.js} +1 -1
  178. package/storybook-static/assets/select-BDiqR6E9.js +1 -0
  179. package/storybook-static/assets/{slider-DqH5Q0D9.js → slider-C94P2mzP.js} +1 -1
  180. package/storybook-static/assets/{sortable-CgPvrRfY.js → sortable-Bciuck7B.js} +1 -1
  181. package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-CrLT_Ki1.js → syntaxhighlighter-RTCFPKCB-D4jCnS_i.js} +1 -1
  182. package/storybook-static/assets/{text-DrpMrZBZ.js → text-DR70nwXc.js} +1 -1
  183. package/storybook-static/assets/{theming-DZ-M3lNH.js → theming-CzVm4PtY.js} +1 -1
  184. package/storybook-static/assets/ui-CbXWeydL.js +1 -0
  185. package/storybook-static/assets/{useODataSelectBase-C8eWb6CT.js → useODataSelectBase-D8bA7nx-.js} +1 -1
  186. package/storybook-static/assets/{useODataTreeData-CU1I_UJd.js → useODataTreeData-CtDrXYzn.js} +1 -1
  187. package/storybook-static/assets/{utils-CecGsBKu.js → utils-C8AvFbMG.js} +1 -1
  188. package/storybook-static/assets/valueState-n2Sm8Yt_.js +277 -0
  189. package/storybook-static/iframe.html +1 -1
  190. package/storybook-static/index.json +1 -1
  191. package/storybook-static/project.json +1 -1
  192. package/dist/chunks/radio-group-CEY_kdz8.js.map +0 -1
  193. package/storybook-static/assets/RadioGroup-BU1UODYa.js +0 -1
  194. package/storybook-static/assets/RadioGroup-hi7uePOA.css +0 -1
  195. package/storybook-static/assets/formatter-L2YTDE3Q-BkbAyQS_.js +0 -1
  196. package/storybook-static/assets/formatters-DR4SipYU.js +0 -3
  197. package/storybook-static/assets/grid-Clv9wted.js +0 -1
  198. package/storybook-static/assets/odata-service-DJJFflxw.js +0 -1
  199. package/storybook-static/assets/select-D0PdaVj6.js +0 -1
  200. package/storybook-static/assets/ui-CEAYwuc3.js +0 -1
@@ -0,0 +1,640 @@
1
+ import{i as e}from"./preload-helper-B45gAKPr.js";import{t}from"./iframe-BTDZjw05.js";import{E as n,c as r,l as i,m as a}from"./blocks-DxtpVRwM.js";import{t as o}from"./mdx-react-shim-CMkpiwEc.js";var s,c=e((()=>{s=`# PWA и Service Worker в проекте
2
+
3
+ ## Зачем нужен этот документ
4
+
5
+ Этот документ описывает всю PWA-цепочку в проекте:
6
+
7
+ - как собираются PWA-манифесты;
8
+ - как \`sw.js\` появляется в сборке;
9
+ - как ABAP отдает HTML, manifest и service worker;
10
+ - когда и где service worker регистрируется в браузере;
11
+ - какие данные и ассеты кэшируются;
12
+ - как устроено обновление service worker;
13
+ - что нужно сделать, чтобы включить новое подприложение в PWA;
14
+ - какие ограничения и риски есть в текущей реализации.
15
+
16
+ Документ описывает текущее фактическое поведение проекта, а не абстрактную "идеальную" схему.
17
+
18
+ ---
19
+
20
+ ## 1. Общая идея архитектуры
21
+
22
+ Проект представляет собой одно SPA-приложение, но внутри него есть несколько "псевдо-подприложений".
23
+
24
+ Основные маршруты:
25
+
26
+ - \`/arm/\` — главная страница;
27
+ - \`/arm/app/<appId>\` — SPA-режим подприложения;
28
+ - \`/arm/apps/<appId>/<viewId>\` — SPA-режим с отдельными представлениями;
29
+ - \`/arm/pwa/<appId>\` — специальный PWA-вход для подприложения.
30
+
31
+ Ключевая идея:
32
+
33
+ - service worker регистрируется для всего приложения внутри \`/arm\`;
34
+ - scope у него \`/arm/\`, поэтому он контролирует всё SPA внутри этого basepath;
35
+ - маршрут \`/arm/pwa/<appId>\` нужен не для самой регистрации worker, а как специальный PWA-entry с app-specific manifest.
36
+
37
+ ---
38
+
39
+ ## 2. Основные файлы
40
+
41
+ ### Сборка и генерация PWA
42
+
43
+ - [vite.config.ts](/vite.config.ts)
44
+ - [config/vite/plugins.ts](/config/vite/plugins.ts)
45
+ - [config/vite/plugins/buildPWA.ts](/config/vite/plugins/buildPWA.ts)
46
+ - [public/pwa-base.json](/public/pwa-base.json)
47
+ - \`src/apps/spa/*/pwa.json\`
48
+
49
+ ### Service Worker
50
+
51
+ - [src/app/sw.ts](/src/app/sw.ts)
52
+ - [src/shared/lib/pwa/serviceWorker.ts](/src/shared/lib/pwa/serviceWorker.ts)
53
+ - [src/shared/lib/pwa/useServiceWorkerUpdate.ts](/src/shared/lib/pwa/useServiceWorkerUpdate.ts)
54
+ - [src/widgets/service-worker-update-banner/ui/ServiceWorkerUpdateBanner.tsx](/src/widgets/service-worker-update-banner/ui/ServiceWorkerUpdateBanner.tsx)
55
+
56
+ ### Роуты и shell
57
+
58
+ - [src/app/routes/pwa/$appId.tsx](/src/app/routes/pwa/$appId.tsx)
59
+ - [src/app/ui/shell/RootLayout.tsx](/src/app/ui/shell/RootLayout.tsx)
60
+
61
+ ### Серверная выдача через ABAP
62
+
63
+ - [abap/ZCL_REACT_APP_HANDLER.abap](/abap/ZCL_REACT_APP_HANDLER.abap)
64
+
65
+ ### Интеграция OData-кэша
66
+
67
+ - [src/shared/api/odata/odataFetch.ts](/src/shared/api/odata/odataFetch.ts)
68
+ - [src/shared/api/odata/transport/fetch.ts](/src/shared/api/odata/transport/fetch.ts)
69
+ - [src/shared/api/odata/useODataCollectionQuery.ts](/src/shared/api/odata/useODataCollectionQuery.ts)
70
+
71
+ ---
72
+
73
+ ## 3. Как собирается PWA
74
+
75
+ ### 3.1. Базовый механизм
76
+
77
+ В проекте используется \`vite-plugin-pwa\` в режиме \`injectManifest\`.
78
+
79
+ Это значит:
80
+
81
+ - service worker пишется вручную в [src/app/sw.ts](/src/app/sw.ts);
82
+ - плагин не генерирует всю логику сам;
83
+ - он только внедряет в \`sw.ts\` список precache-ресурсов.
84
+
85
+ ### 3.2. Базовый и app-specific manifest
86
+
87
+ Есть базовый manifest:
88
+
89
+ - [public/pwa-base.json](/public/pwa-base.json)
90
+
91
+ Для каждого PWA-подприложения может существовать override:
92
+
93
+ - \`src/apps/spa/<appId>/pwa.json\`
94
+
95
+ Во время сборки плагин [buildPWA.ts](/config/vite/plugins/buildPWA.ts) делает следующее:
96
+
97
+ 1. читает \`public/pwa-base.json\`;
98
+ 2. ищет все \`src/apps/spa/*/pwa.json\`;
99
+ 3. для каждого найденного файла объединяет базовый manifest с app-specific override;
100
+ 4. принудительно задаёт:
101
+ - \`id = <appId>\`
102
+ - \`start_url = /arm/pwa/<appId>\`
103
+ 5. сохраняет итоговый файл в \`dist/pwa/manifest.<appId>.json\`.
104
+
105
+ Пример:
106
+
107
+ - \`src/apps/spa/mrmRecognitionWagons/pwa.json\`
108
+ - результат сборки: \`dist/pwa/manifest.mrmRecognitionWagons.json\`
109
+
110
+ ### 3.3. Что делает \`webmanifest.json\`
111
+
112
+ \`vite-plugin-pwa\` также создаёт обычный \`webmanifest.json\`, но в текущей архитектуре он не является главным manifest для PWA-входа.
113
+
114
+ Практически используется app-specific manifest, который ABAP вставляет в HTML для \`/arm/pwa/<appId>\`.
115
+
116
+ ---
117
+
118
+ ## 4. Как фильтруется precache
119
+
120
+ Фильтрация выполняется в [config/vite/plugins.ts](/config/vite/plugins.ts).
121
+
122
+ ### В precache не попадают
123
+
124
+ - \`webmanifest.json\`
125
+ - \`index.js\`
126
+ - \`style.css\`
127
+
128
+ Это важное поведение.
129
+
130
+ Почему \`index.js\` и \`style.css\` исключены:
131
+
132
+ - ABAP отдает их с cachebuster-параметром \`?t=...\`;
133
+ - если держать их в precache и одновременно игнорировать параметр \`t\`, старый service worker может раздавать старые entrypoint-файлы после деплоя;
134
+ - поэтому эти два файла обновляются через новый URL, а не через precache.
135
+
136
+ ### В precache попадают
137
+
138
+ - общие чанки \`assets/chunks/*\`;
139
+ - общие иконки и шрифты;
140
+ - app-specific manifest \`pwa/manifest.<appId>.json\`;
141
+ - только те \`assets/apps/*\`, которые соответствуют приложениям, у которых действительно есть \`pwa.json\`.
142
+
143
+ Это означает:
144
+
145
+ - если приложение не объявлено как PWA через \`pwa.json\`, его app chunk в precache не попадет;
146
+ - service worker не будет тянуть в precache все SPA-подприложения подряд.
147
+
148
+ ---
149
+
150
+ ## 5. Как ABAP отдает PWA-ресурсы
151
+
152
+ Важная часть схемы находится в [abap/ZCL_REACT_APP_HANDLER.abap](/abap/ZCL_REACT_APP_HANDLER.abap).
153
+
154
+ ### 5.1. Проксирование \`/sw.js\`
155
+
156
+ Когда клиент запрашивает \`/arm/sw.js\`, ABAP не отдает статический файл напрямую.
157
+
158
+ Он возвращает маленький proxy-script:
159
+
160
+ \`\`\`js
161
+ importScripts("/sap/bc/ui5_ui5/sap/TEXT_APP/sw.js?t=<cache_token>");
162
+ \`\`\`
163
+
164
+ Зачем это нужно:
165
+
166
+ - браузер регистрирует стабильный URL \`/arm/sw.js\`;
167
+ - внутри него подгружается реальный BSP-файл \`sw.js\` с cachebuster-параметром;
168
+ - при смене токена браузер видит обновление service worker.
169
+
170
+ Также для \`/sw.js\` ABAP ставит заголовки без кеширования:
171
+
172
+ - \`Cache-Control: no-cache, no-store, must-revalidate\`
173
+ - \`Pragma: no-cache\`
174
+ - \`Expires: 0\`
175
+
176
+ ### 5.2. Генерация HTML для \`/arm/pwa/<appId>\`
177
+
178
+ При запросе маршрута \`/arm/pwa/<appId>\` ABAP:
179
+
180
+ 1. извлекает \`appId\` из пути;
181
+ 2. генерирует HTML-обертку;
182
+ 3. вставляет в \`<head>\` ссылку:
183
+
184
+ \`\`\`html
185
+ <link rel="manifest" href="/sap/bc/ui5_ui5/sap/TEXT_APP/pwa/manifest.<appId>.json" />
186
+ \`\`\`
187
+
188
+ Также ABAP вставляет:
189
+
190
+ - \`index.js?t=<cache_token>\`
191
+ - \`style.css?t=<cache_token>\`
192
+
193
+ Именно поэтому при "настоящем" входе по URL \`/arm/pwa/<appId>\` браузер получает app-specific manifest.
194
+
195
+ ### 5.3. Что важно понимать про manifest
196
+
197
+ Сейчас app-specific manifest гарантированно подключается именно на серверной выдаче HTML для \`/arm/pwa/<appId>\`.
198
+
199
+ Это значит:
200
+
201
+ - если пользователь открывает \`/arm/pwa/<appId>\` напрямую в браузере, нужный manifest будет подключён;
202
+ - если пользователь попал в уже загруженное SPA и затем только клиентской навигацией перешёл на \`/pwa/<appId>\`, manifest не переключается автоматически через route head.
203
+
204
+ Это не баг service worker, а особенность текущей схемы внедрения manifest.
205
+
206
+ ---
207
+
208
+ ## 6. Как и когда регистрируется service worker
209
+
210
+ Клиентская регистрация находится в [src/shared/lib/pwa/serviceWorker.ts](/src/shared/lib/pwa/serviceWorker.ts).
211
+
212
+ ### 6.1. Когда регистрируется SW
213
+
214
+ Регистрация выполняется для всего приложения:
215
+
216
+ - shell вызывает \`registerServiceWorker()\` глобально;
217
+ - в production регистрируется \`/arm/sw.js\`;
218
+ - в development регистрируется \`/sw.js\`.
219
+
220
+ Иными словами, заходить в \`/arm/pwa/<appId>\` для самой регистрации service worker больше не требуется.
221
+
222
+ ### 6.2. Какой scope получает SW
223
+
224
+ Scope задаётся как:
225
+
226
+ - \`/\` в dev;
227
+ - \`/arm/\` в production.
228
+
229
+ Это очень важно:
230
+
231
+ - service worker регистрируется сразу на всё приложение;
232
+ - он контролирует весь \`/arm\`, а не только \`/arm/pwa/\`.
233
+
234
+ ### 6.3. Что изменилось в текущей логике обновления
235
+
236
+ Фоновая проверка обновлений живёт в общем shell.
237
+
238
+ Логика такая:
239
+
240
+ - shell регистрирует service worker для всего приложения;
241
+ - shell периодически вызывает \`reg.update()\`;
242
+ - если новый worker установлен и ждёт активации, баннер обновления показывается на любом маршруте;
243
+ - PWA-маршрут больше не является условием для update flow.
244
+
245
+ ---
246
+
247
+ ## 7. Как устроен UI обновления service worker
248
+
249
+ Хук:
250
+
251
+ - [src/shared/lib/pwa/useServiceWorkerUpdate.ts](/src/shared/lib/pwa/useServiceWorkerUpdate.ts)
252
+
253
+ Баннер:
254
+
255
+ - [src/widgets/service-worker-update-banner/ui/ServiceWorkerUpdateBanner.tsx](/src/widgets/service-worker-update-banner/ui/ServiceWorkerUpdateBanner.tsx)
256
+
257
+ Размещение:
258
+
259
+ - [src/app/ui/shell/RootLayout.tsx](/src/app/ui/shell/RootLayout.tsx)
260
+
261
+ ### Механика
262
+
263
+ 1. Приложение вызывает \`registerServiceWorker()\`.
264
+ 2. Затем периодически вызывает \`checkServiceWorkerUpdate()\`.
265
+ 3. Если новый worker установлен и находится в состоянии \`waiting\`, показывается баннер "Доступна новая версия приложения".
266
+ 4. По кнопке "Обновить" вызывается \`applyServiceWorkerUpdate()\`.
267
+ 5. Клиент посылает \`waiting.postMessage({ type: "SKIP_WAITING" })\`.
268
+ 6. Новый SW активируется.
269
+ 7. Новый SW отправляет всем window-клиентам сообщение \`SW_ACTIVATED_BY_CLIENT\`.
270
+ 8. Вкладка, где пользователь нажал "Обновить", перезагружается на \`controllerchange\`.
271
+ 9. Остальные вкладки перезагружаются по сообщению от активированного worker.
272
+
273
+ Если в другой вкладке worker уже успел активироваться, а текущая вкладка всё ещё показывает старый баннер, кнопка "Обновить" запускает обычную перезагрузку страницы. Это fallback для stale-состояния, когда \`registration.waiting\` уже пустой.
274
+
275
+ ### Почему обновление controlled, а не автоматическое
276
+
277
+ В [src/app/sw.ts](/src/app/sw.ts) \`skipWaiting()\` не вызывается сразу при установке.
278
+
279
+ Это сделано специально:
280
+
281
+ - новый worker не перехватывает приложение без подтверждения;
282
+ - пользователь сам решает момент обновления;
283
+ - это безопаснее для SPA, которое уже работает с открытым состоянием и активными запросами.
284
+
285
+ ---
286
+
287
+ ## 8. Что именно делает service worker
288
+
289
+ Исходная логика worker находится в [src/app/sw.ts](/src/app/sw.ts).
290
+
291
+ ### 8.1. Работа с BSP-путями
292
+
293
+ Все precache URL приводятся к BSP-базе:
294
+
295
+ - \`/sap/bc/ui5_ui5/sap/TEXT_APP/...\`
296
+
297
+ Это нужно, потому что реальные статические ресурсы лежат в BSP, а не по относительным Vite-путям.
298
+
299
+ ### 8.2. Precache
300
+
301
+ Через \`precacheAndRoute(...)\` worker кэширует список ресурсов сборки, который внедрил \`vite-plugin-pwa\`.
302
+
303
+ При этом для matching precache игнорируется параметр \`t\`.
304
+
305
+ Это допустимо для большинства precache-ресурсов, но именно поэтому \`index.js\` и \`style.css\` были исключены из precache.
306
+
307
+ ### 8.3. Навигация по \`/arm/pwa/\`
308
+
309
+ Для навигационных запросов на \`/arm/pwa/...\` используется \`NetworkFirst\`.
310
+
311
+ Идея:
312
+
313
+ - сначала пробуем сеть;
314
+ - если сеть недоступна, пробуем вернуть кэшированный HTML.
315
+
316
+ ### 8.4. Статические ассеты
317
+
318
+ Для скриптов, стилей и \`assets/*\` используется \`CacheFirst\`.
319
+
320
+ Идея:
321
+
322
+ - если файл уже есть в runtime-кэше, отдаем его оттуда;
323
+ - если нет, тянем из сети и сохраняем.
324
+
325
+ ### 8.5. Изображения
326
+
327
+ Для изображений используется \`StaleWhileRevalidate\` с ограничениями по объёму и времени жизни.
328
+
329
+ ### 8.6. SSO/Auth исключения
330
+
331
+ Есть явные обходы для путей типа:
332
+
333
+ - \`/sso.\`
334
+ - \`/auth/\`
335
+
336
+ Такие запросы не должны случайно кэшироваться worker’ом.
337
+
338
+ ---
339
+
340
+ ## 9. Как устроен OData-кэш в service worker
341
+
342
+ Это одна из самых важных частей текущей архитектуры.
343
+
344
+ ### Ключевая идея
345
+
346
+ OData-кэш не применяется "магически ко всем запросам".
347
+
348
+ Он включается только если клиент сам передал заголовок:
349
+
350
+ \`\`\`http
351
+ x-sw-cache: ttl=...
352
+ \`\`\`
353
+
354
+ Именно это делает схему безопасной и управляемой.
355
+
356
+ ### Где клиент выставляет политику
357
+
358
+ Заголовок добавляется в:
359
+
360
+ - [src/shared/api/odata/odataFetch.ts](/src/shared/api/odata/odataFetch.ts)
361
+ - [src/shared/api/odata/transport/fetch.ts](/src/shared/api/odata/transport/fetch.ts)
362
+
363
+ ### Поддерживаемые политики
364
+
365
+ - \`off\`
366
+ network-only
367
+ - \`ttl=<duration>\`
368
+ cache-first с TTL
369
+ - \`bust=<duration>\`
370
+ принудительное обновление кэша из сети
371
+
372
+ \`duration\` задаётся числом и единицей времени:
373
+
374
+ - \`ms\` — миллисекунды;
375
+ - \`s\` — секунды;
376
+ - \`m\` — минуты;
377
+ - \`h\` — часы;
378
+ - \`d\` — дни.
379
+
380
+ Примеры:
381
+
382
+ \`\`\`text
383
+ ttl=24h
384
+ ttl=10m
385
+ bust=6h
386
+ \`\`\`
387
+
388
+ ### Опциональные параметры политики
389
+
390
+ После основной части можно передать параметры через \`;\` или \`,\`.
391
+
392
+ - \`max\`, \`maxEntries\`, \`entries\`
393
+ максимальное количество записей в Cache Storage для этой политики;
394
+ - \`name\`, \`cache\`, \`cacheName\`
395
+ читаемый сегмент имени кеша.
396
+
397
+ Примеры:
398
+
399
+ \`\`\`text
400
+ ttl=24h;max=100;name=ref
401
+ ttl=10m;max=200;name=ui
402
+ bust=30s;entries=300;cache=fast
403
+ \`\`\`
404
+
405
+ Если \`max\` не указан, используется стандартный лимит \`100\` записей. Значение \`max\` ограничивается верхней границей \`5000\`, чтобы ошибочный ввод не раздувал Cache Storage бесконтрольно.
406
+
407
+ ### Как это работает внутри SW
408
+
409
+ 1. Worker ловит только запросы к \`/sap/opu/odata/sap/...\`.
410
+ 2. Читает \`x-sw-cache\`.
411
+ 3. Удаляет служебный заголовок перед уходом в сеть.
412
+ 4. Парсит политику из строки, без фиксированного списка профилей.
413
+ 5. Если задан \`ttl=...\`:
414
+ - сначала ищет запись в Cache Storage;
415
+ - если TTL не истек, возвращает кэш;
416
+ - если истек, удаляет запись и делает сетевой запрос.
417
+ 6. Если задан \`bust=...\`:
418
+ - всегда идёт в сеть;
419
+ - обновляет запись в Cache Storage.
420
+
421
+ ### Дополнительные механизмы
422
+
423
+ - \`in-flight dedupe\`
424
+ защищает от пачки одинаковых запросов при одновременном старте нескольких вкладок;
425
+ - \`x-sw-cached-at\`
426
+ внутренний заголовок с меткой времени, по которому проверяется TTL;
427
+ - ручная инвалидция через \`invalidateSwCacheProfile(profile)\`, где \`profile\` должен быть полной политикой вроде \`ttl=24h;name=ref\`.
428
+
429
+ ### Где это уже используется
430
+
431
+ Например, в [useODataCollectionQuery.ts](/src/shared/api/odata/useODataCollectionQuery.ts) по умолчанию стоит:
432
+
433
+ \`\`\`ts
434
+ swCache = "ttl=24h;name=ref";
435
+ \`\`\`
436
+
437
+ Это означает:
438
+
439
+ - справочники уже подготовлены к SW-кэшированию;
440
+ - TTL справочников по умолчанию равен 24 часам, а кеш получает имя \`ref\`;
441
+ - схема не только про shell и installability, но и про offline/cache-стратегию данных.
442
+
443
+ ---
444
+
445
+ ## 10. Как добавить новое PWA-подприложение
446
+
447
+ Чтобы новое приложение участвовало в PWA-схеме, нужно:
448
+
449
+ ### Шаг 1. Создать app-specific manifest override
450
+
451
+ Добавить файл:
452
+
453
+ \`src/apps/spa/<appId>/pwa.json\`
454
+
455
+ Минимально обычно достаточно:
456
+
457
+ \`\`\`json
458
+ {
459
+ "name": "Полное имя приложения",
460
+ "short_name": "Короткое имя",
461
+ "description": "Описание"
462
+ }
463
+ \`\`\`
464
+
465
+ ### Шаг 2. Собрать проект
466
+
467
+ Во время сборки:
468
+
469
+ - manifest будет объединён с \`public/pwa-base.json\`;
470
+ - получится \`dist/pwa/manifest.<appId>.json\`.
471
+
472
+ ### Шаг 3. Убедиться, что приложение открывается по \`/arm/pwa/<appId>\`
473
+
474
+ Именно этот маршрут используется как PWA entrypoint.
475
+
476
+ ### Шаг 4. Проверить precache
477
+
478
+ Если у приложения появился \`pwa.json\`, его \`assets/apps/spa-<appId>-...js\` должен начать попадать в precache service worker.
479
+
480
+ ### Шаг 5. При необходимости подключить OData-кэширование
481
+
482
+ Если приложению нужны offline/кешируемые справочники или короткоживущие данные:
483
+
484
+ - использовать \`swCache: "ttl=..."\` или \`swCache: "bust=..."\` в query/fetch-слое.
485
+
486
+ ---
487
+
488
+ ## 11. Как обновляется приложение после деплоя
489
+
490
+ Текущая схема обновления выглядит так:
491
+
492
+ 1. На проде выкатывается новая сборка.
493
+ 2. ABAP отдает:
494
+ - новый \`index.js?t=<new_token>\`
495
+ - новый \`style.css?t=<new_token>\`
496
+ - proxy-версию \`/arm/sw.js\`, которая внутри импортирует новый BSP \`sw.js?t=<new_token>\`.
497
+ 3. Клиентский shell периодически вызывает \`registration.update()\`.
498
+ 4. Браузер скачивает новый worker.
499
+ 5. Worker становится \`waiting\`.
500
+ 6. Пользователь видит баннер обновления.
501
+ 7. После подтверждения новый worker активируется и перезагружает все открытые вкладки приложения.
502
+
503
+ Если за время простоя вкладки накопилось несколько версий, после reload клиент держит короткое startup-окно автоматического применения waiting worker. Поэтому цепочка версий дожимается несколькими автоматическими reload без повторного ручного клика. Чтобы не получить бесконечную перезагрузку при ошибочной выдаче \`sw.js\`, автоцепочка ограничена счётчиком в \`sessionStorage\`; после лимита снова показывается обычный баннер.
504
+
505
+ ### Важная деталь
506
+
507
+ \`index.js\` и \`style.css\` теперь не лежат в precache.
508
+
509
+ Это критично для корректного деплоя:
510
+
511
+ - старый active worker больше не может упрямо раздавать старые entrypoint-файлы, игнорируя \`?t=...\`;
512
+ - entrypoint-ы обновляются по серверному cachebuster-токену.
513
+
514
+ ---
515
+
516
+ ## 12. Текущие ограничения и важные замечания
517
+
518
+ ### 12.1. Manifest переключается сервером, а не SPA-маршрутизатором
519
+
520
+ Сейчас app-specific manifest гарантированно подключается только когда HTML был сформирован ABAP для \`/arm/pwa/<appId>\`.
521
+
522
+ Следствие:
523
+
524
+ - прямой вход по URL работает как ожидается;
525
+ - чисто клиентская навигация внутри уже открытого SPA не гарантирует смену manifest.
526
+
527
+ ### 12.2. Worker регистрируется на всё приложение
528
+
529
+ Текущая архитектура больше не привязывает регистрацию service worker к \`/arm/pwa/...\`.
530
+
531
+ Следствие:
532
+
533
+ - worker появляется и на обычных маршрутах SPA;
534
+ - update flow и баннер обновления тоже работают глобально.
535
+
536
+ ### 12.3. Worker живет на всём \`/arm\`
537
+
538
+ Это не ошибка, а запланированное поведение из-за scope \`/arm/\`.
539
+
540
+ Следствие:
541
+
542
+ - и обычные SPA-маршруты, и \`/arm/pwa/...\` обслуживаются одним и тем же service worker;
543
+ - PWA-маршрут отличается не регистрацией worker, а использованием app-specific manifest и PWA-entry поведения.
544
+
545
+ ### 12.4. Offline fallback пока неполный
546
+
547
+ В коде worker ожидает \`offline.html\`, но в текущем проекте полноценная offline-страница пока не оформлена как часть законченого UX.
548
+
549
+ То есть:
550
+
551
+ - механизм fallback в коде есть;
552
+ - полноценный offline-сценарий ещё не доведён до финального состояния.
553
+
554
+ ### 12.5. Runtime-кэш статики требует аккуратности
555
+
556
+ Сейчас для \`script/style/assets\` используется \`CacheFirst\`.
557
+
558
+ Это полезно для производительности, но любые изменения в стратегиях кэширования надо делать осторожно, потому что они напрямую влияют на поведение деплоя и обновления клиента.
559
+
560
+ ---
561
+
562
+ ## 13. Рекомендации по сопровождению
563
+
564
+ ### Что можно менять безопасно
565
+
566
+ - содержимое \`src/apps/spa/*/pwa.json\`;
567
+ - названия, описания, иконки, \`short_name\`;
568
+ - \`swCache\`-политику на уровне конкретных OData-запросов.
569
+
570
+ ### Что нужно менять очень осторожно
571
+
572
+ - \`scope\` и \`start_url\` в базовом manifest;
573
+ - правила фильтрации precache в [config/vite/plugins.ts](/config/vite/plugins.ts);
574
+ - логику ABAP-проксирования \`/sw.js\`;
575
+ - исключение \`index.js\` и \`style.css\` из precache;
576
+ - правила \`ignoreURLParametersMatching\`.
577
+
578
+ ### Что обязательно проверять после изменений
579
+
580
+ 1. Прямой вход в \`/arm/pwa/<appId>\`.
581
+ 2. Регистрацию service worker в браузере.
582
+ 3. Появление app-specific manifest.
583
+ 4. Обновление после нового деплоя.
584
+ 5. Поведение update flow на любых маршрутах \`/arm/...\`.
585
+ 6. OData-запросы с \`swCache\`, если менялась data-cache логика.
586
+
587
+ ---
588
+
589
+ ## 14. Короткая памятка
590
+
591
+ ### Если нужно добавить новое PWA-приложение
592
+
593
+ Сделать \`src/apps/spa/<appId>/pwa.json\`.
594
+
595
+ ### Если после деплоя отдаются старые чанки
596
+
597
+ Сначала проверить:
598
+
599
+ - не попали ли \`index.js\` и \`style.css\` обратно в precache;
600
+ - меняется ли ABAP cachebuster token;
601
+ - обновляется ли \`/arm/sw.js\`.
602
+
603
+ ### Если не работает OData-кэш
604
+
605
+ Проверить:
606
+
607
+ - выставляется ли \`x-sw-cache\`;
608
+ - идёт ли запрос на \`/sap/opu/odata/sap/...\`;
609
+ - корректно ли политика парсится как \`off\`, \`ttl=<число><единица>\` или \`bust=<число><единица>\`.
610
+
611
+ ### Если пользователь не видит баннер обновления
612
+
613
+ Проверить:
614
+
615
+ - был ли вообще зарегистрирован service worker;
616
+ - появился ли у registration \`waiting\` worker.
617
+
618
+ ---
619
+
620
+ ## 15. Вывод
621
+
622
+ Текущая реализация PWA в проекте построена вокруг идеи:
623
+
624
+ - service worker работает на всём приложении внутри \`/arm\`;
625
+ - manifest привязан к конкретному appId;
626
+ - кэширование статических ресурсов и OData уже частично подготовлено для расширения PWA на всё приложение.
627
+
628
+ Это не "просто service worker для install prompt", а полноценный каркас для:
629
+
630
+ - app-specific PWA entrypoint;
631
+ - controlled update flow;
632
+ - selective precache;
633
+ - управляемого кэширования OData.
634
+
635
+ Главное, что нельзя забывать при дальнейших изменениях:
636
+
637
+ - manifest, ABAP cachebuster, precache-фильтрация и runtime-кэш тесно связаны между собой;
638
+ - менять одну часть без понимания всей цепочки опасно.
639
+ `}));function l(e){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i,{title:`Документация/shared/lib/pwa`}),`
640
+ `,(0,d.jsx)(r,{children:s})]})}function u(e={}){let{wrapper:t}={...n(),...e.components};return t?(0,d.jsx)(t,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}var d;e((()=>{d=t(),o(),a(),c()}))();export{u as default};