@speechos/client 0.2.9 → 0.2.11

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.
@@ -26912,7 +26912,6 @@
26912
26912
  host: DEFAULT_HOST,
26913
26913
  debug: false,
26914
26914
  webSocketFactory: void 0,
26915
- fetchHandler: void 0,
26916
26915
  settingsToken: void 0
26917
26916
  };
26918
26917
  /**
@@ -26921,14 +26920,13 @@
26921
26920
  * @returns Validated and merged configuration
26922
26921
  */
26923
26922
  function validateConfig(userConfig) {
26924
- if (!userConfig.apiKey) throw new Error("SpeechOS requires an apiKey. Get one from your team dashboard at /a/<team-slug>/.");
26923
+ if (!userConfig.apiKey) throw new Error("SpeechOS requires an apiKey. Get one from your team dashboard at /a/.");
26925
26924
  return {
26926
26925
  apiKey: userConfig.apiKey,
26927
26926
  userId: userConfig.userId ?? defaultConfig.userId,
26928
26927
  host: userConfig.host ?? defaultConfig.host,
26929
26928
  debug: userConfig.debug ?? defaultConfig.debug,
26930
26929
  webSocketFactory: userConfig.webSocketFactory ?? defaultConfig.webSocketFactory,
26931
- fetchHandler: userConfig.fetchHandler ?? defaultConfig.fetchHandler,
26932
26930
  settingsToken: userConfig.settingsToken ?? defaultConfig.settingsToken
26933
26931
  };
26934
26932
  }
@@ -26982,13 +26980,6 @@
26982
26980
  };
26983
26981
  }
26984
26982
  /**
26985
- * Get the fetch handler from the current configuration
26986
- * @returns The fetch handler or undefined if not configured
26987
- */
26988
- function getFetchHandler() {
26989
- return currentConfig.fetchHandler;
26990
- }
26991
- /**
26992
26983
  * LocalStorage key for anonymous ID persistence
26993
26984
  */
26994
26985
  const ANONYMOUS_ID_KEY = "speechos_anonymous_id";
@@ -28805,6 +28796,7 @@
28805
28796
  commands: [],
28806
28797
  zIndex: 999999,
28807
28798
  alwaysVisible: false,
28799
+ useExternalSettings: false,
28808
28800
  };
28809
28801
  /**
28810
28802
  * Current client configuration singleton
@@ -28820,6 +28812,7 @@
28820
28812
  commands: config.commands ?? defaultClientConfig.commands,
28821
28813
  zIndex: config.zIndex ?? defaultClientConfig.zIndex,
28822
28814
  alwaysVisible: config.alwaysVisible ?? defaultClientConfig.alwaysVisible,
28815
+ useExternalSettings: config.useExternalSettings ?? defaultClientConfig.useExternalSettings,
28823
28816
  };
28824
28817
  // Validate zIndex
28825
28818
  if (typeof resolved.zIndex !== "number" || resolved.zIndex < 0) {
@@ -28871,6 +28864,12 @@
28871
28864
  function isAlwaysVisible() {
28872
28865
  return currentClientConfig.alwaysVisible;
28873
28866
  }
28867
+ /**
28868
+ * Check if external settings page should be used
28869
+ */
28870
+ function useExternalSettings() {
28871
+ return currentClientConfig.useExternalSettings;
28872
+ }
28874
28873
 
28875
28874
  /**
28876
28875
  * Form field focus detection for SpeechOS Client SDK
@@ -29041,6 +29040,17 @@
29041
29040
  document.addEventListener("touchstart", this.touchHandler, true);
29042
29041
  document.addEventListener("mousedown", this.mouseDownHandler, true);
29043
29042
  this.isActive = true;
29043
+ // Check for already-focused form field (e.g., page loaded with autofocus)
29044
+ const activeElement = document.activeElement;
29045
+ if (isFormField(activeElement)) {
29046
+ console.log("[SpeechOS] FormDetector: found initially focused form field", {
29047
+ element: activeElement,
29048
+ tagName: activeElement?.tagName,
29049
+ });
29050
+ state.setFocusedElement(activeElement);
29051
+ state.show();
29052
+ events.emit("form:focus", { element: activeElement });
29053
+ }
29044
29054
  }
29045
29055
  /**
29046
29056
  * Stop detecting form field focus events
@@ -29285,9 +29295,12 @@
29285
29295
  * Sorted alphabetically by name for dropdown display
29286
29296
  */
29287
29297
  const SUPPORTED_LANGUAGES = [
29298
+ { name: "Belarusian", code: "be", variants: ["be"] },
29299
+ { name: "Bengali", code: "bn", variants: ["bn"] },
29300
+ { name: "Bosnian", code: "bs", variants: ["bs"] },
29288
29301
  { name: "Bulgarian", code: "bg", variants: ["bg"] },
29289
29302
  { name: "Catalan", code: "ca", variants: ["ca"] },
29290
- { name: "Chinese", code: "zh", variants: ["zh"] },
29303
+ { name: "Croatian", code: "hr", variants: ["hr"] },
29291
29304
  { name: "Czech", code: "cs", variants: ["cs"] },
29292
29305
  { name: "Danish", code: "da", variants: ["da", "da-DK"] },
29293
29306
  { name: "Dutch", code: "nl", variants: ["nl"] },
@@ -29308,18 +29321,26 @@
29308
29321
  { name: "Indonesian", code: "id", variants: ["id"] },
29309
29322
  { name: "Italian", code: "it", variants: ["it"] },
29310
29323
  { name: "Japanese", code: "ja", variants: ["ja"] },
29324
+ { name: "Kannada", code: "kn", variants: ["kn"] },
29311
29325
  { name: "Korean", code: "ko", variants: ["ko", "ko-KR"] },
29312
29326
  { name: "Latvian", code: "lv", variants: ["lv"] },
29313
29327
  { name: "Lithuanian", code: "lt", variants: ["lt"] },
29328
+ { name: "Macedonian", code: "mk", variants: ["mk"] },
29314
29329
  { name: "Malay", code: "ms", variants: ["ms"] },
29330
+ { name: "Marathi", code: "mr", variants: ["mr"] },
29315
29331
  { name: "Norwegian", code: "no", variants: ["no"] },
29316
29332
  { name: "Polish", code: "pl", variants: ["pl"] },
29317
29333
  { name: "Portuguese", code: "pt", variants: ["pt", "pt-BR", "pt-PT"] },
29318
29334
  { name: "Romanian", code: "ro", variants: ["ro"] },
29319
29335
  { name: "Russian", code: "ru", variants: ["ru"] },
29336
+ { name: "Serbian", code: "sr", variants: ["sr"] },
29320
29337
  { name: "Slovak", code: "sk", variants: ["sk"] },
29338
+ { name: "Slovenian", code: "sl", variants: ["sl"] },
29321
29339
  { name: "Spanish", code: "es", variants: ["es", "es-419"] },
29322
29340
  { name: "Swedish", code: "sv", variants: ["sv", "sv-SE"] },
29341
+ { name: "Tagalog", code: "tl", variants: ["tl"] },
29342
+ { name: "Tamil", code: "ta", variants: ["ta"] },
29343
+ { name: "Telugu", code: "te", variants: ["te"] },
29323
29344
  { name: "Turkish", code: "tr", variants: ["tr"] },
29324
29345
  { name: "Ukrainian", code: "uk", variants: ["uk"] },
29325
29346
  { name: "Vietnamese", code: "vi", variants: ["vi"] },
@@ -30112,25 +30133,14 @@
30112
30133
  this.syncDisabled = false;
30113
30134
  }
