@hkdigital/lib-sveltekit 0.2.7 → 0.2.8

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 (242) 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 +110 -110
  60. package/dist/components/drag-drop/Draggable.svelte +512 -512
  61. package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
  62. package/dist/components/drag-drop/DropZoneList.svelte +125 -125
  63. package/dist/components/drag-drop/{DropZone.svelte → Dropzone.svelte} +258 -258
  64. package/dist/components/drag-drop/drag-state.svelte.js +319 -319
  65. package/dist/components/drag-drop/index.js +7 -7
  66. package/dist/components/drag-drop/util.js +85 -85
  67. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  68. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  69. package/dist/components/icons/HkIcon.svelte +86 -86
  70. package/dist/components/icons/HkTabIcon.svelte +116 -116
  71. package/dist/components/icons/SteezeIcon.svelte +97 -97
  72. package/dist/components/icons/index.js +6 -6
  73. package/dist/components/icons/typedef.js +16 -16
  74. package/dist/components/index.js +2 -2
  75. package/dist/components/inputs/index.js +1 -1
  76. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  77. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  78. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  79. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  80. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  81. package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
  82. package/dist/components/layout/grid-layers/util.js +74 -74
  83. package/dist/components/layout/index.js +1 -1
  84. package/dist/components/panels/index.js +1 -1
  85. package/dist/components/panels/panel/Panel.svelte +43 -43
  86. package/dist/components/rows/index.js +3 -3
  87. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  88. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  89. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  90. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  91. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  92. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  93. package/dist/components/tab-bar/index.js +17 -17
  94. package/dist/components/tab-bar/typedef.js +11 -11
  95. package/dist/config/imagetools-config.js +189 -189
  96. package/dist/config/imagetools.d.ts +72 -72
  97. package/dist/constants/bases.js +13 -13
  98. package/dist/constants/errors/api.js +9 -9
  99. package/dist/constants/errors/generic.js +5 -5
  100. package/dist/constants/errors/index.js +3 -3
  101. package/dist/constants/errors/jwt.js +5 -5
  102. package/dist/constants/http/headers.js +6 -6
  103. package/dist/constants/http/index.js +2 -2
  104. package/dist/constants/http/methods.js +2 -2
  105. package/dist/constants/index.js +3 -3
  106. package/dist/constants/mime/application.js +5 -5
  107. package/dist/constants/mime/audio.js +13 -13
  108. package/dist/constants/mime/image.js +3 -3
  109. package/dist/constants/mime/index.js +4 -4
  110. package/dist/constants/mime/text.js +2 -2
  111. package/dist/constants/regexp/index.js +31 -31
  112. package/dist/constants/regexp/inspiratie.js__ +95 -95
  113. package/dist/constants/regexp/text.js +49 -49
  114. package/dist/constants/regexp/user.js +32 -32
  115. package/dist/constants/regexp/web.js +3 -3
  116. package/dist/constants/state-labels/drag-states.js +6 -6
  117. package/dist/constants/state-labels/drop-states.js +6 -6
  118. package/dist/constants/state-labels/input-states.js +11 -11
  119. package/dist/constants/state-labels/submit-states.js +4 -4
  120. package/dist/constants/time.js +28 -28
  121. package/dist/css/utilities.css +43 -43
  122. package/dist/design/design-config.js +73 -73
  123. package/dist/design/tailwind-theme-extend.js +158 -158
  124. package/dist/features/button-group/ButtonGroup.svelte +82 -82
  125. package/dist/features/button-group/typedef.js +10 -10
  126. package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
  127. package/dist/features/compare-left-right/index.js +1 -1
  128. package/dist/features/game-box/GameBox.svelte +577 -577
  129. package/dist/features/game-box/gamebox.util.js +83 -83
  130. package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  131. package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
  132. package/dist/features/image-box/ImageBox.svelte +210 -210
  133. package/dist/features/image-box/index.js +5 -5
  134. package/dist/features/image-box/typedef.js +32 -32
  135. package/dist/features/index.js +23 -23
  136. package/dist/features/presenter/ImageSlide.svelte +64 -64
  137. package/dist/features/presenter/Presenter.state.svelte.js +638 -638
  138. package/dist/features/presenter/Presenter.svelte +142 -142
  139. package/dist/features/presenter/constants.js +7 -7
  140. package/dist/features/presenter/index.js +10 -10
  141. package/dist/features/presenter/typedef.js +106 -106
  142. package/dist/features/presenter/util.js +210 -210
  143. package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
  144. package/dist/schemas/index.js +1 -1
  145. package/dist/schemas/validate-url.js +180 -180
  146. package/dist/server/index.js +1 -1
  147. package/dist/server/logger.js +94 -94
  148. package/dist/states/index.js +1 -1
  149. package/dist/states/navigation.svelte.js +55 -55
  150. package/dist/stores/index.js +1 -1
  151. package/dist/stores/theme.js +80 -80
  152. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  153. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  154. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  155. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  156. package/dist/themes/hkdev/components/buttons/button.css +146 -146
  157. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  158. package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
  159. package/dist/themes/hkdev/components/drag-drop/drop-zone.css +48 -48
  160. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  161. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  162. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  163. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  164. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  165. package/dist/themes/hkdev/components.css +53 -53
  166. package/dist/themes/hkdev/debug.css +1 -1
  167. package/dist/themes/hkdev/global/layout.css +39 -39
  168. package/dist/themes/hkdev/global/on-colors.css +53 -53
  169. package/dist/themes/hkdev/globals.css +11 -11
  170. package/dist/themes/hkdev/responsive.css +12 -12
  171. package/dist/themes/hkdev/theme-ext.js +15 -15
  172. package/dist/themes/hkdev/theme.js +235 -235
  173. package/dist/themes/index.js +1 -1
  174. package/dist/typedef/context.js +6 -6
  175. package/dist/typedef/drag.js +25 -25
  176. package/dist/typedef/drop.js +12 -12
  177. package/dist/typedef/image.js +38 -38
  178. package/dist/typedef/index.js +4 -4
  179. package/dist/util/array/index.js +436 -436
  180. package/dist/util/bases/base58.js +262 -262
  181. package/dist/util/bases/index.js +1 -1
  182. package/dist/util/compare/index.js +247 -247
  183. package/dist/util/css/css-vars.js +83 -83
  184. package/dist/util/css/index.js +1 -1
  185. package/dist/util/design-system/components/states.js +22 -22
  186. package/dist/util/design-system/css/clamp.js +66 -66
  187. package/dist/util/design-system/css/root-design-vars.js +102 -102
  188. package/dist/util/design-system/index.js +5 -5
  189. package/dist/util/design-system/layout/scaling.js +228 -228
  190. package/dist/util/design-system/skeleton.js +208 -208
  191. package/dist/util/design-system/tailwind.js +288 -288
  192. package/dist/util/env/index.js +9 -9
  193. package/dist/util/expect/arrays.js +47 -47
  194. package/dist/util/expect/index.js +259 -259
  195. package/dist/util/expect/primitives.js +55 -55
  196. package/dist/util/expect/url.js +60 -60
  197. package/dist/util/function/index.js +218 -218
  198. package/dist/util/geo/index.js +26 -26
  199. package/dist/util/http/caching.js +263 -263
  200. package/dist/util/http/errors.js +97 -97
  201. package/dist/util/http/headers.js +75 -75
  202. package/dist/util/http/http-request.js +379 -379
  203. package/dist/util/http/index.js +22 -22
  204. package/dist/util/http/json-request.js +224 -224
  205. package/dist/util/http/mocks.js +65 -65
  206. package/dist/util/http/response.js +294 -294
  207. package/dist/util/http/typedef.js +93 -93
  208. package/dist/util/http/url.js +52 -52
  209. package/dist/util/image/index.js +86 -86
  210. package/dist/util/index.js +2 -2
  211. package/dist/util/is/index.js +140 -140
  212. package/dist/util/iterate/index.js +234 -234
  213. package/dist/util/object/index.js +1361 -1361
  214. package/dist/util/singleton/index.js +97 -97
  215. package/dist/util/string/array-path.js +75 -75
  216. package/dist/util/string/convert.js +54 -54
  217. package/dist/util/string/fs.js +226 -226
  218. package/dist/util/string/index.js +5 -5
  219. package/dist/util/string/interpolate.js +61 -61
  220. package/dist/util/string/pad.js +10 -10
  221. package/dist/util/svelte/index.js +4 -4
  222. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  223. package/dist/util/svelte/observe/index.js +49 -49
  224. package/dist/util/svelte/state-context/index.js +117 -117
  225. package/dist/util/svelte/wait/index.js +38 -38
  226. package/dist/util/sveltekit/index.js +1 -1
  227. package/dist/util/sveltekit/route-folders/index.js +101 -101
  228. package/dist/util/time/index.js +323 -323
  229. package/dist/util/unique/index.js +249 -249
  230. package/dist/valibot/date.js__ +10 -10
  231. package/dist/valibot/index.js +9 -9
  232. package/dist/valibot/url.js +95 -95
  233. package/dist/valibot/user.js +23 -23
  234. package/dist/zod/all.js +33 -33
  235. package/dist/zod/generic.js +11 -11
  236. package/dist/zod/javascript.js +32 -32
  237. package/dist/zod/user.js +16 -16
  238. package/dist/zod/web.js +52 -52
  239. package/package.json +112 -112
  240. package/dist/components/drag-drop/drag-state.svelte.js__ +0 -323
  241. package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +0 -372
  242. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
