@placeholderco/placeholder-ui 1.0.12 → 2.1.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/LICENSE +1 -1
- package/README.md +134 -130
- package/dist/app.css +178 -0
- package/dist/bootstrap.min.css +3600 -0
- package/dist/cards/GitCard.svelte +115 -0
- package/dist/cards/GitCard.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte +29 -17
- package/dist/display/Avatar.svelte.d.ts +12 -2
- package/dist/display/LinkCollection.svelte +40 -18
- package/dist/display/LinkCollection.svelte.d.ts +9 -2
- package/dist/display/Paper.svelte +31 -19
- package/dist/display/Paper.svelte.d.ts +12 -3
- package/dist/display/alert/Alert.svelte +129 -0
- package/dist/display/alert/Alert.svelte.d.ts +15 -0
- package/dist/display/alert/AlertVariant.d.ts +1 -0
- package/dist/display/alert/AlertVariant.js +1 -0
- package/dist/display/filetree/FileTree.svelte +259 -0
- package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
- package/dist/display/filetree/FileTreeItem.svelte +396 -0
- package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
- package/dist/display/filetree/FileTreeNode.d.ts +46 -0
- package/dist/display/filetree/FileTreeNode.js +115 -0
- package/dist/display/filetree/index.d.ts +5 -0
- package/dist/display/filetree/index.js +3 -0
- package/dist/editors/CodeMirror.svelte +306 -0
- package/dist/editors/CodeMirror.svelte.d.ts +31 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
- package/dist/editors/tiptap/TipTap.svelte +856 -0
- package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
- package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
- package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
- package/dist/editors/tiptap/collaboration.d.ts +55 -0
- package/dist/editors/tiptap/collaboration.js +1 -0
- package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
- package/dist/editors/tiptap/extensions/Alert.js +72 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
- package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
- package/dist/editors/tiptap/extensions/Div.js +89 -0
- package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
- package/dist/editors/tiptap/extensions/Span.js +56 -0
- package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
- package/dist/editors/tiptap/extensions/index.d.ts +7 -0
- package/dist/editors/tiptap/extensions/index.js +5 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
- package/dist/form/Autocomplete.svelte +86 -135
- package/dist/form/Autocomplete.svelte.d.ts +6 -8
- package/dist/form/AutocompleteMulti.svelte +385 -227
- package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
- package/dist/form/Checkbox.svelte +59 -54
- package/dist/form/Checkbox.svelte.d.ts +14 -5
- package/dist/form/Chips.svelte +29 -13
- package/dist/form/Chips.svelte.d.ts +16 -2
- package/dist/form/ColorPicker.svelte +957 -0
- package/dist/form/ColorPicker.svelte.d.ts +78 -0
- package/dist/form/ComboBox.svelte +30 -20
- package/dist/form/ComboBox.svelte.d.ts +1 -1
- package/dist/form/ComboBoxItemBuilder.svelte +161 -188
- package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
- package/dist/form/ComboBoxMulti.svelte +38 -24
- package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
- package/dist/form/CronBuilder.svelte +84 -67
- package/dist/form/CronBuilder.svelte.d.ts +16 -3
- package/dist/form/DatePicker.svelte +148 -195
- package/dist/form/DateRangePicker.svelte +101 -98
- package/dist/form/DateTimePicker.svelte +167 -208
- package/dist/form/DateTimePicker.svelte.d.ts +10 -2
- package/dist/form/FormGroup.svelte +33 -10
- package/dist/form/FormGroup.svelte.d.ts +12 -2
- package/dist/form/Number.svelte +70 -47
- package/dist/form/Number.svelte.d.ts +36 -6
- package/dist/form/Radio.svelte +18 -18
- package/dist/form/RadioGroup.svelte +23 -12
- package/dist/form/RadioGroup.svelte.d.ts +13 -2
- package/dist/form/SegmentedControl.svelte +76 -56
- package/dist/form/SegmentedControl.svelte.d.ts +9 -4
- package/dist/form/Select.svelte +150 -233
- package/dist/form/Select.svelte.d.ts +29 -5
- package/dist/form/SelectMulti.svelte +163 -277
- package/dist/form/SelectMulti.svelte.d.ts +36 -7
- package/dist/form/Slider.svelte +183 -269
- package/dist/form/Slider.svelte.d.ts +32 -17
- package/dist/form/StringArrayBuilder.svelte +249 -0
- package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
- package/dist/form/Switch.svelte +164 -106
- package/dist/form/Switch.svelte.d.ts +22 -3
- package/dist/form/TextArea.svelte +49 -29
- package/dist/form/TextArea.svelte.d.ts +23 -3
- package/dist/form/Textbox.svelte +69 -68
- package/dist/form/Textbox.svelte.d.ts +32 -4
- package/dist/form/TimePicker.svelte +42 -47
- package/dist/form/TimePicker.svelte.d.ts +12 -2
- package/dist/form/comboBoxCore.svelte.d.ts +99 -0
- package/dist/form/comboBoxCore.svelte.js +243 -0
- package/dist/icon/Icon.svelte +8 -3
- package/dist/icon/Icon.svelte.d.ts +8 -3
- package/dist/icon/file-type-bmp.svg +1 -0
- package/dist/icon/file-type-csv.svg +1 -0
- package/dist/icon/file-type-doc.svg +1 -0
- package/dist/icon/file-type-docx.svg +1 -0
- package/dist/icon/file-type-jpg.svg +1 -0
- package/dist/icon/file-type-pdf.svg +1 -0
- package/dist/icon/file-type-png.svg +1 -0
- package/dist/icon/file-type-ppt.svg +1 -0
- package/dist/icon/file-type-svg.svg +1 -0
- package/dist/icon/file-type-txt.svg +1 -0
- package/dist/icon/file-type-xls.svg +1 -0
- package/dist/icon/file-type-zip.svg +1 -0
- package/dist/icon/index.d.ts +166 -151
- package/dist/icon/index.js +166 -152
- package/dist/icon/logo-placeholder.svg +6 -0
- package/dist/icon/source-code.svg +1 -0
- package/dist/icon/sun-moon.svg +1 -0
- package/dist/icon/table.svg +6 -0
- package/dist/index.d.ts +146 -82
- package/dist/index.js +77 -78
- package/dist/layout/AppShell.svelte +12 -162
- package/dist/layout/AppShell.svelte.d.ts +6 -27
- package/dist/layout/CustomNavbar.svelte +9 -7
- package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
- package/dist/layout/Navbar.svelte +161 -129
- package/dist/layout/Navbar.svelte.d.ts +29 -15
- package/dist/layout/NavbarItemDisplay.svelte +2 -2
- package/dist/layout/NavbarItemView.svelte +182 -0
- package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
- package/dist/layout/Sidenav.svelte +280 -341
- package/dist/layout/Sidenav.svelte.d.ts +36 -4
- package/dist/models/ComboBoxItem.d.ts +2 -0
- package/dist/models/Employee.d.ts +53 -0
- package/dist/models/Employee.js +23 -0
- package/dist/models/Hyperlink.d.ts +3 -1
- package/dist/models/LinkCollectionItem.d.ts +3 -1
- package/dist/models/NavbarItem.d.ts +6 -2
- package/dist/theme.svelte.d.ts +0 -1
- package/dist/theme.svelte.js +46 -58
- package/dist/ui/Accordion.svelte +81 -242
- package/dist/ui/Accordion.svelte.d.ts +37 -14
- package/dist/ui/AccordionItem.svelte +303 -0
- package/dist/ui/AccordionItem.svelte.d.ts +21 -0
- package/dist/ui/ActionIcon.svelte +25 -21
- package/dist/ui/ActionIcon.svelte.d.ts +15 -2
- package/dist/ui/Badge.svelte +163 -171
- package/dist/ui/Badge.svelte.d.ts +13 -5
- package/dist/ui/Button.svelte +178 -205
- package/dist/ui/Button.svelte.d.ts +19 -2
- package/dist/ui/ButtonVariant.d.ts +15 -1
- package/dist/ui/ContextMenu.svelte +146 -0
- package/dist/ui/ContextMenu.svelte.d.ts +37 -0
- package/dist/ui/ContextMenuList.svelte +188 -0
- package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
- package/dist/ui/Dialog.svelte +183 -111
- package/dist/ui/Dialog.svelte.d.ts +21 -4
- package/dist/ui/Drawer.svelte +237 -184
- package/dist/ui/Drawer.svelte.d.ts +20 -2
- package/dist/ui/Dropdown.svelte +24 -14
- package/dist/ui/Dropdown.svelte.d.ts +11 -2
- package/dist/ui/Dropzone.svelte +159 -57
- package/dist/ui/Dropzone.svelte.d.ts +29 -2
- package/dist/ui/Link.svelte +12 -4
- package/dist/ui/Link.svelte.d.ts +8 -2
- package/dist/ui/Loader.svelte +23 -18
- package/dist/ui/Loader.svelte.d.ts +5 -2
- package/dist/ui/Logo.svelte +37 -0
- package/dist/ui/Logo.svelte.d.ts +16 -0
- package/dist/ui/MultiSortable.svelte +287 -0
- package/dist/ui/MultiSortable.svelte.d.ts +50 -0
- package/dist/ui/Pagination.svelte +15 -9
- package/dist/ui/Pagination.svelte.d.ts +6 -2
- package/dist/ui/Popover.svelte +43 -65
- package/dist/ui/Popover.svelte.d.ts +14 -5
- package/dist/ui/ProgressBar.svelte +28 -30
- package/dist/ui/ProgressBarVariant.d.ts +7 -1
- package/dist/ui/SegmentedControl.svelte +0 -0
- package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
- package/dist/ui/Sortable.svelte +163 -0
- package/dist/ui/Sortable.svelte.d.ts +47 -0
- package/dist/ui/Table.svelte +383 -80
- package/dist/ui/Table.svelte.d.ts +43 -2
- package/dist/ui/Tabs.svelte +22 -18
- package/dist/ui/Tabs.svelte.d.ts +6 -2
- package/dist/ui/ThemeSwitcher.svelte +26 -7
- package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
- package/dist/ui/Tooltip.svelte +312 -180
- package/dist/ui/Tooltip.svelte.d.ts +4 -3
- package/dist/uiTheme.svelte.d.ts +86 -0
- package/dist/uiTheme.svelte.js +214 -0
- package/dist/util/DateFunctions.js +1 -1
- package/dist/util/DragDrop.d.ts +50 -0
- package/dist/util/DragDrop.js +154 -0
- package/dist/util/NavigateTo.js +2 -2
- package/dist/util/dayjs.d.ts +4 -0
- package/dist/util/dayjs.js +15 -0
- package/package.json +66 -26
- package/dist/display/Alert.svelte +0 -179
- package/dist/display/Alert.svelte.d.ts +0 -13
- package/dist/form/FileInput.svelte +0 -235
- package/dist/form/FileInput.svelte.d.ts +0 -23
- package/dist/form/PasswordInput.svelte +0 -253
- package/dist/form/PasswordInput.svelte.d.ts +0 -34
- package/dist/form/Rating.svelte +0 -235
- package/dist/form/Rating.svelte.d.ts +0 -21
- package/dist/styles/components.css +0 -199
- package/dist/styles/dark.css +0 -146
- package/dist/styles/index.css +0 -116
- package/dist/styles/reset.css +0 -110
- package/dist/styles/semantic.css +0 -86
- package/dist/styles/tokens.css +0 -203
- package/dist/styles/utilities.css +0 -523
- package/dist/ui/Breadcrumbs.svelte +0 -131
- package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
- package/dist/ui/LoadingOverlay.svelte +0 -53
- package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
- package/dist/ui/Progress.svelte +0 -191
- package/dist/ui/Progress.svelte.d.ts +0 -15
- package/dist/ui/RingProgress.svelte +0 -141
- package/dist/ui/RingProgress.svelte.d.ts +0 -18
- package/dist/ui/Skeleton.svelte +0 -85
- package/dist/ui/Skeleton.svelte.d.ts +0 -12
- package/dist/ui/Stepper.svelte +0 -355
- package/dist/ui/Stepper.svelte.d.ts +0 -24
- package/dist/ui/Timeline.svelte +0 -225
- package/dist/ui/Timeline.svelte.d.ts +0 -23
- /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
- /package/dist/{actions → util}/ClickOutside.js +0 -0
- /package/dist/{transitions → util}/Transitions.d.ts +0 -0
- /package/dist/{transitions → util}/Transitions.js +0 -0
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
+
import type { ButtonVariant } from '../ui/ButtonVariant.js';
|
|
3
|
+
|
|
4
|
+
export interface SidenavItemAction {
|
|
5
|
+
/** SVG icon to display in the action button */
|
|
6
|
+
iconSvg: string;
|
|
7
|
+
/** Accessible label, also shown as a tooltip on hover */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Visual style variant for the action button */
|
|
10
|
+
variant?: ButtonVariant;
|
|
11
|
+
/** Click handler; receives the item the action belongs to and the event */
|
|
12
|
+
onclick?: (item: SidenavItem, event: MouseEvent) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
2
15
|
export interface SidenavItem {
|
|
3
16
|
label: string;
|
|
4
17
|
href?: string;
|
|
@@ -6,6 +19,8 @@
|
|
|
6
19
|
active?: boolean;
|
|
7
20
|
items?: SidenavItem[];
|
|
8
21
|
onclick?: () => void;
|
|
22
|
+
/** Action buttons shown on the right of the item (e.g. edit, delete) */
|
|
23
|
+
actions?: SidenavItemAction[];
|
|
9
24
|
}
|
|
10
25
|
|
|
11
26
|
export interface SidenavSection {
|
|
@@ -15,69 +30,83 @@
|
|
|
15
30
|
</script>
|
|
16
31
|
|
|
17
32
|
<script lang="ts">
|
|
18
|
-
import type { Snippet } from
|
|
19
|
-
import Icon from
|
|
20
|
-
import Textbox from
|
|
21
|
-
import ActionIcon from
|
|
22
|
-
import Drawer from
|
|
23
|
-
import { iconChevronRight, iconSearch, iconX } from
|
|
24
|
-
import { slide } from
|
|
25
|
-
import { viewportState } from
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
import type { Snippet } from 'svelte';
|
|
34
|
+
import Icon from '../icon/Icon.svelte';
|
|
35
|
+
import Textbox from '../form/Textbox.svelte';
|
|
36
|
+
import ActionIcon from '../ui/ActionIcon.svelte';
|
|
37
|
+
import Drawer from '../ui/Drawer.svelte';
|
|
38
|
+
import { iconChevronRight, iconSearch, iconX } from '../icon/index.js';
|
|
39
|
+
import { slide } from 'svelte/transition';
|
|
40
|
+
import { viewportState } from '../theme.svelte.js';
|
|
41
|
+
import Link from '../ui/Link.svelte';
|
|
42
|
+
|
|
43
|
+
export interface SidenavProps {
|
|
44
|
+
/** Navigation sections to display */
|
|
28
45
|
sections?: SidenavSection[];
|
|
46
|
+
/** Sections pinned to the bottom of the sidenav */
|
|
29
47
|
bottomSections?: SidenavSection[];
|
|
48
|
+
/** Whether the sidenav is in collapsed (icon-only) mode */
|
|
30
49
|
collapsed?: boolean;
|
|
50
|
+
/** Width of the expanded sidenav */
|
|
31
51
|
width?: string;
|
|
52
|
+
/** Width when collapsed */
|
|
32
53
|
collapsedWidth?: string;
|
|
54
|
+
/** Additional CSS classes */
|
|
33
55
|
class?: string;
|
|
56
|
+
/** Custom header content */
|
|
34
57
|
header?: Snippet;
|
|
58
|
+
/** Custom footer content */
|
|
35
59
|
footer?: Snippet;
|
|
60
|
+
/** Enable search/filter for navigation items */
|
|
36
61
|
searchable?: boolean;
|
|
62
|
+
/** Placeholder text for search input */
|
|
37
63
|
searchPlaceholder?: string;
|
|
64
|
+
/** Callback when a navigation item is clicked */
|
|
38
65
|
onItemClick?: (item: SidenavItem) => void;
|
|
39
|
-
|
|
66
|
+
/** When item action buttons are shown: on hover/focus or always visible.
|
|
67
|
+
* Note: in the mobile drawer they are always visible (touch has no hover). */
|
|
68
|
+
actionsVisible?: 'hover' | 'always';
|
|
69
|
+
/** Enable responsive behavior (drawer on mobile) */
|
|
40
70
|
responsive?: boolean;
|
|
71
|
+
/** Breakpoint (px) below which mobile mode activates */
|
|
41
72
|
mobileBreakpoint?: number;
|
|
73
|
+
/** Whether the mobile drawer is open (bindable) */
|
|
42
74
|
mobileOpen?: boolean;
|
|
75
|
+
/** Title shown in mobile drawer header */
|
|
43
76
|
mobileTitle?: string;
|
|
44
|
-
|
|
77
|
+
/** Position of the mobile drawer */
|
|
78
|
+
mobileDrawerPosition?: 'left' | 'right';
|
|
45
79
|
}
|
|
46
80
|
|
|
47
81
|
let {
|
|
48
82
|
sections = [],
|
|
49
83
|
bottomSections = [],
|
|
50
84
|
collapsed = false,
|
|
51
|
-
width =
|
|
52
|
-
collapsedWidth =
|
|
53
|
-
class: className =
|
|
85
|
+
width = '260px',
|
|
86
|
+
collapsedWidth = '60px',
|
|
87
|
+
class: className = '',
|
|
54
88
|
header,
|
|
55
89
|
footer,
|
|
56
90
|
searchable = false,
|
|
57
|
-
searchPlaceholder =
|
|
91
|
+
searchPlaceholder = 'Search...',
|
|
58
92
|
onItemClick,
|
|
93
|
+
actionsVisible = 'hover',
|
|
59
94
|
// Responsive props
|
|
60
95
|
responsive = false,
|
|
61
96
|
mobileBreakpoint = 768,
|
|
62
97
|
mobileOpen = $bindable(false),
|
|
63
|
-
mobileTitle =
|
|
64
|
-
mobileDrawerPosition =
|
|
65
|
-
}:
|
|
98
|
+
mobileTitle = '',
|
|
99
|
+
mobileDrawerPosition = 'left'
|
|
100
|
+
}: SidenavProps = $props();
|
|
66
101
|
|
|
67
|
-
let searchQuery = $state(
|
|
102
|
+
let searchQuery = $state('');
|
|
68
103
|
|
|
69
104
|
// Track if we're in mobile mode using viewportState
|
|
70
|
-
const isMobile = $derived(
|
|
71
|
-
responsive && viewportState.isBelow(mobileBreakpoint),
|
|
72
|
-
);
|
|
105
|
+
const isMobile = $derived(responsive && viewportState.isBelow(mobileBreakpoint));
|
|
73
106
|
|
|
74
107
|
// Auto-close drawer when resizing to desktop
|
|
75
108
|
$effect(() => {
|
|
76
|
-
if (
|
|
77
|
-
responsive &&
|
|
78
|
-
!viewportState.isBelow(mobileBreakpoint) &&
|
|
79
|
-
mobileOpen
|
|
80
|
-
) {
|
|
109
|
+
if (responsive && !viewportState.isBelow(mobileBreakpoint) && mobileOpen) {
|
|
81
110
|
mobileOpen = false;
|
|
82
111
|
}
|
|
83
112
|
});
|
|
@@ -89,11 +118,7 @@
|
|
|
89
118
|
const lowerText = text.toLowerCase();
|
|
90
119
|
|
|
91
120
|
let queryIndex = 0;
|
|
92
|
-
for (
|
|
93
|
-
let i = 0;
|
|
94
|
-
i < lowerText.length && queryIndex < lowerQuery.length;
|
|
95
|
-
i++
|
|
96
|
-
) {
|
|
121
|
+
for (let i = 0; i < lowerText.length && queryIndex < lowerQuery.length; i++) {
|
|
97
122
|
if (lowerText[i] === lowerQuery[queryIndex]) {
|
|
98
123
|
queryIndex++;
|
|
99
124
|
}
|
|
@@ -112,12 +137,7 @@
|
|
|
112
137
|
// Check if item matches
|
|
113
138
|
if (fuzzyMatch(searchQuery, item.label)) return true;
|
|
114
139
|
// Check if any sub-item matches
|
|
115
|
-
if (
|
|
116
|
-
item.items?.some((sub) =>
|
|
117
|
-
fuzzyMatch(searchQuery, sub.label),
|
|
118
|
-
)
|
|
119
|
-
)
|
|
120
|
-
return true;
|
|
140
|
+
if (item.items?.some((sub) => fuzzyMatch(searchQuery, sub.label))) return true;
|
|
121
141
|
return false;
|
|
122
142
|
})
|
|
123
143
|
.map((item) => {
|
|
@@ -125,9 +145,7 @@
|
|
|
125
145
|
if (item.items) {
|
|
126
146
|
return {
|
|
127
147
|
...item,
|
|
128
|
-
items: item.items.filter((sub) =>
|
|
129
|
-
fuzzyMatch(searchQuery, sub.label),
|
|
130
|
-
),
|
|
148
|
+
items: item.items.filter((sub) => fuzzyMatch(searchQuery, sub.label))
|
|
131
149
|
};
|
|
132
150
|
}
|
|
133
151
|
return item;
|
|
@@ -142,7 +160,7 @@
|
|
|
142
160
|
let filteredBottomSections = $derived(filterSections(bottomSections));
|
|
143
161
|
|
|
144
162
|
function clearSearch() {
|
|
145
|
-
searchQuery =
|
|
163
|
+
searchQuery = '';
|
|
146
164
|
}
|
|
147
165
|
|
|
148
166
|
let expandedSections: Set<string> = $state(new Set());
|
|
@@ -175,7 +193,7 @@
|
|
|
175
193
|
}
|
|
176
194
|
}
|
|
177
195
|
|
|
178
|
-
function
|
|
196
|
+
function handleNavItemClick(item: SidenavItem) {
|
|
179
197
|
onItemClick?.(item);
|
|
180
198
|
item.onclick?.();
|
|
181
199
|
// Close drawer on mobile after navigation
|
|
@@ -190,8 +208,119 @@
|
|
|
190
208
|
// Close drawer after clicking an item
|
|
191
209
|
mobileOpen = false;
|
|
192
210
|
}
|
|
211
|
+
|
|
212
|
+
function handleActionClick(action: SidenavItemAction, item: SidenavItem, e: MouseEvent) {
|
|
213
|
+
// Keep the action independent of the item's own navigation/expand behaviour
|
|
214
|
+
e.stopPropagation();
|
|
215
|
+
action.onclick?.(item, e);
|
|
216
|
+
}
|
|
193
217
|
</script>
|
|
194
218
|
|
|
219
|
+
{#snippet itemActions(item: SidenavItem)}
|
|
220
|
+
{#if item.actions && item.actions.length > 0 && !collapsed}
|
|
221
|
+
<span class="nav-actions" class:always={actionsVisible === 'always'}>
|
|
222
|
+
{#each item.actions as action}
|
|
223
|
+
<ActionIcon
|
|
224
|
+
svg={action.iconSvg}
|
|
225
|
+
size="0.875rem"
|
|
226
|
+
variant={action.variant ?? 'secondary-subtle'}
|
|
227
|
+
tooltip={action.label}
|
|
228
|
+
onclick={(e) => handleActionClick(action, item, e)}
|
|
229
|
+
/>
|
|
230
|
+
{/each}
|
|
231
|
+
</span>
|
|
232
|
+
{/if}
|
|
233
|
+
{/snippet}
|
|
234
|
+
|
|
235
|
+
{#snippet sectionList(sects: SidenavSection[])}
|
|
236
|
+
{#each sects as section}
|
|
237
|
+
{#if section.title && !collapsed}
|
|
238
|
+
<div class="section-title">{section.title}</div>
|
|
239
|
+
{/if}
|
|
240
|
+
<ul class="nav-list">
|
|
241
|
+
{#each section.items as item}
|
|
242
|
+
<li class="nav-item">
|
|
243
|
+
<div class="nav-item-row" class:active={item.active}>
|
|
244
|
+
{#if item.href && !(item.items && item.items.length > 0)}
|
|
245
|
+
<Link
|
|
246
|
+
href={item.href}
|
|
247
|
+
class="nav-link {item.active ? 'active' : ''}"
|
|
248
|
+
onclick={() => handleNavItemClick(item)}
|
|
249
|
+
>
|
|
250
|
+
{#if item.iconSvg}
|
|
251
|
+
<Icon svg={item.iconSvg} size="1.25em" />
|
|
252
|
+
{/if}
|
|
253
|
+
{#if !collapsed}
|
|
254
|
+
<span class="nav-label">{item.label}</span>
|
|
255
|
+
{/if}
|
|
256
|
+
</Link>
|
|
257
|
+
{:else}
|
|
258
|
+
<button
|
|
259
|
+
type="button"
|
|
260
|
+
class="nav-link"
|
|
261
|
+
class:active={item.active}
|
|
262
|
+
class:has-children={item.items && item.items.length > 0}
|
|
263
|
+
title={collapsed ? item.label : undefined}
|
|
264
|
+
onclick={(e) => handleItemClick(item, e)}
|
|
265
|
+
>
|
|
266
|
+
{#if item.iconSvg}
|
|
267
|
+
<Icon svg={item.iconSvg} size="1.25em" />
|
|
268
|
+
{/if}
|
|
269
|
+
{#if !collapsed}
|
|
270
|
+
<span class="nav-label">{item.label}</span>
|
|
271
|
+
{#if item.items && item.items.length > 0}
|
|
272
|
+
<Icon
|
|
273
|
+
svg={iconChevronRight}
|
|
274
|
+
size="0.75em"
|
|
275
|
+
class="chevron {isExpanded(item.label) ? 'expanded' : ''}"
|
|
276
|
+
/>
|
|
277
|
+
{/if}
|
|
278
|
+
{/if}
|
|
279
|
+
</button>
|
|
280
|
+
{/if}
|
|
281
|
+
{@render itemActions(item)}
|
|
282
|
+
</div>
|
|
283
|
+
{#if item.items && item.items.length > 0 && isExpanded(item.label) && !collapsed}
|
|
284
|
+
<ul class="sub-nav-list" transition:slide={{ duration: 200 }}>
|
|
285
|
+
{#each item.items as subItem}
|
|
286
|
+
<li class="sub-nav-item">
|
|
287
|
+
<div class="nav-item-row" class:active={subItem.active}>
|
|
288
|
+
{#if subItem.href}
|
|
289
|
+
<Link
|
|
290
|
+
href={subItem.href}
|
|
291
|
+
class="sub-nav-link {subItem.active ? 'active' : ''}"
|
|
292
|
+
onclick={() => handleNavItemClick(subItem)}
|
|
293
|
+
>
|
|
294
|
+
{#if subItem.iconSvg}
|
|
295
|
+
<Icon svg={subItem.iconSvg} size="1em" />
|
|
296
|
+
{/if}
|
|
297
|
+
<span class="nav-label">{subItem.label}</span>
|
|
298
|
+
</Link>
|
|
299
|
+
{:else}
|
|
300
|
+
<button
|
|
301
|
+
type="button"
|
|
302
|
+
class="sub-nav-link"
|
|
303
|
+
class:active={subItem.active}
|
|
304
|
+
onclick={() => handleNavItemClick(subItem)}
|
|
305
|
+
>
|
|
306
|
+
{#if subItem.iconSvg}
|
|
307
|
+
<Icon svg={subItem.iconSvg} size="1em" />
|
|
308
|
+
{/if}
|
|
309
|
+
<span class="nav-label">{subItem.label}</span>
|
|
310
|
+
</button>
|
|
311
|
+
{/if}
|
|
312
|
+
{@render itemActions(subItem)}
|
|
313
|
+
</div>
|
|
314
|
+
</li>
|
|
315
|
+
{/each}
|
|
316
|
+
</ul>
|
|
317
|
+
{/if}
|
|
318
|
+
</li>
|
|
319
|
+
{/each}
|
|
320
|
+
</ul>
|
|
321
|
+
{/each}
|
|
322
|
+
{/snippet}
|
|
323
|
+
|
|
195
324
|
{#if !isMobile}
|
|
196
325
|
<!-- Desktop: Regular Sidenav -->
|
|
197
326
|
<aside
|
|
@@ -229,249 +358,12 @@
|
|
|
229
358
|
{/if}
|
|
230
359
|
|
|
231
360
|
<nav class="sidenav-content">
|
|
232
|
-
{
|
|
233
|
-
{#if section.title && !collapsed}
|
|
234
|
-
<div class="section-title">{section.title}</div>
|
|
235
|
-
{/if}
|
|
236
|
-
<ul class="nav-list">
|
|
237
|
-
{#each section.items as item}
|
|
238
|
-
<li class="nav-item">
|
|
239
|
-
{#if item.href && !(item.items && item.items.length > 0)}
|
|
240
|
-
<a
|
|
241
|
-
href={item.href}
|
|
242
|
-
class="nav-link"
|
|
243
|
-
class:active={item.active}
|
|
244
|
-
title={collapsed ? item.label : undefined}
|
|
245
|
-
onclick={() => handleLinkClick(item)}
|
|
246
|
-
>
|
|
247
|
-
{#if item.iconSvg}
|
|
248
|
-
<Icon
|
|
249
|
-
svg={item.iconSvg}
|
|
250
|
-
size="1.25em"
|
|
251
|
-
/>
|
|
252
|
-
{/if}
|
|
253
|
-
{#if !collapsed}
|
|
254
|
-
<span class="nav-label"
|
|
255
|
-
>{item.label}</span
|
|
256
|
-
>
|
|
257
|
-
{/if}
|
|
258
|
-
</a>
|
|
259
|
-
{:else}
|
|
260
|
-
<button
|
|
261
|
-
type="button"
|
|
262
|
-
class="nav-link"
|
|
263
|
-
class:active={item.active}
|
|
264
|
-
class:has-children={item.items &&
|
|
265
|
-
item.items.length > 0}
|
|
266
|
-
title={collapsed ? item.label : undefined}
|
|
267
|
-
onclick={(e) => handleItemClick(item, e)}
|
|
268
|
-
>
|
|
269
|
-
{#if item.iconSvg}
|
|
270
|
-
<Icon
|
|
271
|
-
svg={item.iconSvg}
|
|
272
|
-
size="1.25em"
|
|
273
|
-
/>
|
|
274
|
-
{/if}
|
|
275
|
-
{#if !collapsed}
|
|
276
|
-
<span class="nav-label"
|
|
277
|
-
>{item.label}</span
|
|
278
|
-
>
|
|
279
|
-
{#if item.items && item.items.length > 0}
|
|
280
|
-
<Icon
|
|
281
|
-
svg={iconChevronRight}
|
|
282
|
-
size="0.75em"
|
|
283
|
-
class="chevron {isExpanded(
|
|
284
|
-
item.label,
|
|
285
|
-
)
|
|
286
|
-
? 'expanded'
|
|
287
|
-
: ''}"
|
|
288
|
-
/>
|
|
289
|
-
{/if}
|
|
290
|
-
{/if}
|
|
291
|
-
</button>
|
|
292
|
-
{#if item.items && item.items.length > 0 && isExpanded(item.label) && !collapsed}
|
|
293
|
-
<ul
|
|
294
|
-
class="sub-nav-list"
|
|
295
|
-
transition:slide={{ duration: 200 }}
|
|
296
|
-
>
|
|
297
|
-
{#each item.items as subItem}
|
|
298
|
-
<li class="sub-nav-item">
|
|
299
|
-
{#if subItem.href}
|
|
300
|
-
<a
|
|
301
|
-
href={subItem.href}
|
|
302
|
-
class="sub-nav-link"
|
|
303
|
-
class:active={subItem.active}
|
|
304
|
-
onclick={() =>
|
|
305
|
-
handleLinkClick(
|
|
306
|
-
subItem,
|
|
307
|
-
)}
|
|
308
|
-
>
|
|
309
|
-
{#if subItem.iconSvg}
|
|
310
|
-
<Icon
|
|
311
|
-
svg={subItem.iconSvg}
|
|
312
|
-
size="1em"
|
|
313
|
-
/>
|
|
314
|
-
{/if}
|
|
315
|
-
<span
|
|
316
|
-
>{subItem.label}</span
|
|
317
|
-
>
|
|
318
|
-
</a>
|
|
319
|
-
{:else}
|
|
320
|
-
<button
|
|
321
|
-
type="button"
|
|
322
|
-
class="sub-nav-link"
|
|
323
|
-
class:active={subItem.active}
|
|
324
|
-
onclick={() =>
|
|
325
|
-
handleLinkClick(
|
|
326
|
-
subItem,
|
|
327
|
-
)}
|
|
328
|
-
>
|
|
329
|
-
{#if subItem.iconSvg}
|
|
330
|
-
<Icon
|
|
331
|
-
svg={subItem.iconSvg}
|
|
332
|
-
size="1em"
|
|
333
|
-
/>
|
|
334
|
-
{/if}
|
|
335
|
-
<span
|
|
336
|
-
>{subItem.label}</span
|
|
337
|
-
>
|
|
338
|
-
</button>
|
|
339
|
-
{/if}
|
|
340
|
-
</li>
|
|
341
|
-
{/each}
|
|
342
|
-
</ul>
|
|
343
|
-
{/if}
|
|
344
|
-
{/if}
|
|
345
|
-
</li>
|
|
346
|
-
{/each}
|
|
347
|
-
</ul>
|
|
348
|
-
{/each}
|
|
361
|
+
{@render sectionList(filteredSections)}
|
|
349
362
|
</nav>
|
|
350
363
|
|
|
351
364
|
{#if filteredBottomSections.length > 0}
|
|
352
365
|
<nav class="sidenav-bottom">
|
|
353
|
-
{
|
|
354
|
-
{#if section.title && !collapsed}
|
|
355
|
-
<div class="section-title">{section.title}</div>
|
|
356
|
-
{/if}
|
|
357
|
-
<ul class="nav-list">
|
|
358
|
-
{#each section.items as item}
|
|
359
|
-
<li class="nav-item">
|
|
360
|
-
{#if item.href && !(item.items && item.items.length > 0)}
|
|
361
|
-
<a
|
|
362
|
-
href={item.href}
|
|
363
|
-
class="nav-link"
|
|
364
|
-
class:active={item.active}
|
|
365
|
-
title={collapsed
|
|
366
|
-
? item.label
|
|
367
|
-
: undefined}
|
|
368
|
-
onclick={() => handleLinkClick(item)}
|
|
369
|
-
>
|
|
370
|
-
{#if item.iconSvg}
|
|
371
|
-
<Icon
|
|
372
|
-
svg={item.iconSvg}
|
|
373
|
-
size="1.25em"
|
|
374
|
-
/>
|
|
375
|
-
{/if}
|
|
376
|
-
{#if !collapsed}
|
|
377
|
-
<span class="nav-label"
|
|
378
|
-
>{item.label}</span
|
|
379
|
-
>
|
|
380
|
-
{/if}
|
|
381
|
-
</a>
|
|
382
|
-
{:else}
|
|
383
|
-
<button
|
|
384
|
-
type="button"
|
|
385
|
-
class="nav-link"
|
|
386
|
-
class:active={item.active}
|
|
387
|
-
class:has-children={item.items &&
|
|
388
|
-
item.items.length > 0}
|
|
389
|
-
title={collapsed
|
|
390
|
-
? item.label
|
|
391
|
-
: undefined}
|
|
392
|
-
onclick={(e) =>
|
|
393
|
-
handleItemClick(item, e)}
|
|
394
|
-
>
|
|
395
|
-
{#if item.iconSvg}
|
|
396
|
-
<Icon
|
|
397
|
-
svg={item.iconSvg}
|
|
398
|
-
size="1.25em"
|
|
399
|
-
/>
|
|
400
|
-
{/if}
|
|
401
|
-
{#if !collapsed}
|
|
402
|
-
<span class="nav-label"
|
|
403
|
-
>{item.label}</span
|
|
404
|
-
>
|
|
405
|
-
{#if item.items && item.items.length > 0}
|
|
406
|
-
<Icon
|
|
407
|
-
svg={iconChevronRight}
|
|
408
|
-
size="0.75em"
|
|
409
|
-
class="chevron {isExpanded(
|
|
410
|
-
item.label,
|
|
411
|
-
)
|
|
412
|
-
? 'expanded'
|
|
413
|
-
: ''}"
|
|
414
|
-
/>
|
|
415
|
-
{/if}
|
|
416
|
-
{/if}
|
|
417
|
-
</button>
|
|
418
|
-
{#if item.items && item.items.length > 0 && isExpanded(item.label) && !collapsed}
|
|
419
|
-
<ul
|
|
420
|
-
class="sub-nav-list"
|
|
421
|
-
transition:slide={{ duration: 200 }}
|
|
422
|
-
>
|
|
423
|
-
{#each item.items as subItem}
|
|
424
|
-
<li class="sub-nav-item">
|
|
425
|
-
{#if subItem.href}
|
|
426
|
-
<a
|
|
427
|
-
href={subItem.href}
|
|
428
|
-
class="sub-nav-link"
|
|
429
|
-
class:active={subItem.active}
|
|
430
|
-
onclick={() =>
|
|
431
|
-
handleLinkClick(
|
|
432
|
-
subItem,
|
|
433
|
-
)}
|
|
434
|
-
>
|
|
435
|
-
{#if subItem.iconSvg}
|
|
436
|
-
<Icon
|
|
437
|
-
svg={subItem.iconSvg}
|
|
438
|
-
size="1em"
|
|
439
|
-
/>
|
|
440
|
-
{/if}
|
|
441
|
-
<span
|
|
442
|
-
>{subItem.label}</span
|
|
443
|
-
>
|
|
444
|
-
</a>
|
|
445
|
-
{:else}
|
|
446
|
-
<button
|
|
447
|
-
type="button"
|
|
448
|
-
class="sub-nav-link"
|
|
449
|
-
class:active={subItem.active}
|
|
450
|
-
onclick={() =>
|
|
451
|
-
handleLinkClick(
|
|
452
|
-
subItem,
|
|
453
|
-
)}
|
|
454
|
-
>
|
|
455
|
-
{#if subItem.iconSvg}
|
|
456
|
-
<Icon
|
|
457
|
-
svg={subItem.iconSvg}
|
|
458
|
-
size="1em"
|
|
459
|
-
/>
|
|
460
|
-
{/if}
|
|
461
|
-
<span
|
|
462
|
-
>{subItem.label}</span
|
|
463
|
-
>
|
|
464
|
-
</button>
|
|
465
|
-
{/if}
|
|
466
|
-
</li>
|
|
467
|
-
{/each}
|
|
468
|
-
</ul>
|
|
469
|
-
{/if}
|
|
470
|
-
{/if}
|
|
471
|
-
</li>
|
|
472
|
-
{/each}
|
|
473
|
-
</ul>
|
|
474
|
-
{/each}
|
|
366
|
+
{@render sectionList(filteredBottomSections)}
|
|
475
367
|
</nav>
|
|
476
368
|
{/if}
|
|
477
369
|
|
|
@@ -492,6 +384,7 @@
|
|
|
492
384
|
{sections}
|
|
493
385
|
{bottomSections}
|
|
494
386
|
{width}
|
|
387
|
+
actionsVisible="always"
|
|
495
388
|
onItemClick={handleDrawerItemClick}
|
|
496
389
|
>
|
|
497
390
|
{#snippet header()}
|
|
@@ -513,12 +406,13 @@
|
|
|
513
406
|
flex-direction: column;
|
|
514
407
|
width: var(--sidenav-width);
|
|
515
408
|
min-width: var(--sidenav-width);
|
|
516
|
-
|
|
517
|
-
|
|
409
|
+
background-color: var(--paper-body-bg);
|
|
410
|
+
border-right: 1px solid var(--border-color);
|
|
518
411
|
transition:
|
|
519
|
-
width
|
|
520
|
-
min-width
|
|
412
|
+
width 0.2s ease,
|
|
413
|
+
min-width 0.2s ease;
|
|
521
414
|
overflow: hidden;
|
|
415
|
+
height: var(--page-content-height);
|
|
522
416
|
}
|
|
523
417
|
|
|
524
418
|
.sidenav.collapsed {
|
|
@@ -527,14 +421,14 @@
|
|
|
527
421
|
}
|
|
528
422
|
|
|
529
423
|
.sidenav-header {
|
|
530
|
-
padding:
|
|
531
|
-
border-bottom: 1px solid var(--
|
|
424
|
+
padding: 1rem;
|
|
425
|
+
border-bottom: 1px solid var(--border-color);
|
|
532
426
|
flex-shrink: 0;
|
|
533
427
|
}
|
|
534
428
|
|
|
535
429
|
.sidenav-search {
|
|
536
|
-
padding:
|
|
537
|
-
border-bottom: 1px solid var(--
|
|
430
|
+
padding: 0.5rem 0.75rem;
|
|
431
|
+
border-bottom: 1px solid var(--border-color);
|
|
538
432
|
flex-shrink: 0;
|
|
539
433
|
}
|
|
540
434
|
|
|
@@ -544,7 +438,7 @@
|
|
|
544
438
|
|
|
545
439
|
.sidenav-search :global(.search-clear-btn) {
|
|
546
440
|
position: absolute;
|
|
547
|
-
right:
|
|
441
|
+
right: 0.25rem;
|
|
548
442
|
top: 50%;
|
|
549
443
|
transform: translateY(-50%);
|
|
550
444
|
}
|
|
@@ -557,25 +451,27 @@
|
|
|
557
451
|
|
|
558
452
|
.sidenav-bottom {
|
|
559
453
|
flex-shrink: 0;
|
|
560
|
-
border-top: 1px solid var(--
|
|
561
|
-
padding:
|
|
454
|
+
border-top: 1px solid var(--border-color);
|
|
455
|
+
padding: 0.5rem 0;
|
|
562
456
|
}
|
|
563
457
|
|
|
564
458
|
.sidenav-footer {
|
|
565
|
-
padding:
|
|
566
|
-
border-top: 1px solid var(--
|
|
459
|
+
padding: 1rem;
|
|
460
|
+
border-top: 1px solid var(--border-color);
|
|
567
461
|
flex-shrink: 0;
|
|
568
462
|
}
|
|
569
463
|
|
|
570
464
|
.section-title {
|
|
571
|
-
padding:
|
|
465
|
+
padding: 0.75rem 1rem 0.5rem;
|
|
466
|
+
font-size: 0.75rem;
|
|
467
|
+
font-weight: 600;
|
|
572
468
|
text-transform: uppercase;
|
|
573
469
|
letter-spacing: 0.05em;
|
|
574
|
-
color: var(--
|
|
575
|
-
border-top: 1px solid var(--
|
|
576
|
-
border-bottom: 1px solid var(--
|
|
470
|
+
color: var(--text-muted, #6b7280);
|
|
471
|
+
border-top: 1px solid var(--border-color);
|
|
472
|
+
border-bottom: 1px solid var(--border-color);
|
|
577
473
|
}
|
|
578
|
-
|
|
474
|
+
|
|
579
475
|
.section-title:first-child {
|
|
580
476
|
border-top: none;
|
|
581
477
|
}
|
|
@@ -590,44 +486,63 @@
|
|
|
590
486
|
margin: 0;
|
|
591
487
|
}
|
|
592
488
|
|
|
593
|
-
|
|
489
|
+
/* Row wraps the nav link/button together with its action buttons. The row (not the
|
|
490
|
+
link) carries the hover/active background so it spans the full width, including the
|
|
491
|
+
action-button area. */
|
|
492
|
+
.nav-item-row {
|
|
493
|
+
display: flex;
|
|
494
|
+
align-items: center;
|
|
495
|
+
transition: background-color 0.15s ease;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
.nav-item-row :global(.nav-link),
|
|
499
|
+
.nav-item-row button.nav-link,
|
|
500
|
+
.nav-item-row :global(.sub-nav-link),
|
|
501
|
+
.nav-item-row button.sub-nav-link {
|
|
502
|
+
flex: 1;
|
|
503
|
+
min-width: 0;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.nav-item :global(.nav-link),
|
|
507
|
+
.nav-item button.nav-link {
|
|
594
508
|
display: flex;
|
|
595
509
|
align-items: center;
|
|
596
|
-
gap:
|
|
510
|
+
gap: 0.75rem;
|
|
597
511
|
width: 100%;
|
|
598
|
-
padding:
|
|
599
|
-
|
|
512
|
+
padding: 0.625rem 1rem;
|
|
513
|
+
font-size: 0.875rem;
|
|
514
|
+
font-weight: 500;
|
|
515
|
+
color: var(--text-color);
|
|
600
516
|
background: none;
|
|
601
517
|
border: none;
|
|
602
518
|
text-decoration: none;
|
|
603
519
|
cursor: pointer;
|
|
604
|
-
transition:
|
|
605
|
-
background-color var(--pui-transition-fast) var(--pui-ease-in-out),
|
|
606
|
-
color var(--pui-transition-fast) var(--pui-ease-in-out);
|
|
520
|
+
transition: color 0.15s ease;
|
|
607
521
|
text-align: left;
|
|
608
522
|
}
|
|
609
523
|
|
|
610
|
-
.collapsed .nav-link
|
|
524
|
+
.collapsed .nav-item :global(.nav-link),
|
|
525
|
+
.collapsed .nav-item button.nav-link {
|
|
611
526
|
justify-content: center;
|
|
612
|
-
padding:
|
|
527
|
+
padding: 0.75rem;
|
|
613
528
|
}
|
|
614
529
|
|
|
615
|
-
.nav-
|
|
616
|
-
background-color: var(--
|
|
530
|
+
.nav-item > .nav-item-row:hover {
|
|
531
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.08);
|
|
617
532
|
}
|
|
618
533
|
|
|
619
|
-
:global(.dark) .nav-
|
|
620
|
-
background-color: var(--
|
|
534
|
+
:global(.dark) .nav-item > .nav-item-row:hover {
|
|
535
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.2);
|
|
621
536
|
}
|
|
622
537
|
|
|
623
|
-
.nav-
|
|
624
|
-
background-color: var(--
|
|
625
|
-
border-left: 3px solid var(--
|
|
538
|
+
.nav-item > .nav-item-row.active {
|
|
539
|
+
background-color: rgba(var(--ui-accent-rgbc), 0.2);
|
|
540
|
+
border-left: 3px solid var(--ui-accent);
|
|
626
541
|
}
|
|
627
542
|
|
|
628
|
-
:global(.dark) .nav-
|
|
629
|
-
background-color: var(--
|
|
630
|
-
border-left: 3px solid var(--
|
|
543
|
+
:global(.dark) .nav-item > .nav-item-row.active {
|
|
544
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.3);
|
|
545
|
+
border-left: 3px solid var(--ui-primary);
|
|
631
546
|
}
|
|
632
547
|
|
|
633
548
|
.nav-label {
|
|
@@ -637,8 +552,27 @@
|
|
|
637
552
|
text-overflow: ellipsis;
|
|
638
553
|
}
|
|
639
554
|
|
|
555
|
+
/* Action buttons: revealed on hover/focus by default, or always when opted in */
|
|
556
|
+
.nav-actions {
|
|
557
|
+
display: flex;
|
|
558
|
+
align-items: center;
|
|
559
|
+
gap: 0.125rem;
|
|
560
|
+
flex-shrink: 0;
|
|
561
|
+
padding-right: 0.5rem;
|
|
562
|
+
opacity: 0;
|
|
563
|
+
pointer-events: none;
|
|
564
|
+
transition: opacity 0.15s ease;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.nav-actions.always,
|
|
568
|
+
.nav-item-row:hover .nav-actions,
|
|
569
|
+
.nav-item-row:focus-within .nav-actions {
|
|
570
|
+
opacity: 1;
|
|
571
|
+
pointer-events: auto;
|
|
572
|
+
}
|
|
573
|
+
|
|
640
574
|
.nav-link :global(.chevron) {
|
|
641
|
-
transition: transform
|
|
575
|
+
transition: transform 0.2s ease;
|
|
642
576
|
flex-shrink: 0;
|
|
643
577
|
}
|
|
644
578
|
|
|
@@ -650,49 +584,54 @@
|
|
|
650
584
|
list-style: none;
|
|
651
585
|
margin: 0;
|
|
652
586
|
padding: 0;
|
|
653
|
-
background-color: var(--
|
|
587
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.03);
|
|
654
588
|
}
|
|
655
589
|
|
|
656
590
|
:global(.dark) .sub-nav-list {
|
|
657
|
-
background-color:
|
|
591
|
+
background-color: rgba(0, 0, 0, 0.2);
|
|
658
592
|
}
|
|
659
593
|
|
|
660
594
|
.sub-nav-item {
|
|
661
595
|
margin: 0;
|
|
662
596
|
}
|
|
663
597
|
|
|
664
|
-
.sub-nav-link
|
|
598
|
+
.sub-nav-item :global(.sub-nav-link),
|
|
599
|
+
.sub-nav-item button.sub-nav-link {
|
|
665
600
|
display: flex;
|
|
666
601
|
align-items: center;
|
|
667
|
-
gap:
|
|
602
|
+
gap: 0.5rem;
|
|
668
603
|
width: 100%;
|
|
669
|
-
padding:
|
|
670
|
-
|
|
671
|
-
|
|
604
|
+
padding: 0.5rem 1rem 0.5rem 2.75rem;
|
|
605
|
+
font-size: 0.8125rem;
|
|
606
|
+
font-weight: 400;
|
|
607
|
+
color: var(--text-color);
|
|
672
608
|
background: none;
|
|
673
609
|
border: none;
|
|
674
610
|
text-decoration: none;
|
|
675
611
|
cursor: pointer;
|
|
676
|
-
transition:
|
|
677
|
-
background-color var(--pui-transition-fast) var(--pui-ease-in-out),
|
|
678
|
-
color var(--pui-transition-fast) var(--pui-ease-in-out);
|
|
612
|
+
transition: color 0.15s ease;
|
|
679
613
|
text-align: left;
|
|
680
614
|
}
|
|
681
615
|
|
|
682
|
-
.sub-nav-
|
|
683
|
-
background-color: var(--
|
|
616
|
+
.sub-nav-item > .nav-item-row:hover {
|
|
617
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.08);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
:global(.dark) .sub-nav-item > .nav-item-row:hover {
|
|
621
|
+
background-color: rgba(var(--ui-primary-rgbc), 0.2);
|
|
684
622
|
}
|
|
685
623
|
|
|
686
|
-
|
|
687
|
-
|
|
624
|
+
.sub-nav-item > .nav-item-row.active {
|
|
625
|
+
border-left: 3px solid var(--ui-accent);
|
|
688
626
|
}
|
|
689
627
|
|
|
690
|
-
.sub-nav-
|
|
691
|
-
border-left: 3px solid var(--
|
|
628
|
+
:global(.dark) .sub-nav-item > .nav-item-row.active {
|
|
629
|
+
border-left: 3px solid var(--ui-primary);
|
|
692
630
|
}
|
|
693
631
|
|
|
694
|
-
:global(.
|
|
695
|
-
|
|
632
|
+
.sub-nav-item > .nav-item-row.active :global(.sub-nav-link),
|
|
633
|
+
.sub-nav-item > .nav-item-row.active button.sub-nav-link {
|
|
634
|
+
font-weight: 500;
|
|
696
635
|
}
|
|
697
636
|
|
|
698
637
|
/* Scrollbar styling */
|
|
@@ -705,8 +644,8 @@
|
|
|
705
644
|
}
|
|
706
645
|
|
|
707
646
|
.sidenav-content::-webkit-scrollbar-thumb {
|
|
708
|
-
background-color:
|
|
709
|
-
border-radius:
|
|
647
|
+
background-color: #343434;
|
|
648
|
+
border-radius: 3px;
|
|
710
649
|
border: none;
|
|
711
650
|
}
|
|
712
651
|
</style>
|