30114
30135
  /**
30115
- * Make a fetch request using custom fetchHandler if configured, otherwise native fetch.
30116
- * This allows the Chrome extension to route fetch traffic through the service worker
30117
- * to bypass page CSP restrictions.
30136
+ * Make a fetch request using native fetch.
30118
30137
  */
30119
30138
  async doFetch(url, options) {
30120
30139
  const config = getConfig();
30121
- const customHandler = getFetchHandler();
30122
- if (customHandler) {
30123
- if (config.debug) {
30124
- console.log("[SpeechOS] Using custom fetch handler (extension proxy)", options.method, url);
30125
- }
30126
- return customHandler(url, options);
30127
- }
30128
30140
  if (config.debug) {
30129
30141
  console.log("[SpeechOS] Using native fetch", options.method, url);
30130
30142
  }
30131
- // Use native fetch and wrap response to match FetchResponse interface
30132
- const response = await fetch(url, options);
30133
- return response;
30143
+ return fetch(url, options);
30134
30144
  }
30135
30145
  /**
30136
30146
  * Initialize the settings sync manager
@@ -30510,9 +30520,9 @@
30510
30520
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
30511
30521
 
30512
30522
  /* Color tokens */
30513
- --speechos-primary: #10B981;
30514
- --speechos-primary-hover: #059669;
30515
- --speechos-primary-active: #047857;
30523
+ --speechos-primary: #0d9488;
30524
+ --speechos-primary-hover: #0f766e;
30525
+ --speechos-primary-active: #115e59;
30516
30526
 
30517
30527
  --speechos-bg: #ffffff;
30518
30528
  --speechos-bg-hover: #f9fafb;
@@ -31077,45 +31087,51 @@
31077
31087
  width: 56px;
31078
31088
  height: 56px;
31079
31089
  border-radius: var(--speechos-radius-full);
31080
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
31090
+ background: #10b981;
31081
31091
  border: none;
31082
31092
  cursor: pointer;
31083
31093
  display: flex;
31084
31094
  align-items: center;
31085
31095
  justify-content: center;
31086
31096
  color: white;
31087
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);
31088
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
31097
+ box-shadow: 0 4px 16px rgba(16, 185, 129, 0.35);
31098
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
31089
31099
  position: relative;
31090
31100
  overflow: hidden;
31091
31101
  }
31092
31102
 
31093
31103
  .mic-button:hover {
31104
+ background: #059669;
31094
31105
  transform: scale(1.05);
31095
- box-shadow: 0 6px 20px rgba(16, 185, 129, 0.5);
31106
+ box-shadow: 0 6px 24px rgba(16, 185, 129, 0.45);
31096
31107
  }
31097
31108
 
31098
31109
  .mic-button:active {
31099
31110
  transform: scale(0.98);
31100
31111
  }
31101
31112
 
31113
+ .mic-button:focus {
31114
+ outline: none;
31115
+ box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.4), 0 4px 16px rgba(16, 185, 129, 0.35);
31116
+ }
31117
+
31102
31118
  /* Expanded state - bubbles visible */
31103
31119
  .mic-button.expanded {
31104
- background: linear-gradient(135deg, #059669 0%, #047857 100%);
31120
+ background: #059669;
31105
31121
  }
31106
31122
 
31107
31123
  /* Connecting state - Siri-style metallic spinner */
31108
31124
  .mic-button.connecting {
31109
31125
  background: radial-gradient(
31110
31126
  circle at 30% 30%,
31111
- #34d399 0%,
31112
- #10b981 40%,
31113
- #059669 70%,
31114
- #047857 100%
31127
+ #2dd4bf 0%,
31128
+ #14b8a6 40%,
31129
+ #0d9488 70%,
31130
+ #0f766e 100%
31115
31131
  );
31116
31132
  cursor: wait;
31117
- box-shadow: 0 0 20px rgba(16, 185, 129, 0.4),
31118
- 0 0 40px rgba(16, 185, 129, 0.2),
31133
+ box-shadow: 0 0 20px rgba(13, 148, 136, 0.4),
31134
+ 0 0 40px rgba(13, 148, 136, 0.2),
31119
31135
  inset 0 0 20px rgba(255, 255, 255, 0.1);
31120
31136
  }
31121
31137
 
@@ -31158,15 +31174,15 @@
31158
31174
  background: conic-gradient(
31159
31175
  from 0deg,
31160
31176
  transparent 0deg,
31161
- rgba(52, 211, 153, 0.1) 30deg,
31162
- rgba(16, 185, 129, 0.8) 90deg,
31177
+ rgba(45, 212, 191, 0.1) 30deg,
31178
+ rgba(13, 148, 136, 0.8) 90deg,
31163
31179
  rgba(255, 255, 255, 0.95) 120deg,
31164
- rgba(52, 211, 153, 0.9) 150deg,
31165
- rgba(16, 185, 129, 0.6) 180deg,
31166
- rgba(5, 150, 105, 0.3) 210deg,
31180
+ rgba(45, 212, 191, 0.9) 150deg,
31181
+ rgba(13, 148, 136, 0.6) 180deg,
31182
+ rgba(15, 118, 110, 0.3) 210deg,
31167
31183
  transparent 270deg,
31168
- rgba(110, 231, 183, 0.2) 300deg,
31169
- rgba(16, 185, 129, 0.5) 330deg,
31184
+ rgba(94, 234, 212, 0.2) 300deg,
31185
+ rgba(13, 148, 136, 0.5) 330deg,
31170
31186
  transparent 360deg
31171
31187
  );
31172
31188
  -webkit-mask: linear-gradient(#fff 0 0) content-box,
@@ -31187,13 +31203,13 @@
31187
31203
  background: conic-gradient(
31188
31204
  from 180deg,
31189
31205
  transparent 0deg,
31190
- rgba(167, 243, 208, 0.3) 60deg,
31206
+ rgba(153, 246, 228, 0.3) 60deg,
31191
31207
  rgba(255, 255, 255, 0.7) 90deg,
31192
- rgba(110, 231, 183, 0.5) 120deg,
31208
+ rgba(94, 234, 212, 0.5) 120deg,
31193
31209
  transparent 180deg,
31194
- rgba(52, 211, 153, 0.2) 240deg,
31210
+ rgba(45, 212, 191, 0.2) 240deg,
31195
31211
  rgba(255, 255, 255, 0.5) 270deg,
31196
- rgba(16, 185, 129, 0.4) 300deg,
31212
+ rgba(13, 148, 136, 0.4) 300deg,
31197
31213
  transparent 360deg
31198
31214
  );
31199
31215
  -webkit-mask: linear-gradient(#fff 0 0) content-box,
@@ -31234,8 +31250,8 @@
31234
31250
  border-radius: 50%;
31235
31251
  background: radial-gradient(
31236
31252
  circle,
31237
- rgba(16, 185, 129, 0.4) 0%,
31238
- rgba(16, 185, 129, 0.15) 40%,
31253
+ rgba(13, 148, 136, 0.4) 0%,
31254
+ rgba(13, 148, 136, 0.15) 40%,
31239
31255
  transparent 70%
31240
31256
  );
31241
31257
  animation: siri-glow-pulse 2s ease-in-out infinite;
@@ -32655,15 +32671,15 @@
32655
32671
  }
32656
32672
 
32657
32673
  .modal {
32658
- background: #1a1d24;
32674
+ background: #f5f5f4;
32659
32675
  border-radius: 16px;
32660
32676
  width: 90%;
32661
32677
  max-width: 580px;
32662
32678
  height: min(560px, 85vh);
32663
32679
  display: flex;
32664
32680
  flex-direction: column;
32665
- box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),
32666
- 0 0 0 1px rgba(255, 255, 255, 0.05);
32681
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.15),
32682
+ 0 0 0 1px rgba(0, 0, 0, 0.05);
32667
32683
  transform: scale(0.95) translateY(10px);
32668
32684
  transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
32669
32685
  pointer-events: auto;
@@ -32688,16 +32704,16 @@
32688
32704
  align-items: center;
32689
32705
  justify-content: space-between;
32690
32706
  padding: 16px 20px;
32691
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
32692
- background: rgba(0, 0, 0, 0.2);
32707
+ border-bottom: 1px solid #e5e5e5;
32708
+ background: #ffffff;
32693
32709
  }
