@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
@@ -12,6 +12,22 @@ UI-kit поставляется как собранные Vue 3 ESM-модули
12
12
  Vite-based приложений. Consumer отвечает за единственные экземпляры `vue`,
13
13
  `pinia`, `@vue/devtools-api` и `vue-router`.
14
14
 
15
+ Build-инструменты Tailwind/PostCSS объявляются прямыми dev dependencies
16
+ приложения:
17
+
18
+ ```bash
19
+ npm install -D tailwindcss@^4.3.3 @tailwindcss/postcss@^4.3.3 postcss@^8.5.28
20
+ ```
21
+
22
+ `postcss.config.mjs`:
23
+
24
+ ```js
25
+ export default { plugins: { '@tailwindcss/postcss': {} } }
26
+ ```
27
+
28
+ Это контракт [интеграции Tailwind с PostCSS](https://tailwindcss.com/docs/installation/using-postcss).
29
+ Зависимости UI-kit не заменяют прямые imports build-контура приложения.
30
+
15
31
  ### Подключение
16
32
 
17
33
  UI-kit публикует собранные component-модули и использует Tailwind 4 utilities.
@@ -29,6 +45,10 @@ UI-kit публикует собранные component-модули и испо
29
45
  source root приложения задаётся явно, сохраните его на собственном
30
46
  `@import "tailwindcss" source("…")`.
31
47
 
48
+ Typography plugin включён в пакет как полная upstream-сборка. Отдельная
49
+ установка `@tailwindcss/typography` и consumer overrides его зависимостей не
50
+ требуются. Лицензии включённых модулей находятся в `dist/typography.LICENSE.txt`.
51
+
32
52
  ```ts
33
53
  import { createApp } from 'vue'
34
54
  import { createPinia } from 'pinia'
@@ -155,6 +175,21 @@ The UI kit is distributed as built Vue 3 ESM modules and declaration files for
155
175
  Vite-based applications. The consumer owns the single `vue`, `pinia`,
156
176
  `@vue/devtools-api`, and `vue-router` instances.
157
177
 
178
+ Declare the application's Tailwind/PostCSS build tools as direct dev dependencies:
179
+
180
+ ```bash
181
+ npm install -D tailwindcss@^4.3.3 @tailwindcss/postcss@^4.3.3 postcss@^8.5.28
182
+ ```
183
+
184
+ `postcss.config.mjs`:
185
+
186
+ ```js
187
+ export default { plugins: { '@tailwindcss/postcss': {} } }
188
+ ```
189
+
190
+ This follows the [Tailwind PostCSS integration contract](https://tailwindcss.com/docs/installation/using-postcss).
191
+ UI-kit dependencies do not replace direct imports owned by the application's build pipeline.
192
+
158
193
  ### Setup
159
194
 
160
195
  The UI kit publishes built component modules and uses Tailwind 4 utilities.
@@ -172,6 +207,10 @@ line is required and resolves relative to this CSS file. Consumers do not need
172
207
  a `reference.css` import. If the application uses an explicit source root, keep
173
208
  it on its own `@import "tailwindcss" source("…")`.
174
209
 
210
+ The package bundles the complete upstream typography plugin. No separate
211
+ `@tailwindcss/typography` installation or consumer dependency overrides are
212
+ required. Included module licenses are provided in `dist/typography.LICENSE.txt`.
213
+
175
214
  ```ts
176
215
  import { createApp } from 'vue'
177
216
  import { createPinia } from 'pinia'
@@ -0,0 +1,114 @@
1
+ # Скачивание вложений / Attachment downloads
2
+
3
+ `SButton` и `SLink` принимают `download` только вместе с `href`. В этом режиме
4
+ activation owner — обычный `HTMLAnchorElement`. UI-kit сохраняет native default
5
+ action для pointer click и Enter; обработчик consumer `@click` может отменить его
6
+ через `event.preventDefault()`. Router `to` и action button отвергают `download`
7
+ при типизации и во время работы, включая явно переданное `false`.
8
+
9
+ `SButton` and `SLink` accept `download` with `href` only. The activation owner is
10
+ a native `HTMLAnchorElement`. The kit preserves its pointer-click and Enter
11
+ default actions; a consumer `@click` listener can cancel the action with
12
+ `event.preventDefault()`. Router `to` and action buttons reject `download` both
13
+ in types and at runtime, including an explicitly supplied `false`.
14
+
15
+ Публичный модуль `@pgcorp/ui-kit/shared/controls/SLink` экспортирует `LinkDownload`,
16
+ `HrefDownloadDestination` и `DownloadLinkDestination`. Они описывают capability
17
+ `SButton/SLink`; обычный `LinkDestination` и модели menu/breadcrumb/bottom-nav
18
+ download не принимают. Это не отдельный control и не иной activation owner.
19
+
20
+ The public module `@pgcorp/ui-kit/shared/controls/SLink` exports `LinkDownload`,
21
+ `HrefDownloadDestination`, and `DownloadLinkDestination`. These express the
22
+ `SButton/SLink` capability; ordinary `LinkDestination` and menu/breadcrumb/bottom-nav
23
+ models do not accept downloads. They do not introduce a separate control or
24
+ activation owner.
25
+
26
+ | Значение / Value | Native intent |
27
+ | --- | --- |
28
+ | `"Полное вложение — профиль.bin"` | Имя передаётся буквально / The filename is passed verbatim |
29
+ | `true` или / or `""` | `download=""`; имя определяет браузер / The browser chooses the filename |
30
+ | `false` или отсутствие / or omission | Атрибут отсутствует / No download attribute |
31
+
32
+ `download` является рекомендацией браузеру, а не обходом его политики безопасности.
33
+ Для cross-origin HTTP-ресурса сервер управляет `Content-Disposition: attachment`;
34
+ server filename и ограничения файловой системы могут влиять на сохранённое имя.
35
+ Кит не изменяет строку filename, не проверяет origin эвристиками и не обещает
36
+ скачивание любого стороннего URL. Контракт следует
37
+ [HTML downloading resources](https://html.spec.whatwg.org/multipage/links.html#downloading-resources).
38
+
39
+ `download` expresses browser intent, not a security-policy override. For
40
+ cross-origin HTTP resources the server controls `Content-Disposition: attachment`;
41
+ server filenames and filesystem restrictions may affect the saved name. The kit
42
+ does not transform the filename, infer origin policy, or guarantee downloads of
43
+ arbitrary remote URLs. See the
44
+ [HTML download contract](https://html.spec.whatwg.org/multipage/links.html#downloading-resources).
45
+
46
+ ## Полный Blob и ограниченный просмотр / Complete Blob and limited preview
47
+
48
+ Consumer владеет полным `Blob`, его object URL и временем жизни. Просмотр может
49
+ показывать часть файла; `href` для скачивания должен указывать на полный исходный
50
+ Blob. Компоненты не читают, не сериализуют и не обрезают его содержимое.
51
+
52
+ The consumer owns the complete `Blob`, its object URL, and its lifetime. A preview
53
+ may display only part of the file; the download `href` must reference the complete
54
+ original Blob. Neither component reads, serializes, or truncates that content.
55
+
56
+ ```vue
57
+ <script setup lang="ts">
58
+ import { onBeforeUnmount, onMounted, shallowRef } from 'vue'
59
+ import SButton from '@pgcorp/ui-kit/shared/controls/SButton.vue'
60
+ import SLink from '@pgcorp/ui-kit/shared/controls/SLink.vue'
61
+
62
+ // One immutable attachment per mounted view; replace the view for another file.
63
+ const { attachment, filename } = defineProps<{
64
+ attachment: Blob
65
+ filename: string
66
+ }>()
67
+ const attachmentUrl = shallowRef<string>()
68
+
69
+ onMounted(() => {
70
+ attachmentUrl.value = URL.createObjectURL(attachment)
71
+ })
72
+ onBeforeUnmount(() => {
73
+ if (attachmentUrl.value !== undefined) URL.revokeObjectURL(attachmentUrl.value)
74
+ })
75
+ </script>
76
+
77
+ <template>
78
+ <SButton
79
+ v-if="attachmentUrl"
80
+ :href="attachmentUrl"
81
+ :download="filename"
82
+ label="Скачать полное вложение"
83
+ />
84
+ <SLink v-if="attachmentUrl" :href="attachmentUrl" :download="filename">
85
+ Скачать оригинал
86
+ </SLink>
87
+ </template>
88
+ ```
89
+
90
+ Создание object URL находится в `onMounted`, поэтому SSR не обращается к Blob URL
91
+ API. Ссылка остаётся действительной всё время, пока действие доступно. Не
92
+ отзывайте URL и не уничтожайте его владельца в click listener до запуска native
93
+ скачивания. [File API](https://w3c.github.io/FileAPI/#creating-revoking) определяет
94
+ отзыв URL и ошибку последующего доступа к нему.
95
+
96
+ Creating the URL in `onMounted` keeps Blob URL APIs out of SSR. Keep the URL alive
97
+ while its action remains available. Do not revoke it or destroy its owner in a
98
+ click listener before the native download starts. The
99
+ [File API](https://w3c.github.io/FileAPI/#creating-revoking) defines revocation and
100
+ the failure of subsequent access.
101
+
102
+ ## Недоступные состояния / Unavailable states
103
+
104
+ `SLink.disabled` и `SButton.disabled/loading` удаляют native `href` и `download`,
105
+ выставляют `aria-disabled` и исключают ссылку из Tab order. Они отменяют click
106
+ default action и не эмитят `click`. Снятие состояния восстанавливает исходные
107
+ `href` и filename. Для загрузки `SButton` также предоставляет `aria-busy` и
108
+ собственный индикатор. Нового download callback или hidden DOM owner нет.
109
+
110
+ `SLink.disabled` and `SButton.disabled/loading` remove native `href` and `download`,
111
+ set `aria-disabled`, and remove the link from the Tab order. They cancel click
112
+ default actions and do not emit `click`. Clearing the state restores the original
113
+ `href` and filename. A loading `SButton` also exposes `aria-busy` and its indicator.
114
+ There is no separate download callback or hidden DOM owner.
@@ -0,0 +1,129 @@
1
+ # SListbox: полный каталог и виртуальное окно
2
+
3
+ `SListbox` владеет единым контрактом выбора, keyboard navigation и доступности.
4
+ `SSelect` и `SCombobox` используют его как общий selection-компонент. Потребитель
5
+ передаёт полный `options`, а не видимый срез каталога.
6
+
7
+ ## Типизированная виртуализация
8
+
9
+ ```ts
10
+ interface SListboxVirtualization {
11
+ viewportHeight: number
12
+ estimatedItemHeight: number
13
+ overscan?: number
14
+ }
15
+ ```
16
+
17
+ `virtualization` необязателен. При отсутствии свойства все options находятся в
18
+ DOM. Он поддерживается для `variant="select"`; цветовая grid-композиция требует
19
+ другой геометрии и отвергает этот контракт.
20
+
21
+ `viewportHeight` — высота viewport в CSS px. `estimatedItemHeight` — оценочная
22
+ высота строки до измерения `ResizeObserver`. Оба значения должны быть конечными
23
+ числами в диапазоне `[1, 100000]`. `overscan` — число дополнительных строк с каждой
24
+ стороны окна, целое число `[0, 1000]`, штатное значение `8`. Неизвестные поля,
25
+ `null`, отрицательные значения и несовместимый variant вызывают точную ошибку.
26
+
27
+ Общий private geometry-owner используется также `SVirtualList`: stable keys,
28
+ измеренные высоты, prefix offsets, поиск диапазона и выравнивание строки.
29
+ `SListbox` сохраняет собственную семантику `ul`/`li`, `role="listbox"`, именованные
30
+ группы и option leaves; `SVirtualList` сохраняет list/log и viewport lifecycle.
31
+
32
+ ```vue
33
+ <SListbox
34
+ v-model="selectedFile"
35
+ :options="allFiles"
36
+ label="Файлы проекта"
37
+ :virtualization="{ viewportHeight: 240, estimatedItemHeight: 36, overscan: 4 }"
38
+ />
39
+ ```
40
+
41
+ В DOM находится окно viewport + overscan, активная/focused option и необходимые
42
+ подписи групп. У каждой смонтированной option `aria-posinset` и `aria-setsize`
43
+ описывают весь каталог: clear-option входит в набор, group labels не входят.
44
+ Смонтированная группа содержит хотя бы одну option и собственное доступное имя.
45
+
46
+ ## Identity, выбор и навигация
47
+
48
+ `value` каждой option — уникальный непустой string или конечное number. Числовой
49
+ `1` и строковый `'1'` являются разными ключами. Option DOM ID выводится из её
50
+ stable typed key, а не из позиции, поэтому prepend/reorder не меняют identity.
51
+
52
+ Arrow keys, Home/End, `moveActive()` и typeahead работают по полному inventory,
53
+ включая offscreen options, и пропускают disabled. Переход монтирует и прокручивает
54
+ целевую строку. Навигация не изменяет `modelValue`: выбор происходит через
55
+ Enter/Space/click или `selectActive()`.
56
+
57
+ `readonly` допускает навигацию, но не выбор. `disabled` блокирует оба действия.
58
+ У disabled виртуального списка viewport остаётся доступен через Tab для обычной
59
+ прокрутки клавишами PageUp/PageDown; focus не переходит на options и выбор
60
+ недоступен.
61
+ `selectionMode="multiple"` сохраняет порядок controlled выбранных ключей.
62
+ `clearOptionLabel` доступен только в single режиме. Невалидный selected/active
63
+ key, отсутствующий в каталоге, отвергается; kit не подменяет его другой option.
64
+
65
+ ## Внешний focus owner: STextarea
66
+
67
+ `focusMode="activedescendant"` поддерживает single selection и требует
68
+ `activeValue: TKey | null`. Focus остаётся в поле; options не становятся Tab stops
69
+ и pointer selection не переносит focus из поля.
70
+
71
+ Методы `initializeActive()`, `moveActive('next' | 'previous' | 'first' | 'last')`
72
+ и `selectActive()` управляют активной option. Событие `update:activeValue`
73
+ публикует typed key. Компонент удерживает последний requested cursor, пока
74
+ родитель подтверждает controlled значение; последовательные действия не должны
75
+ ждать перерисовку родителя.
76
+
77
+ Clear-option имеет отдельную cursor identity: после её запроса и подтверждения
78
+ `activeValue=null` она остаётся активной, а `selectActive()` очищает selection.
79
+ Метод `resetActive()` снимает активный cursor и публикует `activeValue=null`,
80
+ не выбирая clear-option и не меняя selection. Он служит явным reset-намерением,
81
+ в том числе когда clear-option уже подтверждена значением `null`.
82
+ Исходный `activeValue=null` без запроса clear-option означает отсутствие cursor.
83
+ Внешнее изменение `activeValue` без ожидающего запроса применяет переданное
84
+ controlled значение. Escape в composition вызывает `resetActive()`;
85
+ последующие Home/End и Arrow keys продолжают навигацию по полному каталогу.
86
+ Reset хранится в той же очереди typed запросов: запоздалое подтверждение
87
+ предыдущей option не восстанавливает снятый cursor.
88
+
89
+ `active-descendant-change(id: string | null)` сообщает DOM ID только после
90
+ монтирования целевой option. Exposed `activeOptionId` содержит то же значение.
91
+ При ручной прокрутке активная option остаётся смонтированной; `null` означает
92
+ отсутствие доступной mounted active target. При уничтожении списка связь
93
+ сбрасывается. Потребитель передаёт это событие в `STextarea.suggestions`, а не
94
+ вычисляет ID самостоятельно.
95
+
96
+ ```vue
97
+ <STextarea
98
+ v-model="message"
99
+ label="Сообщение"
100
+ :suggestions="{
101
+ controls: 'files',
102
+ ...(activeOptionId ? { activeDescendant: activeOptionId } : {}),
103
+ }"
104
+ />
105
+ <SListbox
106
+ id="files"
107
+ ref="fileList"
108
+ v-model="selectedFile"
109
+ v-model:active-value="activeFile"
110
+ :options="allFiles"
111
+ label="Файлы проекта"
112
+ focus-mode="activedescendant"
113
+ :virtualization="{ viewportHeight: 240, estimatedItemHeight: 36 }"
114
+ @active-descendant-change="activeOptionId = $event"
115
+ />
116
+ ```
117
+
118
+ Приложение владеет командами composer и вызывает методы списка из своего
119
+ `STextarea` keyboard handler. Оно не перехватывает IME, обычные caret keys или
120
+ модифицированные chords, не относящиеся к открытому suggestions-сценарию.
121
+ Строки списка, DOM поиск и локальные стили controls не нужны.
122
+
123
+ ## Проверочные состояния
124
+
125
+ Storybook: `VirtualCatalog`, `VirtualGrouped`, `VirtualMultiple`,
126
+ `VirtualReadonly`, `VirtualDisabled`, `VirtualExternalFocus`. Полный каталог
127
+ содержит 10000 options; внешняя композиция использует реальный `STextarea`.
128
+ Browser proof проверяет narrow/dark, ARIA target lifetime, offscreen focus,
129
+ выбор, scroll geometry, группы и accessibility.
@@ -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,36 @@ 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
+ `icons` публикует именованные tree-shakeable компоненты, включая `HardDrive`,
31
+ `Usb`, `Disc`, `CalendarDays`, `ArrowUpRight`, `Paperclip`, `GitFork`, `ZoomIn`,
32
+ `ZoomOut`, `RotateCw`, `Volume2`, `Radio`, `Pause`, `ChevronLeft` и `Zap`. `Zap`
33
+ обозначает молнию для роли быстрой модели и сохраняет primary-only силуэт
34
+ во всех цветовых режимах. `Pause`
35
+ обозначает состояние паузы; `ChevronLeft` — переход влево. `Radio` обозначает сетевое вещание
36
+ или фоновое уведомление, не radio input. `ZoomIn` и `ZoomOut` обозначают изменение
37
+ масштаба; `RotateCw` — поворот по часовой стрелке; `Volume2` — звук с двумя
38
+ волнами. Они используют общий icon
39
+ contract с `classic | sputnig` наборами, `auto | duotone | monochrome` цветом
40
+ и семантическим размером владельца control при передаче через icon slot.
30
41
  Типы таблицы импортируются из `shared/data-display/table`, типы графиков — из
31
42
  `shared/data-display/chart`, типы и чистая функция diff — из
32
43
  `shared/data-display/diff`. `SDiffViewer` принимает exact-text snapshots,
33
44
  показывает unified/split представление, виртуализирует строки и управляет
34
45
  вычислением в worker для больших входов. Смена source и unmount отменяют
35
46
  неактуальную работу; завершившийся устаревший результат не публикуется.
47
+ `SProgressBar.shape="circular"` предоставляет 24/28/32 px numerical indicator
48
+ через существующий progressbar owner. Determinate круг требует явный `value`
49
+ 0–100; `showValue` округляет только отображаемый процент, не `aria-valuenow`.
50
+ `valueText` описывает предметное измерение. `accuracy="estimated"` требует
51
+ `valueText` и видимую приблизительную отметку; явный `mode="unknown"` требует
52
+ `valueText`, отвергает `value` и не создаёт numerical или animated state.
53
+ Пассивная круговая форма допускает phrasing-композицию внутри кнопки в
54
+ decorative mode; интерактивный owner и доступное имя остаются у кнопки.
55
+ Штатная композиция использует `SButton.appearance="ghost"`, `iconOnly`,
56
+ `shape="circle"`, `size="lg"` и `density="default"` с областью 48×48 px.
57
+ Default linear/determinate и native range 0–100 сохраняются. Scoped default
58
+ slot с точным value относится только к linear label; circular отклоняет этот
59
+ slot и управляет числом и uncertainty marker через публичные props.
36
60
  `SChart` объединяет line/area/bar/pie/donut,
37
61
  responsive geometry, semantic palette и доступную таблицу данных. `SMetricCard`
38
62
  принимает компактный график через `#chart`. `SCodeBlock` сохраняет CodeMirror за
@@ -43,6 +67,17 @@ async boundary; `presentation="plain"` является lightweight read-only к
43
67
  `SActionListItem` держат primary activation и дополнительные controls
44
68
  sibling-элементами внутри одного chrome; `actionsLayout`/`trailingLayout`
45
69
  управляют inline, stacked и container-responsive раскладкой.
70
+ `SInteractiveSurface.tooltipTrigger` принимает полный combined `trigger` из
71
+ default slot `STooltip` и связывает ARIA, pointer/focus events и element ref
72
+ с primary activation owner в режимах action, link `href` и Vue Router `to`.
73
+ Link surface требует ровно один target и доступное имя; `to` требует
74
+ подключённого Vue Router. Static surface отклоняет tooltip binding.
75
+ Sibling `#actions` сохраняет независимые focus/activation. Подсказка
76
+ открывается по pointer/focus и закрывается через Escape.
77
+ Пассивная tooltip panel поддерживает hover без focus или Tab stop; выход из
78
+ target и панели закрывает её через `hideDelay`. Escape отменяет pending
79
+ `showDelay` без перехвата события у другого overlay. Blur, скрытие документа,
80
+ disabled и освобождение target завершают activation lease и его слушатели.
46
81
  `SUiKitLocaleProvider` задаёт `en | ru | zh-CN | zh-TW` для одного Vue subtree,
47
82
  а `composables/useUiKitLocale` экспортирует readonly context, полный список
48
83
  локалей и типы messages/overrides/ключей. Provider не создаёт DOM owner и
@@ -62,12 +97,78 @@ callbacks и trust flags не входят в API.
62
97
  `sm/md/lg = 32/36/40 px` и label typography `12/14/14 px`; тот же
63
98
  `density="compact"` у `SInputText` даёт совместимую геометрию поля без
64
99
  consumer CSS.
65
- `SInputText.minLength` и `SInputText.maxLength` передают строгие
100
+ `SInputText.minLength`/`maxLength` и `STextarea.minLength`/`maxLength` передают строгие
66
101
  неотрицательные safe integers нативному textual input; `minLength <= maxLength`
67
102
  проверяется до рендера, а numeric/temporal families отвергают этот контракт.
103
+ `STextareaContentContext.hasMultipleVisualLines` передаёт `false` для одной
104
+ native визуальной строки, `true` для нескольких и `null` при недоступном layout
105
+ (SSR/hidden/zero width). Soft wrapping и hard newline учитываются общей
106
+ editing/resize поверхностью; пустое значение при доступном layout имеет одну
107
+ строку. Условный helper использует `=== false`, `composing` и `disabled`, без
108
+ измерения private DOM; min/max ограничивают всю surface независимо от helper.
109
+ `STextareaApi.selectAll(focusOwner?: boolean): void` выделяет
110
+ `[0, currentNativeValue.length]` с direction `forward` через общий selection
111
+ owner. Default `true` запрашивает native focus; `false` его не меняет.
112
+ Readonly и non-rendered controls допускают selection; disabled/detached focus
113
+ зависит от native eligibility. Исходные CRLF/Unicode bytes, model и input/history
114
+ не меняются; текущий native value учитывает неподтверждённый controlled input.
115
+ Unavailable/disposed owner и non-boolean policy завершаются явной ошибкой.
116
+ `SDockRegion.keepMounted?: boolean` имеет default `false` и сохраняет
117
+ default disposal при скрытии. `true` сохраняет тот же slot owner, включая
118
+ initial hidden; `hidden`/`inert` исключают layout, Tab, pointer и accessibility,
119
+ а resize handle освобождается с typed cancellation активного drag.
120
+ Повторное отображение не перехватывает внешний focus. `true → false` при
121
+ скрытии и unmount освобождают содержимое. Transport/imperative buffers принадлежат
122
+ consumer; terminal `open()` требует visible connected host с positive extent.
123
+ Вложенные UI-kit overlays, включая Teleport, следуют `visible`: скрытие
124
+ завершает registered/pending cycles, освобождает leases/body lock и не
125
+ возвращает focus скрытому trigger. Initial hidden запрещает opening;
126
+ retired controlled `open=true` получает один close intent и требует свежего
127
+ `false → true`. Вложенные dock сочетают admission через AND; независимые
128
+ sibling overlays и consumer-owned arbitrary portals не затрагиваются.
68
129
  `SModal.headingLevel` и `SDrawer.headingLevel` принимают только `1 | 2 | 3 | 4 |
69
130
  5 | 6`, используют `2` по умолчанию и сохраняют связь видимого заголовка с
70
131
  dialog surface через `aria-labelledby`.
132
+ `SModal.size="4xl"` задаёт responsive maximum `56rem`; при ошибке дочернего
133
+ mount modal освобождает body lock, layer registration и owned teleport nodes.
134
+ `SDrawer.placement` принимает `left | right | bottom` с default `right`.
135
+ Боковые размещения физические, не зависят от text direction и используют
136
+ общий size/scroll/focus owner; `left` зеркалирует сторону панели и её chrome.
137
+ В contained-режиме `extent` задаёт ширину для `left/right` и высоту для `bottom`.
138
+ `SOverlayHost` предоставляет default content и `#overlay` siblings.
139
+ `SDrawer.scope="contained"` требует этот host, оставляет внешний ввод доступным
140
+ и не объявляется глобально модальным. `extent` — конечный процент `(0,100]`
141
+ доступной области; без него `size=sm/md/lg` задаёт `50/70/90` процентов по оси
142
+ placement. `extent` запрещён для viewport-режима. `scrollBehavior="content"`
143
+ делегирует прокрутку дочернему viewport без второго scroll owner/полей.
144
+ Закрытие/retirement завершают дочерние overlay leases в общем stack; consumer
145
+ обрабатывает `update:open`, повторное открытие требует явного нового open-cycle.
146
+ `SPopover` сохраняет native anchor и исходного focus owner trigger-запроса до
147
+ подтверждения controlled `open`, без перехвата последующего внешнего фокуса.
148
+ Программный `close()` отменяет ожидающий запрос через `update:open=false`.
149
+ Ширина `trigger` является минимальной шириной anchor, `content` — intrinsic,
150
+ `sm/md/lg` — viewport-bounded `20/28/36rem`. Chrome и focus owner используют
151
+ единые bounds; прозрачная поверхность задаёт всему dialog максимум `90vw`,
152
+ при `width="trigger"` минимальная ширина anchor имеет приоритет.
153
+ `SDropdownMenu` публикует controlled `open`, `defaultOpen`, размещение
154
+ `auto | bottom | top`, `closeOnSelect`, semantic group entries и доступные
155
+ описания пунктов. Dropdown, контекстные и вложенные меню используют доступную
156
+ область viewport и собственную прокрутку полной коллекции. Размещение задаёт
157
+ предпочтительную сторону с collision/flip; keyboard focus раскрывает строку
158
+ внутри menu surface без прокрутки документа. Внутренний scroll сохраняет
159
+ открытое меню и parent layer; высота учитывает viewport и содержимое без
160
+ consumer `max-height` или дочерних CSS-переопределений.
161
+ Home/End раскрывают строку после ручной прокрутки; при отсутствии места по обеим
162
+ inline-сторонам вложенное меню использует доступную верхнюю/нижнюю сторону общего
163
+ collision owner.
164
+ `SCollapsiblePanel` связывает compact/dense density с
165
+ 32-пиксельной disclosure geometry через публичный API `SButton`.
166
+ `SStatus` использует общую feedback tone-пару; `neutral` соответствует
167
+ `secondary`. Текстовый статус в passive content `SButton` использует foreground
168
+ интерактивной поверхности во всех доступных состояниях. `appearance="soft"`
169
+ владеет собственной фоновой/текстовой парой. `tone`, подпись, иконка и live
170
+ semantics сохраняются; `SCollapsiblePanel.summaryStatus` использует тот же путь
171
+ без consumer color overrides.
71
172
  `shared/data-display/SScrollViewport.vue` владеет accessible scroll region,
72
173
  разрешёнными осями, semantic block size, root-only keyboard navigation и
73
174
  ResizeObserver lifecycle. `shared/data-display/scrollViewport` экспортирует
@@ -83,7 +184,7 @@ Primary groups:
83
184
 
84
185
  - `layout/*` — application shells, dock regions, stacks, and workbench layouts;
85
186
  - `shared/controls/*` — buttons, fields, inputs, selects, menus, and selection controls;
86
- - `shared/containers/*` — panels, modal, drawer, popover, and sidebars;
187
+ - `shared/containers/*` — panels, modal, drawer, overlay host, popover, and sidebars;
87
188
  - `shared/data-display/*` — badges, tables, code, JSON, progress, status, and tooltips;
88
189
  - `shared/navigation/*` — tabs, breadcrumbs, catalog navigation, and wizard steps;
89
190
  - `shared/database/*`, `shared/graph/*`, `shared/persona/*` — complex domain surfaces;
@@ -101,12 +202,36 @@ Consumer type checkers do not compile internal SFCs or resolve their runtime
101
202
  dependencies through a package-manager-specific layout. The build uses the
102
203
  `target/lib: ES2020` baseline from `@vue/tsconfig/tsconfig.dom.json` and does not
103
204
  require implicit polyfills.
205
+ `icons` exports named tree-shakeable components, including `HardDrive`, `Usb`,
206
+ `Disc`, `CalendarDays`, `ArrowUpRight`, `Paperclip`, `GitFork`, `ZoomIn`, `ZoomOut`,
207
+ `RotateCw`, `Volume2`, `Radio`, `Pause`, `ChevronLeft`, and `Zap`. `Zap` represents
208
+ a lightning bolt for the fast-model role and retains its primary-only silhouette
209
+ in every color mode. `Pause` represents
210
+ a paused state; `ChevronLeft` represents leftward navigation. `Radio` represents network broadcast or a
211
+ background notification, not a radio input. `ZoomIn` and `ZoomOut` represent zoom actions,
212
+ `RotateCw` clockwise rotation, and `Volume2` a speaker with two sound waves.
213
+ They share the icon contract with
214
+ `classic | sputnig` sets, `auto | duotone | monochrome` color modes, and the
215
+ control owner's semantic sizing when passed through an icon slot.
104
216
  Table types are imported from `shared/data-display/table`; chart types are
105
217
  imported from `shared/data-display/chart`; diff types and its pure computation
106
218
  function are imported from `shared/data-display/diff`. `SDiffViewer` accepts
107
219
  exact-text snapshots, renders unified or split presentation, virtualizes lines,
108
220
  and manages worker computation for large inputs. Source replacement and unmount
109
221
  cancel obsolete work, and a completed stale result is never published.
222
+ `SProgressBar.shape="circular"` exposes 24/28/32 px measured progress through
223
+ the existing numerical/accessibility owner. Circular determinate progress
224
+ requires an explicit value in 0–100. `showValue` rounds only the displayed
225
+ percentage, retaining precise `aria-valuenow`; `valueText` provides a domain
226
+ description. Estimated accuracy requires `valueText` and a visible approximation
227
+ marker. Explicit unknown mode requires `valueText`, rejects `value`, and omits
228
+ the numerical value and animation. The passive circular root supports phrasing
229
+ composition in a button with decorative accessibility; the button owns the
230
+ action and accessible name. The public recipe uses `SButton.appearance="ghost"`,
231
+ `iconOnly`, `shape="circle"`, `size="lg"`, and default density for a 48×48 px
232
+ target. Default linear/determinate behavior is preserved;
233
+ its scoped default slot receives the exact value. Circular progress rejects a
234
+ supplied default slot and owns central numerical and uncertainty display.
110
235
  `SChart` unifies
111
236
  line/area/bar/pie/donut charts, responsive geometry, the semantic palette, and
112
237
  an accessible data table. `SMetricCard` accepts a compact chart through
@@ -118,6 +243,17 @@ the editor runtime. `SChip.surface` owns action/link semantics, while
118
243
  compositions keep primary activation and additional controls as siblings inside
119
244
  one chrome; `actionsLayout`/`trailingLayout` control inline, stacked, and
120
245
  container-responsive layout.
246
+ `SInteractiveSurface.tooltipTrigger` accepts the complete combined `trigger`
247
+ from the `STooltip` default slot and binds ARIA, pointer/focus events, and the
248
+ element ref to the primary activation owner for action, link `href`, and Vue
249
+ Router `to`. A link surface requires exactly one target and an accessible name;
250
+ `to` requires Vue Router installed in the application. A static surface rejects
251
+ the tooltip binding. Sibling `#actions` retain independent focus and activation.
252
+ The tooltip opens on pointer/focus and closes with Escape.
253
+ The passive tooltip panel supports hover without focus or a Tab stop; leaving
254
+ the target and panel closes it after `hideDelay`. Escape cancels a pending
255
+ `showDelay` without consuming another overlay's event. Blur, a hidden document,
256
+ disabled state, and target release terminate the activation lease and listeners.
121
257
  `SUiKitLocaleProvider` selects `en | ru | zh-CN | zh-TW` for one Vue subtree,
122
258
  while `composables/useUiKitLocale` exports the readonly context, the complete
123
259
  locale list, and message/override/key types. The provider renders no DOM owner
@@ -138,12 +274,80 @@ and trust flags are not part of the API.
138
274
  `sm/md/lg = 32/36/40 px` with `12/14/14 px` label typography. The matching
139
275
  `SInputText.density="compact"` exposes the same field geometry without consumer
140
276
  CSS.
141
- `SInputText.minLength` and `SInputText.maxLength` pass strict non-negative safe
277
+ `SInputText.minLength`/`maxLength` and `STextarea.minLength`/`maxLength` pass strict non-negative safe
142
278
  integers to the native textual input. `minLength <= maxLength` is validated
143
279
  before rendering, and numeric/temporal families reject this contract.
280
+ `STextareaContentContext.hasMultipleVisualLines` is `false` for one native
281
+ visual line, `true` for multiple lines, and `null` when layout is unavailable
282
+ (SSR/hidden/zero width). The editing/resize owner measures soft wrapping and
283
+ hard newlines; an empty value has one line once layout is available. Conditional
284
+ helpers use `=== false`, `composing` and `disabled`, without private DOM
285
+ measurement. Min/max bounds include the complete surface independently of the
286
+ helper visibility policy.
287
+ `STextareaApi.selectAll(focusOwner?: boolean): void` selects
288
+ `[0, currentNativeValue.length]` forward through the shared selection owner.
289
+ The default `true` requests native focus; `false` leaves it unchanged.
290
+ Readonly and non-rendered controls support selection; disabled/detached focus
291
+ follows native eligibility. Source CRLF/Unicode bytes, model, and input/history
292
+ are unchanged; the current native value includes unacknowledged controlled input.
293
+ An unavailable/disposed owner or non-boolean policy throws an explicit error.
294
+ `SDockRegion.keepMounted?: boolean` defaults to `false`, preserving disposal
295
+ on hide. `true` retains the same slot owner, including initially hidden content;
296
+ `hidden`/`inert` exclude layout, Tab, pointer, and accessibility, while the
297
+ resize handle retires with typed cancellation of an active drag.
298
+ Showing does not steal external focus. Hidden `true → false` and unmount
299
+ dispose the content. Transport/imperative buffers remain consumer-owned;
300
+ terminal `open()` requires a visible, connected host with positive extent.
301
+ Nested UI-kit overlays, including Teleports, follow `visible`: hiding retires
302
+ registered/pending cycles, releases leases/body locks, and never restores focus
303
+ to a hidden trigger. Initially hidden content cannot open overlays; retired
304
+ controlled `open=true` receives one close intent and needs a fresh `false → true`
305
+ request. Nested docks compose admission with AND; independent sibling overlays
306
+ and arbitrary consumer-owned portals are unaffected.
144
307
  `SModal.headingLevel` and `SDrawer.headingLevel` accept `1 | 2 | 3 | 4 | 5 | 6`
145
308
  only, default to `2`, and preserve the visible-title relationship with the
146
309
  dialog surface through `aria-labelledby`.
310
+ `SModal.size="4xl"` provides a responsive `56rem` maximum; a failed child mount
311
+ releases body lock, layer registration, and owned teleport nodes.
312
+ `SDrawer.placement` accepts `left | right | bottom`, defaulting to `right`.
313
+ Side placements are physical, independent of text direction, and share the
314
+ size/scroll/focus owner; `left` mirrors the panel edge and its chrome.
315
+ Contained `extent` specifies width for `left/right` and height for `bottom`.
316
+ `SOverlayHost` provides default content and `#overlay` sibling regions.
317
+ `SDrawer.scope="contained"` requires that host, keeps external input available,
318
+ and is not globally modal. `extent` is a finite percentage `(0,100]` of the
319
+ available region; without it, `size=sm/md/lg` specifies `50/70/90` percent along
320
+ the placement axis. Viewport mode rejects `extent`. `scrollBehavior="content"`
321
+ delegates scrolling to a child viewport without a second scroll owner/padding.
322
+ Close/retirement retires descendant overlay leases in the shared stack; the
323
+ consumer handles `update:open` and an explicit new open-cycle controls reopening.
324
+ `SPopover` preserves the native anchor and original focus owner of a trigger
325
+ request through controlled `open` acknowledgement without taking subsequent
326
+ external focus. Programmatic `close()` cancels a pending request with
327
+ `update:open=false`.
328
+ The `trigger` width is the anchor minimum, `content` is intrinsic, and
329
+ `sm/md/lg` are viewport-bounded `20/28/36rem`. Chrome and focus owner share
330
+ the same bounds; a transparent surface sets the entire dialog's maximum to `90vw`.
331
+ With `width="trigger"`, the anchor minimum takes precedence.
332
+ `SDropdownMenu` exposes controlled `open`, `defaultOpen`,
333
+ `auto | bottom | top` placement, `closeOnSelect`, semantic group entries, and
334
+ accessible item descriptions. Dropdown, context, and nested menus use the
335
+ available viewport and own scrolling of the complete inventory. Placement
336
+ specifies a preferred side with collision/flip; keyboard focus reveals its row
337
+ inside the menu surface without scrolling the document. Internal scrolling
338
+ preserves the open menu and parent layer; height follows the viewport and
339
+ content without consumer `max-height` or child CSS overrides.
340
+ Home/End reveal the current row after manual scrolling; when neither inline
341
+ side fits a submenu, it uses the available top/bottom side of the shared
342
+ collision owner.
343
+ `SCollapsiblePanel` maps compact/dense density to
344
+ the 32px disclosure geometry through the public `SButton` API.
345
+ `SStatus` uses the shared feedback tone pair; `neutral` maps to `secondary`.
346
+ A text status in `SButton` passive content uses the interactive surface's
347
+ foreground across its available states. `appearance="soft"` owns its
348
+ background/text pair. Tone, label, icon, and live semantics are preserved;
349
+ `SCollapsiblePanel.summaryStatus` uses the same path without consumer color
350
+ overrides.
147
351
  `shared/data-display/SScrollViewport.vue` owns the accessible scroll region,
148
352
  enabled axes, semantic block size, root-only keyboard navigation, and
149
353
  ResizeObserver lifecycle. `shared/data-display/scrollViewport` exports