@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.
- package/README.md +1055 -31
- 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_dc65aba1_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_a108e8f1_scoped_a108e8f1_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/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_71824088_scoped_71824088_lang.css → SCollapsiblePanel.css_vue_type_style_index_0_src_db85261d_scoped_db85261d_lang.css} +1 -1
- package/dist/assets/src/components/shared/containers/SOverlayHost.css_vue_type_style_index_0_src_09215628_scoped_09215628_lang.css +2 -0
- package/dist/assets/src/components/shared/containers/SPopover.css_vue_type_style_index_0_src_a4f1f64a_scoped_a4f1f64a_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_52396e42_scoped_52396e42_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_2562f916_scoped_2562f916_lang.css +2 -0
- package/dist/assets/src/components/shared/controls/SCombobox.css_vue_type_style_index_0_src_d630c922_scoped_d630c922_lang.css +2 -0
- package/dist/assets/src/components/shared/controls/SContextMenu.css_vue_type_style_index_0_src_43b6e378_scoped_43b6e378_lang.css +1 -0
- 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
- 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/{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_d2b7d71b_scoped_d2b7d71b_lang.css +2 -0
- package/dist/assets/src/components/shared/controls/SSelect.css_vue_type_style_index_0_src_d1ead6c0_scoped_d1ead6c0_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/SControlledToastViewport.css_vue_type_style_index_0_src_a69aa84b_scoped_a69aa84b_lang.css +2 -0
- 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/SScrollViewport.css_vue_type_style_index_0_src_d94fcf8c_scoped_d94fcf8c_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_914bad28_scoped_914bad28_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_68cf84b3_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 +127 -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.d.ts +9 -1
- 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 +183 -68
- 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/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 +17 -2
- package/dist/src/components/shared/_internal/dialogSurface.js +42 -23
- package/dist/src/components/shared/_internal/dialogSurfaceMotion.d.ts +14 -0
- package/dist/src/components/shared/_internal/dialogSurfaceMotion.js +84 -0
- package/dist/src/components/shared/_internal/focusTrap.js +15 -13
- 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 +5 -0
- 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 +123 -121
- package/dist/src/components/shared/containers/SDrawer.vue.d.ts +16 -5
- package/dist/src/components/shared/containers/SDrawer.vue.js +3 -6
- package/dist/src/components/shared/containers/SDrawer.vue_vue_type_script_setup_true_lang.js +149 -75
- package/dist/src/components/shared/containers/SModal.vue.d.ts +8 -8
- package/dist/src/components/shared/containers/SModal.vue.js +3 -6
- package/dist/src/components/shared/containers/SModal.vue_vue_type_script_setup_true_lang.js +93 -85
- 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 +66 -0
- package/dist/src/components/shared/containers/SPageHeader.vue.d.ts +1 -1
- package/dist/src/components/shared/containers/SPanel.vue.d.ts +2 -2
- 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 +250 -156
- 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 +59 -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 +53 -43
- 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 +157 -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 +163 -73
- 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.js +2 -2
- package/dist/src/components/shared/controls/SDropdownMenu.vue_vue_type_script_setup_true_lang.js +77 -65
- 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_vue_type_script_setup_true_lang.js +21 -21
- 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 +145 -115
- 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 +130 -112
- package/dist/src/components/shared/controls/STextarea.d.ts +1 -1
- package/dist/src/components/shared/controls/STextarea.vue.d.ts +28 -2
- package/dist/src/components/shared/controls/STextarea.vue_vue_type_script_setup_true_lang.js +348 -209
- package/dist/src/components/shared/controls/_internal/SInlineTokenSurface.vue_vue_type_script_lang.js +36 -36
- 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.js +2 -2
- package/dist/src/components/shared/data-display/SControlledToastViewport.vue_vue_type_script_setup_true_lang.js +57 -48
- 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.d.ts +10 -5
- package/dist/src/components/shared/data-display/SScrollViewport.vue.js +2 -2
- package/dist/src/components/shared/data-display/SScrollViewport.vue_vue_type_script_setup_true_lang.js +162 -111
- 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 +284 -205
- 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 +114 -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/data-display/scrollViewport.d.ts +2 -0
- 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 +140 -129
- package/dist/src/components/shared/navigation/SBreadcrumbs.vue.d.ts +2 -2
- package/dist/src/components/shared/navigation/STabList.vue.d.ts +1 -1
- 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 +21 -2
- package/dist/src/composables/useDialogOverlay.js +275 -44
- 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/flatTree.d.ts +8 -0
- package/dist/src/internal/flatTree.js +23 -0
- package/dist/src/internal/focusNavigation.d.ts +5 -0
- package/dist/src/internal/focusNavigation.js +29 -16
- package/dist/src/internal/inertLease.d.ts +8 -0
- package/dist/src/internal/inertLease.js +33 -0
- package/dist/src/internal/layerStack.d.ts +52 -0
- package/dist/src/internal/layerStack.js +343 -60
- package/dist/src/internal/linkTarget.d.ts +7 -1
- package/dist/src/internal/linkTarget.js +11 -7
- package/dist/src/internal/nativeFocus.d.ts +4 -0
- package/dist/src/internal/nativeFocus.js +12 -0
- package/dist/src/internal/overlayHost.d.ts +18 -0
- package/dist/src/internal/overlayHost.js +18 -0
- package/dist/src/internal/overlayPortal.d.ts +17 -0
- package/dist/src/internal/overlayPortal.js +23 -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/semanticSizing.d.ts +2 -2
- package/dist/src/internal/semanticSizing.js +2 -1
- package/dist/src/internal/useMenuLayer.d.ts +8 -4
- package/dist/src/internal/useMenuLayer.js +78 -49
- package/dist/src/internal/viewportModality.d.ts +27 -0
- package/dist/src/internal/viewportModality.js +132 -0
- package/dist/tailwind.css +3 -0
- package/dist/typography.LICENSE.txt +94 -0
- package/dist/typography.js +5105 -0
- package/docs/getting-started.md +39 -0
- package/docs/link-download.md +114 -0
- package/docs/listbox.md +129 -0
- package/docs/overlay-lifecycle.md +195 -0
- package/docs/public-api.md +335 -6
- package/docs/resize.md +158 -0
- package/docs/rich-document.md +442 -25
- package/docs/scroll-viewport.md +30 -10
- package/docs/theming.md +42 -8
- package/package.json +12 -4
- package/src/components/shared/_internal/SDialogSurface.css +213 -36
- package/src/components/shared/_internal/SMenuLayer.css +4 -0
- 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 -3
- package/src/components/shared/controls/SCheckbox.css +19 -7
- 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 +18 -4
- package/src/components/shared/controls/STextarea.css +42 -3
- package/src/components/shared/data-display/SControlledToastViewport.css +2 -10
- 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/SScrollViewport.css +17 -1
- 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 +3 -0
- 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 +37 -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/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/SModal.css_vue_type_style_index_0_src_0dc51b74_scoped_0dc51b74_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/SCheckbox.css_vue_type_style_index_0_src_b20b27dd_scoped_b20b27dd_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_ddcc5fbb_scoped_ddcc5fbb_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/SControlledToastViewport.css_vue_type_style_index_0_src_5864b6c6_scoped_5864b6c6_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/SScrollViewport.css_vue_type_style_index_0_src_e5d11342_scoped_e5d11342_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/src/components/shared/containers/SDrawer.css +0 -69
- package/src/components/shared/containers/SModal.css +0 -27
package/docs/getting-started.md
CHANGED
|
@@ -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.
|
package/docs/listbox.md
ADDED
|
@@ -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.
|