@pgcorp/ui-kit 0.13.0 → 0.15.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 (354) hide show
  1. package/README.md +1055 -31
  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_dc65aba1_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_a108e8f1_scoped_a108e8f1_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/SMenuLayer.css_vue_type_style_index_0_src_e478164c_scoped_e478164c_lang.css +1 -0
  8. package/dist/assets/src/components/shared/containers/{SCollapsiblePanel.css_vue_type_style_index_0_src_71824088_scoped_71824088_lang.css → SCollapsiblePanel.css_vue_type_style_index_0_src_db85261d_scoped_db85261d_lang.css} +1 -1
  9. package/dist/assets/src/components/shared/containers/SOverlayHost.css_vue_type_style_index_0_src_09215628_scoped_09215628_lang.css +2 -0
  10. package/dist/assets/src/components/shared/containers/SPopover.css_vue_type_style_index_0_src_a4f1f64a_scoped_a4f1f64a_lang.css +2 -0
  11. 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
  12. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_52396e42_scoped_52396e42_lang.css +2 -0
  13. package/dist/assets/src/components/shared/controls/SButton.css_vue_type_style_index_0_src_7a5acda9_scoped_7a5acda9_lang.css +2 -0
  14. package/dist/assets/src/components/shared/controls/SCheckbox.css_vue_type_style_index_0_src_2562f916_scoped_2562f916_lang.css +2 -0
  15. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_d630c922_scoped_d630c922_lang.css +2 -0
  16. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_43b6e378_scoped_43b6e378_lang.css +1 -0
  17. package/dist/assets/src/components/shared/controls/{SDropdownMenu.css_vue_type_style_index_0_src_1ccb9efc_scoped_1ccb9efc_lang.css → SDropdownMenu.css_vue_type_style_index_0_src_40040ae5_scoped_40040ae5_lang.css} +1 -1
  18. package/dist/assets/src/components/shared/controls/SField.css_vue_type_style_index_0_src_2d353c26_scoped_2d353c26_lang.css +2 -0
  19. 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
  20. 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
  21. package/dist/assets/src/components/shared/controls/SListbox.css_vue_type_style_index_0_src_50063f9f_scoped_50063f9f_lang.css +2 -0
  22. 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
  23. package/dist/assets/src/components/shared/controls/SMenuSurface.css_vue_type_style_index_0_src_d2b7d71b_scoped_d2b7d71b_lang.css +2 -0
  24. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_d1ead6c0_scoped_d1ead6c0_lang.css +2 -0
  25. package/dist/assets/src/components/shared/controls/STextarea.css_vue_type_style_index_0_src_true_lang.css +1 -1
  26. package/dist/assets/src/components/shared/data-display/SControlledToastViewport.css_vue_type_style_index_0_src_a69aa84b_scoped_a69aa84b_lang.css +2 -0
  27. package/dist/assets/src/components/shared/data-display/SProgressBar.css_vue_type_style_index_0_src_cad721dd_scoped_cad721dd_lang.css +2 -0
  28. package/dist/assets/src/components/shared/data-display/SRichDocument.css_vue_type_style_index_0_src_8db085d5_scoped_8db085d5_lang.css +2 -0
  29. package/dist/assets/src/components/shared/data-display/SScrollViewport.css_vue_type_style_index_0_src_d94fcf8c_scoped_d94fcf8c_lang.css +2 -0
  30. package/dist/assets/src/components/shared/data-display/SStatus.css_vue_type_style_index_0_src_3ce41a12_scoped_3ce41a12_lang.css +1 -1
  31. package/dist/assets/src/components/shared/data-display/STable.css_vue_type_style_index_0_src_b23b3d71_scoped_b23b3d71_lang.css +2 -0
  32. package/dist/assets/src/components/shared/data-display/STooltip.css_vue_type_style_index_0_src_true_lang.css +1 -1
  33. package/dist/assets/src/components/shared/data-display/SVirtualList.css_vue_type_style_index_0_src_9fe3ade0_scoped_9fe3ade0_lang.css +2 -0
  34. package/dist/assets/src/components/shared/data-display/_internal/SRichBlockNode.css_vue_type_style_index_0_src_eaae882d_scoped_eaae882d_lang.css +2 -0
  35. package/dist/assets/src/components/shared/data-display/_internal/SRichDisclosure.css_vue_type_style_index_0_src_1f0ffc97_scoped_1f0ffc97_lang.css +2 -0
  36. package/dist/assets/src/components/shared/data-display/_internal/SRichImage.css_vue_type_style_index_0_src_2f1c39a9_scoped_2f1c39a9_lang.css +2 -0
  37. 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
  38. package/dist/assets/src/components/shared/data-display/_internal/STableCell.css_vue_type_style_index_0_src_b829cbc6_scoped_b829cbc6_lang.css +2 -0
  39. package/dist/assets/src/components/shared/data-display/_internal/STableFrame.css_vue_type_style_index_0_src_914bad28_scoped_914bad28_lang.css +2 -0
  40. package/dist/assets/src/components/shared/data-display/_internal/STableRow.css_vue_type_style_index_0_src_1661f8b8_scoped_1661f8b8_lang.css +2 -0
  41. package/dist/assets/src/components/shared/feedback/SAsyncState.css_vue_type_style_index_0_src_8a291af7_scoped_8a291af7_lang.css +2 -0
  42. 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_68cf84b3_lang.css} +1 -1
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.js +3 -3
  45. package/dist/reference.css +4 -0
  46. package/dist/src/components/icons/_internal/generatedSputnigUiIconComponents.d.ts +15 -0
  47. package/dist/src/components/icons/_internal/generatedSputnigUiIconComponents.js +4 -4
  48. package/dist/src/components/icons/_internal/generatedSputnigUiIconMarkup.d.ts +46 -1
  49. package/dist/src/components/icons/_internal/generatedSputnigUiIconMarkup.js +260 -230
  50. package/dist/src/components/icons/sputnigUiIcons.d.ts +1 -1
  51. package/dist/src/components/icons/sputnigUiIcons.js +233 -218
  52. package/dist/src/components/layout/SAppShell.vue_vue_type_script_setup_true_lang.js +8 -8
  53. package/dist/src/components/layout/SDockRegion.vue.d.ts +18 -5
  54. package/dist/src/components/layout/SDockRegion.vue.js +2 -2
  55. package/dist/src/components/layout/SDockRegion.vue_vue_type_script_setup_true_lang.js +112 -64
  56. package/dist/src/components/layout/SResizeHandle.vue.d.ts +6 -3
  57. package/dist/src/components/layout/SResizeHandle.vue.js +2 -2
  58. package/dist/src/components/layout/SResizeHandle.vue_vue_type_script_setup_true_lang.js +127 -87
  59. package/dist/src/components/layout/SStack.vue.d.ts +1 -1
  60. package/dist/src/components/layout/SWorkbenchPanelShell.vue.d.ts +4 -4
  61. package/dist/src/components/layout/SWorkbenchPanelShell.vue.js +2 -2
  62. package/dist/src/components/layout/SWorkbenchPanelShell.vue_vue_type_script_setup_true_lang.js +62 -58
  63. package/dist/src/components/layout/types.d.ts +20 -0
  64. package/dist/src/components/shared/_internal/SDialogSurface.vue.d.ts +9 -1
  65. package/dist/src/components/shared/_internal/SDialogSurface.vue.js +2 -2
  66. package/dist/src/components/shared/_internal/SDialogSurface.vue_vue_type_script_setup_true_lang.js +183 -68
  67. package/dist/src/components/shared/_internal/SHeaderSurface.vue.d.ts +1 -1
  68. package/dist/src/components/shared/_internal/SListboxGroup.vue.d.ts +5 -0
  69. package/dist/src/components/shared/_internal/SListboxGroup.vue.js +2 -2
  70. package/dist/src/components/shared/_internal/SListboxGroup.vue_vue_type_script_setup_true_lang.js +33 -15
  71. package/dist/src/components/shared/_internal/SMenuLayer.vue.d.ts +5 -1
  72. package/dist/src/components/shared/_internal/SMenuLayer.vue.js +2 -2
  73. package/dist/src/components/shared/_internal/SMenuLayer.vue_vue_type_script_setup_true_lang.js +64 -20
  74. package/dist/src/components/shared/_internal/dialogSurface.d.ts +17 -2
  75. package/dist/src/components/shared/_internal/dialogSurface.js +42 -23
  76. package/dist/src/components/shared/_internal/dialogSurfaceMotion.d.ts +14 -0
  77. package/dist/src/components/shared/_internal/dialogSurfaceMotion.js +84 -0
  78. package/dist/src/components/shared/_internal/focusTrap.js +15 -13
  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 +5 -0
  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 +123 -121
  93. package/dist/src/components/shared/containers/SDrawer.vue.d.ts +16 -5
  94. package/dist/src/components/shared/containers/SDrawer.vue.js +3 -6
  95. package/dist/src/components/shared/containers/SDrawer.vue_vue_type_script_setup_true_lang.js +149 -75
  96. package/dist/src/components/shared/containers/SModal.vue.d.ts +8 -8
  97. package/dist/src/components/shared/containers/SModal.vue.js +3 -6
  98. package/dist/src/components/shared/containers/SModal.vue_vue_type_script_setup_true_lang.js +93 -85
  99. package/dist/src/components/shared/containers/SOverlayHost.vue.d.ts +16 -0
  100. package/dist/src/components/shared/containers/SOverlayHost.vue.js +8 -0
  101. package/dist/src/components/shared/containers/SOverlayHost.vue_vue_type_script_setup_true_lang.js +66 -0
  102. package/dist/src/components/shared/containers/SPageHeader.vue.d.ts +1 -1
  103. package/dist/src/components/shared/containers/SPanel.vue.d.ts +2 -2
  104. package/dist/src/components/shared/containers/SPanel.vue_vue_type_script_setup_true_lang.js +7 -7
  105. package/dist/src/components/shared/containers/SPopover.vue.js +2 -2
  106. package/dist/src/components/shared/containers/SPopover.vue_vue_type_script_setup_true_lang.js +250 -156
  107. package/dist/src/components/shared/containers/SSidebarGroup.vue.js +2 -2
  108. package/dist/src/components/shared/containers/SSidebarGroup.vue_vue_type_script_setup_true_lang.js +30 -8
  109. package/dist/src/components/shared/containers/SSidebarSection.vue.js +2 -2
  110. package/dist/src/components/shared/containers/SSidebarSection.vue_vue_type_script_setup_true_lang.js +59 -45
  111. package/dist/src/components/shared/controls/SButton.vue.d.ts +7 -0
  112. package/dist/src/components/shared/controls/SButton.vue.js +2 -2
  113. package/dist/src/components/shared/controls/SButton.vue_vue_type_script_setup_true_lang.js +11 -5
  114. package/dist/src/components/shared/controls/SCheckbox.vue.d.ts +3 -0
  115. package/dist/src/components/shared/controls/SCheckbox.vue.js +2 -2
  116. package/dist/src/components/shared/controls/SCheckbox.vue_vue_type_script_setup_true_lang.js +53 -43
  117. package/dist/src/components/shared/controls/SCheckboxGroup.vue_vue_type_script_setup_true_lang.js +7 -7
  118. package/dist/src/components/shared/controls/SChoiceCards.vue_vue_type_script_setup_true_lang.js +4 -4
  119. package/dist/src/components/shared/controls/SColorSelect.vue_vue_type_script_setup_true_lang.js +6 -6
  120. package/dist/src/components/shared/controls/SCombobox.vue.js +2 -2
  121. package/dist/src/components/shared/controls/SCombobox.vue_vue_type_script_setup_true_lang.js +157 -132
  122. package/dist/src/components/shared/controls/SComboboxTrigger.vue.d.ts +2 -2
  123. package/dist/src/components/shared/controls/SContextMenu.vue.d.ts +11 -0
  124. package/dist/src/components/shared/controls/SContextMenu.vue.js +2 -2
  125. package/dist/src/components/shared/controls/SContextMenu.vue_vue_type_script_setup_true_lang.js +163 -73
  126. package/dist/src/components/shared/controls/SContextToggleButton.vue_vue_type_script_setup_true_lang.js +6 -6
  127. package/dist/src/components/shared/controls/SDragHandle.vue_vue_type_script_setup_true_lang.js +5 -5
  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 +77 -65
  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_vue_type_script_setup_true_lang.js +21 -21
  136. package/dist/src/components/shared/controls/SInteractiveSurface.vue.js +2 -2
  137. package/dist/src/components/shared/controls/SInteractiveSurface.vue_vue_type_script_setup_true_lang.js +99 -74
  138. package/dist/src/components/shared/controls/SLink.d.ts +11 -1
  139. package/dist/src/components/shared/controls/SLink.vue.d.ts +17 -1
  140. package/dist/src/components/shared/controls/SLink.vue.js +2 -2
  141. package/dist/src/components/shared/controls/SLink.vue_vue_type_script_setup_true_lang.js +157 -62
  142. package/dist/src/components/shared/controls/SListbox.vue.d.ts +10 -1
  143. package/dist/src/components/shared/controls/SListbox.vue.js +2 -2
  144. package/dist/src/components/shared/controls/SListbox.vue_vue_type_script_setup_true_lang.js +371 -189
  145. package/dist/src/components/shared/controls/SListboxOption.vue.d.ts +6 -0
  146. package/dist/src/components/shared/controls/SListboxOption.vue.js +2 -2
  147. package/dist/src/components/shared/controls/SListboxOption.vue_vue_type_script_setup_true_lang.js +47 -34
  148. package/dist/src/components/shared/controls/SMenuSurface.vue.d.ts +2 -2
  149. package/dist/src/components/shared/controls/SMenuSurface.vue.js +2 -2
  150. package/dist/src/components/shared/controls/SMenuSurface.vue_vue_type_script_setup_true_lang.js +145 -115
  151. package/dist/src/components/shared/controls/SRange.vue_vue_type_script_setup_true_lang.js +12 -12
  152. package/dist/src/components/shared/controls/SSelect.vue.js +2 -2
  153. package/dist/src/components/shared/controls/SSelect.vue_vue_type_script_setup_true_lang.js +130 -112
  154. package/dist/src/components/shared/controls/STextarea.d.ts +1 -1
  155. package/dist/src/components/shared/controls/STextarea.vue.d.ts +28 -2
  156. package/dist/src/components/shared/controls/STextarea.vue_vue_type_script_setup_true_lang.js +348 -209
  157. package/dist/src/components/shared/controls/_internal/SInlineTokenSurface.vue_vue_type_script_lang.js +36 -36
  158. package/dist/src/components/shared/data-display/SActionList.vue.d.ts +1 -1
  159. package/dist/src/components/shared/data-display/SActionListItem.vue.d.ts +4 -4
  160. package/dist/src/components/shared/data-display/SActionListItem.vue_vue_type_script_setup_true_lang.js +6 -6
  161. package/dist/src/components/shared/data-display/SBadge.vue.d.ts +1 -1
  162. package/dist/src/components/shared/data-display/SChart.vue_vue_type_script_setup_true_lang.js +89 -89
  163. package/dist/src/components/shared/data-display/SChip.vue.d.ts +1 -1
  164. package/dist/src/components/shared/data-display/SChip.vue_vue_type_script_setup_true_lang.js +7 -7
  165. package/dist/src/components/shared/data-display/SCodeBlock.vue_vue_type_script_setup_true_lang.js +19 -19
  166. package/dist/src/components/shared/data-display/SCodeEditor.vue_vue_type_script_setup_true_lang.js +37 -37
  167. package/dist/src/components/shared/data-display/SCodeSearchPanel.vue_vue_type_script_setup_true_lang.js +17 -17
  168. package/dist/src/components/shared/data-display/SCodeWorkspaceEditor.vue_vue_type_script_setup_true_lang.js +12 -12
  169. package/dist/src/components/shared/data-display/SControlledToastViewport.vue.js +2 -2
  170. package/dist/src/components/shared/data-display/SControlledToastViewport.vue_vue_type_script_setup_true_lang.js +57 -48
  171. package/dist/src/components/shared/data-display/SDiffViewer.vue_vue_type_script_setup_true_lang.js +13 -13
  172. package/dist/src/components/shared/data-display/SDocBlock.vue_vue_type_script_setup_true_lang.js +12 -12
  173. package/dist/src/components/shared/data-display/SEmptyState.vue.d.ts +1 -1
  174. package/dist/src/components/shared/data-display/SEmptyState.vue_vue_type_script_setup_true_lang.js +4 -4
  175. package/dist/src/components/shared/data-display/SExpandableText.vue_vue_type_script_setup_true_lang.js +7 -7
  176. package/dist/src/components/shared/data-display/SKeyValueGrid.vue_vue_type_script_setup_true_lang.js +15 -15
  177. package/dist/src/components/shared/data-display/SLinkedSystemsList.vue_vue_type_script_setup_true_lang.js +17 -17
  178. package/dist/src/components/shared/data-display/SMessage.vue.d.ts +1 -1
  179. package/dist/src/components/shared/data-display/SMessage.vue_vue_type_script_setup_true_lang.js +9 -9
  180. package/dist/src/components/shared/data-display/SMetricCard.vue.d.ts +1 -1
  181. package/dist/src/components/shared/data-display/SProgressBar.vue.d.ts +22 -3
  182. package/dist/src/components/shared/data-display/SProgressBar.vue.js +2 -2
  183. package/dist/src/components/shared/data-display/SProgressBar.vue_vue_type_script_setup_true_lang.js +133 -47
  184. package/dist/src/components/shared/data-display/SProgressIndicator.vue_vue_type_script_setup_true_lang.js +4 -4
  185. package/dist/src/components/shared/data-display/SRichDocument.vue.js +2 -2
  186. package/dist/src/components/shared/data-display/SRichDocument.vue_vue_type_script_setup_true_lang.js +46 -23
  187. package/dist/src/components/shared/data-display/SScrollViewport.vue.d.ts +10 -5
  188. package/dist/src/components/shared/data-display/SScrollViewport.vue.js +2 -2
  189. package/dist/src/components/shared/data-display/SScrollViewport.vue_vue_type_script_setup_true_lang.js +162 -111
  190. package/dist/src/components/shared/data-display/SSectionHeader.vue.d.ts +1 -1
  191. package/dist/src/components/shared/data-display/SStatus.vue_vue_type_script_setup_true_lang.js +4 -4
  192. package/dist/src/components/shared/data-display/STable.vue.js +2 -2
  193. package/dist/src/components/shared/data-display/STable.vue_vue_type_script_setup_true_lang.js +343 -322
  194. package/dist/src/components/shared/data-display/STooltip.vue.d.ts +2 -2
  195. package/dist/src/components/shared/data-display/STooltip.vue_vue_type_script_setup_true_lang.js +284 -205
  196. package/dist/src/components/shared/data-display/STooltipAnchor.vue_vue_type_script_setup_true_lang.js +5 -5
  197. package/dist/src/components/shared/data-display/STooltipTarget.vue_vue_type_script_setup_true_lang.js +4 -4
  198. package/dist/src/components/shared/data-display/SVirtualList.vue.js +2 -2
  199. package/dist/src/components/shared/data-display/SVirtualList.vue_vue_type_script_setup_true_lang.js +196 -246
  200. package/dist/src/components/shared/data-display/_internal/SRichBlockNode.vue.js +2 -2
  201. package/dist/src/components/shared/data-display/_internal/SRichBlockNode.vue_vue_type_script_setup_true_lang.js +242 -220
  202. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue.d.ts +13 -2
  203. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue.js +2 -2
  204. package/dist/src/components/shared/data-display/_internal/SRichDisclosure.vue_vue_type_script_setup_true_lang.js +67 -11
  205. package/dist/src/components/shared/data-display/_internal/SRichImage.vue.d.ts +11 -0
  206. package/dist/src/components/shared/data-display/_internal/SRichImage.vue.js +8 -0
  207. package/dist/src/components/shared/data-display/_internal/SRichImage.vue_vue_type_script_setup_true_lang.js +89 -0
  208. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue.d.ts +3 -2
  209. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue.js +2 -2
  210. package/dist/src/components/shared/data-display/_internal/SRichInlineNode.vue_vue_type_script_setup_true_lang.js +179 -125
  211. package/dist/src/components/shared/data-display/_internal/SRichMath.vue_vue_type_script_setup_true_lang.js +4 -4
  212. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue.d.ts +21 -0
  213. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue.js +5 -0
  214. package/dist/src/components/shared/data-display/_internal/SRichTableNode.vue_vue_type_script_setup_true_lang.js +150 -0
  215. package/dist/src/components/shared/data-display/_internal/STableCell.vue.d.ts +52 -0
  216. package/dist/src/components/shared/data-display/_internal/STableCell.vue.js +8 -0
  217. package/dist/src/components/shared/data-display/_internal/STableCell.vue_vue_type_script_setup_true_lang.js +148 -0
  218. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.d.ts +42 -0
  219. package/dist/src/components/shared/data-display/_internal/STableFrame.vue.js +8 -0
  220. package/dist/src/components/shared/data-display/_internal/STableFrame.vue_vue_type_script_setup_true_lang.js +114 -0
  221. package/dist/src/components/shared/data-display/_internal/STableRow.vue.d.ts +43 -0
  222. package/dist/src/components/shared/data-display/_internal/STableRow.vue.js +8 -0
  223. package/dist/src/components/shared/data-display/_internal/STableRow.vue_vue_type_script_setup_true_lang.js +115 -0
  224. package/dist/src/components/shared/data-display/_internal/STableSection.vue.d.ts +28 -0
  225. package/dist/src/components/shared/data-display/_internal/STableSection.vue.js +5 -0
  226. package/dist/src/components/shared/data-display/_internal/STableSection.vue_vue_type_script_setup_true_lang.js +77 -0
  227. package/dist/src/components/shared/data-display/_internal/richDocumentMedia.d.ts +6 -0
  228. package/dist/src/components/shared/data-display/_internal/richDocumentMedia.js +136 -0
  229. package/dist/src/components/shared/data-display/_internal/richDocumentMetadata.d.ts +21 -0
  230. package/dist/src/components/shared/data-display/_internal/richDocumentMetadata.js +39 -0
  231. package/dist/src/components/shared/data-display/_internal/richDocumentNavigation.d.ts +30 -0
  232. package/dist/src/components/shared/data-display/_internal/richDocumentNavigation.js +88 -0
  233. package/dist/src/components/shared/data-display/_internal/richDocumentTableValidation.d.ts +9 -0
  234. package/dist/src/components/shared/data-display/_internal/richDocumentTableValidation.js +240 -0
  235. package/dist/src/components/shared/data-display/_internal/richDocumentTraversal.d.ts +15 -0
  236. package/dist/src/components/shared/data-display/_internal/richDocumentTraversal.js +61 -0
  237. package/dist/src/components/shared/data-display/_internal/richDocumentTypes.d.ts +466 -0
  238. package/dist/src/components/shared/data-display/_internal/richDocumentValidation.d.ts +65 -0
  239. package/dist/src/components/shared/data-display/_internal/richDocumentValidation.js +192 -0
  240. package/dist/src/components/shared/data-display/_internal/tableFoundation.d.ts +27 -0
  241. package/dist/src/components/shared/data-display/_internal/tableFoundation.js +16 -0
  242. package/dist/src/components/shared/data-display/richDocument.d.ts +3 -220
  243. package/dist/src/components/shared/data-display/richDocument.js +607 -399
  244. package/dist/src/components/shared/data-display/scrollViewport.d.ts +2 -0
  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 +140 -129
  253. package/dist/src/components/shared/navigation/SBreadcrumbs.vue.d.ts +2 -2
  254. package/dist/src/components/shared/navigation/STabList.vue.d.ts +1 -1
  255. package/dist/src/components/shared/navigation/STabPanel.vue.d.ts +2 -2
  256. package/dist/src/components/shared/navigation/SWizardSteps.vue_vue_type_script_setup_true_lang.js +16 -16
  257. package/dist/src/components/shared/persona/SPersonaProjectPicker.vue.d.ts +2 -2
  258. package/dist/src/composables/useDialogOverlay.d.ts +21 -2
  259. package/dist/src/composables/useDialogOverlay.js +275 -44
  260. package/dist/src/composables/useFloatingPosition.d.ts +20 -0
  261. package/dist/src/composables/useFloatingPosition.js +129 -52
  262. package/dist/src/internal/fieldSurface.d.ts +3 -0
  263. package/dist/src/internal/fieldSurface.js +3 -2
  264. package/dist/src/internal/flatTree.d.ts +8 -0
  265. package/dist/src/internal/flatTree.js +23 -0
  266. package/dist/src/internal/focusNavigation.d.ts +5 -0
  267. package/dist/src/internal/focusNavigation.js +29 -16
  268. package/dist/src/internal/inertLease.d.ts +8 -0
  269. package/dist/src/internal/inertLease.js +33 -0
  270. package/dist/src/internal/layerStack.d.ts +52 -0
  271. package/dist/src/internal/layerStack.js +343 -60
  272. package/dist/src/internal/linkTarget.d.ts +7 -1
  273. package/dist/src/internal/linkTarget.js +11 -7
  274. package/dist/src/internal/nativeFocus.d.ts +4 -0
  275. package/dist/src/internal/nativeFocus.js +12 -0
  276. package/dist/src/internal/overlayHost.d.ts +18 -0
  277. package/dist/src/internal/overlayHost.js +18 -0
  278. package/dist/src/internal/overlayPortal.d.ts +17 -0
  279. package/dist/src/internal/overlayPortal.js +23 -0
  280. package/dist/src/internal/ownedAttrs.d.ts +13 -3
  281. package/dist/src/internal/ownedAttrs.js +8 -1
  282. package/dist/src/internal/runtimeContract.d.ts +2 -0
  283. package/dist/src/internal/runtimeContract.js +10 -5
  284. package/dist/src/internal/semanticSizing.d.ts +2 -2
  285. package/dist/src/internal/semanticSizing.js +2 -1
  286. package/dist/src/internal/useMenuLayer.d.ts +8 -4
  287. package/dist/src/internal/useMenuLayer.js +78 -49
  288. package/dist/src/internal/viewportModality.d.ts +27 -0
  289. package/dist/src/internal/viewportModality.js +132 -0
  290. package/dist/tailwind.css +3 -0
  291. package/dist/typography.LICENSE.txt +94 -0
  292. package/dist/typography.js +5105 -0
  293. package/docs/getting-started.md +39 -0
  294. package/docs/link-download.md +114 -0
  295. package/docs/listbox.md +129 -0
  296. package/docs/overlay-lifecycle.md +195 -0
  297. package/docs/public-api.md +335 -6
  298. package/docs/resize.md +158 -0
  299. package/docs/rich-document.md +442 -25
  300. package/docs/scroll-viewport.md +30 -10
  301. package/docs/theming.md +42 -8
  302. package/package.json +12 -4
  303. package/src/components/shared/_internal/SDialogSurface.css +213 -36
  304. package/src/components/shared/_internal/SMenuLayer.css +4 -0
  305. package/src/components/shared/containers/SOverlayHost.css +14 -0
  306. package/src/components/shared/containers/SPopover.css +8 -2
  307. package/src/components/shared/controls/SButton.css +4 -3
  308. package/src/components/shared/controls/SCheckbox.css +19 -7
  309. package/src/components/shared/controls/SField.css +6 -0
  310. package/src/components/shared/controls/SListbox.css +17 -0
  311. package/src/components/shared/controls/SMenuSurface.css +18 -4
  312. package/src/components/shared/controls/STextarea.css +42 -3
  313. package/src/components/shared/data-display/SControlledToastViewport.css +2 -10
  314. package/src/components/shared/data-display/SProgressBar.css +79 -0
  315. package/src/components/shared/data-display/SRichDocument.css +1 -0
  316. package/src/components/shared/data-display/SScrollViewport.css +17 -1
  317. package/src/components/shared/data-display/SStatus.css +8 -25
  318. package/src/components/shared/data-display/STable.css +0 -113
  319. package/src/components/shared/data-display/STooltip.css +3 -0
  320. package/src/components/shared/data-display/_internal/SRichBlockNode.css +11 -7
  321. package/src/components/shared/data-display/_internal/SRichDisclosure.css +16 -0
  322. package/src/components/shared/data-display/_internal/SRichImage.css +37 -0
  323. package/src/components/shared/data-display/_internal/STableCell.css +55 -0
  324. package/src/components/shared/data-display/_internal/STableFrame.css +37 -0
  325. package/src/components/shared/data-display/_internal/STableRow.css +12 -0
  326. package/src/components/shared/feedback/SAsyncState.css +0 -4
  327. package/src/styles/style.css +9 -5
  328. package/src/styles/tokens.css +30 -0
  329. package/dist/assets/src/components/layout/SDockRegion.vue_vue_type_style_index_0_scoped_2932631d_lang.css +0 -1
  330. package/dist/assets/src/components/shared/_internal/SDialogSurface.css_vue_type_style_index_0_src_d1b65adf_scoped_d1b65adf_lang.css +0 -2
  331. package/dist/assets/src/components/shared/_internal/SMenuLayer.css_vue_type_style_index_0_src_4913bbe1_scoped_4913bbe1_lang.css +0 -1
  332. package/dist/assets/src/components/shared/containers/SDrawer.css_vue_type_style_index_0_src_091d7325_scoped_091d7325_lang.css +0 -2
  333. package/dist/assets/src/components/shared/containers/SModal.css_vue_type_style_index_0_src_0dc51b74_scoped_0dc51b74_lang.css +0 -2
  334. package/dist/assets/src/components/shared/containers/SPopover.css_vue_type_style_index_0_src_deded766_scoped_deded766_lang.css +0 -2
  335. package/dist/assets/src/components/shared/containers/SSidebarSection.css_vue_type_style_index_0_src_96f51ac6_scoped_96f51ac6_lang.css +0 -2
  336. package/dist/assets/src/components/shared/controls/SButton.css_vue_type_style_index_0_src_a5d8f7e0_scoped_a5d8f7e0_lang.css +0 -2
  337. package/dist/assets/src/components/shared/controls/SCheckbox.css_vue_type_style_index_0_src_b20b27dd_scoped_b20b27dd_lang.css +0 -2
  338. package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_e3b4f580_scoped_e3b4f580_lang.css +0 -2
  339. package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_00c91d39_scoped_00c91d39_lang.css +0 -1
  340. package/dist/assets/src/components/shared/controls/SField.css_vue_type_style_index_0_src_60628f96_scoped_60628f96_lang.css +0 -2
  341. package/dist/assets/src/components/shared/controls/SListbox.css_vue_type_style_index_0_src_24db4abb_scoped_24db4abb_lang.css +0 -2
  342. package/dist/assets/src/components/shared/controls/SMenuSurface.css_vue_type_style_index_0_src_ddcc5fbb_scoped_ddcc5fbb_lang.css +0 -2
  343. package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_441648c9_scoped_441648c9_lang.css +0 -2
  344. package/dist/assets/src/components/shared/data-display/SControlledToastViewport.css_vue_type_style_index_0_src_5864b6c6_scoped_5864b6c6_lang.css +0 -2
  345. package/dist/assets/src/components/shared/data-display/SProgressBar.css_vue_type_style_index_0_src_9308293a_scoped_9308293a_lang.css +0 -2
  346. package/dist/assets/src/components/shared/data-display/SRichDocument.css_vue_type_style_index_0_src_d1afafc5_scoped_d1afafc5_lang.css +0 -2
  347. package/dist/assets/src/components/shared/data-display/SScrollViewport.css_vue_type_style_index_0_src_e5d11342_scoped_e5d11342_lang.css +0 -2
  348. package/dist/assets/src/components/shared/data-display/STable.css_vue_type_style_index_0_src_9955d482_scoped_9955d482_lang.css +0 -2
  349. package/dist/assets/src/components/shared/data-display/SVirtualList.css_vue_type_style_index_0_src_cee8c247_scoped_cee8c247_lang.css +0 -2
  350. package/dist/assets/src/components/shared/data-display/_internal/SRichBlockNode.css_vue_type_style_index_0_src_195d5c06_scoped_195d5c06_lang.css +0 -2
  351. package/dist/assets/src/components/shared/data-display/_internal/SRichDisclosure.css_vue_type_style_index_0_src_fa94e2ff_scoped_fa94e2ff_lang.css +0 -2
  352. package/dist/assets/src/components/shared/feedback/SAsyncState.css_vue_type_style_index_0_src_bfc28903_scoped_bfc28903_lang.css +0 -2
  353. package/src/components/shared/containers/SDrawer.css +0 -69
  354. package/src/components/shared/containers/SModal.css +0 -27
