@hkdigital/lib-sveltekit 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/{svkit → svelte}/audio/mocks.js +35 -35
  17. package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/{svkit → svelte}/final-state-machine/index.js +1 -1
  19. package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/{svkit → svelte}/image/index.js +4 -4
  23. package/dist/classes/{svkit → svelte}/image/mocks.js +35 -35
  24. package/dist/classes/{svkit → svelte}/image/typedef.js +8 -8
  25. package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/{svkit → svelte}/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/{svkit → svelte}/loading-state-machine/index.js +3 -3
  28. package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/{svkit → svelte}/network-loader/constants.js +3 -3
  30. package/dist/classes/{svkit → svelte}/network-loader/index.js +3 -3
  31. package/dist/classes/{svkit → svelte}/network-loader/mocks.js +30 -30
  32. package/dist/classes/{svkit → svelte}/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +0 -14
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +0 -15
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +199 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
  44. package/dist/components/buttons/button/Button.svelte +75 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
  46. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  47. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
  48. package/dist/components/buttons/index.js +2 -2
  49. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  50. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
  51. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  52. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
  53. package/dist/components/icon/HkIcon.svelte +86 -86
  54. package/dist/components/icon/HkIcon.svelte.d.ts +0 -12
  55. package/dist/components/icon/HkTabIcon.svelte +116 -116
  56. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -21
  57. package/dist/components/icon/index.js +4 -4
  58. package/dist/components/icon/typedef.js +16 -16
  59. package/dist/components/image/ImageBox.svelte +208 -208
  60. package/dist/components/image/ImageBox.svelte.d.ts +2 -21
  61. package/dist/components/image/index.js +5 -5
  62. package/dist/components/image/typedef.js +32 -32
  63. package/dist/components/index.js +2 -2
  64. package/dist/components/inputs/index.js +1 -1
  65. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  66. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  67. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
  68. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  69. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  70. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  71. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  72. package/dist/components/layout/HkAppLayout.svelte +251 -251
  73. package/dist/components/layout/HkAppLayout.svelte.d.ts +0 -11
  74. package/dist/components/layout/HkGridLayers.svelte +82 -82
  75. package/dist/components/layout/HkGridLayers.svelte.d.ts +0 -23
  76. package/dist/components/layout/index.js +9 -9
  77. package/dist/components/panels/index.js +1 -1
  78. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  79. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +0 -12
  80. package/dist/components/rows/index.js +3 -3
  81. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  82. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
  83. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  84. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
  85. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  86. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  87. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
  88. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  89. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  90. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
  91. package/dist/components/tab-bar/index.js +17 -17
  92. package/dist/components/tab-bar/typedef.js +8 -8
  93. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  94. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
  95. package/dist/components/widgets/compare-left-right/index.js +1 -1
  96. package/dist/components/widgets/scale-control/index.js +1 -1
  97. package/dist/config/imagetools-config.js +189 -189
  98. package/dist/config/imagetools.d.ts +71 -71
  99. package/dist/config/typedef.js +8 -8
  100. package/dist/constants/errors/api.js +9 -9
  101. package/dist/constants/errors/generic.js +5 -5
  102. package/dist/constants/errors/index.js +3 -3
  103. package/dist/constants/errors/jwt.js +5 -5
  104. package/dist/constants/http/headers.js +6 -6
  105. package/dist/constants/http/index.js +2 -2
  106. package/dist/constants/http/methods.js +2 -2
  107. package/dist/constants/index.js +3 -3
  108. package/dist/constants/mime/application.js +5 -5
  109. package/dist/constants/mime/audio.js +13 -13
  110. package/dist/constants/mime/image.js +3 -3
  111. package/dist/constants/mime/index.js +4 -4
  112. package/dist/constants/mime/text.js +2 -2
  113. package/dist/constants/regexp/index.js +31 -31
  114. package/dist/constants/regexp/inspiratie.js__ +95 -95
  115. package/dist/constants/regexp/text.js +49 -49
  116. package/dist/constants/regexp/user.js +32 -32
  117. package/dist/constants/regexp/web.js +3 -3
  118. package/dist/constants/state-labels/input-states.js +11 -11
  119. package/dist/constants/state-labels/submit-states.js +4 -4
  120. package/dist/constants/time.js +28 -28
  121. package/dist/css/tw-prose.postcss__ +259 -259
  122. package/dist/css/utilities.postcss +43 -43
  123. package/dist/{design-system → design}/design-config.js +73 -73
  124. package/dist/{design-system → design}/tailwind-theme-extend.d.ts +4 -4
  125. package/dist/{design-system → design}/tailwind-theme-extend.js +151 -151
  126. package/dist/schemas/index.js +1 -1
  127. package/dist/schemas/validate-url.js +180 -180
  128. package/dist/server/index.js +1 -1
  129. package/dist/server/logger.js +94 -94
  130. package/dist/states/index.js +1 -1
  131. package/dist/states/navigation.svelte.js +55 -55
  132. package/dist/stores/index.js +1 -1
  133. package/dist/stores/theme.js +80 -80
  134. package/dist/themes/hkdev/components/blocks/text-block.postcss +40 -40
  135. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  136. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  137. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  138. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  139. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  140. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  141. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  142. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  143. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  144. package/dist/themes/hkdev/components.postcss +55 -55
  145. package/dist/themes/hkdev/debug.postcss +1 -1
  146. package/dist/themes/hkdev/global/layout.postcss +39 -39
  147. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  148. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  149. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  150. package/dist/themes/hkdev/globals.postcss +11 -11
  151. package/dist/themes/hkdev/responsive.postcss +12 -12
  152. package/dist/themes/hkdev/theme-ext.js +15 -15
  153. package/dist/themes/hkdev/theme.js +227 -227
  154. package/dist/themes/index.js +1 -1
  155. package/dist/util/array/index.js +455 -455
  156. package/dist/util/compare/index.js +247 -247
  157. package/dist/util/css/css-vars.js +83 -83
  158. package/dist/util/css/index.js +1 -1
  159. package/dist/util/design-system/components/states.js +22 -22
  160. package/dist/util/design-system/css/clamp.d.ts +2 -2
  161. package/dist/util/design-system/css/clamp.js +66 -66
  162. package/dist/util/design-system/css/root-design-vars.js +100 -100
  163. package/dist/util/design-system/index.js +5 -5
  164. package/dist/util/design-system/layout/scaling.js +97 -97
  165. package/dist/util/design-system/tailwind.js +289 -289
  166. package/dist/util/expect/arrays.js +47 -47
  167. package/dist/util/expect/index.js +259 -259
  168. package/dist/util/expect/primitives.js +55 -55
  169. package/dist/util/expect/url.js +60 -60
  170. package/dist/util/function/index.js +218 -218
  171. package/dist/util/http/errors.js +97 -97
  172. package/dist/util/http/headers.js +45 -45
  173. package/dist/util/http/http-request.js +273 -273
  174. package/dist/util/http/index.js +22 -22
  175. package/dist/util/http/json-request.js +143 -143
  176. package/dist/util/http/mocks.js +65 -65
  177. package/dist/util/http/response.js +228 -228
  178. package/dist/util/http/url.js +52 -52
  179. package/dist/util/image/index.js +86 -86
  180. package/dist/util/index.js +2 -2
  181. package/dist/util/is/index.js +140 -140
  182. package/dist/util/iterate/index.js +234 -234
  183. package/dist/util/object/index.js +1361 -1361
  184. package/dist/util/singleton/index.js +97 -97
  185. package/dist/util/string/index.js +184 -184
  186. package/dist/util/svelte/index.js +2 -2
  187. package/dist/util/svelte/observe/index.js +49 -49
  188. package/dist/util/svelte/state-context/index.js +83 -83
  189. package/dist/util/svelte/wait/index.js +38 -38
  190. package/dist/util/sveltekit/index.js +1 -1
  191. package/dist/util/sveltekit/route-folders/index.js +82 -82
  192. package/dist/util/time/index.js +339 -339
  193. package/dist/valibot/date.js__ +10 -10
  194. package/dist/valibot/index.js +9 -9
  195. package/dist/valibot/url.js +95 -95
  196. package/dist/valibot/user.js +23 -23
  197. package/dist/zod/all.js +33 -33
  198. package/dist/zod/generic.js +11 -11
  199. package/dist/zod/javascript.js +32 -32
  200. package/dist/zod/user.js +16 -16
  201. package/dist/zod/web.js +52 -52
  202. package/package.json +99 -99
  203. package/dist/themes/hkdev/components/buttons/button.postcss__ +0 -40
  204. package/dist/themes/hkdev/components/buttons/button.postcss___ +0 -91
  205. /package/dist/classes/{svkit → svelte}/audio/AudioLoader.svelte.d.ts +0 -0
  206. /package/dist/classes/{svkit → svelte}/audio/AudioScene.svelte.d.ts +0 -0
  207. /package/dist/classes/{svkit → svelte}/audio/mocks.d.ts +0 -0
  208. /package/dist/classes/{svkit → svelte}/final-state-machine/FiniteStateMachine.svelte.d.ts +0 -0
  209. /package/dist/classes/{svkit → svelte}/final-state-machine/index.d.ts +0 -0
  210. /package/dist/classes/{svkit → svelte}/image/ImageLoader.svelte.d.ts +0 -0
  211. /package/dist/classes/{svkit → svelte}/image/ImageScene.svelte.d.ts +0 -0
  212. /package/dist/classes/{svkit → svelte}/image/ImageVariantsLoader.svelte.d.ts +0 -0
  213. /package/dist/classes/{svkit → svelte}/image/index.d.ts +0 -0
  214. /package/dist/classes/{svkit → svelte}/image/mocks.d.ts +0 -0
  215. /package/dist/classes/{svkit → svelte}/image/typedef.d.ts +0 -0
  216. /package/dist/classes/{svkit → svelte}/loading-state-machine/LoadingStateMachine.svelte.d.ts +0 -0
  217. /package/dist/classes/{svkit → svelte}/loading-state-machine/constants.d.ts +0 -0
  218. /package/dist/classes/{svkit → svelte}/loading-state-machine/index.d.ts +0 -0
  219. /package/dist/classes/{svkit → svelte}/network-loader/NetworkLoader.svelte.d.ts +0 -0
  220. /package/dist/classes/{svkit → svelte}/network-loader/constants.d.ts +0 -0
  221. /package/dist/classes/{svkit → svelte}/network-loader/index.d.ts +0 -0
  222. /package/dist/classes/{svkit → svelte}/network-loader/mocks.d.ts +0 -0
  223. /package/dist/classes/{svkit → svelte}/network-loader/typedef.d.ts +0 -0
  224. /package/dist/{design-system → design}/design-config.d.ts +0 -0
