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