@brightspot/ui 1.10.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 (264) hide show
  1. package/dist/components/action-bar/ActionBar.d.ts +163 -0
  2. package/dist/components/action-bar/ActionBar.d.ts.map +1 -0
  3. package/dist/components/action-bar/ActionBar.js +479 -0
  4. package/dist/components/action-bar/ActionBar.js.map +1 -0
  5. package/dist/components/action-bar/ActionItem.d.ts +103 -0
  6. package/dist/components/action-bar/ActionItem.d.ts.map +1 -0
  7. package/dist/components/action-bar/ActionItem.js +237 -0
  8. package/dist/components/action-bar/ActionItem.js.map +1 -0
  9. package/dist/components/avatar/AvatarGroup.d.ts +3 -0
  10. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -1
  11. package/dist/components/avatar/AvatarGroup.js +3 -0
  12. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  13. package/dist/components/badge/Badge.d.ts +3 -1
  14. package/dist/components/badge/Badge.d.ts.map +1 -1
  15. package/dist/components/badge/Badge.js +2 -0
  16. package/dist/components/badge/Badge.js.map +1 -1
  17. package/dist/components/button-group/ButtonGroup.d.ts +138 -0
  18. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -0
  19. package/dist/components/button-group/ButtonGroup.js +436 -0
  20. package/dist/components/button-group/ButtonGroup.js.map +1 -0
  21. package/dist/components/checkbox/Checkbox.d.ts +107 -0
  22. package/dist/components/checkbox/Checkbox.d.ts.map +1 -0
  23. package/dist/components/checkbox/Checkbox.js +224 -0
  24. package/dist/components/checkbox/Checkbox.js.map +1 -0
  25. package/dist/components/circular-progress/CircularProgress.d.ts +2 -2
  26. package/dist/components/circular-progress/CircularProgress.js +2 -2
  27. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts +7 -2
  28. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  29. package/dist/components/copy-to-clipboard/CopyToClipboard.js +10 -5
  30. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  31. package/dist/components/dropdown/Dropdown.d.ts +8 -6
  32. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  33. package/dist/components/dropdown/Dropdown.js +33 -22
  34. package/dist/components/dropdown/Dropdown.js.map +1 -1
  35. package/dist/components/dropdown/DropdownItem.d.ts +28 -7
  36. package/dist/components/dropdown/DropdownItem.d.ts.map +1 -1
  37. package/dist/components/dropdown/DropdownItem.js +41 -16
  38. package/dist/components/dropdown/DropdownItem.js.map +1 -1
  39. package/dist/components/dropdown/DropdownMenu.d.ts +6 -8
  40. package/dist/components/dropdown/DropdownMenu.d.ts.map +1 -1
  41. package/dist/components/dropdown/DropdownMenu.js +22 -37
  42. package/dist/components/dropdown/DropdownMenu.js.map +1 -1
  43. package/dist/components/empty-state/EmptyState.css +4 -0
  44. package/dist/components/empty-state/EmptyState.d.ts +103 -0
  45. package/dist/components/empty-state/EmptyState.d.ts.map +1 -0
  46. package/dist/components/empty-state/EmptyState.js +209 -0
  47. package/dist/components/empty-state/EmptyState.js.map +1 -0
  48. package/dist/components/icon/Icon.d.ts +23 -10
  49. package/dist/components/icon/Icon.d.ts.map +1 -1
  50. package/dist/components/icon/Icon.js +40 -9
  51. package/dist/components/icon/Icon.js.map +1 -1
  52. package/dist/components/icon-button/IconButton.d.ts +7 -21
  53. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  54. package/dist/components/icon-button/IconButton.js +12 -18
  55. package/dist/components/icon-button/IconButton.js.map +1 -1
  56. package/dist/components/linear-progress/LinearProgress.d.ts +2 -2
  57. package/dist/components/linear-progress/LinearProgress.js +2 -2
  58. package/dist/components/pagination/Pagination.d.ts +33 -4
  59. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  60. package/dist/components/pagination/Pagination.js +88 -24
  61. package/dist/components/pagination/Pagination.js.map +1 -1
  62. package/dist/components/popover/Popover.d.ts +6 -0
  63. package/dist/components/popover/Popover.d.ts.map +1 -1
  64. package/dist/components/popover/Popover.js +6 -0
  65. package/dist/components/popover/Popover.js.map +1 -1
  66. package/dist/components/switch/Switch.d.ts +5 -1
  67. package/dist/components/switch/Switch.d.ts.map +1 -1
  68. package/dist/components/switch/Switch.js +10 -6
  69. package/dist/components/switch/Switch.js.map +1 -1
  70. package/dist/components/tabs/Tab.d.ts +108 -0
  71. package/dist/components/tabs/Tab.d.ts.map +1 -0
  72. package/dist/components/tabs/Tab.js +152 -0
  73. package/dist/components/tabs/Tab.js.map +1 -0
  74. package/dist/components/tabs/Tabs.d.ts +126 -0
  75. package/dist/components/tabs/Tabs.d.ts.map +1 -0
  76. package/dist/components/tabs/Tabs.js +390 -0
  77. package/dist/components/tabs/Tabs.js.map +1 -0
  78. package/dist/components/upload/Upload.d.ts +157 -0
  79. package/dist/components/upload/Upload.d.ts.map +1 -0
  80. package/dist/components/upload/Upload.js +538 -0
  81. package/dist/components/upload/Upload.js.map +1 -0
  82. package/dist/components/upload/UploadItem.d.ts +73 -0
  83. package/dist/components/upload/UploadItem.d.ts.map +1 -0
  84. package/dist/components/upload/UploadItem.js +180 -0
  85. package/dist/components/upload/UploadItem.js.map +1 -0
  86. package/dist/components/widget/Widget.d.ts +1 -6
  87. package/dist/components/widget/Widget.d.ts.map +1 -1
  88. package/dist/components/widget/Widget.js +1 -6
  89. package/dist/components/widget/Widget.js.map +1 -1
  90. package/dist/custom-elements.json +8445 -1989
  91. package/dist/storybook/assets/ActionBar.stories-DRIVI-W2.js +408 -0
  92. package/dist/storybook/assets/ActionItem.stories-5qlgxYNB.js +203 -0
  93. package/dist/storybook/assets/{Avatar.stories-B26mRkkZ.js → Avatar.stories-B3VkhRhP.js} +2 -2
  94. package/dist/storybook/assets/{AvatarGroup.stories-J7lVGsMY.js → AvatarGroup.stories-DOfim2NY.js} +5 -5
  95. package/dist/storybook/assets/{Badge.stories-BpTIV61M.js → Badge.stories-B04VNAcc.js} +2 -2
  96. package/dist/storybook/assets/{Button-Dg-fIrzT.js → Button-CILTcGRT.js} +1 -1
  97. package/dist/storybook/assets/{Button.stories-gPKRVbxk.js → Button.stories-CzWAltrX.js} +1 -1
  98. package/dist/storybook/assets/ButtonGroup.stories-1uAJf79o.js +588 -0
  99. package/dist/storybook/assets/{Celebrate.stories-DbY-sKEe.js → Celebrate.stories-BEqj0VnW.js} +7 -7
  100. package/dist/storybook/assets/Checkbox.stories-DXAGFS0M.js +141 -0
  101. package/dist/storybook/assets/{CircularProgress.stories-DeH5JYX_.js → CircularProgress.stories-D4rftw22.js} +7 -7
  102. package/dist/storybook/assets/{ClipboardMixin.stories-C-lZ4uuw.js → ClipboardMixin.stories-z2n2HWt1.js} +31 -28
  103. package/dist/storybook/assets/{Color-6BZIO3FS-Cu6zVIuG.js → Color-6BZIO3FS-C6KyMgZz.js} +1 -1
  104. package/dist/storybook/assets/{Colors.stories-D6XYMrTD.js → Colors.stories-CX-Ny3B_.js} +1 -1
  105. package/dist/storybook/assets/{CombinedEffects.stories-jFekKTYg.js → CombinedEffects.stories-BkqtiVHp.js} +33 -33
  106. package/dist/storybook/assets/{ComponentStatesMixin-g50hRCPT.js → ComponentStatesMixin-DLd0feFg.js} +1 -1
  107. package/dist/storybook/assets/{ComponentStatesMixin.stories-D3Q5pR38.js → ComponentStatesMixin.stories-D6Yc5Jgl.js} +3 -3
  108. package/dist/storybook/assets/{CopyToClipboard.stories-COZZ1VC2.js → CopyToClipboard.stories-B-omwDDJ.js} +16 -16
  109. package/dist/storybook/assets/{Debounce.stories-Dl10LAnx.js → Debounce.stories-B2vE5QIx.js} +9 -9
  110. package/dist/storybook/assets/{DocsRenderer-LL677BLK-CFLtMbUx.js → DocsRenderer-LL677BLK-DNUlRvMg.js} +3 -3
  111. package/dist/storybook/assets/{Dropdown.stories-Drwq-0Z2.js → Dropdown.stories-_bx4WDLr.js} +95 -68
  112. package/dist/storybook/assets/EmptyState.stories-CGMbmo77.js +318 -0
  113. package/dist/storybook/assets/{Events.stories-dODeR-g-.js → Events.stories-CkQYKcoZ.js} +1 -1
  114. package/dist/storybook/assets/{Heading.stories-CH7_-_q3.js → Heading.stories-BU5Do_od.js} +1 -1
  115. package/dist/storybook/assets/{HueRipple.stories-CH1Y739k.js → HueRipple.stories-Di2zmxo3.js} +11 -11
  116. package/dist/storybook/assets/Icon.stories-Dk4ZXhhJ.js +441 -0
  117. package/dist/storybook/assets/{IconButton.stories-DuzqvcnN.js → IconButton.stories-BSCiXPXa.js} +126 -146
  118. package/dist/storybook/assets/{LinearProgress.stories-C7IdnJd3.js → LinearProgress.stories-BGxPZuni.js} +7 -7
  119. package/dist/storybook/assets/Pagination.stories-z3Zq8b4f.js +252 -0
  120. package/dist/storybook/assets/{Popover.stories-Ca1F-wrI.js → Popover.stories-C9GxWcax.js} +33 -62
  121. package/dist/storybook/assets/ReadyMixin-CQw8N6P9.js +1 -0
  122. package/dist/storybook/assets/RovingTabindexMixin.stories-ByxLBi6m.js +192 -0
  123. package/dist/storybook/assets/{Rtc.stories-BVJc1vCA.js → Rtc.stories-DQJlCXWR.js} +3 -3
  124. package/dist/storybook/assets/ScrollShadow.stories-gjTIAbUA.js +17 -0
  125. package/dist/storybook/assets/{Switch.stories-BEEHP8mD.js → Switch.stories-BEeqPZiP.js} +21 -21
  126. package/dist/storybook/assets/Tab.stories-DpB3I-WZ.js +218 -0
  127. package/dist/storybook/assets/Tabs.stories-C6mG6Xi7.js +211 -0
  128. package/dist/storybook/assets/{Throttle.stories-C4xsYeAb.js → Throttle.stories-x9tpGeQh.js} +10 -10
  129. package/dist/storybook/assets/{Tooltip.stories-Ccm4AnSv.js → Tooltip.stories-CqcLqdmc.js} +2 -2
  130. package/dist/storybook/assets/Upload.stories-CMaAbCSH.js +447 -0
  131. package/dist/storybook/assets/UploadItem.stories-GB98L3JQ.js +167 -0
  132. package/dist/storybook/assets/{Welcome.stories-Degjk-M0.js → Welcome.stories-6h9cUZ7v.js} +1 -1
  133. package/dist/storybook/assets/{Widget.stories-OKnZ9sDs.js → Widget.stories-DiA1PR6Y.js} +13 -13
  134. package/dist/storybook/assets/{WithTooltip-65CFNBJE-CXL3TyJ2.js → WithTooltip-65CFNBJE-DTsHhBb_.js} +2 -2
  135. package/dist/storybook/assets/{blocks-DLdUKG_W.js → blocks-IXdn9TGW.js} +5 -5
  136. package/dist/storybook/assets/{formatter-EIJCOSYU-29NCxjfM.js → formatter-EIJCOSYU-Cum4J6N4.js} +1 -1
  137. package/dist/storybook/assets/if-defined-CgfCxQoV.js +1 -0
  138. package/dist/storybook/assets/iframe-BgFj0b5u.css +1 -0
  139. package/dist/storybook/assets/{iframe-BqvwP3or.js → iframe-Sf9RHZFu.js} +200 -200
  140. package/dist/storybook/assets/{index-BIyTv1BF.js → index-D605PvQH.js} +1 -1
  141. package/dist/storybook/assets/onFind-C41m8c_a.js +1 -0
  142. package/dist/storybook/assets/{onFind.stories-D64-QZqf.js → onFind.stories-MOTfGlJd.js} +53 -77
  143. package/dist/storybook/assets/{onRemove.stories-BICsnIJL.js → onRemove.stories-DX58Bf6f.js} +6 -10
  144. package/dist/storybook/assets/{onVisible.stories-DpDZP9_5.js → onVisible.stories-NNFeFeD8.js} +3 -3
  145. package/dist/storybook/assets/style-map-B99QiqCo.js +1 -0
  146. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-Bz_DuQj8.js → syntaxhighlighter-ED5Y7EFY-BqQ-o9mS.js} +1 -1
  147. package/dist/storybook/box-illustration.svg +51 -0
  148. package/dist/storybook/cloud-illustration.svg +49 -0
  149. package/dist/storybook/docs-illustration.svg +92 -0
  150. package/dist/storybook/iframe.html +2 -2
  151. package/dist/storybook/index.json +1 -1
  152. package/dist/storybook/project.json +1 -1
  153. package/dist/tailwind-plugin-action-bar.d.ts +2 -0
  154. package/dist/tailwind-plugin-action-bar.d.ts.map +1 -0
  155. package/dist/tailwind-plugin-action-bar.js +120 -0
  156. package/dist/tailwind-plugin-action-bar.js.map +1 -0
  157. package/dist/tailwind-plugin-action-bar.ts +134 -0
  158. package/dist/tailwind-plugin-badge.js +5 -6
  159. package/dist/tailwind-plugin-badge.js.map +1 -1
  160. package/dist/tailwind-plugin-badge.ts +5 -6
  161. package/dist/tailwind-plugin-button-group.d.ts +2 -0
  162. package/dist/tailwind-plugin-button-group.d.ts.map +1 -0
  163. package/dist/tailwind-plugin-button-group.js +215 -0
  164. package/dist/tailwind-plugin-button-group.js.map +1 -0
  165. package/dist/tailwind-plugin-button-group.ts +238 -0
  166. package/dist/tailwind-plugin-button.js +2 -1
  167. package/dist/tailwind-plugin-button.js.map +1 -1
  168. package/dist/tailwind-plugin-button.ts +2 -1
  169. package/dist/tailwind-plugin-checkbox.d.ts +2 -0
  170. package/dist/tailwind-plugin-checkbox.d.ts.map +1 -0
  171. package/dist/tailwind-plugin-checkbox.js +246 -0
  172. package/dist/tailwind-plugin-checkbox.js.map +1 -0
  173. package/dist/tailwind-plugin-checkbox.ts +281 -0
  174. package/dist/tailwind-plugin-empty-state.d.ts +2 -0
  175. package/dist/tailwind-plugin-empty-state.d.ts.map +1 -0
  176. package/dist/tailwind-plugin-empty-state.js +113 -0
  177. package/dist/tailwind-plugin-empty-state.js.map +1 -0
  178. package/dist/tailwind-plugin-empty-state.ts +124 -0
  179. package/dist/tailwind-plugin-icon.js +122 -18
  180. package/dist/tailwind-plugin-icon.js.map +1 -1
  181. package/dist/tailwind-plugin-icon.ts +131 -18
  182. package/dist/tailwind-plugin-loader.js +3 -3
  183. package/dist/tailwind-plugin-loader.ts +3 -3
  184. package/dist/tailwind-plugin-pagination.js +13 -23
  185. package/dist/tailwind-plugin-pagination.js.map +1 -1
  186. package/dist/tailwind-plugin-pagination.ts +15 -25
  187. package/dist/tailwind-plugin-tabs.d.ts +2 -0
  188. package/dist/tailwind-plugin-tabs.d.ts.map +1 -0
  189. package/dist/tailwind-plugin-tabs.js +158 -0
  190. package/dist/tailwind-plugin-tabs.js.map +1 -0
  191. package/dist/tailwind-plugin-tabs.ts +169 -0
  192. package/dist/tailwind-plugin-upload.d.ts +2 -0
  193. package/dist/tailwind-plugin-upload.d.ts.map +1 -0
  194. package/dist/tailwind-plugin-upload.js +322 -0
  195. package/dist/tailwind-plugin-upload.js.map +1 -0
  196. package/dist/tailwind-plugin-upload.ts +362 -0
  197. package/dist/tailwind.config.d.ts.map +1 -1
  198. package/dist/tailwind.config.js +1 -0
  199. package/dist/tailwind.config.js.map +1 -1
  200. package/dist/tailwind.config.ts +1 -0
  201. package/dist/util/ClipboardMixin.d.ts +7 -2
  202. package/dist/util/ClipboardMixin.d.ts.map +1 -1
  203. package/dist/util/ClipboardMixin.js +15 -13
  204. package/dist/util/ClipboardMixin.js.map +1 -1
  205. package/dist/util/ComponentStatesMixin.d.ts +2 -1
  206. package/dist/util/ComponentStatesMixin.d.ts.map +1 -1
  207. package/dist/util/ComponentStatesMixin.js +4 -0
  208. package/dist/util/ComponentStatesMixin.js.map +1 -1
  209. package/dist/util/EventEmitterMixin.d.ts +58 -4
  210. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  211. package/dist/util/EventEmitterMixin.js +5 -2
  212. package/dist/util/EventEmitterMixin.js.map +1 -1
  213. package/dist/util/ProgressMixin.d.ts +9 -2
  214. package/dist/util/ProgressMixin.d.ts.map +1 -1
  215. package/dist/util/ProgressMixin.js +22 -18
  216. package/dist/util/ProgressMixin.js.map +1 -1
  217. package/dist/util/RovingTabindexMixin.d.ts +46 -0
  218. package/dist/util/RovingTabindexMixin.d.ts.map +1 -0
  219. package/dist/util/RovingTabindexMixin.js +83 -0
  220. package/dist/util/RovingTabindexMixin.js.map +1 -0
  221. package/dist/util/TetherLayout.d.ts.map +1 -1
  222. package/dist/util/TetherLayout.js +3 -0
  223. package/dist/util/TetherLayout.js.map +1 -1
  224. package/dist/util/TooltipMixin.d.ts.map +1 -1
  225. package/dist/util/TooltipMixin.js +5 -4
  226. package/dist/util/TooltipMixin.js.map +1 -1
  227. package/dist/util/upload.d.ts +53 -0
  228. package/dist/util/upload.d.ts.map +1 -0
  229. package/dist/util/upload.js +113 -0
  230. package/dist/util/upload.js.map +1 -0
  231. package/docs/components/ActionBar.md +77 -0
  232. package/docs/components/ActionItem.md +101 -0
  233. package/docs/components/Avatar.md +42 -12
  234. package/docs/components/AvatarGroup.md +4 -3
  235. package/docs/components/Badge.md +13 -1
  236. package/docs/components/ButtonGroup.md +91 -0
  237. package/docs/components/Checkbox.md +91 -0
  238. package/docs/components/CircularProgress.md +41 -12
  239. package/docs/components/CopyToClipboard.md +13 -11
  240. package/docs/components/Dropdown.md +51 -26
  241. package/docs/components/DropdownItem.md +44 -27
  242. package/docs/components/DropdownMenu.md +14 -14
  243. package/docs/components/EmptyState.md +75 -0
  244. package/docs/components/Icon.md +22 -14
  245. package/docs/components/IconButton.md +46 -21
  246. package/docs/components/LinearProgress.md +43 -4
  247. package/docs/components/Pagination.md +38 -34
  248. package/docs/components/Popover.md +16 -0
  249. package/docs/components/README.md +9 -0
  250. package/docs/components/Switch.md +21 -16
  251. package/docs/components/Tab.md +79 -0
  252. package/docs/components/Tabs.md +85 -0
  253. package/docs/components/Upload.md +112 -0
  254. package/docs/components/UploadItem.md +61 -0
  255. package/docs/components/Widget.md +12 -6
  256. package/package.json +4 -2
  257. package/dist/storybook/assets/Icon.stories-CPjM-jTU.js +0 -264
  258. package/dist/storybook/assets/Pagination.stories-C4cLjS_9.js +0 -272
  259. package/dist/storybook/assets/ReadyMixin-DNZ5dCsZ.js +0 -1
  260. package/dist/storybook/assets/ScrollShadow.stories-C3W5o9ZW.js +0 -17
  261. package/dist/storybook/assets/if-defined-BZFPaJjl.js +0 -1
  262. package/dist/storybook/assets/iframe-C5bIZMJ5.css +0 -1
  263. package/dist/storybook/assets/onFind-1l3EPW-I.js +0 -1
  264. package/dist/storybook/assets/style-map-CBrSnxRe.js +0 -1
