@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.
package/dist/index.cjs CHANGED
@@ -15,6 +15,7 @@ const defaultClientConfig = {
15
15
  commands: [],
16
16
  zIndex: 999999,
17
17
  alwaysVisible: false,
18
+ useExternalSettings: false,
18
19
  };
19
20
  /**
20
21
  * Current client configuration singleton
@@ -30,6 +31,7 @@ function validateClientConfig(config) {
30
31
  commands: config.commands ?? defaultClientConfig.commands,
31
32
  zIndex: config.zIndex ?? defaultClientConfig.zIndex,
32
33
  alwaysVisible: config.alwaysVisible ?? defaultClientConfig.alwaysVisible,
34
+ useExternalSettings: config.useExternalSettings ?? defaultClientConfig.useExternalSettings,
33
35
  };
34
36
  // Validate zIndex
35
37
  if (typeof resolved.zIndex !== "number" || resolved.zIndex < 0) {
@@ -81,6 +83,12 @@ function getZIndex() {
81
83
  function isAlwaysVisible() {
82
84
  return currentClientConfig.alwaysVisible;
83
85
  }
86
+ /**
87
+ * Check if external settings page should be used
88
+ */
89
+ function useExternalSettings() {
90
+ return currentClientConfig.useExternalSettings;
91
+ }
84
92
 
85
93
  /**
86
94
  * Form field focus detection for SpeechOS Client SDK
@@ -251,6 +259,17 @@ class FormDetector {
251
259
  document.addEventListener("touchstart", this.touchHandler, true);
252
260
  document.addEventListener("mousedown", this.mouseDownHandler, true);
253
261
  this.isActive = true;
262
+ // Check for already-focused form field (e.g., page loaded with autofocus)
263
+ const activeElement = document.activeElement;
264
+ if (isFormField(activeElement)) {
265
+ console.log("[SpeechOS] FormDetector: found initially focused form field", {
266
+ element: activeElement,
267
+ tagName: activeElement?.tagName,
268
+ });
269
+ core.state.setFocusedElement(activeElement);
270
+ core.state.show();
271
+ core.events.emit("form:focus", { element: activeElement });
272
+ }
254
273
  }
255
274
  /**
256
275
  * Stop detecting form field focus events
@@ -495,9 +514,12 @@ let memoryCache$3 = null;
495
514
  * Sorted alphabetically by name for dropdown display
496
515
  */
497
516
  const SUPPORTED_LANGUAGES = [
517
+ { name: "Belarusian", code: "be", variants: ["be"] },
518
+ { name: "Bengali", code: "bn", variants: ["bn"] },
519
+ { name: "Bosnian", code: "bs", variants: ["bs"] },
498
520
  { name: "Bulgarian", code: "bg", variants: ["bg"] },
499
521
  { name: "Catalan", code: "ca", variants: ["ca"] },
500
- { name: "Chinese", code: "zh", variants: ["zh"] },
522
+ { name: "Croatian", code: "hr", variants: ["hr"] },
501
523
  { name: "Czech", code: "cs", variants: ["cs"] },
502
524
  { name: "Danish", code: "da", variants: ["da", "da-DK"] },
503
525
  { name: "Dutch", code: "nl", variants: ["nl"] },
@@ -518,18 +540,26 @@ const SUPPORTED_LANGUAGES = [
518
540
  { name: "Indonesian", code: "id", variants: ["id"] },
519
541
  { name: "Italian", code: "it", variants: ["it"] },
520
542
  { name: "Japanese", code: "ja", variants: ["ja"] },
543
+ { name: "Kannada", code: "kn", variants: ["kn"] },
521
544
  { name: "Korean", code: "ko", variants: ["ko", "ko-KR"] },
522
545
  { name: "Latvian", code: "lv", variants: ["lv"] },
523
546
  { name: "Lithuanian", code: "lt", variants: ["lt"] },
547
+ { name: "Macedonian", code: "mk", variants: ["mk"] },
524
548
  { name: "Malay", code: "ms", variants: ["ms"] },
549
+ { name: "Marathi", code: "mr", variants: ["mr"] },
525
550
  { name: "Norwegian", code: "no", variants: ["no"] },
526
551
  { name: "Polish", code: "pl", variants: ["pl"] },
527
552
  { name: "Portuguese", code: "pt", variants: ["pt", "pt-BR", "pt-PT"] },
528
553
  { name: "Romanian", code: "ro", variants: ["ro"] },
529
554
  { name: "Russian", code: "ru", variants: ["ru"] },
555
+ { name: "Serbian", code: "sr", variants: ["sr"] },
530
556
  { name: "Slovak", code: "sk", variants: ["sk"] },
557
+ { name: "Slovenian", code: "sl", variants: ["sl"] },
531
558
  { name: "Spanish", code: "es", variants: ["es", "es-419"] },
532
559
  { name: "Swedish", code: "sv", variants: ["sv", "sv-SE"] },
560
+ { name: "Tagalog", code: "tl", variants: ["tl"] },
561
+ { name: "Tamil", code: "ta", variants: ["ta"] },
562
+ { name: "Telugu", code: "te", variants: ["te"] },
533
563
  { name: "Turkish", code: "tr", variants: ["tr"] },
534
564
  { name: "Ukrainian", code: "uk", variants: ["uk"] },
535
565
  { name: "Vietnamese", code: "vi", variants: ["vi"] },
@@ -1322,25 +1352,14 @@ class SettingsSync {
1322
1352
  this.syncDisabled = false;
1323
1353
  }
1324
1354
  /**
1325
- * Make a fetch request using custom fetchHandler if configured, otherwise native fetch.
1326
- * This allows the Chrome extension to route fetch traffic through the service worker
1327
- * to bypass page CSP restrictions.
1355
+ * Make a fetch request using native fetch.
1328
1356
  */
1329
1357
  async doFetch(url, options) {
1330
1358
  const config = core.getConfig();
1331
- const customHandler = core.getFetchHandler();
1332
- if (customHandler) {
1333
- if (config.debug) {
1334
- console.log("[SpeechOS] Using custom fetch handler (extension proxy)", options.method, url);
1335
- }
1336
- return customHandler(url, options);
1337
- }
1338
1359
  if (config.debug) {
1339
1360
  console.log("[SpeechOS] Using native fetch", options.method, url);
1340
1361
  }
1341
- // Use native fetch and wrap response to match FetchResponse interface
1342
- const response = await fetch(url, options);
1343
- return response;
1362
+ return fetch(url, options);
1344
1363
  }
1345
1364
  /**
1346
1365
  * Initialize the settings sync manager
@@ -1720,9 +1739,9 @@ const themeStyles = i$4 `
1720
1739
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
1721
1740
 
1722
1741
  /* Color tokens */
1723
- --speechos-primary: #10B981;
1724
- --speechos-primary-hover: #059669;
1725
- --speechos-primary-active: #047857;
1742
+ --speechos-primary: #0d9488;
1743
+ --speechos-primary-hover: #0f766e;
1744
+ --speechos-primary-active: #115e59;
1726
1745
 
1727
1746
  --speechos-bg: #ffffff;
1728
1747
  --speechos-bg-hover: #f9fafb;
@@ -2287,45 +2306,51 @@ let SpeechOSMicButton = class SpeechOSMicButton extends i$1 {
2287
2306
  width: 56px;
2288
2307
  height: 56px;
2289
2308
  border-radius: var(--speechos-radius-full);
2290
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
2309
+ background: #10b981;
2291
2310
  border: none;
2292
2311
  cursor: pointer;
2293
2312
  display: flex;
2294
2313
  align-items: center;
2295
2314
  justify-content: center;
2296
2315
  color: white;
2297
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);
2298
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2316
+ box-shadow: 0 4px 16px rgba(16, 185, 129, 0.35);
2317
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2299
2318
  position: relative;
2300
2319
  overflow: hidden;
2301
2320
  }
2302
2321
 
2303
2322
  .mic-button:hover {
2323
+ background: #059669;
2304
2324
  transform: scale(1.05);
2305
- box-shadow: 0 6px 20px rgba(16, 185, 129, 0.5);
2325
+ box-shadow: 0 6px 24px rgba(16, 185, 129, 0.45);
2306
2326
  }
2307
2327
 
2308
2328
  .mic-button:active {
2309
2329
  transform: scale(0.98);
2310
2330
  }
2311
2331
 
2332
+ .mic-button:focus {
2333
+ outline: none;
2334
+ box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.4), 0 4px 16px rgba(16, 185, 129, 0.35);
2335
+ }
2336
+
2312
2337
  /* Expanded state - bubbles visible */
