@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
@@ -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.
@@ -0,0 +1,195 @@
1
+ # Жизненный цикл overlay / Overlay lifecycle
2
+
3
+ ## Русский
4
+
5
+ `SModal` и viewport `SDrawer` используют один native dialog owner. Публичные
6
+ props, slots и events этих компонентов не требуют consumer DOM API.
7
+ Составные окна, меню, поля выбора, popover и tooltip используют принадлежащий
8
+ окну portal. Global toast остаётся background notification owner; modal-local
9
+ controlled toast принадлежит окну, в котором он объявлен.
10
+
11
+ ### Custom leaf через `useDialogOverlay`
12
+
13
+ Контракт `composables/useDialogOverlay` предназначен для leaf, который владеет
14
+ полной semantic, visual и accessibility поверхностью своего диалога.
15
+ Приложения используют готовые `SModal`/`SDrawer`, если их props и slots выражают
16
+ нужную композицию.
17
+
18
+ Миграция `0.15` относится к собственным viewport leaf, использующим
19
+ экспортируемый composable: semantic surface — `HTMLDialogElement`, а portal —
20
+ его непосредственный дочерний HTMLElement. Публичные props, slots и events
21
+ готовых `SModal`/`SDrawer` сохраняются; contained leaf сохраняет HTMLElement
22
+ surface и `SOverlayHost`.
23
+
24
+ Для viewport leaf:
25
+
26
+ 1. Передать controlled boolean `open`, boolean `closable` и callback
27
+ `requestClose`. Callback формирует намерение, а состояние задаёт parent.
28
+ 2. Рендерить один подключённый `HTMLDialogElement` через `renderOpen` и связать
29
+ его ref с `setPanelElement`. Не задавать `open`, `autofocus` или `tabindex`
30
+ semantic root. Lifecycle native methods принадлежит composable.
31
+ 3. Создать прямой дочерний HTMLElement portal, связать его ref с
32
+ `setPortalElement` и применить `portalStyle`. Portal находится вне transform,
33
+ overflow clipping и visual scrolling frame.
34
+ 4. Связать visible frame с `setDismissalElement`; применить `backdropStyle` и
35
+ `surfaceStyle` к соответствующим принадлежащим leaf visual surfaces.
36
+ 5. Установить доступное имя диалога через heading/`aria-labelledby` либо
37
+ `aria-label`. Footer/submit completion запрашивает controlled close.
38
+
39
+ ### Исполняемый typed binding
40
+
41
+ Полная композиция — export `NativeOwnerContract` в
42
+ [`SModal.stories.ts`](https://github.com/pglyanenko/sputnig/blob/master/packages/ui-kit/src/components/shared/containers/SModal.stories.ts).
43
+ В Storybook она называется **«Публичный владелец нативного диалога»**,
44
+ story ID — `ui-kit-контейнеры-smodal--native-owner-contract`.
45
+ Тип `DialogOverlayController` импортируется из публичного
46
+ `@pgcorp/ui-kit/composables/useDialogOverlay`; native ref binding типизирован
47
+ как `DialogOverlayController['setPanelElement']`.
48
+
49
+ | Владелец в story | Binding | Контракт |
50
+ | --- | --- | --- |
51
+ | Родительское состояние | `open`, `closable`, `requestClose` | Callback формирует close intent; parent подтверждает его изменением `open` |
52
+ | Native root | `controller.renderOpen.value`, `bindSubject` → `controller.setPanelElement` | Единственный подключённый `<dialog>`; root без `open`, `autofocus` и `tabindex` |
53
+ | Доступное имя | `aria-labelledby="native-owner-title"`, `<h2 id="native-owner-title">` | Видимый heading именует semantic root |
54
+ | Backdrop | `controller.backdropStyle.value` | Собственная поверхность leaf, `aria-hidden="true"`, отдельная от content |
55
+ | Контейнер размещения и прокрутки | `controller.surfaceStyle.value` | Paint band visual frame; portal не является потомком scroll/transform owner |
56
+ | Видимая frame | `controller.setDismissalElement` | Точная граница pointer dismissal; semantic focus scope остаётся native root |
57
+ | Native portal | `controller.setPortalElement`, `controller.portalStyle.value` | Прямой дочерний HTMLElement dialog, sibling visual surfaces, `display: contents` |
58
+ | Кнопка завершения | `SButton` → `requestClose` | Обычное UI-kit действие без native `dialog.close()` |
59
+ | Явное освобождение | `controller.dispose()` | Retirement без запроса возврата focus |
60
+
61
+ В source приведены полные стили semantic root, backdrop, positioner и frame,
62
+ включая focus-visible frame. Native methods вызываются только shared owner.
63
+ Кнопки изменения admission, `beforetoggle` probes и неподдержанное завершение
64
+ формы — диагностические действия regression story, а не требования к consumer.
65
+ Этот же export исполняется в
66
+ [`ui-kit-native-dialog-isolation.visual.spec.ts`](https://github.com/pglyanenko/sputnig/blob/master/lvs/frontend/tests/storybook/ui-kit-native-dialog-isolation.visual.spec.ts):
67
+ проверяются подтверждённое закрытие, no-ACK, `closable=false`, explicit dispose,
68
+ отменённый focus intent, reentrant retirement и сохранение source attributes в
69
+ Chromium, Firefox и WebKit.
70
+
71
+ `opened` вызывается после подтверждённого initial focus claim самого semantic
72
+ root. Initial controlled child menu/popover имеет самостоятельного focus owner;
73
+ его доступность не требует initial focus permission родителя.
74
+ `dispose()` явно освобождает cycle без запроса возврата фокуса. Обычный unmount
75
+ использует shared guarded return к доступному launcher, захваченному из
76
+ фактического native focus. Pointer activation сама по себе не гарантирует
77
+ фокус кнопки во всех браузерах. Скрытый retained dock
78
+ отменяет admission и не возвращает focus скрытому trigger. Возврат видимости
79
+ не открывает отменённое окно: требуется новое явное изменение `open` с `false`
80
+ на `true`. Содержимое retained dock сохраняет свой экземпляр и состояние.
81
+
82
+ `scope="contained"` сохраняет HTMLElement surface внутри exact `SOverlayHost`
83
+ portal и локальный HTML inert lease. Native `showModal()` в этом режиме не
84
+ вызывается; внешние controls остаются доступными.
85
+
86
+ ### Граница lifecycle
87
+
88
+ Consumer не вызывает native `showModal()`/`close()`, не меняет `open` attribute
89
+ и не использует `form method="dialog"` как обход controlled состояния.
90
+ Для завершения формы предусмотрены обычный submit и явное намерение parent.
91
+ Уже отменённый submit не создаёт close intent. Native `cancel` не закрывает
92
+ controlled окно без обновления `open`; `closable=false` запрещает dismissal.
93
+
94
+ Native Document blocking охватывает HTML, SVG, MathML и background sources
95
+ внутри closed shadow root. Открытый дочерний native dialog изолирует предыдущие
96
+ native owners и их portal-содержимое на весь свой lifecycle. Их временные inert
97
+ leases освобождаются после native close до shared guarded focus return;
98
+ исходные атрибуты и независимые изменения host сохраняются.
99
+ Сторонний native modal внутри opaque closed shadow
100
+ root не входит в поддерживаемую nesting-композицию без exact host-owner
101
+ capability. Прямое вмешательство host в принадлежащий cycle или его временные
102
+ modality guards нарушает owner boundary.
103
+
104
+ ### Браузерная проверка
105
+
106
+ `make -C lvs frontend-browser-install` устанавливает browser revisions из
107
+ зафиксированного Playwright workspace. Команда не запускает quality gates.
108
+ `LVS_STORYBOOK_NATIVE_DIALOG_ENGINES=1 make -C lvs check-frontend-storybook-proof
109
+ PLAYWRIGHT_STORYBOOK_ARGS="tests/storybook/ui-kit-native-dialog-isolation.visual.spec.ts"`
110
+ проверяет native lifecycle в Chromium, Firefox и WebKit.
111
+
112
+ ## English
113
+
114
+ `SModal` and viewport `SDrawer` share one native dialog owner. Their public
115
+ props, slots and events require no consumer DOM lifecycle calls. Owned floating
116
+ surfaces use the dialog's portal; global notifications remain background-owned.
117
+
118
+ The `0.15` migration applies to custom viewport leaves using the exported
119
+ composable: the semantic surface is an `HTMLDialogElement`, and its portal is a
120
+ direct-child HTMLElement. The ready-made `SModal`/`SDrawer` retain their public
121
+ props, slots, and events. Contained leaves retain their HTMLElement surface and
122
+ `SOverlayHost` contract.
123
+
124
+ Custom `useDialogOverlay` viewport leaves provide one connected
125
+ `HTMLDialogElement` through `setPanelElement`, an exact direct-child portal
126
+ through `setPortalElement`, and the visible dismissal frame through
127
+ `setDismissalElement`. Render from `renderOpen`; apply the controller's
128
+ `backdropStyle`, `surfaceStyle` and `portalStyle` to their exact visual owners.
129
+ The semantic root has an accessible name and no `open`, `autofocus` or
130
+ `tabindex` assignment. Controlled `open` owns the lifecycle; `requestClose`
131
+ is an intent, not permission to mutate native state.
132
+
133
+ ### Executable typed binding
134
+
135
+ The complete composition is the `NativeOwnerContract` export in
136
+ [`SModal.stories.ts`](https://github.com/pglyanenko/sputnig/blob/master/packages/ui-kit/src/components/shared/containers/SModal.stories.ts).
137
+ Its Storybook name is **«Публичный владелец нативного диалога»** and its story ID
138
+ is `ui-kit-контейнеры-smodal--native-owner-contract`. `DialogOverlayController`
139
+ is imported from the public `@pgcorp/ui-kit/composables/useDialogOverlay`; the
140
+ native ref binding uses `DialogOverlayController['setPanelElement']`.
141
+
142
+ | Story owner | Binding | Contract |
143
+ | --- | --- | --- |
144
+ | Parent state | `open`, `closable`, `requestClose` | The callback produces a close intent; the parent acknowledges it by updating `open` |
145
+ | Native root | `controller.renderOpen.value`, `bindSubject` → `controller.setPanelElement` | One connected `<dialog>` without `open`, `autofocus`, or `tabindex` assignments |
146
+ | Accessible name | `aria-labelledby="native-owner-title"`, `<h2 id="native-owner-title">` | The visible heading names the semantic root |
147
+ | Backdrop | `controller.backdropStyle.value` | An owned leaf surface with `aria-hidden="true"`, separate from content |
148
+ | Placement and scrolling container | `controller.surfaceStyle.value` | The visual frame's paint band; the portal is outside scroll/transform ownership |
149
+ | Visible frame | `controller.setDismissalElement` | The exact pointer dismissal boundary; native root retains semantic focus scope |
150
+ | Native portal | `controller.setPortalElement`, `controller.portalStyle.value` | A direct-child HTMLElement dialog portal, sibling to visual surfaces, with `display: contents` |
151
+ | Completion button | `SButton` → `requestClose` | A regular UI-kit action without native `dialog.close()` |
152
+ | Explicit disposal | `controller.dispose()` | Retirement without a focus-return request |
153
+
154
+ The source includes complete semantic-root, backdrop, positioner, and frame
155
+ styles, including the focus-visible frame. Only the shared owner calls native
156
+ methods. Admission controls, `beforetoggle` probes, and unsupported form
157
+ completion are regression-story diagnostics, not consumer requirements.
158
+ The same export is exercised by
159
+ [`ui-kit-native-dialog-isolation.visual.spec.ts`](https://github.com/pglyanenko/sputnig/blob/master/lvs/frontend/tests/storybook/ui-kit-native-dialog-isolation.visual.spec.ts):
160
+ acknowledged close, no-ACK, `closable=false`, explicit disposal, cancelled focus
161
+ intent, reentrant retirement, and preserved source attributes are verified in
162
+ Chromium, Firefox, and WebKit.
163
+
164
+ `opened` follows the root's successful initial focus claim. Initially open
165
+ child layers retain their own focus ownership. Explicit `dispose()` requests
166
+ no return; ordinary unmount uses the shared guarded return to the available
167
+ launcher captured from actual native focus. Pointer activation does not
168
+ guarantee button focus in every browser. Hiding a retained dock revokes admission
169
+ without returning focus to its hidden trigger. Revealing the dock does not revive
170
+ the cancelled window: a fresh explicit `open` change from `false` to `true` is
171
+ required. The retained dock keeps its content instance and state.
172
+ Contained scope retains its local HTMLElement/`SOverlayHost` contract and does
173
+ not call native `showModal()`.
174
+
175
+ Direct `showModal()`, `close()`, `open` writes and `form method="dialog"` exits
176
+ are outside the controlled API. Use regular form submission and an explicit
177
+ parent close intent. Native cancel respects controlled state and dismissal
178
+ permission. Already cancelled submissions produce no close intent.
179
+
180
+ Native Document blocking covers HTML, SVG, MathML and ordinary closed-shadow
181
+ background sources. An open child native dialog isolates previous native owners
182
+ and their portal content for its entire lifecycle. Temporary inert leases release
183
+ after native close and before the shared guarded focus return; original attributes
184
+ and independent host writes are preserved.
185
+ Nesting inside a foreign native modal in an opaque closed
186
+ shadow root requires a separate exact host-owner capability. Host mutation of
187
+ the owned native cycle or its temporary modality guards violates ownership.
188
+
189
+ ### Browser verification
190
+
191
+ `make -C lvs frontend-browser-install` installs the browser revisions required
192
+ by the locked Playwright workspace; it does not run quality gates.
193
+ `LVS_STORYBOOK_NATIVE_DIALOG_ENGINES=1 make -C lvs check-frontend-storybook-proof
194
+ PLAYWRIGHT_STORYBOOK_ARGS="tests/storybook/ui-kit-native-dialog-isolation.visual.spec.ts"`
195
+ verifies the native lifecycle in Chromium, Firefox and WebKit.