@@ -9,7 +9,7 @@
9
9
 
10
10
  - `layout/*` — каркас приложения, dock regions, stack и workbench layouts;
11
11
  - `shared/controls/*` — buttons, fields, inputs, selects, menus и selection controls;
12
- - `shared/containers/*` — panels, modal, drawer, popover и sidebars;
12
+ - `shared/containers/*` — panels, modal, drawer, overlay host, popover и sidebars;
13
13
  - `shared/data-display/*` — badges, tables, code, JSON, progress, status и tooltips;
14
14
  - `shared/navigation/*` — tabs, breadcrumbs, catalog navigation и wizard steps;
15
15
  - `shared/database/*`, `shared/graph/*`, `shared/persona/*` — доменные сложные поверхности;
@@ -27,12 +27,39 @@ UI-kit-owned атрибуты `data-s-*` относятся к внутренн
27
27
  runtime-зависимости через layout конкретного package manager. Сборка использует
28
28
  `target/lib: ES2020`, совпадающий с baseline `@vue/tsconfig/tsconfig.dom.json`,
29
29
  и не требует скрытых полифиллов.
30
+ Сборка Tailwind entrypoints использует Node ESM `dist/typography.js` с native
31
+ `node:util`, полным upstream prose contract и options `className`/`target`
32
+ для `modern | legacy`; browser Web Storage и DOM globals не требуются.
33
+ `icons` публикует именованные tree-shakeable компоненты, включая `HardDrive`,
34
+ `Usb`, `Disc`, `CalendarDays`, `ArrowUpRight`, `Paperclip`, `GitFork`, `ZoomIn`,
35
+ `ZoomOut`, `RotateCw`, `Volume2`, `Radio`, `Pause`, `ChevronLeft` и `Zap`. `Zap`
36
+ обозначает молнию для роли быстрой модели и сохраняет primary-only силуэт
37
+ во всех цветовых режимах. `Pause`
38
+ обозначает состояние паузы; `ChevronLeft` — переход влево. `Radio` обозначает сетевое вещание
39
+ или фоновое уведомление, не radio input. `ZoomIn` и `ZoomOut` обозначают изменение
40
+ масштаба; `RotateCw` — поворот по часовой стрелке; `Volume2` — звук с двумя
41
+ волнами. Они используют общий icon
42
+ contract с `classic | sputnig` наборами, `auto | duotone | monochrome` цветом
43
+ и семантическим размером владельца control при передаче через icon slot.
30
44
  Типы таблицы импортируются из `shared/data-display/table`, типы графиков — из
