@placeholderco/placeholder-ui 1.0.12 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +134 -130
  3. package/dist/app.css +178 -0
  4. package/dist/bootstrap.min.css +3600 -0
  5. package/dist/cards/GitCard.svelte +115 -0
  6. package/dist/cards/GitCard.svelte.d.ts +22 -0
  7. package/dist/display/Avatar.svelte +29 -17
  8. package/dist/display/Avatar.svelte.d.ts +12 -2
  9. package/dist/display/LinkCollection.svelte +40 -18
  10. package/dist/display/LinkCollection.svelte.d.ts +9 -2
  11. package/dist/display/Paper.svelte +31 -19
  12. package/dist/display/Paper.svelte.d.ts +12 -3
  13. package/dist/display/alert/Alert.svelte +129 -0
  14. package/dist/display/alert/Alert.svelte.d.ts +15 -0
  15. package/dist/display/alert/AlertVariant.d.ts +1 -0
  16. package/dist/display/alert/AlertVariant.js +1 -0
  17. package/dist/display/filetree/FileTree.svelte +259 -0
  18. package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
  19. package/dist/display/filetree/FileTreeItem.svelte +396 -0
  20. package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
  21. package/dist/display/filetree/FileTreeNode.d.ts +46 -0
  22. package/dist/display/filetree/FileTreeNode.js +115 -0
  23. package/dist/display/filetree/index.d.ts +5 -0
  24. package/dist/display/filetree/index.js +3 -0
  25. package/dist/editors/CodeMirror.svelte +306 -0
  26. package/dist/editors/CodeMirror.svelte.d.ts +31 -0
  27. package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
  28. package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
  29. package/dist/editors/tiptap/TipTap.svelte +856 -0
  30. package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
  31. package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
  32. package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
  33. package/dist/editors/tiptap/collaboration.d.ts +55 -0
  34. package/dist/editors/tiptap/collaboration.js +1 -0
  35. package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
  36. package/dist/editors/tiptap/extensions/Alert.js +72 -0
  37. package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
  38. package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
  39. package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
  40. package/dist/editors/tiptap/extensions/Div.js +89 -0
  41. package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
  42. package/dist/editors/tiptap/extensions/Span.js +56 -0
  43. package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
  44. package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
  45. package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
  46. package/dist/editors/tiptap/extensions/index.d.ts +7 -0
  47. package/dist/editors/tiptap/extensions/index.js +5 -0
  48. package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
  49. package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
  50. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
  51. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
  52. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
  53. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
  54. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
  55. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
  56. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
  57. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
  58. package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
  59. package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
  60. package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
  61. package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
  62. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
  63. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
  64. package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
  65. package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
  66. package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
  67. package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
  68. package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
  69. package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
  70. package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
  71. package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
  72. package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
  73. package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
  74. package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
  75. package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
  76. package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
  77. package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
  78. package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
  79. package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
  80. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
  81. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
  82. package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
  83. package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
  84. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
  85. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
  86. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
  87. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
  88. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
  89. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
  90. package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
  91. package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
  92. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
  93. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
  94. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
  95. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
  96. package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
  97. package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
  98. package/dist/form/Autocomplete.svelte +86 -135
  99. package/dist/form/Autocomplete.svelte.d.ts +6 -8
  100. package/dist/form/AutocompleteMulti.svelte +385 -227
  101. package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
  102. package/dist/form/Checkbox.svelte +59 -54
  103. package/dist/form/Checkbox.svelte.d.ts +14 -5
  104. package/dist/form/Chips.svelte +29 -13
  105. package/dist/form/Chips.svelte.d.ts +16 -2
  106. package/dist/form/ComboBox.svelte +30 -20
  107. package/dist/form/ComboBox.svelte.d.ts +1 -1
  108. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  109. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  110. package/dist/form/ComboBoxMulti.svelte +38 -24
  111. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  112. package/dist/form/CronBuilder.svelte +84 -67
  113. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  114. package/dist/form/DatePicker.svelte +148 -195
  115. package/dist/form/DateRangePicker.svelte +101 -98
  116. package/dist/form/DateTimePicker.svelte +167 -208
  117. package/dist/form/DateTimePicker.svelte.d.ts +10 -2
  118. package/dist/form/FormGroup.svelte +33 -10
  119. package/dist/form/FormGroup.svelte.d.ts +12 -2
  120. package/dist/form/Number.svelte +70 -47
  121. package/dist/form/Number.svelte.d.ts +36 -6
  122. package/dist/form/Radio.svelte +18 -18
  123. package/dist/form/RadioGroup.svelte +23 -12
  124. package/dist/form/RadioGroup.svelte.d.ts +13 -2
  125. package/dist/form/SegmentedControl.svelte +76 -56
  126. package/dist/form/SegmentedControl.svelte.d.ts +9 -4
  127. package/dist/form/Select.svelte +150 -233
  128. package/dist/form/Select.svelte.d.ts +29 -5
  129. package/dist/form/SelectMulti.svelte +163 -277
  130. package/dist/form/SelectMulti.svelte.d.ts +36 -7
  131. package/dist/form/Slider.svelte +183 -269
  132. package/dist/form/Slider.svelte.d.ts +32 -17
  133. package/dist/form/StringArrayBuilder.svelte +249 -0
  134. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  135. package/dist/form/Switch.svelte +164 -106
  136. package/dist/form/Switch.svelte.d.ts +22 -3
  137. package/dist/form/TextArea.svelte +49 -29
  138. package/dist/form/TextArea.svelte.d.ts +23 -3
  139. package/dist/form/Textbox.svelte +69 -68
  140. package/dist/form/Textbox.svelte.d.ts +32 -4
  141. package/dist/form/TimePicker.svelte +42 -47
  142. package/dist/form/TimePicker.svelte.d.ts +12 -2
  143. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  144. package/dist/form/comboBoxCore.svelte.js +243 -0
  145. package/dist/icon/Icon.svelte +8 -3
  146. package/dist/icon/Icon.svelte.d.ts +8 -3
  147. package/dist/icon/file-type-bmp.svg +1 -0
  148. package/dist/icon/file-type-csv.svg +1 -0
  149. package/dist/icon/file-type-doc.svg +1 -0
  150. package/dist/icon/file-type-docx.svg +1 -0
  151. package/dist/icon/file-type-jpg.svg +1 -0
  152. package/dist/icon/file-type-pdf.svg +1 -0
  153. package/dist/icon/file-type-png.svg +1 -0
  154. package/dist/icon/file-type-ppt.svg +1 -0
  155. package/dist/icon/file-type-svg.svg +1 -0
  156. package/dist/icon/file-type-txt.svg +1 -0
  157. package/dist/icon/file-type-xls.svg +1 -0
  158. package/dist/icon/file-type-zip.svg +1 -0
  159. package/dist/icon/index.d.ts +166 -151
  160. package/dist/icon/index.js +166 -152
  161. package/dist/icon/logo-placeholder.svg +6 -0
  162. package/dist/icon/source-code.svg +1 -0
  163. package/dist/icon/sun-moon.svg +1 -0
  164. package/dist/icon/table.svg +6 -0
  165. package/dist/index.d.ts +87 -26
  166. package/dist/index.js +25 -28
  167. package/dist/layout/AppShell.svelte +12 -162
  168. package/dist/layout/AppShell.svelte.d.ts +6 -27
  169. package/dist/layout/CustomNavbar.svelte +9 -7
  170. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  171. package/dist/layout/Navbar.svelte +161 -129
  172. package/dist/layout/Navbar.svelte.d.ts +29 -15
  173. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  174. package/dist/layout/NavbarItemView.svelte +182 -0
  175. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  176. package/dist/layout/Sidenav.svelte +280 -341
  177. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  178. package/dist/models/ComboBoxItem.d.ts +2 -0
  179. package/dist/models/Employee.d.ts +53 -0
  180. package/dist/models/Employee.js +23 -0
  181. package/dist/models/Hyperlink.d.ts +3 -1
  182. package/dist/models/LinkCollectionItem.d.ts +3 -1
  183. package/dist/models/NavbarItem.d.ts +6 -2
  184. package/dist/theme.svelte.d.ts +0 -1
  185. package/dist/theme.svelte.js +46 -58
  186. package/dist/ui/Accordion.svelte +81 -242
  187. package/dist/ui/Accordion.svelte.d.ts +37 -14
  188. package/dist/ui/AccordionItem.svelte +303 -0
  189. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  190. package/dist/ui/ActionIcon.svelte +25 -21
  191. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  192. package/dist/ui/Badge.svelte +163 -171
  193. package/dist/ui/Badge.svelte.d.ts +13 -5
  194. package/dist/ui/Button.svelte +178 -205
  195. package/dist/ui/Button.svelte.d.ts +19 -2
  196. package/dist/ui/ButtonVariant.d.ts +15 -1
  197. package/dist/ui/ContextMenu.svelte +146 -0
  198. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  199. package/dist/ui/ContextMenuList.svelte +188 -0
  200. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  201. package/dist/ui/Dialog.svelte +183 -111
  202. package/dist/ui/Dialog.svelte.d.ts +21 -4
  203. package/dist/ui/Drawer.svelte +237 -184
  204. package/dist/ui/Drawer.svelte.d.ts +20 -2
  205. package/dist/ui/Dropdown.svelte +24 -14
  206. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  207. package/dist/ui/Dropzone.svelte +159 -57
  208. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  209. package/dist/ui/Link.svelte +12 -4
  210. package/dist/ui/Link.svelte.d.ts +8 -2
  211. package/dist/ui/Loader.svelte +23 -18
  212. package/dist/ui/Loader.svelte.d.ts +5 -2
  213. package/dist/ui/Logo.svelte +37 -0
  214. package/dist/ui/Logo.svelte.d.ts +16 -0
  215. package/dist/ui/MultiSortable.svelte +287 -0
  216. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  217. package/dist/ui/Pagination.svelte +15 -9
  218. package/dist/ui/Pagination.svelte.d.ts +6 -2
  219. package/dist/ui/Popover.svelte +43 -65
  220. package/dist/ui/Popover.svelte.d.ts +14 -5
  221. package/dist/ui/ProgressBar.svelte +28 -30
  222. package/dist/ui/ProgressBarVariant.d.ts +7 -1
  223. package/dist/ui/SegmentedControl.svelte +0 -0
  224. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  225. package/dist/ui/Sortable.svelte +163 -0
  226. package/dist/ui/Sortable.svelte.d.ts +47 -0
  227. package/dist/ui/Table.svelte +383 -80
  228. package/dist/ui/Table.svelte.d.ts +43 -2
  229. package/dist/ui/Tabs.svelte +22 -18
  230. package/dist/ui/Tabs.svelte.d.ts +6 -2
  231. package/dist/ui/ThemeSwitcher.svelte +26 -7
  232. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  233. package/dist/ui/Tooltip.svelte +312 -180
  234. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  235. package/dist/uiTheme.svelte.d.ts +86 -0
  236. package/dist/uiTheme.svelte.js +214 -0
  237. package/dist/util/DateFunctions.js +1 -1
  238. package/dist/util/DragDrop.d.ts +50 -0
  239. package/dist/util/DragDrop.js +154 -0
  240. package/dist/util/NavigateTo.js +2 -2
  241. package/dist/util/dayjs.d.ts +4 -0
  242. package/dist/util/dayjs.js +15 -0
  243. package/package.json +66 -26
  244. package/dist/display/Alert.svelte +0 -179
  245. package/dist/display/Alert.svelte.d.ts +0 -13
  246. package/dist/form/FileInput.svelte +0 -235
  247. package/dist/form/FileInput.svelte.d.ts +0 -23
  248. package/dist/form/PasswordInput.svelte +0 -253
  249. package/dist/form/PasswordInput.svelte.d.ts +0 -34
  250. package/dist/form/Rating.svelte +0 -235
  251. package/dist/form/Rating.svelte.d.ts +0 -21
  252. package/dist/styles/components.css +0 -199
  253. package/dist/styles/dark.css +0 -146
  254. package/dist/styles/index.css +0 -116
  255. package/dist/styles/reset.css +0 -110
  256. package/dist/styles/semantic.css +0 -86
  257. package/dist/styles/tokens.css +0 -203
  258. package/dist/styles/utilities.css +0 -523
  259. package/dist/ui/Breadcrumbs.svelte +0 -131
  260. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  261. package/dist/ui/LoadingOverlay.svelte +0 -53
  262. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  263. package/dist/ui/Progress.svelte +0 -191
  264. package/dist/ui/Progress.svelte.d.ts +0 -15
  265. package/dist/ui/RingProgress.svelte +0 -141
  266. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  267. package/dist/ui/Skeleton.svelte +0 -85
  268. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  269. package/dist/ui/Stepper.svelte +0 -355
  270. package/dist/ui/Stepper.svelte.d.ts +0 -24
  271. package/dist/ui/Timeline.svelte +0 -225
  272. package/dist/ui/Timeline.svelte.d.ts +0 -23
  273. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  274. /package/dist/{actions → util}/ClickOutside.js +0 -0
  275. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  276. /package/dist/{transitions → util}/Transitions.js +0 -0
