@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
@@ -4,21 +4,40 @@
4
4
  import type { ButtonVariant } from './ButtonVariant.js';
5
5
  import type { ButtonSize } from './ButtonSize.js';
6
6
  import Loader from './Loader.svelte';
7
+ import { resolve } from '$app/paths';
8
+ import { interceptLinkClick } from '../util/interceptLinkClick.js';
7
9
 
8
- interface Props {
10
+ export interface ButtonProps {
11
+ /** Visual style variant of the button */
9
12
  variant?: ButtonVariant;
13
+ /** Size of the button */
10
14
  size?: ButtonSize;
15
+ /** URL to navigate to (renders as anchor tag) */
11
16
  href?: string;
17
+ /** Show loading spinner and disable interactions */
12
18
  loading?: boolean;
19
+ /** Disable the button */
13
20
  disabled?: boolean;
21
+ /** Disable hover/click visual effects */
14
22
  effectsDisabled?: boolean;
23
+ /** SVG icon to display on the left side */
15
24
  svg?: string;
25
+ /** SVG icon to display on the right side */
16
26
  rightSvg?: string;
27
+ /** Size of the icon(s) */
17
28
  iconSize?: string;
29
+ /** Link target attribute (when href is provided) */
18
30
  target?: undefined | '_self' | '_blank';
31
+ /** Button type attribute (when rendered as a button, not a link) */
32
+ type?: 'button' | 'submit' | 'reset';
33
+ /** Additional CSS classes */
19
34
  class?: string;
35
+ /** Button content */
20
36
  children: Snippet;
37
+ /** Click event handler */
21
38
  onclick?: (event: MouseEvent) => void;
39
+ /** Accessible label (use when the button has no visible text) */
40
+ ariaLabel?: string;
22
41
  }
23
42
 
24
43
  let {
@@ -32,25 +51,26 @@
32
51
  rightSvg = undefined,
33
52
  iconSize = '18px',
34
53
  target = undefined,
54
+ type = 'button',
35
55
  class: buttonClass = '',
36
56
  children,
37
- onclick = () => {}
38
- }: Props = $props();
57
+ onclick = undefined,
58
+ ariaLabel = undefined
59
+ }: ButtonProps = $props();
39
60
 
40
61
  let isDisabled = $derived(loading || disabled);
41
62
  let isLink = $derived(!!href);
42
63
 
43
- let elClass = $derived(`pui-button ${buttonClass} ${variant} size-${size}${effectsDisabled ? ' effects-disabled' : ''}`);
64
+ let elClass = $derived(
65
+ `pui-button ${buttonClass} ${variant} size-${size}${effectsDisabled ? ' effects-disabled' : ''}`
66
+ );
44
67
  </script>
45
68
 
