@hanzogui/themes 2.0.0

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 (324) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/componentThemeDefinitions.cjs +124 -0
  3. package/dist/cjs/componentThemeDefinitions.native.js +127 -0
  4. package/dist/cjs/componentThemeDefinitions.native.js.map +1 -0
  5. package/dist/cjs/generated-new.cjs +2021 -0
  6. package/dist/cjs/generated-new.native.js +2040 -0
  7. package/dist/cjs/generated-new.native.js.map +1 -0
  8. package/dist/cjs/generated-v3.cjs +1099 -0
  9. package/dist/cjs/generated-v3.native.js +1118 -0
  10. package/dist/cjs/generated-v3.native.js.map +1 -0
  11. package/dist/cjs/generated-v4-gui.cjs +933 -0
  12. package/dist/cjs/generated-v4-gui.native.js +952 -0
  13. package/dist/cjs/generated-v4-gui.native.js.map +1 -0
  14. package/dist/cjs/generated-v4.cjs +391 -0
  15. package/dist/cjs/generated-v4.native.js +410 -0
  16. package/dist/cjs/generated-v4.native.js.map +1 -0
  17. package/dist/cjs/generated-v5-subtle.cjs +549 -0
  18. package/dist/cjs/generated-v5-subtle.native.js +568 -0
  19. package/dist/cjs/generated-v5-subtle.native.js.map +1 -0
  20. package/dist/cjs/generated-v5.cjs +549 -0
  21. package/dist/cjs/generated-v5.native.js +568 -0
  22. package/dist/cjs/generated-v5.native.js.map +1 -0
  23. package/dist/cjs/helpers.cjs +34 -0
  24. package/dist/cjs/helpers.native.js +39 -0
  25. package/dist/cjs/helpers.native.js.map +1 -0
  26. package/dist/cjs/index.cjs +25 -0
  27. package/dist/cjs/index.native.js +28 -0
  28. package/dist/cjs/index.native.js.map +1 -0
  29. package/dist/cjs/opacify.cjs +96 -0
  30. package/dist/cjs/opacify.native.js +106 -0
  31. package/dist/cjs/opacify.native.js.map +1 -0
  32. package/dist/cjs/palettes.cjs +52 -0
  33. package/dist/cjs/palettes.native.js +63 -0
  34. package/dist/cjs/palettes.native.js.map +1 -0
  35. package/dist/cjs/shadows.cjs +43 -0
  36. package/dist/cjs/shadows.native.js +46 -0
  37. package/dist/cjs/shadows.native.js.map +1 -0
  38. package/dist/cjs/subtleChildrenThemes.cjs +65 -0
  39. package/dist/cjs/subtleChildrenThemes.native.js +74 -0
  40. package/dist/cjs/subtleChildrenThemes.native.js.map +1 -0
  41. package/dist/cjs/templates.cjs +118 -0
  42. package/dist/cjs/templates.native.js +121 -0
  43. package/dist/cjs/templates.native.js.map +1 -0
  44. package/dist/cjs/themes-new.cjs +86 -0
  45. package/dist/cjs/themes-new.native.js +88 -0
  46. package/dist/cjs/themes-new.native.js.map +1 -0
  47. package/dist/cjs/themes-old.cjs +284 -0
  48. package/dist/cjs/themes-old.native.js +303 -0
  49. package/dist/cjs/themes-old.native.js.map +1 -0
  50. package/dist/cjs/themes.cjs +26 -0
  51. package/dist/cjs/themes.native.js +29 -0
  52. package/dist/cjs/themes.native.js.map +1 -0
  53. package/dist/cjs/tokens.cjs +155 -0
  54. package/dist/cjs/tokens.native.js +167 -0
  55. package/dist/cjs/tokens.native.js.map +1 -0
  56. package/dist/cjs/utils.cjs +40 -0
  57. package/dist/cjs/utils.native.js +46 -0
  58. package/dist/cjs/utils.native.js.map +1 -0
  59. package/dist/cjs/v3-themes.cjs +472 -0
  60. package/dist/cjs/v3-themes.native.js +487 -0
  61. package/dist/cjs/v3-themes.native.js.map +1 -0
  62. package/dist/cjs/v3-tokens.cjs +99 -0
  63. package/dist/cjs/v3-tokens.native.js +108 -0
  64. package/dist/cjs/v3-tokens.native.js.map +1 -0
  65. package/dist/cjs/v3.cjs +52 -0
  66. package/dist/cjs/v3.native.js +55 -0
  67. package/dist/cjs/v3.native.js.map +1 -0
  68. package/dist/cjs/v4-default.cjs +167 -0
  69. package/dist/cjs/v4-default.native.js +170 -0
  70. package/dist/cjs/v4-default.native.js.map +1 -0
  71. package/dist/cjs/v4-gui.cjs +235 -0
  72. package/dist/cjs/v4-gui.native.js +243 -0
  73. package/dist/cjs/v4-gui.native.js.map +1 -0
  74. package/dist/cjs/v4-tokens.cjs +99 -0
  75. package/dist/cjs/v4-tokens.native.js +108 -0
  76. package/dist/cjs/v4-tokens.native.js.map +1 -0
  77. package/dist/cjs/v4.cjs +32 -0
  78. package/dist/cjs/v4.native.js +35 -0
  79. package/dist/cjs/v4.native.js.map +1 -0
  80. package/dist/cjs/v5-subtle.cjs +34 -0
  81. package/dist/cjs/v5-subtle.native.js +37 -0
  82. package/dist/cjs/v5-subtle.native.js.map +1 -0
  83. package/dist/cjs/v5-templates.cjs +110 -0
  84. package/dist/cjs/v5-templates.native.js +126 -0
  85. package/dist/cjs/v5-templates.native.js.map +1 -0
  86. package/dist/cjs/v5-themes-subtle.cjs +37 -0
  87. package/dist/cjs/v5-themes-subtle.native.js +40 -0
  88. package/dist/cjs/v5-themes-subtle.native.js.map +1 -0
  89. package/dist/cjs/v5-themes.cjs +400 -0
  90. package/dist/cjs/v5-themes.native.js +445 -0
  91. package/dist/cjs/v5-themes.native.js.map +1 -0
  92. package/dist/cjs/v5-tokens.cjs +99 -0
  93. package/dist/cjs/v5-tokens.native.js +108 -0
  94. package/dist/cjs/v5-tokens.native.js.map +1 -0
  95. package/dist/cjs/v5.cjs +34 -0
  96. package/dist/cjs/v5.native.js +37 -0
  97. package/dist/cjs/v5.native.js.map +1 -0
  98. package/dist/esm/componentThemeDefinitions.mjs +100 -0
  99. package/dist/esm/componentThemeDefinitions.mjs.map +1 -0
  100. package/dist/esm/componentThemeDefinitions.native.js +100 -0
  101. package/dist/esm/componentThemeDefinitions.native.js.map +1 -0
  102. package/dist/esm/generated-new.mjs +1997 -0
  103. package/dist/esm/generated-new.mjs.map +1 -0
  104. package/dist/esm/generated-new.native.js +2013 -0
  105. package/dist/esm/generated-new.native.js.map +1 -0
  106. package/dist/esm/generated-v3.mjs +1075 -0
  107. package/dist/esm/generated-v3.mjs.map +1 -0
  108. package/dist/esm/generated-v3.native.js +1091 -0
  109. package/dist/esm/generated-v3.native.js.map +1 -0
  110. package/dist/esm/generated-v4-gui.mjs +909 -0
  111. package/dist/esm/generated-v4-gui.mjs.map +1 -0
  112. package/dist/esm/generated-v4-gui.native.js +925 -0
  113. package/dist/esm/generated-v4-gui.native.js.map +1 -0
  114. package/dist/esm/generated-v4.mjs +367 -0
  115. package/dist/esm/generated-v4.mjs.map +1 -0
  116. package/dist/esm/generated-v4.native.js +383 -0
  117. package/dist/esm/generated-v4.native.js.map +1 -0
  118. package/dist/esm/generated-v5-subtle.mjs +525 -0
  119. package/dist/esm/generated-v5-subtle.mjs.map +1 -0
  120. package/dist/esm/generated-v5-subtle.native.js +541 -0
  121. package/dist/esm/generated-v5-subtle.native.js.map +1 -0
  122. package/dist/esm/generated-v5.mjs +525 -0
  123. package/dist/esm/generated-v5.mjs.map +1 -0
  124. package/dist/esm/generated-v5.native.js +541 -0
  125. package/dist/esm/generated-v5.native.js.map +1 -0
  126. package/dist/esm/helpers.mjs +9 -0
  127. package/dist/esm/helpers.mjs.map +1 -0
  128. package/dist/esm/helpers.native.js +11 -0
  129. package/dist/esm/helpers.native.js.map +1 -0
  130. package/dist/esm/index.js +9 -0
  131. package/dist/esm/index.js.map +1 -0
  132. package/dist/esm/index.mjs +9 -0
  133. package/dist/esm/index.mjs.map +1 -0
  134. package/dist/esm/index.native.js +9 -0
  135. package/dist/esm/index.native.js.map +1 -0
  136. package/dist/esm/opacify.mjs +72 -0
  137. package/dist/esm/opacify.mjs.map +1 -0
  138. package/dist/esm/opacify.native.js +79 -0
  139. package/dist/esm/opacify.native.js.map +1 -0
  140. package/dist/esm/palettes.mjs +29 -0
  141. package/dist/esm/palettes.mjs.map +1 -0
  142. package/dist/esm/palettes.native.js +37 -0
  143. package/dist/esm/palettes.native.js.map +1 -0
  144. package/dist/esm/shadows.mjs +20 -0
  145. package/dist/esm/shadows.mjs.map +1 -0
  146. package/dist/esm/shadows.native.js +20 -0
  147. package/dist/esm/shadows.native.js.map +1 -0
  148. package/dist/esm/subtleChildrenThemes.mjs +41 -0
  149. package/dist/esm/subtleChildrenThemes.mjs.map +1 -0
  150. package/dist/esm/subtleChildrenThemes.native.js +47 -0
  151. package/dist/esm/subtleChildrenThemes.native.js.map +1 -0
  152. package/dist/esm/templates.mjs +94 -0
  153. package/dist/esm/templates.mjs.map +1 -0
  154. package/dist/esm/templates.native.js +94 -0
  155. package/dist/esm/templates.native.js.map +1 -0
  156. package/dist/esm/themes-new.mjs +63 -0
  157. package/dist/esm/themes-new.mjs.map +1 -0
  158. package/dist/esm/themes-new.native.js +62 -0
  159. package/dist/esm/themes-new.native.js.map +1 -0
  160. package/dist/esm/themes-old.mjs +261 -0
  161. package/dist/esm/themes-old.mjs.map +1 -0
  162. package/dist/esm/themes-old.native.js +277 -0
  163. package/dist/esm/themes-old.native.js.map +1 -0
  164. package/dist/esm/themes.mjs +3 -0
  165. package/dist/esm/themes.mjs.map +1 -0
  166. package/dist/esm/themes.native.js +3 -0
  167. package/dist/esm/themes.native.js.map +1 -0
  168. package/dist/esm/tokens.mjs +124 -0
  169. package/dist/esm/tokens.mjs.map +1 -0
  170. package/dist/esm/tokens.native.js +133 -0
  171. package/dist/esm/tokens.native.js.map +1 -0
  172. package/dist/esm/utils.mjs +14 -0
  173. package/dist/esm/utils.mjs.map +1 -0
  174. package/dist/esm/utils.native.js +17 -0
  175. package/dist/esm/utils.native.js.map +1 -0
  176. package/dist/esm/v3-themes.mjs +444 -0
  177. package/dist/esm/v3-themes.mjs.map +1 -0
  178. package/dist/esm/v3-themes.native.js +456 -0
  179. package/dist/esm/v3-themes.native.js.map +1 -0
  180. package/dist/esm/v3-tokens.mjs +70 -0
  181. package/dist/esm/v3-tokens.mjs.map +1 -0
  182. package/dist/esm/v3-tokens.native.js +76 -0
  183. package/dist/esm/v3-tokens.native.js.map +1 -0
  184. package/dist/esm/v3.mjs +12 -0
  185. package/dist/esm/v3.mjs.map +1 -0
  186. package/dist/esm/v3.native.js +12 -0
  187. package/dist/esm/v3.native.js.map +1 -0
  188. package/dist/esm/v4-default.mjs +133 -0
  189. package/dist/esm/v4-default.mjs.map +1 -0
  190. package/dist/esm/v4-default.native.js +133 -0
  191. package/dist/esm/v4-default.native.js.map +1 -0
  192. package/dist/esm/v4-gui.mjs +201 -0
  193. package/dist/esm/v4-gui.mjs.map +1 -0
  194. package/dist/esm/v4-gui.native.js +206 -0
  195. package/dist/esm/v4-gui.native.js.map +1 -0
  196. package/dist/esm/v4-tokens.mjs +70 -0
  197. package/dist/esm/v4-tokens.mjs.map +1 -0
  198. package/dist/esm/v4-tokens.native.js +76 -0
  199. package/dist/esm/v4-tokens.native.js.map +1 -0
  200. package/dist/esm/v4.mjs +6 -0
  201. package/dist/esm/v4.mjs.map +1 -0
  202. package/dist/esm/v4.native.js +6 -0
  203. package/dist/esm/v4.native.js.map +1 -0
  204. package/dist/esm/v5-subtle.mjs +7 -0
  205. package/dist/esm/v5-subtle.mjs.map +1 -0
  206. package/dist/esm/v5-subtle.native.js +7 -0
  207. package/dist/esm/v5-subtle.native.js.map +1 -0
  208. package/dist/esm/v5-templates.mjs +87 -0
  209. package/dist/esm/v5-templates.mjs.map +1 -0
  210. package/dist/esm/v5-templates.native.js +100 -0
  211. package/dist/esm/v5-templates.native.js.map +1 -0
  212. package/dist/esm/v5-themes-subtle.mjs +13 -0
  213. package/dist/esm/v5-themes-subtle.mjs.map +1 -0
  214. package/dist/esm/v5-themes-subtle.native.js +13 -0
  215. package/dist/esm/v5-themes-subtle.native.js.map +1 -0
  216. package/dist/esm/v5-themes.mjs +361 -0
  217. package/dist/esm/v5-themes.mjs.map +1 -0
  218. package/dist/esm/v5-themes.native.js +403 -0
  219. package/dist/esm/v5-themes.native.js.map +1 -0
  220. package/dist/esm/v5-tokens.mjs +70 -0
  221. package/dist/esm/v5-tokens.mjs.map +1 -0
  222. package/dist/esm/v5-tokens.native.js +76 -0
  223. package/dist/esm/v5-tokens.native.js.map +1 -0
  224. package/dist/esm/v5.mjs +7 -0
  225. package/dist/esm/v5.mjs.map +1 -0
  226. package/dist/esm/v5.native.js +7 -0
  227. package/dist/esm/v5.native.js.map +1 -0
  228. package/package.json +95 -0
  229. package/src/componentThemeDefinitions.tsx +129 -0
  230. package/src/generated-new.ts +2571 -0
  231. package/src/generated-v3.ts +1826 -0
  232. package/src/generated-v4-gui.ts +2200 -0
  233. package/src/generated-v4.ts +1004 -0
  234. package/src/generated-v5-subtle.ts +2170 -0
  235. package/src/generated-v5.ts +2188 -0
  236. package/src/helpers.ts +44 -0
  237. package/src/index.tsx +8 -0
  238. package/src/opacify.ts +125 -0
  239. package/src/palettes.tsx +91 -0
  240. package/src/shadows.tsx +19 -0
  241. package/src/subtleChildrenThemes.ts +54 -0
  242. package/src/templates.tsx +104 -0
  243. package/src/themes-new.ts +74 -0
  244. package/src/themes-old.tsx +378 -0
  245. package/src/themes.tsx +1 -0
  246. package/src/tokens.tsx +199 -0
  247. package/src/utils.ts +51 -0
  248. package/src/v3-themes.ts +650 -0
  249. package/src/v3-tokens.ts +103 -0
  250. package/src/v3.tsx +12 -0
  251. package/src/v4-default.ts +191 -0
  252. package/src/v4-gui.ts +287 -0
  253. package/src/v4-tokens.ts +105 -0
  254. package/src/v4.tsx +4 -0
  255. package/src/v5-subtle.tsx +11 -0
  256. package/src/v5-templates.ts +126 -0
  257. package/src/v5-themes-subtle.ts +18 -0
  258. package/src/v5-themes.ts +626 -0
  259. package/src/v5-tokens.ts +107 -0
  260. package/src/v5.tsx +11 -0
  261. package/tests/v5-themes.test.ts +215 -0
  262. package/tsconfig.json +43 -0
  263. package/types/componentThemeDefinitions.d.ts +771 -0
  264. package/types/generated-new.d.ts +135 -0
  265. package/types/generated-v3.d.ts +144 -0
  266. package/types/generated-v4-gui.d.ts +190 -0
  267. package/types/generated-v4.d.ts +137 -0
  268. package/types/generated-v5-subtle.d.ts +244 -0
  269. package/types/generated-v5.d.ts +244 -0
  270. package/types/helpers.d.ts +24 -0
  271. package/types/index.d.ts +9 -0
  272. package/types/opacify.d.ts +9 -0
  273. package/types/palettes.d.ts +21 -0
  274. package/types/shadows.d.ts +15 -0
  275. package/types/subtleChildrenThemes.d.ts +305 -0
  276. package/types/templates.d.ts +155 -0
  277. package/types/themes-new.d.ts +42243 -0
  278. package/types/themes-old.d.ts +51411 -0
  279. package/types/themes.d.ts +2 -0
  280. package/types/tokens.d.ts +1308 -0
  281. package/types/utils.d.ts +21 -0
  282. package/types/v3-themes.d.ts +16304 -0
  283. package/types/v3-tokens.d.ts +184 -0
  284. package/types/v3.d.ts +11 -0
  285. package/types/v4-default.d.ts +274 -0
  286. package/types/v4-gui.d.ts +195 -0
  287. package/types/v4-tokens.d.ts +184 -0
  288. package/types/v4.d.ts +5 -0
  289. package/types/v5-subtle.d.ts +8 -0
  290. package/types/v5-templates.d.ts +42 -0
  291. package/types/v5-themes-subtle.d.ts +250 -0
  292. package/types/v5-themes.d.ts +752 -0
  293. package/types/v5-tokens.d.ts +185 -0
  294. package/types/v5.d.ts +8 -0
  295. package/v3/index.cjs +2 -0
  296. package/v3/index.js +2 -0
  297. package/v3/index.native.cjs +2 -0
  298. package/v3/index.native.js +2 -0
  299. package/v3-themes/index.cjs +2 -0
  300. package/v3-themes/index.js +2 -0
  301. package/v3-themes/index.native.cjs +2 -0
  302. package/v3-themes/index.native.js +2 -0
  303. package/v3-themes.cjs +1 -0
  304. package/v3-themes.d.ts +1 -0
  305. package/v3.cjs +1 -0
  306. package/v3.d.ts +1 -0
  307. package/v4/index.cjs +2 -0
  308. package/v4/index.js +2 -0
  309. package/v4/index.native.cjs +2 -0
  310. package/v4/index.native.js +2 -0
  311. package/v4.cjs +1 -0
  312. package/v4.d.ts +1 -0
  313. package/v5/index.cjs +2 -0
  314. package/v5/index.js +2 -0
  315. package/v5/index.native.cjs +2 -0
  316. package/v5/index.native.js +2 -0
  317. package/v5-subtle/index.cjs +2 -0
  318. package/v5-subtle/index.js +2 -0
  319. package/v5-subtle/index.native.cjs +2 -0
  320. package/v5-subtle/index.native.js +2 -0
  321. package/v5-subtle.cjs +1 -0
  322. package/v5-subtle.d.ts +1 -0
  323. package/v5.cjs +1 -0
  324. package/v5.d.ts +1 -0
