@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
@@ -5,9 +5,17 @@ export interface Column<T = any> {
5
5
  sortable?: boolean;
6
6
  width?: string;
7
7
  align?: 'left' | 'center' | 'right';
8
+ /** Snippet rendered as the cell content. Takes precedence over `render`. */
9
+ cell?: Snippet<[{
10
+ value: any;
11
+ row: T;
12
+ index: number;
13
+ }]>;
14
+ /** @deprecated Returns raw HTML injected via {@html} — unsafe for untrusted
15
+ * data and cannot render components. Use `cell` instead. */
8
16
  render?: (value: any, row: T) => any;
9
17
  }
10
- interface Props<T = any> {
18
+ export interface TableProps<T = any> {
11
19
  /** Column definitions for the table */
12
20
  columns: Column<T>[];
13
21
  /** Data rows to display */
@@ -34,6 +42,10 @@ interface Props<T = any> {
34
42
  buttons?: Snippet<[T, number]>;
35
43
  /** Callback when a row is clicked */
36
44
  onrowclick?: (row: T, index: number) => void;
45
+ /** Returns a URL for a row. When provided, rows act as links: a plain click
46
+ * navigates client-side, while middle-click or ctrl/cmd/shift-click opens the
47
+ * URL in a new tab. Return a falsy value to make a row non-navigable. */
48
+ rowHref?: (row: T, index: number) => string | undefined | null;
37
49
  /** Enable checkbox selection */
38
50
  selectable?: boolean;
39
51
  /** Field name used to uniquely identify rows (required when selectable is true) */
@@ -42,7 +54,36 @@ interface Props<T = any> {
42
54
  selectedRows?: T[];
43
55
  /** Callback when selection changes */
44
56
  onselect?: (selectedRows: T[]) => void;
57
+ /** Detail content rendered in a full-width row beneath an expanded row.
58
+ * Providing this enables row expansion: expandable rows toggle on row click
59
+ * or via their chevron button. Requires rowKey. */
60
+ expandedContent?: Snippet<[T, number]>;
61
+ /** Limits which rows can expand (e.g. only group rows). Default: all rows. */
62
+ canExpand?: (row: T, index: number) => boolean;
63
+ /** Keys (via rowKey) of currently expanded rows (bindable) */
64
+ expandedKeys?: any[];
65
+ /** Callback when a row is expanded or collapsed — trigger on-demand fetches here */
66
+ onexpand?: (row: T, index: number, expanded: boolean) => void;
67
+ /** Rows per page. Setting this enables built-in client-side pagination,
68
+ * applied after search filtering and sorting. */
69
+ pageSize?: number;
70
+ /** Current page number, 1-based (bindable) */
71
+ page?: number;
72
+ /** Callback when the current page changes */
73
+ onpagechange?: (page: number) => void;
74
+ /** Key of the column currently sorted by, or null for unsorted (bindable).
75
+ * Set it to render the sort indicator for a server-supplied sort order. */
76
+ sortKey?: string | null;
77
+ /** Current sort direction (bindable) */
78
+ sortDirection?: 'asc' | 'desc';
79
+ /** Callback when the user clicks a sortable header, after `sortKey` and
80
+ * `sortDirection` have been updated. Use it to request sorted data from a
81
+ * server. Paginated tables also reset to page 1 before this fires. */
82
+ onsort?: (key: string, direction: 'asc' | 'desc') => void;
83
+ /** Skip the built-in client-side sort and render `rows` in the order given.
84
+ * Use with `onsort` when the server returns pre-sorted rows. */
85
+ manualSort?: boolean;
45
86
  }
46
- declare const Table: import("svelte").Component<Props<any>, {}, "selectedRows">;
87
+ declare const Table: import("svelte").Component<TableProps<any>, {}, "selectedRows" | "expandedKeys" | "page" | "sortKey" | "sortDirection">;
47
88
  type Table = ReturnType<typeof Table>;
48
89
  export default Table;
@@ -2,14 +2,18 @@
2
2
  import type { ComboBoxItem } from '../models/ComboBoxItem.js';
3
3
  import { onMount } from 'svelte';
4
4
 
5
- interface Props {
5
+ export interface TabsProps {
6
+ /** Available tab options */
6
7
  tabOptions: ComboBoxItem[];
8
+ /** Currently active tab value (bindable) */
7
9
  activeTab?: string;
10
+ /** Use solid background instead of transparent */
8
11
  solidBg?: boolean;
12
+ /** Callback when active tab changes */
9
13
  onchange?: (newValue: string) => void;
10
14
  }
11
15
 
12
- let { tabOptions, activeTab = $bindable(''), solidBg = false, onchange }: Props = $props();
16
+ let { tabOptions, activeTab = $bindable(''), solidBg = false, onchange }: TabsProps = $props();
13
17
  let containerRef: HTMLDivElement;
14
18
  let buttonElements = $state<HTMLButtonElement[]>([]);
15
19
  let underlineStyle = $state('');
@@ -80,7 +84,7 @@
80
84
  .tabs {
81
85
  position: relative;
82
86
  display: inline-flex;
83
- border-bottom: 1px solid var(--pui-border-default);
87
+ border-bottom: 1px solid #e5e7eb;
84
88
  user-select: none;
85
89
  }
86
90
 
@@ -89,58 +93,58 @@
89
93
  display: flex;
90
94
  align-items: center;
91
95
  justify-content: center;
92
- padding: var(--pui-spacing-3) var(--pui-spacing-6);
96
+ padding: 0.75rem 1.5rem;
93
97
  cursor: pointer;
94
98
  user-select: none;
95
99
  border: none;
96
100
  background: transparent;
97
- font-size: var(--pui-font-size-base);
98
- font-weight: var(--pui-font-weight-medium);
99
- color: var(--pui-color-gray-500);
100
- transition: color var(--pui-transition-fast) var(--pui-ease-in-out);
101
+ font-size: 0.875rem;
102
+ font-weight: 500;
103
+ color: #6b7280;
104
+ transition: color 0.2s ease-in-out;
101
105
  z-index: 1;
102
106
  border-bottom: 2px solid transparent;
103
107
  }
104
108
 
105
109
  .tab-item:hover {
106
- color: var(--pui-color-gray-700);
110
+ color: #374151;
107
111
  }
108
112
 
109
113
  .tab-item.selected {
110
- color: var(--pui-color-primary);
114
+ color: var(--ui-primary);
111
115
  }
112
116
 
113
117
  .tab-underline {
114
118
  position: absolute;
115
119
  bottom: -1px;
116
120
  height: 2px;
117
- background-color: var(--pui-color-primary);
118
- transition: all var(--pui-transition-fast) var(--pui-ease-in-out);
121
+ background-color: var(--ui-primary);
122
+ transition: all 0.2s ease-in-out;
119
123
  z-index: 2;
120
124
  }
121
125
 
122
126
  .solid {
123
- background: var(--pui-paper-body-bg);
127
+ background: var(--paper-body-bg);
124
128
  }
125
129
 
126
130
  /* Dark mode styles */
127
131
  :global(.dark) .tabs {
128
- border-bottom-color: var(--pui-color-gray-700);
132
+ border-bottom-color: #374151;
129
133
  }
130
134
 
131
135
  :global(.dark) .tab-item {
132
- color: var(--pui-color-gray-400);
136
+ color: #9ca3af;
133
137
  }
134
138
 
135
139
  :global(.dark) .tab-item:hover {
136
- color: var(--pui-color-gray-300);
140
+ color: #d1d5db;
137
141
  }
138
142
 
139
143
  :global(.dark) .tab-item.selected {
140
- color: var(--pui-color-secondary);
144
+ color: var(--ui-accent);
141
145
  }
142
146
 
143
147
  :global(.dark) .tab-underline {
144
- background-color: var(--pui-color-secondary);
148
+ background-color: var(--ui-accent);
145
149
  }
146
150
  </style>
@@ -1,10 +1,14 @@
1
1
  import type { ComboBoxItem } from '../models/ComboBoxItem.js';
2
- interface Props {
2
+ export interface TabsProps {
3
+ /** Available tab options */
3
4
  tabOptions: ComboBoxItem[];
5
+ /** Currently active tab value (bindable) */
4
6
  activeTab?: string;
7
+ /** Use solid background instead of transparent */
5
8
  solidBg?: boolean;
9
+ /** Callback when active tab changes */
6
10
  onchange?: (newValue: string) => void;
7
11
  }
8
- declare const Tabs: import("svelte").Component<Props, {}, "activeTab">;
12
+ declare const Tabs: import("svelte").Component<TabsProps, {}, "activeTab">;
9
13
  type Tabs = ReturnType<typeof Tabs>;
10
14
  export default Tabs;
@@ -3,29 +3,48 @@
3
3
 
4
4
  import sunSvg from '../icon/sun.svg?raw';
5
5
  import moonSvg from '../icon/moon.svg?raw';
6
+ import sunMoonSvg from '../icon/sun-moon.svg?raw';
6
7
  import ActionIcon from './ActionIcon.svelte';
7
8
  import type { ButtonVariant } from './ButtonVariant.js';
8
9
 
9
- interface Props {
10
+ export interface ThemeSwitcherProps {
11
+ /** Button variant to use in light mode */
10
12
  lightVariant?: ButtonVariant;
13
+ /** Button variant to use in dark mode */
11
14
  darkVariant?: ButtonVariant;
12
15
  }
13
16
 
14
- let { lightVariant = 'primary-subtle', darkVariant = 'secondary-subtle' }: Props = $props();
17
+ let { lightVariant = 'primary-subtle', darkVariant = 'accent-subtle' }: ThemeSwitcherProps = $props();
15
18
 
16
- function toggleDarkMode() {
17
- setTheme(themeState.isDarkMode ? 'light' : 'dark');
19
+ const themeCycle = ['light', 'dark', 'system'] as const;
20
+
21
+ const icons = {
22
+ light: sunSvg,
23
+ dark: moonSvg,
24
+ system: sunMoonSvg
25
+ };
26
+
27
+ const tooltips = {
28
+ light: 'Light theme',
29
+ dark: 'Dark theme',
30
+ system: 'System theme'
31
+ };
32
+
33
+ function cycleTheme() {
34
+ const index = themeCycle.indexOf(themeState.theme);
35
+ setTheme(themeCycle[(index + 1) % themeCycle.length]);
18
36
  }
19
37
  </script>
20
38
 
21
39
  <div class="theme-switcher">
22
- {#key themeState.isDarkMode}
40
+ {#key themeState.theme}
23
41
  <ActionIcon
24
42
  variant={themeState.isDarkMode ? darkVariant : lightVariant}
25
- svg={themeState.isDarkMode ? moonSvg : sunSvg}
43
+ svg={icons[themeState.theme]}
26
44
  class="action-icon"
27
45
  size="1.6em"
28
- onclick={toggleDarkMode}
46
+ onclick={cycleTheme}
47
+ tooltip={tooltips[themeState.theme]}
29
48
  />
30
49
  {/key}
31
50
  </div>
@@ -1,8 +1,10 @@
1
1
  import type { ButtonVariant } from './ButtonVariant.js';
2
- interface Props {
2
+ export interface ThemeSwitcherProps {
3
+ /** Button variant to use in light mode */
3
4
  lightVariant?: ButtonVariant;
5
+ /** Button variant to use in dark mode */
4
6
  darkVariant?: ButtonVariant;
5
7
  }
6
- declare const ThemeSwitcher: import("svelte").Component<Props, {}, "">;
8
+ declare const ThemeSwitcher: import("svelte").Component<ThemeSwitcherProps, {}, "">;
7
9
  type ThemeSwitcher = ReturnType<typeof ThemeSwitcher>;
8
10
  export default ThemeSwitcher;