proto-plugin 0.1.0

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 (209) hide show
  1. package/AGENTS.md +350 -0
  2. package/README.md +279 -0
  3. package/components.json +18 -0
  4. package/package.json +73 -0
  5. package/scripts/download-mobbin-reference-images.mjs +112 -0
  6. package/scripts/lib/host-config.example.sh +48 -0
  7. package/scripts/lib/host-config.sh +25 -0
  8. package/scripts/lib/resolve-host-root.mjs +18 -0
  9. package/scripts/lib/source-path.sh +49 -0
  10. package/scripts/link-source-db.sh +128 -0
  11. package/scripts/link-source.sh +40 -0
  12. package/scripts/publish-package.sh +147 -0
  13. package/scripts/share-prototype.sh +279 -0
  14. package/scripts/sync-from-source.sh +74 -0
  15. package/scripts/verify-prototype-component-ids.mjs +151 -0
  16. package/scripts/verify-prototype-preview-states.mjs +135 -0
  17. package/src/app.ts +4 -0
  18. package/src/components/platform-ui/code-block.tsx +21 -0
  19. package/src/components/platform-ui/controls-panel-options.tsx +71 -0
  20. package/src/components/platform-ui/controls-panel-select.tsx +438 -0
  21. package/src/components/platform-ui/empty-state.tsx +15 -0
  22. package/src/components/platform-ui/icon-button.tsx +18 -0
  23. package/src/components/platform-ui/panel-select.tsx +123 -0
  24. package/src/components/platform-ui/panel.tsx +97 -0
  25. package/src/components/platform-ui/review-dropdown-menu.tsx +35 -0
  26. package/src/components/platform-ui/sidebar.tsx +293 -0
  27. package/src/components/platform-ui/toolbar-icon-button.tsx +34 -0
  28. package/src/components/platform-ui/toolbar.tsx +37 -0
  29. package/src/components/prototype-gallery-client.tsx +57 -0
  30. package/src/components/prototype-provider.tsx +20 -0
  31. package/src/components/prototypes/mini-pill-label.tsx +37 -0
  32. package/src/components/prototypes/prototype-change-log-panel.tsx +207 -0
  33. package/src/components/prototypes/prototype-comment-provider.tsx +61 -0
  34. package/src/components/prototypes/prototype-comment-toolbar.tsx +65 -0
  35. package/src/components/prototypes/prototype-control.tsx +31 -0
  36. package/src/components/prototypes/prototype-controls.tsx +553 -0
  37. package/src/components/prototypes/prototype-create-exploration-modal.tsx +117 -0
  38. package/src/components/prototypes/prototype-create-state-modal.tsx +117 -0
  39. package/src/components/prototypes/prototype-default-state-map-page.tsx +66 -0
  40. package/src/components/prototypes/prototype-design-brief-modal.tsx +128 -0
  41. package/src/components/prototypes/prototype-design-brief-panel.tsx +525 -0
  42. package/src/components/prototypes/prototype-design-context-panel.tsx +65 -0
  43. package/src/components/prototypes/prototype-floating-pill.module.scss +1341 -0
  44. package/src/components/prototypes/prototype-mobbin-gallery.tsx +330 -0
  45. package/src/components/prototypes/prototype-reference-docs.tsx +222 -0
  46. package/src/components/prototypes/prototype-review-chrome.module.scss +630 -0
  47. package/src/components/prototypes/prototype-review-chrome.tsx +1241 -0
  48. package/src/components/prototypes/prototype-review-dropdown-menu-item.tsx +1 -0
  49. package/src/components/prototypes/prototype-review-dropdown-menu-separator.tsx +1 -0
  50. package/src/components/prototypes/prototype-review-panel-menu-item.tsx +1 -0
  51. package/src/components/prototypes/prototype-review-panel-menu-separator.tsx +1 -0
  52. package/src/components/prototypes/prototype-review-panel-select.tsx +4 -0
  53. package/src/components/prototypes/prototype-review-sidebar.tsx +167 -0
  54. package/src/components/prototypes/prototype-share-link-restore.tsx +75 -0
  55. package/src/components/prototypes/prototype-share-mode.tsx +206 -0
  56. package/src/components/prototypes/prototype-spec-panel-content.tsx +538 -0
  57. package/src/components/prototypes/prototype-state-canvas-overlay.module.scss +336 -0
  58. package/src/components/prototypes/prototype-state-canvas-overlay.tsx +1023 -0
  59. package/src/components/prototypes/prototype-state-canvas.tsx +38 -0
  60. package/src/components/prototypes/prototype-state-screenshot-preview.tsx +47 -0
  61. package/src/components/prototypes/prototype-target.tsx +120 -0
  62. package/src/components/prototypes/prototype-tweak-highlight.tsx +132 -0
  63. package/src/components/prototypes/prototype-tweaks.tsx +48 -0
  64. package/src/components/prototypes/prototype-variant-explorer.tsx +347 -0
  65. package/src/components/prototypes/prototype-variant-rationale-panel.tsx +49 -0
  66. package/src/components/prototypes/prototype-variant-tabs.tsx +207 -0
  67. package/src/components/prototypes/prototype-vercel-preview-modal.tsx +120 -0
  68. package/src/components/prototypes/state-map-annotation-tooltip.module.scss +89 -0
  69. package/src/components/prototypes/state-map-annotation-tooltip.tsx +137 -0
  70. package/src/components/prototypes/state-map-wireframe-highlight.module.scss +25 -0
  71. package/src/components/prototypes/state-map-wireframe-highlight.tsx +82 -0
  72. package/src/components/shell/prototype-gallery-shell.tsx +79 -0
  73. package/src/components/shell/prototype-screenshot-capture.tsx +45 -0
  74. package/src/components/shell/prototype-shell.module.scss +194 -0
  75. package/src/components/shell/prototype-shell.tsx +160 -0
  76. package/src/components/shell/prototype-state-screenshot-capture.tsx +68 -0
  77. package/src/components/ui/button.tsx +58 -0
  78. package/src/components/ui/dialog.module.scss +81 -0
  79. package/src/components/ui/dialog.tsx +127 -0
  80. package/src/components/ui/dropdown-menu.tsx +200 -0
  81. package/src/components/ui/input.tsx +22 -0
  82. package/src/components/ui/label.tsx +26 -0
  83. package/src/components/ui/option-select.tsx +81 -0
  84. package/src/components/ui/scroll-area.tsx +48 -0
  85. package/src/components/ui/separator.tsx +31 -0
  86. package/src/components/ui/slider.tsx +28 -0
  87. package/src/components/ui/switch.tsx +29 -0
  88. package/src/components/ui/tabs.tsx +55 -0
  89. package/src/components/ui/toggle-group.tsx +80 -0
  90. package/src/components/ui/tooltip.tsx +32 -0
  91. package/src/config/create-prototype-gallery-page.tsx +65 -0
  92. package/src/config/create-prototype-host-app.tsx +121 -0
  93. package/src/config/create-prototype-page.tsx +41 -0
  94. package/src/config/create-prototype-site-layout.tsx +28 -0
  95. package/src/config/define-prototype-config.ts +7 -0
  96. package/src/config/prototype-icon.tsx +25 -0
  97. package/src/config/prototype-site-layout-client.tsx +35 -0
  98. package/src/config/with-prototype.ts +20 -0
  99. package/src/index.ts +303 -0
  100. package/src/lib/pr-split/build-pr-agent-prompt.ts +68 -0
  101. package/src/lib/pr-split/build-pr-split-prototype-url.ts +12 -0
  102. package/src/lib/pr-split/pr-split-highlight.ts +6 -0
  103. package/src/lib/pr-split/pr-split-types.ts +58 -0
  104. package/src/lib/pr-split/resolve-source-preview-url.ts +45 -0
  105. package/src/lib/pr-split/use-pr-vercel-previews.ts +69 -0
  106. package/src/lib/prototype-comments/core/annotation-channel.ts +41 -0
  107. package/src/lib/prototype-comments/core/annotation-status.ts +60 -0
  108. package/src/lib/prototype-comments/core/annotation-target.ts +567 -0
  109. package/src/lib/prototype-comments/core/capture-theme.ts +41 -0
  110. package/src/lib/prototype-comments/core/capture.ts +11 -0
  111. package/src/lib/prototype-comments/core/comment-capture-blocked.ts +47 -0
  112. package/src/lib/prototype-comments/core/comment-threads.ts +52 -0
  113. package/src/lib/prototype-comments/core/element-identification.ts +615 -0
  114. package/src/lib/prototype-comments/core/export.ts +35 -0
  115. package/src/lib/prototype-comments/core/freeze-animations.ts +266 -0
  116. package/src/lib/prototype-comments/core/identify-element.ts +76 -0
  117. package/src/lib/prototype-comments/core/normalize-viewport.ts +35 -0
  118. package/src/lib/prototype-comments/core/react-detection.ts +704 -0
  119. package/src/lib/prototype-comments/core/restore.ts +7 -0
  120. package/src/lib/prototype-comments/core/screenshot.ts +428 -0
  121. package/src/lib/prototype-comments/core/source-location.ts +906 -0
  122. package/src/lib/prototype-comments/core/storage.ts +80 -0
  123. package/src/lib/prototype-comments/core/types.ts +79 -0
  124. package/src/lib/prototype-comments/core/validation.ts +17 -0
  125. package/src/lib/prototype-comments/hooks/useLayoutShift.ts +61 -0
  126. package/src/lib/prototype-comments/index.ts +58 -0
  127. package/src/lib/prototype-comments/react/CommentCaptureToolbar.tsx +1398 -0
  128. package/src/lib/prototype-comments/react/CommentProvider.tsx +298 -0
  129. package/src/lib/prototype-comments/scss.d.ts +10 -0
  130. package/src/lib/prototype-comments/ui/CommentAnnotationOverlay.tsx +253 -0
  131. package/src/lib/prototype-comments/ui/CommentDetailPage.tsx +56 -0
  132. package/src/lib/prototype-comments/ui/CommentHeaderCount.tsx +28 -0
  133. package/src/lib/prototype-comments/ui/CommentThread.tsx +331 -0
  134. package/src/lib/prototype-comments/ui/CommentsGrid.tsx +780 -0
  135. package/src/lib/prototype-comments/ui/CommentsListPage.tsx +25 -0
  136. package/src/lib/prototype-comments/ui/CommentsSidebar.tsx +77 -0
  137. package/src/lib/prototype-comments/ui/annotation-marker/index.tsx +200 -0
  138. package/src/lib/prototype-comments/ui/annotation-marker/styles.module.scss +194 -0
  139. package/src/lib/prototype-comments/ui/annotation-popup/index.tsx +335 -0
  140. package/src/lib/prototype-comments/ui/annotation-popup/styles.module.scss +469 -0
  141. package/src/lib/prototype-comments/ui/capture-styles.module.scss +2225 -0
  142. package/src/lib/prototype-comments/ui/comment-highlight.ts +48 -0
  143. package/src/lib/prototype-comments/ui/comment-thread.module.scss +203 -0
  144. package/src/lib/prototype-comments/ui/comments-grid-card.module.scss +253 -0
  145. package/src/lib/prototype-comments/ui/comments-sidebar.module.scss +123 -0
  146. package/src/lib/prototype-comments/ui/icon-transitions.module.scss +51 -0
  147. package/src/lib/prototype-comments/ui/icons.tsx +1086 -0
  148. package/src/lib/prototype-comments/ui/is-comment-detail-path.ts +7 -0
  149. package/src/lib/prototypes/capture-prototype-viewport.ts +32 -0
  150. package/src/lib/prototypes/changelog-meta-context.tsx +162 -0
  151. package/src/lib/prototypes/changelog-meta-storage.ts +62 -0
  152. package/src/lib/prototypes/changelog-meta.ts +95 -0
  153. package/src/lib/prototypes/create-prototype-registry.ts +74 -0
  154. package/src/lib/prototypes/create-state-screenshot-thumbnail.ts +46 -0
  155. package/src/lib/prototypes/design-exploration-default-storage.ts +68 -0
  156. package/src/lib/prototypes/design-exploration-default.ts +51 -0
  157. package/src/lib/prototypes/design-exploration-types.ts +203 -0
  158. package/src/lib/prototypes/prototype-comment-registry.tsx +145 -0
  159. package/src/lib/prototypes/prototype-comment-review-bridge.tsx +40 -0
  160. package/src/lib/prototypes/prototype-comment-review-state.ts +57 -0
  161. package/src/lib/prototypes/prototype-component-registry.ts +40 -0
  162. package/src/lib/prototypes/prototype-config-types.ts +34 -0
  163. package/src/lib/prototypes/prototype-preview-state-registry.ts +443 -0
  164. package/src/lib/prototypes/prototype-preview-state-types.ts +89 -0
  165. package/src/lib/prototypes/prototype-review-context.tsx +905 -0
  166. package/src/lib/prototypes/prototype-review-url.ts +134 -0
  167. package/src/lib/prototypes/prototype-share-link.ts +175 -0
  168. package/src/lib/prototypes/prototype-state-canvas-constants.ts +118 -0
  169. package/src/lib/prototypes/prototype-state-canvas-types.ts +159 -0
  170. package/src/lib/prototypes/prototype-state-screenshot.ts +39 -0
  171. package/src/lib/prototypes/prototype-tweak-registry.ts +96 -0
  172. package/src/lib/prototypes/prototype-tweak-types.ts +31 -0
  173. package/src/lib/prototypes/reference-docs.ts +137 -0
  174. package/src/lib/prototypes/screenshot-manifest.ts +33 -0
  175. package/src/lib/prototypes/screenshot-src.ts +7 -0
  176. package/src/lib/prototypes/share-command.ts +8 -0
  177. package/src/lib/prototypes/state-map-annotation.ts +70 -0
  178. package/src/lib/prototypes/use-design-exploration-default.ts +114 -0
  179. package/src/lib/prototypes/use-persisted-local-state.ts +140 -0
  180. package/src/lib/prototypes/use-prototype-comments.ts +63 -0
  181. package/src/lib/prototypes/use-prototype-mobile-viewport-frame.ts +46 -0
  182. package/src/lib/prototypes/use-prototype-state-screenshot-src.ts +71 -0
  183. package/src/lib/prototypes/use-prototype-tool-theme.tsx +115 -0
  184. package/src/lib/prototypes/use-prototype-viewport-frame.ts +34 -0
  185. package/src/lib/prototypes/use-register-prototype-reference-docs.ts +16 -0
  186. package/src/lib/prototypes/use-snap-corner-position.ts +417 -0
  187. package/src/lib/prototypes/use-toolbar-hover-panel.ts +98 -0
  188. package/src/lib/prototypes/variant-set-lucide-icon.tsx +55 -0
  189. package/src/lib/tool-portal.ts +33 -0
  190. package/src/lib/use-copy-to-clipboard.ts +81 -0
  191. package/src/lib/utils.ts +6 -0
  192. package/src/lib/vercel-preview/parse-vercel-github-comment.ts +81 -0
  193. package/src/server/create-host-api-route.ts +100 -0
  194. package/src/server/create-prototype-api-routes.ts +428 -0
  195. package/src/server/gallery/create-gallery-api.ts +56 -0
  196. package/src/server/gallery/folders-route.ts +156 -0
  197. package/src/server/gallery/gallery-env.ts +39 -0
  198. package/src/server/gallery/gallery-route.ts +150 -0
  199. package/src/server/gallery/gallery-types.ts +15 -0
  200. package/src/server/gallery/image-route.ts +59 -0
  201. package/src/server/gallery/item-route.ts +92 -0
  202. package/src/server/pr-vercel-preview-route.ts +162 -0
  203. package/src/server/redis/client.ts +55 -0
  204. package/src/server/redis/prototype-changelog-meta.ts +31 -0
  205. package/src/server/redis/prototype-comments.ts +92 -0
  206. package/src/server/redis/prototype-design-exploration-default.ts +32 -0
  207. package/src/server.ts +51 -0
  208. package/src/styles/globals.css +624 -0
  209. package/tsconfig.json +19 -0
