@brightspot/ui 1.11.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/components/action-bar/ActionBar.d.ts +1 -1
  2. package/dist/components/action-bar/ActionBar.js +7 -7
  3. package/dist/components/action-bar/ActionBar.js.map +1 -1
  4. package/dist/components/action-bar/ActionItem.d.ts +5 -5
  5. package/dist/components/action-bar/ActionItem.d.ts.map +1 -1
  6. package/dist/components/action-bar/ActionItem.js +13 -13
  7. package/dist/components/action-bar/ActionItem.js.map +1 -1
  8. package/dist/components/avatar/AvatarGroup.d.ts +3 -0
  9. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -1
  10. package/dist/components/avatar/AvatarGroup.js +3 -0
  11. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  12. package/dist/components/badge/Badge.d.ts +3 -1
  13. package/dist/components/badge/Badge.d.ts.map +1 -1
  14. package/dist/components/badge/Badge.js +2 -0
  15. package/dist/components/badge/Badge.js.map +1 -1
  16. package/dist/components/button-group/ButtonGroup.d.ts +138 -0
  17. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -0
  18. package/dist/components/button-group/ButtonGroup.js +436 -0
  19. package/dist/components/button-group/ButtonGroup.js.map +1 -0
  20. package/dist/components/checkbox/Checkbox.d.ts +107 -0
  21. package/dist/components/checkbox/Checkbox.d.ts.map +1 -0
  22. package/dist/components/checkbox/Checkbox.js +224 -0
  23. package/dist/components/checkbox/Checkbox.js.map +1 -0
  24. package/dist/components/circular-progress/CircularProgress.d.ts +2 -2
  25. package/dist/components/circular-progress/CircularProgress.js +2 -2
  26. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts +7 -2
  27. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  28. package/dist/components/copy-to-clipboard/CopyToClipboard.js +10 -5
  29. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  30. package/dist/components/dropdown/Dropdown.d.ts +5 -5
  31. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  32. package/dist/components/dropdown/Dropdown.js +11 -16
  33. package/dist/components/dropdown/Dropdown.js.map +1 -1
  34. package/dist/components/dropdown/DropdownItem.d.ts +14 -6
  35. package/dist/components/dropdown/DropdownItem.d.ts.map +1 -1
  36. package/dist/components/dropdown/DropdownItem.js +21 -15
  37. package/dist/components/dropdown/DropdownItem.js.map +1 -1
  38. package/dist/components/dropdown/DropdownMenu.d.ts +4 -4
  39. package/dist/components/dropdown/DropdownMenu.d.ts.map +1 -1
  40. package/dist/components/dropdown/DropdownMenu.js +6 -6
  41. package/dist/components/dropdown/DropdownMenu.js.map +1 -1
  42. package/dist/components/empty-state/EmptyState.css +4 -0
  43. package/dist/components/empty-state/EmptyState.d.ts +103 -0
  44. package/dist/components/empty-state/EmptyState.d.ts.map +1 -0
  45. package/dist/components/empty-state/EmptyState.js +209 -0
  46. package/dist/components/empty-state/EmptyState.js.map +1 -0
  47. package/dist/components/icon/Icon.d.ts +23 -10
  48. package/dist/components/icon/Icon.d.ts.map +1 -1
  49. package/dist/components/icon/Icon.js +40 -9
  50. package/dist/components/icon/Icon.js.map +1 -1
  51. package/dist/components/icon-button/IconButton.d.ts +7 -21
  52. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  53. package/dist/components/icon-button/IconButton.js +12 -18
  54. package/dist/components/icon-button/IconButton.js.map +1 -1
  55. package/dist/components/linear-progress/LinearProgress.d.ts +2 -2
  56. package/dist/components/linear-progress/LinearProgress.js +2 -2
  57. package/dist/components/pagination/Pagination.js +10 -10
  58. package/dist/components/popover/Popover.d.ts +6 -0
  59. package/dist/components/popover/Popover.d.ts.map +1 -1
  60. package/dist/components/popover/Popover.js +6 -0
  61. package/dist/components/popover/Popover.js.map +1 -1
  62. package/dist/components/switch/Switch.d.ts +5 -1
  63. package/dist/components/switch/Switch.d.ts.map +1 -1
  64. package/dist/components/switch/Switch.js +10 -6
  65. package/dist/components/switch/Switch.js.map +1 -1
  66. package/dist/components/tabs/Tab.d.ts +4 -4
  67. package/dist/components/tabs/Tab.d.ts.map +1 -1
  68. package/dist/components/tabs/Tab.js +5 -5
  69. package/dist/components/tabs/Tab.js.map +1 -1
  70. package/dist/components/tabs/Tabs.d.ts +3 -3
  71. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  72. package/dist/components/tabs/Tabs.js +20 -20
  73. package/dist/components/tabs/Tabs.js.map +1 -1
  74. package/dist/components/upload/Upload.d.ts +157 -0
  75. package/dist/components/upload/Upload.d.ts.map +1 -0
  76. package/dist/components/upload/Upload.js +538 -0
  77. package/dist/components/upload/Upload.js.map +1 -0
  78. package/dist/components/upload/UploadItem.d.ts +73 -0
  79. package/dist/components/upload/UploadItem.d.ts.map +1 -0
  80. package/dist/components/upload/UploadItem.js +180 -0
  81. package/dist/components/upload/UploadItem.js.map +1 -0
  82. package/dist/components/widget/Widget.d.ts +1 -6
  83. package/dist/components/widget/Widget.d.ts.map +1 -1
  84. package/dist/components/widget/Widget.js +1 -6
  85. package/dist/components/widget/Widget.js.map +1 -1
  86. package/dist/custom-elements.json +7499 -2087
  87. package/dist/storybook/assets/{ActionBar.stories--nAeDC-G.js → ActionBar.stories-DRIVI-W2.js} +65 -65
  88. package/dist/storybook/assets/{ActionItem.stories-BHrGjk-P.js → ActionItem.stories-5qlgxYNB.js} +41 -41
  89. package/dist/storybook/assets/{Avatar.stories-Da-mRj6_.js → Avatar.stories-B3VkhRhP.js} +2 -2
  90. package/dist/storybook/assets/{AvatarGroup.stories-BQlaC_yl.js → AvatarGroup.stories-DOfim2NY.js} +5 -5
  91. package/dist/storybook/assets/{Badge.stories-DnVnOrnF.js → Badge.stories-B04VNAcc.js} +2 -2
  92. package/dist/storybook/assets/{Button-CFLAI1H9.js → Button-CILTcGRT.js} +1 -1
  93. package/dist/storybook/assets/{Button.stories-DxaBOjwv.js → Button.stories-CzWAltrX.js} +1 -1
  94. package/dist/storybook/assets/ButtonGroup.stories-1uAJf79o.js +588 -0
  95. package/dist/storybook/assets/{Celebrate.stories-CuMm15Nr.js → Celebrate.stories-BEqj0VnW.js} +7 -7
  96. package/dist/storybook/assets/Checkbox.stories-DXAGFS0M.js +141 -0
  97. package/dist/storybook/assets/{CircularProgress.stories-DRN8Mtvj.js → CircularProgress.stories-D4rftw22.js} +7 -7
  98. package/dist/storybook/assets/{ClipboardMixin.stories-DR7Ou2Av.js → ClipboardMixin.stories-z2n2HWt1.js} +31 -28
  99. package/dist/storybook/assets/{Color-6BZIO3FS-Die62Y0Z.js → Color-6BZIO3FS-C6KyMgZz.js} +1 -1
  100. package/dist/storybook/assets/{Colors.stories-bIq_ssbI.js → Colors.stories-CX-Ny3B_.js} +1 -1
  101. package/dist/storybook/assets/{CombinedEffects.stories-CtKzOUZn.js → CombinedEffects.stories-BkqtiVHp.js} +33 -33
  102. package/dist/storybook/assets/{ComponentStatesMixin-DMLCk9fE.js → ComponentStatesMixin-DLd0feFg.js} +1 -1
  103. package/dist/storybook/assets/{ComponentStatesMixin.stories-D8UI9o-d.js → ComponentStatesMixin.stories-D6Yc5Jgl.js} +3 -3
  104. package/dist/storybook/assets/{CopyToClipboard.stories-ti6CpJNp.js → CopyToClipboard.stories-B-omwDDJ.js} +16 -16
  105. package/dist/storybook/assets/{Debounce.stories-DzZUSvbk.js → Debounce.stories-B2vE5QIx.js} +9 -9
  106. package/dist/storybook/assets/{DocsRenderer-LL677BLK-CIRGv5IX.js → DocsRenderer-LL677BLK-DNUlRvMg.js} +3 -3
  107. package/dist/storybook/assets/{Dropdown.stories-Lt4cY0Re.js → Dropdown.stories-_bx4WDLr.js} +60 -60
  108. package/dist/storybook/assets/EmptyState.stories-CGMbmo77.js +318 -0
  109. package/dist/storybook/assets/{Events.stories-B1ddcgpT.js → Events.stories-CkQYKcoZ.js} +1 -1
  110. package/dist/storybook/assets/{Heading.stories-DI4w61cf.js → Heading.stories-BU5Do_od.js} +1 -1
  111. package/dist/storybook/assets/{HueRipple.stories-DjhoxxEw.js → HueRipple.stories-Di2zmxo3.js} +11 -11
  112. package/dist/storybook/assets/Icon.stories-Dk4ZXhhJ.js +441 -0
  113. package/dist/storybook/assets/{IconButton.stories-KjN28hfc.js → IconButton.stories-BSCiXPXa.js} +126 -146
  114. package/dist/storybook/assets/{LinearProgress.stories-DcIpdz6R.js → LinearProgress.stories-BGxPZuni.js} +7 -7
  115. package/dist/storybook/assets/{Pagination.stories-BBkLEwoP.js → Pagination.stories-z3Zq8b4f.js} +6 -6
  116. package/dist/storybook/assets/{Popover.stories-DLv48c2h.js → Popover.stories-C9GxWcax.js} +33 -62
  117. package/dist/storybook/assets/ReadyMixin-CQw8N6P9.js +1 -0
  118. package/dist/storybook/assets/{RovingTabindexMixin.stories-BWaFx9mu.js → RovingTabindexMixin.stories-ByxLBi6m.js} +6 -6
  119. package/dist/storybook/assets/{Rtc.stories-Ve7Bwo_l.js → Rtc.stories-DQJlCXWR.js} +3 -3
  120. package/dist/storybook/assets/{ScrollShadow.stories-C6XmrRLm.js → ScrollShadow.stories-gjTIAbUA.js} +2 -2
  121. package/dist/storybook/assets/{Switch.stories-Cf8WM1LG.js → Switch.stories-BEeqPZiP.js} +21 -21
  122. package/dist/storybook/assets/{Tab.stories-CEtdEtOx.js → Tab.stories-DpB3I-WZ.js} +33 -33
  123. package/dist/storybook/assets/{Tabs.stories-CIAO1bPO.js → Tabs.stories-C6mG6Xi7.js} +2 -2
  124. package/dist/storybook/assets/{Throttle.stories-BqxVIb-r.js → Throttle.stories-x9tpGeQh.js} +10 -10
  125. package/dist/storybook/assets/{Tooltip.stories-B6fw6875.js → Tooltip.stories-CqcLqdmc.js} +2 -2
  126. package/dist/storybook/assets/Upload.stories-CMaAbCSH.js +447 -0
  127. package/dist/storybook/assets/UploadItem.stories-GB98L3JQ.js +167 -0
  128. package/dist/storybook/assets/{Welcome.stories-CfJtSM19.js → Welcome.stories-6h9cUZ7v.js} +1 -1
  129. package/dist/storybook/assets/{Widget.stories-CiOho7lO.js → Widget.stories-DiA1PR6Y.js} +13 -13
  130. package/dist/storybook/assets/{WithTooltip-65CFNBJE-PGcopp73.js → WithTooltip-65CFNBJE-DTsHhBb_.js} +1 -1
  131. package/dist/storybook/assets/{blocks-dP2DwISI.js → blocks-IXdn9TGW.js} +5 -5
  132. package/dist/storybook/assets/{formatter-EIJCOSYU-CZSAC3tg.js → formatter-EIJCOSYU-Cum4J6N4.js} +1 -1
  133. package/dist/storybook/assets/if-defined-CgfCxQoV.js +1 -0
  134. package/dist/storybook/assets/iframe-BgFj0b5u.css +1 -0
  135. package/dist/storybook/assets/{iframe-DloIUNZz.js → iframe-Sf9RHZFu.js} +191 -191
  136. package/dist/storybook/assets/{index-DKF0ypu5.js → index-D605PvQH.js} +1 -1
  137. package/dist/storybook/assets/{onFind-C0l4Gew0.js → onFind-C41m8c_a.js} +1 -1
  138. package/dist/storybook/assets/{onFind.stories-DOTt9puO.js → onFind.stories-MOTfGlJd.js} +53 -77
  139. package/dist/storybook/assets/{onRemove.stories-CQ9ZC5dm.js → onRemove.stories-DX58Bf6f.js} +6 -10
  140. package/dist/storybook/assets/{onVisible.stories-Cbj5_Vz0.js → onVisible.stories-NNFeFeD8.js} +3 -3
  141. package/dist/storybook/assets/{style-map-DLXysq3r.js → style-map-B99QiqCo.js} +1 -1
  142. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-Bjjbl9ca.js → syntaxhighlighter-ED5Y7EFY-BqQ-o9mS.js} +1 -1
  143. package/dist/storybook/box-illustration.svg +51 -0
  144. package/dist/storybook/cloud-illustration.svg +49 -0
  145. package/dist/storybook/docs-illustration.svg +92 -0
  146. package/dist/storybook/iframe.html +2 -2
  147. package/dist/storybook/index.json +1 -1
  148. package/dist/storybook/project.json +1 -1
  149. package/dist/tailwind-plugin-badge.js +1 -1
  150. package/dist/tailwind-plugin-badge.ts +1 -1
  151. package/dist/tailwind-plugin-button-group.d.ts +2 -0
  152. package/dist/tailwind-plugin-button-group.d.ts.map +1 -0
  153. package/dist/tailwind-plugin-button-group.js +215 -0
  154. package/dist/tailwind-plugin-button-group.js.map +1 -0
  155. package/dist/tailwind-plugin-button-group.ts +238 -0
  156. package/dist/tailwind-plugin-button.js +1 -1
  157. package/dist/tailwind-plugin-button.ts +1 -1
  158. package/dist/tailwind-plugin-checkbox.d.ts +2 -0
  159. package/dist/tailwind-plugin-checkbox.d.ts.map +1 -0
  160. package/dist/tailwind-plugin-checkbox.js +246 -0
  161. package/dist/tailwind-plugin-checkbox.js.map +1 -0
  162. package/dist/tailwind-plugin-checkbox.ts +281 -0
  163. package/dist/tailwind-plugin-empty-state.d.ts +2 -0
  164. package/dist/tailwind-plugin-empty-state.d.ts.map +1 -0
  165. package/dist/tailwind-plugin-empty-state.js +113 -0
  166. package/dist/tailwind-plugin-empty-state.js.map +1 -0
  167. package/dist/tailwind-plugin-empty-state.ts +124 -0
  168. package/dist/tailwind-plugin-icon.js +122 -18
  169. package/dist/tailwind-plugin-icon.js.map +1 -1
  170. package/dist/tailwind-plugin-icon.ts +131 -18
  171. package/dist/tailwind-plugin-loader.js +3 -3
  172. package/dist/tailwind-plugin-loader.ts +3 -3
  173. package/dist/tailwind-plugin-tabs.js +7 -0
  174. package/dist/tailwind-plugin-tabs.js.map +1 -1
  175. package/dist/tailwind-plugin-tabs.ts +7 -0
  176. package/dist/tailwind-plugin-upload.d.ts +2 -0
  177. package/dist/tailwind-plugin-upload.d.ts.map +1 -0
  178. package/dist/tailwind-plugin-upload.js +322 -0
  179. package/dist/tailwind-plugin-upload.js.map +1 -0
  180. package/dist/tailwind-plugin-upload.ts +362 -0
  181. package/dist/tailwind.config.d.ts.map +1 -1
  182. package/dist/tailwind.config.js +1 -0
  183. package/dist/tailwind.config.js.map +1 -1
  184. package/dist/tailwind.config.ts +1 -0
  185. package/dist/util/ClipboardMixin.d.ts +7 -2
  186. package/dist/util/ClipboardMixin.d.ts.map +1 -1
  187. package/dist/util/ClipboardMixin.js +15 -13
  188. package/dist/util/ClipboardMixin.js.map +1 -1
  189. package/dist/util/ComponentStatesMixin.d.ts +2 -1
  190. package/dist/util/ComponentStatesMixin.d.ts.map +1 -1
  191. package/dist/util/ComponentStatesMixin.js +4 -0
  192. package/dist/util/ComponentStatesMixin.js.map +1 -1
  193. package/dist/util/EventEmitterMixin.d.ts +42 -4
  194. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  195. package/dist/util/EventEmitterMixin.js +5 -2
  196. package/dist/util/EventEmitterMixin.js.map +1 -1
  197. package/dist/util/ProgressMixin.d.ts +9 -2
  198. package/dist/util/ProgressMixin.d.ts.map +1 -1
  199. package/dist/util/ProgressMixin.js +22 -18
  200. package/dist/util/ProgressMixin.js.map +1 -1
  201. package/dist/util/RovingTabindexMixin.d.ts +8 -0
  202. package/dist/util/RovingTabindexMixin.d.ts.map +1 -1
  203. package/dist/util/RovingTabindexMixin.js +8 -8
  204. package/dist/util/RovingTabindexMixin.js.map +1 -1
  205. package/dist/util/TetherLayout.d.ts.map +1 -1
  206. package/dist/util/TetherLayout.js +3 -0
  207. package/dist/util/TetherLayout.js.map +1 -1
  208. package/dist/util/TooltipMixin.d.ts.map +1 -1
  209. package/dist/util/TooltipMixin.js +5 -4
  210. package/dist/util/TooltipMixin.js.map +1 -1
  211. package/dist/util/upload.d.ts +53 -0
  212. package/dist/util/upload.d.ts.map +1 -0
  213. package/dist/util/upload.js +113 -0
  214. package/dist/util/upload.js.map +1 -0
  215. package/docs/components/ActionBar.md +6 -0
  216. package/docs/components/ActionItem.md +52 -27
  217. package/docs/components/Avatar.md +42 -12
  218. package/docs/components/AvatarGroup.md +4 -3
  219. package/docs/components/Badge.md +13 -1
  220. package/docs/components/ButtonGroup.md +91 -0
  221. package/docs/components/Checkbox.md +91 -0
  222. package/docs/components/CircularProgress.md +41 -12
  223. package/docs/components/CopyToClipboard.md +13 -11
  224. package/docs/components/Dropdown.md +44 -19
  225. package/docs/components/DropdownItem.md +39 -26
  226. package/docs/components/DropdownMenu.md +9 -9
  227. package/docs/components/EmptyState.md +75 -0
  228. package/docs/components/Icon.md +22 -14
  229. package/docs/components/IconButton.md +46 -21
  230. package/docs/components/LinearProgress.md +43 -4
  231. package/docs/components/Pagination.md +11 -10
  232. package/docs/components/Popover.md +16 -0
  233. package/docs/components/README.md +5 -0
  234. package/docs/components/Switch.md +21 -16
  235. package/docs/components/Tab.md +8 -2
  236. package/docs/components/Tabs.md +8 -0
  237. package/docs/components/Upload.md +112 -0
  238. package/docs/components/UploadItem.md +61 -0
  239. package/docs/components/Widget.md +12 -6
  240. package/package.json +4 -2
  241. package/dist/storybook/assets/Icon.stories-CpziAhae.js +0 -264
  242. package/dist/storybook/assets/ReadyMixin-Cw2Dfbu2.js +0 -1
  243. package/dist/storybook/assets/if-defined-B1RdczOE.js +0 -1
  244. package/dist/storybook/assets/iframe-bJgLXZKK.css +0 -1
