@pgcorp/ui-kit 0.12.0 → 0.14.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 (334) hide show
  1. package/README.md +787 -19
  2. package/dist/assets/src/components/layout/SDockRegion.vue_vue_type_style_index_0_scoped_a1f403e2_lang.css +1 -0
  3. package/dist/assets/src/components/layout/{SResizeHandle.vue_vue_type_style_index_0_scoped_90cc655e_lang.css → SResizeHandle.vue_vue_type_style_index_0_scoped_13b9b27a_lang.css} +1 -1
  4. package/dist/assets/src/components/layout/{SWorkbenchPanelShell.css_vue_type_style_index_0_src_1030a231_scoped_1030a231_lang.css → SWorkbenchPanelShell.css_vue_type_style_index_0_src_f9faa52a_scoped_f9faa52a_lang.css} +1 -1
  5. package/dist/assets/src/components/shared/_internal/SDialogSurface.css_vue_type_style_index_0_src_0e58afdc_scoped_0e58afdc_lang.css +2 -0
  6. package/dist/assets/src/components/shared/_internal/{SListboxGroup.css_vue_type_style_index_0_src_518787d3_scoped_518787d3_lang.css → SListboxGroup.css_vue_type_style_index_0_src_00060944_scoped_00060944_lang.css} +1 -1
  7. package/dist/assets/src/components/shared/_internal/SMenuItem.css_vue_type_style_index_0_src_af485607_scoped_af485607_lang.css +2 -0
  8. package/dist/assets/src/components/shared/_internal/SMenuLayer.css_vue_type_style_index_0_src_e478164c_scoped_e478164c_lang.css +1 -0
  9. package/dist/assets/src/components/shared/containers/{SCollapsiblePanel.css_vue_type_style_index_0_src_4882f962_scoped_4882f962_lang.css → SCollapsiblePanel.css_vue_type_style_index_0_src_71824088_scoped_71824088_lang.css} +1 -1
  10. package/dist/assets/src/components/shared/containers/SDrawer.css_vue_type_style_index_0_src_61cf20dd_scoped_61cf20dd_lang.css +2 -0
  11. package/dist/assets/src/components/shared/containers/{SModal.css_vue_type_style_index_0_src_23373daf_scoped_23373daf_lang.css → SModal.css_vue_type_style_index_0_src_42e1bd5f_scoped_42e1bd5f_lang.css} +1 -1
  12. package/dist/assets/src/components/shared/containers/SOverlayHost.css_vue_type_style_index_0_src_8f9be94e_scoped_8f9be94e_lang.css +2 -0
  13. package/dist/assets/src/components/shared/containers/SPopover.css_vue_type_style_index_0_src_4091d007_scoped_4091d007_lang.css +2 -0
  14. package/dist/assets/src/components/shared/containers/{SSidebarGroup.css_vue_type_style_index_0_src_3e8bc2d7_scoped_3e8bc2d7_lang.css → SSidebarGroup.css_vue_type_style_index_0_src_5b1eeb6c_scoped_5b1eeb6c_lang.css} +1 -1
  15. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_21f71ae8_scoped_21f71ae8_lang.css +2 -0
  16. package/dist/assets/src/components/shared/controls/SButton.css_vue_type_style_index_0_src_7a5acda9_scoped_7a5acda9_lang.css +2 -0
  17. package/dist/assets/src/components/shared/controls/{SCheckbox.css_vue_type_style_index_0_src_b20b27dd_scoped_b20b27dd_lang.css → SCheckbox.css_vue_type_style_index_0_src_55d4826e_scoped_55d4826e_lang.css} +1 -1
  18. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_537f5744_scoped_537f5744_lang.css +2 -0
  19. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_03921269_scoped_03921269_lang.css +1 -0
  20. package/dist/assets/src/components/shared/controls/{SDropdownMenu.css_vue_type_style_index_0_src_b854a89e_scoped_b854a89e_lang.css → SDropdownMenu.css_vue_type_style_index_0_src_857e2649_scoped_857e2649_lang.css} +1 -1
  21. package/dist/assets/src/components/shared/controls/SField.css_vue_type_style_index_0_src_2d353c26_scoped_2d353c26_lang.css +2 -0
  22. package/dist/assets/src/components/shared/controls/{SInputText.css_vue_type_style_index_0_src_a9c5f1aa_scoped_a9c5f1aa_lang.css → SInputText.css_vue_type_style_index_0_src_023c25d0_scoped_023c25d0_lang.css} +1 -1
  23. package/dist/assets/src/components/shared/controls/{SInteractiveSurface.css_vue_type_style_index_0_src_998940dd_scoped_998940dd_lang.css → SInteractiveSurface.css_vue_type_style_index_0_src_5e422fac_scoped_5e422fac_lang.css} +1 -1
  24. package/dist/assets/src/components/shared/controls/{SLink.css_vue_type_style_index_0_src_c7ae14e1_scoped_c7ae14e1_lang.css → SLink.css_vue_type_style_index_0_src_ac46e5a4_scoped_ac46e5a4_lang.css} +1 -1
  25. package/dist/assets/src/components/shared/controls/SListbox.css_vue_type_style_index_0_src_50063f9f_scoped_50063f9f_lang.css +2 -0
  26. package/dist/assets/src/components/shared/controls/{SListboxOption.css_vue_type_style_index_0_src_77c399b4_scoped_77c399b4_lang.css → SListboxOption.css_vue_type_style_index_0_src_59c9c538_scoped_59c9c538_lang.css} +1 -1
  27. package/dist/assets/src/components/shared/controls/SMenuSurface.css_vue_type_style_index_0_src_84109ad9_scoped_84109ad9_lang.css +2 -0
  28. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_df3d6688_scoped_df3d6688_lang.css +2 -0
  29. package/dist/assets/src/components/shared/controls/STextarea.css_vue_type_style_index_0_src_true_lang.css +1 -1
  30. package/dist/assets/src/components/shared/data-display/SProgressBar.css_vue_type_style_index_0_src_cad721dd_scoped_cad721dd_lang.css +2 -0
  31. package/dist/assets/src/components/shared/data-display/SRichDocument.css_vue_type_style_index_0_src_8db085d5_scoped_8db085d5_lang.css +2 -0
  32. package/dist/assets/src/components/shared/data-display/SStatus.css_vue_type_style_index_0_src_3ce41a12_scoped_3ce41a12_lang.css +1 -1
  33. package/dist/assets/src/components/shared/data-display/STable.css_vue_type_style_index_0_src_b23b3d71_scoped_b23b3d71_lang.css +2 -0
  34. package/dist/assets/src/components/shared/data-display/STooltip.css_vue_type_style_index_0_src_true_lang.css +1 -1
  35. package/dist/assets/src/components/shared/data-display/SVirtualList.css_vue_type_style_index_0_src_9fe3ade0_scoped_9fe3ade0_lang.css +2 -0
  36. package/dist/assets/src/components/shared/data-display/_internal/SRichBlockNode.css_vue_type_style_index_0_src_eaae882d_scoped_eaae882d_lang.css +2 -0
  37. package/dist/assets/src/components/shared/data-display/_internal/SRichDisclosure.css_vue_type_style_index_0_src_1f0ffc97_scoped_1f0ffc97_lang.css +2 -0
  38. package/dist/assets/src/components/shared/data-display/_internal/SRichImage.css_vue_type_style_index_0_src_2f1c39a9_scoped_2f1c39a9_lang.css +2 -0
  39. package/dist/assets/src/components/shared/data-display/_internal/{SRichInlineNode.css_vue_type_style_index_0_src_20c8cc87_scoped_20c8cc87_lang.css → SRichInlineNode.css_vue_type_style_index_0_src_3ca8df12_scoped_3ca8df12_lang.css} +1 -1
  40. package/dist/assets/src/components/shared/data-display/_internal/STableCell.css_vue_type_style_index_0_src_b829cbc6_scoped_b829cbc6_lang.css +2 -0
  41. package/dist/assets/src/components/shared/data-display/_internal/STableFrame.css_vue_type_style_index_0_src_52b5825e_scoped_52b5825e_lang.css +2 -0
  42. package/dist/assets/src/components/shared/data-display/_internal/STableRow.css_vue_type_style_index_0_src_1661f8b8_scoped_1661f8b8_lang.css +2 -0
  43. package/dist/assets/src/components/shared/feedback/SAsyncState.css_vue_type_style_index_0_src_8a291af7_scoped_8a291af7_lang.css +2 -0
  44. package/dist/assets/src/components/shared/navigation/{SBottomNav.vue_vue_type_style_index_0_scoped_b3963080_lang.css → SBottomNav.vue_vue_type_style_index_0_scoped_24be0f2b_lang.css} +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.js +3 -3
  47. package/dist/reference.css +4 -0
  48. package/dist/src/components/icons/_internal/generatedSputnigUiIconComponents.d.ts +15 -0
  49. package/dist/src/components/icons/_internal/generatedSputnigUiIconComponents.js +4 -4
  50. package/dist/src/components/icons/_internal/generatedSputnigUiIconMarkup.d.ts +46 -1
  51. package/dist/src/components/icons/_internal/generatedSputnigUiIconMarkup.js +260 -230
  52. package/dist/src/components/icons/sputnigUiIcons.d.ts +1 -1
  53. package/dist/src/components/icons/sputnigUiIcons.js +233 -218
  54. package/dist/src/components/layout/SAppShell.vue_vue_type_script_setup_true_lang.js +8 -8
  55. package/dist/src/components/layout/SDockRegion.vue.d.ts +18 -5
  56. package/dist/src/components/layout/SDockRegion.vue.js +2 -2
  57. package/dist/src/components/layout/SDockRegion.vue_vue_type_script_setup_true_lang.js +112 -64
  58. package/dist/src/components/layout/SResizeHandle.vue.d.ts +6 -3
  59. package/dist/src/components/layout/SResizeHandle.vue.js +2 -2
  60. package/dist/src/components/layout/SResizeHandle.vue_vue_type_script_setup_true_lang.js +125 -87
  61. package/dist/src/components/layout/SStack.vue.d.ts +1 -1
  62. package/dist/src/components/layout/SWorkbenchPanelShell.vue.d.ts +4 -4
  63. package/dist/src/components/layout/SWorkbenchPanelShell.vue.js +2 -2
  64. package/dist/src/components/layout/SWorkbenchPanelShell.vue_vue_type_script_setup_true_lang.js +62 -58
  65. package/dist/src/components/layout/types.d.ts +20 -0
  66. package/dist/src/components/shared/_internal/SDialogSurface.vue.js +2 -2
  67. package/dist/src/components/shared/_internal/SDialogSurface.vue_vue_type_script_setup_true_lang.js +64 -41
  68. package/dist/src/components/shared/_internal/SHeaderSurface.vue.d.ts +1 -1
  69. package/dist/src/components/shared/_internal/SListboxGroup.vue.d.ts +5 -0
  70. package/dist/src/components/shared/_internal/SListboxGroup.vue.js +2 -2
  71. package/dist/src/components/shared/_internal/SListboxGroup.vue_vue_type_script_setup_true_lang.js +33 -15
  72. package/dist/src/components/shared/_internal/SMenuItem.vue.js +2 -2
  73. package/dist/src/components/shared/_internal/SMenuItem.vue_vue_type_script_setup_true_lang.js +88 -76
  74. package/dist/src/components/shared/_internal/SMenuLayer.vue.d.ts +5 -1
  75. package/dist/src/components/shared/_internal/SMenuLayer.vue.js +2 -2
  76. package/dist/src/components/shared/_internal/SMenuLayer.vue_vue_type_script_setup_true_lang.js +64 -20
  77. package/dist/src/components/shared/_internal/dialogSurface.d.ts +16 -3
  78. package/dist/src/components/shared/_internal/dialogSurface.js +40 -23
  79. package/dist/src/components/shared/_internal/listboxContext.d.ts +1 -0
  80. package/dist/src/components/shared/_internal/listboxInventory.d.ts +51 -0
  81. package/dist/src/components/shared/_internal/listboxInventory.js +85 -0
  82. package/dist/src/components/shared/_internal/menuContext.d.ts +8 -0
  83. package/dist/src/components/shared/_internal/menuContext.js +2 -2
  84. package/dist/src/components/shared/_internal/sidebarGroupContext.d.ts +1 -0
  85. package/dist/src/components/shared/_internal/useVirtualCollection.d.ts +45 -0
  86. package/dist/src/components/shared/_internal/useVirtualCollection.js +123 -0
  87. package/dist/src/components/shared/complex/SKanbanLane.vue_vue_type_script_setup_true_lang.js +5 -5
  88. package/dist/src/components/shared/containers/SCloudChrome.vue.d.ts +1 -1
  89. package/dist/src/components/shared/containers/SCloudChromeRow.vue.d.ts +1 -1
  90. package/dist/src/components/shared/containers/SCollapsiblePanel.vue.d.ts +1 -1
  91. package/dist/src/components/shared/containers/SCollapsiblePanel.vue.js +2 -2
  92. package/dist/src/components/shared/containers/SCollapsiblePanel.vue_vue_type_script_setup_true_lang.js +60 -58
  93. package/dist/src/components/shared/containers/SDrawer.vue.d.ts +12 -1
  94. package/dist/src/components/shared/containers/SDrawer.vue.js +2 -2
  95. package/dist/src/components/shared/containers/SDrawer.vue_vue_type_script_setup_true_lang.js +151 -53
  96. package/dist/src/components/shared/containers/SModal.vue.js +2 -2
  97. package/dist/src/components/shared/containers/SModal.vue_vue_type_script_setup_true_lang.js +79 -49
  98. package/dist/src/components/shared/containers/SOverlayHost.vue.d.ts +16 -0
  99. package/dist/src/components/shared/containers/SOverlayHost.vue.js +8 -0
  100. package/dist/src/components/shared/containers/SOverlayHost.vue_vue_type_script_setup_true_lang.js +65 -0
  101. package/dist/src/components/shared/containers/SPageHeader.vue.d.ts +1 -1
  102. package/dist/src/components/shared/containers/SPanel.vue.d.ts +1 -1
  103. package/dist/src/components/shared/containers/SPanel.vue_vue_type_script_setup_true_lang.js +7 -7
  104. package/dist/src/components/shared/containers/SPopover.vue.js +2 -2
  105. package/dist/src/components/shared/containers/SPopover.vue_vue_type_script_setup_true_lang.js +214 -145
  106. package/dist/src/components/shared/containers/SSidebarGroup.vue.js +2 -2
  107. package/dist/src/components/shared/containers/SSidebarGroup.vue_vue_type_script_setup_true_lang.js +30 -8
  108. package/dist/src/components/shared/containers/SSidebarSection.vue.js +2 -2
  109. package/dist/src/components/shared/containers/SSidebarSection.vue_vue_type_script_setup_true_lang.js +58 -45
  110. package/dist/src/components/shared/controls/SButton.vue.d.ts +7 -0
  111. package/dist/src/components/shared/controls/SButton.vue.js +2 -2
  112. package/dist/src/components/shared/controls/SButton.vue_vue_type_script_setup_true_lang.js +11 -5
  113. package/dist/src/components/shared/controls/SCheckbox.vue.d.ts +3 -0
  114. package/dist/src/components/shared/controls/SCheckbox.vue.js +2 -2
  115. package/dist/src/components/shared/controls/SCheckbox.vue_vue_type_script_setup_true_lang.js +45 -41
  116. package/dist/src/components/shared/controls/SCheckboxGroup.vue_vue_type_script_setup_true_lang.js +7 -7
  117. package/dist/src/components/shared/controls/SChoiceCards.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/src/components/shared/controls/SColorSelect.vue_vue_type_script_setup_true_lang.js +6 -6
  119. package/dist/src/components/shared/controls/SCombobox.vue.js +2 -2
  120. package/dist/src/components/shared/controls/SCombobox.vue_vue_type_script_setup_true_lang.js +147 -132
  121. package/dist/src/components/shared/controls/SComboboxTrigger.vue.d.ts +2 -2
  122. package/dist/src/components/shared/controls/SContextMenu.vue.d.ts +11 -0
  123. package/dist/src/components/shared/controls/SContextMenu.vue.js +2 -2
  124. package/dist/src/components/shared/controls/SContextMenu.vue_vue_type_script_setup_true_lang.js +144 -59
  125. package/dist/src/components/shared/controls/SContextToggleButton.vue_vue_type_script_setup_true_lang.js +6 -6
  126. package/dist/src/components/shared/controls/SDragHandle.vue_vue_type_script_setup_true_lang.js +5 -5
  127. package/dist/src/components/shared/controls/SDropdownMenu.vue.d.ts +15 -4
  128. package/dist/src/components/shared/controls/SDropdownMenu.vue.js +2 -2
  129. package/dist/src/components/shared/controls/SDropdownMenu.vue_vue_type_script_setup_true_lang.js +114 -71
  130. package/dist/src/components/shared/controls/SField.vue.d.ts +9 -6
  131. package/dist/src/components/shared/controls/SField.vue.js +2 -2
  132. package/dist/src/components/shared/controls/SField.vue_vue_type_script_setup_true_lang.js +69 -52
  133. package/dist/src/components/shared/controls/SFieldGroup.vue_vue_type_script_setup_true_lang.js +13 -13
  134. package/dist/src/components/shared/controls/SInlineTokenEditor.vue_vue_type_script_setup_true_lang.js +26 -26
  135. package/dist/src/components/shared/controls/SInputText.vue.d.ts +2 -2
  136. package/dist/src/components/shared/controls/SInputText.vue.js +2 -2
  137. package/dist/src/components/shared/controls/SInputText.vue_vue_type_script_setup_true_lang.js +33 -42
  138. package/dist/src/components/shared/controls/SInteractiveSurface.vue.js +2 -2
  139. package/dist/src/components/shared/controls/SInteractiveSurface.vue_vue_type_script_setup_true_lang.js +99 -74
  140. package/dist/src/components/shared/controls/SLink.d.ts +11 -1
  141. package/dist/src/components/shared/controls/SLink.vue.d.ts +17 -1
  142. package/dist/src/components/shared/controls/SLink.vue.js +2 -2
  143. package/dist/src/components/shared/controls/SLink.vue_vue_type_script_setup_true_lang.js +157 -62
  144. package/dist/src/components/shared/controls/SListbox.vue.d.ts +10 -1
  145. package/dist/src/components/shared/controls/SListbox.vue.js +2 -2
  146. package/dist/src/components/shared/controls/SListbox.vue_vue_type_script_setup_true_lang.js +371 -189
  147. package/dist/src/components/shared/controls/SListboxOption.vue.d.ts +6 -0
  148. package/dist/src/components/shared/controls/SListboxOption.vue.js +2 -2
  149. package/dist/src/components/shared/controls/SListboxOption.vue_vue_type_script_setup_true_lang.js +47 -34
  150. package/dist/src/components/shared/controls/SMenuSurface.vue.d.ts +2 -2
  151. package/dist/src/components/shared/controls/SMenuSurface.vue.js +2 -2
  152. package/dist/src/components/shared/controls/SMenuSurface.vue_vue_type_script_setup_true_lang.js +165 -117
  153. package/dist/src/components/shared/controls/SRange.vue_vue_type_script_setup_true_lang.js +12 -12
  154. package/dist/src/components/shared/controls/SSelect.vue.js +2 -2
  155. package/dist/src/components/shared/controls/SSelect.vue_vue_type_script_setup_true_lang.js +126 -116
  156. package/dist/src/components/shared/controls/STextarea.d.ts +1 -1
  157. package/dist/src/components/shared/controls/STextarea.vue.d.ts +32 -2
  158. package/dist/src/components/shared/controls/STextarea.vue_vue_type_script_setup_true_lang.js +346 -200
  159. package/dist/src/components/shared/controls/_internal/SInlineTokenSurface.vue_vue_type_script_lang.js +36 -36
  160. package/dist/src/components/shared/controls/menu.d.ts +9 -1
  161. package/dist/src/components/shared/controls/menu.js +43 -28
  162. package/dist/src/components/shared/data-display/SActionList.vue.d.ts +1 -1
  163. package/dist/src/components/shared/data-display/SActionListItem.vue.d.ts +4 -4
  164. package/dist/src/components/shared/data-display/SActionListItem.vue_vue_type_script_setup_true_lang.js +6 -6
  165. package/dist/src/components/shared/data-display/SBadge.vue.d.ts +1 -1
  166. package/dist/src/components/shared/data-display/SChart.vue_vue_type_script_setup_true_lang.js +89 -89
  167. package/dist/src/components/shared/data-display/SChip.vue.d.ts +1 -1
  168. package/dist/src/components/shared/data-display/SChip.vue_vue_type_script_setup_true_lang.js +7 -7
  169. package/dist/src/components/shared/data-display/SCodeBlock.vue_vue_type_script_setup_true_lang.js +19 -19
  170. package/dist/src/components/shared/data-display/SCodeEditor.vue_vue_type_script_setup_true_lang.js +37 -37
  171. package/dist/src/components/shared/data-display/SCodeSearchPanel.vue_vue_type_script_setup_true_lang.js +17 -17
  172. package/dist/src/components/shared/data-display/SCodeWorkspaceEditor.vue_vue_type_script_setup_true_lang.js +12 -12
  173. package/dist/src/components/shared/data-display/SControlledToastViewport.vue_vue_type_script_setup_true_lang.js +4 -4
  174. package/dist/src/components/shared/data-display/SDiffViewer.vue_vue_type_script_setup_true_lang.js +13 -13
  175. package/dist/src/components/shared/data-display/SDocBlock.vue_vue_type_script_setup_true_lang.js +12 -12
  176. package/dist/src/components/shared/data-display/SEmptyState.vue.d.ts +1 -1
  177. package/dist/src/components/shared/data-display/SEmptyState.vue_vue_type_script_setup_true_lang.js +4 -4
  178. package/dist/src/components/shared/data-display/SExpandableText.vue_vue_type_script_setup_true_lang.js +7 -7
  179. package/dist/src/components/shared/data-display/SKeyValueGrid.vue_vue_type_script_setup_true_lang.js +15 -15
  180. package/dist/src/components/shared/data-display/SLinkedSystemsList.vue_vue_type_script_setup_true_lang.js +17 -17
  181. package/dist/src/components/shared/data-display/SMessage.vue.d.ts +1 -1
  182. package/dist/src/components/shared/data-display/SMessage.vue_vue_type_script_setup_true_lang.js +9 -9
  183. package/dist/src/components/shared/data-display/SMetricCard.vue.d.ts +1 -1
  184. package/dist/src/components/shared/data-display/SProgressBar.vue.d.ts +22 -3
  185. package/dist/src/components/shared/data-display/SProgressBar.vue.js +2 -2
  186. package/dist/src/components/shared/data-display/SProgressBar.vue_vue_type_script_setup_true_lang.js +133 -47
  187. package/dist/src/components/shared/data-display/SProgressIndicator.vue_vue_type_script_setup_true_lang.js +4 -4
  188. package/dist/src/components/shared/data-display/SRichDocument.vue.js +2 -2
  189. package/dist/src/components/shared/data-display/SRichDocument.vue_vue_type_script_setup_true_lang.js +46 -23
  190. package/dist/src/components/shared/data-display/SScrollViewport.vue_vue_type_script_setup_true_lang.js +18 -18
  191. package/dist/src/components/shared/data-display/SSectionHeader.vue.d.ts +1 -1
  192. package/dist/src/components/shared/data-display/SStatus.vue_vue_type_script_setup_true_lang.js +4 -4
  193. package/dist/src/components/shared/data-display/STable.vue.js +2 -2
  194. package/dist/src/components/shared/data-display/STable.vue_vue_type_script_setup_true_lang.js +343 -322
  195. package/dist/src/components/shared/data-display/STooltip.vue.d.ts +2 -2
  196. package/dist/src/components/shared/data-display/STooltip.vue_vue_type_script_setup_true_lang.js +181 -154
  197. package/dist/src/components/shared/data-display/STooltipAnchor.vue_vue_type_script_setup_true_lang.js +5 -5
  198. package/dist/src/components/shared/data-display/STooltipTarget.vue_vue_type_script_setup_true_lang.js +4 -4
  199. package/dist/src/components/shared/data-display/SVirtualList.vue.js +2 -2
  200. package/dist/src/components/shared/data-display/SVirtualList.vue_vue_type_script_setup_true_lang.js +196 -246
  201. package/dist/src/components/shared/data-display/_internal/SRichBlockNode.vue.js +2 -2
  202. package/dist/src/components/shared/data-display/_internal/SRichBlockNode.vue_vue_type_script_setup_true_lang.js +242 -220
  203. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue.d.ts +13 -2
  204. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue.js +2 -2
  205. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue_vue_type_script_setup_true_lang.js +67 -11
  206. package/dist/src/components/shared/data-display/_internal/SRichImage.vue.d.ts +11 -0
  207. package/dist/src/components/shared/data-display/_internal/SRichImage.vue.js +8 -0
  208. package/dist/src/components/shared/data-display/_internal/SRichImage.vue_vue_type_script_setup_true_lang.js +89 -0
  209. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue.d.ts +3 -2
  210. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue.js +2 -2
  211. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue_vue_type_script_setup_true_lang.js +179 -125
  212. package/dist/src/components/shared/data-display/_internal/SRichMath.vue_vue_type_script_setup_true_lang.js +4 -4
  213. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue.d.ts +21 -0
  214. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue.js +5 -0
  215. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue_vue_type_script_setup_true_lang.js +150 -0
  216. package/dist/src/components/shared/data-display/_internal/STableCell.vue.d.ts +52 -0
  217. package/dist/src/components/shared/data-display/_internal/STableCell.vue.js +8 -0
  218. package/dist/src/components/shared/data-display/_internal/STableCell.vue_vue_type_script_setup_true_lang.js +148 -0
  219. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.d.ts +42 -0
  220. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.js +8 -0
  221. package/dist/src/components/shared/data-display/_internal/STableFrame.vue_vue_type_script_setup_true_lang.js +98 -0
  222. package/dist/src/components/shared/data-display/_internal/STableRow.vue.d.ts +43 -0
  223. package/dist/src/components/shared/data-display/_internal/STableRow.vue.js +8 -0
  224. package/dist/src/components/shared/data-display/_internal/STableRow.vue_vue_type_script_setup_true_lang.js +115 -0
  225. package/dist/src/components/shared/data-display/_internal/STableSection.vue.d.ts +28 -0
  226. package/dist/src/components/shared/data-display/_internal/STableSection.vue.js +5 -0
  227. package/dist/src/components/shared/data-display/_internal/STableSection.vue_vue_type_script_setup_true_lang.js +77 -0
  228. package/dist/src/components/shared/data-display/_internal/richDocumentMedia.d.ts +6 -0
  229. package/dist/src/components/shared/data-display/_internal/richDocumentMedia.js +136 -0
  230. package/dist/src/components/shared/data-display/_internal/richDocumentMetadata.d.ts +21 -0
  231. package/dist/src/components/shared/data-display/_internal/richDocumentMetadata.js +39 -0
  232. package/dist/src/components/shared/data-display/_internal/richDocumentNavigation.d.ts +30 -0
  233. package/dist/src/components/shared/data-display/_internal/richDocumentNavigation.js +88 -0
  234. package/dist/src/components/shared/data-display/_internal/richDocumentTableValidation.d.ts +9 -0
  235. package/dist/src/components/shared/data-display/_internal/richDocumentTableValidation.js +240 -0
  236. package/dist/src/components/shared/data-display/_internal/richDocumentTraversal.d.ts +15 -0
  237. package/dist/src/components/shared/data-display/_internal/richDocumentTraversal.js +61 -0
  238. package/dist/src/components/shared/data-display/_internal/richDocumentTypes.d.ts +466 -0
  239. package/dist/src/components/shared/data-display/_internal/richDocumentValidation.d.ts +65 -0
  240. package/dist/src/components/shared/data-display/_internal/richDocumentValidation.js +192 -0
  241. package/dist/src/components/shared/data-display/_internal/tableFoundation.d.ts +27 -0
  242. package/dist/src/components/shared/data-display/_internal/tableFoundation.js +16 -0
  243. package/dist/src/components/shared/data-display/richDocument.d.ts +3 -220
  244. package/dist/src/components/shared/data-display/richDocument.js +607 -399
  245. package/dist/src/components/shared/database/SDataGrid.vue_vue_type_script_setup_true_lang.js +36 -36
  246. package/dist/src/components/shared/database/SSqlEditor.vue.d.ts +2 -2
  247. package/dist/src/components/shared/database/SSqlEditor.vue_vue_type_script_setup_true_lang.js +36 -36
  248. package/dist/src/components/shared/feedback/SAsyncState.vue.js +2 -2
  249. package/dist/src/components/shared/feedback/SAsyncState.vue_vue_type_script_setup_true_lang.js +70 -63
  250. package/dist/src/components/shared/navigation/SBottomNav.vue.d.ts +2 -2
  251. package/dist/src/components/shared/navigation/SBottomNav.vue.js +2 -2
  252. package/dist/src/components/shared/navigation/SBottomNav.vue_vue_type_script_setup_true_lang.js +138 -129
  253. package/dist/src/components/shared/navigation/SBreadcrumbs.vue.d.ts +2 -2
  254. package/dist/src/components/shared/navigation/STabPanel.vue.d.ts +2 -2
  255. package/dist/src/components/shared/navigation/SWizardSteps.vue_vue_type_script_setup_true_lang.js +16 -16
  256. package/dist/src/components/shared/persona/SPersonaProjectPicker.vue.d.ts +2 -2
  257. package/dist/src/composables/useDialogOverlay.d.ts +12 -2
  258. package/dist/src/composables/useDialogOverlay.js +202 -41
  259. package/dist/src/composables/useFloatingPosition.d.ts +20 -0
  260. package/dist/src/composables/useFloatingPosition.js +129 -52
  261. package/dist/src/internal/fieldSurface.d.ts +3 -0
  262. package/dist/src/internal/fieldSurface.js +3 -2
  263. package/dist/src/internal/focusNavigation.d.ts +2 -0
  264. package/dist/src/internal/focusNavigation.js +9 -9
  265. package/dist/src/internal/layerStack.d.ts +12 -0
  266. package/dist/src/internal/layerStack.js +138 -62
  267. package/dist/src/internal/linkTarget.d.ts +7 -1
  268. package/dist/src/internal/linkTarget.js +11 -7
  269. package/dist/src/internal/overlayHost.d.ts +18 -0
  270. package/dist/src/internal/overlayHost.js +18 -0
  271. package/dist/src/internal/ownedAttrs.d.ts +13 -3
  272. package/dist/src/internal/ownedAttrs.js +8 -1
  273. package/dist/src/internal/runtimeContract.d.ts +2 -0
  274. package/dist/src/internal/runtimeContract.js +10 -5
  275. package/dist/src/internal/textLengthConstraints.d.ts +9 -0
  276. package/dist/src/internal/textLengthConstraints.js +18 -0
  277. package/dist/src/internal/useMenuLayer.d.ts +8 -4
  278. package/dist/src/internal/useMenuLayer.js +75 -46
  279. package/dist/tailwind.css +3 -0
  280. package/dist/typography.LICENSE.txt +94 -0
  281. package/dist/typography.js +5150 -0
  282. package/docs/getting-started.md +39 -0
  283. package/docs/link-download.md +114 -0
  284. package/docs/listbox.md +129 -0
  285. package/docs/public-api.md +208 -4
  286. package/docs/resize.md +129 -0
  287. package/docs/rich-document.md +442 -25
  288. package/package.json +12 -4
  289. package/src/components/shared/_internal/SDialogSurface.css +43 -7
  290. package/src/components/shared/_internal/SMenuItem.css +22 -1
  291. package/src/components/shared/_internal/SMenuLayer.css +4 -0
  292. package/src/components/shared/containers/SDrawer.css +20 -2
  293. package/src/components/shared/containers/SOverlayHost.css +14 -0
  294. package/src/components/shared/containers/SPopover.css +8 -2
  295. package/src/components/shared/controls/SButton.css +4 -0
  296. package/src/components/shared/controls/SField.css +6 -0
  297. package/src/components/shared/controls/SListbox.css +17 -0
  298. package/src/components/shared/controls/SMenuSurface.css +38 -4
  299. package/src/components/shared/controls/STextarea.css +42 -3
  300. package/src/components/shared/data-display/SProgressBar.css +79 -0
  301. package/src/components/shared/data-display/SRichDocument.css +1 -0
  302. package/src/components/shared/data-display/SStatus.css +8 -25
  303. package/src/components/shared/data-display/STable.css +0 -113
  304. package/src/components/shared/data-display/STooltip.css +4 -1
  305. package/src/components/shared/data-display/_internal/SRichBlockNode.css +11 -7
  306. package/src/components/shared/data-display/_internal/SRichDisclosure.css +16 -0
  307. package/src/components/shared/data-display/_internal/SRichImage.css +37 -0
  308. package/src/components/shared/data-display/_internal/STableCell.css +55 -0
  309. package/src/components/shared/data-display/_internal/STableFrame.css +41 -0
  310. package/src/components/shared/data-display/_internal/STableRow.css +12 -0
  311. package/src/components/shared/feedback/SAsyncState.css +0 -4
  312. package/src/styles/style.css +9 -5
  313. package/src/styles/tokens.css +30 -0
  314. package/dist/assets/src/components/layout/SDockRegion.vue_vue_type_style_index_0_scoped_2932631d_lang.css +0 -1
  315. package/dist/assets/src/components/shared/_internal/SDialogSurface.css_vue_type_style_index_0_src_d1b65adf_scoped_d1b65adf_lang.css +0 -2
  316. package/dist/assets/src/components/shared/_internal/SMenuItem.css_vue_type_style_index_0_src_e5bd192e_scoped_e5bd192e_lang.css +0 -2
  317. package/dist/assets/src/components/shared/_internal/SMenuLayer.css_vue_type_style_index_0_src_4913bbe1_scoped_4913bbe1_lang.css +0 -1
  318. package/dist/assets/src/components/shared/containers/SDrawer.css_vue_type_style_index_0_src_091d7325_scoped_091d7325_lang.css +0 -2
  319. package/dist/assets/src/components/shared/containers/SPopover.css_vue_type_style_index_0_src_deded766_scoped_deded766_lang.css +0 -2
  320. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_96f51ac6_scoped_96f51ac6_lang.css +0 -2
  321. package/dist/assets/src/components/shared/controls/SButton.css_vue_type_style_index_0_src_a5d8f7e0_scoped_a5d8f7e0_lang.css +0 -2
  322. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_e3b4f580_scoped_e3b4f580_lang.css +0 -2
  323. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_00c91d39_scoped_00c91d39_lang.css +0 -1
  324. package/dist/assets/src/components/shared/controls/SField.css_vue_type_style_index_0_src_60628f96_scoped_60628f96_lang.css +0 -2
  325. package/dist/assets/src/components/shared/controls/SListbox.css_vue_type_style_index_0_src_24db4abb_scoped_24db4abb_lang.css +0 -2
  326. package/dist/assets/src/components/shared/controls/SMenuSurface.css_vue_type_style_index_0_src_bc7c7be4_scoped_bc7c7be4_lang.css +0 -2
  327. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_441648c9_scoped_441648c9_lang.css +0 -2
  328. package/dist/assets/src/components/shared/data-display/SProgressBar.css_vue_type_style_index_0_src_9308293a_scoped_9308293a_lang.css +0 -2
  329. package/dist/assets/src/components/shared/data-display/SRichDocument.css_vue_type_style_index_0_src_d1afafc5_scoped_d1afafc5_lang.css +0 -2
  330. package/dist/assets/src/components/shared/data-display/STable.css_vue_type_style_index_0_src_9955d482_scoped_9955d482_lang.css +0 -2
  331. package/dist/assets/src/components/shared/data-display/SVirtualList.css_vue_type_style_index_0_src_cee8c247_scoped_cee8c247_lang.css +0 -2
  332. package/dist/assets/src/components/shared/data-display/_internal/SRichBlockNode.css_vue_type_style_index_0_src_195d5c06_scoped_195d5c06_lang.css +0 -2
  333. package/dist/assets/src/components/shared/data-display/_internal/SRichDisclosure.css_vue_type_style_index_0_src_fa94e2ff_scoped_fa94e2ff_lang.css +0 -2
  334. package/dist/assets/src/components/shared/feedback/SAsyncState.css_vue_type_style_index_0_src_bfc28903_scoped_bfc28903_lang.css +0 -2
