@jakubmazanec/ui 0.1.0-unstable.0c19abe

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 (357) hide show
  1. package/README.md +40 -0
  2. package/build/components/Button.d.ts +24 -0
  3. package/build/components/Button.js +51 -0
  4. package/build/components/Button.js.map +7 -0
  5. package/build/components/Card.d.ts +5 -0
  6. package/build/components/Card.js +7 -0
  7. package/build/components/Card.js.map +7 -0
  8. package/build/components/Checkbox.d.ts +24 -0
  9. package/build/components/Checkbox.js +63 -0
  10. package/build/components/Checkbox.js.map +7 -0
  11. package/build/components/CheckboxField.d.ts +11 -0
  12. package/build/components/CheckboxField.js +14 -0
  13. package/build/components/CheckboxField.js.map +7 -0
  14. package/build/components/Combobox.d.ts +33 -0
  15. package/build/components/Combobox.js +121 -0
  16. package/build/components/Combobox.js.map +7 -0
  17. package/build/components/ConfirmDialog.d.ts +23 -0
  18. package/build/components/ConfirmDialog.js +40 -0
  19. package/build/components/ConfirmDialog.js.map +7 -0
  20. package/build/components/Dialog.d.ts +18 -0
  21. package/build/components/Dialog.js +21 -0
  22. package/build/components/Dialog.js.map +7 -0
  23. package/build/components/DialogPanel.d.ts +10 -0
  24. package/build/components/DialogPanel.js +10 -0
  25. package/build/components/DialogPanel.js.map +7 -0
  26. package/build/components/DialogTitle.d.ts +10 -0
  27. package/build/components/DialogTitle.js +10 -0
  28. package/build/components/DialogTitle.js.map +7 -0
  29. package/build/components/Error.d.ts +10 -0
  30. package/build/components/Error.js +14 -0
  31. package/build/components/Error.js.map +7 -0
  32. package/build/components/Field.d.ts +11 -0
  33. package/build/components/Field.js +14 -0
  34. package/build/components/Field.js.map +7 -0
  35. package/build/components/Form.d.ts +13 -0
  36. package/build/components/Form.js +11 -0
  37. package/build/components/Form.js.map +7 -0
  38. package/build/components/Input.d.ts +42 -0
  39. package/build/components/Input.js +129 -0
  40. package/build/components/Input.js.map +7 -0
  41. package/build/components/Label.d.ts +10 -0
  42. package/build/components/Label.js +10 -0
  43. package/build/components/Label.js.map +7 -0
  44. package/build/components/Listbox.d.ts +32 -0
  45. package/build/components/Listbox.js +75 -0
  46. package/build/components/Listbox.js.map +7 -0
  47. package/build/components/Menu.d.ts +10 -0
  48. package/build/components/Menu.js +10 -0
  49. package/build/components/Menu.js.map +7 -0
  50. package/build/components/MenuButton.d.ts +10 -0
  51. package/build/components/MenuButton.js +10 -0
  52. package/build/components/MenuButton.js.map +7 -0
  53. package/build/components/MenuItem.d.ts +10 -0
  54. package/build/components/MenuItem.js +10 -0
  55. package/build/components/MenuItem.js.map +7 -0
  56. package/build/components/MenuItems.d.ts +10 -0
  57. package/build/components/MenuItems.js +10 -0
  58. package/build/components/MenuItems.js.map +7 -0
  59. package/build/components/Popover.d.ts +10 -0
  60. package/build/components/Popover.js +10 -0
  61. package/build/components/Popover.js.map +7 -0
  62. package/build/components/PopoverButton.d.ts +13 -0
  63. package/build/components/PopoverButton.js +28 -0
  64. package/build/components/PopoverButton.js.map +7 -0
  65. package/build/components/PopoverPanel.d.ts +16 -0
  66. package/build/components/PopoverPanel.js +24 -0
  67. package/build/components/PopoverPanel.js.map +7 -0
  68. package/build/components/Radio.d.ts +24 -0
  69. package/build/components/Radio.js +39 -0
  70. package/build/components/Radio.js.map +7 -0
  71. package/build/components/RadioField.d.ts +10 -0
  72. package/build/components/RadioField.js +14 -0
  73. package/build/components/RadioField.js.map +7 -0
  74. package/build/components/RadioGroupField.d.ts +20 -0
  75. package/build/components/RadioGroupField.js +82 -0
  76. package/build/components/RadioGroupField.js.map +7 -0
  77. package/build/components/Spinner.d.ts +7 -0
  78. package/build/components/Spinner.js +52 -0
  79. package/build/components/Spinner.js.map +7 -0
  80. package/build/components/Table.d.ts +16 -0
  81. package/build/components/Table.js +20 -0
  82. package/build/components/Table.js.map +7 -0
  83. package/build/components/TableCell.d.ts +10 -0
  84. package/build/components/TableCell.js +9 -0
  85. package/build/components/TableCell.js.map +7 -0
  86. package/build/components/TableHeader.d.ts +10 -0
  87. package/build/components/TableHeader.js +8 -0
  88. package/build/components/TableHeader.js.map +7 -0
  89. package/build/components/TableHeaderCell.d.ts +10 -0
  90. package/build/components/TableHeaderCell.js +9 -0
  91. package/build/components/TableHeaderCell.js.map +7 -0
  92. package/build/components/TableRow.d.ts +10 -0
  93. package/build/components/TableRow.js +9 -0
  94. package/build/components/TableRow.js.map +7 -0
  95. package/build/components/Textarea.d.ts +39 -0
  96. package/build/components/Textarea.js +104 -0
  97. package/build/components/Textarea.js.map +7 -0
  98. package/build/components/internals/fieldNameContext.d.ts +2 -0
  99. package/build/components/internals/fieldNameContext.js +4 -0
  100. package/build/components/internals/fieldNameContext.js.map +7 -0
  101. package/build/components/internals/formContext.d.ts +3 -0
  102. package/build/components/internals/formContext.js +4 -0
  103. package/build/components/internals/formContext.js.map +7 -0
  104. package/build/components/internals/useField.d.ts +6 -0
  105. package/build/components/internals/useField.js +18 -0
  106. package/build/components/internals/useField.js.map +7 -0
  107. package/build/components/internals/useFieldName.d.ts +1 -0
  108. package/build/components/internals/useFieldName.js +7 -0
  109. package/build/components/internals/useFieldName.js.map +7 -0
  110. package/build/components/internals/useForm.d.ts +1 -0
  111. package/build/components/internals/useForm.js +7 -0
  112. package/build/components/internals/useForm.js.map +7 -0
  113. package/build/components/internals.d.ts +5 -0
  114. package/build/components/internals.js +7 -0
  115. package/build/components/internals.js.map +7 -0
  116. package/build/components.d.ts +32 -0
  117. package/build/components.js +34 -0
  118. package/build/components.js.map +7 -0
  119. package/build/development/createTailwindConfig.d.ts +18 -0
  120. package/build/development/createTailwindConfig.js +125 -0
  121. package/build/development/createTailwindConfig.js.map +7 -0
  122. package/build/development/createTailwindMerge.d.ts +2 -0
  123. package/build/development/createTailwindMerge.js +74 -0
  124. package/build/development/createTailwindMerge.js.map +7 -0
  125. package/build/development/defaultTailwindConfig.d.ts +72 -0
  126. package/build/development/defaultTailwindConfig.js +45 -0
  127. package/build/development/defaultTailwindConfig.js.map +7 -0
  128. package/build/development/internals/PaletteConfig.d.ts +6 -0
  129. package/build/development/internals/PaletteConfig.js +2 -0
  130. package/build/development/internals/PaletteConfig.js.map +7 -0
  131. package/build/development/internals/SwatchValue.d.ts +9 -0
  132. package/build/development/internals/SwatchValue.js +2 -0
  133. package/build/development/internals/SwatchValue.js.map +7 -0
  134. package/build/development/internals/clamp.d.ts +1 -0
  135. package/build/development/internals/clamp.js +5 -0
  136. package/build/development/internals/clamp.js.map +7 -0
  137. package/build/development/internals/constants.d.ts +2 -0
  138. package/build/development/internals/constants.js +22 -0
  139. package/build/development/internals/constants.js.map +7 -0
  140. package/build/development/internals/createDisplayColor.d.ts +1 -0
  141. package/build/development/internals/createDisplayColor.js +24 -0
  142. package/build/development/internals/createDisplayColor.js.map +7 -0
  143. package/build/development/internals/createDistributionValues.d.ts +4 -0
  144. package/build/development/internals/createDistributionValues.js +32 -0
  145. package/build/development/internals/createDistributionValues.js.map +7 -0
  146. package/build/development/internals/createHueScale.d.ts +4 -0
  147. package/build/development/internals/createHueScale.js +15 -0
  148. package/build/development/internals/createHueScale.js.map +7 -0
  149. package/build/development/internals/createPalette.d.ts +16 -0
  150. package/build/development/internals/createPalette.js +36 -0
  151. package/build/development/internals/createPalette.js.map +7 -0
  152. package/build/development/internals/createSaturationScale.d.ts +4 -0
  153. package/build/development/internals/createSaturationScale.js +18 -0
  154. package/build/development/internals/createSaturationScale.js.map +7 -0
  155. package/build/development/internals/createSwatches.d.ts +10 -0
  156. package/build/development/internals/createSwatches.js +31 -0
  157. package/build/development/internals/createSwatches.js.map +7 -0
  158. package/build/development/internals/hexToHsl.d.ts +5 -0
  159. package/build/development/internals/hexToHsl.js +37 -0
  160. package/build/development/internals/hexToHsl.js.map +7 -0
  161. package/build/development/internals/hexToRgb.d.ts +5 -0
  162. package/build/development/internals/hexToRgb.js +21 -0
  163. package/build/development/internals/hexToRgb.js.map +7 -0
  164. package/build/development/internals/hslToHex.d.ts +1 -0
  165. package/build/development/internals/hslToHex.js +19 -0
  166. package/build/development/internals/hslToHex.js.map +7 -0
  167. package/build/development/internals/hslToRgb.d.ts +5 -0
  168. package/build/development/internals/hslToRgb.js +42 -0
  169. package/build/development/internals/hslToRgb.js.map +7 -0
  170. package/build/development/internals/isHex.d.ts +1 -0
  171. package/build/development/internals/isHex.js +7 -0
  172. package/build/development/internals/isHex.js.map +7 -0
  173. package/build/development/internals/resolveModule.d.ts +1 -0
  174. package/build/development/internals/resolveModule.js +9 -0
  175. package/build/development/internals/resolveModule.js.map +7 -0
  176. package/build/development/internals/round.d.ts +1 -0
  177. package/build/development/internals/round.js +6 -0
  178. package/build/development/internals/round.js.map +7 -0
  179. package/build/development/internals/unsignedModulo.d.ts +1 -0
  180. package/build/development/internals/unsignedModulo.js +5 -0
  181. package/build/development/internals/unsignedModulo.js.map +7 -0
  182. package/build/development/internals.d.ts +1 -0
  183. package/build/development/internals.js +3 -0
  184. package/build/development/internals.js.map +7 -0
  185. package/build/development.d.ts +3 -0
  186. package/build/development.js +5 -0
  187. package/build/development.js.map +7 -0
  188. package/build/fonts.css +15 -0
  189. package/build/fonts.css.map +7 -0
  190. package/build/inter-variable-75YQYCJN.woff2 +0 -0
  191. package/build/inter-variable-italic-54HMV74W.woff2 +0 -0
  192. package/build/inter-variable-italic.js +2 -0
  193. package/build/inter-variable-italic.js.map +7 -0
  194. package/build/inter-variable.js +2 -0
  195. package/build/inter-variable.js.map +7 -0
  196. package/build/main.d.ts +5 -0
  197. package/build/main.js +7 -0
  198. package/build/main.js.map +7 -0
  199. package/build/theme/Theme.d.ts +40 -0
  200. package/build/theme/Theme.js +2 -0
  201. package/build/theme/Theme.js.map +7 -0
  202. package/build/theme/ThemeProvider.d.ts +6 -0
  203. package/build/theme/ThemeProvider.js +7 -0
  204. package/build/theme/ThemeProvider.js.map +7 -0
  205. package/build/theme/defaultTheme.d.ts +2 -0
  206. package/build/theme/defaultTheme.js +331 -0
  207. package/build/theme/defaultTheme.js.map +7 -0
  208. package/build/theme/internals/ClassName.d.ts +1 -0
  209. package/build/theme/internals/ClassName.js +2 -0
  210. package/build/theme/internals/ClassName.js.map +7 -0
  211. package/build/theme/internals/ComponentProps.d.ts +7 -0
  212. package/build/theme/internals/ComponentProps.js +2 -0
  213. package/build/theme/internals/ComponentProps.js.map +7 -0
  214. package/build/theme/internals/ComponentTheme.d.ts +25 -0
  215. package/build/theme/internals/ComponentTheme.js +2 -0
  216. package/build/theme/internals/ComponentTheme.js.map +7 -0
  217. package/build/theme/internals/ComponentThemeCompoundVariants.d.ts +12 -0
  218. package/build/theme/internals/ComponentThemeCompoundVariants.js +2 -0
  219. package/build/theme/internals/ComponentThemeCompoundVariants.js.map +7 -0
  220. package/build/theme/internals/ComponentThemeDefinition.d.ts +6 -0
  221. package/build/theme/internals/ComponentThemeDefinition.js +2 -0
  222. package/build/theme/internals/ComponentThemeDefinition.js.map +7 -0
  223. package/build/theme/internals/ComponentThemeDefinitionElements.d.ts +1 -0
  224. package/build/theme/internals/ComponentThemeDefinitionElements.js +2 -0
  225. package/build/theme/internals/ComponentThemeDefinitionElements.js.map +7 -0
  226. package/build/theme/internals/ComponentThemeDefinitionVariants.d.ts +3 -0
  227. package/build/theme/internals/ComponentThemeDefinitionVariants.js +2 -0
  228. package/build/theme/internals/ComponentThemeDefinitionVariants.js.map +7 -0
  229. package/build/theme/internals/ComponentThemeProps.d.ts +5 -0
  230. package/build/theme/internals/ComponentThemeProps.js +2 -0
  231. package/build/theme/internals/ComponentThemeProps.js.map +7 -0
  232. package/build/theme/internals/ComponentThemeVariants.d.ts +14 -0
  233. package/build/theme/internals/ComponentThemeVariants.js +2 -0
  234. package/build/theme/internals/ComponentThemeVariants.js.map +7 -0
  235. package/build/theme/internals/UseComponentTheme.d.ts +21 -0
  236. package/build/theme/internals/UseComponentTheme.js +2 -0
  237. package/build/theme/internals/UseComponentTheme.js.map +7 -0
  238. package/build/theme/internals/UseComponentThemeReturn.d.ts +6 -0
  239. package/build/theme/internals/UseComponentThemeReturn.js +2 -0
  240. package/build/theme/internals/UseComponentThemeReturn.js.map +7 -0
  241. package/build/theme/internals/booleanToString.d.ts +1 -0
  242. package/build/theme/internals/booleanToString.js +5 -0
  243. package/build/theme/internals/booleanToString.js.map +7 -0
  244. package/build/theme/internals/createComponentTheme.d.ts +3 -0
  245. package/build/theme/internals/createComponentTheme.js +36 -0
  246. package/build/theme/internals/createComponentTheme.js.map +7 -0
  247. package/build/theme/internals/createUseComponentThemeReturn.d.ts +15 -0
  248. package/build/theme/internals/createUseComponentThemeReturn.js +51 -0
  249. package/build/theme/internals/createUseComponentThemeReturn.js.map +7 -0
  250. package/build/theme/internals/cx.d.ts +2 -0
  251. package/build/theme/internals/cx.js +6 -0
  252. package/build/theme/internals/cx.js.map +7 -0
  253. package/build/theme/internals/pickPropertyIfExists.d.ts +4 -0
  254. package/build/theme/internals/pickPropertyIfExists.js +11 -0
  255. package/build/theme/internals/pickPropertyIfExists.js.map +7 -0
  256. package/build/theme/internals/themeContext.d.ts +217 -0
  257. package/build/theme/internals/themeContext.js +4 -0
  258. package/build/theme/internals/themeContext.js.map +7 -0
  259. package/build/theme/internals/useTheme.d.ts +216 -0
  260. package/build/theme/internals/useTheme.js +7 -0
  261. package/build/theme/internals/useTheme.js.map +7 -0
  262. package/build/theme/internals.d.ts +18 -0
  263. package/build/theme/internals.js +20 -0
  264. package/build/theme/internals.js.map +7 -0
  265. package/build/theme.d.ts +3 -0
  266. package/build/theme.js +5 -0
  267. package/build/theme.js.map +7 -0
  268. package/package.json +93 -0
  269. package/source/components/Button.ts +74 -0
  270. package/source/components/Card.tsx +10 -0
  271. package/source/components/Checkbox.tsx +75 -0
  272. package/source/components/CheckboxField.tsx +28 -0
  273. package/source/components/Combobox.tsx +160 -0
  274. package/source/components/ConfirmDialog.tsx +67 -0
  275. package/source/components/Dialog.tsx +34 -0
  276. package/source/components/DialogPanel.tsx +18 -0
  277. package/source/components/DialogTitle.tsx +18 -0
  278. package/source/components/Error.tsx +27 -0
  279. package/source/components/Field.tsx +28 -0
  280. package/source/components/Form.tsx +30 -0
  281. package/source/components/Input.tsx +176 -0
  282. package/source/components/Label.tsx +18 -0
  283. package/source/components/Listbox.tsx +113 -0
  284. package/source/components/Menu.tsx +19 -0
  285. package/source/components/MenuButton.tsx +18 -0
  286. package/source/components/MenuItem.tsx +19 -0
  287. package/source/components/MenuItems.tsx +18 -0
  288. package/source/components/Popover.tsx +18 -0
  289. package/source/components/PopoverButton.tsx +45 -0
  290. package/source/components/PopoverPanel.tsx +37 -0
  291. package/source/components/Radio.tsx +46 -0
  292. package/source/components/RadioField.tsx +34 -0
  293. package/source/components/RadioGroupField.tsx +101 -0
  294. package/source/components/Spinner.tsx +46 -0
  295. package/source/components/Table.tsx +31 -0
  296. package/source/components/TableCell.tsx +17 -0
  297. package/source/components/TableHeader.tsx +19 -0
  298. package/source/components/TableHeaderCell.tsx +17 -0
  299. package/source/components/TableRow.tsx +17 -0
  300. package/source/components/Textarea.tsx +142 -0
  301. package/source/components/internals/fieldNameContext.ts +3 -0
  302. package/source/components/internals/formContext.ts +4 -0
  303. package/source/components/internals/useField.ts +19 -0
  304. package/source/components/internals/useFieldName.ts +7 -0
  305. package/source/components/internals/useForm.ts +7 -0
  306. package/source/components/internals.ts +5 -0
  307. package/source/components.ts +32 -0
  308. package/source/development/createTailwindConfig.ts +153 -0
  309. package/source/development/createTailwindMerge.ts +101 -0
  310. package/source/development/defaultTailwindConfig.ts +45 -0
  311. package/source/development/internals/PaletteConfig.ts +6 -0
  312. package/source/development/internals/SwatchValue.ts +9 -0
  313. package/source/development/internals/clamp.ts +3 -0
  314. package/source/development/internals/constants.ts +4 -0
  315. package/source/development/internals/createDisplayColor.ts +29 -0
  316. package/source/development/internals/createDistributionValues.ts +38 -0
  317. package/source/development/internals/createHueScale.ts +17 -0
  318. package/source/development/internals/createPalette.ts +54 -0
  319. package/source/development/internals/createSaturationScale.ts +21 -0
  320. package/source/development/internals/createSwatches.ts +34 -0
  321. package/source/development/internals/hexToHsl.ts +45 -0
  322. package/source/development/internals/hexToRgb.ts +23 -0
  323. package/source/development/internals/hslToHex.ts +23 -0
  324. package/source/development/internals/hslToRgb.ts +43 -0
  325. package/source/development/internals/isHex.ts +7 -0
  326. package/source/development/internals/resolveModule.ts +9 -0
  327. package/source/development/internals/round.ts +5 -0
  328. package/source/development/internals/unsignedModulo.ts +3 -0
  329. package/source/development/internals.ts +1 -0
  330. package/source/development.ts +3 -0
  331. package/source/fonts.css +15 -0
  332. package/source/inter-variable-italic.woff2 +0 -0
  333. package/source/inter-variable.woff2 +0 -0
  334. package/source/main.ts +8 -0
  335. package/source/theme/Theme.ts +72 -0
  336. package/source/theme/ThemeProvider.tsx +12 -0
  337. package/source/theme/defaultTheme.ts +370 -0
  338. package/source/theme/internals/ClassName.ts +1 -0
  339. package/source/theme/internals/ComponentProps.ts +13 -0
  340. package/source/theme/internals/ComponentTheme.ts +33 -0
  341. package/source/theme/internals/ComponentThemeCompoundVariants.ts +20 -0
  342. package/source/theme/internals/ComponentThemeDefinition.ts +7 -0
  343. package/source/theme/internals/ComponentThemeDefinitionElements.ts +1 -0
  344. package/source/theme/internals/ComponentThemeDefinitionVariants.ts +3 -0
  345. package/source/theme/internals/ComponentThemeProps.ts +11 -0
  346. package/source/theme/internals/ComponentThemeVariants.ts +24 -0
  347. package/source/theme/internals/UseComponentTheme.ts +22 -0
  348. package/source/theme/internals/UseComponentThemeReturn.ts +15 -0
  349. package/source/theme/internals/booleanToString.ts +6 -0
  350. package/source/theme/internals/createComponentTheme.ts +67 -0
  351. package/source/theme/internals/createUseComponentThemeReturn.ts +87 -0
  352. package/source/theme/internals/cx.ts +10 -0
  353. package/source/theme/internals/pickPropertyIfExists.ts +24 -0
  354. package/source/theme/internals/themeContext.ts +5 -0
  355. package/source/theme/internals/useTheme.ts +7 -0
  356. package/source/theme/internals.ts +18 -0
  357. package/source/theme.ts +3 -0
