@lavalogic/scoria 0.38.10 → 0.38.12

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 (115) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +46 -46
  3. package/dist/Components/AccordionGroupButton.svelte +76 -76
  4. package/dist/Components/Action.svelte +136 -136
  5. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +702 -702
  6. package/dist/Components/Base/BaseModal.svelte +125 -125
  7. package/dist/Components/Base/ContextWrapper.svelte +72 -72
  8. package/dist/Components/Base/Pagination.svelte +198 -198
  9. package/dist/Components/Base/Snippets.svelte +36 -36
  10. package/dist/Components/BigRadioSet.svelte +38 -38
  11. package/dist/Components/Bubble.svelte +101 -101
  12. package/dist/Components/Button.svelte +209 -209
  13. package/dist/Components/Checkbox.svelte +86 -86
  14. package/dist/Components/Contexts/ContextMenu.svelte +164 -164
  15. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  16. package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
  17. package/dist/Components/Contexts/ToastContainer.svelte +65 -65
  18. package/dist/Components/Contexts/Tooltip.svelte +37 -37
  19. package/dist/Components/DataMatrixIcon.svelte +112 -112
  20. package/dist/Components/DateInput.svelte +148 -148
  21. package/dist/Components/DatePicker.svelte +300 -300
  22. package/dist/Components/DesktopModal.svelte +90 -90
  23. package/dist/Components/Dial.svelte +204 -204
  24. package/dist/Components/DimensionInput.svelte +170 -170
  25. package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
  26. package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
  27. package/dist/Components/FileCard.svelte +24 -24
  28. package/dist/Components/FileUpload.svelte +236 -236
  29. package/dist/Components/GridInputSet.svelte +29 -29
  30. package/dist/Components/HorizontalTabGroup.svelte +82 -82
  31. package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
  32. package/dist/Components/Icon.svelte +128 -128
  33. package/dist/Components/Icons.js +357 -357
  34. package/dist/Components/LoadingAnimation.svelte +29 -29
  35. package/dist/Components/LoadingModal.svelte +45 -45
  36. package/dist/Components/LoadingOverlay.svelte +25 -25
  37. package/dist/Components/Modal.svelte +258 -258
  38. package/dist/Components/MultiSelect.svelte +220 -220
  39. package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
  40. package/dist/Components/Nav/NavTab.svelte +62 -62
  41. package/dist/Components/Nav/ServicesNav.svelte +80 -80
  42. package/dist/Components/NumberInput.svelte +157 -157
  43. package/dist/Components/PageHeading.svelte +25 -25
  44. package/dist/Components/PasswordInput.svelte +88 -88
  45. package/dist/Components/Portal.svelte +36 -36
  46. package/dist/Components/QuerySelect.svelte +366 -366
  47. package/dist/Components/SingleSelect.svelte +250 -250
  48. package/dist/Components/StepButton.svelte +70 -70
  49. package/dist/Components/StepForm.svelte +140 -140
  50. package/dist/Components/Switch.svelte +69 -69
  51. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
  52. package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
  53. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
  54. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +120 -120
  55. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
  56. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
  57. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
  58. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
  59. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
  60. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
  61. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
  62. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
  63. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
  64. package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
  65. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
  66. package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
  67. package/dist/Components/Table/Misc/FilterInput.svelte +37 -16
  68. package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
  69. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +71 -0
  70. package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
  71. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
  72. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +225 -0
  73. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte.d.ts +26 -0
  74. package/dist/Components/Table/Misc/UpdateViewOptionsModalProps.d.ts +21 -0
  75. package/dist/Components/Table/Misc/UpdateViewOptionsModalProps.js +1 -0
  76. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +49 -1
  77. package/dist/Components/Table/Types/Context/TableContext.svelte.js +142 -1
  78. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.d.ts +2 -2
  79. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.js +20 -2
  80. package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +9 -1
  81. package/dist/Components/Table/Types/DataRepository/ILocalDataRepository.d.ts +1 -1
  82. package/dist/Components/Table/Types/DataRepository/IRemoteDataRepository.d.ts +1 -1
  83. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +1 -1
  84. package/dist/Components/Table/Types/Persistence/DatatableView.d.ts +25 -0
  85. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  86. package/dist/Components/TextArea.svelte +130 -130
  87. package/dist/Components/TextInput.svelte +176 -176
  88. package/dist/Components/ThreeStateRadio.svelte +131 -131
  89. package/dist/Components/Touch/BoolCard.svelte +45 -45
  90. package/dist/Components/Touch/DateModal.svelte +209 -209
  91. package/dist/Components/Touch/EditCard.svelte +59 -59
  92. package/dist/Components/Touch/InfoCard.svelte +31 -31
  93. package/dist/Components/Touch/InfoTextCard.svelte +28 -28
  94. package/dist/Components/Touch/ModalExplanation.svelte +17 -17
  95. package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
  96. package/dist/Components/Touch/NumberModal.svelte +79 -79
  97. package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
  98. package/dist/Components/Touch/SummaryCard.svelte +93 -93
  99. package/dist/Components/Touch/TextAreaModal.svelte +95 -95
  100. package/dist/Components/Touch/TextModal.svelte +106 -106
  101. package/dist/Components/Touch/TouchCard.svelte +33 -33
  102. package/dist/Components/Touch/TouchModal.svelte +274 -274
  103. package/dist/Components/Touch/UtilityButton.svelte +109 -109
  104. package/dist/Components/VerticalTabGroup.svelte +79 -79
  105. package/dist/Components/VerticalTabGroupButton.svelte +58 -58
  106. package/dist/Helpers/Datamatrix.d.ts +19 -19
  107. package/dist/Helpers/Datamatrix.js +291 -291
  108. package/dist/Types/Examples/ExampleModal.svelte +35 -35
  109. package/dist/index.d.ts +1 -1
  110. package/dist/scss/_basics.scss +12 -12
  111. package/dist/scss/_colours.scss +134 -134
  112. package/dist/scss/_motion.scss +57 -57
  113. package/dist/scss/_sizing.scss +85 -85
  114. package/dist/scss/_transitions.scss +8 -8
  115. package/package.json +1 -1