32694
32710
 
32695
32711
  .modal-title {
32696
32712
  font-size: 17px;
32697
32713
  font-weight: 600;
32698
- color: white;
32714
+ color: #171717;
32699
32715
  margin: 0;
32700
- letter-spacing: -0.01em;
32716
+ letter-spacing: -0.02em;
32701
32717
  }
32702
32718
 
32703
32719
  .modal-logo {
@@ -32710,7 +32726,7 @@
32710
32726
  width: 28px;
32711
32727
  height: 28px;
32712
32728
  border-radius: 8px;
32713
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
32729
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
32714
32730
  display: flex;
32715
32731
  align-items: center;
32716
32732
  justify-content: center;
@@ -32725,13 +32741,13 @@
32725
32741
  .logo-text {
32726
32742
  font-size: 17px;
32727
32743
  font-weight: 500;
32728
- color: white;
32744
+ color: #171717;
32729
32745
  letter-spacing: -0.02em;
32730
32746
  }
32731
32747
 
32732
32748
  .logo-os {
32733
32749
  font-weight: 700;
32734
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
32750
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
32735
32751
  -webkit-background-clip: text;
32736
32752
  -webkit-text-fill-color: transparent;
32737
32753
  background-clip: text;
@@ -32747,13 +32763,22 @@
32747
32763
  display: flex;
32748
32764
  align-items: center;
32749
32765
  justify-content: center;
32750
- color: rgba(255, 255, 255, 0.5);
32766
+ color: #737373;
32751
32767
  transition: all 0.15s ease;
32752
32768
  }
32753
32769
 
32754
32770
  .close-button:hover {
32755
- background: rgba(255, 255, 255, 0.08);
32756
- color: white;
32771
+ background: #f5f5f4;
32772
+ color: #171717;
32773
+ }
32774
+
32775
+ .close-button:focus {
32776
+ outline: none;
32777
+ box-shadow: 0 0 0 2px #0d9488, 0 0 0 4px rgba(13, 148, 136, 0.2);
32778
+ }
32779
+
32780
+ .close-button:active {
32781
+ transform: scale(0.95);
32757
32782
  }
32758
32783
 
32759
32784
  .modal-body {
@@ -32765,8 +32790,8 @@
32765
32790
  .sidebar {
32766
32791
  width: 110px;
32767
32792
  flex-shrink: 0;
32768
- background: rgba(0, 0, 0, 0.25);
32769
- border-right: 1px solid rgba(255, 255, 255, 0.06);
32793
+ background: #fafaf9;
32794
+ border-right: 1px solid #e5e5e5;
32770
32795
  padding: 12px 8px;
32771
32796
  display: flex;
32772
32797
  flex-direction: column;
@@ -32795,19 +32820,25 @@
32795
32820
  border-radius: 10px;
32796
32821
  background: transparent;
32797
32822
  cursor: pointer;
32798
- color: rgba(255, 255, 255, 0.5);
32823
+ color: #525252;
32799
32824
  transition: all 0.15s ease;
32800
32825
  position: relative;
32801
32826
  }
32802
32827
 
32803
32828
  .sidebar-item:hover {
32804
- background: rgba(255, 255, 255, 0.05);
32805
- color: rgba(255, 255, 255, 0.8);
32829
+ background: #ffffff;
32830
+ color: #171717;
32831
+ }
32832
+
32833
+ .sidebar-item:focus {
32834
+ outline: none;
32835
+ box-shadow: inset 0 0 0 2px rgba(13, 148, 136, 0.4);
32806
32836
  }
32807
32837
 
32808
32838
  .sidebar-item.active {
32809
- background: rgba(16, 185, 129, 0.12);
32810
- color: #34d399;
32839
+ background: rgba(15, 118, 110, 0.12);
32840
+ color: #0f766e;
32841
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
32811
32842
  }
32812
32843
 
32813
32844
  .sidebar-item.active::before {
@@ -32818,7 +32849,7 @@
32818
32849
  transform: translateY(-50%);
32819
32850
  width: 3px;
32820
32851
  height: 24px;
32821
- background: #34d399;
32852
+ background: #0f766e;
32822
32853
  border-radius: 0 3px 3px 0;
32823
32854
  }
32824
32855
 
@@ -32861,14 +32892,14 @@
32861
32892
  .section-title {
32862
32893
  font-size: 15px;
32863
32894
  font-weight: 600;
32864
- color: white;
32895
+ color: #171717;
32865
32896
  margin: 0 0 6px 0;
32866
- letter-spacing: -0.01em;
32897
+ letter-spacing: -0.02em;
32867
32898
  }
32868
32899
 
32869
32900
  .section-description {
32870
32901
  font-size: 13px;
32871
- color: rgba(255, 255, 255, 0.5);
32902
+ color: #525252;
32872
32903
  line-height: 1.5;
32873
32904
  margin: 0;
32874
32905
  }
@@ -32876,7 +32907,7 @@
32876
32907
  .empty-state {
32877
32908
  text-align: center;
32878
32909
  padding: 40px 20px;
32879
- color: rgba(255, 255, 255, 0.5);
32910
+ color: #737373;
32880
32911
  }
32881
32912
 
32882
32913
  .empty-state-icon {
@@ -32888,7 +32919,7 @@
32888
32919
  font-size: 15px;
32889
32920
  font-weight: 500;
32890
32921
  margin-bottom: 8px;
32891
- color: rgba(255, 255, 255, 0.7);
32922
+ color: #525252;
32892
32923
  }
32893
32924
 
32894
32925
  .empty-state-text {
@@ -32906,7 +32937,7 @@
32906
32937
  display: flex;
32907
32938
  align-items: center;
32908
32939
  justify-content: center;
32909
- color: rgba(255, 255, 255, 0.35);
32940
+ color: #737373;
32910
32941
  transition: all 0.15s ease;
32911
32942
  }
32912
32943
 
@@ -32944,20 +32975,30 @@
32944
32975
  align-items: center;
32945
32976
  gap: 6px;
32946
32977
  padding: 10px 16px;
32947
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
32978
+ background: #0d9488;
32948
32979
  border: none;
32949
32980
  border-radius: 8px;
32950
32981
  color: white;
32951
32982
  font-size: 13px;
32952
32983
  font-weight: 600;
32984
+ letter-spacing: 0.01em;
32953
32985
  cursor: pointer;
32954
- transition: all 0.2s ease;
32955
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
32986
+ transition: all 0.15s ease;
32987
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
32956
32988
  }
32957
32989
 
32958
32990
  .add-button:hover:not(:disabled) {
32959
- transform: translateY(-1px);
32960
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
32991
+ background: #0f766e;
32992
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
32993
+ }
32994
+
32995
+ .add-button:focus:not(:disabled) {
32996
+ outline: none;
32997
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
32998
+ }
32999
+
33000
+ .add-button:active:not(:disabled) {
33001
+ transform: scale(0.98);
32961
33002
  }
32962
33003
 
32963
33004
  .add-button:disabled {
@@ -32968,7 +33009,7 @@
32968
33009
 
32969
33010
  .count-badge {
32970
33011
  font-size: 12px;
32971
- color: rgba(255, 255, 255, 0.45);
33012
+ color: #737373;
32972
33013
  font-weight: 500;
32973
33014
  }
32974
33015
 
@@ -32980,11 +33021,12 @@
32980
33021
  }
32981
33022
 
32982
33023
  .add-form {
32983
- background: rgba(255, 255, 255, 0.04);
32984
- border: 1px solid rgba(255, 255, 255, 0.08);
33024
+ background: #ffffff;
33025
+ border: 1px solid #e5e5e5;
32985
33026
  border-radius: 12px;
32986
33027
  padding: 16px;
32987
33028
  margin-bottom: 16px;
33029
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
32988
33030
  }
32989
33031
 
32990
33032
  .form-group {
@@ -32999,7 +33041,7 @@
32999
33041
  display: block;
33000
33042
  font-size: 12px;
33001
33043
  font-weight: 600;
33002
- color: rgba(255, 255, 255, 0.7);
33044
+ color: #525252;
33003
33045
  margin-bottom: 8px;
33004
33046
  text-transform: uppercase;
33005
33047
  letter-spacing: 0.04em;
@@ -33008,10 +33050,10 @@
33008
33050
  .form-input {
33009
33051
  width: 100%;
33010
33052
  padding: 12px 14px;
33011
- background: rgba(0, 0, 0, 0.3);
33012
- border: 1px solid rgba(255, 255, 255, 0.08);
33053
+ background: #ffffff;
33054
+ border: 1px solid #d4d4d4;
33013
33055
  border-radius: 8px;
33014
- color: white;
33056
+ color: #171717;
33015
33057
  font-size: 14px;
33016
33058
  font-family: inherit;
33017
33059
  transition: all 0.15s ease;
@@ -33020,12 +33062,12 @@
33020
33062
 
33021
33063
  .form-input:focus {
33022
33064
  outline: none;
33023
- border-color: #34d399;
33024
- box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);
33065
+ border-color: #0d9488;
33066
+ box-shadow: 0 0 0 3px rgba(13, 148, 136, 0.15);
33025
33067
  }
33026
33068
 
33027
33069
  .form-input::placeholder {
33028
- color: rgba(255, 255, 255, 0.3);
33070
+ color: #a3a3a3;
33029
33071
  }
33030
33072
 
33031
33073
  .form-input.error {
@@ -33049,7 +33091,7 @@
33049
33091
 
33050
33092
  .char-count {
33051
33093
  font-size: 11px;
33052
- color: rgba(255, 255, 255, 0.4);
33094
+ color: #737373;
33053
33095
  font-variant-numeric: tabular-nums;
33054
33096
  }
33055
33097
 
@@ -33083,26 +33125,35 @@
33083
33125
  }
33084
33126
 
33085
33127
  .form-btn.cancel {
33086
- background: transparent;
33087
- border: 1px solid rgba(255, 255, 255, 0.15);
33088
- color: rgba(255, 255, 255, 0.7);
33128
+ background: #ffffff;
33129
+ border: 1px solid #d4d4d4;
33130
+ color: #525252;
33089
33131
  }
33090
33132
 
33091
33133
  .form-btn.cancel:hover {
33092
- background: rgba(255, 255, 255, 0.05);
33093
- border-color: rgba(255, 255, 255, 0.25);
33134
+ background: #fafaf9;
33135
+ border-color: #a3a3a3;
33094
33136
  }
33095
33137
 
33096
33138
  .form-btn.save {
33097
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
33139
+ background: #0d9488;
33098
33140
  border: none;
33099
33141
  color: white;
33100
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
33142
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
33101
33143
  }
33102
33144
 
33103
33145
  .form-btn.save:hover:not(:disabled) {
33104
- transform: translateY(-1px);
33105
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
33146
+ background: #0f766e;
33147
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
33148
+ }
33149
+
33150
+ .form-btn.save:focus:not(:disabled) {
33151
+ outline: none;
33152
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
33153
+ }
33154
+
33155
+ .form-btn.save:active:not(:disabled) {
33156
+ transform: scale(0.98);
33106
33157
  }
33107
33158
 
33108
33159
  .form-btn.save:disabled {
@@ -33136,16 +33187,17 @@
33136
33187
  }
33137
33188
 
33138
33189
  .transcript-item {
33139
- background: rgba(255, 255, 255, 0.04);
33140
- border: 1px solid rgba(255, 255, 255, 0.06);
33190
+ background: #ffffff;
33191
+ border: 1px solid #e5e5e5;
33141
33192
  border-radius: 10px;
33142
33193
  padding: 12px 14px;
33143
33194
  transition: all 0.15s ease;
33195
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
33144
33196
  }
33145
33197
 
33146
33198
  .transcript-item:hover {
33147
- background: rgba(255, 255, 255, 0.06);
33148
- border-color: rgba(255, 255, 255, 0.1);
33199
+ border-color: #d4d4d4;
33200
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
33149
33201
  }
33150
33202
 
33151
33203
  .transcript-header {
@@ -33168,28 +33220,28 @@
33168
33220
  }
33169
33221
 
33170
33222
  .transcript-badge.dictate {
33171
- background: rgba(16, 185, 129, 0.15);
33172
- color: #34d399;
33223
+ background: rgba(13, 148, 136, 0.18);
33224
+ color: #0f766e;
33173
33225
  }
33174
33226
 
33175
33227
  .transcript-badge.edit {
33176
- background: rgba(139, 92, 246, 0.15);
33177
- color: #a78bfa;
33228
+ background: rgba(139, 92, 246, 0.18);
33229
+ color: #7c3aed;
33178
33230
  }
33179
33231
 
33180
33232
  .transcript-badge.command {
33181
- background: rgba(245, 158, 11, 0.15);
33182
- color: #fbbf24;
33233
+ background: rgba(245, 158, 11, 0.18);
33234
+ color: #b45309;
33183
33235
  }
33184
33236
 
33185
33237
  .transcript-time {
33186
33238
  font-size: 12px;
33187
- color: rgba(255, 255, 255, 0.35);
33239
+ color: #737373;
33188
33240
  }
33189
33241
 
33190
33242
  .transcript-text {
33191
33243
  font-size: 14px;
33192
- color: rgba(255, 255, 255, 0.85);
33244
+ color: #171717;
33193
33245
  line-height: 1.5;
33194
33246
  word-break: break-word;
33195
33247
  display: -webkit-box;
@@ -33204,7 +33256,7 @@
33204
33256
  gap: 8px;
33205
33257
  margin-top: 10px;
33206
33258
  padding-top: 10px;
33207
- border-top: 1px solid rgba(255, 255, 255, 0.06);
33259
+ border-top: 1px solid #e5e5e5;
33208
33260
  }
33209
33261
 
33210
33262
  .transcript-action-btn {
@@ -33213,23 +33265,23 @@
33213
33265
  gap: 6px;
33214
33266
  padding: 6px 10px;
33215
33267
  border-radius: 6px;
33216
- background: rgba(255, 255, 255, 0.06);
33268
+ background: rgba(0, 0, 0, 0.08);
33217
33269
  border: none;
33218
33270
  cursor: pointer;
33219
33271
  font-size: 12px;
33220
33272
  font-weight: 500;
33221
- color: rgba(255, 255, 255, 0.6);
33273
+ color: #404040;
33222
33274
  transition: all 0.15s ease;
33223
33275
  }
33224
33276
 
33225
33277
  .transcript-action-btn:hover {
33226
- background: rgba(255, 255, 255, 0.1);
33227
- color: rgba(255, 255, 255, 0.9);
33278
+ background: rgba(0, 0, 0, 0.12);
33279
+ color: #171717;
33228
33280
  }
33229
33281
 
33230
33282
  .transcript-action-btn.copied {
33231
- background: rgba(16, 185, 129, 0.2);
33232
- color: #34d399;
33283
+ background: rgba(13, 148, 136, 0.2);
33284
+ color: #0d9488;
33233
33285
  }
33234
33286
 
33235
33287
  .transcript-action-btn.delete:hover {
@@ -33243,9 +33295,9 @@
33243
33295
  margin-top: 16px;
33244
33296
  padding: 10px;
33245
33297
  background: rgba(239, 68, 68, 0.1);
33246
- border: 1px solid rgba(239, 68, 68, 0.15);
33298
+ border: 1px solid rgba(239, 68, 68, 0.2);
33247
33299
  border-radius: 8px;
33248
- color: #f87171;
33300
+ color: #dc2626;
33249
33301
  font-size: 13px;
33250
33302
  font-weight: 500;
33251
33303
  cursor: pointer;
@@ -33254,18 +33306,18 @@
33254
33306
 
33255
33307
  .clear-all-button:hover {
33256
33308
  background: rgba(239, 68, 68, 0.18);
33257
- border-color: rgba(239, 68, 68, 0.25);
33309
+ border-color: rgba(239, 68, 68, 0.3);
33258
33310
  }
33259
33311
 
33260
33312
  .command-matched {
33261
33313
  font-size: 12px;
33262
- color: rgba(255, 255, 255, 0.5);
33314
+ color: #525252;
33263
33315
  margin-top: 6px;
33264
33316
  }
33265
33317
 
33266
33318
  .command-matched code {
33267
33319
  background: rgba(245, 158, 11, 0.15);
33268
- color: #fbbf24;
33320
+ color: #d97706;
33269
33321
  padding: 2px 6px;
33270
33322
  border-radius: 4px;
33271
33323
  font-family: monospace;
@@ -33453,21 +33505,21 @@
33453
33505
  gap: 8px;
33454
33506
  font-size: 15px;
33455
33507
  font-weight: 600;
33456
- color: white;
33508
+ color: #171717;
33457
33509
  margin-bottom: 10px;
33458
33510
  }
33459
33511
 
33460
33512
  .help-title.dictate {
33461
- color: #34d399;
33513
+ color: #0f766e;
33462
33514
  }
33463
33515
 
33464
33516
  .help-title.edit {
33465
- color: #a78bfa;
33517
+ color: #7c3aed;
33466
33518
  }
33467
33519
 
33468
33520
  .help-text {
33469
33521
  font-size: 13px;
33470
- color: rgba(255, 255, 255, 0.6);
33522
+ color: #525252;
33471
33523
  line-height: 1.6;
33472
33524
  margin-bottom: 10px;
33473
33525
  }
@@ -33484,17 +33536,17 @@
33484
33536
  }
33485
33537
 
33486
33538
  .help-example {
33487
- background: rgba(255, 255, 255, 0.04);
33488
- border: 1px solid rgba(255, 255, 255, 0.06);
33539
+ background: #ffffff;
33540
+ border: 1px solid #e5e5e5;
33489
33541
  border-radius: 6px;
33490
33542
  padding: 8px 12px;
33491
33543
  font-size: 12px;
33492
- color: rgba(255, 255, 255, 0.5);
33544
+ color: #525252;
33493
33545
  font-style: italic;
33494
33546
  }
33495
33547
 
33496
33548
  .help-title.languages {
33497
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
33549
+ background: linear-gradient(135deg, #0f766e 0%, #1d4ed8 100%);
33498
33550
  -webkit-background-clip: text;
33499
33551
  -webkit-text-fill-color: transparent;
33500
33552
  background-clip: text;
@@ -33572,7 +33624,7 @@
33572
33624
  width: 36px;
33573
33625
  height: 36px;
33574
33626
  border-radius: 10px;
33575
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
33627
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
33576
33628
  display: flex;
33577
33629
  align-items: center;
33578
33630
  justify-content: center;
@@ -33587,13 +33639,13 @@
33587
33639
  .about-logo-text {
33588
33640
  font-size: 22px;
33589
33641
  font-weight: 500;
33590
- color: white;
33642
+ color: #171717;
33591
33643
  letter-spacing: -0.02em;
33592
33644
  }
33593
33645
 
33594
33646
  .logo-os {
33595
33647
  font-weight: 700;
33596
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
33648
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
33597
33649
  -webkit-background-clip: text;
33598
33650
  -webkit-text-fill-color: transparent;
33599
33651
  background-clip: text;
@@ -33601,7 +33653,7 @@
33601
33653
 
33602
33654
  .about-description {
33603
33655
  font-size: 14px;
33604
- color: rgba(255, 255, 255, 0.65);
33656
+ color: #525252;
33605
33657
  line-height: 1.7;
33606
33658
  margin-bottom: 24px;
33607
33659
  }
@@ -33619,19 +33671,29 @@
33619
33671
  align-items: center;
33620
33672
  gap: 8px;
33621
33673
  padding: 12px 18px;
33622
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
33674
+ background: #0d9488;
33623
33675
  border-radius: 10px;
33624
33676
  color: white;
33625
33677
  font-size: 14px;
33626
33678
  font-weight: 600;
33679
+ letter-spacing: 0.01em;
33627
33680
  text-decoration: none;
33628
- transition: all 0.2s ease;
33629
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
33681
+ transition: all 0.15s ease;
33682
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
33630
33683
  }
33631
33684
 
33632
33685
  .about-link:hover {
33633
- transform: translateY(-1px);
33634
- box-shadow: 0 6px 16px rgba(16, 185, 129, 0.35);
33686
+ background: #0f766e;
33687
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
33688
+ }
33689
+
33690
+ .about-link:focus {
33691
+ outline: none;
33692
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
33693
+ }
33694
+
33695
+ .about-link:active {
33696
+ transform: scale(0.98);
33635
33697
  }
33636
33698
  `,
33637
33699
  ]; }
@@ -33711,20 +33773,21 @@
33711
33773
  gap: 3px;
33712
33774
  height: 32px;
33713
33775
  padding: 8px 12px;
33714
- background: rgba(0, 0, 0, 0.2);
33776
+ background: #ffffff;
33777
+ border: 2px solid #e5e5e5;
33715
33778
  border-radius: 8px;
33716
33779
  }
33717
33780
 
33718
33781
  .meter-bar {
33719
33782
  width: 6px;
33720
33783
  min-height: 4px;
33721
- background: rgba(255, 255, 255, 0.2);
33784
+ background: #d4d4d4;
33722
33785
  border-radius: 2px;
33723
33786
  transition: height 50ms ease-out, background 100ms ease;
33724
33787
  }
33725
33788
 
33726
33789
  .meter-bar.active {
33727
- background: var(--speechos-primary);
33790
+ background: #10b981;
33728
33791
  }
33729
33792
 
33730
33793
  .meter-inactive {
@@ -33733,14 +33796,15 @@
33733
33796
  justify-content: center;
33734
33797
  height: 32px;
33735
33798
  padding: 8px 12px;
33736
- background: rgba(0, 0, 0, 0.2);
33799
+ background: #ffffff;
33800
+ border: 2px solid #e5e5e5;
33737
33801
  border-radius: 8px;
33738
- color: rgba(255, 255, 255, 0.4);
33802
+ color: #737373;
33739
33803
  font-size: 13px;
33740
33804
  }
33741
33805
 
33742
33806
  .meter-error {
33743
- color: #f87171;
33807
+ color: #dc2626;
33744
33808
  }
33745
33809
  `,
33746
33810
  ]; }
@@ -33937,18 +34001,18 @@
33937
34001
  }
33938
34002
 
33939
34003
  .settings-section-icon {
33940
- color: #34d399;
34004
+ color: #0d9488;
33941
34005
  }
33942
34006
 
33943
34007
  .settings-section-title {
33944
34008
  font-size: 14px;
33945
34009
  font-weight: 600;
33946
- color: white;
34010
+ color: #171717;
33947
34011
  }
33948
34012
 
33949
34013
  .settings-section-description {
33950
34014
  font-size: 13px;
33951
- color: rgba(255, 255, 255, 0.45);
34015
+ color: #525252;
33952
34016
  line-height: 1.5;
33953
34017
  margin-bottom: 14px;
33954
34018
  }
@@ -33977,10 +34041,10 @@
33977
34041
  .settings-select {
33978
34042
  width: 100%;
33979
34043
  padding: 12px 40px 12px 14px;
33980
- background: rgba(0, 0, 0, 0.3);
33981
- border: 1px solid rgba(255, 255, 255, 0.08);
34044
+ background: #ffffff;
34045
+ border: 1px solid #d4d4d4;
33982
34046
  border-radius: 10px;
33983
- color: white;
34047
+ color: #171717;
33984
34048
  font-size: 14px;
33985
34049
  font-family: inherit;
33986
34050
  cursor: pointer;
@@ -33990,34 +34054,44 @@
33990
34054
  }
33991
34055
 
33992
34056
  .settings-select:hover {
33993
- border-color: rgba(255, 255, 255, 0.15);
33994
- background: rgba(0, 0, 0, 0.4);
34057
+ border-color: #a3a3a3;
34058
+ background: #ffffff;
33995
34059
  }
33996
34060
 
33997
34061
  .settings-select:focus {
33998
34062
  outline: none;
33999
- border-color: #34d399;
34000
- box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);
34063
+ border-color: #0d9488;
34064
+ box-shadow: 0 0 0 3px rgba(13, 148, 136, 0.15);
34001
34065
  }