2313
2338
  .mic-button.expanded {
2314
- background: linear-gradient(135deg, #059669 0%, #047857 100%);
2339
+ background: #059669;
2315
2340
  }
2316
2341
 
2317
2342
  /* Connecting state - Siri-style metallic spinner */
2318
2343
  .mic-button.connecting {
2319
2344
  background: radial-gradient(
2320
2345
  circle at 30% 30%,
2321
- #34d399 0%,
2322
- #10b981 40%,
2323
- #059669 70%,
2324
- #047857 100%
2346
+ #2dd4bf 0%,
2347
+ #14b8a6 40%,
2348
+ #0d9488 70%,
2349
+ #0f766e 100%
2325
2350
  );
2326
2351
  cursor: wait;
2327
- box-shadow: 0 0 20px rgba(16, 185, 129, 0.4),
2328
- 0 0 40px rgba(16, 185, 129, 0.2),
2352
+ box-shadow: 0 0 20px rgba(13, 148, 136, 0.4),
2353
+ 0 0 40px rgba(13, 148, 136, 0.2),
2329
2354
  inset 0 0 20px rgba(255, 255, 255, 0.1);
2330
2355
  }
2331
2356
 
@@ -2368,15 +2393,15 @@ let SpeechOSMicButton = class SpeechOSMicButton extends i$1 {
2368
2393
  background: conic-gradient(
2369
2394
  from 0deg,
2370
2395
  transparent 0deg,
2371
- rgba(52, 211, 153, 0.1) 30deg,
2372
- rgba(16, 185, 129, 0.8) 90deg,
2396
+ rgba(45, 212, 191, 0.1) 30deg,
2397
+ rgba(13, 148, 136, 0.8) 90deg,
2373
2398
  rgba(255, 255, 255, 0.95) 120deg,
2374
- rgba(52, 211, 153, 0.9) 150deg,
2375
- rgba(16, 185, 129, 0.6) 180deg,
2376
- rgba(5, 150, 105, 0.3) 210deg,
2399
+ rgba(45, 212, 191, 0.9) 150deg,
2400
+ rgba(13, 148, 136, 0.6) 180deg,
2401
+ rgba(15, 118, 110, 0.3) 210deg,
2377
2402
  transparent 270deg,
2378
- rgba(110, 231, 183, 0.2) 300deg,
2379
- rgba(16, 185, 129, 0.5) 330deg,
2403
+ rgba(94, 234, 212, 0.2) 300deg,
2404
+ rgba(13, 148, 136, 0.5) 330deg,
2380
2405
  transparent 360deg
2381
2406
  );
2382
2407
  -webkit-mask: linear-gradient(#fff 0 0) content-box,
@@ -2397,13 +2422,13 @@ let SpeechOSMicButton = class SpeechOSMicButton extends i$1 {
2397
2422
  background: conic-gradient(
2398
2423
  from 180deg,
2399
2424
  transparent 0deg,
2400
- rgba(167, 243, 208, 0.3) 60deg,
2425
+ rgba(153, 246, 228, 0.3) 60deg,
2401
2426
  rgba(255, 255, 255, 0.7) 90deg,
2402
- rgba(110, 231, 183, 0.5) 120deg,
2427
+ rgba(94, 234, 212, 0.5) 120deg,
2403
2428
  transparent 180deg,
2404
- rgba(52, 211, 153, 0.2) 240deg,
2429
+ rgba(45, 212, 191, 0.2) 240deg,
2405
2430
  rgba(255, 255, 255, 0.5) 270deg,
2406
- rgba(16, 185, 129, 0.4) 300deg,
2431
+ rgba(13, 148, 136, 0.4) 300deg,
2407
2432
  transparent 360deg
2408
2433
  );
2409
2434
  -webkit-mask: linear-gradient(#fff 0 0) content-box,
@@ -2444,8 +2469,8 @@ let SpeechOSMicButton = class SpeechOSMicButton extends i$1 {
2444
2469
  border-radius: 50%;
2445
2470
  background: radial-gradient(
2446
2471
  circle,
2447
- rgba(16, 185, 129, 0.4) 0%,
2448
- rgba(16, 185, 129, 0.15) 40%,
2472
+ rgba(13, 148, 136, 0.4) 0%,
2473
+ rgba(13, 148, 136, 0.15) 40%,
2449
2474
  transparent 70%
2450
2475
  );
2451
2476
  animation: siri-glow-pulse 2s ease-in-out infinite;
@@ -3865,15 +3890,15 @@ const modalLayoutStyles = i$4 `
3865
3890
  }
3866
3891
 
3867
3892
  .modal {
3868
- background: #1a1d24;
3893
+ background: #f5f5f4;
3869
3894
  border-radius: 16px;
3870
3895
  width: 90%;
3871
3896
  max-width: 580px;
3872
3897
  height: min(560px, 85vh);
3873
3898
  display: flex;
3874
3899
  flex-direction: column;
3875
- box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),
3876
- 0 0 0 1px rgba(255, 255, 255, 0.05);
3900
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.15),
3901
+ 0 0 0 1px rgba(0, 0, 0, 0.05);
3877
3902
  transform: scale(0.95) translateY(10px);
3878
3903
  transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
3879
3904
  pointer-events: auto;
@@ -3898,16 +3923,16 @@ const modalLayoutStyles = i$4 `
3898
3923
  align-items: center;
3899
3924
  justify-content: space-between;
3900
3925
  padding: 16px 20px;
3901
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
3902
- background: rgba(0, 0, 0, 0.2);
3926
+ border-bottom: 1px solid #e5e5e5;
3927
+ background: #ffffff;
3903
3928
  }
3904
3929
 
3905
3930
  .modal-title {
3906
3931
  font-size: 17px;
3907
3932
  font-weight: 600;
3908
- color: white;
3933
+ color: #171717;
3909
3934
  margin: 0;
3910
- letter-spacing: -0.01em;
3935
+ letter-spacing: -0.02em;
3911
3936
  }
3912
3937
 
3913
3938
  .modal-logo {
@@ -3920,7 +3945,7 @@ const modalLayoutStyles = i$4 `
3920
3945
  width: 28px;
3921
3946
  height: 28px;
3922
3947
  border-radius: 8px;
3923
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
3948
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
3924
3949
  display: flex;
3925
3950
  align-items: center;
3926
3951
  justify-content: center;
@@ -3935,13 +3960,13 @@ const modalLayoutStyles = i$4 `
3935
3960
  .logo-text {
3936
3961
  font-size: 17px;
3937
3962
  font-weight: 500;
3938
- color: white;
3963
+ color: #171717;
3939
3964
  letter-spacing: -0.02em;
3940
3965
  }
3941
3966
 
3942
3967
  .logo-os {
3943
3968
  font-weight: 700;
3944
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
3969
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
3945
3970
  -webkit-background-clip: text;
3946
3971
  -webkit-text-fill-color: transparent;
3947
3972
  background-clip: text;
@@ -3957,13 +3982,22 @@ const modalLayoutStyles = i$4 `
3957
3982
  display: flex;
3958
3983
  align-items: center;
3959
3984
  justify-content: center;
3960
- color: rgba(255, 255, 255, 0.5);
3985
+ color: #737373;
3961
3986
  transition: all 0.15s ease;
3962
3987
  }
3963
3988
 
3964
3989
  .close-button:hover {
3965
- background: rgba(255, 255, 255, 0.08);
3966
- color: white;
3990
+ background: #f5f5f4;
3991
+ color: #171717;
3992
+ }
3993
+
3994
+ .close-button:focus {
3995
+ outline: none;
3996
+ box-shadow: 0 0 0 2px #0d9488, 0 0 0 4px rgba(13, 148, 136, 0.2);
3997
+ }
3998
+
3999
+ .close-button:active {
4000
+ transform: scale(0.95);
3967
4001
  }
3968
4002
 
3969
4003
  .modal-body {
@@ -3975,8 +4009,8 @@ const modalLayoutStyles = i$4 `
3975
4009
  .sidebar {
3976
4010
  width: 110px;
3977
4011
  flex-shrink: 0;
3978
- background: rgba(0, 0, 0, 0.25);
3979
- border-right: 1px solid rgba(255, 255, 255, 0.06);
4012
+ background: #fafaf9;
4013
+ border-right: 1px solid #e5e5e5;
3980
4014
  padding: 12px 8px;
3981
4015
  display: flex;
3982
4016
  flex-direction: column;
@@ -4005,19 +4039,25 @@ const modalLayoutStyles = i$4 `
4005
4039
  border-radius: 10px;
4006
4040
  background: transparent;
4007
4041
  cursor: pointer;
4008
- color: rgba(255, 255, 255, 0.5);
4042
+ color: #525252;
4009
4043
  transition: all 0.15s ease;
4010
4044
  position: relative;
4011
4045
  }
4012
4046
 
4013
4047
  .sidebar-item:hover {
4014
- background: rgba(255, 255, 255, 0.05);
4015
- color: rgba(255, 255, 255, 0.8);
4048
+ background: #ffffff;
4049
+ color: #171717;
4050
+ }
4051
+
4052
+ .sidebar-item:focus {
4053
+ outline: none;
4054
+ box-shadow: inset 0 0 0 2px rgba(13, 148, 136, 0.4);
4016
4055
  }
4017
4056
 
4018
4057
  .sidebar-item.active {
4019
- background: rgba(16, 185, 129, 0.12);
4020
- color: #34d399;
4058
+ background: rgba(15, 118, 110, 0.12);
4059
+ color: #0f766e;
4060
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
4021
4061
  }
4022
4062
 
4023
4063
  .sidebar-item.active::before {
@@ -4028,7 +4068,7 @@ const modalLayoutStyles = i$4 `
4028
4068
  transform: translateY(-50%);
4029
4069
  width: 3px;
4030
4070
  height: 24px;
4031
- background: #34d399;
4071
+ background: #0f766e;
4032
4072
  border-radius: 0 3px 3px 0;
4033
4073
  }
4034
4074
 
@@ -4071,14 +4111,14 @@ const tabContentStyles = i$4 `
4071
4111
  .section-title {
4072
4112
  font-size: 15px;
4073
4113
  font-weight: 600;
4074
- color: white;
4114
+ color: #171717;
4075
4115
  margin: 0 0 6px 0;
4076
- letter-spacing: -0.01em;
4116
+ letter-spacing: -0.02em;
4077
4117
  }
4078
4118
 
4079
4119
  .section-description {
4080
4120
  font-size: 13px;
4081
- color: rgba(255, 255, 255, 0.5);
4121
+ color: #525252;
4082
4122
  line-height: 1.5;
4083
4123
  margin: 0;
4084
4124
  }
@@ -4086,7 +4126,7 @@ const tabContentStyles = i$4 `
4086
4126
  .empty-state {
4087
4127
  text-align: center;
4088
4128
  padding: 40px 20px;
4089
- color: rgba(255, 255, 255, 0.5);
4129
+ color: #737373;
4090
4130
  }
4091
4131
 
4092
4132
  .empty-state-icon {
@@ -4098,7 +4138,7 @@ const tabContentStyles = i$4 `
4098
4138
  font-size: 15px;
4099
4139
  font-weight: 500;
4100
4140
  margin-bottom: 8px;
4101
- color: rgba(255, 255, 255, 0.7);
4141
+ color: #525252;
4102
4142
  }
4103
4143
 
4104
4144
  .empty-state-text {
@@ -4116,7 +4156,7 @@ const tabContentStyles = i$4 `
4116
4156
  display: flex;
4117
4157
  align-items: center;
4118
4158
  justify-content: center;
4119
- color: rgba(255, 255, 255, 0.35);
4159
+ color: #737373;
4120
4160
  transition: all 0.15s ease;
4121
4161
  }
4122
4162
 
@@ -4154,20 +4194,30 @@ const formStyles = i$4 `
4154
4194
  align-items: center;
4155
4195
  gap: 6px;
4156
4196
  padding: 10px 16px;
4157
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
4197
+ background: #0d9488;
4158
4198
  border: none;
4159
4199
  border-radius: 8px;
4160
4200
  color: white;
4161
4201
  font-size: 13px;
4162
4202
  font-weight: 600;
4203
+ letter-spacing: 0.01em;
4163
4204
  cursor: pointer;
4164
- transition: all 0.2s ease;
4165
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
4205
+ transition: all 0.15s ease;
4206
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
4166
4207
  }
4167
4208
 
4168
4209
  .add-button:hover:not(:disabled) {
4169
- transform: translateY(-1px);
4170
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
4210
+ background: #0f766e;
4211
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
4212
+ }
4213
+
4214
+ .add-button:focus:not(:disabled) {
4215
+ outline: none;
4216
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
4217
+ }
4218
+
4219
+ .add-button:active:not(:disabled) {
4220
+ transform: scale(0.98);
4171
4221
  }
4172
4222
 
4173
4223
  .add-button:disabled {
@@ -4178,7 +4228,7 @@ const formStyles = i$4 `
4178
4228
 
4179
4229
  .count-badge {
4180
4230
  font-size: 12px;
4181
- color: rgba(255, 255, 255, 0.45);
4231
+ color: #737373;
4182
4232
  font-weight: 500;
4183
4233
  }
4184
4234
 
@@ -4190,11 +4240,12 @@ const formStyles = i$4 `
4190
4240
  }
4191
4241
 
4192
4242
  .add-form {
4193
- background: rgba(255, 255, 255, 0.04);
4194
- border: 1px solid rgba(255, 255, 255, 0.08);
4243
+ background: #ffffff;
4244
+ border: 1px solid #e5e5e5;
4195
4245
  border-radius: 12px;
4196
4246
  padding: 16px;
4197
4247
  margin-bottom: 16px;
4248
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
4198
4249
  }
4199
4250
 
4200
4251
  .form-group {
@@ -4209,7 +4260,7 @@ const formStyles = i$4 `
4209
4260
  display: block;
4210
4261
  font-size: 12px;
4211
4262
  font-weight: 600;
4212
- color: rgba(255, 255, 255, 0.7);
4263
+ color: #525252;
4213
4264
  margin-bottom: 8px;
4214
4265
  text-transform: uppercase;
4215
4266
  letter-spacing: 0.04em;
@@ -4218,10 +4269,10 @@ const formStyles = i$4 `
4218
4269
  .form-input {
4219
4270
  width: 100%;
4220
4271
  padding: 12px 14px;
4221
- background: rgba(0, 0, 0, 0.3);
4222
- border: 1px solid rgba(255, 255, 255, 0.08);
4272
+ background: #ffffff;
4273
+ border: 1px solid #d4d4d4;
4223
4274
  border-radius: 8px;
4224
- color: white;
4275
+ color: #171717;
4225
4276
  font-size: 14px;
4226
4277
  font-family: inherit;
4227
4278
  transition: all 0.15s ease;
@@ -4230,12 +4281,12 @@ const formStyles = i$4 `
4230
4281
 
4231
4282
  .form-input:focus {
4232
4283
  outline: none;
4233
- border-color: #34d399;
4234
- box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);
4284
+ border-color: #0d9488;
4285
+ box-shadow: 0 0 0 3px rgba(13, 148, 136, 0.15);
4235
4286
  }
4236
4287
 
4237
4288
  .form-input::placeholder {
4238
- color: rgba(255, 255, 255, 0.3);
4289
+ color: #a3a3a3;
4239
4290
  }
4240
4291
 
4241
4292
  .form-input.error {
@@ -4259,7 +4310,7 @@ const formStyles = i$4 `
4259
4310
 
4260
4311
  .char-count {
4261
4312
  font-size: 11px;
4262
- color: rgba(255, 255, 255, 0.4);
4313
+ color: #737373;
4263
4314
  font-variant-numeric: tabular-nums;
4264
4315
  }
4265
4316
 
@@ -4293,26 +4344,35 @@ const formStyles = i$4 `
4293
4344
  }
4294
4345
 
4295
4346
  .form-btn.cancel {
4296
- background: transparent;
4297
- border: 1px solid rgba(255, 255, 255, 0.15);
4298
- color: rgba(255, 255, 255, 0.7);
4347
+ background: #ffffff;
4348
+ border: 1px solid #d4d4d4;
4349
+ color: #525252;
4299
4350
  }
4300
4351
 
4301
4352
  .form-btn.cancel:hover {
4302
- background: rgba(255, 255, 255, 0.05);
4303
- border-color: rgba(255, 255, 255, 0.25);
4353
+ background: #fafaf9;
4354
+ border-color: #a3a3a3;
4304
4355
  }
4305
4356
 
4306
4357
  .form-btn.save {
4307
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
4358
+ background: #0d9488;
4308
4359
  border: none;
4309
4360
  color: white;
4310
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
4361
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
4311
4362
  }
4312
4363
 
4313
4364
  .form-btn.save:hover:not(:disabled) {
4314
- transform: translateY(-1px);
4315
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
4365
+ background: #0f766e;
4366
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
4367
+ }
4368
+
4369
+ .form-btn.save:focus:not(:disabled) {
4370
+ outline: none;
4371
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
4372
+ }
4373
+
4374
+ .form-btn.save:active:not(:disabled) {
4375
+ transform: scale(0.98);
4316
4376
  }
4317
4377
 
4318
4378
  .form-btn.save:disabled {
@@ -4346,16 +4406,17 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4346
4406
  }
4347
4407
 
4348
4408
  .transcript-item {
4349
- background: rgba(255, 255, 255, 0.04);
4350
- border: 1px solid rgba(255, 255, 255, 0.06);
4409
+ background: #ffffff;
4410
+ border: 1px solid #e5e5e5;
4351
4411
  border-radius: 10px;
4352
4412
  padding: 12px 14px;
4353
4413
  transition: all 0.15s ease;
4414
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
4354
4415
  }
4355
4416
 
4356
4417
  .transcript-item:hover {
4357
- background: rgba(255, 255, 255, 0.06);
4358
- border-color: rgba(255, 255, 255, 0.1);
4418
+ border-color: #d4d4d4;
4419
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
4359
4420
  }
4360
4421
 
4361
4422
  .transcript-header {
@@ -4378,28 +4439,28 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4378
4439
  }
4379
4440
 
4380
4441
  .transcript-badge.dictate {
4381
- background: rgba(16, 185, 129, 0.15);
4382
- color: #34d399;
4442
+ background: rgba(13, 148, 136, 0.18);
4443
+ color: #0f766e;
4383
4444
  }
4384
4445
 
4385
4446
  .transcript-badge.edit {
4386
- background: rgba(139, 92, 246, 0.15);
4387
- color: #a78bfa;
4447
+ background: rgba(139, 92, 246, 0.18);
4448
+ color: #7c3aed;
4388
4449
  }
4389
4450
 
4390
4451
  .transcript-badge.command {
4391
- background: rgba(245, 158, 11, 0.15);
4392
- color: #fbbf24;
4452
+ background: rgba(245, 158, 11, 0.18);
4453
+ color: #b45309;
4393
4454
  }
4394
4455
 
4395
4456
  .transcript-time {
4396
4457
  font-size: 12px;
4397
- color: rgba(255, 255, 255, 0.35);
4458
+ color: #737373;
4398
4459
  }
4399
4460
 
4400
4461
  .transcript-text {
4401
4462
  font-size: 14px;
4402
- color: rgba(255, 255, 255, 0.85);
4463
+ color: #171717;
4403
4464
  line-height: 1.5;
4404
4465
  word-break: break-word;
4405
4466
  display: -webkit-box;
@@ -4414,7 +4475,7 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4414
4475
  gap: 8px;
4415
4476
  margin-top: 10px;
4416
4477
  padding-top: 10px;
4417
- border-top: 1px solid rgba(255, 255, 255, 0.06);
4478
+ border-top: 1px solid #e5e5e5;
4418
4479
  }
4419
4480
 
4420
4481
  .transcript-action-btn {
@@ -4423,23 +4484,23 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4423
4484
  gap: 6px;
4424
4485
  padding: 6px 10px;
4425
4486
  border-radius: 6px;
4426
- background: rgba(255, 255, 255, 0.06);
4487
+ background: rgba(0, 0, 0, 0.08);
4427
4488
  border: none;
4428
4489
  cursor: pointer;
4429
4490
  font-size: 12px;
4430
4491
  font-weight: 500;
4431
- color: rgba(255, 255, 255, 0.6);
4492
+ color: #404040;
4432
4493
  transition: all 0.15s ease;
4433
4494
  }
4434
4495
 
4435
4496
  .transcript-action-btn:hover {
4436
- background: rgba(255, 255, 255, 0.1);
4437
- color: rgba(255, 255, 255, 0.9);
4497
+ background: rgba(0, 0, 0, 0.12);
4498
+ color: #171717;
4438
4499
  }
4439
4500
 
4440
4501
  .transcript-action-btn.copied {
4441
- background: rgba(16, 185, 129, 0.2);
4442
- color: #34d399;
4502
+ background: rgba(13, 148, 136, 0.2);
4503
+ color: #0d9488;
4443
4504
  }
4444
4505
 
4445
4506
  .transcript-action-btn.delete:hover {
@@ -4453,9 +4514,9 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4453
4514
  margin-top: 16px;
4454
4515
  padding: 10px;
4455
4516
  background: rgba(239, 68, 68, 0.1);
4456
- border: 1px solid rgba(239, 68, 68, 0.15);
4517
+ border: 1px solid rgba(239, 68, 68, 0.2);
4457
4518
  border-radius: 8px;
4458
- color: #f87171;
4519
+ color: #dc2626;
4459
4520
  font-size: 13px;
4460
4521
  font-weight: 500;
4461
4522
  cursor: pointer;
@@ -4464,18 +4525,18 @@ let SpeechOSHistoryTab = class SpeechOSHistoryTab extends i$1 {
4464
4525
 
4465
4526
  .clear-all-button:hover {
4466
4527
  background: rgba(239, 68, 68, 0.18);
4467
- border-color: rgba(239, 68, 68, 0.25);
4528
+ border-color: rgba(239, 68, 68, 0.3);
4468
4529
  }
4469
4530
 
4470
4531
  .command-matched {
4471
4532
  font-size: 12px;
4472
- color: rgba(255, 255, 255, 0.5);
4533
+ color: #525252;
4473
4534
  margin-top: 6px;
4474
4535
  }
4475
4536
 
4476
4537
  .command-matched code {
4477
4538
  background: rgba(245, 158, 11, 0.15);
4478
- color: #fbbf24;
4539
+ color: #d97706;
4479
4540
  padding: 2px 6px;
4480
4541
  border-radius: 4px;
4481
4542
  font-family: monospace;
@@ -4663,21 +4724,21 @@ let SpeechOSHelpTab = class SpeechOSHelpTab extends i$1 {
4663
4724
  gap: 8px;
4664
4725
  font-size: 15px;
4665
4726
  font-weight: 600;
4666
- color: white;
4727
+ color: #171717;
4667
4728
  margin-bottom: 10px;
4668
4729
  }
4669
4730
 
4670
4731
  .help-title.dictate {
4671
- color: #34d399;
4732
+ color: #0f766e;
4672
4733
  }
4673
4734
 
4674
4735
  .help-title.edit {
4675
- color: #a78bfa;
4736
+ color: #7c3aed;
4676
4737
  }
4677
4738
 
4678
4739
  .help-text {
4679
4740
  font-size: 13px;
4680
- color: rgba(255, 255, 255, 0.6);
4741
+ color: #525252;
4681
4742
  line-height: 1.6;
4682
4743
  margin-bottom: 10px;
4683
4744
  }
@@ -4694,17 +4755,17 @@ let SpeechOSHelpTab = class SpeechOSHelpTab extends i$1 {
4694
4755
  }
4695
4756
 
4696
4757
  .help-example {
4697
- background: rgba(255, 255, 255, 0.04);
4698
- border: 1px solid rgba(255, 255, 255, 0.06);
4758
+ background: #ffffff;
4759
+ border: 1px solid #e5e5e5;
4699
4760
  border-radius: 6px;
4700
4761
  padding: 8px 12px;
4701
4762
  font-size: 12px;
4702
- color: rgba(255, 255, 255, 0.5);
4763
+ color: #525252;
4703
4764
  font-style: italic;
4704
4765
  }
4705
4766
 
4706
4767
  .help-title.languages {
4707
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
4768
+ background: linear-gradient(135deg, #0f766e 0%, #1d4ed8 100%);
4708
4769
  -webkit-background-clip: text;
4709
4770
  -webkit-text-fill-color: transparent;
4710
4771
  background-clip: text;
@@ -4782,7 +4843,7 @@ let SpeechOSAboutTab = class SpeechOSAboutTab extends i$1 {
4782
4843
  width: 36px;
4783
4844
  height: 36px;
4784
4845
  border-radius: 10px;
4785
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
4846
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
4786
4847
  display: flex;
4787
4848
  align-items: center;
4788
4849
  justify-content: center;
@@ -4797,13 +4858,13 @@ let SpeechOSAboutTab = class SpeechOSAboutTab extends i$1 {
4797
4858
  .about-logo-text {
4798
4859
  font-size: 22px;
4799
4860
  font-weight: 500;
4800
- color: white;
4861
+ color: #171717;
4801
4862
  letter-spacing: -0.02em;
4802
4863
  }
4803
4864
 
4804
4865
  .logo-os {
4805
4866
  font-weight: 700;
4806
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
4867
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
4807
4868
  -webkit-background-clip: text;
4808
4869
  -webkit-text-fill-color: transparent;
4809
4870
  background-clip: text;
@@ -4811,7 +4872,7 @@ let SpeechOSAboutTab = class SpeechOSAboutTab extends i$1 {
4811
4872
 
4812
4873
  .about-description {
4813
4874
  font-size: 14px;
4814
- color: rgba(255, 255, 255, 0.65);
4875
+ color: #525252;
4815
4876
  line-height: 1.7;
4816
4877
  margin-bottom: 24px;
4817
4878
  }
@@ -4829,19 +4890,29 @@ let SpeechOSAboutTab = class SpeechOSAboutTab extends i$1 {
4829
4890
  align-items: center;
4830
4891
  gap: 8px;
4831
4892
  padding: 12px 18px;
4832
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
4893
+ background: #0d9488;
4833
4894
  border-radius: 10px;
4834
4895
  color: white;
4835
4896
  font-size: 14px;
4836
4897
  font-weight: 600;
4898
+ letter-spacing: 0.01em;
4837
4899
  text-decoration: none;
4838
- transition: all 0.2s ease;
4839
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.25);
4900
+ transition: all 0.15s ease;
4901
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
4840
4902
  }
4841
4903
 
4842
4904
  .about-link:hover {
4843
- transform: translateY(-1px);
4844
- box-shadow: 0 6px 16px rgba(16, 185, 129, 0.35);
4905
+ background: #0f766e;
4906
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
4907
+ }
4908
+
4909
+ .about-link:focus {
4910
+ outline: none;
4911
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
4912
+ }
4913
+
4914
+ .about-link:active {
4915
+ transform: scale(0.98);
4845
4916
  }
4846
4917
  `,
4847
4918
  ]; }
@@ -4921,20 +4992,21 @@ let SpeechOSAudioLevelMeter = class SpeechOSAudioLevelMeter extends i$1 {
4921
4992
  gap: 3px;
4922
4993
  height: 32px;
4923
4994
  padding: 8px 12px;
4924
- background: rgba(0, 0, 0, 0.2);
4995
+ background: #ffffff;
4996
+ border: 2px solid #e5e5e5;
4925
4997
  border-radius: 8px;
4926
4998
  }
4927
4999
 
4928
5000
  .meter-bar {
4929
5001
  width: 6px;
4930
5002
  min-height: 4px;
4931
- background: rgba(255, 255, 255, 0.2);
5003
+ background: #d4d4d4;
4932
5004
  border-radius: 2px;
4933
5005
  transition: height 50ms ease-out, background 100ms ease;
4934
5006
  }
4935
5007
 
4936
5008
  .meter-bar.active {
4937
- background: var(--speechos-primary);
5009
+ background: #10b981;
4938
5010
  }
4939
5011
 
4940
5012
  .meter-inactive {
@@ -4943,14 +5015,15 @@ let SpeechOSAudioLevelMeter = class SpeechOSAudioLevelMeter extends i$1 {
4943
5015
  justify-content: center;
4944
5016
  height: 32px;
4945
5017
  padding: 8px 12px;
4946
- background: rgba(0, 0, 0, 0.2);
5018
+ background: #ffffff;
5019
+ border: 2px solid #e5e5e5;
4947
5020
  border-radius: 8px;
4948
- color: rgba(255, 255, 255, 0.4);
5021
+ color: #737373;
4949
5022
  font-size: 13px;
4950
5023
  }
4951
5024
 
4952
5025
  .meter-error {
4953
- color: #f87171;
5026
+ color: #dc2626;
4954
5027
  }
4955
5028
  `,
4956
5029
  ]; }
@@ -5147,18 +5220,18 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5147
5220
  }
5148
5221
 
5149
5222
  .settings-section-icon {
5150
- color: #34d399;
5223
+ color: #0d9488;
5151
5224
  }
5152
5225
 
5153
5226
  .settings-section-title {
5154
5227
  font-size: 14px;
5155
5228
  font-weight: 600;
5156
- color: white;
5229
+ color: #171717;
5157
5230
  }
5158
5231
 
5159
5232
  .settings-section-description {
5160
5233
  font-size: 13px;
5161
- color: rgba(255, 255, 255, 0.45);
5234
+ color: #525252;
5162
5235
  line-height: 1.5;
5163
5236
  margin-bottom: 14px;
5164
5237
  }
@@ -5187,10 +5260,10 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5187
5260
  .settings-select {
5188
5261
  width: 100%;
5189
5262
  padding: 12px 40px 12px 14px;
5190
- background: rgba(0, 0, 0, 0.3);
5191
- border: 1px solid rgba(255, 255, 255, 0.08);
5263
+ background: #ffffff;
5264
+ border: 1px solid #d4d4d4;
5192
5265
  border-radius: 10px;
5193
- color: white;
5266
+ color: #171717;
5194
5267
  font-size: 14px;
5195
5268
  font-family: inherit;
5196
5269
  cursor: pointer;
@@ -5200,34 +5273,44 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5200
5273
  }
5201
5274
 
5202
5275
  .settings-select:hover {
5203
- border-color: rgba(255, 255, 255, 0.15);
5204
- background: rgba(0, 0, 0, 0.4);
5276
+ border-color: #a3a3a3;
5277
+ background: #ffffff;
5205
5278
  }
5206
5279
 
5207
5280
  .settings-select:focus {
5208
5281
  outline: none;
5209
- border-color: #34d399;
5210
- box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.15);
5282
+ border-color: #0d9488;
5283
+ box-shadow: 0 0 0 3px rgba(13, 148, 136, 0.15);
5211
5284
  }
5212
5285
 
5213
5286
  .settings-select option {
5214
- background: #1a1d24;
5215
- color: white;
5287
+ background: #ffffff;
5288
+ color: #171717;
5216
5289
  padding: 8px;
5217
5290
  }
5218
5291
 
5292
+ .settings-select:disabled {
5293
+ opacity: 0.4;
5294
+ cursor: not-allowed;
5295
+ }
5296
+
5297
+ .settings-select:disabled:hover {
5298
+ border-color: #d4d4d4;
5299
+ background: #ffffff;
5300
+ }
5301
+
5219
5302
  .settings-select-arrow {
5220
5303
  position: absolute;
5221
5304
  right: 14px;
5222
5305
  top: 50%;
5223
5306
  transform: translateY(-50%);
5224
5307
  pointer-events: none;
5225
- color: rgba(255, 255, 255, 0.4);
5308
+ color: #737373;
5226
5309
  }
5227
5310
 
5228
5311
  .settings-permission-note {
5229
5312
  font-size: 12px;
5230
- color: rgba(255, 255, 255, 0.4);
5313
+ color: #737373;
5231
5314
  margin-top: 10px;
5232
5315
  font-style: italic;
5233
5316
  }
@@ -5237,7 +5320,7 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5237
5320
  align-items: center;
5238
5321
  gap: 4px;
5239
5322
  font-size: 11px;
5240
- color: #34d399;
5323
+ color: #059669;
5241
5324
  font-weight: 500;
5242
5325
  opacity: 0;
5243
5326
  transition: opacity 0.2s ease;
@@ -5253,28 +5336,34 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5253
5336
  align-items: center;
5254
5337
  justify-content: space-between;
5255
5338
  padding: 12px 14px;
5256
- background: rgba(0, 0, 0, 0.3);
5257
- border: 1px solid rgba(255, 255, 255, 0.08);
5339
+ background: #ffffff;
5340
+ border: 1px solid #e5e5e5;
5258
5341
  border-radius: 10px;
5342
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
5259
5343
  }
5260
5344
 
5261
5345
  .settings-toggle-label {
5262
5346
  font-size: 14px;
5263
- color: white;
5347
+ color: #171717;
5264
5348
  }
5265
5349
 
5266
5350
  .settings-toggle {
5267
5351
  position: relative;
5268
5352
  width: 44px;
5269
5353
  height: 24px;
5270
- background: rgba(255, 255, 255, 0.1);
5354
+ background: #d4d4d4;
5271
5355
  border-radius: 12px;
5272
5356
  cursor: pointer;
5273
5357
  transition: background 0.2s ease;
5274
5358
  }
5275
5359
 
5276
5360
  .settings-toggle.active {
5277
- background: #34d399;
5361
+ background: #0d9488;
5362
+ }
5363
+
5364
+ .settings-toggle:focus {
5365
+ outline: none;
5366
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
5278
5367
  }
5279
5368
 
5280
5369
  .settings-toggle-knob {
@@ -5397,13 +5486,14 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5397
5486
  setSmartFormatEnabled(this.smartFormatEnabled);
5398
5487
  this.showSaved();
5399
5488
  }
5400
- renderLanguageSelector(selectedCode, onChange) {
5489
+ renderLanguageSelector(selectedCode, onChange, disabled = false) {
5401
5490
  return b `
5402
5491
  <div class="settings-select-wrapper">
5403
5492
  <select
5404
5493
  class="settings-select"
5405
5494
  .value="${selectedCode}"
5406
5495
  @change="${onChange}"
5496
+ ?disabled="${disabled}"
5407
5497
  >
5408
5498
  ${SUPPORTED_LANGUAGES.map((lang) => b `
5409
5499
  <option
@@ -5521,7 +5611,7 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5521
5611
  <div class="settings-section-description">
5522
5612
  AI automatically removes filler words, adds punctuation, and polishes
5523
5613
  your text. Disable for raw transcription output. Note: disabling also
5524
- turns off text snippets.
5614
+ turns off text snippets and output language translation.
5525
5615
  </div>
5526
5616
  <div class="settings-toggle-row">
5527
5617
  <span class="settings-toggle-label">Enable AI formatting</span>
@@ -5562,9 +5652,13 @@ let SpeechOSSettingsTab = class SpeechOSSettingsTab extends i$1 {
5562
5652
  </div>
5563
5653
  <div class="settings-section-description">
5564
5654
  The language for your transcribed text. Usually the same as input, but
5565
- can differ for translation.
5655
+ can differ for translation.${!this.smartFormatEnabled
5656
+ ? " Requires Smart Format to be enabled."
5657
+ : ""}
5566
5658
  </div>
5567
- ${this.renderLanguageSelector(this.selectedOutputLanguageCode, this.handleOutputLanguageChange.bind(this))}
5659
+ ${this.renderLanguageSelector(this.smartFormatEnabled
5660
+ ? this.selectedOutputLanguageCode
5661
+ : this.selectedInputLanguageCode, this.handleOutputLanguageChange.bind(this), !this.smartFormatEnabled)}
5568
5662
  </div>
5569
5663
  `;
5570
5664
  }
@@ -5627,17 +5721,18 @@ let SpeechOSSnippetsTab = class SpeechOSSnippetsTab extends i$1 {
5627
5721
  }
5628
5722
 
5629
5723
  .snippet-item {
5630
- background: rgba(255, 255, 255, 0.04);
5631
- border: 1px solid rgba(255, 255, 255, 0.06);
5724
+ background: #ffffff;
5725
+ border: 1px solid #e5e5e5;
5632
5726
  border-radius: 10px;
5633
5727
  padding: 14px;
5634
5728
  transition: all 0.15s ease;
5635
5729
  position: relative;
5730
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
5636
5731
  }
5637
5732
 
5638
5733
  .snippet-item:hover {
5639
- background: rgba(255, 255, 255, 0.06);
5640
- border-color: rgba(255, 255, 255, 0.1);
5734
+ border-color: #d4d4d4;
5735
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
5641
5736
  }
5642
5737
 
5643
5738
  .snippet-trigger {
@@ -5650,7 +5745,7 @@ let SpeechOSSnippetsTab = class SpeechOSSnippetsTab extends i$1 {
5650
5745
  .snippet-trigger-text {
5651
5746
  font-size: 14px;
5652
5747
  font-weight: 600;
5653
- color: #34d399;
5748
+ color: #0d9488;
5654
5749
  }
5655
5750
 
5656
5751
  .snippet-trigger-text::before {
@@ -5668,12 +5763,12 @@ let SpeechOSSnippetsTab = class SpeechOSSnippetsTab extends i$1 {
5668
5763
  align-items: flex-start;
5669
5764
  gap: 8px;
5670
5765
  font-size: 13px;
5671
- color: rgba(255, 255, 255, 0.65);
5766
+ color: #525252;
5672
5767
  line-height: 1.5;
5673
5768
  }
5674
5769
 
5675
5770
  .snippet-expansion-arrow {
5676
- color: rgba(255, 255, 255, 0.3);
5771
+ color: #a3a3a3;
5677
5772
  flex-shrink: 0;
5678
5773
  margin-top: 2px;
5679
5774
  }
@@ -5702,13 +5797,13 @@ let SpeechOSSnippetsTab = class SpeechOSSnippetsTab extends i$1 {
5702
5797
  display: flex;
5703
5798
  align-items: center;
5704
5799
  justify-content: center;
5705
- color: rgba(255, 255, 255, 0.4);
5800
+ color: #737373;
5706
5801
  transition: all 0.15s ease;
5707
5802
  }
5708
5803
 
5709
5804
  .edit-btn:hover {
5710
- background: rgba(52, 211, 153, 0.15);
5711
- color: #34d399;
5805
+ background: rgba(13, 148, 136, 0.1);
5806
+ color: #0d9488;
5712
5807
  }
5713
5808
  `,
5714
5809
  ]; }
@@ -5991,30 +6086,32 @@ let SpeechOSVocabularyTab = class SpeechOSVocabularyTab extends i$1 {
5991
6086
  gap: 8px;
5992
6087
  padding: 8px 12px;
5993
6088
  background: rgba(139, 92, 246, 0.1);
5994
- border: 1px solid rgba(139, 92, 246, 0.2);
6089
+ border: 1px solid rgba(139, 92, 246, 0.25);
5995
6090
  border-radius: 8px;
5996
6091
  transition: all 0.15s ease;
5997
6092
  }
5998
6093
 
5999
6094
  .vocabulary-chip:hover {
6000
6095
  background: rgba(139, 92, 246, 0.15);
6001
- border-color: rgba(139, 92, 246, 0.3);
6096
+ border-color: rgba(139, 92, 246, 0.35);
6002
6097
  }
6003
6098
 
6004
6099
  .vocabulary-chip-text {
6005
6100
  font-size: 13px;
6006
6101
  font-weight: 500;
6007
- color: #c4b5fd;
6102
+ color: #7c3aed;
6008
6103
  }
6009
6104
 
6010
6105
  .vocabulary-chip .delete-btn {
6011
6106
  width: 20px;
6012
6107
  height: 20px;
6013
6108
  margin: -4px -4px -4px 0;
6109
+ color: #737373;
6014
6110
  }
6015
6111
 
6016
6112
  .vocabulary-chip .delete-btn:hover {
6017
6113
  background: rgba(239, 68, 68, 0.2);
6114
+ color: #f87171;
6018
6115
  }
6019
6116
  `,
6020
6117
  ]; }
@@ -6415,14 +6512,14 @@ const popupModalStyles = i$4 `
6415
6512
  }
6416
6513
 
6417
6514
  .modal-card {
6418
- background: #1a1d24;
6515
+ background: #f5f5f4;
6419
6516
  border-radius: 16px;
6420
6517
  width: 90%;
6421
6518
  max-width: 400px;
6422
6519
  display: flex;
6423
6520
  flex-direction: column;
6424
- box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),
6425
- 0 0 0 1px rgba(255, 255, 255, 0.05);
6521
+ box-shadow: 0 24px 48px rgba(0, 0, 0, 0.15),
6522
+ 0 0 0 1px rgba(0, 0, 0, 0.05);
6426
6523
  transform: scale(0.95) translateY(10px);
6427
6524
  transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
6428
6525
  pointer-events: auto;
@@ -6438,14 +6535,14 @@ const popupModalStyles = i$4 `
6438
6535
  align-items: center;
6439
6536
  justify-content: space-between;
6440
6537
  padding: 16px 20px;
6441
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
6442
- background: rgba(0, 0, 0, 0.2);
6538
+ border-bottom: 1px solid #e5e5e5;
6539
+ background: #ffffff;
6443
6540
  }
6444
6541
 
6445
6542
  .modal-title {
6446
6543
  font-size: 16px;
6447
6544
  font-weight: 600;
6448
- color: white;
6545
+ color: #171717;
6449
6546
  margin: 0;
6450
6547
  letter-spacing: -0.01em;
6451
6548
  }
@@ -6460,13 +6557,22 @@ const popupModalStyles = i$4 `
6460
6557
  display: flex;
6461
6558
  align-items: center;
6462
6559
  justify-content: center;
6463
- color: rgba(255, 255, 255, 0.5);
6560
+ color: #737373;
6464
6561
  transition: all 0.15s ease;
6465
6562
  }
6466
6563
 
6467
6564
  .close-button:hover {
6468
- background: rgba(255, 255, 255, 0.08);
6469
- color: white;
6565
+ background: #f5f5f4;
6566
+ color: #171717;
6567
+ }
6568
+
6569
+ .close-button:focus {
6570
+ outline: none;
6571
+ box-shadow: 0 0 0 2px #0d9488, 0 0 0 4px rgba(13, 148, 136, 0.2);
6572
+ }
6573
+
6574
+ .close-button:active {
6575
+ transform: scale(0.95);
6470
6576
  }
6471
6577
 
6472
6578
  .modal-body {
@@ -6478,8 +6584,8 @@ const popupModalStyles = i$4 `
6478
6584
  justify-content: flex-end;
6479
6585
  gap: 10px;
6480
6586
  padding: 16px 20px;
6481
- border-top: 1px solid rgba(255, 255, 255, 0.06);
6482
- background: rgba(0, 0, 0, 0.1);
6587
+ border-top: 1px solid #e5e5e5;
6588
+ background: #ffffff;
6483
6589
  }
6484
6590
 
6485
6591
  .btn {
@@ -6496,42 +6602,47 @@ const popupModalStyles = i$4 `
6496
6602
  }
6497
6603
 
6498
6604
  .btn-secondary {
6499
- background: rgba(255, 255, 255, 0.08);
6500
- color: rgba(255, 255, 255, 0.8);
6605
+ background: rgba(0, 0, 0, 0.08);
6606
+ color: #525252;
6501
6607
  }
6502
6608
 
6503
6609
  .btn-secondary:hover {
6504
- background: rgba(255, 255, 255, 0.12);
6505
- color: white;
6610
+ background: rgba(0, 0, 0, 0.12);
6611
+ color: #171717;
6506
6612
  }
6507
6613
 
6508
6614
  .btn-primary {
6509
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
6615
+ background: #0d9488;
6510
6616
  color: white;
6511
- box-shadow: 0 2px 8px rgba(16, 185, 129, 0.2);
6617
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
6512
6618
  }
6513
6619
 
6514
6620
  .btn-primary:hover {
6515
- transform: translateY(-1px);
6516
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
6621
+ background: #0f766e;
6622
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
6623
+ }
6624
+
6625
+ .btn-primary:focus {
6626
+ outline: none;
6627
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
6517
6628
  }
6518
6629
 
6519
6630
  .btn-primary:active {
6520
- transform: translateY(0);
6631
+ transform: scale(0.98);
6521
6632
  }
6522
6633
 
6523
6634
  /* Success state for copy button */
6524
6635
  .btn-success {
6525
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
6636
+ background: #059669;
6526
6637
  }
6527
6638
 
6528
6639
  /* Text display area */
6529
6640
  .text-display {
6530
- background: rgba(0, 0, 0, 0.3);
6531
- border: 1px solid rgba(255, 255, 255, 0.08);
6641
+ background: #ffffff;
6642
+ border: 1px solid #e5e5e5;
6532
6643
  border-radius: 10px;
6533
6644
  padding: 14px 16px;
6534
- color: white;
6645
+ color: #171717;
6535
6646
  font-size: 14px;
6536
6647
  line-height: 1.5;
6537
6648
  max-height: 200px;
@@ -6550,12 +6661,12 @@ const popupModalStyles = i$4 `
6550
6661
  }
6551
6662
 
6552
6663
  .text-display::-webkit-scrollbar-thumb {
6553
- background: rgba(255, 255, 255, 0.15);
6664
+ background: rgba(0, 0, 0, 0.15);
6554
6665
  border-radius: 3px;
6555
6666
  }
6556
6667
 
6557
6668
  .text-display::-webkit-scrollbar-thumb:hover {
6558
- background: rgba(255, 255, 255, 0.25);
6669
+ background: rgba(0, 0, 0, 0.25);
6559
6670
  }
6560
6671
 
6561
6672
  /* Instruction list styling */
@@ -6570,7 +6681,7 @@ const popupModalStyles = i$4 `
6570
6681
  align-items: flex-start;
6571
6682
  gap: 12px;
6572
6683
  padding: 12px 0;
6573
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
6684
+ border-bottom: 1px solid #e5e5e5;
6574
6685
  }
6575
6686
 
6576
6687
  .instruction-item:last-child {
@@ -6581,7 +6692,7 @@ const popupModalStyles = i$4 `
6581
6692
  width: 24px;
6582
6693
  height: 24px;
6583
6694
  border-radius: 50%;
6584
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
6695
+ background: #0d9488;
6585
6696
  color: white;
6586
6697
  font-size: 12px;
6587
6698
  font-weight: 700;
@@ -6593,7 +6704,7 @@ const popupModalStyles = i$4 `
6593
6704
 
6594
6705
  .instruction-text {
6595
6706
  font-size: 14px;
6596
- color: rgba(255, 255, 255, 0.85);
6707
+ color: #171717;
6597
6708
  line-height: 1.5;
6598
6709
  padding-top: 2px;
6599
6710
  }
@@ -6651,7 +6762,7 @@ let SpeechOSDictationOutputModal = class SpeechOSDictationOutputModal extends i$
6651
6762
  width: 32px;
6652
6763
  height: 32px;
6653
6764
  border-radius: 8px;
6654
- background: linear-gradient(135deg, #10b981 0%, #8b5cf6 100%);
6765
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
6655
6766
  display: flex;
6656
6767
  align-items: center;
6657
6768
  justify-content: center;
@@ -6665,31 +6776,35 @@ let SpeechOSDictationOutputModal = class SpeechOSDictationOutputModal extends i$
6665
6776
  }
6666
6777
 
6667
6778
  .modal-title {
6668
- background: linear-gradient(135deg, #34d399 0%, #a78bfa 100%);
6779
+ background: linear-gradient(135deg, #14b8a6 0%, #2563eb 100%);
6669
6780
  -webkit-background-clip: text;
6670
6781
  -webkit-text-fill-color: transparent;
6671
6782
  background-clip: text;
6672
6783
  }
6673
6784
 
6674
6785
  .btn-primary {
6675
- background: linear-gradient(135deg, #10b981 0%, #059669 100%);
6676
- box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
6786
+ background: #0d9488;
6787
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
6677
6788
  border-radius: 999px;
6678
6789
  }
6679
6790
 
6680
6791
  .btn-primary:hover {
6681
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
6682
- transform: translateY(-2px);
6683
- box-shadow: 0 6px 16px rgba(16, 185, 129, 0.4);
6792
+ background: #0f766e;
6793
+ box-shadow: 0 4px 12px rgba(13, 148, 136, 0.25);
6794
+ }
6795
+
6796
+ .btn-primary:focus {
6797
+ outline: none;
6798
+ box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #0d9488;
6684
6799
  }
6685
6800
 
6686
6801
  .btn-primary:active {
6687
- transform: translateY(0);
6802
+ transform: scale(0.98);
6688
6803
  }
6689
6804
 
6690
6805
  .btn-success {
6691
- background: linear-gradient(135deg, #34d399 0%, #10b981 100%);
6692
- box-shadow: 0 4px 12px rgba(52, 211, 153, 0.3);
6806
+ background: #059669;
6807
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
6693
6808
  border-radius: 999px;
6694
6809
  }
6695
6810
 
@@ -6703,14 +6818,15 @@ let SpeechOSDictationOutputModal = class SpeechOSDictationOutputModal extends i$
6703
6818
  gap: 6px;
6704
6819
  margin-top: 12px;
6705
6820
  padding: 8px 12px;
6706
- background: rgba(16, 185, 129, 0.08);
6821
+ background: #ffffff;
6822
+ border: 1px solid #e5e5e5;
6707
6823
  border-radius: 8px;
6708
6824
  font-size: 12px;
6709
- color: rgba(255, 255, 255, 0.6);
6825
+ color: #525252;
6710
6826
  }
6711
6827
 
6712
6828
  .hint-icon {
6713
- color: #10b981;
6829
+ color: #0d9488;
6714
6830
  flex-shrink: 0;
6715
6831
  }
6716
6832
 
@@ -7556,7 +7672,14 @@ let SpeechOSWidget = class SpeechOSWidget extends i$1 {
7556
7672
  core.state.hide();
7557
7673
  }
7558
7674
  handleSettingsClick() {
7559
- this.settingsOpen = true;
7675
+ if (useExternalSettings()) {
7676
+ const host = core.getConfig().host;
7677
+ const fullUrl = `${host}/a/extension-settings`;
7678
+ window.open(fullUrl, '_blank', 'noopener,noreferrer');
7679
+ }
7680
+ else {
7681
+ this.settingsOpen = true;
7682
+ }
7560
7683
  }
7561
7684
  handleDragStart(e) {
7562
7685
  if (e.button !== 0)
@@ -8097,10 +8220,17 @@ let SpeechOSWidget = class SpeechOSWidget extends i$1 {
8097
8220
  this.editSelectionStart = null;
8098
8221
  this.editSelectionEnd = null;
8099
8222
  this.editSelectedText = "";
8100
- // Open settings modal
8101
- this.settingsOpen = true;
8223
+ // Open settings - either external URL or modal
8224
+ if (useExternalSettings()) {
8225
+ const host = core.getConfig().host;
8226
+ const fullUrl = `${host}/a/extension-settings`;
8227
+ window.open(fullUrl, '_blank', 'noopener,noreferrer');
8228
+ }
8229
+ else {
8230
+ this.settingsOpen = true;
8231
+ }
8102
8232
  if (core.getConfig().debug) {
8103
- console.log("[SpeechOS] Settings modal opened from no-audio warning");
8233
+ console.log("[SpeechOS] Settings opened from no-audio warning", { useExternalSettings: useExternalSettings() });
8104
8234
  }
8105
8235
  await disconnectPromise;
8106
8236
  }
@@ -8702,5 +8832,6 @@ exports.settingsSync = settingsSync;
8702
8832
  exports.snippetsStore = snippetsStore;
8703
8833
  exports.transcriptStore = transcriptStore;
8704
8834
  exports.updateSnippet = updateSnippet;
8835
+ exports.useExternalSettings = useExternalSettings;
8705
8836
  exports.vocabularyStore = vocabularyStore;
8706
8837
  //# sourceMappingURL=index.cjs.map