@hkdigital/lib-sveltekit 0.1.5 → 0.1.6
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.
- package/README.md +127 -127
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/index.js +3 -3
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/final-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
- package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkArea.svelte.d.ts +0 -14
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- package/dist/components/area/index.js +2 -2
- package/dist/components/boxes/game-box/GameBox.svelte +112 -112
- package/dist/components/boxes/game-box/GameBox.svelte.d.ts +0 -15
- package/dist/components/boxes/game-box/gamebox.util.js +83 -83
- package/dist/components/boxes/index.js +2 -2
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
- package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
- package/dist/components/buttons/button/Button.svelte +75 -75
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/buttons/index.js +2 -2
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icon/HkIcon.svelte +86 -86
- package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icon/HkTabIcon.svelte +116 -116
- package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icon/index.js +4 -4
- package/dist/components/icon/typedef.js +16 -16
- package/dist/components/image/ImageBox.svelte +208 -208
- package/dist/components/image/ImageBox.svelte.d.ts +0 -19
- package/dist/components/image/index.js +5 -5
- package/dist/components/image/typedef.js +32 -32
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +226 -226
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/components/layout/HkAppLayout.svelte +251 -251
- package/dist/components/layout/HkAppLayout.svelte.d.ts +0 -11
- package/dist/components/layout/HkGridLayers.svelte +82 -82
- package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
- package/dist/components/layout/index.js +9 -9
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
- package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +0 -12
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +8 -8
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
- package/dist/components/widgets/compare-left-right/index.js +1 -1
- package/dist/components/widgets/scale-control/index.js +1 -1
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +71 -71
- package/dist/config/typedef.js +8 -8
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/tw-prose.postcss__ +259 -259
- package/dist/css/utilities.postcss +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/design/tailwind-theme-extend.js +151 -151
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
- package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
- package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
- package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
- package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
- package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
- package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
- package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
- package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
- package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
- package/dist/themes/hkdev/components.postcss +55 -55
- package/dist/themes/hkdev/debug.postcss +1 -1
- package/dist/themes/hkdev/global/layout.postcss +39 -39
- package/dist/themes/hkdev/global/on-colors.postcss +53 -53
- package/dist/themes/hkdev/global/text.postcss__ +34 -34
- package/dist/themes/hkdev/global/vars.postcss__ +7 -7
- package/dist/themes/hkdev/globals.postcss +11 -11
- package/dist/themes/hkdev/responsive.postcss +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +227 -227
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.d.ts +2 -2
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +100 -100
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +97 -97
- package/dist/util/design-system/tailwind.js +289 -289
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +45 -45
- package/dist/util/http/http-request.js +273 -273
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +143 -143
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +228 -228
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/index.js +184 -184
- package/dist/util/svelte/index.js +2 -2
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +83 -83
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +82 -82
- package/dist/util/time/index.js +339 -339
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +99 -99
- package/dist/themes/hkdev/components/buttons/button.postcss__ +0 -40
- package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
@@ -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,26 +1,4 @@
|
|
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
|
-
};
|
24
2
|
declare const VirtualViewport: import("svelte").Component<{
|
25
3
|
[attr: string]: any;
|
26
4
|
base?: string;
|