@brightspot/ui 1.9.0 → 1.10.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 (107) hide show
  1. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  2. package/dist/components/copy-to-clipboard/CopyToClipboard.js +4 -0
  3. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  4. package/dist/components/switch/Switch.d.ts +92 -0
  5. package/dist/components/switch/Switch.d.ts.map +1 -0
  6. package/dist/components/switch/Switch.js +189 -0
  7. package/dist/components/switch/Switch.js.map +1 -0
  8. package/dist/custom-elements.json +512 -210
  9. package/dist/effects/celebrate.d.ts +18 -0
  10. package/dist/effects/celebrate.d.ts.map +1 -0
  11. package/dist/effects/celebrate.js +81 -0
  12. package/dist/effects/celebrate.js.map +1 -0
  13. package/dist/effects/ripple.d.ts +31 -0
  14. package/dist/effects/ripple.d.ts.map +1 -0
  15. package/dist/effects/ripple.js +131 -0
  16. package/dist/effects/ripple.js.map +1 -0
  17. package/dist/effects/sparkle-worklet.d.ts +7 -0
  18. package/dist/effects/sparkle-worklet.d.ts.map +1 -0
  19. package/dist/effects/sparkle-worklet.js +211 -0
  20. package/dist/effects/sparkle-worklet.js.map +1 -0
  21. package/dist/effects/sparkle.d.ts +6 -0
  22. package/dist/effects/sparkle.d.ts.map +1 -0
  23. package/dist/effects/sparkle.js +91 -0
  24. package/dist/effects/sparkle.js.map +1 -0
  25. package/dist/storybook/BSPLogoMark.svg +3 -0
  26. package/dist/storybook/WelcomeBG.svg +292 -0
  27. package/dist/storybook/assets/{Avatar.stories-Du1qM73U.js → Avatar.stories-B26mRkkZ.js} +1 -1
  28. package/dist/storybook/assets/{AvatarGroup.stories-DxwZQE-q.js → AvatarGroup.stories-J7lVGsMY.js} +1 -1
  29. package/dist/storybook/assets/{Badge.stories-CfvkMIx2.js → Badge.stories-BpTIV61M.js} +1 -1
  30. package/dist/storybook/assets/Button-Dg-fIrzT.js +10 -0
  31. package/dist/storybook/assets/Button.stories-gPKRVbxk.js +54 -0
  32. package/dist/storybook/assets/Celebrate.stories-DbY-sKEe.js +184 -0
  33. package/dist/storybook/assets/{CircularProgress.stories-rPzKwQYD.js → CircularProgress.stories-DeH5JYX_.js} +1 -1
  34. package/dist/storybook/assets/{ClipboardMixin.stories-BlUeYDSi.js → ClipboardMixin.stories-C-lZ4uuw.js} +1 -1
  35. package/dist/storybook/assets/Color-6BZIO3FS-Cu6zVIuG.js +1 -0
  36. package/dist/storybook/assets/{Colors.stories-BspfjZ5q.js → Colors.stories-D6XYMrTD.js} +1 -1
  37. package/dist/storybook/assets/CombinedEffects.stories-jFekKTYg.js +355 -0
  38. package/dist/storybook/assets/{ComponentStatesMixin-eTV7XXqB.js → ComponentStatesMixin-g50hRCPT.js} +1 -1
  39. package/dist/storybook/assets/{ComponentStatesMixin.stories-BbLSY3df.js → ComponentStatesMixin.stories-D3Q5pR38.js} +1 -1
  40. package/dist/storybook/assets/{CopyToClipboard.stories-B2ailiFF.js → CopyToClipboard.stories-COZZ1VC2.js} +1 -1
  41. package/dist/storybook/assets/{Debounce.stories-DJmp4eNo.js → Debounce.stories-Dl10LAnx.js} +1 -1
  42. package/dist/storybook/assets/DocsRenderer-LL677BLK-CFLtMbUx.js +10 -0
  43. package/dist/storybook/assets/{Dropdown.stories-Dd6vKiDd.js → Dropdown.stories-Drwq-0Z2.js} +1 -1
  44. package/dist/storybook/assets/{Events.stories-Byj-VOM9.js → Events.stories-dODeR-g-.js} +1 -1
  45. package/dist/storybook/assets/{Heading.stories-Dqw-wzpx.js → Heading.stories-CH7_-_q3.js} +1 -1
  46. package/dist/storybook/assets/HueRipple.stories-CH1Y739k.js +310 -0
  47. package/dist/storybook/assets/{Icon.stories-Bp1nvWER.js → Icon.stories-CPjM-jTU.js} +1 -1
  48. package/dist/storybook/assets/{IconButton.stories-o9g9mGdh.js → IconButton.stories-DuzqvcnN.js} +1 -1
  49. package/dist/storybook/assets/{LinearProgress.stories-DnXQVpzX.js → LinearProgress.stories-C7IdnJd3.js} +1 -1
  50. package/dist/storybook/assets/{Pagination.stories-DQD8uvDc.js → Pagination.stories-C4cLjS_9.js} +1 -1
  51. package/dist/storybook/assets/{Popover.stories-BvavsRfq.js → Popover.stories-Ca1F-wrI.js} +3 -11
  52. package/dist/storybook/assets/{ReadyMixin-6On1MFFr.js → ReadyMixin-DNZ5dCsZ.js} +1 -1
  53. package/dist/storybook/assets/{Rtc.stories-Bb5Y-908.js → Rtc.stories-BVJc1vCA.js} +1 -1
  54. package/dist/storybook/assets/{ScrollShadow.stories-ZovRXpte.js → ScrollShadow.stories-C3W5o9ZW.js} +1 -1
  55. package/dist/storybook/assets/Switch.stories-BEEHP8mD.js +312 -0
  56. package/dist/storybook/assets/{Throttle.stories-DmP-yKke.js → Throttle.stories-C4xsYeAb.js} +1 -1
  57. package/dist/storybook/assets/{Tooltip.stories-Dl6xHBaM.js → Tooltip.stories-Ccm4AnSv.js} +3 -7
  58. package/dist/storybook/assets/Welcome.stories-Degjk-M0.js +215 -0
  59. package/dist/storybook/assets/{Widget.stories-BjXfgNjZ.js → Widget.stories-OKnZ9sDs.js} +1 -1
  60. package/dist/storybook/assets/WithTooltip-65CFNBJE-CXL3TyJ2.js +9 -0
  61. package/dist/storybook/assets/blocks-DLdUKG_W.js +707 -0
  62. package/dist/storybook/assets/celebrate-KwPoF1K3.js +21 -0
  63. package/dist/storybook/assets/formatter-EIJCOSYU-29NCxjfM.js +1 -0
  64. package/dist/storybook/assets/if-defined-BZFPaJjl.js +1 -0
  65. package/dist/storybook/assets/iframe-BqvwP3or.js +1104 -0
  66. package/dist/storybook/assets/{iframe-CNxIA3cQ.css → iframe-C5bIZMJ5.css} +1 -1
  67. package/dist/storybook/assets/index-BIyTv1BF.js +1 -0
  68. package/dist/storybook/assets/onFind-1l3EPW-I.js +1 -0
  69. package/dist/storybook/assets/{onFind.stories-B2GYLrjV.js → onFind.stories-D64-QZqf.js} +2 -2
  70. package/dist/storybook/assets/{onRemove.stories-CoLJFkWa.js → onRemove.stories-BICsnIJL.js} +1 -1
  71. package/dist/storybook/assets/{onVisible.stories-DOeZx7wi.js → onVisible.stories-DpDZP9_5.js} +2 -2
  72. package/dist/storybook/assets/position-CFNQy3J6.js +1 -0
  73. package/dist/storybook/assets/ripple-DQbyyRUw.js +251 -0
  74. package/dist/storybook/assets/{style-map-CmHqpCu1.js → style-map-CBrSnxRe.js} +1 -1
  75. package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-Bz_DuQj8.js +6 -0
  76. package/dist/storybook/brightspot-logo.svg +19 -0
  77. package/dist/storybook/iframe.html +23 -3
  78. package/dist/storybook/index.html +42 -1
  79. package/dist/storybook/index.json +1 -1
  80. package/dist/storybook/project.json +1 -1
  81. package/dist/storybook/sb-addons/storybook-3/manager-bundle.js +3 -0
  82. package/dist/tailwind-plugin-switch.d.ts +2 -0
  83. package/dist/tailwind-plugin-switch.d.ts.map +1 -0
  84. package/dist/tailwind-plugin-switch.js +223 -0
  85. package/dist/tailwind-plugin-switch.js.map +1 -0
  86. package/dist/tailwind-plugin-switch.ts +252 -0
  87. package/dist/util/EventEmitterMixin.d.ts +5 -0
  88. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  89. package/dist/util/EventEmitterMixin.js.map +1 -1
  90. package/dist/util/position.d.ts +9 -0
  91. package/dist/util/position.d.ts.map +1 -0
  92. package/dist/util/position.js +11 -0
  93. package/dist/util/position.js.map +1 -0
  94. package/docs/components/README.md +1 -0
  95. package/docs/components/Switch.md +79 -0
  96. package/package.json +2 -1
  97. package/dist/storybook/assets/Button.stories-hDMDDh81.js +0 -63
  98. package/dist/storybook/assets/Color-6BZIO3FS-C_nQSB2u.js +0 -1
  99. package/dist/storybook/assets/DocsRenderer-LL677BLK-56Pige1J.js +0 -758
  100. package/dist/storybook/assets/WithTooltip-65CFNBJE-CGB5q-AN.js +0 -9
  101. package/dist/storybook/assets/_commonjsHelpers-CqkleIqs.js +0 -1
  102. package/dist/storybook/assets/formatter-EIJCOSYU-BhNtSFM9.js +0 -1
  103. package/dist/storybook/assets/if-defined-BFyUeSVF.js +0 -1
  104. package/dist/storybook/assets/iframe-BeKreX-l.js +0 -1061
  105. package/dist/storybook/assets/index-Uz2kGy8J.js +0 -1
  106. package/dist/storybook/assets/onFind-DqriYjEB.js +0 -1
  107. package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-BqFfcc7x.js +0 -6
