@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.
Files changed (293) hide show
  1. package/README.md +173 -149
  2. package/dist/assets/autospuiten/car-paint-picker.js +41 -41
  3. package/dist/assets/autospuiten/labels.js +7 -7
  4. package/dist/classes/data/IterableTree.js +242 -242
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/data/typedef.js +9 -9
  8. package/dist/classes/event-emitter/EventEmitter.js +273 -273
  9. package/dist/classes/event-emitter/index.js +2 -2
  10. package/dist/classes/index.js +4 -4
  11. package/dist/classes/promise/HkPromise.js +384 -384
  12. package/dist/classes/promise/index.js +1 -1
  13. package/dist/classes/stores/SubscribersCount.js +107 -107
  14. package/dist/classes/stores/index.js +1 -1
  15. package/dist/classes/streams/LogTransformStream.js +19 -19
  16. package/dist/classes/streams/ServerEventsStore.js +111 -111
  17. package/dist/classes/streams/TimeStampSource.js +26 -26
  18. package/dist/classes/streams/index.js +3 -3
  19. package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
  20. package/dist/classes/svelte/finite-state-machine/index.js +1 -1
  21. package/dist/classes/svelte/index.js +1 -11
  22. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  23. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  24. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  25. package/dist/config/README.md +197 -196
  26. package/dist/config/generators/imagetools.js +189 -189
  27. package/dist/config/generators/vite.js +148 -142
  28. package/dist/config/imagetools.d.ts +72 -72
  29. package/dist/config/vite.js +4 -4
  30. package/dist/constants/bases/index.js +13 -13
  31. package/dist/constants/http/headers.js +6 -6
  32. package/dist/constants/http/index.js +2 -2
  33. package/dist/constants/http/methods.js +14 -14
  34. package/dist/constants/index.js +6 -6
  35. package/dist/constants/mime/application.js +5 -5
  36. package/dist/constants/mime/audio.js +13 -13
  37. package/dist/constants/mime/image.js +3 -3
  38. package/dist/constants/mime/index.js +4 -4
  39. package/dist/constants/mime/text.js +2 -2
  40. package/dist/constants/regexp/README.md +96 -95
  41. package/dist/constants/regexp/index.js +31 -31
  42. package/dist/constants/regexp/inspiratie.js__ +95 -95
  43. package/dist/constants/regexp/text.d.ts +4 -4
  44. package/dist/constants/regexp/text.js +49 -49
  45. package/dist/constants/regexp/url.js +3 -3
  46. package/dist/constants/regexp/user.js +29 -29
  47. package/dist/constants/states/drag.js +6 -6
  48. package/dist/constants/states/drop.js +6 -6
  49. package/dist/constants/states/index.js +4 -4
  50. package/dist/constants/states/input.js +11 -11
  51. package/dist/constants/states/submit.js +4 -4
  52. package/dist/constants/time/index.js +28 -28
  53. package/dist/css/utilities.css +43 -43
  54. package/dist/design/README.md +405 -405
  55. package/dist/design/config/design-config.js +73 -73
  56. package/dist/design/generators/index.js +288 -288
  57. package/dist/design/index.js +96 -96
  58. package/dist/design/plugins/skeleton.js +208 -208
  59. package/dist/design/tailwind-theme-extend.js +158 -158
  60. package/dist/design/themes/README.md +102 -102
  61. package/dist/design/themes/hkdev/components/blocks/text-block.css +34 -34
  62. package/dist/design/themes/hkdev/components/boxes/game-box.css +11 -11
  63. package/dist/design/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  64. package/dist/design/themes/hkdev/components/buttons/button-text.css +32 -32
  65. package/dist/design/themes/hkdev/components/buttons/button.css +146 -146
  66. package/dist/design/themes/hkdev/components/buttons/skip-button.css +5 -5
  67. package/dist/design/themes/hkdev/components/drag-drop/draggable.css +73 -73
  68. package/dist/design/themes/hkdev/components/drag-drop/drop-zone.css +58 -58
  69. package/dist/design/themes/hkdev/components/icons/icon-steeze.css +15 -15
  70. package/dist/design/themes/hkdev/components/inputs/text-input.css +102 -102
  71. package/dist/design/themes/hkdev/components/panels/panel.css +25 -25
  72. package/dist/design/themes/hkdev/components/rows/panel-grid-row.css +4 -4
  73. package/dist/design/themes/hkdev/components/rows/panel-row-2.css +5 -5
  74. package/dist/design/themes/hkdev/components.css +29 -29
  75. package/dist/design/themes/hkdev/debug.css +1 -1
  76. package/dist/design/themes/hkdev/global/layout.css +32 -32
  77. package/dist/design/themes/hkdev/global/on-colors.css +32 -32
  78. package/dist/design/themes/hkdev/globals.css +3 -3
  79. package/dist/design/themes/hkdev/responsive.css +12 -12
  80. package/dist/design/themes/hkdev/theme-ext.js +12 -12
  81. package/dist/design/themes/hkdev/theme.css +218 -218
  82. package/dist/design/utils/clamp.js +66 -66
  83. package/dist/design/utils/root-vars.js +102 -102
  84. package/dist/design/utils/scaling.js +228 -228
  85. package/dist/design/utils/states.js +22 -22
  86. package/dist/errors/api.js +9 -9
  87. package/dist/errors/generic.js +20 -20
  88. package/dist/errors/http.js +16 -16
  89. package/dist/errors/index.js +5 -5
  90. package/dist/errors/jwt.js +5 -5
  91. package/dist/errors/promise.js +25 -25
  92. package/dist/logging/README.md +158 -0
  93. package/dist/logging/index.d.ts +3 -1
  94. package/dist/logging/index.js +11 -7
  95. package/dist/logging/internal/adapters/console.js +114 -114
  96. package/dist/logging/internal/adapters/index.js +2 -2
  97. package/dist/logging/internal/adapters/pino.js +160 -142
  98. package/dist/logging/internal/adapters/typedef.js +10 -10
  99. package/dist/logging/internal/{unified-logger/constants.js → constants.js} +22 -22
  100. package/dist/logging/internal/factories/client.d.ts +1 -1
  101. package/dist/logging/internal/factories/client.js +21 -21
  102. package/dist/logging/internal/factories/server.d.ts +1 -1
  103. package/dist/logging/internal/factories/server.js +22 -22
  104. package/dist/logging/internal/factories/universal.d.ts +2 -2
  105. package/dist/logging/internal/factories/universal.js +22 -22
  106. package/dist/logging/internal/{unified-logger → logger}/Logger.d.ts +2 -2
  107. package/dist/logging/internal/{unified-logger → logger}/Logger.js +217 -217
  108. package/dist/logging/internal/logger/index.d.ts +1 -0
  109. package/dist/logging/internal/logger/index.js +1 -0
  110. package/dist/logging/internal/{unified-logger/typedef.d.ts → typedef.d.ts} +2 -1
  111. package/dist/logging/internal/{unified-logger/typedef.js → typedef.js} +21 -17
  112. package/dist/network/README.md +172 -172
  113. package/dist/network/cache/IndexedDbCache.js +1407 -1407
  114. package/dist/network/cache/MemoryResponseCache.js +138 -138
  115. package/dist/network/cache/index.js +5 -5
  116. package/dist/network/cache/typedef.js +41 -41
  117. package/dist/network/cache.js +3 -3
  118. package/dist/network/http/caching.js +261 -261
  119. package/dist/network/http/errors.js +97 -97
  120. package/dist/network/http/headers.js +75 -75
  121. package/dist/network/http/http-request.js +578 -578
  122. package/dist/network/http/index.js +22 -22
  123. package/dist/network/http/json-request.js +224 -224
  124. package/dist/network/http/mocks.js +65 -65
  125. package/dist/network/http/response.js +318 -318
  126. package/dist/network/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  127. package/dist/network/http/typedef.js +93 -93
  128. package/dist/network/http/url.js +52 -52
  129. package/dist/network/http.js +5 -5
  130. package/dist/network/loaders/README.md +254 -254
  131. package/dist/network/loaders/audio/AudioLoader.svelte.js +58 -58
  132. package/dist/network/loaders/audio/AudioScene.svelte.js +324 -324
  133. package/dist/network/loaders/audio/mocks.js +35 -35
  134. package/dist/network/loaders/audio.js +1 -1
  135. package/dist/network/loaders/image/ImageLoader.svelte.js +44 -44
  136. package/dist/network/loaders/image/ImageScene.svelte.js +248 -248
  137. package/dist/network/loaders/image/ImageVariantsLoader.svelte.js +150 -150
  138. package/dist/network/loaders/image/index.js +4 -4
  139. package/dist/network/loaders/image/mocks.js +35 -35
  140. package/dist/network/loaders/image/typedef.js +8 -8
  141. package/dist/network/loaders/image/utils/index.js +86 -86
  142. package/dist/network/loaders/image.js +7 -7
  143. package/dist/network/loaders/typedef.js +38 -38
  144. package/dist/network/loaders.js +2 -2
  145. package/dist/network/states/NetworkLoader.svelte.js +338 -338
  146. package/dist/network/states/constants.js +3 -3
  147. package/dist/network/states/index.js +3 -3
  148. package/dist/network/states/mocks.js +30 -30
  149. package/dist/network/states/typedef.js +8 -8
  150. package/dist/network/typedef.js +9 -9
  151. package/dist/services/README.md +200 -0
  152. package/dist/services/index.d.ts +6 -1
  153. package/dist/services/index.js +8 -1
  154. package/dist/services/{internal/service-base → service-base}/ServiceBase.d.ts +2 -2
  155. package/dist/services/{internal/service-base → service-base}/ServiceBase.js +462 -462
  156. package/dist/services/{internal/service-base → service-base}/constants.d.ts +0 -12
  157. package/dist/services/{internal/service-base → service-base}/constants.js +98 -110
  158. package/dist/services/{internal/service-base → service-base}/index.js +3 -3
  159. package/dist/services/{internal/service-base → service-base}/typedef.d.ts +1 -1
  160. package/dist/services/{internal/service-base → service-base}/typedef.js +101 -101
  161. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.d.ts +2 -2
  162. package/dist/services/{internal/service-manager → service-manager}/ServiceManager.js +608 -608
  163. package/dist/services/{internal/service-manager → service-manager}/constants.js +6 -6
  164. package/dist/services/{internal/service-manager → service-manager}/typedef.js +90 -90
  165. package/dist/states/index.js +1 -1
  166. package/dist/states/navigation.svelte.js +55 -55
  167. package/dist/stores/index.js +1 -1
  168. package/dist/stores/theme.js +80 -80
  169. package/dist/typedef/context.js +6 -6
  170. package/dist/typedef/drag.js +25 -25
  171. package/dist/typedef/drop.js +12 -12
  172. package/dist/typedef/index.d.ts +1 -0
  173. package/dist/typedef/index.js +4 -4
  174. package/dist/ui/components/button-group/ButtonGroup.svelte +82 -82
  175. package/dist/ui/components/button-group/typedef.js +10 -10
  176. package/dist/ui/components/compare-left-right/CompareLeftRight.svelte +179 -179
  177. package/dist/ui/components/compare-left-right/index.js +1 -1
  178. package/dist/ui/components/game-box/GameBox.svelte +577 -577
  179. package/dist/ui/components/game-box/gamebox.util.js +83 -83
  180. package/dist/ui/components/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  181. package/dist/ui/components/hk-app-layout/HkAppLayout.svelte +251 -251
  182. package/dist/ui/components/image-box/ImageBox.svelte +210 -210
  183. package/dist/ui/components/image-box/index.js +5 -5
  184. package/dist/ui/components/image-box/typedef.js +32 -32
  185. package/dist/ui/components/index.js +23 -23
  186. package/dist/ui/components/presenter/ImageSlide.svelte +64 -64
  187. package/dist/ui/components/presenter/Presenter.state.svelte.js +638 -638
  188. package/dist/ui/components/presenter/Presenter.svelte +142 -142
  189. package/dist/ui/components/presenter/constants.js +7 -7
  190. package/dist/ui/components/presenter/index.js +10 -10
  191. package/dist/ui/components/presenter/typedef.js +106 -106
  192. package/dist/ui/components/presenter/util.js +210 -210
  193. package/dist/ui/components/virtual-viewport/VirtualViewport.svelte +196 -196
  194. package/dist/ui/primitives/area/HkArea.svelte +49 -49
  195. package/dist/ui/primitives/area/HkGridArea.svelte +77 -77
  196. package/dist/ui/primitives/area/index.js +2 -2
  197. package/dist/ui/primitives/buttons/button/Button.svelte +82 -82
  198. package/dist/ui/primitives/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  199. package/dist/ui/primitives/buttons/button-text/TextButton.svelte +21 -21
  200. package/dist/ui/primitives/buttons/index.js +3 -3
  201. package/dist/ui/primitives/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  202. package/dist/ui/primitives/debug/index.js +1 -1
  203. package/dist/ui/primitives/drag-drop/DragController.js +44 -44
  204. package/dist/ui/primitives/drag-drop/DragDropContext.svelte +111 -111
  205. package/dist/ui/primitives/drag-drop/Draggable.svelte +519 -519
  206. package/dist/ui/primitives/drag-drop/DropZone.svelte +258 -258
  207. package/dist/ui/primitives/drag-drop/DropZoneArea.svelte +119 -119
  208. package/dist/ui/primitives/drag-drop/DropZoneList.svelte +125 -125
  209. package/dist/ui/primitives/drag-drop/actions.js +26 -26
  210. package/dist/ui/primitives/drag-drop/drag-state.svelte.js +322 -322
  211. package/dist/ui/primitives/drag-drop/index.js +7 -7
  212. package/dist/ui/primitives/drag-drop/util.js +85 -85
  213. package/dist/ui/primitives/hkdev/blocks/TextBlock.svelte +46 -46
  214. package/dist/ui/primitives/hkdev/buttons/CheckButton.svelte +62 -62
  215. package/dist/ui/primitives/icons/HkIcon.svelte +86 -86
  216. package/dist/ui/primitives/icons/HkTabIcon.svelte +116 -116
  217. package/dist/ui/primitives/icons/SteezeIcon.svelte +97 -97
  218. package/dist/ui/primitives/icons/index.js +6 -6
  219. package/dist/ui/primitives/icons/typedef.js +16 -16
  220. package/dist/ui/primitives/index.js +2 -2
  221. package/dist/ui/primitives/inputs/index.js +1 -1
  222. package/dist/ui/primitives/inputs/text-input/TestTextInput.svelte__ +102 -0
  223. package/dist/ui/primitives/inputs/text-input/TextInput.svelte +223 -223
  224. package/dist/ui/primitives/inputs/text-input/TextInput.svelte___ +83 -0
  225. package/dist/ui/primitives/inputs/text-input/assets/IconInvalid.svelte +14 -14
  226. package/dist/ui/primitives/inputs/text-input/assets/IconValid.svelte +12 -12
  227. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte +63 -63
  228. package/dist/ui/primitives/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
  229. package/dist/ui/primitives/layout/grid-layers/util.js +74 -74
  230. package/dist/ui/primitives/layout/index.js +1 -1
  231. package/dist/ui/primitives/panels/index.js +1 -1
  232. package/dist/ui/primitives/panels/panel/Panel.svelte +43 -43
  233. package/dist/ui/primitives/rows/index.js +3 -3
  234. package/dist/ui/primitives/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  235. package/dist/ui/primitives/rows/panel-row-2/PanelRow2.svelte +40 -40
  236. package/dist/ui/primitives/tab-bar/HkTabBar.state.svelte.js +149 -149
  237. package/dist/ui/primitives/tab-bar/HkTabBar.svelte +74 -74
  238. package/dist/ui/primitives/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  239. package/dist/ui/primitives/tab-bar/HkTabBarSelector.svelte +49 -49
  240. package/dist/ui/primitives/tab-bar/index.js +17 -17
  241. package/dist/ui/primitives/tab-bar/typedef.js +11 -11
  242. package/dist/util/array/index.js +436 -436
  243. package/dist/util/bases/base58.js +262 -262
  244. package/dist/util/bases/index.js +1 -1
  245. package/dist/util/compare/index.js +247 -247
  246. package/dist/util/css/css-vars.js +83 -83
  247. package/dist/util/css/index.js +1 -1
  248. package/dist/util/env/index.js +9 -9
  249. package/dist/util/exceptions/index.d.ts +4 -3
  250. package/dist/util/exceptions/index.js +26 -23
  251. package/dist/util/expect/arrays.js +47 -47
  252. package/dist/util/expect/index.js +259 -259
  253. package/dist/util/expect/primitives.js +55 -55
  254. package/dist/util/expect/url.js +60 -60
  255. package/dist/util/function/index.js +218 -218
  256. package/dist/util/geo/index.js +26 -26
  257. package/dist/util/index.js +7 -7
  258. package/dist/util/is/index.js +147 -147
  259. package/dist/util/iterate/index.js +204 -204
  260. package/dist/util/object/index.js +1345 -1345
  261. package/dist/util/singleton/index.js +97 -97
  262. package/dist/util/string/array-path.js +75 -75
  263. package/dist/util/string/convert.js +54 -54
  264. package/dist/util/string/fs.js +226 -226
  265. package/dist/util/string/index.js +5 -5
  266. package/dist/util/string/interpolate.js +61 -61
  267. package/dist/util/string/pad.js +10 -10
  268. package/dist/util/svelte/index.js +4 -4
  269. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  270. package/dist/util/svelte/observe/index.js +49 -49
  271. package/dist/util/svelte/state-context/index.js +117 -117
  272. package/dist/util/svelte/wait/index.js +38 -38
  273. package/dist/util/sveltekit/index.js +1 -1
  274. package/dist/util/sveltekit/route-folders/index.js +101 -101
  275. package/dist/util/time/index.js +328 -328
  276. package/dist/util/unique/index.js +231 -231
  277. package/dist/valibot/README.md +61 -50
  278. package/dist/valibot/index.js +8 -8
  279. package/dist/valibot/parsers/date.js__ +10 -0
  280. package/dist/valibot/parsers/email.d.ts +12 -0
  281. package/dist/valibot/parsers/email.js +34 -0
  282. package/dist/valibot/parsers/url.js +110 -110
  283. package/dist/valibot/parsers/user.js +23 -23
  284. package/dist/valibot/parsers.js +3 -3
  285. package/package.json +131 -131
  286. package/dist/logging/internal/unified-logger/index.d.ts +0 -3
  287. package/dist/logging/internal/unified-logger/index.js +0 -6
  288. package/dist/services/internal/index.d.ts +0 -6
  289. package/dist/services/internal/index.js +0 -8
  290. /package/dist/logging/internal/{unified-logger/constants.d.ts → constants.d.ts} +0 -0
  291. /package/dist/services/{internal/service-base → service-base}/index.d.ts +0 -0
  292. /package/dist/services/{internal/service-manager → service-manager}/constants.d.ts +0 -0
  293. /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