@genesislcap/ai-assistant 15.19.0 → 15.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/package.json +17 -18
  2. package/api-extractor.json +0 -11
  3. package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts +0 -2
  4. package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts.map +0 -1
  5. package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts +0 -2
  6. package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts.map +0 -1
  7. package/dist/dts/components/chat-driver/chat-driver.test.d.ts +0 -2
  8. package/dist/dts/components/chat-driver/chat-driver.test.d.ts.map +0 -1
  9. package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts +0 -2
  10. package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts.map +0 -1
  11. package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts +0 -2
  12. package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts.map +0 -1
  13. package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts +0 -2
  14. package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts.map +0 -1
  15. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts +0 -2
  16. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts.map +0 -1
  17. package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts +0 -2
  18. package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts.map +0 -1
  19. package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts +0 -2
  20. package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts.map +0 -1
  21. package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts +0 -2
  22. package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts.map +0 -1
  23. package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts +0 -2
  24. package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts.map +0 -1
  25. package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts +0 -2
  26. package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts.map +0 -1
  27. package/dist/dts/config/define-stateful-agent.test.d.ts +0 -2
  28. package/dist/dts/config/define-stateful-agent.test.d.ts.map +0 -1
  29. package/dist/dts/config/validate-providers.test.d.ts +0 -2
  30. package/dist/dts/config/validate-providers.test.d.ts.map +0 -1
  31. package/dist/dts/main/blocked-state.test.d.ts +0 -2
  32. package/dist/dts/main/blocked-state.test.d.ts.map +0 -1
  33. package/dist/dts/main/budget-meter.test.d.ts +0 -2
  34. package/dist/dts/main/budget-meter.test.d.ts.map +0 -1
  35. package/dist/dts/main/cost-session-banking.test.d.ts +0 -2
  36. package/dist/dts/main/cost-session-banking.test.d.ts.map +0 -1
  37. package/dist/dts/main/file-attachments.test.d.ts +0 -2
  38. package/dist/dts/main/file-attachments.test.d.ts.map +0 -1
  39. package/dist/dts/main/interaction-cost.test.d.ts +0 -2
  40. package/dist/dts/main/interaction-cost.test.d.ts.map +0 -1
  41. package/dist/dts/main/main.styles.test.d.ts +0 -2
  42. package/dist/dts/main/main.styles.test.d.ts.map +0 -1
  43. package/dist/dts/main/persistence-broken-sources.test.d.ts +0 -2
  44. package/dist/dts/main/persistence-broken-sources.test.d.ts.map +0 -1
  45. package/dist/dts/main/popout-interaction-gate.test.d.ts +0 -2
  46. package/dist/dts/main/popout-interaction-gate.test.d.ts.map +0 -1
  47. package/dist/dts/state/ai-assistant-slice.test.d.ts +0 -2
  48. package/dist/dts/state/ai-assistant-slice.test.d.ts.map +0 -1
  49. package/dist/dts/state/debug-event-log.test.d.ts +0 -2
  50. package/dist/dts/state/debug-event-log.test.d.ts.map +0 -1
  51. package/dist/dts/state/driver-registry.test.d.ts +0 -2
  52. package/dist/dts/state/driver-registry.test.d.ts.map +0 -1
  53. package/dist/dts/state/interaction-context.test.d.ts +0 -2
  54. package/dist/dts/state/interaction-context.test.d.ts.map +0 -1
  55. package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts +0 -2
  56. package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts.map +0 -1
  57. package/dist/dts/state/persistence/diagnostics.test.d.ts +0 -2
  58. package/dist/dts/state/persistence/diagnostics.test.d.ts.map +0 -1
  59. package/dist/dts/state/persistence/session-persistence-provider.test.d.ts +0 -2
  60. package/dist/dts/state/persistence/session-persistence-provider.test.d.ts.map +0 -1
  61. package/dist/dts/state/persistence/session-persistence.integration.test.d.ts +0 -2
  62. package/dist/dts/state/persistence/session-persistence.integration.test.d.ts.map +0 -1
  63. package/dist/dts/state/persistence/session-persister.test.d.ts +0 -2
  64. package/dist/dts/state/persistence/session-persister.test.d.ts.map +0 -1
  65. package/dist/dts/state/persistence/session-snapshot.test.d.ts +0 -2
  66. package/dist/dts/state/persistence/session-snapshot.test.d.ts.map +0 -1
  67. package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts +0 -2
  68. package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts.map +0 -1
  69. package/dist/dts/utils/animation-exclusivity.test.d.ts +0 -2
  70. package/dist/dts/utils/animation-exclusivity.test.d.ts.map +0 -1
  71. package/dist/dts/utils/collect-session-models.test.d.ts +0 -2
  72. package/dist/dts/utils/collect-session-models.test.d.ts.map +0 -1
  73. package/dist/dts/utils/condense-history.test.d.ts +0 -2
  74. package/dist/dts/utils/condense-history.test.d.ts.map +0 -1
  75. package/dist/dts/utils/cost-session-history.test.d.ts +0 -2
  76. package/dist/dts/utils/cost-session-history.test.d.ts.map +0 -1
  77. package/dist/dts/utils/derive-cost-session-title.test.d.ts +0 -2
  78. package/dist/dts/utils/derive-cost-session-title.test.d.ts.map +0 -1
  79. package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts +0 -2
  80. package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts.map +0 -1
  81. package/dist/dts/utils/history-transform.test.d.ts +0 -2
  82. package/dist/dts/utils/history-transform.test.d.ts.map +0 -1
  83. package/dist/dts/utils/message-partition.test.d.ts +0 -2
  84. package/dist/dts/utils/message-partition.test.d.ts.map +0 -1
  85. package/dist/dts/utils/resolve-cost-history-config.test.d.ts +0 -2
  86. package/dist/dts/utils/resolve-cost-history-config.test.d.ts.map +0 -1
  87. package/dist/dts/utils/resolve-preference-baseline.test.d.ts +0 -2
  88. package/dist/dts/utils/resolve-preference-baseline.test.d.ts.map +0 -1
  89. package/dist/dts/utils/strip-agent-handlers.test.d.ts +0 -2
  90. package/dist/dts/utils/strip-agent-handlers.test.d.ts.map +0 -1
  91. package/dist/dts/utils/sum-costs.test.d.ts +0 -2
  92. package/dist/dts/utils/sum-costs.test.d.ts.map +0 -1
  93. package/dist/dts/utils/sum-tokens.test.d.ts +0 -2
  94. package/dist/dts/utils/sum-tokens.test.d.ts.map +0 -1
  95. package/dist/dts/utils/sum-usage.test.d.ts +0 -2
  96. package/dist/dts/utils/sum-usage.test.d.ts.map +0 -1
  97. package/dist/dts/utils/usage-rows.test.d.ts +0 -2
  98. package/dist/dts/utils/usage-rows.test.d.ts.map +0 -1
  99. package/dist/esm/components/chat-driver/chat-driver.compact.test.js +0 -93
  100. package/dist/esm/components/chat-driver/chat-driver.invocation-scope.test.js +0 -238
  101. package/dist/esm/components/chat-driver/chat-driver.test.js +0 -2770
  102. package/dist/esm/components/chat-driver/chat-driver.thinking-policy.test.js +0 -137
  103. package/dist/esm/components/chat-driver/chat-driver.trace-capture.test.js +0 -200
  104. package/dist/esm/components/chat-driver/chat-driver.turn-usage.test.js +0 -268
  105. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.test.js +0 -104
  106. package/dist/esm/components/orchestrating-driver/orchestrating-driver.budget.test.js +0 -312
  107. package/dist/esm/components/orchestrating-driver/orchestrating-driver.cost.test.js +0 -76
  108. package/dist/esm/components/orchestrating-driver/orchestrating-driver.pin.test.js +0 -61
  109. package/dist/esm/components/settings-modal/settings-modal.styles.test.js +0 -80
  110. package/dist/esm/components/settings-modal/settings-modal.template.test.js +0 -91
  111. package/dist/esm/config/define-stateful-agent.test.js +0 -53
  112. package/dist/esm/config/validate-providers.test.js +0 -100
  113. package/dist/esm/main/blocked-state.test.js +0 -1065
  114. package/dist/esm/main/budget-meter.test.js +0 -359
  115. package/dist/esm/main/cost-session-banking.test.js +0 -538
  116. package/dist/esm/main/file-attachments.test.js +0 -164
  117. package/dist/esm/main/interaction-cost.test.js +0 -107
  118. package/dist/esm/main/main.styles.test.js +0 -161
  119. package/dist/esm/main/persistence-broken-sources.test.js +0 -180
  120. package/dist/esm/main/popout-interaction-gate.test.js +0 -54
  121. package/dist/esm/state/ai-assistant-slice.test.js +0 -229
  122. package/dist/esm/state/debug-event-log.test.js +0 -117
  123. package/dist/esm/state/driver-registry.test.js +0 -55
  124. package/dist/esm/state/interaction-context.test.js +0 -78
  125. package/dist/esm/state/persistence/diagnostics-cursors.test.js +0 -30
  126. package/dist/esm/state/persistence/diagnostics.test.js +0 -280
  127. package/dist/esm/state/persistence/session-persistence-provider.test.js +0 -110
  128. package/dist/esm/state/persistence/session-persistence.integration.test.js +0 -113
  129. package/dist/esm/state/persistence/session-persister.test.js +0 -613
  130. package/dist/esm/state/persistence/session-snapshot.test.js +0 -256
  131. package/dist/esm/state/persistence/stateful-restore.e2e.test.js +0 -158
  132. package/dist/esm/utils/animation-exclusivity.test.js +0 -52
  133. package/dist/esm/utils/collect-session-models.test.js +0 -53
  134. package/dist/esm/utils/condense-history.test.js +0 -547
  135. package/dist/esm/utils/cost-session-history.test.js +0 -174
  136. package/dist/esm/utils/derive-cost-session-title.test.js +0 -37
  137. package/dist/esm/utils/flatten-sub-agent-messages.test.js +0 -139
  138. package/dist/esm/utils/history-transform.test.js +0 -158
  139. package/dist/esm/utils/message-partition.test.js +0 -90
  140. package/dist/esm/utils/resolve-cost-history-config.test.js +0 -32
  141. package/dist/esm/utils/resolve-preference-baseline.test.js +0 -69
  142. package/dist/esm/utils/strip-agent-handlers.test.js +0 -81
  143. package/dist/esm/utils/sum-costs.test.js +0 -114
  144. package/dist/esm/utils/sum-tokens.test.js +0 -51
  145. package/dist/esm/utils/sum-usage.test.js +0 -164
  146. package/dist/esm/utils/usage-rows.test.js +0 -189
  147. package/dist/tsconfig.tsbuildinfo +0 -1
  148. package/license.txt +0 -46
  149. package/sandbox/tsconfig.json +0 -8
  150. package/src/channel/ai-activity-bus.ts +0 -209
  151. package/src/channel/ai-activity-channel.ts +0 -146
  152. package/src/chat-driver-node.ts +0 -159
  153. package/src/components/activity-halo/activity-halo.ts +0 -106
  154. package/src/components/agent-picker/agent-picker.constants.ts +0 -2
  155. package/src/components/agent-picker/agent-picker.styles.ts +0 -24
  156. package/src/components/agent-picker/agent-picker.template.ts +0 -54
  157. package/src/components/agent-picker/agent-picker.ts +0 -99
  158. package/src/components/agent-picker/index.ts +0 -1
  159. package/src/components/ai-driver/ai-driver.ts +0 -166
  160. package/src/components/ai-driver/index.ts +0 -1
  161. package/src/components/chat-bubble/chat-bubble.styles.ts +0 -194
  162. package/src/components/chat-bubble/chat-bubble.template.ts +0 -67
  163. package/src/components/chat-bubble/chat-bubble.ts +0 -436
  164. package/src/components/chat-bubble/index.ts +0 -1
  165. package/src/components/chat-driver/align-event-globals.ts +0 -23
  166. package/src/components/chat-driver/chat-driver.compact.test.ts +0 -131
  167. package/src/components/chat-driver/chat-driver.invocation-scope.test.ts +0 -285
  168. package/src/components/chat-driver/chat-driver.test.ts +0 -3679
  169. package/src/components/chat-driver/chat-driver.thinking-policy.test.ts +0 -185
  170. package/src/components/chat-driver/chat-driver.trace-capture.test.ts +0 -251
  171. package/src/components/chat-driver/chat-driver.ts +0 -3925
  172. package/src/components/chat-driver/chat-driver.turn-usage.test.ts +0 -362
  173. package/src/components/chat-driver/index.ts +0 -1
  174. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.ts +0 -7
  175. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.template.ts +0 -6
  176. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.test.ts +0 -144
  177. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +0 -243
  178. package/src/components/chat-interaction-wrapper/index.ts +0 -3
  179. package/src/components/chat-markdown/chat-markdown.ts +0 -89
  180. package/src/components/chat-markdown/index.ts +0 -1
  181. package/src/components/flowing-waves-indicator.ts +0 -286
  182. package/src/components/halo-overlay.ts +0 -184
  183. package/src/components/orchestrating-driver/index.ts +0 -1
  184. package/src/components/orchestrating-driver/orchestrating-driver.budget.test.ts +0 -438
  185. package/src/components/orchestrating-driver/orchestrating-driver.cost.test.ts +0 -107
  186. package/src/components/orchestrating-driver/orchestrating-driver.pin.test.ts +0 -96
  187. package/src/components/orchestrating-driver/orchestrating-driver.ts +0 -813
  188. package/src/components/plasma-orb-indicator.ts +0 -281
  189. package/src/components/popout-manager/index.ts +0 -1
  190. package/src/components/popout-manager/popout-manager.ts +0 -212
  191. package/src/components/settings-modal/index.ts +0 -2
  192. package/src/components/settings-modal/settings-modal.styles.test.ts +0 -94
  193. package/src/components/settings-modal/settings-modal.styles.ts +0 -853
  194. package/src/components/settings-modal/settings-modal.template.test.ts +0 -124
  195. package/src/components/settings-modal/settings-modal.template.ts +0 -943
  196. package/src/components/waves-indicator.ts +0 -241
  197. package/src/config/config.ts +0 -608
  198. package/src/config/define-stateful-agent.test.ts +0 -64
  199. package/src/config/define-stateful-agent.ts +0 -642
  200. package/src/config/fallback-agents.ts +0 -29
  201. package/src/config/index.ts +0 -2
  202. package/src/config/validate-providers.test.ts +0 -148
  203. package/src/config/validate-providers.ts +0 -58
  204. package/src/index.ts +0 -29
  205. package/src/main/blocked-state.test.ts +0 -1444
  206. package/src/main/budget-meter.test.ts +0 -477
  207. package/src/main/cost-session-banking.test.ts +0 -679
  208. package/src/main/file-attachments.test.ts +0 -215
  209. package/src/main/index.ts +0 -3
  210. package/src/main/interaction-cost.test.ts +0 -140
  211. package/src/main/main.styles.test.ts +0 -216
  212. package/src/main/main.styles.ts +0 -995
  213. package/src/main/main.template.ts +0 -1119
  214. package/src/main/main.ts +0 -5432
  215. package/src/main/main.types.ts +0 -225
  216. package/src/main/persistence-broken-sources.test.ts +0 -219
  217. package/src/main/popout-interaction-gate.test.ts +0 -87
  218. package/src/provider/ai-provider-switcher.ts +0 -40
  219. package/src/provider/assistant-app-settings.ts +0 -84
  220. package/src/state/ai-assistant-slice.test.ts +0 -336
  221. package/src/state/ai-assistant-slice.ts +0 -604
  222. package/src/state/debug-event-log.test.ts +0 -154
  223. package/src/state/debug-event-log.ts +0 -358
  224. package/src/state/driver-registry.test.ts +0 -70
  225. package/src/state/driver-registry.ts +0 -79
  226. package/src/state/interaction-context.test.ts +0 -90
  227. package/src/state/interaction-context.ts +0 -101
  228. package/src/state/persistence/build-timeline-entries.ts +0 -66
  229. package/src/state/persistence/diagnostics-cursors.test.ts +0 -53
  230. package/src/state/persistence/diagnostics-cursors.ts +0 -80
  231. package/src/state/persistence/diagnostics.test.ts +0 -346
  232. package/src/state/persistence/diagnostics.ts +0 -220
  233. package/src/state/persistence/index.ts +0 -10
  234. package/src/state/persistence/persister-registry.ts +0 -55
  235. package/src/state/persistence/session-persistence-provider.test.ts +0 -136
  236. package/src/state/persistence/session-persistence-provider.ts +0 -226
  237. package/src/state/persistence/session-persistence.integration.test.ts +0 -141
  238. package/src/state/persistence/session-persister.test.ts +0 -787
  239. package/src/state/persistence/session-persister.ts +0 -917
  240. package/src/state/persistence/session-snapshot.test.ts +0 -352
  241. package/src/state/persistence/session-snapshot.ts +0 -344
  242. package/src/state/persistence/stateful-restore.e2e.test.ts +0 -229
  243. package/src/state/session-store.ts +0 -56
  244. package/src/styles/ai-colours.ts +0 -30
  245. package/src/styles/menu.ts +0 -187
  246. package/src/styles/settings-section.ts +0 -40
  247. package/src/suggestions/chat-suggestions.ts +0 -186
  248. package/src/tags/index.ts +0 -1
  249. package/src/types/ai-chat-widget.ts +0 -67
  250. package/src/types/interaction-context.ts +0 -82
  251. package/src/utils/animated-panel-toggle.ts +0 -62
  252. package/src/utils/animation-exclusivity.test.ts +0 -72
  253. package/src/utils/animation-exclusivity.ts +0 -40
  254. package/src/utils/banked-usage-baselines.ts +0 -90
  255. package/src/utils/collect-session-models.test.ts +0 -82
  256. package/src/utils/collect-session-models.ts +0 -65
  257. package/src/utils/condense-history.test.ts +0 -746
  258. package/src/utils/condense-history.ts +0 -448
  259. package/src/utils/cost-session-history.test.ts +0 -226
  260. package/src/utils/cost-session-history.ts +0 -218
  261. package/src/utils/derive-cost-session-title.test.ts +0 -63
  262. package/src/utils/derive-cost-session-title.ts +0 -76
  263. package/src/utils/flatten-sub-agent-messages.test.ts +0 -163
  264. package/src/utils/flatten-sub-agent-messages.ts +0 -88
  265. package/src/utils/format-usd.ts +0 -26
  266. package/src/utils/history-transform.test.ts +0 -228
  267. package/src/utils/history-transform.ts +0 -163
  268. package/src/utils/index.ts +0 -3
  269. package/src/utils/logger.ts +0 -3
  270. package/src/utils/message-partition.test.ts +0 -129
  271. package/src/utils/message-partition.ts +0 -115
  272. package/src/utils/resolve-cost-history-config.test.ts +0 -38
  273. package/src/utils/resolve-cost-history-config.ts +0 -38
  274. package/src/utils/resolve-preference-baseline.test.ts +0 -84
  275. package/src/utils/resolve-preference-baseline.ts +0 -80
  276. package/src/utils/strip-agent-handlers.test.ts +0 -99
  277. package/src/utils/strip-agent-handlers.ts +0 -53
  278. package/src/utils/sum-costs.test.ts +0 -136
  279. package/src/utils/sum-costs.ts +0 -18
  280. package/src/utils/sum-tokens.test.ts +0 -93
  281. package/src/utils/sum-tokens.ts +0 -68
  282. package/src/utils/sum-usage.test.ts +0 -191
  283. package/src/utils/sum-usage.ts +0 -208
  284. package/src/utils/tool-fold.ts +0 -181
  285. package/src/utils/usage-rows.test.ts +0 -237
  286. package/src/utils/usage-rows.ts +0 -187
  287. package/src/utils/with-timeout.ts +0 -24
  288. package/tsconfig.json +0 -9
