@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,21 +1,39 @@
1
- <script lang="ts">
2
- import Textbox from "./Textbox.svelte";
3
- import { fade } from "svelte/transition";
4
- import dayjs from "dayjs";
5
- import { clickOutside } from "../actions/ClickOutside.js";
6
- import ActionIcon from "../ui/ActionIcon.svelte";
7
- import { iconChevronLeft, iconChevronRight, iconX } from "../icon/index.js";
8
-
9
- interface Props {
1
+ <script module lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ export interface DatePickerProps {
5
+ /** Label text displayed above the input */
10
6
  label?: string;
7
+ /** Disable the date picker */
11
8
  disabled?: boolean;
9
+ /** Mark field as required (shows asterisk) */
12
10
  required?: boolean;
11
+ /** CSS classes for the container element */
13
12
  containerClass?: string;
13
+ /** Selected date value in ISO format (bindable) */
14
14
  value?: string | undefined;
15
+ /** Minimum selectable date in ISO format */
15
16
  minDate?: string | undefined;
17
+ /** Maximum selectable date in ISO format */
16
18
  maxDate?: string | undefined;
19
+ /** Position of the tooltip */
20
+ tooltipLocation?: 'top' | 'bottom' | 'left' | 'right';
21
+ /** Rich tooltip content using a Svelte snippet */
22
+ tooltipContent?: Snippet;
23
+ /** Simple tooltip text */
24
+ tooltipText?: string;
25
+ /** Callback when selected date changes */
17
26
  onchange?: (date: string | undefined) => void;
18
27
  }
28
+ </script>
29
+
30
+ <script lang="ts">
31
+ import Textbox from './Textbox.svelte';
32
+ import { fade } from 'svelte/transition';
33
+ import dayjs from '../util/dayjs.js';
34
+ import { clickOutside } from '../util/ClickOutside.js';
35
+ import ActionIcon from '../ui/ActionIcon.svelte';
36
+ import { iconChevronLeft, iconChevronRight, iconX } from '../icon/index.js';
19
37
 
20
38
  let {
21
39
  label,
@@ -25,20 +43,19 @@
25
43
  value = $bindable(undefined),
26
44
  minDate,
27
45
  maxDate,
28
- onchange,
29
- }: Props = $props();
46
+ tooltipLocation = 'top',
47
+ tooltipContent,
48
+ tooltipText,
49
+ onchange
50
+ }: DatePickerProps = $props();
30
51
 
31
- const days = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
52
+ const days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
32
53
 
33
54
  // Parse min and max dates
34
- const minDateParsed = $derived(
35
- minDate ? dayjs(minDate).startOf("date") : undefined,
36
- );
37
- const maxDateParsed = $derived(
38
- maxDate ? dayjs(maxDate).startOf("date") : undefined,
39
- );
40
-
41
- type DisplayedDateColor = "normal" | "red" | "grey" | "disabled";
55
+ const minDateParsed = $derived(minDate ? dayjs(minDate).startOf('date') : undefined);
56
+ const maxDateParsed = $derived(maxDate ? dayjs(maxDate).startOf('date') : undefined);
57
+
58
+ type DisplayedDateColor = 'normal' | 'red' | 'grey' | 'disabled';
42
59
  type DisplayedDate = {
43
60
  date: dayjs.Dayjs;
44
61
  text: string;
@@ -47,20 +64,20 @@
47
64
  isDisabled: boolean;
48
65
  };
49
66
 
50
- const todayDate = dayjs().startOf("date");
67
+ const todayDate = dayjs().startOf('date');
51
68
 
52
69
  let selectedDate: dayjs.Dayjs | undefined = $state(undefined);
53
70
 
54
71
  $effect(() => {
55
72
  setDate(value ? dayjs(value) : undefined, false, true);
56
73
  if (selectedDate) {
57
- focusedMonth = selectedDate.startOf("month");
74
+ focusedMonth = selectedDate.startOf('month');
58
75
  }
59
76
  });
60
77
 
61
78
  let showRequiredRing = $state(false);
62
79
  // svelte-ignore state_referenced_locally
