@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
package/README.md CHANGED
@@ -23,6 +23,80 @@ complete workbench interfaces.**
23
23
  - Только явные package exports: wildcard и private source imports отсутствуют.
24
24
  Explicit package exports only, with no wildcards or private source imports.
25
25
 
26
+ ### Полные option-каталоги / Complete option catalogs
27
+
28
+ `SListbox.virtualization` задаёт measured viewport над полным набором `options`:
29
+ `{ viewportHeight, estimatedItemHeight, overscan? }`. Keyboard navigation, groups,
30
+ clear, disabled и multiple selection работают по всему каталогу. Для external
31
+ focus owner событие `active-descendant-change` передаёт ID смонтированной option
32
+ в `STextarea.suggestions`. Полный контракт и примеры включены в пакет: `docs/listbox.md`.
33
+
34
+ `SListbox.virtualization` provides a measured viewport over the complete option
35
+ catalog. Keyboard navigation and selection use the full inventory; the
36
+ `active-descendant-change` event supplies a mounted option ID to an external
37
+ focus owner. The package includes the complete contract and examples in `docs/listbox.md`.
38
+
39
+ ### Измеряемый прогресс / Measured progress
40
+
41
+ `SProgressBar` использует один numerical/accessibility owner для `shape="linear"`
42
+ и `shape="circular"`. Линейная форма является default. Круговая форма имеет
43
+ размеры `xs/sm/md = 24/28/32 px` и требует явный `value` от 0 до 100 в
44
+ `mode="determinate"`. `showValue` выводит округлённое число в центре;
45
+ `aria-valuenow` сохраняет точное значение, включая дробную часть.
46
+ `valueText` передаёт доступное предметное описание, например tokens/limit.
47
+ Существующий scoped default slot форматирует только linear label и получает
48
+ точный `value`; circular label принадлежит владельцу и отклоняет default slot.
49
+
50
+ `accuracy="estimated"` требует `valueText` и показывает приблизительность.
51
+ `mode="unknown"` требует `valueText`, не принимает `value` и не сообщает
52
+ `aria-valuenow`. Эти состояния статичны. `mode="indeterminate"` обозначает
53
+ выполняющуюся операцию, не принимает `showValue` и учитывает reduced motion.
54
+ `severity` управляет semantic palette, а не выводится из процента автоматически.
55
+
56
+ ```vue
57
+ <SProgressBar
58
+ :accessibility="{ mode: 'label', label: 'Заполнение контекста' }"
59
+ shape="circular"
60
+ size="md"
61
+ :value="37.5"
62
+ value-text="37 500 из 100 000 токенов"
63
+ show-value
64
+ severity="info"
65
+ />
66
+ <SProgressBar
67
+ :accessibility="{ mode: 'label', label: 'Заполнение контекста' }"
68
+ shape="circular"
69
+ mode="unknown"
70
+ value-text="Размер контекста недоступен"
71
+ show-value
72
+ />
73
+ ```
74
+
75
+ Для действия показатель помещается в default slot `SButton` с
76
+ `iconOnly`, `shape="circle"`, `size="lg"`, `density="default"` и
77
+ `appearance="ghost"`: штатная
78
+ контрольная область равна **48×48 px**, то есть не меньше 44 px. Внутренний
79
+ показатель использует `accessibility.mode="decorative"`; действие, доступное
80
+ имя с точным значением и tooltip bindings принадлежат внешней кнопке.
81
+ Показатель не создаёт вложенный control или дополнительную остановку Tab.
82
+
83
+ `SProgressBar` shares numerical and accessibility ownership across linear and
84
+ circular shapes. Circular `xs/sm/md` sizes are 24/28/32 px. Determinate circular
85
+ progress requires an explicit value in 0–100; central display rounds the
86
+ percentage while `aria-valuenow` retains its exact precision. `valueText`
87
+ supplies a domain description such as tokens/limit. Estimated progress requires
88
+ `valueText` and a visible approximation marker. Explicit unknown progress
89
+ requires `valueText`, rejects `value`, omits `aria-valuenow`, and remains static.
90
+ Severity is consumer-selected rather than inferred from a percentage. The
91
+ existing scoped default slot formats linear labels and receives the exact
92
+ value. Circular labels are owner-controlled and reject a supplied default slot.
93
+
94
+ For an actionable indicator, place decorative progress in the default slot of
95
+ a circular `SButton` with `iconOnly`, `size="lg"`, default density, and
96
+ `appearance="ghost"`: its target is
97
+ 48×48 px, not exactly 44 px. The inner progress is decorative; the button owns
98
+ focus, the action, the accessible name, and tooltip bindings.
99
+
26
100
  ## Установка / Installation
27
101
 
28
102
  ```bash
@@ -45,6 +119,23 @@ npm install @pgcorp/ui-kit @vue/devtools-api vue pinia vue-router
45
119
  `vue`, `pinia`, `@vue/devtools-api`, and `vue-router` are peer dependencies. The consumer application
46
120
  owns their single runtime instances.
47
121
 
122
+ Tailwind/PostCSS принадлежат build-контуру приложения и объявляются его прямыми
123
+ dev dependencies. / Tailwind/PostCSS belong to the application's build pipeline
124
+ and must be declared as its direct dev dependencies.
125
+
126
+ ```bash
127
+ npm install -D tailwindcss@^4.3.3 @tailwindcss/postcss@^4.3.3 postcss@^8.5.28
128
+ ```
129
+
130
+ `postcss.config.mjs`:
131
+
132
+ ```js
133
+ export default { plugins: { '@tailwindcss/postcss': {} } }
134
+ ```
135
+
136
+ Контракт установки: [Tailwind CSS с PostCSS](https://tailwindcss.com/docs/installation/using-postcss).
137
+ / Setup contract: [Tailwind CSS with PostCSS](https://tailwindcss.com/docs/installation/using-postcss).
138
+
48
139
  ## Быстрый старт / Quick start
49
140
 
50
141
  Создайте корневой CSS entrypoint приложения. Интеграционный stylesheet подключает
@@ -177,6 +268,16 @@ link/resource/action effects возвращаются как typed intents. Link
177
268
  `current: true` выражает текущее назначение через `aria-current="page"`.
178
269
  Task lists, deletion, `keyboard`, sup/sub, disclosure и scoped footnotes имеют
179
270
  собственные serializable nodes; raw markup для этих семантик не требуется.
271
+ Типизированный semantic profile включает hard breaks, inline/picture media,
272
+ rich summary/header content, definitions, ruby и структурные таблицы с
273
+ header associations, spans и footer. `STable`, `SDataGrid` и rich tables
274
+ используют общих native table owners. Якоря и повторные сноски имеют локальный
275
+ scope, раскрывают целевую секцию и переводят фокус без изменения истории.
276
+ `heading.presentation: 'assistive'` сохраняет нативный уровень, содержимое,
277
+ scoped anchors и IDREFs, визуально скрывая сам heading вне normal flow.
278
+ Значение по умолчанию — `visible`; интерактивные потомки в assistive heading
279
+ отклоняются с точным node path. GFM producer сохраняет скрытый heading сносок
280
+ и его `describedBy` references, не передавая raw `class`.
180
281
 
181
282
  `SRichDocument` renders the closed, versioned `SRichDocumentV1` AST without raw
182
283
  HTML, VNodes, callbacks, or trust flags. External JSON is checked with
@@ -186,6 +287,26 @@ link/resource/action effects are emitted as typed intents. A link node with
186
287
  `current: true` exposes the current destination through `aria-current="page"`.
187
288
  Task lists, deletion, `keyboard`, sup/sub, disclosure, and scoped footnotes use
188
289
  dedicated serializable nodes; these semantics never require raw markup.
290
+ The typed semantic profile includes hard breaks, inline/picture media, rich
291
+ summary/header content, definitions, ruby, and structural tables with header
292
+ associations, spans, and a footer. `STable`, `SDataGrid`, and rich tables share
293
+ native table owners. Anchors and repeated footnotes are scoped locally, reveal
294
+ their target disclosure, and move focus without changing browser history.
295
+ `heading.presentation: 'assistive'` retains the native level, content, scoped
296
+ anchors, and IDREFs while placing the heading outside normal flow. The default
297
+ is `visible`; interactive descendants fail at their exact node path. A GFM
298
+ producer preserves its hidden footnote heading and description references
299
+ without passing raw classes.
300
+
301
+ `SCheckbox presentation="inline"` и `SField contentFlow="phrasing"` сохраняют
302
+ phrasing content model внутри текста. `SLink` предоставляет actual native
303
+ `getElement()`/`focus()` и semantic props `domId`, `language`, `direction`,
304
+ `ariaLabel`, `ariaLabelledby`, `ariaDescribedby`; IDREFs задаются непустыми DOM
305
+ идентификаторами через один ASCII-пробел без автоматического исправления ввода.
306
+ / `SCheckbox presentation="inline"` and `SField contentFlow="phrasing"` preserve
307
+ the phrasing content model inside text. `SLink` exposes the actual native
308
+ `getElement()`/`focus()` and the semantic props listed above; IDREFs are explicit
309
+ non-empty DOM identities separated by one ASCII space, without input repair.
189
310
 
190
311
  ```ts
