@jakubmazanec/ui 0.1.0-unstable.0c19abe → 0.1.0-unstable.13c5aaa

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 (298) hide show
  1. package/README.md +6 -1
  2. package/build/components/Button.d.ts +23 -9
  3. package/build/components/Button.js +82 -22
  4. package/build/components/Button.js.map +3 -3
  5. package/build/components/Card.d.ts +9 -3
  6. package/build/components/Card.js +9 -2
  7. package/build/components/Card.js.map +2 -2
  8. package/build/components/Checkbox.d.ts +23 -8
  9. package/build/components/Checkbox.js +75 -53
  10. package/build/components/Checkbox.js.map +3 -3
  11. package/build/components/CheckboxField.d.ts +12 -5
  12. package/build/components/CheckboxField.js +11 -3
  13. package/build/components/CheckboxField.js.map +2 -2
  14. package/build/components/Combobox.d.ts +40 -16
  15. package/build/components/Combobox.js +168 -110
  16. package/build/components/Combobox.js.map +3 -3
  17. package/build/components/ComboboxOption.d.ts +33 -0
  18. package/build/components/ComboboxOption.js +58 -0
  19. package/build/components/ComboboxOption.js.map +7 -0
  20. package/build/components/Description.d.ts +11 -0
  21. package/build/components/Description.js +15 -0
  22. package/build/components/Description.js.map +7 -0
  23. package/build/components/Dialog.d.ts +3 -2
  24. package/build/components/Dialog.js +15 -4
  25. package/build/components/Dialog.js.map +2 -2
  26. package/build/components/DialogPanel.d.ts +2 -1
  27. package/build/components/DialogPanel.js +8 -3
  28. package/build/components/DialogPanel.js.map +2 -2
  29. package/build/components/DialogTitle.d.ts +2 -1
  30. package/build/components/DialogTitle.js +8 -3
  31. package/build/components/DialogTitle.js.map +2 -2
  32. package/build/components/Error.d.ts +2 -1
  33. package/build/components/Error.js +8 -3
  34. package/build/components/Error.js.map +2 -2
  35. package/build/components/Field.d.ts +12 -5
  36. package/build/components/Field.js +11 -3
  37. package/build/components/Field.js.map +2 -2
  38. package/build/components/Fieldset.d.ts +17 -0
  39. package/build/components/Fieldset.js +25 -0
  40. package/build/components/Fieldset.js.map +7 -0
  41. package/build/components/Form.d.ts +6 -6
  42. package/build/components/Form.js +11 -5
  43. package/build/components/Form.js.map +2 -2
  44. package/build/components/Icon.d.ts +29 -0
  45. package/build/components/Icon.js +58 -0
  46. package/build/components/Icon.js.map +7 -0
  47. package/build/components/Input.d.ts +14 -19
  48. package/build/components/Input.js +70 -88
  49. package/build/components/Input.js.map +2 -2
  50. package/build/components/Label.d.ts +2 -1
  51. package/build/components/Label.js +7 -2
  52. package/build/components/Label.js.map +2 -2
  53. package/build/components/Legend.d.ts +11 -0
  54. package/build/components/Legend.js +15 -0
  55. package/build/components/Legend.js.map +7 -0
  56. package/build/components/Listbox.d.ts +42 -15
  57. package/build/components/Listbox.js +224 -68
  58. package/build/components/Listbox.js.map +3 -3
  59. package/build/components/ListboxOption.d.ts +33 -0
  60. package/build/components/ListboxOption.js +58 -0
  61. package/build/components/ListboxOption.js.map +7 -0
  62. package/build/components/Menu.d.ts +15 -4
  63. package/build/components/Menu.js +22 -5
  64. package/build/components/Menu.js.map +2 -2
  65. package/build/components/MenuButton.d.ts +23 -6
  66. package/build/components/MenuButton.js +38 -6
  67. package/build/components/MenuButton.js.map +2 -2
  68. package/build/components/MenuHeading.d.ts +19 -0
  69. package/build/components/MenuHeading.js +25 -0
  70. package/build/components/MenuHeading.js.map +7 -0
  71. package/build/components/MenuItem.d.ts +23 -6
  72. package/build/components/MenuItem.js +26 -6
  73. package/build/components/MenuItem.js.map +2 -2
  74. package/build/components/MenuItems.d.ts +16 -4
  75. package/build/components/MenuItems.js +31 -6
  76. package/build/components/MenuItems.js.map +2 -2
  77. package/build/components/MenuSection.d.ts +19 -0
  78. package/build/components/MenuSection.js +25 -0
  79. package/build/components/MenuSection.js.map +7 -0
  80. package/build/components/MenuSeparator.d.ts +19 -0
  81. package/build/components/MenuSeparator.js +25 -0
  82. package/build/components/MenuSeparator.js.map +7 -0
  83. package/build/components/Popover.d.ts +13 -4
  84. package/build/components/Popover.js +20 -5
  85. package/build/components/Popover.js.map +2 -2
  86. package/build/components/PopoverBackdrop.d.ts +19 -0
  87. package/build/components/PopoverBackdrop.js +25 -0
  88. package/build/components/PopoverBackdrop.js.map +7 -0
  89. package/build/components/PopoverButton.d.ts +25 -9
  90. package/build/components/PopoverButton.js +30 -14
  91. package/build/components/PopoverButton.js.map +2 -2
  92. package/build/components/PopoverGroup.d.ts +19 -0
  93. package/build/components/PopoverGroup.js +25 -0
  94. package/build/components/PopoverGroup.js.map +7 -0
  95. package/build/components/PopoverPanel.d.ts +17 -9
  96. package/build/components/PopoverPanel.js +30 -17
  97. package/build/components/PopoverPanel.js.map +2 -2
  98. package/build/components/Radio.d.ts +18 -9
  99. package/build/components/Radio.js +47 -30
  100. package/build/components/Radio.js.map +2 -2
  101. package/build/components/RadioField.d.ts +3 -2
  102. package/build/components/RadioField.js +7 -6
  103. package/build/components/RadioField.js.map +2 -2
  104. package/build/components/RadioGroup.d.ts +34 -0
  105. package/build/components/RadioGroup.js +85 -0
  106. package/build/components/RadioGroup.js.map +7 -0
  107. package/build/components/Spinner.d.ts +20 -6
  108. package/build/components/Spinner.js +65 -47
  109. package/build/components/Spinner.js.map +2 -2
  110. package/build/components/Table.d.ts +10 -13
  111. package/build/components/Table.js +10 -15
  112. package/build/components/Table.js.map +2 -2
  113. package/build/components/TableBody.d.ts +11 -0
  114. package/build/components/TableBody.js +14 -0
  115. package/build/components/TableBody.js.map +7 -0
  116. package/build/components/TableCaption.d.ts +11 -0
  117. package/build/components/TableCaption.js +14 -0
  118. package/build/components/TableCaption.js.map +7 -0
  119. package/build/components/TableCell.d.ts +2 -1
  120. package/build/components/TableCell.js +7 -2
  121. package/build/components/TableCell.js.map +2 -2
  122. package/build/components/TableFoot.d.ts +11 -0
  123. package/build/components/TableFoot.js +14 -0
  124. package/build/components/TableFoot.js.map +7 -0
  125. package/build/components/TableHead.d.ts +11 -0
  126. package/build/components/TableHead.js +14 -0
  127. package/build/components/TableHead.js.map +7 -0
  128. package/build/components/TableHeader.d.ts +7 -4
  129. package/build/components/TableHeader.js +11 -4
  130. package/build/components/TableHeader.js.map +2 -2
  131. package/build/components/TableRow.d.ts +2 -1
  132. package/build/components/TableRow.js +7 -2
  133. package/build/components/TableRow.js.map +2 -2
  134. package/build/components/Text.d.ts +11 -0
  135. package/build/components/Text.js +14 -0
  136. package/build/components/Text.js.map +7 -0
  137. package/build/components/Textarea.d.ts +15 -20
  138. package/build/components/Textarea.js +48 -75
  139. package/build/components/Textarea.js.map +2 -2
  140. package/build/components/internals/fieldContext.d.ts +3 -0
  141. package/build/components/internals/fieldContext.js +4 -0
  142. package/build/components/internals/fieldContext.js.map +7 -0
  143. package/build/components/internals/fieldNameContext.d.ts +2 -1
  144. package/build/components/internals/fieldNameContext.js.map +2 -2
  145. package/build/components/internals/filterProps.d.ts +2 -0
  146. package/build/components/internals/filterProps.js +9 -0
  147. package/build/components/internals/filterProps.js.map +7 -0
  148. package/build/components/internals/formIdContext.d.ts +2 -0
  149. package/build/components/internals/formIdContext.js +4 -0
  150. package/build/components/internals/formIdContext.js.map +7 -0
  151. package/build/components/internals/forwardRef.d.ts +4 -0
  152. package/build/components/internals/forwardRef.js +6 -0
  153. package/build/components/internals/forwardRef.js.map +7 -0
  154. package/build/components/internals/useFormId.d.ts +1 -0
  155. package/build/components/internals/useFormId.js +7 -0
  156. package/build/components/internals/useFormId.js.map +7 -0
  157. package/build/components/internals.d.ts +5 -4
  158. package/build/components/internals.js +5 -4
  159. package/build/components/internals.js.map +2 -2
  160. package/build/components/useField.d.ts +1 -0
  161. package/build/components/useField.js +7 -0
  162. package/build/components/useField.js.map +7 -0
  163. package/build/components/useFieldName.d.ts +1 -0
  164. package/build/components/{internals/useFieldName.js → useFieldName.js} +1 -1
  165. package/build/components/useFieldName.js.map +7 -0
  166. package/build/components/useForm.d.ts +10 -0
  167. package/build/components/useForm.js +18 -0
  168. package/build/components/useForm.js.map +7 -0
  169. package/build/components.d.ts +20 -3
  170. package/build/components.js +20 -3
  171. package/build/components.js.map +2 -2
  172. package/build/development/createTailwindConfig.js +68 -6
  173. package/build/development/createTailwindConfig.js.map +2 -2
  174. package/build/development.d.ts +0 -1
  175. package/build/development.js +0 -1
  176. package/build/development.js.map +2 -2
  177. package/build/main.d.ts +0 -2
  178. package/build/main.js +0 -2
  179. package/build/main.js.map +2 -2
  180. package/build/{fonts.css → styles.css} +9 -1
  181. package/build/{fonts.css.map → styles.css.map} +3 -3
  182. package/build/theme/Theme.d.ts +113 -12
  183. package/build/theme/defaultTheme.js +94 -327
  184. package/build/theme/defaultTheme.js.map +2 -2
  185. package/build/theme/internals/ComponentTheme.d.ts +11 -1
  186. package/build/theme/internals/ComponentWithTheme.d.ts +5 -0
  187. package/build/theme/internals/ComponentWithTheme.js +2 -0
  188. package/build/theme/internals/cx.js.map +2 -2
  189. package/build/theme/internals/themeContext.d.ts +158 -47
  190. package/build/theme/internals/useTheme.d.ts +158 -47
  191. package/build/theme/internals.d.ts +1 -0
  192. package/build/theme/internals.js +1 -0
  193. package/build/theme/internals.js.map +2 -2
  194. package/package.json +24 -22
  195. package/source/components/Button.tsx +139 -0
  196. package/source/components/Card.tsx +21 -6
  197. package/source/components/Checkbox.tsx +109 -61
  198. package/source/components/CheckboxField.tsx +36 -7
  199. package/source/components/Combobox.tsx +285 -146
  200. package/source/components/ComboboxOption.tsx +94 -0
  201. package/source/components/Description.tsx +30 -0
  202. package/source/components/Dialog.tsx +19 -5
  203. package/source/components/DialogPanel.tsx +12 -3
  204. package/source/components/DialogTitle.tsx +11 -3
  205. package/source/components/Error.tsx +12 -4
  206. package/source/components/Field.tsx +35 -7
  207. package/source/components/Fieldset.tsx +41 -0
  208. package/source/components/Form.tsx +22 -13
  209. package/source/components/Icon.tsx +95 -0
  210. package/source/components/Input.tsx +95 -115
  211. package/source/components/Label.tsx +14 -2
  212. package/source/components/Legend.tsx +30 -0
  213. package/source/components/Listbox.tsx +362 -97
  214. package/source/components/ListboxOption.tsx +94 -0
  215. package/source/components/Menu.tsx +39 -11
  216. package/source/components/MenuButton.tsx +57 -11
  217. package/source/components/MenuHeading.tsx +47 -0
  218. package/source/components/MenuItem.tsx +45 -12
  219. package/source/components/MenuItems.tsx +52 -11
  220. package/source/components/MenuSection.tsx +47 -0
  221. package/source/components/MenuSeparator.tsx +47 -0
  222. package/source/components/Popover.tsx +39 -10
  223. package/source/components/PopoverBackdrop.tsx +49 -0
  224. package/source/components/PopoverButton.tsx +47 -25
  225. package/source/components/PopoverGroup.tsx +47 -0
  226. package/source/components/PopoverPanel.tsx +52 -26
  227. package/source/components/Radio.tsx +77 -36
  228. package/source/components/RadioField.tsx +11 -18
  229. package/source/components/RadioGroup.tsx +145 -0
  230. package/source/components/Spinner.tsx +47 -23
  231. package/source/components/Table.tsx +21 -20
  232. package/source/components/TableBody.tsx +25 -0
  233. package/source/components/TableCaption.tsx +25 -0
  234. package/source/components/TableCell.tsx +10 -2
  235. package/source/components/TableFoot.tsx +25 -0
  236. package/source/components/TableHead.tsx +25 -0
  237. package/source/components/TableHeader.tsx +23 -10
  238. package/source/components/TableRow.tsx +10 -2
  239. package/source/components/Text.tsx +29 -0
  240. package/source/components/Textarea.tsx +64 -103
  241. package/source/components/internals/fieldContext.ts +4 -0
  242. package/source/components/internals/fieldNameContext.ts +3 -1
  243. package/source/components/internals/filterProps.ts +9 -0
  244. package/source/components/internals/formIdContext.ts +3 -0
  245. package/source/components/internals/forwardRef.ts +7 -0
  246. package/source/components/internals/useFormId.ts +7 -0
  247. package/source/components/internals.ts +5 -4
  248. package/source/components/useField.ts +7 -0
  249. package/source/components/{internals/useFieldName.ts → useFieldName.ts} +1 -1
  250. package/source/components/useForm.ts +23 -0
  251. package/source/components.ts +20 -3
  252. package/source/development/createTailwindConfig.ts +69 -6
  253. package/source/development.ts +0 -1
  254. package/source/main.ts +0 -5
  255. package/source/{fonts.css → styles.css} +10 -0
  256. package/source/theme/Theme.ts +66 -40
  257. package/source/theme/defaultTheme.ts +94 -366
  258. package/source/theme/internals/ComponentTheme.ts +18 -1
  259. package/source/theme/internals/ComponentWithTheme.ts +6 -0
  260. package/source/theme/internals/cx.ts +1 -3
  261. package/source/theme/internals.ts +1 -0
  262. package/build/components/ConfirmDialog.d.ts +0 -23
  263. package/build/components/ConfirmDialog.js +0 -40
  264. package/build/components/ConfirmDialog.js.map +0 -7
  265. package/build/components/RadioGroupField.d.ts +0 -20
  266. package/build/components/RadioGroupField.js +0 -82
  267. package/build/components/RadioGroupField.js.map +0 -7
  268. package/build/components/TableHeaderCell.d.ts +0 -10
  269. package/build/components/TableHeaderCell.js +0 -9
  270. package/build/components/TableHeaderCell.js.map +0 -7
  271. package/build/components/internals/formContext.d.ts +0 -3
  272. package/build/components/internals/formContext.js +0 -4
  273. package/build/components/internals/formContext.js.map +0 -7
  274. package/build/components/internals/useField.d.ts +0 -6
  275. package/build/components/internals/useField.js +0 -18
  276. package/build/components/internals/useField.js.map +0 -7
  277. package/build/components/internals/useFieldName.d.ts +0 -1
  278. package/build/components/internals/useFieldName.js.map +0 -7
  279. package/build/components/internals/useForm.d.ts +0 -1
  280. package/build/components/internals/useForm.js +0 -7
  281. package/build/components/internals/useForm.js.map +0 -7
  282. package/build/development/defaultTailwindConfig.d.ts +0 -72
  283. package/build/development/defaultTailwindConfig.js +0 -45
  284. package/build/development/defaultTailwindConfig.js.map +0 -7
  285. package/build/inter-variable-italic.js +0 -2
  286. package/build/inter-variable.js +0 -2
  287. package/build/inter-variable.js.map +0 -7
  288. package/source/components/Button.ts +0 -74
  289. package/source/components/ConfirmDialog.tsx +0 -67
  290. package/source/components/RadioGroupField.tsx +0 -101
  291. package/source/components/TableHeaderCell.tsx +0 -17
  292. package/source/components/internals/formContext.ts +0 -4
  293. package/source/components/internals/useField.ts +0 -19
  294. package/source/components/internals/useForm.ts +0 -7
  295. package/source/development/defaultTailwindConfig.ts +0 -45
  296. /package/build/{inter-variable-italic-54HMV74W.woff2 → inter-variable-italic.woff2} +0 -0
  297. /package/build/{inter-variable-75YQYCJN.woff2 → inter-variable.woff2} +0 -0
  298. /package/build/{inter-variable-italic.js.map → theme/internals/ComponentWithTheme.js.map} +0 -0