34002
34066
 
34003
34067
  .settings-select option {
34004
- background: #1a1d24;
34005
- color: white;
34068
+ background: #ffffff;
34069
+ color: #171717;
34006
34070
  padding: 8px;
34007
34071
  }
34008
34072
 
34073
+ .settings-select:disabled {
34074
+ opacity: 0.4;
34075
+ cursor: not-allowed;
34076
+ }
34077
+
34078
+ .settings-select:disabled:hover {
34079
+ border-color: #d4d4d4;
34080
+ background: #ffffff;
34081
+ }
34082
+
34009
34083
  .settings-select-arrow {
34010
34084
  position: absolute;
34011
34085
  right: 14px;
34012
34086
  top: 50%;
34013
34087
  transform: translateY(-50%);
34014
34088
  pointer-events: none;
34015
- color: rgba(255, 255, 255, 0.4);
34089
+ color: #737373;
34016
34090
  }
34017
34091
 
34018
34092
  .settings-permission-note {
34019
34093
  font-size: 12px;
34020
- color: rgba(255, 255, 255, 0.4);
34094
+ color: #737373;
34021
34095
  margin-top: 10px;
34022
34096
  font-style: italic;
34023
34097
  }
@@ -34027,7 +34101,7 @@
34027
34101
  align-items: center;
