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