191
312
  import SRichDocument from '@pgcorp/ui-kit/shared/data-display/SRichDocument.vue'
@@ -521,7 +642,124 @@ reserved for runtime catalog values and intentionally includes the complete
521
642
  registry.
522
643
 
523
644
  ```ts
524
- import { Bell, Cable, GitCompare, PanelLeftOpen } from '@pgcorp/ui-kit/icons'
645
+ import {
646
+ ArrowUpRight, Bell, Cable, CalendarDays, Disc, GitCompare, GitFork,
647
+ ChevronLeft, HardDrive, PanelLeftOpen, Paperclip, Pause, Radio, RotateCw, Usb, Volume2, Zap, ZoomIn, ZoomOut,
648
+ } from '@pgcorp/ui-kit/icons'
649
+ ```
650
+
651
+ `HardDrive`, `Usb` и `Disc` обозначают локальный накопитель, USB-подключение
652
+ и оптический диск; `CalendarDays` — дату, `ArrowUpRight` — переход или открытие.
653
+ `Paperclip` обозначает прикрепление файла, `GitFork` — разветвление разговора;
654
+ `ZoomIn`/`ZoomOut` — изменение масштаба изображения, `RotateCw` — поворот по
655
+ часовой стрелке, `Volume2` — аудио. Поворот против часовой стрелки представлен
656
+ отдельным `RotateCcw`, а не alias для `RotateCw`.
657
+ `Radio` обозначает сетевое вещание или фоновое уведомление, не radio input.
658
+ `Pause` обозначает состояние паузы задачи; `ChevronLeft` — переход влево.
659
+ `Zap` обозначает молнию и подходит для роли быстрой модели. Это primary-only
660
+ силуэт: duotone сохраняет одну цветовую роль, без дополнительного accent.
661
+ Все используют общий icon contract: `iconSetMode` (`classic`, `sputnig`),
662
+ `colorMode` (`auto`, `duotone`, `monochrome`), тему и tree-shakeable ESM exports.
663
+ Внутри control иконка передаётся через его icon slot; размер и состояние
664
+ задаёт control owner.
665
+
666
+ `HardDrive`, `Usb`, and `Disc` represent a local drive, a USB connection, and
667
+ an optical disc; `CalendarDays` represents a date, and `ArrowUpRight` represents
668
+ navigation or opening. All share the icon contract: `iconSetMode` (`classic`, `sputnig`),
669
+ `colorMode` (`auto`, `duotone`, `monochrome`), theme support, and tree-shakeable ESM
670
+ exports. Pass an icon through a control's icon slot; the control owner defines
671
+ its size and state.
672
+
673
+ `Paperclip` represents file attachment and `GitFork` conversation branching.
674
+ `ZoomIn`/`ZoomOut` represent image zoom, `RotateCw` clockwise rotation, and
675
+ `Volume2` audio. Counterclockwise rotation has a distinct `RotateCcw` export;
676
+ the two rotation actions are not aliases.
677
+ `Radio` represents network broadcast or a background notification, not a radio input.
678
+ `Pause` represents a paused task; `ChevronLeft` represents leftward navigation.
679
+ `Zap` represents a lightning bolt and can identify the fast-model role. Its
680
+ primary-only silhouette retains one color role in duotone, without an accent shape.
681
+
682
+ ```vue
683
+ <SButton label="Выбрать локальный накопитель">
684
+ <template #leading-icon><HardDrive /></template>
685
+ </SButton>
686
+ ```
687
+
688
+ ### Скачивание через ссылку / Native link downloads
689
+
690
+ `SButton` и `SLink` поддерживают typed `download?: string | boolean` только в
691
+ `href`-режиме. Filename передаётся native anchor буквально; `true`/`""` оставляют
692
+ выбор имени браузеру, `false` не создаёт download attribute. Router `to` и action
693
+ button не принимают этот prop. Consumer владеет полным Blob и object URL;
694
+ ограниченный preview не становится источником скачивания. `SLink.disabled` и
695
+ `SButton.disabled/loading` блокируют activation и удаляют `href`/`download`.
696
+
697
+ `SButton` and `SLink` support typed `download?: string | boolean` in `href` mode
698
+ only. The filename is passed verbatim to the native anchor; `true`/`""` let the
699
+ browser choose it, and `false` omits the attribute. Router `to` and action buttons
700
+ reject this prop. The consumer owns the complete Blob and its object URL; a
701
+ limited preview is not the download source. `SLink.disabled` and
702
+ `SButton.disabled/loading` block activation and remove `href`/`download`.
703
+
704
+ Контракт, Blob lifecycle и ограничения браузера включены в пакет: `docs/link-download.md`.
705
+ The package includes the contract, Blob lifecycle, and browser limitations in `docs/link-download.md`.
706
+
707
+ ### Подсказка на интерактивной поверхности / Tooltip on an interactive surface
708
+
709
+ `SInteractiveSurface` принимает полный combined `trigger` от `STooltip` через
710
+ prop `tooltipTrigger`. Binding относится к primary activation owner: кнопке
711
+ для `surface.mode="action"` или ссылке для `surface.mode="link"`.
712
+ Link surface принимает ровно один target: `href` либо Vue Router `to`.
713
+ Для `to` приложение подключает Vue Router. `accessibleLabel` обязателен
714
+ в обоих интерактивных режимах; static surface не принимает tooltip binding.
715
+ Подсказка открывается по pointer/focus и закрывается через Escape.
716
+ Дополнительные controls передаются в `#actions` и сохраняют собственные
717
+ focus и activation независимо от primary owner.
718
+
719
+ `showDelay` задаёт задержку открытия (120 мс), `hideDelay` — закрытия после
720
+ выхода указателя и фокуса (80 мс). Указатель может переходить с target на
721
+ пассивную панель подсказки: она остаётся видимой, не получает focus и не
722
+ добавляет Tab stop. Escape закрывает открытую панель и отменяет pending
723
+ открытие; pending-подсказка не забирает событие у меню или диалога.
724
+ Blur окна, скрытие документа, disabled и освобождение target отменяют
725
+ таймеры и слушатели. Новый вход указателя или получение фокуса открывает
726
+ подсказку по действующему `showDelay`.
727
+
728
+ `SInteractiveSurface` accepts the complete combined `STooltip` trigger through
729
+ the `tooltipTrigger` prop. The binding belongs to the primary activation owner:
730
+ a button for `surface.mode="action"` or a link for `surface.mode="link"`.
731
+ A link surface accepts exactly one target: `href` or Vue Router `to`.
732
+ The application installs Vue Router when using `to`. `accessibleLabel` is
733
+ required in both interactive modes; a static surface rejects a tooltip binding.
734
+ The tooltip opens on pointer/focus and closes with Escape. Additional controls
735
+ use `#actions` and retain independent focus and activation.
736
+
737
+ `showDelay` controls the opening delay (120ms); `hideDelay` controls closing
738
+ after pointer hover and focus leave (80ms). The pointer can move from the
739
+ target onto the passive tooltip panel: it remains visible, receives no focus,
740
+ and adds no Tab stop. Escape closes the visible panel or cancels a pending
741
+ opening; a pending tooltip does not consume the event from a menu or dialog.
742
+ Window blur, a hidden document, disabled state, and released target identity
743
+ cancel timers and listeners. Fresh pointer entry or acquired focus opens the
744
+ tooltip according to its current `showDelay`.
745
+
746
+ ```vue
747
+ <STooltip text="/workspace/repository" v-slot="{ trigger }">
748
+ <SInteractiveSurface
749
+ :surface="{
750
+ mode: 'link',
751
+ to: '/projects/repository',
752
+ accessibleLabel: 'Открыть проект',
753
+ }"
754
+ :tooltip-trigger="trigger"
755
+ actions-layout="responsive"
756
+ >
757
+ Проект Repository
758
+ <template #actions>
759
+ <SButton label="Параметры проекта" size="sm" />
760
+ </template>
761
+ </SInteractiveSurface>
762
+ </STooltip>
525
763
  ```