34028
34102
  gap: 4px;
34029
34103
  font-size: 11px;
34030
- color: #34d399;
34104
+ color: #059669;
34031
34105
  font-weight: 500;
34032
34106
  opacity: 0;
34033
34107
  transition: opacity 0.2s ease;
@@ -34043,28 +34117,34 @@
34043
34117
  align-items: center;
34044
34118
  justify-content: space-between;
34045
34119
  padding: 12px 14px;
34046
- background: rgba(0, 0, 0, 0.3);
34047
- border: 1px solid rgba(255, 255, 255, 0.08);
34120
+ background: #ffffff;
34121
+ border: 1px solid #e5e5e5;
34048
34122
  border-radius: 10px;
34123
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
34049
34124
  }
34050
34125
 
34051
34126
  .settings-toggle-label {
34052
34127
  font-size: 14px;
34053
- color: white;
34128
+ color: #171717;
34054
34129
  }
34055
34130
 
34056
34131
  .settings-toggle {
34057
34132
  position: relative;
34058
34133
  width: 44px;
34059
34134
  height: 24px;
34060
- background: rgba(255, 255, 255, 0.1);
34135
+ background: #d4d4d4;
34061
34136
  border-radius: 12px;
34062
34137
  cursor: pointer;
34063
34138
  transition: background 0.2s ease;
34064
34139
  }
