@hkdigital/lib-sveltekit 0.2.8 → 0.2.10

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 (246) hide show
  1. package/README.md +135 -135
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/cache/IndexedDbCache.js +1407 -1407
  5. package/dist/classes/cache/MemoryResponseCache.js +138 -138
  6. package/dist/classes/cache/index.js +5 -5
  7. package/dist/classes/cache/typedef.js +41 -41
  8. package/dist/classes/data/IterableTree.js +243 -243
  9. package/dist/classes/data/Selector.js +190 -190
  10. package/dist/classes/data/index.js +2 -2
  11. package/dist/classes/events/EventEmitter.js +275 -275
  12. package/dist/classes/events/index.js +2 -2
  13. package/dist/classes/index.js +4 -4
  14. package/dist/classes/logging/Logger.js +158 -158
  15. package/dist/classes/logging/constants.js +18 -18
  16. package/dist/classes/logging/index.js +4 -4
  17. package/dist/classes/promise/HkPromise.js +377 -377
  18. package/dist/classes/promise/index.js +1 -1
  19. package/dist/classes/services/ServiceBase.js +409 -409
  20. package/dist/classes/services/ServiceManager.js +1114 -1114
  21. package/dist/classes/services/constants.js +12 -12
  22. package/dist/classes/services/index.js +5 -5
  23. package/dist/classes/stores/SubscribersCount.js +107 -107
  24. package/dist/classes/stores/index.js +1 -1
  25. package/dist/classes/streams/LogTransformStream.js +19 -19
  26. package/dist/classes/streams/ServerEventsStore.js +110 -110
  27. package/dist/classes/streams/TimeStampSource.js +26 -26
  28. package/dist/classes/streams/index.js +3 -3
  29. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  30. package/dist/classes/svelte/audio/AudioScene.svelte.js +324 -324
  31. package/dist/classes/svelte/audio/mocks.js +35 -35
  32. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  33. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  34. package/dist/classes/svelte/image/ImageLoader.svelte.js +45 -45
  35. package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
  36. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  37. package/dist/classes/svelte/image/index.js +4 -4
  38. package/dist/classes/svelte/image/mocks.js +35 -35
  39. package/dist/classes/svelte/image/typedef.js +8 -8
  40. package/dist/classes/svelte/index.js +14 -14
  41. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  42. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  43. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  44. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +338 -338
  45. package/dist/classes/svelte/network-loader/constants.js +3 -3
  46. package/dist/classes/svelte/network-loader/index.js +3 -3
  47. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  48. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  49. package/dist/components/area/HkArea.svelte +49 -49
  50. package/dist/components/area/HkGridArea.svelte +77 -77
  51. package/dist/components/area/index.js +2 -2
  52. package/dist/components/buttons/button/Button.svelte +82 -82
  53. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  54. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  55. package/dist/components/buttons/index.js +3 -3
  56. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  57. package/dist/components/debug/index.js +1 -1
  58. package/dist/components/drag-drop/DragController.js +44 -44
  59. package/dist/components/drag-drop/DragDropContext.svelte +111 -110
  60. package/dist/components/drag-drop/Draggable.svelte +502 -512
  61. package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +258 -258
  62. package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
  63. package/dist/components/drag-drop/DropZoneList.svelte +125 -125
  64. package/dist/components/drag-drop/actions.d.ts +9 -0
  65. package/dist/components/drag-drop/actions.js +26 -0
  66. package/dist/components/drag-drop/drag-state.svelte.d.ts +3 -1
  67. package/dist/components/drag-drop/drag-state.svelte.js +322 -319
  68. package/dist/components/drag-drop/drag-state.svelte.js__ +319 -0
  69. package/dist/components/drag-drop/index.js +7 -7
  70. package/dist/components/drag-drop/util.d.ts +0 -32
  71. package/dist/components/drag-drop/util.js +85 -85
  72. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  73. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  74. package/dist/components/icons/HkIcon.svelte +86 -86
  75. package/dist/components/icons/HkTabIcon.svelte +116 -116
  76. package/dist/components/icons/SteezeIcon.svelte +97 -97
  77. package/dist/components/icons/index.js +6 -6
  78. package/dist/components/icons/typedef.js +16 -16
  79. package/dist/components/index.js +2 -2
  80. package/dist/components/inputs/index.js +1 -1
  81. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  82. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  83. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  84. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  85. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  86. package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
  87. package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  88. package/dist/components/layout/grid-layers/util.js +74 -74
  89. package/dist/components/layout/index.js +1 -1
  90. package/dist/components/panels/index.js +1 -1
  91. package/dist/components/panels/panel/Panel.svelte +43 -43
  92. package/dist/components/rows/index.js +3 -3
  93. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  94. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  95. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  96. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  97. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  98. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  99. package/dist/components/tab-bar/index.js +17 -17
  100. package/dist/components/tab-bar/typedef.js +11 -11
  101. package/dist/config/imagetools-config.js +189 -189
  102. package/dist/config/imagetools.d.ts +72 -72
  103. package/dist/constants/bases.js +13 -13
  104. package/dist/constants/errors/api.js +9 -9
  105. package/dist/constants/errors/generic.js +5 -5
  106. package/dist/constants/errors/index.js +3 -3
  107. package/dist/constants/errors/jwt.js +5 -5
  108. package/dist/constants/http/headers.js +6 -6
  109. package/dist/constants/http/index.js +2 -2
  110. package/dist/constants/http/methods.js +2 -2
  111. package/dist/constants/index.js +3 -3
  112. package/dist/constants/mime/application.js +5 -5
  113. package/dist/constants/mime/audio.js +13 -13
  114. package/dist/constants/mime/image.js +3 -3
  115. package/dist/constants/mime/index.js +4 -4
  116. package/dist/constants/mime/text.js +2 -2
  117. package/dist/constants/regexp/index.js +31 -31
  118. package/dist/constants/regexp/inspiratie.js__ +95 -95
  119. package/dist/constants/regexp/text.js +49 -49
  120. package/dist/constants/regexp/user.js +32 -32
  121. package/dist/constants/regexp/web.js +3 -3
  122. package/dist/constants/state-labels/drag-states.js +6 -6
  123. package/dist/constants/state-labels/drop-states.js +6 -6
  124. package/dist/constants/state-labels/input-states.js +11 -11
  125. package/dist/constants/state-labels/submit-states.js +4 -4
  126. package/dist/constants/time.js +28 -28
  127. package/dist/css/utilities.css +43 -43
  128. package/dist/design/design-config.js +73 -73
  129. package/dist/design/tailwind-theme-extend.js +158 -158
  130. package/dist/features/button-group/ButtonGroup.svelte +82 -82
  131. package/dist/features/button-group/typedef.js +10 -10
  132. package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
  133. package/dist/features/compare-left-right/index.js +1 -1
  134. package/dist/features/game-box/GameBox.svelte +577 -577
  135. package/dist/features/game-box/gamebox.util.js +83 -83
  136. package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  137. package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
  138. package/dist/features/image-box/ImageBox.svelte +210 -210
  139. package/dist/features/image-box/index.js +5 -5
  140. package/dist/features/image-box/typedef.js +32 -32
  141. package/dist/features/index.js +23 -23
  142. package/dist/features/presenter/ImageSlide.svelte +64 -64
  143. package/dist/features/presenter/Presenter.state.svelte.js +638 -638
  144. package/dist/features/presenter/Presenter.svelte +142 -142
  145. package/dist/features/presenter/constants.js +7 -7
  146. package/dist/features/presenter/index.js +10 -10
  147. package/dist/features/presenter/typedef.js +106 -106
  148. package/dist/features/presenter/util.js +210 -210
  149. package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
  150. package/dist/schemas/index.js +1 -1
  151. package/dist/schemas/validate-url.js +180 -180
  152. package/dist/server/index.js +1 -1
  153. package/dist/server/logger.js +94 -94
  154. package/dist/states/index.js +1 -1
  155. package/dist/states/navigation.svelte.js +55 -55
  156. package/dist/stores/index.js +1 -1
  157. package/dist/stores/theme.js +80 -80
  158. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  159. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  160. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  161. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  162. package/dist/themes/hkdev/components/buttons/button.css +146 -146
  163. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  164. package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
  165. package/dist/themes/hkdev/components/drag-drop/drop-zone.css +48 -48
  166. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  167. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  168. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  169. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  170. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  171. package/dist/themes/hkdev/components.css +53 -53
  172. package/dist/themes/hkdev/debug.css +1 -1
  173. package/dist/themes/hkdev/global/layout.css +39 -39
  174. package/dist/themes/hkdev/global/on-colors.css +53 -53
  175. package/dist/themes/hkdev/globals.css +11 -11
  176. package/dist/themes/hkdev/responsive.css +12 -12
  177. package/dist/themes/hkdev/theme-ext.js +15 -15
  178. package/dist/themes/hkdev/theme.js +235 -235
  179. package/dist/themes/index.js +1 -1
  180. package/dist/typedef/context.js +6 -6
  181. package/dist/typedef/drag.js +25 -25
  182. package/dist/typedef/drop.js +12 -12
  183. package/dist/typedef/image.js +38 -38
  184. package/dist/typedef/index.js +4 -4
  185. package/dist/util/array/index.js +436 -436
  186. package/dist/util/bases/base58.js +262 -262
  187. package/dist/util/bases/index.js +1 -1
  188. package/dist/util/compare/index.js +247 -247
  189. package/dist/util/css/css-vars.js +83 -83
  190. package/dist/util/css/index.js +1 -1
  191. package/dist/util/design-system/components/states.js +22 -22
  192. package/dist/util/design-system/css/clamp.js +66 -66
  193. package/dist/util/design-system/css/root-design-vars.js +102 -102
  194. package/dist/util/design-system/index.js +5 -5
  195. package/dist/util/design-system/layout/scaling.js +228 -228
  196. package/dist/util/design-system/skeleton.js +208 -208
  197. package/dist/util/design-system/tailwind.js +288 -288
  198. package/dist/util/env/index.js +9 -9
  199. package/dist/util/expect/arrays.js +47 -47
  200. package/dist/util/expect/index.js +259 -259
  201. package/dist/util/expect/primitives.js +55 -55
  202. package/dist/util/expect/url.js +60 -60
  203. package/dist/util/function/index.js +218 -218
  204. package/dist/util/geo/index.js +26 -26
  205. package/dist/util/http/caching.js +263 -263
  206. package/dist/util/http/errors.js +97 -97
  207. package/dist/util/http/headers.js +75 -75
  208. package/dist/util/http/http-request.js +379 -379
  209. package/dist/util/http/index.js +22 -22
  210. package/dist/util/http/json-request.js +224 -224
  211. package/dist/util/http/mocks.js +65 -65
  212. package/dist/util/http/response.js +294 -294
  213. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  214. package/dist/util/http/typedef.js +93 -93
  215. package/dist/util/http/url.js +52 -52
  216. package/dist/util/image/index.js +86 -86
  217. package/dist/util/index.js +2 -2
  218. package/dist/util/is/index.js +140 -140
  219. package/dist/util/iterate/index.js +234 -234
  220. package/dist/util/object/index.js +1361 -1361
  221. package/dist/util/singleton/index.js +97 -97
  222. package/dist/util/string/array-path.js +75 -75
  223. package/dist/util/string/convert.js +54 -54
  224. package/dist/util/string/fs.js +226 -226
  225. package/dist/util/string/index.js +5 -5
  226. package/dist/util/string/interpolate.js +61 -61
  227. package/dist/util/string/pad.js +10 -10
  228. package/dist/util/svelte/index.js +4 -4
  229. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  230. package/dist/util/svelte/observe/index.js +49 -49
  231. package/dist/util/svelte/state-context/index.js +117 -117
  232. package/dist/util/svelte/wait/index.js +38 -38
  233. package/dist/util/sveltekit/index.js +1 -1
  234. package/dist/util/sveltekit/route-folders/index.js +101 -101
  235. package/dist/util/time/index.js +323 -323
  236. package/dist/util/unique/index.js +249 -249
  237. package/dist/valibot/date.js__ +10 -10
  238. package/dist/valibot/index.js +9 -9
  239. package/dist/valibot/url.js +95 -95
  240. package/dist/valibot/user.js +23 -23
  241. package/dist/zod/all.js +33 -33
  242. package/dist/zod/generic.js +11 -11
  243. package/dist/zod/javascript.js +32 -32
  244. package/dist/zod/user.js +16 -16
  245. package/dist/zod/web.js +52 -52
  246. package/package.json +112 -112
