@jjlmoya/utils-tools 1.8.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 (52) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +26 -0
  4. package/src/tool/date-diff-calculator/component.astro +0 -200
  5. package/src/tool/date-diff-calculator/date-difference-calculator.css +198 -0
  6. package/src/tool/date-diff-calculator/entry.ts +24 -0
  7. package/src/tool/date-diff-calculator/index.ts +2 -25
  8. package/src/tool/drive-direct-link/component.astro +0 -173
  9. package/src/tool/drive-direct-link/entry.ts +24 -0
  10. package/src/tool/drive-direct-link/google-drive-direct-download-link.css +171 -0
  11. package/src/tool/drive-direct-link/index.ts +2 -25
  12. package/src/tool/email-list-cleaner/component.astro +0 -204
  13. package/src/tool/email-list-cleaner/email-list-cleaner.css +202 -0
  14. package/src/tool/email-list-cleaner/entry.ts +24 -0
  15. package/src/tool/email-list-cleaner/index.ts +2 -25
  16. package/src/tool/env-badge-spain/component.astro +0 -156
  17. package/src/tool/env-badge-spain/entry.ts +24 -0
  18. package/src/tool/env-badge-spain/environmental-badge-simulator-spain.css +154 -0
  19. package/src/tool/env-badge-spain/index.ts +2 -25
  20. package/src/tool/morse-beacon/component.astro +0 -298
  21. package/src/tool/morse-beacon/entry.ts +24 -0
  22. package/src/tool/morse-beacon/index.ts +2 -25
  23. package/src/tool/morse-beacon/morse-beacon.css +296 -0
  24. package/src/tool/password-generator/component.astro +0 -88
  25. package/src/tool/password-generator/entry.ts +24 -0
  26. package/src/tool/password-generator/index.ts +2 -25
  27. package/src/tool/password-generator/password-generator.css +86 -0
  28. package/src/tool/routes/component.astro +0 -254
  29. package/src/tool/routes/entry.ts +24 -0
  30. package/src/tool/routes/index.ts +2 -25
  31. package/src/tool/routes/optimal-routes.css +252 -0
  32. package/src/tool/rule-of-three/component.astro +0 -249
  33. package/src/tool/rule-of-three/entry.ts +24 -0
  34. package/src/tool/rule-of-three/index.ts +2 -25
  35. package/src/tool/rule-of-three/rule-of-three.css +247 -0
  36. package/src/tool/seo-content-optimizer/component.astro +0 -278
  37. package/src/tool/seo-content-optimizer/entry.ts +24 -0
  38. package/src/tool/seo-content-optimizer/index.ts +2 -25
  39. package/src/tool/seo-content-optimizer/seo-content-optimizer.css +276 -0
  40. package/src/tool/speed-reader/component.astro +0 -400
  41. package/src/tool/speed-reader/entry.ts +24 -0
  42. package/src/tool/speed-reader/index.ts +2 -25
  43. package/src/tool/speed-reader/speed-reader.css +398 -0
  44. package/src/tool/text-pixel-calculator/component.astro +0 -96
  45. package/src/tool/text-pixel-calculator/entry.ts +24 -0
  46. package/src/tool/text-pixel-calculator/index.ts +2 -25
  47. package/src/tool/text-pixel-calculator/text-pixel-width-calculator.css +94 -0
  48. package/src/tool/whatsapp-link/component.astro +0 -264
  49. package/src/tool/whatsapp-link/entry.ts +24 -0
  50. package/src/tool/whatsapp-link/index.ts +2 -25
  51. package/src/tool/whatsapp-link/whatsapp-link-generator.css +262 -0
  52. package/src/tools.ts +1 -1
@@ -73,304 +73,6 @@ const t = (ui ?? {}) as MorseBeaconUI;
73
73
  </div>
74
74
  </div>
75
75
 
