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