@@ -0,0 +1,101 @@
1
+ import {extendTailwindMerge, twMerge} from 'tailwind-merge';
2
+ import {type Config as TailwindConfig} from 'tailwindcss';
3
+
4
+ const THEME_SCALES = [
5
+ 'colors',
6
+ 'spacing',
7
+ 'blur',
8
+ 'brightness',
9
+ 'borderColor',
10
+ 'borderRadius',
11
+ 'borderSpacing',
12
+ 'borderWidth',
13
+ 'contrast',
14
+ 'grayscale',
15
+ 'hueRotate',
16
+ 'invert',
17
+ 'gap',
18
+ 'gradientColorStops',
19
+ 'gradientColorStopPositions',
20
+ 'inset',
21
+ 'margin',
22
+ 'opacity',
23
+ 'padding',
24
+ 'saturate',
25
+ 'scale',
26
+ 'sepia',
27
+ 'skew',
28
+ 'space',
29
+ 'translate',
30
+ ];
31
+
32
+ export function createTailwindMerge(tailwindConfig: TailwindConfig) {
33
+ if (!tailwindConfig.theme) {
34
+ return twMerge;
35
+ }
36
+
37
+ let tailwindMergeConfig: Parameters<typeof extendTailwindMerge>[0] = {
38
+ override: {theme: {}},
39
+ extend: {theme: {}},
40
+ };
41
+
42
+ for (let scale of THEME_SCALES) {
43
+ if (!tailwindMergeConfig.override?.theme || !tailwindMergeConfig.extend?.theme) {
44
+ throw new Error('Creating Tailwind merge failed!');
45
+ }
46
+
47
+ if (tailwindConfig.theme[scale]) {
48
+ let tailwindConfigScale = tailwindConfig.theme[scale] as Record<
49
+ string,
50
+ Record<string, string | unknown> | unknown
51
+ >;
52
+ let keys = Object.keys(tailwindConfigScale);
53
+ let combinedKeys = [];
54
+
55
+ for (let key of keys) {
56
+ if (
57
+ tailwindConfigScale[key] !== undefined &&
58
+ tailwindConfigScale[key] !== null &&
59
+ typeof tailwindConfigScale[key] === 'object'
60
+ ) {
61
+ combinedKeys.push(
62
+ ...Object.keys(tailwindConfigScale[key] as object)
63
+ .filter((value) => value !== 'DEFAULT')
64
+ .map((value) => `${key}-${value}`),
65
+ );
66
+ } else {
67
+ combinedKeys.push(key);
68
+ }
69
+ }
70
+
71
+ tailwindMergeConfig.override.theme[scale] = combinedKeys;
72
+ } else if (tailwindConfig.theme.extend?.[scale]) {
73
+ let tailwindConfigScale = tailwindConfig.theme.extend[scale] as Record<
74
+ string,
75
+ Record<string, string | unknown> | unknown
76
+ >;
77
+ let keys = Object.keys(tailwindConfigScale);
78
+ let combinedKeys = [];
79
+
80
+ for (let key of keys) {
81
+ if (
82
+ tailwindConfigScale[key] !== undefined &&
83
+ tailwindConfigScale[key] !== null &&
84
+ typeof tailwindConfigScale[key] === 'object'
85
+ ) {
86
+ combinedKeys.push(
87
+ ...Object.keys(tailwindConfigScale[key] as object)
88
+ .filter((value) => value !== 'DEFAULT')
89
+ .map((value) => `${key}-${value}`),
90
+ );
91
+ } else {
92
+ combinedKeys.push(key);
93
+ }
94
+ }
95
+
96
+ tailwindMergeConfig.extend.theme[scale] = combinedKeys;
97
+ }
98
+ }
99
+
100
+ return extendTailwindMerge(tailwindMergeConfig);
101
+ }
@@ -0,0 +1,45 @@
1
+ import {type CreateTailwindConfigOptions} from './createTailwindConfig.js';
2
+
3
+ export const defaultTailwindConfig = {
4
+ content: ['./{.storybook,app,source,stories}/**/*.{js,jsx,ts,tsx,mdx}', '@jakubmazanec/ui'],
5
+ colors: {
6
+ gray: '#6c6e79',
7
+ red: '#d1002f',
8
+ orange: {
9
+ hex: '#c33909',
10
+ hueShift: 1,
11
+ },
12
+ yellow: {
13
+ swatches: [
14
+ {hex: '#fffffa', stop: 10},
15
+ {hex: '#fffef0', stop: 25},
16
+ {hex: '#fffbdb', stop: 50},
17
+ {hex: '#fff3b8', stop: 100},
18
+ {hex: '#ffe06f', stop: 200},
19
+ {hex: '#ffc72d', stop: 300},
20
+ {hex: '#e69d00', stop: 400},
21
+ {hex: '#9e6300', stop: 500},
22
+ {hex: '#805701', stop: 600},
23
+ {hex: '#614700', stop: 700},
24
+ {hex: '#3d3000', stop: 800},
25
+ {hex: '#1f1a00', stop: 900},
26
+ {hex: '#0f0e00', stop: 950},
27
+ {hex: '#0a0a00', stop: 975},
28
+ {hex: '#050500', stop: 990},
29
+ ],
30
+ hex: '#9e6300',
31
+ hueShift: 3,
32
+ },
33
+ green: '#0a7e22',
34
+ teal: {
35
+ hex: '#007c65',
36
+ hueShift: 5,
37
+ },
38
+ blue: '#006dca',
39
+ violet: '#8649e1',
40
+ pink: {
41
+ hex: '#b229b9',
42
+ hueShift: 10,
43
+ },
44
+ },
45
+ } satisfies CreateTailwindConfigOptions;
@@ -0,0 +1,6 @@
1
+ export type PaletteConfig = {
2
+ value: string;
3
+ valueStop: number;
4
+ h: number;
5
+ s: number;
6
+ };
@@ -0,0 +1,9 @@
1
+ export type SwatchValue = {
2
+ hex: string;
3
+ stop: number;
4
+ h: number;
5
+ hScale: number;
6
+ s: number;
7
+ sScale: number;
8
+ l: number;
9
+ };
@@ -0,0 +1,3 @@
1
+ export function clamp(x: number, min: number, max: number) {
2
+ return Math.min(Math.max(x, min), max);
3
+ }
@@ -0,0 +1,4 @@
1
+ export const DEFAULT_STOP = 500;
2
+ export const DEFAULT_STOPS = [
3
+ 0, 10, 25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950, 975, 990, 1000,
4
+ ] as const;
@@ -0,0 +1,29 @@
1
+ import {oklch} from 'culori';
2
+
3
+ import {isHex} from './isHex.js';
4
+ import {round} from './round.js';
5
+
6
+ export function createDisplayColor(hexColor: string, alphaPlaceholder?: boolean): string | null {
7
+ if (!hexColor || !isHex(hexColor)) {
8
+ return null;
9
+ }
10
+
11
+ let display = null;
12
+ let oklchColor = oklch(hexColor);
13
+
14
+ if (!oklchColor) {
15
+ throw new Error(`Couldn't convert "${hexColor}" to OKLCH!`);
16
+ }
17
+
18
+ let {l, c, h = 0} = oklchColor;
19
+
20
+ display = `oklch(${[
21
+ `${round(l * 100, 2)}%`,
22
+ round(c, 3),
23
+ round(h, 2),
24
+ `/`,
25
+ alphaPlaceholder ? `<alpha-value>` : 1,
26
+ ].join(` `)})`;
27
+
28
+ return display;
29
+ }
@@ -0,0 +1,38 @@
1
+ import {DEFAULT_STOP, DEFAULT_STOPS} from './constants.js';
2
+
3
+ const MIN = 0;
4
+ const MAX = 100;
5
+
6
+ export function createDistributionValues(lightness: number, stop: number = DEFAULT_STOP) {
7
+ let stops: number[] = [...DEFAULT_STOPS].sort() as unknown as number[];
8
+ let newValues = [
9
+ {stop: 0, value: MAX},
10
+ {stop, value: lightness},
11
+ {stop: 1000, value: MIN},
12
+ ];
13
+ let stopIndex = stops.indexOf(stop);
14
+ let firstHalf = stops.slice(0, stopIndex + 1);
15
+ let secondHalf = stops.slice(stopIndex);
16
+
17
+ for (let stopValue of firstHalf) {
18
+ if (stopValue !== 0 && stopValue !== stop) {
19
+ let percentage = (stopValue - 0) / (stop - 0);
20
+ let value = MAX - percentage * (MAX - lightness);
21
+
22
+ newValues.push({stop: stopValue, value: Math.round(value)});
23
+ }
24
+ }
25
+
26
+ for (let stopValue of secondHalf) {
27
+ if (stopValue !== 1000 && stopValue !== stop) {
28
+ let percentage = (stopValue - stop) / (1000 - stop);
29
+ let value = lightness - percentage * (lightness - MIN);
30
+
31
+ newValues.push({stop: stopValue, value: Math.round(value)});
32
+ }
33
+ }
34
+
35
+ newValues.sort((a, b) => a.stop - b.stop);
36
+
37
+ return newValues;
38
+ }
@@ -0,0 +1,17 @@
1
+ import {DEFAULT_STOP, DEFAULT_STOPS} from './constants.js';
2
+
3
+ export function createHueScale(tweak = 0, stop: number = DEFAULT_STOP) {
4
+ let stops: number[] = DEFAULT_STOPS as unknown as number[];
5
+ let index = stops.indexOf(stop);
6
+
7
+ if (index === -1) {
8
+ throw new Error(`Invalid parameter value: ${stop}`);
9
+ }
10
+
11
+ return stops.map((stop) => {
12
+ let diff = Math.abs(stops.indexOf(stop) - index);
13
+ let tweakValue = tweak ? diff * tweak : 0;
14
+
15
+ return {stop, tweak: tweakValue};
16
+ });
17
+ }
@@ -0,0 +1,54 @@
1
+ import {DEFAULT_STOP, type DEFAULT_STOPS} from './constants.js';
2
+ import {createDisplayColor} from './createDisplayColor.js';
3
+ import {createSwatches} from './createSwatches.js';
4
+
5
+ export type CreatePaletteOptions<N extends string> = {
6
+ name: N;
7
+ swatches: Array<{hex: string; stop: number}>;
8
+ hueShift: number;
9
+ saturationShift: number;
10
+ };
11
+
12
+ export type CreatePaletteReturn<N extends string> = {
13
+ [K in N]: {[J in (typeof DEFAULT_STOPS)[number]]: string};
14
+ };
15
+
16
+ export function createPalette<const N extends string>({
17
+ name,
18
+ swatches,
19
+ hueShift,
20
+ saturationShift,
21
+ }: CreatePaletteOptions<N>): CreatePaletteReturn<N> {
22
+ let defaultSwatch = swatches.find((swatch) => swatch.stop === DEFAULT_STOP);
23
+
24
+ if (!defaultSwatch) {
25
+ throw new Error(`Swatches are missing color for stop "${DEFAULT_STOP}"!`);
26
+ }
27
+
28
+ let allSwatches = createSwatches({
29
+ value: defaultSwatch.hex,
30
+ valueStop: DEFAULT_STOP,
31
+ h: hueShift,
32
+ s: saturationShift,
33
+ });
34
+ let palette = {};
35
+
36
+ allSwatches
37
+ .filter((swatch) => ![0, 1000].includes(swatch.stop))
38
+ .forEach((newSwatch) => {
39
+ let existingSwatch = swatches.find((swatch) => swatch.stop === newSwatch.stop);
40
+
41
+ if (existingSwatch) {
42
+ Object.assign(palette, {
43
+ [existingSwatch.stop]: createDisplayColor(existingSwatch.hex, true),
44
+ });
45
+ } else {
46
+ Object.assign(palette, {[newSwatch.stop]: createDisplayColor(newSwatch.hex, true)});
47
+ }
48
+ });
49
+
50
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- false positive
51
+ return {
52
+ [name]: palette,
53
+ } as CreatePaletteReturn<N>;
54
+ }
@@ -0,0 +1,21 @@
1
+ import {DEFAULT_STOP, DEFAULT_STOPS} from './constants.js';
2
+
3
+ export function createSaturationScale(tweak = 0, stop: number = DEFAULT_STOP) {
4
+ let stops: number[] = DEFAULT_STOPS as unknown as number[];
5
+ let index = stops.indexOf(stop);
6
+
7
+ if (index === -1) {
8
+ throw new Error(`Invalid key value: ${stop}`);
9
+ }
10
+
11
+ return stops.map((stop) => {
12
+ let diff = Math.abs(stops.indexOf(stop) - index);
13
+ let tweakValue = tweak ? Math.round((diff + 1) * tweak * (1 + diff / 10)) : 0;
14
+
15
+ if (tweakValue > 100) {
16
+ return {stop, tweak: 100};
17
+ }
18
+
19
+ return {stop, tweak: tweakValue};
20
+ });
21
+ }
@@ -0,0 +1,34 @@
1
+ import {clamp} from './clamp.js';
2
+ import {createDistributionValues} from './createDistributionValues.js';
3
+ import {createHueScale} from './createHueScale.js';
4
+ import {createSaturationScale} from './createSaturationScale.js';
5
+ import {hexToHsl} from './hexToHsl.js';
6
+ import {hslToHex} from './hslToHex.js';
7
+ import {type PaletteConfig} from './PaletteConfig.js';
8
+ import {unsignedModulo} from './unsignedModulo.js';
9
+
10
+ export function createSwatches(palette: PaletteConfig) {
11
+ let hueScale = createHueScale(palette.h, palette.valueStop);
12
+ let saturationScale = createSaturationScale(palette.s, palette.valueStop);
13
+ let {h, s, l} = hexToHsl(palette.value);
14
+ let distributionScale = createDistributionValues(l, palette.valueStop);
15
+
16
+ let swatches = hueScale.map(({stop}, stopIndex) => {
17
+ let newH = unsignedModulo(h + hueScale[stopIndex]!.tweak, 360);
18
+ let newS = clamp(s + saturationScale[stopIndex]!.tweak, 0, 100);
19
+ let newL = clamp(distributionScale[stopIndex]!.value, 0.1, 99.9); // this is to make sure the first two or last two swatches (the first being total white and the last being total black) aren't the same lightness
20
+ let newHex = hslToHex(newH, newS, newL);
21
+
22
+ return {
23
+ stop,
24
+ hex: stop === palette.valueStop ? palette.value.toUpperCase() : newHex.toUpperCase(),
25
+ h: newH,
26
+ hScale: ((unsignedModulo(hueScale[stopIndex]!.tweak + 180, 360) - 180) / 180) * 50,
27
+ s: newS,
28
+ sScale: newS - 50,
29
+ l: newL,
30
+ };
31
+ });
32
+
33
+ return swatches;
34
+ }
@@ -0,0 +1,45 @@
1
+ import {hexToRgb} from './hexToRgb.js';
2
+
3
+ export function hexToHsl(rawHex: string) {
4
+ let hex = rawHex;
5
+
6
+ if (hex.length === 6 && !hex.startsWith(`#`)) {
7
+ hex = `#${hex}`;
8
+ }
9
+
10
+ let {r, g, b} = hexToRgb(hex);
11
+
12
+ r /= 255;
13
+ g /= 255;
14
+ b /= 255;
15
+
16
+ let cmin = Math.min(r, g, b);
17
+ let cmax = Math.max(r, g, b);
18
+ let delta = cmax - cmin;
19
+ let h = 0;
20
+ let s = 0;
21
+ let l = 0;
22
+
23
+ if (delta === 0) {
24
+ h = 0;
25
+ } else if (cmax === r) {
26
+ h = ((g - b) / delta) % 6;
27
+ } else if (cmax === g) {
28
+ h = (b - r) / delta + 2;
29
+ } else {
30
+ h = (r - g) / delta + 4;
31
+ }
32
+
33
+ h = Math.round(h * 60);
34
+
35
+ if (h < 0) {
36
+ h += 360;
37
+ }
38
+
39
+ l = (cmax + cmin) / 2;
40
+ s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
41
+ s = +(s * 100).toFixed(1);
42
+ l = +(l * 100).toFixed(1);
43
+
44
+ return {h, s, l}; // values can be used like this: `hsl(${h}, ${s}%, ${l}%)`
45
+ }
@@ -0,0 +1,23 @@
1
+ export function hexToRgb(rawHex: string) {
2
+ let hex = rawHex;
3
+
4
+ if (hex.length === 6 && !hex.startsWith(`#`)) {
5
+ hex = `#${hex}`;
6
+ }
7
+
8
+ let r = `0`;
9
+ let g = `0`;
10
+ let b = `0`;
11
+
12
+ if (hex.length === 4) {
13
+ r = `0x${hex[1]}${hex[1]}`;
14
+ g = `0x${hex[2]}${hex[2]}`;
15
+ b = `0x${hex[3]}${hex[3]}`;
16
+ } else if (hex.length === 7) {
17
+ r = `0x${hex[1]}${hex[2]}`;
18
+ g = `0x${hex[3]}${hex[4]}`;
19
+ b = `0x${hex[5]}${hex[6]}`;
20
+ }
21
+
22
+ return {r: Number(r), g: Number(g), b: Number(b)};
23
+ }
@@ -0,0 +1,23 @@
1
+ import {hslToRgb} from './hslToRgb.js';
2
+
3
+ export function hslToHex(h: number, s: number, l: number) {
4
+ let {r, g, b} = hslToRgb(h, s, l);
5
+
6
+ let rHex = r.toString(16);
7
+ let gHex = g.toString(16);
8
+ let bHex = b.toString(16);
9
+
10
+ if (rHex.length === 1) {
11
+ rHex = `0${rHex}`;
12
+ }
13
+
14
+ if (gHex.length === 1) {
15
+ gHex = `0${gHex}`;
16
+ }
17
+
18
+ if (bHex.length === 1) {
19
+ bHex = `0${bHex}`;
20
+ }
21
+
22
+ return `#${rHex}${gHex}${bHex}`;
23
+ }
@@ -0,0 +1,43 @@
1
+ export function hslToRgb(h: number, rawS: number, rawL: number) {
2
+ let s = rawS / 100;
3
+ let l = rawL / 100;
4
+
5
+ let c = (1 - Math.abs(2 * l - 1)) * s;
6
+ let x = c * (1 - Math.abs(((h / 60) % 2) - 1));
7
+ let m = l - c / 2;
8
+ let r = 0;
9
+ let g = 0;
10
+ let b = 0;
11
+
12
+ if (h >= 0 && h < 60) {
13
+ r = c;
14
+ g = x;
15
+ b = 0;
16
+ } else if (h >= 60 && h < 120) {
17
+ r = x;
18
+ g = c;
19
+ b = 0;
20
+ } else if (h >= 120 && h < 180) {
21
+ r = 0;
22
+ g = c;
23
+ b = x;
24
+ } else if (h >= 180 && h < 240) {
25
+ r = 0;
26
+ g = x;
27
+ b = c;
28
+ } else if (h >= 240 && h < 300) {
29
+ r = x;
30
+ g = 0;
31
+ b = c;
32
+ } else if (h >= 300 && h < 360) {
33
+ r = c;
34
+ g = 0;
35
+ b = x;
36
+ }
37
+
38
+ return {
39
+ r: Math.round((r + m) * 255),
40
+ g: Math.round((g + m) * 255),
41
+ b: Math.round((b + m) * 255),
42
+ };
43
+ }
@@ -0,0 +1,7 @@
1
+ export function isHex(value: string) {
2
+ const valueHex = value.length === 6 && !value.startsWith(`#`) ? `#${value}` : value;
3
+
4
+ const re = new RegExp(/^#[\da-f]{6}$/i);
5
+
6
+ return re.test(valueHex.toUpperCase());
7
+ }
@@ -0,0 +1,9 @@
1
+ import module from 'node:module';
2
+ import path from 'node:path';
3
+
4
+ export function resolveModule(moduleId: string) {
5
+ let require = module.createRequire(import.meta.url);
6
+ let modulePath = path.dirname(require.resolve(`${moduleId}/package.json`));
7
+
8
+ return modulePath;
9
+ }
@@ -0,0 +1,5 @@
1
+ export function round(value: number, precision = 0) {
2
+ const multiplier = 10 ** precision;
3
+
4
+ return Math.round(value * multiplier) / multiplier;
5
+ }
@@ -0,0 +1,3 @@
1
+ export function unsignedModulo(x: number, n: number) {
2
+ return ((x % n) + n) % n;
3
+ }
@@ -0,0 +1 @@
1
+ export * from './internals/constants.js';
@@ -0,0 +1,3 @@
1
+ export * from './development/createTailwindConfig.js';
2
+ export * from './development/createTailwindMerge.js';
3
+ export * from './development/defaultTailwindConfig.js';
@@ -0,0 +1,15 @@
1
+ @font-face {
2
+ font-family: InterVariable;
3
+ font-style: normal;
4
+ font-weight: 100 900;
5
+ font-display: swap;
6
+ src: url('./inter-variable.woff2') format('woff2');
7
+ }
8
+
9
+ @font-face {
10
+ font-family: InterVariable;
11
+ font-style: italic;
12
+ font-weight: 100 900;
13
+ font-display: swap;
14
+ src: url('./inter-variable-italic.woff2') format('woff2');
15
+ }
Binary file
package/source/main.ts ADDED
@@ -0,0 +1,8 @@
1
+ export * from './components.js';
2
+ export {createTailwindMerge} from './development/createTailwindMerge.js';
3
+ export * from './theme.js';
4
+ export * from '@heroicons/react/16/solid';
5
+ // export * from '@heroicons/react/20/solid';
6
+ // export * from '@heroicons/react/24/outline';
7
+ // export * from '@heroicons/react/24/solid';
8
+ export {useForm} from 'react-hook-form';
@@ -0,0 +1,72 @@
1
+ import {type Simplify} from '@jakubmazanec/ts-utils';
2
+
3
+ import {type useButtonTheme} from '../components/Button.js';
4
+ import {type useCheckboxTheme} from '../components/Checkbox.js';
5
+ import {type useCheckboxFieldTheme} from '../components/CheckboxField.js';
6
+ import {type useComboboxTheme} from '../components/Combobox.js';
7
+ import {type useConfirmDialogTheme} from '../components/ConfirmDialog.js';
8
+ import {type useDialogTheme} from '../components/Dialog.js';
9
+ import {type useDialogPanelTheme} from '../components/DialogPanel.js';
10
+ import {type useDialogTitleTheme} from '../components/DialogTitle.js';
11
+ import {type useErrorTheme} from '../components/Error.js';
12
+ import {type useFieldTheme} from '../components/Field.js';
13
+ import {type useFormTheme} from '../components/Form.js';
14
+ import {type useInputTheme} from '../components/Input.js';
15
+ import {type useLabelTheme} from '../components/Label.js';
16
+ import {type useListboxTheme} from '../components/Listbox.js';
17
+ import {type useMenuTheme} from '../components/Menu.js';
18
+ import {type useMenuButtonTheme} from '../components/MenuButton.js';
19
+ import {type useMenuItemTheme} from '../components/MenuItem.js';
20
+ import {type useMenuItemsTheme} from '../components/MenuItems.js';
21
+ import {type usePopoverTheme} from '../components/Popover.js';
22
+ import {type usePopoverButtonTheme} from '../components/PopoverButton.js';
23
+ import {type usePopoverPanelTheme} from '../components/PopoverPanel.js';
24
+ import {type useRadioTheme} from '../components/Radio.js';
25
+ import {type useRadioFieldTheme} from '../components/RadioField.js';
26
+ import {type useRadioGroupFieldTheme} from '../components/RadioGroupField.js';
27
+ import {type useTableTheme} from '../components/Table.js';
28
+ import {type useTableCellTheme} from '../components/TableCell.js';
29
+ import {type useTableHeaderTheme} from '../components/TableHeader.js';
30
+ import {type useTableHeaderCellTheme} from '../components/TableHeaderCell.js';
31
+ import {type useTableRowTheme} from '../components/TableRow.js';
32
+ import {type useTextareaTheme} from '../components/Textarea.js';
33
+ import {type ComponentTheme, type ComponentThemeDefinition} from './internals.js';
34
+
35
+ type ThemeHelper<
36
+ U extends {themeDefinition: ComponentThemeDefinition | undefined; componentThemeName: string},
37
+ > = {
38
+ [K in U['componentThemeName']]: ComponentTheme<U['themeDefinition']>;
39
+ };
40
+
41
+ export type Theme = Simplify<
42
+ ThemeHelper<typeof useButtonTheme> &
43
+ ThemeHelper<typeof useCheckboxFieldTheme> &
44
+ ThemeHelper<typeof useCheckboxTheme> &
45
+ ThemeHelper<typeof useComboboxTheme> &
46
+ ThemeHelper<typeof useConfirmDialogTheme> &
47
+ ThemeHelper<typeof useDialogPanelTheme> &
48
+ ThemeHelper<typeof useDialogTheme> &
49
+ ThemeHelper<typeof useDialogTitleTheme> &
50
+ ThemeHelper<typeof useErrorTheme> &
51
+ ThemeHelper<typeof useFieldTheme> &
52
+ ThemeHelper<typeof useFormTheme> &
53
+ ThemeHelper<typeof useInputTheme> &
54
+ ThemeHelper<typeof useLabelTheme> &
55
+ ThemeHelper<typeof useListboxTheme> &
56
+ ThemeHelper<typeof useMenuButtonTheme> &
57
+ ThemeHelper<typeof useMenuItemsTheme> &
58
+ ThemeHelper<typeof useMenuItemTheme> &
59
+ ThemeHelper<typeof useMenuTheme> &
60
+ ThemeHelper<typeof usePopoverButtonTheme> &
61
+ ThemeHelper<typeof usePopoverPanelTheme> &
62
+ ThemeHelper<typeof usePopoverTheme> &
63
+ ThemeHelper<typeof useRadioFieldTheme> &
64
+ ThemeHelper<typeof useRadioGroupFieldTheme> &
65
+ ThemeHelper<typeof useRadioTheme> &
66
+ ThemeHelper<typeof useTableCellTheme> &
67
+ ThemeHelper<typeof useTableHeaderCellTheme> &
68
+ ThemeHelper<typeof useTableHeaderTheme> &
69
+ ThemeHelper<typeof useTableRowTheme> &
70
+ ThemeHelper<typeof useTableTheme> &
71
+ ThemeHelper<typeof useTextareaTheme>
72
+ >;
@@ -0,0 +1,12 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {themeContext} from './internals.js';
4
+ import {type Theme} from './Theme.js';
5
+
6
+ export type ThemeProviderProps = {
7
+ theme: Theme;
8
+ };
9
+
10
+ export function ThemeProvider({children, theme}: PropsWithChildren<ThemeProviderProps>) {
11
+ return <themeContext.Provider value={theme}>{children}</themeContext.Provider>;
12
+ }