@happyvertical/smrt-svelte 0.55.16 → 0.55.18

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 (153) hide show
  1. package/README.md +5 -3
  2. package/agents/cookbook-shell.md +7 -1
  3. package/agents/overview-surfaces.md +5 -0
  4. package/agents/workspace.md +155 -11
  5. package/dist/browser-ai/svelte/components/DownloadProgress.svelte +22 -19
  6. package/dist/browser-ai/svelte/components/ModelStatusControl.svelte +16 -13
  7. package/dist/browser-ai/svelte/components/STTTest.svelte +41 -38
  8. package/dist/browser-ai/svelte/components/VoiceInput.svelte +17 -14
  9. package/dist/components/activity/ActivityList.svelte +1 -1
  10. package/dist/components/app/AppShell.svelte +279 -14
  11. package/dist/components/app/AppShell.svelte.d.ts +63 -2
  12. package/dist/components/app/AppShell.svelte.d.ts.map +1 -1
  13. package/dist/components/app/DockToggles.svelte +53 -11
  14. package/dist/components/app/DockToggles.svelte.d.ts.map +1 -1
  15. package/dist/components/app/OwnerSetupForm.svelte +98 -34
  16. package/dist/components/app/OwnerSetupForm.svelte.d.ts +4 -0
  17. package/dist/components/app/OwnerSetupForm.svelte.d.ts.map +1 -1
  18. package/dist/components/app/PhoneTabBar.svelte +136 -0
  19. package/dist/components/app/PhoneTabBar.svelte.d.ts +22 -0
  20. package/dist/components/app/PhoneTabBar.svelte.d.ts.map +1 -0
  21. package/dist/components/app/ShellSettingsPage.svelte +17 -2
  22. package/dist/components/app/ShellSettingsPage.svelte.d.ts +11 -16
  23. package/dist/components/app/ShellSettingsPage.svelte.d.ts.map +1 -1
  24. package/dist/components/app/dock-toggle.d.ts +3 -2
  25. package/dist/components/app/dock-toggle.d.ts.map +1 -1
  26. package/dist/components/app/index.d.ts +2 -1
  27. package/dist/components/app/index.d.ts.map +1 -1
  28. package/dist/components/app/index.js +1 -0
  29. package/dist/components/app/owner-setup-types.d.ts +5 -0
  30. package/dist/components/app/owner-setup-types.d.ts.map +1 -1
  31. package/dist/components/app/phone-tabs.d.ts +41 -0
  32. package/dist/components/app/phone-tabs.d.ts.map +1 -0
  33. package/dist/components/app/phone-tabs.js +66 -0
  34. package/dist/components/app/slot-item.d.ts +16 -0
  35. package/dist/components/app/slot-item.d.ts.map +1 -1
  36. package/dist/components/app/view-transition.d.ts +43 -0
  37. package/dist/components/app/view-transition.d.ts.map +1 -0
  38. package/dist/components/app/view-transition.js +76 -0
  39. package/dist/components/audit/AuditList.svelte +4 -1
  40. package/dist/components/audit/RecordHistory.svelte +4 -1
  41. package/dist/components/board/Board.svelte +4 -1
  42. package/dist/components/command-palette/CommandPalette.svelte +4 -1
  43. package/dist/components/command-palette/CommandPalette.svelte.d.ts +2 -0
  44. package/dist/components/command-palette/CommandPalette.svelte.d.ts.map +1 -1
  45. package/dist/components/command-palette/CommandPaletteDialog.svelte +3 -0
  46. package/dist/components/command-palette/CommandPaletteTrigger.svelte +3 -0
  47. package/dist/components/cookbook/CookbookApp.svelte +2 -1
  48. package/dist/components/cookbook/CookbookApp.svelte.d.ts.map +1 -1
  49. package/dist/components/cookbook/CookbookSectionPage.svelte +4 -1
  50. package/dist/components/cookbook/brand-theme.d.ts.map +1 -1
  51. package/dist/components/cookbook/brand-theme.js +21 -2
  52. package/dist/components/cookbook/build.js +1 -1
  53. package/dist/components/cookbook/theme.d.ts.map +1 -1
  54. package/dist/components/cookbook/theme.js +9 -5
  55. package/dist/components/cookbook/types.d.ts +5 -1
  56. package/dist/components/cookbook/types.d.ts.map +1 -1
  57. package/dist/components/forms/AddressInput.svelte +25 -22
  58. package/dist/components/forms/CheckboxInput.svelte +8 -5
  59. package/dist/components/forms/DateRangeInput.svelte +41 -38
  60. package/dist/components/forms/DateTimeInput.svelte +29 -26
  61. package/dist/components/forms/FileUpload.svelte +24 -21
  62. package/dist/components/forms/Form.svelte +34 -31
  63. package/dist/components/forms/FormMicButton.svelte +10 -7
  64. package/dist/components/forms/FormScope.svelte +4 -1
  65. package/dist/components/forms/MeasurementInput.svelte +26 -23
  66. package/dist/components/forms/MoneyInput.svelte +18 -15
  67. package/dist/components/forms/NumberInput.svelte +17 -14
  68. package/dist/components/forms/PhoneInput.svelte +37 -34
  69. package/dist/components/forms/SearchInput.svelte +16 -13
  70. package/dist/components/forms/SelectInput.svelte +17 -14
  71. package/dist/components/forms/TextInput.svelte +19 -16
  72. package/dist/components/forms/TextareaInput.svelte +21 -18
  73. package/dist/components/import-export/ImportExport.svelte +4 -1
  74. package/dist/components/module/ModulePanel.svelte +14 -11
  75. package/dist/components/notifications/NotificationBell.svelte +4 -1
  76. package/dist/components/overview/OverviewAssistantUndo.svelte +4 -1
  77. package/dist/components/overview/OverviewGrid.svelte +11 -6
  78. package/dist/components/overview/OverviewGrid.svelte.d.ts.map +1 -1
  79. package/dist/components/overview/WidgetOptionsForm.svelte +3 -0
  80. package/dist/components/overview/widgets/ChartWidget.svelte +7 -4
  81. package/dist/components/overview/widgets/MetricWidget.svelte +5 -2
  82. package/dist/components/overview/widgets/NoteWidget.svelte +5 -2
  83. package/dist/components/overview/widgets/RecordListWidget.svelte +6 -3
  84. package/dist/components/overview/widgets/ShortcutsWidget.svelte +12 -6
  85. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts.map +1 -1
  86. package/dist/components/screens/DetailScreen.svelte +6 -3
  87. package/dist/components/screens/EditForm.svelte +6 -3
  88. package/dist/components/screens/ListScreen.svelte +4 -1
  89. package/dist/components/screens/RecipeScreens.svelte +1 -1
  90. package/dist/components/settings/SettingsCatalog.svelte +4 -1
  91. package/dist/components/sortable/Sortable.svelte +11 -5
  92. package/dist/components/sortable/Sortable.svelte.d.ts.map +1 -1
  93. package/dist/components/workspace/Breadcrumbs.svelte +4 -1
  94. package/dist/components/workspace/NavTree.svelte +4 -1
  95. package/dist/components/workspace/RoleShell.svelte +4 -1
  96. package/dist/components/workspace/WorkspaceShell.svelte +43 -40
  97. package/dist/components/workspace/admin-shell/ActivityItem.svelte +4 -1
  98. package/dist/components/workspace/admin-shell/ActivityList.svelte +5 -2
  99. package/dist/components/workspace/admin-shell/ActivityTicker.svelte +6 -3
  100. package/dist/components/workspace/admin-shell/ActivityToasts.svelte +9 -4
  101. package/dist/components/workspace/admin-shell/AdminShell.svelte +642 -126
  102. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +7 -1
  103. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  104. package/dist/components/workspace/admin-shell/AppScopePanel.svelte +4 -1
  105. package/dist/components/workspace/admin-shell/HotkeyInput.svelte +4 -1
  106. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte +58 -14
  107. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts +9 -2
  108. package/dist/components/workspace/admin-shell/PhoneBottomBar.svelte.d.ts.map +1 -1
  109. package/dist/components/workspace/admin-shell/PhoneTopBar.svelte +15 -6
  110. package/dist/components/workspace/admin-shell/ShellBrand.svelte +3 -0
  111. package/dist/components/workspace/admin-shell/ShellCorner.svelte +4 -1
  112. package/dist/components/workspace/admin-shell/ShellIconButton.svelte +11 -7
  113. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte +6 -3
  114. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte +19 -13
  115. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts +1 -1
  116. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts.map +1 -1
  117. package/dist/components/workspace/admin-shell/ShellNavToggle.svelte +8 -5
  118. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte +4 -1
  119. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte +24 -17
  120. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts.map +1 -1
  121. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte +236 -48
  122. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts +11 -1
  123. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts.map +1 -1
  124. package/dist/components/workspace/admin-shell/ShellTitle.svelte +4 -1
  125. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte +4 -1
  126. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte +4 -1
  127. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte +5 -2
  128. package/dist/components/workspace/admin-shell/TenantNav.svelte +112 -43
  129. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +4 -3
  130. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  131. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte +322 -55
  132. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts +15 -2
  133. package/dist/components/workspace/admin-shell/WorkspaceAccountMenu.svelte.d.ts.map +1 -1
  134. package/dist/components/workspace/admin-shell/motion.d.ts +19 -0
  135. package/dist/components/workspace/admin-shell/motion.d.ts.map +1 -0
  136. package/dist/components/workspace/admin-shell/motion.js +44 -0
  137. package/dist/components/workspace/admin-shell/settings.d.ts +1 -0
  138. package/dist/components/workspace/admin-shell/settings.d.ts.map +1 -1
  139. package/dist/components/workspace/admin-shell/settings.js +1 -1
  140. package/dist/components/workspace/admin-shell/shell-icons.d.ts +8 -0
  141. package/dist/components/workspace/admin-shell/shell-icons.d.ts.map +1 -1
  142. package/dist/components/workspace/admin-shell/shell-icons.js +8 -0
  143. package/dist/components/workspace/admin-shell/state.svelte.d.ts +6 -0
  144. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -1
  145. package/dist/components/workspace/admin-shell/state.svelte.js +15 -0
  146. package/dist/components/workspace/admin-shell/types.d.ts +13 -3
  147. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -1
  148. package/dist/components/workspace/tools-dock/ToolsDock.svelte +41 -38
  149. package/dist/i18n/strings.workspace.d.ts +37 -0
  150. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  151. package/dist/i18n/strings.workspace.js +42 -2
  152. package/dist/mcp-apps/McpAppsBridge.svelte +4 -1
  153. package/package.json +14 -14
