@hkdigital/lib-core 0.3.11 → 0.3.13
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 +173 -149
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- package/dist/classes/data/IterableTree.js +242 -242
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/data/typedef.js +9 -9
- package/dist/classes/event-emitter/EventEmitter.js +273 -273
- package/dist/classes/event-emitter/index.js +2 -2
- package/dist/classes/index.js +4 -4
- package/dist/classes/promise/HkPromise.js +384 -384
- 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 +111 -111
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- 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/index.js +1 -11
- 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/config/README.md +197 -196
- package/dist/config/generators/imagetools.js +189 -189
- package/dist/config/generators/vite.js +148 -142
- package/dist/config/imagetools.d.ts +72 -72
- package/dist/config/vite.js +4 -4
- package/dist/constants/bases/index.js +13 -13
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +14 -14
- package/dist/constants/index.js +6 -6
- 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/README.md +96 -95
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.d.ts +4 -4
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/url.js +3 -3
- package/dist/constants/regexp/user.js +29 -29
- package/dist/constants/states/drag.js +6 -6
- package/dist/constants/states/drop.js +6 -6
- package/dist/constants/states/index.js +4 -4
- package/dist/constants/states/input.js +11 -11
- package/dist/constants/states/submit.js +4 -4
- package/dist/constants/time/index.js +28 -28
- package/dist/css/utilities.css +43 -43
- package/dist/design/README.md +405 -405
- package/dist/design/config/design-config.js +73 -73
- package/dist/design/generators/index.js +288 -288
- package/dist/design/index.js +96 -96
- package/dist/design/plugins/skeleton.js +208 -208
- package/dist/design/tailwind-theme-extend.js +158 -158
- package/dist/design/themes/README.md +102 -102
- package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
- package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
- package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
- package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
- package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
- package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
- package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
- package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
- package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
- package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
- package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
- package/dist/design/themes/hkdev/components.css +29 -29
- package/dist/design/themes/hkdev/debug.css +1 -1
- package/dist/design/themes/hkdev/global/layout.css +32 -32
- package/dist/design/themes/hkdev/global/on-colors.css +32 -32
- package/dist/design/themes/hkdev/globals.css +3 -3
- package/dist/design/themes/hkdev/responsive.css +12 -12
- package/dist/design/themes/hkdev/theme-ext.js +12 -12
- package/dist/design/themes/hkdev/theme.css +218 -218
- package/dist/design/utils/clamp.js +66 -66
- package/dist/design/utils/root-vars.js +102 -102
- package/dist/design/utils/scaling.js +228 -228
- package/dist/design/utils/states.js +22 -22
- package/dist/errors/api.js +9 -9
- package/dist/errors/generic.js +20 -20
- package/dist/errors/http.js +16 -16
- package/dist/errors/index.js +5 -5
- package/dist/errors/jwt.js +5 -5
- package/dist/errors/promise.js +25 -25
- package/dist/logging/README.md +158 -0
- package/dist/logging/index.d.ts +3 -1
- package/dist/logging/index.js +11 -7
- package/dist/logging/internal/adapters/console.js +114 -114
- package/dist/logging/internal/adapters/index.js +2 -2
- package/dist/logging/internal/adapters/pino.js +160 -142
- package/dist/logging/internal/adapters/typedef.js +10 -10
- package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
- package/dist/logging/internal/factories/client.d.ts +1 -1
- package/dist/logging/internal/factories/client.js +21 -21
- package/dist/logging/internal/factories/server.d.ts +1 -1
- package/dist/logging/internal/factories/server.js +22 -22
- package/dist/logging/internal/factories/universal.d.ts +2 -2
- package/dist/logging/internal/factories/universal.js +22 -22
- package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
- package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
- package/dist/logging/internal/logger/index.d.ts +1 -0
- package/dist/logging/internal/logger/index.js +1 -0
- package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
- package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
- package/dist/network/README.md +172 -172
- package/dist/network/cache/IndexedDbCache.js +1407 -1407
- package/dist/network/cache/MemoryResponseCache.js +138 -138
- package/dist/network/cache/index.js +5 -5
- package/dist/network/cache/typedef.js +41 -41
- package/dist/network/cache.js +3 -3
- package/dist/network/http/caching.js +261 -261
- package/dist/network/http/errors.js +97 -97
- package/dist/network/http/headers.js +75 -75
- package/dist/network/http/http-request.js +578 -578
- package/dist/network/http/index.js +22 -22
- package/dist/network/http/json-request.js +224 -224
- package/dist/network/http/mocks.js +65 -65
- package/dist/network/http/response.js +318 -318
- package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/network/http/typedef.js +93 -93
- package/dist/network/http/url.js +52 -52
- package/dist/network/http.js +5 -5
- package/dist/network/loaders/README.md +254 -254
- package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
- package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
- package/dist/network/loaders/audio/mocks.js +35 -35
- package/dist/network/loaders/audio.js +1 -1
- package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
- package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
- package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
- package/dist/network/loaders/image/index.js +4 -4
- package/dist/network/loaders/image/mocks.js +35 -35
- package/dist/network/loaders/image/typedef.js +8 -8
- package/dist/network/loaders/image/utils/index.js +86 -86
- package/dist/network/loaders/image.js +7 -7
- package/dist/network/loaders/typedef.js +38 -38
- package/dist/network/loaders.js +2 -2
- package/dist/network/states/NetworkLoader.svelte.js +338 -338
- package/dist/network/states/constants.js +3 -3
- package/dist/network/states/index.js +3 -3
- package/dist/network/states/mocks.js +30 -30
- package/dist/network/states/typedef.js +8 -8
- package/dist/network/typedef.js +9 -9
- package/dist/services/README.md +200 -0
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.js +8 -1
- package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
- package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
- package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
- package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
- package/dist/services/{internal/service-base → service-base}/index.js +3 -3
- package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
- package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
- package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
- package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
- package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
- package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
- 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/typedef/context.js +6 -6
- package/dist/typedef/drag.js +25 -25
- package/dist/typedef/drop.js +12 -12
- package/dist/typedef/index.d.ts +1 -0
- package/dist/typedef/index.js +4 -4
- package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
- package/dist/ui/components/button-group/typedef.js +10 -10
- package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/ui/components/compare-left-right/index.js +1 -1
- package/dist/ui/components/game-box/GameBox.svelte +577 -577
- package/dist/ui/components/game-box/gamebox.util.js +83 -83
- package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/ui/components/image-box/ImageBox.svelte +210 -210
- package/dist/ui/components/image-box/index.js +5 -5
- package/dist/ui/components/image-box/typedef.js +32 -32
- package/dist/ui/components/index.js +23 -23
- package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
- package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
- package/dist/ui/components/presenter/Presenter.svelte +142 -142
- package/dist/ui/components/presenter/constants.js +7 -7
- package/dist/ui/components/presenter/index.js +10 -10
- package/dist/ui/components/presenter/typedef.js +106 -106
- package/dist/ui/components/presenter/util.js +210 -210
- package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
- package/dist/ui/primitives/area/HkArea.svelte +49 -49
- package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
- package/dist/ui/primitives/area/index.js +2 -2
- package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
- package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
- package/dist/ui/primitives/buttons/index.js +3 -3
- package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/ui/primitives/debug/index.js +1 -1
- package/dist/ui/primitives/drag-drop/DragController.js +44 -44
- package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
- package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
- package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
- package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
- package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
- package/dist/ui/primitives/drag-drop/actions.js +26 -26
- package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
- package/dist/ui/primitives/drag-drop/index.js +7 -7
- package/dist/ui/primitives/drag-drop/util.js +85 -85
- package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
- package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
- package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
- package/dist/ui/primitives/icons/index.js +6 -6
- package/dist/ui/primitives/icons/typedef.js +16 -16
- package/dist/ui/primitives/index.js +2 -2
- package/dist/ui/primitives/inputs/index.js +1 -1
- package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
- package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
- package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
- package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
- package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
- package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
- package/dist/ui/primitives/layout/index.js +1 -1
- package/dist/ui/primitives/panels/index.js +1 -1
- package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
- package/dist/ui/primitives/rows/index.js +3 -3
- package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
- package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/ui/primitives/tab-bar/index.js +17 -17
- package/dist/ui/primitives/tab-bar/typedef.js +11 -11
- package/dist/util/array/index.js +436 -436
- 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/env/index.js +9 -9
- package/dist/util/exceptions/index.d.ts +4 -3
- package/dist/util/exceptions/index.js +26 -23
- 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/geo/index.js +26 -26
- package/dist/util/index.js +7 -7
- package/dist/util/is/index.js +147 -147
- package/dist/util/iterate/index.js +204 -204
- package/dist/util/object/index.js +1345 -1345
- 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 +117 -117
- 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 +328 -328
- package/dist/util/unique/index.js +231 -231
- package/dist/valibot/README.md +61 -50
- package/dist/valibot/index.js +8 -8
- package/dist/valibot/parsers/date.js__ +10 -0
- package/dist/valibot/parsers/email.d.ts +12 -0
- package/dist/valibot/parsers/email.js +34 -0
- package/dist/valibot/parsers/url.js +110 -110
- package/dist/valibot/parsers/user.js +23 -23
- package/dist/valibot/parsers.js +3 -3
- package/package.json +131 -131
- package/dist/logging/internal/unified-logger/index.d.ts +0 -3
- package/dist/logging/internal/unified-logger/index.js +0 -6
- package/dist/services/internal/index.d.ts +0 -6
- package/dist/services/internal/index.js +0 -8
- /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
- /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
- /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
- /package/dist/services/{internal/service-manager → service-manager}/typedef.d.ts +0 -0
|
@@ -1,255 +1,255 @@
|
|
|
1
|
-
# Media Loaders
|
|
2
|
-
|
|
3
|
-
Advanced media loading and processing classes for audio and images with loading state management, streaming support, and responsive image handling.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```javascript
|
|
8
|
-
import * as image from '$lib/network/loaders.js';
|
|
9
|
-
import * as audio from '$lib/network/loaders.js';
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## Image Loaders
|
|
13
|
-
|
|
14
|
-
### ImageLoader
|
|
15
|
-
|
|
16
|
-
Loads single images with chunked streaming and loading states.
|
|
17
|
-
|
|
18
|
-
```javascript
|
|
19
|
-
import { ImageLoader } from '$lib/network/loaders.js';
|
|
20
|
-
|
|
21
|
-
// Create image loader with single image or responsive variants
|
|
22
|
-
const imageSource = { src: '/path/to/image.jpg', width: 800, height: 600 };
|
|
23
|
-
const imageLoader = new ImageLoader({ imageSource });
|
|
24
|
-
|
|
25
|
-
// Start loading
|
|
26
|
-
imageLoader.load();
|
|
27
|
-
|
|
28
|
-
// Access loading states
|
|
29
|
-
console.log(imageLoader.loading); // true while loading
|
|
30
|
-
console.log(imageLoader.loaded); // true when complete
|
|
31
|
-
console.log(imageLoader.error); // error object if failed
|
|
32
|
-
|
|
33
|
-
// Get object URL when loaded
|
|
34
|
-
if (imageLoader.loaded) {
|
|
35
|
-
const objectURL = imageLoader.getObjectURL();
|
|
36
|
-
// Use objectURL in img src
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### ImageVariantsLoader
|
|
41
|
-
|
|
42
|
-
Loads responsive image variants, automatically selecting the best size for container dimensions.
|
|
43
|
-
|
|
44
|
-
```javascript
|
|
45
|
-
import { ImageVariantsLoader } from '$lib/network/loaders.js';
|
|
46
|
-
|
|
47
|
-
const loader = new ImageVariantsLoader();
|
|
48
|
-
|
|
49
|
-
// Load responsive variants
|
|
50
|
-
const imageSource = [
|
|
51
|
-
{ src: '/image-400.jpg', width: 400, height: 300 },
|
|
52
|
-
{ src: '/image-800.jpg', width: 800, height: 600 },
|
|
53
|
-
{ src: '/image-1200.jpg', width: 1200, height: 900 }
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
await loader.load({
|
|
57
|
-
imageSource,
|
|
58
|
-
containerWidth: 600,
|
|
59
|
-
containerHeight: 400,
|
|
60
|
-
fit: 'cover', // or 'contain', 'fill'
|
|
61
|
-
devicePixelRatio: window.devicePixelRatio
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### ImageScene
|
|
66
|
-
|
|
67
|
-
High-level loader that manages multiple image sources with loading states.
|
|
68
|
-
|
|
69
|
-
```javascript
|
|
70
|
-
import { ImageScene } from '$lib/network/loaders.js';
|
|
71
|
-
|
|
72
|
-
const imageScene = new ImageScene();
|
|
73
|
-
|
|
74
|
-
// Configure multiple image sources
|
|
75
|
-
imageScene.updateSources({
|
|
76
|
-
'thumbnail': { src: '/thumb.jpg', width: 200, height: 150 },
|
|
77
|
-
'full': { src: '/full.jpg', width: 1920, height: 1080 }
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// Load specific source
|
|
81
|
-
imageScene.load('full');
|
|
82
|
-
|
|
83
|
-
// Monitor state changes
|
|
84
|
-
imageScene.state; // 'initial', 'loading', 'loaded', 'error'
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Audio Components
|
|
88
|
-
|
|
89
|
-
### AudioLoader
|
|
90
|
-
|
|
91
|
-
Loads audio files with streaming support and loading state management.
|
|
92
|
-
|
|
93
|
-
```javascript
|
|
94
|
-
import { AudioLoader } from '$lib/network/loaders.js';
|
|
95
|
-
|
|
96
|
-
const audioLoader = new AudioLoader({
|
|
97
|
-
url: '/path/to/audio.mp3'
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// Start loading
|
|
101
|
-
audioLoader.load();
|
|
102
|
-
|
|
103
|
-
// Access audio data when loaded
|
|
104
|
-
if (audioLoader.loaded) {
|
|
105
|
-
const audioBuffer = audioLoader.getAudioBuffer();
|
|
106
|
-
const objectURL = audioLoader.getObjectURL();
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### AudioScene
|
|
111
|
-
|
|
112
|
-
Manages multiple audio sources with scene-based loading.
|
|
113
|
-
|
|
114
|
-
```javascript
|
|
115
|
-
import { AudioScene } from '$lib/network/loaders.js';
|
|
116
|
-
|
|
117
|
-
const audioScene = new AudioScene();
|
|
118
|
-
|
|
119
|
-
// Configure audio sources
|
|
120
|
-
audioScene.updateSources({
|
|
121
|
-
'background': { url: '/bg-music.mp3' },
|
|
122
|
-
'sfx': { url: '/sound-effect.wav' }
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Load and play audio
|
|
126
|
-
audioScene.load('background');
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Image Utilities
|
|
130
|
-
|
|
131
|
-
### Responsive Image Helpers
|
|
132
|
-
|
|
133
|
-
```javascript
|
|
134
|
-
import {
|
|
135
|
-
toSingleImageMeta,
|
|
136
|
-
calculateEffectiveWidth
|
|
137
|
-
} from '$lib/network/loaders/image/utils/index.js';
|
|
138
|
-
|
|
139
|
-
// Extract single image from array of variants
|
|
140
|
-
const imageMeta = toSingleImageMeta([
|
|
141
|
-
{ src: '/small.jpg', width: 400, height: 300 },
|
|
142
|
-
{ src: '/large.jpg', width: 800, height: 600 }
|
|
143
|
-
]); // Returns the largest (last) image
|
|
144
|
-
|
|
145
|
-
// Calculate optimal width for container
|
|
146
|
-
const effectiveWidth = calculateEffectiveWidth({
|
|
147
|
-
containerWidth: 600,
|
|
148
|
-
containerHeight: 400,
|
|
149
|
-
imageAspectRatio: 16/9,
|
|
150
|
-
fit: 'contain' // or 'cover', 'fill'
|
|
151
|
-
});
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Loading States
|
|
155
|
-
|
|
156
|
-
All loaders implement consistent loading state management:
|
|
157
|
-
|
|
158
|
-
- **`initial`** - Not started loading
|
|
159
|
-
- **`loading`** - Currently loading
|
|
160
|
-
- **`loaded`** - Successfully loaded
|
|
161
|
-
- **`error`** - Failed to load
|
|
162
|
-
- **`cancelled`** - Loading was cancelled
|
|
163
|
-
|
|
164
|
-
## Integration with SvelteKit
|
|
165
|
-
|
|
166
|
-
### Using in Components
|
|
167
|
-
|
|
168
|
-
```svelte
|
|
169
|
-
<script>
|
|
170
|
-
import { ImageLoader } from '$lib/network/loaders.js';
|
|
171
|
-
import { onMount } from 'svelte';
|
|
172
|
-
|
|
173
|
-
let imageLoader = $state();
|
|
174
|
-
let objectURL = $state();
|
|
175
|
-
|
|
176
|
-
const imageMeta = { src: '/image.jpg', width: 800, height: 600 };
|
|
177
|
-
|
|
178
|
-
onMount(() => {
|
|
179
|
-
imageLoader = new ImageLoader({ imageMeta });
|
|
180
|
-
imageLoader.load();
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
$effect(() => {
|
|
184
|
-
if (imageLoader?.loaded) {
|
|
185
|
-
objectURL = imageLoader.getObjectURL();
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return () => {
|
|
189
|
-
if (objectURL) {
|
|
190
|
-
URL.revokeObjectURL(objectURL);
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
});
|
|
194
|
-
</script>
|
|
195
|
-
|
|
196
|
-
{#if objectURL}
|
|
197
|
-
<img src={objectURL} alt="Loaded image" />
|
|
198
|
-
{:else if imageLoader?.loading}
|
|
199
|
-
<p>Loading...</p>
|
|
200
|
-
{:else if imageLoader?.error}
|
|
201
|
-
<p>Error: {imageLoader.error.message}</p>
|
|
202
|
-
{/if}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### Responsive Images
|
|
206
|
-
|
|
207
|
-
```svelte
|
|
208
|
-
<script>
|
|
209
|
-
import { ImageBox } from '$lib/ui/components/index.js';
|
|
210
|
-
|
|
211
|
-
// ImageBox uses ImageVariantsLoader internally
|
|
212
|
-
const imageSource = [
|
|
213
|
-
{ src: '/image-400.jpg', width: 400, height: 300 },
|
|
214
|
-
{ src: '/image-800.jpg', width: 800, height: 600 }
|
|
215
|
-
];
|
|
216
|
-
</script>
|
|
217
|
-
|
|
218
|
-
<ImageBox
|
|
219
|
-
imageSource={imageSource}
|
|
220
|
-
width="600px"
|
|
221
|
-
height="400px"
|
|
222
|
-
fit="cover"
|
|
223
|
-
/>
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## Error Handling
|
|
227
|
-
|
|
228
|
-
```javascript
|
|
229
|
-
try {
|
|
230
|
-
const imageLoader = new ImageLoader({ imageMeta });
|
|
231
|
-
await imageLoader.load();
|
|
232
|
-
|
|
233
|
-
if (imageLoader.error) {
|
|
234
|
-
console.error('Loading failed:', imageLoader.error);
|
|
235
|
-
}
|
|
236
|
-
} catch (error) {
|
|
237
|
-
console.error('Setup failed:', error);
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## Available Exports
|
|
242
|
-
|
|
243
|
-
### Image (`$lib/network/loaders.js`)
|
|
244
|
-
- `ImageLoader` - Single image loading with streaming
|
|
245
|
-
- `ImageVariantsLoader` - Responsive image variant selection
|
|
246
|
-
|
|
247
|
-
### Audio (`$lib/network/loaders.js`)
|
|
248
|
-
- `AudioLoader` - Audio file loading with streaming
|
|
249
|
-
- `AudioScene` - Multi-source audio management
|
|
250
|
-
|
|
251
|
-
### Utilities (`$lib/network/loaders/image/utils/`)
|
|
252
|
-
- `toSingleImageMeta()` - Extract single image from variants
|
|
253
|
-
- `calculateEffectiveWidth()` - Calculate optimal image dimensions
|
|
254
|
-
|
|
1
|
+
# Media Loaders
|
|
2
|
+
|
|
3
|
+
Advanced media loading and processing classes for audio and images with loading state management, streaming support, and responsive image handling.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
import * as image from '$lib/network/loaders.js';
|
|
9
|
+
import * as audio from '$lib/network/loaders.js';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Image Loaders
|
|
13
|
+
|
|
14
|
+
### ImageLoader
|
|
15
|
+
|
|
16
|
+
Loads single images with chunked streaming and loading states.
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
import { ImageLoader } from '$lib/network/loaders.js';
|
|
20
|
+
|
|
21
|
+
// Create image loader with single image or responsive variants
|
|
22
|
+
const imageSource = { src: '/path/to/image.jpg', width: 800, height: 600 };
|
|
23
|
+
const imageLoader = new ImageLoader({ imageSource });
|
|
24
|
+
|
|
25
|
+
// Start loading
|
|
26
|
+
imageLoader.load();
|
|
27
|
+
|
|
28
|
+
// Access loading states
|
|
29
|
+
console.log(imageLoader.loading); // true while loading
|
|
30
|
+
console.log(imageLoader.loaded); // true when complete
|
|
31
|
+
console.log(imageLoader.error); // error object if failed
|
|
32
|
+
|
|
33
|
+
// Get object URL when loaded
|
|
34
|
+
if (imageLoader.loaded) {
|
|
35
|
+
const objectURL = imageLoader.getObjectURL();
|
|
36
|
+
// Use objectURL in img src
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### ImageVariantsLoader
|
|
41
|
+
|
|
42
|
+
Loads responsive image variants, automatically selecting the best size for container dimensions.
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
import { ImageVariantsLoader } from '$lib/network/loaders.js';
|
|
46
|
+
|
|
47
|
+
const loader = new ImageVariantsLoader();
|
|
48
|
+
|
|
49
|
+
// Load responsive variants
|
|
50
|
+
const imageSource = [
|
|
51
|
+
{ src: '/image-400.jpg', width: 400, height: 300 },
|
|
52
|
+
{ src: '/image-800.jpg', width: 800, height: 600 },
|
|
53
|
+
{ src: '/image-1200.jpg', width: 1200, height: 900 }
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
await loader.load({
|
|
57
|
+
imageSource,
|
|
58
|
+
containerWidth: 600,
|
|
59
|
+
containerHeight: 400,
|
|
60
|
+
fit: 'cover', // or 'contain', 'fill'
|
|
61
|
+
devicePixelRatio: window.devicePixelRatio
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### ImageScene
|
|
66
|
+
|
|
67
|
+
High-level loader that manages multiple image sources with loading states.
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
import { ImageScene } from '$lib/network/loaders.js';
|
|
71
|
+
|
|
72
|
+
const imageScene = new ImageScene();
|
|
73
|
+
|
|
74
|
+
// Configure multiple image sources
|
|
75
|
+
imageScene.updateSources({
|
|
76
|
+
'thumbnail': { src: '/thumb.jpg', width: 200, height: 150 },
|
|
77
|
+
'full': { src: '/full.jpg', width: 1920, height: 1080 }
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Load specific source
|
|
81
|
+
imageScene.load('full');
|
|
82
|
+
|
|
83
|
+
// Monitor state changes
|
|
84
|
+
imageScene.state; // 'initial', 'loading', 'loaded', 'error'
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Audio Components
|
|
88
|
+
|
|
89
|
+
### AudioLoader
|
|
90
|
+
|
|
91
|
+
Loads audio files with streaming support and loading state management.
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
import { AudioLoader } from '$lib/network/loaders.js';
|
|
95
|
+
|
|
96
|
+
const audioLoader = new AudioLoader({
|
|
97
|
+
url: '/path/to/audio.mp3'
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Start loading
|
|
101
|
+
audioLoader.load();
|
|
102
|
+
|
|
103
|
+
// Access audio data when loaded
|
|
104
|
+
if (audioLoader.loaded) {
|
|
105
|
+
const audioBuffer = audioLoader.getAudioBuffer();
|
|
106
|
+
const objectURL = audioLoader.getObjectURL();
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### AudioScene
|
|
111
|
+
|
|
112
|
+
Manages multiple audio sources with scene-based loading.
|
|
113
|
+
|
|
114
|
+
```javascript
|
|
115
|
+
import { AudioScene } from '$lib/network/loaders.js';
|
|
116
|
+
|
|
117
|
+
const audioScene = new AudioScene();
|
|
118
|
+
|
|
119
|
+
// Configure audio sources
|
|
120
|
+
audioScene.updateSources({
|
|
121
|
+
'background': { url: '/bg-music.mp3' },
|
|
122
|
+
'sfx': { url: '/sound-effect.wav' }
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Load and play audio
|
|
126
|
+
audioScene.load('background');
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Image Utilities
|
|
130
|
+
|
|
131
|
+
### Responsive Image Helpers
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
import {
|
|
135
|
+
toSingleImageMeta,
|
|
136
|
+
calculateEffectiveWidth
|
|
137
|
+
} from '$lib/network/loaders/image/utils/index.js';
|
|
138
|
+
|
|
139
|
+
// Extract single image from array of variants
|
|
140
|
+
const imageMeta = toSingleImageMeta([
|
|
141
|
+
{ src: '/small.jpg', width: 400, height: 300 },
|
|
142
|
+
{ src: '/large.jpg', width: 800, height: 600 }
|
|
143
|
+
]); // Returns the largest (last) image
|
|
144
|
+
|
|
145
|
+
// Calculate optimal width for container
|
|
146
|
+
const effectiveWidth = calculateEffectiveWidth({
|
|
147
|
+
containerWidth: 600,
|
|
148
|
+
containerHeight: 400,
|
|
149
|
+
imageAspectRatio: 16/9,
|
|
150
|
+
fit: 'contain' // or 'cover', 'fill'
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Loading States
|
|
155
|
+
|
|
156
|
+
All loaders implement consistent loading state management:
|
|
157
|
+
|
|
158
|
+
- **`initial`** - Not started loading
|
|
159
|
+
- **`loading`** - Currently loading
|
|
160
|
+
- **`loaded`** - Successfully loaded
|
|
161
|
+
- **`error`** - Failed to load
|
|
162
|
+
- **`cancelled`** - Loading was cancelled
|
|
163
|
+
|
|
164
|
+
## Integration with SvelteKit
|
|
165
|
+
|
|
166
|
+
### Using in Components
|
|
167
|
+
|
|
168
|
+
```svelte
|
|
169
|
+
<script>
|
|
170
|
+
import { ImageLoader } from '$lib/network/loaders.js';
|
|
171
|
+
import { onMount } from 'svelte';
|
|
172
|
+
|
|
173
|
+
let imageLoader = $state();
|
|
174
|
+
let objectURL = $state();
|
|
175
|
+
|
|
176
|
+
const imageMeta = { src: '/image.jpg', width: 800, height: 600 };
|
|
177
|
+
|
|
178
|
+
onMount(() => {
|
|
179
|
+
imageLoader = new ImageLoader({ imageMeta });
|
|
180
|
+
imageLoader.load();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
$effect(() => {
|
|
184
|
+
if (imageLoader?.loaded) {
|
|
185
|
+
objectURL = imageLoader.getObjectURL();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return () => {
|
|
189
|
+
if (objectURL) {
|
|
190
|
+
URL.revokeObjectURL(objectURL);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
</script>
|
|
195
|
+
|
|
196
|
+
{#if objectURL}
|
|
197
|
+
<img src={objectURL} alt="Loaded image" />
|
|
198
|
+
{:else if imageLoader?.loading}
|
|
199
|
+
<p>Loading...</p>
|
|
200
|
+
{:else if imageLoader?.error}
|
|
201
|
+
<p>Error: {imageLoader.error.message}</p>
|
|
202
|
+
{/if}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Responsive Images
|
|
206
|
+
|
|
207
|
+
```svelte
|
|
208
|
+
<script>
|
|
209
|
+
import { ImageBox } from '$lib/ui/components/index.js';
|
|
210
|
+
|
|
211
|
+
// ImageBox uses ImageVariantsLoader internally
|
|
212
|
+
const imageSource = [
|
|
213
|
+
{ src: '/image-400.jpg', width: 400, height: 300 },
|
|
214
|
+
{ src: '/image-800.jpg', width: 800, height: 600 }
|
|
215
|
+
];
|
|
216
|
+
</script>
|
|
217
|
+
|
|
218
|
+
<ImageBox
|
|
219
|
+
imageSource={imageSource}
|
|
220
|
+
width="600px"
|
|
221
|
+
height="400px"
|
|
222
|
+
fit="cover"
|
|
223
|
+
/>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Error Handling
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
try {
|
|
230
|
+
const imageLoader = new ImageLoader({ imageMeta });
|
|
231
|
+
await imageLoader.load();
|
|
232
|
+
|
|
233
|
+
if (imageLoader.error) {
|
|
234
|
+
console.error('Loading failed:', imageLoader.error);
|
|
235
|
+
}
|
|
236
|
+
} catch (error) {
|
|
237
|
+
console.error('Setup failed:', error);
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Available Exports
|
|
242
|
+
|
|
243
|
+
### Image (`$lib/network/loaders.js`)
|
|
244
|
+
- `ImageLoader` - Single image loading with streaming
|
|
245
|
+
- `ImageVariantsLoader` - Responsive image variant selection
|
|
246
|
+
|
|
247
|
+
### Audio (`$lib/network/loaders.js`)
|
|
248
|
+
- `AudioLoader` - Audio file loading with streaming
|
|
249
|
+
- `AudioScene` - Multi-source audio management
|
|
250
|
+
|
|
251
|
+
### Utilities (`$lib/network/loaders/image/utils/`)
|
|
252
|
+
- `toSingleImageMeta()` - Extract single image from variants
|
|
253
|
+
- `calculateEffectiveWidth()` - Calculate optimal image dimensions
|
|
254
|
+
|
|
255
255
|
All loaders provide built-in loading states, error handling, and memory management with automatic cleanup of object URLs.
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
NetworkLoader,
|
|
3
|
-
ERROR_NOT_LOADED,
|
|
4
|
-
ERROR_TRANSFERRED
|
|
5
|
-
} from '../../states/index.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* AudioLoader instance
|
|
9
|
-
* - Loads audio data from network into an ArrayBuffer
|
|
10
|
-
* - Loaded data can be transferred to an AudioBufferSourceNode
|
|
11
|
-
*/
|
|
12
|
-
export default class AudioLoader extends NetworkLoader {
|
|
13
|
-
/** @type {AudioBuffer|null} */
|
|
14
|
-
#audioBuffer = null;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Get an AudioBufferSourceNode instance
|
|
18
|
-
*
|
|
19
|
-
* @note AudioBufferSourceNodes can play only once, a new source node
|
|
20
|
-
* must be created otherwise
|
|
21
|
-
*
|
|
22
|
-
* @param {AudioContext} audioContext
|
|
23
|
-
*
|
|
24
|
-
* @returns {Promise<AudioBufferSourceNode>}
|
|
25
|
-
*/
|
|
26
|
-
async getAudioBufferSourceNode(audioContext) {
|
|
27
|
-
if (!this.#audioBuffer) {
|
|
28
|
-
this.#audioBuffer = await this.getAudioBuffer(audioContext);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return new AudioBufferSourceNode(audioContext, {
|
|
32
|
-
buffer: this.#audioBuffer
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Gets data as AudioBuffer
|
|
38
|
-
* - Stores created AudioBuffer instance internally
|
|
39
|
-
* - Transfers data from internal ArrayBuffer, which will be detached
|
|
40
|
-
*
|
|
41
|
-
* @param {AudioContext} audioContext
|
|
42
|
-
*
|
|
43
|
-
* @returns {Promise<AudioBuffer>}
|
|
44
|
-
*/
|
|
45
|
-
async getAudioBuffer(audioContext) {
|
|
46
|
-
if (!this._buffer) {
|
|
47
|
-
throw new Error(ERROR_NOT_LOADED);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (this._buffer.detached) {
|
|
51
|
-
throw new Error(ERROR_TRANSFERRED);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
this.#audioBuffer = await audioContext.decodeAudioData(this._buffer);
|
|
55
|
-
|
|
56
|
-
return this.#audioBuffer;
|
|
57
|
-
}
|
|
58
|
-
} // end class
|
|
1
|
+
import {
|
|
2
|
+
NetworkLoader,
|
|
3
|
+
ERROR_NOT_LOADED,
|
|
4
|
+
ERROR_TRANSFERRED
|
|
5
|
+
} from '../../states/index.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* AudioLoader instance
|
|
9
|
+
* - Loads audio data from network into an ArrayBuffer
|
|
10
|
+
* - Loaded data can be transferred to an AudioBufferSourceNode
|
|
11
|
+
*/
|
|
12
|
+
export default class AudioLoader extends NetworkLoader {
|
|
13
|
+
/** @type {AudioBuffer|null} */
|
|
14
|
+
#audioBuffer = null;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get an AudioBufferSourceNode instance
|
|
18
|
+
*
|
|
19
|
+
* @note AudioBufferSourceNodes can play only once, a new source node
|
|
20
|
+
* must be created otherwise
|
|
21
|
+
*
|
|
22
|
+
* @param {AudioContext} audioContext
|
|
23
|
+
*
|
|
24
|
+
* @returns {Promise<AudioBufferSourceNode>}
|
|
25
|
+
*/
|
|
26
|
+
async getAudioBufferSourceNode(audioContext) {
|
|
27
|
+
if (!this.#audioBuffer) {
|
|
28
|
+
this.#audioBuffer = await this.getAudioBuffer(audioContext);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return new AudioBufferSourceNode(audioContext, {
|
|
32
|
+
buffer: this.#audioBuffer
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Gets data as AudioBuffer
|
|
38
|
+
* - Stores created AudioBuffer instance internally
|
|
39
|
+
* - Transfers data from internal ArrayBuffer, which will be detached
|
|
40
|
+
*
|
|
41
|
+
* @param {AudioContext} audioContext
|
|
42
|
+
*
|
|
43
|
+
* @returns {Promise<AudioBuffer>}
|
|
44
|
+
*/
|
|
45
|
+
async getAudioBuffer(audioContext) {
|
|
46
|
+
if (!this._buffer) {
|
|
47
|
+
throw new Error(ERROR_NOT_LOADED);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (this._buffer.detached) {
|
|
51
|
+
throw new Error(ERROR_TRANSFERRED);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.#audioBuffer = await audioContext.decodeAudioData(this._buffer);
|
|
55
|
+
|
|
56
|
+
return this.#audioBuffer;
|
|
57
|
+
}
|
|
58
|
+
} // end class
|