@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,49 +1,49 @@
|
|
1
|
-
<script>
|
2
|
-
// prettier-ignore
|
3
|
-
// import { getTabBarSelectorState }
|
4
|
-
// from "./HkTabBarSelector.state.svelte.js";
|
5
|
-
|
6
|
-
import { createOrGetState }
|
7
|
-
from "./HkTabBarSelector.state.svelte.js";
|
8
|
-
|
9
|
-
/**
|
10
|
-
* @type {{
|
11
|
-
* base?: string,
|
12
|
-
* bg?: string,
|
13
|
-
* classes?: string,
|
14
|
-
* boxBase?: string,
|
15
|
-
* boxBg?: string,
|
16
|
-
* boxPadding?: string,
|
17
|
-
* boxMargin?: string,
|
18
|
-
* boxClasses?: string,
|
19
|
-
* boxAttrs?: { [attr: string]: * },
|
20
|
-
* instanceKey?: Symbol | string
|
21
|
-
* } & { [attr: string]: any }}
|
22
|
-
*/
|
23
|
-
let {
|
24
|
-
// Style
|
25
|
-
base,
|
26
|
-
bg,
|
27
|
-
classes,
|
28
|
-
boxBase,
|
29
|
-
boxBg,
|
30
|
-
boxClasses,
|
31
|
-
|
32
|
-
// State
|
33
|
-
instanceKey
|
34
|
-
} = $props();
|
35
|
-
|
36
|
-
const selectorState = createOrGetState(instanceKey);
|
37
|
-
</script>
|
38
|
-
|
39
|
-
<div
|
40
|
-
data-hk-tab-bar-selector-box
|
41
|
-
class="g-tab-bar-h w-full {boxBase} {boxBg} {boxClasses}"
|
42
|
-
>
|
43
|
-
<div
|
44
|
-
data-hk-tab-bar-selector
|
45
|
-
bind:clientWidth={selectorState.selectorWidth}
|
46
|
-
class="relative opacity-0 {base} {bg} {classes}"
|
47
|
-
style={selectorState.selectorStyle}
|
48
|
-
></div>
|
49
|
-
</div>
|
1
|
+
<script>
|
2
|
+
// prettier-ignore
|
3
|
+
// import { getTabBarSelectorState }
|
4
|
+
// from "./HkTabBarSelector.state.svelte.js";
|
5
|
+
|
6
|
+
import { createOrGetState }
|
7
|
+
from "./HkTabBarSelector.state.svelte.js";
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @type {{
|
11
|
+
* base?: string,
|
12
|
+
* bg?: string,
|
13
|
+
* classes?: string,
|
14
|
+
* boxBase?: string,
|
15
|
+
* boxBg?: string,
|
16
|
+
* boxPadding?: string,
|
17
|
+
* boxMargin?: string,
|
18
|
+
* boxClasses?: string,
|
19
|
+
* boxAttrs?: { [attr: string]: * },
|
20
|
+
* instanceKey?: Symbol | string
|
21
|
+
* } & { [attr: string]: any }}
|
22
|
+
*/
|
23
|
+
let {
|
24
|
+
// Style
|
25
|
+
base,
|
26
|
+
bg,
|
27
|
+
classes,
|
28
|
+
boxBase,
|
29
|
+
boxBg,
|
30
|
+
boxClasses,
|
31
|
+
|
32
|
+
// State
|
33
|
+
instanceKey
|
34
|
+
} = $props();
|
35
|
+
|
36
|
+
const selectorState = createOrGetState(instanceKey);
|
37
|
+
</script>
|
38
|
+
|
39
|
+
<div
|
40
|
+
data-hk-tab-bar-selector-box
|
41
|
+
class="g-tab-bar-h w-full {boxBase} {boxBg} {boxClasses}"
|
42
|
+
>
|
43
|
+
<div
|
44
|
+
data-hk-tab-bar-selector
|
45
|
+
bind:clientWidth={selectorState.selectorWidth}
|
46
|
+
class="relative opacity-0 {base} {bg} {classes}"
|
47
|
+
style={selectorState.selectorStyle}
|
48
|
+
></div>
|
49
|
+
</div>
|
@@ -1,23 +1,4 @@
|
|
1
1
|
export default HkTabBarSelector;
|
2
|
-
type HkTabBarSelector = {
|
3
|
-
$on?(type: string, callback: (e: any) => void): () => void;
|
4
|
-
$set?(props: Partial<{
|
5
|
-
base?: string;
|
6
|
-
bg?: string;
|
7
|
-
classes?: string;
|
8
|
-
boxBase?: string;
|
9
|
-
boxBg?: string;
|
10
|
-
boxPadding?: string;
|
11
|
-
boxMargin?: string;
|
12
|
-
boxClasses?: string;
|
13
|
-
boxAttrs?: {
|
14
|
-
[attr: string]: any;
|
15
|
-
};
|
16
|
-
instanceKey?: string | Symbol;
|
17
|
-
} & {
|
18
|
-
[attr: string]: any;
|
19
|
-
}>): void;
|
20
|
-
};
|
21
2
|
declare const HkTabBarSelector: import("svelte").Component<{
|
22
3
|
base?: string;
|
23
4
|
bg?: string;
|
@@ -1,17 +1,17 @@
|
|
1
|
-
export {
|
2
|
-
createOrGetState as createOrGetTabBarState,
|
3
|
-
createState as createTabBarState,
|
4
|
-
getState as getTabBarState
|
5
|
-
} from './HkTabBar.state.svelte.js';
|
6
|
-
|
7
|
-
export { default as HkTabBar } from './HkTabBar.svelte';
|
8
|
-
|
9
|
-
export {
|
10
|
-
createOrGetState as createOrGetTabBarSelectorState,
|
11
|
-
createState as createTabBarSelectorState,
|
12
|
-
getState as getTabBarSelectorState
|
13
|
-
} from './HkTabBarSelector.state.svelte.js';
|
14
|
-
|
15
|
-
export { default as HkTabBarSelector } from './HkTabBarSelector.svelte';
|
16
|
-
|
17
|
-
export * from './typedef.js';
|
1
|
+
export {
|
2
|
+
createOrGetState as createOrGetTabBarState,
|
3
|
+
createState as createTabBarState,
|
4
|
+
getState as getTabBarState
|
5
|
+
} from './HkTabBar.state.svelte.js';
|
6
|
+
|
7
|
+
export { default as HkTabBar } from './HkTabBar.svelte';
|
8
|
+
|
9
|
+
export {
|
10
|
+
createOrGetState as createOrGetTabBarSelectorState,
|
11
|
+
createState as createTabBarSelectorState,
|
12
|
+
getState as getTabBarSelectorState
|
13
|
+
} from './HkTabBarSelector.state.svelte.js';
|
14
|
+
|
15
|
+
export { default as HkTabBarSelector } from './HkTabBarSelector.svelte';
|
16
|
+
|
17
|
+
export * from './typedef.js';
|
@@ -1,8 +1,8 @@
|
|
1
|
-
/**
|
2
|
-
* @typedef {object} Tab
|
3
|
-
* @property {import('../icon/typedef.js').IconSource} icon
|
4
|
-
* @property {string} [label]
|
5
|
-
*
|
6
|
-
* @property {string} [route]
|
7
|
-
* @property {string} [routePrefix]
|
8
|
-
*/
|
1
|
+
/**
|
2
|
+
* @typedef {object} Tab
|
3
|
+
* @property {import('../icon/typedef.js').IconSource} icon
|
4
|
+
* @property {string} [label]
|
5
|
+
*
|
6
|
+
* @property {string} [route]
|
7
|
+
* @property {string} [routePrefix]
|
8
|
+
*/
|
@@ -1,179 +1,179 @@
|
|
1
|
-
<script>
|
2
|
-
/** @type {HTMLElement | null} */
|
3
|
-
let container = $state(null);
|
4
|
-
let isMouseDown = $state(false);
|
5
|
-
let position = $state(50);
|
6
|
-
|
7
|
-
/** @type {{
|
8
|
-
leftContent?: import('svelte').Snippet,
|
9
|
-
rightContent?: import('svelte').Snippet,
|
10
|
-
classes?: string,
|
11
|
-
dividerColor?: string,
|
12
|
-
handleColor?: string
|
13
|
-
} & Record<string, any>} */
|
14
|
-
let {
|
15
|
-
width='w-[100vw]',
|
16
|
-
height='aspect-video',
|
17
|
-
border='border border-surface-500',
|
18
|
-
classes = '',
|
19
|
-
dividerColor = 'bg-surface-500',
|
20
|
-
handleColor = 'bg-surface-700',
|
21
|
-
|
22
|
-
// Snippets
|
23
|
-
leftContent,
|
24
|
-
rightContent,
|
25
|
-
...attrs
|
26
|
-
} = $props();
|
27
|
-
|
28
|
-
const leftStyle = $derived(`clip-path: inset(0 ${100 - position}% 0 0)`);
|
29
|
-
const rightStyle = $derived(`clip-path: inset(0 0 0 ${position}%)`);
|
30
|
-
const dividerStyle = $derived(`left: ${position}%`);
|
31
|
-
|
32
|
-
/**
|
33
|
-
* Updates the position with keyboard navigation
|
34
|
-
* @param {number} newPosition - The new position to set
|
35
|
-
*/
|
36
|
-
function updatePosition(newPosition) {
|
37
|
-
position = Math.max(0, Math.min(100, newPosition));
|
38
|
-
}
|
39
|
-
|
40
|
-
/**
|
41
|
-
* Handles the mouse down event on the divider
|
42
|
-
* @param {MouseEvent} event - The mouse event
|
43
|
-
*/
|
44
|
-
function handleMouseDown(event) {
|
45
|
-
event.preventDefault();
|
46
|
-
isMouseDown = true;
|
47
|
-
}
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Updates the divider position based on mouse movement
|
51
|
-
* @param {MouseEvent} event - The mouse event
|
52
|
-
*/
|
53
|
-
function handleMouseMove(event) {
|
54
|
-
if (!isMouseDown || !container) return;
|
55
|
-
|
56
|
-
const rect = container.getBoundingClientRect();
|
57
|
-
const x = Math.min(Math.max(0, event.clientX - rect.left), rect.width);
|
58
|
-
updatePosition((x / rect.width) * 100);
|
59
|
-
}
|
60
|
-
|
61
|
-
/**
|
62
|
-
* Handles keyboard navigation for the slider
|
63
|
-
* @param {KeyboardEvent} event - The keyboard event
|
64
|
-
*/
|
65
|
-
function handleKeyDown(event) {
|
66
|
-
const step = event.shiftKey ? 10 : 1;
|
67
|
-
|
68
|
-
switch (event.key) {
|
69
|
-
case 'ArrowLeft':
|
70
|
-
case 'ArrowDown':
|
71
|
-
event.preventDefault();
|
72
|
-
updatePosition(position - step);
|
73
|
-
break;
|
74
|
-
case 'ArrowRight':
|
75
|
-
case 'ArrowUp':
|
76
|
-
event.preventDefault();
|
77
|
-
updatePosition(position + step);
|
78
|
-
break;
|
79
|
-
case 'Home':
|
80
|
-
event.preventDefault();
|
81
|
-
updatePosition(0);
|
82
|
-
break;
|
83
|
-
case 'End':
|
84
|
-
event.preventDefault();
|
85
|
-
updatePosition(100);
|
86
|
-
break;
|
87
|
-
case 'PageDown':
|
88
|
-
event.preventDefault();
|
89
|
-
updatePosition(position - 10);
|
90
|
-
break;
|
91
|
-
case 'PageUp':
|
92
|
-
event.preventDefault();
|
93
|
-
updatePosition(position + 10);
|
94
|
-
break;
|
95
|
-
}
|
96
|
-
}
|
97
|
-
|
98
|
-
/**
|
99
|
-
* Resets the mouse down state
|
100
|
-
*/
|
101
|
-
function handleMouseUp() {
|
102
|
-
isMouseDown = false;
|
103
|
-
}
|
104
|
-
|
105
|
-
// Effect to handle document-level mouse events
|
106
|
-
$effect(() => {
|
107
|
-
if (isMouseDown) {
|
108
|
-
document.addEventListener('mousemove', handleMouseMove);
|
109
|
-
document.addEventListener('mouseup', handleMouseUp);
|
110
|
-
}
|
111
|
-
|
112
|
-
return () => {
|
113
|
-
document.removeEventListener('mousemove', handleMouseMove);
|
114
|
-
document.removeEventListener('mouseup', handleMouseUp);
|
115
|
-
};
|
116
|
-
});
|
117
|
-
</script>
|
118
|
-
|
119
|
-
<div
|
120
|
-
bind:this={container}
|
121
|
-
class="relative {width} {height} {border} {classes}"
|
122
|
-
role="group"
|
123
|
-
aria-label="Content comparison"
|
124
|
-
{...attrs}
|
125
|
-
>
|
126
|
-
<!-- Content container - both pieces of content are positioned absolutely -->
|
127
|
-
<div class="relative h-full w-full">
|
128
|
-
<!-- Left content -->
|
129
|
-
<div
|
130
|
-
class="absolute h-full w-full"
|
131
|
-
style={leftStyle}
|
132
|
-
>
|
133
|
-
{@render leftContent()}
|
134
|
-
</div>
|
135
|
-
|
136
|
-
<!-- Right content -->
|
137
|
-
<div
|
138
|
-
class="absolute h-full w-full"
|
139
|
-
style={rightStyle}
|
140
|
-
>
|
141
|
-
{@render rightContent()}
|
142
|
-
</div>
|
143
|
-
</div>
|
144
|
-
|
145
|
-
<!-- Slider control -->
|
146
|
-
<div
|
147
|
-
class="absolute inset-y-0 z-10 flex w-1 items-center justify-center {dividerColor}"
|
148
|
-
style={dividerStyle}
|
149
|
-
>
|
150
|
-
<!-- Vertical separator line -->
|
151
|
-
<div class="absolute inset-y-0 w-0.5 bg-current opacity-50 pointer-events-none"></div>
|
152
|
-
|
153
|
-
<button
|
154
|
-
class="flex h-10 w-10 items-center justify-center rounded-full shadow-lg transition-transform {handleColor}"
|
155
|
-
onmousedown={handleMouseDown}
|
156
|
-
onkeydown={handleKeyDown}
|
157
|
-
role="slider"
|
158
|
-
aria-orientation="vertical"
|
159
|
-
aria-valuenow={position}
|
160
|
-
aria-valuemin={0}
|
161
|
-
aria-valuemax={100}
|
162
|
-
aria-label="Adjust divider position"
|
163
|
-
>
|
164
|
-
<svg
|
165
|
-
class="h-6 w-6 stroke-surface-50"
|
166
|
-
viewBox="0 0 24 24"
|
167
|
-
fill="none"
|
168
|
-
stroke="currentColor"
|
169
|
-
stroke-width="2"
|
170
|
-
stroke-linecap="round"
|
171
|
-
stroke-linejoin="round"
|
172
|
-
>
|
173
|
-
<path d="M7 16l-4-4 4-4" />
|
174
|
-
<path d="M17 8l4 4-4 4" />
|
175
|
-
<path d="M3 12h18" />
|
176
|
-
</svg>
|
177
|
-
</button>
|
178
|
-
</div>
|
179
|
-
</div>
|
1
|
+
<script>
|
2
|
+
/** @type {HTMLElement | null} */
|
3
|
+
let container = $state(null);
|
4
|
+
let isMouseDown = $state(false);
|
5
|
+
let position = $state(50);
|
6
|
+
|
7
|
+
/** @type {{
|
8
|
+
leftContent?: import('svelte').Snippet,
|
9
|
+
rightContent?: import('svelte').Snippet,
|
10
|
+
classes?: string,
|
11
|
+
dividerColor?: string,
|
12
|
+
handleColor?: string
|
13
|
+
} & Record<string, any>} */
|
14
|
+
let {
|
15
|
+
width='w-[100vw]',
|
16
|
+
height='aspect-video',
|
17
|
+
border='border border-surface-500',
|
18
|
+
classes = '',
|
19
|
+
dividerColor = 'bg-surface-500',
|
20
|
+
handleColor = 'bg-surface-700',
|
21
|
+
|
22
|
+
// Snippets
|
23
|
+
leftContent,
|
24
|
+
rightContent,
|
25
|
+
...attrs
|
26
|
+
} = $props();
|
27
|
+
|
28
|
+
const leftStyle = $derived(`clip-path: inset(0 ${100 - position}% 0 0)`);
|
29
|
+
const rightStyle = $derived(`clip-path: inset(0 0 0 ${position}%)`);
|
30
|
+
const dividerStyle = $derived(`left: ${position}%`);
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Updates the position with keyboard navigation
|
34
|
+
* @param {number} newPosition - The new position to set
|
35
|
+
*/
|
36
|
+
function updatePosition(newPosition) {
|
37
|
+
position = Math.max(0, Math.min(100, newPosition));
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Handles the mouse down event on the divider
|
42
|
+
* @param {MouseEvent} event - The mouse event
|
43
|
+
*/
|
44
|
+
function handleMouseDown(event) {
|
45
|
+
event.preventDefault();
|
46
|
+
isMouseDown = true;
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Updates the divider position based on mouse movement
|
51
|
+
* @param {MouseEvent} event - The mouse event
|
52
|
+
*/
|
53
|
+
function handleMouseMove(event) {
|
54
|
+
if (!isMouseDown || !container) return;
|
55
|
+
|
56
|
+
const rect = container.getBoundingClientRect();
|
57
|
+
const x = Math.min(Math.max(0, event.clientX - rect.left), rect.width);
|
58
|
+
updatePosition((x / rect.width) * 100);
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Handles keyboard navigation for the slider
|
63
|
+
* @param {KeyboardEvent} event - The keyboard event
|
64
|
+
*/
|
65
|
+
function handleKeyDown(event) {
|
66
|
+
const step = event.shiftKey ? 10 : 1;
|
67
|
+
|
68
|
+
switch (event.key) {
|
69
|
+
case 'ArrowLeft':
|
70
|
+
case 'ArrowDown':
|
71
|
+
event.preventDefault();
|
72
|
+
updatePosition(position - step);
|
73
|
+
break;
|
74
|
+
case 'ArrowRight':
|
75
|
+
case 'ArrowUp':
|
76
|
+
event.preventDefault();
|
77
|
+
updatePosition(position + step);
|
78
|
+
break;
|
79
|
+
case 'Home':
|
80
|
+
event.preventDefault();
|
81
|
+
updatePosition(0);
|
82
|
+
break;
|
83
|
+
case 'End':
|
84
|
+
event.preventDefault();
|
85
|
+
updatePosition(100);
|
86
|
+
break;
|
87
|
+
case 'PageDown':
|
88
|
+
event.preventDefault();
|
89
|
+
updatePosition(position - 10);
|
90
|
+
break;
|
91
|
+
case 'PageUp':
|
92
|
+
event.preventDefault();
|
93
|
+
updatePosition(position + 10);
|
94
|
+
break;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Resets the mouse down state
|
100
|
+
*/
|
101
|
+
function handleMouseUp() {
|
102
|
+
isMouseDown = false;
|
103
|
+
}
|
104
|
+
|
105
|
+
// Effect to handle document-level mouse events
|
106
|
+
$effect(() => {
|
107
|
+
if (isMouseDown) {
|
108
|
+
document.addEventListener('mousemove', handleMouseMove);
|
109
|
+
document.addEventListener('mouseup', handleMouseUp);
|
110
|
+
}
|
111
|
+
|
112
|
+
return () => {
|
113
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
114
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
115
|
+
};
|
116
|
+
});
|
117
|
+
</script>
|
118
|
+
|
119
|
+
<div
|
120
|
+
bind:this={container}
|
121
|
+
class="relative {width} {height} {border} {classes}"
|
122
|
+
role="group"
|
123
|
+
aria-label="Content comparison"
|
124
|
+
{...attrs}
|
125
|
+
>
|
126
|
+
<!-- Content container - both pieces of content are positioned absolutely -->
|
127
|
+
<div class="relative h-full w-full">
|
128
|
+
<!-- Left content -->
|
129
|
+
<div
|
130
|
+
class="absolute h-full w-full"
|
131
|
+
style={leftStyle}
|
132
|
+
>
|
133
|
+
{@render leftContent()}
|
134
|
+
</div>
|
135
|
+
|
136
|
+
<!-- Right content -->
|
137
|
+
<div
|
138
|
+
class="absolute h-full w-full"
|
139
|
+
style={rightStyle}
|
140
|
+
>
|
141
|
+
{@render rightContent()}
|
142
|
+
</div>
|
143
|
+
</div>
|
144
|
+
|
145
|
+
<!-- Slider control -->
|
146
|
+
<div
|
147
|
+
class="absolute inset-y-0 z-10 flex w-1 items-center justify-center {dividerColor}"
|
148
|
+
style={dividerStyle}
|
149
|
+
>
|
150
|
+
<!-- Vertical separator line -->
|
151
|
+
<div class="absolute inset-y-0 w-0.5 bg-current opacity-50 pointer-events-none"></div>
|
152
|
+
|
153
|
+
<button
|
154
|
+
class="flex h-10 w-10 items-center justify-center rounded-full shadow-lg transition-transform {handleColor}"
|
155
|
+
onmousedown={handleMouseDown}
|
156
|
+
onkeydown={handleKeyDown}
|
157
|
+
role="slider"
|
158
|
+
aria-orientation="vertical"
|
159
|
+
aria-valuenow={position}
|
160
|
+
aria-valuemin={0}
|
161
|
+
aria-valuemax={100}
|
162
|
+
aria-label="Adjust divider position"
|
163
|
+
>
|
164
|
+
<svg
|
165
|
+
class="h-6 w-6 stroke-surface-50"
|
166
|
+
viewBox="0 0 24 24"
|
167
|
+
fill="none"
|
168
|
+
stroke="currentColor"
|
169
|
+
stroke-width="2"
|
170
|
+
stroke-linecap="round"
|
171
|
+
stroke-linejoin="round"
|
172
|
+
>
|
173
|
+
<path d="M7 16l-4-4 4-4" />
|
174
|
+
<path d="M17 8l4 4-4 4" />
|
175
|
+
<path d="M3 12h18" />
|
176
|
+
</svg>
|
177
|
+
</button>
|
178
|
+
</div>
|
179
|
+
</div>
|
@@ -1,14 +1,4 @@
|
|
1
1
|
export default CompareLeftRight;
|
2
|
-
type CompareLeftRight = {
|
3
|
-
$on?(type: string, callback: (e: any) => void): () => void;
|
4
|
-
$set?(props: Partial<{
|
5
|
-
leftContent?: Snippet<[]>;
|
6
|
-
rightContent?: Snippet<[]>;
|
7
|
-
classes?: string;
|
8
|
-
dividerColor?: string;
|
9
|
-
handleColor?: string;
|
10
|
-
} & Record<string, any>>): void;
|
11
|
-
};
|
12
2
|
declare const CompareLeftRight: import("svelte").Component<{
|
13
3
|
leftContent?: import("svelte").Snippet;
|
14
4
|
rightContent?: import("svelte").Snippet;
|
@@ -1 +1 @@
|
|
1
|
-
export { default as CompareLeftRight } from "./CompareLeftRight.svelte";
|
1
|
+
export { default as CompareLeftRight } from "./CompareLeftRight.svelte";
|
@@ -1 +1 @@
|
|
1
|
-
export { default as ScaleControl } from './ScaleControl.svelte';
|
1
|
+
export { default as ScaleControl } from './ScaleControl.svelte';
|