@@ -1,289 +1,289 @@
1
- /**
2
- * Generates text-based spacing units with with different scaling
3
- * units (ut, ct, ht)
4
- *
5
- * @param {number[]} values
6
- * Array of pixel values to generate text-based spacing units for
7
- *
8
- * @returns {{[key: string]: string}}
9
- * Generated text-based spacing units with ut, ct, and ht suffixes
10
- *
11
- * @throws {Error} If values is not an array or contains non-numeric values
12
- *
13
- * @example
14
- * generateTextBasedSpacing([1, 2, 4, 8])
15
- * // Returns:
16
- * // {
17
- * // '1ut': 'calc(1px * var(--scale-text-ui))',
18
- * // '2ut': 'calc(2px * var(--scale-text-ui))',
19
- * // '1ct': 'calc(1px * var(--scale-text-content))',
20
- * // '2ct': 'calc(2px * var(--scale-text-content))',
21
- * // '1ht': 'calc(1px * var(--scale-text-heading))',
22
- * // '2ht': 'calc(2px * var(--scale-text-heading))'
23
- * // }
24
- */
25
- export function generateTextBasedSpacing(values) {
26
- if (!Array.isArray(values)) {
27
- throw new Error('values must be an array');
28
- }
29
-
30
- return values.reduce((units, value) => {
31
- if (typeof value !== 'number' || isNaN(value)) {
32
- throw new Error(`Invalid spacing value: ${value}. Must be a number.`);
33
- }
34
-
35
- // Generate UI text spacing units
36
- units[`${value}ut`] = `calc(${value}px * var(--scale-text-ui))`;
37
-
38
- // Generate content text spacing units
39
- units[`${value}ct`] = `calc(${value}px * var(--scale-text-content))`;
40
-
41
- // Generate heading text spacing units
42
- units[`${value}ht`] = `calc(${value}px * var(--scale-text-heading))`;
43
-
44
- return units;
45
- }, {});
46
- }
47
-
48
- /**
49
- * Generates viewport-based spacing units with different scaling
50
- * units (p, vp, wp, hp)
51
- *
52
- * @param {number[]} values
53
- * Array of pixel values to generate viewport-based spacing units for
54
- *
55
- * @returns {Object.<string, string>}
56
- * Generated viewport-based spacing units:
57
- * - p: UI points (clamped scaling)
58
- * - vp: Viewport points (min of width/height)
59
- * - wp: Width points
60
- * - hp: Height points
61
- *
62
- * @throws {Error} If values is not an array or contains non-numeric values
63
- *
64
- * @example
65
- * generateViewportBasedSpacing([1, 2, 4])
66
- * // Returns:
67
- * // {
68
- * // '1p': 'calc(1px * var(--scale-ui))',
69
- * // '1vp': 'calc(1px * var(--scale-viewport))',
70
- * // '1wp': 'calc(1px * var(--scale-w))',
71
- * // '1hp': 'calc(1px * var(--scale-h))'
72
- * // }
73
- */
74
- export function generateViewportBasedSpacing(values) {
75
- if (!Array.isArray(values)) {
76
- throw new Error('values must be an array');
77
- }
78
-
79
- return values.reduce((units, value) => {
80
- if (typeof value !== 'number' || isNaN(value)) {
81
- throw new Error(`Invalid spacing value: ${value}. Must be a number.`);
82
- }
83
-
84
- // Viewport points (min of width/height)
85
- units[`${value}vp`] = `calc(${value}px * var(--scale-viewport))`;
86
- // Width points
87
- units[`${value}wp`] = `calc(${value}px * var(--scale-w))`;
88
- // Height points
89
- units[`${value}hp`] = `calc(${value}px * var(--scale-h))`;
90
- // UI points
91
- units[`${value}p`] = `calc(${value}px * var(--scale-ui))`;
92
- return units;
93
- }, {});
94
- }
95
-
96
- /**
97
- * Generates semantic text style definitions for a specific text category
98
- * (content, UI, or heading). Each style includes a scaled font size and
99
- * line height.
100
- *
101
- * @param {{[key: string]: {size: number, lineHeight?: number}}} sizes
102
- * Set of text sizes to generate styles for
103
- *
104
- * @param {'content' | 'ui' | 'heading'} category
105
- * Text category to generate styles for
106
- *
107
- * @returns {{[key: string]: [string, {lineHeight: number}]}}
108
- * Generated text styles in Tailwind format
109
- *
110
- * @throws {Error} If a size has an invalid size or lineHeight
111
- *
112
- * @example
113
- * const TEXT_CONTENT_SIZES = {
114
- * sm: { size: 16, lineHeight: 1.5 },
115
- * base: { size: 20, lineHeight: 1.5 },
116
- * lg: { size: 24, lineHeight: 1.4 }
117
- * };
118
- *
119
- * generateTextStyles(TEXT_CONTENT_SIZES, 'content');
120
- * // Returns:
121
- * // {
122
- * // 'content-sm':
123
- * // ['calc(16px * var(--scale-text-content))', { lineHeight: 1.5 }],
124
- * // 'content-base':
125
- * // ['calc(20px * var(--scale-text-content))', { lineHeight: 1.5 }],
126
- * // 'content-lg':
127
- * // ['calc(24px * var(--scale-text-content))', { lineHeight: 1.4 }]
128
- * // }
129
- */
130
- export function generateTextStyles(sizes, category) {
131
- if (!sizes || typeof sizes !== 'object') {
132
- throw new Error('sizes must be an object');
133
- }
134
-
135
- if (!['content', 'ui', 'heading'].includes(category)) {
136
- throw new Error('category must be one of: content, ui, heading');
137
- }
138
-
139
- return Object.entries(sizes).reduce((result, [variant, config]) => {
140
- // Validate config
141
- if (!config || typeof config !== 'object') {
142
- throw new Error(
143
- `Invalid size config for "${variant}": must be an object`
144
- );
145
- }
146
-
147
- if (typeof config.size !== 'number') {
148
- throw new Error(
149
- `Invalid size for "${category}-${variant}": must be a number`
150
- );
151
- }
152
-
153
- if (
154
- config.lineHeight !== undefined &&
155
- typeof config.lineHeight !== 'number'
156
- ) {
157
- throw new Error(
158
- `Invalid lineHeight for "${category}-${variant}": must be a number`
159
- );
160
- }
161
-
162
- const { size, lineHeight = 1.5 } = config;
163
-
164
- result[`${category}-${variant}`] = [
165
- `calc(${size}px * var(--scale-text-${category}))`,
166
- { lineHeight }
167
- ];
168
-
169
- return result;
170
- }, {});
171
- }
172
-
173
- /**
174
- * Generates border radius styles with UI scaling
175
- *
176
- * @param {{[key: string]: string | {size: number}}} sizes
177
- * Set of radius sizes to generate, either as:
178
- * - Object with size property (e.g., { size: 10 })
179
- * - Direct string value (e.g., '0px', '9999px')
180
- *
181
- * @returns {Object.<string, string>}
182
- * Generated border radius styles in Tailwind format
183
- *
184
- * @throws {Error} If a value has an invalid type
185
- *
186
- * @example
187
- * const RADIUS_SIZES = {
188
- * none: '0px',
189
- * sm: { size: 10 },
190
- * md: { size: 15 },
191
- * full: '9999px'
192
- * };
193
- *
194
- * generateBorderRadiusStyles(RADIUS_SIZES)
195
- * // Returns:
196
- * // {
197
- * // 'none': '0px',
198
- * // 'sm': 'calc(10px * var(--scale-ui))',
199
- * // 'md': 'calc(15px * var(--scale-ui))',
200
- * // 'full': '9999px'
201
- * // }
202
- */
203
- export function generateBorderRadiusStyles(sizes) {
204
- if (!sizes || typeof sizes !== 'object') {
205
- throw new Error('sizes must be an object');
206
- }
207
-
208
- return Object.entries(sizes).reduce((result, [variant, value]) => {
209
- if (typeof value === 'object' && value !== null) {
210
- // Handle {size: 10} format
211
- if (typeof value.size !== 'number') {
212
- throw new Error(
213
- `Invalid radius size for "${variant}": size must be a number`
214
- );
215
- }
216
- result[variant] = `calc(${value.size}px * var(--scale-ui))`;
217
- } else if (typeof value === 'string') {
218
- // Handle direct strings (like '0px' or '9999px')
219
- result[variant] = value;
220
- } else {
221
- throw new Error(
222
- `Invalid radius value for "${variant}": ` +
223
- `must be an object with size property or a string`
224
- );
225
- }
226
- return result;
227
- }, {});
228
- }
229
-
230
- /**
231
- * Generates width styles for various CSS properties with UI scaling and explicit naming
232
- *
233
- * @param {{[key: string]: {size: number}}} sizes
234
- * Set of width sizes to generate
235
- *
236
- * @param {string} [prefix='width']
237
- * Prefix to add before each variant name (default: 'width')
238
- *
239
- * @param {string} scaleVar
240
- * CSS variable to use for scaling (default: '--scale-ui')
241
- *
242
- * @returns {{[key: string]: string}}
243
- * Generated width styles in Tailwind format
244
- *
245
- * @throws {Error} If a size has an invalid type
246
- *
247
- * @example
248
- * const WIDTH_SIZES = {
249
- * thin: { size: 1 },
250
- * normal: { size: 2 },
251
- * thick: { size: 4 }
252
- * };
253
- *
254
- * generateWidthStyles(WIDTH_SIZES, 'width')
255
- * // Returns:
256
- * // {
257
- * // 'width-thin': 'calc(1px * var(--scale-ui))',
258
- * // 'width-normal': 'calc(2px * var(--scale-ui))',
259
- * // 'width-thick': 'calc(4px * var(--scale-ui))'
260
- * // }
261
- */
262
- export function generateWidthStyles(
263
- sizes,
264
- prefix = 'width',
265
- scaleVar = '--scale-ui'
266
- ) {
267
- if (!sizes || typeof sizes !== 'object') {
268
- throw new Error('sizes must be an object');
269
- }
270
-
271
- return Object.entries(sizes).reduce((result, [variant, value]) => {
272
- if (typeof value === 'object' && value !== null) {
273
- if (typeof value.size !== 'number') {
274
- throw new Error(
275
- `Invalid width size for "${variant}": size must be a number`
276
- );
277
- }
278
-
279
- result[`${prefix}${prefix.length ? '-' : ''}${variant}`] =
280
- `calc(${value.size}px * var(${scaleVar}))`;
281
- } else {
282
- throw new Error(
283
- `Invalid width value for "${variant}": ` +
284
- `must be an object with size property`
285
- );
286
- }
287
- return result;
288
- }, {});
289
- }
1
+ /**
2
+ * Generates text-based spacing units with with different scaling
3
+ * units (ut, ct, ht)
4
+ *
5
+ * @param {number[]} values
6
+ * Array of pixel values to generate text-based spacing units for
7
+ *
8
+ * @returns {{[key: string]: string}}
9
+ * Generated text-based spacing units with ut, ct, and ht suffixes
10
+ *
11
+ * @throws {Error} If values is not an array or contains non-numeric values
12
+ *
13
+ * @example
14
+ * generateTextBasedSpacing([1, 2, 4, 8])
15
+ * // Returns:
16
+ * // {
17
+ * // '1ut': 'calc(1px * var(--scale-text-ui))',
18
+ * // '2ut': 'calc(2px * var(--scale-text-ui))',
19
+ * // '1ct': 'calc(1px * var(--scale-text-content))',
20
+ * // '2ct': 'calc(2px * var(--scale-text-content))',
21
+ * // '1ht': 'calc(1px * var(--scale-text-heading))',
22
+ * // '2ht': 'calc(2px * var(--scale-text-heading))'
23
+ * // }
24
+ */
25
+ export function generateTextBasedSpacing(values) {
26
+ if (!Array.isArray(values)) {
27
+ throw new Error('values must be an array');
28
+ }
29
+
30
+ return values.reduce((units, value) => {
31
+ if (typeof value !== 'number' || isNaN(value)) {
32
+ throw new Error(`Invalid spacing value: ${value}. Must be a number.`);
33
+ }
34
+
35
+ // Generate UI text spacing units
36
+ units[`${value}ut`] = `calc(${value}px * var(--scale-text-ui))`;
37
+
38
+ // Generate content text spacing units
39
+ units[`${value}ct`] = `calc(${value}px * var(--scale-text-content))`;
40
+
41
+ // Generate heading text spacing units
42
+ units[`${value}ht`] = `calc(${value}px * var(--scale-text-heading))`;
43
+
44
+ return units;
45
+ }, {});
46
+ }
47
+
48
+ /**
49
+ * Generates viewport-based spacing units with different scaling
50
+ * units (p, vp, wp, hp)
51
+ *
52
+ * @param {number[]} values
53
+ * Array of pixel values to generate viewport-based spacing units for
54
+ *
55
+ * @returns {Object.<string, string>}
56
+ * Generated viewport-based spacing units:
57
+ * - p: UI points (clamped scaling)
58
+ * - vp: Viewport points (min of width/height)
59
+ * - wp: Width points
60
+ * - hp: Height points
61
+ *
62
+ * @throws {Error} If values is not an array or contains non-numeric values
63
+ *
64
+ * @example
65
+ * generateViewportBasedSpacing([1, 2, 4])
66
+ * // Returns:
67
+ * // {
68
+ * // '1p': 'calc(1px * var(--scale-ui))',
69
+ * // '1vp': 'calc(1px * var(--scale-viewport))',
70
+ * // '1wp': 'calc(1px * var(--scale-w))',
71
+ * // '1hp': 'calc(1px * var(--scale-h))'
72
+ * // }
73
+ */
74
+ export function generateViewportBasedSpacing(values) {
75
+ if (!Array.isArray(values)) {
76
+ throw new Error('values must be an array');
77
+ }
78
+
79
+ return values.reduce((units, value) => {
80
+ if (typeof value !== 'number' || isNaN(value)) {
81
+ throw new Error(`Invalid spacing value: ${value}. Must be a number.`);
82
+ }
83
+
84
+ // Viewport points (min of width/height)
85
+ units[`${value}vp`] = `calc(${value}px * var(--scale-viewport))`;
86
+ // Width points
87
+ units[`${value}wp`] = `calc(${value}px * var(--scale-w))`;
88
+ // Height points
89
+ units[`${value}hp`] = `calc(${value}px * var(--scale-h))`;
90
+ // UI points
91
+ units[`${value}p`] = `calc(${value}px * var(--scale-ui))`;
92
+ return units;
93
+ }, {});
94
+ }
95
+
96
+ /**
97
+ * Generates semantic text style definitions for a specific text category
98
+ * (content, UI, or heading). Each style includes a scaled font size and
99
+ * line height.
100
+ *
101
+ * @param {{[key: string]: {size: number, lineHeight?: number}}} sizes
102
+ * Set of text sizes to generate styles for
103
+ *
104
+ * @param {'content' | 'ui' | 'heading'} category
105
+ * Text category to generate styles for
106
+ *
107
+ * @returns {{[key: string]: [string, {lineHeight: number}]}}
108
+ * Generated text styles in Tailwind format
109
+ *
110
+ * @throws {Error} If a size has an invalid size or lineHeight
111
+ *
112
+ * @example
113
+ * const TEXT_CONTENT_SIZES = {
114
+ * sm: { size: 16, lineHeight: 1.5 },
115
+ * base: { size: 20, lineHeight: 1.5 },
116
+ * lg: { size: 24, lineHeight: 1.4 }
117
+ * };
118
+ *
119
+ * generateTextStyles(TEXT_CONTENT_SIZES, 'content');
120
+ * // Returns:
121
+ * // {
122
+ * // 'content-sm':
123
+ * // ['calc(16px * var(--scale-text-content))', { lineHeight: 1.5 }],
124
+ * // 'content-base':
125
+ * // ['calc(20px * var(--scale-text-content))', { lineHeight: 1.5 }],
126
+ * // 'content-lg':
127
+ * // ['calc(24px * var(--scale-text-content))', { lineHeight: 1.4 }]
128
+ * // }
129
+ */
130
+ export function generateTextStyles(sizes, category) {
131
+ if (!sizes || typeof sizes !== 'object') {
132
+ throw new Error('sizes must be an object');
133
+ }
134
+
135
+ if (!['content', 'ui', 'heading'].includes(category)) {
136
+ throw new Error('category must be one of: content, ui, heading');
137
+ }
138
+
139
+ return Object.entries(sizes).reduce((result, [variant, config]) => {
140
+ // Validate config
141
+ if (!config || typeof config !== 'object') {
142
+ throw new Error(
143
+ `Invalid size config for "${variant}": must be an object`
144
+ );
145
+ }
146
+
147
+ if (typeof config.size !== 'number') {
148
+ throw new Error(
149
+ `Invalid size for "${category}-${variant}": must be a number`
150
+ );
151
+ }
152
+
153
+ if (
154
+ config.lineHeight !== undefined &&
155
+ typeof config.lineHeight !== 'number'
156
+ ) {
157
+ throw new Error(
158
+ `Invalid lineHeight for "${category}-${variant}": must be a number`
159
+ );
160
+ }
161
+
162
+ const { size, lineHeight = 1.5 } = config;
163
+
164
+ result[`${category}-${variant}`] = [
165
+ `calc(${size}px * var(--scale-text-${category}))`,
166
+ { lineHeight }
167
+ ];
168
+
169
+ return result;
170
+ }, {});
171
+ }
172
+
173
+ /**
174
+ * Generates border radius styles with UI scaling
175
+ *
176
+ * @param {{[key: string]: string | {size: number}}} sizes
177
+ * Set of radius sizes to generate, either as:
178
+ * - Object with size property (e.g., { size: 10 })
179
+ * - Direct string value (e.g., '0px', '9999px')
180
+ *
181
+ * @returns {Object.<string, string>}
182
+ * Generated border radius styles in Tailwind format
183
+ *
184
+ * @throws {Error} If a value has an invalid type
185
+ *
186
+ * @example
187
+ * const RADIUS_SIZES = {
188
+ * none: '0px',
189
+ * sm: { size: 10 },
190
+ * md: { size: 15 },
191
+ * full: '9999px'
192
+ * };
193
+ *
194
+ * generateBorderRadiusStyles(RADIUS_SIZES)
195
+ * // Returns:
196
+ * // {
197
+ * // 'none': '0px',
198
+ * // 'sm': 'calc(10px * var(--scale-ui))',
199
+ * // 'md': 'calc(15px * var(--scale-ui))',
200
+ * // 'full': '9999px'
201
+ * // }
202
+ */
203
+ export function generateBorderRadiusStyles(sizes) {
204
+ if (!sizes || typeof sizes !== 'object') {
205
+ throw new Error('sizes must be an object');
206
+ }
207
+
208
+ return Object.entries(sizes).reduce((result, [variant, value]) => {
209
+ if (typeof value === 'object' && value !== null) {
210
+ // Handle {size: 10} format
211
+ if (typeof value.size !== 'number') {
212
+ throw new Error(
213
+ `Invalid radius size for "${variant}": size must be a number`
214
+ );
215
+ }
216
+ result[variant] = `calc(${value.size}px * var(--scale-ui))`;
217
+ } else if (typeof value === 'string') {
218
+ // Handle direct strings (like '0px' or '9999px')
219
+ result[variant] = value;
220
+ } else {
221
+ throw new Error(
222
+ `Invalid radius value for "${variant}": ` +
223
+ `must be an object with size property or a string`
224
+ );
225
+ }
226
+ return result;
227
+ }, {});
228
+ }
229
+
230
+ /**
231
+ * Generates width styles for various CSS properties with UI scaling and explicit naming
232
+ *
233
+ * @param {{[key: string]: {size: number}}} sizes
234
+ * Set of width sizes to generate
235
+ *
236
+ * @param {string} [prefix='width']
237
+ * Prefix to add before each variant name (default: 'width')
238
+ *
239
+ * @param {string} scaleVar
240
+ * CSS variable to use for scaling (default: '--scale-ui')
241
+ *
242
+ * @returns {{[key: string]: string}}
243
+ * Generated width styles in Tailwind format
244
+ *
245
+ * @throws {Error} If a size has an invalid type
246
+ *
247
+ * @example
248
+ * const WIDTH_SIZES = {
249
+ * thin: { size: 1 },
250
+ * normal: { size: 2 },
251
+ * thick: { size: 4 }
252
+ * };
253
+ *
254
+ * generateWidthStyles(WIDTH_SIZES, 'width')
255
+ * // Returns:
256
+ * // {
257
+ * // 'width-thin': 'calc(1px * var(--scale-ui))',
258
+ * // 'width-normal': 'calc(2px * var(--scale-ui))',
259
+ * // 'width-thick': 'calc(4px * var(--scale-ui))'
260
+ * // }
261
+ */
262
+ export function generateWidthStyles(
263
+ sizes,
264
+ prefix = 'width',
265
+ scaleVar = '--scale-ui'
266
+ ) {
267
+ if (!sizes || typeof sizes !== 'object') {
268
+ throw new Error('sizes must be an object');
269
+ }
270
+
271
+ return Object.entries(sizes).reduce((result, [variant, value]) => {
272
+ if (typeof value === 'object' && value !== null) {
273
+ if (typeof value.size !== 'number') {
274
+ throw new Error(
275
+ `Invalid width size for "${variant}": size must be a number`
276
+ );
277
+ }
278
+
279
+ result[`${prefix}${prefix.length ? '-' : ''}${variant}`] =
280
+ `calc(${value.size}px * var(${scaleVar}))`;
281
+ } else {
282
+ throw new Error(
283
+ `Invalid width value for "${variant}": ` +
284
+ `must be an object with size property`
285
+ );
286
+ }
287
+ return result;
288
+ }, {});
289
+ }
@@ -1,47 +1,47 @@
1
- import * as v from 'valibot';
2
-
3
- /**
4
- * Throws a validation error if value is not an array
5
- *
6
- * @param {any} value
7
- */
8
- function array_(value) {
9
- v.parse(v.instance(Array), value);
10
- }
11
-
12
- export { array_ as array };
13
-
14
- /**
15
- * Throws a validation error if value is not an array of strings
16
- *
17
- * @param {any} value
18
- */
19
- export function stringArray(value) {
20
- v.parse(v.array(v.string()), value);
21
- }
22
-
23
- /**
24
- * Throws a validation error if value is not an array of objects
25
- *
26
- * @param {any} value
27
- */
28
- export function objectArray(value) {
29
- v.parse(v.array(v.looseObject({})), value);
30
- }
31
-
32
- /**
33
- * Throws an exception if the value is not an Array or the array is empty
34
- */
35
- export function notEmptyArray(value) {
36
- v.parse(v.pipe(v.instance(Array), v.nonEmpty()), value);
37
- }
38
-
39
- /**
40
- * Throws a validation error if value is not array like
41
- * - Checks if the value is an object and has a property `length`
42
- *
43
- * @param {any} value
44
- */
45
- export function arrayLike(value) {
46
- v.parse(v.object({ length: v.number() }), value);
47
- }
1
+ import * as v from 'valibot';
2
+
3
+ /**
4
+ * Throws a validation error if value is not an array
5
+ *
6
+ * @param {any} value
7
+ */
8
+ function array_(value) {
9
+ v.parse(v.instance(Array), value);
10
+ }
11
+
12
+ export { array_ as array };
13
+
14
+ /**
15
+ * Throws a validation error if value is not an array of strings
16
+ *
17
+ * @param {any} value
18
+ */
19
+ export function stringArray(value) {
20
+ v.parse(v.array(v.string()), value);
21
+ }
22
+
23
+ /**
24
+ * Throws a validation error if value is not an array of objects
25
+ *
26
+ * @param {any} value
27
+ */
28
+ export function objectArray(value) {
29
+ v.parse(v.array(v.looseObject({})), value);
30
+ }
31
+
32
+ /**
33
+ * Throws an exception if the value is not an Array or the array is empty
34
+ */
35
+ export function notEmptyArray(value) {
36
+ v.parse(v.pipe(v.instance(Array), v.nonEmpty()), value);
37
+ }
38
+
39
+ /**
40
+ * Throws a validation error if value is not array like
41
+ * - Checks if the value is an object and has a property `length`
42
+ *
43
+ * @param {any} value
44
+ */
45
+ export function arrayLike(value) {
46
+ v.parse(v.object({ length: v.number() }), value);
47
+ }