@wallarm-org/design-system 0.46.0 → 0.47.0-rc-feature-shell.1

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 (32) hide show
  1. package/dist/components/AppShell/AppShell.js +1 -1
  2. package/dist/components/AppShell/AppShellRemote.js +1 -1
  3. package/dist/components/AppShell/story-content/_storyAccountDropdown.d.ts +8 -0
  4. package/dist/components/AppShell/story-content/_storyAccountDropdown.js +189 -0
  5. package/dist/components/AppShell/story-content/_storyNavConfigs.js +12 -5
  6. package/dist/components/AppShell/story-content/_storyQuickHelpDropdown.d.ts +1 -0
  7. package/dist/components/AppShell/story-content/_storyQuickHelpDropdown.js +130 -0
  8. package/dist/components/AppShell/story-content/index.d.ts +2 -0
  9. package/dist/components/AppShell/story-content/index.js +3 -1
  10. package/dist/components/NavPanel/NavPanel.js +3 -3
  11. package/dist/components/NavPanel/NavPanelBack.js +1 -1
  12. package/dist/components/NavPanel/NavPanelGroupContent.js +1 -1
  13. package/dist/components/NavPanel/NavPanelGroupLabel.js +2 -2
  14. package/dist/components/NavPanel/NavPanelSectionHeader.js +1 -1
  15. package/dist/components/NavPanel/classes.js +6 -6
  16. package/dist/components/ProductNav/ProductNavPanel.js +35 -37
  17. package/dist/components/RemoteShell/RemoteShell.js +1 -1
  18. package/dist/components/RemoteShell/RemoteShellContent.js +1 -1
  19. package/dist/icons/Book.d.ts +3 -0
  20. package/dist/icons/Book.js +12 -0
  21. package/dist/icons/LifeBuoy.d.ts +3 -0
  22. package/dist/icons/LifeBuoy.js +12 -0
  23. package/dist/icons/LogOut.d.ts +3 -0
  24. package/dist/icons/LogOut.js +12 -0
  25. package/dist/icons/NotebookText.d.ts +3 -0
  26. package/dist/icons/NotebookText.js +12 -0
  27. package/dist/icons/PanelLeftDashed.d.ts +3 -0
  28. package/dist/icons/PanelLeftDashed.js +12 -0
  29. package/dist/icons/index.d.ts +5 -0
  30. package/dist/icons/index.js +6 -1
  31. package/dist/metadata/components.json +3 -3
  32. package/package.json +1 -1
@@ -8,7 +8,7 @@ const AppShell = ({ ref, className, children, 'data-testid': testId, ...props })
8
8
  ref: ref,
9
9
  "data-slot": "app-shell",
10
10
  "data-testid": testId,
11
- className: cn('grid h-screen [grid-template-areas:"header_header""rail_remote"] [grid-template-columns:auto_1fr] [grid-template-rows:auto_1fr] bg-bg-surface-5', className),
11
+ className: cn('grid h-screen overscroll-none [grid-template-areas:"header_header""rail_remote"] [grid-template-columns:auto_1fr] [grid-template-rows:auto_1fr] bg-bg-surface-5', className),
12
12
  children: children
13
13
  })
14
14
  });
@@ -8,7 +8,7 @@ const AppShellRemote = ({ ref, className, children, ...props })=>{
8
8
  ref: ref,
9
9
  "data-slot": "app-shell-remote",
10
10
  "data-testid": testId,
11
- className: cn('[grid-area:remote] overflow-auto rounded-tl-12 border border-border-primary-light bg-bg-page-bg', className),
11
+ className: cn('[grid-area:remote] overflow-auto overscroll-none rounded-tl-12 border border-border-primary-light bg-bg-page-bg', className),
12
12
  children: children
13
13
  });
14
14
  };
@@ -0,0 +1,8 @@
1
+ import type { Theme } from '../../ThemeProvider';
2
+ export type SidebarMode = 'adaptive' | 'expanded';
3
+ export declare const AccountDropdown: ({ sidebarMode, onSidebarModeChange, theme, onThemeChange, }: {
4
+ sidebarMode: SidebarMode;
5
+ onSidebarModeChange: (mode: SidebarMode) => void;
6
+ theme: Theme;
7
+ onThemeChange: (theme: Theme) => void;
8
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,189 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Check, LogOut, PanelLeftDashed, PencilRuler, Settings, User } from "../../../icons/index.js";
3
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, DropdownMenuTriggerItem } from "../../DropdownMenu/index.js";
4
+ import { NavRailItem } from "../../NavRail/index.js";
5
+ import { HStack, VStack } from "../../Stack/index.js";
6
+ import { Text } from "../../Text/index.js";
7
+ const USER_NAME = 'Meow Meow';
8
+ const USER_EMAIL = 'meow@meow.com';
9
+ const THEME_LABELS = {
10
+ light: 'Light',
11
+ dark: 'Dark'
12
+ };
13
+ const SIDEBAR_MODE_LABELS = {
14
+ adaptive: 'Adaptive',
15
+ expanded: 'Always expanded'
16
+ };
17
+ const AccountDropdown = ({ sidebarMode, onSidebarModeChange, theme, onThemeChange })=>/*#__PURE__*/ jsxs(DropdownMenu, {
18
+ positioning: {
19
+ placement: 'right-end',
20
+ gutter: 8
21
+ },
22
+ children: [
23
+ /*#__PURE__*/ jsx(DropdownMenuTrigger, {
24
+ asChild: true,
25
+ children: /*#__PURE__*/ jsx(NavRailItem, {
26
+ icon: User,
27
+ label: USER_NAME
28
+ })
29
+ }),
30
+ /*#__PURE__*/ jsxs(DropdownMenuContent, {
31
+ className: "w-256",
32
+ children: [
33
+ /*#__PURE__*/ jsx("div", {
34
+ className: "rounded-6 border border-border-primary-light bg-states-primary-hover px-8 py-8 mb-4",
35
+ children: /*#__PURE__*/ jsxs(HStack, {
36
+ gap: 8,
37
+ align: "start",
38
+ children: [
39
+ /*#__PURE__*/ jsx("div", {
40
+ children: /*#__PURE__*/ jsx(User, {})
41
+ }),
42
+ /*#__PURE__*/ jsxs(VStack, {
43
+ gap: 0,
44
+ children: [
45
+ /*#__PURE__*/ jsx(Text, {
46
+ size: "sm",
47
+ color: "primary",
48
+ children: USER_NAME
49
+ }),
50
+ /*#__PURE__*/ jsx(Text, {
51
+ size: "xs",
52
+ color: "secondary",
53
+ children: USER_EMAIL
54
+ })
55
+ ]
56
+ })
57
+ ]
58
+ })
59
+ }),
60
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
61
+ children: [
62
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
63
+ children: /*#__PURE__*/ jsx(Settings, {})
64
+ }),
65
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
66
+ children: "Profile settings"
67
+ })
68
+ ]
69
+ }),
70
+ /*#__PURE__*/ jsxs(DropdownMenu, {
71
+ children: [
72
+ /*#__PURE__*/ jsxs(DropdownMenuTriggerItem, {
73
+ children: [
74
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
75
+ children: /*#__PURE__*/ jsx(PencilRuler, {})
76
+ }),
77
+ /*#__PURE__*/ jsxs(DropdownMenuItemText, {
78
+ children: [
79
+ "Theme:",
80
+ ' ',
81
+ /*#__PURE__*/ jsx(Text, {
82
+ size: "sm",
83
+ weight: "medium",
84
+ style: {
85
+ display: 'inline'
86
+ },
87
+ children: THEME_LABELS[theme]
88
+ })
89
+ ]
90
+ })
91
+ ]
92
+ }),
93
+ /*#__PURE__*/ jsxs(DropdownMenuContent, {
94
+ className: "w-200",
95
+ children: [
96
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
97
+ onSelect: ()=>onThemeChange('light'),
98
+ children: [
99
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
100
+ children: "Light"
101
+ }),
102
+ 'light' === theme && /*#__PURE__*/ jsx(DropdownMenuShortcut, {
103
+ children: /*#__PURE__*/ jsx(Check, {})
104
+ })
105
+ ]
106
+ }),
107
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
108
+ onSelect: ()=>onThemeChange('dark'),
109
+ children: [
110
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
111
+ children: "Dark"
112
+ }),
113
+ 'dark' === theme && /*#__PURE__*/ jsx(DropdownMenuShortcut, {
114
+ children: /*#__PURE__*/ jsx(Check, {})
115
+ })
116
+ ]
117
+ })
118
+ ]
119
+ })
120
+ ]
121
+ }),
122
+ /*#__PURE__*/ jsxs(DropdownMenu, {
123
+ children: [
124
+ /*#__PURE__*/ jsxs(DropdownMenuTriggerItem, {
125
+ children: [
126
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
127
+ children: /*#__PURE__*/ jsx(PanelLeftDashed, {})
128
+ }),
129
+ /*#__PURE__*/ jsxs(DropdownMenuItemText, {
130
+ children: [
131
+ "Sidebar mode:",
132
+ ' ',
133
+ /*#__PURE__*/ jsx(Text, {
134
+ size: "sm",
135
+ weight: "medium",
136
+ style: {
137
+ display: 'inline'
138
+ },
139
+ children: SIDEBAR_MODE_LABELS[sidebarMode]
140
+ })
141
+ ]
142
+ })
143
+ ]
144
+ }),
145
+ /*#__PURE__*/ jsxs(DropdownMenuContent, {
146
+ className: "w-200",
147
+ children: [
148
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
149
+ onSelect: ()=>onSidebarModeChange('adaptive'),
150
+ children: [
151
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
152
+ children: "Adaptive"
153
+ }),
154
+ 'adaptive' === sidebarMode && /*#__PURE__*/ jsx(DropdownMenuShortcut, {
155
+ children: /*#__PURE__*/ jsx(Check, {})
156
+ })
157
+ ]
158
+ }),
159
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
160
+ onSelect: ()=>onSidebarModeChange('expanded'),
161
+ children: [
162
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
163
+ children: "Always expanded"
164
+ }),
165
+ 'expanded' === sidebarMode && /*#__PURE__*/ jsx(DropdownMenuShortcut, {
166
+ children: /*#__PURE__*/ jsx(Check, {})
167
+ })
168
+ ]
169
+ })
170
+ ]
171
+ })
172
+ ]
173
+ }),
174
+ /*#__PURE__*/ jsx(DropdownMenuSeparator, {}),
175
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
176
+ children: [
177
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
178
+ children: /*#__PURE__*/ jsx(LogOut, {})
179
+ }),
180
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
181
+ children: "Sign out"
182
+ })
183
+ ]
184
+ })
185
+ ]
186
+ })
187
+ ]
188
+ });
189
+ export { AccountDropdown };
@@ -43,30 +43,36 @@ const edgeNavConfig = {
43
43
  type: 'link',
44
44
  id: 'dp-overview',
45
45
  label: 'Overview',
46
- path: 'overview'
46
+ path: 'overview',
47
+ icon: CircleDashed
47
48
  },
