@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.
- package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
- package/dist/components/copy-to-clipboard/CopyToClipboard.js +4 -0
- package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
- package/dist/components/switch/Switch.d.ts +92 -0
- package/dist/components/switch/Switch.d.ts.map +1 -0
- package/dist/components/switch/Switch.js +189 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/custom-elements.json +512 -210
- package/dist/effects/celebrate.d.ts +18 -0
- package/dist/effects/celebrate.d.ts.map +1 -0
- package/dist/effects/celebrate.js +81 -0
- package/dist/effects/celebrate.js.map +1 -0
- package/dist/effects/ripple.d.ts +31 -0
- package/dist/effects/ripple.d.ts.map +1 -0
- package/dist/effects/ripple.js +131 -0
- package/dist/effects/ripple.js.map +1 -0
- package/dist/effects/sparkle-worklet.d.ts +7 -0
- package/dist/effects/sparkle-worklet.d.ts.map +1 -0
- package/dist/effects/sparkle-worklet.js +211 -0
- package/dist/effects/sparkle-worklet.js.map +1 -0
- package/dist/effects/sparkle.d.ts +6 -0
- package/dist/effects/sparkle.d.ts.map +1 -0
- package/dist/effects/sparkle.js +91 -0
- package/dist/effects/sparkle.js.map +1 -0
- package/dist/storybook/BSPLogoMark.svg +3 -0
- package/dist/storybook/WelcomeBG.svg +292 -0
- package/dist/storybook/assets/{Avatar.stories-Du1qM73U.js → Avatar.stories-B26mRkkZ.js} +1 -1
- package/dist/storybook/assets/{AvatarGroup.stories-DxwZQE-q.js → AvatarGroup.stories-J7lVGsMY.js} +1 -1
- package/dist/storybook/assets/{Badge.stories-CfvkMIx2.js → Badge.stories-BpTIV61M.js} +1 -1
- package/dist/storybook/assets/Button-Dg-fIrzT.js +10 -0
- package/dist/storybook/assets/Button.stories-gPKRVbxk.js +54 -0
- package/dist/storybook/assets/Celebrate.stories-DbY-sKEe.js +184 -0
- package/dist/storybook/assets/{CircularProgress.stories-rPzKwQYD.js → CircularProgress.stories-DeH5JYX_.js} +1 -1
- package/dist/storybook/assets/{ClipboardMixin.stories-BlUeYDSi.js → ClipboardMixin.stories-C-lZ4uuw.js} +1 -1
- package/dist/storybook/assets/Color-6BZIO3FS-Cu6zVIuG.js +1 -0
- package/dist/storybook/assets/{Colors.stories-BspfjZ5q.js → Colors.stories-D6XYMrTD.js} +1 -1
- package/dist/storybook/assets/CombinedEffects.stories-jFekKTYg.js +355 -0
- package/dist/storybook/assets/{ComponentStatesMixin-eTV7XXqB.js → ComponentStatesMixin-g50hRCPT.js} +1 -1
- package/dist/storybook/assets/{ComponentStatesMixin.stories-BbLSY3df.js → ComponentStatesMixin.stories-D3Q5pR38.js} +1 -1
- package/dist/storybook/assets/{CopyToClipboard.stories-B2ailiFF.js → CopyToClipboard.stories-COZZ1VC2.js} +1 -1
- package/dist/storybook/assets/{Debounce.stories-DJmp4eNo.js → Debounce.stories-Dl10LAnx.js} +1 -1
- package/dist/storybook/assets/DocsRenderer-LL677BLK-CFLtMbUx.js +10 -0
- package/dist/storybook/assets/{Dropdown.stories-Dd6vKiDd.js → Dropdown.stories-Drwq-0Z2.js} +1 -1
- package/dist/storybook/assets/{Events.stories-Byj-VOM9.js → Events.stories-dODeR-g-.js} +1 -1
- package/dist/storybook/assets/{Heading.stories-Dqw-wzpx.js → Heading.stories-CH7_-_q3.js} +1 -1
- package/dist/storybook/assets/HueRipple.stories-CH1Y739k.js +310 -0
- package/dist/storybook/assets/{Icon.stories-Bp1nvWER.js → Icon.stories-CPjM-jTU.js} +1 -1
- package/dist/storybook/assets/{IconButton.stories-o9g9mGdh.js → IconButton.stories-DuzqvcnN.js} +1 -1
- package/dist/storybook/assets/{LinearProgress.stories-DnXQVpzX.js → LinearProgress.stories-C7IdnJd3.js} +1 -1
- package/dist/storybook/assets/{Pagination.stories-DQD8uvDc.js → Pagination.stories-C4cLjS_9.js} +1 -1
- package/dist/storybook/assets/{Popover.stories-BvavsRfq.js → Popover.stories-Ca1F-wrI.js} +3 -11
- package/dist/storybook/assets/{ReadyMixin-6On1MFFr.js → ReadyMixin-DNZ5dCsZ.js} +1 -1
- package/dist/storybook/assets/{Rtc.stories-Bb5Y-908.js → Rtc.stories-BVJc1vCA.js} +1 -1
- package/dist/storybook/assets/{ScrollShadow.stories-ZovRXpte.js → ScrollShadow.stories-C3W5o9ZW.js} +1 -1
- package/dist/storybook/assets/Switch.stories-BEEHP8mD.js +312 -0
- package/dist/storybook/assets/{Throttle.stories-DmP-yKke.js → Throttle.stories-C4xsYeAb.js} +1 -1
- package/dist/storybook/assets/{Tooltip.stories-Dl6xHBaM.js → Tooltip.stories-Ccm4AnSv.js} +3 -7
- package/dist/storybook/assets/Welcome.stories-Degjk-M0.js +215 -0
- package/dist/storybook/assets/{Widget.stories-BjXfgNjZ.js → Widget.stories-OKnZ9sDs.js} +1 -1
- package/dist/storybook/assets/WithTooltip-65CFNBJE-CXL3TyJ2.js +9 -0
- package/dist/storybook/assets/blocks-DLdUKG_W.js +707 -0
- package/dist/storybook/assets/celebrate-KwPoF1K3.js +21 -0
- package/dist/storybook/assets/formatter-EIJCOSYU-29NCxjfM.js +1 -0
- package/dist/storybook/assets/if-defined-BZFPaJjl.js +1 -0
- package/dist/storybook/assets/iframe-BqvwP3or.js +1104 -0
- package/dist/storybook/assets/{iframe-CNxIA3cQ.css → iframe-C5bIZMJ5.css} +1 -1
- package/dist/storybook/assets/index-BIyTv1BF.js +1 -0
- package/dist/storybook/assets/onFind-1l3EPW-I.js +1 -0
- package/dist/storybook/assets/{onFind.stories-B2GYLrjV.js → onFind.stories-D64-QZqf.js} +2 -2
- package/dist/storybook/assets/{onRemove.stories-CoLJFkWa.js → onRemove.stories-BICsnIJL.js} +1 -1
- package/dist/storybook/assets/{onVisible.stories-DOeZx7wi.js → onVisible.stories-DpDZP9_5.js} +2 -2
- package/dist/storybook/assets/position-CFNQy3J6.js +1 -0
- package/dist/storybook/assets/ripple-DQbyyRUw.js +251 -0
- package/dist/storybook/assets/{style-map-CmHqpCu1.js → style-map-CBrSnxRe.js} +1 -1
- package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-Bz_DuQj8.js +6 -0
- package/dist/storybook/brightspot-logo.svg +19 -0
- package/dist/storybook/iframe.html +23 -3
- package/dist/storybook/index.html +42 -1
- package/dist/storybook/index.json +1 -1
- package/dist/storybook/project.json +1 -1
- package/dist/storybook/sb-addons/storybook-3/manager-bundle.js +3 -0
- package/dist/tailwind-plugin-switch.d.ts +2 -0
- package/dist/tailwind-plugin-switch.d.ts.map +1 -0
- package/dist/tailwind-plugin-switch.js +223 -0
- package/dist/tailwind-plugin-switch.js.map +1 -0
- package/dist/tailwind-plugin-switch.ts +252 -0
- package/dist/util/EventEmitterMixin.d.ts +5 -0
- package/dist/util/EventEmitterMixin.d.ts.map +1 -1
- package/dist/util/EventEmitterMixin.js.map +1 -1
- package/dist/util/position.d.ts +9 -0
- package/dist/util/position.d.ts.map +1 -0
- package/dist/util/position.js +11 -0
- package/dist/util/position.js.map +1 -0
- package/docs/components/README.md +1 -0
- package/docs/components/Switch.md +79 -0
- package/package.json +2 -1
- package/dist/storybook/assets/Button.stories-hDMDDh81.js +0 -63
- package/dist/storybook/assets/Color-6BZIO3FS-C_nQSB2u.js +0 -1
- package/dist/storybook/assets/DocsRenderer-LL677BLK-56Pige1J.js +0 -758
- package/dist/storybook/assets/WithTooltip-65CFNBJE-CGB5q-AN.js +0 -9
- package/dist/storybook/assets/_commonjsHelpers-CqkleIqs.js +0 -1
- package/dist/storybook/assets/formatter-EIJCOSYU-BhNtSFM9.js +0 -1
- package/dist/storybook/assets/if-defined-BFyUeSVF.js +0 -1
- package/dist/storybook/assets/iframe-BeKreX-l.js +0 -1061
- package/dist/storybook/assets/index-Uz2kGy8J.js +0 -1
- package/dist/storybook/assets/onFind-DqriYjEB.js +0 -1
- 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;
|
|
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 @@
|
|
|
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.
|
|
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
|
},
|