31
45
  `shared/data-display/chart`, типы и чистая функция diff — из
32
46
  `shared/data-display/diff`. `SDiffViewer` принимает exact-text snapshots,
33
47
  показывает unified/split представление, виртуализирует строки и управляет
34
48
  вычислением в worker для больших входов. Смена source и unmount отменяют
35
49
  неактуальную работу; завершившийся устаревший результат не публикуется.
50
+ `SProgressBar.shape="circular"` предоставляет 24/28/32 px numerical indicator
51
+ через существующий progressbar owner. Determinate круг требует явный `value`
52
+ 0–100; `showValue` округляет только отображаемый процент, не `aria-valuenow`.
53
+ `valueText` описывает предметное измерение. `accuracy="estimated"` требует
54
+ `valueText` и видимую приблизительную отметку; явный `mode="unknown"` требует
55
+ `valueText`, отвергает `value` и не создаёт numerical или animated state.
56
+ Пассивная круговая форма допускает phrasing-композицию внутри кнопки в
57
+ decorative mode; интерактивный owner и доступное имя остаются у кнопки.
58
+ Штатная композиция использует `SButton.appearance="ghost"`, `iconOnly`,
59
+ `shape="circle"`, `size="lg"` и `density="default"` с областью 48×48 px.
60
+ Default linear/determinate и native range 0–100 сохраняются. Scoped default
61
+ slot с точным value относится только к linear label; circular отклоняет этот
62
+ slot и управляет числом и uncertainty marker через публичные props.
36
63
  `SChart` объединяет line/area/bar/pie/donut,
