@happyvertical/smrt-ui 0.55.21 → 0.55.22

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 (56) hide show
  1. package/dist/components/calendar/DayView.svelte +1 -1
  2. package/dist/components/data/CollectionList.svelte +1 -1
  3. package/dist/components/data/ListSortSelect.svelte +1 -1
  4. package/dist/components/feedback/Alert.svelte +83 -22
  5. package/dist/components/feedback/LoadingOverlay.svelte +2 -2
  6. package/dist/components/feedback/PhoneSheet.svelte +1 -1
  7. package/dist/components/feedback/ToastViewport.svelte +1 -1
  8. package/dist/components/feedback/WorkingStrip.svelte +4 -4
  9. package/dist/components/forms/CameraCapture.svelte +1 -1
  10. package/dist/components/forms/Checkbox.svelte +130 -36
  11. package/dist/components/forms/Combobox.svelte +2 -2
  12. package/dist/components/forms/Fieldset.svelte +1 -1
  13. package/dist/components/forms/FilePicker.svelte +1 -1
  14. package/dist/components/forms/FormActionBar.svelte +2 -2
  15. package/dist/components/forms/Input.svelte +66 -61
  16. package/dist/components/forms/InputGroup.svelte +1 -1
  17. package/dist/components/forms/Listbox.svelte +1 -1
  18. package/dist/components/forms/MultiSelect.svelte +2 -2
  19. package/dist/components/forms/RangeSlider.svelte +1 -1
  20. package/dist/components/forms/SegmentedControl.svelte +2 -2
  21. package/dist/components/forms/Select.svelte +67 -61
  22. package/dist/components/forms/SignaturePad.svelte +1 -1
  23. package/dist/components/forms/Slider.svelte +1 -1
  24. package/dist/components/forms/StagedControlReview.svelte +4 -4
  25. package/dist/components/forms/Switch.svelte +127 -35
  26. package/dist/components/forms/TagsInput.svelte +1 -1
  27. package/dist/components/forms/ToggleButton.svelte +1 -1
  28. package/dist/components/layout/Footer.svelte +1 -1
  29. package/dist/components/layout/Masthead.svelte +1 -1
  30. package/dist/components/memberships/MembershipCard.svelte +3 -3
  31. package/dist/components/nav/FilterChips.svelte +1 -1
  32. package/dist/components/nav/Tabs.svelte +189 -190
  33. package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
  34. package/dist/components/permissions/PermissionPicker.svelte +4 -4
  35. package/dist/components/roles/RoleSelector.svelte +2 -2
  36. package/dist/components/ui/Accordion.svelte +1 -1
  37. package/dist/components/ui/AccordionItem.svelte +1 -1
  38. package/dist/components/ui/Badge.svelte +23 -25
  39. package/dist/components/ui/Button.svelte +101 -115
  40. package/dist/components/ui/Button.svelte.d.ts +1 -1
  41. package/dist/components/ui/Card.svelte +44 -57
  42. package/dist/components/ui/Chip.svelte +65 -60
  43. package/dist/components/ui/Disclosure.svelte +1 -1
  44. package/dist/components/ui/IconToggle.svelte +2 -2
  45. package/dist/styles/unstyled.css +2 -2
  46. package/dist/svelte/playground/BaseControlsPreview.svelte +2 -2
  47. package/dist/svelte/playground/CollectionsPreview.svelte +1 -1
  48. package/dist/svelte/playground/DataTablePreview.svelte +5 -5
  49. package/dist/svelte/playground/FeedbackPreview.svelte +1 -1
  50. package/dist/svelte/playground/InteractiveControlsPreview.svelte +1 -1
  51. package/dist/svelte/playground/StylelessPreview.svelte +35 -2
  52. package/dist/svelte/playground/StylelessPreview.svelte.d.ts.map +1 -1
  53. package/dist/themes/README.md +1 -1
  54. package/dist/themes/components/ColorSchemeToggle.svelte +3 -3
  55. package/dist/themes/components/ThemeSwitcher.svelte +3 -3
  56. package/package.json +2 -2
@@ -153,9 +153,9 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
153
153
 