48
49
  {
49
50
  type: 'link',
50
51
  id: 'dp-nodes',
51
52
  label: 'Nodes',
52
- path: 'nodes'
53
+ path: 'nodes',
54
+ icon: CircleDashed
53
55
  },
54
56
  {
55
57
  type: 'link',
56
58
  id: 'dp-services',
57
59
  label: 'Services',
58
- path: 'services'
60
+ path: 'services',
61
+ icon: CircleDashed,
62
+ dividerAfter: true
59
63
  },
60
64
  {
61
65
  type: 'link',
62
66
  id: 'dp-govern',
63
67
  label: 'Govern',
64
- path: 'govern'
68
+ path: 'govern',
69
+ icon: CircleDashed
65
70
  },
66
71
  {
67
72
  type: 'group',
68
73
  id: 'dp-operations',
69
74
  label: 'Operations',
75
+ icon: CircleDashed,
70
76
  children: [
71
77
  {
72
78
  type: 'link',
@@ -89,7 +95,8 @@ const edgeNavConfig = {
89
95
  id: 'dashboards',
90
96
  label: 'Dashboards',
91
97
  path: 'dashboards',
92
- icon: CircleDashed
98
+ icon: CircleDashed,
99
+ dividerAfter: true
93
100
  },
94
101
  {
95
102
  type: 'section-header',
@@ -0,0 +1 @@
1
+ export declare const QuickHelpDropdown: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,130 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Activity, Book, CircleHelp, LifeBuoy, NotebookText, SquareArrowOutUpRight } from "../../../icons/index.js";
3
+ import { Button } from "../../Button/index.js";
4
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemContent, DropdownMenuItemIcon, DropdownMenuItemText, DropdownMenuSeparator, DropdownMenuTrigger } from "../../DropdownMenu/index.js";
5
+ import { Text } from "../../Text/index.js";
6
+ const QuickHelpDropdown = ()=>/*#__PURE__*/ jsxs(DropdownMenu, {
7
+ positioning: {
8
+ placement: 'bottom-end',
9
+ gutter: 4
10
+ },
11
+ children: [
12
+ /*#__PURE__*/ jsx(DropdownMenuTrigger, {
13
+ asChild: true,
14
+ children: /*#__PURE__*/ jsx(Button, {
15
+ variant: "ghost",
16
+ size: "small",
17
+ color: "neutral",
18
+ "aria-label": "Quick Help",
19
+ children: /*#__PURE__*/ jsx(CircleHelp, {})
20
+ })
21
+ }),
22
+ /*#__PURE__*/ jsxs(DropdownMenuContent, {
23
+ className: "w-320",
24
+ children: [
25
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
26
+ onSelect: ()=>window.open('https://docs.wallarm.com/', '_blank'),
27
+ children: [
28
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
29
+ children: /*#__PURE__*/ jsx(Book, {})
30
+ }),
31
+ /*#__PURE__*/ jsxs(DropdownMenuItemContent, {
32
+ children: [
33
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
34
+ children: "Documentation"
35
+ }),
36
+ /*#__PURE__*/ jsx(Text, {
37
+ size: "xs",
38
+ color: "secondary",
39
+ children: "Setup, deployment, and how-tos"
40
+ })
41
+ ]
42
+ })
43
+ ]
44
+ }),
45
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
46
+ onSelect: ()=>window.open('https://status.wallarm.com/', '_blank'),
47
+ children: [
48
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
49
+ children: /*#__PURE__*/ jsx(Activity, {})
50
+ }),
51
+ /*#__PURE__*/ jsxs(DropdownMenuItemContent, {
52
+ children: [
53
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
54
+ children: "Service status"
55
+ }),
56
+ /*#__PURE__*/ jsx(Text, {
57
+ size: "xs",
58
+ color: "secondary",
59
+ children: "Live uptime and alerts"
60
+ })
61
+ ]
62
+ })
63
+ ]
64
+ }),
65
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
66
+ onSelect: ()=>window.open('mailto:support@wallarm.com'),
67
+ children: [
68
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
69
+ children: /*#__PURE__*/ jsx(LifeBuoy, {})
70
+ }),
71
+ /*#__PURE__*/ jsxs(DropdownMenuItemContent, {
72
+ children: [
73
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
74
+ children: "Support"
75
+ }),
76
+ /*#__PURE__*/ jsx(Text, {
77
+ size: "xs",
78
+ color: "secondary",
79
+ children: "Talk to our team"
80
+ })
81
+ ]
82
+ })
83
+ ]
84
+ }),
85
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
86
+ onSelect: ()=>window.open('https://lab.wallarm.com', '_blank'),
87
+ children: [
88
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
89
+ children: /*#__PURE__*/ jsx(NotebookText, {})
90
+ }),
91
+ /*#__PURE__*/ jsxs(DropdownMenuItemContent, {
92
+ children: [
93
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
94
+ children: "Blog"
95
+ }),
96
+ /*#__PURE__*/ jsx(Text, {
97
+ size: "xs",
98
+ color: "secondary",
99
+ children: "Security news and updates"
100
+ })
101
+ ]
102
+ })
103
+ ]
104
+ }),
105
+ /*#__PURE__*/ jsx(DropdownMenuSeparator, {}),
106
+ /*#__PURE__*/ jsxs(DropdownMenuItem, {
107
+ onSelect: ()=>window.open('https://playground.wallarm.com', '_blank'),
108
+ children: [
109
+ /*#__PURE__*/ jsx(DropdownMenuItemIcon, {
110
+ children: /*#__PURE__*/ jsx(SquareArrowOutUpRight, {})
111
+ }),
112
+ /*#__PURE__*/ jsxs(DropdownMenuItemContent, {
113
+ children: [
114
+ /*#__PURE__*/ jsx(DropdownMenuItemText, {
115
+ children: "Wallarm Playground"
116
+ }),
117
+ /*#__PURE__*/ jsx(Text, {
118
+ size: "xs",
119
+ color: "secondary",
120
+ children: "Try the platform without any setup"
121
+ })
122
+ ]
123
+ })
124
+ ]
125
+ })
126
+ ]
127
+ })
128
+ ]
129
+ });
130
+ export { QuickHelpDropdown };
@@ -1,3 +1,5 @@
1
+ export { AccountDropdown, type SidebarMode } from './_storyAccountDropdown';
1
2
  export { ConfigRemote } from './_storyConfigRenderer';