76
- <style>
77
- .mb-root {
78
- --mb-accent: #16a34a;
79
- --mb-accent-hover: #15803d;
80
- --mb-sos-bg: #fff1f2;
81
- --mb-sos-color: #e11d48;
82
- --mb-sos-border: #fecdd3;
83
- --mb-sos-hover-bg: #ffe4e6;
84
- --mb-display-bg: #111827;
85
- --mb-bulb-off: #1e293b;
86
- --mb-bulb-border-off: #334155;
87
- --mb-ticker-color: #4ade80;
88
- --mb-status-bg: rgba(30, 41, 59, 0.8);
89
- --mb-status-border: #334155;
90
- --mb-card-bg: #fff;
91
- --mb-card-border: #f1f5f9;
92
- --mb-text-main: #1e293b;
93
- --mb-text-label: #64748b;
94
- --mb-text-hint: #94a3b8;
95
- --mb-field-border: #e2e8f0;
96
- --mb-field-focus: #16a34a;
97
- --mb-extras-border: #f1f5f9;
98
- --mb-toggle-off: #cbd5e1;
99
-
100
- width: 100%;
101
- max-width: 42rem;
102
- margin: 0 auto;
103
- }
104
-
105
- :global(.theme-dark) .mb-root {
106
- --mb-card-bg: #0f172a;
107
- --mb-card-border: #1e293b;
108
- --mb-text-main: #e2e8f0;
109
- --mb-text-label: #94a3b8;
110
- --mb-text-hint: #475569;
111
- --mb-field-border: #334155;
112
- --mb-sos-bg: rgba(225, 29, 72, 0.1);
113
- --mb-sos-border: rgba(225, 29, 72, 0.2);
114
- --mb-sos-hover-bg: rgba(225, 29, 72, 0.15);
115
- --mb-extras-border: #1e293b;
116
- --mb-toggle-off: #475569;
117
- }
118
-
119
- .mb-card {
120
- border-radius: 1.5rem;
121
- overflow: hidden;
122
- border: 1px solid var(--mb-card-border);
123
- box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.08);
124
- background: var(--mb-card-bg);
125
- }
126
-
127
- .mb-display {
128
- background: var(--mb-display-bg);
129
- padding: 2rem;
130
- position: relative;
131
- display: flex;
132
- flex-direction: column;
133
- align-items: center;
134
- justify-content: center;
135
- min-height: 220px;
136
- gap: 1.25rem;
137
- }
138
-
139
- .mb-bulb {
140
- width: 6rem;
141
- height: 6rem;
142
- border-radius: 50%;
143
- background: var(--mb-bulb-off);
144
- border: 4px solid var(--mb-bulb-border-off);
145
- display: flex;
146
- align-items: center;
147
- justify-content: center;
148
- color: #475569;
149
- position: relative;
150
- z-index: 1;
151
- transition: background 0.05s, border-color 0.05s, box-shadow 0.05s, color 0.05s;
152
- }
153
-
154
- .mb-ticker-wrap {
155
- height: 2rem;
156
- overflow: hidden;
157
- width: 100%;
158
- display: flex;
159
- align-items: center;
160
- justify-content: center;
161
- }
162
-
163
- .mb-ticker {
164
- color: var(--mb-ticker-color);
165
- font-size: 1.5rem;
166
- font-weight: 700;
167
- letter-spacing: 0.2em;
168
- white-space: nowrap;
169
- }
170
-
171
- .mb-status-badge {
172
- position: absolute;
173
- top: 1rem;
174
- right: 1rem;
175
- display: flex;
176
- align-items: center;
177
- gap: 0.5rem;
178
- background: var(--mb-status-bg);
179
- border: 1px solid var(--mb-status-border);
180
- padding: 0.375rem 0.75rem;
181
- border-radius: 9999px;
182
- backdrop-filter: blur(4px);
183
- }
184
-
185
- .mb-status-led {
186
- width: 0.5rem;
187
- height: 0.5rem;
188
- border-radius: 50%;
189
- background: #64748b;
190
- transition: background 0.2s;
191
- }
192
-
193
- .mb-status-text {
194
- font-size: 0.6875rem;
195
- font-weight: 700;
196
- color: #94a3b8;
197
- letter-spacing: 0.08em;
198
- }
199
-
200
- .mb-controls {
201
- padding: 2rem;
202
- display: flex;
203
- flex-direction: column;
204
- gap: 2rem;
205
- }
206
-
207
- .mb-field-header {
208
- display: flex;
209
- justify-content: space-between;
210
- align-items: center;
211
- margin-bottom: 0.75rem;
212
- }
213
-
214
- .mb-field-label {
215
- font-size: 0.8125rem;
216
- font-weight: 700;
217
- color: var(--mb-text-label);
218
- text-transform: uppercase;
219
- letter-spacing: 0.05em;
220
- }
221
-
222
- .mb-char-count {
223
- font-size: 0.8125rem;
224
- font-weight: 600;
225
- color: var(--mb-accent);
226
- }
227
-
228
- .mb-textarea {
229
- width: 100%;
230
- font-size: 1.125rem;
231
- font-weight: 700;
232
- color: var(--mb-text-main);
233
- background: transparent;
234
- border: none;
235
- border-bottom: 2px solid var(--mb-field-border);
236
- outline: none;
237
- padding: 0.5rem 0;
238
- resize: none;
239
- text-transform: uppercase;
240
- transition: border-color 0.2s;
241
- }
242
-
243
- .mb-textarea::placeholder {
244
- color: var(--mb-text-hint);
245
- text-transform: none;
246
- font-weight: 400;
247
- }
248
-
249
- .mb-textarea:focus {
250
- border-color: var(--mb-field-focus);
251
- }
252
-
253
- .mb-btn-row {
254
- display: grid;
255
- grid-template-columns: 1fr 1fr;
256
- gap: 0.75rem;
257
- }
258
-
259
- .mb-btn {
260
- display: flex;
261
- align-items: center;
262
- justify-content: center;
263
- gap: 0.5rem;
264
- padding: 1rem 1.25rem;
265
- border-radius: 0.75rem;
266
- font-weight: 700;
267
- font-size: 0.875rem;
268
- letter-spacing: 0.04em;
269
- text-transform: uppercase;
270
- border: none;
271
- cursor: pointer;
272
- transition: background 0.15s, transform 0.1s, opacity 0.15s;
273
- }
274
-
275
- .mb-btn:active {
276
- transform: scale(0.97);
277
- }
278
-
279
- .mb-btn:disabled {
280
- opacity: 0.5;
281
- cursor: not-allowed;
282
- }
283
-
284
- .mb-btn-transmit {
285
- background: var(--mb-accent);
286
- color: #fff;
287
- box-shadow: 0 4px 14px rgba(22, 163, 74, 0.35);
288
- }
289
-
290
- .mb-btn-transmit:hover:not(:disabled) {
291
- background: var(--mb-accent-hover);
292
- }
293
-
294
- .mb-btn-sos {
295
- background: var(--mb-sos-bg);
296
- color: var(--mb-sos-color);
297
- border: 2px solid var(--mb-sos-border);
298
- }
299
-
300
- .mb-btn-sos:hover:not(:disabled) {
301
- background: var(--mb-sos-hover-bg);
302
- }
303
-
304
- .mb-extras {
305
- display: flex;
306
- align-items: center;
307
- justify-content: center;
308
- padding-top: 1rem;
309
- border-top: 1px solid var(--mb-extras-border);
310
- }
311
-
312
- .mb-toggle-label {
313
- display: flex;
314
- align-items: center;
315
- gap: 0.75rem;
316
- cursor: pointer;
317
- }
318
-
319
- .mb-toggle-wrap {
320
- position: relative;
321
- display: flex;
322
- align-items: center;
323
- }
324
-
325
- .mb-toggle {
326
- position: absolute;
327
- opacity: 0;
328
- width: 0;
329
- height: 0;
330
- }
331
-
332
- .mb-toggle-track {
333
- width: 2.75rem;
334
- height: 1.5rem;
335
- background: var(--mb-toggle-off);
336
- border-radius: 9999px;
337
- cursor: pointer;
338
- transition: background 0.2s;
339
- position: relative;
340
- }
341
-
342
- .mb-toggle-track::after {
343
- content: '';
344
- position: absolute;
345
- top: 2px;
346
- left: 2px;
347
- width: 1.25rem;
348
- height: 1.25rem;
349
- border-radius: 50%;
350
- background: #fff;
351
- transition: transform 0.2s;
352
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
353
- }
354
-
355
- .mb-toggle:checked + .mb-toggle-track {
356
- background: var(--mb-accent);
357
- }
358
-
359
- .mb-toggle:checked + .mb-toggle-track::after {
360
- transform: translateX(1.25rem);
361
- }
362
-
363
- .mb-toggle-text {
364
- font-size: 0.9375rem;
365
- font-weight: 500;
366
- color: var(--mb-text-label);
367
- transition: color 0.15s;
368
- }
369
-
370
- .mb-toggle-label:hover .mb-toggle-text {
371
- color: var(--mb-accent);
372
- }
373
- </style>
374
76
 