37
64
  responsive geometry, semantic palette и доступную таблицу данных. `SMetricCard`
38
65
  принимает компактный график через `#chart`. `SCodeBlock` сохраняет CodeMirror за
@@ -43,6 +70,27 @@ async boundary; `presentation="plain"` является lightweight read-only к
43
70
  `SActionListItem` держат primary activation и дополнительные controls
44
71
  sibling-элементами внутри одного chrome; `actionsLayout`/`trailingLayout`
45
72
  управляют inline, stacked и container-responsive раскладкой.
73
+ `SInteractiveSurface.tooltipTrigger` принимает полный combined `trigger` из
74
+ default slot `STooltip` и связывает ARIA, pointer/focus events и element ref
75
+ с primary activation owner в режимах action, link `href` и Vue Router `to`.
76
+ Link surface требует ровно один target и доступное имя; `to` требует
77
+ подключённого Vue Router. Static surface отклоняет tooltip binding.
78
+ Sibling `#actions` сохраняет независимые focus/activation. Подсказка
79
+ открывается по pointer/focus и закрывается через Escape.
80
+ Пассивный visual portal исключён из самостоятельного AX-чтения через
81
+ `aria-hidden`; полный rich content доступен как `aria-describedby` описание
82
+ focus owner. Внешние description references сохраняются; имя, роль и Tab
83
+ порядок owner не изменяются. Tooltip не принимает интерактивный контент.
84
+ Пассивная tooltip panel поддерживает геометрический hover без focus или Tab stop
85
+ и не перехватывает указатель у расположенных под ней действий. Выход из
86
+ target и панели закрывает её через `hideDelay`. Escape отменяет pending
87
+ `showDelay` без перехвата события у другого overlay. Blur, скрытие документа,
88
+ disabled и освобождение target завершают activation lease и его слушатели.
89
+ Binding допускает canonical focus owner в сохранённой скрытой секции.
90
+ Активация требует подключённого, видимого и доступного владельца. Скрытие
91
+ его ancestor отменяет pending-таймеры, сразу исключает visual portal из
92
+ взаимодействия и снимает tooltip description; последующий reveal сохраняет
93
+ тот же owner и допускает новое pointer/focus открытие.
46
94
  `SUiKitLocaleProvider` задаёт `en | ru | zh-CN | zh-TW` для одного Vue subtree,
