@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
@@ -0,0 +1,303 @@
1
+ <script lang="ts">
2
+ import { getContext } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { slide } from 'svelte/transition';
5
+ import Icon from '../icon/Icon.svelte';
6
+ import { iconChevronDown } from '../icon/index.js';
7
+ import type { AccordionContext } from './Accordion.svelte';
8
+ import type { ButtonVariant } from './ButtonVariant.js';
9
+
10
+ export interface AccordionItemProps {
11
+ /** Unique value identifying this item. Defaults to a generated id */
12
+ value?: string;
13
+ /** Header text. Ignored when the `header` snippet is provided */
14
+ title?: string;
15
+ /** Optional leading icon (raw SVG string) shown before the title */
16
+ icon?: string;
17
+ /** Prevent the item from being toggled */
18
+ disabled?: boolean;
19
+ /** Colour variant for this item's expanded header, overriding the accordion-level variant */
20
+ variant?: ButtonVariant;
21
+ /** Custom header content, replaces `title` */
22
+ header?: Snippet;
23
+ /** Collapsible body content */
24
+ children?: Snippet;
25
+ }
26
+
27
+ const uid = $props.id();
28
+
29
+ let {
30
+ value = uid,
31
+ title = '',
32
+ icon,
33
+ disabled = false,
34
+ variant,
35
+ header,
36
+ children
37
+ }: AccordionItemProps = $props();
38
+
39
+ const accordion = getContext<AccordionContext>('accordion');
40
+
41
+ if (!accordion) {
42
+ throw new Error('AccordionItem must be used inside an Accordion');
43
+ }
44
+
45
+ const open = $derived(accordion.isOpen(value));
46
+ const small = $derived(accordion.size === 'sm');
47
+ const iconSize = $derived(small ? '16' : '18');
48
+ const effectiveVariant = $derived(variant ?? accordion.variant);
49
+ const contentId = `${uid}-content`;
50
+ const headerId = `${uid}-header`;
51
+ </script>
52
+
53
+ <div class="accordion-item variant-{effectiveVariant}" class:open class:small>
54
+ <h3 class="accordion-heading">
55
+ <button
56
+ id={headerId}
57
+ class="accordion-trigger"
58
+ type="button"
59
+ aria-expanded={open}
60
+ aria-controls={contentId}
61
+ {disabled}
62
+ onclick={() => accordion.toggle(value)}
63
+ >
64
+ {#if icon}
65
+ <Icon svg={icon} size={iconSize} class="accordion-leading-icon" />
66
+ {/if}
67
+ <span class="accordion-title">
68
+ {#if header}
69
+ {@render header()}
70
+ {:else if accordion.itemTitle}
71
+ {@render accordion.itemTitle({ value, title, open, disabled })}
72
+ {:else}
73
+ {title}
74
+ {/if}
75
+ </span>
76
+ <span class="accordion-chevron" class:rotated={open}>
77
+ <Icon svg={iconChevronDown} size={iconSize} />
78
+ </span>
79
+ </button>
80
+ </h3>
81
+
82
+ {#if open}
83
+ <div
84
+ id={contentId}
85
+ class="accordion-content"
86
+ role="region"
87
+ aria-labelledby={headerId}
88
+ transition:slide={{ duration: 200 }}
89
+ >
90
+ <div class="accordion-body">
91
+ {@render children?.()}
92
+ </div>
93
+ </div>
94
+ {/if}
95
+ </div>
96
+
97
+ <style>
98
+ .accordion-item {
99
+ border-bottom: 1px solid var(--border-color);
100
+ }
101
+
102
+ .accordion-item:last-child {
103
+ border-bottom: none;
104
+ }
105
+
106
+ .accordion-heading {
107
+ margin: 0;
108
+ font-size: inherit;
109
+ font-weight: inherit;
110
+ }
111
+
112
+ .accordion-trigger {
113
+ display: flex;
114
+ align-items: center;
115
+ gap: 0.625rem;
116
+ width: 100%;
117
+ padding: 0.875rem 1rem;
118
+ border: none;
119
+ background: transparent;
120
+ color: var(--text-color);
121
+ font-size: 0.9375rem;
122
+ font-weight: 600;
123
+ text-align: left;
124
+ cursor: pointer;
125
+ transition: background-color 0.15s ease-in-out;
126
+ }
127
+
128
+ .accordion-trigger:hover:not(:disabled) {
129
+ background-color: rgba(var(--ui-primary-rgbc), 0.05);
130
+ }
131
+
132
+ .accordion-item.open .accordion-trigger {
133
+ background-color: var(--accordion-open-bg, var(--ui-accent));
134
+ color: var(--accordion-open-color, var(--ui-primary));
135
+ box-shadow: inset 0 0 0 1px var(--accordion-open-border-color, transparent);
136
+ }
137
+
138
+ .accordion-item.open .accordion-chevron {
139
+ color: var(--accordion-open-color, var(--ui-primary));
140
+ }
141
+
142
+ .accordion-trigger:disabled {
143
+ opacity: 0.5;
144
+ cursor: not-allowed;
145
+ }
146
+
147
+ .accordion-trigger:focus-visible {
148
+ outline: 2px solid var(--ui-primary);
149
+ outline-offset: -2px;
150
+ }
151
+
152
+ .accordion-title {
153
+ flex: 1;
154
+ min-width: 0;
155
+ }
156
+
157
+ .accordion-chevron {
158
+ display: inline-flex;
159
+ color: var(--text-muted);
160
+ transition: transform 0.2s ease-in-out;
161
+ }
162
+
163
+ .accordion-chevron.rotated {
164
+ transform: rotate(180deg);
165
+ }
166
+
167
+ .accordion-content {
168
+ overflow: hidden;
169
+ }
170
+
171
+ .accordion-body {
172
+ padding: 0.875rem 1rem;
173
+ color: var(--text-color);
174
+ font-size: 0.9375rem;
175
+ line-height: 1.5;
176
+ }
177
+
178
+ .accordion-item.small .accordion-trigger {
179
+ gap: 0.5rem;
180
+ padding: 0.5rem 0.75rem;
181
+ font-size: 0.8125rem;
182
+ }
183
+
184
+ .accordion-item.small .accordion-body {
185
+ padding: 0.5rem 0.75rem;
186
+ font-size: 0.8125rem;
187
+ }
188
+
189
+ /* Variant colours for the expanded header, mirroring the Button variants.
190
+ `auto-subtle` defines nothing and falls through to the theme-aware defaults. */
191
+ .variant-white {
192
+ --accordion-open-bg: white;
193
+ --accordion-open-color: var(--ui-primary);
194
+ }
195
+
196
+ .variant-secondary,
197
+ .variant-shaded {
198
+ --accordion-open-bg: var(--border-color);
199
+ --accordion-open-color: var(--text-color);
200
+ }
201
+
202
+ .variant-secondary-subtle {
203
+ --accordion-open-bg: #aaaaaa66;
204
+ --accordion-open-color: var(--text-color);
205
+ }
206
+
207
+ .variant-secondary-selected {
208
+ --accordion-open-bg: var(--accent-color);
209
+ --accordion-open-color: white;
210
+ }
211
+
212
+ .variant-danger {
213
+ --accordion-open-bg: var(--danger-bg);
214
+ --accordion-open-color: white;
215
+ }
216
+
217
+ .variant-danger-subtle {
218
+ --accordion-open-bg: var(--danger-bg-subtle);
219
+ --accordion-open-color: var(--danger-text);
220
+ }
221
+
222
+ .variant-accent,
223
+ .variant-pistachio {
224
+ --accordion-open-bg: var(--ui-accent);
225
+ --accordion-open-color: var(--ui-primary);
226
+ }
227
+
228
+ .variant-accent-subtle,
229
+ .variant-pistachio-subtle {
230
+ --accordion-open-bg: rgba(var(--ui-accent-rgbc), 0.15);
231
+ --accordion-open-color: var(--text-color);
232
+ }
233
+
234
+ .variant-accent-outline,
235
+ .variant-pistachio-outline {
236
+ --accordion-open-bg: transparent;
237
+ --accordion-open-color: var(--ui-accent);
238
+ --accordion-open-border-color: var(--ui-accent);
239
+ }
240
+
241
+ .variant-primary,
242
+ .variant-midnight {
243
+ --accordion-open-bg: var(--ui-primary);
244
+ --accordion-open-color: white;
245
+ }
246
+
247
+ .variant-primary-subtle,
248
+ .variant-midnight-subtle {
249
+ --accordion-open-bg: rgba(var(--ui-primary-rgbc), 0.1);
250
+ --accordion-open-color: var(--text-color);
251
+ }
252
+
253
+ .variant-primary-outline,
254
+ .variant-midnight-outline {
255
+ --accordion-open-bg: transparent;
256
+ --accordion-open-color: var(--ui-primary);
257
+ --accordion-open-border-color: var(--ui-primary);
258
+ }
259
+
260
+ .variant-tertiary,
261
+ .variant-turquoise {
262
+ --accordion-open-bg: var(--ui-tertiary);
263
+ --accordion-open-color: var(--ui-primary);
264
+ }
265
+
266
+ .variant-tertiary-subtle,
267
+ .variant-turquoise-subtle {
268
+ --accordion-open-bg: rgba(var(--ui-tertiary-dark-rgbc), 0.25);
269
+ --accordion-open-color: var(--ui-tertiary-dark);
270
+ }
271
+
272
+ .variant-auto-outline {
273
+ --accordion-open-bg: transparent;
274
+ --accordion-open-color: var(--ui-primary);
275
+ --accordion-open-border-color: var(--ui-primary);
276
+ }
277
+
278
+ :global(.dark) .variant-secondary-selected {
279
+ --accordion-open-color: var(--ui-primary);
280
+ }
281
+
282
+ :global(.dark) .variant-auto-outline {
283
+ --accordion-open-color: var(--ui-accent);
284
+ --accordion-open-border-color: var(--ui-accent);
285
+ }
286
+
287
+ :global(.dark) .accordion-trigger:hover:not(:disabled) {
288
+ background-color: rgba(var(--ui-accent-rgbc), 0.05);
289
+ }
290
+
291
+ :global(.dark) .accordion-item.open .accordion-trigger {
292
+ background-color: var(--accordion-open-bg, var(--ui-primary));
293
+ color: var(--accordion-open-color, var(--ui-accent));
294
+ }
295
+
296
+ :global(.dark) .accordion-item.open .accordion-chevron {
297
+ color: var(--accordion-open-color, var(--ui-accent));
298
+ }
299
+
300
+ :global(.dark) .accordion-trigger:focus-visible {
301
+ outline-color: var(--ui-accent);
302
+ }
303
+ </style>
@@ -0,0 +1,21 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { ButtonVariant } from './ButtonVariant.js';
3
+ export interface AccordionItemProps {
4
+ /** Unique value identifying this item. Defaults to a generated id */
5
+ value?: string;
6
+ /** Header text. Ignored when the `header` snippet is provided */
7
+ title?: string;
8
+ /** Optional leading icon (raw SVG string) shown before the title */
9
+ icon?: string;
10
+ /** Prevent the item from being toggled */
11
+ disabled?: boolean;
12
+ /** Colour variant for this item's expanded header, overriding the accordion-level variant */
13
+ variant?: ButtonVariant;
14
+ /** Custom header content, replaces `title` */
15
+ header?: Snippet;
16
+ /** Collapsible body content */
17
+ children?: Snippet;
18
+ }
19
+ declare const AccordionItem: import("svelte").Component<AccordionItemProps, {}, "">;
20
+ type AccordionItem = ReturnType<typeof AccordionItem>;
21
+ export default AccordionItem;
@@ -1,20 +1,34 @@
1
1
  <script lang="ts">
2
2
  import Button from './Button.svelte';
3
3
  import Tooltip from './Tooltip.svelte';
4
+ import Icon from '../icon/Icon.svelte';
4
5
  import type { ButtonVariant } from './ButtonVariant.js';
5
6
 
6
- interface Props {
7
+ export interface ActionIconProps {
8
+ /** Visual style variant */
7
9
  variant?: ButtonVariant;
10
+ /** URL to navigate to (renders as anchor) */
8
11
  href?: string;
12
+ /** Show loading state */
9
13
  loading?: boolean;
14
+ /** Disable the button */
10
15
  disabled?: boolean;
16
+ /** Style as an input button (for form inputs) */
11
17
  inputButton?: boolean;
18
+ /** Size of the icon */
12
19
  size?: string;
20
+ /** Raw SVG HTML string. Do NOT use external/user input - it will be executed in the browser */
13
21
  svg: string;
22
+ /** Link target attribute (when href is provided) */
14
23
  target?: undefined | '_self' | '_blank';
24
+ /** Additional CSS classes */
15
25
  class?: string;
26
+ /** Click event handler */
16
27
  onclick?: (event: MouseEvent) => void;
28
+ /** Tooltip text on hover */
17
29
  tooltip?: string;
30
+ /** Accessible label for the button (recommended — the icon has no text) */
31
+ ariaLabel?: string;
18
32
  }
19
33
 
20
34
  let {
@@ -27,9 +41,10 @@
27
41
  svg,
28
42
  target = undefined,
29
43
  class: buttonClass = '',
30
- onclick = () => {},
31
- tooltip = undefined
32
- }: Props = $props();
44
+ onclick = undefined,
45
+ tooltip = undefined,
46
+ ariaLabel = undefined
47
+ }: ActionIconProps = $props();
33
48
  </script>
34
49
 
35
50
  {#snippet buttonContent()}
@@ -40,13 +55,13 @@
40
55
  {loading}
41
56
  {target}
42
57
  iconSize={size}
43
- effectsDisabled={false}
44
58
  class="action-icon {inputButton ? 'input-button' : ''} {buttonClass}"
45
59
  {onclick}
60
+ ariaLabel={ariaLabel ?? tooltip}
46
61
  >
47
- <span class="action-icon-svg" style="width:{size};height:{size};">
48
- {@html svg}
49
- </span>
62
+ {#if !loading}
63
+ <Icon {svg} {size} />
64
+ {/if}
50
65
  </Button>
51
66
  {/snippet}
52
67
 
@@ -59,18 +74,7 @@
59
74
  {/if}
60
75
 
61
76
  <style>
62
- :global(button.action-icon):active:not(:disabled) {
63
- transform: translateY(calc(0.0625rem * 1));
64
- }
65
-
66
- .action-icon-svg {
67
- display: inline-flex;
68
- align-items: center;
69
- justify-content: center;
70
- }
71
-
72
- .action-icon-svg :global(svg) {
73
- width: 100%;
74
- height: 100%;
77
+ :global(.pui-button.action-icon:active:not(:disabled)) {
78
+ transform: translateY(0.0625rem);
75
79
  }
76
80
  </style>
@@ -1,17 +1,30 @@
1
1
  import type { ButtonVariant } from './ButtonVariant.js';
2
- interface Props {
2
+ export interface ActionIconProps {
3
+ /** Visual style variant */
3
4
  variant?: ButtonVariant;
5
+ /** URL to navigate to (renders as anchor) */
4
6
  href?: string;
7
+ /** Show loading state */
5
8
  loading?: boolean;
9
+ /** Disable the button */
6
10
  disabled?: boolean;
11
+ /** Style as an input button (for form inputs) */
7
12
  inputButton?: boolean;
13
+ /** Size of the icon */
8
14
  size?: string;
15
+ /** Raw SVG HTML string. Do NOT use external/user input - it will be executed in the browser */
9
16
  svg: string;
17
+ /** Link target attribute (when href is provided) */
10
18
  target?: undefined | '_self' | '_blank';
19
+ /** Additional CSS classes */
11
20
  class?: string;
21
+ /** Click event handler */
12
22
  onclick?: (event: MouseEvent) => void;
23
+ /** Tooltip text on hover */
13
24
  tooltip?: string;
25
+ /** Accessible label for the button (recommended — the icon has no text) */
26
+ ariaLabel?: string;
14
27
  }
15
- declare const ActionIcon: import("svelte").Component<Props, {}, "">;
28
+ declare const ActionIcon: import("svelte").Component<ActionIconProps, {}, "">;
16
29
  type ActionIcon = ReturnType<typeof ActionIcon>;
17
30
  export default ActionIcon;