@hkdigital/lib-sveltekit 0.1.6 → 0.1.7

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 (215) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/svelte/audio/mocks.js +35 -35
  17. package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/svelte/final-state-machine/index.js +1 -1
  19. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/svelte/image/index.js +4 -4
  23. package/dist/classes/svelte/image/mocks.js +35 -35
  24. package/dist/classes/svelte/image/typedef.js +8 -8
  25. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  28. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/svelte/network-loader/constants.js +3 -3
  30. package/dist/classes/svelte/network-loader/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  32. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +14 -0
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +22 -0
  44. package/dist/components/buttons/button/Button.svelte +76 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
  46. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
  47. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
  48. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  49. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
  50. package/dist/components/buttons/index.d.ts +1 -0
  51. package/dist/components/buttons/index.js +3 -2
  52. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  53. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
  54. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  55. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
  56. package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
  57. package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
  58. package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
  59. package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
  60. package/dist/components/icons/SteezeIcon.svelte +96 -0
  61. package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
  62. package/dist/components/{icon → icons}/index.d.ts +1 -0
  63. package/dist/components/{icon → icons}/index.js +6 -4
  64. package/dist/components/{icon → icons}/typedef.js +16 -16
  65. package/dist/components/image/ImageBox.svelte +208 -208
  66. package/dist/components/image/ImageBox.svelte.d.ts +19 -0
  67. package/dist/components/image/index.js +5 -5
  68. package/dist/components/image/typedef.js +32 -32
  69. package/dist/components/index.js +2 -2
  70. package/dist/components/inputs/index.js +1 -1
  71. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  72. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  73. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
  74. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  75. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  76. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  77. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  78. package/dist/components/layout/HkAppLayout.svelte +251 -251
  79. package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
  80. package/dist/components/layout/HkGridLayers.svelte +82 -82
  81. package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
  82. package/dist/components/layout/index.js +9 -9
  83. package/dist/components/panels/index.js +1 -1
  84. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  85. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
  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-grid-row/PanelGridRow.svelte.d.ts +14 -0
  89. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  90. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
  91. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  92. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  93. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
  94. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  95. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  96. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
  97. package/dist/components/tab-bar/index.js +17 -17
  98. package/dist/components/tab-bar/typedef.d.ts +1 -1
  99. package/dist/components/tab-bar/typedef.js +8 -8
  100. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  101. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
  102. package/dist/components/widgets/compare-left-right/index.js +1 -1
  103. package/dist/components/widgets/scale-control/index.js +1 -1
  104. package/dist/config/imagetools-config.js +189 -189
  105. package/dist/config/imagetools.d.ts +71 -71
  106. package/dist/config/typedef.js +8 -8
  107. package/dist/constants/errors/api.js +9 -9
  108. package/dist/constants/errors/generic.js +5 -5
  109. package/dist/constants/errors/index.js +3 -3
  110. package/dist/constants/errors/jwt.js +5 -5
  111. package/dist/constants/http/headers.js +6 -6
  112. package/dist/constants/http/index.js +2 -2
  113. package/dist/constants/http/methods.js +2 -2
  114. package/dist/constants/index.js +3 -3
  115. package/dist/constants/mime/application.js +5 -5
  116. package/dist/constants/mime/audio.js +13 -13
  117. package/dist/constants/mime/image.js +3 -3
  118. package/dist/constants/mime/index.js +4 -4
  119. package/dist/constants/mime/text.js +2 -2
  120. package/dist/constants/regexp/index.js +31 -31
  121. package/dist/constants/regexp/inspiratie.js__ +95 -95
  122. package/dist/constants/regexp/text.js +49 -49
  123. package/dist/constants/regexp/user.js +32 -32
  124. package/dist/constants/regexp/web.js +3 -3
  125. package/dist/constants/state-labels/input-states.js +11 -11
  126. package/dist/constants/state-labels/submit-states.js +4 -4
  127. package/dist/constants/time.js +28 -28
  128. package/dist/css/tw-prose.postcss__ +259 -259
  129. package/dist/css/utilities.postcss +43 -43
  130. package/dist/design/design-config.js +73 -73
  131. package/dist/design/tailwind-theme-extend.d.ts +4 -4
  132. package/dist/design/tailwind-theme-extend.js +160 -151
  133. package/dist/schemas/index.js +1 -1
  134. package/dist/schemas/validate-url.js +180 -180
  135. package/dist/server/index.js +1 -1
  136. package/dist/server/logger.js +94 -94
  137. package/dist/states/index.js +1 -1
  138. package/dist/states/navigation.svelte.js +55 -55
  139. package/dist/stores/index.js +1 -1
  140. package/dist/stores/theme.js +80 -80
  141. package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
  142. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  143. package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
  144. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  145. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  146. package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
  147. package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
  148. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  149. package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
  150. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  151. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  152. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  153. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  154. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  155. package/dist/themes/hkdev/components.postcss +61 -55
  156. package/dist/themes/hkdev/debug.postcss +1 -1
  157. package/dist/themes/hkdev/global/layout.postcss +39 -39
  158. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  159. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  160. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  161. package/dist/themes/hkdev/globals.postcss +11 -11
  162. package/dist/themes/hkdev/responsive.postcss +12 -12
  163. package/dist/themes/hkdev/theme-ext.js +15 -15
  164. package/dist/themes/hkdev/theme.js +227 -227
  165. package/dist/themes/index.js +1 -1
  166. package/dist/util/array/index.js +455 -455
  167. package/dist/util/compare/index.js +247 -247
  168. package/dist/util/css/css-vars.js +83 -83
  169. package/dist/util/css/index.js +1 -1
  170. package/dist/util/design-system/components/states.js +22 -22
  171. package/dist/util/design-system/css/clamp.js +66 -66
  172. package/dist/util/design-system/css/root-design-vars.js +100 -100
  173. package/dist/util/design-system/index.js +5 -5
  174. package/dist/util/design-system/layout/scaling.js +97 -97
  175. package/dist/util/design-system/tailwind.js +289 -289
  176. package/dist/util/expect/arrays.js +47 -47
  177. package/dist/util/expect/index.js +259 -259
  178. package/dist/util/expect/primitives.js +55 -55
  179. package/dist/util/expect/url.js +60 -60
  180. package/dist/util/function/index.js +218 -218
  181. package/dist/util/http/errors.js +97 -97
  182. package/dist/util/http/headers.js +45 -45
  183. package/dist/util/http/http-request.js +273 -273
  184. package/dist/util/http/index.js +22 -22
  185. package/dist/util/http/json-request.js +143 -143
  186. package/dist/util/http/mocks.js +65 -65
  187. package/dist/util/http/response.js +228 -228
  188. package/dist/util/http/url.js +52 -52
  189. package/dist/util/image/index.js +86 -86
  190. package/dist/util/index.js +2 -2
  191. package/dist/util/is/index.js +140 -140
  192. package/dist/util/iterate/index.js +234 -234
  193. package/dist/util/object/index.js +1361 -1361
  194. package/dist/util/singleton/index.js +97 -97
  195. package/dist/util/string/index.js +184 -184
  196. package/dist/util/svelte/index.js +2 -2
  197. package/dist/util/svelte/observe/index.js +49 -49
  198. package/dist/util/svelte/state-context/index.js +83 -83
  199. package/dist/util/svelte/wait/index.js +38 -38
  200. package/dist/util/sveltekit/index.js +1 -1
  201. package/dist/util/sveltekit/route-folders/index.js +82 -82
  202. package/dist/util/time/index.js +339 -339
  203. package/dist/valibot/date.js__ +10 -10
  204. package/dist/valibot/index.js +9 -9
  205. package/dist/valibot/url.js +95 -95
  206. package/dist/valibot/user.js +23 -23
  207. package/dist/zod/all.js +33 -33
  208. package/dist/zod/generic.js +11 -11
  209. package/dist/zod/javascript.js +32 -32
  210. package/dist/zod/user.js +16 -16
  211. package/dist/zod/web.js +52 -52
  212. package/package.json +99 -99
  213. package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
  214. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
  215. /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