375
77
  <script>
376
78
  import { MorseEngine } from './logic/MorseEngine';
@@ -0,0 +1,24 @@
1
+ import type { ToolsToolEntry } from '../../types';
2
+ import type { MorseBeaconUI } from './ui';
3
+
4
+ export const morseBeacon: ToolsToolEntry<MorseBeaconUI> = {
5
+ id: 'morse-beacon',
6
+ icons: { bg: 'mdi:transmission-tower', fg: 'mdi:dots-horizontal' },
7
+ i18n: {
8
+ de: () => import('./i18n/de').then((m) => m.content),
9
+ en: () => import('./i18n/en').then((m) => m.content),
10
+ es: () => import('./i18n/es').then((m) => m.content),
11
+ fr: () => import('./i18n/fr').then((m) => m.content),
12
+ id: () => import('./i18n/id').then((m) => m.content),
13
+ it: () => import('./i18n/it').then((m) => m.content),
14
+ ja: () => import('./i18n/ja').then((m) => m.content),
15
+ ko: () => import('./i18n/ko').then((m) => m.content),
16
+ nl: () => import('./i18n/nl').then((m) => m.content),
17
+ pl: () => import('./i18n/pl').then((m) => m.content),
18
+ pt: () => import('./i18n/pt').then((m) => m.content),
19
+ ru: () => import('./i18n/ru').then((m) => m.content),
20
+ sv: () => import('./i18n/sv').then((m) => m.content),
21
+ tr: () => import('./i18n/tr').then((m) => m.content),
22
+ zh: () => import('./i18n/zh').then((m) => m.content),
23
+ },
24
+ };
@@ -1,28 +1,5 @@
1
- import type { ToolDefinition, ToolsToolEntry } from '../../types';
2
- import type { MorseBeaconUI } from './ui';
3
-
4
- export const morseBeacon: ToolsToolEntry<MorseBeaconUI> = {
5
- id: 'morse-beacon',
6
- icons: { bg: 'mdi:transmission-tower', fg: 'mdi:dots-horizontal' },
7
- i18n: {
8
- de: () => import('./i18n/de').then((m) => m.content),
9
- en: () => import('./i18n/en').then((m) => m.content),
10
- es: () => import('./i18n/es').then((m) => m.content),
11
- fr: () => import('./i18n/fr').then((m) => m.content),
12
- id: () => import('./i18n/id').then((m) => m.content),
13
- it: () => import('./i18n/it').then((m) => m.content),
14
- ja: () => import('./i18n/ja').then((m) => m.content),
15
- ko: () => import('./i18n/ko').then((m) => m.content),
16
- nl: () => import('./i18n/nl').then((m) => m.content),
17
- pl: () => import('./i18n/pl').then((m) => m.content),
18
- pt: () => import('./i18n/pt').then((m) => m.content),
19
- ru: () => import('./i18n/ru').then((m) => m.content),
20
- sv: () => import('./i18n/sv').then((m) => m.content),
21
- tr: () => import('./i18n/tr').then((m) => m.content),
22
- zh: () => import('./i18n/zh').then((m) => m.content),
23
- },
24
- };
25
-
1
+ import { morseBeacon } from './entry';
2
+ export * from './entry';
26
3
  export const MORSE_BEACON_TOOL: ToolDefinition = {
27
4
  entry: morseBeacon,
28
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,296 @@
1
+ .mb-root {
2
+ --mb-accent: #16a34a;
3
+ --mb-accent-hover: #15803d;
4
+ --mb-sos-bg: #fff1f2;
5
+ --mb-sos-color: #e11d48;
6
+ --mb-sos-border: #fecdd3;
7
+ --mb-sos-hover-bg: #ffe4e6;
8
+ --mb-display-bg: #111827;
9
+ --mb-bulb-off: #1e293b;
10
+ --mb-bulb-border-off: #334155;
11
+ --mb-ticker-color: #4ade80;
12
+ --mb-status-bg: rgba(30, 41, 59, 0.8);
13
+ --mb-status-border: #334155;
14
+ --mb-card-bg: #fff;
15
+ --mb-card-border: #f1f5f9;
16
+ --mb-text-main: #1e293b;
17
+ --mb-text-label: #64748b;
18
+ --mb-text-hint: #94a3b8;
19
+ --mb-field-border: #e2e8f0;
20
+ --mb-field-focus: #16a34a;
21
+ --mb-extras-border: #f1f5f9;
22
+ --mb-toggle-off: #cbd5e1;
23
+
24
+ width: 100%;
25
+ max-width: 42rem;
26
+ margin: 0 auto;
27
+ }
28
+
29
+ :global(.theme-dark) .mb-root {
30
+ --mb-card-bg: #0f172a;
31
+ --mb-card-border: #1e293b;
32
+ --mb-text-main: #e2e8f0;
33
+ --mb-text-label: #94a3b8;
34
+ --mb-text-hint: #475569;
35
+ --mb-field-border: #334155;
36
+ --mb-sos-bg: rgba(225, 29, 72, 0.1);
37
+ --mb-sos-border: rgba(225, 29, 72, 0.2);
38
+ --mb-sos-hover-bg: rgba(225, 29, 72, 0.15);
39
+ --mb-extras-border: #1e293b;
40
+ --mb-toggle-off: #475569;
41
+ }
42
+
43
+ .mb-card {
44
+ border-radius: 1.5rem;
45
+ overflow: hidden;
46
+ border: 1px solid var(--mb-card-border);
47
+ box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.08);
48
+ background: var(--mb-card-bg);
49
+ }
50
+
51
+ .mb-display {
52
+ background: var(--mb-display-bg);
53
+ padding: 2rem;
54
+ position: relative;
55
+ display: flex;
56
+ flex-direction: column;
57
+ align-items: center;
58
+ justify-content: center;
59
+ min-height: 220px;
60
+ gap: 1.25rem;
61
+ }
62
+
63
+ .mb-bulb {
64
+ width: 6rem;
65
+ height: 6rem;
66
+ border-radius: 50%;
67
+ background: var(--mb-bulb-off);
68
+ border: 4px solid var(--mb-bulb-border-off);
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ color: #475569;
73
+ position: relative;
74
+ z-index: 1;
75
+ transition: background 0.05s, border-color 0.05s, box-shadow 0.05s, color 0.05s;
76
+ }
77
+
78
+ .mb-ticker-wrap {
79
+ height: 2rem;
80
+ overflow: hidden;
81
+ width: 100%;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ }
86
+
87
+ .mb-ticker {
88
+ color: var(--mb-ticker-color);
89
+ font-size: 1.5rem;
90
+ font-weight: 700;
91
+ letter-spacing: 0.2em;
92
+ white-space: nowrap;
93
+ }
94
+
95
+ .mb-status-badge {
96
+ position: absolute;
97
+ top: 1rem;
98
+ right: 1rem;
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 0.5rem;
102
+ background: var(--mb-status-bg);
103
+ border: 1px solid var(--mb-status-border);
104
+ padding: 0.375rem 0.75rem;
105
+ border-radius: 9999px;
106
+ backdrop-filter: blur(4px);
107
+ }
108
+
109
+ .mb-status-led {
110
+ width: 0.5rem;
111
+ height: 0.5rem;
112
+ border-radius: 50%;
113
+ background: #64748b;
114
+ transition: background 0.2s;
115
+ }
116
+
117
+ .mb-status-text {
118
+ font-size: 0.6875rem;
119
+ font-weight: 700;
120
+ color: #94a3b8;
121
+ letter-spacing: 0.08em;
122
+ }
123
+
124
+ .mb-controls {
125
+ padding: 2rem;
126
+ display: flex;
127
+ flex-direction: column;
128
+ gap: 2rem;
129
+ }
130
+
131
+ .mb-field-header {
132
+ display: flex;
133
+ justify-content: space-between;
134
+ align-items: center;
135
+ margin-bottom: 0.75rem;
136
+ }
137
+
138
+ .mb-field-label {
139
+ font-size: 0.8125rem;
140
+ font-weight: 700;
141
+ color: var(--mb-text-label);
142
+ text-transform: uppercase;
143
+ letter-spacing: 0.05em;
144
+ }
145
+
146
+ .mb-char-count {
147
+ font-size: 0.8125rem;
148
+ font-weight: 600;
149
+ color: var(--mb-accent);
150
+ }
151
+
152
+ .mb-textarea {
153
+ width: 100%;
154
+ font-size: 1.125rem;
155
+ font-weight: 700;
156
+ color: var(--mb-text-main);
157
+ background: transparent;
158
+ border: none;
159
+ border-bottom: 2px solid var(--mb-field-border);
160
+ outline: none;
161
+ padding: 0.5rem 0;
162
+ resize: none;
163
+ text-transform: uppercase;
164
+ transition: border-color 0.2s;
165
+ }
166
+
167
+ .mb-textarea::placeholder {
168
+ color: var(--mb-text-hint);
169
+ text-transform: none;
170
+ font-weight: 400;
171
+ }
172
+
173
+ .mb-textarea:focus {
174
+ border-color: var(--mb-field-focus);
175
+ }
176
+
177
+ .mb-btn-row {
178
+ display: grid;
179
+ grid-template-columns: 1fr 1fr;
180
+ gap: 0.75rem;
181
+ }
182
+
183
+ .mb-btn {
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ gap: 0.5rem;
188
+ padding: 1rem 1.25rem;
189
+ border-radius: 0.75rem;
190
+ font-weight: 700;
191
+ font-size: 0.875rem;
192
+ letter-spacing: 0.04em;
193
+ text-transform: uppercase;
194
+ border: none;
195
+ cursor: pointer;
196
+ transition: background 0.15s, transform 0.1s, opacity 0.15s;
197
+ }
198
+
199
+ .mb-btn:active {
200
+ transform: scale(0.97);
201
+ }
202
+
203
+ .mb-btn:disabled {
204
+ opacity: 0.5;
205
+ cursor: not-allowed;
206
+ }
207
+
208
+ .mb-btn-transmit {
209
+ background: var(--mb-accent);
210
+ color: #fff;
211
+ box-shadow: 0 4px 14px rgba(22, 163, 74, 0.35);
212
+ }
213
+
214
+ .mb-btn-transmit:hover:not(:disabled) {
215
+ background: var(--mb-accent-hover);
216
+ }
217
+
218
+ .mb-btn-sos {
219
+ background: var(--mb-sos-bg);
220
+ color: var(--mb-sos-color);
221
+ border: 2px solid var(--mb-sos-border);
222
+ }
223
+
224
+ .mb-btn-sos:hover:not(:disabled) {
225
+ background: var(--mb-sos-hover-bg);
226
+ }
227
+
228
+ .mb-extras {
229
+ display: flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ padding-top: 1rem;
233
+ border-top: 1px solid var(--mb-extras-border);
234
+ }
235
+
236
+ .mb-toggle-label {
237
+ display: flex;
238
+ align-items: center;
239
+ gap: 0.75rem;
240
+ cursor: pointer;
241
+ }
242
+
243
+ .mb-toggle-wrap {
244
+ position: relative;
245
+ display: flex;
246
+ align-items: center;
247
+ }
248
+
249
+ .mb-toggle {
250
+ position: absolute;
251
+ opacity: 0;
252
+ width: 0;
253
+ height: 0;
254
+ }
255
+
256
+ .mb-toggle-track {
257
+ width: 2.75rem;
258
+ height: 1.5rem;
259
+ background: var(--mb-toggle-off);
260
+ border-radius: 9999px;
261
+ cursor: pointer;
262
+ transition: background 0.2s;
263
+ position: relative;
264
+ }
265
+
266
+ .mb-toggle-track::after {
267
+ content: '';
268
+ position: absolute;
269
+ top: 2px;
270
+ left: 2px;
271
+ width: 1.25rem;
272
+ height: 1.25rem;
273
+ border-radius: 50%;
274
+ background: #fff;
275
+ transition: transform 0.2s;
276
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
277
+ }
278
+
279
+ .mb-toggle:checked + .mb-toggle-track {
280
+ background: var(--mb-accent);
281
+ }
282
+
283
+ .mb-toggle:checked + .mb-toggle-track::after {
284
+ transform: translateX(1.25rem);
285
+ }
286
+
287
+ .mb-toggle-text {
288
+ font-size: 0.9375rem;
289
+ font-weight: 500;
290
+ color: var(--mb-text-label);
291
+ transition: color 0.15s;
292
+ }
293
+
294
+ .mb-toggle-label:hover .mb-toggle-text {
295
+ color: var(--mb-accent);
296
+ }