@@ -0,0 +1,107 @@
1
+ import { sizeToSpace } from './utils'
2
+
3
+ // the same as v3 for now, but duplicated to avoid accidental changes to both
4
+
5
+ // --- tokens ---
6
+
7
+ // should roughly map to button/input etc height at each level
8
+ // fonts should match that height/lineHeight at each stop
9
+ // so these are really non-linear on purpose
10
+ // why?
11
+ // - at sizes <1, used for fine grained things (borders, smallest paddingY)
12
+ // - so smallest padY should be roughly 1-4px so it can join with lineHeight
13
+ // - at sizes >=1, have to consider "pressability" (jumps up)
14
+ // - after that it should go upwards somewhat naturally
15
+ // - H1 / headings top out at 10 naturally, so after 10 we can go upwards faster
16
+ // but also one more wrinkle...
17
+ // space is used in conjunction with size
18
+ // i'm setting space to generally just a fixed fraction of size (~1/3-2/3 still fine tuning)
19
+ export const size = {
20
+ $0: 0,
21
+ '$0.25': 2,
22
+ '$0.5': 4,
23
+ '$0.75': 8,
24
+ $1: 20,
25
+ '$1.5': 24,
26
+ $2: 28,
27
+ '$2.5': 32,
28
+ $3: 36,
29
+ '$3.5': 40,
30
+ $4: 44,
31
+ $true: 44,
32
+ '$4.5': 48,
33
+ $5: 52,
34
+ $6: 64,
35
+ $7: 74,
36
+ $8: 84,
37
+ $9: 94,
38
+ $10: 104,
39
+ $11: 124,
40
+ $12: 144,
41
+ $13: 164,
42
+ $14: 184,
43
+ $15: 204,
44
+ $16: 224,
45
+ $17: 224,
46
+ $18: 244,
47
+ $19: 264,
48
+ $20: 284,
49
+ }
50
+
51
+ type SizeKeysIn = keyof typeof size
52
+ type Sizes = {
53
+ [Key in SizeKeysIn extends `$${infer Key}` ? Key : SizeKeysIn]: number
54
+ }
55
+ type SizeKeys = `${keyof Sizes extends `${infer K}` ? K : never}`
56
+
57
+ export const spaces = Object.entries(size).map(([k, v]) => {
58
+ return [k, sizeToSpace(v)] as const
59
+ })
60
+
61
+ export const spacesNegative = spaces.slice(1).map(([k, v]) => [`-${k.slice(1)}`, -v])
62
+
63
+ type SizeKeysWithNegatives =
64
+ | Exclude<`-${SizeKeys extends `$${infer Key}` ? Key : SizeKeys}`, '-0'>
65
+ | SizeKeys
66
+
67
+ export const space: {
68
+ [Key in SizeKeysWithNegatives]: Key extends keyof Sizes ? Sizes[Key] : number
69
+ } = {
70
+ ...Object.fromEntries(spaces),
71
+ ...Object.fromEntries(spacesNegative),
72
+ } as any
73
+
74
+ export const zIndex = {
75
+ 0: 0,
76
+ 1: 100,
77
+ 2: 200,
78
+ 3: 300,
79
+ 4: 400,
80
+ 5: 500,
81
+ }
82
+
83
+ export const radius = {
84
+ 0: 0,
85
+ 1: 3,
86
+ 2: 5,
87
+ 3: 7,
88
+ 4: 9,
89
+ true: 9,
90
+ 5: 10,
91
+ 6: 16,
92
+ 7: 19,
93
+ 8: 22,
94
+ 9: 26,
95
+ 10: 34,
96
+ 11: 42,
97
+ 12: 50,
98
+ }
99
+
100
+ export const tokens = {
101
+ radius,
102
+ zIndex,
103
+ space,
104
+ size,
105
+ } as const
106
+
107
+ export type V5Tokens = typeof tokens
package/src/v5.tsx ADDED
@@ -0,0 +1,11 @@
1
+ export { createThemes } from '@hanzogui/theme-builder'
2
+ export { themes } from './generated-v5'
3
+ export type {
4
+ Theme as V5Theme,
5
+ ThemeNames as V5ThemeNames,
6
+ Themes as V5Themes,
7
+ } from './generated-v5'
8
+ export { v5Templates } from './v5-templates'
9
+ export * from './v5-themes'
10
+ export { tokens } from './v5-tokens'
11
+ export type { V5Tokens } from './v5-tokens'
@@ -0,0 +1,215 @@
1
+ import { describe, expect, test, assertType } from 'vitest'
2
+ import {
3
+ createV5Theme,
4
+ themes as defaultThemes,
5
+ defaultChildrenThemes,
6
+ } from '../src/v5-themes'
7
+ import { opacify, interpolateColor } from '../src/opacify'
8
+
9
+ describe('opacify', () => {
10
+ test('converts hex to hex with alpha', () => {
11
+ expect(opacify('#ff0000', 0.5)).toBe('#ff000080')
12
+ expect(opacify('#fff', 0.25)).toBe('#ffffff40') // shorthand
13
+ })
14
+
15
+ test('converts hsl to hsla', () => {
16
+ expect(opacify('hsl(0, 100%, 50%)', 0.5)).toBe('hsla(0, 100%, 50%, 0.5)')
17
+ })
18
+
19
+ test('returns unsupported formats unchanged', () => {
20
+ expect(opacify('rgb(255, 0, 0)', 0.5)).toBe('rgb(255, 0, 0)')
21
+ expect(opacify('invalid', 0.5)).toBe('invalid')
22
+ })
23
+ })
24
+
25
+ describe('interpolateColor', () => {
26
+ test('interpolates between colors', () => {
27
+ expect(interpolateColor('#000000', '#ffffff', 0)).toBe('rgb(0, 0, 0)')
28
+ expect(interpolateColor('#000000', '#ffffff', 1)).toBe('rgb(255, 255, 255)')
29
+ expect(interpolateColor('#000000', '#ffffff', 0.5)).toBe('rgb(128, 128, 128)')
30
+ })
31
+
32
+ test('handles different color formats', () => {
33
+ expect(interpolateColor('rgb(0, 0, 0)', 'rgb(255, 255, 255)', 0.5)).toBe(
34
+ 'rgb(128, 128, 128)'
35
+ )
36
+ expect(interpolateColor('hsl(0, 100%, 50%)', 'hsl(0, 100%, 100%)', 0.5)).toMatch(
37
+ /^rgb/
38
+ )
39
+ })
40
+
41
+ test('returns first color on invalid input', () => {
42
+ expect(interpolateColor('#ff0000', 'invalid', 0.5)).toBe('#ff0000')
43
+ })
44
+ })
45
+
46
+ describe('v5 themes', () => {
47
+ test('generates expected theme structure', () => {
48
+ const keys = Object.keys(defaultThemes)
49
+
50
+ // Base + accent
51
+ expect(keys).toContain('light')
52
+ expect(keys).toContain('dark')
53
+ expect(keys).toContain('light_accent')
54
+
55
+ // Children themes
56
+ expect(keys).toContain('light_blue')
57
+ expect(keys).toContain('dark_red')
58
+ })
59
+
60
+ test('light and dark themes have different values', () => {
61
+ expect(defaultThemes.light.background).not.toBe(defaultThemes.dark.background)
62
+ expect(defaultThemes.light.color).not.toBe(defaultThemes.dark.color)
63
+ })
64
+
65
+ test('accent themes are inverted', () => {
66
+ expect(defaultThemes.light.background).not.toBe(defaultThemes.light_accent.background)
67
+ expect(defaultThemes.dark.background).not.toBe(defaultThemes.dark_accent.background)
68
+ })
69
+
70
+ test('getTheme computes opacity and interpolation colors', () => {
71
+ // Opacity variants
72
+ expect(defaultThemes.light.color01).toBeDefined()
73
+ expect(defaultThemes.light.background01).toBeDefined()
74
+ expect(defaultThemes.light.background08).toBeDefined()
75
+ expect(defaultThemes.light.outlineColor).toBeDefined()
76
+
77
+ // Works on all theme types
78
+ expect(defaultThemes.light_blue.color01).toBeDefined()
79
+ })
80
+
81
+ test('children colors spread to base theme extras', () => {
82
+ expect(defaultThemes.light.blue1).toBe(defaultChildrenThemes.blue.light.blue1)
83
+ expect(defaultThemes.light.blue12).toBe(defaultChildrenThemes.blue.light.blue12)
84
+ expect(defaultThemes.dark.blue1).toBe(defaultChildrenThemes.blue.dark.blue1)
85
+ })
86
+
87
+ test('includes shadow and whiteBlack colors', () => {
88
+ expect(defaultThemes.light.shadow1).toBeDefined()
89
+ expect(defaultThemes.light.shadow6).toBeDefined()
90
+ expect(defaultThemes.light.white).toBe('rgba(255,255,255,1)')
91
+ expect(defaultThemes.light.black).toBe('rgba(0,0,0,1)')
92
+ })
93
+
94
+ test('has color1-12 and accent1-12 tokens', () => {
95
+ expect(defaultThemes.light.color1).toBeDefined()
96
+ expect(defaultThemes.light.color12).toBeDefined()
97
+ expect(defaultThemes.light.accent1).toBeDefined()
98
+ expect(defaultThemes.light.accent12).toBeDefined()
99
+ })
100
+ })
101
+
102
+ describe('createV5Theme options', () => {
103
+ test('custom palettes affect black/white colors', () => {
104
+ const themes = createV5Theme({
105
+ darkPalette: [
106
+ '#111',
107
+ '#222',
108
+ '#333',
109
+ '#444',
110
+ '#555',
111
+ '#666',
112
+ '#777',
113
+ '#888',
114
+ '#999',
115
+ '#aaa',
116
+ '#bbb',
117
+ '#ccc',
118
+ ],
119
+ })
120
+ expect(themes.light.black1).toBe('#111')
121
+ expect(themes.light.black12).toBe('#ccc')
122
+ })
123
+
124
+ test('componentThemes: false removes component themes', () => {
125
+ const themes = createV5Theme({ componentThemes: false })
126
+ const keys = Object.keys(themes)
127
+ expect(keys.filter((k) => k.includes('Button'))).toHaveLength(0)
128
+ })
129
+
130
+ test('empty childrenThemes produces minimal themes', () => {
131
+ const themes = createV5Theme({ childrenThemes: {} })
132
+ const keys = Object.keys(themes)
133
+ expect(keys).toContain('light')
134
+ expect(keys).toContain('light_black') // internal
135
+ expect(keys).not.toContain('light_blue')
136
+ })
137
+
138
+ test('custom childrenThemes adds color themes', () => {
139
+ const themes = createV5Theme({
140
+ childrenThemes: {
141
+ brand: {
142
+ light: { brand1: '#e0f7fa', brand12: '#00251a' },
143
+ dark: { brand1: '#00251a', brand12: '#e0f7fa' },
144
+ },
145
+ },
146
+ })
147
+ expect(themes.light.brand1).toBe('#e0f7fa')
148
+ expect(themes.dark.brand1).toBe('#00251a')
149
+ })
150
+
151
+ test('grandChildrenThemes override defaults', () => {
152
+ const themes = createV5Theme({
153
+ grandChildrenThemes: { custom: { template: 'surface1' } },
154
+ })
155
+ const keys = Object.keys(themes)
156
+ expect(keys).toContain('light_blue_custom')
157
+ expect(keys).not.toContain('light_blue_accent')
158
+ })
159
+
160
+ test('custom getTheme merges on top of built-in computed values', () => {
161
+ const themes = createV5Theme({
162
+ getTheme: ({ palette }) => ({
163
+ myOverlay: opacify(palette![7]!, 0.5),
164
+ outlineColor: '#123456',
165
+ }),
166
+ })
167
+
168
+ expect(themes.light.color01).toBeDefined()
169
+ expect(themes.light.myOverlay).toBeDefined()
170
+ expect(themes.light.outlineColor).toBe('#123456')
171
+ })
172
+ })
173
+
174
+ describe('defaultChildrenThemes', () => {
175
+ test('has expected structure', () => {
176
+ expect(Object.keys(defaultChildrenThemes.blue.light)).toHaveLength(12)
177
+ expect(defaultChildrenThemes.neutral.light).toEqual(
178
+ defaultChildrenThemes.neutral.dark
179
+ )
180
+ })
181
+ })
182
+
183
+ describe('type safety', () => {
184
+ test('theme values are string | number', () => {
185
+ assertType<string | number>(defaultThemes.light.background)
186
+ assertType<string | number>(defaultThemes.light.color01)
187
+ assertType<string | number>(defaultThemes.light.blue1)
188
+ })
189
+
190
+ test('custom themes infer types correctly', () => {
191
+ const themes = createV5Theme({
192
+ childrenThemes: {
193
+ brand: {
194
+ light: { brand1: '#fff', brand12: '#000' },
195
+ dark: { brand1: '#000', brand12: '#fff' },
196
+ },
197
+ },
198
+ })
199
+ // brand colors should be typed
200
+ assertType<string | number>(themes.light.brand1)
201
+ })
202
+
203
+ test('custom getTheme values infer types correctly', () => {
204
+ const themes = createV5Theme({
205
+ getTheme: ({ palette }) => ({
206
+ myOverlay: opacify(palette![7]!, 0.5),
207
+ }),
208
+ })
209
+
210
+ assertType<string | number>(themes.light.myOverlay)
211
+ assertType<string | number>(themes.dark.outlineColor)
212
+ // @ts-expect-error
213
+ themes.light.nonValidCustomKey
214
+ })
215
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "extends": "../../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "composite": true
5
+ },
6
+ "exclude": [
7
+ "types",
8
+ "tests",
9
+ "v2.d.ts",
10
+ "v2.js",
11
+ "v2-themes.cjs",
12
+ "v2-themes.d.ts",
13
+ "v3.d.ts",
14
+ "v3.cjs",
15
+ "v3-themes.cjs",
16
+ "v3-themes.d.ts",
17
+ "v4.d.ts",
18
+ "v4.cjs",
19
+ "v5.d.ts",
20
+ "v5.cjs",
21
+ "v5-subtle.d.ts",
22
+ "v5-subtle.cjs",
23
+ "dist",
24
+ "**/__tests__"
25
+ ],
26
+ "references": [
27
+ {
28
+ "path": "../cli"
29
+ },
30
+ {
31
+ "path": "../colors"
32
+ },
33
+ {
34
+ "path": "../create-theme"
35
+ },
36
+ {
37
+ "path": "../theme-builder"
38
+ },
39
+ {
40
+ "path": "../web"
41
+ }
42
+ ]
43
+ }