47
95
  а `composables/useUiKitLocale` экспортирует readonly context, полный список
48
96
  локалей и типы messages/overrides/ключей. Provider не создаёт DOM owner и
@@ -62,23 +110,142 @@ callbacks и trust flags не входят в API.
62
110
  `sm/md/lg = 32/36/40 px` и label typography `12/14/14 px`; тот же
63
111
  `density="compact"` у `SInputText` даёт совместимую геометрию поля без
64
112
  consumer CSS.
113
+ Foreground/background `SButton` применяются атомарно без color interpolation
114
+ при disabled/loading → enabled и смене визуального состояния. Native
115
+ activation, `href` и Tab availability следуют текущим props без ожидания
116
+ декоративных shadow/transform transitions.
65
117
  `SInputText.minLength`/`maxLength` и `STextarea.minLength`/`maxLength` передают строгие
66
118
  неотрицательные safe integers нативному textual input; `minLength <= maxLength`
67
119
  проверяется до рендера, а numeric/temporal families отвергают этот контракт.
120
+ `STextareaContentContext.hasMultipleVisualLines` передаёт `false` для одной
121
+ native визуальной строки, `true` для нескольких и `null` при недоступном layout
122
+ (SSR/hidden/zero width). Soft wrapping и hard newline учитываются общей
123
+ editing/resize поверхностью; пустое значение при доступном layout имеет одну
124
+ строку. Условный helper использует `=== false`, `composing` и `disabled`, без
125
+ измерения private DOM; min/max ограничивают всю surface независимо от helper.
126
+ `STextareaApi.selectAll(focusOwner?: boolean): void` выделяет
127
+ `[0, currentNativeValue.length]` с direction `forward` через общий selection
128
+ owner. Default `true` запрашивает native focus; `false` его не меняет.
129
+ Readonly и non-rendered controls допускают selection; disabled/detached focus
130
+ зависит от native eligibility. Исходные CRLF/Unicode bytes, model и input/history
131
+ не меняются; текущий native value учитывает неподтверждённый controlled input.
132
+ Unavailable/disposed owner и non-boolean policy завершаются явной ошибкой.
133
+ `SDockRegion.keepMounted?: boolean` имеет default `false` и сохраняет
134
+ default disposal при скрытии. `true` сохраняет тот же slot owner, включая
135
+ initial hidden; `hidden`/`inert` исключают layout, Tab, pointer и accessibility,
136
+ а resize handle освобождается с typed cancellation активного drag.
137
+ Повторное отображение не перехватывает внешний focus. `true → false` при
138
+ скрытии и unmount освобождают содержимое. Transport/imperative buffers принадлежат
139
+ consumer; terminal `open()` требует visible connected host с positive extent.
140
+ Вложенные UI-kit overlays, включая Teleport, следуют `visible`: скрытие
141
+ завершает registered/pending cycles, освобождает leases/body lock и не
142
+ возвращает focus скрытому trigger. Initial hidden запрещает opening;
143
+ retired controlled `open=true` получает один close intent и требует свежего
144
+ `false → true`. Вложенные dock сочетают admission через AND; независимые
145
+ sibling overlays и consumer-owned arbitrary portals не затрагиваются.
68
146
  `SModal.headingLevel` и `SDrawer.headingLevel` принимают только `1 | 2 | 3 | 4 |
69
147
  5 | 6`, используют `2` по умолчанию и сохраняют связь видимого заголовка с
70
- dialog surface через `aria-labelledby`.
148
+ dialog surface через `aria-labelledby`. Локальная шапка диалога содержит
149
+ семантический heading и не создаёт page-level `banner`.
71
150
  `SModal.size="4xl"` задаёт responsive maximum `56rem`; при ошибке дочернего
72
151
  mount modal освобождает body lock, layer registration и owned teleport nodes.
152
+ Viewport `SModal`/`SDrawer` владеют единственным нативным `dialog` в modal top
153
+ layer, без `tabindex` на semantic root. Фон всех DOM namespaces исключён из
154
+ pointer/focus interaction и accessibility tree. Дочерние UI-kit portals
155
+ принадлежат actual dialog вне transform/scroll clipping; вложенный viewport
156
+ dialog изолирует родителя. Retirement синхронно освобождает native blocking,
157
+ сохраняя отдельный shared focus-return и visual leave lifecycle. Contained
158
+ drawer ограничивает HTML inert lease своим host и не вызывает `showModal()`.
159
+ Экспортируемый `useDialogOverlay` в viewport-режиме требует actual connected
160
+ `HTMLDialogElement` через `setPanelElement` и exact direct-child portal через
161
+ `setPortalElement`; contained-режим сохраняет HTMLElement surface внутри
162
+ SOverlayHost. Native methods принадлежат composable, не consumer.
163
+ Для custom viewport leaf `dialog` и portal находятся в одном Document;
164
+ portal — непосредственный дочерний HTMLElement semantic root. Visible frame
165
+ передаётся через `setDismissalElement`, его расположение не меняет native focus
166
+ scope. Controlled `open` является единственным запросом открытия/закрытия;
167
+ `showModal()`, `close()`, запись `open` и native `form method="dialog"` не являются
168
+ consumer API. Завершение формы использует обычный submit и явное controlled
169
+ намерение закрытия. Native `cancel` обрабатывается shared owner без потери
170
+ контроля над `open`. Композиция в стороннем native modal внутри opaque closed
171
+ shadow root требует отдельного host-owner контракта и не поддерживается этим API.
172
+ Обычные background sources внутри closed shadow root покрывает native Document
173
+ blocking. Контракт миграции custom leaf описан в [overlay-lifecycle.md](./overlay-lifecycle.md).
174
+ `SDrawer.placement` принимает `left | right | bottom` с default `right`.
175
+ Боковые размещения физические, не зависят от text direction и используют
176
+ общий size/scroll/focus owner; `left` зеркалирует сторону панели и её chrome.
177
+ В contained-режиме `extent` задаёт ширину для `left/right` и высоту для `bottom`.
178
+ `SOverlayHost` предоставляет default content и `#overlay` siblings.
179
+ `SDrawer.scope="contained"` требует этот host, оставляет внешний ввод доступным
180
+ и не объявляется глобально модальным. `extent` — конечный процент `(0,100]`
181
+ доступной области; без него `size=sm/md/lg` задаёт `50/70/90` процентов по оси
182
+ placement. `extent` запрещён для viewport-режима. `scrollBehavior="content"`
183
+ делегирует прокрутку дочернему viewport без второго scroll owner/полей.
184
+ Закрытие/retirement завершают дочерние overlay leases в общем stack; consumer
185
+ обрабатывает `update:open`, повторное открытие требует явного нового open-cycle.
186
+ Открытие через `SDropdownMenu` переносит exact current focus intent от
187
+ временного menuitem к dialog и сохраняет устойчивый menu trigger как цель
188
+ возврата, включая trigger вне contained host. Внешний focus отменяет pending
189
+ admission и stale return; contained Escape boundary остаётся локальной.
190
+ `SPopover` сохраняет native anchor и исходного focus owner trigger-запроса до
191
+ подтверждения controlled `open`, без перехвата последующего внешнего фокуса.
192
+ Программный `close()` отменяет ожидающий запрос через `update:open=false`.
193
+ Удаление или disabled текущего focused action не является outside-переходом:
194
+ панель остаётся открытой, принятое закрытие через Escape возвращает focus
195
+ доступному registered trigger.
196
+ Явный blur доступного элемента и внешний focus сохраняют outside-политику.
197
+ `SDrawer`, `SPopover`, `STooltip`, `SContextMenu` и
198
+ `SControlledToastViewport` сохраняют `opacity: 1` content при enter/leave:
199
+ transform motion не меняет прозрачность выбранной surface, backdrop анимируется отдельно.
200
+ Ширина `trigger` является минимальной шириной anchor, `content` — intrinsic,
201
+ `sm/md/lg` — viewport-bounded `20/28/36rem`. Chrome и focus owner используют
202
+ единые bounds; прозрачная поверхность задаёт всему dialog максимум `90vw`,
203
+ при `width="trigger"` минимальная ширина anchor имеет приоритет.
73
204
  `SDropdownMenu` публикует controlled `open`, `defaultOpen`, размещение