@@ -25,11 +25,13 @@ import SRichDocument from '@pgcorp/ui-kit/shared/data-display/SRichDocument.vue'
25
25
  import {
26
26
  SRichDocumentContractError,
27
27
  validateRichDocument,
28
+ validateRichDocumentModel,
28
29
  validateRichDocumentResources,
29
30
  type SRichDocumentActionIntent,
30
31
  type SRichDocumentResource,
31
32
  type SRichDocumentResourceActivate,
32
33
  type SRichDocumentV1,
34
+ type SRichHeadingPresentation,
33
35
  } from '@pgcorp/ui-kit/shared/data-display/richDocument'
34
36
  ```
35
37
 
@@ -50,6 +52,7 @@ at the application boundary.
50
52
  ```ts
51
53
  const document = validateRichDocument(workerMessage.document)
52
54
  const resources = validateRichDocumentResources(apiResponse.resources)
55
+ const model = validateRichDocumentModel(document, resources)
53
56
  ```
54
57
 
55
58
  `SRichDocumentContractError` содержит стабильный `code`, точный `path` и
@@ -73,16 +76,21 @@ try {
73
76
  ```
74
77
 
75
78
  Links принимают относительные application paths и `http:`, `https:`, `mailto:`,
76
- `tel:`. Resource records принимают относительные paths, `http:`, `https:` и
77
- `blob:`. Скриптовые, data, scheme-relative и неизвестные protocols отклоняются.
78
- Resources передаются отдельными consumer-owned records и связываются с AST по
79
- stable ID; UI-kit не читает filesystem и не выполняет URL самостоятельно.
80
-
81
- Links accept relative application paths plus `http:`, `https:`, `mailto:`, and
82
- `tel:`. Resource records accept relative paths, `http:`, `https:`, and `blob:`.
83
- Script, data, scheme-relative, and unknown protocols are rejected. Resources
84
- are supplied as separate consumer-owned records and joined to the AST by stable
85
- ID; the UI kit does not read the filesystem or activate URLs itself.
79
+ `tel:`, `irc:`, `ircs:`, `xmpp:`. Resource records принимают относительные paths,
80
+ `http:`, `https:` и `blob:`. Только image resources допускают raster data URL
81
+ по отдельному строгому контракту. Скриптовые, scheme-relative, неизвестные
82
+ protocols, пробелы, control characters и backslashes отклоняются. HTTP(S) URLs
83
+ не допускают userinfo (`username`/`password`); адресная семантика `irc:`,
84
+ `ircs:` и `xmpp:` сохраняется без общего запрета символа `@`. Валидатор не
85
+ переписывает URL, не исправляет protocol и не авторизует origin.
86
+
87
+ Links accept relative application paths and the listed inert link protocols.
88
+ Resources accept relative paths, HTTP(S), and blob URLs; image resources also
89
+ support the strict raster data contract below. Script and unknown protocols,
90
+ scheme-relative URLs, whitespace, control characters, and backslashes are
91
+ rejected. HTTP(S) userinfo is forbidden; other admitted protocols retain their
92
+ own address semantics. Validation preserves the exact URL and does not authorize
93
+ its origin.
86
94
 