46
69
  {#snippet buttonContent()}
47
70
  <div class="button">
48
71
  {#if loading}
49
72
  <div class="button-loader" style="height: {iconSize}">
50
- <Loader
51
- class={variant === 'secondary' ? 'text-primary' : 'text-secondary'}
52
- sizeOverride={iconSize}
53
- />
73
+ <Loader sizeOverride={iconSize} />
54
74
  </div>
55
75
  {:else if svg}
56
76
  <div class="button-icon">
@@ -67,269 +87,230 @@
67
87
  {/snippet}
68
88
 
69
89
  {#if isLink && href && !disabled}
70
- <a {target} class={elClass} {href} {onclick}>
90
+ <a {target} class={elClass} aria-label={ariaLabel} href={href?.startsWith('/') ? resolve(href as any) : href} onclick={(e) => interceptLinkClick(e, { href, target, onclick })}>
71
91
  {@render buttonContent?.()}
72
92
  </a>
73
93
  {:else}
74
- <button class={elClass} disabled={isDisabled} {onclick}>
94
+ <button {type} class={elClass} disabled={isDisabled} aria-label={ariaLabel} {onclick}>
75
95
  {@render buttonContent()}
76
96
  </button>
77
97
  {/if}
78
98
 
79
99
  <style>
80
100
  .pui-button {
81
- padding: var(--pui-spacing-2) var(--pui-spacing-4);
82
- border-radius: var(--pui-radius-lg);
101
+ padding: 0.5rem 1rem;
102
+ border-radius: 6px;
83
103
  cursor: pointer;
84
- transition: all var(--pui-transition-fast) var(--pui-ease-in-out);
104
+ transition: all 0.2s ease-in-out;
85
105
  }
86
106
 
87
107
  .size-xs {
88
- padding: var(--pui-spacing-1) var(--pui-spacing-2);
89
- font-size: var(--pui-font-size-xs);
90
- line-height: var(--pui-line-height-none);
108
+ padding: 0.25rem 0.5rem;
109
+ font-size: 0.75rem;
110
+ line-height: 1rem;
91
111
  }
92
112
 
93
113
  .size-sm {
94
- padding: var(--pui-spacing-1_5) var(--pui-spacing-3);
95
- font-size: var(--pui-font-size-sm);
96
- line-height: var(--pui-line-height-none);
114
+ padding: 0.375rem 0.75rem;
115
+ font-size: 0.8125rem;
116
+ line-height: 1.0625rem;
97
117
  }
98
118
 
99
119
  .size-md {
100
- padding: var(--pui-spacing-2) var(--pui-spacing-4);
101
- font-size: var(--pui-font-size-base);
102
- line-height: var(--pui-line-height-tight);
120
+ padding: 0.5rem 1rem;
121
+ font-size: 0.875rem;
122
+ line-height: 1.125rem;
103
123
  }
104
124
 
105
125
  .size-lg {
106
- padding: var(--pui-spacing-2_5) var(--pui-spacing-5);
107
- font-size: var(--pui-font-size-md);
108
- line-height: var(--pui-line-height-tight);
126
+ padding: 0.625rem 1.25rem;
127
+ font-size: 1rem;
128
+ line-height: 1.25rem;
109
129
  }
110
130
 
111
131
  .size-xl {
112
- padding: var(--pui-spacing-3) var(--pui-spacing-6);
113
- font-size: var(--pui-font-size-lg);
114
- line-height: var(--pui-line-height-snug);
132
+ padding: 0.75rem 1.5rem;
133
+ font-size: 1.125rem;
134
+ line-height: 1.375rem;
115
135
  }
116
136
 
117
137
  :global(.paper-title) .pui-button {
118
- padding: var(--pui-spacing-1_5) var(--pui-spacing-2);
138
+ padding: 0.35rem 0.5rem;
119
139
  }
120
140
 
121
141
  .white {
122
- --button-text-color: var(--pui-color-primary);
123
- --button-bg-color: var(--pui-color-white);
142
+ --button-text-color: var(--ui-primary);
143
+ --button-bg-color: white;
124
144
  --button-border: 0;
125
- --button-hover-bg-color: var(--pui-color-accent);
126
- --button-active-bg-color: var(--pui-color-accent-light);
127
- --button-outline-color: var(--pui-color-accent);
145
+ --button-hover-bg-color: var(--ui-tertiary);
146
+ --button-active-bg-color: var(--ui-tertiary-light);
147
+ --button-outline-color: var(--ui-tertiary);
128
148
  }
129
149
 
130
- .muted {
131
- font-weight: var(--pui-font-weight-normal);
150
+ .secondary {
151
+ font-weight: normal;
132
152
  box-sizing: border-box;
133
- --button-bg-color: var(--pui-input-bg);
134
- --button-border: 1px solid var(--pui-border-default);
135
- --button-hover-bg-color: var(--pui-color-primary-light);
136
- --button-active-bg-color: var(--pui-color-gray-500);
137
- --button-outline-color: var(--pui-text-primary);
153
+ --button-bg-color: var(--input-bg);
154
+ --button-border: 1px solid var(--border-color);
155
+ --button-hover-bg-color: var(--border-color);
156
+ --button-active-bg-color: #aaaaaa;
157
+ --button-outline-color: var(--text-color);
138
158
  }
139
159
 
140
- .muted-subtle {
141
- font-weight: var(--pui-font-weight-normal);
160
+ .secondary-subtle {
161
+ font-weight: normal;
142
162
  box-sizing: border-box;
143
163
  --button-bg-color: transparent;
144
- --button-hover-bg-color: var(--pui-color-primary-light);
145
- --button-active-bg-color: var(--pui-color-gray-500);
146
- --button-outline-color: var(--pui-text-primary);
164
+ --button-hover-bg-color: #aaaaaa66;
165
+ --button-active-bg-color: #aaaaaa;
166
+ --button-outline-color: var(--text-color);
147
167
  }
148
168
 
149
- .muted-selected {
150
- --button-bg-color: var(--pui-accent-color);
151
- --button-border: 1px solid var(--pui-accent-color);
152
- --button-text-color: var(--pui-color-white);
153
- font-weight: var(--pui-font-weight-normal);
169
+ .secondary-selected {
170
+ --button-bg-color: var(--accent-color);
171
+ --button-border: 1px solid var(--accent-color);
172
+ --button-text-color: white;
173
+ font-weight: normal;
154
174
  }
155
175
 
156
176
  .auto-subtle {
157
- --button-text-color: var(--pui-color-primary);
177
+ --button-text-color: var(--ui-primary);
158
178
  --button-bg-color: initial;
159
- --button-hover-bg-color: var(--pui-color-primary-light);
160
- --button-hover-text-color: var(--pui-color-primary);
161
- --button-active-bg-color: var(--pui-color-primary);
162
- --button-active-text-color: var(--pui-color-secondary);
163
- --button-outline-color: var(--pui-color-accent);
179
+ --button-hover-bg-color: var(--ui-accent);
180
+ --button-hover-text-color: var(--ui-primary);
181
+ --button-active-bg-color: var(--ui-primary);
182
+ --button-active-text-color: var(--ui-accent);
183
+ --button-outline-color: var(--ui-tertiary);
164
184
  }
165
185
 
166
186
  .danger {
167
- --button-text-color: var(--pui-color-white);
168
- --button-bg-color: var(--pui-color-danger);
169
- --button-hover-bg-color: var(--pui-color-danger-hover);
170
- --button-active-bg-color: var(--pui-color-danger-active);
171
- --button-outline-color: var(--pui-color-accent);
187
+ --button-text-color: white;
188
+ --button-bg-color: var(--danger-bg);
189
+
190
+ --button-hover-bg-color: var(--danger-bg-hover);
191
+
192
+ --button-active-bg-color: #b02a37;
193
+
194
+ --button-outline-color: var(--ui-tertiary);
172
195
 
173
196
  :global(.loader) {
174
- color: var(--pui-color-white);
197
+ color: white;
175
198
  }
176
199
  }
177
200
 
178
201
  .danger-subtle {
179
202
  background-color: initial;
180
- color: var(--pui-text-danger);
203
+ color: var(--danger-text);
181
204
 
182
205
  &:hover:not(:disabled) {
183
- background-color: var(--pui-color-danger-subtle);
206
+ background-color: var(--danger-bg-subtle);
184
207
  }
185
208
 
186
209
  :global(.loader) {
187
- color: var(--pui-text-danger);
210
+ color: var(--danger-text);
188
211
  }
189
212
  }
190
213
 
191
- .secondary {
192
- --button-text-color: var(--pui-color-primary);
193
- --button-bg-color: var(--pui-color-secondary);
194
- --button-hover-bg-color: var(--pui-color-accent);
195
- --button-active-bg-color: var(--pui-color-accent-light);
196
- --button-outline-color: var(--pui-color-accent);
214
+ .accent,
215
+ .pistachio {
216
+ --button-text-color: var(--ui-primary);
217
+ --button-bg-color: var(--ui-accent);
218
+ --button-hover-bg-color: var(--ui-tertiary);
219
+ --button-active-bg-color: var(--ui-tertiary-light);
220
+ --button-outline-color: var(--ui-tertiary);
197
221
  }
198
222
 
199
- .secondary-outline {
200
- --button-text-color: var(--pui-color-secondary);
223
+ .accent-outline,
224
+ .pistachio-outline {
225
+ --button-text-color: var(--ui-accent);
201
226
  --button-bg-color: initial;
202
- --button-border: 1px solid var(--pui-color-secondary);
203
- --button-hover-text-color: var(--pui-color-accent);
204
- --button-hover-border: 1px solid var(--pui-color-accent);
205
- --button-active-text-color: var(--pui-color-accent-light);
206
- --button-active-border: 1px solid var(--pui-color-accent-light);
207
- --button-outline-color: var(--pui-color-accent);
227
+ --button-border: 1px solid var(--ui-accent);
228
+ --button-hover-text-color: var(--ui-tertiary);
229
+ --button-hover-border: 1px solid var(--ui-tertiary);
230
+ --button-active-text-color: var(--ui-tertiary-light);
231
+ --button-active-border: 1px solid var(--ui-tertiary-light);
232
+ --button-outline-color: var(--ui-tertiary);
208
233
  }
209
234
 
210
- .secondary-subtle {
211
- --button-text-color: var(--pui-color-secondary);
235
+ .accent-subtle,
236
+ .pistachio-subtle {
237
+ --button-text-color: var(--ui-accent);
212
238
  --button-bg-color: initial;
213
- --button-hover-text-color: var(--pui-color-primary);
214
- --button-hover-bg-color: var(--pui-color-primary-light);
215
- --button-active-text-color: var(--pui-color-white);
216
- --button-active-bg-color: var(--pui-color-secondary-dark);
217
- --button-outline-color: var(--pui-color-accent);
239
+ --button-hover-text-color: var(--ui-primary);
240
+ --button-hover-bg-color: var(--ui-accent);
241
+ --button-active-text-color: white;
242
+ --button-active-bg-color: var(--ui-accent-dark);
243
+ --button-outline-color: var(--ui-tertiary);
218
244
  }
219
245
 
220
- .primary {
221
- --button-bg-color: var(--pui-color-primary);
222
- --button-text-color: var(--pui-color-white);
223
- --button-hover-bg-color: var(--pui-color-primary-light);
224
- --button-active-bg-color: var(--pui-color-primary-dark);
246
+ .primary,
247
+ .midnight {
248
+ --button-bg-color: var(--ui-primary);
249
+ --button-text-color: white;
250
+ --button-hover-bg-color: var(--ui-accent-dark);
251
+ --button-active-bg-color: var(--ui-primary-dark);
225
252
  }
226
253
 
227
- .primary-outline {
228
- --button-text-color: var(--pui-color-primary);
254
+ .primary-outline,
255
+ .midnight-outline {
256
+ --button-text-color: var(--ui-primary);
229
257
  --button-bg-color: initial;
230
- --button-border: 1px solid var(--pui-color-primary);
231
- --button-hover-text-color: var(--pui-color-primary-light);
232
- --button-hover-border: 1px solid var(--pui-color-primary-light);
233
- --button-active-text-color: var(--pui-color-primary-dark);
234
- --button-active-border: 1px solid var(--pui-color-primary-dark);
258
+ --button-border: 1px solid var(--ui-primary);
259
+ --button-hover-text-color: var(--ui-accent-dark);
260
+ --button-hover-border: 1px solid var(--ui-accent-dark);
261
+ --button-active-text-color: var(--ui-primary-dark);
262
+ --button-active-border: 1px solid var(--ui-primary-dark);
235
263
  }
236
264
 
237
- .primary-subtle {
238
- --button-text-color: var(--pui-color-primary);
265
+ .primary-subtle,
266
+ .midnight-subtle {
267
+ --button-text-color: var(--ui-primary);
239
268
  --button-bg-color: initial;
240
- --button-hover-text-color: var(--pui-color-white);
241
- --button-hover-bg-color: var(--pui-color-primary);
242
- --button-active-text-color: var(--pui-color-white);
243
- --button-active-bg-color: var(--pui-color-primary-dark);
269
+ --button-hover-text-color: white;
270
+ --button-hover-bg-color: var(--ui-primary);
271
+ --button-active-text-color: white;
272
+ --button-active-bg-color: var(--ui-primary-dark);
244
273
  }
245
274
 
246
- .accent {
247
- --button-text-color: var(--pui-color-black);
248
- --button-bg-color: var(--pui-color-accent);
249
- --button-hover-bg-color: var(--pui-color-accent-dark);
250
- --button-active-bg-color: var(--pui-color-accent-light);
251
- --button-outline-color: var(--pui-color-accent);
275
+ .tertiary,
276
+ .turquoise {
277
+ --button-text-color: var(--ui-primary);
278
+ --button-bg-color: var(--ui-tertiary);
279
+ --button-hover-bg-color: var(--ui-accent);
280
+ --button-active-bg-color: var(--ui-tertiary-light);
281
+ --button-outline-color: var(--ui-accent);
252
282
  }
253
283
 
254
- .accent-subtle {
284
+ .tertiary-subtle,
285
+ .turquoise-subtle {
255
286
  background-color: initial;
256
- color: var(--pui-color-accent-dark);
287
+ color: var(--ui-tertiary-dark);
257
288
 
258
289
  &:hover:not(:disabled) {
259
- background-color: rgba(var(--pui-color-accent-rgb), 0.25);
290
+ background-color: rgba(var(--ui-tertiary-dark-rgbc), 0.25);
260
291
  }
261
292
 
262
293
  &:focus-visible {
263
- outline-color: var(--pui-color-accent);
264
- }
265
-
266
- :global(.loader) {
267
- color: var(--pui-color-accent-dark);
294
+ outline-color: var(--ui-tertiary);
268
295
  }
269
- }
270
-
271
- .success {
272
- --button-text-color: var(--pui-color-white);
273
- --button-bg-color: var(--pui-color-success);
274
- --button-hover-bg-color: var(--pui-color-success-hover);
275
- --button-active-bg-color: var(--pui-color-success-active);
276
- --button-outline-color: var(--pui-color-success);
277
296
 
278
297
  :global(.loader) {
279
- color: var(--pui-color-white);
280
- }
281
- }
282
-
283
- .success-subtle {
284
- background-color: initial;
285
- color: var(--pui-color-success);
286
-
287
- &:hover:not(:disabled) {
288
- background-color: var(--pui-color-success-subtle);
289
- }
290
-
291
- :global(.loader) {
292
- color: var(--pui-color-success);
293
- }
294
- }
295
-
296
- .warning {
297
- --button-text-color: var(--pui-color-black);
298
- --button-bg-color: var(--pui-color-warning);
299
- --button-hover-bg-color: var(--pui-color-warning-hover);
300
- --button-active-bg-color: var(--pui-color-warning-active);
301
- --button-outline-color: var(--pui-color-warning);
302
-
303
- :global(.loader) {
304
- color: var(--pui-color-black);
305
- }
306
- }
307
-
308
- .warning-subtle {
309
- background-color: initial;
310
- color: var(--pui-color-warning-dark);
311
-
312
- &:hover:not(:disabled) {
313
- background-color: var(--pui-color-warning-subtle);
314
- }
315
-
316
- :global(.loader) {
317
- color: var(--pui-color-warning-dark);
298
+ color: var(--ui-tertiary-dark);
318
299
  }
319
300
  }
320
301
 
321
302
  button,
322
303
  a {
323
- border-color: var(--pui-color-primary);
324
- font-size: var(--pui-font-size-base);
325
- font-weight: var(--pui-font-weight-semibold);
326
- line-height: var(--pui-line-height-tight);
327
- letter-spacing: var(--pui-letter-spacing-wide);
304
+ border-color: var(--ui-primary);
305
+ font-size: 0.875rem;
306
+ font-weight: 600;
307
+ line-height: 1.125rem;
308
+ letter-spacing: 0.05rem;
328
309
  transition:
329
- color var(--pui-transition-fast) var(--pui-ease-in-out),
330
- background-color var(--pui-transition-fast) var(--pui-ease-in-out),
331
- border-color var(--pui-transition-fast) var(--pui-ease-in-out),
332
- box-shadow var(--pui-transition-fast) var(--pui-ease-in-out);
310
+ color 0.15s ease-in-out,
311
+ background-color 0.15s ease-in-out,
312
+ border-color 0.15s ease-in-out,
313
+ box-shadow 0.15s ease-in-out;
333
314
 
334
315
  color: var(--button-text-color);
335
316
  background-color: var(--button-bg-color);
@@ -348,8 +329,8 @@
348
329
  }
349
330
 
350
331
  &:focus-visible {
351
- outline: solid var(--pui-focus-ring-width) var(--button-outline-color, var(--pui-color-secondary-dark));
352
- outline-offset: var(--pui-focus-ring-offset);
332
+ outline: solid 0.125rem var(--button-outline-color, var(--ui-accent-dark));
333
+ outline-offset: 0.125rem;
353
334
  }
354
335
 
355
336
  &:disabled {
@@ -358,43 +339,33 @@
358
339
  }
359
340
 
360
341
  :global(.dark) {
361
- .muted {
362
- --button-text-color: var(--pui-color-white);
363
- --button-active-bg-color: var(--pui-color-dark-300);
342
+ .secondary {
343
+ --button-text-color: white;
344
+ --button-active-bg-color: #333333;
364
345
  }
365
346
 
366
- .muted-subtle {
367
- --button-active-bg-color: var(--pui-color-dark-300);
347
+ .secondary-subtle {
348
+ --button-active-bg-color: background-color: #333333;
368
349
  }
369
350
 
370
- .muted-selected {
371
- --button-text-color: var(--pui-color-white);
351
+ .secondary-selected {
352
+ --button-text-color: black;
372
353
  }
373
354
 
374
355
  .auto-subtle {
375
- --button-text-color: var(--pui-color-white);
376
- --button-hover-text-color: var(--pui-color-white);
377
- --button-hover-bg-color: var(--pui-color-primary-light);
378
- --button-active-text-color: var(--pui-color-secondary);
379
- --button-active-bg-color: var(--pui-color-primary);
380
- --button-outline-color: var(--pui-color-secondary);
381
- }
382
-
383
- .success-subtle {
384
- &:hover:not(:disabled) {
385
- background-color: var(--pui-color-success-subtle-dark);
386
- }
387
- }
388
-
389
- .warning-subtle {
390
- &:hover:not(:disabled) {
391
- background-color: var(--pui-color-warning-subtle-dark);
392
- }
356
+ --button-text-color: white;
357
+ --button-hover-text-color: white;
358
+ --button-hover-bg-color: var(--ui-primary);
359
+ --button-active-text-color: var(--ui-accent);
360
+ --button-active-bg-color: var(--ui-primary);
361
+ --button-outline-color: var(--ui-accent);
393
362
  }
394
363
  }
395
364
 
365
+ /* .action-icon and .input-button are applied by ActionIcon.svelte via the class prop;
366
+ they must live here because the button element belongs to this component's scope */
396
367
  .action-icon {
397
- padding: var(--pui-spacing-1);
368
+ padding: 0.25rem;
398
369
  }
399
370
 
400
371
  .action-icon > div {
@@ -406,8 +377,9 @@
406
377
  .input-button {
407
378
  border-top-left-radius: 0;
408
379
  border-bottom-left-radius: 0;
409
- padding: 0 var(--pui-spacing-2);
380
+ padding: 0 0.5rem;
410
381
  height: 100%;
382
+ /* rounded-l-none py-0 !px-2 min-h-[33.6px] h-full */
411
383
  }
412
384
 
413
385
  .button-icon {
@@ -417,9 +389,10 @@
417
389
  }
418
390
 
419
391
  .button {
392
+ /* flex justify-center gap-x-2 */
420
393
  display: flex;
421
394
  align-items: center;
422
- gap: var(--pui-spacing-2);
395
+ gap: 0.5rem;
423
396
  width: auto;
424
397
  justify-content: center;
425
398
  user-select: none;
@@ -1,21 +1,38 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { ButtonVariant } from './ButtonVariant.js';
3
3
  import type { ButtonSize } from './ButtonSize.js';
4
- interface Props {
4
+ export interface ButtonProps {
5
+ /** Visual style variant of the button */
5
6
  variant?: ButtonVariant;
7
+ /** Size of the button */
6
8
  size?: ButtonSize;
9
+ /** URL to navigate to (renders as anchor tag) */
7
10
  href?: string;
11
+ /** Show loading spinner and disable interactions */
8
12
  loading?: boolean;
13
+ /** Disable the button */
9
14
  disabled?: boolean;
15
+ /** Disable hover/click visual effects */
10
16
  effectsDisabled?: boolean;
17
+ /** SVG icon to display on the left side */
11
18
  svg?: string;
19
+ /** SVG icon to display on the right side */
12
20
  rightSvg?: string;
21
+ /** Size of the icon(s) */
13
22
  iconSize?: string;
23
+ /** Link target attribute (when href is provided) */
14
24
  target?: undefined | '_self' | '_blank';
25
+ /** Button type attribute (when rendered as a button, not a link) */
26
+ type?: 'button' | 'submit' | 'reset';
27
+ /** Additional CSS classes */
15
28
  class?: string;
29
+ /** Button content */
16
30
  children: Snippet;
31
+ /** Click event handler */
17
32
  onclick?: (event: MouseEvent) => void;
33
+ /** Accessible label (use when the button has no visible text) */
34
+ ariaLabel?: string;
18
35
  }
19
- declare const Button: import("svelte").Component<Props, {}, "">;
36
+ declare const Button: import("svelte").Component<ButtonProps, {}, "">;
20
37
  type Button = ReturnType<typeof Button>;
21
38
  export default Button;
@@ -1 +1,15 @@
1
- export type ButtonVariant = 'white' | 'muted' | 'muted-subtle' | 'muted-selected' | 'secondary-selected' | 'danger' | 'danger-subtle' | 'auto-subtle' | 'auto-outline' | 'secondary' | 'secondary-outline' | 'secondary-subtle' | 'primary' | 'primary-outline' | 'primary-subtle' | 'accent' | 'accent-subtle' | 'success' | 'success-subtle' | 'warning' | 'warning-subtle';
1
+ /**
2
+ * Visual variants shared by Button, Badge, ActionIcon, Dropdown and Accordion.
3
+ *
4
+ * Brand variants map onto the semantic colour tokens:
5
+ * - `primary` → `--ui-primary` (dark brand colour)
6
+ * - `accent` → `--ui-accent` (light brand colour)
7
+ * - `tertiary` → `--ui-tertiary` (supporting colour)
8
+ *
9
+ * The `midnight`, `pistachio` and `turquoise` names are legacy aliases for
10
+ * `primary`, `accent` and `tertiary` respectively. They keep working but new code
11
+ * should use the semantic names.
12
+ */
13
+ export type ButtonVariant = 'white' | 'secondary' | 'secondary-subtle' | 'secondary-selected' | 'danger' | 'danger-subtle' | 'auto-subtle' | 'auto-outline' | 'primary' | 'primary-outline' | 'primary-subtle' | 'accent' | 'accent-outline' | 'accent-subtle' | 'tertiary' | 'tertiary-subtle' | 'shaded' | LegacyButtonVariant;
14
+ /** @deprecated Use `primary`, `accent` and `tertiary` instead. */
15
+ export type LegacyButtonVariant = 'pistachio' | 'pistachio-outline' | 'pistachio-subtle' | 'midnight' | 'midnight-outline' | 'midnight-subtle' | 'turquoise' | 'turquoise-subtle';