@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.
Files changed (45) hide show
  1. package/README.md +5 -5
  2. package/package.json +19 -3
  3. package/src/components/layout/SSideMenuButton.vue +5 -4
  4. package/src/components/layout/SSideMenuRail.vue +3 -6
  5. package/src/components/layout/SStack.css +9 -3
  6. package/src/components/layout/SStack.vue +10 -2
  7. package/src/components/shared/_internal/STreeNode.vue +10 -4
  8. package/src/components/shared/_internal/sidebarGroupContext.ts +3 -1
  9. package/src/components/shared/_internal/tabsContext.ts +1 -0
  10. package/src/components/shared/containers/SLeftSidebar.vue +2 -2
  11. package/src/components/shared/containers/SPageHeader.css +11 -0
  12. package/src/components/shared/containers/SPageHeader.vue +7 -1
  13. package/src/components/shared/containers/SPanel.css +7 -1
  14. package/src/components/shared/containers/SPanel.vue +5 -1
  15. package/src/components/shared/containers/SSidebarGroup.css +1 -1
  16. package/src/components/shared/containers/SSidebarGroup.vue +113 -94
  17. package/src/components/shared/containers/SSidebarSection.css +16 -4
  18. package/src/components/shared/containers/SSidebarSection.vue +15 -16
  19. package/src/components/shared/controls/SButton.css +39 -0
  20. package/src/components/shared/controls/SButton.vue +146 -29
  21. package/src/components/shared/controls/SCombobox.css +9 -0
  22. package/src/components/shared/controls/SCombobox.vue +322 -0
  23. package/src/components/shared/controls/SContextToggleButton.vue +1 -1
  24. package/src/components/shared/controls/SInputText.vue +15 -0
  25. package/src/components/shared/controls/SInteractiveSurface.css +4 -0
  26. package/src/components/shared/controls/SInteractiveSurface.vue +4 -0
  27. package/src/components/shared/controls/SListbox.vue +99 -1
  28. package/src/components/shared/controls/SListboxOption.vue +15 -2
  29. package/src/components/shared/controls/SRange.css +35 -0
  30. package/src/components/shared/controls/SRange.vue +129 -0
  31. package/src/components/shared/controls/SSwitch.css +48 -0
  32. package/src/components/shared/controls/SSwitch.vue +109 -0
  33. package/src/components/shared/controls/_internal/SInlineTokenSurface.vue +6 -3
  34. package/src/components/shared/data-display/SChip.css +59 -0
  35. package/src/components/shared/data-display/SChip.vue +92 -0
  36. package/src/components/shared/data-display/SCodeBlock.vue +1 -1
  37. package/src/components/shared/data-display/SCodeEditor.css +15 -0
  38. package/src/components/shared/data-display/SCodeEditor.vue +14 -0
  39. package/src/components/shared/data-display/STable.vue +107 -3
  40. package/src/components/shared/data-display/table.ts +9 -0
  41. package/src/components/shared/navigation/SBottomNav.vue +3 -0
  42. package/src/components/shared/navigation/STab.vue +31 -6
  43. package/src/components/shared/navigation/STabs.vue +8 -2
  44. package/src/internal/codeEditorContract.ts +1 -1
  45. 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` · `118 exact exports` · `6 themes` · `MIT`
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 | `>=11.10.0 <12` |
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 variant="primary">
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, menus, selection | `shared/controls/SButton.vue`, `shared/controls/SInputText.vue`, `shared/controls/SSelect.vue` |
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/SCodeBlock.vue`, `shared/data-display/SStatus.vue` |
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.1.2",
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": ">=11.10.0 <12"
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.16",
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': props.showLabel ? 'row' as const : 'circle' as const,
100
- 'size': 'md' as const,
101
- 'width': props.showLabel ? 'full' as const : 'auto' as const,
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-12 items-center'"
6
+ :class="expanded ? 'w-56 items-stretch' : 'w-14 items-stretch'"
7
7
  >
8
- <div class="flex flex-col gap-1" :class="expanded ? 'items-stretch' : 'items-center'">
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
- @apply flex min-h-0 min-w-0 flex-col;
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
- * Вертикальный layout-owner с ограниченной семантической шкалой интервалов.
26
- * Vertical layout owner with a constrained semantic spacing scale.
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: 1.75rem;
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: 2;
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: 'auto',
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 :is="`h${headingLevel}`" class="s-page-header__title">{{ title }}</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 v-if="grow" class="s-panel-scroll-end-spacer" aria-hidden="true"></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
-