34065
34140
 
34066
34141
  .settings-toggle.active {
34067
- background: #34d399;
34142
+ background: #0d9488;
34143
+ }
34144
+
34145
+ .settings-toggle:focus {
34146
+ outline: none;
34147
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
34068
34148
  }
34069
34149
 
34070
34150
  .settings-toggle-knob {
@@ -34187,13 +34267,14 @@
34187
34267
  setSmartFormatEnabled(this.smartFormatEnabled);
34188
34268
  this.showSaved();
34189
34269
  }
34190
- renderLanguageSelector(selectedCode, onChange) {
34270
+ renderLanguageSelector(selectedCode, onChange, disabled = false) {
34191
34271
  return b `
34192
34272
  <div class="settings-select-wrapper">
34193
34273
  <select
34194
34274
  class="settings-select"
34195
34275
  .value="${selectedCode}"
34196
34276
  @change="${onChange}"
34277
+ ?disabled="${disabled}"
34197
34278
  >
34198
34279
  ${SUPPORTED_LANGUAGES.map((lang) => b `
34199
34280
  <option
@@ -34311,7 +34392,7 @@
34311
34392
  <div class="settings-section-description">
34312
34393
  AI automatically removes filler words, adds punctuation, and polishes
34313
34394
  your text. Disable for raw transcription output. Note: disabling also
34314
- turns off text snippets.
34395
+ turns off text snippets and output language translation.
34315
34396
  </div>
34316
34397
  <div class="settings-toggle-row">
34317
34398
  <span class="settings-toggle-label">Enable AI formatting</span>
@@ -34352,9 +34433,13 @@
34352
34433
  </div>
34353
34434
  <div class="settings-section-description">
34354
34435
  The language for your transcribed text. Usually the same as input, but
34355
- can differ for translation.
34436
+ can differ for translation.${!this.smartFormatEnabled
34437
+ ? " Requires Smart Format to be enabled."
34438
+ : ""}
34356
34439
  </div>
34357
- ${this.renderLanguageSelector(this.selectedOutputLanguageCode, this.handleOutputLanguageChange.bind(this))}
34440
+ ${this.renderLanguageSelector(this.smartFormatEnabled
34441
+ ? this.selectedOutputLanguageCode
34442
+ : this.selectedInputLanguageCode, this.handleOutputLanguageChange.bind(this), !this.smartFormatEnabled)}
34358
34443
  </div>
34359
34444
  `;
34360
34445
  }
@@ -34417,17 +34502,18 @@
34417
34502
  }
34418
34503
 
34419
34504
  .snippet-item {
34420
- background: rgba(255, 255, 255, 0.04);
34421
- border: 1px solid rgba(255, 255, 255, 0.06);
34505
+ background: #ffffff;
34506
+ border: 1px solid #e5e5e5;
34422
34507
  border-radius: 10px;
34423
34508
  padding: 14px;
34424
34509
  transition: all 0.15s ease;
34425
34510
  position: relative;
34511
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
34426
34512
  }
34427
34513
 
34428
34514
  .snippet-item:hover {
34429
- background: rgba(255, 255, 255, 0.06);
34430
- border-color: rgba(255, 255, 255, 0.1);
34515
+ border-color: #d4d4d4;
34516
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
34431
34517
  }
34432
34518
 
34433
34519
  .snippet-trigger {
@@ -34440,7 +34526,7 @@
34440
34526
  .snippet-trigger-text {
34441
34527
  font-size: 14px;
34442
34528
  font-weight: 600;
34443
- color: #34d399;
34529
+ color: #0d9488;
34444
34530
  }
34445
34531
 
34446
34532
  .snippet-trigger-text::before {
@@ -34458,12 +34544,12 @@
34458
34544
  align-items: flex-start;
34459
34545
  gap: 8px;
34460
34546
  font-size: 13px;
34461
- color: rgba(255, 255, 255, 0.65);
34547
+ color: #525252;
34462
34548
  line-height: 1.5;
34463
34549
  }
34464
34550
 
34465
34551
  .snippet-expansion-arrow {
34466
- color: rgba(255, 255, 255, 0.3);
34552
+ color: #a3a3a3;
34467
34553
  flex-shrink: 0;
34468
34554
  margin-top: 2px;
34469
34555
  }
@@ -34492,13 +34578,13 @@
34492
34578
  display: flex;
34493
34579
  align-items: center;
34494
34580
  justify-content: center;
34495
- color: rgba(255, 255, 255, 0.4);
34581
+ color: #737373;
34496
34582
  transition: all 0.15s ease;
34497
34583
  }
34498
34584
 
34499
34585
  .edit-btn:hover {
34500
- background: rgba(52, 211, 153, 0.15);
34501
- color: #34d399;
34586
+ background: rgba(13, 148, 136, 0.1);
34587
+ color: #0d9488;
34502
34588
  }
34503
34589
  `,
34504
34590
  ]; }
