@hkdigital/lib-sveltekit 0.1.62 → 0.1.65

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 (209) hide show
  1. package/README.md +135 -135
  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 +243 -243
  5. package/dist/classes/data/Selector.js +190 -190
  6. package/dist/classes/data/index.js +2 -2
  7. package/dist/classes/index.js +4 -4
  8. package/dist/classes/promise/HkPromise.js +377 -377
  9. package/dist/classes/promise/index.js +1 -1
  10. package/dist/classes/stores/SubscribersCount.js +107 -107
  11. package/dist/classes/stores/index.js +1 -1
  12. package/dist/classes/streams/LogTransformStream.js +19 -19
  13. package/dist/classes/streams/ServerEventsStore.js +110 -110
  14. package/dist/classes/streams/TimeStampSource.js +26 -26
  15. package/dist/classes/streams/index.js +3 -3
  16. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  17. package/dist/classes/svelte/audio/AudioScene.svelte.js +295 -295
  18. package/dist/classes/svelte/audio/mocks.js +35 -35
  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/image/ImageLoader.svelte.js +47 -47
  22. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  23. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  24. package/dist/classes/svelte/image/index.js +4 -4
  25. package/dist/classes/svelte/image/mocks.js +35 -35
  26. package/dist/classes/svelte/image/typedef.js +8 -8
  27. package/dist/classes/svelte/index.js +14 -14
  28. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  29. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  30. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  32. package/dist/classes/svelte/network-loader/constants.js +3 -3
  33. package/dist/classes/svelte/network-loader/index.js +3 -3
  34. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  35. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  36. package/dist/components/area/HkArea.svelte +49 -49
  37. package/dist/components/area/HkGridArea.svelte +77 -77
  38. package/dist/components/area/index.js +2 -2
  39. package/dist/components/buttons/button/Button.svelte +82 -82
  40. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
  41. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  42. package/dist/components/buttons/index.js +3 -3
  43. package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
  44. package/dist/components/debug/index.js +1 -1
  45. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  46. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  47. package/dist/components/icons/HkIcon.svelte +86 -86
  48. package/dist/components/icons/HkTabIcon.svelte +116 -116
  49. package/dist/components/icons/SteezeIcon.svelte +97 -97
  50. package/dist/components/icons/index.js +6 -6
  51. package/dist/components/icons/typedef.js +16 -16
  52. package/dist/components/index.js +2 -2
  53. package/dist/components/inputs/index.js +1 -1
  54. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  55. package/dist/components/inputs/text-input/TextInput.svelte +223 -223
  56. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  57. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  58. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  59. package/dist/components/layout/grid-layers/GridLayers.svelte +167 -167
  60. package/dist/components/layout/index.js +1 -1
  61. package/dist/components/panels/index.js +1 -1
  62. package/dist/components/panels/panel/Panel.svelte +43 -43
  63. package/dist/components/rows/index.js +3 -3
  64. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  65. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  66. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  67. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  68. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  69. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  70. package/dist/components/tab-bar/index.js +17 -17
  71. package/dist/components/tab-bar/typedef.js +8 -8
  72. package/dist/config/imagetools-config.js +189 -189
  73. package/dist/config/imagetools.d.ts +71 -71
  74. package/dist/config/typedef.js +8 -8
  75. package/dist/constants/bases.js +13 -13
  76. package/dist/constants/errors/api.js +9 -9
  77. package/dist/constants/errors/generic.js +5 -5
  78. package/dist/constants/errors/index.js +3 -3
  79. package/dist/constants/errors/jwt.js +5 -5
  80. package/dist/constants/http/headers.js +6 -6
  81. package/dist/constants/http/index.js +2 -2
  82. package/dist/constants/http/methods.js +2 -2
  83. package/dist/constants/index.js +3 -3
  84. package/dist/constants/mime/application.js +5 -5
  85. package/dist/constants/mime/audio.js +13 -13
  86. package/dist/constants/mime/image.js +3 -3
  87. package/dist/constants/mime/index.js +4 -4
  88. package/dist/constants/mime/text.js +2 -2
  89. package/dist/constants/regexp/index.js +31 -31
  90. package/dist/constants/regexp/inspiratie.js__ +95 -95
  91. package/dist/constants/regexp/text.js +49 -49
  92. package/dist/constants/regexp/user.js +32 -32
  93. package/dist/constants/regexp/web.js +3 -3
  94. package/dist/constants/state-labels/input-states.js +11 -11
  95. package/dist/constants/state-labels/submit-states.js +4 -4
  96. package/dist/constants/time.js +28 -28
  97. package/dist/css/utilities.css +43 -43
  98. package/dist/design/design-config.js +73 -73
  99. package/dist/design/tailwind-theme-extend.js +158 -158
  100. package/dist/schemas/index.js +1 -1
  101. package/dist/schemas/validate-url.js +180 -180
  102. package/dist/server/index.js +1 -1
  103. package/dist/server/logger.js +94 -94
  104. package/dist/states/index.js +1 -1
  105. package/dist/states/navigation.svelte.js +55 -55
  106. package/dist/stores/index.js +1 -1
  107. package/dist/stores/theme.js +80 -80
  108. package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
  109. package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
  110. package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
  111. package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
  112. package/dist/themes/hkdev/components/buttons/button.css +142 -142
  113. package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
  114. package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
  115. package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
  116. package/dist/themes/hkdev/components/panels/panel.css +27 -27
  117. package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
  118. package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
  119. package/dist/themes/hkdev/components.css +47 -47
  120. package/dist/themes/hkdev/debug.css +1 -1
  121. package/dist/themes/hkdev/global/layout.css +39 -39
  122. package/dist/themes/hkdev/global/on-colors.css +53 -53
  123. package/dist/themes/hkdev/globals.css +11 -11
  124. package/dist/themes/hkdev/responsive.css +12 -12
  125. package/dist/themes/hkdev/theme-ext.js +15 -15
  126. package/dist/themes/hkdev/theme.js +235 -235
  127. package/dist/themes/index.js +1 -1
  128. package/dist/util/array/index.js +455 -455
  129. package/dist/util/bases/base58.js +262 -262
  130. package/dist/util/bases/index.js +1 -1
  131. package/dist/util/compare/index.js +247 -247
  132. package/dist/util/css/css-vars.js +83 -83
  133. package/dist/util/css/index.js +1 -1
  134. package/dist/util/design-system/components/states.js +22 -22
  135. package/dist/util/design-system/css/clamp.js +66 -66
  136. package/dist/util/design-system/css/root-design-vars.js +100 -100
  137. package/dist/util/design-system/index.js +5 -5
  138. package/dist/util/design-system/layout/scaling.js +228 -228
  139. package/dist/util/design-system/skeleton.js +208 -208
  140. package/dist/util/design-system/tailwind.js +288 -288
  141. package/dist/util/expect/arrays.js +47 -47
  142. package/dist/util/expect/index.js +259 -259
  143. package/dist/util/expect/primitives.js +55 -55
  144. package/dist/util/expect/url.js +60 -60
  145. package/dist/util/function/index.js +218 -218
  146. package/dist/util/http/errors.js +97 -97
  147. package/dist/util/http/headers.js +45 -45
  148. package/dist/util/http/http-request.js +294 -294
  149. package/dist/util/http/index.js +22 -22
  150. package/dist/util/http/json-request.js +143 -143
  151. package/dist/util/http/mocks.js +65 -65
  152. package/dist/util/http/response.js +241 -241
  153. package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
  154. package/dist/util/http/url.js +52 -52
  155. package/dist/util/image/index.js +86 -86
  156. package/dist/util/index.js +2 -2
  157. package/dist/util/is/index.js +140 -140
  158. package/dist/util/iterate/index.js +234 -234
  159. package/dist/util/object/index.js +1361 -1361
  160. package/dist/util/singleton/index.js +97 -97
  161. package/dist/util/string/array-path.js +75 -75
  162. package/dist/util/string/convert.js +54 -54
  163. package/dist/util/string/fs.js +226 -226
  164. package/dist/util/string/index.js +5 -5
  165. package/dist/util/string/interpolate.js +61 -61
  166. package/dist/util/string/pad.js +10 -10
  167. package/dist/util/svelte/index.js +4 -4
  168. package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
  169. package/dist/util/svelte/observe/index.js +49 -49
  170. package/dist/util/svelte/state-context/index.js +83 -83
  171. package/dist/util/svelte/wait/index.js +38 -38
  172. package/dist/util/sveltekit/index.js +1 -1
  173. package/dist/util/sveltekit/route-folders/index.js +101 -101
  174. package/dist/util/time/index.js +323 -323
  175. package/dist/util/unique/index.js +249 -249
  176. package/dist/valibot/date.js__ +10 -10
  177. package/dist/valibot/index.js +9 -9
  178. package/dist/valibot/url.js +95 -95
  179. package/dist/valibot/user.js +23 -23
  180. package/dist/widgets/button-group/ButtonGroup.svelte +82 -94
  181. package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +0 -2
  182. package/dist/widgets/button-group/typedef.js +10 -10
  183. package/dist/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  184. package/dist/widgets/compare-left-right/index.js +1 -1
  185. package/dist/widgets/game-box/GameBox.svelte +579 -186
  186. package/dist/widgets/game-box/GameBox.svelte.d.ts +64 -4
  187. package/dist/widgets/game-box/gamebox.util.js +83 -83
  188. package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
  189. package/dist/widgets/hk-app-layout/HkAppLayout.svelte +251 -251
  190. package/dist/widgets/image-box/ImageBox.svelte +212 -212
  191. package/dist/widgets/image-box/index.js +5 -5
  192. package/dist/widgets/image-box/typedef.js +32 -32
  193. package/dist/widgets/index.js +23 -23
  194. package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +613 -0
  195. package/dist/widgets/presenter/ImageSlide.svelte +64 -64
  196. package/dist/widgets/presenter/Presenter.state.svelte.js +636 -636
  197. package/dist/widgets/presenter/Presenter.svelte +140 -140
  198. package/dist/widgets/presenter/Presenter.svelte__ +125 -0
  199. package/dist/widgets/presenter/constants.js +7 -7
  200. package/dist/widgets/presenter/index.js +10 -10
  201. package/dist/widgets/presenter/typedef.js +106 -106
  202. package/dist/widgets/presenter/util.js +210 -210
  203. package/dist/widgets/virtual-viewport/VirtualViewport.svelte +196 -196
  204. package/dist/zod/all.js +33 -33
  205. package/dist/zod/generic.js +11 -11
  206. package/dist/zod/javascript.js +32 -32
  207. package/dist/zod/user.js +16 -16
  208. package/dist/zod/web.js +52 -52
  209. package/package.json +102 -102