@@ -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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"}
@@ -0,0 +1,124 @@
1
+ import plugin from 'tailwindcss/plugin'
2
+ declare let module: any
3
+
4
+ /**
5
+ * Empty State component for displaying placeholder content when no data is available.
6
+ *
7
+ * Class Names:
8
+ *
9
+ * btu-empty-state - Base container styles
10
+ * btu-empty-state-sm - Small size variant
11
+ * btu-empty-state-md - Medium size variant
12
+ * btu-empty-state-lg - Large size variant
13
+ * btu-empty-state-graphic - Graphic container (icon, image, picture, or svg)
14
+ * btu-empty-state-content - Content wrapper (heading + description)
15
+ * btu-empty-state-title - Heading text
16
+ * btu-empty-state-description - Description text
17
+ * btu-empty-state-actions - Actions container; applied to an internal
18
+ * btu-button-group (variant="spaced"). The button-group provides display,
19
+ * flex-flow, and gap; this class only collapses the container when empty.
20
+ *
21
+ * Example Usage:
22
+ *
23
+ * <btu-empty-state class="btu-empty-state btu-empty-state-md">
24
+ * <div class="btu-empty-state-graphic">...</div>
25
+ * <div class="btu-empty-state-content">
26
+ * <h2 class="btu-empty-state-title">No items found</h2>
27
+ * <p class="btu-empty-state-description">Try adjusting your filters.</p>
28
+ * </div>
29
+ * <btu-button-group class="btu-empty-state-actions" variant="spaced">...</btu-button-group>
30
+ * </btu-empty-state>
31
+ */
32
+
33
+ module.exports = plugin(function ({ addComponents }) {
34
+ const className = '.btu-empty-state'
35
+
36
+ // Graphic sizes per variant (img/svg/picture). btu-icon children are sized by the
37
+ // component via the icon's own size prop.
38
+ const graphicSize = { sm: '118px', md: '128px', lg: '160px' } as const
39
+
40
+ const graphicChildren = (size: string) => ({
41
+ [`& ${className}-graphic > img, & ${className}-graphic > svg, & ${className}-graphic > picture`]: {
42
+ width: size,
43
+ height: size,
44
+ },
45
+ })
46
+
47
+ addComponents({
48
+ // Base container
49
+ [className]: {
50
+ containerType: 'inline-size',
51
+ display: 'flex',
52
+ flexDirection: 'column',
53
+ alignItems: 'center',
54
+ justifyContent: 'center',
55
+ textAlign: 'center',
56
+ padding: '2rem',
57
+ },
58
+
59
+ // Graphic container
60
+ [`${className}-graphic`]: {
61
+ display: 'flex',
62
+ alignItems: 'center',
63
+ justifyContent: 'center',
64
+ '&:empty': { display: 'none' },
65
+ '& > img, & > svg': {
66
+ objectFit: 'contain',
67
+ },
68
+ '& > picture': {
69
+ display: 'block',
70
+ },
71
+ '& > picture > img': {
72
+ width: '100%',
73
+ height: '100%',
74
+ objectFit: 'contain',
75
+ },
76
+ },
77
+
78
+ // Content wrapper (heading + description)
79
+ [`${className}-content`]: {
80
+ display: 'flex',
81
+ flexDirection: 'column',
82
+ maxWidth: 'var(--empty-state-max-width, min(75cqw, 360px))',
83
+ },
84
+
85
+ // Size variants (gap, description text, graphic size, content gap)
86
+ [`${className}-sm`]: {
87
+ gap: '1rem',
88
+ [`& ${className}-description`]: { fontSize: '0.875rem', lineHeight: '1.25rem' },
89
+ ...graphicChildren(graphicSize.sm),
90
+ [`& ${className}-content`]: { gap: '0.25rem' },
91
+ },
92
+ [`${className}-md`]: {
93
+ gap: '1.5rem',
94
+ [`& ${className}-description`]: { fontSize: '0.875rem', lineHeight: '1.25rem' },
95
+ ...graphicChildren(graphicSize.md),
96
+ [`& ${className}-content`]: { gap: '0.5rem' },
97
+ },
98
+ [`${className}-lg`]: {
99
+ gap: '1.5rem',
100
+ [`& ${className}-description`]: { fontSize: '1rem', lineHeight: '1.5rem' },
101
+ ...graphicChildren(graphicSize.lg),
102
+ [`& ${className}-content`]: { gap: '0.5rem' },
103
+ },
104
+
105
+ // Title
106
+ [`${className}-title`]: {
107
+ color: 'var(--empty-state-color-heading, oklch(var(--btu-theme-gray-900)))',
108
+ margin: '0',
109
+ },
110
+
111
+ // Description
112
+ [`${className}-description`]: {
113
+ color: 'var(--empty-state-color-description, oklch(var(--btu-theme-gray-500)))',
114
+ margin: '0',
115
+ },
116
+
117
+ // Actions container — applied to an internal btu-button-group. Layout, gap,
118
+ // and size propagation come from the button-group plugin; we only need to
119
+ // collapse the container when it has no children.
120
+ [`${className}-actions`]: {
121
+ '&:empty': { display: 'none' },
122
+ },
123
+ })
124
+ })