@placeholderco/placeholder-ui 1.0.12 → 2.0.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 (276) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +134 -130
  3. package/dist/app.css +178 -0
  4. package/dist/bootstrap.min.css +3600 -0
  5. package/dist/cards/GitCard.svelte +115 -0
  6. package/dist/cards/GitCard.svelte.d.ts +22 -0
  7. package/dist/display/Avatar.svelte +29 -17
  8. package/dist/display/Avatar.svelte.d.ts +12 -2
  9. package/dist/display/LinkCollection.svelte +40 -18
  10. package/dist/display/LinkCollection.svelte.d.ts +9 -2
  11. package/dist/display/Paper.svelte +31 -19
  12. package/dist/display/Paper.svelte.d.ts +12 -3
  13. package/dist/display/alert/Alert.svelte +129 -0
  14. package/dist/display/alert/Alert.svelte.d.ts +15 -0
  15. package/dist/display/alert/AlertVariant.d.ts +1 -0
  16. package/dist/display/alert/AlertVariant.js +1 -0
  17. package/dist/display/filetree/FileTree.svelte +259 -0
  18. package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
  19. package/dist/display/filetree/FileTreeItem.svelte +396 -0
  20. package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
  21. package/dist/display/filetree/FileTreeNode.d.ts +46 -0
  22. package/dist/display/filetree/FileTreeNode.js +115 -0
  23. package/dist/display/filetree/index.d.ts +5 -0
  24. package/dist/display/filetree/index.js +3 -0
  25. package/dist/editors/CodeMirror.svelte +306 -0
  26. package/dist/editors/CodeMirror.svelte.d.ts +31 -0
  27. package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
  28. package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
  29. package/dist/editors/tiptap/TipTap.svelte +856 -0
  30. package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
  31. package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
  32. package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
  33. package/dist/editors/tiptap/collaboration.d.ts +55 -0
  34. package/dist/editors/tiptap/collaboration.js +1 -0
  35. package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
  36. package/dist/editors/tiptap/extensions/Alert.js +72 -0
  37. package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
  38. package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
  39. package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
  40. package/dist/editors/tiptap/extensions/Div.js +89 -0
  41. package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
  42. package/dist/editors/tiptap/extensions/Span.js +56 -0
  43. package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
  44. package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
  45. package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
  46. package/dist/editors/tiptap/extensions/index.d.ts +7 -0
  47. package/dist/editors/tiptap/extensions/index.js +5 -0
  48. package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
  49. package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
  50. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
  51. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
  52. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
  53. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
  54. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
  55. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
  56. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
  57. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
  58. package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
  59. package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
  60. package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
  61. package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
  62. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
  63. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
  64. package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
  65. package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
  66. package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
  67. package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
  68. package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
  69. package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
  70. package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
  71. package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
  72. package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
  73. package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
  74. package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
  75. package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
  76. package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
  77. package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
  78. package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
  79. package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
  80. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
  81. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
  82. package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
  83. package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
  84. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
  85. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
  86. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
  87. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
  88. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
  89. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
  90. package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
  91. package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
  92. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
  93. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
  94. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
  95. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
  96. package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
  97. package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
  98. package/dist/form/Autocomplete.svelte +86 -135
  99. package/dist/form/Autocomplete.svelte.d.ts +6 -8
  100. package/dist/form/AutocompleteMulti.svelte +385 -227
  101. package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
  102. package/dist/form/Checkbox.svelte +59 -54
  103. package/dist/form/Checkbox.svelte.d.ts +14 -5
  104. package/dist/form/Chips.svelte +29 -13
  105. package/dist/form/Chips.svelte.d.ts +16 -2
  106. package/dist/form/ComboBox.svelte +30 -20
  107. package/dist/form/ComboBox.svelte.d.ts +1 -1
  108. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  109. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  110. package/dist/form/ComboBoxMulti.svelte +38 -24
  111. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  112. package/dist/form/CronBuilder.svelte +84 -67
  113. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  114. package/dist/form/DatePicker.svelte +148 -195
  115. package/dist/form/DateRangePicker.svelte +101 -98
  116. package/dist/form/DateTimePicker.svelte +167 -208
  117. package/dist/form/DateTimePicker.svelte.d.ts +10 -2
  118. package/dist/form/FormGroup.svelte +33 -10
  119. package/dist/form/FormGroup.svelte.d.ts +12 -2
  120. package/dist/form/Number.svelte +70 -47
  121. package/dist/form/Number.svelte.d.ts +36 -6
  122. package/dist/form/Radio.svelte +18 -18
  123. package/dist/form/RadioGroup.svelte +23 -12
  124. package/dist/form/RadioGroup.svelte.d.ts +13 -2
  125. package/dist/form/SegmentedControl.svelte +76 -56
  126. package/dist/form/SegmentedControl.svelte.d.ts +9 -4
  127. package/dist/form/Select.svelte +150 -233
  128. package/dist/form/Select.svelte.d.ts +29 -5
  129. package/dist/form/SelectMulti.svelte +163 -277
  130. package/dist/form/SelectMulti.svelte.d.ts +36 -7
  131. package/dist/form/Slider.svelte +183 -269
  132. package/dist/form/Slider.svelte.d.ts +32 -17
  133. package/dist/form/StringArrayBuilder.svelte +249 -0
  134. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  135. package/dist/form/Switch.svelte +164 -106
  136. package/dist/form/Switch.svelte.d.ts +22 -3
  137. package/dist/form/TextArea.svelte +49 -29
  138. package/dist/form/TextArea.svelte.d.ts +23 -3
  139. package/dist/form/Textbox.svelte +69 -68
  140. package/dist/form/Textbox.svelte.d.ts +32 -4
  141. package/dist/form/TimePicker.svelte +42 -47
  142. package/dist/form/TimePicker.svelte.d.ts +12 -2
  143. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  144. package/dist/form/comboBoxCore.svelte.js +243 -0
  145. package/dist/icon/Icon.svelte +8 -3
  146. package/dist/icon/Icon.svelte.d.ts +8 -3
  147. package/dist/icon/file-type-bmp.svg +1 -0
  148. package/dist/icon/file-type-csv.svg +1 -0
  149. package/dist/icon/file-type-doc.svg +1 -0
  150. package/dist/icon/file-type-docx.svg +1 -0
  151. package/dist/icon/file-type-jpg.svg +1 -0
  152. package/dist/icon/file-type-pdf.svg +1 -0
  153. package/dist/icon/file-type-png.svg +1 -0
  154. package/dist/icon/file-type-ppt.svg +1 -0
  155. package/dist/icon/file-type-svg.svg +1 -0
  156. package/dist/icon/file-type-txt.svg +1 -0
  157. package/dist/icon/file-type-xls.svg +1 -0
  158. package/dist/icon/file-type-zip.svg +1 -0
  159. package/dist/icon/index.d.ts +166 -151
  160. package/dist/icon/index.js +166 -152
  161. package/dist/icon/logo-placeholder.svg +6 -0
  162. package/dist/icon/source-code.svg +1 -0
  163. package/dist/icon/sun-moon.svg +1 -0
  164. package/dist/icon/table.svg +6 -0
  165. package/dist/index.d.ts +87 -26
  166. package/dist/index.js +25 -28
  167. package/dist/layout/AppShell.svelte +12 -162
  168. package/dist/layout/AppShell.svelte.d.ts +6 -27
  169. package/dist/layout/CustomNavbar.svelte +9 -7
  170. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  171. package/dist/layout/Navbar.svelte +161 -129
  172. package/dist/layout/Navbar.svelte.d.ts +29 -15
  173. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  174. package/dist/layout/NavbarItemView.svelte +182 -0
  175. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  176. package/dist/layout/Sidenav.svelte +280 -341
  177. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  178. package/dist/models/ComboBoxItem.d.ts +2 -0
  179. package/dist/models/Employee.d.ts +53 -0
  180. package/dist/models/Employee.js +23 -0
  181. package/dist/models/Hyperlink.d.ts +3 -1
  182. package/dist/models/LinkCollectionItem.d.ts +3 -1
  183. package/dist/models/NavbarItem.d.ts +6 -2
  184. package/dist/theme.svelte.d.ts +0 -1
  185. package/dist/theme.svelte.js +46 -58
  186. package/dist/ui/Accordion.svelte +81 -242
  187. package/dist/ui/Accordion.svelte.d.ts +37 -14
  188. package/dist/ui/AccordionItem.svelte +303 -0
  189. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  190. package/dist/ui/ActionIcon.svelte +25 -21
  191. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  192. package/dist/ui/Badge.svelte +163 -171
  193. package/dist/ui/Badge.svelte.d.ts +13 -5
  194. package/dist/ui/Button.svelte +178 -205
  195. package/dist/ui/Button.svelte.d.ts +19 -2
  196. package/dist/ui/ButtonVariant.d.ts +15 -1
  197. package/dist/ui/ContextMenu.svelte +146 -0
  198. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  199. package/dist/ui/ContextMenuList.svelte +188 -0
  200. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  201. package/dist/ui/Dialog.svelte +183 -111
  202. package/dist/ui/Dialog.svelte.d.ts +21 -4
  203. package/dist/ui/Drawer.svelte +237 -184
  204. package/dist/ui/Drawer.svelte.d.ts +20 -2
  205. package/dist/ui/Dropdown.svelte +24 -14
  206. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  207. package/dist/ui/Dropzone.svelte +159 -57
  208. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  209. package/dist/ui/Link.svelte +12 -4
  210. package/dist/ui/Link.svelte.d.ts +8 -2
  211. package/dist/ui/Loader.svelte +23 -18
  212. package/dist/ui/Loader.svelte.d.ts +5 -2
  213. package/dist/ui/Logo.svelte +37 -0
  214. package/dist/ui/Logo.svelte.d.ts +16 -0
  215. package/dist/ui/MultiSortable.svelte +287 -0
  216. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  217. package/dist/ui/Pagination.svelte +15 -9
  218. package/dist/ui/Pagination.svelte.d.ts +6 -2
  219. package/dist/ui/Popover.svelte +43 -65
  220. package/dist/ui/Popover.svelte.d.ts +14 -5
  221. package/dist/ui/ProgressBar.svelte +28 -30
  222. package/dist/ui/ProgressBarVariant.d.ts +7 -1
  223. package/dist/ui/SegmentedControl.svelte +0 -0
  224. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  225. package/dist/ui/Sortable.svelte +163 -0
  226. package/dist/ui/Sortable.svelte.d.ts +47 -0
  227. package/dist/ui/Table.svelte +383 -80
  228. package/dist/ui/Table.svelte.d.ts +43 -2
  229. package/dist/ui/Tabs.svelte +22 -18
  230. package/dist/ui/Tabs.svelte.d.ts +6 -2
  231. package/dist/ui/ThemeSwitcher.svelte +26 -7
  232. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  233. package/dist/ui/Tooltip.svelte +312 -180
  234. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  235. package/dist/uiTheme.svelte.d.ts +86 -0
  236. package/dist/uiTheme.svelte.js +214 -0
  237. package/dist/util/DateFunctions.js +1 -1
  238. package/dist/util/DragDrop.d.ts +50 -0
  239. package/dist/util/DragDrop.js +154 -0
  240. package/dist/util/NavigateTo.js +2 -2
  241. package/dist/util/dayjs.d.ts +4 -0
  242. package/dist/util/dayjs.js +15 -0
  243. package/package.json +66 -26
  244. package/dist/display/Alert.svelte +0 -179
  245. package/dist/display/Alert.svelte.d.ts +0 -13
  246. package/dist/form/FileInput.svelte +0 -235
  247. package/dist/form/FileInput.svelte.d.ts +0 -23
  248. package/dist/form/PasswordInput.svelte +0 -253
  249. package/dist/form/PasswordInput.svelte.d.ts +0 -34
  250. package/dist/form/Rating.svelte +0 -235
  251. package/dist/form/Rating.svelte.d.ts +0 -21
  252. package/dist/styles/components.css +0 -199
  253. package/dist/styles/dark.css +0 -146
  254. package/dist/styles/index.css +0 -116
  255. package/dist/styles/reset.css +0 -110
  256. package/dist/styles/semantic.css +0 -86
  257. package/dist/styles/tokens.css +0 -203
  258. package/dist/styles/utilities.css +0 -523
  259. package/dist/ui/Breadcrumbs.svelte +0 -131
  260. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  261. package/dist/ui/LoadingOverlay.svelte +0 -53
  262. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  263. package/dist/ui/Progress.svelte +0 -191
  264. package/dist/ui/Progress.svelte.d.ts +0 -15
  265. package/dist/ui/RingProgress.svelte +0 -141
  266. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  267. package/dist/ui/Skeleton.svelte +0 -85
  268. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  269. package/dist/ui/Stepper.svelte +0 -355
  270. package/dist/ui/Stepper.svelte.d.ts +0 -24
  271. package/dist/ui/Timeline.svelte +0 -225
  272. package/dist/ui/Timeline.svelte.d.ts +0 -23
  273. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  274. /package/dist/{actions → util}/ClickOutside.js +0 -0
  275. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  276. /package/dist/{transitions → util}/Transitions.js +0 -0
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
- import type { SidenavItem, SidenavSection } from '../layout/Sidenav.svelte';
3
+ import type { SidenavItem, SidenavItemAction, SidenavSection } from '../layout/Sidenav.svelte';
4
4
  import Icon from '../icon/Icon.svelte';