87
95
  ## Модель документа / Document model
88
96
 
@@ -94,28 +102,29 @@ The closed model supports:
94
102
 
95
103
  - paragraph, heading, strong, emphasis, inline code и links с optional
96
104
  `current`-состоянием;
97
- - deletion, `keyboard`, superscript и subscript inline semantics;
105
+ - distinct attention/importance, idiomatic/emphasis и strikethrough/deletion;
106
+ - insertion, quotation, sample, variable, monospace, ruby, rich
107
+ `keyboard`, superscript и subscript inline semantics;
108
+ - `hardBreak`, inline images, passive inline/block groups и sections;
109
+ - definition lists с отдельными rich terms и block descriptions;
98
110
  - ordered/unordered и task lists с inert checked-state и обязательной доступной
99
111
  меткой каждого task checkbox;
100
- - quote, divider и keyboard-operable `disclosure` с текстовым summary;
101
- - scoped footnote reference/definition/backlink, где DOM targets вычисляет
102
- renderer, а payload передаёт только stable footnote ID;
112
+ - quote, divider и keyboard-operable `disclosure` с текстовым или rich summary;
113
+ - scoped anchors и повторные footnote reference/definition/backlink, где DOM
114
+ targets вычисляет renderer, а payload передаёт логические identities;
103
115
  - code blocks с optional language, line numbers и label;