@@ -0,0 +1,246 @@
1
+ import plugin from 'tailwindcss/plugin';
2
+ /**
3
+ * Checkbox component — a styled checkbox with label and description support.
4
+ *
5
+ * Class Names:
6
+ *
7
+ * btu-checkbox - Wrapper element
8
+ * btu-checkbox-input - The hidden <input type="checkbox">
9
+ * btu-checkbox-box - The visible checkbox square
10
+ * btu-checkbox-icon - Icon element inside the box (check or minus)
11
+ * btu-checkbox-text - Optional container for label, description, and error (flex column)
12
+ * btu-checkbox-label - Primary label text
13
+ * btu-checkbox-description - Secondary description text
14
+ * btu-checkbox-error - Error message text
15
+ * btu-checkbox-md - Medium size variant (20px, default is sm with no modifier)
16
+ * btu-checkbox-invalid - Error state modifier
17
+ *
18
+ * CSS Custom Properties:
19
+ *
20
+ * --checkbox-color-primary - Background and border when checked/indeterminate (default: oklch(primary-700))
21
+ * --checkbox-color-border - Border color in unchecked state (default: oklch(gray-300))
22
+ * --checkbox-color-error - Border/text color in error (default: oklch(error-600))
23
+ * --checkbox-border-radius - Corner rounding (default: 4px)
24
+ * --checkbox-label-spacing - Gap between box and label text (default: 0.75rem)
25
+ *
26
+ * Internal sizing (not intended for consumer override):
27
+ *
28
+ * --checkbox-box-size - Width/height of the checkbox square (set by size variant)
29
+ * --checkbox-icon-size - Width/height of the icon inside the box (set by size variant)
30
+ *
31
+ * Rendered DOM (the component generates this internally; consumers only write <btu-checkbox ...>):
32
+ *
33
+ * <btu-checkbox>
34
+ * <input type="checkbox" class="btu-checkbox-input">
35
+ * <span class="btu-checkbox-box">
36
+ * <btu-icon class="btu-checkbox-icon" symbol="check" style="--icon-size: var(--checkbox-icon-size)"></btu-icon>
37
+ * </span>
38
+ * <span class="btu-checkbox-text">
39
+ * <span class="btu-checkbox-label">Remember me</span>
40
+ * <span class="btu-checkbox-description">Save your login details</span>
41
+ * <span class="btu-checkbox-error">Error message here</span>
42
+ * </span>
43
+ * </btu-checkbox>
44
+ */
45
+ module.exports = plugin(function ({ addComponents, config }) {
46
+ const components = {
47
+ // -------------------------------------------------------------------------
48
+ // Wrapper
49
+ // -------------------------------------------------------------------------
50
+ '.btu-checkbox': {
51
+ '--checkbox-box-size': '1rem',
52
+ '--checkbox-icon-size': '0.75rem',
53
+ display: 'inline-flex',
54
+ alignItems: 'flex-start',
55
+ gap: 'var(--checkbox-label-spacing, 0.75rem)',
56
+ cursor: 'pointer',
57
+ userSelect: 'none',
58
+ },
59
+ // -------------------------------------------------------------------------
60
+ // Hidden input (sr-only pattern)
61
+ // -------------------------------------------------------------------------
62
+ '.btu-checkbox-input': {
63
+ position: 'absolute',
64
+ width: '1px',
65
+ height: '1px',
66
+ padding: '0',
67
+ margin: '-1px',
68
+ overflow: 'hidden',
69
+ clipPath: 'inset(50%)',
70
+ whiteSpace: 'nowrap',
71
+ borderWidth: '0',
72
+ },
73
+ // -------------------------------------------------------------------------
74
+ // Visible checkbox box
75
+ // -------------------------------------------------------------------------
76
+ '.btu-checkbox-box': {
77
+ flexShrink: '0',
78
+ position: 'relative',
79
+ display: 'inline-flex',
80
+ alignItems: 'center',
81
+ justifyContent: 'center',
82
+ marginTop: '0.125rem',
83
+ width: 'var(--checkbox-box-size)',
84
+ height: 'var(--checkbox-box-size)',
85
+ borderRadius: 'var(--checkbox-border-radius, 4px)',
86
+ border: '1px solid var(--checkbox-color-border, oklch(var(--btu-theme-gray-300)))',
87
+ background: 'var(--btu-theme-white)',
88
+ transition: 'transform 200ms cubic-bezier(0.12, 0.32, 0.54, 2), background 150ms ease-in-out, border-color 150ms ease-in-out, box-shadow 150ms ease-in-out',
89
+ },
90
+ // -------------------------------------------------------------------------
91
+ // Icon inside the box
92
+ // -------------------------------------------------------------------------
93
+ '.btu-checkbox-icon': {
94
+ opacity: '0',
95
+ transform: 'scale(0.5)',
96
+ color: 'var(--btu-theme-white)',
97
+ pointerEvents: 'none',
98
+ transition: 'transform 150ms ease-in, opacity 150ms ease-in',
99
+ },
100
+ // -------------------------------------------------------------------------
101
+ // Checked / indeterminate state
102
+ // -------------------------------------------------------------------------
103
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
104
+ background: 'var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700)))',
105
+ borderColor: 'var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700)))',
106
+ },
107
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
108
+ opacity: '1',
109
+ transform: 'scale(1)',
110
+ transition: 'transform 200ms cubic-bezier(0.12, 0.32, 0.54, 2), opacity 200ms cubic-bezier(0.12, 0.32, 0.54, 2)',
111
+ },
112
+ // -------------------------------------------------------------------------
113
+ // Hover state
114
+ // -------------------------------------------------------------------------
115
+ '.btu-checkbox:hover .btu-checkbox-input:not(:disabled) ~ .btu-checkbox-box': {
116
+ background: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), white 92%)',
117
+ borderColor: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
118
+ },
119
+ '.btu-checkbox:hover .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
120
+ background: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
121
+ borderColor: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
122
+ },
123
+ // -------------------------------------------------------------------------
124
+ // Active press — box scale bounce (snap in fast, spring back with bounce bezier)
125
+ // -------------------------------------------------------------------------
126
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled, :checked, :indeterminate) ~ .btu-checkbox-box': {
127
+ transform: 'scale(0.9)',
128
+ transitionDuration: '0.05s',
129
+ },
130
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
131
+ transform: 'scale(1.1)',
132
+ transitionDuration: '0.05s',
133
+ },
134
+ // -------------------------------------------------------------------------
135
+ // Focus visible — ring on the box
136
+ // -------------------------------------------------------------------------
137
+ '.btu-checkbox-input:focus-visible ~ .btu-checkbox-box': {
138
+ borderColor: 'oklch(var(--btu-theme-primary-600))',
139
+ boxShadow: '0px 0px 0px 4px oklch(var(--btu-theme-primary-100))',
140
+ },
141
+ // -------------------------------------------------------------------------
142
+ // Disabled state
143
+ // -------------------------------------------------------------------------
144
+ '.btu-checkbox-input:disabled ~ .btu-checkbox-box': {
145
+ background: 'oklch(var(--btu-theme-gray-100))',
146
+ borderColor: 'oklch(var(--btu-theme-gray-300))',
147
+ pointerEvents: 'none',
148
+ },
149
+ '.btu-checkbox-input:disabled:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
150
+ background: 'oklch(var(--btu-theme-gray-100))',
151
+ borderColor: 'oklch(var(--btu-theme-gray-300))',
152
+ },
153
+ '.btu-checkbox-input:disabled:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
154
+ color: 'oklch(var(--btu-theme-gray-300))',
155
+ },
156
+ '.btu-checkbox-input:disabled ~ .btu-checkbox-text': {
157
+ color: 'oklch(var(--btu-theme-gray-300))',
158
+ },
159
+ '.btu-checkbox:has(.btu-checkbox-input:disabled)': {
160
+ pointerEvents: 'none',
161
+ },
162
+ // -------------------------------------------------------------------------
163
+ // Invalid / error state
164
+ // -------------------------------------------------------------------------
165
+ '.btu-checkbox-invalid .btu-checkbox-box': {
166
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
167
+ },
168
+ '.btu-checkbox-invalid .btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
169
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
170
+ },
171
+ '.btu-checkbox-invalid .btu-checkbox-label': {
172
+ color: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
173
+ },
174
+ '.btu-checkbox-invalid:hover .btu-checkbox-input:not(:disabled, :checked, :indeterminate) ~ .btu-checkbox-box': {
175
+ background: 'var(--btu-theme-white)',
176
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
177
+ },
178
+ '.btu-checkbox-invalid:hover .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
179
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
180
+ },
181
+ '.btu-checkbox-invalid .btu-checkbox-input:focus-visible ~ .btu-checkbox-box': {
182
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
183
+ },
184
+ // -------------------------------------------------------------------------
185
+ // Text elements
186
+ // -------------------------------------------------------------------------
187
+ '.btu-checkbox-text': {
188
+ display: 'flex',
189
+ flexDirection: 'column',
190
+ gap: '0.125rem',
191
+ },
192
+ '.btu-checkbox-label': {
193
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
194
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
195
+ fontWeight: '500',
196
+ color: 'oklch(var(--btu-theme-gray-700))',
197
+ },
198
+ '.btu-checkbox-description': {
199
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
200
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
201
+ color: 'oklch(var(--btu-theme-gray-500))',
202
+ },
203
+ '.btu-checkbox-error': {
204
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
205
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
206
+ color: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
207
+ },
208
+ // -------------------------------------------------------------------------
209
+ // Size variants
210
+ // -------------------------------------------------------------------------
211
+ // sm is the default — no modifier class needed, base dimensions apply
212
+ '.btu-checkbox-md': {
213
+ '--checkbox-box-size': '1.25rem',
214
+ '--checkbox-icon-size': '0.875rem',
215
+ },
216
+ '.btu-checkbox-md .btu-checkbox-label': {
217
+ fontSize: config('theme.fontSize.base')?.[0] ?? '1rem',
218
+ lineHeight: config('theme.fontSize.base')?.[1] ?? '1.5rem',
219
+ },
220
+ '.btu-checkbox-md .btu-checkbox-description, .btu-checkbox-md .btu-checkbox-error': {
221
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
222
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
223
+ },
224
+ // -------------------------------------------------------------------------
225
+ // Reduced motion
226
+ // -------------------------------------------------------------------------
227
+ '@media (prefers-reduced-motion: reduce)': {
228
+ '.btu-checkbox-box': {
229
+ transition: 'background 0.01ms ease, border-color 0.01ms ease, box-shadow 0.01ms ease, transform 0.01ms ease',
230
+ },
231
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled) ~ .btu-checkbox-box': {
232
+ transform: 'scale(1)',
233
+ },
234
+ '.btu-checkbox-icon': {
235
+ transition: 'opacity 0.01ms ease',
236
+ transform: 'scale(1)',
237
+ },
238
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
239
+ transform: 'scale(1)',
240
+ transition: 'opacity 0.01ms ease',
241
+ },
242
+ },
243
+ };
244
+ addComponents(components);
245
+ });
246
+ //# sourceMappingURL=tailwind-plugin-checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-checkbox.js","sourceRoot":"","sources":["../src/tailwind-plugin-checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AAIvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE;IACzD,MAAM,UAAU,GAAkB;QAChC,4EAA4E;QAC5E,UAAU;QACV,4EAA4E;QAC5E,eAAe,EAAE;YACf,qBAAqB,EAAE,MAAM;YAC7B,sBAAsB,EAAE,SAAS;YACjC,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,YAAY;YACxB,GAAG,EAAE,wCAAwC;YAC7C,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,MAAM;SACnB;QAED,4EAA4E;QAC5E,iCAAiC;QACjC,4EAA4E;QAC5E,qBAAqB,EAAE;YACrB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,GAAG;SACjB;QAED,4EAA4E;QAC5E,uBAAuB;QACvB,4EAA4E;QAC5E,mBAAmB,EAAE;YACnB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,SAAS,EAAE,UAAU;YACrB,KAAK,EAAE,0BAA0B;YACjC,MAAM,EAAE,0BAA0B;YAClC,YAAY,EAAE,oCAAoC;YAClD,MAAM,EAAE,0EAA0E;YAClF,UAAU,EAAE,wBAAwB;YACpC,UAAU,EACR,+IAA+I;SAClJ;QAED,4EAA4E;QAC5E,sBAAsB;QACtB,4EAA4E;QAC5E,oBAAoB,EAAE;YACpB,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,YAAY;YACvB,KAAK,EAAE,wBAAwB;YAC/B,aAAa,EAAE,MAAM;YACrB,UAAU,EAAE,gDAAgD;SAC7D;QAED,4EAA4E;QAC5E,gCAAgC;QAChC,4EAA4E;QAC5E,sEAAsE,EAAE;YACtE,UAAU,EAAE,oEAAoE;YAChF,WAAW,EAAE,oEAAoE;SAClF;QAED,yFAAyF,EAAE;YACzF,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,oGAAoG;SACjH;QAED,4EAA4E;QAC5E,cAAc;QACd,4EAA4E;QAC5E,4EAA4E,EAAE;YAC5E,UAAU,EAAE,oGAAoG;YAChH,WAAW,EAAE,oGAAoG;SAClH;QAED,yGAAyG,EAAE;YACzG,UAAU,EAAE,oGAAoG;YAChH,WAAW,EAAE,oGAAoG;SAClH;QAED,4EAA4E;QAC5E,iFAAiF;QACjF,4EAA4E;QAC5E,uGAAuG,EAAE;YACvG,SAAS,EAAE,YAAY;YACvB,kBAAkB,EAAE,OAAO;SAC5B;QAED,0GAA0G,EAAE;YAC1G,SAAS,EAAE,YAAY;YACvB,kBAAkB,EAAE,OAAO;SAC5B;QAED,4EAA4E;QAC5E,kCAAkC;QAClC,4EAA4E;QAC5E,uDAAuD,EAAE;YACvD,WAAW,EAAE,qCAAqC;YAClD,SAAS,EAAE,qDAAqD;SACjE;QAED,4EAA4E;QAC5E,iBAAiB;QACjB,4EAA4E;QAC5E,kDAAkD,EAAE;YAClD,UAAU,EAAE,kCAAkC;YAC9C,WAAW,EAAE,kCAAkC;YAC/C,aAAa,EAAE,MAAM;SACtB;QAED,+EAA+E,EAAE;YAC/E,UAAU,EAAE,kCAAkC;YAC9C,WAAW,EAAE,kCAAkC;SAChD;QAED,kGAAkG,EAAE;YAClG,KAAK,EAAE,kCAAkC;SAC1C;QAED,mDAAmD,EAAE;YACnD,KAAK,EAAE,kCAAkC;SAC1C;QAED,iDAAiD,EAAE;YACjD,aAAa,EAAE,MAAM;SACtB;QAED,4EAA4E;QAC5E,wBAAwB;QACxB,4EAA4E;QAC5E,yCAAyC,EAAE;YACzC,WAAW,EAAE,gEAAgE;SAC9E;QAED,4FAA4F,EAAE;YAC5F,WAAW,EAAE,gEAAgE;SAC9E;QAED,2CAA2C,EAAE;YAC3C,KAAK,EAAE,gEAAgE;SACxE;QAED,8GAA8G,EAAE;YAC9G,UAAU,EAAE,wBAAwB;YACpC,WAAW,EAAE,gEAAgE;SAC9E;QAED,iHAAiH,EAAE;YACjH,WAAW,EAAE,gEAAgE;SAC9E;QAED,6EAA6E,EAAE;YAC7E,WAAW,EAAE,gEAAgE;SAC9E;QAED,4EAA4E;QAC5E,gBAAgB;QAChB,4EAA4E;QAC5E,oBAAoB,EAAE;YACpB,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,GAAG,EAAE,UAAU;SAChB;QAED,qBAAqB,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YACxD,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;YACzD,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,kCAAkC;SAC1C;QAED,2BAA2B,EAAE;YAC3B,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;YACvD,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YAC1D,KAAK,EAAE,kCAAkC;SAC1C;QAED,qBAAqB,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;YACvD,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YAC1D,KAAK,EAAE,gEAAgE;SACxE;QAED,4EAA4E;QAC5E,gBAAgB;QAChB,4EAA4E;QAC5E,sEAAsE;QAEtE,kBAAkB,EAAE;YAClB,qBAAqB,EAAE,SAAS;YAChC,sBAAsB,EAAE,UAAU;SACnC;QAED,sCAAsC,EAAE;YACtC,QAAQ,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM;YACtD,UAAU,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ;SAC3D;QAED,kFAAkF,EAAE;YAClF,QAAQ,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YACxD,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;SAC1D;QAED,4EAA4E;QAC5E,iBAAiB;QACjB,4EAA4E;QAC5E,yCAAyC,EAAE;YACzC,mBAAmB,EAAE;gBACnB,UAAU,EAAE,iGAAiG;aAC9G;YACD,6EAA6E,EAAE;gBAC7E,SAAS,EAAE,UAAU;aACtB;YACD,oBAAoB,EAAE;gBACpB,UAAU,EAAE,qBAAqB;gBACjC,SAAS,EAAE,UAAU;aACtB;YACD,yFAAyF,EAAE;gBACzF,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,qBAAqB;aAClC;SACF;KACF,CAAA;IAED,aAAa,CAAC,UAAU,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA"}
@@ -0,0 +1,281 @@
1
+ import plugin from 'tailwindcss/plugin'
2
+ import type { CSSRuleObject } from 'tailwindcss/types/config'
3
+ declare let module: any
4
+
5
+ /**
6
+ * Checkbox component — a styled checkbox with label and description support.
7
+ *
8
+ * Class Names:
9
+ *
10
+ * btu-checkbox - Wrapper element
11
+ * btu-checkbox-input - The hidden <input type="checkbox">
12
+ * btu-checkbox-box - The visible checkbox square
13
+ * btu-checkbox-icon - Icon element inside the box (check or minus)
14
+ * btu-checkbox-text - Optional container for label, description, and error (flex column)
15
+ * btu-checkbox-label - Primary label text
16
+ * btu-checkbox-description - Secondary description text
17
+ * btu-checkbox-error - Error message text
18
+ * btu-checkbox-md - Medium size variant (20px, default is sm with no modifier)
19
+ * btu-checkbox-invalid - Error state modifier
20
+ *
21
+ * CSS Custom Properties:
22
+ *
23
+ * --checkbox-color-primary - Background and border when checked/indeterminate (default: oklch(primary-700))
24
+ * --checkbox-color-border - Border color in unchecked state (default: oklch(gray-300))
25
+ * --checkbox-color-error - Border/text color in error (default: oklch(error-600))
26
+ * --checkbox-border-radius - Corner rounding (default: 4px)
27
+ * --checkbox-label-spacing - Gap between box and label text (default: 0.75rem)
28
+ *
29
+ * Internal sizing (not intended for consumer override):
30
+ *
31
+ * --checkbox-box-size - Width/height of the checkbox square (set by size variant)
32
+ * --checkbox-icon-size - Width/height of the icon inside the box (set by size variant)
33
+ *
34
+ * Rendered DOM (the component generates this internally; consumers only write <btu-checkbox ...>):
35
+ *
36
+ * <btu-checkbox>
37
+ * <input type="checkbox" class="btu-checkbox-input">
38
+ * <span class="btu-checkbox-box">
39
+ * <btu-icon class="btu-checkbox-icon" symbol="check" style="--icon-size: var(--checkbox-icon-size)"></btu-icon>
40
+ * </span>
41
+ * <span class="btu-checkbox-text">
42
+ * <span class="btu-checkbox-label">Remember me</span>
43
+ * <span class="btu-checkbox-description">Save your login details</span>
44
+ * <span class="btu-checkbox-error">Error message here</span>
45
+ * </span>
46
+ * </btu-checkbox>
47
+ */
48
+
49
+ module.exports = plugin(function ({ addComponents, config }) {
50
+ const components: CSSRuleObject = {
51
+ // -------------------------------------------------------------------------
52
+ // Wrapper
53
+ // -------------------------------------------------------------------------
54
+ '.btu-checkbox': {
55
+ '--checkbox-box-size': '1rem',
56
+ '--checkbox-icon-size': '0.75rem',
57
+ display: 'inline-flex',
58
+ alignItems: 'flex-start',
59
+ gap: 'var(--checkbox-label-spacing, 0.75rem)',
60
+ cursor: 'pointer',
61
+ userSelect: 'none',
62
+ },
63
+
64
+ // -------------------------------------------------------------------------
65
+ // Hidden input (sr-only pattern)
66
+ // -------------------------------------------------------------------------
67
+ '.btu-checkbox-input': {
68
+ position: 'absolute',
69
+ width: '1px',
70
+ height: '1px',
71
+ padding: '0',
72
+ margin: '-1px',
73
+ overflow: 'hidden',
74
+ clipPath: 'inset(50%)',
75
+ whiteSpace: 'nowrap',
76
+ borderWidth: '0',
77
+ },
78
+
79
+ // -------------------------------------------------------------------------
80
+ // Visible checkbox box
81
+ // -------------------------------------------------------------------------
82
+ '.btu-checkbox-box': {
83
+ flexShrink: '0',
84
+ position: 'relative',
85
+ display: 'inline-flex',
86
+ alignItems: 'center',
87
+ justifyContent: 'center',
88
+ marginTop: '0.125rem',
89
+ width: 'var(--checkbox-box-size)',
90
+ height: 'var(--checkbox-box-size)',
91
+ borderRadius: 'var(--checkbox-border-radius, 4px)',
92
+ border: '1px solid var(--checkbox-color-border, oklch(var(--btu-theme-gray-300)))',
93
+ background: 'var(--btu-theme-white)',
94
+ transition:
95
+ 'transform 200ms cubic-bezier(0.12, 0.32, 0.54, 2), background 150ms ease-in-out, border-color 150ms ease-in-out, box-shadow 150ms ease-in-out',
96
+ },
97
+
98
+ // -------------------------------------------------------------------------
99
+ // Icon inside the box
100
+ // -------------------------------------------------------------------------
101
+ '.btu-checkbox-icon': {
102
+ opacity: '0',
103
+ transform: 'scale(0.5)',
104
+ color: 'var(--btu-theme-white)',
105
+ pointerEvents: 'none',
106
+ transition: 'transform 150ms ease-in, opacity 150ms ease-in',
107
+ },
108
+
109
+ // -------------------------------------------------------------------------
110
+ // Checked / indeterminate state
111
+ // -------------------------------------------------------------------------
112
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
113
+ background: 'var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700)))',
114
+ borderColor: 'var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700)))',
115
+ },
116
+
117
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
118
+ opacity: '1',
119
+ transform: 'scale(1)',
120
+ transition: 'transform 200ms cubic-bezier(0.12, 0.32, 0.54, 2), opacity 200ms cubic-bezier(0.12, 0.32, 0.54, 2)',
121
+ },
122
+
123
+ // -------------------------------------------------------------------------
124
+ // Hover state
125
+ // -------------------------------------------------------------------------
126
+ '.btu-checkbox:hover .btu-checkbox-input:not(:disabled) ~ .btu-checkbox-box': {
127
+ background: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), white 92%)',
128
+ borderColor: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
129
+ },
130
+
131
+ '.btu-checkbox:hover .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
132
+ background: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
133
+ borderColor: 'color-mix(in oklch, var(--checkbox-color-primary, oklch(var(--btu-theme-primary-700))), black 15%)',
134
+ },
135
+
136
+ // -------------------------------------------------------------------------
137
+ // Active press — box scale bounce (snap in fast, spring back with bounce bezier)
138
+ // -------------------------------------------------------------------------
139
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled, :checked, :indeterminate) ~ .btu-checkbox-box': {
140
+ transform: 'scale(0.9)',
141
+ transitionDuration: '0.05s',
142
+ },
143
+
144
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
145
+ transform: 'scale(1.1)',
146
+ transitionDuration: '0.05s',
147
+ },
148
+
149
+ // -------------------------------------------------------------------------
150
+ // Focus visible — ring on the box
151
+ // -------------------------------------------------------------------------
152
+ '.btu-checkbox-input:focus-visible ~ .btu-checkbox-box': {
153
+ borderColor: 'oklch(var(--btu-theme-primary-600))',
154
+ boxShadow: '0px 0px 0px 4px oklch(var(--btu-theme-primary-100))',
155
+ },
156
+
157
+ // -------------------------------------------------------------------------
158
+ // Disabled state
159
+ // -------------------------------------------------------------------------
160
+ '.btu-checkbox-input:disabled ~ .btu-checkbox-box': {
161
+ background: 'oklch(var(--btu-theme-gray-100))',
162
+ borderColor: 'oklch(var(--btu-theme-gray-300))',
163
+ pointerEvents: 'none',
164
+ },
165
+
166
+ '.btu-checkbox-input:disabled:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
167
+ background: 'oklch(var(--btu-theme-gray-100))',
168
+ borderColor: 'oklch(var(--btu-theme-gray-300))',
169
+ },
170
+
171
+ '.btu-checkbox-input:disabled:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
172
+ color: 'oklch(var(--btu-theme-gray-300))',
173
+ },
174
+
175
+ '.btu-checkbox-input:disabled ~ .btu-checkbox-text': {
176
+ color: 'oklch(var(--btu-theme-gray-300))',
177
+ },
178
+
179
+ '.btu-checkbox:has(.btu-checkbox-input:disabled)': {
180
+ pointerEvents: 'none',
181
+ },
182
+
183
+ // -------------------------------------------------------------------------
184
+ // Invalid / error state
185
+ // -------------------------------------------------------------------------
186
+ '.btu-checkbox-invalid .btu-checkbox-box': {
187
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
188
+ },
189
+
190
+ '.btu-checkbox-invalid .btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box': {
191
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
192
+ },
193
+
194
+ '.btu-checkbox-invalid .btu-checkbox-label': {
195
+ color: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
196
+ },
197
+
198
+ '.btu-checkbox-invalid:hover .btu-checkbox-input:not(:disabled, :checked, :indeterminate) ~ .btu-checkbox-box': {
199
+ background: 'var(--btu-theme-white)',
200
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
201
+ },
202
+
203
+ '.btu-checkbox-invalid:hover .btu-checkbox-input:not(:disabled):is(:checked, :indeterminate) ~ .btu-checkbox-box': {
204
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
205
+ },
206
+
207
+ '.btu-checkbox-invalid .btu-checkbox-input:focus-visible ~ .btu-checkbox-box': {
208
+ borderColor: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
209
+ },
210
+
211
+ // -------------------------------------------------------------------------
212
+ // Text elements
213
+ // -------------------------------------------------------------------------
214
+ '.btu-checkbox-text': {
215
+ display: 'flex',
216
+ flexDirection: 'column',
217
+ gap: '0.125rem',
218
+ },
219
+
220
+ '.btu-checkbox-label': {
221
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
222
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
223
+ fontWeight: '500',
224
+ color: 'oklch(var(--btu-theme-gray-700))',
225
+ },
226
+
227
+ '.btu-checkbox-description': {
228
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
229
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
230
+ color: 'oklch(var(--btu-theme-gray-500))',
231
+ },
232
+
233
+ '.btu-checkbox-error': {
234
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
235
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
236
+ color: 'var(--checkbox-color-error, oklch(var(--btu-theme-error-600)))',
237
+ },
238
+
239
+ // -------------------------------------------------------------------------
240
+ // Size variants
241
+ // -------------------------------------------------------------------------
242
+ // sm is the default — no modifier class needed, base dimensions apply
243
+
244
+ '.btu-checkbox-md': {
245
+ '--checkbox-box-size': '1.25rem',
246
+ '--checkbox-icon-size': '0.875rem',
247
+ },
248
+
249
+ '.btu-checkbox-md .btu-checkbox-label': {
250
+ fontSize: config('theme.fontSize.base')?.[0] ?? '1rem',
251
+ lineHeight: config('theme.fontSize.base')?.[1] ?? '1.5rem',
252
+ },
253
+
254
+ '.btu-checkbox-md .btu-checkbox-description, .btu-checkbox-md .btu-checkbox-error': {
255
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
256
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
257
+ },
258
+
259
+ // -------------------------------------------------------------------------
260
+ // Reduced motion
261
+ // -------------------------------------------------------------------------
262
+ '@media (prefers-reduced-motion: reduce)': {
263
+ '.btu-checkbox-box': {
264
+ transition: 'background 0.01ms ease, border-color 0.01ms ease, box-shadow 0.01ms ease, transform 0.01ms ease',
265
+ },
266
+ '.btu-checkbox:active .btu-checkbox-input:not(:disabled) ~ .btu-checkbox-box': {
267
+ transform: 'scale(1)',
268
+ },
269
+ '.btu-checkbox-icon': {
270
+ transition: 'opacity 0.01ms ease',
271
+ transform: 'scale(1)',
272
+ },
273
+ '.btu-checkbox-input:is(:checked, :indeterminate) ~ .btu-checkbox-box .btu-checkbox-icon': {
274
+ transform: 'scale(1)',
275
+ transition: 'opacity 0.01ms ease',
276
+ },
277
+ },
278
+ }
279
+
280
+ addComponents(components)
281
+ })
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tailwind-plugin-empty-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-empty-state.d.ts","sourceRoot":"","sources":["../src/tailwind-plugin-empty-state.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import plugin from 'tailwindcss/plugin';
2
+ /**
3
+ * Empty State component for displaying placeholder content when no data is available.
4
+ *
5
+ * Class Names:
6
+ *
7
+ * btu-empty-state - Base container styles
8
+ * btu-empty-state-sm - Small size variant
9
+ * btu-empty-state-md - Medium size variant
10
+ * btu-empty-state-lg - Large size variant
11
+ * btu-empty-state-graphic - Graphic container (icon, image, picture, or svg)
12
+ * btu-empty-state-content - Content wrapper (heading + description)
13
+ * btu-empty-state-title - Heading text
14
+ * btu-empty-state-description - Description text
15
+ * btu-empty-state-actions - Actions container; applied to an internal
16
+ * btu-button-group (variant="spaced"). The button-group provides display,
17
+ * flex-flow, and gap; this class only collapses the container when empty.
18
+ *
19
+ * Example Usage:
20
+ *
21
+ * <btu-empty-state class="btu-empty-state btu-empty-state-md">
22
+ * <div class="btu-empty-state-graphic">...</div>
23
+ * <div class="btu-empty-state-content">
24
+ * <h2 class="btu-empty-state-title">No items found</h2>
25
+ * <p class="btu-empty-state-description">Try adjusting your filters.</p>
26
+ * </div>
27
+ * <btu-button-group class="btu-empty-state-actions" variant="spaced">...</btu-button-group>
28
+ * </btu-empty-state>
29
+ */
30
+ module.exports = plugin(function ({ addComponents }) {
31
+ const className = '.btu-empty-state';
32
+ // Graphic sizes per variant (img/svg/picture). btu-icon children are sized by the
33
+ // component via the icon's own size prop.
34
+ const graphicSize = { sm: '118px', md: '128px', lg: '160px' };
35
+ const graphicChildren = (size) => ({
36
+ [`& ${className}-graphic > img, & ${className}-graphic > svg, & ${className}-graphic > picture`]: {
37
+ width: size,
38
+ height: size,
39
+ },
40
+ });
41
+ addComponents({
42
+ // Base container
43
+ [className]: {
44
+ containerType: 'inline-size',
45
+ display: 'flex',
46
+ flexDirection: 'column',
47
+ alignItems: 'center',
48
+ justifyContent: 'center',
49
+ textAlign: 'center',
50
+ padding: '2rem',
51
+ },
52
+ // Graphic container
53
+ [`${className}-graphic`]: {
54
+ display: 'flex',
55
+ alignItems: 'center',
56
+ justifyContent: 'center',
57
+ '&:empty': { display: 'none' },
58
+ '& > img, & > svg': {
59
+ objectFit: 'contain',
60
+ },
61
+ '& > picture': {
62
+ display: 'block',
63
+ },
64
+ '& > picture > img': {
65
+ width: '100%',
66
+ height: '100%',
67
+ objectFit: 'contain',
68
+ },
69
+ },
70
+ // Content wrapper (heading + description)
71
+ [`${className}-content`]: {
72
+ display: 'flex',
73
+ flexDirection: 'column',
74
+ maxWidth: 'var(--empty-state-max-width, min(75cqw, 360px))',
75
+ },
76
+ // Size variants (gap, description text, graphic size, content gap)
77
+ [`${className}-sm`]: {
78
+ gap: '1rem',
79
+ [`& ${className}-description`]: { fontSize: '0.875rem', lineHeight: '1.25rem' },
80
+ ...graphicChildren(graphicSize.sm),
81
+ [`& ${className}-content`]: { gap: '0.25rem' },
82
+ },
83
+ [`${className}-md`]: {
84
+ gap: '1.5rem',
85
+ [`& ${className}-description`]: { fontSize: '0.875rem', lineHeight: '1.25rem' },
86
+ ...graphicChildren(graphicSize.md),
87
+ [`& ${className}-content`]: { gap: '0.5rem' },
88
+ },
89
+ [`${className}-lg`]: {
90
+ gap: '1.5rem',
91
+ [`& ${className}-description`]: { fontSize: '1rem', lineHeight: '1.5rem' },
92
+ ...graphicChildren(graphicSize.lg),
93
+ [`& ${className}-content`]: { gap: '0.5rem' },
94
+ },
95
+ // Title
96
+ [`${className}-title`]: {
97
+ color: 'var(--empty-state-color-heading, oklch(var(--btu-theme-gray-900)))',
98
+ margin: '0',
99
+ },
100
+ // Description
101
+ [`${className}-description`]: {
102
+ color: 'var(--empty-state-color-description, oklch(var(--btu-theme-gray-500)))',
103
+ margin: '0',
104
+ },
105
+ // Actions container — applied to an internal btu-button-group. Layout, gap,
106
+ // and size propagation come from the button-group plugin; we only need to
107
+ // collapse the container when it has no children.
108
+ [`${className}-actions`]: {
109
+ '&:empty': { display: 'none' },
110
+ },
111
+ });
112
+ });
113
+ //# sourceMappingURL=tailwind-plugin-empty-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-empty-state.js","sourceRoot":"","sources":["../src/tailwind-plugin-empty-state.ts"],"names":[],"mappings":"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"}