@@ -1,853 +0,0 @@
1
- import { css } from '@genesislcap/web-core';
2
- import { assistantSettingsSectionTitleStyles } from '../../styles/settings-section';
3
-
4
- /** Styles for the assistant settings modal (tabs, sections, toggles, cost summary). */
5
- export const settingsModalStyles = css`
6
- /*
7
- * Section headings come from the shared fragment the package also exports, so a host titling
8
- * its own slotted section applies the same rule rather than a copy of it.
9
- */
10
- ${assistantSettingsSectionTitleStyles}
11
-
12
- *,
13
- *::before,
14
- *::after {
15
- box-sizing: border-box;
16
- }
17
-
18
- .settings-modal {
19
- --ai-tier-badge-bg-mix: 14%;
20
- --ai-tier-badge-text-lighten: 18%;
21
- }
22
-
23
- .settings-modal::part(dialog) {
24
- max-width: 620px;
25
- width: calc(100vw - 48px);
26
- max-height: calc(100vh - 48px);
27
- padding: 0;
28
- }
29
-
30
- .settings-modal::part(content) {
31
- display: flex;
32
- flex-direction: column;
33
- min-height: 0;
34
- padding: 0;
35
- width: 100%;
36
- }
37
-
38
- .settings-modal::part(top) {
39
- padding: calc(var(--design-unit) * 4px) calc(var(--design-unit) * 5px);
40
- border-bottom: 1px solid var(--neutral-stroke-rest);
41
- }
42
-
43
- .settings-modal::part(bottom) {
44
- padding: calc(var(--design-unit) * 4px) calc(var(--design-unit) * 5px);
45
- border-top: 1px solid var(--neutral-stroke-rest);
46
- border-bottom-left-radius: var(--card-border-radius, calc(var(--control-corner-radius) * 1px));
47
- border-bottom-right-radius: var(--card-border-radius, calc(var(--control-corner-radius) * 1px));
48
- background-color: var(--neutral-layer-2);
49
- }
50
-
51
- .settings-modal-header {
52
- display: flex;
53
- align-items: center;
54
- min-width: 0;
55
- }
56
-
57
- .settings-modal-title {
58
- margin: 0;
59
- font-size: 16px;
60
- font-weight: 600;
61
- display: flex;
62
- align-items: center;
63
- gap: calc(var(--design-unit) * 2px);
64
- color: var(--neutral-foreground-rest);
65
- }
66
-
67
- .settings-modal-content {
68
- display: flex;
69
- flex-direction: column;
70
- min-height: 0;
71
- flex: 1 1 auto;
72
- }
73
-
74
- .settings-modal-tabs::part(tablist) {
75
- border-bottom: 0;
76
- padding: 0 calc(var(--design-unit) * 5px);
77
- column-gap: calc(var(--design-unit) * 5px);
78
- }
79
-
80
- .settings-modal-tabs::part(activeIndicator) {
81
- height: 2px;
82
- }
83
-
84
- .settings-modal-tab {
85
- padding: 0;
86
- font-weight: 600;
87
- gap: 6px;
88
- }
89
-
90
- .settings-modal-tab[aria-selected='true'] {
91
- color: var(--neutral-foreground-rest);
92
- }
93
-
94
- .settings-modal-tabs::part(tabpanel) {
95
- border-top: 1px solid var(--neutral-stroke-rest);
96
- }
97
-
98
- .settings-modal-tab-panel {
99
- display: flex;
100
- flex-direction: column;
101
- min-height: 0;
102
- flex: 1 1 auto;
103
- padding: 0;
104
- border-radius: 0;
105
- }
106
-
107
- .settings-modal-tab-panel[hidden] {
108
- display: none !important;
109
- }
110
-
111
- .settings-modal-body {
112
- overflow-y: auto;
113
- padding: 0 calc(var(--design-unit) * 5px) calc(var(--design-unit) * 2px);
114
- max-height: min(60vh, 520px);
115
- }
116
-
117
- .settings-modal-section {
118
- padding: calc(var(--design-unit) * 5px) 0;
119
- border-bottom: 1px solid var(--neutral-stroke-rest);
120
- }
121
-
122
- .settings-modal-section:last-child {
123
- border-bottom: none;
124
- }
125
-
126
- /*
127
- * Only the spacing. Everything else about this heading comes from the exported fragment
128
- * above, which the assistant and its hosts share; margin is deliberately not in there,
129
- * since the gap below a heading depends on the layout around it.
130
- */
131
- .ai-settings-section-title {
132
- margin: 0 0 calc(var(--design-unit) * 3px);
133
- }
134
-
135
- .settings-modal-section-note {
136
- margin: calc(var(--design-unit) * -2px) 0 calc(var(--design-unit) * 3px);
137
- font-size: 12px;
138
- line-height: 1.5;
139
- color: var(--neutral-foreground-hint);
140
- }
141
-
142
- .settings-modal-section-body {
143
- display: flex;
144
- flex-direction: column;
145
- gap: calc(var(--design-unit) * 4px);
146
- }
147
-
148
- .settings-toggle-row {
149
- display: flex;
150
- align-items: flex-start;
151
- gap: calc(var(--design-unit) * 3px);
152
- padding: 0 0 calc(var(--design-unit) * 4px) 0;
153
- border-bottom: 1px solid var(--neutral-stroke-rest);
154
- }
155
-
156
- .settings-toggle-row:last-child {
157
- border-bottom: none;
158
- padding-bottom: calc(var(--design-unit) * 1px);
159
- }
160
-
161
- .settings-toggle-row.is-stacked {
162
- flex-direction: column;
163
- gap: calc(var(--design-unit) * 2px);
164
- }
165
-
166
- /*
167
- * For rows whose control is a button rather than a switch. The base row top-aligns, which suits
168
- * a switch (it lands level with the title), but a button is tall enough that top-aligning leaves
169
- * it above the title-plus-description block it acts on.
170
- */
171
- .settings-toggle-row.is-centered {
172
- align-items: center;
173
- }
174
-
175
- .settings-animation-list {
176
- display: flex;
177
- flex-direction: column;
178
- width: 100%;
179
- border: 1px solid var(--neutral-stroke-rest);
180
- border-radius: calc(var(--control-corner-radius) * 1.2px);
181
- padding: calc(var(--design-unit) * 2px);
182
- gap: calc(var(--design-unit) * 2px);
183
- }
184
-
185
- .settings-animation-list .settings-toggle-row {
186
- border: 0;
187
- }
188
-
189
- .settings-animation-category {
190
- display: flex;
191
- flex-direction: column;
192
- gap: calc(var(--design-unit) * 4px);
193
- }
194
-
195
- .settings-animation-category-label {
196
- font-weight: 600;
197
- color: var(--neutral-foreground-hint);
198
- }
199
-
200
- .settings-toggle-row + .settings-animation-category-label {
201
- border-top: 1px solid var(--neutral-stroke-rest);
202
- padding-top: calc(var(--design-unit) * 2px);
203
- }
204
-
205
- .settings-animation-option {
206
- padding: 0;
207
- margin: 0;
208
- }
209
-
210
- .settings-animation-option:last-child {
211
- border-bottom: none;
212
- padding-bottom: calc(var(--design-unit) * 2px);
213
- }
214
-
215
- .settings-toggle-text {
216
- flex: 1;
217
- min-width: 0;
218
- }
219
-
220
- .settings-toggle-title {
221
- font-size: 14px;
222
- font-weight: 500;
223
- color: var(--neutral-foreground-rest);
224
- }
225
-
226
- .settings-toggle-desc {
227
- font-size: 12px;
228
- color: var(--neutral-foreground-hint);
229
- line-height: 1.5;
230
- max-width: 92%;
231
- }
232
-
233
- .settings-toggle-control {
234
- flex: 0 0 auto;
235
- min-width: 0;
236
- }
237
-
238
- .settings-toggle-control-wide {
239
- width: 100%;
240
- max-width: 280px;
241
- }
242
-
243
- .settings-toggle-row.is-stacked .settings-toggle-desc {
244
- max-width: none;
245
- }
246
-
247
- .settings-toggle-row.is-stacked .settings-toggle-control-wide {
248
- width: 100%;
249
- max-width: none;
250
- }
251
-
252
- /*
253
- * Sub-heading over the provider toggle group. Unlike the section headings it sits INSIDE
254
- * .settings-modal-section-body, so the parent's 4-unit flex gap already separates it from the
255
- * first toggle — and flex does not collapse margins, so the shared rule's 3-unit margin-bottom
256
- * would add to that gap rather than replace it, leaving the label adrift from the rows it
257
- * names. Zero the margin and pull back 2 of the 4 gap units, expressed in the same token so it
258
- * tracks if that gap changes.
259
- */
260
- .settings-app-toggles-title {
261
- margin: 0 0 calc(var(--design-unit) * -2px);
262
- }
263
-
264
- .settings-app-toggle-block {
265
- display: flex;
266
- flex-direction: column;
267
- gap: calc(var(--design-unit) * 1px);
268
- }
269
-
270
- .settings-toggle-hint {
271
- font-size: 12px;
272
- color: var(--neutral-foreground-hint);
273
- line-height: 1.4;
274
- padding-left: calc(var(--design-unit) * 1px);
275
- font-style: italic;
276
- }
277
-
278
- /*
279
- * The budget meter (GENC-1464) is the context indicator's money sibling and
280
- * shares its row anatomy 1:1, so the budget classes JOIN these rules rather
281
- * than restating them — one place to restyle the header/label/figures shape,
282
- * and the two indicators cannot drift apart. Design-system tokens only, and
283
- * unfallbacked: every token here ships a DS default, so a var(--x, y)
284
- * fallback would be dead code that hides a broken token name (#2411/#2436
285
- * review rule, pinned by settings-modal.styles.test.ts).
286
- */
287
- .settings-context-header,
288
- .settings-budget-header {
289
- display: flex;
290
- justify-content: space-between;
291
- gap: calc(var(--design-unit) * 2px);
292
- margin-bottom: calc(var(--design-unit) * 2px);
293
- font-size: 12px;
294
- }
295
-
296
- .settings-context-label,
297
- .settings-budget-label {
298
- color: var(--neutral-foreground-hint);
299
- font-size: 11px;
300
- font-weight: 600;
301
- text-transform: uppercase;
302
- letter-spacing: 0.06em;
303
- }
304
-
305
- .settings-context-tokens,
306
- .settings-budget-figures {
307
- color: var(--neutral-foreground-rest);
308
- }
309
-
310
- /* Freshness footer (GENC-1464): refresh button + label under the vendor
311
- rows, left-aligned — a footnote to the figures above it. The button's
312
- inline padding is pinned and cancelled by the container margin so the
313
- ICON GLYPH (not the button box) sits flush with the budget labels'
314
- left edge, whatever the density tokens say. */
315
- .settings-budget-toolbar {
316
- display: flex;
317
- justify-content: flex-start;
318
- align-items: center;
319
- gap: 4px;
320
- margin-inline-start: -4px;
321
- }
322
-
323
- .settings-budget-refresh::part(control) {
324
- padding-inline: 4px;
325
- }
326
-
327
- .settings-budget-updated {
328
- color: var(--neutral-foreground-hint);
329
- font-size: 11px;
330
- }
331
-
332
- /*
333
- * ONE rhythm for every meter row. The outer wrapper holds the context
334
- * indicator and the budget meter; the inner one holds the budget meter's
335
- * vendor rows — and both gap by the same 2 units (half the section body's 4)
336
- * so that visually identical meter rows are evenly spaced whatever mix of
337
- * them is on screen. Without the wrapper the context row inherits the body's
338
- * 4-unit gap while the vendor rows keep 2, and three identical-looking rows
339
- * read as an uneven 4/2/2. The wrapper renders only when at least one meter
340
- * does — see settingsUsageMetersTemplate for why an always-on one would cost
341
- * a stray gap.
342
- */
343
- .settings-usage-meters,
344
- .settings-budget-usage {
345
- display: flex;
346
- flex-direction: column;
347
- gap: calc(var(--design-unit) * 2px);
348
- }
349
-
350
- .settings-current-build,
351
- .settings-lifetime-usage {
352
- background: var(--neutral-layer-2);
353
- border: 1px solid var(--neutral-stroke-rest);
354
- border-radius: calc(var(--control-corner-radius) * 1.5px);
355
- padding: calc(var(--design-unit) * 4px);
356
- margin: calc(var(--design-unit) * 3px) 0;
357
- }
358
-
359
- /*
360
- * Deliberately quieter than the live block: no pulsing badge and no accent, so the eye lands
361
- * on what is being built now — which is why that block leads the tab and this one follows,
362
- * under the history heading whose rows it totals.
363
- */
364
- .settings-lifetime-usage-top {
365
- display: flex;
366
- align-items: center;
367
- flex-wrap: wrap;
368
- gap: calc(var(--design-unit) * 2px);
369
- margin-bottom: calc(var(--design-unit) * 3px);
370
- }
371
-
372
- .settings-lifetime-label {
373
- font-size: 10px;
374
- line-height: 1;
375
- font-weight: 700;
376
- text-transform: uppercase;
377
- letter-spacing: 0.06em;
378
- color: var(--neutral-foreground-hint);
379
- }
380
-
381
- .settings-current-build-top {
382
- display: flex;
383
- align-items: center;
384
- flex-wrap: wrap;
385
- gap: calc(var(--design-unit) * 2px);
386
- margin-bottom: calc(var(--design-unit) * 3px);
387
- }
388
-
389
- /*
390
- * Optically centring these 10px caps against the 14px project name beside them. Flex offers
391
- * only two alignments and neither lands it, because a box centre and a text baseline are
392
- * different lines:
393
- * - align-items: center sits the badge baseline about 1.2px high
394
- * - align-items: baseline matches baselines, but the caps then read as bottom-aligned
395
- * against the name's ascenders, so the badge looks low
396
- * The eye wants the midpoint, so: centre the boxes, then translate down by the ~1px of
397
- * overshoot. This is a nudge, but it corrects a fixed relationship between two font sizes
398
- * rather than some neighbouring element's layout, so unlike a margin tuned to a sibling it
399
- * cannot rot when that sibling changes. In em, so it tracks the badge text.
400
- *
401
- * display: block, not inline-flex: a flex container has no text baseline of its own and
402
- * synthesizes one from its first child, which here is the dot, an empty span. As a block box
403
- * the badge takes the baseline of its first line, i.e. the text.
404
- */
405
- .settings-live-badge {
406
- display: block;
407
- font-size: 10px;
408
- line-height: 1;
409
- font-weight: 700;
410
- text-transform: uppercase;
411
- letter-spacing: 0.06em;
412
- color: var(--accent-fill-rest);
413
- white-space: nowrap;
414
- transform: translateY(0.1em);
415
- }
416
-
417
- .settings-live-dot {
418
- display: inline-block;
419
- width: 7px;
420
- height: 7px;
421
-
422
- /* Replaces the flex gap the badge no longer has. */
423
- margin-right: calc(var(--design-unit) * 1px);
424
-
425
- /* Centres the dot on the text beside it without disturbing that text's baseline. */
426
- vertical-align: middle;
427
- border-radius: 50%;
428
- background: var(--accent-fill-rest);
429
- animation: settings-live-pulse 1.6s ease-out infinite;
430
- }
431
-
432
- @keyframes settings-live-pulse {
433
- 0% {
434
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent-fill-rest) 55%, transparent);
435
- }
436
-
437
- 70% {
438
- box-shadow: 0 0 0 7px transparent;
439
- }
440
-
441
- 100% {
442
- box-shadow: 0 0 0 0 transparent;
443
- }
444
- }
445
-
446
- .settings-current-build-name {
447
- font-size: 14px;
448
- line-height: 1;
449
- font-weight: 600;
450
- }
451
-
452
- /*
453
- * Cost and the token buckets side by side: one number in its own box, the four buckets
454
- * sharing the box next to it. Stretch, so the two are the same height however tall the 22px
455
- * cost value makes the left one.
456
- */
457
- .settings-usage-row {
458
- display: flex;
459
- flex-wrap: wrap;
460
- align-items: stretch;
461
- gap: calc(var(--design-unit) * 3px);
462
- margin-bottom: calc(var(--design-unit) * 3px);
463
- }
464
-
465
- .settings-usage-row-tokens {
466
- display: flex;
467
- flex: 1 1 auto;
468
- min-width: 0;
469
- }
470
-
471
- .settings-build-stat {
472
- min-width: 0;
473
- background: var(--neutral-layer-1);
474
- border: 1px solid var(--neutral-stroke-rest);
475
- border-radius: calc(var(--control-corner-radius) * 1px);
476
- padding: calc(var(--design-unit) * 3px);
477
- }
478
-
479
- .settings-build-stat-label {
480
- font-size: 10px;
481
- font-weight: 600;
482
- text-transform: uppercase;
483
- letter-spacing: 0.06em;
484
- color: var(--neutral-foreground-hint);
485
- }
486
-
487
- .settings-build-stat-value {
488
- font-size: 22px;
489
- font-weight: 700;
490
- margin-top: calc(var(--design-unit) * 1px);
491
- color: var(--neutral-foreground-rest);
492
- }
493
-
494
- .settings-build-stat-value .prefix,
495
- .settings-build-stat-value .suffix {
496
- color: var(--accent-fill-rest);
497
- }
498
-
499
- /*
500
- * Per-bucket token split, beneath the headline cost. Small paired label/value cells
501
- * rather than four more stat cards: they are the detail behind the cost above, so they
502
- * have to read as subordinate to it rather than compete with it. The four buckets ARE
503
- * the token figure now — there is no merged total anywhere for them to break down.
504
- */
505
- .settings-token-breakdown {
506
- display: flex;
507
- flex-direction: column;
508
-
509
- /*
510
- * Tight against the buckets below. One design unit rather than two, because each bucket
511
- * separates its own label from its value by only 2px — at two units the title sat four
512
- * times further from the bucket labels than they sit from their own numbers, which read
513
- * as a gap between unrelated blocks instead of a heading over its content.
514
- */
515
- gap: calc(var(--design-unit) * 1px);
516
- margin-bottom: calc(var(--design-unit) * 3px);
517
- padding: calc(var(--design-unit) * 2px) calc(var(--design-unit) * 3px);
518
- background: var(--neutral-layer-1);
519
- border: 1px solid var(--neutral-stroke-rest);
520
- border-radius: calc(var(--control-corner-radius) * 1px);
521
- }
522
-
523
- /*
524
- * Titles the box, because nothing else in it named the unit. Same styling and position as
525
- * the cost box's label, so two boxes sitting side by side are titled the same way; the
526
- * hierarchy against the bucket labels comes from position, not a second type size.
527
- */
528
- .settings-token-breakdown-label {
529
- font-size: 10px;
530
- line-height: 1;
531
- font-weight: 600;
532
- text-transform: uppercase;
533
- letter-spacing: 0.06em;
534
- color: var(--neutral-foreground-hint);
535
- }
536
-
537
- .settings-token-buckets {
538
- display: flex;
539
- flex-wrap: wrap;
540
- gap: calc(var(--design-unit) * 4px);
541
- }
542
-
543
- .settings-token-bucket {
544
- display: flex;
545
-
546
- /*
547
- * min-content (not 0) so a bucket cannot be shrunk narrower than its own unbreakable label.
548
- * With the label set to nowrap, a zero minimum would overflow it into the next column instead
549
- * of wrapping — so the container's flex-wrap takes over and moves a bucket to a second row,
550
- * which is the degradation we want when the modal is dragged narrow.
551
- */
552
- min-width: min-content;
553
- flex-direction: column;
554
- gap: 2px;
555
- }
556
-
557
- .settings-token-bucket-label {
558
- font-size: 10px;
559
- font-weight: 600;
560
- text-transform: uppercase;
561
- letter-spacing: 0.06em;
562
- color: var(--neutral-foreground-hint);
563
-
564
- /*
565
- * One line, always. The rate marker is a separate inline box after collapsible whitespace, so
566
- * a wrappable label gives it a break opportunity of its own — in a narrow column it orphaned
567
- * onto line 2, which also pushed that bucket's value a line below the other three and broke
568
- * the row of figures. nowrap removes every break opportunity in the label, the space before
569
- * the marker included, so no glue character is needed.
570
- */
571
- white-space: nowrap;
572
- }
573
-
574
- .settings-token-bucket-value {
575
- font-size: 13px;
576
- font-weight: 600;
577
- color: var(--neutral-foreground-rest);
578
- }
579
-
580
- /*
581
- * The price-direction marker on a cache bucket's label — down for reads (a fraction of the
582
- * uncached input rate), up for writes (a premium over it). Three tiers, so a bucket with no
583
- * marker is the reference rate rather than an unlabelled fourth case.
584
- *
585
- * Carried by the label rather than the value, which is what this used to do: cache reads are
586
- * usually the largest bucket by a wide margin in an agentic session, so the value was muted to
587
- * stop the biggest number reading as the dominant cost driver. That priced the treatment to the
588
- * wrong thing — a dimmed 0 (every Gemini cache write) looked disabled next to a normal 0, and a
589
- * rate is a property of the bucket, not of this turn's figure.
590
- *
591
- * Sized down and nudged up rather than tinted: the label is already the hint colour, so a
592
- * dimmer marker would vanish and a brighter one would out-shout the word it qualifies.
593
- */
594
- .settings-token-bucket-rate {
595
- font-size: 8px;
596
- line-height: 1;
597
- vertical-align: 0.15em;
598
- letter-spacing: 0;
599
- }
600
-
601
- /*
602
- * Usage-row overrides. Placed after the base rules they refine rather than up beside
603
- * .settings-usage-row itself, because stylelint's no-descending-specificity rejects a
604
- * compound selector appearing before the plain one it overrides.
605
- */
606
-
607
- /* Sized by its content; the buckets take the rest, since four cells need the width. */
608
- .settings-usage-row > .settings-build-stat {
609
- flex: 0 1 auto;
610
- }
611
-
612
- .settings-usage-row .settings-token-breakdown {
613
- flex: 1 1 auto;
614
-
615
- /* The row owns the spacing now; this centres the column against the taller cost box. */
616
- justify-content: center;
617
- margin-bottom: 0;
618
- }
619
-
620
- /*
621
- * Basis auto, not 0: a zero basis splits the row into four equal columns, so CACHE WRITE is
622
- * squeezed exactly as hard as INPUT despite being twice the label. Sizing from content gives the
623
- * long labels the room their text needs and lets the short ones concede it, which is what makes
624
- * white-space: nowrap above safe — every column starts at least as wide as its own content,
625
- * then shares the slack. Still grows and shrinks, so the four stay flush edge to edge.
626
- */
627
- .settings-usage-row .settings-token-bucket {
628
- flex: 1 1 auto;
629
- }
630
-
631
- .settings-model-tags {
632
- display: flex;
633
- flex-wrap: wrap;
634
- gap: calc(var(--design-unit) * 2px);
635
- }
636
-
637
- .settings-model-tag {
638
- font-size: 11px;
639
- font-weight: 600;
640
- padding: 3px 9px;
641
- border-radius: 20px;
642
- font-family: ui-monospace, monospace;
643
- border: 1px solid var(--neutral-stroke-rest);
644
- }
645
-
646
- .settings-model-tag,
647
- .settings-cost-history-icon {
648
- --model-tag-color: var(--neutral-foreground-rest);
649
-
650
- background: color-mix(
651
- in srgb,
652
- var(--model-tag-color) var(--ai-tier-badge-bg-mix),
653
- var(--neutral-layer-1)
654
- );
655
- border-color: color-mix(in srgb, var(--model-tag-color) 20%, var(--neutral-layer-1));
656
- color: color-mix(in srgb, var(--model-tag-color), white var(--ai-tier-badge-text-lighten));
657
- }
658
-
659
- .settings-cost-history-title {
660
- font-size: 11px;
661
- text-transform: uppercase;
662
- letter-spacing: 0.08em;
663
- color: var(--neutral-foreground-hint);
664
- font-weight: 600;
665
- margin: calc(var(--design-unit) * 4px) 0 calc(var(--design-unit) * 2px);
666
- }
667
-
668
- /*
669
- * The heading labels the lifetime card as well as the rows, so the card gives up its own top
670
- * margin and the gap becomes the heading's alone. Adjacent siblings collapse to the LARGER of
671
- * the two margins, so leaving both would space the caps 3 units off the block they label while
672
- * the rows below sit at 2 — reading as though the heading belonged to neither.
673
- */
674
- .settings-cost-history-title + .settings-lifetime-usage {
675
- margin-top: 0;
676
- }
677
-
678
- .settings-cost-history {
679
- display: flex;
680
- flex-direction: column;
681
- gap: calc(var(--design-unit) * 2px);
682
- padding-bottom: calc(var(--design-unit) * 2px);
683
- }
684
-
685
- .settings-cost-history-icon {
686
- flex: 0 0 auto;
687
- width: 36px;
688
- height: 36px;
689
- border-radius: calc(var(--control-corner-radius) * 1px);
690
- display: inline-flex;
691
- align-items: center;
692
- justify-content: center;
693
- font-size: 16px;
694
- font-weight: 700;
695
- border: 1px solid var(--neutral-stroke-rest);
696
- }
697
-
698
- .settings-cost-history-row {
699
- display: flex;
700
- flex-direction: column;
701
- background: var(--neutral-layer-1);
702
- border: 1px solid var(--neutral-stroke-rest);
703
- border-radius: calc(var(--control-corner-radius) * 1.5px);
704
- padding: calc(var(--design-unit) * 4px);
705
- }
706
-
707
- .settings-cost-history-row-content {
708
- display: flex;
709
- align-items: flex-start;
710
- gap: calc(var(--design-unit) * 2px);
711
- }
712
-
713
- /*
714
- * All of these carry a ?hidden binding, and all declare display: flex — which silently beat the
715
- * UA [hidden] { display: none } rule, because author-origin declarations outrank user-agent
716
- * origin whatever the specificity. Without this, showTokens: false still rendered the full
717
- * breakdown in the lifetime block, the live block and every history row, and an empty row list
718
- * still occupied its padding under the lifetime total. Sibling elements that hide correctly do
719
- * so only by declaring no display at all. Same treatment as .settings-modal-tab-panel[hidden]
720
- * near the top of this file.
721
- */
722
- .settings-usage-row-tokens[hidden],
723
- .settings-cost-history[hidden],
724
- .settings-cost-history-row-content[hidden] {
725
- display: none !important;
726
- }
727
-
728
- /*
729
- * The buckets inside a history row drop the panel treatment they carry in the summary
730
- * blocks — the row is already a bordered card, and a second box inside it reads as a
731
- * nested panel. The adjacent-sibling rule above supplies the separator instead.
732
- */
733
- .settings-cost-history-row-breakdown .settings-token-breakdown {
734
- flex: 1 1 auto;
735
- margin-bottom: 0;
736
- padding: 0;
737
- background: none;
738
- border: none;
739
- }
740
-
741
- .settings-cost-history-row-content + .settings-cost-history-row-content {
742
- border-top: 1px solid var(--neutral-stroke-rest);
743
- margin-top: calc(var(--design-unit) * 2px);
744
- padding-top: calc(var(--design-unit) * 2px);
745
- }
746
-
747
- .settings-cost-history-row-body {
748
- flex: 1 1 auto;
749
- min-width: 0;
750
- display: flex;
751
- gap: calc(var(--design-unit) * 2px);
752
- justify-content: space-between;
753
- }
754
-
755
- /*
756
- * Holds the cost and the delete button as one centred pair. The button used to be a sibling
757
- * of the whole row body, kept in place by a -2px nudge tuned for when the metrics column had
758
- * two lines (cost plus a merged token total). Dropping that second line left the nudge
759
- * compensating for nothing. Centring the two against each other needs no magic number and
760
- * cannot drift again if the metrics content changes.
761
- *
762
- * NB this rule previously set align-items with no display:flex, so it had no effect at all.
763
- */
764
- .settings-cost-history-row-right {
765
- display: flex;
766
- align-items: center;
767
- gap: calc(var(--design-unit) * 1px);
768
- flex: 0 0 auto;
769
- }
770
-
771
- .settings-cost-history-row-cost,
772
- .settings-cost-history-row-title {
773
- font-size: 14px;
774
- font-weight: 600;
775
- color: var(--neutral-foreground-rest);
776
- min-width: 0;
777
- }
778
-
779
- .settings-cost-history-row-metrics {
780
- display: flex;
781
- flex-direction: column;
782
- flex: 0 0 auto;
783
- font-size: 13px;
784
- font-family: ui-monospace, monospace;
785
- color: var(--neutral-foreground-rest);
786
- white-space: nowrap;
787
- }
788
-
789
- .settings-cost-history-row-date {
790
- font-size: 12px;
791
- color: var(--neutral-foreground-hint);
792
- }
793
-
794
- .settings-cost-history-delete {
795
- flex: 0 0 auto;
796
- color: var(--neutral-foreground-hint);
797
- }
798
-
799
- .settings-cost-history-delete:hover {
800
- color: var(--error-color);
801
- }
802
-
803
- .settings-cost-history ::slotted(*) {
804
- display: block;
805
- }
806
-
807
- .settings-modal-footer {
808
- width: 100%;
809
- }
810
-
811
- .settings-done-button {
812
- margin-left: auto;
813
- }
814
-
815
- .settings-modal-footer-actions {
816
- display: flex;
817
- align-items: center;
818
- justify-content: space-between;
819
- gap: calc(var(--design-unit) * 2px);
820
- width: 100%;
821
- }
822
-
823
- .settings-disclaimer {
824
- font-size: 12px;
825
- color: var(--neutral-foreground-hint);
826
- max-width: 60%;
827
- line-height: 1.4;
828
- }
829
-
830
- /*
831
- * Inline spinner shown in the "Download agent log" button while the log builds
832
- * (GENC-1351 §5.8) — the lifetime-stitch path is an async provider round-trip.
833
- * Sized to the button label and tinted with currentColor so it tracks the
834
- * button's text colour in every appearance / theme.
835
- */
836
- [part='download-button'] .download-spinner {
837
- display: inline-block;
838
- width: 12px;
839
- height: 12px;
840
- margin-right: calc(var(--design-unit) * 1px);
841
- vertical-align: -1px;
842
- border: 2px solid currentColor;
843
- border-right-color: transparent;
844
- border-radius: 50%;
845
- animation: download-spin 0.6s linear infinite;
846
- }
847
-
848
- @keyframes download-spin {
849
- to {
850
- transform: rotate(360deg);
851
- }
852
- }
853
- `;