104
116
  - inline/block math;
105
- - semantic tables и callouts;
106
- - image/file resources по ID;
117
+ - прямоугольные rich tables и структурные semantic tables с head/body/foot;
118
+ - callouts и image/file resources по ID, responsive image candidates;
107
119
  - action groups с serializable action IDs.
108
120
 
109
- Внутренняя навигация сносок — единственный link-like эффект, которым владеет
110
- renderer: адреса reference и backlink вычисляются из валидированных ID и
111
- instance-scoped DOM-префикса. Обычные `link`-узлы остаются управляемыми
112
- intent-действиями. Task checkbox отображает readonly-состояние документа и не
113
- эмитит обновления.
121
+ Внутренняя навигация anchors и сносок принадлежит renderer. Обычные `link`-узлы
122
+ остаются управляемыми intent-действиями. Task и inline checkbox отображают
123
+ readonly-состояние документа и не эмитят обновления.
114
124
 
115
- Internal footnote navigation is the only link-like effect owned by the renderer:
116
- reference and backlink URLs are derived from validated IDs and an
117
- instance-scoped DOM prefix. Ordinary `link` nodes remain controlled intents.
118
- Task checkboxes are read-only document state and do not emit updates.
125
+ The renderer owns local anchor and footnote navigation. Ordinary links remain
126
+ controlled intents. Task and inline checkboxes show read-only document state
127
+ without emitting updates.
119
128
 
