@pgcorp/ui-kit 0.1.2 → 0.3.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 +5 -5
- package/package.json +19 -3
- package/src/components/layout/SSideMenuButton.vue +5 -4
- package/src/components/layout/SSideMenuRail.vue +3 -6
- package/src/components/layout/SStack.css +9 -3
- package/src/components/layout/SStack.vue +10 -2
- package/src/components/shared/_internal/STreeNode.vue +10 -4
- package/src/components/shared/_internal/sidebarGroupContext.ts +3 -1
- package/src/components/shared/_internal/tabsContext.ts +1 -0
- package/src/components/shared/containers/SLeftSidebar.vue +2 -2
- package/src/components/shared/containers/SPageHeader.css +11 -0
- package/src/components/shared/containers/SPageHeader.vue +7 -1
- package/src/components/shared/containers/SPanel.css +7 -1
- package/src/components/shared/containers/SPanel.vue +5 -1
- package/src/components/shared/containers/SSidebarGroup.css +1 -1
- package/src/components/shared/containers/SSidebarGroup.vue +113 -94
- package/src/components/shared/containers/SSidebarSection.css +16 -4
- package/src/components/shared/containers/SSidebarSection.vue +15 -16
- package/src/components/shared/controls/SButton.css +39 -0
- package/src/components/shared/controls/SButton.vue +146 -29
- package/src/components/shared/controls/SCombobox.css +9 -0
- package/src/components/shared/controls/SCombobox.vue +322 -0
- package/src/components/shared/controls/SContextToggleButton.vue +1 -1
- package/src/components/shared/controls/SInputText.vue +15 -0
- package/src/components/shared/controls/SInteractiveSurface.css +4 -0
- package/src/components/shared/controls/SInteractiveSurface.vue +4 -0
- package/src/components/shared/controls/SListbox.vue +99 -1
- package/src/components/shared/controls/SListboxOption.vue +15 -2
- package/src/components/shared/controls/SRange.css +35 -0
- package/src/components/shared/controls/SRange.vue +129 -0
- package/src/components/shared/controls/SSwitch.css +48 -0
- package/src/components/shared/controls/SSwitch.vue +109 -0
- package/src/components/shared/controls/_internal/SInlineTokenSurface.vue +6 -3
- package/src/components/shared/data-display/SChip.css +59 -0
- package/src/components/shared/data-display/SChip.vue +92 -0
- package/src/components/shared/data-display/SCodeBlock.vue +1 -1
- package/src/components/shared/data-display/SCodeEditor.css +15 -0
- package/src/components/shared/data-display/SCodeEditor.vue +14 -0
- package/src/components/shared/data-display/STable.vue +107 -3
- package/src/components/shared/data-display/table.ts +9 -0
- package/src/components/shared/navigation/SBottomNav.vue +3 -0
- package/src/components/shared/navigation/STab.vue +31 -6
- package/src/components/shared/navigation/STabs.vue +8 -2
- package/src/internal/codeEditorContract.ts +1 -1
- package/src/internal/ownedAttrs.ts +31 -2
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
**A typed PGCorp design system for Vue 3, spanning foundational controls and
|
|
7
7
|
complete workbench interfaces.**
|
|
8
8
|
|
|
9
|
-
`Vue 3` · `TypeScript` · `
|
|
9
|
+
`Vue 3` · `TypeScript` · `122 exact exports` · `6 themes` · `MIT`
|
|
10
10
|
|
|
11
11
|
## Что входит / What is included
|
|
12
12
|
|
|
@@ -32,7 +32,7 @@ npm install @pgcorp/ui-kit vue pinia vue-router
|
|
|
32
32
|
| Требование / Requirement | Версия / Version |
|
|
33
33
|
| --- | --- |
|
|
34
34
|
| Node.js | `>=20.19.0` |
|
|
35
|
-
| npm | `>=
|
|
35
|
+
| npm | `>=10.9.2 <12` |
|
|
36
36
|
| Vue | `^3.5.0` |
|
|
37
37
|
| Pinia | `^3.0.4` |
|
|
38
38
|
| Vue Router | `^5.0.0` |
|
|
@@ -82,7 +82,7 @@ import SButton from '@pgcorp/ui-kit/shared/controls/SButton.vue'
|
|
|
82
82
|
content-layout="stack"
|
|
83
83
|
content-gap="content"
|
|
84
84
|
>
|
|
85
|
-
<SButton
|
|
85
|
+
<SButton appearance="solid" severity="primary">
|
|
86
86
|
Сохранить
|
|
87
87
|
</SButton>
|
|
88
88
|
</SPanel>
|
|
@@ -100,9 +100,9 @@ monorepo alias or copied UI-kit files.
|
|
|
100
100
|
| Группа / Group | Назначение / Purpose | Примеры exports / Example exports |
|
|
101
101
|
| --- | --- | --- |
|
|
102
102
|
| Layout | App shell, dock regions, stacks, workbench layout | `layout/SAppShell.vue`, `layout/SStack.vue`, `layout/SWorkbenchLayout.vue` |
|
|
103
|
-
| Controls | Buttons, fields, inputs, selects,
|
|
103
|
+
| Controls | Buttons, fields, inputs, switches, selects, comboboxes, menus | `shared/controls/SButton.vue`, `shared/controls/SSwitch.vue`, `shared/controls/SCombobox.vue` |
|
|
104
104
|
| Containers | Panels, modal, drawer, popover, sidebars | `shared/containers/SPanel.vue`, `shared/containers/SModal.vue`, `shared/containers/SPopover.vue` |
|
|
105
|
-
| Data display | Tables, status, progress, code, JSON, tooltips | `shared/data-display/STable.vue`, `shared/data-display/
|
|
105
|
+
| Data display | Tables, chips, status, progress, code, JSON, tooltips | `shared/data-display/STable.vue`, `shared/data-display/SChip.vue`, `shared/data-display/SStatus.vue` |
|
|
106
106
|
| Navigation | Tabs, breadcrumbs, catalog navigation, wizard | `shared/navigation/STabs.vue`, `shared/navigation/SBreadcrumbs.vue`, `shared/navigation/SWizardSteps.vue` |
|
|
107
107
|
| Complex surfaces | Tree, Kanban, data grid, SQL editor, graph | `shared/complex/STree.vue`, `shared/database/SDataGrid.vue`, `shared/graph/SGraphViewport.vue` |
|
|
108
108
|
| Runtime | Themes, variants, icons, composables, stores | `theme`, `variants`, `icons`, `composables/useNotifier`, `stores/useNotifierStore` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pgcorp/ui-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Typed Vue 3 design system with accessible components, semantic themes, and workbench patterns.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./index.ts",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"engines": {
|
|
40
40
|
"node": ">=20.19.0",
|
|
41
|
-
"npm": ">=
|
|
41
|
+
"npm": ">=10.9.2 <12"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public",
|
|
@@ -207,6 +207,9 @@
|
|
|
207
207
|
"shared/controls/SColorSelect.vue": [
|
|
208
208
|
"src/components/shared/controls/SColorSelect.vue"
|
|
209
209
|
],
|
|
210
|
+
"shared/controls/SCombobox.vue": [
|
|
211
|
+
"src/components/shared/controls/SCombobox.vue"
|
|
212
|
+
],
|
|
210
213
|
"shared/controls/SContextMenu.vue": [
|
|
211
214
|
"src/components/shared/controls/SContextMenu.vue"
|
|
212
215
|
],
|
|
@@ -252,12 +255,18 @@
|
|
|
252
255
|
"shared/controls/SMenuSurface.vue": [
|
|
253
256
|
"src/components/shared/controls/SMenuSurface.vue"
|
|
254
257
|
],
|
|
258
|
+
"shared/controls/SRange.vue": [
|
|
259
|
+
"src/components/shared/controls/SRange.vue"
|
|
260
|
+
],
|
|
255
261
|
"shared/controls/SSegmentedControl.vue": [
|
|
256
262
|
"src/components/shared/controls/SSegmentedControl.vue"
|
|
257
263
|
],
|
|
258
264
|
"shared/controls/SSelect.vue": [
|
|
259
265
|
"src/components/shared/controls/SSelect.vue"
|
|
260
266
|
],
|
|
267
|
+
"shared/controls/SSwitch.vue": [
|
|
268
|
+
"src/components/shared/controls/SSwitch.vue"
|
|
269
|
+
],
|
|
261
270
|
"shared/controls/STextarea.vue": [
|
|
262
271
|
"src/components/shared/controls/STextarea.vue"
|
|
263
272
|
],
|
|
@@ -276,6 +285,9 @@
|
|
|
276
285
|
"shared/data-display/SBadge.vue": [
|
|
277
286
|
"src/components/shared/data-display/SBadge.vue"
|
|
278
287
|
],
|
|
288
|
+
"shared/data-display/SChip.vue": [
|
|
289
|
+
"src/components/shared/data-display/SChip.vue"
|
|
290
|
+
],
|
|
279
291
|
"shared/data-display/SCodeBlock.vue": [
|
|
280
292
|
"src/components/shared/data-display/SCodeBlock.vue"
|
|
281
293
|
],
|
|
@@ -465,6 +477,7 @@
|
|
|
465
477
|
"./shared/controls/SCheckboxGroup.vue": "./src/components/shared/controls/SCheckboxGroup.vue",
|
|
466
478
|
"./shared/controls/SChoiceCards.vue": "./src/components/shared/controls/SChoiceCards.vue",
|
|
467
479
|
"./shared/controls/SColorSelect.vue": "./src/components/shared/controls/SColorSelect.vue",
|
|
480
|
+
"./shared/controls/SCombobox.vue": "./src/components/shared/controls/SCombobox.vue",
|
|
468
481
|
"./shared/controls/SContextMenu.vue": "./src/components/shared/controls/SContextMenu.vue",
|
|
469
482
|
"./shared/controls/SContextToggleButton.vue": "./src/components/shared/controls/SContextToggleButton.vue",
|
|
470
483
|
"./shared/controls/SDragHandle.vue": "./src/components/shared/controls/SDragHandle.vue",
|
|
@@ -480,14 +493,17 @@
|
|
|
480
493
|
"./shared/controls/SListbox.vue": "./src/components/shared/controls/SListbox.vue",
|
|
481
494
|
"./shared/controls/SMarker.vue": "./src/components/shared/controls/SMarker.vue",
|
|
482
495
|
"./shared/controls/SMenuSurface.vue": "./src/components/shared/controls/SMenuSurface.vue",
|
|
496
|
+
"./shared/controls/SRange.vue": "./src/components/shared/controls/SRange.vue",
|
|
483
497
|
"./shared/controls/SSegmentedControl.vue": "./src/components/shared/controls/SSegmentedControl.vue",
|
|
484
498
|
"./shared/controls/SSelect.vue": "./src/components/shared/controls/SSelect.vue",
|
|
499
|
+
"./shared/controls/SSwitch.vue": "./src/components/shared/controls/SSwitch.vue",
|
|
485
500
|
"./shared/controls/STextarea.vue": "./src/components/shared/controls/STextarea.vue",
|
|
486
501
|
"./shared/data-display/json": "./src/components/shared/data-display/json.ts",
|
|
487
502
|
"./shared/data-display/SActionCard.vue": "./src/components/shared/data-display/SActionCard.vue",
|
|
488
503
|
"./shared/data-display/SActionList.vue": "./src/components/shared/data-display/SActionList.vue",
|
|
489
504
|
"./shared/data-display/SActionListItem.vue": "./src/components/shared/data-display/SActionListItem.vue",
|
|
490
505
|
"./shared/data-display/SBadge.vue": "./src/components/shared/data-display/SBadge.vue",
|
|
506
|
+
"./shared/data-display/SChip.vue": "./src/components/shared/data-display/SChip.vue",
|
|
491
507
|
"./shared/data-display/SCodeBlock.vue": "./src/components/shared/data-display/SCodeBlock.vue",
|
|
492
508
|
"./shared/data-display/SCodeEditor.vue": "./src/components/shared/data-display/SCodeEditor.vue",
|
|
493
509
|
"./shared/data-display/SCodeSearchPanel.vue": "./src/components/shared/data-display/SCodeSearchPanel.vue",
|
|
@@ -578,7 +594,7 @@
|
|
|
578
594
|
"eslint-plugin-vue": "^10.8.0",
|
|
579
595
|
"jsdom": "^28.1.0",
|
|
580
596
|
"pinia": "^3.0.4",
|
|
581
|
-
"postcss": "8.5.
|
|
597
|
+
"postcss": "8.5.19",
|
|
582
598
|
"postcss-selector-parser": "7.1.4",
|
|
583
599
|
"storybook": "10.5.3",
|
|
584
600
|
"typescript": "^5.9.3",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div :class="{ 'mt-2': offsetTop }">
|
|
2
|
+
<div class="w-full" :class="{ 'mt-2': offsetTop }">
|
|
3
3
|
<SDropdownMenu
|
|
4
4
|
v-if="contextMenuItems.length && contextMenuTrigger === 'click'"
|
|
5
5
|
v-slot="{ triggerAttrs }"
|
|
@@ -93,12 +93,13 @@ const buttonProps = computed(() => {
|
|
|
93
93
|
'contentAlign': props.showLabel ? 'start' as const : 'center' as const,
|
|
94
94
|
'disabled': props.disabled,
|
|
95
95
|
'iconOnly': !props.showLabel,
|
|
96
|
+
'iconSize': 'large' as const,
|
|
96
97
|
'label': props.showLabel ? props.title : undefined,
|
|
97
98
|
'leadingIcon': props.icon,
|
|
98
99
|
'severity': props.active && !props.disabled ? 'primary' as const : 'secondary' as const,
|
|
99
|
-
'shape':
|
|
100
|
-
'size': 'md' as const,
|
|
101
|
-
'width':
|
|
100
|
+
'shape': 'row' as const,
|
|
101
|
+
'size': props.showLabel ? 'md' as const : 'lg' as const,
|
|
102
|
+
'width': 'full' as const,
|
|
102
103
|
}
|
|
103
104
|
})
|
|
104
105
|
</script>
|
|
@@ -3,16 +3,13 @@
|
|
|
3
3
|
v-if="visible"
|
|
4
4
|
v-bind="ownedAttrs.bindings()"
|
|
5
5
|
class="flex h-full min-h-0 flex-shrink-0 flex-col gap-1 overflow-x-hidden overflow-y-auto border-r border-surface-200 bg-surface-0 p-1 transition-[width] duration-[var(--s-motion-fast)] dark:border-surface-800 dark:bg-surface-950"
|
|
6
|
-
:class="expanded ? 'w-56 items-stretch' : 'w-
|
|
6
|
+
:class="expanded ? 'w-56 items-stretch' : 'w-14 items-stretch'"
|
|
7
7
|
>
|
|
8
|
-
<div class="flex flex-col
|
|
8
|
+
<div class="flex flex-col items-stretch gap-1">
|
|
9
9
|
<slot name="top" />
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
<div
|
|
13
|
-
class="mt-auto flex flex-col gap-1"
|
|
14
|
-
:class="expanded ? 'items-stretch' : 'items-center'"
|
|
15
|
-
>
|
|
12
|
+
<div class="mt-auto flex flex-col items-stretch gap-1">
|
|
16
13
|
<slot name="bottom" />
|
|
17
14
|
</div>
|
|
18
15
|
</div>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
@reference "../../styles/reference.css";
|
|
2
2
|
|
|
3
|
-
.s-stack {
|
|
4
|
-
|
|
5
|
-
}
|
|
3
|
+
.s-stack { @apply flex min-h-0 min-w-0; }
|
|
4
|
+
|
|
5
|
+
.s-stack[data-direction='column'] { @apply flex-col; }
|
|
6
|
+
.s-stack[data-direction='row'] { @apply flex-row; }
|
|
6
7
|
|
|
7
8
|
.s-stack[data-fill='container'] {
|
|
8
9
|
@apply h-full flex-1;
|
|
@@ -13,6 +14,11 @@
|
|
|
13
14
|
.s-stack[data-align='end'] { @apply items-end; }
|
|
14
15
|
.s-stack[data-align='stretch'] { @apply items-stretch; }
|
|
15
16
|
|
|
17
|
+
.s-stack[data-justify='start'] { @apply justify-start; }
|
|
18
|
+
.s-stack[data-justify='center'] { @apply justify-center; }
|
|
19
|
+
.s-stack[data-justify='end'] { @apply justify-end; }
|
|
20
|
+
.s-stack[data-justify='between'] { @apply justify-between; }
|
|
21
|
+
|
|
16
22
|
.s-stack[data-gap='tight'] { gap: 0.25rem; }
|
|
17
23
|
.s-stack[data-gap='control'] { gap: var(--s-space-control-gap); }
|
|
18
24
|
.s-stack[data-gap='content'] { gap: var(--s-space-content-gap); }
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
v-bind="ownedAttrs.bindings()"
|
|
5
5
|
class="s-stack"
|
|
6
6
|
:data-gap="gap"
|
|
7
|
+
:data-direction="direction"
|
|
7
8
|
:data-padding-end="paddingEnd"
|
|
8
9
|
:data-fill="fill"
|
|
9
10
|
:data-align="align"
|
|
11
|
+
:data-justify="justify"
|
|
10
12
|
>
|
|
11
13
|
<slot />
|
|
12
14
|
</component>
|
|
@@ -22,12 +24,14 @@ export type SStackGap = 'none' | 'tight' | 'control' | 'content' | 'section' | '
|
|
|
22
24
|
export type SStackPadding = 'none' | 'control' | 'content' | 'section' | 'panel'
|
|
23
25
|
|
|
24
26
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
+
* Flex layout-owner с ограниченной семантической шкалой интервалов.
|
|
28
|
+
* Flex layout owner with a constrained semantic spacing scale.
|
|
27
29
|
*/
|
|
28
30
|
export interface Props {
|
|
29
31
|
/** Семантический HTML-container без интерактивной роли. / Semantic non-interactive HTML container. */
|
|
30
32
|
as?: 'div' | 'section' | 'article' | 'ul' | 'ol'
|
|
33
|
+
/** Направление основной оси. / Main-axis direction. */
|
|
34
|
+
direction?: 'column' | 'row'
|
|
31
35
|
/** Интервал между непосредственными участниками. / Gap between direct participants. */
|
|
32
36
|
gap?: SStackGap
|
|
33
37
|
/** Нижний внутренний отступ для scroll-safe composition. / End padding for scroll-safe composition. */
|
|
@@ -36,14 +40,18 @@ export interface Props {
|
|
|
36
40
|
fill?: 'content' | 'container'
|
|
37
41
|
/** Выравнивание участников по поперечной оси. / Cross-axis participant alignment. */
|
|
38
42
|
align?: 'stretch' | 'start' | 'center' | 'end'
|
|
43
|
+
/** Распределение участников по основной оси. / Main-axis participant distribution. */
|
|
44
|
+
justify?: 'start' | 'center' | 'end' | 'between'
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
withDefaults(defineProps<Props>(), {
|
|
42
48
|
as: 'div',
|
|
49
|
+
direction: 'column',
|
|
43
50
|
gap: 'content',
|
|
44
51
|
paddingEnd: 'none',
|
|
45
52
|
fill: 'content',
|
|
46
53
|
align: 'stretch',
|
|
54
|
+
justify: 'start',
|
|
47
55
|
})
|
|
48
56
|
|
|
49
57
|
const ownedAttrs = useOwnedAttrs({ component: 'SStack', owner: 'semantic stack root' })
|
|
@@ -689,24 +689,30 @@ onBeforeUnmount(() => {
|
|
|
689
689
|
}
|
|
690
690
|
|
|
691
691
|
.s-tree-node-wrapper--compact .s-tree-node {
|
|
692
|
-
min-height:
|
|
692
|
+
min-height: var(--s-control-hitbox-xs);
|
|
693
693
|
gap: 0.25rem;
|
|
694
694
|
padding: 0 0.25rem;
|
|
695
695
|
}
|
|
696
696
|
|
|
697
|
+
.s-tree-node-children {
|
|
698
|
+
margin: 0;
|
|
699
|
+
padding: 0;
|
|
700
|
+
list-style: none;
|
|
701
|
+
}
|
|
702
|
+
|
|
697
703
|
.s-tree-node-wrapper--overlay-actions .s-tree-node {
|
|
698
704
|
position: relative;
|
|
699
705
|
display: grid;
|
|
700
706
|
overflow: hidden;
|
|
701
|
-
grid-template-columns: minmax(0, 1fr) max-content;
|
|
702
|
-
gap: 1.25rem;
|
|
707
|
+
grid-template-columns: minmax(0, 1fr) max-content max-content;
|
|
708
|
+
column-gap: 1.25rem;
|
|
703
709
|
padding-right: 0.78rem;
|
|
704
710
|
}
|
|
705
711
|
|
|
706
712
|
.s-tree-node-wrapper--overlay-actions .s-tree-node-right {
|
|
707
713
|
position: relative;
|
|
708
714
|
z-index: var(--s-layer-sticky);
|
|
709
|
-
grid-column:
|
|
715
|
+
grid-column: 3;
|
|
710
716
|
justify-content: flex-end;
|
|
711
717
|
}
|
|
712
718
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ComputedRef, InjectionKey } from 'vue';
|
|
1
|
+
import type { ComputedRef, InjectionKey, Ref } from 'vue';
|
|
2
2
|
|
|
3
3
|
import type { SectionState, SidebarSectionsState } from '../containers/sidebar';
|
|
4
4
|
|
|
@@ -20,9 +20,11 @@ export type SidebarSectionStyle = Readonly<Record<string, string | number>>;
|
|
|
20
20
|
export interface SidebarGroupContext {
|
|
21
21
|
readonly sectionsState: ComputedRef<SidebarSectionsState>;
|
|
22
22
|
readonly orderedSections: ComputedRef<readonly RegisteredSidebarSection[]>;
|
|
23
|
+
readonly geometryRevision: Readonly<Ref<number>>;
|
|
23
24
|
registerSection(registration: SidebarSectionRegistration): () => void;
|
|
24
25
|
toggleSection(key: string): void;
|
|
25
26
|
getSectionStyle(key: string): SidebarSectionStyle;
|
|
27
|
+
getSectionSize(key: string): number;
|
|
26
28
|
beginResize(topKey: string, bottomKey: string): void;
|
|
27
29
|
resizeSections(topKey: string, bottomKey: string, requestedTopSize: number): void;
|
|
28
30
|
finishResize(topKey: string, bottomKey: string): void;
|
|
@@ -35,6 +35,7 @@ export interface STabsContext {
|
|
|
35
35
|
readonly activeKey: ComputedRef<string | null>
|
|
36
36
|
readonly activationMode: ComputedRef<STabsActivationMode>
|
|
37
37
|
readonly closeButtonMode: ComputedRef<'reserve' | 'overlay'>
|
|
38
|
+
readonly closeButtonVisibility: ComputedRef<'always' | 'active-hover' | 'hover'>
|
|
38
39
|
readonly tabDensity: ComputedRef<'compact' | 'default' | 'comfortable'>
|
|
39
40
|
readonly registerTab: (registration: STabRegistration) => STabRegistrationKey
|
|
40
41
|
readonly unregisterTab: (key: STabRegistrationKey) => void
|
|
@@ -45,7 +45,7 @@ export interface Props {
|
|
|
45
45
|
state?: SAsyncStateContract;
|
|
46
46
|
sectionsState: SidebarSectionsState;
|
|
47
47
|
layout?: 'desktop' | 'mobile';
|
|
48
|
-
scrollBehavior?: 'auto' | 'body' | 'self';
|
|
48
|
+
scrollBehavior?: 'auto' | 'body' | 'self' | 'child';
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
withDefaults(defineProps<Props>(), {
|
|
@@ -53,7 +53,7 @@ withDefaults(defineProps<Props>(), {
|
|
|
53
53
|
icon: undefined,
|
|
54
54
|
state: () => ({ status: 'ready' }),
|
|
55
55
|
layout: 'desktop',
|
|
56
|
-
scrollBehavior: '
|
|
56
|
+
scrollBehavior: 'child',
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
const emit = defineEmits<SidebarGroupEmits>();
|
|
@@ -31,6 +31,17 @@
|
|
|
31
31
|
@apply m-0 text-2xl font-semibold leading-tight text-surface-900 dark:text-surface-50;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
.s-page-header__title[data-presentation='assistive'] {
|
|
35
|
+
position: absolute;
|
|
36
|
+
width: 1px;
|
|
37
|
+
height: 1px;
|
|
38
|
+
padding: 0;
|
|
39
|
+
margin: -1px;
|
|
40
|
+
clip-path: inset(50%);
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
border: 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
34
45
|
.s-page-header[data-size='compact'] .s-page-header__title {
|
|
35
46
|
@apply text-xl;
|
|
36
47
|
}
|
|
@@ -11,6 +11,7 @@ withDefaults(defineProps<{
|
|
|
11
11
|
appearance?: 'plain' | 'panel'
|
|
12
12
|
size?: 'compact' | 'default'
|
|
13
13
|
actionsLayout?: 'responsive' | 'inline' | 'stacked'
|
|
14
|
+
titlePresentation?: 'visible' | 'assistive'
|
|
14
15
|
}>(), {
|
|
15
16
|
description: undefined,
|
|
16
17
|
eyebrow: undefined,
|
|
@@ -18,6 +19,7 @@ withDefaults(defineProps<{
|
|
|
18
19
|
appearance: 'panel',
|
|
19
20
|
size: 'default',
|
|
20
21
|
actionsLayout: 'responsive',
|
|
22
|
+
titlePresentation: 'visible',
|
|
21
23
|
})
|
|
22
24
|
|
|
23
25
|
const ownedAttrs = useOwnedAttrs({ component: 'SPageHeader', owner: 'page header root' })
|
|
@@ -33,7 +35,11 @@ const ownedAttrs = useOwnedAttrs({ component: 'SPageHeader', owner: 'page header
|
|
|
33
35
|
>
|
|
34
36
|
<div class="s-page-header__copy">
|
|
35
37
|
<div v-if="eyebrow" class="s-page-header__eyebrow">{{ eyebrow }}</div>
|
|
36
|
-
<component
|
|
38
|
+
<component
|
|
39
|
+
:is="`h${headingLevel}`"
|
|
40
|
+
class="s-page-header__title"
|
|
41
|
+
:data-presentation="titlePresentation"
|
|
42
|
+
>{{ title }}</component>
|
|
37
43
|
<p v-if="description" class="s-page-header__description">{{ description }}</p>
|
|
38
44
|
</div>
|
|
39
45
|
<div v-if="$slots.actions" class="s-page-header__actions">
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
pointer-events: none;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
.s-panel-content[data-grow='true'] > * {
|
|
108
|
+
.s-panel-content[data-grow='true']:not(.s-panel-content--scroll-child) > * {
|
|
109
109
|
flex-shrink: 0;
|
|
110
110
|
}
|
|
111
111
|
|
|
@@ -121,6 +121,12 @@
|
|
|
121
121
|
overflow: hidden;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
+
.s-panel-content[data-grow='true'].s-panel-content--scroll-child > :not(.s-panel-scroll-end-spacer) {
|
|
125
|
+
flex: 1 1 0%;
|
|
126
|
+
min-height: 0;
|
|
127
|
+
overflow: hidden;
|
|
128
|
+
}
|
|
129
|
+
|
|
124
130
|
.s-panel-footer {
|
|
125
131
|
@apply flex min-h-8 min-w-0 flex-wrap items-center border-t border-surface-200 px-3 py-1.5 text-xs text-surface-500;
|
|
126
132
|
@apply dark:border-surface-700 dark:text-surface-400;
|
|
@@ -65,7 +65,11 @@
|
|
|
65
65
|
</template>
|
|
66
66
|
<slot />
|
|
67
67
|
</SAsyncState>
|
|
68
|
-
<div
|
|
68
|
+
<div
|
|
69
|
+
v-if="grow && scrollBehavior !== 'child'"
|
|
70
|
+
class="s-panel-scroll-end-spacer"
|
|
71
|
+
aria-hidden="true"
|
|
72
|
+
></div>
|
|
69
73
|
</div>
|
|
70
74
|
<div v-if="$slots.footer" :id="validatedFooterId" class="s-panel-footer">
|
|
71
75
|
<slot name="footer" />
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
@reference "../../../styles/reference.css";
|
|
2
2
|
|
|
3
3
|
.s-sidebar-group {
|
|
4
|
+
--s-sidebar-collapsed-section-height: 1.75rem;
|
|
4
5
|
@apply w-full;
|
|
5
6
|
@apply flex flex-col;
|
|
6
7
|
@apply min-h-0;
|
|
@@ -9,4 +10,3 @@
|
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
/* Этот файл определяет базовый flex-контейнер для группы секций. */
|
|
12
|
-
|