@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
@@ -34,7 +34,7 @@ module.exports = plugin(function ({ addComponents, theme, e, matchUtilities, add
34
34
  for (const key in colors) {
35
35
  badgeColors.push({
36
36
  [`${className}-${e(key)}`]: {
37
- '--Icon-size': iconSizes['xs'],
37
+ '--icon-size': iconSizes['xs'],
38
38
  backgroundColor: `var(--badge-color-background, oklch(var(--btu-theme-${key}-50)))`,
39
39
  color: `var(--badge-color-foreground, oklch(var(--btu-theme-${key}-700)))`,
40
40
  textDecoration: 'underline',
@@ -76,7 +76,7 @@ module.exports = plugin(
76
76
  for (const key in colors) {
77
77
  badgeColors.push({
78
78
  [`${className}-${e(key)}`]: {
79
- '--Icon-size': iconSizes['xs'],
79
+ '--icon-size': iconSizes['xs'],
80
80
  backgroundColor: `var(--badge-color-background, oklch(var(--btu-theme-${key}-50)))`,
81
81
  color: `var(--badge-color-foreground, oklch(var(--btu-theme-${key}-700)))`,
82
82
  textDecoration: 'underline',
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tailwind-plugin-button-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-button-group.d.ts","sourceRoot":"","sources":["../src/tailwind-plugin-button-group.ts"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import plugin from 'tailwindcss/plugin';
2
+ /**
3
+ * Button Group — Tailwind CSS plugin for grouping related buttons.
4
+ *
5
+ * Provides connected (joined) and spaced layouts with horizontal/vertical orientation.
6
+ * Supports both direct `.btu-button` children and `btu-icon-button` children.
7
+ * `btu-icon-button` uses `display: contents` so its inner button participates
8
+ * directly in the group's flex layout.
9
+ *
10
+ * Selection uses a circular wipe transition: a `::after` pseudo-element with
11
+ * `clip-path: circle()` reveals the selection color from the center outward.
12
+ *
13
+ * Class Names:
14
+ *
15
+ * btu-button-group - Base group container
16
+ *
17
+ * CSS Custom Properties:
18
+ *
19
+ * --button-group-gap - Gap between buttons in spaced variant (default: spacing.sm)
20
+ * --button-group-border-radius - Outer corner radius in connected variant (default: 0.5rem)
21
+ * --button-group-border-color - Internal divider color in connected variant (default: gray-300)
22
+ * --button-group-selection-bg - Selection background color (auto-set per color variant)
23
+ * --button-group-selection-color - Selection text color (auto-set per color variant)
24
+ */
25
+ module.exports = plugin(function ({ addComponents, addBase, theme }) {
26
+ const connected = 'btu-button-group[variant="connected"]';
27
+ const connectedH = `${connected}[orientation="horizontal"]`;
28
+ const connectedV = `${connected}[orientation="vertical"]`;
29
+ const allSelected = `${connected}[data-all-selected]`;
30
+ const borderColor = 'var(--button-group-border-color, oklch(var(--btu-theme-gray-300)))';
31
+ const outerRadius = 'var(--button-group-border-radius, 0.5rem)';
32
+ const skipColors = new Set(['currentColor', 'transparent', 'white', 'black', 'ai']);
33
+ const colors = theme('colors') || {};
34
+ const components = {
35
+ // ─── Base ─────────────────────────────────────────────────────────
36
+ '.btu-button-group': {
37
+ display: 'inline-flex',
38
+ alignItems: 'stretch',
39
+ flexWrap: 'nowrap',
40
+ flexShrink: '0',
41
+ },
42
+ // ─── Icon-button: remove wrapper box so inner button is the flex item ──
43
+ '.btu-button-group > btu-icon-button': {
44
+ display: 'contents',
45
+ },
46
+ // ─── Orientation ──────────────────────────────────────────────────
47
+ 'btu-button-group[orientation="vertical"]': {
48
+ flexDirection: 'column',
49
+ },
50
+ // ─── Spaced variant ───────────────────────────────────────────────
51
+ 'btu-button-group[variant="spaced"]': {
52
+ gap: 'var(--button-group-gap, var(--gap-s, 0.5rem))',
53
+ },
54
+ // ─── slot="end" auto-margin ──────────────────────────────────────
55
+ // Direct children and inner .btu-button (for display:contents wrappers like btu-icon-button)
56
+ 'btu-button-group[orientation="horizontal"] > [slot="end"], btu-button-group[orientation="horizontal"] > [slot="end"] > .btu-button': {
57
+ marginInlineStart: 'auto',
58
+ },
59
+ 'btu-button-group[orientation="vertical"] > [slot="end"], btu-button-group[orientation="vertical"] > [slot="end"] > .btu-button': {
60
+ marginBlockStart: 'auto',
61
+ },
62
+ // ─── Size propagation via CSS ─────────────────────────────────────
63
+ 'btu-button-group[size="small"] .btu-button': {
64
+ padding: 'var(--button-padding-sm)',
65
+ width: 'var(--button-size-sm, auto)',
66
+ height: 'var(--button-size-sm, auto)',
67
+ },
68
+ 'btu-button-group[size="medium"] .btu-button': {
69
+ padding: 'var(--button-padding-md)',
70
+ width: 'var(--button-size-md, auto)',
71
+ height: 'var(--button-size-md, auto)',
72
+ },
73
+ 'btu-button-group[size="large"] .btu-button': {
74
+ padding: 'var(--button-padding-lg)',
75
+ width: 'var(--button-size-lg, auto)',
76
+ height: 'var(--button-size-lg, auto)',
77
+ },
78
+ // ─── Connected: convert outline buttons to border-based ───────────
79
+ [`${connected} .btu-button`]: {
80
+ outline: 'none',
81
+ border: `1px solid ${borderColor}`,
82
+ transition: 'box-shadow 100ms ease, filter 100ms ease',
83
+ '&:active': {
84
+ scale: '1',
85
+ boxShadow: 'inset 0 2px 4px oklch(0 0 0 / 10%)',
86
+ filter: 'brightness(0.92)',
87
+ },
88
+ },
89
+ // ─── Disabled buttons ─────────────────────────────────────────────
90
+ '.btu-button-group .btu-button:disabled, .btu-button-group .btu-button[disabled]': {
91
+ opacity: '0.5',
92
+ cursor: 'default',
93
+ },
94
+ // ─── Selection wipe: disable button plugin's instant pressed toggle ─
95
+ // The ::after pseudo handles the pressed background via clip-path wipe,
96
+ // so the button itself must stay at its normal (non-pressed) color.
97
+ '.btu-button-group .btu-button[aria-pressed]': {
98
+ '--button-pressed-color': 'initial',
99
+ '--button-pressed-text-color': 'initial',
100
+ isolation: 'isolate',
101
+ transition: 'color 150ms ease-in',
102
+ },
103
+ '.btu-button-group .btu-button[aria-pressed]::after': {
104
+ content: '""',
105
+ position: 'absolute',
106
+ inset: '0',
107
+ zIndex: '-1',
108
+ borderRadius: 'inherit',
109
+ background: 'var(--button-group-selection-bg)',
110
+ clipPath: 'circle(0% at center)',
111
+ transition: 'clip-path 150ms ease-in',
112
+ },
113
+ // ─── Selection wipe: active state ─────────────────────────────────
114
+ '.btu-button-group .btu-button[aria-pressed="true"]': {
115
+ color: 'var(--button-group-selection-color)',
116
+ transition: 'color 200ms ease-out',
117
+ },
118
+ '.btu-button-group .btu-button[aria-pressed="true"]::after': {
119
+ clipPath: 'circle(75% at center)',
120
+ transition: 'clip-path 200ms ease-out',
121
+ },
122
+ // ─── Reduced motion ─────────────────────────────────────────────────
123
+ '@media (prefers-reduced-motion: reduce)': {
124
+ '.btu-button-group .btu-button[aria-pressed]': {
125
+ transition: 'color 0.01ms ease',
126
+ },
127
+ '.btu-button-group .btu-button[aria-pressed]::after': {
128
+ transition: 'clip-path 0.01ms ease',
129
+ },
130
+ [`${allSelected} .btu-button[aria-pressed="true"]`]: {
131
+ animation: 'none',
132
+ },
133
+ },
134
+ // ─── Connected variant — horizontal ───────────────────────────────
135
+ [`${connectedH} .btu-button`]: {
136
+ borderRadius: '0',
137
+ marginInlineEnd: '-1px',
138
+ position: 'relative',
139
+ '&:hover, &:focus-visible, &:active, &[aria-pressed="true"]': {
140
+ zIndex: '1',
141
+ },
142
+ '&:focus-visible': {
143
+ zIndex: '2',
144
+ },
145
+ },
146
+ [`${connectedH} > :first-child:is(.btu-button), ${connectedH} > :first-child > .btu-button`]: {
147
+ borderStartStartRadius: outerRadius,
148
+ borderEndStartRadius: outerRadius,
149
+ },
150
+ [`${connectedH} > :last-child:is(.btu-button), ${connectedH} > :last-child > .btu-button`]: {
151
+ borderStartEndRadius: outerRadius,
152
+ borderEndEndRadius: outerRadius,
153
+ marginInlineEnd: '0',
154
+ },
155
+ // ─── Connected variant — vertical ─────────────────────────────────
156
+ [`${connectedV} .btu-button`]: {
157
+ borderRadius: '0',
158
+ marginBlockEnd: '-1px',
159
+ position: 'relative',
160
+ '&:hover, &:focus-visible, &:active, &[aria-pressed="true"]': {
161
+ zIndex: '1',
162
+ },
163
+ '&:focus-visible': {
164
+ zIndex: '2',
165
+ },
166
+ },
167
+ [`${connectedV} > :first-child:is(.btu-button), ${connectedV} > :first-child > .btu-button`]: {
168
+ borderStartStartRadius: outerRadius,
169
+ borderStartEndRadius: outerRadius,
170
+ },
171
+ [`${connectedV} > :last-child:is(.btu-button), ${connectedV} > :last-child > .btu-button`]: {
172
+ borderEndStartRadius: outerRadius,
173
+ borderEndEndRadius: outerRadius,
174
+ marginBlockEnd: '0',
175
+ },
176
+ };
177
+ // ─── Sibling index for staggered animations ─────────────────────────
178
+ // CSS sibling-index() has limited browser support (Chrome 133+).
179
+ // When unsupported, the fallback of 1 means all buttons animate simultaneously.
180
+ components[`${connected} > *`] = {
181
+ '--_btn-index': 'sibling-index()',
182
+ };
183
+ // ─── All-selected shimmer (connected only) ─────────────────────────
184
+ // Text color pulse + border color pulse on each button, staggered.
185
+ components[`${allSelected} .btu-button[aria-pressed="true"]`] = {
186
+ animation: 'btu-shimmer-all 500ms ease-in-out both',
187
+ animationDelay: 'calc((var(--_btn-index, 1) - 1) * 100ms)',
188
+ };
189
+ // ─── Selection color variants ─────────────────────────────────────
190
+ for (const key in colors) {
191
+ if (skipColors.has(key))
192
+ continue;
193
+ const pressedKey = key === 'gray' ? 'primary' : key;
194
+ components[`.btu-button-group .btu-button-${key}`] = {
195
+ '--button-group-selection-bg': `oklch(var(--btu-theme-${pressedKey}-50))`,
196
+ '--button-group-selection-color': `oklch(var(--btu-theme-${pressedKey}-800))`,
197
+ '--button-group-shimmer-highlight': `oklch(var(--btu-theme-${pressedKey}-200))`,
198
+ };
199
+ }
200
+ addComponents(components);
201
+ // Keyframes must be added via addBase (not addComponents)
202
+ addBase({
203
+ '@keyframes btu-shimmer-all': {
204
+ '0%, 100%': {
205
+ color: 'var(--button-group-selection-color)',
206
+ borderColor: 'var(--button-group-border-color, oklch(var(--btu-theme-gray-300)))',
207
+ },
208
+ '40%, 60%': {
209
+ color: 'var(--button-group-shimmer-highlight)',
210
+ borderColor: 'var(--button-group-shimmer-highlight)',
211
+ },
212
+ },
213
+ });
214
+ });
215
+ //# sourceMappingURL=tailwind-plugin-button-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-button-group.js","sourceRoot":"","sources":["../src/tailwind-plugin-button-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import plugin from 'tailwindcss/plugin'
2
+ import type { CSSRuleObject } from 'tailwindcss/types/config'
3
+ declare let module: any
4
+
5
+ /**
6
+ * Button Group — Tailwind CSS plugin for grouping related buttons.
7
+ *
8
+ * Provides connected (joined) and spaced layouts with horizontal/vertical orientation.
9
+ * Supports both direct `.btu-button` children and `btu-icon-button` children.
10
+ * `btu-icon-button` uses `display: contents` so its inner button participates
11
+ * directly in the group's flex layout.
12
+ *
13
+ * Selection uses a circular wipe transition: a `::after` pseudo-element with
14
+ * `clip-path: circle()` reveals the selection color from the center outward.
15
+ *
16
+ * Class Names:
17
+ *
18
+ * btu-button-group - Base group container
19
+ *
20
+ * CSS Custom Properties:
21
+ *
22
+ * --button-group-gap - Gap between buttons in spaced variant (default: spacing.sm)
23
+ * --button-group-border-radius - Outer corner radius in connected variant (default: 0.5rem)
24
+ * --button-group-border-color - Internal divider color in connected variant (default: gray-300)
25
+ * --button-group-selection-bg - Selection background color (auto-set per color variant)
26
+ * --button-group-selection-color - Selection text color (auto-set per color variant)
27
+ */
28
+
29
+ module.exports = plugin(function ({ addComponents, addBase, theme }) {
30
+ const connected = 'btu-button-group[variant="connected"]'
31
+ const connectedH = `${connected}[orientation="horizontal"]`
32
+ const connectedV = `${connected}[orientation="vertical"]`
33
+ const allSelected = `${connected}[data-all-selected]`
34
+ const borderColor = 'var(--button-group-border-color, oklch(var(--btu-theme-gray-300)))'
35
+ const outerRadius = 'var(--button-group-border-radius, 0.5rem)'
36
+ const skipColors = new Set(['currentColor', 'transparent', 'white', 'black', 'ai'])
37
+ const colors: CSSRuleObject = theme('colors') || {}
38
+
39
+ const components: CSSRuleObject = {
40
+ // ─── Base ─────────────────────────────────────────────────────────
41
+ '.btu-button-group': {
42
+ display: 'inline-flex',
43
+ alignItems: 'stretch',
44
+ flexWrap: 'nowrap',
45
+ flexShrink: '0',
46
+ },
47
+
48
+ // ─── Icon-button: remove wrapper box so inner button is the flex item ──
49
+ '.btu-button-group > btu-icon-button': {
50
+ display: 'contents',
51
+ },
52
+
53
+ // ─── Orientation ──────────────────────────────────────────────────
54
+ 'btu-button-group[orientation="vertical"]': {
55
+ flexDirection: 'column',
56
+ },
57
+
58
+ // ─── Spaced variant ───────────────────────────────────────────────
59
+ 'btu-button-group[variant="spaced"]': {
60
+ gap: 'var(--button-group-gap, var(--gap-s, 0.5rem))',
61
+ },
62
+
63
+ // ─── slot="end" auto-margin ──────────────────────────────────────
64
+ // Direct children and inner .btu-button (for display:contents wrappers like btu-icon-button)
65
+ 'btu-button-group[orientation="horizontal"] > [slot="end"], btu-button-group[orientation="horizontal"] > [slot="end"] > .btu-button':
66
+ {
67
+ marginInlineStart: 'auto',
68
+ },
69
+ 'btu-button-group[orientation="vertical"] > [slot="end"], btu-button-group[orientation="vertical"] > [slot="end"] > .btu-button':
70
+ {
71
+ marginBlockStart: 'auto',
72
+ },
73
+
74
+ // ─── Size propagation via CSS ─────────────────────────────────────
75
+ 'btu-button-group[size="small"] .btu-button': {
76
+ padding: 'var(--button-padding-sm)',
77
+ width: 'var(--button-size-sm, auto)',
78
+ height: 'var(--button-size-sm, auto)',
79
+ },
80
+ 'btu-button-group[size="medium"] .btu-button': {
81
+ padding: 'var(--button-padding-md)',
82
+ width: 'var(--button-size-md, auto)',
83
+ height: 'var(--button-size-md, auto)',
84
+ },
85
+ 'btu-button-group[size="large"] .btu-button': {
86
+ padding: 'var(--button-padding-lg)',
87
+ width: 'var(--button-size-lg, auto)',
88
+ height: 'var(--button-size-lg, auto)',
89
+ },
90
+
91
+ // ─── Connected: convert outline buttons to border-based ───────────
92
+ [`${connected} .btu-button`]: {
93
+ outline: 'none',
94
+ border: `1px solid ${borderColor}`,
95
+ transition: 'box-shadow 100ms ease, filter 100ms ease',
96
+ '&:active': {
97
+ scale: '1',
98
+ boxShadow: 'inset 0 2px 4px oklch(0 0 0 / 10%)',
99
+ filter: 'brightness(0.92)',
100
+ },
101
+ },
102
+
103
+ // ─── Disabled buttons ─────────────────────────────────────────────
104
+ '.btu-button-group .btu-button:disabled, .btu-button-group .btu-button[disabled]': {
105
+ opacity: '0.5',
106
+ cursor: 'default',
107
+ },
108
+
109
+ // ─── Selection wipe: disable button plugin's instant pressed toggle ─
110
+ // The ::after pseudo handles the pressed background via clip-path wipe,
111
+ // so the button itself must stay at its normal (non-pressed) color.
112
+ '.btu-button-group .btu-button[aria-pressed]': {
113
+ '--button-pressed-color': 'initial',
114
+ '--button-pressed-text-color': 'initial',
115
+ isolation: 'isolate',
116
+ transition: 'color 150ms ease-in',
117
+ },
118
+ '.btu-button-group .btu-button[aria-pressed]::after': {
119
+ content: '""',
120
+ position: 'absolute',
121
+ inset: '0',
122
+ zIndex: '-1',
123
+ borderRadius: 'inherit',
124
+ background: 'var(--button-group-selection-bg)',
125
+ clipPath: 'circle(0% at center)',
126
+ transition: 'clip-path 150ms ease-in',
127
+ },
128
+
129
+ // ─── Selection wipe: active state ─────────────────────────────────
130
+ '.btu-button-group .btu-button[aria-pressed="true"]': {
131
+ color: 'var(--button-group-selection-color)',
132
+ transition: 'color 200ms ease-out',
133
+ },
134
+
135
+ '.btu-button-group .btu-button[aria-pressed="true"]::after': {
136
+ clipPath: 'circle(75% at center)',
137
+ transition: 'clip-path 200ms ease-out',
138
+ },
139
+
140
+ // ─── Reduced motion ─────────────────────────────────────────────────
141
+ '@media (prefers-reduced-motion: reduce)': {
142
+ '.btu-button-group .btu-button[aria-pressed]': {
143
+ transition: 'color 0.01ms ease',
144
+ },
145
+ '.btu-button-group .btu-button[aria-pressed]::after': {
146
+ transition: 'clip-path 0.01ms ease',
147
+ },
148
+ [`${allSelected} .btu-button[aria-pressed="true"]`]: {
149
+ animation: 'none',
150
+ },
151
+ },
152
+
153
+ // ─── Connected variant — horizontal ───────────────────────────────
154
+ [`${connectedH} .btu-button`]: {
155
+ borderRadius: '0',
156
+ marginInlineEnd: '-1px',
157
+ position: 'relative',
158
+ '&:hover, &:focus-visible, &:active, &[aria-pressed="true"]': {
159
+ zIndex: '1',
160
+ },
161
+ '&:focus-visible': {
162
+ zIndex: '2',
163
+ },
164
+ },
165
+ [`${connectedH} > :first-child:is(.btu-button), ${connectedH} > :first-child > .btu-button`]: {
166
+ borderStartStartRadius: outerRadius,
167
+ borderEndStartRadius: outerRadius,
168
+ },
169
+ [`${connectedH} > :last-child:is(.btu-button), ${connectedH} > :last-child > .btu-button`]: {
170
+ borderStartEndRadius: outerRadius,
171
+ borderEndEndRadius: outerRadius,
172
+ marginInlineEnd: '0',
173
+ },
174
+
175
+ // ─── Connected variant — vertical ─────────────────────────────────
176
+ [`${connectedV} .btu-button`]: {
177
+ borderRadius: '0',
178
+ marginBlockEnd: '-1px',
179
+ position: 'relative',
180
+ '&:hover, &:focus-visible, &:active, &[aria-pressed="true"]': {
181
+ zIndex: '1',
182
+ },
183
+ '&:focus-visible': {
184
+ zIndex: '2',
185
+ },
186
+ },
187
+ [`${connectedV} > :first-child:is(.btu-button), ${connectedV} > :first-child > .btu-button`]: {
188
+ borderStartStartRadius: outerRadius,
189
+ borderStartEndRadius: outerRadius,
190
+ },
191
+ [`${connectedV} > :last-child:is(.btu-button), ${connectedV} > :last-child > .btu-button`]: {
192
+ borderEndStartRadius: outerRadius,
193
+ borderEndEndRadius: outerRadius,
194
+ marginBlockEnd: '0',
195
+ },
196
+ }
197
+
198
+ // ─── Sibling index for staggered animations ─────────────────────────
199
+ // CSS sibling-index() has limited browser support (Chrome 133+).
200
+ // When unsupported, the fallback of 1 means all buttons animate simultaneously.
201
+ components[`${connected} > *`] = {
202
+ '--_btn-index': 'sibling-index()',
203
+ }
204
+
205
+ // ─── All-selected shimmer (connected only) ─────────────────────────
206
+ // Text color pulse + border color pulse on each button, staggered.
207
+ components[`${allSelected} .btu-button[aria-pressed="true"]`] = {
208
+ animation: 'btu-shimmer-all 500ms ease-in-out both',
209
+ animationDelay: 'calc((var(--_btn-index, 1) - 1) * 100ms)',
210
+ }
211
+
212
+ // ─── Selection color variants ─────────────────────────────────────
213
+ for (const key in colors) {
214
+ if (skipColors.has(key)) continue
215
+ const pressedKey = key === 'gray' ? 'primary' : key
216
+ components[`.btu-button-group .btu-button-${key}`] = {
217
+ '--button-group-selection-bg': `oklch(var(--btu-theme-${pressedKey}-50))`,
218
+ '--button-group-selection-color': `oklch(var(--btu-theme-${pressedKey}-800))`,
219
+ '--button-group-shimmer-highlight': `oklch(var(--btu-theme-${pressedKey}-200))`,
220
+ }
221
+ }
222
+
223
+ addComponents(components)
224
+
225
+ // Keyframes must be added via addBase (not addComponents)
226
+ addBase({
227
+ '@keyframes btu-shimmer-all': {
228
+ '0%, 100%': {
229
+ color: 'var(--button-group-selection-color)',
230
+ borderColor: 'var(--button-group-border-color, oklch(var(--btu-theme-gray-300)))',
231
+ },
232
+ '40%, 60%': {
233
+ color: 'var(--button-group-shimmer-highlight)',
234
+ borderColor: 'var(--button-group-shimmer-highlight)',
235
+ },
236
+ },
237
+ })
238
+ })
@@ -218,7 +218,7 @@ module.exports = plugin(function ({ addComponents, addUtilities, theme }) {
218
218
  height: 'var(--button-size-xl, auto)',
219
219
  },
220
220
  '2xl': {
221
- '--Icon-size': iconSizes['lg'],
221
+ '--icon-size': iconSizes['lg'],
222
222
  fontSize: `var(--button-icon-font-size, ${textSizes['lg'][0]})`,
223
223
  lineHeight: `var(--button-icon-line-height, ${textSizes['lg'][1]})`,
224
224
  padding: 'var(--button-padding-2xl)',
@@ -227,7 +227,7 @@ module.exports = plugin(function ({ addComponents, addUtilities, theme }) {
227
227
  height: 'var(--button-size-xl, auto)',
228
228
  },
229
229
  '2xl': {
230
- '--Icon-size': iconSizes['lg'],
230
+ '--icon-size': iconSizes['lg'],
231
231
  fontSize: `var(--button-icon-font-size, ${textSizes['lg'][0]})`,
232
232
  lineHeight: `var(--button-icon-line-height, ${textSizes['lg'][1]})`,
233
233
  padding: 'var(--button-padding-2xl)',
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tailwind-plugin-checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-checkbox.d.ts","sourceRoot":"","sources":["../src/tailwind-plugin-checkbox.ts"],"names":[],"mappings":""}