5
5
  import Link from './Link.svelte';
6
6
  import ActionIcon from './ActionIcon.svelte';
@@ -8,23 +8,41 @@
8
8
  import { fade, fly } from 'svelte/transition';
9
9
  import { slide } from 'svelte/transition';
10
10
 
11
- interface Props {
11
+ export interface DrawerProps {
12
+ /** Whether the drawer is open (bindable) */
12
13
  open?: boolean;
14
+ /** Side from which the drawer slides in */
13
15
  position?: 'left' | 'right';
16
+ /** Width of the drawer */
14
17
  width?: string;
18
+ /** Close drawer when clicking outside */
15
19
  closeOnClickOutside?: boolean;
20
+ /** Close drawer when pressing Escape key */
16
21
  closeOnEscape?: boolean;
22
+ /** Auto-close on larger screens */
17
23
  closeForLargeScreens?: boolean;
24
+ /** Breakpoint for large screen detection */
18
25
  largeScreenBreakpoint?: number;
26
+ /** Navigation sections (for sidenav-style drawer) */
19
27
  sections?: SidenavSection[];
28
+ /** Sections pinned to the bottom */
20
29
  bottomSections?: SidenavSection[];
30
+ /** Title displayed in the drawer header */
21
31
  title?: string;
32
+ /** Additional CSS classes */
22
33
  class?: string;
34
+ /** Custom header content */
23
35
  header?: Snippet;
36
+ /** Custom footer content */
24
37
  footer?: Snippet;
38
+ /** Main drawer content */
25
39
  children?: Snippet;
40
+ /** Callback when drawer closes */
26
41
  onclose?: () => void;
42
+ /** Callback when a navigation item is clicked */
27
43
  onItemClick?: (item: SidenavItem) => void;
44
+ /** When item action buttons are shown: on hover/focus or always visible */
45
+ actionsVisible?: 'hover' | 'always';
28
46
  }
29
47
 
30
48
  let {
@@ -43,8 +61,9 @@
43
61
  footer,
44
62
  children,
45
63
  onclose,
46
- onItemClick
47
- }: Props = $props();
64
+ onItemClick,
65
+ actionsVisible = 'hover'
66
+ }: DrawerProps = $props();
48
67
 
