@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,13 +1,21 @@
1
- interface Props {
1
+ export interface DateTimePickerProps {
2
+ /** Label text displayed above the picker */
2
3
  label?: string;
4
+ /** Disable the date/time picker */
3
5
  disabled?: boolean;
6
+ /** Mark field as required (shows asterisk) */
4
7
  required?: boolean;
8
+ /** CSS classes for the container element */
5
9
  containerClass?: string;
10
+ /** Selected date/time value in ISO format (bindable) */
6
11
  value?: string | undefined;
12
+ /** Minimum selectable date/time in ISO format */
7
13
  minDate?: string | undefined;
14
+ /** Maximum selectable date/time in ISO format */
8
15
  maxDate?: string | undefined;
16
+ /** Callback when selected date/time changes */
9
17
  onchange?: (date: string | undefined) => void;
10
18
  }
11
- declare const DateTimePicker: import("svelte").Component<Props, {}, "value">;
19
+ declare const DateTimePicker: import("svelte").Component<DateTimePickerProps, {}, "value">;
12
20
  type DateTimePicker = ReturnType<typeof DateTimePicker>;
13
21
  export default DateTimePicker;
@@ -1,20 +1,33 @@
1
- <script lang="ts">
2
- import { Icon, iconInfoCircle } from '../icon/index.js';
3
- import Tooltip from '../ui/Tooltip.svelte';
1
+ <script module lang="ts">
4
2
  import type { Snippet } from 'svelte';
5
3
 
6
- interface Props {
4
+ export interface FormGroupProps {
5
+ /** Label text displayed above the form field */
7
6
  label: string;
7
+ /** Mark field as required (shows asterisk) */
8
8
  required?: boolean;
9
+ /** Custom ID for the form field */
9
10
  id?: string;
11
+ /** Additional CSS classes */
10
12
  class?: string;
13
+ /** Show error state styling */
11
14
  showError?: boolean;
15
+ /** Error message to display */
12
16
  errorText?: string;
17
+ /** Rich tooltip content using a Svelte snippet */
13
18
  tooltipContent?: Snippet;
19
+ /** Simple tooltip text */
14
20
  tooltipText?: string;
21
+ /** Position of the tooltip */
15
22
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
23
+ /** Form field content */
16
24
  children: Snippet;
17
25
  }
26
+ </script>
27
+
28
+ <script lang="ts">
29
+ import { Icon, iconInfoCircle } from '../icon/index.js';
30
+ import Tooltip from '../ui/Tooltip.svelte';
18
31
 
19
32
  let {
20
33
  label,
@@ -27,7 +40,7 @@
27
40
  tooltipText,
28
41
  tooltipLocation = 'top',
29
42
  children
30
- }: Props = $props();
43
+ }: FormGroupProps = $props();
31
44
 
32
45
  const computedId = $derived(id ?? `form-${label}`);
33
46
  </script>
@@ -56,13 +69,23 @@
56
69
 
57
70
  <style>
58
71
  .label {
59
- font-size: var(--pui-font-size-md);
60
- line-height: var(--pui-line-height-normal);
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 0.25rem;
75
+ font-size: 0.875rem;
76
+ line-height: 1.25rem;
77
+ font-weight: 500;
78
+ margin-bottom: 0.25rem;
79
+ color: var(--label-color, var(--bs-secondary, #6c757d));
80
+ }
81
+
82
+ .text-required {
83
+ color: var(--danger-text);
61
84
  }
62
85
 
63
86
  .error-text {
64
- color: var(--pui-text-danger);
65
- font-size: var(--pui-font-size-sm);
66
- margin-top: var(--pui-spacing-1);
87
+ color: var(--danger-text);
88
+ font-size: 0.875rem;
89
+ margin-top: 0.25rem;
67
90
  }
68
91
  </style>
@@ -1,16 +1,26 @@
1
1
  import type { Snippet } from 'svelte';
2
- interface Props {
2
+ export interface FormGroupProps {
3
+ /** Label text displayed above the form field */
3
4
  label: string;
5
+ /** Mark field as required (shows asterisk) */
4
6
  required?: boolean;
7
+ /** Custom ID for the form field */
5
8
  id?: string;
9
+ /** Additional CSS classes */
6
10
  class?: string;
11
+ /** Show error state styling */
7
12
  showError?: boolean;
13
+ /** Error message to display */
8
14
  errorText?: string;
15
+ /** Rich tooltip content using a Svelte snippet */
9
16
  tooltipContent?: Snippet;
17
+ /** Simple tooltip text */
10
18
  tooltipText?: string;
19
+ /** Position of the tooltip */
11
20
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
21
+ /** Form field content */
12
22
  children: Snippet;
13
23
  }
14
- declare const FormGroup: import("svelte").Component<Props, {}, "">;
24
+ declare const FormGroup: import("svelte").Component<FormGroupProps, {}, "">;
15
25
  type FormGroup = ReturnType<typeof FormGroup>;
16
26
  export default FormGroup;
@@ -4,47 +4,83 @@
4
4
  import Loader from '../ui/Loader.svelte';
5
5
  import Icon from '../icon/Icon.svelte';
6
6
 
7
- interface Props {
7
+ const autoName = `number-${crypto.randomUUID()}`;
8
+
9
+ export interface NumberProps {
10
+ /** HTML name attribute for the input (falls back to label, then auto-generated) */
11
+ name?: string;
12
+ /** Label text displayed above the input */
8
13
  label?: string;
14
+ /** Custom ID for the input element */
9
15
  inputId?: string;
16
+ /** Placeholder text when input is empty */
10
17
  placeholder?: string;
18
+ /** Mark field as required (shows asterisk) */
11
19
  required?: boolean;
20
+ /** Auto-focus the input on mount */
12
21
  autofocus?: boolean;
13
- noAutocomplete?: boolean;
22
+ /** HTML autocomplete attribute for the input */
23
+ autocomplete?: string;
24
+ /** Show loading spinner inside the input */
14
25
  loading?: boolean;
26
+ /** CSS classes for the FormGroup wrapper */
15
27
  groupClass?: string;
28
+ /** Reference to the input DOM element */
16
29
  numberElement?: HTMLElement;
30
+ /** SVG icon displayed on the left side */
17
31
  leftIconSvg?: string;
32
+ /** CSS classes for the input element */
18
33
  class?: string;
34
+ /** CSS classes for the container element */
19
35
  containerClass?: string;
36
+ /** Disable the input */
20
37
  disabled?: boolean;
38
+ /** Input value (bindable) */
21
39
  value?: number;
40
+ /** Whether the input is currently focused */
22
41
  isFocused?: boolean;
42
+ /** Show error state styling */
23
43
  showError?: boolean;
44
+ /** Error message to display */
24
45
  errorText?: string;
46
+ /** Position of the tooltip */
25
47
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
48
+ /** Minimum allowed value */
26
49
  min?: number;
50
+ /** Maximum allowed value */
27
51
  max?: number;
52
+ /** Increment/decrement step value */
28
53
  step?: number;
29
- onenter?: (v: number) => void;
54
+ /** Callback when Enter key is pressed */
55
+ onenter?: (value: number) => void;
56
+ /** Callback when value changes */
30
57
  onchange?: (e: Event) => void;
58
+ /** Callback on input event */
31
59
  oninput?: (e: Event) => void;
60
+ /** Callback on keydown event */
32
61
  onkeydown?: (e: KeyboardEvent) => void;
62
+ /** Callback on keypress event */
33
63
  onkeypress?: (e: KeyboardEvent) => void;
64
+ /** Callback on keyup event */
34
65
  onkeyup?: (e: KeyboardEvent) => void;
35
- onfocus?: (e: FocusEvent) => void;
36
- onblur?: (e: FocusEvent) => void;
66
+ /** Callback when input gains focus */
67
+ onfocus?: (value: number | undefined, e: FocusEvent) => void;
68
+ /** Callback when input loses focus */
69
+ onblur?: (value: number | undefined, e: FocusEvent) => void;
70
+ /** Content to render on the right side of the input */
37
71
  right?: Snippet;
72
+ /** Additional content below the input */
38
73
  children?: Snippet;
39
74
  }
40
75
 
41
76
  let {
77
+ name,
42
78
  label = '',
43
79
  inputId = undefined,
44
80
  placeholder = undefined,
45
81
  required = false,
46
82
  autofocus = false,
47
- noAutocomplete = false,
83
+ autocomplete = undefined,
48
84
  loading = false,
49
85
  class: classes = '',
50
86
  containerClass = '',
@@ -70,7 +106,11 @@
70
106
  onblur = undefined,
71
107
  right,
72
108
  children
73
- }: Props = $props();
109
+ }: NumberProps = $props();
110
+
111
+ let resolvedName = $derived(
112
+ (name || label || autoName).replace(/[^a-zA-Z0-9_\-:.]/g, '_')
113
+ );
74
114
 
75
115
  let id = $derived.by(() => {
76
116
  if (inputId) return inputId;
@@ -121,6 +161,7 @@
121
161
  class="number {classes} {extraClasses.join(' ')}"
122
162
  type="number"
123
163
  {id}
164
+ name={resolvedName}
124
165
  {placeholder}
125
166
  {disabled}
126
167
  {autofocus}
@@ -128,16 +169,16 @@
128
169
  {min}
129
170
  {max}
130
171
  {step}
131
- autocomplete={!noAutocomplete ? 'on' : 'off'}
172
+ autocomplete={autocomplete as any}
132
173
  bind:value
133
174
  bind:this={numberElement}
134
- onblur={() => {
175
+ onblur={(e) => {
135
176
  isFocused = false;
136
- onblur?.(new FocusEvent('blur'));
177
+ onblur?.(value, e);
137
178
  }}
138
- onfocus={() => {
179
+ onfocus={(e) => {
139
180
  isFocused = true;
140
- onfocus?.(new FocusEvent('focus'));
181
+ onfocus?.(value, e);
141
182
  }}
142
183
  onchange={handleChange}
143
184
  {oninput}
@@ -185,29 +226,30 @@
185
226
 
186
227
  .number {
187
228
  width: 100%;
188
- font-size: var(--pui-font-size-md);
189
- line-height: var(--pui-line-height-normal);
190
- padding: var(--pui-spacing-1) var(--pui-spacing-2);
191
- border: 1px solid var(--pui-input-border);
192
- background-color: var(--pui-input-bg);
193
- color: var(--pui-input-text);
194
- border-radius: var(--pui-radius-base);
229
+ font-size: 1rem;
230
+ line-height: 1.5rem;
231
+ padding: 0.25rem;
232
+ border: 1px solid var(--border-color);
233
+ background-color: var(--input-bg-color);
234
+ color: var(--text-color);
235
+ border-radius: 0.25rem;
236
+ padding: 0.25rem 0.5rem;
195
237
  box-sizing: border-box;
196
238
  }
197
239
 
198
240
  .number.disabled {
199
241
  opacity: 0.5;
200
242
  cursor: not-allowed;
201
- background: var(--pui-bg-disabled);
243
+ background: var(--border-color);
202
244
  }
203
245
 
204
246
  .number:focus {
205
- border-color: var(--pui-input-border-focus);
247
+ border-color: var(--accent-color);
206
248
  outline: 2px solid transparent;
207
- outline-offset: var(--pui-focus-ring-offset);
249
+ outline-offset: 2px;
208
250
 
209
251
  & ~ .left-icon {
210
- color: var(--pui-input-border-focus);
252
+ color: var(--accent-color);
211
253
  }
212
254
  }
213
255
 
@@ -217,7 +259,7 @@
217
259
  }
218
260
 
219
261
  .with-left-icon {
220
- padding-left: var(--pui-spacing-8);
262
+ padding-left: 2rem;
221
263
  }
222
264
 
223
265
  .left-icon {
@@ -225,15 +267,15 @@
225
267
  pointer-events: none;
226
268
  top: 50%;
227
269
  transform: translateY(-40%);
228
- left: var(--pui-spacing-2);
229
- color: var(--pui-text-muted);
270
+ left: 0.5rem;
271
+ color: rgb(115 115 115);
230
272
  }
231
273
 
232
274
  .show-error {
233
- border-color: var(--pui-text-danger);
275
+ border-color: var(--danger-text);
234
276
  }
235
277
 
236
278
  .text-error {
237
- color: var(--pui-text-danger);
279
+ color: var(--danger-text);
238
280
  }
239
- </style>
281
+ </style>
@@ -1,37 +1,70 @@
1
1
  import { type Snippet } from 'svelte';
2
- interface Props {
2
+ export interface NumberProps {
3
+ /** HTML name attribute for the input (falls back to label, then auto-generated) */
4
+ name?: string;
5
+ /** Label text displayed above the input */
3
6
  label?: string;
7
+ /** Custom ID for the input element */
4
8
  inputId?: string;
9
+ /** Placeholder text when input is empty */
5
10
  placeholder?: string;
11
+ /** Mark field as required (shows asterisk) */
6
12
  required?: boolean;
13
+ /** Auto-focus the input on mount */
7
14
  autofocus?: boolean;
8
- noAutocomplete?: boolean;
15
+ /** HTML autocomplete attribute for the input */
16
+ autocomplete?: string;
17
+ /** Show loading spinner inside the input */
9
18
  loading?: boolean;
19
+ /** CSS classes for the FormGroup wrapper */
10
20
  groupClass?: string;
21
+ /** Reference to the input DOM element */
11
22
  numberElement?: HTMLElement;
23
+ /** SVG icon displayed on the left side */
12
24
  leftIconSvg?: string;
25
+ /** CSS classes for the input element */
13
26
  class?: string;
27
+ /** CSS classes for the container element */
14
28
  containerClass?: string;
29
+ /** Disable the input */
15
30
  disabled?: boolean;
31
+ /** Input value (bindable) */
16
32
  value?: number;
33
+ /** Whether the input is currently focused */
17
34
  isFocused?: boolean;
35
+ /** Show error state styling */
18
36
  showError?: boolean;
37
+ /** Error message to display */
19
38
  errorText?: string;
39
+ /** Position of the tooltip */
20
40
  tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
41
+ /** Minimum allowed value */
21
42
  min?: number;
43
+ /** Maximum allowed value */
22
44
  max?: number;
45
+ /** Increment/decrement step value */
23
46
  step?: number;
24
- onenter?: (v: number) => void;
47
+ /** Callback when Enter key is pressed */
48
+ onenter?: (value: number) => void;
49
+ /** Callback when value changes */
25
50
  onchange?: (e: Event) => void;
51
+ /** Callback on input event */
26
52
  oninput?: (e: Event) => void;
53
+ /** Callback on keydown event */
27
54
  onkeydown?: (e: KeyboardEvent) => void;
55
+ /** Callback on keypress event */
28
56
  onkeypress?: (e: KeyboardEvent) => void;
57
+ /** Callback on keyup event */
29
58
  onkeyup?: (e: KeyboardEvent) => void;
30
- onfocus?: (e: FocusEvent) => void;
31
- onblur?: (e: FocusEvent) => void;
59
+ /** Callback when input gains focus */
60
+ onfocus?: (value: number | undefined, e: FocusEvent) => void;
61
+ /** Callback when input loses focus */
62
+ onblur?: (value: number | undefined, e: FocusEvent) => void;
63
+ /** Content to render on the right side of the input */
32
64
  right?: Snippet;
65
+ /** Additional content below the input */
33
66
  children?: Snippet;
34
67
  }
35
- declare const Number: import("svelte").Component<Props, {}, "value" | "numberElement">;
68
+ declare const Number: import("svelte").Component<NumberProps, {}, "value" | "numberElement">;
36
69
  type Number = ReturnType<typeof Number>;
37
70
  export default Number;
@@ -0,0 +1,174 @@
1
+ <script lang="ts">
2
+ export interface RadioProps {
3
+ /** HTML name attribute for the radio input */
4
+ name?: string;
5
+ /** Label text displayed next to the radio */
6
+ label?: string;
7
+ /** Custom ID for the input element */
8
+ id?: string;
9
+ /** Additional CSS classes */
10
+ class?: string;
11
+ /** Disable the radio */
12
+ disabled?: boolean;
13
+ /** Whether the radio is checked (bindable) */
14
+ checked?: boolean;
15
+ /** When true, the radio state is controlled externally only. Clicking will call onchange but won't toggle the radio. */
16
+ controlled?: boolean;
17
+ /** Callback when checked state changes */
18
+ onchange?: (checked: boolean) => void;
19
+ }
20
+
21
+ const nonce = Math.random().toString(36).substring(2, 15);
22
+
23
+ let {
24
+ name,
25
+ label,
26
+ id = `radio-${nonce}`,
27
+ class: classes = '',
28
+ disabled = false,
29
+ checked = $bindable(false),
30
+ controlled = false,
31
+ onchange = undefined
32
+ }: RadioProps = $props();
33
+ </script>
34
+
35
+ <div class="radio-wrapper {disabled ? 'disabled' : ''}">
36
+ <label class={disabled ? 'cursor-not-allowed' : ''} for={id}>
37
+ <input
38
+ {id}
39
+ type="radio"
40
+ class="accent-accent {classes}"
41
+ {name}
42
+ {disabled}
43
+ {checked}
44
+ onchange={(e) => {
45
+ if (controlled) {
46
+ e.currentTarget.checked = checked;
47
+ onchange?.(!checked);
48
+ } else {
49
+ checked = e.currentTarget.checked;
50
+ onchange?.(checked);
51
+ }
52
+ }}
53
+ />
54
+ {#if label}
55
+ {label}
56
+ {/if}
57
+ </label>
58
+ </div>
59
+
60
+ <style>
61
+ label {
62
+ display: flex;
63
+ flex-direction: row;
64
+ align-items: center;
65
+ user-select: none;
66
+ cursor: pointer;
67
+ }
68
+
69
+ .disabled label,
70
+ .disabled input {
71
+ cursor: not-allowed;
72
+ }
73
+
74
+ input {
75
+ position: relative !important;
76
+ -webkit-appearance: none;
77
+ -moz-appearance: none;
78
+ appearance: none;
79
+ margin: 8px;
80
+ box-sizing: content-box;
81
+ overflow: hidden;
82
+ cursor: pointer;
83
+ }
84
+
85
+ input:before {
86
+ content: '';
87
+ display: block;
88
+ box-sizing: content-box;
89
+ width: 16px;
90
+ height: 16px;
91
+ border: 2px solid #ccc;
92
+ transition: 0.2s border-color ease;
93
+ }
94
+
95
+ :global(.dark) input:before {
96
+ border-color: #666;
97
+ }
98
+ input:checked:before {
99
+ border-color: var(--ui-primary);
100
+ transition: 0.5s border-color ease;
101
+ }
102
+ :global(.dark) input:checked:before {
103
+ border-color: var(--ui-accent);
104
+ }
105
+
106
+ input:disabled:before {
107
+ border-color: #ccc;
108
+ background-color: #ccc;
109
+ opacity: 0.5;
110
+ }
111
+ :global(.dark) input:disabled:before {
112
+ border-color: #666;
113
+ background-color: #666;
114
+ }
115
+ input:after {
116
+ content: '';
117
+ display: block;
118
+ position: absolute;
119
+ box-sizing: content-box;
120
+ top: 50%;
121
+ left: 50%;
122
+ transform-origin: 50% 50%;
123
+ background-color: var(--ui-primary);
124
+ width: 16px;
125
+ height: 16px;
126
+ border-radius: 100vh;
127
+ transform: translate(-50%, -50%) scale(0);
128
+ }
129
+ input:disabled:after {
130
+ opacity: 0.5;
131
+ }
132
+ :global(.dark) input:after {
133
+ background-color: var(--ui-accent);
134
+ }
135
+ input[type='radio']:before {
136
+ border-radius: 100vh;
137
+ }
138
+ input[type='radio']:after {
139
+ width: 16px;
140
+ height: 16px;
141
+ border-radius: 100vh;
142
+ transform: translate(-50%, -50%) scale(0);
143
+ }
144
+ input[type='radio']:checked:after {
145
+ -webkit-animation: toggleOnRadio 0.2s ease forwards;
146
+ animation: toggleOnRadio 0.2s ease forwards;
147
+ }
148
+ @-webkit-keyframes toggleOnRadio {
149
+ 0% {
150
+ opacity: 0;
151
+ transform: translate(-50%, -50%) scale(0);
152
+ }
153
+ 70% {
154
+ opacity: 1;
155
+ transform: translate(-50%, -50%) scale(0.9);
156
+ }
157
+ 100% {
158
+ transform: translate(-50%, -50%) scale(0.8);
159
+ }
160
+ }
161
+ @keyframes toggleOnRadio {
162
+ 0% {
163
+ opacity: 0;
164
+ transform: translate(-50%, -50%) scale(0);
165
+ }
166
+ 70% {
167
+ opacity: 1;
168
+ transform: translate(-50%, -50%) scale(0.9);
169
+ }
170
+ 100% {
171
+ transform: translate(-50%, -50%) scale(0.8);
172
+ }
173
+ }
174
+ </style>
@@ -0,0 +1,21 @@
1
+ export interface RadioProps {
2
+ /** HTML name attribute for the radio input */
3
+ name?: string;
4
+ /** Label text displayed next to the radio */
5
+ label?: string;
6
+ /** Custom ID for the input element */
7
+ id?: string;
8
+ /** Additional CSS classes */
9
+ class?: string;
10
+ /** Disable the radio */
11
+ disabled?: boolean;
12
+ /** Whether the radio is checked (bindable) */
13
+ checked?: boolean;
14
+ /** When true, the radio state is controlled externally only. Clicking will call onchange but won't toggle the radio. */
15
+ controlled?: boolean;
16
+ /** Callback when checked state changes */
17
+ onchange?: (checked: boolean) => void;
18
+ }
19
+ declare const Radio: import("svelte").Component<RadioProps, {}, "checked">;
20
+ type Radio = ReturnType<typeof Radio>;
21
+ export default Radio;