@@ -1,223 +1,223 @@
1
- <script>
2
- import IconValid from './assets/IconValid.svelte';
3
- import IconInvalid from './assets/IconInvalid.svelte';
4
-
5
- import { Star, ExclamationTriangle, CheckCircle } from '@steeze-ui/heroicons';
6
-
7
- import { HkIcon } from '../../icons/index.js';
8
-
9
- import {
10
- PRISTINE,
11
- DIRTY,
12
- FOCUSED,
13
- UNFOCUSED,
14
- VALID,
15
- INVALID,
16
- REQUIRED,
17
- DISABLED
18
- } from '../../../constants/state-labels/input-states.js';
19
-
20
- /**
21
- * @type {{
22
- * base?: string,
23
- * borderShape?: string,
24
- * classes?: string,
25
- * inputBase?: string,
26
- * inputClasses?: string,
27
- * legendBase?: string,
28
- * legendClasses?: string,
29
- * iconClasses?: string,
30
- * initialValue?: string,
31
- * value?: string,
32
- * type?: 'text' | 'url' | 'email' | 'number',
33
- * pattern?: string,
34
- * required?: boolean,
35
- * title?: string,
36
- * placeholder?: string,
37
- * isValid?: boolean,
38
- * isPristine?: boolean,
39
- * hasFocus?: boolean,
40
- * validate?: (value: string) => string | undefined,
41
- * iconRequired?: import('svelte').Snippet,
42
- * iconValid?: import('svelte').Snippet,
43
- * iconInvalid?: import('svelte').Snippet
44
- * } & { [attr: string]: any }}
45
- */
46
- let {
47
- initialValue = '',
48
- value = $bindable(''),
49
-
50
- isValid = $bindable(true),
51
- isPristine = $bindable(true),
52
- hasFocus = $bindable(false),
53
-
54
- // Fieldset
55
- base = 'px-10p pb-10p',
56
- borderShape = 'border-1p rounded-xs',
57
-
58
- classes = '',
59
-
60
- // Input
61
- inputBase = 'w-full outline-none border-none bg-transparent',
62
- inputClasses,
63
-
64
- // Legend
65
- legendBase,
66
- legendClasses,
67
-
68
- // Icon
69
- iconBase = 'w-[24px] h-[24px]',
70
- iconClasses = '',
71
-
72
- // Input type and built-in validation
73
-
74
- type = 'text',
75
- required = false,
76
- disabled = false,
77
-
78
- title = '',
79
- placeholder = '',
80
-
81
- // legend = 'Invalid',
82
- // legendInvalid?
83
-
84
- iconRequired,
85
- iconValid,
86
- iconInvalid,
87
-
88
- validate,
89
-
90
- ...attrs
91
- } = $props();
92
-
93
- let inputRef = $state();
94
- let validationMessage = $state('');
95
-
96
- $effect(() => {
97
- if (!inputRef) return;
98
- validateInput(inputRef, initialValue);
99
- value = initialValue;
100
- });
101
-
102
- function validateInput(input, currentValue) {
103
- input.setCustomValidity('');
104
- const isBuiltInValid = input.checkValidity();
105
-
106
- if (isBuiltInValid && validate) {
107
- const customError = validate(currentValue);
108
- input.setCustomValidity(customError || '');
109
- }
110
-
111
- isPristine = currentValue === initialValue;
112
- isValid = input.validity.valid;
113
- validationMessage = input.validationMessage;
114
- }
115
-
116
- function handleInput(event) {
117
- validateInput(event.target, event.target.value);
118
- }
119
-
120
- // let legendHeight = $state(0);
121
-
122
- // let paddingBottomStyle = $derived.by(() => {
123
- // return `padding-bottom: ${legendHeight / 2}px;`;
124
- // });
125
-
126
- let hideLegendStyle = $derived.by(() => {
127
- if (isValid && !title) {
128
- return 'width: 0;';
129
- }
130
- });
131
-
132
- let stateClasses = $derived.by(() => {
133
- //
134
- // Return CSS classes that indicate the component's state
135
- //
136
- // @see $lib/constants/state-labels
137
- //
138
- const outArr = [];
139
-
140
- outArr.push(isPristine ? PRISTINE : DIRTY);
141
- outArr.push(hasFocus ? FOCUSED : UNFOCUSED);
142
- outArr.push(isValid ? VALID : INVALID);
143
-
144
- if (required) {
145
- outArr.push(REQUIRED);
146
- }
147
-
148
- if (disabled) {
149
- outArr.push(DISABLED);
150
- }
151
-
152
- return outArr.join(' ');
153
- });
154
- </script>
155
-
156
- <!-- {#snippet defaultWarning()}
157
- <WarningIcon />
158
- {/snippet} -->
159
-
160
- <fieldset
161
- data-input="text-input"
162
- class="{base} {borderShape} {classes} {stateClasses}"
163
- >
164
- <legend
165
- data-child="legend"
166
- class="{legendBase} {legendClasses}"
167
- style={hideLegendStyle}
168
- >
169
- {#if title}
170
- {title}
171
- <!-- {:else if !isValid}
172
- {invalidTitle} -->
173
- {:else}
174
- &nbsp;
175
- {/if}
176
- </legend>
177
-
178
- <div class="grid grid-cols-[1fr_auto] items-center">
179
- <input
180
- data-child="input"
181
- bind:this={inputRef}
182
- {type}
183
- {required}
184
- {disabled}
185
- bind:value
186
- {placeholder}
187
- class="{inputBase} {inputClasses}"
188
- aria-invalid={!isValid}
189
- aria-errormessage={!isValid ? 'validation-message' : undefined}
190
- oninput={handleInput}
191
- onfocus={() => {
192
- hasFocus = true;
193
- }}
194
- onblur={() => {
195
- hasFocus = false;
196
- }}
197
- {...attrs}
198
- />
199
-
200
- <div data-child="icon-box" class="{iconBase} {iconClasses}">
201
- {#if isPristine && required}
202
- {#if iconRequired}
203
- {@render iconRequired()}
204
- {:else}
205
- <HkIcon src={Star} theme="solid" />
206
- {/if}
207
- {:else if isValid}
208
- {#if iconValid}
209
- {@render iconValid()}
210
- {:else}
211
- <HkIcon src={CheckCircle} theme="solid" />
212
- {/if}
213
- {:else if iconInvalid}
214
- {@render iconInvalid()}
215
- {:else}
216
- <HkIcon src={ExclamationTriangle} theme="solid" />
217
- {/if}
218
- </div>
219
- </div>
220
- </fieldset>
221
-
222
- <style>
223
- </style>
1
+ <script>
2
+ import IconValid from './assets/IconValid.svelte';
3
+ import IconInvalid from './assets/IconInvalid.svelte';
4
+
5
+ import { Star, ExclamationTriangle, CheckCircle } from '@steeze-ui/heroicons';
6
+
7
+ import { HkIcon } from '../../icons/index.js';
8
+
9
+ import {
10
+ PRISTINE,
11
+ DIRTY,
12
+ FOCUSED,
13
+ UNFOCUSED,
14
+ VALID,
15
+ INVALID,
16
+ REQUIRED,
17
+ DISABLED
18
+ } from '../../../constants/state-labels/input-states.js';
19
+
20
+ /**
21
+ * @type {{
22
+ * base?: string,
23
+ * borderShape?: string,
24
+ * classes?: string,
25
+ * inputBase?: string,
26
+ * inputClasses?: string,
27
+ * legendBase?: string,
28
+ * legendClasses?: string,
29
+ * iconClasses?: string,
30
+ * initialValue?: string,
31
+ * value?: string,
32
+ * type?: 'text' | 'url' | 'email' | 'number',
33
+ * pattern?: string,
34
+ * required?: boolean,
35
+ * title?: string,
36
+ * placeholder?: string,
37
+ * isValid?: boolean,
38
+ * isPristine?: boolean,
39
+ * hasFocus?: boolean,
40
+ * validate?: (value: string) => string | undefined,
41
+ * iconRequired?: import('svelte').Snippet,
42
+ * iconValid?: import('svelte').Snippet,
43
+ * iconInvalid?: import('svelte').Snippet
44
+ * } & { [attr: string]: any }}
45
+ */
46
+ let {
47
+ initialValue = '',
48
+ value = $bindable(''),
49
+
50
+ isValid = $bindable(true),
51
+ isPristine = $bindable(true),
52
+ hasFocus = $bindable(false),
53
+
54
+ // Fieldset
55
+ base = 'px-10p pb-10p',
56
+ borderShape = 'border-1p rounded-xs',
57
+
58
+ classes = '',
59
+
60
+ // Input
61
+ inputBase = 'w-full outline-none border-none bg-transparent',
62
+ inputClasses,
63
+
64
+ // Legend
65
+ legendBase,
66
+ legendClasses,
67
+
68
+ // Icon
69
+ iconBase = 'w-[24px] h-[24px]',
70
+ iconClasses = '',
71
+
72
+ // Input type and built-in validation
73
+
74
+ type = 'text',
75
+ required = false,
76
+ disabled = false,
77
+
78
+ title = '',
79
+ placeholder = '',
80
+
81
+ // legend = 'Invalid',
82
+ // legendInvalid?
83
+
84
+ iconRequired,
85
+ iconValid,
86
+ iconInvalid,
87
+
88
+ validate,
89
+
90
+ ...attrs
91
+ } = $props();
92
+
93
+ let inputRef = $state();
94
+ let validationMessage = $state('');
95
+
96
+ $effect(() => {
97
+ if (!inputRef) return;
98
+ validateInput(inputRef, initialValue);
99
+ value = initialValue;
100
+ });
101
+
102
+ function validateInput(input, currentValue) {
103
+ input.setCustomValidity('');
104
+ const isBuiltInValid = input.checkValidity();
105
+
106
+ if (isBuiltInValid && validate) {
107
+ const customError = validate(currentValue);
108
+ input.setCustomValidity(customError || '');
109
+ }
110
+
111
+ isPristine = currentValue === initialValue;
112
+ isValid = input.validity.valid;
113
+ validationMessage = input.validationMessage;
114
+ }
115
+
116
+ function handleInput(event) {
117
+ validateInput(event.target, event.target.value);
118
+ }
119
+
120
+ // let legendHeight = $state(0);
121
+
122
+ // let paddingBottomStyle = $derived.by(() => {
123
+ // return `padding-bottom: ${legendHeight / 2}px;`;
124
+ // });
125
+
126
+ let hideLegendStyle = $derived.by(() => {
127
+ if (isValid && !title) {
128
+ return 'width: 0;';
129
+ }
130
+ });
131
+
132
+ let stateClasses = $derived.by(() => {
133
+ //
134
+ // Return CSS classes that indicate the component's state
135
+ //
136
+ // @see $lib/constants/state-labels
137
+ //
138
+ const outArr = [];
139
+
140
+ outArr.push(isPristine ? PRISTINE : DIRTY);
141
+ outArr.push(hasFocus ? FOCUSED : UNFOCUSED);
142
+ outArr.push(isValid ? VALID : INVALID);
143
+
144
+ if (required) {
145
+ outArr.push(REQUIRED);
146
+ }
147
+
148
+ if (disabled) {
149
+ outArr.push(DISABLED);
150
+ }
151
+
152
+ return outArr.join(' ');
153
+ });
154
+ </script>
155
+
156
+ <!-- {#snippet defaultWarning()}
157
+ <WarningIcon />
158
+ {/snippet} -->
159
+
160
+ <fieldset
161
+ data-input="text-input"
162
+ class="{base} {borderShape} {classes} {stateClasses}"
163
+ >
164
+ <legend
165
+ data-child="legend"
166
+ class="{legendBase} {legendClasses}"
167
+ style={hideLegendStyle}
168
+ >
169
+ {#if title}
170
+ {title}
171
+ <!-- {:else if !isValid}
172
+ {invalidTitle} -->
173
+ {:else}
174
+ &nbsp;
175
+ {/if}
176
+ </legend>
177
+
178
+ <div class="grid grid-cols-[1fr_auto] items-center">
179
+ <input
180
+ data-child="input"
181
+ bind:this={inputRef}
182
+ {type}
183
+ {required}
184
+ {disabled}
185
+ bind:value
186
+ {placeholder}
187
+ class="{inputBase} {inputClasses}"
188
+ aria-invalid={!isValid}
189
+ aria-errormessage={!isValid ? 'validation-message' : undefined}
190
+ oninput={handleInput}
191
+ onfocus={() => {
192
+ hasFocus = true;
193
+ }}
194
+ onblur={() => {
195
+ hasFocus = false;
196
+ }}
197
+ {...attrs}
198
+ />
199
+
200
+ <div data-child="icon-box" class="{iconBase} {iconClasses}">
201
+ {#if isPristine && required}
202
+ {#if iconRequired}
203
+ {@render iconRequired()}
204
+ {:else}
205
+ <HkIcon src={Star} theme="solid" />
206
+ {/if}
207
+ {:else if isValid}
208
+ {#if iconValid}
209
+ {@render iconValid()}
210
+ {:else}
211
+ <HkIcon src={CheckCircle} theme="solid" />
212
+ {/if}
213
+ {:else if iconInvalid}
214
+ {@render iconInvalid()}
215
+ {:else}
216
+ <HkIcon src={ExclamationTriangle} theme="solid" />
217
+ {/if}
218
+ </div>
219
+ </div>
220
+ </fieldset>
221
+
222
+ <style>
223
+ </style>
@@ -1,83 +1,83 @@
1
- <script>
2
- /**
3
- * @type {{
4
- * classes?: string,
5
- * fieldClasses?: string,
6
- * legendClasses?: string,
7
- * legendTitle?: string,
8
- * error?: boolean,
9
- * type?: string,
10
- * placeholder: string,
11
- * required: boolean,
12
- * snippetWarning?: import('svelte').Snippet,
13
- * } & { [attr: string]: any }}
14
- */
15
- let {
16
- // Style
17
- classes,
18
- fieldClasses,
19
- legendClasses,
20
-
21
- // Functionality
22
- name,
23
- disabled,
24
- required,
25
-
26
- // initialValue
27
- // value
28
- // readonly
29
- // pattern
30
- // minlength
31
- // maxlength
32
-
33
- // Text placeholders
34
- legendTitle,
35
- placeholder,
36
-
37
- type,
38
- snippetWarning,
39
-
40
- // Attributes
41
- ...attrs
42
- } = $props();
43
- </script>
44
-
45
- {#snippet defaultWarning()}
46
- <svg
47
- width="17"
48
- height="16"
49
- viewBox="0 0 17 16"
50
- fill="none"
51
- xmlns="http://www.w3.org/2000/svg"
52
- >
53
- <path
54
- fill-rule="evenodd"
55
- clip-rule="evenodd"
56
- d="M6.36747 1.28014C7.3152 -0.426712 9.68492 -0.426712 10.6318 1.28014L16.6669 12.1596C17.6138 13.8664 16.429 16 14.5343 16H2.46497C0.570331 16 -0.613713 13.8664 0.333194 12.1596L6.36665 1.28014H6.36747ZM8.50006 5.75805C8.66328 5.75805 8.81981 5.82549 8.93522 5.94553C9.05063 6.06556 9.11547 6.22837 9.11547 6.39812V9.59846C9.11547 9.76822 9.05063 9.93102 8.93522 10.0511C8.81981 10.1711 8.66328 10.2385 8.50006 10.2385C8.33684 10.2385 8.18031 10.1711 8.0649 10.0511C7.94949 9.93102 7.88465 9.76822 7.88465 9.59846V6.39812C7.88465 6.22837 7.94949 6.06556 8.0649 5.94553C8.18031 5.82549 8.33684 5.75805 8.50006 5.75805ZM8.50006 12.7988C8.66328 12.7988 8.81981 12.7314 8.93522 12.6113C9.05063 12.4913 9.11547 12.3285 9.11547 12.1587C9.11547 11.989 9.05063 11.8262 8.93522 11.7061C8.81981 11.5861 8.66328 11.5187 8.50006 11.5187C8.33684 11.5187 8.18031 11.5861 8.0649 11.7061C7.94949 11.8262 7.88465 11.989 7.88465 12.1587C7.88465 12.3285 7.94949 12.4913 8.0649 12.6113C8.18031 12.7314 8.33684 12.7988 8.50006 12.7988Z"
57
- fill="#F8705E"
58
- />
59
- </svg>
60
- {/snippet}
61
-
62
- <fieldset
63
- data-input="text-input"
64
- class="flex w-full items-center rounded {fieldClasses}"
65
- >
66
- <legend class="px-2 {legendClasses}" class:error>{legendTitle}</legend>
67
- <input
68
- class="w-full border-none bg-transparent {classes}"
69
- {type}
70
- {placeholder}
71
- {name}
72
- {required}
73
- {...attrs}
74
- />
75
- {#if error}
76
- {#if snippetWarning}
77
- {@render snippetWarning()}
78
- {:else}
79
- {@render defaultWarning()}
80
- {/if}
81
- <!-- <img src={warningSymbol} class="mb-2 mr-8" alt="Warning" /> -->
82
- {/if}
83
- </fieldset>
1
+ <script>
2
+ /**
3
+ * @type {{
4
+ * classes?: string,
5
+ * fieldClasses?: string,
6
+ * legendClasses?: string,
7
+ * legendTitle?: string,
8
+ * error?: boolean,
9
+ * type?: string,
10
+ * placeholder: string,
11
+ * required: boolean,
12
+ * snippetWarning?: import('svelte').Snippet,
13
+ * } & { [attr: string]: any }}
14
+ */
15
+ let {
16
+ // Style
17
+ classes,
18
+ fieldClasses,
19
+ legendClasses,
20
+
21
+ // Functionality
22
+ name,
23
+ disabled,
24
+ required,
25
+
26
+ // initialValue
27
+ // value
28
+ // readonly
29
+ // pattern
30
+ // minlength
31
+ // maxlength
32
+
33
+ // Text placeholders
34
+ legendTitle,
35
+ placeholder,
36
+
37
+ type,
38
+ snippetWarning,
39
+
40
+ // Attributes
41
+ ...attrs
42
+ } = $props();
43
+ </script>
44
+
45
+ {#snippet defaultWarning()}
46
+ <svg
47
+ width="17"
48
+ height="16"
49
+ viewBox="0 0 17 16"
50
+ fill="none"
51
+ xmlns="http://www.w3.org/2000/svg"
52
+ >
53
+ <path
54
+ fill-rule="evenodd"
55
+ clip-rule="evenodd"
56
+ d="M6.36747 1.28014C7.3152 -0.426712 9.68492 -0.426712 10.6318 1.28014L16.6669 12.1596C17.6138 13.8664 16.429 16 14.5343 16H2.46497C0.570331 16 -0.613713 13.8664 0.333194 12.1596L6.36665 1.28014H6.36747ZM8.50006 5.75805C8.66328 5.75805 8.81981 5.82549 8.93522 5.94553C9.05063 6.06556 9.11547 6.22837 9.11547 6.39812V9.59846C9.11547 9.76822 9.05063 9.93102 8.93522 10.0511C8.81981 10.1711 8.66328 10.2385 8.50006 10.2385C8.33684 10.2385 8.18031 10.1711 8.0649 10.0511C7.94949 9.93102 7.88465 9.76822 7.88465 9.59846V6.39812C7.88465 6.22837 7.94949 6.06556 8.0649 5.94553C8.18031 5.82549 8.33684 5.75805 8.50006 5.75805ZM8.50006 12.7988C8.66328 12.7988 8.81981 12.7314 8.93522 12.6113C9.05063 12.4913 9.11547 12.3285 9.11547 12.1587C9.11547 11.989 9.05063 11.8262 8.93522 11.7061C8.81981 11.5861 8.66328 11.5187 8.50006 11.5187C8.33684 11.5187 8.18031 11.5861 8.0649 11.7061C7.94949 11.8262 7.88465 11.989 7.88465 12.1587C7.88465 12.3285 7.94949 12.4913 8.0649 12.6113C8.18031 12.7314 8.33684 12.7988 8.50006 12.7988Z"
57
+ fill="#F8705E"
58
+ />
59
+ </svg>
60
+ {/snippet}
61
+
62
+ <fieldset
63
+ data-input="text-input"
64
+ class="flex w-full items-center rounded {fieldClasses}"
65
+ >
66
+ <legend class="px-2 {legendClasses}" class:error>{legendTitle}</legend>
67
+ <input
68
+ class="w-full border-none bg-transparent {classes}"
69
+ {type}
70
+ {placeholder}
71
+ {name}
72
+ {required}
73
+ {...attrs}
74
+ />
75
+ {#if error}
76
+ {#if snippetWarning}
77
+ {@render snippetWarning()}
78
+ {:else}
79
+ {@render defaultWarning()}
80
+ {/if}
81
+ <!-- <img src={warningSymbol} class="mb-2 mr-8" alt="Warning" /> -->
82
+ {/if}
83
+ </fieldset>
@@ -1,14 +1,14 @@
1
- <svg
2
- width="17"
3
- height="16"
4
- viewBox="0 0 17 16"
5
- fill="none"
6
- xmlns="http://www.w3.org/2000/svg"
7
- >
8
- <path
9
- fill-rule="evenodd"
10
- clip-rule="evenodd"
11
- d="M6.36747 1.28014C7.3152 -0.426712 9.68492 -0.426712 10.6318 1.28014L16.6669 12.1596C17.6138 13.8664 16.429 16 14.5343 16H2.46497C0.570331 16 -0.613713 13.8664 0.333194 12.1596L6.36665 1.28014H6.36747ZM8.50006 5.75805C8.66328 5.75805 8.81981 5.82549 8.93522 5.94553C9.05063 6.06556 9.11547 6.22837 9.11547 6.39812V9.59846C9.11547 9.76822 9.05063 9.93102 8.93522 10.0511C8.81981 10.1711 8.66328 10.2385 8.50006 10.2385C8.33684 10.2385 8.18031 10.1711 8.0649 10.0511C7.94949 9.93102 7.88465 9.76822 7.88465 9.59846V6.39812C7.88465 6.22837 7.94949 6.06556 8.0649 5.94553C8.18031 5.82549 8.33684 5.75805 8.50006 5.75805ZM8.50006 12.7988C8.66328 12.7988 8.81981 12.7314 8.93522 12.6113C9.05063 12.4913 9.11547 12.3285 9.11547 12.1587C9.11547 11.989 9.05063 11.8262 8.93522 11.7061C8.81981 11.5861 8.66328 11.5187 8.50006 11.5187C8.33684 11.5187 8.18031 11.5861 8.0649 11.7061C7.94949 11.8262 7.88465 11.989 7.88465 12.1587C7.88465 12.3285 7.94949 12.4913 8.0649 12.6113C8.18031 12.7314 8.33684 12.7988 8.50006 12.7988Z"
12
- fill="currentColor"
13
- />
14
- </svg>
1
+ <svg
2
+ width="17"
3
+ height="16"
4
+ viewBox="0 0 17 16"
5
+ fill="none"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ >
8
+ <path
9
+ fill-rule="evenodd"
10
+ clip-rule="evenodd"
11
+ d="M6.36747 1.28014C7.3152 -0.426712 9.68492 -0.426712 10.6318 1.28014L16.6669 12.1596C17.6138 13.8664 16.429 16 14.5343 16H2.46497C0.570331 16 -0.613713 13.8664 0.333194 12.1596L6.36665 1.28014H6.36747ZM8.50006 5.75805C8.66328 5.75805 8.81981 5.82549 8.93522 5.94553C9.05063 6.06556 9.11547 6.22837 9.11547 6.39812V9.59846C9.11547 9.76822 9.05063 9.93102 8.93522 10.0511C8.81981 10.1711 8.66328 10.2385 8.50006 10.2385C8.33684 10.2385 8.18031 10.1711 8.0649 10.0511C7.94949 9.93102 7.88465 9.76822 7.88465 9.59846V6.39812C7.88465 6.22837 7.94949 6.06556 8.0649 5.94553C8.18031 5.82549 8.33684 5.75805 8.50006 5.75805ZM8.50006 12.7988C8.66328 12.7988 8.81981 12.7314 8.93522 12.6113C9.05063 12.4913 9.11547 12.3285 9.11547 12.1587C9.11547 11.989 9.05063 11.8262 8.93522 11.7061C8.81981 11.5861 8.66328 11.5187 8.50006 11.5187C8.33684 11.5187 8.18031 11.5861 8.0649 11.7061C7.94949 11.8262 7.88465 11.989 7.88465 12.1587C7.88465 12.3285 7.94949 12.4913 8.0649 12.6113C8.18031 12.7314 8.33684 12.7988 8.50006 12.7988Z"
12
+ fill="currentColor"
13
+ />
14
+ </svg>
@@ -1,12 +1,12 @@
1
- <svg
2
- xmlns="http://www.w3.org/2000/svg"
3
- viewBox="0 0 24 24"
4
- fill="currentColor"
5
- class="size-6"
6
- >
7
- <path
8
- fill-rule="evenodd"
9
- d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z"
10
- clip-rule="evenodd"
11
- />
12
- </svg>
1
+ <svg
2
+ xmlns="http://www.w3.org/2000/svg"
3
+ viewBox="0 0 24 24"
4
+ fill="currentColor"
5
+ class="size-6"
6
+ >
7
+ <path
8
+ fill-rule="evenodd"
9
+ d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z"
10
+ clip-rule="evenodd"
11
+ />
12
+ </svg>