154
154
  {#snippet linkTab(tab: Tab)}
155
155
  <a
156
- class="tab-link"
156
+ class="smrt-tabs__tab-link"
157
157
  data-smrt-part="tab"
158
- class:active={tab.id === active}
158
+ class:smrt-tabs__active={tab.id === active}
159
159
  href={tab.disabled ? undefined : tab.href}
160
160
  aria-current={tab.id === active ? 'page' : undefined}
161
161
  aria-disabled={tab.disabled ? 'true' : undefined}
@@ -168,40 +168,40 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
168
168
  handleClick(tab.id);
169
169
  }}
170
170
  >
171
- <span class="tab-label" data-smrt-part="label">{tab.label}</span>
171
+ <span data-smrt-part="label">{tab.label}</span>
172
172
  {#if tab.count !== undefined}
173
- <span class="tab-count" data-smrt-part="count">{tab.count}</span>
173
+ <span class="smrt-tabs__tab-count" data-smrt-part="count">{tab.count}</span>
174
174
  {/if}
175
175
  {#if hasBadge(tab)}
176
- <span class="tab-badge" data-smrt-part="badge">{tab.badge}</span>
176
+ <span class="smrt-tabs__tab-badge" data-smrt-part="badge">{tab.badge}</span>
177
177
  {/if}
178
178
  </a>
179
179
  {/snippet}
180
180
 
181
181
  {#if linkMode}
182
- <div class="tabs-container" data-smrt-component="Tabs">
182
+ <div class="smrt-tabs__container" data-smrt-component="Tabs">
183
183
  <nav
184
- class="tabs-links" data-smrt-part="list"
185
- class:sm={size === 'sm'}
186
- class:lg={size === 'lg'}
184
+ class="smrt-tabs__links" data-smrt-part="list"
185
+ class:smrt-tabs__sm={size === 'sm'}
186
+ class:smrt-tabs__lg={size === 'lg'}
187
187
  aria-label={ariaLabel}
188
188
  data-shell-tabs
189
189
  >
190
- <div class="tabs-links-row" bind:this={linkRow}>
190
+ <div class="smrt-tabs__links-row" data-smrt-part="row" bind:this={linkRow}>
191
191
  {#each split.visible as tab (tab.id)}
192
192
  {@render linkTab(tab)}
193
193
  {/each}
194
194
  </div>
195
195
  {#if split.overflow.length > 0}
196
- <details class="tabs-more" bind:this={moreMenu}>
197
- <summary class="tab-link" data-smrt-part="trigger">
198
- <span class="tab-label" data-smrt-part="label">{moreLabel}</span>
196
+ <details class="smrt-tabs__more" data-smrt-part="overflow" bind:this={moreMenu}>
197
+ <summary class="smrt-tabs__tab-link" data-smrt-part="trigger">
198
+ <span data-smrt-part="label">{moreLabel}</span>
199
199
  {#if overflowHasBadge}
200
- <span class="tab-dot" aria-hidden="true"></span>
201
- <span class="visually-hidden">({moreBadgeLabel})</span>
200
+ <span class="smrt-tabs__tab-dot" data-smrt-part="marker" aria-hidden="true"></span>
201
+ <span class="smrt-tabs__visually-hidden" data-smrt-part="description">({moreBadgeLabel})</span>
202
202
  {/if}
203
203
  </summary>
204
- <div class="tabs-more-menu" data-smrt-part="menu">
204
+ <div class="smrt-tabs__more-menu" data-smrt-part="menu">
205
205
  {#each split.overflow as tab (tab.id)}
206
206
  {@render linkTab(tab)}
207
207
  {/each}
@@ -210,18 +210,18 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
210
210
  {/if}
211
211
  </nav>
212
212
  {#if children}
213
- <div class="tab-panel" data-smrt-part="panel">
213
+ <div class="smrt-tabs__tab-panel" data-smrt-part="panel">
214
214
  {@render children()}
215
215
  </div>
216
216
  {/if}
217
217
  </div>
218
218
  {:else}
219
- <div class="tabs-container" data-smrt-component="Tabs">
219
+ <div class="smrt-tabs__container" data-smrt-component="Tabs">
220
220
  <div
221
- class="tabs-nav" data-smrt-part="list"
222
- class:sm={size === 'sm'}
223
- class:lg={size === 'lg'}
224
- class:secondary={variant === 'secondary'}
221
+ class="smrt-tabs__nav" data-smrt-part="list"
222
+ class:smrt-tabs__sm={size === 'sm'}
223
+ class:smrt-tabs__lg={size === 'lg'}
224
+ class:smrt-tabs__secondary={variant === 'secondary'}
225
225
  role="tablist"
226
226
  aria-label={ariaLabel}
227
227
  bind:this={tablistEl}
@@ -229,8 +229,8 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
229
229
  {#each tabs as tab (tab.id)}
230
230
  <button
231
231
  type="button"
232
- class="tab-button" data-smrt-part="tab"
233
- class:active={tab.id === active}
232
+ class="smrt-tabs__tab-button" data-smrt-part="tab"
233
+ class:smrt-tabs__active={tab.id === active}
234
234
  disabled={tab.disabled}
235
235
  role="tab"
236
236
  id="tab-{instanceId}-{tab.id}"
@@ -242,24 +242,24 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
242
242
  onkeydown={(e) => handleKeydown(e, tab.id)}
243
243
  use:ripple
244
244
  >
245
- <span class="tab-content-wrapper">
246
- <span class="tab-label" data-smrt-part="label">{tab.label}</span>
245
+ <span class="smrt-tabs__tab-content-wrapper" data-smrt-part="body">
246
+ <span data-smrt-part="label">{tab.label}</span>
247
247
  {#if tab.count !== undefined}
248
- <span class="tab-count" data-smrt-part="count">{tab.count}</span>
248
+ <span class="smrt-tabs__tab-count" data-smrt-part="count">{tab.count}</span>
249
249
  {/if}
250
250
  {#if hasBadge(tab)}
251
- <span class="tab-badge" data-smrt-part="badge">{tab.badge}</span>
251
+ <span class="smrt-tabs__tab-badge" data-smrt-part="badge">{tab.badge}</span>
252
252
  {/if}
253
253
  </span>
254
- <div class="active-indicator"></div>
254
+ <div class="smrt-tabs__active-indicator" data-smrt-part="indicator"></div>
255
255
  </button>
256
256
  {/each}
257
257
  </div>
258
258
 
259
259
  {#if children}
260
- <div
261
- class="tab-panel" data-smrt-part="panel"
262
- role="tabpanel"
260
+ <div
261
+ class="smrt-tabs__tab-panel" data-smrt-part="panel"
262
+ role="tabpanel"
263
263
  id="tab-panel-{instanceId}"
264
264
  aria-labelledby="tab-{instanceId}-{active}"
265
265
  >
@@ -271,20 +271,17 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
271
271
 
272
272
  <style>
273
273
  @layer smrt.reset, smrt.structure, smrt.theme;
274
- @layer smrt.theme {
275
- .tabs-container {
274
+ @layer smrt.structure {
275
+ .smrt-tabs__container {
276
276
  display: flex;
277
277
  flex-direction: column;
278
278
  width: 100%;
279
279
  }
280
-
281
- .tabs-nav {
280
+ .smrt-tabs__nav {
282
281
  display: flex;
283
- border-bottom: var(--smrt-hairline);
284
282
  width: 100%;
285
283
  }
286
-
287
- .tab-button {
284
+ .smrt-tabs__tab-button {
288
285
  flex: 1;
289
286
  display: inline-flex;
290
287
  flex-direction: column;
@@ -292,137 +289,66 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
292
289
  justify-content: center;
293
290
  padding: 0 var(--smrt-spacing-4);
294
291
  height: 48px;
295
- font: var(--smrt-typography-title-small-font);
296
- font-weight: var(--smrt-control-weight);
297
- color: var(--smrt-color-on-surface-variant);
298
- background: transparent;
299
- border: none;
300
- border-radius: var(--smrt-control-radius) var(--smrt-control-radius) 0 0;
301
292
  cursor: pointer;
302
- transition: all 200ms cubic-bezier(0.2, 0, 0, 1);
303
293
  position: relative;
304
294
  overflow: hidden;
305
295
  min-width: 90px;
306
296
  }
307
-
308
- .sm .tab-button {
297
+ .smrt-tabs__sm .smrt-tabs__tab-button {
309
298
  height: 40px;
310
- font: var(--smrt-typography-label-large-font);
311
299
  }
312
-
313
- .lg .tab-button {
300
+ .smrt-tabs__lg .smrt-tabs__tab-button {
314
301
  height: 56px;
315
- font: var(--smrt-typography-title-medium-font);
316
302
  }
317
-
318
- /* State layer: currentColor mixed at the theme's state opacity. */
319
- .tab-button::after {
303
+ .smrt-tabs__tab-button::after {
320
304
  content: '';
321
305
  position: absolute;
322
306
  inset: 0;
323
- border-radius: inherit;
324
- background: transparent;
325
307
  pointer-events: none;
326
308
  }
327
-
328
- .tab-button:hover:not(:disabled) {
329
- color: var(--smrt-color-on-surface);
330
- }
331
-
332
- .tab-button:hover:not(:disabled)::after {
333
- background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent);
334
- }
335
-
336
- .tab-button:active:not(:disabled)::after {
337
- background: color-mix(in srgb, currentColor calc(var(--smrt-state-pressed) * 100%), transparent);
338
- }
339
-
340
- .tab-button.active::after {
341
- background: color-mix(in srgb, currentColor calc(var(--smrt-state-selected) * 100%), transparent);
342
- }
343
-
344
- .tab-button:focus-visible {
345
- outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
346
- outline-offset: calc(var(--smrt-focus-ring-width) * -1);
347
- }
348
-
349
- .tab-button.active {
350
- color: var(--smrt-color-primary);
351
- }
352
-
353
- .tab-button:disabled {
354
- opacity: var(--smrt-state-disabled);
309
+ .smrt-tabs__tab-button:disabled {
355
310
  cursor: not-allowed;
356
311
  }
357
-
358
- .tab-content-wrapper {
312
+ .smrt-tabs__tab-content-wrapper {
359
313
  display: flex;
360
314
  align-items: center;
361
315
  gap: var(--smrt-spacing-2);
362
316
  height: 100%;
363
317
  }
364
-
365
- .tab-count {
366
- font: var(--smrt-typography-label-small-font);
367
- opacity: 0.7;
368
- }
369
-
370
- .active-indicator {
318
+ .smrt-tabs__active-indicator {
371
319
  position: absolute;
372
320
  bottom: 0;
373
321
  height: 3px;
374
- background-color: var(--smrt-color-primary);
375
- border-radius: var(--smrt-radius-sm) var(--smrt-radius-sm) 0 0;
376
- transition: width 200ms, opacity 200ms;
377
322
  width: 0;
378
- opacity: 0;
379
323
  }
380
-
381
- .active .active-indicator {
382
- width: 40px; /* Primary variant indicator width */
383
- opacity: 1;
324
+ .smrt-tabs__active .smrt-tabs__active-indicator {
325
+ width: 40px;
384
326
  }
385
-
386
- /* Secondary variant - full width indicator */
387
- .secondary .active .active-indicator {
327
+ .smrt-tabs__secondary .smrt-tabs__active .smrt-tabs__active-indicator {
388
328
  width: 100%;
389
329
  height: 2px;
390
330
  }
391
-
392
- .tab-panel {
331
+ .smrt-tabs__tab-panel {
393
332
  padding-top: 1.5rem;
394
333
  }
395
-
396
- .tab-badge {
334
+ .smrt-tabs__tab-badge {
397
335
  min-width: 1.25rem;
398
336
  padding: 0.05rem 0.4rem;
399
- border-radius: 999px;
400
- background: var(--smrt-surface-sunken);
401
- color: var(--smrt-color-on-surface);
402
- font: var(--smrt-typography-label-small-font);
403
- font-weight: var(--smrt-typography-weight-bold, 700);
404
- text-align: center;
405
337
  }
406
-
407
- /* Link tabs: a navigation row, one URL per tab. */
408
- .tabs-links {
338
+ .smrt-tabs__links {
409
339
  display: flex;
410
340
  align-items: stretch;
411
341
  gap: var(--smrt-spacing-1);
412
342
  width: 100%;
413
- border-bottom: var(--smrt-hairline);
414
343
  }
415
-
416
- .tabs-links-row {
344
+ .smrt-tabs__links-row {
417
345
  display: flex;
418
346
  flex: 1 1 auto;
419
347
  min-width: 0;
420
348
  gap: var(--smrt-spacing-1);
421
349
  overflow-x: auto;
422
- scrollbar-width: thin;
423
350
  }
424
-
425
- .tab-link {
351
+ .smrt-tabs__tab-link {
426
352
  display: inline-flex;
427
353
  flex: 0 0 auto;
428
354
  align-items: center;
@@ -430,108 +356,181 @@ function handleKeydown(event: KeyboardEvent, tabId: string) {
430
356
  min-height: var(--smrt-control-height);
431
357
  padding: 0 var(--smrt-spacing-4);
432
358
  margin-bottom: -1px;
359
+ white-space: nowrap;
360
+ cursor: pointer;
361
+ }
362
+ .smrt-tabs__links.smrt-tabs__sm .smrt-tabs__tab-link {
363
+ min-height: var(--smrt-control-height-small);
364
+ }
365
+ .smrt-tabs__links.smrt-tabs__lg .smrt-tabs__tab-link {
366
+ min-height: 56px;
367
+ }
368
+ .smrt-tabs__tab-link[aria-disabled='true'] {
369
+ cursor: not-allowed;
370
+ }
371
+ .smrt-tabs__tab-dot {
372
+ width: 0.5rem;
373
+ height: 0.5rem;
374
+ }
375
+ .smrt-tabs__more {
376
+ position: relative;
377
+ flex: 0 0 auto;
378
+ }
379
+ .smrt-tabs__more summary {
380
+ list-style: none;
381
+ }
382
+ .smrt-tabs__more summary::-webkit-details-marker {
383
+ display: none;
384
+ }
385
+ .smrt-tabs__more-menu {
386
+ position: absolute;
387
+ inset-inline-end: 0;
388
+ z-index: var(--smrt-z-index-dropdown);
389
+ display: grid;
390
+ min-width: 12rem;
391
+ padding: var(--smrt-spacing-1);
392
+ }
393
+ .smrt-tabs__more-menu .smrt-tabs__tab-link {
394
+ margin: 0;
395
+ }
396
+ .smrt-tabs__visually-hidden {
397
+ position: absolute;
398
+ width: 1px;
399
+ height: 1px;
400
+ overflow: hidden;
401
+ clip: rect(0 0 0 0);
402
+ white-space: nowrap;
403
+ }
404
+ }
405
+ @layer smrt.theme {
406
+ .smrt-tabs__nav {
407
+ border-bottom: var(--smrt-hairline);
408
+ }
409
+ .smrt-tabs__tab-button {
410
+ font: var(--smrt-typography-title-small-font);
411
+ font-weight: var(--smrt-control-weight);
412
+ color: var(--smrt-color-on-surface-variant);
413
+ background: transparent;
414
+ border: none;
415
+ border-radius: var(--smrt-control-radius) var(--smrt-control-radius) 0 0;
416
+ transition: all 200ms cubic-bezier(0.2, 0, 0, 1);
417
+ }
418
+ .smrt-tabs__sm .smrt-tabs__tab-button {
419
+ font: var(--smrt-typography-label-large-font);
420
+ }
421
+ .smrt-tabs__lg .smrt-tabs__tab-button {
422
+ font: var(--smrt-typography-title-medium-font);
423
+ }
424
+ .smrt-tabs__tab-button::after {
425
+ border-radius: inherit;
426
+ background: transparent;
427
+ }
428
+ .smrt-tabs__tab-button:hover:not(:disabled) {
429
+ color: var(--smrt-color-on-surface);
430
+ }
431
+ .smrt-tabs__tab-button:hover:not(:disabled)::after {
432
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent);
433
+ }
434
+ .smrt-tabs__tab-button:active:not(:disabled)::after {
435
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-pressed) * 100%), transparent);
436
+ }
437
+ .smrt-tabs__tab-button.smrt-tabs__active::after {
438
+ background: color-mix(in srgb, currentColor calc(var(--smrt-state-selected) * 100%), transparent);
439
+ }
440
+ .smrt-tabs__tab-button:focus-visible {
441
+ outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
442
+ outline-offset: calc(var(--smrt-focus-ring-width) * -1);
443
+ }
444
+ .smrt-tabs__tab-button.smrt-tabs__active {
445
+ color: var(--smrt-color-primary);
446
+ }
447
+ .smrt-tabs__tab-button:disabled {
448
+ opacity: var(--smrt-state-disabled);
449
+ }
450
+ .smrt-tabs__tab-count {
451
+ font: var(--smrt-typography-label-small-font);
452
+ opacity: 0.7;
453
+ }
454
+ .smrt-tabs__active-indicator {
455
+ background-color: var(--smrt-color-primary);
456
+ border-radius: var(--smrt-radius-sm) var(--smrt-radius-sm) 0 0;
457
+ transition: width 200ms, opacity 200ms;
458
+ opacity: 0;
459
+ }
460
+ .smrt-tabs__active .smrt-tabs__active-indicator {
461
+ opacity: 1;
462
+ }
463
+ .smrt-tabs__tab-badge {
464
+ border-radius: 999px;
465
+ background: var(--smrt-surface-sunken);
466
+ color: var(--smrt-color-on-surface);
467
+ font: var(--smrt-typography-label-small-font);
468
+ font-weight: var(--smrt-typography-weight-bold);
469
+ text-align: center;
470
+ }
471
+ .smrt-tabs__links {
472
+ border-bottom: var(--smrt-hairline);
473
+ }
474
+ .smrt-tabs__links-row {
475
+ scrollbar-width: thin;
476
+ }
477
+ .smrt-tabs__tab-link {
433
478
  border-radius: var(--smrt-control-radius) var(--smrt-control-radius) 0 0;
434
479
  border-bottom: 2px solid transparent;
435
480
  color: var(--smrt-color-on-surface-variant);
436
481
  font: var(--smrt-typography-title-small-font);
437
482
  font-weight: var(--smrt-control-weight);
438
483
  text-decoration: none;
439
- white-space: nowrap;
440
- cursor: pointer;
441
484
  }
442
-
443
- .tabs-links.sm .tab-link {
444
- min-height: var(--smrt-control-height-small);
485
+ .smrt-tabs__links.smrt-tabs__sm .smrt-tabs__tab-link {
445
486
  border-radius: var(--smrt-control-radius-small) var(--smrt-control-radius-small) 0 0;
446
487
  font: var(--smrt-typography-label-large-font);
447
488
  }
448
-
449
- .tabs-links.lg .tab-link {
450
- min-height: 56px;
489
+ .smrt-tabs__links.smrt-tabs__lg .smrt-tabs__tab-link {
451
490
  font: var(--smrt-typography-title-medium-font);
452
491
  }
453
-
454
- .tab-link:hover {
492
+ .smrt-tabs__tab-link:hover {
455
493
  color: var(--smrt-color-on-surface);
456
494
  background: color-mix(in srgb, currentColor calc(var(--smrt-state-hover) * 100%), transparent);
457
495
  }
458
-
459
- .tab-link:active {
496
+ .smrt-tabs__tab-link:active {
460
497
  background: color-mix(in srgb, currentColor calc(var(--smrt-state-pressed) * 100%), transparent);
461
498
  }
462
-
463
- .tab-link.active {
499
+ .smrt-tabs__tab-link.smrt-tabs__active {
464
500
  border-bottom-color: var(--smrt-color-primary);
465
501
  color: var(--smrt-color-primary);
466
502
  }
467
-
468
- .tab-link[aria-disabled='true'] {
503
+ .smrt-tabs__tab-link[aria-disabled='true'] {
469
504
  opacity: var(--smrt-state-disabled);
470
- cursor: not-allowed;
471
505
  }
472
-
473
- .tab-link:focus-visible {
506
+ .smrt-tabs__tab-link:focus-visible {
474
507
  outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
475
508
  outline-offset: calc(var(--smrt-focus-ring-width) * -1);
476
509
  }
477
-
478
- .tab-dot {
479
- width: 0.5rem;
480
- height: 0.5rem;
510
+ .smrt-tabs__tab-dot {
481
511
  border-radius: 999px;
482
512
  background: var(--smrt-color-primary);
483
513
  }
484
-
485
- .tabs-more {
486
- position: relative;
487
- flex: 0 0 auto;
488
- }
489
-
490
- .tabs-more summary {
491
- list-style: none;
492
- }
493
-
494
- .tabs-more summary::-webkit-details-marker {
495
- display: none;
496
- }
497
-
498
- .tabs-more-menu {
499
- position: absolute;
500
- inset-inline-end: 0;
501
- z-index: var(--smrt-z-index-dropdown, 20);
502
- display: grid;
503
- min-width: 12rem;
504
- padding: var(--smrt-spacing-1);
514
+ .smrt-tabs__more-menu {
505
515
  border: var(--smrt-hairline);
506
- border-radius: var(--smrt-radius-small, 0.5rem);
516
+ border-radius: var(--smrt-radius-small);
507
517
  background: var(--smrt-glass-surface-strong);
508
518
  backdrop-filter: blur(var(--smrt-glass-blur)) saturate(var(--smrt-glass-saturation));
509
519
  box-shadow: var(--smrt-inset-highlight), var(--smrt-elevation-3);
510
520
  }
511
-
512
- .tabs-more-menu .tab-link {
513
- margin: 0;
521
+ .smrt-tabs__more-menu .smrt-tabs__tab-link {
514
522
  border-bottom: 0;
515
- border-radius: var(--smrt-radius-extra-small, 0.35rem);
516
- }
517
-
518
- .visually-hidden {
519
- position: absolute;
520
- width: 1px;
521
- height: 1px;
522
- overflow: hidden;
523
- clip: rect(0 0 0 0);
524
- white-space: nowrap;
523
+ border-radius: var(--smrt-radius-extra-small);
525
524
  }
526
525
  /* Forced colors (#3908): system colours where colour alone carries meaning. */
527
526
  @media (forced-colors: active) {
528
- .active-indicator { background-color: Highlight; }
529
- .tab-button.active, .tab-link.active { color: Highlight; }
530
- .tab-link { border-bottom-color: Canvas; }
531
- .tab-link.active { border-bottom-color: Highlight; }
532
- .tab-dot { background: CanvasText; }
533
- .tab-badge { background: Canvas; border: var(--smrt-hairline-strong); }
534
- .tab-button:disabled, .tab-link[aria-disabled='true'] { opacity: 1; color: GrayText; }
527
+ .smrt-tabs__active-indicator { background-color: Highlight; }
528
+ .smrt-tabs__tab-button.smrt-tabs__active, .smrt-tabs__tab-link.smrt-tabs__active { color: Highlight; }
529
+ .smrt-tabs__tab-link { border-bottom-color: Canvas; }
530
+ .smrt-tabs__tab-link.smrt-tabs__active { border-bottom-color: Highlight; }
531
+ .smrt-tabs__tab-dot { background: CanvasText; }
532
+ .smrt-tabs__tab-badge { background: Canvas; border: var(--smrt-hairline-strong); }
533
+ .smrt-tabs__tab-button:disabled, .smrt-tabs__tab-link[aria-disabled='true'] { opacity: 1; color: GrayText; }
535
534
  }
536
535
  }
537
- </style>
536
+ </style>
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/nav/Tabs.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAClC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+LD,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Tabs.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/nav/Tabs.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,qBAAqB;IACrB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAClC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgMD,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
@@ -199,14 +199,14 @@ function matches(permission: PermissionPickerItem, category: string): boolean {
199
199
  .search { display: grid; flex: 1 1 16rem; max-inline-size: 28rem; gap: var(--smrt-spacing-1); color: var(--smrt-color-on-surface); font: var(--smrt-typography-label-medium-font); }
200
200
  fieldset { min-inline-size: 0; margin: 0; padding: 0; border: 0; }
201
201
  .groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(20rem, 100%), 1fr)); gap: var(--smrt-spacing-4); align-items: start; }
202
- .group { min-inline-size: 0; border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-medium); background: var(--smrt-color-surface); }
202
+ .group { min-inline-size: 0; border: var(--smrt-hairline); border-radius: var(--smrt-radius-medium); background: var(--smrt-color-surface); }
203
203
  summary { display: flex; min-block-size: 2.75rem; align-items: center; justify-content: space-between; gap: var(--smrt-spacing-3); padding: var(--smrt-spacing-3) var(--smrt-spacing-4); color: var(--smrt-color-on-surface); font: var(--smrt-typography-title-medium-font); cursor: pointer; }
204
204
  summary:focus-visible { outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color); outline-offset: var(--smrt-focus-ring-offset); }
205
205
  .selected-count { flex: 0 0 auto; color: var(--smrt-color-on-surface-variant); font: var(--smrt-typography-label-medium-font); }
206
- .choices { display: grid; gap: var(--smrt-spacing-4); padding: 0 var(--smrt-spacing-4) var(--smrt-spacing-4); border-block-start: 1px solid var(--smrt-color-outline-variant); padding-block-start: var(--smrt-spacing-4); }
206
+ .choices { display: grid; gap: var(--smrt-spacing-4); padding: 0 var(--smrt-spacing-4) var(--smrt-spacing-4); border-block-start: var(--smrt-hairline); padding-block-start: var(--smrt-spacing-4); }
207
207
  .choice { display: grid; min-inline-size: 0; gap: var(--smrt-spacing-1); }
208
- .choice :global(.checkbox) { min-inline-size: 0; }
209
- .choice :global(.checkbox__label), code, .choice p { overflow-wrap: anywhere; }
208
+ .choice :global([data-smrt-component="Checkbox"]) { min-inline-size: 0; }
209
+ .choice :global([data-smrt-component="Checkbox"] [data-smrt-part="label"]), code, .choice p { overflow-wrap: anywhere; }
210
210
  code { padding-inline-start: calc(1.125rem + var(--smrt-spacing-2)); }
211
211
  .choice p { padding-inline-start: calc(1.125rem + var(--smrt-spacing-2)); }
212
212
  .no-results { padding: var(--smrt-spacing-4); border-radius: var(--smrt-radius-medium); background: var(--smrt-color-surface-container-low); }
@@ -207,7 +207,7 @@ $effect(() => {
207
207
  width: 100%;
208
208
  padding: 0.5rem 0.75rem;
209
209
  background: var(--smrt-color-surface, white);
210
- border: 1px solid var(--smrt-color-outline);
210
+ border: var(--smrt-hairline-strong);
211
211
  border-radius: var(--smrt-radius-small, 0.375rem);
212
212
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
213
213
  cursor: pointer;
@@ -257,7 +257,7 @@ $effect(() => {
257
257
  right: 0;
258
258
  margin-top: 0.25rem;
259
259
  background: var(--smrt-color-surface, white);
260
- border: 1px solid var(--smrt-color-outline-variant);
260
+ border: var(--smrt-hairline);
261
261
  border-radius: var(--smrt-radius-small, 0.375rem);
262
262
  box-shadow: var(--smrt-elevation-2, 0 4px 6px -1px rgba(0, 0, 0, 0.1));
263
263
  z-index: var(--smrt-z-index-dropdown, 1000);
@@ -47,6 +47,6 @@ setAccordionContext({ isOpen, toggle });
47
47
  <style>
48
48
  @layer smrt.reset, smrt.structure, smrt.theme;
49
49
  @layer smrt.theme {
50
- .accordion { overflow: hidden; border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-large); background: var(--smrt-color-surface); }
50
+ .accordion { overflow: hidden; border: var(--smrt-hairline); border-radius: var(--smrt-radius-large); background: var(--smrt-color-surface); }
51
51
  }
52
52
  </style>
@@ -34,7 +34,7 @@ const open = $derived(context.isOpen(value));
34
34
  <style>
35
35
  @layer smrt.reset, smrt.structure, smrt.theme;
36
36
  @layer smrt.theme {
37
- .item { border-bottom: 1px solid var(--smrt-color-outline-variant); }
37
+ .item { border-bottom: var(--smrt-hairline); }
38
38
  .item:last-child { border-bottom: 0; }
39
39
  h3 { margin: 0; }
40
40
  button { display: flex; width: 100%; align-items: center; justify-content: space-between; gap: var(--smrt-spacing-3); padding: var(--smrt-spacing-4); border: 0; background: transparent; color: var(--smrt-color-on-surface); font: var(--smrt-typography-title-small-font); text-align: left; cursor: pointer; }