49
68
  let expandedSections: Set<string> = $state(new Set());
50
69
 
@@ -66,7 +85,11 @@
66
85
  }
67
86
 
68
87
  function handleWindowResize() {
69
- if (closeForLargeScreens && typeof window !== 'undefined' && window.innerWidth > largeScreenBreakpoint) {
88
+ if (
89
+ closeForLargeScreens &&
90
+ typeof window !== 'undefined' &&
91
+ window.innerWidth > largeScreenBreakpoint
92
+ ) {
70
93
  close();
71
94
  }
72
95
  }
@@ -100,6 +123,12 @@
100
123
  item.onclick?.();
101
124
  }
102
125
 
126
+ function handleActionClick(action: SidenavItemAction, item: SidenavItem, e: MouseEvent) {
127
+ // Keep the action independent of the item's own navigation/expand behaviour
128
+ e.stopPropagation();
129
+ action.onclick?.(item, e);
130
+ }
131
+
103
132
  // Body scroll lock
104
133
  $effect(() => {
105
134
  if (typeof document !== 'undefined') {
@@ -119,6 +148,106 @@
119
148
  const flyDirection = $derived(position === 'left' ? -320 : 320);
120
149
  </script>
121
150
 
151
+ {#snippet itemActions(item: SidenavItem)}
152
+ {#if item.actions && item.actions.length > 0}
153
+ <span class="nav-actions" class:always={actionsVisible === 'always'}>
154
+ {#each item.actions as action}
155
+ <ActionIcon
156
+ svg={action.iconSvg}
157
+ size="0.875rem"
158
+ variant={action.variant ?? 'secondary-subtle'}
159
+ tooltip={action.label}
160
+ onclick={(e) => handleActionClick(action, item, e)}
161
+ />
162
+ {/each}
163
+ </span>
164
+ {/if}
165
+ {/snippet}
166
+
167
+ {#snippet sectionList(sects: SidenavSection[])}
168
+ {#each sects as section}
169
+ {#if section.title}
170
+ <div class="section-title">{section.title}</div>
171
+ {/if}
172
+ <ul class="nav-list">
173
+ {#each section.items as item}
174
+ <li class="nav-item">
175
+ <div class="nav-item-row" class:active={item.active}>
176
+ {#if item.href && !(item.items && item.items.length > 0)}
177
+ <Link
178
+ href={item.href}
179
+ class="nav-link {item.active ? 'active' : ''}"
180
+ onclick={() => handleLinkClick(item)}
181
+ >
182
+ {#if item.iconSvg}
183
+ <Icon svg={item.iconSvg} size="1.25em" />
184
+ {/if}
185
+ <span class="nav-label">{item.label}</span>
186
+ </Link>
187
+ {:else}
188
+ <button
189
+ type="button"
190
+ class="nav-link"
191
+ class:active={item.active}
192
+ class:has-children={item.items && item.items.length > 0}
193
+ onclick={(e) => handleItemClick(item, e)}
194
+ >
195
+ {#if item.iconSvg}
196
+ <Icon svg={item.iconSvg} size="1.25em" />
197
+ {/if}
198
+ <span class="nav-label">{item.label}</span>
199
+ {#if item.items && item.items.length > 0}
200
+ <Icon
201
+ svg={iconChevronRight}
202
+ size="0.75em"
203
+ class="chevron {isExpanded(item.label) ? 'expanded' : ''}"
204
+ />
205
+ {/if}
206
+ </button>
207
+ {/if}
208
+ {@render itemActions(item)}
209
+ </div>
210
+ {#if item.items && item.items.length > 0 && isExpanded(item.label)}
211
+ <ul class="sub-nav-list" transition:slide={{ duration: 200 }}>
212
+ {#each item.items as subItem}
213
+ <li class="sub-nav-item">
214
+ <div class="nav-item-row" class:active={subItem.active}>
215
+ {#if subItem.href}
216
+ <Link
217
+ href={subItem.href}
218
+ class="sub-nav-link {subItem.active ? 'active' : ''}"
219
+ onclick={() => handleLinkClick(subItem)}
220
+ >
221
+ {#if subItem.iconSvg}
222
+ <Icon svg={subItem.iconSvg} size="1em" />
223
+ {/if}
224
+ <span class="nav-label">{subItem.label}</span>
225
+ </Link>
226
+ {:else}
227
+ <button
228
+ type="button"
229
+ class="sub-nav-link"
230
+ class:active={subItem.active}
231
+ onclick={() => handleLinkClick(subItem)}
232
+ >
233
+ {#if subItem.iconSvg}
234
+ <Icon svg={subItem.iconSvg} size="1em" />
235
+ {/if}
236
+ <span class="nav-label">{subItem.label}</span>
237
+ </button>
238
+ {/if}
239
+ {@render itemActions(subItem)}
240
+ </div>
241
+ </li>
242
+ {/each}
243
+ </ul>
244
+ {/if}
245
+ </li>
246
+ {/each}
247
+ </ul>
248
+ {/each}
249
+ {/snippet}
250
+
122
251
  <svelte:window onresize={handleWindowResize} onkeydown={handleKeydown} />
123
252
 
124
253
  {#if open}
@@ -167,81 +296,7 @@
167
296
  {#if hasNavContent}
168
297
  <!-- Navigation sections -->
169
298
  <nav class="drawer-nav">
170
- {#each sections as section}
171
- {#if section.title}
172
- <div class="section-title">{section.title}</div>
173
- {/if}
174
- <ul class="nav-list">
175
- {#each section.items as item}
176
- <li class="nav-item">
177
- {#if item.href && !(item.items && item.items.length > 0)}
178
- <Link
179
- href={item.href}
180
- class="nav-link {item.active ? 'active' : ''}"
181
- onclick={() => handleLinkClick(item)}
182
- >
183
- {#if item.iconSvg}
184
- <Icon svg={item.iconSvg} size="1.25em" />
185
- {/if}
186
- <span class="nav-label">{item.label}</span>
187
- </Link>
188
- {:else}
189
- <button
190
- type="button"
191
- class="nav-link"
192
- class:active={item.active}
193
- class:has-children={item.items && item.items.length > 0}
194
- onclick={(e) => handleItemClick(item, e)}
195
- >
196
- {#if item.iconSvg}
197
- <Icon svg={item.iconSvg} size="1.25em" />
198
- {/if}
199
- <span class="nav-label">{item.label}</span>
200
- {#if item.items && item.items.length > 0}
201
- <Icon
202
- svg={iconChevronRight}
203
- size="0.75em"
204
- class="chevron {isExpanded(item.label) ? 'expanded' : ''}"
205
- />
206
- {/if}
207
- </button>
208
- {#if item.items && item.items.length > 0 && isExpanded(item.label)}
209
- <ul class="sub-nav-list" transition:slide={{ duration: 200 }}>
210
- {#each item.items as subItem}
211
- <li class="sub-nav-item">
212
- {#if subItem.href}
213
- <Link
214
- href={subItem.href}
215
- class="sub-nav-link {subItem.active ? 'active' : ''}"
216
- onclick={() => handleLinkClick(subItem)}
217
- >
218
- {#if subItem.iconSvg}
219
- <Icon svg={subItem.iconSvg} size="1em" />
220
- {/if}
221
- <span>{subItem.label}</span>
222
- </Link>
223
- {:else}
224
- <button
225
- type="button"
226
- class="sub-nav-link"
227
- class:active={subItem.active}
228
- onclick={() => handleLinkClick(subItem)}
229
- >
230
- {#if subItem.iconSvg}
231
- <Icon svg={subItem.iconSvg} size="1em" />
232
- {/if}
233
- <span>{subItem.label}</span>
234
- </button>
235
- {/if}
236
- </li>
237
- {/each}
238
- </ul>
239
- {/if}
240
- {/if}
241
- </li>
242
- {/each}
243
- </ul>
244
- {/each}
299
+ {@render sectionList(sections)}
245
300
  </nav>
246
301
  {:else if children}
247
302
  {@render children()}
@@ -251,41 +306,7 @@
251
306
  <!-- Bottom sections -->
252
307
  {#if bottomSections.length > 0}
253
308
  <nav class="drawer-bottom">
254
- {#each bottomSections as section}
255
- {#if section.title}
256
- <div class="section-title">{section.title}</div>
257
- {/if}
258
- <ul class="nav-list">
259
- {#each section.items as item}
260
- <li class="nav-item">
261
- {#if item.href}
262
- <Link
263
- href={item.href}
264
- class="nav-link {item.active ? 'active' : ''}"
265
- onclick={() => handleLinkClick(item)}
266
- >
267
- {#if item.iconSvg}
268
- <Icon svg={item.iconSvg} size="1.25em" />
269
- {/if}
270
- <span class="nav-label">{item.label}</span>
271
- </Link>
272
- {:else}
273
- <button
274
- type="button"
275
- class="nav-link"
276
- class:active={item.active}
277
- onclick={() => handleLinkClick(item)}
278
- >
279
- {#if item.iconSvg}
280
- <Icon svg={item.iconSvg} size="1.25em" />
281
- {/if}
282
- <span class="nav-label">{item.label}</span>
283
- </button>
284
- {/if}
285
- </li>
286
- {/each}
287
- </ul>
288
- {/each}
309
+ {@render sectionList(bottomSections)}
289
310
  </nav>
290
311
  {/if}
291
312
 
@@ -302,8 +323,8 @@
302
323
  .drawer-backdrop {
303
324
  position: fixed;
304
325
  inset: 0;
305
- background-color: var(--pui-bg-overlay);
306
- z-index: var(--pui-z-modal-backdrop);
326
+ background-color: rgba(0, 0, 0, 0.5);
327
+ z-index: 1040;
307
328
  }
308
329
 
309
330
  .drawer {
@@ -314,21 +335,21 @@
314
335
  flex-direction: column;
315
336
  width: var(--drawer-width);
316
337
  max-width: 100vw;
317
- background-color: var(--pui-paper-body-bg);
318
- border-right: 1px solid var(--pui-border-default);
319
- z-index: var(--pui-z-modal);
338
+ background-color: var(--paper-body-bg);
339
+ border-right: 1px solid var(--border-color);
340
+ z-index: 1050;
320
341
  overflow: hidden;
321
342
  }
322
343
 
323
344
  .drawer-left {
324
345
  left: 0;
325
- border-right: 1px solid var(--pui-border-default);
346
+ border-right: 1px solid var(--border-color);
326
347
  border-left: none;
327
348
  }
328
349
 
329
350
  .drawer-right {
330
351
  right: 0;
331
- border-left: 1px solid var(--pui-border-default);
352
+ border-left: 1px solid var(--border-color);
332
353
  border-right: none;
333
354
  }
334
355
 
@@ -336,18 +357,18 @@
336
357
  display: flex;
337
358
  align-items: center;
338
359
  justify-content: space-between;
339
- gap: var(--pui-spacing-4);
340
- padding: var(--pui-spacing-3) var(--pui-spacing-4);
341
- border-bottom: 1px solid var(--pui-border-default);
360
+ gap: 1rem;
361
+ padding: 0.75rem 1rem;
362
+ border-bottom: 1px solid var(--border-color);
342
363
  flex-shrink: 0;
343
- min-height: 46px;
364
+ min-height: var(--header-height);
344
365
  }
345
366
 
346
367
  .drawer-title {
347
368
  margin: 0;
348
- font-size: var(--pui-font-size-lg);
349
- font-weight: var(--pui-font-weight-semibold);
350
- color: var(--pui-text-primary);
369
+ font-size: 1.125rem;
370
+ font-weight: 600;
371
+ color: var(--text-color);
351
372
  flex: 1;
352
373
  }
353
374
 
@@ -363,28 +384,28 @@
363
384
  }
364
385
 
365
386
  .drawer-nav {
366
- padding: var(--pui-spacing-2) 0;
387
+ padding: 0.5rem 0;
367
388
  }
368
389
 
369
390
  .drawer-bottom {
370
391
  flex-shrink: 0;
371
- border-top: 1px solid var(--pui-border-default);
372
- padding: var(--pui-spacing-2) 0;
392
+ border-top: 1px solid var(--border-color);
393
+ padding: 0.5rem 0;
373
394
  }
374
395
 
375
396
  .drawer-footer {
376
- padding: var(--pui-spacing-4);
377
- border-top: 1px solid var(--pui-border-default);
397
+ padding: 1rem;
398
+ border-top: 1px solid var(--border-color);
378
399
  flex-shrink: 0;
379
400
  }
380
401
 
381
402
  .section-title {
382
- padding: var(--pui-spacing-3) var(--pui-spacing-4) var(--pui-spacing-2);
383
- font-size: var(--pui-font-size-xs);
384
- font-weight: var(--pui-font-weight-semibold);
403
+ padding: 0.75rem 1rem 0.5rem;
404
+ font-size: 0.75rem;
405
+ font-weight: 600;
385
406
  text-transform: uppercase;
386
- letter-spacing: var(--pui-letter-spacing-wide);
387
- color: var(--pui-text-muted);
407
+ letter-spacing: 0.05em;
408
+ color: var(--text-muted, #6b7280);
388
409
  }
389
410
 
390
411
  .nav-list {
@@ -397,44 +418,76 @@
397
418
  margin: 0;
398
419
  }
399
420
 
421
+ /* Row wraps the nav link/button together with its action buttons. The row (not the
422
+ link) carries the hover/active background so it spans the full width, including the
423
+ action-button area. */
424
+ .nav-item-row {
425
+ display: flex;
426
+ align-items: center;
427
+ transition: background-color 0.15s ease;
428
+ }
429
+
430
+ .nav-item-row :global(.nav-link),
431
+ .nav-item-row button.nav-link,
432
+ .nav-item-row :global(.sub-nav-link),
433
+ .nav-item-row button.sub-nav-link {
434
+ flex: 1;
435
+ min-width: 0;
436
+ }
437
+
438
+ /* Action buttons: revealed on hover/focus by default, or always when opted in */
439
+ .nav-actions {
440
+ display: flex;
441
+ align-items: center;
442
+ gap: 0.125rem;
443
+ flex-shrink: 0;
444
+ padding-right: 0.5rem;
445
+ opacity: 0;
446
+ pointer-events: none;
447
+ transition: opacity 0.15s ease;
448
+ }
449
+
450
+ .nav-actions.always,
451
+ .nav-item-row:hover .nav-actions,
452
+ .nav-item-row:focus-within .nav-actions {
453
+ opacity: 1;
454
+ pointer-events: auto;
455
+ }
456
+
400
457
  .nav-item :global(.nav-link),
401
- .nav-item > button.nav-link {
458
+ .nav-item button.nav-link {
402
459
  display: flex;
403
460
  align-items: center;
404
- gap: var(--pui-spacing-3);
461
+ gap: 0.75rem;
405
462
  width: 100%;
406
- padding: var(--pui-spacing-2_5) var(--pui-spacing-4);
407
- font-size: var(--pui-font-size-base);
408
- font-weight: var(--pui-font-weight-medium);
409
- color: var(--pui-text-primary);
463
+ padding: 0.625rem 1rem;
464
+ font-size: 0.875rem;
465
+ font-weight: 500;
466
+ color: var(--text-color);
410
467
  background: none;
411
468
  border: none;
412
469
  text-decoration: none;
413
470
  cursor: pointer;
414
- transition: background-color var(--pui-transition-fast) var(--pui-ease-out), color var(--pui-transition-fast) var(--pui-ease-out);
471
+ transition: color 0.15s ease;
415
472
  text-align: left;
416
473
  }
417
474
 
418
- .nav-item :global(.nav-link:hover),
419
- .nav-item > button.nav-link:hover {
420
- background-color: var(--pui-bg-hover);
475
+ .nav-item > .nav-item-row:hover {
476
+ background-color: rgba(var(--ui-primary-rgbc), 0.08);
421
477
  }
422
478
 
423
- :global(.dark) .nav-item :global(.nav-link:hover),
424
- :global(.dark) .nav-item > button.nav-link:hover {
425
- background-color: var(--pui-bg-hover);
479
+ :global(.dark) .nav-item > .nav-item-row:hover {
480
+ background-color: rgba(var(--ui-primary-rgbc), 0.2);
426
481
  }
427
482
 
428
- .nav-item :global(.nav-link.active),
429
- .nav-item > button.nav-link.active {
430
- background-color: rgba(var(--pui-color-secondary-rgb), 0.2);
431
- border-left: 3px solid var(--pui-color-secondary);
483
+ .nav-item > .nav-item-row.active {
484
+ background-color: rgba(var(--ui-accent-rgbc), 0.2);
485
+ border-left: 3px solid var(--ui-accent);
432
486
  }
433
487
 
434
- :global(.dark) .nav-item :global(.nav-link.active),
435
- :global(.dark) .nav-item > button.nav-link.active {
436
- background-color: rgba(var(--pui-color-primary-rgb), 0.3);
437
- border-left: 3px solid var(--pui-color-primary);
488
+ :global(.dark) .nav-item > .nav-item-row.active {
489
+ background-color: rgba(var(--ui-primary-rgbc), 0.3);
490
+ border-left: 3px solid var(--ui-primary);
438
491
  }
439
492
 
440
493
  .nav-label {
@@ -445,7 +498,7 @@
445
498
  }
446
499
 
447
500
  .nav-link :global(.chevron) {
448
- transition: transform var(--pui-transition-fast) var(--pui-ease-out);
501
+ transition: transform 0.2s ease;
449
502
  flex-shrink: 0;
450
503
  }
451
504
 
@@ -457,7 +510,7 @@
457
510
  list-style: none;
458
511
  margin: 0;
459
512
  padding: 0;
460
- background-color: var(--pui-bg-hover);
513
+ background-color: rgba(var(--ui-primary-rgbc), 0.03);
461
514
  }
462
515
 
463
516
  :global(.dark) .sub-nav-list {
@@ -469,42 +522,42 @@
469
522
  }
470
523
 
471
524
  .sub-nav-item :global(.sub-nav-link),
472
- .sub-nav-item > button.sub-nav-link {
525
+ .sub-nav-item button.sub-nav-link {
473
526
  display: flex;
474
527
  align-items: center;
475
- gap: var(--pui-spacing-2);
528
+ gap: 0.5rem;
476
529
  width: 100%;
477
- padding: var(--pui-spacing-2) var(--pui-spacing-4) var(--pui-spacing-2) var(--pui-spacing-11);
478
- font-size: var(--pui-font-size-sm);
479
- font-weight: var(--pui-font-weight-normal);
480
- color: var(--pui-text-primary);
530
+ padding: 0.5rem 1rem 0.5rem 2.75rem;
531
+ font-size: 0.8125rem;
532
+ font-weight: 400;
533
+ color: var(--text-color);
481
534
  background: none;
482
535
  border: none;
483
536
  text-decoration: none;
484
537
  cursor: pointer;
485
- transition: background-color var(--pui-transition-fast) var(--pui-ease-out), color var(--pui-transition-fast) var(--pui-ease-out);
538
+ transition: color 0.15s ease;
486
539
  text-align: left;
487
540
  }
488
541
 
489
- .sub-nav-item :global(.sub-nav-link:hover),
490
- .sub-nav-item > button.sub-nav-link:hover {
491
- background-color: var(--pui-bg-active);
542
+ .sub-nav-item > .nav-item-row:hover {
543
+ background-color: rgba(var(--ui-primary-rgbc), 0.08);
544
+ }
545
+
546
+ :global(.dark) .sub-nav-item > .nav-item-row:hover {
547
+ background-color: rgba(var(--ui-primary-rgbc), 0.2);
492
548
  }
493
549
 
494
- :global(.dark) .sub-nav-item :global(.sub-nav-link:hover),
495
- :global(.dark) .sub-nav-item > button.sub-nav-link:hover {
496
- background-color: var(--pui-bg-active);
550
+ .sub-nav-item > .nav-item-row.active {
551
+ border-left: 3px solid var(--ui-accent);
497
552
  }
498
553
 
499
- .sub-nav-item :global(.sub-nav-link.active),
500
- .sub-nav-item > button.sub-nav-link.active {
501
- font-weight: var(--pui-font-weight-medium);
502
- border-left: 3px solid var(--pui-color-secondary);
554
+ :global(.dark) .sub-nav-item > .nav-item-row.active {
555
+ border-left: 3px solid var(--ui-primary);
503
556
  }
504
557
 
505
- :global(.dark) .sub-nav-item :global(.sub-nav-link.active),
506
- :global(.dark) .sub-nav-item > button.sub-nav-link.active {
507
- border-left: 3px solid var(--pui-color-primary);
558
+ .sub-nav-item > .nav-item-row.active :global(.sub-nav-link),
559
+ .sub-nav-item > .nav-item-row.active button.sub-nav-link {
560
+ font-weight: 500;
508
561
  }
509
562
 
510
563
  /* Scrollbar styling */
@@ -517,8 +570,8 @@
517
570
  }
518
571
 
519
572
  .drawer-content::-webkit-scrollbar-thumb {
520
- background-color: var(--pui-color-gray-700);
521
- border-radius: var(--pui-radius-sm);
573
+ background-color: #343434;
574
+ border-radius: 3px;
522
575
  border: none;
523
576
  }
524
577
  </style>
@@ -1,23 +1,41 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { SidenavItem, SidenavSection } from '../layout/Sidenav.svelte';
3
- interface Props {
3
+ export interface DrawerProps {
4
+ /** Whether the drawer is open (bindable) */
4
5
  open?: boolean;
6
+ /** Side from which the drawer slides in */
5
7
  position?: 'left' | 'right';
8
+ /** Width of the drawer */
6
9
  width?: string;
10
+ /** Close drawer when clicking outside */
7
11
  closeOnClickOutside?: boolean;
12
+ /** Close drawer when pressing Escape key */
8
13
  closeOnEscape?: boolean;
14
+ /** Auto-close on larger screens */
9
15
  closeForLargeScreens?: boolean;
16
+ /** Breakpoint for large screen detection */
10
17
  largeScreenBreakpoint?: number;
18
+ /** Navigation sections (for sidenav-style drawer) */
11
19
  sections?: SidenavSection[];
20
+ /** Sections pinned to the bottom */
12
21
  bottomSections?: SidenavSection[];
22
+ /** Title displayed in the drawer header */
13
23
  title?: string;
24
+ /** Additional CSS classes */
14
25
  class?: string;
26
+ /** Custom header content */
15
27
  header?: Snippet;
28
+ /** Custom footer content */
16
29
  footer?: Snippet;
30
+ /** Main drawer content */
17
31
  children?: Snippet;
32
+ /** Callback when drawer closes */
18
33
  onclose?: () => void;
34
+ /** Callback when a navigation item is clicked */
19
35
  onItemClick?: (item: SidenavItem) => void;
36
+ /** When item action buttons are shown: on hover/focus or always visible */
37
+ actionsVisible?: 'hover' | 'always';
20
38
  }
21
- declare const Drawer: import("svelte").Component<Props, {}, "open">;
39
+ declare const Drawer: import("svelte").Component<DrawerProps, {}, "open">;
22
40
  type Drawer = ReturnType<typeof Drawer>;
23
41
  export default Drawer;