@@ -450,7 +450,7 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
450
450
  class="smrt-daterange"
451
451
  class:listening={isRecording}
452
452
  class:parsing={isParsing}
453
- data-smrt-field-owner={fieldOwnerToken}
453
+ data-smrt-field-owner={fieldOwnerToken} data-smrt-component="DateRangeInput"
454
454
  >
455
455
  {#if label}
456
456
  <FieldLabel for={primaryControlId} {label} {required} />
@@ -567,10 +567,12 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
567
567
  </div>
568
568
 
569
569
  <style>
570
+ @layer smrt.reset, smrt.structure, smrt.theme;
571
+ @layer smrt.theme {
570
572
  .smrt-daterange {
571
573
  display: flex;
572
574
  flex-direction: column;
573
- gap: var(--smrt-spacing-2, 8px);
575
+ gap: var(--smrt-spacing-2);
574
576
  }
575
577
 
576
578
  .range-wrapper {
@@ -579,88 +581,88 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
579
581
  }
580
582
 
581
583
  .range-wrapper.smrt-mode {
582
- border: 1px solid var(--smrt-color-tertiary, #6b5778);
583
- border-radius: var(--smrt-radius-small, 6px);
584
- background: var(--smrt-color-tertiary-container, #f3e5f5);
584
+ border: 1px solid var(--smrt-color-tertiary);
585
+ border-radius: var(--smrt-radius-small);
586
+ background: var(--smrt-color-tertiary-container);
585
587
  }
586
588
 
587
589
  .range-wrapper.invalid {
588
- border-color: var(--smrt-color-error, #ba1a1a);
590
+ border-color: var(--smrt-color-error);
589
591
  }
590
592
 
591
593
  .voice-input-wrapper {
592
594
  display: flex;
593
595
  align-items: center;
594
- padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
595
- gap: var(--smrt-spacing-2, 8px);
596
+ padding: var(--smrt-spacing-2) var(--smrt-spacing-3);
597
+ gap: var(--smrt-spacing-2);
596
598
  }
597
599
 
598
600
  .voice-display {
599
601
  flex: 1;
600
602
  display: flex;
601
603
  align-items: center;
602
- gap: var(--smrt-spacing-2, 8px);
604
+ gap: var(--smrt-spacing-2);
603
605
  font-size: var(--smrt-typography-body-large-size, 1rem);
604
606
  }
605
607
 
606
608
  .date-value {
607
- color: var(--smrt-color-on-surface, #374151);
609
+ color: var(--smrt-color-on-surface);
608
610
  }
609
611
 
610
612
  .range-separator {
611
- color: var(--smrt-color-on-surface-variant, #9ca3af);
613
+ color: var(--smrt-color-on-surface-variant);
612
614
  font-weight: var(--smrt-typography-weight-medium, 500);
613
615
  }
614
616
 
615
617
  .placeholder {
616
- color: var(--smrt-color-on-surface-variant, #9ca3af);
618
+ color: var(--smrt-color-on-surface-variant);
617
619
  font-style: italic;
618
620
  }
619
621
 
620
622
  .date-inputs {
621
623
  display: flex;
622
624
  align-items: flex-end;
623
- gap: var(--smrt-spacing-3, 12px);
625
+ gap: var(--smrt-spacing-3);
624
626
  }
625
627
 
626
628
  .date-field {
627
629
  flex: 1;
628
630
  display: flex;
629
631
  flex-direction: column;
630
- gap: var(--smrt-spacing-1, 4px);
632
+ gap: var(--smrt-spacing-1);
631
633
  }
632
634
 
633
635
  .field-label {
634
636
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
635
637
  font-weight: var(--smrt-typography-body-small-weight, 500);
636
- color: var(--smrt-color-on-surface-variant, #6b7280);
638
+ color: var(--smrt-color-on-surface-variant);
637
639
  text-transform: uppercase;
638
640
  letter-spacing: 0.025em;
639
641
  }
640
642
 
641
643
  .range-arrow {
642
- color: var(--smrt-color-on-surface-variant, #9ca3af);
644
+ color: var(--smrt-color-on-surface-variant);
643
645
  font-size: var(--smrt-typography-title-medium-size, 1.25rem);
644
- padding-bottom: var(--smrt-spacing-2, 8px);
646
+ padding-bottom: var(--smrt-spacing-2);
645
647
  }
646
648
 
647
649
  .smrt-input {
648
- padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
650
+ padding: var(--smrt-spacing-2) var(--smrt-spacing-3);
649
651
  font-size: var(--smrt-typography-body-large-size, 1rem);
650
- border: 1px solid var(--smrt-color-outline-variant, #d1d5db);
651
- border-radius: var(--smrt-radius-small, 6px);
652
- background: var(--smrt-color-surface, #fff);
652
+ border: 1px solid var(--smrt-color-outline-variant);
653
+ border-radius: var(--smrt-radius-small);
654
+ background: var(--smrt-color-surface);
653
655
  transition: all var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
654
656
  }
655
657
 
656
658
  .smrt-input:focus {
657
659
  outline: none;
658
- border-color: var(--smrt-color-primary, #005ac1);
659
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-primary, #005ac1) 10%, transparent);
660
+ border-color: var(--smrt-color-primary);
661
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-primary) 10%, transparent);
660
662
  }
661
663
 
662
664
  .smrt-input:disabled {
663
- background: var(--smrt-color-surface-container-high, #f3f4f6);
665
+ background: var(--smrt-color-surface-container-high);
664
666
  cursor: not-allowed;
665
667
  }
666
668
 
@@ -672,7 +674,7 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
672
674
  justify-content: center;
673
675
  background: transparent;
674
676
  border: none;
675
- border-radius: var(--smrt-radius-sm, 4px);
677
+ border-radius: var(--smrt-radius-sm);
676
678
  color: var(--smrt-color-on-surface-variant);
677
679
  cursor: pointer;
678
680
  transition: all var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
@@ -680,12 +682,12 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
680
682
  }
681
683
 
682
684
  .mic-btn:hover {
683
- background: var(--smrt-color-surface-container-high, #f3f4f6);
684
- color: var(--smrt-color-on-surface, #374151);
685
+ background: var(--smrt-color-surface-container-high);
686
+ color: var(--smrt-color-on-surface);
685
687
  }
686
688
 
687
689
  .mic-btn.active {
688
- background: var(--smrt-color-primary, #22c55e);
690
+ background: var(--smrt-color-primary);
689
691
  color: var(--smrt-color-on-primary, white);
690
692
  }
691
693
 
@@ -711,48 +713,49 @@ const primaryControlId = $derived(isSmrt ? `${name}_voice` : `${name}_start`);
711
713
  }
712
714
 
713
715
  .smrt-daterange.listening .range-wrapper.smrt-mode {
714
- border-color: var(--smrt-color-success, #22c55e);
715
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success, #22c55e) 30%, transparent);
716
+ border-color: var(--smrt-color-success);
717
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success) 30%, transparent);
716
718
  animation: pulse-green 1.5s var(--smrt-easing-standard, ease-in-out) infinite;
717
719
  }
718
720
 
719
721
  .smrt-daterange.parsing .range-wrapper.smrt-mode {
720
- border-color: var(--smrt-color-warning, #f59e0b);
721
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-warning, #f59e0b) 20%, transparent);
722
+ border-color: var(--smrt-color-warning);
723
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-warning) 20%, transparent);
722
724
  }
723
725
 
724
726
  @keyframes pulse-green {
725
727
  0%, 100% {
726
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success, #22c55e) 30%, transparent);
728
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success) 30%, transparent);
727
729
  }
728
730
  50% {
729
- box-shadow: 0 0 0 6px color-mix(in srgb, var(--smrt-color-success, #22c55e) 15%, transparent);
731
+ box-shadow: 0 0 0 6px color-mix(in srgb, var(--smrt-color-success) 15%, transparent);
730
732
  }
731
733
  }
732
734
 
733
735
  .listening-indicator {
734
736
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
735
- color: var(--smrt-color-primary, #22c55e);
737
+ color: var(--smrt-color-primary);
736
738
  }
737
739
 
738
740
  .parsing-indicator {
739
741
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
740
- color: var(--smrt-color-secondary, #f59e0b);
742
+ color: var(--smrt-color-secondary);
741
743
  }
742
744
 
743
745
  .error-indicator {
744
746
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
745
- color: var(--smrt-color-error, #ba1a1a);
747
+ color: var(--smrt-color-error);
746
748
  }
747
749
 
748
750
  @media (max-width: 600px) {
749
751
  .date-inputs {
750
752
  flex-direction: column;
751
- gap: var(--smrt-spacing-2, 8px);
753
+ gap: var(--smrt-spacing-2);
752
754
  }
753
755
 
754
756
  .range-arrow {
755
757
  display: none;
756
758
  }
757
759
  }
760
+ }
758
761
  </style>
@@ -349,7 +349,7 @@ function handleNativeChange(e: Event) {
349
349
  }
350
350
  </script>
351
351
 
352
- <div class="smrt-datetime" class:listening={isHolding} class:parsing={isParsing}>
352
+ <div class="smrt-datetime" class:listening={isHolding} class:parsing={isParsing} data-smrt-component="DateTimeInput">
353
353
  {#if label}
354
354
  <FieldLabel id={labelId} for={name} {label} {required} />
355
355
  {/if}
@@ -450,12 +450,14 @@ function handleNativeChange(e: Event) {
450
450
  </div>
451
451
 
452
452
  <style>
453
+ @layer smrt.reset, smrt.structure, smrt.theme;
454
+ @layer smrt.theme {
453
455
  .smrt-datetime {
454
456
  display: flex;
455
457
  flex-direction: column;
456
458
  width: 100%;
457
459
  min-width: 0;
458
- gap: var(--smrt-spacing-1, 4px);
460
+ gap: var(--smrt-spacing-1);
459
461
  position: relative;
460
462
  }
461
463
 
@@ -469,47 +471,47 @@ function handleNativeChange(e: Event) {
469
471
  box-sizing: border-box;
470
472
  min-width: 0;
471
473
  width: 100%;
472
- padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
474
+ padding: var(--smrt-spacing-2) var(--smrt-spacing-3);
473
475
  font-size: var(--smrt-typography-body-large-size, 1rem);
474
- border: 1px solid var(--smrt-color-outline-variant, #d1d5db);
475
- border-radius: var(--smrt-radius-small, 6px);
476
- background: var(--smrt-color-surface, #fff);
476
+ border: 1px solid var(--smrt-color-outline-variant);
477
+ border-radius: var(--smrt-radius-small);
478
+ background: var(--smrt-color-surface);
477
479
  transition: all var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
478
480
  }
479
481
 
480
482
  .smrt-input:focus {
481
483
  outline: none;
482
- border-color: var(--smrt-color-primary, #005ac1);
483
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-primary, #005ac1) 10%, transparent);
484
+ border-color: var(--smrt-color-primary);
485
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-primary) 10%, transparent);
484
486
  }
485
487
 
486
488
  .smrt-input.smrt-mode {
487
- padding-right: var(--smrt-spacing-11, 44px);
489
+ padding-right: var(--smrt-spacing-11);
488
490
  cursor: pointer;
489
491
  }
490
492
 
491
493
  .smrt-input:disabled {
492
- background: var(--smrt-color-surface-container-high, #f3f4f6);
494
+ background: var(--smrt-color-surface-container-high);
493
495
  cursor: not-allowed;
494
496
  }
495
497
 
496
498
  .smrt-datetime.listening .smrt-input {
497
- border-color: var(--smrt-color-success, #22c55e);
498
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success, #22c55e) 30%, transparent);
499
+ border-color: var(--smrt-color-success);
500
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success) 30%, transparent);
499
501
  animation: pulse-green 1.5s var(--smrt-easing-standard, ease-in-out) infinite;
500
502
  }
501
503
 
502
504
  .smrt-datetime.parsing .smrt-input {
503
- border-color: var(--smrt-color-warning, #f59e0b);
504
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-warning, #f59e0b) 20%, transparent);
505
+ border-color: var(--smrt-color-warning);
506
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-warning) 20%, transparent);
505
507
  }
506
508
 
507
509
  @keyframes pulse-green {
508
510
  0%, 100% {
509
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success, #22c55e) 30%, transparent);
511
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--smrt-color-success) 30%, transparent);
510
512
  }
511
513
  50% {
512
- box-shadow: 0 0 0 6px color-mix(in srgb, var(--smrt-color-success, #22c55e) 15%, transparent);
514
+ box-shadow: 0 0 0 6px color-mix(in srgb, var(--smrt-color-success) 15%, transparent);
513
515
  }
514
516
  }
515
517
 
@@ -525,19 +527,19 @@ function handleNativeChange(e: Event) {
525
527
  justify-content: center;
526
528
  background: transparent;
527
529
  border: none;
528
- border-radius: var(--smrt-radius-sm, 4px);
529
- color: var(--smrt-color-on-surface-variant, #6b7280);
530
+ border-radius: var(--smrt-radius-sm);
531
+ color: var(--smrt-color-on-surface-variant);
530
532
  cursor: pointer;
531
533
  transition: all var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
532
534
  }
533
535
 
534
536
  .mic-btn:hover {
535
537
  background: var(--smrt-color-surface-container);
536
- color: var(--smrt-color-on-surface, #374151);
538
+ color: var(--smrt-color-on-surface);
537
539
  }
538
540
 
539
541
  .mic-btn.active {
540
- background: var(--smrt-color-primary, #22c55e);
542
+ background: var(--smrt-color-primary);
541
543
  color: var(--smrt-color-on-primary, white);
542
544
  }
543
545
 
@@ -564,19 +566,20 @@ function handleNativeChange(e: Event) {
564
566
 
565
567
  .listening-indicator {
566
568
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
567
- color: var(--smrt-color-primary, #22c55e);
568
- margin-top: var(--smrt-spacing-1, 4px);
569
+ color: var(--smrt-color-primary);
570
+ margin-top: var(--smrt-spacing-1);
569
571
  }
570
572
 
571
573
  .parsing-indicator {
572
574
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
573
- color: var(--smrt-color-secondary, #f59e0b);
574
- margin-top: var(--smrt-spacing-1, 4px);
575
+ color: var(--smrt-color-secondary);
576
+ margin-top: var(--smrt-spacing-1);
575
577
  }
576
578
 
577
579
  .error-indicator {
578
580
  font-size: var(--smrt-typography-body-small-size, 0.75rem);
579
- color: var(--smrt-color-error, #ba1a1a);
580
- margin-top: var(--smrt-spacing-1, 4px);
581
+ color: var(--smrt-color-error);
582
+ margin-top: var(--smrt-spacing-1);
581
583
  }
584
+ }
582
585
  </style>
@@ -249,7 +249,7 @@ function formatFileSize(bytes: number): string {
249
249
  }
250
250
  </script>
251
251
 
252
- <div class="file-upload" class:disabled>
252
+ <div class="file-upload" class:disabled data-smrt-component="FileUpload">
253
253
  <div
254
254
  class="drop-zone"
255
255
  class:dragging={isDragging}
@@ -323,6 +323,8 @@ function formatFileSize(bytes: number): string {
323
323
  </div>
324
324
 
325
325
  <style>
326
+ @layer smrt.reset, smrt.structure, smrt.theme;
327
+ @layer smrt.theme {
326
328
  .file-upload {
327
329
  position: relative;
328
330
  display: flex;
@@ -356,52 +358,52 @@ function formatFileSize(bytes: number): string {
356
358
  justify-content: center;
357
359
  gap: var(--smrt-spacing-2, 0.5rem);
358
360
  padding: var(--smrt-spacing-8, 2rem) var(--smrt-spacing-6, 1.5rem);
359
- border: 2px dashed var(--smrt-color-outline, #79747e);
361
+ border: 2px dashed var(--smrt-color-outline);
360
362
  border-radius: var(--smrt-radius-lg, 1rem);
361
- background: var(--smrt-color-surface-container-low, #f7f2fa);
363
+ background: var(--smrt-color-surface-container-low);
362
364
  cursor: pointer;
363
365
  transition: all 200ms;
364
366
  text-align: center;
365
367
  }
366
368
 
367
369
  .drop-zone:hover {
368
- border-color: var(--smrt-color-primary, #6750a4);
369
- background: var(--smrt-color-surface-container, #f3edf7);
370
+ border-color: var(--smrt-color-primary);
371
+ background: var(--smrt-color-surface-container);
370
372
  }
371
373
 
372
374
  .drop-zone:focus-visible {
373
- outline: 2px solid var(--smrt-color-primary, #6750a4);
375
+ outline: 2px solid var(--smrt-color-primary);
374
376
  outline-offset: 2px;
375
377
  }
376
378
 
377
379
  .drop-zone.dragging {
378
- border-color: var(--smrt-color-primary, #6750a4);
379
- background: var(--smrt-color-primary-container, #eaddff);
380
+ border-color: var(--smrt-color-primary);
381
+ background: var(--smrt-color-primary-container);
380
382
  border-style: solid;
381
383
  }
382
384
 
383
385
  .drop-zone__icon {
384
- color: var(--smrt-color-on-surface-variant, #49454f);
386
+ color: var(--smrt-color-on-surface-variant);
385
387
  }
386
388
 
387
389
  .drop-zone__label {
388
390
  margin: 0;
389
391
  font: var(--smrt-typography-body-large-font);
390
- color: var(--smrt-color-on-surface, #1d1b20);
392
+ color: var(--smrt-color-on-surface);
391
393
  }
392
394
 
393
395
  .drop-zone__hint {
394
396
  margin: 0;
395
397
  font: var(--smrt-typography-body-small-font);
396
398
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
397
- color: var(--smrt-color-on-surface-variant, #49454f);
399
+ color: var(--smrt-color-on-surface-variant);
398
400
  }
399
401
 
400
402
  .file-upload__error {
401
403
  margin: 0;
402
404
  padding: var(--smrt-spacing-2, 0.5rem) var(--smrt-spacing-3, 0.75rem);
403
- background: var(--smrt-color-error-container, #f9dedc);
404
- color: var(--smrt-color-on-error-container, #410e0b);
405
+ background: var(--smrt-color-error-container);
406
+ color: var(--smrt-color-on-error-container);
405
407
  border-radius: var(--smrt-radius-sm, 0.25rem);
406
408
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
407
409
  }
@@ -410,7 +412,7 @@ function formatFileSize(bytes: number): string {
410
412
  list-style: none;
411
413
  margin: 0;
412
414
  padding: 0;
413
- border: 1px solid var(--smrt-color-outline-variant, #cac4d0);
415
+ border: 1px solid var(--smrt-color-outline-variant);
414
416
  border-radius: var(--smrt-radius-md, 0.5rem);
415
417
  overflow: hidden;
416
418
  }
@@ -420,7 +422,7 @@ function formatFileSize(bytes: number): string {
420
422
  align-items: center;
421
423
  gap: var(--smrt-spacing-3, 0.75rem);
422
424
  padding: var(--smrt-spacing-2, 0.5rem) var(--smrt-spacing-3, 0.75rem);
423
- border-bottom: 1px solid var(--smrt-color-outline-variant, #cac4d0);
425
+ border-bottom: 1px solid var(--smrt-color-outline-variant);
424
426
  }
425
427
 
426
428
  .file-list__item:last-child {
@@ -430,7 +432,7 @@ function formatFileSize(bytes: number): string {
430
432
  .file-list__name {
431
433
  flex: 1;
432
434
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
433
- color: var(--smrt-color-on-surface, #1d1b20);
435
+ color: var(--smrt-color-on-surface);
434
436
  overflow: hidden;
435
437
  text-overflow: ellipsis;
436
438
  white-space: nowrap;
@@ -438,7 +440,7 @@ function formatFileSize(bytes: number): string {
438
440
 
439
441
  .file-list__size {
440
442
  font-size: var(--smrt-typography-label-medium-size, 0.75rem);
441
- color: var(--smrt-color-on-surface-variant, #49454f);
443
+ color: var(--smrt-color-on-surface-variant);
442
444
  white-space: nowrap;
443
445
  }
444
446
 
@@ -450,15 +452,16 @@ function formatFileSize(bytes: number): string {
450
452
  height: 28px;
451
453
  padding: 0;
452
454
  border: none;
453
- border-radius: var(--smrt-radius-full, 9999px);
455
+ border-radius: var(--smrt-radius-full);
454
456
  background: transparent;
455
- color: var(--smrt-color-on-surface-variant, #49454f);
457
+ color: var(--smrt-color-on-surface-variant);
456
458
  cursor: pointer;
457
459
  transition: background-color 200ms;
458
460
  }
459
461
 
460
462
  .file-list__remove:hover {
461
- background: var(--smrt-color-error-container, #f9dedc);
462
- color: var(--smrt-color-error, #ba1a1a);
463
+ background: var(--smrt-color-error-container);
464
+ color: var(--smrt-color-error);
463
465
  }
466
+ }
464
467
  </style>
@@ -1529,7 +1529,7 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1529
1529
  onsubmit={handleSubmit}
1530
1530
  {method}
1531
1531
  {action}
1532
- use:applyEnhance={enhance}
1532
+ use:applyEnhance={enhance} data-smrt-component="Form"
1533
1533
  >
1534
1534
  <!--
1535
1535
  Screen-reader status region (L1 #1420): announces async STT / field-
@@ -1642,16 +1642,18 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1642
1642
  </form>
1643
1643
 
1644
1644
  {#if isFormListening && spokenText}
1645
- <div class="spoken-toaster">
1645
+ <div class="spoken-toaster" data-smrt-component="Form">
1646
1646
  <strong>{t(M['ui.form.you_said'])}</strong> {spokenText}
1647
1647
  </div>
1648
1648
  {/if}
1649
1649
 
1650
1650
  <style>
1651
+ @layer smrt.reset, smrt.structure, smrt.theme;
1652
+ @layer smrt.theme {
1651
1653
  .smrt-form {
1652
1654
  display: flex;
1653
1655
  flex-direction: column;
1654
- gap: var(--smrt-spacing-4, 16px);
1656
+ gap: var(--smrt-spacing-4);
1655
1657
  }
1656
1658
 
1657
1659
  /* Visually-hidden live region (L1 #1420) — announced to screen readers only. */
@@ -1670,23 +1672,23 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1670
1672
  .form-controls {
1671
1673
  display: flex;
1672
1674
  align-items: center;
1673
- gap: var(--smrt-spacing-4, 16px);
1675
+ gap: var(--smrt-spacing-4);
1674
1676
  flex-wrap: wrap;
1675
1677
  }
1676
1678
 
1677
1679
  .mode-toggle {
1678
1680
  display: flex;
1679
- background: var(--smrt-color-surface-container-high, #f3f4f6);
1680
- padding: var(--smrt-spacing-1, 4px);
1681
- border-radius: var(--smrt-radius-md, 8px);
1681
+ background: var(--smrt-color-surface-container-high);
1682
+ padding: var(--smrt-spacing-1);
1683
+ border-radius: var(--smrt-radius-md);
1682
1684
  }
1683
1685
 
1684
1686
  .mode-btn {
1685
- padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-4, 16px);
1687
+ padding: var(--smrt-spacing-2) var(--smrt-spacing-4);
1686
1688
  border: none;
1687
1689
  background: transparent;
1688
- color: var(--smrt-color-on-surface-variant, #6b7280);
1689
- border-radius: var(--smrt-radius-md, 8px);
1690
+ color: var(--smrt-color-on-surface-variant);
1691
+ border-radius: var(--smrt-radius-md);
1690
1692
  cursor: pointer;
1691
1693
  font-size: var(--smrt-typography-label-large-size, 0.875rem);
1692
1694
  font-weight: var(--smrt-typography-weight-medium, 500);
@@ -1694,24 +1696,24 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1694
1696
  }
1695
1697
 
1696
1698
  .mode-btn:hover {
1697
- color: var(--smrt-color-on-surface, #374151);
1699
+ color: var(--smrt-color-on-surface);
1698
1700
  }
1699
1701
 
1700
1702
  .mode-btn.active {
1701
- background: var(--smrt-color-surface, #fff);
1702
- color: var(--smrt-color-primary, #3b82f6);
1703
+ background: var(--smrt-color-surface);
1704
+ color: var(--smrt-color-primary);
1703
1705
  box-shadow: var(--smrt-elevation-1, 0 1px 3px color-mix(in srgb, var(--smrt-color-shadow) 10%, transparent));
1704
1706
  }
1705
1707
 
1706
1708
  .form-listen-btn {
1707
1709
  display: flex;
1708
1710
  align-items: center;
1709
- gap: var(--smrt-spacing-2, 8px);
1710
- padding: var(--smrt-spacing-3, 12px) var(--smrt-spacing-5, 20px);
1711
- border: 2px solid var(--smrt-color-primary, #3b82f6);
1711
+ gap: var(--smrt-spacing-2);
1712
+ padding: var(--smrt-spacing-3) var(--smrt-spacing-5);
1713
+ border: 2px solid var(--smrt-color-primary);
1712
1714
  background: var(--smrt-color-surface);
1713
1715
  color: var(--smrt-color-primary);
1714
- border-radius: var(--smrt-radius-md, 8px);
1716
+ border-radius: var(--smrt-radius-md);
1715
1717
  cursor: pointer;
1716
1718
  font-size: var(--smrt-typography-label-large-size, 0.875rem);
1717
1719
  font-weight: var(--smrt-typography-weight-medium, 500);
@@ -1719,20 +1721,20 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1719
1721
  }
1720
1722
 
1721
1723
  .form-listen-btn:hover {
1722
- background: var(--smrt-color-primary-container, #eff6ff);
1724
+ background: var(--smrt-color-primary-container);
1723
1725
  }
1724
1726
 
1725
1727
  .form-listen-btn.listening {
1726
- background: var(--smrt-color-primary, #22c55e);
1727
- border-color: var(--smrt-color-primary, #22c55e);
1728
- color: var(--smrt-color-on-primary, #fff);
1728
+ background: var(--smrt-color-primary);
1729
+ border-color: var(--smrt-color-primary);
1730
+ color: var(--smrt-color-on-primary);
1729
1731
  animation: pulse-btn 1.5s var(--smrt-easing-standard, ease-in-out) infinite;
1730
1732
  }
1731
1733
 
1732
1734
  .form-listen-btn.extracting {
1733
- background: var(--smrt-color-secondary, #f59e0b);
1734
- border-color: var(--smrt-color-secondary, #f59e0b);
1735
- color: var(--smrt-color-on-secondary, #fff);
1735
+ background: var(--smrt-color-secondary);
1736
+ border-color: var(--smrt-color-secondary);
1737
+ color: var(--smrt-color-on-secondary);
1736
1738
  }
1737
1739
 
1738
1740
  .form-listen-btn:disabled {
@@ -1769,12 +1771,12 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1769
1771
  bottom: 0;
1770
1772
  left: 0;
1771
1773
  right: 0;
1772
- padding: var(--smrt-spacing-3, 12px) var(--smrt-spacing-6, 24px);
1774
+ padding: var(--smrt-spacing-3) var(--smrt-spacing-6);
1773
1775
  /* 90%-opacity primary. The old `--smrt-color-primary-rgb` channel token
1774
1776
  was never emitted (issue #1431); color-mix derives the alpha from the
1775
1777
  emitted `--smrt-color-primary` token instead. */
1776
- background: color-mix(in srgb, var(--smrt-color-primary, #166534) 90%, transparent);
1777
- color: var(--smrt-color-on-primary, #fff);
1778
+ background: color-mix(in srgb, var(--smrt-color-primary) 90%, transparent);
1779
+ color: var(--smrt-color-on-primary);
1778
1780
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
1779
1781
  box-shadow: 0 -2px 12px color-mix(in srgb, var(--smrt-color-shadow) 15%, transparent);
1780
1782
  z-index: var(--smrt-z-index-toast, 1500);
@@ -1784,7 +1786,7 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1784
1786
  }
1785
1787
 
1786
1788
  .spoken-toaster strong {
1787
- color: var(--smrt-color-on-primary-container, #bbf7d0);
1789
+ color: var(--smrt-color-on-primary-container);
1788
1790
  }
1789
1791
 
1790
1792
  @keyframes slideUp {
@@ -1799,10 +1801,10 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1799
1801
  }
1800
1802
 
1801
1803
  .extract-error {
1802
- padding: var(--smrt-spacing-3, 12px) var(--smrt-spacing-4, 16px);
1804
+ padding: var(--smrt-spacing-3) var(--smrt-spacing-4);
1803
1805
  background: var(--smrt-color-error-container);
1804
1806
  border: 1px solid var(--smrt-color-error);
1805
- border-radius: var(--smrt-radius-md, 8px);
1807
+ border-radius: var(--smrt-radius-md);
1806
1808
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
1807
1809
  color: var(--smrt-color-error);
1808
1810
  }
@@ -1810,6 +1812,7 @@ export function getInteractionRegistry(): ControlInteractionRegistry {
1810
1812
  .form-fields {
1811
1813
  display: flex;
1812
1814
  flex-direction: column;
1813
- gap: var(--smrt-spacing-4, 16px);
1815
+ gap: var(--smrt-spacing-4);
1814
1816
  }
1817
+ }
1815
1818
  </style>