@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.
Files changed (278) 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/ColorPicker.svelte +957 -0
  107. package/dist/form/ColorPicker.svelte.d.ts +78 -0
  108. package/dist/form/ComboBox.svelte +30 -20
  109. package/dist/form/ComboBox.svelte.d.ts +1 -1
  110. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  111. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  112. package/dist/form/ComboBoxMulti.svelte +38 -24
  113. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  114. package/dist/form/CronBuilder.svelte +84 -67
  115. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  116. package/dist/form/DatePicker.svelte +148 -195
  117. package/dist/form/DateRangePicker.svelte +101 -98
  118. package/dist/form/DateTimePicker.svelte +167 -208
  119. package/dist/form/DateTimePicker.svelte.d.ts +10 -2
  120. package/dist/form/FormGroup.svelte +33 -10
  121. package/dist/form/FormGroup.svelte.d.ts +12 -2
  122. package/dist/form/Number.svelte +70 -47
  123. package/dist/form/Number.svelte.d.ts +36 -6
  124. package/dist/form/Radio.svelte +18 -18
  125. package/dist/form/RadioGroup.svelte +23 -12
  126. package/dist/form/RadioGroup.svelte.d.ts +13 -2
  127. package/dist/form/SegmentedControl.svelte +76 -56
  128. package/dist/form/SegmentedControl.svelte.d.ts +9 -4
  129. package/dist/form/Select.svelte +150 -233
  130. package/dist/form/Select.svelte.d.ts +29 -5
  131. package/dist/form/SelectMulti.svelte +163 -277
  132. package/dist/form/SelectMulti.svelte.d.ts +36 -7
  133. package/dist/form/Slider.svelte +183 -269
  134. package/dist/form/Slider.svelte.d.ts +32 -17
  135. package/dist/form/StringArrayBuilder.svelte +249 -0
  136. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  137. package/dist/form/Switch.svelte +164 -106
  138. package/dist/form/Switch.svelte.d.ts +22 -3
  139. package/dist/form/TextArea.svelte +49 -29
  140. package/dist/form/TextArea.svelte.d.ts +23 -3
  141. package/dist/form/Textbox.svelte +69 -68
  142. package/dist/form/Textbox.svelte.d.ts +32 -4
  143. package/dist/form/TimePicker.svelte +42 -47
  144. package/dist/form/TimePicker.svelte.d.ts +12 -2
  145. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  146. package/dist/form/comboBoxCore.svelte.js +243 -0
  147. package/dist/icon/Icon.svelte +8 -3
  148. package/dist/icon/Icon.svelte.d.ts +8 -3
  149. package/dist/icon/file-type-bmp.svg +1 -0
  150. package/dist/icon/file-type-csv.svg +1 -0
  151. package/dist/icon/file-type-doc.svg +1 -0
  152. package/dist/icon/file-type-docx.svg +1 -0
  153. package/dist/icon/file-type-jpg.svg +1 -0
  154. package/dist/icon/file-type-pdf.svg +1 -0
  155. package/dist/icon/file-type-png.svg +1 -0
  156. package/dist/icon/file-type-ppt.svg +1 -0
  157. package/dist/icon/file-type-svg.svg +1 -0
  158. package/dist/icon/file-type-txt.svg +1 -0
  159. package/dist/icon/file-type-xls.svg +1 -0
  160. package/dist/icon/file-type-zip.svg +1 -0
  161. package/dist/icon/index.d.ts +166 -151
  162. package/dist/icon/index.js +166 -152
  163. package/dist/icon/logo-placeholder.svg +6 -0
  164. package/dist/icon/source-code.svg +1 -0
  165. package/dist/icon/sun-moon.svg +1 -0
  166. package/dist/icon/table.svg +6 -0
  167. package/dist/index.d.ts +146 -82
  168. package/dist/index.js +77 -78
  169. package/dist/layout/AppShell.svelte +12 -162
  170. package/dist/layout/AppShell.svelte.d.ts +6 -27
  171. package/dist/layout/CustomNavbar.svelte +9 -7
  172. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  173. package/dist/layout/Navbar.svelte +161 -129
  174. package/dist/layout/Navbar.svelte.d.ts +29 -15
  175. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  176. package/dist/layout/NavbarItemView.svelte +182 -0
  177. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  178. package/dist/layout/Sidenav.svelte +280 -341
  179. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  180. package/dist/models/ComboBoxItem.d.ts +2 -0
  181. package/dist/models/Employee.d.ts +53 -0
  182. package/dist/models/Employee.js +23 -0
  183. package/dist/models/Hyperlink.d.ts +3 -1
  184. package/dist/models/LinkCollectionItem.d.ts +3 -1
  185. package/dist/models/NavbarItem.d.ts +6 -2
  186. package/dist/theme.svelte.d.ts +0 -1
  187. package/dist/theme.svelte.js +46 -58
  188. package/dist/ui/Accordion.svelte +81 -242
  189. package/dist/ui/Accordion.svelte.d.ts +37 -14
  190. package/dist/ui/AccordionItem.svelte +303 -0
  191. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  192. package/dist/ui/ActionIcon.svelte +25 -21
  193. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  194. package/dist/ui/Badge.svelte +163 -171
  195. package/dist/ui/Badge.svelte.d.ts +13 -5
  196. package/dist/ui/Button.svelte +178 -205
  197. package/dist/ui/Button.svelte.d.ts +19 -2
  198. package/dist/ui/ButtonVariant.d.ts +15 -1
  199. package/dist/ui/ContextMenu.svelte +146 -0
  200. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  201. package/dist/ui/ContextMenuList.svelte +188 -0
  202. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  203. package/dist/ui/Dialog.svelte +183 -111
  204. package/dist/ui/Dialog.svelte.d.ts +21 -4
  205. package/dist/ui/Drawer.svelte +237 -184
  206. package/dist/ui/Drawer.svelte.d.ts +20 -2
  207. package/dist/ui/Dropdown.svelte +24 -14
  208. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  209. package/dist/ui/Dropzone.svelte +159 -57
  210. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  211. package/dist/ui/Link.svelte +12 -4
  212. package/dist/ui/Link.svelte.d.ts +8 -2
  213. package/dist/ui/Loader.svelte +23 -18
  214. package/dist/ui/Loader.svelte.d.ts +5 -2
  215. package/dist/ui/Logo.svelte +37 -0
  216. package/dist/ui/Logo.svelte.d.ts +16 -0
  217. package/dist/ui/MultiSortable.svelte +287 -0
  218. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  219. package/dist/ui/Pagination.svelte +15 -9
  220. package/dist/ui/Pagination.svelte.d.ts +6 -2
  221. package/dist/ui/Popover.svelte +43 -65
  222. package/dist/ui/Popover.svelte.d.ts +14 -5
  223. package/dist/ui/ProgressBar.svelte +28 -30
  224. package/dist/ui/ProgressBarVariant.d.ts +7 -1
  225. package/dist/ui/SegmentedControl.svelte +0 -0
  226. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  227. package/dist/ui/Sortable.svelte +163 -0
  228. package/dist/ui/Sortable.svelte.d.ts +47 -0
  229. package/dist/ui/Table.svelte +383 -80
  230. package/dist/ui/Table.svelte.d.ts +43 -2
  231. package/dist/ui/Tabs.svelte +22 -18
  232. package/dist/ui/Tabs.svelte.d.ts +6 -2
  233. package/dist/ui/ThemeSwitcher.svelte +26 -7
  234. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  235. package/dist/ui/Tooltip.svelte +312 -180
  236. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  237. package/dist/uiTheme.svelte.d.ts +86 -0
  238. package/dist/uiTheme.svelte.js +214 -0
  239. package/dist/util/DateFunctions.js +1 -1
  240. package/dist/util/DragDrop.d.ts +50 -0
  241. package/dist/util/DragDrop.js +154 -0
  242. package/dist/util/NavigateTo.js +2 -2
  243. package/dist/util/dayjs.d.ts +4 -0
  244. package/dist/util/dayjs.js +15 -0
  245. package/package.json +66 -26
  246. package/dist/display/Alert.svelte +0 -179
  247. package/dist/display/Alert.svelte.d.ts +0 -13
  248. package/dist/form/FileInput.svelte +0 -235
  249. package/dist/form/FileInput.svelte.d.ts +0 -23
  250. package/dist/form/PasswordInput.svelte +0 -253
  251. package/dist/form/PasswordInput.svelte.d.ts +0 -34
  252. package/dist/form/Rating.svelte +0 -235
  253. package/dist/form/Rating.svelte.d.ts +0 -21
  254. package/dist/styles/components.css +0 -199
  255. package/dist/styles/dark.css +0 -146
  256. package/dist/styles/index.css +0 -116
  257. package/dist/styles/reset.css +0 -110
  258. package/dist/styles/semantic.css +0 -86
  259. package/dist/styles/tokens.css +0 -203
  260. package/dist/styles/utilities.css +0 -523
  261. package/dist/ui/Breadcrumbs.svelte +0 -131
  262. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  263. package/dist/ui/LoadingOverlay.svelte +0 -53
  264. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  265. package/dist/ui/Progress.svelte +0 -191
  266. package/dist/ui/Progress.svelte.d.ts +0 -15
  267. package/dist/ui/RingProgress.svelte +0 -141
  268. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  269. package/dist/ui/Skeleton.svelte +0 -85
  270. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  271. package/dist/ui/Stepper.svelte +0 -355
  272. package/dist/ui/Stepper.svelte.d.ts +0 -24
  273. package/dist/ui/Timeline.svelte +0 -225
  274. package/dist/ui/Timeline.svelte.d.ts +0 -23
  275. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  276. /package/dist/{actions → util}/ClickOutside.js +0 -0
  277. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  278. /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;