@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
@@ -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;