@puredesktop/puredesktop-ui-bridge 2.1.7 → 2.1.9

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 (119) hide show
  1. package/package.json +89 -5
  2. package/src/agents/mcpServerPresets.test.ts +105 -0
  3. package/src/agents/mcpServerPresets.ts +380 -0
  4. package/src/agents/runtime/index.ts +7 -0
  5. package/src/agents/runtime/mapAgentSnapshot.ts +11 -8
  6. package/src/agents/runtime/pendingAsks.test.ts +117 -0
  7. package/src/agents/runtime/pendingAsks.ts +110 -0
  8. package/src/bridge/agentScopeDefaults.ts +65 -0
  9. package/src/bridge/agentTypes.ts +57 -3
  10. package/src/bridge/agents.d.mts +6 -0
  11. package/src/bridge/agents.mjs +10 -0
  12. package/src/bridge/agents.ts +4 -0
  13. package/src/bridge/collectionImagePaste.ts +19 -1
  14. package/src/bridge/context.mjs +32 -0
  15. package/src/bridge/credentials.d.mts +62 -0
  16. package/src/bridge/credentials.mjs +53 -0
  17. package/src/bridge/documents.d.mts +76 -0
  18. package/src/bridge/documents.mjs +40 -0
  19. package/src/bridge/events.d.mts +1 -0
  20. package/src/bridge/events.mjs +1 -0
  21. package/src/bridge/googleAuth.ts +7 -152
  22. package/src/bridge/mcpClient.d.mts +74 -0
  23. package/src/bridge/mcpClient.mjs +79 -0
  24. package/src/bridge/methods.d.mts +45 -0
  25. package/src/bridge/methods.mjs +46 -0
  26. package/src/bridge/notifications.d.mts +12 -0
  27. package/src/bridge/notifications.mjs +36 -0
  28. package/src/bridge/operations.d.mts +44 -0
  29. package/src/bridge/operations.mjs +40 -0
  30. package/src/bridge/pureRender/base.css +44 -0
  31. package/src/bridge/pureRender/document.ts +29 -2
  32. package/src/bridge/pureRender/index.ts +3 -0
  33. package/src/bridge/pureRender/normalize.ts +167 -0
  34. package/src/bridge/pureRender/sanitizeExportBody.test.ts +51 -0
  35. package/src/bridge/pureRender/sanitizeExportBody.ts +61 -0
  36. package/src/bridge/pureRender/styles.ts +125 -5
  37. package/src/bridge/pureRender/theme.test.ts +259 -0
  38. package/src/bridge/pureRender/theme.ts +19 -1
  39. package/src/bridge/pureRender/types.ts +33 -0
  40. package/src/bridge/pureRender/visualLayoutInspection.test.ts +26 -0
  41. package/src/bridge/pureRender/visualLayoutInspection.ts +75 -0
  42. package/src/bridge/react/useDocumentHotkeys.ts +41 -0
  43. package/src/bridge/react/useDocumentLifecycle.tsx +359 -0
  44. package/src/bridge/react/usePlatformAgentSessionDrive.test.tsx +29 -10
  45. package/src/bridge/react/usePlatformAgentSessionDrive.tsx +10 -81
  46. package/src/bridge/react/usePlatformAppSettings.test.tsx +105 -0
  47. package/src/bridge/react/usePlatformAppSettings.tsx +104 -0
  48. package/src/bridge/react/usePlatformJsonStore.test.tsx +152 -0
  49. package/src/bridge/react/usePlatformJsonStore.tsx +149 -0
  50. package/src/bridge/react/usePlatformOperations.tsx +75 -0
  51. package/src/bridge/storage.d.mts +23 -10
  52. package/src/bridge/storage.mjs +6 -3
  53. package/src/bridge/storage.test.ts +6 -6
  54. package/src/bridge/types.ts +7 -0
  55. package/src/components/agents/AgentComposer.tsx +10 -6
  56. package/src/components/agents/AgentDrawerPanel.test.tsx +2 -205
  57. package/src/components/agents/AgentDrawerPanel.tsx +23 -62
  58. package/src/components/agents/AgentMessageBubble.tsx +59 -33
  59. package/src/components/agents/AgentMessageList.tsx +4 -4
  60. package/src/components/agents/AgentQuestionPromptList.tsx +34 -212
  61. package/src/components/agents/AgentToolApprovalActions.tsx +13 -11
  62. package/src/components/agents/AgentToolCallCard.tsx +20 -20
  63. package/src/components/agents/AgentToolPendingList.tsx +6 -6
  64. package/src/components/agents/AgentToolPendingReview.tsx +6 -6
  65. package/src/components/agents/ContextPicker.tsx +239 -0
  66. package/src/components/agents/QuestionRequestList.tsx +278 -0
  67. package/src/components/agents/agentPanelStyles.ts +8 -31
  68. package/src/components/agents/agentTypes.ts +25 -41
  69. package/src/components/agents/index.ts +4 -0
  70. package/src/components/assets/asset-library/sidebar/AssetLibraryList.tsx +10 -4
  71. package/src/components/chrome/WorkspaceTabStrip.tsx +22 -4
  72. package/src/components/chrome/workspaceTabTypes.ts +2 -0
  73. package/src/components/common/chat/ChatBox.tsx +9 -9
  74. package/src/components/common/chat/ChatModelMenu.tsx +34 -4
  75. package/src/components/common/chat/ChatThread.tsx +23 -7
  76. package/src/components/common/connections/ProviderConnection.test.tsx +208 -0
  77. package/src/components/common/connections/ProviderConnection.tsx +277 -0
  78. package/src/components/common/connections/index.ts +5 -0
  79. package/src/components/common/containers/AppFrame.test.tsx +4 -4
  80. package/src/components/common/containers/AppFrame.tsx +26 -10
  81. package/src/components/common/containers/AppHeader.tsx +37 -15
  82. package/src/components/common/documents/DocumentHeaderActions.tsx +206 -0
  83. package/src/components/common/documents/DocumentSwitcher.tsx +1181 -0
  84. package/src/components/common/documents/index.ts +8 -0
  85. package/src/components/common/dropdown/MenuDropdownItem.tsx +14 -2
  86. package/src/components/common/dropdown/MenuPortal.tsx +3 -1
  87. package/src/components/common/dropdown/menuViewportPosition.test.ts +20 -10
  88. package/src/components/common/dropdown/menuViewportPosition.ts +35 -27
  89. package/src/components/common/overlays/Modal.tsx +13 -2
  90. package/src/components/common/research/EvidenceDossier.tsx +1232 -150
  91. package/src/components/common/research/index.ts +2 -0
  92. package/src/components/editor/EditorLinkPromptDialog.tsx +1 -1
  93. package/src/components/print-design/PrintDesignPanel.test.tsx +430 -40
  94. package/src/components/print-design/PrintDesignPanel.tsx +1770 -207
  95. package/src/components/print-design/index.ts +2 -0
  96. package/src/components/print-design/previewContent.test.ts +32 -0
  97. package/src/components/print-design/previewContent.ts +31 -0
  98. package/src/context/buildContextDocument.test.ts +240 -0
  99. package/src/context/buildContextDocument.ts +309 -0
  100. package/src/context/contextAccess.ts +66 -0
  101. package/src/context/contextConfig.ts +72 -0
  102. package/src/context/contextDocument.test.ts +155 -0
  103. package/src/context/contextDocument.ts +300 -0
  104. package/src/context/contextSections.test.ts +88 -0
  105. package/src/context/contextSections.ts +84 -0
  106. package/src/context/htmlToContextMarkdown.test.ts +134 -0
  107. package/src/context/htmlToContextMarkdown.ts +369 -0
  108. package/src/ics/generateIcs.test.ts +153 -0
  109. package/src/ics/generateIcs.ts +197 -0
  110. package/src/index.ts +3 -0
  111. package/src/net/httpRetry.test.ts +117 -0
  112. package/src/net/httpRetry.ts +111 -0
  113. package/src/theme/appAccents.test.ts +36 -35
  114. package/src/theme/appAccents.ts +93 -104
  115. package/src/theme/appIdentityCss.mjs +178 -229
  116. package/src/theme/appIdentityCss.ts +222 -231
  117. package/src/theme/themes/dark.ts +3 -1
  118. package/src/theme/themes/light.ts +3 -1
  119. package/src/bridge/googleProviderConfig.ts +0 -73