63
- let focusedMonth = $state((selectedDate ?? todayDate).startOf("month"));
80
+ let focusedMonth = $state((selectedDate ?? todayDate).startOf('month'));
64
81
 
65
82
  function startOfWeek(date: dayjs.Dayjs) {
66
83
  // We celebrate Monday as the one true start of the week in this household. NO exceptions
@@ -74,7 +91,7 @@
74
91
  function getFullWeekCount(month: dayjs.Dayjs) {
75
92
  const start = startOfWeek(month.date(1));
76
93
  const end = endOfWeek(month.date(month.daysInMonth()));
77
- const diff = end.diff(start, "day", true);
94
+ const diff = end.diff(start, 'day', true);
78
95
 
79
96
  return Math.ceil(diff / 7) * 7;
80
97
  }
@@ -85,10 +102,7 @@
85
102
  return true;
86
103
  }
87
104
 
88
- function calculateDays(
89
- selectedDate: dayjs.Dayjs | undefined,
90
- focusedMonth: dayjs.Dayjs,
91
- ) {
105
+ function calculateDays(selectedDate: dayjs.Dayjs | undefined, focusedMonth: dayjs.Dayjs) {
92
106
  // Fill out the entire 7 day grid
93
107
  const length = getFullWeekCount(focusedMonth);
94
108
 
@@ -97,31 +111,29 @@
97
111
  const startDate = startOfWeek(focusedMonth);
98
112
 
99
113
  for (let i = 0; i < length; i++) {
100
- const date = startDate.add(i, "day");
114
+ const date = startDate.add(i, 'day');
101
115
 
102
116
  let color: DisplayedDateColor;
103
117
  let isDisabled = false;
104
118
 
105
119
  // Check if date is outside of min/max range
106
120
  if (!isDateInRange(date)) {
107
- color = "disabled";
121
+ color = 'disabled';
108
122
  isDisabled = true;
109
- } else if (!date.isSame(focusedMonth, "month")) {
110
- color = "grey";
123
+ } else if (!date.isSame(focusedMonth, 'month')) {
124
+ color = 'grey';
111
125
  } else if (date.day() == 0 || date.day() == 6) {
112
- color = "red";
126
+ color = 'red';
113
127
  } else {
114
- color = "normal";
128
+ color = 'normal';
115
129
  }
116
130
 
117
131
  displayedDates.push({
118
132
  date,
119
133
  text: date.date().toString(),
120
134
  color,
121
- isSelected:
122
- selectedDate !== undefined &&
123
- selectedDate.isSame(date, "date"),
124
- isDisabled,
135
+ isSelected: selectedDate !== undefined && selectedDate.isSame(date, 'date'),
136
+ isDisabled
125
137
  });
126
138
  }
127
139
 
@@ -132,29 +144,25 @@
132
144
  let classes = [];
133
145
 
134
146
  if (date.isDisabled) {
135
- classes.push("disabled");
136
- } else if (date.color === "red") {
137
- classes.push("text-red");
138
- } else if (date.color === "grey") {
139
- classes.push("text-grey");
147
+ classes.push('disabled');
148
+ } else if (date.color === 'red') {
149
+ classes.push('text-red');
150
+ } else if (date.color === 'grey') {
151
+ classes.push('text-grey');
140
152
  }
141
153
 
142
154
  if (date.isSelected && !date.isDisabled) {
143
- classes.push("selected");
155
+ classes.push('selected');
144
156
  } else {
145
- if (date.date.isSame(todayDate, "date") && !date.isDisabled) {
146
- classes.push("today");
157
+ if (date.date.isSame(todayDate, 'date') && !date.isDisabled) {
158
+ classes.push('today');
147
159
  }
148
160
  }
149
161
 
150
- return classes.join(" ");
162
+ return classes.join(' ');
151
163
  }
152
164
 
153
- function setDate(
154
- newDate: dayjs.Dayjs | undefined,
155
- fromTextbox: boolean,
156
- fromValue: boolean,
157
- ) {
165
+ function setDate(newDate: dayjs.Dayjs | undefined, fromTextbox: boolean, fromValue: boolean) {
158
166
  if (newDate === undefined && selectedDate === undefined) return;
159
167
 
160
168
  // Check if the new date is within the allowed range
@@ -164,18 +172,12 @@
164
172
  }
165
173
 
166
174
  const isSameDate =
167
- newDate !== undefined &&
168
- selectedDate !== undefined &&
169
- newDate.isSame(selectedDate, "date");
170
-
171
- if (
172
- newDate === undefined ||
173
- !newDate.isValid() ||
174
- (isSameDate && !fromTextbox && !fromValue)
175
- ) {
175
+ newDate !== undefined && selectedDate !== undefined && newDate.isSame(selectedDate, 'date');
176
+
177
+ if (newDate === undefined || !newDate.isValid() || (isSameDate && !fromTextbox && !fromValue)) {
176
178
  value = undefined;
177
179
  selectedDate = undefined;
178
- readableDate = "";
180
+ readableDate = '';
179
181
 
180
182
  return;
181
183
  } else if (isSameDate) {
@@ -183,32 +185,30 @@
183
185
  }
184
186
 
185
187
  selectedDate = newDate;
186
- focusedMonth = newDate.startOf("month");
188
+ focusedMonth = newDate.startOf('month');
187
189
 
188
- value = newDate.format("YYYY-MM-DD");
190
+ value = newDate.format('YYYY-MM-DD');
189
191
  onchange?.(value);
190
192
 
191
- if (!fromTextbox) readableDate = newDate.format("D MMMM YYYY");
193
+ if (!fromTextbox) readableDate = newDate.format('D MMMM YYYY');
192
194
  }
193
195
 
194
196
  function incrementFocusedMonth(value: number) {
195
- focusedMonth = focusedMonth.add(value, "month");
197
+ focusedMonth = focusedMonth.add(value, 'month');
196
198
  }
197
199
 
198
200
  // -----------------------------
199
201
  // Control code
200
202
 
201
203
  let textboxElement: HTMLElement | undefined = $state(undefined);
202
- let readableDate: string = $state("");
204
+ let readableDate: string = $state('');
203
205
  let showCalendar = $state(false);
204
206
  let showYearPicker = $state(false);
205
- let dropdownPosition: "above" | "below" = $state("below");
207
+ let dropdownPosition: 'above' | 'below' = $state('below');
206
208
 
207
209
  // Year picker: show a range of years centered around the focused year
208
210
  const yearRangeSize = 12;
209
- let yearRangeStart = $state(
210
- Math.floor(dayjs().year() / yearRangeSize) * yearRangeSize,
211
- );
211
+ let yearRangeStart = $state(Math.floor(dayjs().year() / yearRangeSize) * yearRangeSize);
212
212
 
213
213
  function getYearRange() {
214
214
  const years: number[] = [];
@@ -236,25 +236,24 @@
236
236
  function toggleYearPicker() {
237
237
  if (!showYearPicker) {
238
238
  // Center the range around the focused year
239
- yearRangeStart =
240
- Math.floor(focusedMonth.year() / yearRangeSize) * yearRangeSize;
239
+ yearRangeStart = Math.floor(focusedMonth.year() / yearRangeSize) * yearRangeSize;
241
240
  }
242
241
  showYearPicker = !showYearPicker;
243
242
  }
244
243
 
245
244
  function checkDropdownPosition() {
246
245
  if (!textboxElement) return;
247
-
246
+
248
247
  const rect = textboxElement.getBoundingClientRect();
249
248
  const dropdownHeight = 300; // Approximate height of the calendar dropdown
250
249
  const spaceBelow = window.innerHeight - rect.bottom;
251
250
  const spaceAbove = rect.top;
252
-
251
+
253
252
  // If not enough space below and more space above, position above
254
253
  if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {
255
- dropdownPosition = "above";
254
+ dropdownPosition = 'above';
256
255
  } else {
257
- dropdownPosition = "below";
256
+ dropdownPosition = 'below';
258
257
  }
259
258
  }
260
259
 
@@ -271,24 +270,26 @@
271
270
  function onDateTextChange(event: Event) {
272
271
  const textbox = event.target as HTMLInputElement;
273
272
 
274
- const date = dayjs(textbox.value, ["D MMMM YYYY", "DD/MM/YYYY"]);
273
+ const date = dayjs(textbox.value, ['D MMMM YYYY', 'DD/MM/YYYY']);
275
274
  if (date.isValid()) {
276
275
  setDate(date, true, false);
277
276
  }
278
277
  }
279
278
 
279
+ function onDateTextBlur() {
280
+ if (selectedDate) {
281
+ readableDate = selectedDate.format('D MMMM YYYY');
282
+ }
283
+ }
284
+
280
285
  function clearDate() {
281
286
  value = undefined;
282
287
  selectedDate = undefined;
283
- readableDate = "";
288
+ readableDate = '';
284
289
  onchange?.(undefined);
285
290
  }
286
291
 
287
- function handleDateChangeClick(
288
- event: MouseEvent,
289
- date: dayjs.Dayjs,
290
- isDisabled: boolean,
291
- ) {
292
+ function handleDateChangeClick(event: MouseEvent, date: dayjs.Dayjs, isDisabled: boolean) {
292
293
  if (isDisabled) {
293
294
  event.stopPropagation();
294
295
  return;
@@ -307,7 +308,10 @@
307
308
  placeholder="Enter date"
308
309
  {disabled}
309
310
  {required}
310
- noAutocomplete
311
+ autocomplete="off"
312
+ {tooltipLocation}
313
+ {tooltipContent}
314
+ {tooltipText}
311
315
  bind:textboxElement
312
316
  value={readableDate}
313
317
  onfocus={() => {
@@ -315,7 +319,8 @@
315
319
  showCalendar = true;
316
320
  }}
317
321
  onkeyup={onDateTextChange}
318
- class={showRequiredRing ? "!border-required" : ""}
322
+ onblur={onDateTextBlur}
323
+ class={showRequiredRing ? '!border-required' : ''}
319
324
  >
320
325
  {#snippet right()}
321
326
  {#if readableDate && !disabled}
@@ -334,11 +339,7 @@
334
339
  {/snippet}
335
340
  <div class="date-picker">
336
341
  {#if showCalendar}
337
- <div
338
- class="calendar {dropdownPosition}"
339
- transition:fade={{ duration: 200 }}
340
- use:clickOutside={onClickOutside}
341
- >
342
+ <div class="calendar {dropdownPosition}" transition:fade={{ duration: 200 }} use:clickOutside={onClickOutside}>
342
343
  <div class="month-buttons">
343
344
  {#if showYearPicker}
344
345
  <ActionIcon
@@ -346,13 +347,8 @@
346
347
  size="1.5rem"
347
348
  onclick={() => incrementYearRange(-1)}
348
349
  />
349
- <button
350
- class="month-label clickable"
351
- onclick={toggleYearPicker}
352
- >
353
- {yearRangeStart} - {yearRangeStart +
354
- yearRangeSize -
355
- 1}
350
+ <button class="month-label clickable" onclick={toggleYearPicker}>
351
+ {yearRangeStart} - {yearRangeStart + yearRangeSize - 1}
356
352
  </button>
357
353
  <ActionIcon
358
354
  svg={iconChevronRight}
@@ -365,11 +361,8 @@
365
361
  size="1.5rem"
366
362
  onclick={() => incrementFocusedMonth(-1)}
367
363
  />
368
- <button
369
- class="month-label clickable"
370
- onclick={toggleYearPicker}
371
- >
372
- {focusedMonth.format("MMMM YYYY")}
364
+ <button class="month-label clickable" onclick={toggleYearPicker}>
365
+ {focusedMonth.format('MMMM YYYY')}
373
366
  </button>
374
367
  <ActionIcon
375
368
  svg={iconChevronRight}
@@ -384,10 +377,8 @@
384
377
  {#each getYearRange() as year}
385
378
  <button
386
379
  class="year-button"
387
- class:selected={focusedMonth.year() ===
388
- year}
389
- class:current-year={todayDate.year() ===
390
- year}
380
+ class:selected={focusedMonth.year() === year}
381
+ class:current-year={todayDate.year() === year}
391
382
  class:disabled={!isYearInRange(year)}
392
383
  disabled={!isYearInRange(year)}
393
384
  onclick={() => selectYear(year)}
@@ -409,12 +400,7 @@
409
400
  <button
410
401
  class="day-button {buildDayClasses(day)}"
411
402
  disabled={day.isDisabled}
412
- onclick={(e) =>
413
- handleDateChangeClick(
414
- e,
415
- day.date,
416
- day.isDisabled,
417
- )}
403
+ onclick={(e) => handleDateChangeClick(e, day.date, day.isDisabled)}
418
404
  >
419
405
  {day.text}
420
406
  </button>
@@ -434,7 +420,7 @@
434
420
 
435
421
  .clear-button {
436
422
  position: absolute;
437
- right: var(--pui-spacing-2);
423
+ right: 0.5rem;
438
424
  top: 50%;
439
425
  transform: translateY(-50%);
440
426
  line-height: 0;
@@ -444,17 +430,17 @@
444
430
  width: 18rem;
445
431
  text-align: center;
446
432
  position: absolute;
447
- z-index: var(--pui-z-dropdown);
433
+ z-index: 10;
448
434
  user-select: none;
449
- background-color: var(--pui-bg-surface-raised);
450
- border: 1px solid var(--pui-border-default);
451
- border-radius: var(--pui-radius-md);
452
- box-shadow: var(--pui-shadow-lg);
453
- padding: var(--pui-spacing-2);
435
+ background-color: var(--paper-body-bg);
436
+ border: 1px solid var(--border-color);
437
+ border-radius: 0.375rem;
438
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
439
+ padding: 0.5rem;
454
440
  }
455
441
 
456
442
  .calendar.below {
457
- top: 0;
443
+ top: 0
458
444
  }
459
445
 
460
446
  .calendar.above {
@@ -465,13 +451,13 @@
465
451
  display: flex;
466
452
  justify-content: space-between;
467
453
  align-items: center;
468
- padding: var(--pui-spacing-2);
454
+ padding: 0.5rem;
469
455
  }
470
456
 
471
457
  .month-label {
472
- font-weight: var(--pui-font-weight-semibold);
473
- color: var(--pui-text-primary);
474
- font-size: var(--pui-font-size-lg);
458
+ font-weight: 600;
459
+ color: var(--text-color);
460
+ font-size: 1.125rem;
475
461
  background: none;
476
462
  border: none;
477
463
  cursor: default;
@@ -479,53 +465,53 @@
479
465
 
480
466
  .month-label.clickable {
481
467
  cursor: pointer;
482
- padding: var(--pui-spacing-1) var(--pui-spacing-2);
483
- border-radius: var(--pui-radius-sm);
484
- transition: background-color var(--pui-transition-fast) var(--pui-ease-in-out);
468
+ padding: 0.25rem 0.5rem;
469
+ border-radius: 0.25rem;
470
+ transition: background-color 0.15s ease;
485
471
  }
486
472
 
487
473
  .month-label.clickable:hover {
488
- background-color: var(--pui-bg-hover);
474
+ background-color: rgba(var(--ui-primary-rgbc), 0.1);
489
475
  }
490
476
 
491
477
  .year-grid {
492
478
  display: grid;
493
479
  grid-template-columns: repeat(3, 1fr);
494
- gap: var(--pui-spacing-2);
495
- margin-top: var(--pui-spacing-2);
496
- padding: var(--pui-spacing-2);
480
+ gap: 0.5rem;
481
+ margin-top: 0.5rem;
482
+ padding: 0.5rem;
497
483
  }
498
484
 
499
485
  .year-button {
500
- color: var(--pui-text-primary);
501
- padding: var(--pui-spacing-3) var(--pui-spacing-2);
502
- border-radius: var(--pui-radius-md);
486
+ color: var(--text-color);
487
+ padding: 0.75rem 0.5rem;
488
+ border-radius: 0.375rem;
503
489
  border: none;
504
490
  background: transparent;
505
491
  cursor: pointer;
506
- font-size: var(--pui-font-size-sm);
507
- transition: all var(--pui-transition-fast) var(--pui-ease-in-out);
492
+ font-size: 0.875rem;
493
+ transition: all 0.15s ease;
508
494
  }
509
495
 
510
496
  .year-button:hover:not(.disabled) {
511
- background-color: var(--pui-bg-hover);
512
- color: var(--pui-color-primary);
497
+ background-color: rgba(var(--ui-primary-rgbc), 0.1);
498
+ color: var(--ui-primary);
513
499
  }
514
500
 
515
501
  .year-button.current-year {
516
- background-color: var(--pui-bg-active);
517
- color: var(--pui-color-primary);
518
- font-weight: var(--pui-font-weight-semibold);
502
+ background-color: rgba(var(--ui-primary-rgbc), 0.15);
503
+ color: var(--ui-primary);
504
+ font-weight: 600;
519
505
  }
520
506
 
521
507
  .year-button.selected {
522
- background-color: var(--pui-color-primary);
523
- color: var(--pui-color-white);
524
- font-weight: var(--pui-font-weight-semibold);
508
+ background-color: var(--ui-primary);
509
+ color: white;
510
+ font-weight: 600;
525
511
  }
526
512
 
527
513
  .year-button.disabled {
528
- color: var(--pui-text-disabled) !important;
514
+ color: rgb(163 163 163) !important;
529
515
  background-color: transparent !important;
530
516
  cursor: not-allowed !important;
531
517
  opacity: 0.5;
@@ -534,17 +520,17 @@
534
520
  .days-header-bar {
535
521
  display: grid;
536
522
  grid-template-columns: repeat(7, 1fr);
537
- margin-top: var(--pui-spacing-2);
538
- background-color: var(--pui-color-gray-100);
539
- border-radius: var(--pui-radius-sm);
540
- border: 1px solid var(--pui-border-default);
523
+ margin-top: 0.5rem;
524
+ background-color: #f8f9fa;
525
+ border-radius: 0.25rem;
526
+ border: 1px solid var(--border-color);
541
527
  }
542
528
 
543
529
  .day-label {
544
- color: var(--pui-color-gray-500);
545
- padding: var(--pui-spacing-2);
546
- font-size: var(--pui-font-size-xs);
547
- font-weight: var(--pui-font-weight-semibold);
530
+ color: #6b7280;
531
+ padding: 0.5rem;
532
+ font-size: 0.75rem;
533
+ font-weight: 600;
548
534
  text-transform: uppercase;
549
535
  text-align: center;
550
536
  }
@@ -552,50 +538,50 @@
552
538
  .days-grid {
553
539
  display: grid;
554
540
  grid-template-columns: repeat(7, 1fr);
555
- gap: 2px;
556
- margin-top: var(--pui-spacing-2);
541
+ gap: 0.125rem;
542
+ margin-top: 0.5rem;
557
543
  }
558
544
 
559
545
  .day-button {
560
- color: var(--pui-text-primary);
546
+ color: var(--text-color);
561
547
  width: 2.25rem;
562
548
  height: 2.25rem;
563
- border-radius: var(--pui-radius-md);
549
+ border-radius: 0.375rem;
564
550
  border: none;
565
551
  background: transparent;
566
552
  cursor: pointer;
567
- font-size: var(--pui-font-size-sm);
568
- transition: all var(--pui-transition-fast) var(--pui-ease-in-out);
553
+ font-size: 0.875rem;
554
+ transition: all 0.15s ease;
569
555
  justify-self: center;
570
556
  }
571
557
 
572
558
  .day-button:hover {
573
- background-color: var(--pui-bg-hover);
574
- color: var(--pui-color-primary);
559
+ background-color: rgba(var(--ui-primary-rgbc), 0.1);
560
+ color: var(--ui-primary);
575
561
  }
576
562
 
577
563
  .today {
578
- background-color: var(--pui-bg-active);
579
- color: var(--pui-color-primary);
580
- font-weight: var(--pui-font-weight-semibold);
564
+ background-color: rgba(var(--ui-primary-rgbc), 0.15);
565
+ color: var(--ui-primary);
566
+ font-weight: 600;
581
567
  }
582
568
 
583
569
  .selected {
584
- background-color: var(--pui-color-primary);
585
- color: var(--pui-color-white);
586
- font-weight: var(--pui-font-weight-semibold);
570
+ background-color: var(--ui-primary);
571
+ color: white;
572
+ font-weight: 600;
587
573
  }
588
574
 
589
575
  .text-red {
590
- color: var(--pui-color-danger);
576
+ color: rgb(248 113 113);
591
577
  }
592
578
 
593
579
  .text-grey {
594
- color: var(--pui-text-muted);
580
+ color: rgb(163 163 163);
595
581
  }
596
582
 
597
583
  .disabled {
598
- color: var(--pui-text-disabled) !important;
584
+ color: rgb(163 163 163) !important;
599
585
  background-color: transparent !important;
600
586
  cursor: not-allowed !important;
601
587
  opacity: 0.5;
@@ -603,39 +589,39 @@
603
589
 
604
590
  .disabled:hover {
605
591
  background-color: transparent !important;
606
- color: var(--pui-text-disabled) !important;
592
+ color: rgb(163 163 163) !important;
607
593
  }
608
594
 
609
595
  :global(.dark) {
610
596
  .days-header-bar {
611
- background-color: var(--pui-color-dark-200);
597
+ background-color: #252529;
612
598
  }
613
599
 
614
600
  .day-label {
615
- color: var(--pui-color-gray-300);
601
+ color: #d1d5db;
616
602
  }
617
603
 
618
604
  .day-button:hover {
619
- background-color: var(--pui-bg-hover);
620
- color: var(--pui-color-secondary);
605
+ background-color: rgba(var(--ui-accent-rgbc), 0.1);
606
+ color: var(--ui-accent);
621
607
  }
622
608
 
623
609
  .today {
624
- background-color: var(--pui-bg-active);
625
- color: var(--pui-color-secondary);
610
+ background-color: rgba(var(--ui-accent-rgbc), 0.15);
611
+ color: var(--ui-accent);
626
612
  }
627
613
 
628
614
  .selected {
629
- background-color: var(--pui-color-secondary);
630
- color: var(--pui-color-primary);
615
+ background-color: var(--ui-accent);
616
+ color: var(--ui-primary);
631
617
  }
632
618
 
633
619
  .text-grey {
634
- color: var(--pui-color-gray-500);
620
+ color: #6b7280;
635
621
  }
636
622
 
637
623
  .disabled {
638
- color: var(--pui-color-gray-500) !important;
624
+ color: #6b7280 !important;
639
625
  background-color: transparent !important;
640
626
  cursor: not-allowed !important;
641
627
  opacity: 0.5;
@@ -643,30 +629,30 @@
643
629
 
644
630
  .disabled:hover {
645
631
  background-color: transparent !important;
646
- color: var(--pui-color-gray-500) !important;
632
+ color: #6b7280 !important;
647
633
  }
648
634
 
649
635
  .month-label.clickable:hover {
650
- background-color: var(--pui-bg-hover);
636
+ background-color: rgba(var(--ui-accent-rgbc), 0.1);
651
637
  }
652
638
 
653
639
  .year-button:hover:not(.disabled) {
654
- background-color: var(--pui-bg-hover);
655
- color: var(--pui-color-secondary);
640
+ background-color: rgba(var(--ui-accent-rgbc), 0.1);
641
+ color: var(--ui-accent);
656
642
  }
657
643
 
658
644
  .year-button.current-year {
659
- background-color: var(--pui-bg-active);
660
- color: var(--pui-color-secondary);
645
+ background-color: rgba(var(--ui-accent-rgbc), 0.15);
646
+ color: var(--ui-accent);
661
647
  }
662
648
 
663
649
  .year-button.selected {
664
- background-color: var(--pui-color-secondary);
665
- color: var(--pui-color-primary);
650
+ background-color: var(--ui-accent);
651
+ color: var(--ui-primary);
666
652
  }
667
653
 
668
654
  .year-button.disabled {
669
- color: var(--pui-color-gray-500) !important;
655
+ color: #6b7280 !important;
670
656
  }
671
657
  }
672
658
  </style>