74
205
  `auto | bottom | top`, `closeOnSelect`, semantic group entries и доступные
75
- описания пунктов. `SCollapsiblePanel` связывает compact/dense density с
206
+ описания пунктов. Dropdown, контекстные и вложенные меню используют доступную
207
+ область viewport и собственную прокрутку полной коллекции. Размещение задаёт
208
+ предпочтительную сторону с collision/flip; keyboard focus раскрывает строку
209
+ внутри menu surface без прокрутки документа. Внутренний scroll сохраняет
210
+ открытое меню и parent layer; высота учитывает viewport и содержимое без
211
+ consumer `max-height` или дочерних CSS-переопределений.
212
+ Home/End раскрывают строку после ручной прокрутки; при отсутствии места по обеим
213
+ inline-сторонам вложенное меню использует доступную верхнюю/нижнюю сторону общего
214
+ collision owner.
215
+ `SCollapsiblePanel` связывает compact/dense density с
76
216
  32-пиксельной disclosure geometry через публичный API `SButton`.
217
+ `contentRole="region"` обозначает самостоятельный landmark и является значением
218
+ по умолчанию; `contentRole="group"` задаёт именованную локальную группу для
219
+ повторяемых или вложенных сведений. Обе роли связаны с видимым summary через
220
+ `aria-labelledby`; trigger сохраняет `aria-expanded` и `aria-controls`.
221
+ Raw `role` attrs не разрешены, неизвестный `contentRole` отклоняется без coercion.
222
+ `lazy` монтирует slot при первом принятом раскрытии и сохраняет его после
223
+ collapse/reopen в controlled и uncontrolled режимах, включая анимацию.
224
+ Controlled `open` эмитит `update:open` intent до prop acknowledgement;
225
+ uncontrolled режим изменяет собственное состояние без этого события.
226
+ Принятое сворачивание сразу исключает content из Tab/AX через inert и
227
+ aria-hidden, сохраняя mounted slot и завершающую анимацию. Owned focus
228
+ возвращается доступному trigger; внешний focus не перехватывается.
229
+ Отсутствие height transition завершает motion сразу; stale completion
230
+ не влияет на повторное раскрытие или изменённую высоту.
231
+ `SStatus` использует общую feedback tone-пару; `neutral` соответствует
232
+ `secondary`. Текстовый статус в passive content `SButton` использует foreground
233
+ интерактивной поверхности во всех доступных состояниях. `appearance="soft"`
234
+ владеет собственной фоновой/текстовой парой. `tone`, подпись, иконка и live
235
+ semantics сохраняются; `SCollapsiblePanel.summaryStatus` использует тот же путь
236
+ без consumer color overrides.
77
237
  `shared/data-display/SScrollViewport.vue` владеет accessible scroll region,
78
238
  разрешёнными осями, semantic block size, root-only keyboard navigation и
79
239
  ResizeObserver lifecycle. `shared/data-display/scrollViewport` экспортирует
80
240
  сериализуемое physical/semantic state и exposed API `focus`,
81
241
  `scrollToBoundary`, `reveal` без доступа к внутреннему DOM.
242
+ `focusPolicy="always"` — default; `overflow` добавляет region и Tab stop только
243
+ при переполнении разрешённой оси. Ровно один из `accessibleLabel` и
244
+ `accessibleLabelledby` задаёт имя. `blockSize="content"` сохраняет естественную
245
+ высоту, `maxBlockSize="none|sm|md|lg"` задаёт semantic limit. Канонический table
246
+ frame композирует этот owner, сохраняя native table semantics и nested controls.
247
+ При исчезновении overflow focused root сохраняет `tabindex="-1"` до native blur
248
+ без дополнительной остановки Tab или программного переноса focus.
82
249
 
83
250
  ## English
84
251
 
@@ -89,7 +256,7 @@ Primary groups:
89
256
 
90
257
  - `layout/*` — application shells, dock regions, stacks, and workbench layouts;
91
258
  - `shared/controls/*` — buttons, fields, inputs, selects, menus, and selection controls;
92
- - `shared/containers/*` — panels, modal, drawer, popover, and sidebars;
259
+ - `shared/containers/*` — panels, modal, drawer, overlay host, popover, and sidebars;
93
260
  - `shared/data-display/*` — badges, tables, code, JSON, progress, status, and tooltips;
94
261
  - `shared/navigation/*` — tabs, breadcrumbs, catalog navigation, and wizard steps;
95
262
  - `shared/database/*`, `shared/graph/*`, `shared/persona/*` — complex domain surfaces;
@@ -107,12 +274,39 @@ Consumer type checkers do not compile internal SFCs or resolve their runtime
107
274
  dependencies through a package-manager-specific layout. The build uses the
108
275
  `target/lib: ES2020` baseline from `@vue/tsconfig/tsconfig.dom.json` and does not
109
276
  require implicit polyfills.
277
+ Tailwind entrypoints use the Node ESM `dist/typography.js` artifact with
278
+ native `node:util`, the complete upstream prose contract, and `className`/
279
+ `target` options for `modern | legacy`, without browser Web Storage or DOM globals.
280
+ `icons` exports named tree-shakeable components, including `HardDrive`, `Usb`,
281
+ `Disc`, `CalendarDays`, `ArrowUpRight`, `Paperclip`, `GitFork`, `ZoomIn`, `ZoomOut`,
282
+ `RotateCw`, `Volume2`, `Radio`, `Pause`, `ChevronLeft`, and `Zap`. `Zap` represents
283
+ a lightning bolt for the fast-model role and retains its primary-only silhouette
284
+ in every color mode. `Pause` represents
285
+ a paused state; `ChevronLeft` represents leftward navigation. `Radio` represents network broadcast or a
286
+ background notification, not a radio input. `ZoomIn` and `ZoomOut` represent zoom actions,
287
+ `RotateCw` clockwise rotation, and `Volume2` a speaker with two sound waves.
288
+ They share the icon contract with
289
+ `classic | sputnig` sets, `auto | duotone | monochrome` color modes, and the
290
+ control owner's semantic sizing when passed through an icon slot.
110
291
  Table types are imported from `shared/data-display/table`; chart types are
111
292
  imported from `shared/data-display/chart`; diff types and its pure computation
112
293
  function are imported from `shared/data-display/diff`. `SDiffViewer` accepts
113
294
  exact-text snapshots, renders unified or split presentation, virtualizes lines,
114
295
  and manages worker computation for large inputs. Source replacement and unmount
115
296
  cancel obsolete work, and a completed stale result is never published.
297
+ `SProgressBar.shape="circular"` exposes 24/28/32 px measured progress through
298
+ the existing numerical/accessibility owner. Circular determinate progress
299
+ requires an explicit value in 0–100. `showValue` rounds only the displayed
300
+ percentage, retaining precise `aria-valuenow`; `valueText` provides a domain
301
+ description. Estimated accuracy requires `valueText` and a visible approximation
302
+ marker. Explicit unknown mode requires `valueText`, rejects `value`, and omits
303
+ the numerical value and animation. The passive circular root supports phrasing
304
+ composition in a button with decorative accessibility; the button owns the
305
+ action and accessible name. The public recipe uses `SButton.appearance="ghost"`,
306
+ `iconOnly`, `shape="circle"`, `size="lg"`, and default density for a 48×48 px
307
+ target. Default linear/determinate behavior is preserved;
308
+ its scoped default slot receives the exact value. Circular progress rejects a
309
+ supplied default slot and owns central numerical and uncertainty display.
116
310
  `SChart` unifies
117
311
  line/area/bar/pie/donut charts, responsive geometry, the semantic palette, and
118
312
  an accessible data table. `SMetricCard` accepts a compact chart through
@@ -124,6 +318,23 @@ the editor runtime. `SChip.surface` owns action/link semantics, while
124
318
  compositions keep primary activation and additional controls as siblings inside
125
319
  one chrome; `actionsLayout`/`trailingLayout` control inline, stacked, and
126
320
  container-responsive layout.
321
+ `SInteractiveSurface.tooltipTrigger` accepts the complete combined `trigger`
322
+ from the `STooltip` default slot and binds ARIA, pointer/focus events, and the
323
+ element ref to the primary activation owner for action, link `href`, and Vue
324
+ Router `to`. A link surface requires exactly one target and an accessible name;
325
+ `to` requires Vue Router installed in the application. A static surface rejects
326
+ the tooltip binding. Sibling `#actions` retain independent focus and activation.
327
+ The tooltip opens on pointer/focus and closes with Escape.
328
+ The passive tooltip panel supports geometric hover without focus or a Tab stop
329
+ and does not intercept pointer activation of underlying actions. Leaving
330
+ the target and panel closes it after `hideDelay`. Escape cancels a pending
331
+ `showDelay` without consuming another overlay's event. Blur, a hidden document,
332
+ disabled state, and target release terminate the activation lease and listeners.
333
+ Binding accepts a canonical focus owner in a retained hidden section.
334
+ Activation requires a connected, visible, available owner. Hiding its
335
+ ancestor cancels pending timers, immediately retires the visual portal from
336
+ interaction and removes the tooltip description. Revealing the section
337
+ retains the same owner and permits fresh pointer/focus activation.
127
338
  `SUiKitLocaleProvider` selects `en | ru | zh-CN | zh-TW` for one Vue subtree,