@@ -1,256 +1,247 @@
1
1
  export const appIdentityCss = `
2
- /*
3
- * Pure app identity layer.
4
- *
5
- * Identity owns only chrome: wordmark name, active tab marker, primary button,
6
- * and one live/selected region. Theme/status colors remain separate. Hues are
7
- * perceptually spaced and lightness-staggered so neighbouring apps differ by
8
- * value as well as hue.
9
- */
10
2
  :root,
11
3
  :where([data-app]) {
12
- --pure-identity-default: #1f9d57;
13
- --pure-identity-default-bg: #eef7f1;
14
- --pure-identity-default-tx: #15703f;
15
- --pure-identity-default-block: #235240;
16
- --app-acc: var(--pure-identity-default);
17
- --app-bg: var(--pure-identity-default-bg);
18
- --app-text: var(--pure-identity-default-tx);
19
- --app-block: var(--pure-identity-default-block);
20
- --app-primary-fill: var(--app-acc);
4
+ /* App identity ring — 20 hues, one per app, evenly spaced (~18deg) at
5
+ matched lightness/chroma in oklch. Chrome-only; never overrides
6
+ --platform-colors-accent (theme/status meaning). */
7
+ --pure-coral: oklch(0.55 0.125 12);
8
+ --pure-coral-bg: oklch(0.955 0.03 12);
9
+ --pure-coral-tx: oklch(0.43 0.12 12);
10
+ --pure-coral-blk: oklch(0.4 0.07 12);
11
+ --pure-redclay: oklch(0.55 0.125 30);
12
+ --pure-redclay-bg: oklch(0.955 0.03 30);
13
+ --pure-redclay-tx: oklch(0.43 0.12 30);
14
+ --pure-redclay-blk: oklch(0.4 0.07 30);
15
+ --pure-terracotta: oklch(0.55 0.125 48);
16
+ --pure-terracotta-bg: oklch(0.93 0.05 48);
17
+ --pure-terracotta-tx: oklch(0.43 0.12 48);
18
+ --pure-terracotta-blk: oklch(0.4 0.07 48);
19
+ --pure-bronze: oklch(0.55 0.125 66);
20
+ --pure-bronze-bg: oklch(0.955 0.03 66);
21
+ --pure-bronze-tx: oklch(0.43 0.12 66);
22
+ --pure-bronze-blk: oklch(0.4 0.07 66);
23
+ --pure-gold: oklch(0.55 0.125 84);
24
+ --pure-gold-bg: oklch(0.955 0.03 84);
25
+ --pure-gold-tx: oklch(0.43 0.12 84);
26
+ --pure-gold-blk: oklch(0.4 0.07 84);
27
+ --pure-citron: oklch(0.55 0.125 102);
28
+ --pure-citron-bg: oklch(0.955 0.03 102);
29
+ --pure-citron-tx: oklch(0.43 0.12 102);
30
+ --pure-citron-blk: oklch(0.4 0.07 102);
31
+ --pure-olive: oklch(0.55 0.125 120);
32
+ --pure-olive-bg: oklch(0.955 0.03 120);
33
+ --pure-olive-tx: oklch(0.43 0.12 120);
34
+ --pure-olive-blk: oklch(0.4 0.07 120);
35
+ --pure-leaf: oklch(0.55 0.125 138);
36
+ --pure-leaf-bg: oklch(0.955 0.03 138);
37
+ --pure-leaf-tx: oklch(0.43 0.12 138);
38
+ --pure-leaf-blk: oklch(0.4 0.07 138);
39
+ --pure-fern: oklch(0.55 0.125 156);
40
+ --pure-fern-bg: oklch(0.955 0.03 156);
41
+ --pure-fern-tx: oklch(0.43 0.12 156);
42
+ --pure-fern-blk: oklch(0.4 0.07 156);
43
+ --pure-spruce: oklch(0.55 0.125 174);
44
+ --pure-spruce-bg: oklch(0.955 0.03 174);
45
+ --pure-spruce-tx: oklch(0.43 0.12 174);
46
+ --pure-spruce-blk: oklch(0.4 0.07 174);
47
+ --pure-teal: oklch(0.55 0.125 192);
48
+ --pure-teal-bg: oklch(0.955 0.03 192);
49
+ --pure-teal-tx: oklch(0.43 0.12 192);
50
+ --pure-teal-blk: oklch(0.4 0.07 192);
51
+ --pure-ocean: oklch(0.55 0.125 210);
52
+ --pure-ocean-bg: oklch(0.955 0.03 210);
53
+ --pure-ocean-tx: oklch(0.43 0.12 210);
54
+ --pure-ocean-blk: oklch(0.4 0.07 210);
55
+ --pure-azure: oklch(0.55 0.125 228);
56
+ --pure-azure-bg: oklch(0.955 0.03 228);
57
+ --pure-azure-tx: oklch(0.43 0.12 228);
58
+ --pure-azure-blk: oklch(0.4 0.07 228);
59
+ --pure-cerulean: oklch(0.55 0.125 246);
60
+ --pure-cerulean-bg: oklch(0.955 0.03 246);
61
+ --pure-cerulean-tx: oklch(0.43 0.12 246);
62
+ --pure-cerulean-blk: oklch(0.4 0.07 246);
63
+ --pure-indigo: oklch(0.55 0.125 264);
64
+ --pure-indigo-bg: oklch(0.955 0.03 264);
65
+ --pure-indigo-tx: oklch(0.43 0.12 264);
66
+ --pure-indigo-blk: oklch(0.4 0.07 264);
67
+ --pure-violet: oklch(0.55 0.125 282);
68
+ --pure-violet-bg: oklch(0.955 0.03 282);
69
+ --pure-violet-tx: oklch(0.43 0.12 282);
70
+ --pure-violet-blk: oklch(0.4 0.07 282);
71
+ --pure-gantt: oklch(0.55 0.125 306);
72
+ --pure-gantt-bg: oklch(0.955 0.03 306);
73
+ --pure-gantt-tx: oklch(0.43 0.12 306);
74
+ --pure-gantt-blk: oklch(0.4 0.07 306);
75
+ --pure-purple: oklch(0.55 0.125 300);
76
+ --pure-purple-bg: oklch(0.955 0.03 300);
77
+ --pure-purple-tx: oklch(0.43 0.12 300);
78
+ --pure-purple-blk: oklch(0.4 0.07 300);
79
+ --pure-orchid: oklch(0.55 0.125 318);
80
+ --pure-orchid-bg: oklch(0.955 0.03 318);
81
+ --pure-orchid-tx: oklch(0.43 0.12 318);
82
+ --pure-orchid-blk: oklch(0.4 0.07 318);
83
+ --pure-magenta: oklch(0.55 0.125 336);
84
+ --pure-magenta-bg: oklch(0.955 0.03 336);
85
+ --pure-magenta-tx: oklch(0.43 0.12 336);
86
+ --pure-magenta-blk: oklch(0.4 0.07 336);
87
+ --pure-raspberry: oklch(0.55 0.125 354);
88
+ --pure-raspberry-bg: oklch(0.955 0.03 354);
89
+ --pure-raspberry-tx: oklch(0.43 0.12 354);
90
+ --pure-raspberry-blk: oklch(0.4 0.07 354);
91
+ --pure-house: #1f9d57;
92
+ --pure-house-bg: #eef7f1;
93
+ --pure-house-tx: #15703f;
94
+ --pure-house-blk: oklch(0.4 0.07 152);
95
+ --app-acc: var(--pure-house);
96
+ --app-block: var(--pure-house-blk);
97
+ --app-bg: var(--pure-house-bg);
98
+ --app-text: var(--pure-house-tx);
99
+ }
100
+
101
+ [data-app='teams'] {
102
+ --app-acc: var(--pure-coral);
103
+ --app-block: var(--pure-coral-blk);
104
+ --app-bg: var(--pure-coral-bg);
105
+ --app-text: var(--pure-coral-tx);
106
+ }
107
+
108
+ [data-app='vibes'] {
109
+ --app-acc: var(--pure-redclay);
110
+ --app-block: var(--pure-redclay-blk);
111
+ --app-bg: var(--pure-redclay-bg);
112
+ --app-text: var(--pure-redclay-tx);
113
+ }
114
+
115
+ [data-app='mail'] {
116
+ --app-acc: var(--pure-terracotta);
117
+ --app-block: var(--pure-terracotta-blk);
118
+ --app-bg: var(--pure-terracotta-bg);
119
+ --app-text: var(--pure-terracotta-tx);
120
+ }
121
+
122
+ [data-app='files'] {
123
+ --app-acc: var(--pure-bronze);
124
+ --app-block: var(--pure-bronze-blk);
125
+ --app-bg: var(--pure-bronze-bg);
126
+ --app-text: var(--pure-bronze-tx);
127
+ }
128
+
129
+ [data-app='slides'] {
130
+ --app-acc: var(--pure-gold);
131
+ --app-block: var(--pure-gold-blk);
132
+ --app-bg: var(--pure-gold-bg);
133
+ --app-text: var(--pure-gold-tx);
134
+ }
135
+
136
+ [data-app='writer'] {
137
+ --app-acc: var(--pure-citron);
138
+ --app-block: var(--pure-citron-blk);
139
+ --app-bg: var(--pure-citron-bg);
140
+ --app-text: var(--pure-citron-tx);
141
+ }
142
+
143
+ [data-app='manuscript'] {
144
+ --app-acc: var(--pure-olive);
145
+ --app-block: var(--pure-olive-blk);
146
+ --app-bg: var(--pure-olive-bg);
147
+ --app-text: var(--pure-olive-tx);
148
+ }
149
+
150
+ [data-app='book'] {
151
+ --app-acc: var(--pure-leaf);
152
+ --app-block: var(--pure-leaf-blk);
153
+ --app-bg: var(--pure-leaf-bg);
154
+ --app-text: var(--pure-leaf-tx);
155
+ }
156
+
157
+ [data-app='reports'] {
158
+ --app-acc: var(--pure-fern);
159
+ --app-block: var(--pure-fern-blk);
160
+ --app-bg: var(--pure-fern-bg);
161
+ --app-text: var(--pure-fern-tx);
162
+ }
163
+
164
+ [data-app='chart'] {
165
+ --app-acc: var(--pure-spruce);
166
+ --app-block: var(--pure-spruce-blk);
167
+ --app-bg: var(--pure-spruce-bg);
168
+ --app-text: var(--pure-spruce-tx);
169
+ }
170
+
171
+ [data-app='knowledge'] {
172
+ --app-acc: var(--pure-teal);
173
+ --app-block: var(--pure-teal-blk);
174
+ --app-bg: var(--pure-teal-bg);
175
+ --app-text: var(--pure-teal-tx);
21
176
  }
22
177
 
23
- [data-app='teams'],
24
- [data-app='pureteams'] {
25
- --app-acc: oklch(0.58 0.13 8);
26
- --app-bg: oklch(0.955 0.03 8);
27
- --app-text: oklch(0.40 0.12 8);
28
- --app-block: oklch(0.40 0.06 8);
178
+ [data-app='research'] {
179
+ --app-acc: var(--pure-ocean);
180
+ --app-block: var(--pure-ocean-blk);
181
+ --app-bg: var(--pure-ocean-bg);
182
+ --app-text: var(--pure-ocean-tx);
29
183
  }
30
184
 
31
- [data-app='vibes'],
32
- [data-app='purevibes'] {
33
- --app-acc: oklch(0.50 0.14 26);
34
- --app-bg: oklch(0.955 0.03 26);
35
- --app-text: oklch(0.40 0.12 26);
36
- --app-block: oklch(0.40 0.06 26);
185
+ [data-app='sheets'] {
186
+ --app-acc: var(--pure-azure);
187
+ --app-block: var(--pure-azure-blk);
188
+ --app-bg: var(--pure-azure-bg);
189
+ --app-text: var(--pure-azure-tx);
37
190
  }
38
191
 
39
- [data-app='mail'],
40
- [data-app='puremail'] {
41
- --app-acc: oklch(0.60 0.12 44);
42
- --app-bg: oklch(0.93 0.05 44);
43
- --app-text: oklch(0.40 0.12 44);
44
- --app-block: oklch(0.40 0.06 44);
192
+ [data-app='calendar'] {
193
+ --app-acc: var(--pure-cerulean);
194
+ --app-block: var(--pure-cerulean-blk);
195
+ --app-bg: var(--pure-cerulean-bg);
196
+ --app-text: var(--pure-cerulean-tx);
45
197
  }
46
198
 
47
- [data-app='files'],
48
- [data-app='purefiles'] {
49
- --app-acc: oklch(0.50 0.13 64);
50
- --app-bg: oklch(0.955 0.03 64);
51
- --app-text: oklch(0.40 0.12 64);
52
- --app-block: oklch(0.40 0.06 64);
199
+ [data-app='desktop'] {
200
+ --app-acc: var(--pure-indigo);
201
+ --app-block: var(--pure-indigo-blk);
202
+ --app-bg: var(--pure-indigo-bg);
203
+ --app-text: var(--pure-indigo-tx);
53
204
  }
54
205
 
55
- [data-app='slides'],
56
- [data-app='pureslides'] {
57
- --app-acc: oklch(0.61 0.11 84);
58
- --app-bg: oklch(0.955 0.03 84);
59
- --app-text: oklch(0.40 0.11 84);
60
- --app-block: oklch(0.40 0.06 84);
206
+ [data-app='whiteboard'] {
207
+ --app-acc: var(--pure-violet);
208
+ --app-block: var(--pure-violet-blk);
209
+ --app-bg: var(--pure-violet-bg);
210
+ --app-text: var(--pure-violet-tx);
61
211
  }
62
212
 
63
- [data-app='writer'],
64
- [data-app='purewriter'] {
65
- --app-acc: oklch(0.50 0.12 102);
66
- --app-bg: oklch(0.955 0.03 102);
67
- --app-text: oklch(0.40 0.12 102);
68
- --app-block: oklch(0.40 0.06 102);
213
+ [data-app='gantt'] {
214
+ --app-acc: var(--pure-gantt);
215
+ --app-block: var(--pure-gantt-blk);
216
+ --app-bg: var(--pure-gantt-bg);
217
+ --app-text: var(--pure-gantt-tx);
69
218
  }
70
219
 
71
- [data-app='manuscript'],
72
- [data-app='puremanuscript'] {
73
- --app-acc: oklch(0.61 0.12 124);
74
- --app-bg: oklch(0.955 0.03 124);
75
- --app-text: oklch(0.40 0.12 124);
76
- --app-block: oklch(0.40 0.06 124);
220
+ [data-app='review'] {
221
+ --app-acc: var(--pure-purple);
222
+ --app-block: var(--pure-purple-blk);
223
+ --app-bg: var(--pure-purple-bg);
224
+ --app-text: var(--pure-purple-tx);
77
225
  }
78
226
 
79
- [data-app='book'],
80
- [data-app='purebook'] {
81
- --app-acc: oklch(0.48 0.14 148);
82
- --app-bg: oklch(0.955 0.03 148);
83
- --app-text: oklch(0.40 0.12 148);
84
- --app-block: oklch(0.40 0.06 148);
227
+ [data-app='tasks'] {
228
+ --app-acc: var(--pure-orchid);
229
+ --app-block: var(--pure-orchid-blk);
230
+ --app-bg: var(--pure-orchid-bg);
231
+ --app-text: var(--pure-orchid-tx);
85
232
  }
86
233
 
87
- [data-app='reports'],
88
- [data-app='purereports'] {
89
- --app-acc: oklch(0.61 0.12 166);
90
- --app-bg: oklch(0.955 0.03 166);
91
- --app-text: oklch(0.40 0.12 166);
92
- --app-block: oklch(0.40 0.06 166);
234
+ [data-app='assistant'] {
235
+ --app-acc: var(--pure-magenta);
236
+ --app-block: var(--pure-magenta-blk);
237
+ --app-bg: var(--pure-magenta-bg);
238
+ --app-text: var(--pure-magenta-tx);
93
239
  }
94
240
 
95
- [data-app='chart'],
96
- [data-app='purechart'] {
97
- --app-acc: oklch(0.48 0.13 184);
98
- --app-bg: oklch(0.955 0.03 184);
99
- --app-text: oklch(0.40 0.12 184);
100
- --app-block: oklch(0.40 0.06 184);
101
- }
102
-
103
- [data-app='knowledge'],
104
- [data-app='pureknowledge'] {
105
- --app-acc: oklch(0.46 0.11 198);
106
- --app-bg: oklch(0.955 0.03 198);
107
- --app-text: oklch(0.40 0.11 198);
108
- --app-block: oklch(0.40 0.06 198);
109
- }
110
-
111
- [data-app='research'],
112
- [data-app='pureresearch'] {
113
- --app-acc: oklch(0.63 0.12 222);
114
- --app-bg: oklch(0.955 0.03 222);
115
- --app-text: oklch(0.40 0.12 222);
116
- --app-block: oklch(0.40 0.06 222);
117
- }
118
-
119
- [data-app='sheets'],
120
- [data-app='puresheets'] {
121
- --app-acc: oklch(0.50 0.13 244);
122
- --app-bg: oklch(0.955 0.03 244);
123
- --app-text: oklch(0.40 0.12 244);
124
- --app-block: oklch(0.40 0.06 244);
125
- }
126
-
127
- [data-app='calendar'],
128
- [data-app='purecalendar'] {
129
- --app-acc: oklch(0.63 0.13 258);
130
- --app-bg: oklch(0.955 0.03 258);
131
- --app-text: oklch(0.40 0.12 258);
132
- --app-block: oklch(0.40 0.06 258);
133
- }
134
-
135
- [data-app='desktop'],
136
- [data-app='puredesktop'] {
137
- --app-acc: oklch(0.48 0.13 274);
138
- --app-bg: oklch(0.955 0.03 274);
139
- --app-text: oklch(0.40 0.12 274);
140
- --app-block: oklch(0.40 0.06 274);
141
- }
142
-
143
- [data-app='plan'],
144
- [data-app='pureplan'] {
145
- --app-acc: oklch(0.61 0.14 290);
146
- --app-bg: oklch(0.955 0.03 290);
147
- --app-text: oklch(0.40 0.12 290);
148
- --app-block: oklch(0.40 0.06 290);
149
- }
150
-
151
- [data-app='review'],
152
- [data-app='purereview'] {
153
- --app-acc: oklch(0.50 0.15 308);
154
- --app-bg: oklch(0.955 0.03 308);
155
- --app-text: oklch(0.40 0.12 308);
156
- --app-block: oklch(0.40 0.06 308);
157
- }
158
-
159
- [data-app='tasks'],
160
- [data-app='puretasks'] {
161
- --app-acc: oklch(0.63 0.15 324);
162
- --app-bg: oklch(0.955 0.03 324);
163
- --app-text: oklch(0.40 0.12 324);
164
- --app-block: oklch(0.40 0.06 324);
165
- }
166
-
167
- [data-app='assistant'],
168
- [data-app='pureassistant'] {
169
- --app-acc: oklch(0.50 0.15 340);
170
- --app-bg: oklch(0.955 0.03 340);
171
- --app-text: oklch(0.40 0.12 340);
172
- --app-block: oklch(0.40 0.06 340);
173
- }
174
-
175
- [data-app='people'],
176
- [data-app='purepeople'] {
177
- --app-acc: oklch(0.61 0.14 356);
178
- --app-bg: oklch(0.955 0.03 356);
179
- --app-text: oklch(0.40 0.12 356);
180
- --app-block: oklch(0.40 0.06 356);
181
- }
182
-
183
- [data-app='slides'],
184
- [data-app='pureslides'],
185
- [data-app='manuscript'],
186
- [data-app='puremanuscript'],
187
- [data-app='reports'],
188
- [data-app='purereports'],
189
- [data-app='research'],
190
- [data-app='pureresearch'],
191
- [data-app='calendar'],
192
- [data-app='purecalendar'],
193
- [data-app='plan'],
194
- [data-app='pureplan'],
195
- [data-app='tasks'],
196
- [data-app='puretasks'],
197
- [data-app='people'],
198
- [data-app='purepeople'] {
199
- --app-primary-fill: var(--app-block);
200
- }
201
-
202
- .pure-wordmark__prefix {
203
- color: var(--platform-colors-text-tertiary, #9a9aa0);
204
- }
205
-
206
- .pure-wordmark__name {
207
- color: var(--app-acc, var(--platform-colors-text));
208
- font-weight: 700;
209
- }
210
-
211
- .pure-tab.is-active {
212
- box-shadow: inset 0 -2px 0 0 var(--app-acc, var(--platform-colors-text));
213
- }
214
-
215
- .pure-viewtab.is-active {
216
- border-bottom-color: var(--app-acc, var(--platform-colors-text));
217
- }
218
-
219
- .pure-btn--primary {
220
- background: var(--app-primary-fill, var(--app-acc, var(--platform-colors-text)));
221
- border-color: var(--app-primary-fill, var(--app-acc, var(--platform-colors-text)));
222
- color: #fff;
223
- }
224
-
225
- .pure-btn--primary.is-light {
226
- background: var(--app-block, var(--platform-colors-text));
227
- border-color: var(--app-block, var(--platform-colors-text));
228
- }
229
-
230
- .pure-btn--bordered {
231
- background: var(--platform-colors-surface, #fff);
232
- border-color: var(--app-acc, var(--platform-colors-text));
233
- color: var(--app-text, var(--platform-colors-text));
234
- }
235
-
236
- .pure-selected {
237
- border-left-color: var(--app-acc, var(--platform-colors-accent));
238
- background: var(--platform-colors-surface, #fff);
239
- }
240
-
241
- .pure-selected--chip {
242
- background: var(--app-bg, var(--platform-colors-surface-muted));
243
- }
244
-
245
- .pure-active-col {
246
- border-color: var(--app-acc, var(--platform-colors-accent));
247
- border-top-color: var(--app-acc, var(--platform-colors-accent));
248
- border-radius: 0;
249
- background: var(--platform-colors-surface, #fff);
250
- }
251
-
252
- .pure-block {
253
- background: var(--app-block, var(--platform-colors-text));
254
- color: #fff;
241
+ [data-app='people'] {
242
+ --app-acc: var(--pure-raspberry);
243
+ --app-block: var(--pure-raspberry-blk);
244
+ --app-bg: var(--pure-raspberry-bg);
245
+ --app-text: var(--pure-raspberry-tx);
255
246
  }
256
247
  `
