codexmate 0.0.43 → 0.0.44

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.
@@ -1,11 +1,39 @@
1
1
  window.__CODEXMATE_WEB_UI_RENDER__ = (() => {
2
- const { toDisplayString: _toDisplayString, normalizeClass: _normalizeClass, createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox } = Vue
2
+ const { toDisplayString: _toDisplayString, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode, createElementVNode: _createElementVNode, normalizeClass: _normalizeClass, Fragment: _Fragment, renderList: _renderList, vShow: _vShow, withDirectives: _withDirectives, vModelSelect: _vModelSelect, vModelText: _vModelText, withKeys: _withKeys, withModifiers: _withModifiers, isMemoSame: _isMemoSame, withMemo: _withMemo, normalizeStyle: _normalizeStyle, vModelDynamic: _vModelDynamic, vModelCheckbox: _vModelCheckbox } = Vue
3
3
 
4
4
  return function render(_ctx, _cache) {
5
5
  return (_openBlock(), _createElementBlock(_Fragment, null, [
6
6
  (!_ctx.sessionStandalone)
7
7
  ? (_openBlock(), _createElementBlock("div", {
8
8
  key: 0,
9
+ class: "mobile-brand-bar"
10
+ }, [
11
+ _createElementVNode("div", { class: "mobile-brand-title" }, [
12
+ _createTextVNode("Codex Mate"),
13
+ (_ctx.appVersion)
14
+ ? (_openBlock(), _createElementBlock("span", {
15
+ key: 0,
16
+ class: "brand-version"
17
+ }, " v" + _toDisplayString(_ctx.appVersion), 1 /* TEXT */))
18
+ : _createCommentVNode("v-if", true)
19
+ ]),
20
+ (_ctx.isAppVersionStatusVisible())
21
+ ? (_openBlock(), _createElementBlock("button", {
22
+ key: 0,
23
+ type: "button",
24
+ class: _normalizeClass(['mobile-update-chip', 'mobile-update-chip--' + _ctx.appVersionStatusKind()]),
25
+ title: _ctx.appVersionStatusTitle(),
26
+ onClick: _ctx.handleAppVersionStatusClick
27
+ }, [
28
+ _createElementVNode("span", { class: "side-update-dot" }),
29
+ _createElementVNode("span", { class: "mobile-update-text" }, _toDisplayString(_ctx.appUpdateNoticeText()), 1 /* TEXT */)
30
+ ], 10 /* CLASS, PROPS */, ["title", "onClick"]))
31
+ : _createCommentVNode("v-if", true)
32
+ ]))
33
+ : _createCommentVNode("v-if", true),
34
+ (!_ctx.sessionStandalone)
35
+ ? (_openBlock(), _createElementBlock("div", {
36
+ key: 1,
9
37
  class: "top-tabs",
10
38
  role: "tablist",
11
39
  "aria-label": _ctx.t('nav.topTabs.aria')
@@ -126,7 +154,7 @@ return function render(_ctx, _cache) {
126
154
  : _createCommentVNode("v-if", true),
127
155
  (!_ctx.sessionStandalone)
128
156
  ? (_openBlock(), _createElementBlock("div", {
129
- key: 1,
157
+ key: 2,
130
158
  class: "lang-fab"
131
159
  }, [
132
160
  _createElementVNode("button", {
@@ -163,7 +191,22 @@ return function render(_ctx, _cache) {
163
191
  : _createCommentVNode("v-if", true)
164
192
  ])
165
193
  ])
166
- ])
194
+ ]),
195
+ (_ctx.isAppVersionStatusVisible())
196
+ ? (_openBlock(), _createElementBlock("button", {
197
+ key: 0,
198
+ type: "button",
199
+ class: _normalizeClass(['side-update-notice', 'side-update-notice--' + _ctx.appVersionStatusKind()]),
200
+ title: _ctx.appVersionStatusTitle(),
201
+ onClick: _ctx.handleAppVersionStatusClick
202
+ }, [
203
+ _createElementVNode("span", { class: "side-update-dot" }),
204
+ _createElementVNode("span", { class: "side-update-copy" }, [
205
+ _createElementVNode("span", { class: "side-update-title" }, _toDisplayString(_ctx.appUpdateNoticeText()), 1 /* TEXT */),
206
+ _createElementVNode("span", { class: "side-update-meta" }, _toDisplayString(_ctx.appUpdateNoticeMeta()), 1 /* TEXT */)
207
+ ])
208
+ ], 10 /* CLASS, PROPS */, ["title", "onClick"]))
209
+ : _createCommentVNode("v-if", true)
167
210
  ]),
168
211
  _createElementVNode("div", { class: "side-rail-nav" }, [
169
212
  _createElementVNode("div", {
@@ -958,6 +1001,7 @@ return function render(_ctx, _cache) {
958
1001
  _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
959
1002
  _createElementVNode("input", {
960
1003
  type: "checkbox",
1004
+ autocomplete: "off",
961
1005
  checked: _ctx.isToolConfigWriteAllowed('codex'),
962
1006
  disabled: _ctx.toolConfigPermissionSaving.codex,
963
1007
  onChange: $event => (_ctx.setToolConfigPermission('codex', $event.target.checked))
@@ -1583,6 +1627,7 @@ return function render(_ctx, _cache) {
1583
1627
  _createElementVNode("label", { class: "settings-toggle-row tool-config-write-toggle" }, [
1584
1628
  _createElementVNode("input", {
1585
1629
  type: "checkbox",
1630
+ autocomplete: "off",
1586
1631
  checked: _ctx.isToolConfigWriteAllowed('claude'),
1587
1632
  disabled: _ctx.toolConfigPermissionSaving.claude,
1588
1633
  onChange: $event => (_ctx.setToolConfigPermission('claude', $event.target.checked))
@@ -1905,13 +1950,33 @@ return function render(_ctx, _cache) {
1905
1950
  "aria-current": _ctx.currentClaudeConfig === name ? 'true' : null
1906
1951
  }, [
1907
1952
  _createElementVNode("div", { class: "card-leading" }, [
1908
- _createElementVNode("div", { class: "card-icon" }, _toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1953
+ _createElementVNode("div", { class: "card-icon" }, [
1954
+ _createTextVNode(_toDisplayString(name.charAt(0).toUpperCase()), 1 /* TEXT */),
1955
+ (config.targetApi === 'chat_completions' || config.targetApi === 'ollama')
1956
+ ? (_openBlock(), _createElementBlock("span", {
1957
+ key: 0,
1958
+ class: "card-icon-dot",
1959
+ title: _ctx.t('config.transformProvider.title')
1960
+ }, null, 8 /* PROPS */, ["title"]))
1961
+ : _createCommentVNode("v-if", true)
1962
+ ]),
1909
1963
  _createElementVNode("div", { class: "card-content" }, [
1910
1964
  _createElementVNode("div", { class: "card-title" }, _toDisplayString(name), 1 /* TEXT */),
1911
1965
  _createElementVNode("div", { class: "card-subtitle card-subtitle-model" }, _toDisplayString(config.model || _ctx.t('claude.model.unset')), 1 /* TEXT */),
1912
- (config.baseUrl)
1966
+ (config.targetApi === 'chat_completions')
1913
1967
  ? (_openBlock(), _createElementBlock("div", {
1914
1968
  key: 0,
1969
+ class: "card-subtitle"
1970
+ }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletionsBadge')), 1 /* TEXT */))
1971
+ : (config.targetApi === 'ollama')
1972
+ ? (_openBlock(), _createElementBlock("div", {
1973
+ key: 1,
1974
+ class: "card-subtitle"
1975
+ }, _toDisplayString(_ctx.t('claude.targetApi.ollamaBadge')), 1 /* TEXT */))
1976
+ : _createCommentVNode("v-if", true),
1977
+ (config.baseUrl)
1978
+ ? (_openBlock(), _createElementBlock("div", {
1979
+ key: 2,
1915
1980
  class: "card-subtitle card-subtitle-url"
1916
1981
  }, _toDisplayString(config.baseUrl), 1 /* TEXT */))
1917
1982
  : _createCommentVNode("v-if", true)
@@ -5320,7 +5385,7 @@ return function render(_ctx, _cache) {
5320
5385
  _createCommentVNode(" 添加提供商模态框 "),
5321
5386
  (_ctx.showAddModal)
5322
5387
  ? (_openBlock(), _createElementBlock("div", {
5323
- key: 2,
5388
+ key: 3,
5324
5389
  class: "modal-overlay",
5325
5390
  onClick: _withModifiers(_ctx.closeAddModal, ["self"])
5326
5391
  }, [
@@ -5477,7 +5542,7 @@ return function render(_ctx, _cache) {
5477
5542
  _createCommentVNode(" 编辑提供商模态框 "),
5478
5543
  (_ctx.showEditModal)
5479
5544
  ? (_openBlock(), _createElementBlock("div", {
5480
- key: 3,
5545
+ key: 4,
5481
5546
  class: "modal-overlay",
5482
5547
  onClick: _withModifiers(_ctx.closeEditModal, ["self"])
5483
5548
  }, [
@@ -5589,7 +5654,7 @@ return function render(_ctx, _cache) {
5589
5654
  _createCommentVNode(" 添加模型模态框 "),
5590
5655
  (_ctx.showModelModal)
5591
5656
  ? (_openBlock(), _createElementBlock("div", {
5592
- key: 4,
5657
+ key: 5,
5593
5658
  class: "modal-overlay",
5594
5659
  onClick: _withModifiers(_ctx.closeModelModal, ["self"])
5595
5660
  }, [
@@ -5629,7 +5694,7 @@ return function render(_ctx, _cache) {
5629
5694
  _createCommentVNode(" 模型列表模态框 "),
5630
5695
  (_ctx.showModelListModal)
5631
5696
  ? (_openBlock(), _createElementBlock("div", {
5632
- key: 5,
5697
+ key: 6,
5633
5698
  class: "modal-overlay",
5634
5699
  onClick: _withModifiers($event => (_ctx.showModelListModal = false), ["self"])
5635
5700
  }, [
@@ -5670,7 +5735,7 @@ return function render(_ctx, _cache) {
5670
5735
  _createCommentVNode(" 添加Claude配置模态框 "),
5671
5736
  (_ctx.showClaudeConfigModal)
5672
5737
  ? (_openBlock(), _createElementBlock("div", {
5673
- key: 6,
5738
+ key: 7,
5674
5739
  class: "modal-overlay",
5675
5740
  onClick: _withModifiers(_ctx.closeClaudeConfigModal, ["self"])
5676
5741
  }, [
@@ -5791,6 +5856,20 @@ return function render(_ctx, _cache) {
5791
5856
  }, _toDisplayString(_ctx.claudeConfigFieldError('add', 'model')), 1 /* TEXT */))
5792
5857
  : _createCommentVNode("v-if", true)
5793
5858
  ]),
5859
+ _createElementVNode("div", { class: "form-group" }, [
5860
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('claude.targetApi.label')), 1 /* TEXT */),
5861
+ _withDirectives(_createElementVNode("select", {
5862
+ "onUpdate:modelValue": $event => ((_ctx.newClaudeConfig.targetApi) = $event),
5863
+ class: "form-input"
5864
+ }, [
5865
+ _createElementVNode("option", { value: "responses" }, _toDisplayString(_ctx.t('claude.targetApi.responses')), 1 /* TEXT */),
5866
+ _createElementVNode("option", { value: "chat_completions" }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletions')), 1 /* TEXT */),
5867
+ _createElementVNode("option", { value: "ollama" }, _toDisplayString(_ctx.t('claude.targetApi.ollama')), 1 /* TEXT */)
5868
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
5869
+ [_vModelSelect, _ctx.newClaudeConfig.targetApi]
5870
+ ]),
5871
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('claude.targetApi.hint')), 1 /* TEXT */)
5872
+ ]),
5794
5873
  _createElementVNode("div", { class: "btn-group" }, [
5795
5874
  _createElementVNode("button", {
5796
5875
  class: "btn btn-cancel",
@@ -5808,7 +5887,7 @@ return function render(_ctx, _cache) {
5808
5887
  _createCommentVNode(" 编辑Claude配置模态框 "),
5809
5888
  (_ctx.showEditConfigModal)
5810
5889
  ? (_openBlock(), _createElementBlock("div", {
5811
- key: 7,
5890
+ key: 8,
5812
5891
  class: "modal-overlay",
5813
5892
  onClick: _withModifiers(_ctx.closeEditConfigModal, ["self"])
5814
5893
  }, [
@@ -5930,6 +6009,20 @@ return function render(_ctx, _cache) {
5930
6009
  }, _toDisplayString(_ctx.claudeConfigFieldError('edit', 'model')), 1 /* TEXT */))
5931
6010
  : _createCommentVNode("v-if", true)
5932
6011
  ]),
6012
+ _createElementVNode("div", { class: "form-group" }, [
6013
+ _createElementVNode("label", { class: "form-label" }, _toDisplayString(_ctx.t('claude.targetApi.label')), 1 /* TEXT */),
6014
+ _withDirectives(_createElementVNode("select", {
6015
+ "onUpdate:modelValue": $event => ((_ctx.editingConfig.targetApi) = $event),
6016
+ class: "form-input"
6017
+ }, [
6018
+ _createElementVNode("option", { value: "responses" }, _toDisplayString(_ctx.t('claude.targetApi.responses')), 1 /* TEXT */),
6019
+ _createElementVNode("option", { value: "chat_completions" }, _toDisplayString(_ctx.t('claude.targetApi.chatCompletions')), 1 /* TEXT */),
6020
+ _createElementVNode("option", { value: "ollama" }, _toDisplayString(_ctx.t('claude.targetApi.ollama')), 1 /* TEXT */)
6021
+ ], 8 /* PROPS */, ["onUpdate:modelValue"]), [
6022
+ [_vModelSelect, _ctx.editingConfig.targetApi]
6023
+ ]),
6024
+ _createElementVNode("div", { class: "form-hint" }, _toDisplayString(_ctx.t('claude.targetApi.hint')), 1 /* TEXT */)
6025
+ ]),
5933
6026
  _createElementVNode("div", { class: "btn-group" }, [
5934
6027
  _createElementVNode("button", {
5935
6028
  class: "btn btn-cancel",
@@ -5947,7 +6040,7 @@ return function render(_ctx, _cache) {
5947
6040
  _createCommentVNode(" Codex bridge pool modal "),
5948
6041
  (_ctx.showCodexBridgePoolModal)
5949
6042
  ? (_openBlock(), _createElementBlock("div", {
5950
- key: 8,
6043
+ key: 9,
5951
6044
  class: "modal-overlay",
5952
6045
  onClick: _withModifiers($event => (_ctx.showCodexBridgePoolModal = false), ["self"])
5953
6046
  }, [
@@ -6040,7 +6133,7 @@ return function render(_ctx, _cache) {
6040
6133
  : _createCommentVNode("v-if", true),
6041
6134
  (_ctx.showClaudeBridgePoolModal)
6042
6135
  ? (_openBlock(), _createElementBlock("div", {
6043
- key: 9,
6136
+ key: 10,
6044
6137
  class: "modal-overlay",
6045
6138
  onClick: _withModifiers($event => (_ctx.showClaudeBridgePoolModal = false), ["self"])
6046
6139
  }, [
@@ -6134,7 +6227,7 @@ return function render(_ctx, _cache) {
6134
6227
  _createCommentVNode(" Webhook settings modal "),
6135
6228
  (_ctx.showWebhookModal)
6136
6229
  ? (_openBlock(), _createElementBlock("div", {
6137
- key: 10,
6230
+ key: 11,
6138
6231
  class: "modal-overlay",
6139
6232
  onClick: _withModifiers(_ctx.closeWebhookModal, ["self"])
6140
6233
  }, [
@@ -6207,7 +6300,7 @@ return function render(_ctx, _cache) {
6207
6300
  : _createCommentVNode("v-if", true),
6208
6301
  (_ctx.showOpenclawConfigModal)
6209
6302
  ? (_openBlock(), _createElementBlock("div", {
6210
- key: 11,
6303
+ key: 12,
6211
6304
  class: "modal-overlay",
6212
6305
  onClick: _withModifiers($event => (!(_ctx.openclawSaving || _ctx.openclawApplying) && _ctx.closeOpenclawConfigModal()), ["self"])
6213
6306
  }, [
@@ -6919,7 +7012,7 @@ return function render(_ctx, _cache) {
6919
7012
  : _createCommentVNode("v-if", true),
6920
7013
  (_ctx.showConfigTemplateModal)
6921
7014
  ? (_openBlock(), _createElementBlock("div", {
6922
- key: 12,
7015
+ key: 13,
6923
7016
  class: "modal-overlay",
6924
7017
  onClick: _withModifiers($event => (!_ctx.configTemplateApplying && _ctx.closeConfigTemplateModal()), ["self"])
6925
7018
  }, [
@@ -7064,7 +7157,7 @@ return function render(_ctx, _cache) {
7064
7157
  : _createCommentVNode("v-if", true),
7065
7158
  (_ctx.showAgentsModal)
7066
7159
  ? (_openBlock(), _createElementBlock("div", {
7067
- key: 13,
7160
+ key: 14,
7068
7161
  class: "modal-overlay",
7069
7162
  onClick: _withModifiers(_ctx.closeAgentsModal, ["self"])
7070
7163
  }, [
@@ -7232,7 +7325,7 @@ return function render(_ctx, _cache) {
7232
7325
  : _createCommentVNode("v-if", true),
7233
7326
  (_ctx.showSkillsModal)
7234
7327
  ? (_openBlock(), _createElementBlock("div", {
7235
- key: 14,
7328
+ key: 15,
7236
7329
  class: "modal-overlay",
7237
7330
  onClick: _withModifiers(_ctx.closeSkillsModal, ["self"])
7238
7331
  }, [
@@ -7530,7 +7623,7 @@ return function render(_ctx, _cache) {
7530
7623
  }, null, 40 /* PROPS, NEED_HYDRATION */, ["onChange"]),
7531
7624
  (_ctx.showHealthCheckModal)
7532
7625
  ? (_openBlock(), _createElementBlock("div", {
7533
- key: 15,
7626
+ key: 16,
7534
7627
  class: "modal-overlay",
7535
7628
  onClick: _withModifiers($event => (_ctx.showHealthCheckModal = false), ["self"])
7536
7629
  }, [
@@ -7621,7 +7714,7 @@ return function render(_ctx, _cache) {
7621
7714
  : _createCommentVNode("v-if", true),
7622
7715
  (_ctx.showConfirmDialog)
7623
7716
  ? (_openBlock(), _createElementBlock("div", {
7624
- key: 16,
7717
+ key: 17,
7625
7718
  class: "modal-overlay",
7626
7719
  onClick: _withModifiers(_ctx.closeConfirmDialog, ["self"])
7627
7720
  }, [
@@ -7659,7 +7752,7 @@ return function render(_ctx, _cache) {
7659
7752
  _createCommentVNode(" Toast "),
7660
7753
  (_ctx.message)
7661
7754
  ? (_openBlock(), _createElementBlock("div", {
7662
- key: 17,
7755
+ key: 18,
7663
7756
  class: _normalizeClass(['toast', _ctx.messageType]),
7664
7757
  role: "status",
7665
7758
  "aria-live": "polite",
@@ -483,16 +483,16 @@
483
483
  }
484
484
 
485
485
  .tool-config-write-overlay {
486
- position: absolute;
486
+ position: fixed;
487
487
  inset: 0;
488
- z-index: 20;
488
+ z-index: 90;
489
489
  display: flex;
490
490
  align-items: center;
491
491
  justify-content: center;
492
492
  box-sizing: border-box;
493
- min-height: 360px;
494
- padding: 16px;
495
- border-radius: 18px;
493
+ min-height: 100dvh;
494
+ padding: max(16px, env(safe-area-inset-top)) max(16px, env(safe-area-inset-right)) max(16px, env(safe-area-inset-bottom)) max(16px, env(safe-area-inset-left));
495
+ border-radius: 0;
496
496
  background: rgba(247, 240, 233, 0.78);
497
497
  background: color-mix(in srgb, var(--color-bg) 68%, transparent);
498
498
  backdrop-filter: blur(2px);
@@ -507,6 +507,151 @@ body::after {
507
507
  -webkit-text-fill-color: #8e8e93;
508
508
  }
509
509
 
510
+ .mobile-brand-bar {
511
+ display: none;
512
+ }
513
+
514
+ .mobile-brand-title {
515
+ min-width: 0;
516
+ font-size: 15px;
517
+ font-weight: 760;
518
+ letter-spacing: -0.02em;
519
+ color: var(--color-text-primary);
520
+ white-space: nowrap;
521
+ overflow: hidden;
522
+ text-overflow: ellipsis;
523
+ }
524
+
525
+ .mobile-update-chip {
526
+ min-width: 0;
527
+ max-width: 58vw;
528
+ height: 30px;
529
+ padding: 0 9px;
530
+ border: 1px solid rgba(200, 121, 99, 0.16);
531
+ border-radius: 999px;
532
+ background: rgba(255, 255, 255, 0.58);
533
+ color: var(--color-text-secondary);
534
+ display: inline-flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ gap: 7px;
538
+ cursor: pointer;
539
+ white-space: nowrap;
540
+ box-shadow: none;
541
+ }
542
+
543
+ .mobile-update-chip--current {
544
+ border-color: rgba(72, 138, 102, 0.14);
545
+ }
546
+
547
+ .mobile-update-chip--current .side-update-dot {
548
+ background: rgba(72, 138, 102, 0.70);
549
+ box-shadow: 0 0 0 4px rgba(72, 138, 102, 0.08);
550
+ }
551
+
552
+ .mobile-update-chip--loading .side-update-dot {
553
+ animation: side-update-pulse 1.2s ease-in-out infinite;
554
+ }
555
+
556
+ .mobile-update-chip--error {
557
+ border-color: rgba(203, 75, 75, 0.18);
558
+ }
559
+
560
+ .mobile-update-chip--error .side-update-dot {
561
+ background: rgba(203, 75, 75, 0.78);
562
+ box-shadow: 0 0 0 4px rgba(203, 75, 75, 0.08);
563
+ }
564
+
565
+ .mobile-update-text {
566
+ min-width: 0;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ font-size: 11px;
570
+ font-weight: 680;
571
+ }
572
+
573
+ .side-update-notice {
574
+ width: 100%;
575
+ margin-top: 12px;
576
+ padding: 8px 9px;
577
+ border: 1px solid rgba(200, 121, 99, 0.16);
578
+ border-radius: 12px;
579
+ background: rgba(255, 255, 255, 0.52);
580
+ color: var(--color-text-secondary);
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 8px;
584
+ text-align: left;
585
+ cursor: pointer;
586
+ box-shadow: none;
587
+ transition: border-color 160ms ease, background 160ms ease, color 160ms ease;
588
+ }
589
+
590
+ .side-update-notice:hover {
591
+ border-color: rgba(200, 121, 99, 0.30);
592
+ background: rgba(255, 255, 255, 0.74);
593
+ color: var(--color-text-primary);
594
+ }
595
+
596
+ .side-update-notice--current {
597
+ border-color: rgba(72, 138, 102, 0.14);
598
+ }
599
+
600
+ .side-update-notice--current .side-update-dot {
601
+ background: rgba(72, 138, 102, 0.70);
602
+ box-shadow: 0 0 0 4px rgba(72, 138, 102, 0.08);
603
+ }
604
+
605
+ .side-update-notice--loading .side-update-dot {
606
+ animation: side-update-pulse 1.2s ease-in-out infinite;
607
+ }
608
+
609
+ .side-update-notice--error {
610
+ border-color: rgba(203, 75, 75, 0.18);
611
+ }
612
+
613
+ .side-update-notice--error .side-update-dot {
614
+ background: rgba(203, 75, 75, 0.78);
615
+ box-shadow: 0 0 0 4px rgba(203, 75, 75, 0.08);
616
+ }
617
+
618
+ @keyframes side-update-pulse {
619
+ 0%, 100% { opacity: 0.48; transform: scale(0.94); }
620
+ 50% { opacity: 1; transform: scale(1.08); }
621
+ }
622
+
623
+ .side-update-dot {
624
+ width: 7px;
625
+ height: 7px;
626
+ border-radius: 50%;
627
+ background: rgba(200, 121, 99, 0.72);
628
+ box-shadow: 0 0 0 4px rgba(200, 121, 99, 0.08);
629
+ flex-shrink: 0;
630
+ }
631
+
632
+ .side-update-copy {
633
+ min-width: 0;
634
+ display: flex;
635
+ flex-direction: column;
636
+ gap: 1px;
637
+ }
638
+
639
+ .side-update-title {
640
+ font-size: 11px;
641
+ line-height: 1.25;
642
+ font-weight: 650;
643
+ color: inherit;
644
+ }
645
+
646
+ .side-update-meta {
647
+ font-size: 10px;
648
+ line-height: 1.2;
649
+ color: var(--color-text-tertiary);
650
+ white-space: nowrap;
651
+ overflow: hidden;
652
+ text-overflow: ellipsis;
653
+ }
654
+
510
655
  .brand-version-fade-enter-active,
511
656
  .brand-version-fade-leave-active {
512
657
  transition: opacity 0.2s var(--ease-smooth);
@@ -94,6 +94,18 @@ textarea:focus-visible {
94
94
  overflow: hidden;
95
95
  }
96
96
 
97
+ .mobile-brand-bar {
98
+ display: flex;
99
+ flex: 0 0 auto;
100
+ align-items: center;
101
+ justify-content: space-between;
102
+ gap: 10px;
103
+ padding: 9px 12px 6px;
104
+ background: rgba(255, 248, 241, 0.96);
105
+ position: relative;
106
+ z-index: 32;
107
+ }
108
+
97
109
  .app-shell {
98
110
  grid-template-columns: 1fr;
99
111
  flex: 1 1 auto;