128
339
  while `composables/useUiKitLocale` exports the readonly context, the complete
129
340
  locale list, and message/override/key types. The provider renders no DOM owner
@@ -144,20 +355,138 @@ and trust flags are not part of the API.
144
355
  `sm/md/lg = 32/36/40 px` with `12/14/14 px` label typography. The matching
145
356
  `SInputText.density="compact"` exposes the same field geometry without consumer
146
357
  CSS.
358
+ The `SButton` foreground/background pair changes atomically, without color
359
+ interpolation, when disabled/loading actions become enabled or presentation
360
+ changes. Native activation, `href`, and Tab availability follow current props
361
+ without waiting for decorative shadow/transform transitions.
147
362
  `SInputText.minLength`/`maxLength` and `STextarea.minLength`/`maxLength` pass strict non-negative safe
148
363
  integers to the native textual input. `minLength <= maxLength` is validated
149
364
  before rendering, and numeric/temporal families reject this contract.
365
+ `STextareaContentContext.hasMultipleVisualLines` is `false` for one native
366
+ visual line, `true` for multiple lines, and `null` when layout is unavailable
367
+ (SSR/hidden/zero width). The editing/resize owner measures soft wrapping and
368
+ hard newlines; an empty value has one line once layout is available. Conditional
369
+ helpers use `=== false`, `composing` and `disabled`, without private DOM
370
+ measurement. Min/max bounds include the complete surface independently of the
371
+ helper visibility policy.
372
+ `STextareaApi.selectAll(focusOwner?: boolean): void` selects
373
+ `[0, currentNativeValue.length]` forward through the shared selection owner.
374
+ The default `true` requests native focus; `false` leaves it unchanged.
375
+ Readonly and non-rendered controls support selection; disabled/detached focus
376
+ follows native eligibility. Source CRLF/Unicode bytes, model, and input/history
377
+ are unchanged; the current native value includes unacknowledged controlled input.
378
+ An unavailable/disposed owner or non-boolean policy throws an explicit error.
379
+ `SDockRegion.keepMounted?: boolean` defaults to `false`, preserving disposal
380
+ on hide. `true` retains the same slot owner, including initially hidden content;
381
+ `hidden`/`inert` exclude layout, Tab, pointer, and accessibility, while the
382
+ resize handle retires with typed cancellation of an active drag.
383
+ Showing does not steal external focus. Hidden `true → false` and unmount
384
+ dispose the content. Transport/imperative buffers remain consumer-owned;
385
+ terminal `open()` requires a visible, connected host with positive extent.
386
+ Nested UI-kit overlays, including Teleports, follow `visible`: hiding retires
387
+ registered/pending cycles, releases leases/body locks, and never restores focus
388
+ to a hidden trigger. Initially hidden content cannot open overlays; retired
389
+ controlled `open=true` receives one close intent and needs a fresh `false → true`
390
+ request. Nested docks compose admission with AND; independent sibling overlays
391
+ and arbitrary consumer-owned portals are unaffected.
150
392
  `SModal.headingLevel` and `SDrawer.headingLevel` accept `1 | 2 | 3 | 4 | 5 | 6`
151
393
  only, default to `2`, and preserve the visible-title relationship with the
152
- dialog surface through `aria-labelledby`.
394
+ dialog surface through `aria-labelledby`. Local dialog chrome contains the
395
+ semantic heading without creating a page-level `banner` landmark.
153
396
  `SModal.size="4xl"` provides a responsive `56rem` maximum; a failed child mount
154
397
  releases body lock, layer registration, and owned teleport nodes.
398
+ Viewport `SModal`/`SDrawer` own one native `dialog` in the modal top layer, with
399
+ no `tabindex` on the semantic root. All background DOM namespaces leave
400
+ pointer/focus interaction and the accessibility tree. Descendant UI-kit portals
401
+ belong to the actual dialog outside transforms and scroll clipping; a nested
402
+ viewport dialog isolates its parent. Retirement releases native blocking
403
+ synchronously while preserving the shared focus-return and visual leave
404
+ lifecycles. A contained drawer limits an HTML inert lease to its host and does
405
+ not call `showModal()`.
406
+ The exported `useDialogOverlay` requires an actual connected `HTMLDialogElement`
407
+ through `setPanelElement` and its exact direct-child portal through
408
+ `setPortalElement` in viewport mode. Contained mode retains an HTMLElement
409
+ surface inside SOverlayHost. The composable owns native methods, not consumers.
410
+ The custom viewport leaf binds its visible frame through `setDismissalElement`
411
+ and applies `portalStyle` to its direct-child portal. Controlled `open` is the
412
+ only opening/closing request; direct native lifecycle calls, `open` writes and
413
+ `form method="dialog"` exits are not consumer APIs. Regular form submission
414
+ uses an explicit parent close intent. Nesting inside a foreign native modal in
415
+ an opaque closed shadow root requires a separate host-owner contract.
416
+ See [overlay-lifecycle.md](./overlay-lifecycle.md) for the custom-leaf migration.
417
+ `SDrawer.placement` accepts `left | right | bottom`, defaulting to `right`.
418
+ Side placements are physical, independent of text direction, and share the
419
+ size/scroll/focus owner; `left` mirrors the panel edge and its chrome.
420
+ Contained `extent` specifies width for `left/right` and height for `bottom`.
421
+ `SOverlayHost` provides default content and `#overlay` sibling regions.
422
+ `SDrawer.scope="contained"` requires that host, keeps external input available,
423
+ and is not globally modal. `extent` is a finite percentage `(0,100]` of the
424
+ available region; without it, `size=sm/md/lg` specifies `50/70/90` percent along
425
+ the placement axis. Viewport mode rejects `extent`. `scrollBehavior="content"`
426
+ delegates scrolling to a child viewport without a second scroll owner/padding.
427
+ Close/retirement retires descendant overlay leases in the shared stack; the
428
+ consumer handles `update:open` and an explicit new open-cycle controls reopening.
429
+ Opening through `SDropdownMenu` transfers the exact current focus intent
430
+ from a transient menu item to the dialog and retains its stable menu trigger
431
+ for restoration, including triggers outside a contained host. External focus
432
+ cancels pending admission and stale restoration; contained Escape remains local.
433
+ `SPopover` preserves the native anchor and original focus owner of a trigger
434
+ request through controlled `open` acknowledgement without taking subsequent
435
+ external focus. Programmatic `close()` cancels a pending request with
436
+ `update:open=false`.
437
+ Removing or disabling the currently focused action is not an outside move:
438
+ the panel stays open, and an accepted Escape close restores the available
439
+ registered trigger.
440
+ Explicit blur of an available element and external focus retain the outside policy.
441
+ `SDrawer`, `SPopover`, `STooltip`, `SContextMenu`, and
442
+ `SControlledToastViewport` keep content at `opacity: 1` during entry/exit:
443
+ transform motion preserves the selected surface translucency, and backdrop animation is independent.
444
+ The `trigger` width is the anchor minimum, `content` is intrinsic, and
445
+ `sm/md/lg` are viewport-bounded `20/28/36rem`. Chrome and focus owner share
446
+ the same bounds; a transparent surface sets the entire dialog's maximum to `90vw`.
447
+ With `width="trigger"`, the anchor minimum takes precedence.
155
448
  `SDropdownMenu` exposes controlled `open`, `defaultOpen`,
156
449
  `auto | bottom | top` placement, `closeOnSelect`, semantic group entries, and
157
- accessible item descriptions. `SCollapsiblePanel` maps compact/dense density to
450
+ accessible item descriptions. Dropdown, context, and nested menus use the
451
+ available viewport and own scrolling of the complete inventory. Placement
452
+ specifies a preferred side with collision/flip; keyboard focus reveals its row
453
+ inside the menu surface without scrolling the document. Internal scrolling
454
+ preserves the open menu and parent layer; height follows the viewport and
455
+ content without consumer `max-height` or child CSS overrides.
456
+ Home/End reveal the current row after manual scrolling; when neither inline
457
+ side fits a submenu, it uses the available top/bottom side of the shared
458
+ collision owner.
459
+ `SCollapsiblePanel` maps compact/dense density to
158
460
  the 32px disclosure geometry through the public `SButton` API.
461
+ `contentRole="region"` marks an independently navigable landmark and is the
462
+ default; `contentRole="group"` provides a named local group for repeated or
463
+ nested details. Both roles are labelled by the visible summary through
464
+ `aria-labelledby`; the trigger retains `aria-expanded` and `aria-controls`.
465
+ Raw `role` attrs are not admitted; unknown `contentRole` values fail without
466
+ coercion. `lazy` mounts its slot on the first accepted opening and retains it
467
+ across collapse/reopen in controlled and uncontrolled modes, including animation.
468
+ Controlled `open` emits `update:open` intent before prop acknowledgement;
469
+ uncontrolled mode updates its owned state without that event.
470
+ Accepted collapse immediately excludes content from Tab/AX using inert
471
+ and aria-hidden, retaining the mounted slot and closing visual transition.
472
+ Owned focus returns to an available trigger; external focus is not taken.
473
+ An absent height transition settles motion immediately; stale completion
474
+ does not affect reopening or an updated content height.
475
+ `SStatus` uses the shared feedback tone pair; `neutral` maps to `secondary`.
476
+ A text status in `SButton` passive content uses the interactive surface's
477
+ foreground across its available states. `appearance="soft"` owns its
478
+ background/text pair. Tone, label, icon, and live semantics are preserved;
479
+ `SCollapsiblePanel.summaryStatus` uses the same path without consumer color
480
+ overrides.
159
481
  `shared/data-display/SScrollViewport.vue` owns the accessible scroll region,