@@ -1,104 +1,104 @@
1
- <script>
2
- /**
3
- * @example
4
- *
5
- */
6
-
7
- /**
8
- * @type {{
9
- * base?: string,
10
- * bg?: string,
11
- * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
12
- * justifyItems?: 'start'|'center'|'end'|'stretch',
13
- * gap?: string,
14
- * classes?: string,
15
- * children?: import('svelte').Snippet,
16
- * } & { [attr: string]: any }}
17
- */
18
- const {
19
- // Style
20
- base,
21
- bg,
22
- justify,
23
- justifyItems,
24
- flow = 'col',
25
- gap,
26
- classes,
27
-
28
- // Snippets
29
- children,
30
-
31
- // Attributes
32
- ...attrs
33
- } = $props();
34
-
35
- let colsCls = $derived.by(() => {
36
- //
37
- // The CSS classes to apply for the desired column layout
38
- //
39
- let out = '';
40
-
41
- /* @note justify-end won't work with auto-cols-fr! */
42
-
43
- if (justifyItems && justify !== 'end') {
44
- out += 'auto-cols-fr';
45
- } else {
46
- out += 'auto-cols-auto';
47
- }
48
-
49
- if (flow) {
50
- out += ` grid-flow-${flow}`;
51
- }
52
-
53
- // TODO: CSS for a specific number of columns
54
-
55
- return out.replace(/\s{2,}/g, ' ').trim();
56
- });
57
-
58
- let justifyCls = $derived.by(() => {
59
- //
60
- // Determine justify classes
61
- //
62
- if (justify) {
63
- return `justify-${justify}`;
64
- }
65
-
66
- return '';
67
- });
68
-
69
- let justifyItemsCls = $derived.by(() => {
70
- //
71
- // Determine justify-items classes
72
- //
73
- if (justifyItems) {
74
- return `justify-items-${justifyItems}`;
75
- }
76
-
77
- return '';
78
- });
79
- </script>
80
-
81
- <div
82
- data-row="panel-grid-row"
83
- class="{base} {bg} {gap} {classes} grid {colsCls} {justifyCls} {justifyItemsCls}"
84
- {...attrs}
85
- >
86
- {@render children()}
87
- </div>
88
-
89
- <style>
90
- /* This rule makes justify-items-start behave like
91
- justify-items-center and justify-items-end */
92
- /*[data-row='panel-grid-row'] {
93
- & > :global(*) {
94
- width: fit-content;
95
- height: fit-content;
96
- }
97
- }*/
98
-
99
- /*[data-row='panel-grid-row'] {
100
- & > :global(*) {
101
- min-width: 0;
102
- }
103
- }*/
104
- </style>
1
+ <script>
2
+ /**
3
+ * @example
4
+ *
5
+ */
6
+
7
+ /**
8
+ * @type {{
9
+ * base?: string,
10
+ * bg?: string,
11
+ * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
12
+ * justifyItems?: 'start'|'center'|'end'|'stretch',
13
+ * gap?: string,
14
+ * classes?: string,
15
+ * children?: import('svelte').Snippet,
16
+ * } & { [attr: string]: any }}
17
+ */
18
+ const {
19
+ // Style
20
+ base,
21
+ bg,
22
+ justify,
23
+ justifyItems,
24
+ flow = 'col',
25
+ gap,
26
+ classes,
27
+
28
+ // Snippets
29
+ children,
30
+
31
+ // Attributes
32
+ ...attrs
33
+ } = $props();
34
+
35
+ let colsCls = $derived.by(() => {
36
+ //
37
+ // The CSS classes to apply for the desired column layout
38
+ //
39
+ let out = '';
40
+
41
+ /* @note justify-end won't work with auto-cols-fr! */
42
+
43
+ if (justifyItems && justify !== 'end') {
44
+ out += 'auto-cols-fr';
45
+ } else {
46
+ out += 'auto-cols-auto';
47
+ }
48
+
49
+ if (flow) {
50
+ out += ` grid-flow-${flow}`;
51
+ }
52
+
53
+ // TODO: CSS for a specific number of columns
54
+
55
+ return out.replace(/\s{2,}/g, ' ').trim();
56
+ });
57
+
58
+ let justifyCls = $derived.by(() => {
59
+ //
60
+ // Determine justify classes
61
+ //
62
+ if (justify) {
63
+ return `justify-${justify}`;
64
+ }
65
+
66
+ return '';
67
+ });
68
+
69
+ let justifyItemsCls = $derived.by(() => {
70
+ //
71
+ // Determine justify-items classes
72
+ //
73
+ if (justifyItems) {
74
+ return `justify-items-${justifyItems}`;
75
+ }
76
+
77
+ return '';
78
+ });
79
+ </script>
80
+
81
+ <div
82
+ data-row="panel-grid-row"
83
+ class="{base} {bg} {gap} {classes} grid {colsCls} {justifyCls} {justifyItemsCls}"
84
+ {...attrs}
85
+ >
86
+ {@render children()}
87
+ </div>
88
+
89
+ <style>
90
+ /* This rule makes justify-items-start behave like
91
+ justify-items-center and justify-items-end */
92
+ /*[data-row='panel-grid-row'] {
93
+ & > :global(*) {
94
+ width: fit-content;
95
+ height: fit-content;
96
+ }
97
+ }*/
98
+
99
+ /*[data-row='panel-grid-row'] {
100
+ & > :global(*) {
101
+ min-width: 0;
102
+ }
103
+ }*/
104
+ </style>
@@ -1,40 +1,40 @@
1
- <script>
2
- import { PanelGridRow } from '../index.js';
3
-
4
- /**
5
- * @example
6
- */
7
-
8
- /**
9
- * @type {{
10
- * base?: string,
11
- * bg?: string,
12
- * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
13
- * justifyItems?: 'start'|'center'|'end'|'stretch',
14
- * gap?: string,
15
- * classes?: string,
16
- * children?: import('svelte').Snippet,
17
- * } & { [attr: string]: any }}
18
- */
19
- const {
20
- // Style
21
- // base,
22
- // bg,
23
- // justify,
24
- // justifyItems,
25
- // flow = 'col',
26
- // gap,
27
- // classes,
28
-
29
- // // Snippets
30
- // children,
31
-
32
- // Attributes
33
- ...attrs
34
- } = $props();
35
- </script>
36
-
37
- <!-- class="test-small mb-8p mt-8 grid auto-cols-fr grid-flow-col justify-stretch gap-20p" -->
38
-
39
- <PanelGridRow data-wrapper="panel-row-2" gap="gap-20p" {...attrs}
40
- ></PanelGridRow>
1
+ <script>
2
+ import { PanelGridRow } from '../index.js';
3
+
4
+ /**
5
+ * @example
6
+ */
7
+
8
+ /**
9
+ * @type {{
10
+ * base?: string,
11
+ * bg?: string,
12
+ * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
13
+ * justifyItems?: 'start'|'center'|'end'|'stretch',
14
+ * gap?: string,
15
+ * classes?: string,
16
+ * children?: import('svelte').Snippet,
17
+ * } & { [attr: string]: any }}
18
+ */
19
+ const {
20
+ // Style
21
+ // base,
22
+ // bg,
23
+ // justify,
24
+ // justifyItems,
25
+ // flow = 'col',
26
+ // gap,
27
+ // classes,
28
+
29
+ // // Snippets
30
+ // children,
31
+
32
+ // Attributes
33
+ ...attrs
34
+ } = $props();
35
+ </script>
36
+
37
+ <!-- class="test-small mb-8p mt-8 grid auto-cols-fr grid-flow-col justify-stretch gap-20p" -->
38
+
39
+ <PanelGridRow data-wrapper="panel-row-2" gap="gap-20p" {...attrs}
40
+ ></PanelGridRow>
@@ -1,149 +1,149 @@
1
- import { defineStateContext } from '../../util/svelte/state-context/index.js';
2
- import { nav } from '../../states/navigation.svelte.js';
3
-
4
- import { goto } from '$app/navigation';
5
-
6
- /**
7
- * @typedef {import('./typedef.js').Tab} Tab
8
- */
9
-
10
- /* ------------------------------------------------------- Define state class */
11
-
12
- export class HkTabBarState {
13
- /** @type {Tab[]} */
14
- tabs = $state.raw([]);
15
-
16
- /** @type {any} */
17
- tabBarElement = $state();
18
-
19
- /** @type {HTMLElement[]} */
20
- tabElements = [];
21
-
22
- currentTabIndex = $state(-1);
23
-
24
- /** @type {Tab|null} */
25
- currentTab = $state(null);
26
-
27
- // /** @type {boolean} */
28
- // ready = $derived(this.currentTab !== null);
29
-
30
- constructor() {
31
- $effect.pre(() => {
32
- // > Update this.currentTab
33
-
34
- const tabs = this.tabs;
35
-
36
- if (!this.tabs?.length || this.currentTabIndex === -1) {
37
- this.currentTab = null;
38
- } else {
39
- const index = this.currentTabIndex;
40
- const tabValue = tabs[index] ?? null;
41
-
42
- // console.log('Selected active tab', index, tabValue);
43
-
44
- this.currentTab = tabValue;
45
- }
46
- });
47
- } // end constructor
48
-
49
- /**
50
- * Set tab contents
51
- *
52
- * @param {Tab[]} tabs
53
- */
54
- setTabs(tabs) {
55
- // console.log('setTabs', tabs);
56
- this.tabs = tabs;
57
-
58
- if (this.currentTabIndex >= tabs.length) {
59
- this.currentTabIndex = 0;
60
- }
61
- }
62
-
63
- /**
64
- * Navigate to the route that is specified on the current tab (if any)
65
- */
66
- navigate() {
67
- if (!this.currentTab || !this.currentTab.route) {
68
- return;
69
- }
70
-
71
- goto(this.currentTab.route);
72
- }
73
-
74
- /**
75
- * Select the tab that has a route property that matches the current
76
- * browser location pathname
77
- *
78
- * @note the pathname starts with a '/'
79
- *
80
- * @param {string} [pathname]
81
- * If not specified, pathname from the browser's location will be used
82
- */
83
- selectTabByPathName(pathname) {
84
- if (!this.tabs.length) {
85
- return;
86
- }
87
-
88
- if (!pathname) {
89
- pathname = nav.pathname;
90
- }
91
-
92
- // console.log(`selectTabByPathName [${pathname}]`);
93
-
94
- const tabs = this.tabs;
95
-
96
- // > Try to find an exact match
97
-
98
- for (let j = 0, n = tabs.length; j < n; j = j + 1) {
99
- const tab = tabs[j];
100
-
101
- if (tab.route && tab.route === pathname) {
102
- //console.log('Found tab by route', tab);
103
- this.selectTabByIndex(j);
104
-
105
- return;
106
- }
107
- } // end for
108
-
109
- // > Try to find a match using a route prefix
110
-
111
- for (let j = 0, n = tabs.length; j < n; j = j + 1) {
112
- const tab = tabs[j];
113
-
114
- if (tab.routePrefix && pathname.startsWith(tab.routePrefix)) {
115
- //console.log('Found tab by route prefix', tab);
116
- this.selectTabByIndex(j);
117
-
118
- return;
119
- }
120
- } // end for
121
- }
122
-
123
- /**
124
- * Select a tab by its index in the array this.tabs
125
- *
126
- * @param {number} index
127
- */
128
- selectTabByIndex(index) {
129
- // console.log(`Select tab by index [${index}]`);
130
- this.currentTabIndex = index;
131
- }
132
-
133
- /**
134
- * Link a tab to a DOM element
135
- * - An reference is stored as property
136
- * - This reference can be used by extensions of this tab bar,
137
- * e.g. to manipulate the visual appearance of the tabs
138
- *
139
- * @param {number} index
140
- * @param {HTMLElement} tabElement
141
- */
142
- linkTab(index, tabElement) {
143
- this.tabElements[index] = tabElement;
144
- }
145
- } // end class
146
-
147
- /* -------------------------------------- Export create & get state functions */
148
-
149
- export const [createOrGetState, createState, getState] = defineStateContext(HkTabBarState);
1
+ import { defineStateContext } from '../../util/svelte/state-context/index.js';
2
+ import { nav } from '../../states/navigation.svelte.js';
3
+
4
+ import { goto } from '$app/navigation';
5
+
6
+ /**
7
+ * @typedef {import('./typedef.js').Tab} Tab
8
+ */
9
+
10
+ /* ------------------------------------------------------- Define state class */
11
+
12
+ export class HkTabBarState {
13
+ /** @type {Tab[]} */
14
+ tabs = $state.raw([]);
15
+
16
+ /** @type {any} */
17
+ tabBarElement = $state();
18
+
19
+ /** @type {HTMLElement[]} */
20
+ tabElements = [];
21
+
22
+ currentTabIndex = $state(-1);
23
+
24
+ /** @type {Tab|null} */
25
+ currentTab = $state(null);
26
+
27
+ // /** @type {boolean} */
28
+ // ready = $derived(this.currentTab !== null);
29
+
30
+ constructor() {
31
+ $effect.pre(() => {
32
+ // > Update this.currentTab
33
+
34
+ const tabs = this.tabs;
35
+
36
+ if (!this.tabs?.length || this.currentTabIndex === -1) {
37
+ this.currentTab = null;
38
+ } else {
39
+ const index = this.currentTabIndex;
40
+ const tabValue = tabs[index] ?? null;
41
+
42
+ // console.log('Selected active tab', index, tabValue);
43
+
44
+ this.currentTab = tabValue;
45
+ }
46
+ });
47
+ } // end constructor
48
+
49
+ /**
50
+ * Set tab contents
51
+ *
52
+ * @param {Tab[]} tabs
53
+ */
54
+ setTabs(tabs) {
55
+ // console.log('setTabs', tabs);
56
+ this.tabs = tabs;
57
+
58
+ if (this.currentTabIndex >= tabs.length) {
59
+ this.currentTabIndex = 0;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Navigate to the route that is specified on the current tab (if any)
65
+ */
66
+ navigate() {
67
+ if (!this.currentTab || !this.currentTab.route) {
68
+ return;
69
+ }
70
+
71
+ goto(this.currentTab.route);
72
+ }
73
+
74
+ /**
75
+ * Select the tab that has a route property that matches the current
76
+ * browser location pathname
77
+ *
78
+ * @note the pathname starts with a '/'
79
+ *
80
+ * @param {string} [pathname]
81
+ * If not specified, pathname from the browser's location will be used
82
+ */
83
+ selectTabByPathName(pathname) {
84
+ if (!this.tabs.length) {
85
+ return;
86
+ }
87
+
88
+ if (!pathname) {
89
+ pathname = nav.pathname;
90
+ }
91
+
92
+ // console.log(`selectTabByPathName [${pathname}]`);
93
+
94
+ const tabs = this.tabs;
95
+
96
+ // > Try to find an exact match
97
+
98
+ for (let j = 0, n = tabs.length; j < n; j = j + 1) {
99
+ const tab = tabs[j];
100
+
101
+ if (tab.route && tab.route === pathname) {
102
+ //console.log('Found tab by route', tab);
103
+ this.selectTabByIndex(j);
104
+
105
+ return;
106
+ }
107
+ } // end for
108
+
109
+ // > Try to find a match using a route prefix
110
+
111
+ for (let j = 0, n = tabs.length; j < n; j = j + 1) {
112
+ const tab = tabs[j];
113
+
114
+ if (tab.routePrefix && pathname.startsWith(tab.routePrefix)) {
115
+ //console.log('Found tab by route prefix', tab);
116
+ this.selectTabByIndex(j);
117
+
118
+ return;
119
+ }
120
+ } // end for
121
+ }
122
+
123
+ /**
124
+ * Select a tab by its index in the array this.tabs
125
+ *
126
+ * @param {number} index
127
+ */
128
+ selectTabByIndex(index) {
129
+ // console.log(`Select tab by index [${index}]`);
130
+ this.currentTabIndex = index;
131
+ }
132
+
133
+ /**
134
+ * Link a tab to a DOM element
135
+ * - An reference is stored as property
136
+ * - This reference can be used by extensions of this tab bar,
137
+ * e.g. to manipulate the visual appearance of the tabs
138
+ *
139
+ * @param {number} index
140
+ * @param {HTMLElement} tabElement
141
+ */
142
+ linkTab(index, tabElement) {
143
+ this.tabElements[index] = tabElement;
144
+ }
145
+ } // end class
146
+
147
+ /* -------------------------------------- Export create & get state functions */
148
+
149
+ export const [createOrGetState, createState, getState] = defineStateContext(HkTabBarState);