@hkdigital/lib-sveltekit 0.1.60 → 0.1.62
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 +135 -135
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- 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 +4 -4
- 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 +295 -295
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/finite-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/index.js +14 -14
- 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/HkGridArea.svelte +77 -77
- package/dist/components/area/index.js +2 -2
- package/dist/components/buttons/button/Button.svelte +82 -82
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/index.js +3 -3
- package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/components/debug/index.js +1 -1
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/icons/HkIcon.svelte +86 -86
- package/dist/components/icons/HkTabIcon.svelte +116 -116
- package/dist/components/icons/SteezeIcon.svelte +97 -97
- package/dist/components/icons/index.js +6 -6
- package/dist/components/icons/typedef.js +16 -16
- 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 +223 -223
- 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/grid-layers/GridLayers.svelte +167 -167
- package/dist/components/layout/index.js +1 -1
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/panel/Panel.svelte +43 -43
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- 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/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +8 -8
- 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/bases.js +13 -13
- 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/utilities.css +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.js +158 -158
- 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.css +41 -41
- package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/themes/hkdev/components/buttons/button.css +142 -142
- package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
- package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
- package/dist/themes/hkdev/components/panels/panel.css +27 -27
- package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
- package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
- package/dist/themes/hkdev/components.css +47 -47
- package/dist/themes/hkdev/debug.css +1 -1
- package/dist/themes/hkdev/global/layout.css +39 -39
- package/dist/themes/hkdev/global/on-colors.css +53 -53
- package/dist/themes/hkdev/globals.css +11 -11
- package/dist/themes/hkdev/responsive.css +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +235 -235
- package/dist/themes/index.js +1 -1
- package/dist/util/array/index.js +455 -455
- package/dist/util/bases/base58.js +262 -262
- package/dist/util/bases/index.js +1 -1
- 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.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 +228 -228
- package/dist/util/design-system/skeleton.js +208 -208
- package/dist/util/design-system/tailwind.js +288 -288
- 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 +294 -294
- 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 +241 -241
- 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/array-path.js +75 -75
- package/dist/util/string/convert.js +54 -54
- package/dist/util/string/fs.js +226 -226
- package/dist/util/string/index.js +5 -5
- package/dist/util/string/interpolate.js +61 -61
- package/dist/util/string/pad.js +10 -10
- package/dist/util/svelte/index.js +4 -4
- package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
- 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 +101 -101
- package/dist/util/time/index.js +323 -323
- package/dist/util/unique/index.js +249 -249
- 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/widgets/button-group/ButtonGroup.svelte +94 -80
- package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +6 -0
- package/dist/widgets/button-group/typedef.js +10 -10
- package/dist/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/widgets/compare-left-right/index.js +1 -1
- package/dist/widgets/game-box/GameBox.svelte +186 -186
- package/dist/widgets/game-box/gamebox.util.js +83 -83
- package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/widgets/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/widgets/image-box/ImageBox.svelte +212 -212
- package/dist/widgets/image-box/index.js +5 -5
- package/dist/widgets/image-box/typedef.js +32 -32
- package/dist/widgets/index.js +23 -23
- package/dist/widgets/presenter/ImageSlide.svelte +64 -64
- package/dist/widgets/presenter/Presenter.state.svelte.js +636 -636
- package/dist/widgets/presenter/Presenter.svelte +140 -140
- package/dist/widgets/presenter/constants.js +7 -7
- package/dist/widgets/presenter/index.js +10 -10
- package/dist/widgets/presenter/typedef.js +106 -106
- package/dist/widgets/presenter/util.js +210 -210
- package/dist/widgets/virtual-viewport/VirtualViewport.svelte +196 -196
- 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 +102 -102
- package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +0 -613
- package/dist/widgets/presenter/Presenter.svelte__ +0 -125
@@ -1,186 +1,186 @@
|
|
1
|
-
<script>
|
2
|
-
import { onMount } from 'svelte';
|
3
|
-
import {
|
4
|
-
getGameWidthOnLandscape,
|
5
|
-
getGameWidthOnPortrait
|
6
|
-
} from './gamebox.util.js';
|
7
|
-
import { enableContainerScaling } from '../../util/design-system/index.js';
|
8
|
-
|
9
|
-
/**
|
10
|
-
* @type {{
|
11
|
-
* base?: string,
|
12
|
-
* bg?: string,
|
13
|
-
* classes?: string,
|
14
|
-
* style?: string,
|
15
|
-
* aspectOnLandscape?: number,
|
16
|
-
* aspectOnPortrait?: number,
|
17
|
-
* enableScaling?: boolean,
|
18
|
-
* designLandscape?: {width: number, height: number},
|
19
|
-
* designPortrait?: {width: number, height: number},
|
20
|
-
* clamping?: {
|
21
|
-
* ui: {min: number, max: number},
|
22
|
-
* textBase: {min: number, max: number},
|
23
|
-
* textHeading: {min: number, max: number},
|
24
|
-
* textUi: {min: number, max: number}
|
25
|
-
* },
|
26
|
-
* snippetLandscape?: import('svelte').Snippet,
|
27
|
-
* snippetPortrait?: import('svelte').Snippet,
|
28
|
-
* [attr: string]: any
|
29
|
-
* }}
|
30
|
-
*/
|
31
|
-
const {
|
32
|
-
// > Style
|
33
|
-
base = '',
|
34
|
-
bg = '',
|
35
|
-
classes = '',
|
36
|
-
style = '',
|
37
|
-
|
38
|
-
// > Functional properties
|
39
|
-
aspectOnLandscape,
|
40
|
-
aspectOnPortrait,
|
41
|
-
|
42
|
-
marginLeft = 0,
|
43
|
-
marginRight = 0,
|
44
|
-
|
45
|
-
marginTop = 0,
|
46
|
-
marginBottom = 0,
|
47
|
-
|
48
|
-
// > Scaling options
|
49
|
-
enableScaling = false,
|
50
|
-
designLandscape = { width: 1920, height: 1080 },
|
51
|
-
designPortrait = { width: 1080, height: 1920 },
|
52
|
-
clamping = {
|
53
|
-
ui: { min: 0.3, max: 2 },
|
54
|
-
textBase: { min: 0.75, max: 1.5 },
|
55
|
-
textHeading: { min: 0.75, max: 2.25 },
|
56
|
-
textUi: { min: 0.5, max: 1.25 }
|
57
|
-
},
|
58
|
-
|
59
|
-
// > Snippets
|
60
|
-
snippetLandscape,
|
61
|
-
snippetPortrait
|
62
|
-
} = $props();
|
63
|
-
|
64
|
-
// > Game dimensions and state
|
65
|
-
let windowWidth = $state();
|
66
|
-
let windowHeight = $state();
|
67
|
-
let gameWidth = $state();
|
68
|
-
let gameHeight = $state();
|
69
|
-
let isLandscape = $derived(windowWidth > windowHeight);
|
70
|
-
|
71
|
-
// Game container reference
|
72
|
-
let gameContainer = $state();
|
73
|
-
|
74
|
-
// Update game dimensions based on window size and orientation
|
75
|
-
$effect(() => {
|
76
|
-
if (!windowWidth || !windowHeight) return;
|
77
|
-
|
78
|
-
const availWidth = windowWidth - marginLeft - marginRight;
|
79
|
-
const availHeight = windowHeight - marginTop - marginBottom;
|
80
|
-
|
81
|
-
// console.debug('GameBox margins:', {
|
82
|
-
// marginLeft,
|
83
|
-
// marginRight,
|
84
|
-
// marginTop,
|
85
|
-
// marginBottom
|
86
|
-
// });
|
87
|
-
|
88
|
-
let gameAspect;
|
89
|
-
|
90
|
-
if (availWidth > availHeight) {
|
91
|
-
gameWidth = getGameWidthOnLandscape({
|
92
|
-
windowWidth: availWidth,
|
93
|
-
windowHeight: availHeight,
|
94
|
-
aspectOnLandscape
|
95
|
-
});
|
96
|
-
gameAspect = aspectOnLandscape;
|
97
|
-
} else {
|
98
|
-
gameWidth = getGameWidthOnPortrait({
|
99
|
-
windowWidth: availWidth,
|
100
|
-
windowHeight: availHeight,
|
101
|
-
aspectOnPortrait
|
102
|
-
});
|
103
|
-
gameAspect = aspectOnPortrait;
|
104
|
-
}
|
105
|
-
|
106
|
-
if (gameAspect) {
|
107
|
-
gameHeight = gameWidth / gameAspect;
|
108
|
-
} else {
|
109
|
-
gameHeight = availHeight;
|
110
|
-
}
|
111
|
-
});
|
112
|
-
|
113
|
-
// Set up scaling if enabled, with orientation awareness
|
114
|
-
$effect(() => {
|
115
|
-
if (!enableScaling || !gameContainer || !gameWidth || !gameHeight) {
|
116
|
-
return () => {}; // No-op cleanup if scaling not enabled or required elements missing
|
117
|
-
}
|
118
|
-
|
119
|
-
// Select the appropriate design based on orientation
|
120
|
-
const activeDesign = isLandscape ? designLandscape : designPortrait;
|
121
|
-
|
122
|
-
// console.debug(
|
123
|
-
// `GameBox scaling [${isLandscape ? 'landscape' : 'portrait'}]:`,
|
124
|
-
// `game: ${gameWidth}x${gameHeight}`,
|
125
|
-
// `design: ${activeDesign.width}x${activeDesign.height}`
|
126
|
-
// );
|
127
|
-
|
128
|
-
// Apply scaling with the current design based on orientation
|
129
|
-
return enableContainerScaling({
|
130
|
-
container: gameContainer,
|
131
|
-
design: activeDesign,
|
132
|
-
clamping,
|
133
|
-
getDimensions: () => ({
|
134
|
-
width: gameWidth,
|
135
|
-
height: gameHeight
|
136
|
-
})
|
137
|
-
});
|
138
|
-
});
|
139
|
-
|
140
|
-
onMount(() => {
|
141
|
-
const gameBoxNoScroll = 'game-box-no-scroll';
|
142
|
-
const html = document.documentElement;
|
143
|
-
html.classList.add(gameBoxNoScroll);
|
144
|
-
|
145
|
-
return () => {
|
146
|
-
html.classList.remove(gameBoxNoScroll);
|
147
|
-
};
|
148
|
-
});
|
149
|
-
</script>
|
150
|
-
|
151
|
-
<svelte:window bind:innerWidth={windowWidth} bind:innerHeight={windowHeight} />
|
152
|
-
|
153
|
-
{#if gameHeight}
|
154
|
-
<div
|
155
|
-
data-component="game-box"
|
156
|
-
data-orientation={isLandscape ? 'landscape' : 'portrait'}
|
157
|
-
bind:this={gameContainer}
|
158
|
-
class="{base} {bg} {classes}"
|
159
|
-
style:width="{gameWidth}px"
|
160
|
-
style:height="{gameHeight}px"
|
161
|
-
style:--game-width={gameWidth}
|
162
|
-
style:--game-height={gameHeight}
|
163
|
-
style:margin-left="{marginLeft}px"
|
164
|
-
style:margin-right="{marginRight}px"
|
165
|
-
style:margin-top="{marginTop}px"
|
166
|
-
style:margin-bottom="{marginBottom}px"
|
167
|
-
{style}
|
168
|
-
>
|
169
|
-
{#if isLandscape}
|
170
|
-
{@render snippetLandscape()}
|
171
|
-
{:else}
|
172
|
-
{@render snippetPortrait()}
|
173
|
-
{/if}
|
174
|
-
</div>
|
175
|
-
{/if}
|
176
|
-
|
177
|
-
<style>
|
178
|
-
:global(html.game-box-no-scroll) {
|
179
|
-
overflow: clip;
|
180
|
-
scrollbar-width: none; /* Firefox */
|
181
|
-
-ms-overflow-style: none; /* IE and Edge */
|
182
|
-
}
|
183
|
-
:global(html.game-box-no-scroll::-webkit-scrollbar) {
|
184
|
-
display: none;
|
185
|
-
}
|
186
|
-
</style>
|
1
|
+
<script>
|
2
|
+
import { onMount } from 'svelte';
|
3
|
+
import {
|
4
|
+
getGameWidthOnLandscape,
|
5
|
+
getGameWidthOnPortrait
|
6
|
+
} from './gamebox.util.js';
|
7
|
+
import { enableContainerScaling } from '../../util/design-system/index.js';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @type {{
|
11
|
+
* base?: string,
|
12
|
+
* bg?: string,
|
13
|
+
* classes?: string,
|
14
|
+
* style?: string,
|
15
|
+
* aspectOnLandscape?: number,
|
16
|
+
* aspectOnPortrait?: number,
|
17
|
+
* enableScaling?: boolean,
|
18
|
+
* designLandscape?: {width: number, height: number},
|
19
|
+
* designPortrait?: {width: number, height: number},
|
20
|
+
* clamping?: {
|
21
|
+
* ui: {min: number, max: number},
|
22
|
+
* textBase: {min: number, max: number},
|
23
|
+
* textHeading: {min: number, max: number},
|
24
|
+
* textUi: {min: number, max: number}
|
25
|
+
* },
|
26
|
+
* snippetLandscape?: import('svelte').Snippet,
|
27
|
+
* snippetPortrait?: import('svelte').Snippet,
|
28
|
+
* [attr: string]: any
|
29
|
+
* }}
|
30
|
+
*/
|
31
|
+
const {
|
32
|
+
// > Style
|
33
|
+
base = '',
|
34
|
+
bg = '',
|
35
|
+
classes = '',
|
36
|
+
style = '',
|
37
|
+
|
38
|
+
// > Functional properties
|
39
|
+
aspectOnLandscape,
|
40
|
+
aspectOnPortrait,
|
41
|
+
|
42
|
+
marginLeft = 0,
|
43
|
+
marginRight = 0,
|
44
|
+
|
45
|
+
marginTop = 0,
|
46
|
+
marginBottom = 0,
|
47
|
+
|
48
|
+
// > Scaling options
|
49
|
+
enableScaling = false,
|
50
|
+
designLandscape = { width: 1920, height: 1080 },
|
51
|
+
designPortrait = { width: 1080, height: 1920 },
|
52
|
+
clamping = {
|
53
|
+
ui: { min: 0.3, max: 2 },
|
54
|
+
textBase: { min: 0.75, max: 1.5 },
|
55
|
+
textHeading: { min: 0.75, max: 2.25 },
|
56
|
+
textUi: { min: 0.5, max: 1.25 }
|
57
|
+
},
|
58
|
+
|
59
|
+
// > Snippets
|
60
|
+
snippetLandscape,
|
61
|
+
snippetPortrait
|
62
|
+
} = $props();
|
63
|
+
|
64
|
+
// > Game dimensions and state
|
65
|
+
let windowWidth = $state();
|
66
|
+
let windowHeight = $state();
|
67
|
+
let gameWidth = $state();
|
68
|
+
let gameHeight = $state();
|
69
|
+
let isLandscape = $derived(windowWidth > windowHeight);
|
70
|
+
|
71
|
+
// Game container reference
|
72
|
+
let gameContainer = $state();
|
73
|
+
|
74
|
+
// Update game dimensions based on window size and orientation
|
75
|
+
$effect(() => {
|
76
|
+
if (!windowWidth || !windowHeight) return;
|
77
|
+
|
78
|
+
const availWidth = windowWidth - marginLeft - marginRight;
|
79
|
+
const availHeight = windowHeight - marginTop - marginBottom;
|
80
|
+
|
81
|
+
// console.debug('GameBox margins:', {
|
82
|
+
// marginLeft,
|
83
|
+
// marginRight,
|
84
|
+
// marginTop,
|
85
|
+
// marginBottom
|
86
|
+
// });
|
87
|
+
|
88
|
+
let gameAspect;
|
89
|
+
|
90
|
+
if (availWidth > availHeight) {
|
91
|
+
gameWidth = getGameWidthOnLandscape({
|
92
|
+
windowWidth: availWidth,
|
93
|
+
windowHeight: availHeight,
|
94
|
+
aspectOnLandscape
|
95
|
+
});
|
96
|
+
gameAspect = aspectOnLandscape;
|
97
|
+
} else {
|
98
|
+
gameWidth = getGameWidthOnPortrait({
|
99
|
+
windowWidth: availWidth,
|
100
|
+
windowHeight: availHeight,
|
101
|
+
aspectOnPortrait
|
102
|
+
});
|
103
|
+
gameAspect = aspectOnPortrait;
|
104
|
+
}
|
105
|
+
|
106
|
+
if (gameAspect) {
|
107
|
+
gameHeight = gameWidth / gameAspect;
|
108
|
+
} else {
|
109
|
+
gameHeight = availHeight;
|
110
|
+
}
|
111
|
+
});
|
112
|
+
|
113
|
+
// Set up scaling if enabled, with orientation awareness
|
114
|
+
$effect(() => {
|
115
|
+
if (!enableScaling || !gameContainer || !gameWidth || !gameHeight) {
|
116
|
+
return () => {}; // No-op cleanup if scaling not enabled or required elements missing
|
117
|
+
}
|
118
|
+
|
119
|
+
// Select the appropriate design based on orientation
|
120
|
+
const activeDesign = isLandscape ? designLandscape : designPortrait;
|
121
|
+
|
122
|
+
// console.debug(
|
123
|
+
// `GameBox scaling [${isLandscape ? 'landscape' : 'portrait'}]:`,
|
124
|
+
// `game: ${gameWidth}x${gameHeight}`,
|
125
|
+
// `design: ${activeDesign.width}x${activeDesign.height}`
|
126
|
+
// );
|
127
|
+
|
128
|
+
// Apply scaling with the current design based on orientation
|
129
|
+
return enableContainerScaling({
|
130
|
+
container: gameContainer,
|
131
|
+
design: activeDesign,
|
132
|
+
clamping,
|
133
|
+
getDimensions: () => ({
|
134
|
+
width: gameWidth,
|
135
|
+
height: gameHeight
|
136
|
+
})
|
137
|
+
});
|
138
|
+
});
|
139
|
+
|
140
|
+
onMount(() => {
|
141
|
+
const gameBoxNoScroll = 'game-box-no-scroll';
|
142
|
+
const html = document.documentElement;
|
143
|
+
html.classList.add(gameBoxNoScroll);
|
144
|
+
|
145
|
+
return () => {
|
146
|
+
html.classList.remove(gameBoxNoScroll);
|
147
|
+
};
|
148
|
+
});
|
149
|
+
</script>
|
150
|
+
|
151
|
+
<svelte:window bind:innerWidth={windowWidth} bind:innerHeight={windowHeight} />
|
152
|
+
|
153
|
+
{#if gameHeight}
|
154
|
+
<div
|
155
|
+
data-component="game-box"
|
156
|
+
data-orientation={isLandscape ? 'landscape' : 'portrait'}
|
157
|
+
bind:this={gameContainer}
|
158
|
+
class="{base} {bg} {classes}"
|
159
|
+
style:width="{gameWidth}px"
|
160
|
+
style:height="{gameHeight}px"
|
161
|
+
style:--game-width={gameWidth}
|
162
|
+
style:--game-height={gameHeight}
|
163
|
+
style:margin-left="{marginLeft}px"
|
164
|
+
style:margin-right="{marginRight}px"
|
165
|
+
style:margin-top="{marginTop}px"
|
166
|
+
style:margin-bottom="{marginBottom}px"
|
167
|
+
{style}
|
168
|
+
>
|
169
|
+
{#if isLandscape}
|
170
|
+
{@render snippetLandscape()}
|
171
|
+
{:else}
|
172
|
+
{@render snippetPortrait()}
|
173
|
+
{/if}
|
174
|
+
</div>
|
175
|
+
{/if}
|
176
|
+
|
177
|
+
<style>
|
178
|
+
:global(html.game-box-no-scroll) {
|
179
|
+
overflow: clip;
|
180
|
+
scrollbar-width: none; /* Firefox */
|
181
|
+
-ms-overflow-style: none; /* IE and Edge */
|
182
|
+
}
|
183
|
+
:global(html.game-box-no-scroll::-webkit-scrollbar) {
|
184
|
+
display: none;
|
185
|
+
}
|
186
|
+
</style>
|
@@ -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,25 +1,25 @@
|
|
1
|
-
import { defineStateContext } from '../../util/svelte/state-context';
|
2
|
-
|
3
|
-
import { browser } from '$app/environment';
|
4
|
-
|
5
|
-
import { MediaQuery } from 'svelte/reactivity';
|
6
|
-
|
7
|
-
/* ------------------------------------------------------- Define state class */
|
8
|
-
|
9
|
-
export class AppLayoutState {
|
10
|
-
landscapeOnSmallScreen = $state(false);
|
11
|
-
|
12
|
-
constructor() {
|
13
|
-
if (browser) {
|
14
|
-
let mq = new MediaQuery('(max-height: 400px');
|
15
|
-
|
16
|
-
$effect(() => {
|
17
|
-
this.landscapeOnSmallScreen = mq.matches ? true : false;
|
18
|
-
});
|
19
|
-
}
|
20
|
-
}
|
21
|
-
}
|
22
|
-
|
23
|
-
/* -------------------------------------- Export create & get state functions */
|
24
|
-
|
25
|
-
export const [createOrGetState, createState, getState] = defineStateContext(AppLayoutState);
|
1
|
+
import { defineStateContext } from '../../util/svelte/state-context';
|
2
|
+
|
3
|
+
import { browser } from '$app/environment';
|
4
|
+
|
5
|
+
import { MediaQuery } from 'svelte/reactivity';
|
6
|
+
|
7
|
+
/* ------------------------------------------------------- Define state class */
|
8
|
+
|
9
|
+
export class AppLayoutState {
|
10
|
+
landscapeOnSmallScreen = $state(false);
|
11
|
+
|
12
|
+
constructor() {
|
13
|
+
if (browser) {
|
14
|
+
let mq = new MediaQuery('(max-height: 400px');
|
15
|
+
|
16
|
+
$effect(() => {
|
17
|
+
this.landscapeOnSmallScreen = mq.matches ? true : false;
|
18
|
+
});
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
/* -------------------------------------- Export create & get state functions */
|
24
|
+
|
25
|
+
export const [createOrGetState, createState, getState] = defineStateContext(AppLayoutState);
|