120
129
  ```ts
121
130
  const document = {
@@ -158,6 +167,342 @@ const resources = [{
158
167
  }] as const satisfies readonly SRichDocumentResource[]
159
168
  ```
160
169
 
170
+ ## Safe HTML projection profile
171
+
172
+ Таблица задаёт явное преобразование всех 53 тегов
173
+ [`hast-util-sanitize` defaultSchema 5.0.2](https://github.com/syntax-tree/hast-util-sanitize/blob/5.0.2/lib/schema.js)
174
+ в закрытые типы кита. Это producer boundary, а не HTML allowlist renderer.
175
+ Sanitized HAST не передаётся в `SRichDocument` напрямую. Legacy-теги получают
176
+ указанный semantic owner; произвольные HTML attributes и визуальные свойства
177
+ не становятся полями AST.
178
+
179
+ The table defines an explicit producer projection, not a raw HTML renderer.
180
+ Sanitized HAST is projected to the closed types; visual attributes, arbitrary
181
+ attributes, and unsupported structure are not passed through.
182
+
183
+ | Sanitized tag | Типизированное представление |
184
+ | --- | --- |
185
+ | `a` | `link`; local fragment → `anchorLink`; standalone ID target → metadata `anchorId` или `anchorTarget`; GFM footnote → explicit footnote node |
186
+ | `b` | `attention` → `b`, без семантики strong importance |
187
+ | `blockquote` | `quote`, optional `cite`, block children |
188
+ | `br` | `hardBreak` внутри inline content |
189
+ | `code` | `inlineCode`; внутри `pre` — содержимое `codeBlock` |
190
+ | `dd` | `definitionList.entries[].descriptions[]`, block children и metadata |
191
+ | `del` | `deletion`, optional `cite`/`dateTime` |
192
+ | `details` | `disclosure`, `summary`, optional `summaryChildren`/`open`, block children |
193
+ | `div` | `blockGroup` с block children |
194
+ | `dl` | `definitionList` с `entries` |
195
+ | `dt` | `definitionList.entries[].terms[]`, inline children и metadata |
196
+ | `em` | `emphasis` |
197
+ | `h1` | `heading`, `level: 1` |
198
+ | `h2` | `heading`, `level: 2`; explicit sanitized assistive semantics → `presentation: 'assistive'` |
199
+ | `h3` | `heading`, `level: 3` |
200
+ | `h4` | `heading`, `level: 4` |
201
+ | `h5` | `heading`, `level: 5` |
202
+ | `h6` | `heading`, `level: 6` |
203
+ | `hr` | `divider` |
204
+ | `i` | `idiomatic` → `i`, без семантики emphasis |
205
+ | `img` | `inlineImage` в phrasing content; `image` в block content; resource admission обязателен |
206
+ | `input` | Только disabled checkbox: `inlineCheckbox` или task `listItem.checked`, с доступной меткой |
207
+ | `ins` | `insertion`, optional `cite`/`dateTime` |
208
+ | `kbd` | `keyboard` с `value` **либо** inline `children`, в том числе вложенными `keyboard` |
209
+ | `li` | `listItem`; optional `value` только внутри ordered list |
210
+ | `ol` | `list`, `ordered: true`, optional `start` |
211
+ | `p` | `paragraph` с inline children |
212
+ | `picture` | `inlineImage` или `image` с `pictureSources` и base `resourceId` |
213
+ | `pre` | `codeBlock`, код как строка; optional language/label/line numbers |
214
+ | `q` | `quotation`, optional `cite`, inline children |
215
+ | `rp` | `rubyFallback`, только прямой child `ruby` |
216
+ | `rt` | `rubyText`, только прямой child `ruby` |
217
+ | `ruby` | `ruby`, последовательность inline base/`rubyText`/`rubyFallback` |
218
+ | `s` | `strikethrough` → `s`, не deletion/edit |
219
+ | `samp` | `sample` |
220
+ | `section` | `section` с block children; GFM footnote section сохраняет label `heading` и explicit `footnoteDefinition` nodes |
221
+ | `source` | `pictureSources[]`, только admitted typed candidate IDs |
222
+ | `span` | `inlineGroup`; math-inline marker → `mathInline` с source строкой |
223
+ | `strike` | `strikethrough` → `s` по явному producer projection contract |
224
+ | `strong` | `strong` |
225
+ | `sub` | `subscript` |
226
+ | `summary` | `disclosure.summary` + optional rich `summaryChildren`; отдельный root-node не принимается |
227
+ | `sup` | `superscript`; footnote markup → explicit `footnoteReference` |
228
+ | `table` | `table` для прямоугольной модели или `semanticTable` для структуры/объединений |
229
+ | `tbody` | `semanticTable.body`, optional `bodyMetadata` |
230
+ | `td` | `semanticTable` cell `type: 'data'` |
231
+ | `tfoot` | `semanticTable.foot`, optional `footMetadata` |
232
+ | `th` | `semanticTable` cell `type: 'header'`; rich column header в прямоугольной модели |
233
+ | `thead` | `semanticTable.head`, optional `headMetadata` |
234
+ | `tr` | Row со своим `cells` и semantic metadata |
235
+ | `tt` | `monospace` → `code` DOM owner, без obsolete `tt` |
236
+ | `ul` | `list`, `ordered: false` |
237
+ | `var` | `variable` |
238
+
239
+ `tt` и `strike` относятся к
240
+ [obsolete HTML features](https://html.spec.whatwg.org/multipage/obsolete.html#non-conforming-features).
241
+ Проекция сохраняет явно выбранную семантику кита, а не воспроизводит obsolete
242
+ HTML. Для исходника с иной доменной семантикой producer выбирает подходящий
243
+ typed node до сериализации; downstream renderer не угадывает намерение.
244
+
245
+ `attention`/`strong`, `idiomatic`/`emphasis`, `strikethrough`/`deletion` —
246
+ отдельные типы с отдельными native semantic owners. Типография принадлежит
247
+ киту, но визуальное сходство не заменяет значение HTML-элемента.
248
+
249
+ ## Представление заголовка / Heading presentation
250
+
251
+ `heading.presentation` принимает `visible | assistive`; отсутствие поля
252
+ означает `visible`. Тип экспортируется как `SRichHeadingPresentation`.
253
+ `assistive` визуально скрывает сам native `h1`–`h6` вне normal flow: heading не
254
+ создаёт строку или дополнительный gap в document/section/group layout. Уровень,
255
+ phrasing content, `anchorId`, naming и description metadata сохраняются.
256
+ `hidden`, `aria-hidden` и `display: none` для этого режима не применяются.
257
+
258
+ Скрытый heading не содержит `link`, `anchorLink`, `footnoteReference`,
259
+ `footnoteBacklink` или `inlineCheckbox`, в том числе внутри formatting/ruby.
260
+ Нарушение даёт `invalid_structure` по пути конкретного потомка. Неизвестное
261
+ значение presentation даёт `invalid_value` по `.presentation`. Passive semantic
262
+ anchors и heading anchor сохраняют programmatic `tabindex=-1`, без Tab stop;
263
+ явный `anchorLink` переводит фокус на локальный heading, следующая Tab продолжает
264
+ native focus order. Native `th` content restrictions действуют независимо от
265
+ presentation.
266
+
267
+ A heading defaults to `visible`. The `assistive` presentation preserves its
268
+ native level, content and scoped metadata without consuming a normal-flow row
269
+ or layout gap. Interactive descendants are rejected recursively at their exact
270
+ source path; programmatic semantic anchors remain available without adding Tab
271
+ stops. The native table-header content model is unchanged.
272
+
273
+ GFM producer проецирует admitted `h2#footnote-label` с семантикой `sr-only` в
274
+ `heading` с `level: 2`, `presentation: 'assistive'` и точным sanitized
275
+ `anchorId`. `section[data-footnotes]` сохраняет этот heading вместе с
276
+ definitions; references сохраняют `describedBy` на тот же logical ID.
277
+ Sanitizer prefix, текст и уровень не угадываются и не переписываются.
278
+ Произвольный `className` не входит в AST: semantic mapping выполняется явно на
279
+ producer boundary. Удаление label или `describedBy` не является преобразованием
280
+ этого профиля.
281
+ Default GFM footer не объявляет имя section: producer не добавляет ей
282
+ `labelledBy` только из-за наличия hidden heading. Явные section naming fields
283
+ сохраняются, если они присутствуют в source contract.
284
+
285
+ ```ts
286
+ const footnoteLabel = {
287
+ type: 'heading',
288
+ level: 2,
289
+ presentation: 'assistive',
290
+ anchorId: 'user-content-footnote-label',
291
+ children: [{ type: 'text', value: 'Footnotes' }],
292
+ } as const
293
+ ```
294
+
295
+ A GFM projection retains its sanitized footnote-label heading, definitions and
296
+ reference `describedBy` relationships. It maps admitted assistive semantics
297
+ explicitly rather than forwarding raw CSS classes, dropping labels or changing
298
+ sanitizer identities.
299
+ The default GFM footer does not name its section. Section naming is preserved
300
+ only when declared by the source; it is not inferred from the hidden heading.
301
+ The [GFM footer implementation](https://github.com/syntax-tree/mdast-util-to-hast/blob/13.2.1/lib/footer.js)
302
+ declares the heading, while the [reference implementation](https://github.com/syntax-tree/mdast-util-to-hast/blob/13.2.1/lib/handlers/footnote-reference.js)
303
+ declares its description relationship.
304
+
305
+ ## Metadata, anchors и сноски / Metadata and local navigation
306
+
307
+ `SRichSemanticMetadata` содержит только `anchorId`, `title`, `lang`, `direction`,
308
+ `accessibleLabel`, `labelledBy`, `describedBy`. `lang` — well-formed BCP47 tag,
309
+ `direction` — `ltr | rtl | auto`. Accessibility references — массивы logical
310
+ anchor IDs того же документа. `class`, `style`, DOM `id`, `tabindex`, handlers,
311
+ произвольные ARIA/HTML attrs не принимаются. Plain `text` и `hardBreak` не имеют
312
+ semantic metadata.
313
+
314
+ Metadata naming соответствует native semantics, а не применяется ко всем
315
+ элементам одинаково. `SRichPassiveMetadata` запрещает `accessibleLabel` и
316
+ `labelledBy`, сохраняя `anchorId`, `title`, `lang`, `direction`, `describedBy`.
317
+
318
+ | Metadata owner | Допустимые naming fields |
319
+ | --- | --- |
320
+ | `strong`, `emphasis`, `attention`, `idiomatic`, `deletion`, `strikethrough`, `insertion`, `quotation`, `sample`, `monospace`, `variable`, `keyboard`, `superscript`, `subscript`, `inlineCode`, `inlineGroup`, `anchorTarget`, `rubyText`, `rubyFallback`, `paragraph`, `blockGroup` | Passive metadata: без `accessibleLabel`/`labelledBy` |
321
+ | `mathInline`, `mathBlock`, `codeBlock`, `callout`, `resource`, `action`, `inlineCheckbox` | Passive wrapper metadata; собственные canonical `label`/`title` fields и control names принадлежат owner API |
322
+ | `ruby`, `link`, `anchorLink`, `footnoteReference`, `footnoteBacklink`, `inlineImage`, `image`, `heading`, `list`, `listItem`, `quote`, `disclosure`, `footnoteDefinition`, `section`, `divider`, `table`, `semanticTable`, table row/cell/row-group metadata, definition list/term/description, `actionGroup` | Semantic metadata с `accessibleLabel`/`labelledBy`; owner сохраняет соответствующую native/group семантику |
323
+ | `text`, `hardBreak` | Metadata отсутствует |
324
+
325
+ Программная focus target identity (`tabindex=-1` внутри owner) не добавляет
326
+ остановку последовательной Tab-навигации. Она не разрешает naming там, где
327
+ семантика HTML запрещает accessible name.
328
+
329
+ Одновременные `accessibleLabel` и `labelledBy` сохраняются на допустимом native
330
+ owner: `aria-labelledby` имеет стандартный приоритет над `aria-label` при
331
+ вычислении доступного имени. / Both explicit naming attributes are preserved;
332
+ the browser applies native `aria-labelledby` precedence over `aria-label`.
333
+
334
+ Metadata is closed and follows native naming rules. Passive owners reject
335
+ accessible-label/labelled-by metadata; canonical control labels remain in their
336
+ own API. Accessibility references resolve inside the same document. Consumers
337
+ do not supply DOM IDs, classes, styles, tab stops, or handlers through nodes.
338
+
339
+ Текстовый контент и доступное имя имеют разные контракты. Пустые `text`,
340
+ paragraph, inline code и пустые ordered/unordered lists сохраняются как
341
+ допустимая семантика документа. Canonical `summary`, column `header`, table и
342
+ action-group `label`, action/resource/footnote/checkbox labels содержат хотя бы
343
+ один непробельный символ. Optional naming fields проверяются по тому же правилу
344
+ при наличии; валидатор сохраняет строку, а не обрезает её.
345
+
346
+ `link` и `anchorLink` требуют объявленный источник имени: `accessibleLabel`,
347
+ `labelledBy`, непустой `title` либо читаемый phrasing content. Image-only link
348
+ получает имя из `alt` admitted image resource; этот инвариант проверяет
349
+ `validateRichDocumentModel(document, resources)`, поскольку отдельный document
350
+ не содержит resource descriptors. Structural acceptance не заменяет проверку
351
+ итогового accessible name в браузере.
352
+
353
+ Empty content is valid where native document semantics permits it. Control,
354
+ summary and table labels must contain non-whitespace content. Links require a
355
+ declared naming source; image-only link names are checked against admitted alt
356
+ text at the complete model boundary. The validator preserves strings and does
357
+ not emulate the browser's accessible-name computation.
358
+
359
+ Идентификаторы anchors/occurrences сохраняют точный Unicode, без case folding,
360
+ slugification, trim или удаления sanitizer prefix. Пробелы, control characters
361
+ и malformed surrogate pairs запрещены; unknown/duplicate targets дают ошибку
362
+ по точному source path. Anchor IDs имеют предел 256 символов, footnote IDs —
363
+ 128. Producer задаёт identity явно: heading text не используется для её
364
+ угадывания.
365
+
366
+ `anchorLink.anchorId` ссылается на объявленный metadata anchor или
367
+ `anchorTarget`. HTML-fragment producer декодирует и сопоставляет в своей
368
+ serialization boundary; renderer получает уже точный logical ID, не raw hash.
369
+ Application URL и fragment navigation — разные typed nodes.
370
+
371
+ Renderer создаёт injective, mount-scoped DOM IDs, включая две копии документа
372
+ с одинаковым `document.id`. Локальный переход раскрывает закрытые ancestor
373
+ `details`, прокручивает цель и передаёт ей фокус. Следующая `Tab` продолжает
374
+ порядок фокуса от цели. `location.hash`, URL и browser history не меняются.
375
+
376
+ The renderer owns mount-scoped DOM identities. Navigation reveals closed
377
+ ancestor disclosures, scrolls and focuses the target, and preserves the URL,
378
+ hash, and browser history. Identical documents mounted together remain isolated.
379
+
380
+ `footnoteReference` и `footnoteBacklink` адресуют пару `id` + `occurrenceId`.
381
+ Для единственного reference `occurrenceId` можно опустить; для повторных
382
+ references producer задаёт уникальные occurrence IDs. Definition объявляется
383
+ один раз на `id`, а backlink выбирает конкретный reference occurrence. Метки
384
+ `label` обязательны, визуальный `marker` необязателен.
385
+
386
+ ```ts
387
+ const repeatedNotes = {
388
+ version: 1,
389
+ id: 'notes',
390
+ nodes: [
391
+ { type: 'heading', level: 2, anchorId: 'Раздел_日本', children: [{ type: 'text', value: 'Details' }] },
392
+ { type: 'paragraph', children: [
393
+ { type: 'anchorLink', anchorId: 'Раздел_日本', children: [{ type: 'text', value: 'Open details' }] },
394
+ { type: 'footnoteReference', id: 'Примечание', occurrenceId: 'first', label: 'First note reference', marker: '1' },
395
+ { type: 'footnoteReference', id: 'Примечание', occurrenceId: 'second', label: 'Second note reference', marker: '1' },
396
+ ] },
397
+ { type: 'footnoteDefinition', id: 'Примечание', label: 'Note', children: [
398
+ { type: 'paragraph', children: [
399
+ { type: 'text', value: 'Note content. ' },
400
+ { type: 'footnoteBacklink', id: 'Примечание', occurrenceId: 'second', label: 'Return to second reference' },
401
+ ] },
402
+ ] },
403
+ ],
404
+ } as const satisfies SRichDocumentV1
405
+ ```
406
+
407
+ ## Таблицы / Tables
408
+
409
+ `table` задаёт прямоугольную модель: непустые `columns`, стабильные column/row
410
+ IDs и одинаковое число inline cells в каждой строке. Column `header` —
411
+ обязательная непустая доступная метка. `headerChildren` задаёт rich inline
412
+ presentation, `headerPresentation: 'assistive'` визуально скрывает заголовок,
413
+ `align` принимает `left | center | right`.
414
+
415
+ `semanticTable` задаёт обязательные `label`/`body`, optional `caption` с inline
416
+ children, `head`, `foot` и соответствующие `headMetadata`, `bodyMetadata`,
417
+ `footMetadata`. Optional `columnGroups: readonly { span: number }[]` объявляет
418
+ native column groups, чья суммарная ширина равна ширине полной сетки; `scope:
419
+ 'colgroup'` ссылается на диапазон объявленной группы. Row содержит `cells` и
420
+ metadata. Cell имеет:
421
+
422
+ - `type: 'header' | 'data'`;
423
+ - `content: 'inline' | 'block'` и соответствующий union `children`;
424
+ - optional `cellId`, `headers`, `rowSpan`, `colSpan`, `align` и metadata;
425
+ - `scope: 'row' | 'col' | 'rowgroup' | 'colgroup'` только у header cell.
426
+
427
+ `cellId` уникален в своей таблице. `headers` ссылается только на другие header
428
+ cells той же таблицы, а не на произвольные DOM IDs. Header content соблюдает
429
+ HTML-модель `th`: без heading/sectioning/header/footer descendants. Ограничение
430
+ рекурсивно включает `footnoteDefinition`, создающий named note, и neutral callout
431
+ с `title`, чей shared owner создаёт heading. Block data cells сохраняют
432
+ paragraph/list и другие допустимые block nodes.
433
+
434
+ Каждая row group образует полную прямоугольную сетку, ширина групп совпадает.
435
+ Spans не пересекаются; `rowSpan: 0` означает остаток текущей row group,
436
+ положительный `rowSpan` не выходит за её границы. `colSpan` — 1..100.
437
+ Некорректная сетка и missing header references отвергаются до DOM. Table,
438
+ sections, rows и cells используют общие semantic owners со `STable`; rich
439
+ document table не становится интерактивным data-grid и не добавляет row tab
440
+ stops.
441
+
442
+ The rectangular model supports rich/assistive column headers. The structural
443
+ model preserves head/body/foot groups, captions, row headers, explicit header
444
+ relations, spans, alignment, and inline/block cell content. Invalid grids,
445
+ cross-table references, and unsupported header descendants fail before render.
446
+
447
+ ## Изображения и admission / Images and admission
448
+
449
+ `inlineImage` — phrasing content: отображается внутри paragraph/link/summary
450
+ без block `figure`. `image` — block content с optional inline `caption`.
451
+ Оба используют общий image presentation owner и `resourceId`, а не `src`.
452
+ Image resource содержит `id`, `kind: 'image'`, `url`, `alt` и optional `title`.
453
+ Пустой `alt` означает декоративное изображение.
454
+
455
+ `candidates` задаёт responsive набор resource IDs. Каждый candidate имеет
456
+ ровно один descriptor: положительный safe integer `width` либо положительный
457
+ finite `density`. Набор не смешивает descriptor families, значения уникальны.
458
+ `pictureSources` содержит optional `media` и отдельный `candidates` набор.
459
+ Каждый base/candidate/source resource должен существовать и иметь `kind:
460
+ 'image'`. Raw `srcset`, `src`, HTML source strings и callbacks запрещены.
461
+
462
+ Raster data URL принимает canonical `data:image/<format>;base64,...`, где
463
+ `<format>` — только `png`, `jpeg`, `gif`, `webp` или `avif`, без дополнительных
464
+ parameters. Base64 и format signature должны
465
+ соответствовать заявленному MIME. SVG/HTML data, MIME mismatch и malformed data
466
+ отвергаются. Эта проверка admission не является полным декодером raster файла;
467
+ декодирование и выбор responsive source выполняет браузер.
468
+
469
+ Inline and block images resolve separately admitted resource IDs. Every
470
+ responsive candidate is validated, including picture-source branches. Raster
471
+ data admission verifies MIME, canonical base64, and format signatures; it does
472
+ not accept SVG or HTML payloads and is not a complete image decoder.
473
+
474
+ **Producer владеет network admission.** URL protocol validation не заменяет
475
+ origin/permissions policy. В privacy-preserving Markdown projection локальные
476
+ same-origin/blob/raster resources объявляются в `resources`; внешний media URL
477
+ представляется обычным controlled `link`, если его загрузка не разрешена.
478
+ Renderer не делает скрытое преобразование внешнего image в link: такое решение
479
+ принимается явно до AST serialization. Admitted image URL создаёт browser image
480
+ load; обычные link/resource intents не создают загрузку до consumer action.
481
+ Candidate URL проходит тот же admission, что и base image; добавление raw URL
482
+ через `pictureSources` не является отдельным каналом разрешения.
483
+
484
+ Producers own origin authorization. A declared image resource authorizes the
485
+ browser image load; protocol validation alone is not an origin policy. A
486
+ privacy-preserving producer projects unadmitted external media to controlled
487
+ links explicitly, without hidden renderer substitution or candidate bypasses.
488
+
489
+ ## Rich summary
490
+
491
+ `disclosure.summary` — обязательная текстовая метка. `summaryChildren` задаёт
492
+ rich phrasing content: emphasis, code, keyboard, image и links. Без этого поля
493
+ отображается `summary`. Пассивный summary использует native `details`/`summary`.
494
+ Summary с links или inline control отображается рядом с отдельным SButton
495
+ disclosure toggle; содержимое и порядок rich nodes сохраняются. `Enter`/`Space`
496
+ на toggle переключают секцию, `open` задаёт начальное отображение. Ссылки имеют
497
+ собственный focus и intent, не являются потомками toggle и не переключают секцию.
498
+ Локальная anchor navigation раскрывает оба вида disclosure ancestors.
499
+
500
+ Passive summaries use native details/summary. Interactive rich summaries use a
501
+ separate native button owner beside the complete rich content, preserving link
502
+ focus and activation without nested interactive elements. The toggle exposes
503
+ aria-expanded/aria-controls; local navigation reveals native and composed owners.
504
+ Footnote definitions expose named note semantics, not page navigation landmarks.
505
+
161
506
  ## Controlled intents
162
507
 
163
508
  Ссылки, resources и actions не выполняют application effects. Компонент эмитит
@@ -219,6 +564,78 @@ SSR renders stable safe fallbacks for code and math. After mount, the client
219
564
  runtime replaces them with highlighted code and rendered math. The package uses
220
565
  no CDN and runs no document parser inside the main-thread component.
221
566
 
567
+ ## Worker snapshots и producer migration
568
+
569
+ Markdown parsing, `rehypeRaw`, sanitizer и HAST projection принадлежат
570
+ consumer worker. Main thread принимает сериализованный typed AST/resources,
571
+ проверяет `validateRichDocumentModel` и отображает результат. UI-kit не
572
+ включает Markdown parser в renderer и не принимает HAST, HTML или VNodes как
573
+ альтернативный вход. JSON text и structured-clone payloads используют один
574
+ контракт данных.
575
+
576
+ Parsing, sanitation, and HAST projection belong to the consumer worker. The
577
+ main thread receives and validates the serialized typed document/resources;
578
+ it does not rerun the document parser or mount sanitized HAST directly.
579
+
580
+ Producer выполняет проекцию законченного документа или согласованного
581
+ streaming snapshot целиком: forward anchors, footnote definitions и resource
582
+ references должны быть доступны в том же model. Неполная ссылка не становится
583
+ угадываемым target. Для streamed append immutable replacement сохраняет
584
+ порядок и содержимое существующего prefix и добавляет nodes в конец; renderer
585
+ сохраняет mounted prefix, focus и пользовательское раскрытие существующих
586
+ `details`. Изменения и переупорядочение содержимого — отдельные snapshots, не
587
+ implicit patch protocol.
588
+
589
+ Worker scheduling, cancellation и отбрасывание результатов отменённых jobs
590
+ принадлежат типизированному application job contract. Ошибка worker/parser/
591
+ projection/validation должна попадать в управляемое error state с диагностикой;
592
+ пустой документ, пропуск неизвестного tag, invalid resource или неприменённая
593
+ новая версия не служат silent fallback. Валидатор создаёт frozen result; он не
594
+ мутирует входной snapshot.
595
+
596
+ The application owns worker scheduling and cancellation. Complete snapshots
597
+ must resolve forward references. Immutable append preserves the unchanged
598
+ mounted prefix and its focus/disclosure state. Worker and contract errors are
599
+ explicit error states, not empty-document or dropped-node fallbacks.
600
+
601
+ Граница миграции existing producer adapter:
602
+
603
+ 1. Сохранить worker parser/sanitizer и текущую origin/media admission policy.
604
+ 2. Преобразовать каждый admitted tag по таблице profile, с точными metadata,
605
+ heading/HTML anchors и repeated footnote identities. Unknown или
606
+ непредставимая семантика даёт явную source-coordinate ошибку.
607
+ GFM footnote section сохраняет assistive label heading и reference
608
+ `describedBy`, включая точный sanitizer prefix.
609
+ 3. Разделить inline/block image context. Все responsive candidates пройти
610
+ через тот же admission; не копировать raw `srcset` в AST.
611
+ 4. Прямоугольные таблицы описать `table`; rich headers передать через
612
+ `headerChildren`. Row groups, spans, row headers и block cells описать
613
+ `semanticTable`, без consumer table markup/CSS.
614
+ 5. Rich summary передать как `summaryChildren` и сохранить `summary` как
615
+ доступную текстовую метку. Обычные ссылки оставить controlled intents,
616
+ local fragments — `anchorLink`.
617
+ 6. Валидировать document/resources совместно, передавать immutable snapshots,
618
+ обрабатывать точные ошибки и typed intents на application boundary.
619
+ 7. Проверить реальные consumer документы: две одинаковые копии, Unicode IDs,
620
+ повторные сноски, закрытые nested sections, keyboard summary/link,
621
+ responsive local resources, streaming focus, SSR/hydration, обе темы и
622
+ узкий viewport.
623
+
624
+ Migration keeps the producer's worker and admission owners. Project explicitly
625
+ to typed semantic families; preserve exact identities, separate image context,
626
+ use structural tables where required, validate complete immutable models, and
627
+ verify the real consumer scenarios rather than a raw-HTML compatibility path.
628
+
629
+ ## Пределы / Limits
630
+
631
+ `S_RICH_DOCUMENT_MAX_NODES` — 10 000 структурных узлов документа,
632
+ `S_RICH_DOCUMENT_MAX_DEPTH` — 32,
633
+ `S_RICH_DOCUMENT_MAX_TEXT_LENGTH` — 1 048 576 символов. Таблица имеет максимум
634
+ 100 колонок. Nested implicit structures — cells, rows, definition members,
635
+ picture sources и column groups — входят в document budget; массивы и strings
636
+ имеют дополнительные field-level bounds. Превышение даёт `limit_exceeded` с
637
+ точным path; документ не обрезается.
638
+
222
639
  ## Версионирование / Versioning
223
640
 
224
641
  `version` является частью persisted/transport contract. Не добавляйте
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pgcorp/ui-kit",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Typed Vue 3 design system with accessible components, semantic themes, and workbench patterns.",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -176,6 +176,9 @@
176
176
  "shared/containers/SModal.vue": [
177
177
  "dist/src/components/shared/containers/SModal.vue.d.ts"
178
178
  ],
179
+ "shared/containers/SOverlayHost.vue": [
180
+ "dist/src/components/shared/containers/SOverlayHost.vue.d.ts"
181
+ ],
179
182
  "shared/containers/SPageHeader.vue": [
180
183
  "dist/src/components/shared/containers/SPageHeader.vue.d.ts"
181
184
  ],
@@ -582,7 +585,7 @@
582
585
  "import": "./dist/src/components/layout/types.js",
583
586
  "default": "./dist/src/components/layout/types.js"
584
587
  },
585
- "./reference.css": "./src/styles/reference.css",
588
+ "./reference.css": "./dist/reference.css",
586
589
  "./shared/codeLanguages": {
587
590
  "types": "./dist/src/components/shared/codeLanguages.d.ts",
588
591
  "import": "./dist/src/components/shared/codeLanguages.js",
@@ -673,6 +676,11 @@
673
676
  "import": "./dist/src/components/shared/containers/SModal.vue.js",
674
677
  "default": "./dist/src/components/shared/containers/SModal.vue.js"
675
678
  },
679
+ "./shared/containers/SOverlayHost.vue": {
680
+ "types": "./dist/src/components/shared/containers/SOverlayHost.vue.d.ts",
681
+ "import": "./dist/src/components/shared/containers/SOverlayHost.vue.js",
682
+ "default": "./dist/src/components/shared/containers/SOverlayHost.vue.js"
683
+ },
676
684
  "./shared/containers/SPageHeader.vue": {
677
685
  "types": "./dist/src/components/shared/containers/SPageHeader.vue.d.ts",
678
686
  "import": "./dist/src/components/shared/containers/SPageHeader.vue.js",
@@ -1159,7 +1167,7 @@
1159
1167
  "default": "./dist/src/stores/useNotifierStore.js"
1160
1168
  },
1161
1169
  "./style.css": "./src/styles/style.css",
1162
- "./tailwind.css": "./src/styles/tailwind.css",
1170
+ "./tailwind.css": "./dist/tailwind.css",
1163
1171
  "./theme": {
1164
1172
  "types": "./dist/src/theme.d.ts",
1165
1173
  "import": "./dist/src/theme.js",
@@ -1194,7 +1202,6 @@
1194
1202
  "highlight.js": "^11.12.0",
1195
1203
  "katex": "0.18.7",
1196
1204
  "@lucide/vue": "^1.47.0",
1197
- "@tailwindcss/typography": "^0.5.20",
1198
1205
  "marked": "^18.0.13",
1199
1206
  "sigma": "^3.0.3",
1200
1207
  "tailwindcss": "^4.3.3",
@@ -1204,6 +1211,7 @@
1204
1211
  "devDependencies": {
1205
1212
  "@storybook/vue3-vite": "10.6.0",
1206
1213
  "@tailwindcss/postcss": "^4.3.3",
1214
+ "@tailwindcss/typography": "0.5.20",
1207
1215
  "@types/node": "^22.20.4",
1208
1216
  "@vitejs/plugin-vue": "^6.0.9",
1209
1217
  "@vitest/coverage-v8": "^5.0.1",