@@ -1,83 +1,83 @@
1
- export const ERROR_WINDOW_SIZE_NOT_LANDSCAPE = 'Window size is not landsccape';
2
-
3
- export const ERROR_WINDOW_SIZE_NOT_PORTRAIT = 'Window size is not portrait';
4
-
5
- /**
6
- * Get game width for landscape mode
7
- *
8
- * @param {object} _
9
- * @param {number} _.windowWidth
10
- * @param {number} _.windowHeight
11
- * @param {number} [_.aspectOnLandscape]
12
- *
13
- * @returns {number} game width
14
- */
15
- export function getGameWidthOnLandscape({
16
- windowWidth,
17
- windowHeight,
18
- aspectOnLandscape
19
- }) {
20
- if (!windowHeight) {
21
- return 0;
22
- }
23
-
24
- if (windowWidth < windowHeight) {
25
- throw new Error(ERROR_WINDOW_SIZE_NOT_LANDSCAPE);
26
- }
27
-
28
- if (!aspectOnLandscape) {
29
- // No game aspect specified for landscape
30
- // => return full width
31
- return windowWidth;
32
- }
33
-
34
- const windowAspect = windowWidth / windowHeight;
35
-
36
- if (windowAspect > aspectOnLandscape) {
37
- // aspect of window if wider than game aspect => fill height
38
- return aspectOnLandscape * windowHeight;
39
- } else {
40
- // aspect of game is wider => fill width
41
- return windowWidth;
42
- }
43
- }
44
-
45
- /**
46
- * Get game width for portrait mode
47
- *
48
- * @param {object} _
49
- * @param {number} _.windowWidth
50
- * @param {number} _.windowHeight
51
- * @param {number} [_.aspectOnPortrait]
52
- *
53
- * @returns {number} game width
54
- */
55
- export function getGameWidthOnPortrait({
56
- windowWidth,
57
- windowHeight,
58
- aspectOnPortrait
59
- }) {
60
- if (!windowHeight) {
61
- return 0;
62
- }
63
-
64
- if (windowHeight < windowWidth) {
65
- throw new Error(ERROR_WINDOW_SIZE_NOT_PORTRAIT);
66
- }
67
-
68
- if (!aspectOnPortrait) {
69
- // No game aspect specified for portrait
70
- // => return full width
71
- return windowWidth;
72
- }
73
-
74
- const windowAspect = windowWidth / windowHeight;
75
-
76
- if (windowAspect > aspectOnPortrait) {
77
- // aspect of window if wider than game aspect => fill height
78
- return aspectOnPortrait * windowHeight;
79
- } else {
80
- // aspect of game is wider => fill width
81
- return windowWidth;
82
- }
83
- }
1
+ export const ERROR_WINDOW_SIZE_NOT_LANDSCAPE = 'Window size is not landsccape';
2
+
3
+ export const ERROR_WINDOW_SIZE_NOT_PORTRAIT = 'Window size is not portrait';
4
+
5
+ /**
6
+ * Get game width for landscape mode
7
+ *
8
+ * @param {object} _
9
+ * @param {number} _.windowWidth
10
+ * @param {number} _.windowHeight
11
+ * @param {number} [_.aspectOnLandscape]
12
+ *
13
+ * @returns {number} game width
14
+ */
15
+ export function getGameWidthOnLandscape({
16
+ windowWidth,
17
+ windowHeight,
18
+ aspectOnLandscape
19
+ }) {
20
+ if (!windowHeight) {
21
+ return 0;
22
+ }
23
+
24
+ if (windowWidth < windowHeight) {
25
+ throw new Error(ERROR_WINDOW_SIZE_NOT_LANDSCAPE);
26
+ }
27
+
28
+ if (!aspectOnLandscape) {
29
+ // No game aspect specified for landscape
30
+ // => return full width
31
+ return windowWidth;
32
+ }
33
+
34
+ const windowAspect = windowWidth / windowHeight;
35
+
36
+ if (windowAspect > aspectOnLandscape) {
37
+ // aspect of window if wider than game aspect => fill height
38
+ return aspectOnLandscape * windowHeight;
39
+ } else {
40
+ // aspect of game is wider => fill width
41
+ return windowWidth;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Get game width for portrait mode
47
+ *
48
+ * @param {object} _
49
+ * @param {number} _.windowWidth
50
+ * @param {number} _.windowHeight
51
+ * @param {number} [_.aspectOnPortrait]
52
+ *
53
+ * @returns {number} game width
54
+ */
55
+ export function getGameWidthOnPortrait({
56
+ windowWidth,
57
+ windowHeight,
58
+ aspectOnPortrait
59
+ }) {
60
+ if (!windowHeight) {
61
+ return 0;
62
+ }
63
+
64
+ if (windowHeight < windowWidth) {
65
+ throw new Error(ERROR_WINDOW_SIZE_NOT_PORTRAIT);
66
+ }
67
+
68
+ if (!aspectOnPortrait) {
69
+ // No game aspect specified for portrait
70
+ // => return full width
71
+ return windowWidth;
72
+ }
73
+
74
+ const windowAspect = windowWidth / windowHeight;
75
+
76
+ if (windowAspect > aspectOnPortrait) {
77
+ // aspect of window if wider than game aspect => fill height
78
+ return aspectOnPortrait * windowHeight;
79
+ } else {
80
+ // aspect of game is wider => fill width
81
+ return windowWidth;
82
+ }
83
+ }
@@ -1,2 +1,2 @@
1
- export { default as GameBox } from './game-box/GameBox.svelte';
2
- export { default as VirtualViewport } from './virtual-viewport/VirtualViewport.svelte';
1
+ export { default as GameBox } from './game-box/GameBox.svelte';
2
+ export { default as VirtualViewport } from './virtual-viewport/VirtualViewport.svelte';
@@ -1,199 +1,199 @@
1
- <script>
2
- import { onMount } from 'svelte';
3
- import {
4
- getRootCssDesignWidth,
5
- getRootCssDesignHeight,
6
- getClampParams,
7
- clamp
8
- } from '../../../util/design-system/index.js';
9
-
10
- /**
11
- * Virtual viewport component that creates a container with its own scaling
12
- * system based on its actual dimensions.
13
- *
14
- * @type {{
15
- * base?: string,
16
- * bg?: string,
17
- * classes?: string,
18
- * width?: string,
19
- * height?: string,
20
- * overflow?: string,
21
- * designWidth?: number,
22
- * designHeight?: number,
23
- * scaleViewport?: number,
24
- * scaleW?: number,
25
- * scaleH?: number,
26
- * scaleUI?: number,
27
- * scaleTextContent?: number,
28
- * scaleTextHeading?: number,
29
- * scaleTextUI?: number,
30
- * children?: import('svelte').Snippet,
31
- * [attr: string]: any
32
- * }}
33
- */
34
- let {
35
- // Style related props first
36
- base,
37
- bg,
38
- classes,
39
- width,
40
- height,
41
- overflow = 'overflow-clip',
42
-
43
- // Functional bindable props
44
- designWidth = $bindable(0),
45
- designHeight = $bindable(0),
46
- scaleViewport = $bindable(0),
47
- scaleW = $bindable(0),
48
- scaleH = $bindable(0),
49
- scaleUI = $bindable(0),
50
- scaleTextContent = $bindable(0),
51
- scaleTextHeading = $bindable(0),
52
- scaleTextUI = $bindable(0),
53
-
54
- // Snippets
55
- children,
56
-
57
- // Rest of attributes
58
- ...attrs
59
- } = $props();
60
-
61
- /**
62
- * References to the container element for measurement
63
- * @type {HTMLDivElement}
64
- */
65
- let container;
66
-
67
- /**
68
- * Current scaling variables
69
- */
70
- let scaleVars = $state('');
71
-
72
- // No separate variables for design dimensions
73
-
74
- /**
75
- * Error state for CSS variable parsing
76
- */
77
- let cssParsingError = $state(null);
78
-
79
- /**
80
- * Update scaling based on current dimensions
81
- */
82
- function updateScaling() {
83
- if (!container) return;
84
-
85
- // Get actual container dimensions
86
- const rect = container.getBoundingClientRect();
87
- const containerWidth = rect.width;
88
- const containerHeight = rect.height;
89
-
90
- // Calculate ratios similar to root variables
91
- scaleW = containerWidth / designWidth;
92
- scaleH = containerHeight / designHeight;
93
-
94
- // Use the smaller ratio to ensure content fits (from vars.postcss)
95
- scaleViewport = Math.min(scaleW, scaleH);
96
-
97
- try {
98
- // Get clamp parameters from CSS variables
99
- const uiParams = getClampParams('scale-ui');
100
- const contentParams = getClampParams('scale-text-content');
101
- const headingParams = getClampParams('scale-text-heading');
102
- const textUIParams = getClampParams('scale-text-ui');
103
-
104
- // Apply scaling according to extracted clamp parameters
105
- scaleUI = clamp(uiParams.min, scaleViewport, uiParams.max);
106
- scaleTextContent = clamp(
107
- contentParams.min,
108
- scaleViewport,
109
- contentParams.max
110
- );
111
- scaleTextHeading = clamp(
112
- headingParams.min,
113
- scaleViewport,
114
- headingParams.max
115
- );
116
- scaleTextUI = clamp(textUIParams.min, scaleViewport, textUIParams.max);
117
-
118
- // Clear any previous error
119
- cssParsingError = null;
120
- } catch (error) {
121
- // Store the error for debugging
122
- cssParsingError = error;
123
- console.error('VirtualViewport scaling error:', error);
124
-
125
- // Fallback to simple scaling without clamping
126
- scaleUI = scaleViewport;
127
- scaleTextContent = scaleViewport;
128
- scaleTextHeading = scaleViewport;
129
- scaleTextUI = scaleViewport;
130
- }
131
-
132
- // Update the style variables
133
- scaleVars = `
134
- --scale-w: ${scaleW};
135
- --scale-h: ${scaleH};
136
- --scale-viewport: ${scaleViewport};
137
- --scale-ui: ${scaleUI};
138
- --scale-text-content: ${scaleTextContent};
139
- --scale-text-heading: ${scaleTextHeading};
140
- --scale-text-ui: ${scaleTextUI};
141
- `;
142
- }
143
-
144
- // Watch for changes and update scaling
145
- $effect(() => {
146
- updateScaling();
147
- });
148
-
149
- onMount(() => {
150
- try {
151
- // Get design dimensions from CSS variables if props are zero
152
- if (designWidth === 0) {
153
- designWidth = getRootCssDesignWidth() ?? 1920;
154
- }
155
-
156
- if (designHeight === 0) {
157
- designHeight = getRootCssDesignHeight() ?? 1080;
158
- }
159
-
160
- // Initial calculation
161
- updateScaling();
162
-
163
- // Set up ResizeObserver to update scaling when container size changes
164
- const resizeObserver = new ResizeObserver(() => {
165
- updateScaling();
166
- });
167
-
168
- resizeObserver.observe(container);
169
-
170
- // Clean up
171
- return () => {
172
- resizeObserver.disconnect();
173
- };
174
- } catch (error) {
175
- cssParsingError = error;
176
- console.error('VirtualViewport initialization error:', error);
177
- }
178
- });
179
- </script>
180
-
181
- <div
182
- data-component="virtual-viewport"
183
- bind:this={container}
184
- class="{base} {bg} {width} {height} {overflow} {classes}"
185
- style={scaleVars}
186
- style:width={width ? width : '100%'}
187
- style:height={height ? height : '100%'}
188
- {...attrs}
189
- >
190
- {#if cssParsingError}
191
- <!-- Add a discreet error indicator for development -->
192
- <div
193
- class="absolute top-0 right-0 p-1 text-red-500 text-xs bg-black bg-opacity-50 rounded-bl"
194
- >
195
- CSS Parsing Error
196
- </div>
197
- {/if}
198
- {@render children()}
199
- </div>
1
+ <script>
2
+ import { onMount } from 'svelte';
3
+ import {
4
+ getRootCssDesignWidth,
5
+ getRootCssDesignHeight,
6
+ getClampParams,
7
+ clamp
8
+ } from '../../../util/design-system/index.js';
9
+
10
+ /**
11
+ * Virtual viewport component that creates a container with its own scaling
12
+ * system based on its actual dimensions.
13
+ *
14
+ * @type {{
15
+ * base?: string,
16
+ * bg?: string,
17
+ * classes?: string,
18
+ * width?: string,
19
+ * height?: string,
20
+ * overflow?: string,
21
+ * designWidth?: number,
22
+ * designHeight?: number,
23
+ * scaleViewport?: number,
24
+ * scaleW?: number,
25
+ * scaleH?: number,
26
+ * scaleUI?: number,
27
+ * scaleTextContent?: number,
28
+ * scaleTextHeading?: number,
29
+ * scaleTextUI?: number,
30
+ * children?: import('svelte').Snippet,
31
+ * [attr: string]: any
32
+ * }}
33
+ */
34
+ let {
35
+ // Style related props first
36
+ base,
37
+ bg,
38
+ classes,
39
+ width,
40
+ height,
41
+ overflow = 'overflow-clip',
42
+
43
+ // Functional bindable props
44
+ designWidth = $bindable(0),
45
+ designHeight = $bindable(0),
46
+ scaleViewport = $bindable(0),
47
+ scaleW = $bindable(0),
48
+ scaleH = $bindable(0),
49
+ scaleUI = $bindable(0),
50
+ scaleTextContent = $bindable(0),
51
+ scaleTextHeading = $bindable(0),
52
+ scaleTextUI = $bindable(0),
53
+
54
+ // Snippets
55
+ children,
56
+
57
+ // Rest of attributes
58
+ ...attrs
59
+ } = $props();
60
+
61
+ /**
62
+ * References to the container element for measurement
63
+ * @type {HTMLDivElement}
64
+ */
65
+ let container;
66
+
67
+ /**
68
+ * Current scaling variables
69
+ */
70
+ let scaleVars = $state('');
71
+
72
+ // No separate variables for design dimensions
73
+
74
+ /**
75
+ * Error state for CSS variable parsing
76
+ */
77
+ let cssParsingError = $state(null);
78
+
79
+ /**
80
+ * Update scaling based on current dimensions
81
+ */
82
+ function updateScaling() {
83
+ if (!container) return;
84
+
85
+ // Get actual container dimensions
86
+ const rect = container.getBoundingClientRect();
87
+ const containerWidth = rect.width;
88
+ const containerHeight = rect.height;
89
+
90
+ // Calculate ratios similar to root variables
91
+ scaleW = containerWidth / designWidth;
92
+ scaleH = containerHeight / designHeight;
93
+
94
+ // Use the smaller ratio to ensure content fits (from vars.postcss)
95
+ scaleViewport = Math.min(scaleW, scaleH);
96
+
97
+ try {
98
+ // Get clamp parameters from CSS variables
99
+ const uiParams = getClampParams('scale-ui');
100
+ const contentParams = getClampParams('scale-text-content');
101
+ const headingParams = getClampParams('scale-text-heading');
102
+ const textUIParams = getClampParams('scale-text-ui');
103
+
104
+ // Apply scaling according to extracted clamp parameters
105
+ scaleUI = clamp(uiParams.min, scaleViewport, uiParams.max);
106
+ scaleTextContent = clamp(
107
+ contentParams.min,
108
+ scaleViewport,
109
+ contentParams.max
110
+ );
111
+ scaleTextHeading = clamp(
112
+ headingParams.min,
113
+ scaleViewport,
114
+ headingParams.max
115
+ );
116
+ scaleTextUI = clamp(textUIParams.min, scaleViewport, textUIParams.max);
117
+
118
+ // Clear any previous error
119
+ cssParsingError = null;
120
+ } catch (error) {
121
+ // Store the error for debugging
122
+ cssParsingError = error;
123
+ console.error('VirtualViewport scaling error:', error);
124
+
125
+ // Fallback to simple scaling without clamping
126
+ scaleUI = scaleViewport;
127
+ scaleTextContent = scaleViewport;
128
+ scaleTextHeading = scaleViewport;
129
+ scaleTextUI = scaleViewport;
130
+ }
131
+
132
+ // Update the style variables
133
+ scaleVars = `
134
+ --scale-w: ${scaleW};
135
+ --scale-h: ${scaleH};
136
+ --scale-viewport: ${scaleViewport};
137
+ --scale-ui: ${scaleUI};
138
+ --scale-text-content: ${scaleTextContent};
139
+ --scale-text-heading: ${scaleTextHeading};
140
+ --scale-text-ui: ${scaleTextUI};
141
+ `;
142
+ }
143
+
144
+ // Watch for changes and update scaling
145
+ $effect(() => {
146
+ updateScaling();
147
+ });
148
+
149
+ onMount(() => {
150
+ try {
151
+ // Get design dimensions from CSS variables if props are zero
152
+ if (designWidth === 0) {
153
+ designWidth = getRootCssDesignWidth() ?? 1920;
154
+ }
155
+
156
+ if (designHeight === 0) {
157
+ designHeight = getRootCssDesignHeight() ?? 1080;
158
+ }
159
+
160
+ // Initial calculation
161
+ updateScaling();
162
+
163
+ // Set up ResizeObserver to update scaling when container size changes
164
+ const resizeObserver = new ResizeObserver(() => {
165
+ updateScaling();
166
+ });
167
+
168
+ resizeObserver.observe(container);
169
+
170
+ // Clean up
171
+ return () => {
172
+ resizeObserver.disconnect();
173
+ };
174
+ } catch (error) {
175
+ cssParsingError = error;
176
+ console.error('VirtualViewport initialization error:', error);
177
+ }
178
+ });
179
+ </script>
180
+
181
+ <div
182
+ data-component="virtual-viewport"
183
+ bind:this={container}
184
+ class="{base} {bg} {width} {height} {overflow} {classes}"
185
+ style={scaleVars}
186
+ style:width={width ? width : '100%'}
187
+ style:height={height ? height : '100%'}
188
+ {...attrs}
189
+ >
190
+ {#if cssParsingError}
191
+ <!-- Add a discreet error indicator for development -->
192
+ <div
193
+ class="absolute top-0 right-0 p-1 text-red-500 text-xs bg-black bg-opacity-50 rounded-bl"
194
+ >
195
+ CSS Parsing Error
196
+ </div>
197
+ {/if}
198
+ {@render children()}
199
+ </div>
@@ -1,4 +1,26 @@
1
1
  export default VirtualViewport;
2
+ type VirtualViewport = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<{
5
+ [attr: string]: any;
6
+ base?: string;
7
+ bg?: string;
8
+ classes?: string;
9
+ width?: string;
10
+ height?: string;
11
+ overflow?: string;
12
+ designWidth?: number;
13
+ designHeight?: number;
14
+ scaleViewport?: number;
15
+ scaleW?: number;
16
+ scaleH?: number;
17
+ scaleUI?: number;
18
+ scaleTextContent?: number;
19
+ scaleTextHeading?: number;
20
+ scaleTextUI?: number;
21
+ children?: Snippet<[]>;
22
+ }>): void;
23
+ };
2
24
  declare const VirtualViewport: import("svelte").Component<{
3
25
  [attr: string]: any;
4
26
  base?: string;