@@ -34781,30 +34867,32 @@
34781
34867
  gap: 8px;
34782
34868
  padding: 8px 12px;
34783
34869
  background: rgba(139, 92, 246, 0.1);
34784
- border: 1px solid rgba(139, 92, 246, 0.2);
34870
+ border: 1px solid rgba(139, 92, 246, 0.25);
34785
34871
  border-radius: 8px;
34786
34872
  transition: all 0.15s ease;
34787
34873
  }
34788
34874
 
34789
34875
  .vocabulary-chip:hover {
34790
34876
  background: rgba(139, 92, 246, 0.15);
34791
- border-color: rgba(139, 92, 246, 0.3);
34877
+ border-color: rgba(139, 92, 246, 0.35);
34792
34878
  }
34793
34879
 
34794
34880
  .vocabulary-chip-text {
34795
34881
  font-size: 13px;
34796
34882
  font-weight: 500;
34797
- color: #c4b5fd;
34883
+ color: #7c3aed;
34798
34884
  }
34799
34885
 
34800
34886
  .vocabulary-chip .delete-btn {
34801
34887
  width: 20px;
34802
34888
  height: 20px;
34803
34889
  margin: -4px -4px -4px 0;
34890
+ color: #737373;
34804
34891
  }
34805
34892
 
34806
34893
  .vocabulary-chip .delete-btn:hover {
34807
34894
  background: rgba(239, 68, 68, 0.2);
34895
+ color: #f87171;
34808
34896
  }