@@ -1,271 +1,110 @@
1
1
  <script lang="ts" module>
2
- export interface AccordionItem {
3
- id: string;
2
+ import type { Snippet } from 'svelte';
3
+ import type { ButtonVariant } from './ButtonVariant.js';
4
+
5
+ export type AccordionSize = 'sm' | 'md';
6
+
7
+ export interface AccordionTitleContext {
8
+ /** Value of the item being rendered */
9
+ value: string;
10
+ /** The item's `title` prop */
4
11
  title: string;
5
- content?: string;
12
+ /** Whether the item is currently expanded */
13
+ open: boolean;
14
+ /** Whether the item is disabled */
15
+ disabled: boolean;
16
+ }
17
+
18
+ export interface AccordionContext {
19
+ /** Whether the given item value is currently expanded (reactive) */
20
+ isOpen: (value: string) => boolean;
21
+ /** Toggle the expanded state for the given item value */
22
+ toggle: (value: string) => void;
23
+ /** Accordion-level snippet used to render item titles */
24
+ readonly itemTitle?: Snippet<[AccordionTitleContext]>;
25
+ /** Size variant applied to all items */
26
+ readonly size: AccordionSize;
27
+ /** Colour variant applied to expanded item headers. Items can override individually */
28
+ readonly variant: ButtonVariant;
6
29
  }
7
30
  </script>
8
31
 
9
32
  <script lang="ts">
10
- import type { Snippet } from 'svelte';
11
- import Icon from '../icon/Icon.svelte';
12
- import { iconChevronDown } from '../icon/index.js';
33
+ import { setContext } from 'svelte';
13
34
 
14
- interface Props {
15
- items?: AccordionItem[];
35
+ export interface AccordionProps {
36
+ /** Allow more than one item to be expanded at the same time */
16
37
  multiple?: boolean;
17
- defaultOpen?: string[];
18
- variant?: 'default' | 'contained' | 'filled' | 'separated';
19
- radius?: 'none' | 'sm' | 'md' | 'lg';
20
- chevronPosition?: 'left' | 'right';
21
- disableChevronRotation?: boolean;
22
- class?: string;
23
- itemContent?: Snippet<[AccordionItem]>;
38
+ /** Value(s) of the expanded item(s) (bindable). String when `multiple` is false, array otherwise */
39
+ value?: string | string[];
40
+ /** Callback when the expanded value(s) change */
41
+ onchange?: (value: string | string[]) => void;
42
+ /** Size variant applied to all items */
43
+ size?: AccordionSize;
44
+ /** Colour scheme for expanded item headers, using the Button variants. Items can override individually */
45
+ variant?: ButtonVariant;
46
+ /** Custom snippet rendered as the title of every item. Item-level `header` snippets take precedence */
47
+ itemTitle?: Snippet<[AccordionTitleContext]>;
48
+ /** AccordionItem children */
24
49
  children?: Snippet;
25
50
  }
26
51
 
27
52
  let {
28
- items = [],
29
53
  multiple = false,
30
- defaultOpen = [],
31
- variant = 'default',
32
- radius = 'md',
33
- chevronPosition = 'right',
34
- disableChevronRotation = false,
35
- class: classes = '',
36
- itemContent,
54
+ value = $bindable(multiple ? [] : ''),
55
+ onchange,
56
+ size = 'md',
57
+ variant = 'primary',
58
+ itemTitle,
37
59
  children
38
- }: Props = $props();
60
+ }: AccordionProps = $props();
39
61
 
40
- let openItems = $state<Set<string>>(new Set());
62
+ const openValues = $derived(
63
+ Array.isArray(value) ? value : value ? [value] : []
64
+ );
41
65
 
42
- // Initialize with defaultOpen values
43
- $effect(() => {
44
- if (defaultOpen.length > 0 && openItems.size === 0) {
45
- openItems = new Set(defaultOpen);
46
- }
47
- });
66
+ function isOpen(itemValue: string): boolean {
67
+ return openValues.includes(itemValue);
68
+ }
48
69
 
49
- function toggleItem(id: string) {
50
- if (openItems.has(id)) {
51
- openItems.delete(id);
52
- openItems = new Set(openItems);
70
+ function toggle(itemValue: string): void {
71
+ if (multiple) {
72
+ const current = Array.isArray(value) ? value : value ? [value] : [];
73
+ value = current.includes(itemValue)
74
+ ? current.filter((v) => v !== itemValue)
75
+ : [...current, itemValue];
53
76
  } else {
54
- if (multiple) {
55
- openItems.add(id);
56
- openItems = new Set(openItems);
57
- } else {
58
- openItems = new Set([id]);
59
- }
77
+ value = value === itemValue ? '' : itemValue;
60
78
  }
61
- }
62
-
63
- function isOpen(id: string): boolean {
64
- return openItems.has(id);
65
- }
79
+ onchange?.(value);
80
+ }
81
+
82
+ setContext<AccordionContext>('accordion', {
83
+ isOpen,
84
+ toggle,
85
+ get itemTitle() {
86
+ return itemTitle;
87
+ },
88
+ get size() {
89
+ return size;
90
+ },
91
+ get variant() {
92
+ return variant;
93
+ }
94
+ });
66
95
  </script>
67
96
 
68
- <div class="accordion variant-{variant} radius-{radius} {classes}">
69
- {#if children}
70
- {@render children()}
71
- {:else}
72
- {#each items as item (item.id)}
73
- {@const open = isOpen(item.id)}
74
- <div class="accordion-item" class:open>
75
- <button
76
- class="accordion-control chevron-{chevronPosition}"
77
- aria-expanded={open}
78
- onclick={() => toggleItem(item.id)}
79
- >
80
- {#if chevronPosition === 'left'}
81
- <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
82
- <Icon svg={iconChevronDown} size="18px" />
83
- </span>
84
- {/if}
85
- <span class="accordion-title">{item.title}</span>
86
- {#if chevronPosition === 'right'}
87
- <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
88
- <Icon svg={iconChevronDown} size="18px" />
89
- </span>
90
- {/if}
91
- </button>
92
- <div class="accordion-panel" class:open aria-hidden={!open}>
93
- <div class="accordion-content">
94
- <div class="accordion-content-inner">
95
- {#if itemContent}
96
- {@render itemContent(item)}
97
- {:else if item.content}
98
- {item.content}
99
- {/if}
100
- </div>
101
- </div>
102
- </div>
103
- </div>
104
- {/each}
105
- {/if}
97
+ <div class="accordion">
98
+ {@render children?.()}
106
99
  </div>
107
100
 
108
101
  <style>
109
102
  .accordion {
110
- width: 100%;
111
- --_accordion-radius: var(--pui-radius-md);
112
- }
113
-
114
- /* Radius */
115
- .radius-none { --_accordion-radius: 0; }
116
- .radius-sm { --_accordion-radius: var(--pui-radius-sm); }
117
- .radius-md { --_accordion-radius: var(--pui-radius-md); }
118
- .radius-lg { --_accordion-radius: var(--pui-radius-lg); }
119
-
120
- .accordion {
121
- border-radius: var(--_accordion-radius);
122
- }
123
-
124
- /* Variants */
125
- .variant-default .accordion-item {
126
- border-bottom: 1px solid var(--pui-border-default);
127
- }
128
-
129
- :global(.dark) .variant-default .accordion-item {
130
- border-bottom-color: var(--pui-color-dark-border);
131
- }
132
-
133
- .variant-contained {
134
- border: 1px solid var(--pui-border-default);
135
- }
136
-
137
- :global(.dark) .variant-contained {
138
- border-color: var(--pui-color-dark-border);
139
- }
140
-
141
- .variant-contained .accordion-item:not(:last-child) {
142
- border-bottom: 1px solid var(--pui-border-default);
143
- }
144
-
145
- :global(.dark) .variant-contained .accordion-item:not(:last-child) {
146
- border-bottom-color: var(--pui-color-dark-border);
147
- }
148
-
149
- .variant-filled .accordion-item {
150
- background-color: var(--pui-bg-surface-raised);
151
- margin-bottom: var(--pui-spacing-2);
152
- }
153
-
154
- :global(.dark) .variant-filled .accordion-item {
155
- background-color: var(--pui-color-dark-200);
156
- }
157
-
158
- .variant-separated .accordion-item {
159
- border: 1px solid var(--pui-border-default);
160
- margin-bottom: var(--pui-spacing-2);
161
- }
162
-
163
- :global(.dark) .variant-separated .accordion-item {
164
- border-color: var(--pui-color-dark-border);
165
- }
166
-
167
- /* Item radius — contained/default: first/last corners; filled/separated: all corners */
168
- .variant-default .accordion-item:first-child,
169
- .variant-contained .accordion-item:first-child {
170
- border-top-left-radius: var(--_accordion-radius);
171
- border-top-right-radius: var(--_accordion-radius);
172
- }
173
-
174
- .variant-default .accordion-item:last-child,
175
- .variant-contained .accordion-item:last-child {
176
- border-bottom-left-radius: var(--_accordion-radius);
177
- border-bottom-right-radius: var(--_accordion-radius);
178
- }
179
-
180
- .variant-filled .accordion-item,
181
- .variant-separated .accordion-item {
182
- border-radius: var(--_accordion-radius);
183
- }
184
-
185
- .accordion-item {
186
- overflow: hidden;
187
- }
188
-
189
- .accordion-control {
190
- width: 100%;
191
- display: flex;
192
- align-items: center;
193
- gap: var(--pui-spacing-2);
194
- padding: var(--pui-spacing-3) var(--pui-spacing-4);
195
- background: none;
196
- border: none;
197
- cursor: pointer;
198
- font-family: inherit;
199
- font-size: var(--pui-font-size-base);
200
- font-weight: var(--pui-font-weight-medium);
201
- color: var(--pui-text-primary);
202
- text-align: left;
203
- transition: background-color var(--pui-transition-fast) var(--pui-ease-in-out);
204
- }
205
-
206
- :global(.dark) .accordion-control {
207
- color: var(--pui-color-gray-100);
208
- }
209
-
210
- .accordion-item.open > .accordion-control {
211
- background-color: var(--pui-bg-surface-raised);
212
- }
213
-
214
- :global(.dark) .accordion-item.open > .accordion-control {
215
- background-color: rgba(255, 255, 255, 0.06);
216
- }
217
-
218
- .accordion-control:hover {
219
- background-color: var(--pui-bg-hover);
220
- }
221
-
222
- :global(.dark) .accordion-control:hover {
223
- background-color: rgba(255, 255, 255, 0.08);
224
- }
225
-
226
- .accordion-control:focus-visible {
227
- outline: var(--pui-focus-ring-width) solid var(--pui-focus-ring-color);
228
- outline-offset: calc(-1 * var(--pui-focus-ring-width));
229
- }
230
-
231
- .accordion-title {
232
- flex: 1;
233
- }
234
-
235
- .accordion-chevron {
236
103
  display: flex;
237
- align-items: center;
238
- justify-content: center;
239
- transition: transform var(--pui-transition-fast) var(--pui-ease-in-out);
240
- color: var(--pui-text-muted);
241
- }
242
-
243
- .accordion-chevron.rotated {
244
- transform: rotate(180deg);
245
- }
246
-
247
- .accordion-panel {
248
- display: grid;
249
- grid-template-rows: 0fr;
250
- transition: grid-template-rows var(--pui-transition-base) var(--pui-ease-in-out);
251
- }
252
-
253
- .accordion-panel.open {
254
- grid-template-rows: 1fr;
255
- }
256
-
257
- .accordion-content {
104
+ flex-direction: column;
105
+ border: 1px solid var(--border-color);
106
+ border-radius: 0.375rem;
258
107
  overflow: hidden;
259
- }
260
-
261
- .accordion-content-inner {
262
- padding: var(--pui-spacing-2) var(--pui-spacing-4) var(--pui-spacing-4);
263
- color: var(--pui-text-secondary);
264
- font-size: var(--pui-font-size-sm);
265
- line-height: var(--pui-line-height-relaxed);
266
- }
267
-
268
- :global(.dark) .accordion-content-inner {
269
- color: var(--pui-color-gray-300);
108
+ background: var(--paper-body-bg);
270
109
  }
271
110
  </style>
@@ -1,21 +1,44 @@
1
- export interface AccordionItem {
2
- id: string;
1
+ import type { Snippet } from 'svelte';
2
+ import type { ButtonVariant } from './ButtonVariant.js';
3
+ export type AccordionSize = 'sm' | 'md';
4
+ export interface AccordionTitleContext {
5
+ /** Value of the item being rendered */
6
+ value: string;
7
+ /** The item's `title` prop */
3
8
  title: string;
4
- content?: string;
9
+ /** Whether the item is currently expanded */
10
+ open: boolean;
11
+ /** Whether the item is disabled */
12
+ disabled: boolean;
5
13
  }
6
- import type { Snippet } from 'svelte';
7
- interface Props {
8
- items?: AccordionItem[];
14
+ export interface AccordionContext {
15
+ /** Whether the given item value is currently expanded (reactive) */
16
+ isOpen: (value: string) => boolean;
17
+ /** Toggle the expanded state for the given item value */
18
+ toggle: (value: string) => void;
19
+ /** Accordion-level snippet used to render item titles */
20
+ readonly itemTitle?: Snippet<[AccordionTitleContext]>;
21
+ /** Size variant applied to all items */
22
+ readonly size: AccordionSize;
23
+ /** Colour variant applied to expanded item headers. Items can override individually */
24
+ readonly variant: ButtonVariant;
25
+ }
26
+ export interface AccordionProps {
27
+ /** Allow more than one item to be expanded at the same time */
9
28
  multiple?: boolean;
10
- defaultOpen?: string[];
11
- variant?: 'default' | 'contained' | 'filled' | 'separated';
12
- radius?: 'none' | 'sm' | 'md' | 'lg';
13
- chevronPosition?: 'left' | 'right';
14
- disableChevronRotation?: boolean;
15
- class?: string;
16
- itemContent?: Snippet<[AccordionItem]>;
29
+ /** Value(s) of the expanded item(s) (bindable). String when `multiple` is false, array otherwise */
30
+ value?: string | string[];
31
+ /** Callback when the expanded value(s) change */
32
+ onchange?: (value: string | string[]) => void;
33
+ /** Size variant applied to all items */
34
+ size?: AccordionSize;
35
+ /** Colour scheme for expanded item headers, using the Button variants. Items can override individually */
36
+ variant?: ButtonVariant;
37
+ /** Custom snippet rendered as the title of every item. Item-level `header` snippets take precedence */
38
+ itemTitle?: Snippet<[AccordionTitleContext]>;
39
+ /** AccordionItem children */
17
40
  children?: Snippet;
18
41
  }
19
- declare const Accordion: import("svelte").Component<Props, {}, "">;
42
+ declare const Accordion: import("svelte").Component<AccordionProps, {}, "value">;
20
43
  type Accordion = ReturnType<typeof Accordion>;
21
44
  export default Accordion;