160
482
  enabled axes, semantic block size, root-only keyboard navigation, and
161
483
  ResizeObserver lifecycle. `shared/data-display/scrollViewport` exports
162
484
  serializable physical and semantic state plus the `focus`, `scrollToBoundary`,
163
485
  and `reveal` exposed API without access to internal DOM.
486
+ `focusPolicy="always"` is the default; `overflow` adds a region and Tab stop
487
+ only when an enabled axis overflows. Exactly one of `accessibleLabel` and
488
+ `accessibleLabelledby` supplies the name. `blockSize="content"` retains intrinsic
489
+ height, and `maxBlockSize="none|sm|md|lg"` supplies a semantic limit. The canonical
490
+ table frame composes this owner, retaining native table semantics and nested controls.
491
+ After overflow disappears, a focused root retains `tabindex="-1"` until native
492
+ blur, without an additional Tab stop or programmatic focus move.
package/docs/resize.md ADDED
@@ -0,0 +1,158 @@
1
+ # Изменение размеров панелей
2
+
3
+ `SResizeHandle` владеет native `button` с `role="separator"`, pointer capture,
4
+ клавиатурой, hitbox и interaction lease для cursor/selection. `SDockRegion`
5
+ композирует этот leaf и определяет семантический результат dock gesture.
6
+ Consumer хранит размер и его persistent preference; собственные pointer
7
+ listeners и расчёт pointer delta не требуются.
8
+
9
+ ## Публичные типы
10
+
11
+ ```ts
12
+ import type {
13
+ SResizeHandleCancel,
14
+ SResizeHandleCancelReason,
15
+ SResizeHandleCompletion,
16
+ SResizeHandleHitbox,
17
+ SDockRegionCollapse,
18
+ } from '@pgcorp/ui-kit/layout/types'
19
+ ```
20
+
21
+ Эти типы доступны также в корневом type export пакета. `SResizeHandle` сохраняет
22
+ type exports через путь своего компонента.
23
+
24
+ `hitbox` принимает `compact` (6 px), `standard` (12 px) или `spacious` (32 px).
25
+ По умолчанию inline separator использует `compact`, overlay — `spacious`.
26
+ `SDockRegion.hitbox` передаёт ту же семантическую ступень native владельцу.
27
+
28
+ ## Pointer transaction
29
+
30
+ | Событие | Payload | Контракт |
31
+ | --- | --- | --- |
32
+ | `resize-start` | `PointerEvent` | Начало pointer preview |
33
+ | `resize` | `number` | Preview, ограниченный текущим `min/max` |
34
+ | `resize-end` | `number`, `SResizeHandleCompletion` | Принятие конечной координаты `pointerup` |
35
+ | `resize-cancel` | `SResizeHandleCancel` | Отмена без `resize-end` |
36
+
37
+ `SResizeHandleCompletion` содержит `source: 'pointer'`, `startValue` и
38
+ `unclampedValue`. Логический intent вычисляется leaf-компонентом с axis,
39
+ `valueDirection` и `pointerScale` gesture. Ограничение применяется по актуальному
40
+ `min/max`; `pointerup` учитывается даже без предшествующего `pointermove`.
41
+
42
+ `SResizeHandleCancel` содержит `initialValue`, последний ограниченный
43
+ `latestValue` и точную `reason`: `pointercancel`, `lostpointercapture`,
44
+ `window-blur`, `disabled`, `superseded` или `unmount`. Все listeners, capture и
45
+ interaction lease освобождаются при завершении и отмене. Отмена соответствует
46
+ [Pointer Events: pointercancel и lostpointercapture](https://www.w3.org/TR/pointerevents3/).
47
+
48
+ Consumer применяет `resize` к preview. В `resize-end` он принимает размер и
49
+ сохраняет preference. `initialValue` — отображаемый размер на старте, а не
50
+ сохранённая preference: адаптивная рабочая область может ограничивать её своим
51
+ диапазоном. В `resize-cancel` consumer восстанавливает отображаемый snapshot в
52
+ актуальной host geometry; persistence preference восстанавливается из его
53
+ собственного transaction snapshot, не из `initialValue`. Отменённый preview
54
+ не сохраняется. На время pointer transaction persistent watcher должен быть
55
+ отделён от preview state.
56
+
57
+ ## Клавиатурное завершение
58
+
59
+ Arrow/Home/End применяют одно дискретное изменение: `resize(value)`, затем
60
+ `resize-end(value)` без `SResizeHandleCompletion`. Отсутствие completion
61
+ обозначает клавиатурный источник; pointer completion всегда содержит
62
+ `source: 'pointer'`. Клавиатура не открывает pointer transaction и не выдаёт
63
+ `resize-start` или `resize-cancel`.
64
+
65
+ Значение ограничивается текущими `min/max`. На границе диапазона, для
66
+ ортогональной стрелки, при `disabled` или во время активного pointer gesture
67
+ события изменения и завершения не выдаются. Если обработчик `resize` удаляет
68
+ native owner, завершение после его disposal не выдаётся.
69
+
70
+ Consumer может хранить preview в `resize` и сохранять preference в
71
+ `resize-end` для обоих источников. Если составной owner уже атомарно сохраняет
72
+ клавиатурный `resize`, terminal notification не выполняет повторную запись:
73
+ обработчик явно разделяет источники по completion. Pointer commit требует
74
+ собственной живой transaction, а не разрешается при её отсутствии.
75
+
76
+ ```ts
77
+ function finishSizeChange(value: number, completion?: SResizeHandleCompletion): void {
78
+ if (completion === undefined) {
79
+ commitKeyboardSize(value)
80
+ return
81
+ }
82
+ commitPointerSize(value, completion)
83
+ }
84
+ ```
85
+
86
+ ```vue
87
+ <SDockRegion
88
+ placement="left"
89
+ :visible="visible"
90
+ :size="size"
91
+ :min-size="200"
92
+ :max-size="maxSize"
93
+ hitbox="standard"
94
+ @resize-start="beginSizeTransaction"
95
+ @resize="previewSize"
96
+ @resize-end="finishSizeChange"
97
+ @resize-cancel="cancelSizeTransaction"
98
+ >
99
+ <ProjectPanel />
100
+ </SDockRegion>
101
+ ```
102
+
103
+ Размер, min/max, step и pointerScale должны быть конечными числами; размер
104
+ находится в min/max, `min <= max`, `step > 0` и `pointerScale > 0`. Consumer
105
+ передаёт согласованный диапазон при изменении рабочей области. Некорректный
106
+ диапазон отклоняется с `RangeError`; компонент не исправляет входные данные.
107
+
108
+ ## Сворачивание dock
109
+
110
+ `SDockRegion.collapseThreshold` включает сворачивание только для committed
111
+ pointer release. Порог — конечное число `0 <= collapseThreshold < minSize`.
112
+ Preview остаётся ограниченным `minSize`; временно непригодная узкая панель не
113
+ рендерится.
114
+
115
+ Если конечный `unclampedValue` строго ниже порога, dock эмитит только
116
+ `collapse({ preferredSize: startValue })`, без конкурирующего `resize-end`.
117
+ В остальных случаях он передаёт `resize-end` и completion. Consumer закрывает
118
+ панель по `collapse` и сохраняет `preferredSize` для повторного открытия.
119
+ Pointer cancellation не вызывает `collapse`. Keyboard Home устанавливает
120
+ `minSize` и не сворачивает панель.
121
+
122
+ ```vue
123
+ <SDockRegion
124
+ placement="left"
125
+ :visible="visible"
126
+ :size="size"
127
+ :min-size="200"
128
+ :max-size="maxSize"
129
+ :collapse-threshold="80"
130
+ hitbox="standard"
131
+ @resize-start="beginSizeTransaction"
132
+ @resize="previewSize"
133
+ @resize-end="finishSizeChange"
134
+ @resize-cancel="cancelSizeTransaction"
135
+ @collapse="collapseSizeTransaction"
136
+ >
137
+ <ProjectPanel />
138
+ </SDockRegion>
139
+ ```
140
+
141
+ Без `collapseThreshold` dock не сворачивается при перетаскивании. Для правой
142
+ панели можно оставить `minSize=240`, динамический `maxSize` и отключённый порог.
143
+
144
+ ## Составные владельцы
145
+
146
+ `SSidebarGroup` хранит pointer geometry preview локально. `update-sections`
147
+ передаёт принятую controlled preference после commit, а не на каждом move.
148
+ Отмена восстанавливает snapshot всей участвующей группы без persistence
149
+ события. Удаление секции освобождает её активную transaction. Клавиатура
150
+ передаёт дискретное изменение через `update-sections`.
151
+
152
+ `SWorkbenchPanelShell` восстанавливает secondary size через тот же cancel
153
+ payload; его диапазон принадлежит текущей рабочей области. Consumers используют
154
+ эти owners, а не создают собственный drag engine.
155
+
156
+ Storybook: `SResizeHandle/KeyboardCommitPersistence`,
157
+ `SResizeHandle/PointerTouchAndConcurrentLifecycle` и
158
+ `SDockRegion/CompanionDocks`, `CompanionDocksDark`, `CompanionDocksNarrow`.