34809
34897
  `,
34810
34898
  ]; }
@@ -35205,14 +35293,14 @@
35205
35293
  }
35206
35294
 
35207
35295
  .modal-card {
35208
- background: #1a1d24;
35296
+ background: #f5f5f4;
35209
35297
  border-radius: 16px;
35210
35298
  width: 90%;
35211
35299
  max-width: 400px;
35212
35300
  display: flex;
35213
35301
  flex-direction: column;
35214
- box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),
35215
- 0 0 0 1px rgba(255, 255, 255, 0.05);
35302
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.15),
35303
+ 0 0 0 1px rgba(0, 0, 0, 0.05);
35216
35304
  transform: scale(0.95) translateY(10px);
35217
35305
  transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
35218
35306
  pointer-events: auto;
@@ -35228,14 +35316,14 @@
35228
35316
  align-items: center;
35229
35317
  justify-content: space-between;
35230
35318
  padding: 16px 20px;
35231
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
35232
- background: rgba(0, 0, 0, 0.2);
35319
+ border-bottom: 1px solid #e5e5e5;
35320
+ background: #ffffff;
35233
35321
  }
35234
35322
 
35235
35323
  .modal-title {
35236
35324
  font-size: 16px;
35237
35325
  font-weight: 600;
35238
- color: white;
35326
+ color: #171717;
35239
35327
  margin: 0;
35240
35328
  letter-spacing: -0.01em;
35241
35329
  }
@@ -35250,13 +35338,22 @@
35250
35338
  display: flex;
35251
35339
  align-items: center;
35252
35340
  justify-content: center;
35253
- color: rgba(255, 255, 255, 0.5);
35341
+ color: #737373;
35254
35342
  transition: all 0.15s ease;
35255
35343
  }
35256
35344
 
35257
35345
  .close-button:hover {
35258
- background: rgba(255, 255, 255, 0.08);
35259
- color: white;
35346
+ background: #f5f5f4;
35347
+ color: #171717;
35348
+ }
35349
+
35350
+ .close-button:focus {
35351
+ outline: none;
35352
+ box-shadow: 0 0 0 2px #0d9488, 0 0 0 4px rgba(13, 148, 136, 0.2);
35353
+ }
35354
+
35355
+ .close-button:active {
35356
+ transform: scale(0.95);
35260
35357
  }
35261
35358
 
35262
35359
  .modal-body {
@@ -35268,8 +35365,8 @@
35268
35365
  justify-content: flex-end;
35269
35366
  gap: 10px;
35270
35367
  padding: 16px 20px;
35271
- border-top: 1px solid rgba(255, 255, 255, 0.06);
35272
- background: rgba(0, 0, 0, 0.1);
35368
+ border-top: 1px solid #e5e5e5;
35369
+ background: #ffffff;
35273
35370
  }
35274
35371
 
35275
35372
  .btn {
@@ -35286,42 +35383,47 @@
35286
35383
  }
35287
35384
 
35288
35385
  .btn-secondary {
35289
- background: rgba(255, 255, 255, 0.08);
35290
- color: rgba(255, 255, 255, 0.8);
35386
+ background: rgba(0, 0, 0, 0.08);
35387
+ color: #525252;
35291
35388
  }
35292
35389
 
35293
35390
  .btn-secondary:hover {
35294
- background: rgba(255, 255, 255, 0.12);
35295
- color: white;
35391
+ background: rgba(0, 0, 0, 0.12);
35392
+ color: #171717;
35296
35393
  }
35297
35394
 
35298
35395
  .btn-primary {
35299
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
35396
+ background: #0d9488;
35300
35397
  color: white;
35301
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
35398
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
35302
35399
  }
35303
35400
 
35304
35401
  .btn-primary:hover {
35305
- transform: translateY(-1px);
35306
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
35402
+ background: #0f766e;
35403
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
35404
+ }
35405
+
35406
+ .btn-primary:focus {
35407
+ outline: none;
35408
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
35307
35409
  }
35308
35410
 
35309
35411
  .btn-primary:active {
35310
- transform: translateY(0);
35412
+ transform: scale(0.98);
35311
35413
  }
35312
35414
 
35313
35415
  /* Success state for copy button */
35314
35416
  .btn-success {
35315
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
35417
+ background: #059669;
35316
35418
  }
35317
35419
 
35318
35420
  /* Text display area */
35319
35421
  .text-display {
35320
- background: rgba(0, 0, 0, 0.3);
35321
- border: 1px solid rgba(255, 255, 255, 0.08);
35422
+ background: #ffffff;
35423
+ border: 1px solid #e5e5e5;
35322
35424
  border-radius: 10px;
35323
35425
  padding: 14px 16px;
35324
- color: white;
35426
+ color: #171717;
35325
35427
  font-size: 14px;
35326
35428
  line-height: 1.5;
35327
35429
  max-height: 200px;
@@ -35340,12 +35442,12 @@
35340
35442
  }
35341
35443
 
35342
35444
  .text-display::-webkit-scrollbar-thumb {
35343
- background: rgba(255, 255, 255, 0.15);
35445
+ background: rgba(0, 0, 0, 0.15);
35344
35446
  border-radius: 3px;
35345
35447
  }
35346
35448
 
35347
35449
  .text-display::-webkit-scrollbar-thumb:hover {
35348
- background: rgba(255, 255, 255, 0.25);
35450
+ background: rgba(0, 0, 0, 0.25);
35349
35451
  }
35350
35452
 
35351
35453
  /* Instruction list styling */
@@ -35360,7 +35462,7 @@
35360
35462
  align-items: flex-start;
35361
35463
  gap: 12px;
35362
35464
  padding: 12px 0;
35363
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
35465
+ border-bottom: 1px solid #e5e5e5;
35364
35466
  }
35365
35467
 
35366
35468
  .instruction-item:last-child {
@@ -35371,7 +35473,7 @@
35371
35473
  width: 24px;
35372
35474
  height: 24px;
35373
35475
  border-radius: 50%;
35374
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
35476
+ background: #0d9488;
35375
35477
  color: white;
35376
35478
  font-size: 12px;
35377
35479
  font-weight: 700;
@@ -35383,7 +35485,7 @@
35383
35485
 
35384
35486
  .instruction-text {
35385
35487
  font-size: 14px;
35386
- color: rgba(255, 255, 255, 0.85);
35488
+ color: #171717;
35387
35489
  line-height: 1.5;
35388
35490
  padding-top: 2px;
35389
35491
  }
@@ -35441,7 +35543,7 @@
35441
35543
  width: 32px;
35442
35544
  height: 32px;
35443
35545
  border-radius: 8px;
35444
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
35546
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
35445
35547
  display: flex;
35446
35548
  align-items: center;
35447
35549
  justify-content: center;
@@ -35455,31 +35557,35 @@
35455
35557
  }
35456
35558
 
35457
35559
  .modal-title {
35458
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
35560
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
35459
35561
  -webkit-background-clip: text;
35460
35562
  -webkit-text-fill-color: transparent;
35461
35563
  background-clip: text;
35462
35564
  }
35463
35565
 
35464
35566
  .btn-primary {
35465
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
35466
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
35567
+ background: #0d9488;
35568
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
35467
35569
  border-radius: 999px;
35468
35570
  }
35469
35571
 
35470
35572
  .btn-primary:hover {
35471
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
35472
- transform: translateY(-2px);
35473
- box-shadow: 0 6px 16px rgba(16, 185, 129, 0.4);
35573
+ background: #0f766e;
35574
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
35575
+ }
35576
+
35577
+ .btn-primary:focus {
35578
+ outline: none;
35579
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
35474
35580
  }
35475
35581
 
35476
35582
  .btn-primary:active {
35477
- transform: translateY(0);
35583
+ transform: scale(0.98);
35478
35584
  }
35479
35585
 
35480
35586
  .btn-success {
35481
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
35482
- box-shadow: 0 4px 12px rgba(52, 211, 153, 0.3);
35587
+ background: #059669;
35588
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
35483
35589
  border-radius: 999px;
35484
35590
  }
35485
35591
 
@@ -35493,14 +35599,15 @@
35493
35599
  gap: 6px;
35494
35600
  margin-top: 12px;
35495
35601
  padding: 8px 12px;
35496
- background: rgba(16, 185, 129, 0.08);
35602
+ background: #ffffff;
35603
+ border: 1px solid #e5e5e5;
35497
35604
  border-radius: 8px;
35498
35605
  font-size: 12px;
35499
- color: rgba(255, 255, 255, 0.6);
35606
+ color: #525252;
35500
35607
  }
35501
35608
 
35502
35609
  .hint-icon {
35503
- color: #10b981;
35610
+ color: #0d9488;
35504
35611
  flex-shrink: 0;
35505
35612
  }
35506
35613
 
@@ -36340,7 +36447,14 @@
36340
36447
  state.hide();
36341
36448
  }
36342
36449
  handleSettingsClick() {
36343
- this.settingsOpen = true;
36450
+ if (useExternalSettings()) {
36451
+ const host = getConfig().host;
36452
+ const fullUrl = `${host}/a/extension-settings`;
36453
+ window.open(fullUrl, '_blank', 'noopener,noreferrer');
36454
+ }
36455
+ else {
36456
+ this.settingsOpen = true;
36457
+ }
36344
36458
  }
36345
36459
  handleDragStart(e) {
36346
36460
  if (e.button !== 0)
@@ -36881,10 +36995,17 @@
36881
36995
  this.editSelectionStart = null;
36882
36996
  this.editSelectionEnd = null;
36883
36997
  this.editSelectedText = "";
36884
- // Open settings modal
36885
- this.settingsOpen = true;
36998
+ // Open settings - either external URL or modal
36999
+ if (useExternalSettings()) {
37000
+ const host = getConfig().host;
37001
+ const fullUrl = `${host}/a/extension-settings`;
37002
+ window.open(fullUrl, '_blank', 'noopener,noreferrer');
37003
+ }
37004
+ else {
37005
+ this.settingsOpen = true;
37006
+ }
36886
37007
  if (getConfig().debug) {
36887
- console.log("[SpeechOS] Settings modal opened from no-audio warning");
37008
+ console.log("[SpeechOS] Settings opened from no-audio warning", { useExternalSettings: useExternalSettings() });
36888
37009
  }
36889
37010
  await disconnectPromise;
36890
37011
  }
@@ -37465,6 +37586,7 @@
37465
37586
  exports.state = state;
37466
37587
  exports.transcriptStore = transcriptStore;
37467
37588
  exports.updateSnippet = updateSnippet;
37589
+ exports.useExternalSettings = useExternalSettings;
37468
37590
  exports.vocabularyStore = vocabularyStore;
37469
37591
 
37470
37592
  Object.defineProperty(exports, '__esModule', { value: true });