@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
+ /* eslint-disable react/jsx-no-bind -- needed */
2
+ import {RadioGroup as HeadlessRadioGroup} from '@headlessui/react';
3
+ import {type PropsWithChildren, useCallback} from 'react';
4
+ import {Controller} from 'react-hook-form';
5
+
6
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
7
+ import {fieldNameContext, useForm} from './internals.js';
8
+
9
+ export const useRadioGroupFieldTheme = createComponentTheme('RadioGroupField', {
10
+ variants: {
11
+ disabled: [true, false],
12
+ },
13
+ });
14
+
15
+ export type RadioGroupFieldProps<T extends boolean | number | string> = PropsWithChildren<
16
+ ComponentProps<typeof useRadioGroupFieldTheme> & {
17
+ name?: string;
18
+ className?: string;
19
+ value?: T;
20
+ defaultValue?: T;
21
+ onChange?: ((value: T) => void) | undefined;
22
+ }
23
+ >;
24
+
25
+ export function RadioGroupField<T extends boolean | number | string>({
26
+ name,
27
+ className,
28
+ disabled = false,
29
+ onChange,
30
+ value,
31
+ defaultValue,
32
+ children,
33
+ }: RadioGroupFieldProps<T>) {
34
+ let theme = useRadioGroupFieldTheme({disabled});
35
+ let form = useForm();
36
+
37
+ let handleChange = useCallback(
38
+ (value: T) => {
39
+ onChange?.(value);
40
+ },
41
+ [onChange],
42
+ );
43
+
44
+ if (name && form) {
45
+ return (
46
+ <Controller
47
+ name={name}
48
+ control={form.control}
49
+ render={({field}) => {
50
+ let handleChange = field.onChange;
51
+ let handleBlur = field.onBlur;
52
+
53
+ return (
54
+ <fieldNameContext.Provider value={name}>
55
+ <HeadlessRadioGroup
56
+ className={theme(null, className)}
57
+ name={name}
58
+ value={field.value as T}
59
+ defaultValue={defaultValue as T}
60
+ disabled={disabled}
61
+ onChange={handleChange}
62
+ onBlur={handleBlur}
63
+ >
64
+ {children}
65
+ </HeadlessRadioGroup>
66
+ </fieldNameContext.Provider>
67
+ );
68
+ }}
69
+ />
70
+ );
71
+ }
72
+
73
+ if (name) {
74
+ return (
75
+ <fieldNameContext.Provider value={name}>
76
+ <HeadlessRadioGroup
77
+ className={theme(null, className)}
78
+ name={name}
79
+ value={value as T}
80
+ defaultValue={defaultValue as T}
81
+ disabled={disabled}
82
+ onChange={handleChange}
83
+ >
84
+ {children}
85
+ </HeadlessRadioGroup>
86
+ </fieldNameContext.Provider>
87
+ );
88
+ }
89
+
90
+ return (
91
+ <HeadlessRadioGroup
92
+ className={theme(null, className)}
93
+ value={value as T}
94
+ defaultValue={defaultValue as T}
95
+ disabled={disabled}
96
+ onChange={handleChange}
97
+ >
98
+ {children}
99
+ </HeadlessRadioGroup>
100
+ );
101
+ }
@@ -0,0 +1,46 @@
1
+ import React, {type FC} from 'react';
2
+ import {twMerge} from 'tailwind-merge';
3
+
4
+ export interface SpinnerProps extends React.ComponentProps<'svg'> {
5
+ className?: string;
6
+ size?: 'small' | 'medium' | 'large';
7
+ }
8
+
9
+ export const Spinner: FC<SpinnerProps> = ({size = 'medium', className}) => {
10
+ let sizeClasses = 'w-8 h-8';
11
+
12
+ if (size === 'small') {
13
+ sizeClasses = 'w-4 h-4';
14
+ } else if (size === 'large') {
15
+ sizeClasses = 'w-12 h-12';
16
+ }
17
+
18
+ return (
19
+ <div
20
+ role="status"
21
+ className={twMerge(
22
+ 'inline-flex items-center justify-center fill-black text-gray-200',
23
+ className,
24
+ )}
25
+ >
26
+ <svg
27
+ aria-hidden="true"
28
+ className={`${sizeClasses} animate-spin`}
29
+ viewBox="0 0 101 101"
30
+ xmlns="http://www.w3.org/2000/svg"
31
+ >
32
+ <path
33
+ d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
34
+ fill="currentColor"
35
+ />
36
+ <path
37
+ d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
38
+ fill="currentFill"
39
+ />
40
+ </svg>
41
+ <span className="sr-only">Loading...</span>
42
+ </div>
43
+ );
44
+ };
45
+
46
+ export const MemoizedSpinner = React.memo(Spinner);
@@ -0,0 +1,31 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
4
+
5
+ export const useTableTheme = createComponentTheme('Table', {
6
+ elements: ['root', 'table'],
7
+ });
8
+
9
+ export type TableProps = PropsWithChildren<
10
+ ComponentProps<typeof useTableTheme> & {
11
+ gridTemplateColumns: string;
12
+ className?: string;
13
+ }
14
+ >;
15
+
16
+ export function Table({gridTemplateColumns, className, children}: TableProps) {
17
+ let theme = useTableTheme();
18
+
19
+ return (
20
+ <div className={theme.root(null, className)}>
21
+ <div
22
+ className={theme.table(null, className)}
23
+ style={{
24
+ gridTemplateColumns,
25
+ }}
26
+ >
27
+ {children}
28
+ </div>
29
+ </div>
30
+ );
31
+ }
@@ -0,0 +1,17 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
4
+
5
+ export const useTableCellTheme = createComponentTheme('TableCell');
6
+
7
+ export type TableCellProps = PropsWithChildren<
8
+ ComponentProps<typeof useTableCellTheme> & {
9
+ className?: string;
10
+ }
11
+ >;
12
+
13
+ export function TableCell({className, children}: TableCellProps) {
14
+ let theme = useTableCellTheme();
15
+
16
+ return <div className={theme(null, className)}>{children}</div>;
17
+ }
@@ -0,0 +1,19 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
4
+
5
+ export const useTableHeaderTheme = createComponentTheme('TableHeader');
6
+
7
+ export type TableHeaderProps = PropsWithChildren<
8
+ ComponentProps<typeof useTableHeaderTheme> & {
9
+ className?: string;
10
+ }
11
+ >;
12
+
13
+ export function TableHeader({className, children}: TableHeaderProps) {
14
+ // let theme = useTableHeaderTheme();
15
+
16
+ // eslint-disable-next-line react/jsx-no-useless-fragment -- false positive
17
+ return <>{children}</>;
18
+ // return <div className={theme(null, className)}>{children}</div>;
19
+ }
@@ -0,0 +1,17 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
4
+
5
+ export const useTableHeaderCellTheme = createComponentTheme('TableHeaderCell');
6
+
7
+ export type TableHeaderCellProps = PropsWithChildren<
8
+ ComponentProps<typeof useTableHeaderCellTheme> & {
9
+ className?: string;
10
+ }
11
+ >;
12
+
13
+ export function TableHeaderCell({className, children}: TableHeaderCellProps) {
14
+ let theme = useTableHeaderCellTheme();
15
+
16
+ return <div className={theme(null, className)}>{children}</div>;
17
+ }
@@ -0,0 +1,17 @@
1
+ import {type PropsWithChildren} from 'react';
2
+
3
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
4
+
5
+ export const useTableRowTheme = createComponentTheme('TableRow');
6
+
7
+ export type TableRowProps = PropsWithChildren<
8
+ ComponentProps<typeof useTableRowTheme> & {
9
+ className?: string;
10
+ }
11
+ >;
12
+
13
+ export function TableRow({className, children}: TableRowProps) {
14
+ let theme = useTableRowTheme();
15
+
16
+ return <div className={theme(null, className)}>{children}</div>;
17
+ }
@@ -0,0 +1,142 @@
1
+ import {Textarea as HeadlessTextarea} from '@headlessui/react';
2
+ import {
3
+ type ChangeEvent,
4
+ type ComponentType,
5
+ type ElementType,
6
+ type FocusEvent,
7
+ forwardRef,
8
+ type Ref,
9
+ useCallback,
10
+ } from 'react';
11
+
12
+ import {type ComponentProps, createComponentTheme} from '../theme/internals.js';
13
+ import {useFieldName, useForm} from './internals.js';
14
+
15
+ export const useTextareaTheme = createComponentTheme('Textarea', {
16
+ variants: {
17
+ disabled: [true, false],
18
+ },
19
+ elements: ['root', 'input', 'icon'],
20
+ });
21
+
22
+ export type TextareaProps = ComponentProps<typeof useTextareaTheme> & {
23
+ type?: 'number' | 'text' | undefined;
24
+ name?: string | undefined;
25
+ value?: number | string | undefined;
26
+ className?: string | undefined;
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed
28
+ icon?: ComponentType<any> | undefined;
29
+ onChange?: ((value: string) => void) | undefined;
30
+ onBlur?: ((value: string) => void) | undefined;
31
+ placeholder?: string | undefined;
32
+ };
33
+
34
+ export const Textarea = forwardRef(
35
+ <T extends ElementType = 'textarea'>(
36
+ {
37
+ type = 'text',
38
+ name,
39
+ value,
40
+ className,
41
+ disabled = false,
42
+ icon: Icon,
43
+ onChange,
44
+ onBlur,
45
+ placeholder,
46
+ }: TextareaProps,
47
+ ref: Ref<T>,
48
+ ) => {
49
+ let theme = useTextareaTheme({disabled});
50
+ let form = useForm();
51
+ let fieldName = useFieldName();
52
+
53
+ let handleChange = useCallback(
54
+ (event: ChangeEvent<HTMLTextAreaElement>) => {
55
+ onChange?.(event.target.value);
56
+ },
57
+ [onChange],
58
+ );
59
+
60
+ let handleBlur = useCallback(
61
+ (event: FocusEvent<HTMLTextAreaElement>) => {
62
+ onBlur?.(event.target.value);
63
+ },
64
+ [onBlur],
65
+ );
66
+
67
+ let rootProps: Record<string, unknown> = {
68
+ className: theme.root('relative', className),
69
+ type,
70
+ disabled,
71
+ };
72
+
73
+ let inputProps: Record<string, unknown> = {
74
+ className: theme.input(null, className),
75
+ type,
76
+ disabled,
77
+ placeholder,
78
+ ref,
79
+ };
80
+
81
+ if (Icon) {
82
+ rootProps['data-headlessui-icon'] = '';
83
+ inputProps['data-headlessui-icon'] = '';
84
+ }
85
+
86
+ if (fieldName && form && !name) {
87
+ if (ref) {
88
+ let register = form.register(fieldName, {
89
+ valueAsNumber: type === 'number',
90
+ });
91
+
92
+ inputProps = {
93
+ ...inputProps,
94
+ ...register,
95
+ };
96
+ inputProps.ref = (instance: unknown) => {
97
+ if (typeof ref === 'function') {
98
+ throw new TypeError("Ref can't be a function!");
99
+ }
100
+
101
+ // @ts-expect-error -- we need to assign, and it actually works
102
+ // eslint-disable-next-line no-param-reassign -- needed
103
+ ref.current = instance;
104
+
105
+ register.ref(instance);
106
+ };
107
+ } else {
108
+ inputProps = {
109
+ ...inputProps,
110
+ ...form.register(fieldName, {
111
+ valueAsNumber: type === 'number',
112
+ }),
113
+ };
114
+ }
115
+
116
+ return (
117
+ <span {...rootProps}>
118
+ <HeadlessTextarea {...inputProps} />
119
+ {Icon ?
120
+ <Icon className={theme.icon('absolute')} />
121
+ : null}
122
+ </span>
123
+ );
124
+ }
125
+
126
+ return (
127
+ <span {...rootProps}>
128
+ <HeadlessTextarea
129
+ name={name ?? ''}
130
+ value={String(value ?? '')}
131
+ placeholder={placeholder}
132
+ onChange={handleChange}
133
+ onBlur={handleBlur}
134
+ {...inputProps}
135
+ />
136
+ {Icon ?
137
+ <Icon className={theme.icon('absolute')} />
138
+ : null}
139
+ </span>
140
+ );
141
+ },
142
+ );
@@ -0,0 +1,3 @@
1
+ import {createContext} from 'react';
2
+
3
+ export const fieldNameContext = createContext<string | undefined>(undefined);
@@ -0,0 +1,4 @@
1
+ import {createContext} from 'react';
2
+ import {type UseFormReturn} from 'react-hook-form';
3
+
4
+ export const formContext = createContext<UseFormReturn | undefined>(undefined);
@@ -0,0 +1,19 @@
1
+ import {type Control, useController} from 'react-hook-form';
2
+
3
+ import {useFieldName} from './useFieldName.js';
4
+ import {useForm} from './useForm.js';
5
+
6
+ export function useField() {
7
+ let name = useFieldName();
8
+ let form = useForm();
9
+ let {field, fieldState} = useController({
10
+ name: name ?? '',
11
+ control: form?.control as Control, // TODO: `useControllel` doesn't accept `undefined` and cannot be called conditionally :(
12
+ });
13
+
14
+ if (!name || !form) {
15
+ return undefined;
16
+ }
17
+
18
+ return {name, props: field, state: fieldState, form};
19
+ }
@@ -0,0 +1,7 @@
1
+ import {useContext} from 'react';
2
+
3
+ import {fieldNameContext} from './fieldNameContext.js';
4
+
5
+ export function useFieldName() {
6
+ return useContext(fieldNameContext);
7
+ }
@@ -0,0 +1,7 @@
1
+ import {useContext} from 'react';
2
+
3
+ import {formContext} from './formContext.js';
4
+
5
+ export function useForm() {
6
+ return useContext(formContext);
7
+ }
@@ -0,0 +1,5 @@
1
+ export * from './internals/fieldNameContext.js';
2
+ export * from './internals/formContext.js';
3
+ export * from './internals/useField.js';
4
+ export * from './internals/useFieldName.js';
5
+ export * from './internals/useForm.js';
@@ -0,0 +1,32 @@
1
+ export * from './components/Button.js';
2
+ export * from './components/Card.js';
3
+ export * from './components/Checkbox.js';
4
+ export * from './components/CheckboxField.js';
5
+ export * from './components/Combobox.js';
6
+ export * from './components/ConfirmDialog.js';
7
+ export * from './components/Dialog.js';
8
+ export * from './components/DialogPanel.js';
9
+ export * from './components/DialogTitle.js';
10
+ export * from './components/Error.js';
11
+ export * from './components/Field.js';
12
+ export * from './components/Form.js';
13
+ export * from './components/Input.js';
14
+ export * from './components/Label.js';
15
+ export * from './components/Listbox.js';
16
+ export * from './components/Menu.js';
17
+ export * from './components/MenuButton.js';
18
+ export * from './components/MenuItem.js';
19
+ export * from './components/MenuItems.js';
20
+ export * from './components/Popover.js';
21
+ export * from './components/PopoverButton.js';
22
+ export * from './components/PopoverPanel.js';
23
+ export * from './components/Radio.js';
24
+ export * from './components/RadioField.js';
25
+ export * from './components/RadioGroupField.js';
26
+ export * from './components/Spinner.js';
27
+ export * from './components/Table.js';
28
+ export * from './components/TableCell.js';
29
+ export * from './components/TableHeader.js';
30
+ export * from './components/TableHeaderCell.js';
31
+ export * from './components/TableRow.js';
32
+ export * from './components/Textarea.js';
@@ -0,0 +1,153 @@
1
+ import {type Config as TailwindConfig} from 'tailwindcss';
2
+ // TODO: fix this when Tailwind CSS v4 is released
3
+ // @ts-expect-error -- Tailwind CSS v3 is missing `exports` field in the package.json file, and it won't be added
4
+ import tailwindPlugin from 'tailwindcss/plugin';
5
+ import type TailwindPlugin from 'tailwindcss/plugin.d.ts';
6
+
7
+ import {DEFAULT_STOP, type DEFAULT_STOPS} from './internals/constants.js';
8
+ import {createPalette} from './internals/createPalette.js';
9
+ import {resolveModule} from './internals/resolveModule.js';
10
+
11
+ const PREFIX = 'ui';
12
+
13
+ let plugin = tailwindPlugin as typeof TailwindPlugin;
14
+
15
+ export type CreateTailwindConfigOptions = {
16
+ content?: string[] | undefined;
17
+ colors?: Record<
18
+ string,
19
+ | string
20
+ | {
21
+ swatches: Array<{hex: string; stop: (typeof DEFAULT_STOPS)[number]}>;
22
+ hueShift?: number;
23
+ saturationShift?: number;
24
+ }
25
+ | {hex: string; hueShift?: number; saturationShift?: number}
26
+ >;
27
+ };
28
+
29
+ export function createTailwindConfig({
30
+ content = ['./{.storybook,app,source,stories}/**/*.{js,jsx,ts,tsx,mdx}'],
31
+ colors,
32
+ }: CreateTailwindConfigOptions = {}): TailwindConfig {
33
+ let themeColors = {
34
+ transparent: 'transparent',
35
+ current: 'currentColor',
36
+ white: '#fff',
37
+ black: '#000',
38
+ };
39
+
40
+ for (let [name, color] of Object.entries(colors ?? {})) {
41
+ if (typeof color === 'string') {
42
+ themeColors = {
43
+ ...themeColors,
44
+ ...createPalette({
45
+ name,
46
+ swatches: [
47
+ {
48
+ hex: color,
49
+ stop: DEFAULT_STOP,
50
+ },
51
+ ],
52
+ hueShift: 0,
53
+ saturationShift: 0,
54
+ }),
55
+ };
56
+ } else if ('swatches' in color) {
57
+ themeColors = {
58
+ ...themeColors,
59
+ ...createPalette({
60
+ name,
61
+ swatches: color.swatches,
62
+ hueShift: color.hueShift ?? 0,
63
+ saturationShift: color.saturationShift ?? 0,
64
+ }),
65
+ };
66
+ } else if ('hex' in color) {
67
+ themeColors = {
68
+ ...themeColors,
69
+ ...createPalette({
70
+ name,
71
+ swatches: [{hex: color.hex, stop: DEFAULT_STOP}],
72
+ hueShift: color.hueShift ?? 0,
73
+ saturationShift: color.saturationShift ?? 0,
74
+ }),
75
+ };
76
+ }
77
+ }
78
+
79
+ let resolvedContent = [];
80
+
81
+ for (let contentPath of content) {
82
+ if (contentPath.startsWith('.') || contentPath.startsWith('/')) {
83
+ resolvedContent.push(contentPath);
84
+ } else if (typeof document !== 'undefined') {
85
+ resolvedContent.push(`${resolveModule(contentPath)}/**`);
86
+ }
87
+ }
88
+
89
+ return {
90
+ content: resolvedContent,
91
+ theme: {
92
+ colors: themeColors,
93
+ extend: {
94
+ spacing: {
95
+ 13: '3.25rem',
96
+ 15: '3.75',
97
+ 17: '4.25rem',
98
+ 18: '4.5rem',
99
+ 19: '4.75rem',
100
+ 21: '5.25rem',
101
+ 22: '5.5rem',
102
+ 23: '5.75rem',
103
+ 25: '6.25rem',
104
+ 26: '6.5rem',
105
+ 27: '6.75rem',
106
+ 29: '6.25rem',
107
+ 30: '7.5rem',
108
+ 34: '8.5rem',
109
+ 38: '9.5rem',
110
+ 40: '10rem',
111
+ },
112
+ fontFamily: {
113
+ sans: [
114
+ 'InterVariable',
115
+ 'ui-sans-serif',
116
+ 'system-ui',
117
+ 'sans-serif',
118
+ '"Apple Color Emoji"',
119
+ '"Segoe UI Emoji"',
120
+ '"Segoe UI Symbol"',
121
+ '"Noto Color Emoji"',
122
+ ],
123
+ },
124
+ },
125
+ },
126
+ future: {
127
+ hoverOnlyWhenSupported: true,
128
+ },
129
+ plugins: [
130
+ plugin(({addVariant}) => {
131
+ for (let state of ['open', 'checked', 'selected', 'active', 'disabled']) {
132
+ addVariant(`${PREFIX}-${state}`, [
133
+ `&[data-headlessui-state~="${state}"]`,
134
+ `:where([data-headlessui-state~="${state}"]) &`,
135
+ ]);
136
+
137
+ addVariant(`${PREFIX}-not-${state}`, [
138
+ `&[data-headlessui-state]:not([data-headlessui-state~="${state}"])`,
139
+ `:where([data-headlessui-state]:not([data-headlessui-state~="${state}"])) &:not([data-headlessui-state])`,
140
+ ]);
141
+ }
142
+
143
+ addVariant(`${PREFIX}-focus-visible`, ':where([data-headlessui-focus-visible]) &:focus');
144
+ addVariant(
145
+ `${PREFIX}-not-focus-visible`,
146
+ '&:focus:where(:not([data-headlessui-focus-visible] &))',
147
+ );
148
+ }),
149
+ ],
150
+ };
151
+ }
152
+
153
+ // plugins based on https://github.com/tailwindlabs/headlessui/tree/626a253dcf09589e2a2fbbfd0c279120153394cc/packages/@headlessui-tailwindcss (see https://github.com/tailwindlabs/headlessui/blob/626a253dcf09589e2a2fbbfd0c279120153394cc/packages/%40headlessui-tailwindcss/LICENSE for license)