@@ -0,0 +1,2225 @@
1
+ // Page Feedback Toolbar - CSS-only version (no framer-motion)
2
+ // Uses CSS animations for all transitions
3
+
4
+ // Protect stroke-based icons from host page `svg { fill: currentColor }` rules.
5
+ // Scoped to prototype comment system's own containers to avoid breaking host SVGs that use
6
+ // fill="none" with CSS-based fills (e.g. Tailwind's fill-current).
7
+ // See: https://github.com/prototype-comments/issues/58
8
+ .toolbar,
9
+ .markersLayer,
10
+ .fixedMarkersLayer {
11
+ svg[fill="none"] {
12
+ fill: none !important;
13
+ }
14
+
15
+ svg[fill="none"] :not([fill]) {
16
+ fill: none !important;
17
+ }
18
+ }
19
+
20
+ // Protect toolbar elements from host page global CSS.
21
+ // The toolbar is portaled to document.body, so global rules like
22
+ // `button { background: black }` and `* { outline-ring/50 }` leak in.
23
+ // :where() zeroes specificity so our component class styles (0,1,0) win.
24
+ // Only reset cosmetic properties that global CSS commonly overrides —
25
+ // avoid `all: unset` which also nukes layout props (box-sizing,
26
+ // appearance, line-height) that component styles don't re-set.
27
+ // Scoped to portaled UI roots (paired with data-prototype-comment-root in JSX).
28
+ .captureScope :where(button, input, select, textarea, label),
29
+ .controlsContent :where(button, input, select, textarea, label) {
30
+ background: unset;
31
+ border: unset;
32
+ border-radius: unset;
33
+ padding: unset;
34
+ margin: unset;
35
+ color: unset;
36
+ font-family: unset;
37
+ font-weight: unset;
38
+ font-style: unset;
39
+ line-height: unset;
40
+ letter-spacing: unset;
41
+ text-transform: unset;
42
+ text-decoration: unset;
43
+ box-shadow: unset;
44
+ outline: unset;
45
+ }
46
+
47
+ // =============================================================================
48
+ // Animation Keyframes
49
+ // =============================================================================
50
+
51
+ @keyframes toolbarEnter {
52
+ from {
53
+ opacity: 0;
54
+ }
55
+ to {
56
+ opacity: 1;
57
+ }
58
+ }
59
+
60
+ @keyframes toolbarHide {
61
+ from {
62
+ opacity: 1;
63
+ }
64
+ to {
65
+ opacity: 0;
66
+ }
67
+ }
68
+
69
+ @keyframes badgeEnter {
70
+ from {
71
+ opacity: 0;
72
+ }
73
+ to {
74
+ opacity: 1;
75
+ }
76
+ }
77
+
78
+ @keyframes scaleIn {
79
+ from {
80
+ opacity: 0;
81
+ transform: scale(0.85);
82
+ }
83
+ to {
84
+ opacity: 1;
85
+ transform: scale(1);
86
+ }
87
+ }
88
+
89
+ @keyframes scaleOut {
90
+ from {
91
+ opacity: 1;
92
+ transform: scale(1);
93
+ }
94
+ to {
95
+ opacity: 0;
96
+ transform: scale(0.85);
97
+ }
98
+ }
99
+
100
+ @keyframes slideUp {
101
+ from {
102
+ opacity: 0;
103
+ transform: scale(0.85) translateY(8px);
104
+ }
105
+ to {
106
+ opacity: 1;
107
+ transform: scale(1) translateY(0);
108
+ }
109
+ }
110
+
111
+ @keyframes slideDown {
112
+ from {
113
+ opacity: 1;
114
+ transform: scale(1) translateY(0);
115
+ }
116
+ to {
117
+ opacity: 0;
118
+ transform: scale(0.85) translateY(8px);
119
+ }
120
+ }
121
+
122
+ @keyframes fadeIn {
123
+ from {
124
+ opacity: 0;
125
+ }
126
+ to {
127
+ opacity: 1;
128
+ }
129
+ }
130
+
131
+ @keyframes fadeOut {
132
+ from {
133
+ opacity: 1;
134
+ }
135
+ to {
136
+ opacity: 0;
137
+ }
138
+ }
139
+
140
+ @keyframes hoverHighlightIn {
141
+ from {
142
+ opacity: 0;
143
+ }
144
+ to {
145
+ opacity: 1;
146
+ }
147
+ }
148
+
149
+ @keyframes hoverTooltipIn {
150
+ from {
151
+ opacity: 0;
152
+ }
153
+ to {
154
+ opacity: 1;
155
+ }
156
+ }
157
+
158
+ // Disable transitions on theme toggle
159
+ .disableTransitions :global(:is(*, *::before, *::after)) {
160
+ transition: none !important;
161
+ }
162
+
163
+ // =============================================================================
164
+ // Toolbar
165
+ // =============================================================================
166
+
167
+ .toolbar {
168
+ position: fixed;
169
+ bottom: 1.25rem;
170
+ right: 1.25rem;
171
+ width: 337px;
172
+ z-index: 100000;
173
+ font-family:
174
+ var(--tool-font-body, "DM Sans", ui-sans-serif, system-ui, sans-serif);
175
+ pointer-events: none;
176
+ transition:
177
+ left 0s,
178
+ top 0s,
179
+ right 0s,
180
+ bottom 0s; // Instant positioning changes
181
+ }
182
+
183
+ // Positional defaults use :where() for zero specificity so consumer className can override.
184
+ // See: https://github.com/prototype-comments/issues/146
185
+ :where(.toolbar) {
186
+ bottom: 1.25rem;
187
+ right: 1.25rem;
188
+ }
189
+
190
+ .toolbarContainer {
191
+ position: relative;
192
+ user-select: none;
193
+ margin-left: auto;
194
+ align-self: flex-end;
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: center;
198
+ background: #1e1e1e;
199
+ color: #fff;
200
+ border: none;
201
+ box-shadow:
202
+ 0 2px 8px rgba(0, 0, 0, 0.28),
203
+ 0 0 0 1px #333333;
204
+ pointer-events: auto;
205
+
206
+ // Animated properties
207
+ transition:
208
+ width 0.4s cubic-bezier(0.19, 1, 0.22, 1),
209
+ transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);
210
+
211
+ &.entrance {
212
+ animation: toolbarEnter 0.25s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
213
+ }
214
+
215
+ &.hiding {
216
+ animation: toolbarHide 0.4s cubic-bezier(0.4, 0, 1, 1) forwards;
217
+ pointer-events: none;
218
+ }
219
+
220
+ &.collapsed {
221
+ width: 44px;
222
+ height: 44px;
223
+ border-radius: 22px;
224
+ padding: 0;
225
+ cursor: pointer;
226
+
227
+ svg {
228
+ margin-top: -1px;
229
+ }
230
+
231
+ &:hover {
232
+ background: #252525;
233
+ }
234
+
235
+ }
236
+
237
+ &.expanded {
238
+ height: 44px;
239
+ border-radius: 1.5rem;
240
+ padding: 0.375rem;
241
+ width: 297px;
242
+
243
+ &.serverConnected {
244
+ width: 337px;
245
+ }
246
+
247
+ &.fitContent {
248
+ width: fit-content;
249
+ }
250
+ }
251
+ }
252
+
253
+ .toggleContent {
254
+ position: absolute;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ transition: opacity 0.1s cubic-bezier(0.19, 1, 0.22, 1);
259
+
260
+ &.visible {
261
+ opacity: 1;
262
+ visibility: visible;
263
+ pointer-events: auto;
264
+ }
265
+
266
+ &.hidden {
267
+ opacity: 0;
268
+ visibility: hidden;
269
+ pointer-events: none;
270
+ }
271
+ }
272
+
273
+ .controlsContent {
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 0.375rem;
277
+ transition:
278
+ filter 0.8s cubic-bezier(0.19, 1, 0.22, 1),
279
+ opacity 0.8s cubic-bezier(0.19, 1, 0.22, 1),
280
+ transform 0.6s cubic-bezier(0.19, 1, 0.22, 1);
281
+
282
+ &.visible {
283
+ opacity: 1;
284
+ filter: blur(0px);
285
+ transform: scale(1);
286
+ visibility: visible;
287
+ pointer-events: auto;
288
+ }
289
+
290
+ &.hidden {
291
+ pointer-events: none;
292
+ opacity: 0;
293
+ filter: blur(10px);
294
+ transform: scale(0.4);
295
+ }
296
+ }
297
+
298
+ .badge {
299
+ position: absolute;
300
+ top: -13px;
301
+ right: -13px;
302
+ user-select: none;
303
+ min-width: 18px;
304
+ height: 18px;
305
+ padding: 0 5px;
306
+ border-radius: 9px;
307
+ background-color: var(--prototype-comment-color-accent);
308
+ color: white;
309
+ font-size: 0.625rem;
310
+ font-weight: 600;
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: center;
314
+ box-shadow:
315
+ 0 1px 3px rgba(0, 0, 0, 0.15),
316
+ inset 0 0 0 1px rgba(255, 255, 255, 0.04);
317
+ opacity: 1;
318
+ transition:
319
+ transform 0.3s ease,
320
+ opacity 0.2s ease;
321
+ transform: scale(1);
322
+
323
+ &.fadeOut {
324
+ opacity: 0;
325
+ transform: scale(0);
326
+ pointer-events: none;
327
+ }
328
+
329
+ &.entrance {
330
+ animation: badgeEnter 0.2s cubic-bezier(0.215, 0.61, 0.355, 1) 0.15s both;
331
+ }
332
+ }
333
+
334
+ .controlButton {
335
+ position: relative;
336
+ cursor: pointer;
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ width: 34px;
341
+ height: 34px;
342
+ border-radius: 50%;
343
+ border: none;
344
+ background: transparent;
345
+ color: var(--tool-chrome-icon, #888888);
346
+ outline: none;
347
+ box-shadow: none;
348
+ -webkit-tap-highlight-color: transparent;
349
+ transition:
350
+ background-color 0.15s ease,
351
+ color 0.15s ease,
352
+ opacity 0.2s ease;
353
+
354
+ &:focus:not(:focus-visible) {
355
+ outline: none;
356
+ }
357
+
358
+ &:focus-visible:not([data-active="true"]):not([data-error="true"]):not(
359
+ [data-failed="true"]
360
+ ):not([data-auto-sync="true"]) {
361
+ outline: none;
362
+ background: rgba(255, 255, 255, 0.08);
363
+ color: var(--tool-chrome-icon-hover, #a3a3a3);
364
+ }
365
+
366
+ &:hover:not(:disabled):not([data-active="true"]):not(
367
+ [data-failed="true"]
368
+ ):not([data-auto-sync="true"]):not([data-error="true"]):not(
369
+ [data-no-hover="true"]
370
+ ) {
371
+ background: rgba(255, 255, 255, 0.08);
372
+ color: var(--tool-chrome-icon-hover, #a3a3a3);
373
+ }
374
+
375
+ &:disabled {
376
+ opacity: 0.35;
377
+ cursor: not-allowed;
378
+ }
379
+
380
+ &[data-active="true"] {
381
+ color: var(--prototype-comment-color-blue);
382
+ background-color: color-mix(
383
+ in srgb,
384
+ var(--prototype-comment-color-blue) 25%,
385
+ transparent
386
+ );
387
+ }
388
+
389
+
390
+ &[data-error="true"] {
391
+ color: var(--prototype-comment-color-red);
392
+ background-color: color-mix(
393
+ in srgb,
394
+ var(--prototype-comment-color-red) 25%,
395
+ transparent
396
+ );
397
+ }
398
+
399
+ &[data-danger]:hover:not(:disabled):not([data-active="true"]):not(
400
+ [data-failed="true"]
401
+ ) {
402
+ background-color: color-mix(
403
+ in srgb,
404
+ var(--prototype-comment-color-red) 25%,
405
+ transparent
406
+ );
407
+ color: var(--prototype-comment-color-red);
408
+ }
409
+
410
+ &[data-no-hover="true"],
411
+ &.statusShowing {
412
+ cursor: default;
413
+ pointer-events: none;
414
+ background: transparent !important;
415
+ }
416
+
417
+ &[data-auto-sync="true"] {
418
+ color: var(--prototype-comment-color-green);
419
+ background: transparent;
420
+ cursor: default;
421
+ }
422
+
423
+ &[data-failed="true"] {
424
+ color: var(--prototype-comment-color-red);
425
+ background-color: color-mix(
426
+ in srgb,
427
+ var(--prototype-comment-color-red) 25%,
428
+ transparent
429
+ );
430
+ }
431
+ }
432
+
433
+ .buttonBadge {
434
+ position: absolute;
435
+ top: 0px;
436
+ right: 0px;
437
+ min-width: 16px;
438
+ height: 16px;
439
+ padding: 0 4px;
440
+ border-radius: 8px;
441
+ background-color: var(--prototype-comment-color-accent);
442
+ color: white;
443
+ font-size: 0.625rem;
444
+ font-weight: 600;
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ box-shadow:
449
+ 0 0 0 2px #1e1e1e,
450
+ 0 1px 3px rgba(0, 0, 0, 0.2);
451
+ pointer-events: none;
452
+
453
+ [data-prototype-comment-theme="light"] & {
454
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
455
+ }
456
+ }
457
+
458
+ // MCP connection indicator dot (near settings button)
459
+ @keyframes mcpIndicatorPulseConnected {
460
+ 0%,
461
+ 100% {
462
+ box-shadow: 0 0 0 0
463
+ color-mix(in srgb, var(--prototype-comment-color-green) 50%, transparent);
464
+ }
465
+ 50% {
466
+ box-shadow: 0 0 0 5px
467
+ color-mix(in srgb, var(--prototype-comment-color-green) 0%, transparent);
468
+ }
469
+ }
470
+
471
+ @keyframes mcpIndicatorPulseConnecting {
472
+ 0%,
473
+ 100% {
474
+ box-shadow: 0 0 0 0
475
+ color-mix(in srgb, var(--prototype-comment-color-yellow) 50%, transparent);
476
+ }
477
+ 50% {
478
+ box-shadow: 0 0 0 5px
479
+ color-mix(in srgb, var(--prototype-comment-color-yellow) 0%, transparent);
480
+ }
481
+ }
482
+
483
+ .mcpIndicator {
484
+ position: absolute;
485
+ top: 3px;
486
+ right: 3px;
487
+ width: 6px;
488
+ height: 6px;
489
+ border-radius: 50%;
490
+ pointer-events: none;
491
+ transition:
492
+ background-color 0.3s ease,
493
+ opacity 0.15s ease,
494
+ transform 0.15s ease;
495
+ opacity: 1;
496
+ transform: scale(1);
497
+
498
+ &.connected {
499
+ background-color: var(--prototype-comment-color-green);
500
+ animation: mcpIndicatorPulseConnected 2.5s ease-in-out infinite;
501
+ }
502
+
503
+ &.connecting {
504
+ background-color: var(--prototype-comment-color-yellow);
505
+ animation: mcpIndicatorPulseConnecting 1.5s ease-in-out infinite;
506
+ }
507
+
508
+ &.hidden {
509
+ opacity: 0;
510
+ transform: scale(0);
511
+ animation: none;
512
+ }
513
+ }
514
+
515
+ // Connection status indicator
516
+ @keyframes connectionPulse {
517
+ 0%,
518
+ 100% {
519
+ opacity: 1;
520
+ transform: scale(1);
521
+ }
522
+ 50% {
523
+ opacity: 0.6;
524
+ transform: scale(0.9);
525
+ }
526
+ }
527
+
528
+ .connectionIndicatorWrapper {
529
+ width: 8px;
530
+ height: 34px;
531
+ margin-left: 6px;
532
+ margin-right: 6px;
533
+ }
534
+
535
+ .connectionIndicator {
536
+ position: relative;
537
+ width: 8px;
538
+ height: 8px;
539
+ border-radius: 50%;
540
+ opacity: 0;
541
+ transition:
542
+ opacity 0.3s ease,
543
+ background-color 0.3s ease;
544
+ cursor: default;
545
+ }
546
+
547
+ .connectionIndicatorVisible {
548
+ opacity: 1;
549
+ }
550
+
551
+ .connectionIndicatorConnected {
552
+ background-color: var(--prototype-comment-color-green);
553
+ animation: connectionPulse 2.5s ease-in-out infinite;
554
+ }
555
+
556
+ .connectionIndicatorDisconnected {
557
+ background-color: var(--prototype-comment-color-red);
558
+ animation: none;
559
+ }
560
+
561
+ .connectionIndicatorConnecting {
562
+ background-color: var(--prototype-comment-color-yellow);
563
+ animation: connectionPulse 1s ease-in-out infinite;
564
+ }
565
+
566
+ // Button wrapper for tooltip positioning (tooltip is sibling, not child of button)
567
+ .buttonWrapper {
568
+ position: relative;
569
+ display: flex;
570
+ align-items: center;
571
+ justify-content: center;
572
+
573
+ &:hover .buttonTooltip {
574
+ opacity: 1;
575
+ visibility: visible;
576
+ transition-delay: 0.85s;
577
+ }
578
+
579
+ &:has(.controlButton:disabled):hover .buttonTooltip {
580
+ opacity: 0;
581
+ visibility: hidden;
582
+ }
583
+ }
584
+
585
+ .tooltipsInSession .buttonWrapper:hover .buttonTooltip {
586
+ transition-delay: 0s;
587
+ }
588
+
589
+ .sendButtonWrapper {
590
+ width: 0;
591
+ opacity: 0;
592
+ overflow: hidden;
593
+ pointer-events: none;
594
+ margin-left: -0.375rem;
595
+ transition:
596
+ width 0.4s cubic-bezier(0.19, 1, 0.22, 1),
597
+ opacity 0.3s cubic-bezier(0.19, 1, 0.22, 1),
598
+ margin 0.4s cubic-bezier(0.19, 1, 0.22, 1);
599
+
600
+ &.sendButtonVisible {
601
+ width: 34px;
602
+ opacity: 1;
603
+ overflow: visible;
604
+ pointer-events: auto;
605
+ margin-left: 0;
606
+ }
607
+ }
608
+
609
+ .buttonTooltip {
610
+ position: absolute;
611
+ bottom: calc(100% + 14px);
612
+ left: 50%;
613
+ transform: translateX(-50%);
614
+ padding: 6px 10px;
615
+ background: #1e1e1e;
616
+ color: rgba(255, 255, 255, 0.9);
617
+ font-size: 12px;
618
+ font-weight: 500;
619
+ border-radius: 8px;
620
+ white-space: nowrap;
621
+ opacity: 0;
622
+ visibility: hidden;
623
+ pointer-events: none;
624
+ z-index: 100001;
625
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
626
+ transition:
627
+ opacity 0.135s ease,
628
+ visibility 0.135s ease;
629
+
630
+ &::after {
631
+ content: "";
632
+ position: absolute;
633
+ top: calc(100% - 4px);
634
+ left: 50%;
635
+ transform: translateX(-50%) rotate(45deg);
636
+ width: 8px;
637
+ height: 8px;
638
+ background: #1e1e1e;
639
+ border-radius: 0 0 2px 0;
640
+ }
641
+ }
642
+
643
+ .shortcut {
644
+ margin-left: 4px;
645
+ opacity: 0.5;
646
+ }
647
+
648
+ .tooltipBelow .buttonTooltip {
649
+ bottom: auto;
650
+ top: calc(100% + 14px);
651
+ transform: translateX(-50%);
652
+
653
+ &::after {
654
+ top: calc(-4px);
655
+ bottom: auto;
656
+ border-radius: 2px 0 0 0;
657
+ }
658
+ }
659
+
660
+
661
+ .tooltipsHidden .buttonTooltip {
662
+ opacity: 0 !important;
663
+ visibility: hidden !important;
664
+ transition: none !important;
665
+ }
666
+
667
+ .tooltipVisible,
668
+ .tooltipsHidden .tooltipVisible {
669
+ opacity: 1 !important;
670
+ visibility: visible !important;
671
+ transition-delay: 0s !important;
672
+ }
673
+
674
+ .buttonWrapperAlignLeft {
675
+ .buttonTooltip {
676
+ left: 50%;
677
+ transform: translateX(-12px);
678
+
679
+ &::after {
680
+ left: 16px;
681
+ }
682
+ }
683
+ }
684
+
685
+ .tooltipBelow .buttonWrapperAlignLeft {
686
+ .buttonTooltip {
687
+ transform: translateX(-12px);
688
+ }
689
+ }
690
+
691
+ .buttonWrapperAlignRight {
692
+ .buttonTooltip {
693
+ left: 50%;
694
+ transform: translateX(calc(-100% + 12px));
695
+
696
+ &::after {
697
+ left: auto;
698
+ right: 8px;
699
+ }
700
+ }
701
+ }
702
+
703
+ .tooltipBelow .buttonWrapperAlignRight {
704
+ .buttonTooltip {
705
+ transform: translateX(calc(-100% + 12px));
706
+ }
707
+ }
708
+
709
+ .divider {
710
+ width: 1px;
711
+ height: 12px;
712
+ background: rgba(255, 255, 255, 0.15);
713
+ margin: 0 0.125rem;
714
+ }
715
+
716
+ // =============================================================================
717
+ // Target highlights (below prototype review chrome at 1050)
718
+ // =============================================================================
719
+
720
+ .targetHighlightLayer {
721
+ position: fixed;
722
+ inset: 0;
723
+ z-index: 1040;
724
+ pointer-events: none;
725
+ }
726
+
727
+ // =============================================================================
728
+ // Overlay
729
+ // =============================================================================
730
+
731
+ .overlay {
732
+ position: fixed;
733
+ inset: 0;
734
+ z-index: 99997;
735
+ pointer-events: none;
736
+
737
+ > :global(*) {
738
+ pointer-events: auto;
739
+ }
740
+ }
741
+
742
+ .targetUnresolvedBanner {
743
+ pointer-events: none;
744
+ padding: 8px 14px;
745
+ border-radius: 8px;
746
+ font-size: 13px;
747
+ line-height: 1.4;
748
+ color: var(--text-primary);
749
+ background: color-mix(in srgb, var(--warning, #f59e0b) 14%, var(--bg-top, #fff));
750
+ border: 1px solid color-mix(in srgb, var(--warning, #f59e0b) 35%, transparent);
751
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
752
+ }
753
+
754
+ // =============================================================================
755
+ // Hover Highlight
756
+ // =============================================================================
757
+
758
+ .hoverHighlight {
759
+ position: fixed;
760
+ border: 2px solid
761
+ color-mix(in srgb, var(--prototype-comment-color-accent) 50%, transparent);
762
+ border-radius: 4px;
763
+ background-color: color-mix(
764
+ in srgb,
765
+ var(--prototype-comment-color-accent) 4%,
766
+ transparent
767
+ );
768
+ pointer-events: none !important;
769
+ box-sizing: border-box;
770
+ will-change: opacity;
771
+ contain: layout style;
772
+
773
+ &.enter {
774
+ animation: hoverHighlightIn 0.12s ease-out forwards;
775
+ }
776
+ }
777
+
778
+ .multiSelectOutline {
779
+ position: fixed;
780
+ border: 2px dashed
781
+ color-mix(in srgb, var(--prototype-comment-color-green) 60%, transparent);
782
+ border-radius: 4px;
783
+ pointer-events: none !important;
784
+ background-color: color-mix(
785
+ in srgb,
786
+ var(--prototype-comment-color-green) 5%,
787
+ transparent
788
+ );
789
+ box-sizing: border-box;
790
+ will-change: opacity;
791
+
792
+ &.enter {
793
+ animation: fadeIn 0.15s ease-out forwards;
794
+ }
795
+
796
+ &.exit {
797
+ animation: fadeOut 0.15s ease-out forwards;
798
+ }
799
+ }
800
+
801
+ .singleSelectOutline {
802
+ position: fixed;
803
+ border: 2px solid
804
+ color-mix(in srgb, var(--prototype-comment-color-blue) 60%, transparent);
805
+ border-radius: 4px;
806
+ pointer-events: none !important;
807
+ background-color: color-mix(
808
+ in srgb,
809
+ var(--prototype-comment-color-blue) 5%,
810
+ transparent
811
+ );
812
+ box-sizing: border-box;
813
+ will-change: opacity;
814
+
815
+ &.enter {
816
+ animation: fadeIn 0.15s ease-out forwards;
817
+ }
818
+
819
+ &.exit {
820
+ animation: fadeOut 0.15s ease-out forwards;
821
+ }
822
+ }
823
+
824
+ .hoverTooltip {
825
+ position: fixed;
826
+ display: flex;
827
+ align-items: center;
828
+ justify-content: center;
829
+ color: #fff;
830
+ background: rgba(0, 0, 0, 0.85);
831
+ padding: 0.4rem;
832
+ border-radius: 0.375rem;
833
+ pointer-events: none !important;
834
+
835
+ &.enter {
836
+ animation: hoverTooltipIn 0.1s ease-out forwards;
837
+ }
838
+ }
839
+
840
+ // =============================================================================
841
+ // Markers Layer
842
+ // =============================================================================
843
+
844
+ .markersLayer {
845
+ position: absolute;
846
+ top: 0;
847
+ left: 0;
848
+ right: 0;
849
+ height: 0;
850
+ z-index: 99998;
851
+ pointer-events: none;
852
+
853
+ > :global(*) {
854
+ pointer-events: auto;
855
+ }
856
+ }
857
+
858
+ .fixedMarkersLayer {
859
+ position: fixed;
860
+ top: 0;
861
+ left: 0;
862
+ right: 0;
863
+ bottom: 0;
864
+ z-index: 99998;
865
+ pointer-events: none;
866
+
867
+ > :global(*) {
868
+ pointer-events: auto;
869
+ }
870
+ }
871
+
872
+ :global(html[data-comments-sidebar-open]) .markersLayer,
873
+ :global(html[data-comments-sidebar-open]) .fixedMarkersLayer,
874
+ :global(html[data-comments-sidebar-open]) .overlay,
875
+ :global(html[data-comments-sidebar-open]) .targetHighlightLayer {
876
+ right: var(--comments-sidebar-width, 400px);
877
+ }
878
+
879
+ // =============================================================================
880
+ // Annotation Markers
881
+ // =============================================================================
882
+
883
+ .marker {
884
+ position: absolute;
885
+ width: 22px;
886
+ height: 22px;
887
+ background: var(--prototype-comment-color-blue);
888
+ color: white;
889
+ border-radius: 50%;
890
+ display: flex;
891
+ align-items: center;
892
+ justify-content: center;
893
+ font-size: 0.6875rem;
894
+ font-weight: 600;
895
+ transform: translate(-50%, -50%) scale(1);
896
+ opacity: 1;
897
+ cursor: pointer;
898
+ box-shadow:
899
+ 0 2px 6px rgba(0, 0, 0, 0.2),
900
+ inset 0 0 0 1px rgba(0, 0, 0, 0.04);
901
+ user-select: none;
902
+ will-change: transform, opacity;
903
+ contain: layout style;
904
+ z-index: 1;
905
+
906
+ &:hover {
907
+ z-index: 2;
908
+ }
909
+
910
+ // Only apply transitions when NOT animating
911
+ &:not(.enter):not(.exit):not(.clearing) {
912
+ transition:
913
+ background-color 0.15s ease,
914
+ transform 0.1s ease;
915
+ }
916
+
917
+ &.enter {
918
+ animation: markerIn 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;
919
+ }
920
+
921
+ &.exit {
922
+ animation: markerOut 0.2s ease-out both;
923
+ pointer-events: none;
924
+ }
925
+
926
+ &.clearing {
927
+ animation: markerOut 0.15s ease-out both;
928
+ pointer-events: none;
929
+ }
930
+
931
+ // Only apply hover scale when not animating
932
+ &:not(.enter):not(.exit):not(.clearing):hover {
933
+ transform: translate(-50%, -50%) scale(1.1);
934
+ }
935
+
936
+ &.pending {
937
+ position: fixed;
938
+ background-color: var(--prototype-comment-color-blue);
939
+ cursor: default;
940
+ }
941
+
942
+ &.fixed {
943
+ position: fixed;
944
+ }
945
+
946
+ &.multiSelect {
947
+ background-color: var(--prototype-comment-color-green);
948
+ width: 26px;
949
+ height: 26px;
950
+ border-radius: 6px;
951
+ font-size: 0.75rem;
952
+
953
+ &.pending {
954
+ background-color: var(--prototype-comment-color-green);
955
+ }
956
+ }
957
+
958
+ &.hovered {
959
+ background-color: var(--prototype-comment-color-red);
960
+ }
961
+ }
962
+
963
+ .renumber {
964
+ display: block;
965
+ animation: renumberRoll 0.2s ease-out;
966
+ }
967
+
968
+ @keyframes renumberRoll {
969
+ 0% {
970
+ transform: translateX(-40%);
971
+ opacity: 0;
972
+ }
973
+ 100% {
974
+ transform: translateX(0);
975
+ opacity: 1;
976
+ }
977
+ }
978
+
979
+ .markerTooltip {
980
+ position: absolute;
981
+ top: calc(100% + 10px);
982
+ left: 50%;
983
+ // Counter-scale to offset the parent marker's 1.1x hover scale
984
+ transform: translateX(-50%) scale(0.909);
985
+ z-index: 100002;
986
+ background: #1e1e1e;
987
+ padding: 8px 0.75rem;
988
+ border-radius: 0.75rem;
989
+ font-family:
990
+ var(--tool-font-body, "DM Sans", ui-sans-serif, system-ui, sans-serif);
991
+ font-weight: 400;
992
+ color: #fff;
993
+ box-shadow:
994
+ 0 4px 20px rgba(0, 0, 0, 0.3),
995
+ 0 0 0 1px rgba(255, 255, 255, 0.08);
996
+ min-width: 120px;
997
+ max-width: 200px;
998
+ pointer-events: none;
999
+ cursor: default;
1000
+
1001
+ &.enter {
1002
+ animation: tooltipIn 0.1s ease-out forwards;
1003
+ }
1004
+ }
1005
+
1006
+ .markerQuote {
1007
+ display: block;
1008
+ font-size: 12px;
1009
+ font-style: italic;
1010
+ color: rgba(255, 255, 255, 0.6);
1011
+ margin-bottom: 0.3125rem;
1012
+ line-height: 1.4;
1013
+ white-space: nowrap;
1014
+ overflow: hidden;
1015
+ text-overflow: ellipsis;
1016
+ }
1017
+
1018
+ .markerNote {
1019
+ display: block;
1020
+ font-size: 13px;
1021
+ font-weight: 400;
1022
+ line-height: 1.4;
1023
+ color: #fff;
1024
+ white-space: nowrap;
1025
+ overflow: hidden;
1026
+ text-overflow: ellipsis;
1027
+ padding-bottom: 2px;
1028
+ }
1029
+
1030
+ .markerHint {
1031
+ display: block;
1032
+ font-size: 0.625rem;
1033
+ font-weight: 400;
1034
+ color: rgba(255, 255, 255, 0.6);
1035
+ margin-top: 0.375rem;
1036
+ white-space: nowrap;
1037
+ }
1038
+
1039
+ // =============================================================================
1040
+ // Settings Panel
1041
+ // =============================================================================
1042
+
1043
+ .settingsPanel {
1044
+ position: absolute;
1045
+ right: 5px;
1046
+ bottom: calc(100% + 0.5rem);
1047
+ z-index: 1;
1048
+ overflow: hidden;
1049
+ background: #1c1c1c;
1050
+ border-radius: 1rem;
1051
+ padding: 13px 0 16px;
1052
+ min-width: 205px;
1053
+ cursor: default;
1054
+ opacity: 1;
1055
+ box-shadow:
1056
+ 0 1px 8px rgba(0, 0, 0, 0.25),
1057
+ 0 0 0 1px rgba(0, 0, 0, 0.04);
1058
+ transition:
1059
+ background-color 0.25s ease,
1060
+ box-shadow 0.25s ease;
1061
+
1062
+ // Gradient overlays for smooth edge fade during transitions
1063
+ &::before,
1064
+ &::after {
1065
+ content: "";
1066
+ position: absolute;
1067
+ top: 0;
1068
+ bottom: 0;
1069
+ width: 16px;
1070
+ z-index: 2;
1071
+ pointer-events: none;
1072
+ }
1073
+
1074
+ &::before {
1075
+ left: 0;
1076
+ background: linear-gradient(to right, #1c1c1c 0%, transparent 100%);
1077
+ }
1078
+
1079
+ &::after {
1080
+ right: 0;
1081
+ background: linear-gradient(to left, #1c1c1c 0%, transparent 100%);
1082
+ }
1083
+
1084
+ // Transition for all child elements
1085
+ .settingsHeader,
1086
+ .settingsBrand,
1087
+ .settingsBrandSlash,
1088
+ .settingsVersion,
1089
+ .settingsSection,
1090
+ .settingsLabel,
1091
+ .cycleButton,
1092
+ .cycleDot,
1093
+ .dropdownButton,
1094
+ .toggleLabel,
1095
+ .customCheckbox,
1096
+ .sliderLabel,
1097
+ .slider,
1098
+ .themeToggle {
1099
+ transition:
1100
+ background-color 0.25s ease,
1101
+ color 0.25s ease,
1102
+ border-color 0.25s ease;
1103
+ }
1104
+
1105
+ &.enter {
1106
+ opacity: 1;
1107
+ transform: translateY(0) scale(1);
1108
+ filter: blur(0px);
1109
+ transition:
1110
+ opacity 0.2s ease,
1111
+ transform 0.2s ease,
1112
+ filter 0.2s ease;
1113
+ }
1114
+
1115
+ &.exit {
1116
+ opacity: 0;
1117
+ transform: translateY(8px) scale(0.95);
1118
+ filter: blur(5px);
1119
+ pointer-events: none;
1120
+ transition:
1121
+ opacity 0.1s ease,
1122
+ transform 0.1s ease,
1123
+ filter 0.1s ease;
1124
+ }
1125
+
1126
+ [data-prototype-comment-theme="dark"] & {
1127
+ background: #1e1e1e;
1128
+ box-shadow:
1129
+ 0 4px 20px rgba(0, 0, 0, 0.3),
1130
+ 0 0 0 1px rgba(255, 255, 255, 0.08);
1131
+
1132
+ .settingsLabel {
1133
+ color: rgba(255, 255, 255, 0.6);
1134
+ }
1135
+
1136
+ .settingsOption {
1137
+ color: rgba(255, 255, 255, 0.85);
1138
+
1139
+ &:hover {
1140
+ background: rgba(255, 255, 255, 0.1);
1141
+ }
1142
+
1143
+ &.selected {
1144
+ background: rgba(255, 255, 255, 0.15);
1145
+ color: #fff;
1146
+ }
1147
+ }
1148
+
1149
+ .toggleLabel {
1150
+ color: rgba(255, 255, 255, 0.85);
1151
+ }
1152
+ }
1153
+ }
1154
+
1155
+ // Sliding panel container for main/automations pages
1156
+ .settingsPanelContainer {
1157
+ overflow: visible;
1158
+ position: relative;
1159
+ display: flex;
1160
+ padding: 0 1rem;
1161
+ }
1162
+
1163
+ .settingsPage {
1164
+ min-width: 100%;
1165
+ flex-shrink: 0;
1166
+ transition:
1167
+ transform 0.2s ease,
1168
+ opacity 0.2s ease;
1169
+ transition-delay: 0s;
1170
+ opacity: 1;
1171
+ }
1172
+
1173
+ .settingsPage.slideLeft {
1174
+ transform: translateX(-24px);
1175
+ opacity: 0;
1176
+ pointer-events: none;
1177
+ }
1178
+
1179
+ .automationsPage {
1180
+ position: absolute;
1181
+ top: 0;
1182
+ left: 24px;
1183
+ width: 100%;
1184
+ height: 100%;
1185
+ padding: 3px 1rem 0;
1186
+ box-sizing: border-box;
1187
+ display: flex;
1188
+ flex-direction: column;
1189
+ transition:
1190
+ transform 0.2s ease,
1191
+ opacity 0.2s ease;
1192
+ opacity: 0;
1193
+ pointer-events: none;
1194
+ }
1195
+
1196
+ .automationsPage.slideIn {
1197
+ transform: translateX(-24px);
1198
+ opacity: 1;
1199
+ pointer-events: auto;
1200
+ }
1201
+
1202
+ .settingsNavLink {
1203
+ display: flex;
1204
+ align-items: center;
1205
+ justify-content: space-between;
1206
+ width: 100%;
1207
+ padding: 0;
1208
+ border: none;
1209
+ background: transparent;
1210
+ font-family: inherit;
1211
+ font-size: 0.8125rem;
1212
+ font-weight: 400;
1213
+ color: rgba(255, 255, 255, 0.5);
1214
+ cursor: pointer;
1215
+ transition: color 0.15s ease;
1216
+
1217
+ &:hover {
1218
+ color: rgba(255, 255, 255, 0.9);
1219
+ }
1220
+
1221
+ [data-prototype-comment-theme="light"] & {
1222
+ color: rgba(0, 0, 0, 0.5);
1223
+
1224
+ &:hover {
1225
+ color: rgba(0, 0, 0, 0.8);
1226
+ }
1227
+ }
1228
+
1229
+ svg {
1230
+ color: rgba(255, 255, 255, 0.4);
1231
+ transition: color 0.15s ease;
1232
+ }
1233
+
1234
+ &:hover svg {
1235
+ color: #fff;
1236
+ }
1237
+
1238
+ [data-prototype-comment-theme="light"] & svg {
1239
+ color: rgba(0, 0, 0, 0.25);
1240
+ }
1241
+
1242
+ [data-prototype-comment-theme="light"] &:hover svg {
1243
+ color: rgba(0, 0, 0, 0.8);
1244
+ }
1245
+ }
1246
+
1247
+ .settingsNavLinkRight {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ gap: 6px;
1251
+ }
1252
+
1253
+ .mcpNavIndicator {
1254
+ width: 8px;
1255
+ height: 8px;
1256
+ border-radius: 50%;
1257
+ flex-shrink: 0;
1258
+
1259
+ &.connected {
1260
+ background-color: var(--prototype-comment-color-green);
1261
+ animation: mcpPulse 2.5s ease-in-out infinite;
1262
+ }
1263
+
1264
+ &.connecting {
1265
+ background-color: var(--prototype-comment-color-yellow);
1266
+ animation: mcpPulse 1.5s ease-in-out infinite;
1267
+ }
1268
+ }
1269
+
1270
+ .settingsBackButton {
1271
+ display: flex;
1272
+ align-items: center;
1273
+ gap: 4px;
1274
+ padding: 6px 0 12px 0;
1275
+ margin: -6px 0 0.5rem 0;
1276
+ border: none;
1277
+ border-bottom: 1px solid rgba(255, 255, 255, 0.07);
1278
+ border-radius: 0;
1279
+ background: transparent;
1280
+ font-family: inherit;
1281
+ font-size: 0.8125rem;
1282
+ font-weight: 500;
1283
+ letter-spacing: -0.15px;
1284
+ color: #fff;
1285
+ cursor: pointer;
1286
+ transition: transform 0.12s cubic-bezier(0.32, 0.72, 0, 1);
1287
+
1288
+ svg {
1289
+ opacity: 0.4;
1290
+ flex-shrink: 0;
1291
+ transition:
1292
+ opacity 0.15s ease,
1293
+ transform 0.18s cubic-bezier(0.32, 0.72, 0, 1);
1294
+ }
1295
+
1296
+ &:hover {
1297
+ border-bottom-color: rgba(255, 255, 255, 0.07);
1298
+
1299
+ svg {
1300
+ opacity: 1;
1301
+ }
1302
+ }
1303
+
1304
+ [data-prototype-comment-theme="light"] & {
1305
+ color: rgba(0, 0, 0, 0.85);
1306
+ border-bottom-color: rgba(0, 0, 0, 0.08);
1307
+
1308
+ &:hover {
1309
+ border-bottom-color: rgba(0, 0, 0, 0.08);
1310
+ }
1311
+ }
1312
+ }
1313
+
1314
+ .automationHeader {
1315
+ display: flex;
1316
+ align-items: center;
1317
+ gap: 0.125rem;
1318
+ font-size: 0.8125rem;
1319
+ font-weight: 400;
1320
+ color: #fff;
1321
+
1322
+ [data-prototype-comment-theme="light"] & {
1323
+ color: rgba(0, 0, 0, 0.85);
1324
+ }
1325
+ }
1326
+
1327
+ .automationDescription {
1328
+ font-size: 0.6875rem;
1329
+ font-weight: 300;
1330
+ color: rgba(255, 255, 255, 0.5);
1331
+ margin-top: 2px;
1332
+ line-height: 14px;
1333
+
1334
+ [data-prototype-comment-theme="light"] & {
1335
+ color: rgba(0, 0, 0, 0.5);
1336
+ }
1337
+ }
1338
+
1339
+ .learnMoreLink {
1340
+ color: rgba(255, 255, 255, 0.8);
1341
+ text-decoration: underline dotted;
1342
+ text-decoration-color: rgba(255, 255, 255, 0.2);
1343
+ text-underline-offset: 2px;
1344
+ transition: color 0.15s ease;
1345
+
1346
+ &:hover {
1347
+ color: #fff;
1348
+ }
1349
+
1350
+ [data-prototype-comment-theme="light"] & {
1351
+ color: rgba(0, 0, 0, 0.6);
1352
+ text-decoration-color: rgba(0, 0, 0, 0.2);
1353
+
1354
+ &:hover {
1355
+ color: rgba(0, 0, 0, 0.85);
1356
+ }
1357
+ }
1358
+ }
1359
+
1360
+ .autoSendRow {
1361
+ display: flex;
1362
+ align-items: center;
1363
+ gap: 8px;
1364
+ }
1365
+
1366
+ .autoSendLabel {
1367
+ font-size: 0.6875rem;
1368
+ font-weight: 400;
1369
+ color: rgba(255, 255, 255, 0.4);
1370
+ transition: color 0.15s ease;
1371
+
1372
+ &.active {
1373
+ color: #66b8ff;
1374
+ color: color(display-p3 0.4 0.72 1);
1375
+ }
1376
+
1377
+ [data-prototype-comment-theme="light"] & {
1378
+ color: rgba(0, 0, 0, 0.4);
1379
+
1380
+ &.active {
1381
+ color: var(--prototype-comment-color-blue);
1382
+ }
1383
+ }
1384
+ }
1385
+
1386
+ .webhookUrlInput {
1387
+ display: block;
1388
+ width: 100%;
1389
+ flex: 1;
1390
+ min-height: 60px;
1391
+ box-sizing: border-box;
1392
+ margin-top: 11px;
1393
+ padding: 8px 10px;
1394
+ border: 1px solid rgba(255, 255, 255, 0.1);
1395
+ border-radius: 6px;
1396
+ background: rgba(255, 255, 255, 0.03);
1397
+ font-family: inherit;
1398
+ font-size: 0.75rem;
1399
+ font-weight: 400;
1400
+ color: #fff;
1401
+ outline: none;
1402
+ resize: none;
1403
+ user-select: text;
1404
+ transition:
1405
+ border-color 0.15s ease,
1406
+ background-color 0.15s ease,
1407
+ box-shadow 0.15s ease;
1408
+
1409
+ &::placeholder {
1410
+ color: rgba(255, 255, 255, 0.3);
1411
+ }
1412
+
1413
+ &:focus {
1414
+ border-color: rgba(255, 255, 255, 0.3);
1415
+ background: rgba(255, 255, 255, 0.08);
1416
+ }
1417
+
1418
+ [data-prototype-comment-theme="light"] & {
1419
+ border-color: rgba(0, 0, 0, 0.1);
1420
+ background: rgba(0, 0, 0, 0.03);
1421
+ color: rgba(0, 0, 0, 0.85);
1422
+
1423
+ &::placeholder {
1424
+ color: rgba(0, 0, 0, 0.3);
1425
+ }
1426
+
1427
+ &:focus {
1428
+ border-color: rgba(0, 0, 0, 0.25);
1429
+ background: rgba(0, 0, 0, 0.05);
1430
+ }
1431
+ }
1432
+ }
1433
+
1434
+ .settingsHeader {
1435
+ display: flex;
1436
+ align-items: center;
1437
+ justify-content: space-between;
1438
+ min-height: 24px;
1439
+ margin-bottom: 0.5rem;
1440
+ padding-bottom: 9px;
1441
+ border-bottom: 1px solid rgba(255, 255, 255, 0.07);
1442
+ }
1443
+
1444
+ .settingsBrand {
1445
+ font-size: 0.8125rem;
1446
+ font-weight: 600;
1447
+ letter-spacing: -0.0094em;
1448
+ color: #fff;
1449
+ text-decoration: none;
1450
+ }
1451
+
1452
+ .settingsBrandSlash {
1453
+ color: var(--prototype-comment-color-accent);
1454
+ transition: color 0.2s ease;
1455
+ }
1456
+
1457
+ .settingsVersion {
1458
+ font-size: 11px;
1459
+ font-weight: 400;
1460
+ color: rgba(255, 255, 255, 0.4);
1461
+ margin-left: auto;
1462
+ letter-spacing: -0.0094em;
1463
+ }
1464
+
1465
+ .settingsSection {
1466
+ & + & {
1467
+ margin-top: 0.5rem;
1468
+ padding-top: 0.5rem;
1469
+ border-top: 1px solid rgba(255, 255, 255, 0.07);
1470
+ }
1471
+
1472
+ &.settingsSectionExtraPadding {
1473
+ padding-top: calc(0.5rem + 4px);
1474
+ }
1475
+ }
1476
+
1477
+ .settingsSectionGrow {
1478
+ flex: 1;
1479
+ display: flex;
1480
+ flex-direction: column;
1481
+ }
1482
+
1483
+ .settingsRow {
1484
+ display: flex;
1485
+ align-items: center;
1486
+ justify-content: space-between;
1487
+ min-height: 24px;
1488
+
1489
+ &.settingsRowMarginTop {
1490
+ margin-top: 8px;
1491
+ }
1492
+ }
1493
+
1494
+ .dropdownContainer {
1495
+ position: relative;
1496
+ }
1497
+
1498
+ .dropdownButton {
1499
+ display: flex;
1500
+ align-items: center;
1501
+ gap: 0.5rem;
1502
+ padding: 0.25rem 0.5rem;
1503
+ border: none;
1504
+ border-radius: 0.375rem;
1505
+ background: transparent;
1506
+ font-size: 0.8125rem;
1507
+ font-weight: 600;
1508
+ color: #fff;
1509
+ cursor: pointer;
1510
+ transition:
1511
+ background-color 0.15s ease,
1512
+ color 0.15s ease;
1513
+ letter-spacing: -0.0094em;
1514
+
1515
+ &:hover {
1516
+ background: rgba(255, 255, 255, 0.08);
1517
+ }
1518
+
1519
+ svg {
1520
+ opacity: 0.6;
1521
+ }
1522
+ }
1523
+
1524
+ // Old dropdown styles kept for potential future use
1525
+ // @keyframes dropdownTextFade removed - using cycle button instead
1526
+
1527
+ .cycleButton {
1528
+ display: flex;
1529
+ align-items: center;
1530
+ gap: 0.5rem;
1531
+ padding: 0;
1532
+ border: none;
1533
+ background: transparent;
1534
+ font-size: 0.8125rem;
1535
+ font-weight: 500;
1536
+ color: #fff;
1537
+ cursor: pointer;
1538
+ letter-spacing: -0.0094em;
1539
+
1540
+ [data-prototype-comment-theme="light"] & {
1541
+ color: rgba(0, 0, 0, 0.85);
1542
+ }
1543
+
1544
+ &:disabled {
1545
+ opacity: 0.35;
1546
+ cursor: not-allowed;
1547
+ }
1548
+ }
1549
+
1550
+ .settingsRowDisabled {
1551
+ .settingsLabel {
1552
+ color: rgba(255, 255, 255, 0.2);
1553
+
1554
+ [data-prototype-comment-theme="light"] & {
1555
+ color: rgba(0, 0, 0, 0.2);
1556
+ }
1557
+ }
1558
+
1559
+ .toggleSwitch {
1560
+ opacity: 0.4;
1561
+ cursor: not-allowed;
1562
+ }
1563
+ }
1564
+
1565
+ @keyframes cycleTextIn {
1566
+ 0% {
1567
+ opacity: 0;
1568
+ transform: translateY(-6px);
1569
+ }
1570
+ 100% {
1571
+ opacity: 1;
1572
+ transform: translateY(0);
1573
+ }
1574
+ }
1575
+
1576
+ .cycleButtonText {
1577
+ display: inline-block;
1578
+ animation: cycleTextIn 0.2s ease-out;
1579
+ }
1580
+
1581
+ .cycleDots {
1582
+ display: flex;
1583
+ flex-direction: column;
1584
+ gap: 2px;
1585
+ }
1586
+
1587
+ .cycleDot {
1588
+ width: 3px;
1589
+ height: 3px;
1590
+ border-radius: 50%;
1591
+ background: rgba(255, 255, 255, 0.3);
1592
+ transform: scale(0.667);
1593
+ transition:
1594
+ background-color 0.25s ease-out,
1595
+ transform 0.25s ease-out;
1596
+
1597
+ &.active {
1598
+ background: #fff;
1599
+ transform: scale(1);
1600
+ }
1601
+
1602
+ [data-prototype-comment-theme="light"] & {
1603
+ background: rgba(0, 0, 0, 0.2);
1604
+
1605
+ &.active {
1606
+ background: rgba(0, 0, 0, 0.7);
1607
+ }
1608
+ }
1609
+ }
1610
+
1611
+ .dropdownMenu {
1612
+ position: absolute;
1613
+ right: 0;
1614
+ top: calc(100% + 0.25rem);
1615
+ background: #1e1e1e;
1616
+ border-radius: 0.5rem;
1617
+ padding: 0.25rem;
1618
+ min-width: 120px;
1619
+ box-shadow:
1620
+ 0 4px 20px rgba(0, 0, 0, 0.3),
1621
+ 0 0 0 1px #333333;
1622
+ z-index: 10;
1623
+ animation: fadeIn 0.15s ease-out;
1624
+ }
1625
+
1626
+ .dropdownItem {
1627
+ width: 100%;
1628
+ display: flex;
1629
+ align-items: center;
1630
+ padding: 0.5rem 0.625rem;
1631
+ border: none;
1632
+ border-radius: 0.375rem;
1633
+ background: transparent;
1634
+ font-size: 0.8125rem;
1635
+ font-weight: 500;
1636
+ color: rgba(255, 255, 255, 0.85);
1637
+ cursor: pointer;
1638
+ text-align: left;
1639
+ transition:
1640
+ background-color 0.15s ease,
1641
+ color 0.15s ease;
1642
+ letter-spacing: -0.0094em;
1643
+
1644
+ &:hover {
1645
+ background: rgba(255, 255, 255, 0.08);
1646
+ }
1647
+
1648
+ &.selected {
1649
+ background: rgba(255, 255, 255, 0.12);
1650
+ color: #fff;
1651
+ font-weight: 600;
1652
+ }
1653
+ }
1654
+
1655
+ .settingsLabel {
1656
+ font-size: 0.8125rem;
1657
+ font-weight: 400;
1658
+ letter-spacing: -0.0094em;
1659
+ color: rgba(255, 255, 255, 0.5);
1660
+ display: flex;
1661
+ align-items: center;
1662
+ gap: 0.125rem;
1663
+
1664
+ [data-prototype-comment-theme="light"] & {
1665
+ color: rgba(0, 0, 0, 0.5);
1666
+ }
1667
+ }
1668
+
1669
+ .settingsLabelMarker {
1670
+ padding-top: 3px;
1671
+ margin-bottom: 10px;
1672
+ }
1673
+
1674
+ .settingsOptions {
1675
+ display: flex;
1676
+ gap: 0.25rem;
1677
+ }
1678
+
1679
+ .settingsOption {
1680
+ flex: 1;
1681
+ display: flex;
1682
+ align-items: center;
1683
+ justify-content: center;
1684
+ gap: 0.25rem;
1685
+ padding: 0.375rem 0.5rem;
1686
+ border: none;
1687
+ border-radius: 0.375rem;
1688
+ background: transparent;
1689
+ font-size: 0.6875rem;
1690
+ font-weight: 500;
1691
+ color: rgba(0, 0, 0, 0.7);
1692
+ cursor: pointer;
1693
+ transition:
1694
+ background-color 0.15s ease,
1695
+ color 0.15s ease;
1696
+
1697
+ &:hover {
1698
+ background: rgba(0, 0, 0, 0.05);
1699
+ }
1700
+
1701
+ &.selected {
1702
+ background: color-mix(
1703
+ in srgb,
1704
+ var(--prototype-comment-color-blue) 15%,
1705
+ transparent
1706
+ );
1707
+ color: var(--prototype-comment-color-blue);
1708
+ }
1709
+ }
1710
+
1711
+ .sliderContainer {
1712
+ display: flex;
1713
+ flex-direction: column;
1714
+ gap: 0.5rem;
1715
+ }
1716
+
1717
+ .slider {
1718
+ -webkit-appearance: none;
1719
+ appearance: none;
1720
+ width: 100%;
1721
+ height: 4px;
1722
+ background: rgba(255, 255, 255, 0.15);
1723
+ border-radius: 2px;
1724
+ outline: none;
1725
+ cursor: pointer;
1726
+
1727
+ &::-webkit-slider-thumb {
1728
+ -webkit-appearance: none;
1729
+ appearance: none;
1730
+ width: 14px;
1731
+ height: 14px;
1732
+ background: white;
1733
+ border-radius: 50%;
1734
+ cursor: pointer;
1735
+ transition:
1736
+ transform 0.15s ease,
1737
+ box-shadow 0.15s ease;
1738
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
1739
+ }
1740
+
1741
+ &::-moz-range-thumb {
1742
+ width: 14px;
1743
+ height: 14px;
1744
+ background: white;
1745
+ border: none;
1746
+ border-radius: 50%;
1747
+ cursor: pointer;
1748
+ transition:
1749
+ transform 0.15s ease,
1750
+ box-shadow 0.15s ease;
1751
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
1752
+ }
1753
+
1754
+ &:hover::-webkit-slider-thumb {
1755
+ transform: scale(1.15);
1756
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
1757
+ }
1758
+
1759
+ &:hover::-moz-range-thumb {
1760
+ transform: scale(1.15);
1761
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
1762
+ }
1763
+ }
1764
+
1765
+ .sliderLabels {
1766
+ display: flex;
1767
+ justify-content: space-between;
1768
+ }
1769
+
1770
+ .sliderLabel {
1771
+ font-size: 0.625rem;
1772
+ font-weight: 500;
1773
+ color: rgba(255, 255, 255, 0.4);
1774
+ cursor: pointer;
1775
+ transition: color 0.15s ease;
1776
+
1777
+ &:hover {
1778
+ color: rgba(255, 255, 255, 0.7);
1779
+ }
1780
+
1781
+ &.active {
1782
+ color: rgba(255, 255, 255, 0.9);
1783
+ }
1784
+ }
1785
+
1786
+ .colorOptions {
1787
+ display: flex;
1788
+ gap: 0.5rem;
1789
+ margin-top: 0.375rem;
1790
+ margin-bottom: 1px;
1791
+ }
1792
+
1793
+ .colorOption {
1794
+ display: block;
1795
+ width: 20px;
1796
+ height: 20px;
1797
+ border-radius: 50%;
1798
+ border: 2px solid transparent;
1799
+ background-color: var(--swatch);
1800
+ cursor: pointer;
1801
+ transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1);
1802
+
1803
+ @supports (color: color(display-p3 0 0 0)) {
1804
+ background-color: var(--swatch-p3);
1805
+ }
1806
+
1807
+ &:hover {
1808
+ transform: scale(1.15);
1809
+ }
1810
+
1811
+ &.selected {
1812
+ transform: scale(0.83);
1813
+ }
1814
+ }
1815
+
1816
+ .colorOptionRing {
1817
+ display: flex;
1818
+ width: 24px;
1819
+ height: 24px;
1820
+ border: 2px solid transparent;
1821
+ border-radius: 50%;
1822
+ transition: border-color 0.3s ease;
1823
+
1824
+ &.selected {
1825
+ border-color: var(--swatch);
1826
+
1827
+ @supports (color: color(display-p3 0 0 0)) {
1828
+ border-color: var(--swatch-p3);
1829
+ }
1830
+ }
1831
+ }
1832
+
1833
+ .settingsToggle {
1834
+ display: flex;
1835
+ align-items: center;
1836
+ gap: 0.5rem;
1837
+ cursor: pointer;
1838
+
1839
+ & + & {
1840
+ margin-top: calc(0.5rem + 6px);
1841
+ }
1842
+
1843
+ input[type="checkbox"] {
1844
+ position: absolute;
1845
+ opacity: 0;
1846
+ width: 0;
1847
+ height: 0;
1848
+ }
1849
+
1850
+ &.settingsToggleMarginBottom {
1851
+ margin-bottom: calc(0.5rem + 6px);
1852
+ }
1853
+ }
1854
+
1855
+ .customCheckbox {
1856
+ position: relative;
1857
+ width: 14px;
1858
+ height: 14px;
1859
+ border: 1px solid rgba(255, 255, 255, 0.2);
1860
+ border-radius: 4px;
1861
+ background: rgba(255, 255, 255, 0.05);
1862
+ display: flex;
1863
+ align-items: center;
1864
+ justify-content: center;
1865
+ flex-shrink: 0;
1866
+ transition:
1867
+ background-color 0.25s ease,
1868
+ border-color 0.25s ease;
1869
+
1870
+ svg {
1871
+ color: #1e1e1e;
1872
+ opacity: 1;
1873
+ transition: opacity 0.15s ease;
1874
+ }
1875
+
1876
+ input[type="checkbox"]:checked + & {
1877
+ border-color: rgba(255, 255, 255, 0.3);
1878
+ background: rgba(255, 255, 255, 1);
1879
+ }
1880
+
1881
+ // Light mode variant (unchecked state)
1882
+ [data-prototype-comment-theme="light"] & {
1883
+ border: 1px solid rgba(0, 0, 0, 0.15);
1884
+ background: #fff;
1885
+
1886
+ // Checked state in light mode
1887
+ &.checked {
1888
+ border-color: #1e1e1e;
1889
+ background: #1e1e1e;
1890
+
1891
+ svg {
1892
+ color: #fff;
1893
+ }
1894
+ }
1895
+ }
1896
+ }
1897
+
1898
+ .toggleLabel {
1899
+ font-size: 0.8125rem;
1900
+ font-weight: 400;
1901
+ color: rgba(255, 255, 255, 0.5);
1902
+ letter-spacing: -0.0094em;
1903
+ display: flex;
1904
+ align-items: center;
1905
+ gap: 0.25rem;
1906
+
1907
+ [data-prototype-comment-theme="light"] & {
1908
+ color: rgba(0, 0, 0, 0.5);
1909
+ }
1910
+ }
1911
+
1912
+ // iOS-style toggle switch
1913
+ .toggleSwitch {
1914
+ position: relative;
1915
+ display: inline-block;
1916
+ width: 24px;
1917
+ height: 16px;
1918
+ flex-shrink: 0;
1919
+ cursor: pointer;
1920
+ transition:
1921
+ background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
1922
+ opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1923
+
1924
+ input {
1925
+ opacity: 0;
1926
+ width: 0;
1927
+ height: 0;
1928
+ }
1929
+
1930
+ input:checked + .toggleSlider {
1931
+ background-color: var(--prototype-comment-color-blue);
1932
+ }
1933
+
1934
+ input:checked + .toggleSlider::before {
1935
+ transform: translateX(8px);
1936
+ }
1937
+
1938
+ &.disabled {
1939
+ opacity: 0.4;
1940
+
1941
+ .toggleSlider {
1942
+ cursor: not-allowed;
1943
+ }
1944
+ }
1945
+ }
1946
+
1947
+ .toggleSlider {
1948
+ position: absolute;
1949
+ cursor: pointer;
1950
+ inset: 0;
1951
+ border-radius: 16px;
1952
+ background: #484848; // Dark mode unchecked
1953
+
1954
+ [data-prototype-comment-theme="light"] & {
1955
+ background: #dddddd; // Light mode unchecked
1956
+ }
1957
+
1958
+ &::before {
1959
+ content: "";
1960
+ position: absolute;
1961
+ height: 12px;
1962
+ width: 12px;
1963
+ left: 2px;
1964
+ bottom: 2px;
1965
+ background: white;
1966
+ border-radius: 50%;
1967
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1968
+ }
1969
+ }
1970
+
1971
+ // MCP Status Dot
1972
+ @keyframes mcpPulse {
1973
+ 0% {
1974
+ box-shadow: 0 0 0 0
1975
+ color-mix(in srgb, var(--prototype-comment-color-green) 50%, transparent);
1976
+ }
1977
+ 70% {
1978
+ box-shadow: 0 0 0 6px
1979
+ color-mix(in srgb, var(--prototype-comment-color-green) 0%, transparent);
1980
+ }
1981
+ 100% {
1982
+ box-shadow: 0 0 0 0
1983
+ color-mix(in srgb, var(--prototype-comment-color-green) 0%, transparent);
1984
+ }
1985
+ }
1986
+
1987
+ @keyframes mcpPulseError {
1988
+ 0% {
1989
+ box-shadow: 0 0 0 0
1990
+ color-mix(in srgb, var(--prototype-comment-color-red) 50%, transparent);
1991
+ }
1992
+
1993
+ 70% {
1994
+ box-shadow: 0 0 0 6px
1995
+ color-mix(in srgb, var(--prototype-comment-color-red) 0%, transparent);
1996
+ }
1997
+
1998
+ 100% {
1999
+ box-shadow: 0 0 0 0
2000
+ color-mix(in srgb, var(--prototype-comment-color-red) 0%, transparent);
2001
+ }
2002
+ }
2003
+
2004
+ .mcpStatusDot {
2005
+ width: 8px;
2006
+ height: 8px;
2007
+ border-radius: 50%;
2008
+ flex-shrink: 0;
2009
+
2010
+ // Connecting state
2011
+ &.connecting {
2012
+ background-color: var(--prototype-comment-color-yellow);
2013
+ animation: mcpPulse 1.5s infinite;
2014
+ }
2015
+
2016
+ // Connected state - subtle pulse
2017
+ &.connected {
2018
+ background-color: var(--prototype-comment-color-green);
2019
+ animation: mcpPulse 2.5s ease-in-out infinite;
2020
+ }
2021
+
2022
+ // Disconnected/error state
2023
+ &.disconnected {
2024
+ background-color: var(--prototype-comment-color-red);
2025
+ animation: mcpPulseError 2s infinite;
2026
+ }
2027
+ }
2028
+
2029
+ // =============================================================================
2030
+ // Draw Canvas
2031
+ // =============================================================================
2032
+
2033
+ .drawCanvas {
2034
+ position: fixed;
2035
+ inset: 0;
2036
+ z-index: 99996; // Below markers (99998) and overlay (99997)
2037
+ // !important needed to override .overlay > * { pointer-events: auto }
2038
+ pointer-events: none !important;
2039
+
2040
+ &.active {
2041
+ pointer-events: auto !important;
2042
+ cursor: crosshair !important;
2043
+
2044
+ &[data-stroke-hover] {
2045
+ cursor: pointer !important;
2046
+ }
2047
+ }
2048
+ }
2049
+
2050
+ // =============================================================================
2051
+ // Drag Selection
2052
+ // =============================================================================
2053
+
2054
+ .dragSelection {
2055
+ position: fixed;
2056
+ top: 0;
2057
+ left: 0;
2058
+ border: 2px solid
2059
+ color-mix(in srgb, var(--prototype-comment-color-green) 60%, transparent);
2060
+ border-radius: 4px;
2061
+ background-color: color-mix(
2062
+ in srgb,
2063
+ var(--prototype-comment-color-green) 8%,
2064
+ transparent
2065
+ );
2066
+ pointer-events: none;
2067
+ z-index: 99997;
2068
+ will-change: transform, width, height;
2069
+ contain: layout style;
2070
+ }
2071
+
2072
+ .dragCount {
2073
+ position: absolute;
2074
+ top: 50%;
2075
+ left: 50%;
2076
+ transform: translate(-50%, -50%);
2077
+ background-color: var(--prototype-comment-color-green);
2078
+ color: white;
2079
+ font-size: 0.875rem;
2080
+ font-weight: 600;
2081
+ padding: 0.25rem 0.5rem;
2082
+ border-radius: 1rem;
2083
+ min-width: 1.5rem;
2084
+ text-align: center;
2085
+ }
2086
+
2087
+ .highlightsContainer {
2088
+ position: fixed;
2089
+ top: 0;
2090
+ left: 0;
2091
+ pointer-events: none;
2092
+ z-index: 1040;
2093
+ }
2094
+
2095
+ .selectedElementHighlight {
2096
+ position: fixed;
2097
+ top: 0;
2098
+ left: 0;
2099
+ border: 2px solid
2100
+ color-mix(in srgb, var(--prototype-comment-color-green) 50%, transparent);
2101
+ border-radius: 4px;
2102
+ background: color-mix(in srgb, var(--prototype-comment-color-green) 6%, transparent);
2103
+ pointer-events: none;
2104
+ will-change: transform, width, height;
2105
+ contain: layout style;
2106
+ }
2107
+
2108
+ // =============================================================================
2109
+ // Light Mode
2110
+ // =============================================================================
2111
+
2112
+ [data-prototype-comment-theme="light"] {
2113
+ .toolbarContainer {
2114
+ background: #fff;
2115
+ color: rgba(0, 0, 0, 0.85);
2116
+ box-shadow:
2117
+ 0 2px 8px rgba(0, 0, 0, 0.08),
2118
+ 0 4px 16px rgba(0, 0, 0, 0.06),
2119
+ 0 0 0 1px rgba(0, 0, 0, 0.04);
2120
+
2121
+ &.collapsed:hover {
2122
+ background: #f5f5f5;
2123
+ }
2124
+ }
2125
+
2126
+ .controlButton {
2127
+ color: rgba(0, 0, 0, 0.5);
2128
+
2129
+ &:focus-visible:not([data-active="true"]):not([data-error="true"]):not(
2130
+ [data-failed="true"]
2131
+ ):not([data-auto-sync="true"]) {
2132
+ background: rgba(0, 0, 0, 0.06);
2133
+ color: rgba(0, 0, 0, 0.85);
2134
+ }
2135
+
2136
+ &:hover:not(:disabled):not([data-active="true"]):not(
2137
+ [data-failed="true"]
2138
+ ):not([data-auto-sync="true"]):not([data-error="true"]):not(
2139
+ [data-no-hover="true"]
2140
+ ) {
2141
+ background: rgba(0, 0, 0, 0.06);
2142
+ color: rgba(0, 0, 0, 0.85);
2143
+ }
2144
+
2145
+ &[data-active="true"] {
2146
+ color: var(--prototype-comment-color-blue);
2147
+ background: color-mix(
2148
+ in srgb,
2149
+ var(--prototype-comment-color-blue) 15%,
2150
+ transparent
2151
+ );
2152
+ }
2153
+
2154
+ &[data-error="true"] {
2155
+ color: var(--prototype-comment-color-red);
2156
+ background: color-mix(
2157
+ in srgb,
2158
+ var(--prototype-comment-color-red) 15%,
2159
+ transparent
2160
+ );
2161
+ }
2162
+
2163
+ &[data-danger]:hover:not(:disabled):not([data-active="true"]):not(
2164
+ [data-failed="true"]
2165
+ ) {
2166
+ color: var(--prototype-comment-color-red);
2167
+ background: color-mix(
2168
+ in srgb,
2169
+ var(--prototype-comment-color-red) 15%,
2170
+ transparent
2171
+ );
2172
+ }
2173
+
2174
+ &[data-auto-sync="true"] {
2175
+ color: var(--prototype-comment-color-green);
2176
+ background: transparent;
2177
+ }
2178
+
2179
+ &[data-failed="true"] {
2180
+ color: var(--prototype-comment-color-red);
2181
+ background: color-mix(
2182
+ in srgb,
2183
+ var(--prototype-comment-color-red) 15%,
2184
+ transparent
2185
+ );
2186
+ }
2187
+ }
2188
+
2189
+ .buttonTooltip {
2190
+ background: #fff;
2191
+ color: rgba(0, 0, 0, 0.85);
2192
+ box-shadow:
2193
+ 0 2px 8px rgba(0, 0, 0, 0.08),
2194
+ 0 4px 16px rgba(0, 0, 0, 0.06),
2195
+ 0 0 0 1px rgba(0, 0, 0, 0.04);
2196
+
2197
+ &::after {
2198
+ background: #fff;
2199
+ }
2200
+ }
2201
+
2202
+ .divider {
2203
+ background: rgba(0, 0, 0, 0.1);
2204
+ }
2205
+ }
2206
+
2207
+ :global([data-prototype-review-sidebar]) [data-prototype-comment-theme="light"] {
2208
+ .controlButton {
2209
+ color: rgba(0, 0, 0, 0.62);
2210
+
2211
+ &:focus-visible:not([data-active="true"]):not([data-error="true"]):not(
2212
+ [data-failed="true"]
2213
+ ):not([data-auto-sync="true"]) {
2214
+ color: rgba(0, 0, 0, 0.88);
2215
+ }
2216
+
2217
+ &:hover:not(:disabled):not([data-active="true"]):not(
2218
+ [data-failed="true"]
2219
+ ):not([data-auto-sync="true"]):not([data-error="true"]):not(
2220
+ [data-no-hover="true"]
2221
+ ) {
2222
+ color: rgba(0, 0, 0, 0.88);
2223
+ }
2224
+ }
2225
+ }