526
764
 
527
765
  ### Подсказка на части действия / Tooltip for part of an action
@@ -567,6 +805,81 @@ the multiline textbox with a consumer-owned popup without private attributes.
567
805
  The textarea keeps its native role; `role="combobox"` is not assigned to this
568
806
  HTML element. Pixel bounds belong to the auto-resize contract.
569
807
 
808
+ Слоты `empty-content` и `helper-content` располагаются обычным потоком внутри
809
+ единой field surface. `empty-content` доступен при пустом тексте вне IME
810
+ composition; native input скрывает его до подтверждения `v-model` родителем.
811
+ `helper-content` не зависит от значения. Оба слота получают
812
+ `STextareaContentContext`: `empty`, `disabled`, `readonly`, `invalid`, `composing`,
813
+ `hasMultipleVisualLines` и `focus()`. Действия в слотах создаются через UI-kit controls; их доступность
814
+ задаётся через `disabled`/`readonly` контекста. `focus()` возвращает фокус
815
+ native textarea без изменения selection. `helpText` и `errorMessage` сохраняют
816
+ свой supporting-text contract снаружи surface.
817
+
818
+ При наличии content slots `minHeight`/`maxHeight` ограничивают всю surface:
819
+ textarea, supporting regions, интервалы и внутренние поля. Редактор сохраняет
820
+ место минимум для одной строки; длинный helper прокручивается в своей in-flow
821
+ области, а его keyboard actions доступны Tab. Конфигурация, в которой
822
+ `maxHeight` не вмещает editable line и обязательный surface chrome, отклоняется
823
+ с `RangeError`. `rows` задаёт исходную высоту редактора, `maxRows` ограничивает
824
+ редактируемые строки с учётом присутствующего supporting content. Content slots
825
+ не требуют абсолютного позиционирования, consumer padding или дополнительного
826
+ resize handler. Изменение естественной высоты slot-контента автоматически
827
+ увеличивает или уменьшает surface в заданных пределах; самостоятельно
828
+ обновляемые дочерние компоненты наблюдаются тем же resize owner.
829
+
830
+ The `empty-content` and `helper-content` slots participate in normal flow inside
831
+ the shared field surface. Empty content is visible only for an empty editor
832
+ outside IME composition; native input hides it before a delayed parent model
833
+ acknowledgement. Helper content is independent of the value. Both slots receive
834
+ `STextareaContentContext` with editing-state flags and the native `focus()`
835
+ method. Pixel bounds include the whole surface and preserve at least one
836
+ editable line; oversized supporting content has its own bounded scroll region.
837
+ Intrinsic slot-content changes automatically grow or shrink the surface within
838
+ its bounds, including independently updated child components. Use UI-kit
839
+ controls for slot actions, without consumer overlays, padding or resize calls.
840
+
841
+ `hasMultipleVisualLines` описывает native текст с учётом переносов по текущей
842
+ ширине: `false` — одна визуальная строка, `true` — несколько. `null` означает
843
+ недоступную геометрию: SSR, скрытый editor или нулевую ширину. Пустое значение
844
+ при доступной геометрии занимает одну строку; placeholder не определяет это
845
+ состояние. Измерение обновляется для fixed и auto-resize полей, native ввода до
846
+ подтверждения controlled модели, изменений ширины и типографики. Consumer
847
+ задаёт политику показа helper через slot context, без доступа к private DOM:
848
+
849
+ `hasMultipleVisualLines` describes native text wrapping at the current editor
850
+ width: `false` is one visual line, `true` is multiple lines, and `null` denotes
851
+ unavailable layout during SSR, hidden rendering or zero width. An empty value
852
+ has one editable line once layout is available; placeholder text does not
853
+ determine this state. Fixed and auto-resizing editors update the state for
854
+ native input, delayed model acknowledgement, width and typography changes.
855
+ Helper visibility is an explicit consumer policy expressed through slot state:
856
+
857
+ ```vue
858
+ <STextarea v-model="message" label="Сообщение" :rows="1" auto-resize :min-height="64" :max-height="240">
859
+ <template #helper-content="{ hasMultipleVisualLines, composing, disabled, focus }">
860
+ <SButton
861
+ v-if="hasMultipleVisualLines === false && !composing && !disabled"
862
+ label="Справка по вводу"
863
+ size="sm"
864
+ appearance="text"
865
+ @click="focus()"
866
+ />
867
+ </template>
868
+ </STextarea>
869
+ ```
870
+
871
+ `minLength` и `maxLength` используют тот же строгий native contract, что и
872
+ `SInputText`: принимают неотрицательные safe integers и требуют
873
+ `minLength <= maxLength`. Ограничение применяется к пользовательскому вводу;
874
+ controlled значение не усекается, поэтому серверный текст остаётся видимым и
875
+ может быть исправлен явно.
876
+
877
+ `minLength` and `maxLength` use the same strict native contract as
878
+ `SInputText`: values are non-negative safe integers and require
879
+ `minLength <= maxLength`. The limit applies to user input; the controlled value
880
+ is never truncated, so server-provided text remains visible for explicit
881
+ correction.
882
+
570
883
  ```vue
571
884
  <STextarea
572
885
  ref="composer"
@@ -575,6 +888,7 @@ HTML element. Pixel bounds belong to the auto-resize contract.
575
888
  :auto-resize="true"
576
889
  :min-height="64"
577
890
  :max-height="240"
891
+ :max-length="512"
578
892
  :suggestions="{
579
893
  controls: 'mention-listbox',
580
894
  activeDescendant: activeMentionId,
@@ -584,7 +898,128 @@ HTML element. Pixel bounds belong to the auto-resize contract.
584
898
  @focus="handleFocus"
585
899
  @blur="handleBlur"
586
900
  @paste="handlePaste"
587
- />
901
+ >
902
+ <template #empty-content="{ disabled, readonly, focus }">
903
+ <SButton
904
+ label="Прикрепить файл"
905
+ size="sm"
906
+ appearance="text"
907
+ :disabled="disabled || readonly"
908
+ @click="selectAttachment(); focus()"
909
+ />
910
+ </template>
911
+ <template #helper-content="{ focus }">
912
+ <SButton label="Справка по вводу" size="sm" appearance="text" @click="openInputHelp(); focus()" />
913
+ </template>
914
+ </STextarea>
915
+ ```
916
+
917
+ Контекстное меню native textarea подключается через
918
+ `SContextMenu` slot `textInputTriggerProps`. Он содержит `aria-haspopup="menu"`,
919
+ `aria-controls` смонтированного открытого меню и `onKeydown` для ContextMenu/Shift+F10. Фокус, ввод и
920
+ selection принадлежат `STextarea`; меню владеет pointer/keyboard activation,
921
+ позиционированием, Escape и возвратом фокуса. ArrowUp/Down сохраняют native
922
+ редактирование. IME composition и отменённое keydown не открывают меню.
923
+ Для действий-кнопок используется отдельный `triggerProps` с
924
+ `aria-expanded`: [WAI-ARIA textbox](https://www.w3.org/TR/wai-aria-1.2/#textbox)
925
+ этого состояния не поддерживает. Raw button-oriented `triggerProps` не
926
+ передаётся в textarea, её HTML-роль не заменяется.
927
+
928
+ `triggerProps` открывает контекстное меню через ContextMenu и Shift+F10;
929
+ при `trigger="click"` или `"both"` также доступны ArrowDown/ArrowUp.
930
+ Событие компонента `before-open` синхронно передаёт исходный
931
+ `SContextMenuBeforeOpenEvent = MouseEvent | KeyboardEvent` до перехвата native
932
+ действия, монтажа меню и перемещения фокуса. Обработчик сохраняет точный текст
933
+ выделения и обновляет реактивный `items`. `event.preventDefault()` отменяет
934
+ открытие. Меню применяет текущий список после Vue commit; consumer не вызывает
935
+ `nextTick`, таймер или повторное событие. Отменённое событие, `enabled=false`
936
+ и IME composition не запускают подготовку и не открывают меню. Неактивная
937
+ граница сохраняет native propagation.
938
+
939
+ Подготовленный запрос принадлежит конкретной boundary и вызывающему элементу.
940
+ Повторная активация заменяет его; отключение, удаление вызывающего элемента
941
+ или boundary, unmount и Escape во время подготовки отменяют его без позднего
942
+ открытия и захвата фокуса. Вложенные активные boundaries обрабатывают событие
943
+ только в ближайшем владельце. Позиционирование, выбор действия, Escape и
944
+ возврат фокуса принадлежат общему menu owner.
945
+
946
+ Полный `triggerProps` предназначен для кнопки-триггера. Пассивная область
947
+ `role="group"` получает только поддерживаемую её семантикой `aria-controls`.
948
+ Этот атрибут присутствует только при открытом смонтированном меню;
949
+ `aria-expanded` и `aria-haspopup` кнопки группе не передаются. Boundary кита
950
+ делегирует ContextMenu/Shift+F10 от реально сфокусированного потомка, сохраняя
951
+ его владельцем фокуса. Обычные клавиши редактирования не перехватываются.
952
+ Consumer не добавляет группе native contextmenu/keydown handlers и не меняет
953
+ роль ради открытия меню.
954
+
955
+ ```vue
956
+ <SContextMenu
957
+ :items="selectionActions"
958
+ boundary-layout="contents"
959
+ v-slot="{ triggerProps }"
960
+ @before-open="captureSelection"
961
+ >
962
+ <div
963
+ role="group"
964
+ aria-label="Действия с выделенным текстом"
965
+ tabindex="0"
966
+ :aria-controls="triggerProps['aria-controls']"
967
+ >
968
+ <slot />
969
+ </div>
970
+ </SContextMenu>
971
+ ```
972
+
973
+ ```ts
974
+ import type { SContextMenuBeforeOpenEvent } from '@pgcorp/ui-kit/shared/controls/SContextMenu.vue'
975
+
976
+ function captureSelection(event: SContextMenuBeforeOpenEvent): void {
977
+ const selection = window.getSelection()
978
+ if (!selection) throw new Error('Native selection is unavailable')
979
+ selectedText.value = selection.toString()
980
+ if (!selectedText.value) event.preventDefault()
981
+ }
982
+ ```
983
+
984
+ The synchronous `before-open` component event receives the original admitted
985
+ `MouseEvent | KeyboardEvent` before interception, mounting or menu focus.
986
+ Update reactive items in that handler; `preventDefault()` cancels opening.
987
+ The kit commits current items and owns initial focus, dismissal and request
988
+ cleanup. Disabled, already-cancelled and composing events do not prepare a menu.
989
+ Passive groups bind only the optional mounted-menu `aria-controls` relationship;
990
+ the kit boundary delegates ContextMenu/Shift+F10 from the actual focused
991
+ descendant. No native consumer listeners, fabricated button role or timer are
992
+ required. Full `triggerProps` belongs to a button; `textInputTriggerProps`
993
+ preserves native textbox editing and selection semantics.
994
+
995
+ При сочетании menu и suggestions `suggestions.active` явно выбирает участие
996
+ suggestion popup; default — `true`. Активные suggestions задают
997
+ `aria-haspopup`, `aria-autocomplete` и `aria-activedescendant`. При
998
+ `active=false` `activeDescendant` запрещён, `aria-haspopup` принадлежит
999
+ внешнему context-menu owner. `aria-controls` объединяет проверенные canonical
1000
+ ID обоих owners без потери связи. Native `aria-controls` принимает один DOM ID
1001
+ внешнего popup; `suggestions.controls` — один DOM ID suggestion popup.
1002
+ Кит не определяет активность по DOM, не меняет ID и не создаёт focusable wrapper.
1003
+
1004
+ The `textInputTriggerProps` slot binds a context menu to the native textarea
1005
+ without button-only `aria-expanded` or arrow-key menu activation. ContextMenu
1006
+ and Shift+F10 use the shared menu owner; Escape restores the editing owner's
1007
+ focus and selection. `suggestions.active` explicitly selects the suggestion
1008
+ popup's ARIA participation, while validated control references are merged.
1009
+
1010
+ ```vue
1011
+ <SContextMenu :items="editingActions" v-slot="{ textInputTriggerProps }">
1012
+ <STextarea
1013
+ v-model="message"
1014
+ v-bind="textInputTriggerProps"
1015
+ label="Сообщение"
1016
+ :suggestions="{
1017
+ controls: 'mention-listbox',
1018
+ active: suggestionsVisible,
1019
+ ...(suggestionsVisible && activeMentionId ? { activeDescendant: activeMentionId } : {}),
1020
+ }"
1021
+ />
1022
+ </SContextMenu>
588
1023
  ```
589
1024
 
590
1025
  ```ts
@@ -601,6 +1036,8 @@ function handleFocus(event: FocusEvent): void {
601
1036
  }
602
1037
 
603
1038
  composer.value?.setSelection({ start, end, direction: 'forward' })
1039
+ composer.value?.selectAll()
1040
+ composer.value?.selectAll(false)
604
1041
  composer.value?.replaceSelection('@file README.md')
605
1042
  ```
606
1043
 
@@ -616,6 +1053,26 @@ IME composition fails with an explicit diagnostic. The `selection-change`,
616
1053
  `compositionstart`, `compositionupdate`, `compositionend`, and `state-change`
617
1054
  events synchronize a popup without reading internal DOM.
618
1055
 
1056
+ `selectAll(focusOwner?: boolean): void` выделяет весь текущий native API value
1057
+ вперёд через общий selection owner. По умолчанию запрашивается focus;
1058
+ `false` сохраняет внешний focus. Readonly-текст доступен для выделения;
1059
+ disabled и detached элементы соблюдают native eligibility фокуса.
1060
+ Метод использует длину текущего `textarea.value`, включая ввод до подтверждения
1061
+ controlled model, и не изменяет исходные CRLF/Unicode bytes, model или input
1062
+ history. HTML API value исключает CR; consumer не переписывает source и не
1063
+ считает native offsets через `source.length`. Unmounted/disposed owner и
1064
+ неboolean focus policy дают явную ошибку.
1065
+
1066
+ `selectAll(focusOwner?: boolean): void` selects the complete current native
1067
+ API value forward through the shared selection owner. It requests focus by
1068
+ default; `false` preserves external focus. Readonly text remains selectable;
1069
+ disabled and detached elements follow native focus eligibility.
1070
+ The method uses the current `textarea.value.length`, including edits awaiting
1071
+ controlled-model acknowledgement, and does not change the source CRLF/Unicode
1072
+ bytes, model, or input history. The HTML API value excludes CR; consumers do not
1073
+ rewrite the source or calculate native offsets from `source.length`.
1074
+ An unmounted/disposed owner or non-boolean focus policy throws an explicit error.
1075
+
619
1076
  ### Карточки и строки выбора / Choice cards and rows
620
1077
 
621
1078
  `SChoiceCards` использует `appearance="cards"` для крупных плиток и
@@ -708,17 +1165,113 @@ contract applies only to textual types: `text`, `search`, `password`, `email`,
708
1165
 
709
1166
  ### Drawer placement
710
1167
 
711
- `SDrawer` использует `placement="right"` по умолчанию. Нижняя панель задаётся
712
- `placement="bottom"`; semantic sizes соответствуют 50, 70 и 90 процентам
713
- dynamic viewport height. Body остаётся единственным scroll owner, а overlay,
714
- focus trap/restore, Escape, backdrop и nested layer stack совпадают с боковой
715
- панелью.
1168
+ `SDrawer.placement` принимает `left | right | bottom`, по умолчанию — `right`.
1169
+ `left` и `right` обозначают физическую сторону независимо от направления текста.
1170
+ Боковые панели используют общую шкалу `sm/md/lg`: максимальная ширина
1171
+ `30/36/44rem`, ограниченная viewport. При `scope="viewport"` нижняя панель
1172
+ `placement="bottom"` занимает `50/70/90` процентов dynamic viewport height.
1173
+ `mobileFullScreen` задаёт полноширинную боковую viewport-панель на узком экране;
1174
+ размещение, header/body/footer и доступность действий сохраняются.
1175
+ При `scrollBehavior="body"` body — единственный scroll owner. Все размещения
1176
+ используют общие viewport overlay, focus trap/restore, Escape, backdrop и nested
1177
+ layer stack.
1178
+
1179
+ `SDrawer.placement` accepts `left | right | bottom`, defaulting to `right`.
1180
+ `left` and `right` are physical sides independent of text direction. Side
1181
+ drawers share the `sm/md/lg` scale: viewport-bounded maximum widths of
1182
+ `30/36/44rem`. With `scope="viewport"`, a `placement="bottom"` sheet occupies
1183
+ `50/70/90` percent of the dynamic viewport height. `mobileFullScreen` provides
1184
+ a full-width side viewport drawer on a narrow screen while preserving its
1185
+ placement, header/body/footer and reachable actions. With
1186
+ `scrollBehavior="body"`, the body is the sole scroll owner. All placements
1187
+ share viewport overlay, focus trap/restore, Escape, backdrop and the nested
1188
+ layer stack.
1189
+
1190
+ `scope="contained"` требует ближайший `SOverlayHost`. Его default-слот содержит
1191
+ основную историю, `#overlay` — панель. Размеры `sm/md/lg` означают 50/70/90%
1192
+ доступной области по оси `placement`; `extent` принимает конечный процент больше
1193
+ 0 и не больше 100. Для `left/right` это ширина host, для `bottom` — высота.
1194
+ `extent` применим только к contained-режиму. Размеры host
1195
+ принадлежат композиции страницы; размер и оформление панели принадлежат киту.
1196
+ `mobileFullScreen` не переводит contained-панель за границы host.
1197
+ `scope` меняется только при `open=false`; переход между владельцами не переносит
1198
+ открытый overlay lifetime.
1199
+
1200
+ Contained drawer — немодальный `dialog`: composer и terminal вне host остаются
1201
+ доступны, global body lock и собственный Tab trap отсутствуют. Основное
1202
+ содержимое host имеет `inert` на время открытой панели и сохраняет DOM/прокрутку.
1203
+ Нативный диапазон выделения сохраняет text owner и координаты; видимое выделение
1204
+ следует браузерному `inert`-контракту и доступно после закрытия панели.
1205
+ Escape и нажатие backdrop обрабатываются внутри host; внешний ввод не закрывает
1206
+ панель и не получает отложенный возврат чужого фокуса. Вложенный `SModal`
1207
+ использует общий stack, глобальную модальность и свой focus trap.
1208
+
1209
+ `scrollBehavior="body"` оставляет padded body единственным scroll owner.
1210
+ `scrollBehavior="content"` предоставляет растягиваемый слот без полей и второго
1211
+ скролла для `SVirtualList` или `SScrollViewport block-size="fill"`.
1212
+ Consumer обрабатывает `update:open`, в том числе при retirement host. Удаление,
1213
+ замена или ошибка host завершают его слои и pending focus/`opened`; повторное
1214
+ открытие — явный переход `open=false` → `true`. Новый host с новым drawer и
1215
+ `open=true` является новым запросом, а не продолжением предыдущего lifetime.
1216
+
1217
+ `scope="contained"` requires the nearest `SOverlayHost`. Its default slot owns
1218
+ the main history, and `#overlay` owns the drawer. Sizes `sm/md/lg` mean
1219
+ 50/70/90% of the available host extent along the placement axis; `extent` is a
1220
+ finite percentage greater than 0 and at most 100, valid only for contained
1221
+ drawers. The axis is host width for `left/right` and host height for `bottom`.
1222
+ Page composition owns host dimensions; the kit owns drawer geometry
1223
+ and presentation. `mobileFullScreen` does not move a contained drawer outside
1224
+ its host.
1225
+ `scope` changes only while `open=false`; changing owners does not transfer an
1226
+ open overlay lifetime.
1227
+
1228
+ A contained drawer is a nonmodal dialog: external composer/terminal remain
1229
+ available, without global body locking or its own Tab trap. Host background
1230
+ content is inert while the drawer is open and retains its DOM/scroll position.
1231
+ Native selection ranges retain their text owner and offsets; visible selection
1232
+ follows the browser's inert contract and is available after the drawer closes.
1233
+ Escape and backdrop dismissal are host-scoped; external input neither closes
1234
+ the drawer nor receives a stale focus restoration. A nested `SModal` uses the
1235
+ same layer stack with global modality and its own focus trap.
1236
+
1237
+ `scrollBehavior="body"` provides the padded body scroll owner.
1238
+ `scrollBehavior="content"` provides a stretching slot without padding or a
1239
+ second scroll container for `SVirtualList` or `SScrollViewport block-size="fill"`.
1240
+ The consumer handles `update:open`, including host retirement. Host removal,
1241
+ replacement, or failure retires its layers and pending focus/`opened`; reopen
1242
+ requires an explicit `open=false` → `true` transition. A new host and a new
1243
+ drawer with `open=true` represent a new request, not the previous lifetime.
1244
+
1245
+ ```vue
1246
+ <SDrawer
1247
+ v-model:open="navigationOpen"
1248
+ title="Проекты и чаты"
1249
+ placement="left"
1250
+ size="md"
1251
+ >
1252
+ <ProjectChatNavigation />
1253
+ </SDrawer>
1254
+ ```
716
1255
 
717
- `SDrawer` uses `placement="right"` by default. Set `placement="bottom"` for a
718
- bottom sheet; semantic sizes map to 50, 70, and 90 percent of the dynamic
719
- viewport height. The body remains the sole scroll owner, while overlay,
720
- focus trap/restore, Escape, backdrop, and the nested layer stack are shared
721
- with the side drawer.
1256
+ ```vue
1257
+ <SOverlayHost>
1258
+ <ConversationHistory />
1259
+ <template #overlay>
1260
+ <SDrawer
1261
+ v-model:open="historyOpen"
1262
+ title="История подагента"
1263
+ scope="contained"
1264
+ placement="bottom"
1265
+ size="lg"
1266
+ scroll-behavior="content"
1267
+ >
1268
+ <VirtualSubagentHistory />
1269
+ </SDrawer>
1270
+ </template>
1271
+ </SOverlayHost>
1272
+ <Composer />
1273
+ <Terminal />
1274
+ ```
722
1275
 
723
1276
  ```vue
724
1277
  <SDrawer
@@ -758,6 +1311,110 @@ is required.
758
1311
  </SDrawer>
759
1312
  ```
760
1313
 
1314
+ `SModal.size="4xl"` задаёт semantic maximum `56rem` между `3xl` (`48rem`) и
1315
+ `wide` (`72rem`) для журналов, shell output и широких форм. Surface остаётся
1316
+ responsive и сжимается до доступной ширины viewport. Если дочерний mount
1317
+ завершается ошибкой, modal освобождает body lock, layer registration и свои
1318
+ teleport nodes до передачи ошибки host-приложению.
1319
+
1320
+ `SModal.size="4xl"` provides a semantic `56rem` maximum between `3xl` (`48rem`)
1321
+ and `wide` (`72rem`) for logs, shell output, and wide forms. The surface remains
1322
+ responsive and shrinks to the available viewport. If a child mount fails, the
1323
+ modal releases its body lock, layer registration, and owned teleport nodes
1324
+ before the error reaches the host application.
1325
+
1326
+ ### Управляемое открытие popover / Controlled popover opening
1327
+
1328
+ `SPopover` поддерживает `v-model:open` и программные `open(triggerId?)`/`close()`.
1329
+ Запрос от trigger сохраняет его native anchor и исходный focus owner до
1330
+ подтверждения `open`, включая отложенное применение prop. Если фокус переведён
1331
+ во внешний редактор, появление панели не перехватывает его. Открытие напрямую
1332
+ через prop использует текущий focus owner. `close()` отменяет ожидающий запрос
1333
+ через `update:open=false`; закрытие восстанавливает фокус только из принадлежащей
1334
+ панели, не из внешнего поля. Каждый новый цикл использует актуального invoker.
1335
+
1336
+ `SPopover` supports `v-model:open` and the programmatic `open(triggerId?)`/`close()`
1337
+ API. A trigger request preserves its native anchor and original focus owner
1338
+ through acknowledgement, including delayed prop application. A panel does not
1339
+ take focus from an external editor focused in the meantime. Direct prop-driven
1340
+ opening uses the current focus owner. `close()` cancels a pending request with
1341
+ `update:open=false`; closing restores focus only from the owned panel, not an
1342
+ external field. Each new cycle uses its current invoker.
1343
+
1344
+ `width="trigger"` задаёт минимальную ширину anchor; `content` сохраняет
1345
+ intrinsic-ширину содержимого. `sm`, `md`, `lg` задают `20rem`, `28rem`, `36rem`
1346
+ с viewport-ограничением. Фон, тень и focus surface занимают полный dialog;
1347
+ `surface="transparent"` задаёт максимальную ширину всего dialog `90vw`;
1348
+ при `width="trigger"` минимальная ширина anchor имеет приоритет над этим максимумом.
1349
+
1350
+ `width="trigger"` sets the anchor's minimum width; `content` keeps the content's
1351
+ intrinsic width. `sm`, `md`, and `lg` specify `20rem`, `28rem`, and `36rem`,
1352
+ bounded by the viewport. Background, shadow, and focus surface occupy the full
1353
+ dialog; `surface="transparent"` sets the entire dialog's maximum width to `90vw`.
1354
+ With `width="trigger"`, the anchor minimum takes precedence over this maximum.
1355
+
1356
+ ### Управляемое dropdown menu / Controlled dropdown menu
1357
+
1358
+ `SDropdownMenu` поддерживает controlled `v-model:open`, начальное
1359
+ `defaultOpen`, размещение `auto | bottom | top` и `closeOnSelect`. Событие
1360
+ `select` публикуется до запроса закрытия; при `closeOnSelect=false` menu остаётся
1361
+ открытым для асинхронных операций и повторного выбора. `kind="group"` создаёт
1362
+ семантическую группу с видимой меткой, а `description` добавляет пункту
1363
+ доступное пояснение через `aria-describedby` без дополнительной tab stop.
1364
+
1365
+ `SDropdownMenu` supports controlled `v-model:open`, initial `defaultOpen`,
1366
+ `auto | bottom | top` placement, and `closeOnSelect`. The `select` event is
1367
+ published before the close request; `closeOnSelect=false` keeps the menu open
1368
+ for asynchronous operations and repeated selection. `kind="group"` creates a
1369
+ semantic group with a visible label, while `description` adds an accessible
1370
+ item hint through `aria-describedby` without another tab stop.
1371
+
1372
+ Dropdown, контекстные и вложенные меню автоматически ограничиваются доступной
1373
+ областью viewport. `placement` задаёт предпочтительную сторону; collision
1374
+ handling допускает переход на другую сторону. Полный список пунктов сохраняется,
1375
+ а высокий список прокручивается внутри menu surface с единым chrome и scroll
1376
+ owner. Высота учитывает размеры viewport и содержимого; consumer не задаёт
1377
+ `max-height` и не переоформляет внутренности меню. Arrow/Home/End раскрывают
1378
+ сфокусированный пункт в этом viewport без прокрутки фонового документа.
1379
+ Внутренняя прокрутка сохраняет открытое меню и его родительский layer.
1380
+ Home/End повторно раскрывают текущую строку после ручной прокрутки. Если ни одна
1381
+ inline-сторона не вмещает вложенную menu surface, общий collision owner выбирает
1382
+ доступную верхнюю или нижнюю сторону.
1383
+ Escape закрывает текущий уровень и возвращает фокус его trigger.
1384
+
1385
+ Dropdown, context, and nested menus are automatically bounded by the available
1386
+ viewport. `placement` specifies the preferred side; collision handling can
1387
+ choose the opposite side. The complete item inventory is retained, while a
1388
+ tall list scrolls inside the menu surface with one chrome and scroll owner.
1389
+ Its height follows the viewport and content dimensions; consumers do not set
1390
+ `max-height` or restyle menu internals. Arrow/Home/End reveal the focused item
1391
+ inside this viewport without scrolling the background document. Internal
1392
+ scrolling preserves the open menu and its parent layer. Home/End reveal the
1393
+ current row after manual scrolling. If neither inline side can fit a submenu
1394
+ surface, the shared collision owner selects the available top or bottom side.
1395
+ Escape closes the current level and returns focus to its trigger.
1396
+
1397
+ ```vue
1398
+ <SDropdownMenu
1399
+ v-model:open="workspaceMenuOpen"
1400
+ :items="workspaceGroups"
1401
+ placement="top"
1402
+ :close-on-select="false"
1403
+ menu-label="Ветки и рабочие папки"
1404
+ @select="switchWorkspace"
1405
+ />
1406
+ ```
1407
+
1408
+ ### Плотность сворачиваемой панели / Collapsible panel density
1409
+
1410
+ `SCollapsiblePanel.density="compact"` и `density="dense"` используют compact
1411
+ `SButton` disclosure hitbox высотой `32px`; `comfortable` сохраняет стандартную
1412
+ геометрию. Consumer не задаёт высоту, padding или внутренние selectors.
1413
+
1414
+ `SCollapsiblePanel.density="compact"` and `density="dense"` use the compact
1415
+ `SButton` disclosure hitbox at `32px`; `comfortable` retains the default
1416
+ geometry. Consumers do not set height, padding, or internal selectors.
1417
+
761
1418
  ### Dialog open lifecycle
762
1419
 
763
1420
  `SModal` и `SDrawer` эмитят `opened` один раз для каждого подтверждённого цикла
@@ -775,12 +1432,28 @@ cancels the event; Escape, focus trapping, and focus restoration remain owned
775
1432
  by the dialog surface.
776
1433
 
777
1434
  ```vue
778
- <SModal v-model:open="open" title="Исходный текст" @opened="selectAll">
1435
+ <SModal v-model:open="open" title="Исходный текст" @opened="textarea?.selectAll()">
779
1436
  <STextarea ref="textarea" :model-value="source" label="Текст" readonly />
780
1437
  </SModal>
781
1438
  ```
782
1439
 
783
- ### Assistive live status
1440
+ ### Status presentation and assistive announcements
1441
+
1442
+ Видимый `SStatus` использует общую feedback-пару `tone`; `neutral` соответствует
1443
+ нейтральной `secondary`-паре. `appearance="soft"` владеет своим непрозрачным
1444
+ фоном и foreground. Текстовый статус внутри пассивного slot `SButton` использует
1445
+ foreground интерактивного владельца, включая solid, hover, active и focus;
1446
+ `tone`, текст и семантическая иконка сохраняются. `SCollapsiblePanel.summaryStatus`
1447
+ использует этот же контракт в compact/dense заголовке. Локальные color overrides
1448
+ для вложенных статусов не требуются.
1449
+
1450
+ Visible `SStatus` uses the shared feedback `tone` pair; `neutral` maps to the
1451
+ neutral `secondary` pair. `appearance="soft"` owns its opaque background and
1452
+ foreground. A text status in an `SButton` passive slot uses the interactive
1453
+ owner's foreground across solid, hover, active, and focus states; `tone`, its
1454
+ label, and the semantic icon are preserved. `SCollapsiblePanel.summaryStatus`
1455
+ uses the same contract in compact/dense headers. Nested statuses require no
1456
+ local color overrides.
784
1457
 
785
1458
  `SStatus` с `visibility="assistive"` выводит всю status surface из layout,
786
1459
  сохраняя текст сообщения в accessibility tree. `live="polite"` или
@@ -837,7 +1510,7 @@ snapshot can move between instances or be retained while switching chats.
837
1510
  @viewport-change="viewport = $event"
838
1511
  >
839
1512
  <template #header>
840
- <SButton variant="ghost" @click="loadPreviousPage">
1513
+ <SButton appearance="ghost" @click="loadPreviousPage">
841
1514
  Загрузить предыдущие
842
1515
  </SButton>
843
1516
  </template>
@@ -851,10 +1524,13 @@ snapshot can move between instances or be retained while switching chats.
851
1524
  ```
852
1525
 
853
1526
  ```ts
854
- const snapshot = history.value?.captureViewport()
855
- await history.value?.restoreViewport(snapshot)
856
- history.value?.scrollToKey(messageId, 'center')
857
- history.value?.scrollToEnd({ follow: true })
1527
+ const historyOwner = history.value
1528
+ if (historyOwner) {
1529
+ const snapshot = historyOwner.captureViewport()
1530
+ await historyOwner.restoreViewport(snapshot)
1531
+ historyOwner.scrollToKey(messageId, 'center')
1532
+ historyOwner.scrollToEnd({ follow: true })
1533
+ }
858
1534
  ```
859
1535
 
860
1536
  `viewport-change` сообщает keyed anchor, visible range, `nearStart`, `atEnd` и
@@ -866,6 +1542,11 @@ Paging, status и end-marker рендерятся через `header`/`footer`,
866
1542
  синтетические элементы domain-списка. Home, End, Page и Arrow keys владеют
867
1543
  viewport navigation только при focus самого `SVirtualList`; вложенный
868
1544
  editable/control сохраняет свою keyboard-семантику.
1545
+ Строка с фактическим DOM-фокусом сохраняет keyed DOM identity при изменении
1546
+ измерений, viewport и rendered range. Вложенный редактор сохраняет focus и
1547
+ selection без программного перевода фокуса. Lease удерживает только одну
1548
+ дополнительную строку вне виртуального окна и снимается при focusout из строки,
1549
+ удалении её domain key или unmount. `header`/`footer` не входят в keyed lease.
869
1550
 
870
1551
  `viewport-change` reports the keyed anchor, visible range, `nearStart`, `atEnd`,
871
1552
  and `pinnedToEnd`. An upward wheel, keyboard, or scrollbar gesture detaches
@@ -877,6 +1558,12 @@ Paging, status, and end markers belong in `header`/`footer`, not in the keyed
877
1558
  domain items. Home, End, Page, and Arrow keys control the viewport only while
878
1559
  `SVirtualList` itself owns focus; a nested editable/control retains its own
879
1560
  keyboard semantics.
1561
+ The row containing actual DOM focus retains its keyed DOM identity across
1562
+ measurement, viewport, and rendered-range changes. A nested editor preserves
1563
+ focus and selection without programmatic refocusing. This lease retains only
1564
+ one additional row outside the virtual window and ends when focus leaves that
1565
+ row, its domain key is removed, or the list unmounts. `header`/`footer` regions
1566
+ do not own a keyed row lease.
880
1567
 
881
1568
  ## Темы и стили / Themes and styles
882
1569
 
@@ -898,6 +1585,14 @@ application's own `@import "tailwindcss"`:
898
1585
  typography plugin. `reference.css` is a compile-time `@reference` target for
899
1586
  component styles.
900
1587
 
1588
+ Оба CSS entrypoint используют полную сборку upstream typography plugin внутри
1589
+ пакета. Устанавливать `@tailwindcss/typography` или переопределять его transitive
1590
+ зависимости в consumer не требуется. Лицензии включённых модулей находятся в
1591
+ `dist/typography.LICENSE.txt`. / Both CSS entrypoints use the complete upstream
1592
+ typography plugin bundled in the package. Consumers do not need to install
1593
+ `@tailwindcss/typography` or override its transitive dependencies. The included
1594
+ module licenses are provided in `dist/typography.LICENSE.txt`.
1595
+
901
1596
  Для token-only интеграции доступен отдельный entrypoint:
902
1597
 
903
1598
  A separate entrypoint is available for token-only integration:
@@ -974,6 +1669,79 @@ separator по умолчанию использует `compact`, overlay handle
974
1669
  Для 12-пиксельной границы workbench-панели используйте `standard`, не изменяя
975
1670
  внутренние стили компонента.
976
1671
 
1672
+ Pointer resize имеет отдельные `resize-end` и `resize-cancel`: завершение
1673
+ принимает конечную координату, отмена возвращает snapshot без сохранения
1674
+ preview. `SDockRegion` передаёт `hitbox` и поддерживает opt-in
1675
+ `collapseThreshold` с отдельным `collapse({ preferredSize })` intent.
1676
+ Клавиатурный Home остаётся установкой минимального размера. Типы, transaction
1677
+ ownership и примеры включены в пакет: `docs/resize.md`.
1678
+
1679
+ ### Сохранение скрытой рабочей панели / Hidden dock content retention
1680
+
1681
+ `SDockRegion.keepMounted` — boolean с default `false`: скрытие освобождает
1682
+ slot owner. При `true` один slot owner сохраняется, включая начальное
1683
+ `visible=false`. Скрытый регион имеет нулевой layout, `hidden`/`inert`,
1684
+ не участвует в Tab, pointer или accessibility tree и не содержит resize handle.
1685
+ Скрытие во время drag отменяет resize через его общий lifecycle без terminal
1686
+ commit. Повторное отображение сохраняет экземпляр и native состояние содержимого,
1687
+ но не забирает focus у внешнего editor. Выключение retention у скрытого региона
1688
+ или unmount освобождает его содержимое.
1689
+
1690
+ Вложенные UI-kit menu, listbox, popover, tooltip и dialog следуют `visible`,
1691
+ включая Teleport-поверхности: скрытие завершает открытые и ожидающие циклы,
1692
+ освобождает overlay leases/body lock и не возвращает focus скрытому trigger.
1693
+ Начальный hidden state запрещает открытие. Controlled `open=true` получает
1694
+ один close intent; для нового открытия требуется запрос `false → true`.
1695
+ Отображение retained content не возобновляет завершённый цикл. Вложенные dock
1696
+ сочетают visibility через логическое AND, независимые sibling overlays не
1697
+ затрагиваются. Произвольные consumer-owned portals остаются ответственностью
1698
+ consumer.
1699
+
1700
+ Содержимое, transport и output buffer принадлежат consumer. Для imperative
1701
+ терминала экземпляр получает output и при скрытом регионе; `Terminal.open()`
1702
+ вызывается только для connected, видимого host с положительными размерами.
1703
+ UI-kit не импортирует xterm и не пересоздаёт PTY. Политика едина для
1704
+ `left | right | bottom` и `fixed | fill-on-narrow`.
1705
+
1706
+ `SDockRegion.keepMounted` is a boolean defaulting to `false`: hiding disposes
1707
+ the slot owner. With `true`, the same owner remains mounted, including initial
1708
+ `visible=false`. The hidden region has zero layout footprint, is `hidden` and
1709
+ `inert`, participates in no Tab/pointer/accessibility navigation, and contains
1710
+ no resize handle. Hiding during a drag cancels the shared resize lifecycle
1711
+ without a terminal commit. Showing retains the instance and its native state
1712
+ without stealing focus from an external editor. Disabling retention while
1713
+ hidden or unmounting disposes the content.
1714
+
1715
+ Nested UI-kit menus, listboxes, popovers, tooltips, and dialogs follow `visible`,
1716
+ including their Teleport surfaces. Hiding retires open and pending cycles,
1717
+ releases overlay leases/body locks, and never restores focus to a hidden trigger.
1718
+ Initially hidden content cannot open an overlay. Controlled `open=true` receives
1719
+ one close intent and requires a fresh `false → true` request. Showing retained
1720
+ content does not resurrect a retired cycle. Nested docks compose visibility with
1721
+ logical AND; independent sibling overlays are unaffected. Arbitrary
1722
+ consumer-owned portals remain the consumer's responsibility.
1723
+
1724
+ Content, transport, and output buffers belong to the consumer. An imperative
1725
+ terminal can receive output while hidden; call `Terminal.open()` only for a
1726
+ connected, visible host with positive dimensions. The UI-kit does not import
1727
+ xterm or restart a PTY. The policy applies to `left | right | bottom` and
1728
+ `fixed | fill-on-narrow`.
1729
+
1730
+ ```vue
1731
+ <SDockRegion
1732
+ placement="bottom"
1733
+ :visible="terminalVisible"
1734
+ keep-mounted
1735
+ :size="terminalHeight"
1736
+ :min-size="160"
1737
+ :max-size="480"
1738
+ resize-label="Высота терминала"
1739
+ @resize="terminalHeight = $event"
1740
+ >
1741
+ <TerminalViewport :visible="terminalVisible" />
1742
+ </SDockRegion>
1743
+ ```
1744
+
977
1745
  ## Публичный контракт / Public contract
978
1746
 
979
1747
  `package.json#exports` — источник истины для импортов. Публичный контракт