@@ -46,7 +46,9 @@ export const darkTheme: PlatformTheme = createPlatformTheme(
46
46
  semanticRedMuted: '#3a211d',
47
47
  semanticRedBorder: '#753f38',
48
48
  focus: accent,
49
- selection: '#313135',
49
+ // Must contrast with surface-hover (#2c2c30) — otherwise text selected
50
+ // inside a focused/hovered field is invisible.
51
+ selection: neutral[600],
50
52
  /** Embedded plugin iframe canvas — must stay dark in dark mode */
51
53
  appViewport: '#202024',
52
54
  chromeTitlebar: '#202024',
@@ -49,7 +49,9 @@ export const lightTheme: PlatformTheme = createPlatformTheme(
49
49
  semanticRedMuted: '#f4dfdc',
50
50
  semanticRedBorder: '#dfb7b1',
51
51
  focus: accent,
52
- selection: neutral[100],
52
+ // Must contrast with surface-hover (also neutral[100]) — otherwise text
53
+ // selected inside a focused/hovered field is invisible.
54
+ selection: neutral[200],
53
55
  appViewport: neutral[25],
54
56
  chromeTitlebar: neutral[25],
55
57
  chromeTabStrip: neutral[75],
@@ -1,73 +0,0 @@
1
- import type { GoogleOauthTokens } from './googleAuth.js'
2
-
3
- export const GOOGLE_OAUTH_CLIENT_SECRET_KEY = 'google-oauth-client'
4
- export const PUREMAIL_GOOGLE_SECRET_KEY = 'puremail-google'
5
- export const PURECALENDAR_GOOGLE_SECRET_KEY = 'purecalendar-google'
6
-
7
- export interface GoogleProviderPublicSettings {
8
- clientId?: string
9
- email?: string
10
- }
11
-
12
- export interface GoogleOAuthClientSecretPayload {
13
- clientSecret?: string
14
- }
15
-
16
- export interface GoogleProviderSecretPayload {
17
- tokens?: GoogleOauthTokens
18
- }
19
-
20
- export interface GoogleProviderSettingsSource {
21
- label: string
22
- publicSettings: GoogleProviderPublicSettings | undefined
23
- }
24
-
25
- export interface ResolvedGoogleProviderPublicSettings {
26
- publicSettings: GoogleProviderPublicSettings
27
- sourceLabel?: string
28
- }
29
-
30
- export function normalizeGooglePublicSettings(
31
- value: GoogleProviderPublicSettings | undefined,
32
- ): GoogleProviderPublicSettings {
33
- return {
34
- clientId: value?.clientId?.trim() || undefined,
35
- email: value?.email?.trim() || undefined,
36
- }
37
- }
38
-
39
- export function resolveGooglePublicSettings(
40
- sources: GoogleProviderSettingsSource[],
41
- ): ResolvedGoogleProviderPublicSettings {
42
- for (const source of sources) {
43
- const publicSettings = normalizeGooglePublicSettings(source.publicSettings)
44
- if (publicSettings.clientId || publicSettings.email) {
45
- return { publicSettings, sourceLabel: source.label }
46
- }
47
- }
48
- return { publicSettings: {} }
49
- }
50
-
51
- export function parseGoogleClientSecretPayload(
52
- raw: string | null,
53
- ): GoogleOAuthClientSecretPayload {
54
- if (!raw) return {}
55
- try {
56
- const parsed = JSON.parse(raw) as GoogleOAuthClientSecretPayload
57
- return { clientSecret: parsed.clientSecret?.trim() || undefined }
58
- } catch {
59
- return {}
60
- }
61
- }
62
-
63
- export function parseGoogleProviderSecretPayload(
64
- raw: string | null,
65
- ): GoogleProviderSecretPayload {
66
- if (!raw) return {}
67
- try {
68
- const parsed = JSON.parse(raw) as GoogleProviderSecretPayload
69
- return parsed.tokens ? { tokens: parsed.tokens } : {}
70
- } catch {
71
- return {}
72
- }
73
- }