@@ -1,228 +1,228 @@
1
- import { clamp } from '../css/clamp.js';
2
-
3
- /**
4
- * Manages responsive design scaling by calculating and applying scale factors
5
- * based on container dimensions and design system requirements.
6
- *
7
- * @param {Object} options - Configuration options
8
- * @param {HTMLElement} options.container - The container element to apply scaling to
9
- * @param {Object} options.design - The base design dimensions
10
- * @param {number} options.design.width - The reference design width
11
- * @param {number} options.design.height - The reference design height
12
- * @param {Object} options.clamping - The min/max values for various scale factors
13
- * @param {Object} options.clamping.ui - UI element scaling constraints
14
- * @param {number} options.clamping.ui.min - Minimum UI scale factor
15
- * @param {number} options.clamping.ui.max - Maximum UI scale factor
16
- * @param {Object} options.clamping.textBase - Base text scaling constraints
17
- * @param {number} options.clamping.textBase.min - Minimum base text scale factor
18
- * @param {number} options.clamping.textBase.max - Maximum base text scale factor
19
- * @param {Object} options.clamping.textHeading - Heading text scaling constraints
20
- * @param {number} options.clamping.textHeading.min - Minimum heading text scale factor
21
- * @param {number} options.clamping.textHeading.max - Maximum heading text scale factor
22
- * @param {Object} options.clamping.textUi - UI text scaling constraints
23
- * @param {number} options.clamping.textUi.min - Minimum UI text scale factor
24
- * @param {number} options.clamping.textUi.max - Maximum UI text scale factor
25
- * @param {Function} [options.getDimensions] - Optional function to get width and height
26
- * @param {boolean} [options.useResizeObserver=true] - Whether to use ResizeObserver
27
- *
28
- * @returns {()=>void} A cleanup function that removes event listeners and observers
29
- */
30
- export function enableContainerScaling({
31
- container,
32
- design,
33
- clamping,
34
- getDimensions,
35
- useResizeObserver = true
36
- }) {
37
- if (!container) {
38
- throw new Error('Container element is required for enableContainerScaling');
39
- }
40
-
41
- let resizeObserver;
42
-
43
- /**
44
- * Updates CSS scale variables based on container dimensions
45
- * and design system constraints
46
- */
47
- function updateScaleValues() {
48
- try {
49
- let containerWidth, containerHeight;
50
-
51
- // Use custom dimension getter if provided
52
- if (typeof getDimensions === 'function') {
53
- const dimensions = getDimensions();
54
- containerWidth = dimensions.width;
55
- containerHeight = dimensions.height;
56
- } else {
57
- // Otherwise use container's client dimensions
58
- const rect = container.getBoundingClientRect();
59
- containerWidth = rect.width;
60
- containerHeight = rect.height;
61
- }
62
-
63
- // Skip update if dimensions are zero (container not visible)
64
- if (containerWidth <= 0 || containerHeight <= 0) {
65
- return;
66
- }
67
-
68
- // Calculate scale factors based on container size relative to design dimensions
69
- const scaleW = containerWidth / design.width;
70
- const scaleH = containerHeight / design.height;
71
-
72
- // Use the smaller scale factor to ensure content fits within container
73
- const scaleViewport = Math.min(scaleW, scaleH);
74
-
75
- // Apply clamping to different element types
76
- const scaleUI = clamp(clamping.ui.min, scaleViewport, clamping.ui.max);
77
-
78
- const scaleTextBase = clamp(
79
- clamping.textBase.min,
80
- scaleViewport,
81
- clamping.textBase.max
82
- );
83
-
84
- const scaleTextHeading = clamp(
85
- clamping.textHeading.min,
86
- scaleViewport,
87
- clamping.textHeading.max
88
- );
89
-
90
- const scaleTextUi = clamp(
91
- clamping.textUi.min,
92
- scaleViewport,
93
- clamping.textUi.max
94
- );
95
-
96
- // Set CSS custom properties on the container
97
- container.style.setProperty('--scale-w', String(scaleW));
98
- container.style.setProperty('--scale-h', String(scaleH));
99
- container.style.setProperty('--scale-viewport', String(scaleViewport));
100
- container.style.setProperty('--scale-ui', String(scaleUI));
101
- container.style.setProperty('--scale-text-base', String(scaleTextBase));
102
- container.style.setProperty(
103
- '--scale-text-heading',
104
- String(scaleTextHeading)
105
- );
106
- container.style.setProperty('--scale-text-ui', String(scaleTextUi));
107
- } catch (error) {
108
- console.error('Error updating container scale values:', error);
109
- }
110
- }
111
-
112
- // Initialize scales
113
- updateScaleValues();
114
-
115
- // Set up ResizeObserver for container resize detection
116
- if (useResizeObserver && typeof ResizeObserver !== 'undefined') {
117
- resizeObserver = new ResizeObserver(updateScaleValues);
118
- resizeObserver.observe(container);
119
- } else {
120
- // Fallback to window resize event
121
- window.addEventListener('resize', updateScaleValues);
122
- }
123
-
124
- // Return cleanup function
125
- return function cleanup() {
126
- if (resizeObserver) {
127
- resizeObserver.disconnect();
128
- } else {
129
- window.removeEventListener('resize', updateScaleValues);
130
- }
131
- };
132
- }
133
-
134
- /**
135
- * Manages responsive design scaling by calculating and applying scale factors
136
- * based on viewport dimensions and design system requirements.
137
- *
138
- * @param {Object} design - The base design dimensions
139
- * @param {number} design.width - The reference design width
140
- * @param {number} design.height - The reference design height
141
- * @param {Object} clamping - The min/max values for various scale factors
142
- * @param {Object} clamping.ui - UI element scaling constraints
143
- * @param {number} clamping.ui.min - Minimum UI scale factor
144
- * @param {number} clamping.ui.max - Maximum UI scale factor
145
- * @param {Object} clamping.textBase - Base text scaling constraints
146
- * @param {number} clamping.textBase.min - Minimum base text scale factor
147
- * @param {number} clamping.textBase.max - Maximum base text scale factor
148
- * @param {Object} clamping.textHeading - Heading text scaling constraints
149
- * @param {number} clamping.textHeading.min - Minimum heading text scale factor
150
- * @param {number} clamping.textHeading.max - Maximum heading text scale factor
151
- * @param {Object} clamping.textUi - UI text scaling constraints
152
- * @param {number} clamping.textUi.min - Minimum UI text scale factor
153
- * @param {number} clamping.textUi.max - Maximum UI text scale factor
154
- *
155
- * @returns {()=>void} A cleanup function that removes the event listener
156
- */
157
- export function enableScalingUI(design, clamping) {
158
- /**
159
- * Updates CSS scale variables based on current viewport dimensions
160
- * and design system constraints
161
- */
162
- function updateScaleValues() {
163
- try {
164
- const vw = window.innerWidth;
165
- const vh = window.innerHeight;
166
-
167
- // Calculate scale factors based on viewport size relative to design dimensions
168
- const scaleW = vw / design.width;
169
- const scaleH = vh / design.height;
170
-
171
- // Use the smaller scale factor to ensure content fits within viewport
172
- const scaleViewport = Math.min(scaleW, scaleH);
173
-
174
- // Apply clamping to different element types
175
- const scaleUI = clamp(clamping.ui.min, scaleViewport, clamping.ui.max);
176
-
177
- const scaleTextBase = clamp(
178
- clamping.textBase.min,
179
- scaleViewport,
180
- clamping.textBase.max
181
- );
182
-
183
- const scaleTextHeading = clamp(
184
- clamping.textHeading.min,
185
- scaleViewport,
186
- clamping.textHeading.max
187
- );
188
-
189
- const scaleTextUi = clamp(
190
- clamping.textUi.min,
191
- scaleViewport,
192
- clamping.textUi.max
193
- );
194
-
195
- // Set CSS custom properties for use in the design system
196
- document.documentElement.style.setProperty('--scale-w', String(scaleW));
197
- document.documentElement.style.setProperty('--scale-h', String(scaleH));
198
- document.documentElement.style.setProperty(
199
- '--scale-viewport',
200
- String(scaleViewport)
201
- );
202
- document.documentElement.style.setProperty('--scale-ui', String(scaleUI));
203
- document.documentElement.style.setProperty(
204
- '--scale-text-base',
205
- String(scaleTextBase)
206
- );
207
- document.documentElement.style.setProperty(
208
- '--scale-text-heading',
209
- String(scaleTextHeading)
210
- );
211
- document.documentElement.style.setProperty(
212
- '--scale-text-ui',
213
- String(scaleTextUi)
214
- );
215
- } catch (error) {
216
- console.error('Error updating design scale values:', error);
217
- }
218
- }
219
-
220
- // Initialize scales and attach resize listener
221
- updateScaleValues();
222
- window.addEventListener('resize', updateScaleValues);
223
-
224
- // Return cleanup function
225
- return function cleanup() {
226
- window.removeEventListener('resize', updateScaleValues);
227
- };
228
- }
1
+ import { clamp } from '../css/clamp.js';
2
+
3
+ /**
4
+ * Manages responsive design scaling by calculating and applying scale factors
5
+ * based on container dimensions and design system requirements.
6
+ *
7
+ * @param {Object} options - Configuration options
8
+ * @param {HTMLElement} options.container - The container element to apply scaling to
9
+ * @param {Object} options.design - The base design dimensions
10
+ * @param {number} options.design.width - The reference design width
11
+ * @param {number} options.design.height - The reference design height
12
+ * @param {Object} options.clamping - The min/max values for various scale factors
13
+ * @param {Object} options.clamping.ui - UI element scaling constraints
14
+ * @param {number} options.clamping.ui.min - Minimum UI scale factor
15
+ * @param {number} options.clamping.ui.max - Maximum UI scale factor
16
+ * @param {Object} options.clamping.textBase - Base text scaling constraints
17
+ * @param {number} options.clamping.textBase.min - Minimum base text scale factor
18
+ * @param {number} options.clamping.textBase.max - Maximum base text scale factor
19
+ * @param {Object} options.clamping.textHeading - Heading text scaling constraints
20
+ * @param {number} options.clamping.textHeading.min - Minimum heading text scale factor
21
+ * @param {number} options.clamping.textHeading.max - Maximum heading text scale factor
22
+ * @param {Object} options.clamping.textUi - UI text scaling constraints
23
+ * @param {number} options.clamping.textUi.min - Minimum UI text scale factor
24
+ * @param {number} options.clamping.textUi.max - Maximum UI text scale factor
25
+ * @param {Function} [options.getDimensions] - Optional function to get width and height
26
+ * @param {boolean} [options.useResizeObserver=true] - Whether to use ResizeObserver
27
+ *
28
+ * @returns {()=>void} A cleanup function that removes event listeners and observers
29
+ */
30
+ export function enableContainerScaling({
31
+ container,
32
+ design,
33
+ clamping,
34
+ getDimensions,
35
+ useResizeObserver = true
36
+ }) {
37
+ if (!container) {
38
+ throw new Error('Container element is required for enableContainerScaling');
39
+ }
40
+
41
+ let resizeObserver;
42
+
43
+ /**
44
+ * Updates CSS scale variables based on container dimensions
45
+ * and design system constraints
46
+ */
47
+ function updateScaleValues() {
48
+ try {
49
+ let containerWidth, containerHeight;
50
+
51
+ // Use custom dimension getter if provided
52
+ if (typeof getDimensions === 'function') {
53
+ const dimensions = getDimensions();
54
+ containerWidth = dimensions.width;
55
+ containerHeight = dimensions.height;
56
+ } else {
57
+ // Otherwise use container's client dimensions
58
+ const rect = container.getBoundingClientRect();
59
+ containerWidth = rect.width;
60
+ containerHeight = rect.height;
61
+ }
62
+
63
+ // Skip update if dimensions are zero (container not visible)
64
+ if (containerWidth <= 0 || containerHeight <= 0) {
65
+ return;
66
+ }
67
+
68
+ // Calculate scale factors based on container size relative to design dimensions
69
+ const scaleW = containerWidth / design.width;
70
+ const scaleH = containerHeight / design.height;
71
+
72
+ // Use the smaller scale factor to ensure content fits within container
73
+ const scaleViewport = Math.min(scaleW, scaleH);
74
+
75
+ // Apply clamping to different element types
76
+ const scaleUI = clamp(clamping.ui.min, scaleViewport, clamping.ui.max);
77
+
78
+ const scaleTextBase = clamp(
79
+ clamping.textBase.min,
80
+ scaleViewport,
81
+ clamping.textBase.max
82
+ );
83
+
84
+ const scaleTextHeading = clamp(
85
+ clamping.textHeading.min,
86
+ scaleViewport,
87
+ clamping.textHeading.max
88
+ );
89
+
90
+ const scaleTextUi = clamp(
91
+ clamping.textUi.min,
92
+ scaleViewport,
93
+ clamping.textUi.max
94
+ );
95
+
96
+ // Set CSS custom properties on the container
97
+ container.style.setProperty('--scale-w', String(scaleW));
98
+ container.style.setProperty('--scale-h', String(scaleH));
99
+ container.style.setProperty('--scale-viewport', String(scaleViewport));
100
+ container.style.setProperty('--scale-ui', String(scaleUI));
101
+ container.style.setProperty('--scale-text-base', String(scaleTextBase));
102
+ container.style.setProperty(
103
+ '--scale-text-heading',
104
+ String(scaleTextHeading)
105
+ );
106
+ container.style.setProperty('--scale-text-ui', String(scaleTextUi));
107
+ } catch (error) {
108
+ console.error('Error updating container scale values:', error);
109
+ }
110
+ }
111
+
112
+ // Initialize scales
113
+ updateScaleValues();
114
+
115
+ // Set up ResizeObserver for container resize detection
116
+ if (useResizeObserver && typeof ResizeObserver !== 'undefined') {
117
+ resizeObserver = new ResizeObserver(updateScaleValues);
118
+ resizeObserver.observe(container);
119
+ } else {
120
+ // Fallback to window resize event
121
+ window.addEventListener('resize', updateScaleValues);
122
+ }
123
+
124
+ // Return cleanup function
125
+ return function cleanup() {
126
+ if (resizeObserver) {
127
+ resizeObserver.disconnect();
128
+ } else {
129
+ window.removeEventListener('resize', updateScaleValues);
130
+ }
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Manages responsive design scaling by calculating and applying scale factors
136
+ * based on viewport dimensions and design system requirements.
137
+ *
138
+ * @param {Object} design - The base design dimensions
139
+ * @param {number} design.width - The reference design width
140
+ * @param {number} design.height - The reference design height
141
+ * @param {Object} clamping - The min/max values for various scale factors
142
+ * @param {Object} clamping.ui - UI element scaling constraints
143
+ * @param {number} clamping.ui.min - Minimum UI scale factor
144
+ * @param {number} clamping.ui.max - Maximum UI scale factor
145
+ * @param {Object} clamping.textBase - Base text scaling constraints
146
+ * @param {number} clamping.textBase.min - Minimum base text scale factor
147
+ * @param {number} clamping.textBase.max - Maximum base text scale factor
148
+ * @param {Object} clamping.textHeading - Heading text scaling constraints
149
+ * @param {number} clamping.textHeading.min - Minimum heading text scale factor
150
+ * @param {number} clamping.textHeading.max - Maximum heading text scale factor
151
+ * @param {Object} clamping.textUi - UI text scaling constraints
152
+ * @param {number} clamping.textUi.min - Minimum UI text scale factor
153
+ * @param {number} clamping.textUi.max - Maximum UI text scale factor
154
+ *
155
+ * @returns {()=>void} A cleanup function that removes the event listener
156
+ */
157
+ export function enableScalingUI(design, clamping) {
158
+ /**
159
+ * Updates CSS scale variables based on current viewport dimensions
160
+ * and design system constraints
161
+ */
162
+ function updateScaleValues() {
163
+ try {
164
+ const vw = window.innerWidth;
165
+ const vh = window.innerHeight;
166
+
167
+ // Calculate scale factors based on viewport size relative to design dimensions
168
+ const scaleW = vw / design.width;
169
+ const scaleH = vh / design.height;
170
+
171
+ // Use the smaller scale factor to ensure content fits within viewport
172
+ const scaleViewport = Math.min(scaleW, scaleH);
173
+
174
+ // Apply clamping to different element types
175
+ const scaleUI = clamp(clamping.ui.min, scaleViewport, clamping.ui.max);
176
+
177
+ const scaleTextBase = clamp(
178
+ clamping.textBase.min,
179
+ scaleViewport,
180
+ clamping.textBase.max
181
+ );
182
+
183
+ const scaleTextHeading = clamp(
184
+ clamping.textHeading.min,
185
+ scaleViewport,
186
+ clamping.textHeading.max
187
+ );
188
+
189
+ const scaleTextUi = clamp(
190
+ clamping.textUi.min,
191
+ scaleViewport,
192
+ clamping.textUi.max
193
+ );
194
+
195
+ // Set CSS custom properties for use in the design system
196
+ document.documentElement.style.setProperty('--scale-w', String(scaleW));
197
+ document.documentElement.style.setProperty('--scale-h', String(scaleH));
198
+ document.documentElement.style.setProperty(
199
+ '--scale-viewport',
200
+ String(scaleViewport)
201
+ );
202
+ document.documentElement.style.setProperty('--scale-ui', String(scaleUI));
203
+ document.documentElement.style.setProperty(
204
+ '--scale-text-base',
205
+ String(scaleTextBase)
206
+ );
207
+ document.documentElement.style.setProperty(
208
+ '--scale-text-heading',
209
+ String(scaleTextHeading)
210
+ );
211
+ document.documentElement.style.setProperty(
212
+ '--scale-text-ui',
213
+ String(scaleTextUi)
214
+ );
215
+ } catch (error) {
216
+ console.error('Error updating design scale values:', error);
217
+ }
218
+ }
219
+
220
+ // Initialize scales and attach resize listener
221
+ updateScaleValues();
222
+ window.addEventListener('resize', updateScaleValues);
223
+
224
+ // Return cleanup function
225
+ return function cleanup() {
226
+ window.removeEventListener('resize', updateScaleValues);
227
+ };
228
+ }