package/README.md CHANGED
@@ -24,12 +24,17 @@ It cannot be required from a CommonJS module.
24
24
 
25
25
  ## Usage
26
26
 
27
- 🚧 This section is under development. Please check back later for updates.
27
+ ⚠️ This is an incomplete package! Expect a lot of breaking changes before the version 1.0.0 release.
28
+
29
+ Opinionated, pre-styled, but customizable component library based on React, Headless UI, Tailwind
30
+ CSS and Conform, made for very fast UI creation.
28
31
 
29
32
  ## Documentation
30
33
 
31
34
  See [API reference](./docs) for auto-generated documentation.
32
35
 
36
+ See [Storybook](https://www.chromatic.com/library?appId=666f2dc8033dde8c47f6a278) for preview.
37
+
33
38
  ## Contributing
34
39
 
35
40
  If you want to contribute, see [CONTRIBUTING](./CONTRIBUTING.md) for details.
@@ -1,24 +1,38 @@
1
- import { type ComponentPropsWithoutRef, type ElementType, type PropsWithChildren } from 'react';
2
- import { type ComponentProps } from '../theme/internals.js';
1
+ import { type ButtonProps as HeadlessButtonProps } from '@headlessui/react';
2
+ import { type ComponentPropsWithoutRef, type ElementType, type Ref } from 'react';
3
+ import { type ComponentProps, type ComponentTheme } from '../theme/internals.js';
3
4
  export declare const useButtonTheme: ((themeProps: {
4
- readonly type: "text" | "icon" | "solid" | "outline";
5
+ readonly variant: "text" | "solid" | "outline";
5
6
  readonly size: "small" | "medium" | "large";
6
7
  readonly disabled: boolean;
7
8
  }) => (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string) & {
8
9
  componentThemeName: "Button";
9
10
  themeDefinition: {
10
11
  readonly variants: {
11
- readonly type: ["solid", "outline", "text", "icon"];
12
+ readonly variant: ["solid", "outline", "text"];
12
13
  readonly size: ["small", "medium", "large"];
13
14
  readonly disabled: [true, false];
14
15
  };
15
16
  };
16
17
  };
17
18
  export type ButtonProps<T extends ElementType> = ComponentProps<typeof useButtonTheme> & ComponentPropsWithoutRef<T> & {
18
- className?: string | undefined;
19
- submit?: boolean | undefined;
20
19
  as?: T | undefined;
21
- onClick?: (() => void) | undefined;
22
- 'aria-label'?: string | undefined;
20
+ submit?: boolean | undefined;
21
+ autoFocus?: boolean | undefined;
22
+ className?: string | undefined;
23
+ children?: HeadlessButtonProps['children'] | undefined;
23
24
  };
24
- export declare const Button: import("react").ForwardRefExoticComponent<Omit<PropsWithChildren<ButtonProps<ElementType>>, "ref"> & import("react").RefAttributes<"symbol" | "object" | "search" | "big" | "link" | "small" | "sub" | "sup" | "map" | "filter" | "progress" | "text" | import("react").ComponentClass<any, any> | import("react").FunctionComponent<any> | "a" | "abbr" | "address" | "area" | "article" | "aside" | "audio" | "b" | "base" | "bdi" | "bdo" | "blockquote" | "body" | "br" | "button" | "canvas" | "caption" | "center" | "cite" | "code" | "col" | "colgroup" | "data" | "datalist" | "dd" | "del" | "details" | "dfn" | "dialog" | "div" | "dl" | "dt" | "em" | "embed" | "fieldset" | "figcaption" | "figure" | "footer" | "form" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "head" | "header" | "hgroup" | "hr" | "html" | "i" | "iframe" | "img" | "input" | "ins" | "kbd" | "keygen" | "label" | "legend" | "li" | "main" | "mark" | "menu" | "menuitem" | "meta" | "meter" | "nav" | "noindex" | "noscript" | "ol" | "optgroup" | "option" | "output" | "p" | "param" | "picture" | "pre" | "q" | "rp" | "rt" | "ruby" | "s" | "samp" | "slot" | "script" | "section" | "select" | "source" | "span" | "strong" | "style" | "summary" | "table" | "template" | "tbody" | "td" | "textarea" | "tfoot" | "th" | "thead" | "time" | "title" | "tr" | "track" | "u" | "ul" | "var" | "video" | "wbr" | "webview" | "svg" | "animate" | "animateMotion" | "animateTransform" | "circle" | "clipPath" | "defs" | "desc" | "ellipse" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "foreignObject" | "g" | "image" | "line" | "linearGradient" | "marker" | "mask" | "metadata" | "mpath" | "path" | "pattern" | "polygon" | "polyline" | "radialGradient" | "rect" | "set" | "stop" | "switch" | "textPath" | "tspan" | "use" | "view">>;
25
+ export declare const Button: <T extends ElementType = "button">(props: Partial<import("@jakubmazanec/ts-utils").Writable<{
26
+ readonly variant: "text" | "solid" | "outline";
27
+ readonly size: "small" | "medium" | "large";
28
+ readonly disabled: boolean;
29
+ }>> & import("react").PropsWithoutRef<import("react").ComponentProps<T>> & {
30
+ as?: T | undefined;
31
+ submit?: boolean | undefined;
32
+ autoFocus?: boolean | undefined;
33
+ className?: string | undefined;
34
+ children?: HeadlessButtonProps['children'] | undefined;
35
+ } & {
36
+ ref?: Ref<HTMLElement> | undefined;
37
+ }) => import("react").ReactNode;
38
+ export declare const buttonTheme: ComponentTheme<typeof useButtonTheme>;
@@ -1,51 +1,111 @@
1
1
  "use strict";
2
+ import { jsx } from "react/jsx-runtime";
2
3
  import { Button as HeadlessButton } from "@headlessui/react";
3
4
  import {
4
- createElement,
5
- forwardRef,
6
- useCallback
5
+ Children,
6
+ cloneElement,
7
+ isValidElement
7
8
  } from "react";
8
- import { createComponentTheme } from "../theme/internals.js";
9
- import { useForm } from "./internals.js";
9
+ import {
10
+ createComponentTheme
11
+ } from "../theme/internals.js";
12
+ import { Icon } from "./Icon.js";
13
+ import { forwardRef } from "./internals.js";
14
+ import { Spinner } from "./Spinner.js";
10
15
  export const useButtonTheme = createComponentTheme("Button", {
11
16
  variants: {
12
- type: ["solid", "outline", "text", "icon"],
17
+ variant: ["solid", "outline", "text"],
13
18
  size: ["small", "medium", "large"],
14
19
  disabled: [true, false]
15
20
  }
16
21
  });
22
+ const BUTTON_ELEMENT = "button";
17
23
  export const Button = forwardRef(
18
24
  ({
19
- as,
20
- className,
21
- type = "solid",
25
+ variant = "solid",
22
26
  size = "medium",
23
27
  disabled = false,
28
+ as = BUTTON_ELEMENT,
24
29
  submit = false,
30
+ className,
25
31
  children,
26
- onClick,
27
32
  ...rest
28
33
  }, ref) => {
29
- let theme = useButtonTheme({ type, size, disabled });
30
- let form = useForm();
31
- let handleClick = useCallback(() => {
32
- onClick?.();
33
- }, [onClick]);
34
+ let theme = useButtonTheme({ variant, size, disabled });
34
35
  let props = {
36
+ as,
37
+ ref,
35
38
  className: theme(null, className),
36
- onClick: handleClick,
37
39
  disabled,
38
- ...rest,
39
- ref
40
+ ...rest
40
41
  };
41
- let element = as ?? "button";
42
- if (element === "button") {
42
+ if (as === BUTTON_ELEMENT) {
43
43
  props.type = "button";
44
44
  }
45
- if (form && submit) {
45
+ if (submit) {
46
46
  props.type = "submit";
47
47
  }
48
- return createElement(HeadlessButton, props, children);
48
+ if (typeof children === "function") {
49
+ return /* @__PURE__ */ jsx(HeadlessButton, { ...props, children });
50
+ }
51
+ let enhancedChildren = Children.map(children, (child) => {
52
+ if (isValidElement(child) && (child.type === Icon || child.type === Spinner)) {
53
+ return cloneElement(child, { "data-icon": "" });
54
+ }
55
+ return child;
56
+ });
57
+ return /* @__PURE__ */ jsx(HeadlessButton, { ...props, children: enhancedChildren });
49
58
  }
50
59
  );
60
+ export const buttonTheme = {
61
+ className: "rounded-2 flex items-center justify-center text-nowrap font-sans font-medium text-sm transition-colors",
62
+ variants: {
63
+ variant: {
64
+ solid: "bg-gray-900 text-white hover:bg-gray-800",
65
+ outline: "border-2 border-gray-100 hover:border-gray-200",
66
+ text: "border-2 border-transparent hover:border-gray-200"
67
+ },
68
+ size: {
69
+ small: "text-sm leading-6 px-2.5 h-8 gap-x-2 min-w-8",
70
+ medium: "leading-6 px-2.5 h-9 gap-x-2 min-w-9",
71
+ large: "text-lg leading-6 px-3 h-10 gap-x-2 min-w-10"
72
+ },
73
+ disabled: {
74
+ true: "",
75
+ false: ""
76
+ }
77
+ },
78
+ compoundVariants: [
79
+ {
80
+ variant: "solid",
81
+ size: "small",
82
+ className: "px-3"
83
+ },
84
+ {
85
+ variant: "solid",
86
+ size: "medium",
87
+ className: "px-3"
88
+ },
89
+ {
90
+ variant: "solid",
91
+ size: "large",
92
+ className: "px-3.5"
93
+ },
94
+ {
95
+ variant: "solid",
96
+ disabled: true,
97
+ className: "bg-gray-200 text-white hover:bg-gray-200"
98
+ },
99
+ {
100
+ variant: "outline",
101
+ disabled: true,
102
+ className: "hover:border-gray-100 text-gray-200"
103
+ },
104
+ {
105
+ variant: "text",
106
+ disabled: true,
107
+ className: "hover:border-transparent text-gray-200"
108
+ }
109
+ ]
110
+ };
51
111
  //# sourceMappingURL=Button.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../source/components/Button.ts"],
4
- "sourcesContent": ["import {Button as HeadlessButton} from '@headlessui/react';\nimport {\n type ComponentPropsWithoutRef,\n createElement,\n type ElementType,\n forwardRef,\n type PropsWithChildren,\n type Ref,\n useCallback,\n} from 'react';\n\nimport {type ComponentProps, createComponentTheme} from '../theme/internals.js';\nimport {useForm} from './internals.js';\n\nexport const useButtonTheme = createComponentTheme('Button', {\n variants: {\n type: ['solid', 'outline', 'text', 'icon'],\n size: ['small', 'medium', 'large'],\n disabled: [true, false],\n },\n});\n\nexport type ButtonProps<T extends ElementType> = ComponentProps<typeof useButtonTheme> &\n ComponentPropsWithoutRef<T> & {\n className?: string | undefined;\n submit?: boolean | undefined;\n as?: T | undefined;\n onClick?: (() => void) | undefined;\n 'aria-label'?: string | undefined;\n };\n\nexport const Button = forwardRef(\n <T extends ElementType = 'button'>(\n {\n as,\n className,\n type = 'solid',\n size = 'medium',\n disabled = false,\n submit = false,\n children,\n onClick,\n ...rest\n }: PropsWithChildren<ButtonProps<T>>,\n ref: Ref<T>,\n ) => {\n let theme = useButtonTheme({type, size, disabled});\n let form = useForm();\n\n let handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n let props: Record<string, unknown> = {\n className: theme(null, className),\n onClick: handleClick,\n disabled,\n ...rest,\n ref,\n };\n\n let element = as ?? 'button';\n\n if (element === 'button') {\n props.type = 'button';\n }\n\n if (form && submit) {\n props.type = 'submit';\n }\n\n return createElement(HeadlessButton, props, children);\n },\n);\n"],
5
- "mappings": ";AAAA,SAAQ,UAAU,sBAAqB;AACvC;AAAA,EAEE;AAAA,EAEA;AAAA,EAGA;AAAA,OACK;AAEP,SAA6B,4BAA2B;AACxD,SAAQ,eAAc;AAEf,aAAM,iBAAiB,qBAAqB,UAAU;AAAA,EAC3D,UAAU;AAAA,IACR,MAAM,CAAC,SAAS,WAAW,QAAQ,MAAM;AAAA,IACzC,MAAM,CAAC,SAAS,UAAU,OAAO;AAAA,IACjC,UAAU,CAAC,MAAM,KAAK;AAAA,EACxB;AACF,CAAC;AAWM,aAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,QAAI,QAAQ,eAAe,EAAC,MAAM,MAAM,SAAQ,CAAC;AACjD,QAAI,OAAO,QAAQ;AAEnB,QAAI,cAAc,YAAY,MAAM;AAClC,gBAAU;AAAA,IACZ,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAI,QAAiC;AAAA,MACnC,WAAW,MAAM,MAAM,SAAS;AAAA,MAChC,SAAS;AAAA,MACT;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF;AAEA,QAAI,UAAU,MAAM;AAEpB,QAAI,YAAY,UAAU;AACxB,YAAM,OAAO;AAAA,IACf;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAM,OAAO;AAAA,IACf;AAEA,WAAO,cAAc,gBAAgB,OAAO,QAAQ;AAAA,EACtD;AACF;",
3
+ "sources": ["../../source/components/Button.tsx"],
4
+ "sourcesContent": ["import {Button as HeadlessButton, type ButtonProps as HeadlessButtonProps} from '@headlessui/react';\nimport {\n Children,\n cloneElement,\n type ComponentPropsWithoutRef,\n type ElementType,\n isValidElement,\n type Ref,\n} from 'react';\n\nimport {\n type ComponentProps,\n type ComponentTheme,\n createComponentTheme,\n} from '../theme/internals.js';\nimport {Icon} from './Icon.js';\nimport {forwardRef} from './internals.js';\nimport {Spinner} from './Spinner.js';\n\nexport const useButtonTheme = createComponentTheme('Button', {\n variants: {\n variant: ['solid', 'outline', 'text'],\n size: ['small', 'medium', 'large'],\n disabled: [true, false],\n },\n});\n\nconst BUTTON_ELEMENT = 'button';\n\nexport type ButtonProps<T extends ElementType> = ComponentProps<typeof useButtonTheme> &\n ComponentPropsWithoutRef<T> & {\n as?: T | undefined;\n submit?: boolean | undefined;\n autoFocus?: boolean | undefined;\n className?: string | undefined;\n children?: HeadlessButtonProps['children'] | undefined; // sadly, we cannot use `T`'s children type, because Headless UI always, if `children` is function, calls it with its own render props documented here: https://headlessui.com/react/button#using-render-props\n };\n\nexport const Button = forwardRef(\n <T extends ElementType = typeof BUTTON_ELEMENT>(\n {\n variant = 'solid',\n size = 'medium',\n disabled = false,\n as = BUTTON_ELEMENT as T,\n submit = false,\n className,\n children,\n ...rest\n }: ButtonProps<T>,\n ref: Ref<HTMLElement>,\n ) => {\n let theme = useButtonTheme({variant, size, disabled});\n\n let props: Record<string, unknown> = {\n as,\n ref,\n className: theme(null, className),\n disabled,\n ...rest,\n };\n\n if (as === BUTTON_ELEMENT) {\n props.type = 'button';\n }\n\n if (submit) {\n props.type = 'submit';\n }\n\n if (typeof children === 'function') {\n return <HeadlessButton {...props}>{children}</HeadlessButton>;\n }\n\n let enhancedChildren = Children.map(children, (child) => {\n if (isValidElement(child) && (child.type === Icon || child.type === Spinner)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed\n return cloneElement<any>(child, {'data-icon': ''});\n }\n\n return child;\n });\n\n return <HeadlessButton {...props}>{enhancedChildren}</HeadlessButton>;\n },\n);\n\nexport const buttonTheme: ComponentTheme<typeof useButtonTheme> = {\n className:\n 'rounded-2 flex items-center justify-center text-nowrap font-sans font-medium text-sm transition-colors',\n variants: {\n variant: {\n solid: 'bg-gray-900 text-white hover:bg-gray-800',\n outline: 'border-2 border-gray-100 hover:border-gray-200',\n text: 'border-2 border-transparent hover:border-gray-200',\n },\n size: {\n small: 'text-sm leading-6 px-2.5 h-8 gap-x-2 min-w-8',\n medium: 'leading-6 px-2.5 h-9 gap-x-2 min-w-9',\n large: 'text-lg leading-6 px-3 h-10 gap-x-2 min-w-10',\n },\n disabled: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n variant: 'solid',\n size: 'small',\n className: 'px-3',\n },\n {\n variant: 'solid',\n size: 'medium',\n className: 'px-3',\n },\n {\n variant: 'solid',\n size: 'large',\n className: 'px-3.5',\n },\n {\n variant: 'solid',\n disabled: true,\n className: 'bg-gray-200 text-white hover:bg-gray-200',\n },\n {\n variant: 'outline',\n disabled: true,\n className: 'hover:border-gray-100 text-gray-200',\n },\n {\n variant: 'text',\n disabled: true,\n className: 'hover:border-transparent text-gray-200',\n },\n ],\n};\n"],
5
+ "mappings": ";AAuEa;AAvEb,SAAQ,UAAU,sBAA8D;AAChF;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,OAEK;AAEP;AAAA,EAGE;AAAA,OACK;AACP,SAAQ,YAAW;AACnB,SAAQ,kBAAiB;AACzB,SAAQ,eAAc;AAEf,aAAM,iBAAiB,qBAAqB,UAAU;AAAA,EAC3D,UAAU;AAAA,IACR,SAAS,CAAC,SAAS,WAAW,MAAM;AAAA,IACpC,MAAM,CAAC,SAAS,UAAU,OAAO;AAAA,IACjC,UAAU,CAAC,MAAM,KAAK;AAAA,EACxB;AACF,CAAC;AAED,MAAM,iBAAiB;AAWhB,aAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,KAAK;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,QAAI,QAAQ,eAAe,EAAC,SAAS,MAAM,SAAQ,CAAC;AAEpD,QAAI,QAAiC;AAAA,MACnC;AAAA,MACA;AAAA,MACA,WAAW,MAAM,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,GAAG;AAAA,IACL;AAEA,QAAI,OAAO,gBAAgB;AACzB,YAAM,OAAO;AAAA,IACf;AAEA,QAAI,QAAQ;AACV,YAAM,OAAO;AAAA,IACf;AAEA,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,oBAAC,kBAAgB,GAAG,OAAQ,UAAS;AAAA,IAC9C;AAEA,QAAI,mBAAmB,SAAS,IAAI,UAAU,CAAC,UAAU;AACvD,UAAI,eAAe,KAAK,MAAM,MAAM,SAAS,QAAQ,MAAM,SAAS,UAAU;AAE5E,eAAO,aAAkB,OAAO,EAAC,aAAa,GAAE,CAAC;AAAA,MACnD;AAEA,aAAO;AAAA,IACT,CAAC;AAED,WAAO,oBAAC,kBAAgB,GAAG,OAAQ,4BAAiB;AAAA,EACtD;AACF;AAEO,aAAM,cAAqD;AAAA,EAChE,WACE;AAAA,EACF,UAAU;AAAA,IACR,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,11 @@
1
1
  import { type PropsWithChildren } from 'react';
2
- export type CardProps = {
3
- className?: string;
2
+ import { type ComponentProps, type ComponentTheme } from '../theme/internals.js';
3
+ export declare const useCardTheme: (() => (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string) & {
4
+ componentThemeName: "Card";
5
+ themeDefinition: undefined;
4
6
  };
5
- export declare function Card({ className, children }: PropsWithChildren<CardProps>): import("react/jsx-runtime").JSX.Element;
7
+ export type CardProps = PropsWithChildren<ComponentProps<typeof useCardTheme> & {
8
+ className?: string;
9
+ }>;
10
+ export declare function Card({ className, children }: CardProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare const cardTheme: ComponentTheme<typeof useCardTheme>;
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { twMerge } from "tailwind-merge";
3
+ import {
4
+ createComponentTheme
5
+ } from "../theme/internals.js";
6
+ export const useCardTheme = createComponentTheme("Card");
4
7
  export function Card({ className, children }) {
5
- return /* @__PURE__ */ jsx("div", { className: twMerge("rounded border border-gray-100 p-4", className), children });
8
+ let theme = useCardTheme();
9
+ return /* @__PURE__ */ jsx("div", { className: theme(null, className), children });
6
10
  }
11
+ export const cardTheme = {
12
+ className: "rounded-2 border border-gray-100 p-4"
13
+ };
7
14
  //# sourceMappingURL=Card.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/components/Card.tsx"],
4
- "sourcesContent": ["import {type PropsWithChildren} from 'react';\nimport {twMerge} from 'tailwind-merge';\n\nexport type CardProps = {\n className?: string;\n};\n\nexport function Card({className, children}: PropsWithChildren<CardProps>) {\n return <div className={twMerge('rounded border border-gray-100 p-4', className)}>{children}</div>;\n}\n"],
5
- "mappings": ";AAQS;AAPT,SAAQ,eAAc;AAMf,gBAAS,KAAK,EAAC,WAAW,SAAQ,GAAiC;AACxE,SAAO,oBAAC,SAAI,WAAW,QAAQ,sCAAsC,SAAS,GAAI,UAAS;AAC7F;",
4
+ "sourcesContent": ["import {type PropsWithChildren} from 'react';\n\nimport {\n type ComponentProps,\n type ComponentTheme,\n createComponentTheme,\n} from '../theme/internals.js';\n\nexport const useCardTheme = createComponentTheme('Card');\n\nexport type CardProps = PropsWithChildren<\n ComponentProps<typeof useCardTheme> & {\n className?: string;\n }\n>;\n\nexport function Card({className, children}: CardProps) {\n let theme = useCardTheme();\n\n return <div className={theme(null, className)}>{children}</div>;\n}\n\nexport const cardTheme: ComponentTheme<typeof useCardTheme> = {\n className: 'rounded-2 border border-gray-100 p-4',\n};\n"],
5
+ "mappings": ";AAmBS;AAjBT;AAAA,EAGE;AAAA,OACK;AAEA,aAAM,eAAe,qBAAqB,MAAM;AAQhD,gBAAS,KAAK,EAAC,WAAW,SAAQ,GAAc;AACrD,MAAI,QAAQ,aAAa;AAEzB,SAAO,oBAAC,SAAI,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS;AAC3D;AAEO,aAAM,YAAiD;AAAA,EAC5D,WAAW;AACb;",
6
6
  "names": []
7
7
  }
@@ -1,10 +1,9 @@
1
- import { type ComponentProps } from '../theme/internals.js';
1
+ import { type ComponentPropsWithoutRef, type ElementType, type Ref } from 'react';
2
+ import { type ComponentProps, type ComponentTheme } from '../theme/internals.js';
2
3
  export declare const useCheckboxTheme: ((themeProps: {
3
4
  readonly disabled: boolean;
4
5
  }) => {
5
6
  root: (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string;
6
- checked: (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string;
7
- unchecked: (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string;
8
7
  icon: (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string;
9
8
  }) & {
10
9
  componentThemeName: "Checkbox";
@@ -12,13 +11,29 @@ export declare const useCheckboxTheme: ((themeProps: {
12
11
  readonly variants: {
13
12
  readonly disabled: [true, false];
14
13
  };
15
- readonly elements: ["root", "checked", "unchecked", "icon"];
14
+ readonly elements: ["root", "icon"];
16
15
  };
17
16
  };
18
- export type CheckboxProps = ComponentProps<typeof useCheckboxTheme> & {
17
+ export type CheckboxProps<T extends ElementType> = ComponentProps<typeof useCheckboxTheme> & ComponentPropsWithoutRef<T> & {
18
+ as?: T | undefined;
19
+ checked?: boolean | undefined;
20
+ indeterminate?: boolean | undefined;
21
+ autoFocus?: boolean | undefined;
19
22
  name?: string;
20
23
  className?: string;
21
- value?: boolean;
22
- onChange?: ((value: boolean) => void) | undefined;
24
+ onChange?: ((checked: boolean) => void) | undefined;
23
25
  };
24
- export declare function Checkbox({ name, className, disabled, onChange, value }: CheckboxProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare const Checkbox: <T extends ElementType = "span">(props: Partial<import("@jakubmazanec/ts-utils").Writable<{
27
+ readonly disabled: boolean;
28
+ }>> & import("react").PropsWithoutRef<import("react").ComponentProps<T>> & {
29
+ as?: T | undefined;
30
+ checked?: boolean | undefined;
31
+ indeterminate?: boolean | undefined;
32
+ autoFocus?: boolean | undefined;
33
+ name?: string | undefined;
34
+ className?: string | undefined;
35
+ onChange?: ((checked: boolean) => void) | undefined;
36
+ } & {
37
+ ref?: Ref<HTMLElement> | undefined;
38
+ }) => import("react").ReactNode;
39
+ export declare const checkboxTheme: ComponentTheme<typeof useCheckboxTheme>;
@@ -1,63 +1,85 @@
1
1
  "use strict";
2
- import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Checkbox as HeadlessCheckbox } from "@headlessui/react";
4
- import { CheckIcon } from "@heroicons/react/16/solid";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import {
4
+ Checkbox as HeadlessCheckbox
5
+ } from "@headlessui/react";
5
6
  import { useCallback } from "react";
6
- import { Controller } from "react-hook-form";
7
- import { createComponentTheme } from "../theme/internals.js";
8
- import { useFieldName, useForm } from "./internals.js";
7
+ import {
8
+ createComponentTheme
9
+ } from "../theme/internals.js";
10
+ import { Icon } from "./Icon.js";
11
+ import { forwardRef, useFormId } from "./internals.js";
12
+ import { useField } from "./useField.js";
13
+ import { useFieldName } from "./useFieldName.js";
9
14
  export const useCheckboxTheme = createComponentTheme("Checkbox", {
10
15
  variants: {
11
16
  disabled: [true, false]
12
17
  },
13
- elements: ["root", "checked", "unchecked", "icon"]
18
+ elements: ["root", "icon"]
14
19
  });
15
- export function Checkbox({ name, className, disabled = false, onChange, value }) {
16
- let theme = useCheckboxTheme({ disabled });
17
- let form = useForm();
18
- let fieldName = useFieldName();
19
- let handleChange = useCallback(() => {
20
- onChange?.(!value);
21
- }, [onChange, value]);
22
- if (fieldName && form) {
23
- return /* @__PURE__ */ jsx(
24
- Controller,
25
- {
26
- name: fieldName,
27
- control: form.control,
28
- render: ({ field }) => {
29
- let handleChange2 = field.onChange;
30
- let handleBlur = field.onBlur;
31
- return /* @__PURE__ */ jsxs(
32
- HeadlessCheckbox,
33
- {
34
- className: theme.root("group relative", className),
35
- name: fieldName,
36
- checked: Boolean(field.value),
37
- onChange: handleChange2,
38
- onBlur: handleBlur,
39
- children: [
40
- /* @__PURE__ */ jsx("div", { className: theme.checked(), children: /* @__PURE__ */ jsx(CheckIcon, { className: theme.icon() }) }),
41
- /* @__PURE__ */ jsx("div", { className: theme.unchecked() })
42
- ]
43
- }
44
- );
45
- }
46
- }
47
- );
48
- }
49
- return /* @__PURE__ */ jsxs(
50
- HeadlessCheckbox,
51
- {
52
- className: theme.root("group relative", className),
53
- name: name ?? "",
54
- checked: Boolean(value),
20
+ const CHECKBOX_ELEMENT = "span";
21
+ export const Checkbox = forwardRef(
22
+ ({
23
+ disabled = false,
24
+ as = CHECKBOX_ELEMENT,
25
+ checked,
26
+ indeterminate,
27
+ autoFocus,
28
+ name,
29
+ className,
30
+ onChange,
31
+ ...rest
32
+ }, ref) => {
33
+ let theme = useCheckboxTheme({ disabled });
34
+ let fieldName = useFieldName();
35
+ let field = useField();
36
+ let formId = useFormId();
37
+ let handleChange = useCallback(() => {
38
+ onChange?.(!checked);
39
+ }, [checked, onChange]);
40
+ if (field || fieldName) {
41
+ let props2 = {
42
+ as,
43
+ ref,
44
+ form: formId,
45
+ name: field?.name ?? fieldName,
46
+ indeterminate,
47
+ autoFocus,
48
+ className: theme.root("relative", className),
49
+ ...rest
50
+ };
51
+ return /* @__PURE__ */ jsx(HeadlessCheckbox, { ...props2, children: /* @__PURE__ */ jsx("span", { className: theme.icon(), children: /* @__PURE__ */ jsx(Icon, { name: "Check" }) }) });
52
+ }
53
+ let props = {
54
+ as,
55
+ ref,
56
+ checked: Boolean(checked),
57
+ name,
58
+ indeterminate,
59
+ autoFocus,
60
+ className: theme.root("relative", className),
55
61
  onChange: handleChange,
56
- children: [
57
- /* @__PURE__ */ jsx("div", { className: theme.checked(), children: /* @__PURE__ */ jsx(CheckIcon, { className: theme.icon() }) }),
58
- /* @__PURE__ */ jsx("div", { className: theme.unchecked() })
59
- ]
62
+ ...rest
63
+ };
64
+ return /* @__PURE__ */ jsx(HeadlessCheckbox, { ...props, children: /* @__PURE__ */ jsx("span", { className: theme.icon(), children: /* @__PURE__ */ jsx(Icon, { name: "Check" }) }) });
65
+ }
66
+ );
67
+ export const checkboxTheme = {
68
+ classNames: {
69
+ root: "group/checkbox inline-block size-5",
70
+ icon: "flex justify-content justify-item size-5 *:rounded-2 *:bg-white *:border-2 *:border-gray-100 *:hover:border-gray-200 *:shadow-inner *:transition-colors *:text-transparent *:hover:text-gray-100 group-data-[checked]/checkbox:*:bg-gray-950 group-data-[checked]/checkbox:*:border-gray-950 group-data-[checked]/checkbox:*:text-white"
71
+ },
72
+ variants: {
73
+ disabled: {
74
+ true: {
75
+ root: "border-gray-100 text-gray-200 cursor-not-allowed",
76
+ icon: "opacity-0"
77
+ },
78
+ false: {
79
+ root: "",
80
+ icon: ""
81
+ }
60
82
  }
61
- );
62
- }
83
+ }
84
+ };
63
85
  //# sourceMappingURL=Checkbox.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/components/Checkbox.tsx"],
4
- "sourcesContent": ["/* eslint-disable react/jsx-no-bind -- needed */\nimport {Checkbox as HeadlessCheckbox} from '@headlessui/react';\nimport {CheckIcon} from '@heroicons/react/16/solid';\nimport {useCallback} from 'react';\nimport {Controller} from 'react-hook-form';\n\nimport {type ComponentProps, createComponentTheme} from '../theme/internals.js';\nimport {useFieldName, useForm} from './internals.js';\n\nexport const useCheckboxTheme = createComponentTheme('Checkbox', {\n variants: {\n disabled: [true, false],\n },\n elements: ['root', 'checked', 'unchecked', 'icon'],\n});\n\nexport type CheckboxProps = ComponentProps<typeof useCheckboxTheme> & {\n name?: string;\n className?: string;\n value?: boolean;\n onChange?: ((value: boolean) => void) | undefined;\n};\n\nexport function Checkbox({name, className, disabled = false, onChange, value}: CheckboxProps) {\n let theme = useCheckboxTheme({disabled});\n let form = useForm();\n let fieldName = useFieldName();\n\n let handleChange = useCallback(() => {\n onChange?.(!value);\n }, [onChange, value]);\n\n if (fieldName && form) {\n return (\n <Controller\n name={fieldName}\n control={form.control}\n render={({field}) => {\n let handleChange = field.onChange;\n let handleBlur = field.onBlur;\n\n return (\n <HeadlessCheckbox\n className={theme.root('group relative', className)}\n name={fieldName}\n checked={Boolean(field.value)}\n onChange={handleChange}\n onBlur={handleBlur}\n >\n <div className={theme.checked()}>\n <CheckIcon className={theme.icon()} />\n </div>\n <div className={theme.unchecked()} />\n </HeadlessCheckbox>\n );\n }}\n />\n );\n }\n\n // TODO: what to do with name being undefined?\n return (\n <HeadlessCheckbox\n className={theme.root('group relative', className)}\n name={name ?? ''}\n checked={Boolean(value)}\n onChange={handleChange}\n >\n <div className={theme.checked()}>\n <CheckIcon className={theme.icon()} />\n </div>\n <div className={theme.unchecked()} />\n </HeadlessCheckbox>\n );\n}\n"],
5
- "mappings": ";AA0CY,SAQI,KARJ;AAzCZ,SAAQ,YAAY,wBAAuB;AAC3C,SAAQ,iBAAgB;AACxB,SAAQ,mBAAkB;AAC1B,SAAQ,kBAAiB;AAEzB,SAA6B,4BAA2B;AACxD,SAAQ,cAAc,eAAc;AAE7B,aAAM,mBAAmB,qBAAqB,YAAY;AAAA,EAC/D,UAAU;AAAA,IACR,UAAU,CAAC,MAAM,KAAK;AAAA,EACxB;AAAA,EACA,UAAU,CAAC,QAAQ,WAAW,aAAa,MAAM;AACnD,CAAC;AASM,gBAAS,SAAS,EAAC,MAAM,WAAW,WAAW,OAAO,UAAU,MAAK,GAAkB;AAC5F,MAAI,QAAQ,iBAAiB,EAAC,SAAQ,CAAC;AACvC,MAAI,OAAO,QAAQ;AACnB,MAAI,YAAY,aAAa;AAE7B,MAAI,eAAe,YAAY,MAAM;AACnC,eAAW,CAAC,KAAK;AAAA,EACnB,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,MAAI,aAAa,MAAM;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,QACd,QAAQ,CAAC,EAAC,MAAK,MAAM;AACnB,cAAIA,gBAAe,MAAM;AACzB,cAAI,aAAa,MAAM;AAEvB,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,MAAM,KAAK,kBAAkB,SAAS;AAAA,cACjD,MAAM;AAAA,cACN,SAAS,QAAQ,MAAM,KAAK;AAAA,cAC5B,UAAUA;AAAA,cACV,QAAQ;AAAA,cAER;AAAA,oCAAC,SAAI,WAAW,MAAM,QAAQ,GAC5B,8BAAC,aAAU,WAAW,MAAM,KAAK,GAAG,GACtC;AAAA,gBACA,oBAAC,SAAI,WAAW,MAAM,UAAU,GAAG;AAAA;AAAA;AAAA,UACrC;AAAA,QAEJ;AAAA;AAAA,IACF;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,MAAM,KAAK,kBAAkB,SAAS;AAAA,MACjD,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ,KAAK;AAAA,MACtB,UAAU;AAAA,MAEV;AAAA,4BAAC,SAAI,WAAW,MAAM,QAAQ,GAC5B,8BAAC,aAAU,WAAW,MAAM,KAAK,GAAG,GACtC;AAAA,QACA,oBAAC,SAAI,WAAW,MAAM,UAAU,GAAG;AAAA;AAAA;AAAA,EACrC;AAEJ;",
6
- "names": ["handleChange"]
4
+ "sourcesContent": ["import {\n Checkbox as HeadlessCheckbox,\n type CheckboxProps as HeadlessCheckboxProps,\n} from '@headlessui/react';\nimport {type ComponentPropsWithoutRef, type ElementType, type Ref, useCallback} from 'react';\n\nimport {\n type ComponentProps,\n type ComponentTheme,\n createComponentTheme,\n} from '../theme/internals.js';\nimport {Icon} from './Icon.js';\nimport {forwardRef, useFormId} from './internals.js';\nimport {useField} from './useField.js';\nimport {useFieldName} from './useFieldName.js';\n\nexport const useCheckboxTheme = createComponentTheme('Checkbox', {\n variants: {\n disabled: [true, false],\n },\n elements: ['root', 'icon'],\n});\n\nconst CHECKBOX_ELEMENT = 'span';\n\nexport type CheckboxProps<T extends ElementType> = ComponentProps<typeof useCheckboxTheme> &\n ComponentPropsWithoutRef<T> & {\n as?: T | undefined;\n checked?: boolean | undefined;\n indeterminate?: boolean | undefined;\n autoFocus?: boolean | undefined;\n name?: string;\n className?: string;\n onChange?: ((checked: boolean) => void) | undefined;\n };\n\nexport const Checkbox = forwardRef(\n <T extends ElementType = typeof CHECKBOX_ELEMENT>(\n {\n disabled = false,\n as = CHECKBOX_ELEMENT as T,\n checked,\n indeterminate,\n autoFocus,\n name,\n className,\n onChange,\n ...rest\n }: CheckboxProps<T>,\n ref: Ref<HTMLElement>,\n ) => {\n let theme = useCheckboxTheme({disabled});\n let fieldName = useFieldName();\n let field = useField();\n let formId = useFormId();\n\n let handleChange = useCallback(() => {\n onChange?.(!checked);\n }, [checked, onChange]);\n\n if (field || fieldName) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed\n let props: HeadlessCheckboxProps<any> = {\n as,\n ref,\n form: formId,\n name: field?.name ?? fieldName,\n indeterminate,\n autoFocus,\n className: theme.root('relative', className),\n ...rest,\n };\n\n return (\n <HeadlessCheckbox {...props}>\n <span className={theme.icon()}>\n <Icon name=\"Check\" />\n </span>\n </HeadlessCheckbox>\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed\n let props: HeadlessCheckboxProps<any> = {\n as,\n ref,\n checked: Boolean(checked),\n name,\n indeterminate,\n autoFocus,\n className: theme.root('relative', className),\n onChange: handleChange,\n ...rest,\n };\n\n return (\n <HeadlessCheckbox {...props}>\n <span className={theme.icon()}>\n <Icon name=\"Check\" />\n </span>\n </HeadlessCheckbox>\n );\n },\n);\n\nexport const checkboxTheme: ComponentTheme<typeof useCheckboxTheme> = {\n classNames: {\n root: 'group/checkbox inline-block size-5',\n icon: 'flex justify-content justify-item size-5 *:rounded-2 *:bg-white *:border-2 *:border-gray-100 *:hover:border-gray-200 *:shadow-inner *:transition-colors *:text-transparent *:hover:text-gray-100 group-data-[checked]/checkbox:*:bg-gray-950 group-data-[checked]/checkbox:*:border-gray-950 group-data-[checked]/checkbox:*:text-white',\n },\n variants: {\n disabled: {\n true: {\n root: 'border-gray-100 text-gray-200 cursor-not-allowed',\n icon: 'opacity-0',\n },\n false: {\n root: '',\n icon: '',\n },\n },\n },\n};\n"],
5
+ "mappings": ";AA4EY;AA5EZ;AAAA,EACE,YAAY;AAAA,OAEP;AACP,SAAmE,mBAAkB;AAErF;AAAA,EAGE;AAAA,OACK;AACP,SAAQ,YAAW;AACnB,SAAQ,YAAY,iBAAgB;AACpC,SAAQ,gBAAe;AACvB,SAAQ,oBAAmB;AAEpB,aAAM,mBAAmB,qBAAqB,YAAY;AAAA,EAC/D,UAAU;AAAA,IACR,UAAU,CAAC,MAAM,KAAK;AAAA,EACxB;AAAA,EACA,UAAU,CAAC,QAAQ,MAAM;AAC3B,CAAC;AAED,MAAM,mBAAmB;AAalB,aAAM,WAAW;AAAA,EACtB,CACE;AAAA,IACE,WAAW;AAAA,IACX,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,QAAI,QAAQ,iBAAiB,EAAC,SAAQ,CAAC;AACvC,QAAI,YAAY,aAAa;AAC7B,QAAI,QAAQ,SAAS;AACrB,QAAI,SAAS,UAAU;AAEvB,QAAI,eAAe,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO;AAAA,IACrB,GAAG,CAAC,SAAS,QAAQ,CAAC;AAEtB,QAAI,SAAS,WAAW;AAEtB,UAAIA,SAAoC;AAAA,QACtC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,OAAO,QAAQ;AAAA,QACrB;AAAA,QACA;AAAA,QACA,WAAW,MAAM,KAAK,YAAY,SAAS;AAAA,QAC3C,GAAG;AAAA,MACL;AAEA,aACE,oBAAC,oBAAkB,GAAGA,QACpB,8BAAC,UAAK,WAAW,MAAM,KAAK,GAC1B,8BAAC,QAAK,MAAK,SAAQ,GACrB,GACF;AAAA,IAEJ;AAGA,QAAI,QAAoC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,MAAM,KAAK,YAAY,SAAS;AAAA,MAC3C,UAAU;AAAA,MACV,GAAG;AAAA,IACL;AAEA,WACE,oBAAC,oBAAkB,GAAG,OACpB,8BAAC,UAAK,WAAW,MAAM,KAAK,GAC1B,8BAAC,QAAK,MAAK,SAAQ,GACrB,GACF;AAAA,EAEJ;AACF;AAEO,aAAM,gBAAyD;AAAA,EACpE,YAAY;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": ["props"]
7
7
  }
@@ -1,11 +1,18 @@
1
+ import { type FieldMetadata, type FieldName } from '@conform-to/react';
1
2
  import { type PropsWithChildren } from 'react';
2
- import { type ComponentProps } from '../theme/internals.js';
3
+ import { type ComponentProps, type ComponentTheme } from '../theme/internals.js';
3
4
  export declare const useCheckboxFieldTheme: (() => (baseClassName?: import("../theme/internals.js").ClassName, overrideClassName?: import("../theme/internals.js").ClassName) => string) & {
4
5
  componentThemeName: "CheckboxField";
5
6
  themeDefinition: undefined;
6
7
  };
7
- export type CheckboxFieldProps = PropsWithChildren<ComponentProps<typeof useCheckboxFieldTheme> & {
8
+ export type CheckboxFieldProps = PropsWithChildren<ComponentProps<typeof useCheckboxFieldTheme> & ({
8
9
  className?: string | undefined;
9
- name?: string | undefined;
10
- }>;
11
- export declare function CheckboxField({ name, className, children }: CheckboxFieldProps): import("react/jsx-runtime").JSX.Element;
10
+ field?: FieldMetadata<any, any> | undefined;
11
+ name?: undefined;
12
+ } | {
13
+ className?: string | undefined;
14
+ field?: undefined;
15
+ name?: FieldName<any, any> | string | undefined;
16
+ })>;
17
+ export declare function CheckboxField({ field, name, className, children }: CheckboxFieldProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare const checkboxFieldTheme: ComponentTheme<typeof useCheckboxFieldTheme>;
@@ -1,14 +1,22 @@
1
1
  "use strict";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { Field as HeadlessField } from "@headlessui/react";
4
- import { createComponentTheme } from "../theme/internals.js";
5
- import { fieldNameContext } from "./internals.js";
4
+ import {
5
+ createComponentTheme
6
+ } from "../theme/internals.js";
7
+ import { fieldContext, fieldNameContext } from "./internals.js";
6
8
  export const useCheckboxFieldTheme = createComponentTheme("CheckboxField");
7
- export function CheckboxField({ name, className, children }) {
9
+ export function CheckboxField({ field, name, className, children }) {
8
10
  let theme = useCheckboxFieldTheme();
11
+ if (field) {
12
+ return /* @__PURE__ */ jsx(fieldContext.Provider, { value: field, children: /* @__PURE__ */ jsx(HeadlessField, { className: theme(null, className), children }) });
13
+ }
9
14
  if (name) {
10
15
  return /* @__PURE__ */ jsx(fieldNameContext.Provider, { value: name, children: /* @__PURE__ */ jsx(HeadlessField, { className: theme(null, className), children }) });
11
16
  }
12
17
  return /* @__PURE__ */ jsx(HeadlessField, { className: theme(null, className), children });
13
18
  }
19
+ export const checkboxFieldTheme = {
20
+ className: "grid grid-cols-[theme(spacing.5)_1fr] gap-x-2 gap-y-1 [&>[data-component-label]]:font-normal [&>[data-component-description]]:col-start-2"
21
+ };
14
22
  //# sourceMappingURL=CheckboxField.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/components/CheckboxField.tsx"],
4
- "sourcesContent": ["import {Field as HeadlessField} from '@headlessui/react';\nimport {type PropsWithChildren} from 'react';\n\nimport {type ComponentProps, createComponentTheme} from '../theme/internals.js';\nimport {fieldNameContext} from './internals.js';\n\nexport const useCheckboxFieldTheme = createComponentTheme('CheckboxField');\n\nexport type CheckboxFieldProps = PropsWithChildren<\n ComponentProps<typeof useCheckboxFieldTheme> & {\n className?: string | undefined;\n name?: string | undefined;\n }\n>;\n\nexport function CheckboxField({name, className, children}: CheckboxFieldProps) {\n let theme = useCheckboxFieldTheme();\n\n if (name) {\n return (\n <fieldNameContext.Provider value={name}>\n <HeadlessField className={theme(null, className)}>{children}</HeadlessField>\n </fieldNameContext.Provider>\n );\n }\n\n return <HeadlessField className={theme(null, className)}>{children}</HeadlessField>;\n}\n"],
5
- "mappings": ";AAqBQ;AArBR,SAAQ,SAAS,qBAAoB;AAGrC,SAA6B,4BAA2B;AACxD,SAAQ,wBAAuB;AAExB,aAAM,wBAAwB,qBAAqB,eAAe;AASlE,gBAAS,cAAc,EAAC,MAAM,WAAW,SAAQ,GAAuB;AAC7E,MAAI,QAAQ,sBAAsB;AAElC,MAAI,MAAM;AACR,WACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,MAChC,8BAAC,iBAAc,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS,GAC9D;AAAA,EAEJ;AAEA,SAAO,oBAAC,iBAAc,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS;AACrE;",
4
+ "sourcesContent": ["import {type FieldMetadata, type FieldName} from '@conform-to/react';\nimport {Field as HeadlessField} from '@headlessui/react';\nimport {type PropsWithChildren} from 'react';\n\nimport {\n type ComponentProps,\n type ComponentTheme,\n createComponentTheme,\n} from '../theme/internals.js';\nimport {fieldContext, fieldNameContext} from './internals.js';\n\nexport const useCheckboxFieldTheme = createComponentTheme('CheckboxField');\n\nexport type CheckboxFieldProps = PropsWithChildren<\n ComponentProps<typeof useCheckboxFieldTheme> &\n (\n | {\n className?: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed\n field?: FieldMetadata<any, any> | undefined;\n name?: undefined;\n }\n | {\n className?: string | undefined;\n field?: undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- needed\n name?: FieldName<any, any> | string | undefined;\n }\n )\n>;\n\nexport function CheckboxField({field, name, className, children}: CheckboxFieldProps) {\n let theme = useCheckboxFieldTheme();\n\n if (field) {\n return (\n <fieldContext.Provider value={field}>\n <HeadlessField className={theme(null, className)}>{children}</HeadlessField>\n </fieldContext.Provider>\n );\n }\n\n if (name) {\n return (\n <fieldNameContext.Provider value={name}>\n <HeadlessField className={theme(null, className)}>{children}</HeadlessField>\n </fieldNameContext.Provider>\n );\n }\n\n return <HeadlessField className={theme(null, className)}>{children}</HeadlessField>;\n}\n\nexport const checkboxFieldTheme: ComponentTheme<typeof useCheckboxFieldTheme> = {\n className:\n 'grid grid-cols-[theme(spacing.5)_1fr] gap-x-2 gap-y-1 [&>[data-component-label]]:font-normal [&>[data-component-description]]:col-start-2',\n};\n"],
5
+ "mappings": ";AAqCQ;AApCR,SAAQ,SAAS,qBAAoB;AAGrC;AAAA,EAGE;AAAA,OACK;AACP,SAAQ,cAAc,wBAAuB;AAEtC,aAAM,wBAAwB,qBAAqB,eAAe;AAoBlE,gBAAS,cAAc,EAAC,OAAO,MAAM,WAAW,SAAQ,GAAuB;AACpF,MAAI,QAAQ,sBAAsB;AAElC,MAAI,OAAO;AACT,WACE,oBAAC,aAAa,UAAb,EAAsB,OAAO,OAC5B,8BAAC,iBAAc,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS,GAC9D;AAAA,EAEJ;AAEA,MAAI,MAAM;AACR,WACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,MAChC,8BAAC,iBAAc,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS,GAC9D;AAAA,EAEJ;AAEA,SAAO,oBAAC,iBAAc,WAAW,MAAM,MAAM,SAAS,GAAI,UAAS;AACrE;AAEO,aAAM,qBAAmE;AAAA,EAC9E,WACE;AACJ;",
6
6
  "names": []
7
7
  }