2
3
  export { HomeContent } from './_storyHomeContent';
3
4
  export { aiHypervisorNavConfig, edgeNavConfig, infraDiscoveryNavConfig, securityTestingNavConfig, settingsNavConfig, } from './_storyNavConfigs';
5
+ export { QuickHelpDropdown } from './_storyQuickHelpDropdown';
@@ -1,4 +1,6 @@
1
+ import { AccountDropdown } from "./_storyAccountDropdown.js";
1
2
  import { ConfigRemote } from "./_storyConfigRenderer.js";
2
3
  import { HomeContent } from "./_storyHomeContent.js";
3
4
  import { aiHypervisorNavConfig, edgeNavConfig, infraDiscoveryNavConfig, securityTestingNavConfig, settingsNavConfig } from "./_storyNavConfigs.js";
4
- export { ConfigRemote, HomeContent, aiHypervisorNavConfig, edgeNavConfig, infraDiscoveryNavConfig, securityTestingNavConfig, settingsNavConfig };
5
+ import { QuickHelpDropdown } from "./_storyQuickHelpDropdown.js";
6
+ export { AccountDropdown, ConfigRemote, HomeContent, QuickHelpDropdown, aiHypervisorNavConfig, edgeNavConfig, infraDiscoveryNavConfig, securityTestingNavConfig, settingsNavConfig };
@@ -65,10 +65,10 @@ const NavPanel = ({ ref, className, children, resizable = false, 'data-testid':
65
65
  style: {
66
66
  width
67
67
  },
68
- className: cn('relative h-full shrink-0 border-r border-border-primary pt-8', isResizing && 'select-none', className),
68
+ className: cn('relative h-full shrink-0 border-r border-border-primary-light pt-8', isResizing && 'select-none', className),
69
69
  children: [
70
70
  /*#__PURE__*/ jsx("div", {
71
- className: "flex h-full flex-col gap-2 overflow-y-auto [scrollbar-width:thin] px-8 pb-8",
71
+ className: "flex h-full flex-col gap-2 overflow-y-auto overscroll-none [scrollbar-width:thin] px-8 pb-8",
72
72
  children: children
73
73
  }),
74
74
  /*#__PURE__*/ jsx(NavPanelResizeHandle, {})
@@ -84,7 +84,7 @@ const NavPanel = ({ ref, className, children, resizable = false, 'data-testid':
84
84
  "aria-label": ariaLabel,
85
85
  "data-slot": "nav-panel",
86
86
  "data-testid": testId,
87
- className: cn('flex h-full w-[216px] shrink-0 flex-col gap-2 overflow-y-auto [scrollbar-width:thin] border-r border-border-primary p-8', className),
87
+ className: cn('flex h-full w-[216px] shrink-0 flex-col gap-2 overflow-y-auto overscroll-none [scrollbar-width:thin] border-r border-border-primary-light p-8', className),
88
88
  children: children
89
89
  })
90
90
  });
@@ -11,7 +11,7 @@ const NavPanelBack = ({ ref, className, children, ...props })=>{
11
11
  type: "button",
12
12
  "data-slot": "nav-panel-back",
13
13
  "data-testid": testId,
14
- className: cn('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 p-8 text-sm text-text-secondary transition-colors outline-none hover:overlay-states-primary-hover focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed', className),
14
+ className: cn('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 p-8 text-sm text-text-primary opacity-64 transition-colors outline-none hover:opacity-100 hover:overlay-states-primary-hover focus-visible:opacity-100 focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed', className),
15
15
  children: [
16
16
  /*#__PURE__*/ jsx(CornerUpLeft, {
17
17
  size: "md"
@@ -16,7 +16,7 @@ const NavPanelGroupContent = ({ ref, className, children, ...props })=>{
16
16
  className: cn('relative grid transition-[grid-template-rows] duration-150 ease-out', expanded ? 'grid-rows-[1fr] mt-2' : 'grid-rows-[0fr]', className),
17
17
  children: [
18
18
  /*#__PURE__*/ jsx("div", {
19
- className: "absolute top-0 bottom-0 w-px bg-border-primary",
19
+ className: "absolute top-0 bottom-0 w-px bg-border-primary-light",
20
20
  style: {
21
21
  left: 16 * depth + 8 * parentDepth
22
22
  }
@@ -20,7 +20,7 @@ const NavPanelGroupLabel = ({ ref, icon: Icon, className, children, ...props })=
20
20
  style: {
21
21
  paddingLeft: 8 + 24 * depth
22
22
  },
23
- className: cn('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 py-8 pr-8 text-sm text-text-secondary transition-colors outline-none hover:overlay-states-primary-hover focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed', className),
23
+ className: cn('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 py-8 pr-8 text-sm text-text-primary opacity-64 transition-colors outline-none hover:opacity-100 hover:overlay-states-primary-hover focus-visible:opacity-100 focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed', className),
24
24
  children: [
25
25
  Icon && /*#__PURE__*/ jsx("span", {
26
26
  className: "flex shrink-0 items-center justify-center",
@@ -38,7 +38,7 @@ const NavPanelGroupLabel = ({ ref, icon: Icon, className, children, ...props })=
38
38
  children: children
39
39
  }),
40
40
  /*#__PURE__*/ jsx(ChevronRight, {
41
- size: "sm",
41
+ size: "xs",
42
42
  className: cn('shrink-0 transition-transform duration-150', expanded && 'rotate-90')
43
43
  })
44
44
  ]
@@ -9,7 +9,7 @@ const NavPanelSectionHeader = ({ ref, className, children, ...props })=>{
9
9
  ref: ref,
10
10
  "data-slot": "nav-panel-section-header",
11
11
  "data-testid": testId,
12
- className: cn('flex shrink-0 items-center px-8 pt-6', className),
12
+ className: cn('flex h-26 shrink-0 items-center px-8 pt-8 pb-2', className),
13
13
  children: /*#__PURE__*/ jsx(Text, {
14
14
  size: "xs",
15
15
  weight: "medium",
@@ -1,20 +1,20 @@
1
1
  import { cva } from "class-variance-authority";
2
- const navPanelItemVariants = cva('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 p-8 text-sm transition-colors outline-none', {
2
+ const navPanelItemVariants = cva('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 p-8 text-sm text-text-primary transition-colors outline-none', {
3
3
  variants: {
4
4
  active: {
5
- true: 'overlay-states-primary-active font-semibold text-text-primary',
6
- false: 'text-text-secondary hover:overlay-states-primary-hover focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed'
5
+ true: 'overlay-states-primary-active font-semibold',
6
+ false: 'opacity-64 hover:opacity-100 hover:overlay-states-primary-hover focus-visible:opacity-100 focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed'
7
7
  }
8
8
  },
9
9
  defaultVariants: {
10
10
  active: false
11
11
  }
12
12
  });
13
- const navPanelGroupItemVariants = cva('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 py-8 pr-8 text-sm transition-colors outline-none', {
13
+ const navPanelGroupItemVariants = cva('overlay flex h-32 shrink-0 w-full cursor-pointer items-center gap-8 rounded-6 py-8 pr-8 text-sm text-text-primary transition-colors outline-none', {
14
14
  variants: {
15
15
  active: {
16
- true: 'overlay-states-primary-active font-semibold text-text-primary',
17
- false: 'text-text-secondary hover:overlay-states-primary-hover focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed'
16
+ true: 'overlay-states-primary-active font-semibold',
17
+ false: 'opacity-64 hover:opacity-100 hover:overlay-states-primary-hover focus-visible:opacity-100 focus-visible:overlay-states-primary-hover active:overlay-states-primary-pressed'
18
18
  }
19
19
  },
20
20
  defaultVariants: {
@@ -3,17 +3,17 @@ import { NavPanel, NavPanelBack, NavPanelDivider, NavPanelGroup, NavPanelGroupCo
3
3
  import { findDrillNode } from "./navUtils.js";
4
4
  import { useProductNavContext } from "./ProductNavContext.js";
5
5
  function renderNavItems(items, activeItemId, onNavigate, onDrillClick, level = 'root') {
6
- return items.map((item)=>{
6
+ const result = [];
7
+ for (const item of items){
7
8
  if ('link' === item.type) {
8
9
  const Item = 'group' === level ? NavPanelGroupItem : NavPanelItem;
9
- return /*#__PURE__*/ jsx(Item, {
10
+ result.push(/*#__PURE__*/ jsx(Item, {
10
11
  icon: item.icon,
11
12
  active: activeItemId === item.id,
12
13
  onClick: ()=>onNavigate(item.path),
13
14
  children: item.label
14
- }, item.id);
15
- }
16
- if ('group' === item.type) return /*#__PURE__*/ jsxs(NavPanelGroup, {
15
+ }, item.id));
16
+ } else if ('group' === item.type) result.push(/*#__PURE__*/ jsxs(NavPanelGroup, {
17
17
  defaultExpanded: item.defaultExpanded,
18
18
  children: [
19
19
  /*#__PURE__*/ jsx(NavPanelGroupLabel, {
@@ -24,55 +24,53 @@ function renderNavItems(items, activeItemId, onNavigate, onDrillClick, level = '
24
24
  children: renderNavItems(item.children, activeItemId, onNavigate, onDrillClick, 'group')
25
25
  })
26
26
  ]
27
- }, item.id);
28
- if ('section-header' === item.type) return /*#__PURE__*/ jsx(NavPanelSectionHeader, {
27
+ }, item.id));
28
+ else if ('section-header' === item.type) result.push(/*#__PURE__*/ jsx(NavPanelSectionHeader, {
29
29
  children: item.label
30
- }, item.id);
31
- if ('drill' === item.type) {
30
+ }, item.id));
31
+ else if ('drill' === item.type) {
32
32
  const Item = 'group' === level ? NavPanelGroupItem : NavPanelItem;
33
- return /*#__PURE__*/ jsx(Item, {
33
+ result.push(/*#__PURE__*/ jsx(Item, {
34
34
  icon: item.icon,
35
35
  active: activeItemId === item.id,
36
36
  onClick: ()=>onDrillClick?.(item),
37
37
  children: item.label
38
- }, item.id);
38
+ }, item.id));
39
39
  }
40
- return null;
41
- });
40
+ if (item.dividerAfter) result.push(/*#__PURE__*/ jsx(NavPanelDivider, {}, `divider-${item.id}`));
41
+ }
42
+ return result;
42
43
  }
43
44
  const ProductNavPanel = ({ resizable })=>{
44
45
  const { config, navStack, effectiveActiveItemId, navigate, drillInto, goBack, drillLevel } = useProductNavContext();
45
46
  const currentEntry = navStack[Math.min(drillLevel, navStack.length - 1)];
46
- if (0 === drillLevel) {
47
- const itemsWithDividers = [];
48
- for (const item of config.items){
49
- itemsWithDividers.push(renderNavItems([
50
- item
51
- ], effectiveActiveItemId, navigate, drillInto));
52
- if (item.dividerAfter) itemsWithDividers.push(/*#__PURE__*/ jsx(NavPanelDivider, {}, `divider-${item.id}`));
53
- }
54
- return /*#__PURE__*/ jsxs(NavPanel, {
55
- resizable: resizable,
56
- children: [
57
- /*#__PURE__*/ jsx(NavPanelHeader, {
58
- children: config.productLabel
59
- }),
60
- itemsWithDividers
61
- ]
62
- });
63
- }
47
+ if (0 === drillLevel) return /*#__PURE__*/ jsxs(NavPanel, {
48
+ resizable: resizable,
49
+ children: [
50
+ /*#__PURE__*/ jsx(NavPanelHeader, {
51
+ children: config.productLabel
52
+ }),
53
+ renderNavItems(config.items, effectiveActiveItemId, navigate, drillInto)
54
+ ]
55
+ });
64
56
  const parentEntry = navStack[drillLevel - 1];
65
57
  const drillNode = findDrillNode(parentEntry.items, parentEntry.activeItemId);
66
58
  const backLabel = drillNode?.label ?? 'Back';
67
59
  return /*#__PURE__*/ jsxs(NavPanel, {
68
60
  resizable: resizable,
69
61
  children: [
70
- /*#__PURE__*/ jsx(NavPanelHeader, {
71
- children: currentEntry.title
72
- }),
73
- /*#__PURE__*/ jsx(NavPanelBack, {
74
- onClick: goBack,
75
- children: backLabel
62
+ /*#__PURE__*/ jsxs("div", {
63
+ className: "sticky top-0 z-10 flex flex-col gap-2 bg-bg-surface-1",
64
+ children: [
65
+ /*#__PURE__*/ jsx(NavPanelHeader, {
66
+ children: currentEntry.title
67
+ }),
68
+ /*#__PURE__*/ jsx(NavPanelBack, {
69
+ onClick: goBack,
70
+ children: backLabel
71
+ }),
72
+ /*#__PURE__*/ jsx(NavPanelDivider, {})
73
+ ]
76
74
  }),
77
75
  renderNavItems(currentEntry.items, effectiveActiveItemId, navigate, drillInto)
78
76
  ]
@@ -8,7 +8,7 @@ const RemoteShell = ({ ref, className, children, 'data-testid': testId, ...props
8
8
  ref: ref,
9
9
  "data-slot": "remote-shell",
10
10
  "data-testid": testId,
11
- className: cn('grid h-full overflow-hidden [grid-template-areas:"panel_breadcrumb""panel_content"] [grid-template-columns:auto_1fr] [grid-template-rows:auto_1fr]', className),
11
+ className: cn('grid h-full overflow-hidden overscroll-none [grid-template-areas:"panel_breadcrumb""panel_content"] [grid-template-columns:auto_1fr] [grid-template-rows:auto_1fr]', className),
12
12
  children: children
13
13
  })
14
14
  });
@@ -8,7 +8,7 @@ const RemoteShellContent = ({ ref, className, children, ...props })=>{
8
8
  ref: ref,
9
9
  "data-slot": "remote-shell-content",
10
10
  "data-testid": testId,
11
- className: cn('[grid-area:content] min-h-0 overflow-auto px-24 py-16 [scrollbar-width:thin]', className),
11
+ className: cn('[grid-area:content] min-h-0 overflow-auto overscroll-none px-24 py-16 [scrollbar-width:thin]', className),
12
12
  children: children
13
13
  });
14
14
  };
@@ -0,0 +1,3 @@
1
+ import type { FC } from 'react';
2
+ import { type SvgIconProps } from './SvgIcon';
3
+ export declare const Book: FC<SvgIconProps>;
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgIcon } from "./SvgIcon.js";
3
+ const Book = (props)=>/*#__PURE__*/ jsx(SvgIcon, {
4
+ ...props,
5
+ viewBox: "0 0 24 24",
6
+ children: /*#__PURE__*/ jsx("path", {
7
+ d: "M11 21C11 20.4696 10.7891 19.961 10.4141 19.5859C10.039 19.2109 9.53043 19 9 19H2C1.44772 19 1 18.5523 1 18V3C1 2.44772 1.44772 2 2 2H8C9.32608 2 10.5975 2.52716 11.5352 3.46484C11.7036 3.63332 11.8587 3.81256 12 4.00098C12.1413 3.81256 12.2964 3.63332 12.4648 3.46484C13.4025 2.52716 14.6739 2 16 2H22C22.5523 2 23 2.44772 23 3V18C23 18.5523 22.5523 19 22 19H15C14.4696 19 13.961 19.2109 13.5859 19.5859C13.2109 19.961 13 20.4696 13 21C13 21.5523 12.5523 22 12 22C11.4477 22 11 21.5523 11 21ZM3 17H9C9.70844 17 10.397 17.1889 11 17.5371V7C11 6.20435 10.6837 5.44152 10.1211 4.87891C9.55849 4.3163 8.79565 4 8 4H3V17ZM13 17.5371C13.603 17.1889 14.2916 17 15 17H21V4H16C15.2044 4 14.4415 4.3163 13.8789 4.87891C13.3163 5.44152 13 6.20435 13 7V17.5371Z",
8
+ fill: "currentColor"
9
+ })
10
+ });
11
+ Book.displayName = 'BookIcon';
12
+ export { Book };
@@ -0,0 +1,3 @@
1
+ import type { FC } from 'react';
2
+ import { type SvgIconProps } from './SvgIcon';
3
+ export declare const LifeBuoy: FC<SvgIconProps>;
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgIcon } from "./SvgIcon.js";
3
+ const LifeBuoy = (props)=>/*#__PURE__*/ jsx(SvgIcon, {
4
+ ...props,
5
+ viewBox: "0 0 24 24",
6
+ children: /*#__PURE__*/ jsx("path", {
7
+ d: "M7 12C7 10.9808 7.30454 10.0327 7.82812 9.24219L4.96875 6.38281C3.73712 7.92249 3 9.87498 3 12C3 14.1247 3.7374 16.0766 4.96875 17.6162L7.82812 14.7568C7.30481 13.9665 7 13.0189 7 12ZM14.7568 16.1709C13.9664 16.6944 13.0191 17 12 17C10.9806 17 10.0327 16.6947 9.24219 16.1709L6.38281 19.0303C7.92256 20.2621 9.87476 21 12 21C14.125 21 16.0766 20.2619 17.6162 19.0303L14.7568 16.1709ZM12 3C9.87498 3 7.92249 3.73712 6.38281 4.96875L9.24219 7.82812C10.0327 7.30454 10.9808 7 12 7C13.0189 7 13.9665 7.30481 14.7568 7.82812L17.6162 4.96875C16.0766 3.7374 14.1247 3 12 3ZM9 12C9 13.6569 10.3431 15 12 15C13.6569 15 15 13.6569 15 12C15 10.3432 13.6568 9 12 9C10.3432 9 9.00001 10.3432 9 12ZM17 12C17 13.0191 16.6944 13.9664 16.1709 14.7568L19.0303 17.6162C20.2619 16.0766 21 14.125 21 12C21 9.87476 20.2621 7.92256 19.0303 6.38281L16.1709 9.24219C16.6947 10.0327 17 10.9807 17 12ZM23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12Z",
8
+ fill: "currentColor"
9
+ })
10
+ });
11
+ LifeBuoy.displayName = 'LifeBuoyIcon';
12
+ export { LifeBuoy };
@@ -0,0 +1,3 @@
1
+ import type { FC } from 'react';
2
+ import { type SvgIconProps } from './SvgIcon';
3
+ export declare const LogOut: FC<SvgIconProps>;
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgIcon } from "./SvgIcon.js";
3
+ const LogOut = (props)=>/*#__PURE__*/ jsx(SvgIcon, {
4
+ ...props,
5
+ viewBox: "0 0 24 24",
6
+ children: /*#__PURE__*/ jsx("path", {
7
+ d: "M9 2C9.55228 2 10 2.44772 10 3C10 3.55228 9.55228 4 9 4H5C4.73478 4 4.4805 4.10543 4.29297 4.29297C4.10543 4.4805 4 4.73478 4 5V19C4 19.2652 4.10543 19.5195 4.29297 19.707C4.48051 19.8946 4.73478 20 5 20H9C9.55228 20 10 20.4477 10 21C10 21.5523 9.55228 22 9 22H5C4.20435 22 3.44152 21.6837 2.87891 21.1211C2.3163 20.5585 2 19.7957 2 19V5C2 4.20435 2.3163 3.44152 2.87891 2.87891C3.44152 2.3163 4.20435 2 5 2H9ZM15.293 6.29297C15.6835 5.90244 16.3165 5.90244 16.707 6.29297L21.707 11.293C21.7548 11.3408 21.7976 11.3935 21.835 11.4502C21.8597 11.4877 21.8812 11.5266 21.9004 11.5664C21.9222 11.6116 21.9412 11.6584 21.9561 11.707C21.9623 11.7273 21.9668 11.748 21.9717 11.7686C21.9893 11.8429 22 11.9202 22 12C22 12.0563 21.9933 12.1112 21.9844 12.165C21.9772 12.2078 21.9688 12.2503 21.9561 12.292C21.9412 12.3407 21.9222 12.3874 21.9004 12.4326C21.8936 12.4468 21.8864 12.4607 21.8789 12.4746C21.851 12.5262 21.8184 12.5745 21.7822 12.6201C21.7586 12.6498 21.7345 12.6796 21.707 12.707L16.707 17.707C16.3165 18.0976 15.6835 18.0976 15.293 17.707C14.9024 17.3165 14.9024 16.6835 15.293 16.293L18.5859 13H9C8.44772 13 8 12.5523 8 12C8 11.4477 8.44772 11 9 11H18.5859L15.293 7.70703C14.9024 7.31651 14.9024 6.68349 15.293 6.29297Z",
8
+ fill: "currentColor"
9
+ })
10
+ });
11
+ LogOut.displayName = 'LogOutIcon';
12
+ export { LogOut };
@@ -0,0 +1,3 @@
1
+ import type { FC } from 'react';
2
+ import { type SvgIconProps } from './SvgIcon';
3
+ export declare const NotebookText: FC<SvgIconProps>;
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgIcon } from "./SvgIcon.js";
3
+ const NotebookText = (props)=>/*#__PURE__*/ jsx(SvgIcon, {
4
+ ...props,
5
+ viewBox: "0 0 24 24",
6
+ children: /*#__PURE__*/ jsx("path", {
7
+ d: "M19 4C19 3.44772 18.5523 3 18 3H6C5.44772 3 5 3.44772 5 4V5H6C6.55228 5 7 5.44772 7 6C7 6.55228 6.55228 7 6 7H5V9H6C6.55228 9 7 9.44771 7 10C7 10.5523 6.55228 11 6 11H5V13H6C6.55228 13 7 13.4477 7 14C7 14.5523 6.55228 15 6 15H5V17H6C6.55228 17 7 17.4477 7 18C7 18.5523 6.55228 19 6 19H5V20C5 20.5523 5.44771 21 6 21H18C18.5523 21 19 20.5523 19 20V4ZM14 15C14.5523 15 15 15.4477 15 16C15 16.5523 14.5523 17 14 17H9.5C8.94772 17 8.5 16.5523 8.5 16C8.5 15.4477 8.94772 15 9.5 15H14ZM16 11C16.5523 11 17 11.4477 17 12C17 12.5523 16.5523 13 16 13H9.5C8.94772 13 8.5 12.5523 8.5 12C8.5 11.4477 8.94772 11 9.5 11H16ZM14.5 7C15.0523 7 15.5 7.44772 15.5 8C15.5 8.55228 15.0523 9 14.5 9H9.5C8.94772 9 8.5 8.55228 8.5 8C8.5 7.44772 8.94772 7 9.5 7H14.5ZM21 20C21 21.6569 19.6569 23 18 23H6C4.34315 23 3 21.6569 3 20V19H2C1.44772 19 1 18.5523 1 18C1 17.4477 1.44772 17 2 17H3V15H2C1.44772 15 1 14.5523 1 14C1 13.4477 1.44772 13 2 13H3V11H2C1.44772 11 1 10.5523 1 10C1 9.44771 1.44772 9 2 9H3V7H2C1.44772 7 1 6.55228 1 6C1 5.44772 1.44772 5 2 5H3V4C3 2.34315 4.34315 1 6 1H18C19.6569 1 21 2.34315 21 4V20Z",
8
+ fill: "currentColor"
9
+ })
10
+ });
11
+ NotebookText.displayName = 'NotebookTextIcon';
12
+ export { NotebookText };
@@ -0,0 +1,3 @@
1
+ import type { FC } from 'react';
2
+ import { type SvgIconProps } from './SvgIcon';
3
+ export declare const PanelLeftDashed: FC<SvgIconProps>;
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { SvgIcon } from "./SvgIcon.js";
3
+ const PanelLeftDashed = (props)=>/*#__PURE__*/ jsx(SvgIcon, {
4
+ ...props,
5
+ viewBox: "0 0 24 24",
6
+ children: /*#__PURE__*/ jsx("path", {
7
+ d: "M8 15V14C8 13.4477 8.44772 13 9 13C9.55228 13 10 13.4477 10 14V15C10 15.5523 9.55228 16 9 16C8.44772 16 8 15.5523 8 15ZM8 10V9C8 8.44772 8.44772 8 9 8C9.55228 8 10 8.44772 10 9V10C10 10.5523 9.55228 11 9 11C8.44772 11 8 10.5523 8 10ZM8 5V4H5C4.44772 4 4 4.44772 4 5V19C4 19.5523 4.44771 20 5 20H8V19C8 18.4477 8.44772 18 9 18C9.55228 18 10 18.4477 10 19V20H19C19.5523 20 20 19.5523 20 19V5C20 4.44771 19.5523 4 19 4H10V5C10 5.55228 9.55228 6 9 6C8.44772 6 8 5.55228 8 5ZM22 19C22 20.6569 20.6569 22 19 22H5C3.34315 22 2 20.6569 2 19V5C2 3.34315 3.34315 2 5 2H19C20.6569 2 22 3.34315 22 5V19Z",
8
+ fill: "currentColor"
9
+ })
10
+ });
11
+ PanelLeftDashed.displayName = 'PanelLeftDashedIcon';
12
+ export { PanelLeftDashed };
@@ -11,6 +11,7 @@ export { ArrowUp } from './ArrowUp';
11
11
  export { ArrowUpLeft } from './ArrowUpLeft';
12
12
  export { ArrowUpRight } from './ArrowUpRight';
13
13
  export { Bell } from './Bell';
14
+ export { Book } from './Book';
14
15
  export { Calendar } from './Calendar';
15
16
  export { CalendarCheck } from './CalendarCheck';
16
17
  export { CalendarCheck2 } from './CalendarCheck2';
@@ -109,11 +110,13 @@ export { LayoutPanelLeft } from './LayoutPanelLeft';
109
110
  export { LayoutPanelTop } from './LayoutPanelTop';
110
111
  export { LayoutTemplate } from './LayoutTemplate';
111
112
  export { LibraryBig } from './LibraryBig';
113
+ export { LifeBuoy } from './LifeBuoy';
112
114
  export { Link } from './Link';
113
115
  export { Loader } from './Loader';
114
116
  export { LoaderCircle } from './LoaderCircle';
115
117
  export { Lock } from './Lock';
116
118
  export { LockOpen } from './LockOpen';
119
+ export { LogOut } from './LogOut';
117
120
  export { MapPin } from './MapPin';
118
121
  export { Maximize } from './Maximize';
119
122
  export { Maximize2 } from './Maximize2';
@@ -131,10 +134,12 @@ export { MoveDown } from './MoveDown';
131
134
  export { MoveUp } from './MoveUp';
132
135
  export { MoveVertical } from './MoveVertical';
133
136
  export { NotebookPen } from './NotebookPen';
137
+ export { NotebookText } from './NotebookText';
134
138
  export { NotepadText } from './NotepadText';
135
139
  export { OctagonAlert } from './OctagonAlert';
136
140
  export { PanelBottom } from './PanelBottom';
137
141
  export { PanelBottomOpen } from './PanelBottomOpen';
142
+ export { PanelLeftDashed } from './PanelLeftDashed';
138
143
  export { PanelRight } from './PanelRight';
139
144
  export { PanelRightAnimated, type PanelRightAnimatedProps } from './PanelRightAnimated';
140
145
  export { PanelRightClose } from './PanelRightClose';
@@ -11,6 +11,7 @@ import { ArrowUp } from "./ArrowUp.js";
11
11
  import { ArrowUpLeft } from "./ArrowUpLeft.js";
12
12
  import { ArrowUpRight } from "./ArrowUpRight.js";
13
13
  import { Bell } from "./Bell.js";
14
+ import { Book } from "./Book.js";
14
15
  import { Calendar } from "./Calendar.js";
15
16
  import { CalendarCheck } from "./CalendarCheck.js";
16
17
  import { CalendarCheck2 } from "./CalendarCheck2.js";
@@ -109,11 +110,13 @@ import { LayoutPanelLeft } from "./LayoutPanelLeft.js";
109
110
  import { LayoutPanelTop } from "./LayoutPanelTop.js";
110
111
  import { LayoutTemplate } from "./LayoutTemplate.js";
111
112
  import { LibraryBig } from "./LibraryBig.js";
113
+ import { LifeBuoy } from "./LifeBuoy.js";
112
114
  import { Link } from "./Link.js";
113
115
  import { Loader } from "./Loader.js";
114
116
  import { LoaderCircle } from "./LoaderCircle.js";
115
117
  import { Lock } from "./Lock.js";
116
118
  import { LockOpen } from "./LockOpen.js";
119
+ import { LogOut } from "./LogOut.js";
117
120
  import { MapPin } from "./MapPin.js";
118
121
  import { Maximize } from "./Maximize.js";
119
122
  import { Maximize2 } from "./Maximize2.js";
@@ -131,10 +134,12 @@ import { MoveDown } from "./MoveDown.js";
131
134
  import { MoveUp } from "./MoveUp.js";
132
135
  import { MoveVertical } from "./MoveVertical.js";
133
136
  import { NotebookPen } from "./NotebookPen.js";
137
+ import { NotebookText } from "./NotebookText.js";
134
138
  import { NotepadText } from "./NotepadText.js";
135
139
  import { OctagonAlert } from "./OctagonAlert.js";
136
140
  import { PanelBottom } from "./PanelBottom.js";
137
141
  import { PanelBottomOpen } from "./PanelBottomOpen.js";
142
+ import { PanelLeftDashed } from "./PanelLeftDashed.js";
138
143
  import { PanelRight } from "./PanelRight.js";
139
144
  import { PanelRightAnimated } from "./PanelRightAnimated.js";
140
145
  import { PanelRightClose } from "./PanelRightClose.js";
@@ -180,4 +185,4 @@ import { X } from "./X.js";
180
185
  import { Zap } from "./Zap.js";
181
186
  import { ZoomIn } from "./ZoomIn.js";
182
187
  import { ZoomOut } from "./ZoomOut.js";
183
- export { Activity, Alt, ArrowBigUp, ArrowBigUpDash, ArrowDown, ArrowDownLeft, ArrowDownRight, ArrowLeft, ArrowRight, ArrowUp, ArrowUpLeft, ArrowUpRight, Bell, Calendar, CalendarCheck, CalendarCheck2, CalendarClock, CalendarCog, CalendarDays, CalendarFold, CalendarHeart, CalendarMinus, CalendarMinus2, CalendarOff, CalendarPlus, CalendarPlus2, CalendarRange, CalendarSearch, CalendarX, CalendarX2, Check, CheckCheck, CheckboxIndeterminate, ChevronDown, ChevronFirst, ChevronLast, ChevronLeft, ChevronRight, ChevronUp, ChevronUpDown, ChevronsDown, ChevronsLeft, ChevronsRight, ChevronsUp, Circle, CircleArrowDown, CircleArrowLeft, CircleArrowOutDownLeft, CircleArrowOutDownRight, CircleArrowOutUpLeft, CircleArrowOutUpRight, CircleArrowRight, CircleArrowUp, CircleCheck, CircleCheckBig, CircleChevronDown, CircleChevronLeft, CircleChevronRight, CircleChevronUp, CircleDashed, CircleDotDashed, CircleEllipsis, CircleHelp, CirclePlus, Clock, Command, Copy, CornerUpLeft, CornerUpRight, Ctrl, Dot, Earth, EarthLock, Ellipsis, EyeOff, Filter, FilterX, Folder, FunnelPlus, GitCommitHorizontal, GitCommitVertical, GitCompare, GitCompareArrows, GitFork, GitGraph, GitMerge, GitPullRequest, GitPullRequestArrow, GitPullRequestClosed, GitPullRequestCreate, GitPullRequestCreateArrow, GitPullRequestDraft, Globe, GlobeLock, GripVertical, History, Home, Info, KeyRound, KeySquare, Keyboard, Layers, Layers2, Layers3, LayoutDashboard, LayoutGrid, LayoutList, LayoutPanelLeft, LayoutPanelTop, LayoutTemplate, LibraryBig, Link, Loader, LoaderCircle, Lock, LockOpen, MapPin, Maximize, Maximize2, Megaphone, MegaphoneOff, MessageSquare, MessageSquareText, MessageSquareWarning, MessageSquareX, MessagesSquare, Minus, Mouse, Move3D, MoveDown, MoveUp, MoveVertical, NotebookPen, NotepadText, OctagonAlert, PanelBottom, PanelBottomOpen, PanelRight, PanelRightAnimated, PanelRightClose, PanelRightDashed, PanelRightOpen, Paperclip, Pen, PenLine, PenOff, PenTool, Pencil, PencilLine, PencilOff, PencilRuler, Pentagon, Pin, PinOff, Plus, Quote, Redo, Redo2, RedoDot, RefreshCcw, RefreshCwOff, Search, Settings, Sheet, Shift, Skull, SlidersHorizontal, SlidersVertical, Space, SquareArrowOutUpRight, Trash, Trash2, TriangleAlert, Undo, Undo2, UndoDot, User, Wrench, X, Zap, ZoomIn, ZoomOut };
188
+ export { Activity, Alt, ArrowBigUp, ArrowBigUpDash, ArrowDown, ArrowDownLeft, ArrowDownRight, ArrowLeft, ArrowRight, ArrowUp, ArrowUpLeft, ArrowUpRight, Bell, Book, Calendar, CalendarCheck, CalendarCheck2, CalendarClock, CalendarCog, CalendarDays, CalendarFold, CalendarHeart, CalendarMinus, CalendarMinus2, CalendarOff, CalendarPlus, CalendarPlus2, CalendarRange, CalendarSearch, CalendarX, CalendarX2, Check, CheckCheck, CheckboxIndeterminate, ChevronDown, ChevronFirst, ChevronLast, ChevronLeft, ChevronRight, ChevronUp, ChevronUpDown, ChevronsDown, ChevronsLeft, ChevronsRight, ChevronsUp, Circle, CircleArrowDown, CircleArrowLeft, CircleArrowOutDownLeft, CircleArrowOutDownRight, CircleArrowOutUpLeft, CircleArrowOutUpRight, CircleArrowRight, CircleArrowUp, CircleCheck, CircleCheckBig, CircleChevronDown, CircleChevronLeft, CircleChevronRight, CircleChevronUp, CircleDashed, CircleDotDashed, CircleEllipsis, CircleHelp, CirclePlus, Clock, Command, Copy, CornerUpLeft, CornerUpRight, Ctrl, Dot, Earth, EarthLock, Ellipsis, EyeOff, Filter, FilterX, Folder, FunnelPlus, GitCommitHorizontal, GitCommitVertical, GitCompare, GitCompareArrows, GitFork, GitGraph, GitMerge, GitPullRequest, GitPullRequestArrow, GitPullRequestClosed, GitPullRequestCreate, GitPullRequestCreateArrow, GitPullRequestDraft, Globe, GlobeLock, GripVertical, History, Home, Info, KeyRound, KeySquare, Keyboard, Layers, Layers2, Layers3, LayoutDashboard, LayoutGrid, LayoutList, LayoutPanelLeft, LayoutPanelTop, LayoutTemplate, LibraryBig, LifeBuoy, Link, Loader, LoaderCircle, Lock, LockOpen, LogOut, MapPin, Maximize, Maximize2, Megaphone, MegaphoneOff, MessageSquare, MessageSquareText, MessageSquareWarning, MessageSquareX, MessagesSquare, Minus, Mouse, Move3D, MoveDown, MoveUp, MoveVertical, NotebookPen, NotebookText, NotepadText, OctagonAlert, PanelBottom, PanelBottomOpen, PanelLeftDashed, PanelRight, PanelRightAnimated, PanelRightClose, PanelRightDashed, PanelRightOpen, Paperclip, Pen, PenLine, PenOff, PenTool, Pencil, PencilLine, PencilOff, PencilRuler, Pentagon, Pin, PinOff, Plus, Quote, Redo, Redo2, RedoDot, RefreshCcw, RefreshCwOff, Search, Settings, Sheet, Shift, Skull, SlidersHorizontal, SlidersVertical, Space, SquareArrowOutUpRight, Trash, Trash2, TriangleAlert, Undo, Undo2, UndoDot, User, Wrench, X, Zap, ZoomIn, ZoomOut };
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.45.1",
3
- "generatedAt": "2026-05-25T18:20:33.943Z",
2
+ "version": "0.46.0",
3
+ "generatedAt": "2026-05-26T00:20:03.149Z",
4
4
  "components": [
5
5
  {
6
6
  "name": "Accordion",
@@ -4436,7 +4436,7 @@
4436
4436
  "examples": [
4437
4437
  {
4438
4438
  "name": "Basic",
4439
- "code": "() => {\n const pathname = useLocationPathname();\n const activeProduct = deriveProduct(pathname);\n const [sidebarMode, setSidebarMode] = useState<SidebarMode>('adaptive');\n const collapsed = sidebarMode === 'adaptive' && activeProduct !== 'home';\n\n return (\n <AppShell>\n <AppShellHeader>\n <TopHeader>\n <TopHeaderLogo href='/'>\n <Logo size='md' />\n </TopHeaderLogo>\n <TopHeaderActions>\n <Button variant='ghost' size='small' color='neutral'>\n <Code size='s' color='secondary'>\n Search Wallarm\n </Code>\n <Kbd size='small'>⌘K</Kbd>\n </Button>\n <TopHeaderSeparator />\n <Button variant='ghost' size='small' color='neutral'>\n Tenant Name\n <Code size='s' color='secondary'>\n · 12345\n </Code>\n <ChevronDown size='sm' />\n </Button>\n <Button variant='ghost' size='small' color='neutral' aria-label='Notifications'>\n <Bell size='sm' />\n </Button>\n <Button variant='ghost' size='small' color='neutral' aria-label='Help'>\n <CircleHelp size='sm' />\n </Button>\n </TopHeaderActions>\n </TopHeader>\n </AppShellHeader>\n\n <AppShellRail>\n <NavRail collapsed={collapsed}>\n <NavRailBody>\n <NavRailItem\n icon={Home}\n label='Home'\n shortcut={['G', 'H']}\n active={activeProduct === 'home'}\n onClick={() => navigateToProduct('home')}\n />\n <NavRailSeparator />\n <NavRailItem\n icon={CircleDashed}\n label='Edge'\n shortcut={['G', 'E']}\n active={activeProduct === 'edge'}\n onClick={() => navigateToProduct('edge')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='AI Hypervisor'\n shortcut={['G', 'A']}\n active={activeProduct === 'ai-hypervisor'}\n onClick={() => navigateToProduct('ai-hypervisor')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='Infra Discovery'\n shortcut={['G', 'I']}\n active={activeProduct === 'infra-discovery'}\n onClick={() => navigateToProduct('infra-discovery')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='Security Testing'\n shortcut={['G', 'T']}\n active={activeProduct === 'security-testing'}\n onClick={() => navigateToProduct('security-testing')}\n />\n </NavRailBody>\n <NavRailFooter>\n <NavRailItem\n icon={Settings}\n label='Settings'\n shortcut={['G', 'S']}\n active={activeProduct === 'settings'}\n onClick={() => navigateToProduct('settings')}\n />\n <AccountDropdown sidebarMode={sidebarMode} onSidebarModeChange={setSidebarMode} />\n </NavRailFooter>\n </NavRail>\n </AppShellRail>\n\n <AppShellRemote>\n <RemoteForProduct product={activeProduct} />\n </AppShellRemote>\n </AppShell>\n );\n}"
4439
+ "code": "() => {\n const pathname = useLocationPathname();\n const activeProduct = deriveProduct(pathname);\n const [sidebarMode, setSidebarMode] = useState<SidebarMode>('adaptive');\n const { theme, setTheme } = useTheme();\n const collapsed = sidebarMode === 'adaptive' && activeProduct !== 'home';\n\n return (\n <AppShell>\n <AppShellHeader>\n <TopHeader>\n <TopHeaderLogo href='/'>\n <Logo size='md' />\n </TopHeaderLogo>\n\n <TopHeaderActions>\n <Button variant='ghost' size='small' color='neutral'>\n <Code size='s' color='secondary'>\n Search Wallarm\n </Code>\n <Kbd size='small'>⌘K</Kbd>\n </Button>\n\n <TopHeaderSeparator />\n\n <Button variant='ghost' size='small' color='neutral'>\n <Text size='xs' weight='medium'>\n Tenant Name\n </Text>\n <span className='text-text-tertiary'>•</span>\n <Code size='s' color='secondary'>\n 12345\n </Code>\n <ChevronUpDown className='!icon-sm' />\n </Button>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant='ghost' size='small' color='neutral' aria-label='Wallarm Updates'>\n <Bell />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Wallarm updates</TooltipContent>\n </Tooltip>\n\n <QuickHelpDropdown />\n </TopHeaderActions>\n </TopHeader>\n </AppShellHeader>\n\n <AppShellRail>\n <NavRail collapsed={collapsed}>\n <NavRailBody>\n <NavRailItem\n icon={Home}\n label='Home'\n shortcut={['G', 'H']}\n active={activeProduct === 'home'}\n onClick={() => navigateToProduct('home')}\n />\n <NavRailSeparator />\n <NavRailItem\n icon={CircleDashed}\n label='Edge'\n shortcut={['G', 'E']}\n active={activeProduct === 'edge'}\n onClick={() => navigateToProduct('edge')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='AI Hypervisor'\n shortcut={['G', 'A']}\n active={activeProduct === 'ai-hypervisor'}\n onClick={() => navigateToProduct('ai-hypervisor')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='Infra Discovery'\n shortcut={['G', 'I']}\n active={activeProduct === 'infra-discovery'}\n onClick={() => navigateToProduct('infra-discovery')}\n />\n <NavRailItem\n icon={CircleDashed}\n label='Security Testing'\n shortcut={['G', 'T']}\n active={activeProduct === 'security-testing'}\n onClick={() => navigateToProduct('security-testing')}\n />\n </NavRailBody>\n <NavRailFooter>\n <NavRailItem\n icon={Settings}\n label='Settings'\n shortcut={['G', 'S']}\n active={activeProduct === 'settings'}\n onClick={() => navigateToProduct('settings')}\n />\n <AccountDropdown\n sidebarMode={sidebarMode}\n onSidebarModeChange={setSidebarMode}\n theme={theme}\n onThemeChange={setTheme}\n />\n </NavRailFooter>\n </NavRail>\n </AppShellRail>\n\n <AppShellRemote>\n <RemoteForProduct product={activeProduct} />\n </AppShellRemote>\n </AppShell>\n );\n}"
4440
4440
  }
4441
4441
  ]
4442
4442
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallarm-org/design-system",
3
- "version": "0.46.0",
3
+ "version": "0.47.0-rc-feature-shell.1",
4
4
  "description": "Core design system library with React components and Storybook documentation",
5
5
  "publishConfig": {
6
6
  "access": "public",