@@ -1,302 +1,302 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- module
5
- lang="ts"
6
- >
7
- // Use Intl.DateTimeFormat with en-GB locale for weekday and month names.
8
- const WEEKDAY_FMT = new Intl.DateTimeFormat('en-GB', { weekday: 'long' });
9
- const MONTH_FULL_FMT = new Intl.DateTimeFormat('en-GB', { month: 'short' });
10
- const WEEKDAY = Object.freeze(
11
- Array.from({ length: 7 }, (_, i) =>
12
- // 2024-01-07 was a Sunday in UTC, so we walk days 7..13 starting Sunday.
13
- WEEKDAY_FMT.format(new Date(Date.UTC(2024, 0, 7 + i)))
14
- )
15
- );
16
- const MONTHS_VALUES = Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
17
- const MONTHS_LABELS_NUMBERED = Object.freeze([
18
- '01',
19
- '02',
20
- '03',
21
- '04',
22
- '05',
23
- '06',
24
- '07',
25
- '08',
26
- '09',
27
- '10',
28
- '11',
29
- '12',
30
- ]);
31
- const MONTHS_LABELS_NAMED = Object.freeze(
32
- Array.from({ length: 12 }, (_, i) => MONTH_FULL_FMT.format(new Date(Date.UTC(2024, i, 1))))
33
- );
34
- // HOURS and MINUTES_SECONDS are constants. Frozen at module scope so they are
35
- // not reallocated on every $derived read.
36
- const HOURS = Object.freeze(Array.from({ length: 24 }, (_, i) => i));
37
- const MINUTES_SECONDS = Object.freeze(Array.from({ length: 60 }, (_, i) => i));
38
- </script>
39
-
40
- <script lang="ts">
41
- import { devCatch } from '../Helpers/Helpers.svelte.js';
42
- import type { DateChange } from '../Types/Internal/DateChange.js';
43
- import { DatePickerType } from '../Types/Internal/DatePickerType.js';
44
- import { onMount, tick } from 'svelte';
45
- import type { DatePickerProps } from './DatePickerProps.js';
46
- import Dial from './Dial.svelte';
47
-
48
- let {
49
- date = $bindable(new Date()),
50
- yearsRange = { min: 2000, max: 2100 },
51
- autofocus = false,
52
- namedMonths,
53
- showTime,
54
- onsubmit,
55
- }: DatePickerProps = $props();
56
-
57
- let focusableElements: Array<HTMLDivElement> = [];
58
-
59
- let dayRef = $state<HTMLDivElement | undefined>();
60
- let monthRef = $state<HTMLDivElement | undefined>();
61
- let yearRef = $state<HTMLDivElement | undefined>();
62
- let hoursRef = $state<HTMLDivElement | undefined>();
63
- let minutesRef = $state<HTMLDivElement | undefined>();
64
- let secondsRef = $state<HTMLDivElement | undefined>();
65
-
66
- $effect(() => {
67
- if (showTime) {
68
- if (dayRef && monthRef && yearRef && hoursRef && minutesRef && secondsRef) {
69
- focusableElements = [dayRef, monthRef, yearRef, hoursRef, minutesRef, secondsRef];
70
- }
71
- } else {
72
- if (dayRef && monthRef && yearRef) {
73
- focusableElements = [dayRef, monthRef, yearRef];
74
- }
75
- }
76
- });
77
- const yearsCount = $derived(yearsRange.max - yearsRange.min + 1);
78
-
79
- const YEARS = $derived(Array.from({ length: yearsCount }, (_, index) => yearsRange.min + index));
80
-
81
- const year = $derived(date.getFullYear());
82
- const month = $derived(date.getMonth());
83
- const DAYS = $derived.by(() =>
84
- Array.from({ length: new Date(year, month + 1, 0).getDate() }, (_, index) => index + 1)
85
- );
86
-
87
- // Construct DialEntry arrays once per derivation. The label types
88
- // match the prior `string | number` union; numeric ranges (days,
89
- // years, hours, minutes/seconds) reuse the value as the label.
90
- const dayEntries = $derived(DAYS.map((d) => ({ value: d, label: d })));
91
- const monthEntries = $derived(
92
- MONTHS_VALUES.map((v, i) => ({
93
- value: v,
94
- label: (namedMonths ? MONTHS_LABELS_NAMED : MONTHS_LABELS_NUMBERED)[i],
95
- }))
96
- );
97
- const yearEntries = $derived(YEARS.map((y) => ({ value: y, label: y })));
98
- const hourEntries = HOURS.map((h) => ({ value: h, label: h }));
99
- const minuteSecondEntries = MINUTES_SECONDS.map((s) => ({ value: s, label: s }));
100
-
101
- const dateChanged = ({ type, changedData }: DateChange<number>) => {
102
- const newDate = (() => {
103
- if (type === DatePickerType.Day) {
104
- return new Date(
105
- date.getFullYear(),
106
- date.getMonth(),
107
- changedData,
108
- date.getHours(),
109
- date.getMinutes(),
110
- date.getSeconds()
111
- );
112
- } else if (type === DatePickerType.Month) {
113
- const maxDayInSelectedMonth = new Date(date.getFullYear(), changedData + 1, 0).getDate();
114
- const day = Math.min(date.getDate(), maxDayInSelectedMonth);
115
- return new Date(
116
- date.getFullYear(),
117
- changedData,
118
- day,
119
- date.getHours(),
120
- date.getMinutes(),
121
- date.getSeconds()
122
- );
123
- } else if (type === DatePickerType.Year) {
124
- const maxDayInSelectedMonth = new Date(changedData, date.getMonth() + 1, 0).getDate();
125
- const day = Math.min(date.getDate(), maxDayInSelectedMonth);
126
- return new Date(
127
- changedData,
128
- date.getMonth(),
129
- day,
130
- date.getHours(),
131
- date.getMinutes(),
132
- date.getSeconds()
133
- );
134
- } else if (type === DatePickerType.Hours) {
135
- return new Date(
136
- date.getFullYear(),
137
- date.getMonth(),
138
- date.getDate(),
139
- changedData,
140
- date.getMinutes(),
141
- date.getSeconds()
142
- );
143
- } else if (type === DatePickerType.Minutes) {
144
- return new Date(
145
- date.getFullYear(),
146
- date.getMonth(),
147
- date.getDate(),
148
- date.getHours(),
149
- changedData,
150
- date.getSeconds()
151
- );
152
- } else {
153
- return new Date(
154
- date.getFullYear(),
155
- date.getMonth(),
156
- date.getDate(),
157
- date.getHours(),
158
- date.getMinutes(),
159
- changedData
160
- );
161
- }
162
- })();
163
-
164
- date = newDate;
165
- };
166
-
167
- function onNext(type: DatePickerType) {
168
- switch (type) {
169
- case DatePickerType.Day:
170
- focusableElements[1]?.focus();
171
- return;
172
- case DatePickerType.Month:
173
- focusableElements[2]?.focus();
174
- return;
175
- case DatePickerType.Year: {
176
- if (showTime) {
177
- focusableElements[3]?.focus();
178
- }
179
- return;
180
- }
181
- case DatePickerType.Hours:
182
- focusableElements[4]?.focus();
183
- return;
184
- case DatePickerType.Minutes:
185
- focusableElements[5]?.focus();
186
- return;
187
- case DatePickerType.Seconds:
188
- return;
189
- }
190
- }
191
-
192
- function onPrevious(type: DatePickerType) {
193
- switch (type) {
194
- case DatePickerType.Day:
195
- return;
196
- case DatePickerType.Month:
197
- focusableElements[0]?.focus();
198
- return;
199
- case DatePickerType.Year:
200
- focusableElements[1]?.focus();
201
- return;
202
- case DatePickerType.Hours:
203
- focusableElements[2]?.focus();
204
- return;
205
- case DatePickerType.Minutes:
206
- focusableElements[3]?.focus();
207
- return;
208
- case DatePickerType.Seconds:
209
- focusableElements[4]?.focus();
210
- return;
211
- }
212
- }
213
-
214
- onMount(() => {
215
- (async () => {
216
- await tick();
217
- if (autofocus) {
218
- dayRef?.focus();
219
- }
220
- })().catch(devCatch);
221
- });
222
- </script>
223
-
224
- <div>
225
- <div class="touch-date-wrapper">
226
- <div class="date-line">
227
- {date.getDate()}
228
- {MONTHS_LABELS_NAMED[date.getMonth()]}
229
- {date.getFullYear()}
230
- </div>
231
- <p class="day-line">{WEEKDAY[date.getDay()]}</p>
232
- <div class="touch-date-picker">
233
- <Dial
234
- type={DatePickerType.Day}
235
- bind:ref={dayRef}
236
- entries={dayEntries}
237
- selected={date.getDate()}
238
- onchange={dateChanged}
239
- {onsubmit}
240
- {onPrevious}
241
- {onNext}
242
- />
243
- <Dial
244
- type={DatePickerType.Month}
245
- bind:ref={monthRef}
246
- entries={monthEntries}
247
- selected={date.getMonth()}
248
- onchange={dateChanged}
249
- {onsubmit}
250
- {onPrevious}
251
- {onNext}
252
- />
253
- <Dial
254
- bind:ref={yearRef}
255
- type={DatePickerType.Year}
256
- entries={yearEntries}
257
- selected={date.getFullYear()}
258
- onchange={dateChanged}
259
- {onsubmit}
260
- {onPrevious}
261
- {onNext}
262
- />
263
-
264
- {#if showTime}
265
- <Dial
266
- bind:ref={hoursRef}
267
- type={DatePickerType.Hours}
268
- entries={hourEntries}
269
- selected={date.getHours()}
270
- onchange={dateChanged}
271
- {onsubmit}
272
- {onPrevious}
273
- {onNext}
274
- />
275
- <Dial
276
- bind:ref={minutesRef}
277
- type={DatePickerType.Minutes}
278
- entries={minuteSecondEntries}
279
- selected={date.getMinutes()}
280
- onchange={dateChanged}
281
- {onsubmit}
282
- {onPrevious}
283
- {onNext}
284
- />
285
- <Dial
286
- bind:ref={secondsRef}
287
- type={DatePickerType.Seconds}
288
- entries={minuteSecondEntries}
289
- selected={date.getSeconds()}
290
- onchange={dateChanged}
291
- {onsubmit}
292
- {onPrevious}
293
- {onNext}
294
- />
295
- {/if}
296
- </div>
297
- </div>
298
- </div>
299
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ module
5
+ lang="ts"
6
+ >
7
+ // Use Intl.DateTimeFormat with en-GB locale for weekday and month names.
8
+ const WEEKDAY_FMT = new Intl.DateTimeFormat('en-GB', { weekday: 'long' });
9
+ const MONTH_FULL_FMT = new Intl.DateTimeFormat('en-GB', { month: 'short' });
10
+ const WEEKDAY = Object.freeze(
11
+ Array.from({ length: 7 }, (_, i) =>
12
+ // 2024-01-07 was a Sunday in UTC, so we walk days 7..13 starting Sunday.
13
+ WEEKDAY_FMT.format(new Date(Date.UTC(2024, 0, 7 + i)))
14
+ )
15
+ );
16
+ const MONTHS_VALUES = Object.freeze([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
17
+ const MONTHS_LABELS_NUMBERED = Object.freeze([
18
+ '01',
19
+ '02',
20
+ '03',
21
+ '04',
22
+ '05',
23
+ '06',
24
+ '07',
25
+ '08',
26
+ '09',
27
+ '10',
28
+ '11',
29
+ '12',
30
+ ]);
31
+ const MONTHS_LABELS_NAMED = Object.freeze(
32
+ Array.from({ length: 12 }, (_, i) => MONTH_FULL_FMT.format(new Date(Date.UTC(2024, i, 1))))
33
+ );
34
+ // HOURS and MINUTES_SECONDS are constants. Frozen at module scope so they are
35
+ // not reallocated on every $derived read.
36
+ const HOURS = Object.freeze(Array.from({ length: 24 }, (_, i) => i));
37
+ const MINUTES_SECONDS = Object.freeze(Array.from({ length: 60 }, (_, i) => i));
38
+ </script>
39
+
40
+ <script lang="ts">
41
+ import { devCatch } from '../Helpers/Helpers.svelte.js';
42
+ import type { DateChange } from '../Types/Internal/DateChange.js';
43
+ import { DatePickerType } from '../Types/Internal/DatePickerType.js';
44
+ import { onMount, tick } from 'svelte';
45
+ import type { DatePickerProps } from './DatePickerProps.js';
46
+ import Dial from './Dial.svelte';
47
+
48
+ let {
49
+ date = $bindable(new Date()),
50
+ yearsRange = { min: 2000, max: 2100 },
51
+ autofocus = false,
52
+ namedMonths,
53
+ showTime,
54
+ onsubmit,
55
+ }: DatePickerProps = $props();
56
+
57
+ let focusableElements: Array<HTMLDivElement> = [];
58
+
59
+ let dayRef = $state<HTMLDivElement | undefined>();
60
+ let monthRef = $state<HTMLDivElement | undefined>();
61
+ let yearRef = $state<HTMLDivElement | undefined>();
62
+ let hoursRef = $state<HTMLDivElement | undefined>();
63
+ let minutesRef = $state<HTMLDivElement | undefined>();
64
+ let secondsRef = $state<HTMLDivElement | undefined>();
65
+
66
+ $effect(() => {
67
+ if (showTime) {
68
+ if (dayRef && monthRef && yearRef && hoursRef && minutesRef && secondsRef) {
69
+ focusableElements = [dayRef, monthRef, yearRef, hoursRef, minutesRef, secondsRef];
70
+ }
71
+ } else {
72
+ if (dayRef && monthRef && yearRef) {
73
+ focusableElements = [dayRef, monthRef, yearRef];
74
+ }
75
+ }
76
+ });
77
+ const yearsCount = $derived(yearsRange.max - yearsRange.min + 1);
78
+
79
+ const YEARS = $derived(Array.from({ length: yearsCount }, (_, index) => yearsRange.min + index));
80
+
81
+ const year = $derived(date.getFullYear());
82
+ const month = $derived(date.getMonth());
83
+ const DAYS = $derived.by(() =>
84
+ Array.from({ length: new Date(year, month + 1, 0).getDate() }, (_, index) => index + 1)
85
+ );
86
+
87
+ // Construct DialEntry arrays once per derivation. The label types
88
+ // match the prior `string | number` union; numeric ranges (days,
89
+ // years, hours, minutes/seconds) reuse the value as the label.
90
+ const dayEntries = $derived(DAYS.map((d) => ({ value: d, label: d })));
91
+ const monthEntries = $derived(
92
+ MONTHS_VALUES.map((v, i) => ({
93
+ value: v,
94
+ label: (namedMonths ? MONTHS_LABELS_NAMED : MONTHS_LABELS_NUMBERED)[i],
95
+ }))
96
+ );
97
+ const yearEntries = $derived(YEARS.map((y) => ({ value: y, label: y })));
98
+ const hourEntries = HOURS.map((h) => ({ value: h, label: h }));
99
+ const minuteSecondEntries = MINUTES_SECONDS.map((s) => ({ value: s, label: s }));
100
+
101
+ const dateChanged = ({ type, changedData }: DateChange<number>) => {
102
+ const newDate = (() => {
103
+ if (type === DatePickerType.Day) {
104
+ return new Date(
105
+ date.getFullYear(),
106
+ date.getMonth(),
107
+ changedData,
108
+ date.getHours(),
109
+ date.getMinutes(),
110
+ date.getSeconds()
111
+ );
112
+ } else if (type === DatePickerType.Month) {
113
+ const maxDayInSelectedMonth = new Date(date.getFullYear(), changedData + 1, 0).getDate();
114
+ const day = Math.min(date.getDate(), maxDayInSelectedMonth);
115
+ return new Date(
116
+ date.getFullYear(),
117
+ changedData,
118
+ day,
119
+ date.getHours(),
120
+ date.getMinutes(),
121
+ date.getSeconds()
122
+ );
123
+ } else if (type === DatePickerType.Year) {
124
+ const maxDayInSelectedMonth = new Date(changedData, date.getMonth() + 1, 0).getDate();
125
+ const day = Math.min(date.getDate(), maxDayInSelectedMonth);
126
+ return new Date(
127
+ changedData,
128
+ date.getMonth(),
129
+ day,
130
+ date.getHours(),
131
+ date.getMinutes(),
132
+ date.getSeconds()
133
+ );
134
+ } else if (type === DatePickerType.Hours) {
135
+ return new Date(
136
+ date.getFullYear(),
137
+ date.getMonth(),
138
+ date.getDate(),
139
+ changedData,
140
+ date.getMinutes(),
141
+ date.getSeconds()
142
+ );
143
+ } else if (type === DatePickerType.Minutes) {
144
+ return new Date(
145
+ date.getFullYear(),
146
+ date.getMonth(),
147
+ date.getDate(),
148
+ date.getHours(),
149
+ changedData,
150
+ date.getSeconds()
151
+ );
152
+ } else {
153
+ return new Date(
154
+ date.getFullYear(),
155
+ date.getMonth(),
156
+ date.getDate(),
157
+ date.getHours(),
158
+ date.getMinutes(),
159
+ changedData
160
+ );
161
+ }
162
+ })();
163
+
164
+ date = newDate;
165
+ };
166
+
167
+ function onNext(type: DatePickerType) {
168
+ switch (type) {
169
+ case DatePickerType.Day:
170
+ focusableElements[1]?.focus();
171
+ return;
172
+ case DatePickerType.Month:
173
+ focusableElements[2]?.focus();
174
+ return;
175
+ case DatePickerType.Year: {
176
+ if (showTime) {
177
+ focusableElements[3]?.focus();
178
+ }
179
+ return;
180
+ }
181
+ case DatePickerType.Hours:
182
+ focusableElements[4]?.focus();
183
+ return;
184
+ case DatePickerType.Minutes:
185
+ focusableElements[5]?.focus();
186
+ return;
187
+ case DatePickerType.Seconds:
188
+ return;
189
+ }
190
+ }
191
+
192
+ function onPrevious(type: DatePickerType) {
193
+ switch (type) {
194
+ case DatePickerType.Day:
195
+ return;
196
+ case DatePickerType.Month:
197
+ focusableElements[0]?.focus();
198
+ return;
199
+ case DatePickerType.Year:
200
+ focusableElements[1]?.focus();
201
+ return;
202
+ case DatePickerType.Hours:
203
+ focusableElements[2]?.focus();
204
+ return;
205
+ case DatePickerType.Minutes:
206
+ focusableElements[3]?.focus();
207
+ return;
208
+ case DatePickerType.Seconds:
209
+ focusableElements[4]?.focus();
210
+ return;
211
+ }
212
+ }
213
+
214
+ onMount(() => {
215
+ (async () => {
216
+ await tick();
217
+ if (autofocus) {
218
+ dayRef?.focus();
219
+ }
220
+ })().catch(devCatch);
221
+ });
222
+ </script>
223
+
224
+ <div>
225
+ <div class="touch-date-wrapper">
226
+ <div class="date-line">
227
+ {date.getDate()}
228
+ {MONTHS_LABELS_NAMED[date.getMonth()]}
229
+ {date.getFullYear()}
230
+ </div>
231
+ <p class="day-line">{WEEKDAY[date.getDay()]}</p>
232
+ <div class="touch-date-picker">
233
+ <Dial
234
+ type={DatePickerType.Day}
235
+ bind:ref={dayRef}
236
+ entries={dayEntries}
237
+ selected={date.getDate()}
238
+ onchange={dateChanged}
239
+ {onsubmit}
240
+ {onPrevious}
241
+ {onNext}
242
+ />
243
+ <Dial
244
+ type={DatePickerType.Month}
245
+ bind:ref={monthRef}
246
+ entries={monthEntries}
247
+ selected={date.getMonth()}
248
+ onchange={dateChanged}
249
+ {onsubmit}
250
+ {onPrevious}
251
+ {onNext}
252
+ />
253
+ <Dial
254
+ bind:ref={yearRef}
255
+ type={DatePickerType.Year}
256
+ entries={yearEntries}
257
+ selected={date.getFullYear()}
258
+ onchange={dateChanged}
259
+ {onsubmit}
260
+ {onPrevious}
261
+ {onNext}
262
+ />
263
+
264
+ {#if showTime}
265
+ <Dial
266
+ bind:ref={hoursRef}
267
+ type={DatePickerType.Hours}
268
+ entries={hourEntries}
269
+ selected={date.getHours()}
270
+ onchange={dateChanged}
271
+ {onsubmit}
272
+ {onPrevious}
273
+ {onNext}
274
+ />
275
+ <Dial
276
+ bind:ref={minutesRef}
277
+ type={DatePickerType.Minutes}
278
+ entries={minuteSecondEntries}
279
+ selected={date.getMinutes()}
280
+ onchange={dateChanged}
281
+ {onsubmit}
282
+ {onPrevious}
283
+ {onNext}
284
+ />
285
+ <Dial
286
+ bind:ref={secondsRef}
287
+ type={DatePickerType.Seconds}
288
+ entries={minuteSecondEntries}
289
+ selected={date.getSeconds()}
290
+ onchange={dateChanged}
291
+ {onsubmit}
292
+ {onPrevious}
293
+ {onNext}
294
+ />
295
+ {/if}
296
+ </div>
297
+ </div>
298
+ </div>
299
+
300
300
  <style>.touch-date-wrapper {
301
301
  display: flex;
302
302
  justify-content: center;
@@ -316,4 +316,4 @@
316
316
 
317
317
  .day-line {
318
318
  margin: 2px;
319
- }</style>
319
+ }</style>