@@ -0,0 +1,223 @@
1
+ import plugin from 'tailwindcss/plugin';
2
+ /**
3
+ * Switch component — a styled checkbox visually rendered as a sliding switch.
4
+ *
5
+ * Class Names:
6
+ *
7
+ * btu-switch - Wrapper element (use as <label>)
8
+ * btu-switch-input - The hidden <input type="checkbox">
9
+ * btu-switch-track - The pill/track element
10
+ * btu-switch-knob - The sliding circular handle (child of btu-switch-track)
11
+ * btu-switch-text - Optional container for label + description (flex column)
12
+ * btu-switch-label - Primary label text
13
+ * btu-switch-description - Secondary description text
14
+ * btu-switch-[md|lg] - Size variants (default: sm dimensions)
15
+ * btu-switch-label-start - Positions label/text before the track
16
+ * btu-switch-track-icon-on - Icon displayed on the track when checked (sm: 0.5rem, md: 0.625rem, lg: 0.75rem)
17
+ * btu-switch-track-icon-off - Icon displayed on the track when unchecked (sm: 0.5rem, md: 0.625rem, lg: 0.75rem)
18
+ *
19
+ * CSS Custom Properties:
20
+ *
21
+ * --switch-color-track-on - Track background when checked (default: primary-700)
22
+ * --switch-color-track-off - Track background when unchecked (default: gray-300)
23
+ * --switch-color-knob - Knob/handle color (default: white)
24
+ * --switch-label-spacing - Gap between track and label text (default: 0.75rem)
25
+ *
26
+ * Example Usage:
27
+ *
28
+ * <label class="btu-switch">
29
+ * <input type="checkbox" role="switch" class="btu-switch-input">
30
+ * <span class="btu-switch-track">
31
+ * <btu-icon class="btu-switch-track-icon-on" symbol="check"></btu-icon>
32
+ * <span class="btu-switch-knob"></span>
33
+ * <btu-icon class="btu-switch-track-icon-off" symbol="x"></btu-icon>
34
+ * </span>
35
+ * <span class="btu-switch-text">
36
+ * <span class="btu-switch-label">Enable notifications</span>
37
+ * <span class="btu-switch-description">Receive updates via email</span>
38
+ * </span>
39
+ * </label>
40
+ */
41
+ module.exports = plugin(function ({ addComponents, config, theme }) {
42
+ const components = {
43
+ // -------------------------------------------------------------------------
44
+ // Wrapper
45
+ // -------------------------------------------------------------------------
46
+ '.btu-switch': {
47
+ '--switch-track-width': '1.75rem',
48
+ '--switch-track-height': '1rem',
49
+ '--switch-knob-size': '0.75rem',
50
+ '--switch-knob-padding': '0.125rem',
51
+ '--switch-track-icon-size': '0.5rem',
52
+ display: 'inline-flex',
53
+ alignItems: 'center',
54
+ gap: 'var(--switch-label-spacing, 0.75rem)',
55
+ cursor: 'pointer',
56
+ userSelect: 'none',
57
+ },
58
+ // -------------------------------------------------------------------------
59
+ // Hidden input (sr-only pattern)
60
+ // -------------------------------------------------------------------------
61
+ '.btu-switch-input': {
62
+ position: 'absolute',
63
+ width: '1px',
64
+ height: '1px',
65
+ padding: '0',
66
+ margin: '-1px',
67
+ overflow: 'hidden',
68
+ clipPath: 'inset(50%)',
69
+ whiteSpace: 'nowrap',
70
+ borderWidth: '0',
71
+ },
72
+ // -------------------------------------------------------------------------
73
+ // Track
74
+ // -------------------------------------------------------------------------
75
+ '.btu-switch-track': {
76
+ flexShrink: '0',
77
+ position: 'relative',
78
+ display: 'inline-flex',
79
+ alignItems: 'center',
80
+ width: 'var(--switch-track-width)',
81
+ height: 'var(--switch-track-height)',
82
+ padding: 'var(--switch-knob-padding)',
83
+ borderRadius: '999px',
84
+ background: 'var(--switch-color-track-off, oklch(var(--btu-theme-gray-300)))',
85
+ transition: 'background 150ms ease-in-out',
86
+ },
87
+ // -------------------------------------------------------------------------
88
+ // Knob
89
+ // -------------------------------------------------------------------------
90
+ '.btu-switch-knob': {
91
+ flexShrink: '0',
92
+ width: 'var(--switch-knob-size)',
93
+ height: 'var(--switch-knob-size)',
94
+ borderRadius: '50%',
95
+ background: 'var(--switch-color-knob, var(--btu-theme-white))',
96
+ boxShadow: theme('boxShadow.sm'),
97
+ transition: 'transform 170ms cubic-bezier(.895, .03, .685, .22)',
98
+ },
99
+ // -------------------------------------------------------------------------
100
+ // Track icons (on/off)
101
+ // -------------------------------------------------------------------------
102
+ '.btu-switch-track-icon-on, .btu-switch-track-icon-off': {
103
+ position: 'absolute',
104
+ top: '50%',
105
+ opacity: '0',
106
+ color: 'var(--switch-color-knob, var(--btu-theme-white))',
107
+ pointerEvents: 'none',
108
+ transition: 'opacity 150ms ease-in-out',
109
+ },
110
+ '.btu-switch-track-icon-on': {
111
+ left: 'calc((var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding)) / 2)',
112
+ transform: 'translate(-50%, -50%)',
113
+ },
114
+ '.btu-switch-track-icon-off': {
115
+ right: 'calc((var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding)) / 2)',
116
+ transform: 'translate(50%, -50%)',
117
+ },
118
+ '.btu-switch-input:not(:checked) ~ .btu-switch-track .btu-switch-track-icon-off': {
119
+ opacity: '1',
120
+ },
121
+ // -------------------------------------------------------------------------
122
+ // Checked state
123
+ // -------------------------------------------------------------------------
124
+ '.btu-switch-input:checked ~ .btu-switch-track': {
125
+ background: 'var(--switch-color-track-on, oklch(var(--btu-theme-primary-700)))',
126
+ },
127
+ '.btu-switch-input:checked ~ .btu-switch-track .btu-switch-track-icon-on': {
128
+ opacity: '1',
129
+ },
130
+ '.btu-switch-input:checked ~ .btu-switch-track .btu-switch-knob': {
131
+ transform: 'translateX(calc(var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding) * 2))',
132
+ },
133
+ // -------------------------------------------------------------------------
134
+ // Hover state
135
+ // -------------------------------------------------------------------------
136
+ '.btu-switch:hover .btu-switch-input:not(:disabled) ~ .btu-switch-track': {
137
+ background: 'var(--switch-color-track-off, oklch(var(--btu-theme-gray-400)))',
138
+ },
139
+ '.btu-switch:hover .btu-switch-input:not(:disabled):checked ~ .btu-switch-track': {
140
+ background: 'var(--switch-color-track-on, oklch(var(--btu-theme-primary-800)))',
141
+ },
142
+ // -------------------------------------------------------------------------
143
+ // Focus visible — ring on the track
144
+ // -------------------------------------------------------------------------
145
+ '.btu-switch-input:focus-visible ~ .btu-switch-track': {
146
+ outline: '3px solid oklch(var(--btu-theme-primary-200))',
147
+ outlineOffset: '0px',
148
+ },
149
+ // -------------------------------------------------------------------------
150
+ // Disabled state
151
+ // -------------------------------------------------------------------------
152
+ '.btu-switch-input:disabled ~ .btu-switch-track': {
153
+ opacity: '0.5',
154
+ pointerEvents: 'none',
155
+ },
156
+ '.btu-switch-input:disabled:checked ~ .btu-switch-track': {
157
+ background: 'oklch(var(--btu-theme-primary-200))',
158
+ opacity: '1',
159
+ },
160
+ '.btu-switch-input:disabled ~ .btu-switch-text': {
161
+ color: 'oklch(var(--btu-theme-gray-300))',
162
+ },
163
+ '.btu-switch:has(.btu-switch-input:disabled)': {
164
+ pointerEvents: 'none',
165
+ },
166
+ // -------------------------------------------------------------------------
167
+ // Text elements
168
+ // -------------------------------------------------------------------------
169
+ '.btu-switch-text': {
170
+ display: 'flex',
171
+ flexDirection: 'column',
172
+ gap: '0.125rem',
173
+ },
174
+ '.btu-switch-label': {
175
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
176
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
177
+ fontWeight: '500',
178
+ color: 'oklch(var(--btu-theme-gray-700))',
179
+ },
180
+ '.btu-switch-description': {
181
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
182
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
183
+ color: 'oklch(var(--btu-theme-gray-500))',
184
+ },
185
+ // -------------------------------------------------------------------------
186
+ // Label position: start (label/text before track)
187
+ // -------------------------------------------------------------------------
188
+ '.btu-switch-label-start': {
189
+ flexDirection: 'row-reverse',
190
+ },
191
+ // -------------------------------------------------------------------------
192
+ // Size variants
193
+ // -------------------------------------------------------------------------
194
+ '.btu-switch-md': {
195
+ '--switch-track-width': '2.25rem',
196
+ '--switch-track-height': '1.25rem',
197
+ '--switch-knob-size': '1rem',
198
+ '--switch-track-icon-size': '0.625rem',
199
+ },
200
+ '.btu-switch-lg': {
201
+ '--switch-track-width': '2.75rem',
202
+ '--switch-track-height': '1.5rem',
203
+ '--switch-knob-size': '1.25rem',
204
+ '--switch-track-icon-size': '0.75rem',
205
+ },
206
+ // -------------------------------------------------------------------------
207
+ // Reduced motion
208
+ // -------------------------------------------------------------------------
209
+ '@media (prefers-reduced-motion: reduce)': {
210
+ '.btu-switch-track': {
211
+ transition: 'background 0.01ms ease',
212
+ },
213
+ '.btu-switch-knob': {
214
+ transition: 'transform 0.01ms ease',
215
+ },
216
+ '.btu-switch-track-icon-on, .btu-switch-track-icon-off': {
217
+ transition: 'opacity 0.01ms ease',
218
+ },
219
+ },
220
+ };
221
+ addComponents(components);
222
+ });
223
+ //# sourceMappingURL=tailwind-plugin-switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-plugin-switch.js","sourceRoot":"","sources":["../src/tailwind-plugin-switch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ import plugin from 'tailwindcss/plugin'
2
+ import type { CSSRuleObject } from 'tailwindcss/types/config'
3
+ declare let module: any
4
+
5
+ /**
6
+ * Switch component — a styled checkbox visually rendered as a sliding switch.
7
+ *
8
+ * Class Names:
9
+ *
10
+ * btu-switch - Wrapper element (use as <label>)
11
+ * btu-switch-input - The hidden <input type="checkbox">
12
+ * btu-switch-track - The pill/track element
13
+ * btu-switch-knob - The sliding circular handle (child of btu-switch-track)
14
+ * btu-switch-text - Optional container for label + description (flex column)
15
+ * btu-switch-label - Primary label text
16
+ * btu-switch-description - Secondary description text
17
+ * btu-switch-[md|lg] - Size variants (default: sm dimensions)
18
+ * btu-switch-label-start - Positions label/text before the track
19
+ * btu-switch-track-icon-on - Icon displayed on the track when checked (sm: 0.5rem, md: 0.625rem, lg: 0.75rem)
20
+ * btu-switch-track-icon-off - Icon displayed on the track when unchecked (sm: 0.5rem, md: 0.625rem, lg: 0.75rem)
21
+ *
22
+ * CSS Custom Properties:
23
+ *
24
+ * --switch-color-track-on - Track background when checked (default: primary-700)
25
+ * --switch-color-track-off - Track background when unchecked (default: gray-300)
26
+ * --switch-color-knob - Knob/handle color (default: white)
27
+ * --switch-label-spacing - Gap between track and label text (default: 0.75rem)
28
+ *
29
+ * Example Usage:
30
+ *
31
+ * <label class="btu-switch">
32
+ * <input type="checkbox" role="switch" class="btu-switch-input">
33
+ * <span class="btu-switch-track">
34
+ * <btu-icon class="btu-switch-track-icon-on" symbol="check"></btu-icon>
35
+ * <span class="btu-switch-knob"></span>
36
+ * <btu-icon class="btu-switch-track-icon-off" symbol="x"></btu-icon>
37
+ * </span>
38
+ * <span class="btu-switch-text">
39
+ * <span class="btu-switch-label">Enable notifications</span>
40
+ * <span class="btu-switch-description">Receive updates via email</span>
41
+ * </span>
42
+ * </label>
43
+ */
44
+
45
+ module.exports = plugin(function ({ addComponents, config, theme }) {
46
+ const components: CSSRuleObject = {
47
+ // -------------------------------------------------------------------------
48
+ // Wrapper
49
+ // -------------------------------------------------------------------------
50
+ '.btu-switch': {
51
+ '--switch-track-width': '1.75rem',
52
+ '--switch-track-height': '1rem',
53
+ '--switch-knob-size': '0.75rem',
54
+ '--switch-knob-padding': '0.125rem',
55
+ '--switch-track-icon-size': '0.5rem',
56
+ display: 'inline-flex',
57
+ alignItems: 'center',
58
+ gap: 'var(--switch-label-spacing, 0.75rem)',
59
+ cursor: 'pointer',
60
+ userSelect: 'none',
61
+ },
62
+
63
+ // -------------------------------------------------------------------------
64
+ // Hidden input (sr-only pattern)
65
+ // -------------------------------------------------------------------------
66
+ '.btu-switch-input': {
67
+ position: 'absolute',
68
+ width: '1px',
69
+ height: '1px',
70
+ padding: '0',
71
+ margin: '-1px',
72
+ overflow: 'hidden',
73
+ clipPath: 'inset(50%)',
74
+ whiteSpace: 'nowrap',
75
+ borderWidth: '0',
76
+ },
77
+
78
+ // -------------------------------------------------------------------------
79
+ // Track
80
+ // -------------------------------------------------------------------------
81
+ '.btu-switch-track': {
82
+ flexShrink: '0',
83
+ position: 'relative',
84
+ display: 'inline-flex',
85
+ alignItems: 'center',
86
+ width: 'var(--switch-track-width)',
87
+ height: 'var(--switch-track-height)',
88
+ padding: 'var(--switch-knob-padding)',
89
+ borderRadius: '999px',
90
+ background: 'var(--switch-color-track-off, oklch(var(--btu-theme-gray-300)))',
91
+ transition: 'background 150ms ease-in-out',
92
+ },
93
+
94
+ // -------------------------------------------------------------------------
95
+ // Knob
96
+ // -------------------------------------------------------------------------
97
+ '.btu-switch-knob': {
98
+ flexShrink: '0',
99
+ width: 'var(--switch-knob-size)',
100
+ height: 'var(--switch-knob-size)',
101
+ borderRadius: '50%',
102
+ background: 'var(--switch-color-knob, var(--btu-theme-white))',
103
+ boxShadow: theme('boxShadow.sm'),
104
+ transition: 'transform 170ms cubic-bezier(.895, .03, .685, .22)',
105
+ },
106
+
107
+ // -------------------------------------------------------------------------
108
+ // Track icons (on/off)
109
+ // -------------------------------------------------------------------------
110
+ '.btu-switch-track-icon-on, .btu-switch-track-icon-off': {
111
+ position: 'absolute',
112
+ top: '50%',
113
+ opacity: '0',
114
+ color: 'var(--switch-color-knob, var(--btu-theme-white))',
115
+ pointerEvents: 'none',
116
+ transition: 'opacity 150ms ease-in-out',
117
+ },
118
+
119
+ '.btu-switch-track-icon-on': {
120
+ left: 'calc((var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding)) / 2)',
121
+ transform: 'translate(-50%, -50%)',
122
+ },
123
+
124
+ '.btu-switch-track-icon-off': {
125
+ right: 'calc((var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding)) / 2)',
126
+ transform: 'translate(50%, -50%)',
127
+ },
128
+
129
+ '.btu-switch-input:not(:checked) ~ .btu-switch-track .btu-switch-track-icon-off': {
130
+ opacity: '1',
131
+ },
132
+
133
+ // -------------------------------------------------------------------------
134
+ // Checked state
135
+ // -------------------------------------------------------------------------
136
+ '.btu-switch-input:checked ~ .btu-switch-track': {
137
+ background: 'var(--switch-color-track-on, oklch(var(--btu-theme-primary-700)))',
138
+ },
139
+
140
+ '.btu-switch-input:checked ~ .btu-switch-track .btu-switch-track-icon-on': {
141
+ opacity: '1',
142
+ },
143
+
144
+ '.btu-switch-input:checked ~ .btu-switch-track .btu-switch-knob': {
145
+ transform:
146
+ 'translateX(calc(var(--switch-track-width) - var(--switch-knob-size) - var(--switch-knob-padding) * 2))',
147
+ },
148
+
149
+ // -------------------------------------------------------------------------
150
+ // Hover state
151
+ // -------------------------------------------------------------------------
152
+ '.btu-switch:hover .btu-switch-input:not(:disabled) ~ .btu-switch-track': {
153
+ background: 'var(--switch-color-track-off, oklch(var(--btu-theme-gray-400)))',
154
+ },
155
+
156
+ '.btu-switch:hover .btu-switch-input:not(:disabled):checked ~ .btu-switch-track': {
157
+ background: 'var(--switch-color-track-on, oklch(var(--btu-theme-primary-800)))',
158
+ },
159
+
160
+ // -------------------------------------------------------------------------
161
+ // Focus visible — ring on the track
162
+ // -------------------------------------------------------------------------
163
+ '.btu-switch-input:focus-visible ~ .btu-switch-track': {
164
+ outline: '3px solid oklch(var(--btu-theme-primary-200))',
165
+ outlineOffset: '0px',
166
+ },
167
+
168
+ // -------------------------------------------------------------------------
169
+ // Disabled state
170
+ // -------------------------------------------------------------------------
171
+ '.btu-switch-input:disabled ~ .btu-switch-track': {
172
+ opacity: '0.5',
173
+ pointerEvents: 'none',
174
+ },
175
+
176
+ '.btu-switch-input:disabled:checked ~ .btu-switch-track': {
177
+ background: 'oklch(var(--btu-theme-primary-200))',
178
+ opacity: '1',
179
+ },
180
+
181
+ '.btu-switch-input:disabled ~ .btu-switch-text': {
182
+ color: 'oklch(var(--btu-theme-gray-300))',
183
+ },
184
+
185
+ '.btu-switch:has(.btu-switch-input:disabled)': {
186
+ pointerEvents: 'none',
187
+ },
188
+
189
+ // -------------------------------------------------------------------------
190
+ // Text elements
191
+ // -------------------------------------------------------------------------
192
+ '.btu-switch-text': {
193
+ display: 'flex',
194
+ flexDirection: 'column',
195
+ gap: '0.125rem',
196
+ },
197
+
198
+ '.btu-switch-label': {
199
+ fontSize: config('theme.fontSize.sm')?.[0] ?? '0.875rem',
200
+ lineHeight: config('theme.fontSize.sm')?.[1] ?? '1.25rem',
201
+ fontWeight: '500',
202
+ color: 'oklch(var(--btu-theme-gray-700))',
203
+ },
204
+
205
+ '.btu-switch-description': {
206
+ fontSize: config('theme.fontSize.xs')?.[0] ?? '0.75rem',
207
+ lineHeight: config('theme.fontSize.xs')?.[1] ?? '1.125rem',
208
+ color: 'oklch(var(--btu-theme-gray-500))',
209
+ },
210
+
211
+ // -------------------------------------------------------------------------
212
+ // Label position: start (label/text before track)
213
+ // -------------------------------------------------------------------------
214
+ '.btu-switch-label-start': {
215
+ flexDirection: 'row-reverse',
216
+ },
217
+
218
+ // -------------------------------------------------------------------------
219
+ // Size variants
220
+ // -------------------------------------------------------------------------
221
+ '.btu-switch-md': {
222
+ '--switch-track-width': '2.25rem',
223
+ '--switch-track-height': '1.25rem',
224
+ '--switch-knob-size': '1rem',
225
+ '--switch-track-icon-size': '0.625rem',
226
+ },
227
+
228
+ '.btu-switch-lg': {
229
+ '--switch-track-width': '2.75rem',
230
+ '--switch-track-height': '1.5rem',
231
+ '--switch-knob-size': '1.25rem',
232
+ '--switch-track-icon-size': '0.75rem',
233
+ },
234
+
235
+ // -------------------------------------------------------------------------
236
+ // Reduced motion
237
+ // -------------------------------------------------------------------------
238
+ '@media (prefers-reduced-motion: reduce)': {
239
+ '.btu-switch-track': {
240
+ transition: 'background 0.01ms ease',
241
+ },
242
+ '.btu-switch-knob': {
243
+ transition: 'transform 0.01ms ease',
244
+ },
245
+ '.btu-switch-track-icon-on, .btu-switch-track-icon-off': {
246
+ transition: 'opacity 0.01ms ease',
247
+ },
248
+ },
249
+ }
250
+
251
+ addComponents(components)
252
+ })
@@ -66,6 +66,11 @@ export interface CustomEventMap {
66
66
  label: string;
67
67
  favorited: boolean;
68
68
  }>;
69
+ 'btu-switch-ready': CustomEvent<unknown>;
70
+ 'btu-switch-change': CustomEvent<{
71
+ checked: boolean;
72
+ }>;
73
+ 'btu-switch-focus': CustomEvent<unknown>;
69
74
  }
70
75
  interface CombinedEventMap extends HTMLElementEventMap, CustomEventMap {
71
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EventEmitterMixin.d.ts","sourceRoot":"","sources":["../../src/util/EventEmitterMixin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EventEmitterMixin.d.ts","sourceRoot":"","sources":["../../src/util/EventEmitterMixin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventEmitterMixin.js","sourceRoot":"","sources":["../../src/util/EventEmitterMixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAiEhC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAoC,UAAa,EAAE,EAAE;IACpF,MAAM,sBAAuB,SAAQ,UAAU;QAC7C;;;;WAIG;QACH,iBAAiB;YACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;YACzB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CACpB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAC5C,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CACnD,CAAA;QACH,CAAC;QAED;;;;WAIG;QACH,oBAAoB;YAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACvC,CAAC;QAED;;;;;;;;;;;;;;;;WAgBG;QACH,IAAI,CAAiC,IAAO,EAAE,MAA6C;YACzF,OAAO,IAAI,CAAC,aAAa,CACvB,IAAI,WAAW,CAAC,IAAI,EAAE;gBACpB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,IAAI;gBACd,MAAM;aACP,CAAC,CACH,CAAA;QACH,CAAC;KACF;IACD,OAAO,sBAAqE,CAAA;AAC9E,CAAC,CAAA"}
1
+ {"version":3,"file":"EventEmitterMixin.js","sourceRoot":"","sources":["../../src/util/EventEmitterMixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAoEhC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAoC,UAAa,EAAE,EAAE;IACpF,MAAM,sBAAuB,SAAQ,UAAU;QAC7C;;;;WAIG;QACH,iBAAiB;YACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;YACzB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CACpB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,EAC5C,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CACnD,CAAA;QACH,CAAC;QAED;;;;WAIG;QACH,oBAAoB;YAClB,KAAK,CAAC,oBAAoB,EAAE,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACvC,CAAC;QAED;;;;;;;;;;;;;;;;WAgBG;QACH,IAAI,CAAiC,IAAO,EAAE,MAA6C;YACzF,OAAO,IAAI,CAAC,aAAa,CACvB,IAAI,WAAW,CAAC,IAAI,EAAE;gBACpB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,IAAI;gBACd,MAAM;aACP,CAAC,CACH,CAAA;QACH,CAAC;KACF;IACD,OAAO,sBAAqE,CAAA;AAC9E,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ export type EffectPosition = {
2
+ x: number;
3
+ y: number;
4
+ } | MouseEvent | Element;
5
+ export declare function resolvePosition(position: EffectPosition): {
6
+ x: number;
7
+ y: number;
8
+ };
9
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/util/position.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,GAAG,OAAO,CAAA;AAE5E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CASlF"}
@@ -0,0 +1,11 @@
1
+ export function resolvePosition(position) {
2
+ if (position instanceof MouseEvent) {
3
+ return { x: position.clientX, y: position.clientY };
4
+ }
5
+ if (position instanceof Element) {
6
+ const rect = position.getBoundingClientRect();
7
+ return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
8
+ }
9
+ return position;
10
+ }
11
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../../src/util/position.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,QAAwB;IACtD,IAAI,QAAQ,YAAY,UAAU,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;IACrD,CAAC;IACD,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAA;QAC7C,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;IACzE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -17,6 +17,7 @@ This directory contains auto-generated API documentation for all Brightspot UI w
17
17
  - [`<btu-linear-progress>` - LinearProgress](LinearProgress.md)
18
18
  - [`<btu-pagination>` - Pagination](Pagination.md)
19
19
  - [`<btu-popover>` - Popover](Popover.md)
20
+ - [`<btu-switch>` - Switch](Switch.md)
20
21
  - [`<btu-widget>` - Widget](Widget.md)
21
22
 
22
23
  ---
@@ -0,0 +1,79 @@
1
+ # `src/components/switch/Switch.ts`:
2
+
3
+ ## class: `Switch`, `btu-switch`
4
+
5
+ ### Superclass
6
+
7
+ | Name | Module | Package |
8
+ | ------------ | ------ | ------- |
9
+ | `LitElement` | | lit |
10
+
11
+ ### Mixins
12
+
13
+ | Name | Module | Package |
14
+ | ------------------- | ------------------------------ | ------- |
15
+ | `EventEmitterMixin` | /src/util/EventEmitterMixin.js | |
16
+ | `ReadyMixin` | /src/util/ReadyMixin.js | |
17
+
18
+ ### Fields
19
+
20
+ | Name | Privacy | Type | Default | Description | Inherited From |
21
+ | --------------- | ------- | -------------------------------- | --------- | ----------------------------------------------------------------------------------- | -------------- |
22
+ | `size` | | `'small' \| 'medium' \| 'large'` | `'small'` | Controls the physical dimensions of the switch and the associated label typography. | |
23
+ | `label` | | `string \| undefined` | | The primary text displayed next to the toggle. | |
24
+ | `description` | | `string \| undefined` | | Optional helper text or secondary information displayed below the label. | |
25
+ | `checked` | | `boolean` | `false` | The current state of the switch (on/off). | |
26
+ | `disabled` | | `boolean` | `false` | If true, the toggle is non-interactive and visually muted. | |
27
+ | `name` | | `string \| undefined` | | Name of the control for form participation. | |
28
+ | `labelPosition` | | `'start' \| 'end'` | `'end'` | Determines if the label appears to the left or right of the switch. | |
29
+ | `onIcon` | | `string \| undefined` | | Lucide icon name shown on the track when the switch is checked (on). | |
30
+ | `offIcon` | | `string \| undefined` | | Lucide icon name shown on the track when the switch is unchecked (off). | |
31
+
32
+ ### Methods
33
+
34
+ | Name | Privacy | Description | Parameters | Return | Inherited From |
35
+ | ---------------- | ------- | ----------- | ---------- | ------ | -------------- |
36
+ | `_onInputChange` | private | | `e: Event` | `void` | |
37
+ | `_onFocus` | private | | | `void` | |
38
+ | `_toggleInput` | private | | | `void` | |
39
+
40
+ ### Events
41
+
42
+ | Name | Type | Description | Inherited From |
43
+ | ------------------- | ----------------------------------- | -------------------------------------------------------- | -------------- |
44
+ | `btu-switch-ready` | `CustomEvent` | Fired after the toggle is first rendered and initialized | |
45
+ | `btu-switch-change` | `CustomEvent<{ checked: boolean }>` | Fired when the user toggles the switch | |
46
+ | `btu-switch-focus` | `CustomEvent` | Fired when the component gains focus | |
47
+
48
+ ### Attributes
49
+
50
+ | Name | Field | Inherited From |
51
+ | ---------------- | ------------- | -------------- |
52
+ | `size` | size | |
53
+ | `label` | label | |
54
+ | `description` | description | |
55
+ | `checked` | checked | |
56
+ | `disabled` | disabled | |
57
+ | `name` | name | |
58
+ | `label-position` | labelPosition | |
59
+ | `on-icon` | onIcon | |
60
+ | `off-icon` | offIcon | |
61
+
62
+ ### CSS Properties
63
+
64
+ | Name | Default | Description |
65
+ | -------------------------- | ------- | ----------------------------------------------------------------------------------- |
66
+ | `--switch-color-track-on` | | Background color when the toggle is checked (default: var(--btu-theme-primary-700)) |
67
+ | `--switch-color-track-off` | | Background color when the toggle is unchecked (default: var(--btu-theme-gray-300)) |
68
+ | `--switch-color-knob` | | Color of the sliding circular handle (default: var(--btu-theme-white)) |
69
+ | `--switch-label-spacing` | | Distance between the switch and the text label (default: 0.75rem) |
70
+ | `--switch-track-icon-size` | | Size of the track icons (default: sm 0.5rem, md 0.625rem, lg 0.75rem) |
71
+
72
+ <hr/>
73
+
74
+ ## Exports
75
+
76
+ | Kind | Name | Declaration | Module | Package |
77
+ | --------------------------- | ------------ | ----------- | ------------------------------- | ------- |
78
+ | `js` | `default` | Switch | src/components/switch/Switch.ts | |
79
+ | `custom-element-definition` | `btu-switch` | Switch | src/components/switch/Switch.ts | |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspot/ui",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "description": "A UI library for building Brightspot CMS components.",
@@ -10,6 +10,7 @@
10
10
  ".": "./dist/tailwind.config.js",
11
11
  "./components/*": "./dist/components/*",
12
12
  "./util/*": "./dist/util/*",
13
+ "./effects/*": "./dist/effects/*",
13
14
  "./dist/*": "./dist/*",
14
15
  "./custom-elements.json": "./dist/custom-elements.json"
15
16
  },