collavre 0.20.3 → 0.21.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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/collavre/actiontext.css +92 -2
  3. data/app/assets/stylesheets/collavre/code_highlight.css +144 -26
  4. data/app/assets/stylesheets/collavre/comments_popup.css +83 -0
  5. data/app/assets/stylesheets/collavre/landing.css +507 -0
  6. data/app/channels/collavre/comments_presence_channel.rb +7 -0
  7. data/app/controllers/collavre/admin/integrations_controller.rb +82 -0
  8. data/app/controllers/collavre/admin/settings_controller.rb +22 -17
  9. data/app/controllers/collavre/application_controller.rb +27 -0
  10. data/app/controllers/collavre/channels_controller.rb +23 -0
  11. data/app/controllers/collavre/creatives_controller.rb +50 -6
  12. data/app/controllers/collavre/landing_controller.rb +8 -0
  13. data/app/controllers/collavre/public_assets_controller.rb +24 -0
  14. data/app/controllers/collavre/topics_controller.rb +21 -30
  15. data/app/helpers/collavre/comments_helper.rb +7 -0
  16. data/app/helpers/collavre/public_assets_helper.rb +14 -0
  17. data/app/javascript/controllers/comment_controller.js +9 -0
  18. data/app/javascript/controllers/comments/form_controller.js +4 -0
  19. data/app/javascript/controllers/comments/list_controller.js +10 -7
  20. data/app/javascript/controllers/comments/popup_controller.js +9 -0
  21. data/app/javascript/controllers/comments/presence_controller.js +83 -1
  22. data/app/javascript/controllers/comments/topics_controller.js +15 -0
  23. data/app/javascript/controllers/creatives/__tests__/sync_controller.test.js +89 -0
  24. data/app/javascript/controllers/creatives/__tests__/tree_controller.test.js +120 -0
  25. data/app/javascript/controllers/creatives/sync_controller.js +30 -9
  26. data/app/javascript/controllers/creatives/tree_controller.js +23 -0
  27. data/app/javascript/controllers/index.js +4 -1
  28. data/app/javascript/controllers/landing_video_controller.js +53 -0
  29. data/app/javascript/creatives/tree_renderer.js +6 -0
  30. data/app/javascript/lib/api/__tests__/queue_manager.test.js +27 -0
  31. data/app/javascript/lib/api/queue_manager.js +17 -5
  32. data/app/javascript/modules/__tests__/command_args_form.test.js +103 -0
  33. data/app/javascript/modules/__tests__/html_content_empty.test.js +41 -0
  34. data/app/javascript/modules/__tests__/markdown_source_reconcile.test.js +70 -0
  35. data/app/javascript/modules/command_args_form.js +22 -4
  36. data/app/javascript/modules/command_menu.js +27 -0
  37. data/app/javascript/modules/creative_row_editor.js +227 -17
  38. data/app/javascript/modules/html_content_empty.js +12 -0
  39. data/app/javascript/modules/markdown_source_reconcile.js +53 -0
  40. data/app/jobs/collavre/drop_trigger_job.rb +37 -8
  41. data/app/mailers/collavre/application_mailer.rb +1 -1
  42. data/app/models/collavre/channel/injected_message.rb +5 -0
  43. data/app/models/collavre/channel.rb +87 -0
  44. data/app/models/collavre/creative/describable.rb +65 -3
  45. data/app/models/collavre/creative.rb +2 -0
  46. data/app/models/collavre/integration_setting.rb +35 -0
  47. data/app/models/collavre/preview_channel.rb +93 -0
  48. data/app/models/collavre/system_setting.rb +13 -2
  49. data/app/models/collavre/topic.rb +3 -25
  50. data/app/models/concerns/collavre/ai_agent_resolvable.rb +12 -3
  51. data/app/services/collavre/ai_client.rb +3 -3
  52. data/app/services/collavre/channel_attacher.rb +58 -0
  53. data/app/services/collavre/comments/mcp_command.rb +31 -1
  54. data/app/services/collavre/creatives/tree_builder.rb +7 -3
  55. data/app/services/collavre/google_calendar_service.rb +4 -2
  56. data/app/services/collavre/markdown_converter.rb +130 -15
  57. data/app/services/collavre/markdown_importer.rb +7 -2
  58. data/app/services/collavre/orchestration/policy_resolver.rb +11 -1
  59. data/app/services/collavre/tools/creative_attach_files_service.rb +96 -0
  60. data/app/services/collavre/tools/creative_list_attachments_service.rb +42 -0
  61. data/app/services/collavre/tools/creative_remove_attachment_service.rb +35 -0
  62. data/app/services/collavre/tools/permission_denied_error.rb +9 -0
  63. data/app/services/collavre/tools/preview_attach_service.rb +128 -0
  64. data/app/services/collavre/tools/preview_detach_service.rb +61 -0
  65. data/app/services/collavre/tools/topic_authorizer.rb +24 -0
  66. data/app/services/collavre/topic_branch_service.rb +34 -26
  67. data/app/views/admin/shared/_tabs.html.erb +1 -0
  68. data/app/views/collavre/admin/integrations/_category.html.erb +22 -0
  69. data/app/views/collavre/admin/integrations/_setting_row.html.erb +54 -0
  70. data/app/views/collavre/admin/integrations/index.html.erb +42 -0
  71. data/app/views/collavre/admin/settings/_system_tab.html.erb +8 -0
  72. data/app/views/collavre/comments/_channel_chips.html.erb +33 -0
  73. data/app/views/collavre/comments/_comment.html.erb +6 -1
  74. data/app/views/collavre/comments/_comments_popup.html.erb +1 -0
  75. data/app/views/collavre/creatives/_inline_edit_form.html.erb +19 -0
  76. data/app/views/collavre/creatives/index.html.erb +10 -2
  77. data/app/views/collavre/landing/show.html.erb +130 -0
  78. data/app/views/layouts/collavre/landing.html.erb +33 -0
  79. data/config/locales/admin.en.yml +4 -2
  80. data/config/locales/admin.ko.yml +4 -2
  81. data/config/locales/channels.en.yml +11 -0
  82. data/config/locales/channels.ko.yml +11 -0
  83. data/config/locales/comments.en.yml +2 -0
  84. data/config/locales/comments.ko.yml +2 -0
  85. data/config/locales/creatives.en.yml +9 -0
  86. data/config/locales/creatives.ko.yml +8 -0
  87. data/config/locales/integrations.en.yml +44 -0
  88. data/config/locales/integrations.ko.yml +44 -0
  89. data/config/locales/landing.en.yml +51 -0
  90. data/config/locales/landing.ko.yml +51 -0
  91. data/config/routes.rb +18 -0
  92. data/db/migrate/20260526000000_create_channels.rb +42 -0
  93. data/db/migrate/20260527000000_add_dismissed_at_to_channels.rb +6 -0
  94. data/db/migrate/20260527000100_backfill_dismissed_at_for_legacy_detached_channels.rb +28 -0
  95. data/db/migrate/20260528000000_add_preview_channel_unique_index.rb +31 -0
  96. data/db/migrate/20260529000000_add_primary_agent_id_to_topics.rb +40 -0
  97. data/db/migrate/20260529100000_create_integration_settings.rb +15 -0
  98. data/db/seeds.rb +19 -0
  99. data/lib/collavre/aws_credentials.rb +75 -0
  100. data/lib/collavre/engine.rb +51 -0
  101. data/lib/collavre/integration_settings/key_definition.rb +29 -0
  102. data/lib/collavre/integration_settings/registry.rb +55 -0
  103. data/lib/collavre/integration_settings/resolver.rb +71 -0
  104. data/lib/collavre/integration_settings.rb +46 -0
  105. data/lib/collavre/ses_settings_interceptor.rb +72 -0
  106. data/lib/collavre/version.rb +1 -1
  107. data/lib/collavre.rb +3 -0
  108. metadata +52 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9faf02fa6fe0e0512402d22782e9341e8d78b906c0220961f19758f55cb18251
4
- data.tar.gz: a87e2eea061fa0a5b527084196a34713d837b793d5e7fab4c87333be804cafb8
3
+ metadata.gz: f24eeb18d0272f998210dbfd04bd15a5ac4bf9fab0a61c400ac64298b17cdf3c
4
+ data.tar.gz: dd4c2d977abfb6831b971f6c9ed8a7343329a48af8cff04674502a2840bd0f37
5
5
  SHA512:
6
- metadata.gz: fdcf64acf4b287d3fef53472b172601aaea44f0dccdb137d9db271c91402a52adf0a518fd654f8fffd3398da331d3eedd9efd421f6b60138ed0bd6c538abdf60
7
- data.tar.gz: a1c6330363dea5703eeee7f23039c9a4d58f8300a29d586d709b14f50e37bf46ac34a0a20546dff4009c2ebf1ea84a3172d6d48f528407609a5354aeb896b02d
6
+ metadata.gz: 55aa0ac2253e57cf0b4ac5d3de3a8028aa254b1b9d0b02fce88f4ac5cc3ab532588e574aebf1392bc40328f24061b1e75c74a3576f48ebc5b24d0aa5d3beebef
7
+ data.tar.gz: 97d1c389fdd7d00635a4ce87c5b3c9b4f0238f4c69f94e794dcbf42284da51994d35d9821da7f04f91d58857cef4ee697a128df54e914743be31d15a70d52c9b
@@ -15,6 +15,96 @@
15
15
  padding: 0 0 var(--space-3) 0;
16
16
  }
17
17
 
18
+ /* Markdown Editor */
19
+ .markdown-editor-wrapper {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: var(--space-2);
23
+ padding: var(--space-2);
24
+ }
25
+
26
+ @media (min-width: 768px) {
27
+ .markdown-editor-wrapper {
28
+ flex-direction: row;
29
+ align-items: stretch;
30
+ }
31
+
32
+ .markdown-editor-wrapper > .markdown-editor-textarea,
33
+ .markdown-editor-wrapper > .markdown-preview {
34
+ flex: 1 1 0;
35
+ min-width: 0;
36
+ }
37
+ }
38
+
39
+ .markdown-editor-textarea {
40
+ width: 100%;
41
+ min-height: 6rem;
42
+ padding: 0.6rem 0.75rem;
43
+ border: 1px solid var(--border-color);
44
+ border-radius: var(--radius-2);
45
+ background: var(--surface-section, var(--surface-bg));
46
+ color: var(--text-primary);
47
+ font-family: ui-monospace, SFMono-Regular, SFMono, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
48
+ font-size: 0.9rem;
49
+ line-height: 1.5;
50
+ resize: vertical;
51
+ outline: none;
52
+ box-sizing: border-box;
53
+ }
54
+
55
+ .markdown-editor-textarea:focus {
56
+ border-color: var(--color-active);
57
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-active) 15%, transparent);
58
+ }
59
+
60
+ .markdown-preview {
61
+ padding: 0.6rem 0.75rem;
62
+ border: 1px solid var(--border-color);
63
+ border-radius: var(--radius-2);
64
+ background: var(--surface-btn, var(--surface-bg));
65
+ min-height: 2rem;
66
+ line-height: 1.5;
67
+ overflow-wrap: break-word;
68
+ word-break: break-word;
69
+ }
70
+
71
+ .markdown-preview:empty::before {
72
+ content: attr(data-placeholder);
73
+ color: var(--text-muted);
74
+ font-style: italic;
75
+ }
76
+
77
+ .markdown-preview h1, .markdown-preview h2, .markdown-preview h3 {
78
+ margin: 0 0 var(--space-2) 0;
79
+ }
80
+
81
+ .markdown-preview ul, .markdown-preview ol {
82
+ margin: 0 0 0.75rem 1.25rem;
83
+ padding: 0;
84
+ }
85
+
86
+ .markdown-preview blockquote {
87
+ border-left: 3px solid var(--border-color);
88
+ margin: 0 0 0.75rem 0;
89
+ padding-left: 0.75rem;
90
+ color: var(--text-muted);
91
+ }
92
+
93
+ .markdown-preview table {
94
+ border-collapse: collapse;
95
+ margin: 0 0 0.75rem 0;
96
+ }
97
+
98
+ .markdown-preview th, .markdown-preview td {
99
+ border: 1px solid var(--border-color);
100
+ padding: 0.35rem 0.6rem;
101
+ }
102
+
103
+ .markdown-preview img {
104
+ max-width: 100%;
105
+ height: auto;
106
+ }
107
+
18
108
  .lexical-editor-shell {
19
109
  display: flex;
20
110
  flex-direction: column;
@@ -400,7 +490,7 @@ body.dark-mode {
400
490
 
401
491
  .lexical-attachment.is-selected {
402
492
  border-color: var(--color-active);
403
- box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2);
493
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-active) 20%, transparent);
404
494
  }
405
495
 
406
496
  .lexical-attachment__remove {
@@ -498,7 +588,7 @@ body.dark-mode {
498
588
  .lexical-attachment__caption-input:focus {
499
589
  outline: none;
500
590
  border-color: var(--color-active);
501
- box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.15);
591
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-active) 15%, transparent);
502
592
  }
503
593
 
504
594
  .lexical-attachment__caption-size {
@@ -4,6 +4,13 @@
4
4
  * Uses Collavre design tokens (--color-code-bg, --color-code-text, --font-mono).
5
5
  * Syntax color tokens defined as CSS variables — overridden per theme context.
6
6
  * Based on GitHub-style highlighting.
7
+ *
8
+ * Scoped to the markdown rendering surfaces so they share container,
9
+ * inline-code, and syntax-token styles:
10
+ * .comment-content — chat / comments
11
+ * .markdown-preview — creative inline editor live preview
12
+ * .creative-content — persisted creative description in the tree view
13
+ * .creative-title-content — persisted creative description in the title (h1) area
7
14
  */
8
15
 
9
16
  /* ============================================================================
@@ -77,20 +84,29 @@ body.dark-mode {
77
84
  /* ============================================================================
78
85
  * MERMAID DIAGRAM CONTAINER
79
86
  * ============================================================================ */
80
- .comment-content .mermaid-chart {
87
+ .comment-content .mermaid-chart,
88
+ .markdown-preview .mermaid-chart,
89
+ .creative-content .mermaid-chart,
90
+ .creative-title-content .mermaid-chart {
81
91
  margin: var(--space-2) 0;
82
92
  overflow-x: auto;
83
93
  text-align: center;
84
94
  }
85
95
 
86
- .comment-content .mermaid-chart svg {
96
+ .comment-content .mermaid-chart svg,
97
+ .markdown-preview .mermaid-chart svg,
98
+ .creative-content .mermaid-chart svg,
99
+ .creative-title-content .mermaid-chart svg {
87
100
  max-width: 100%;
88
101
  }
89
102
 
90
103
  /* ============================================================================
91
104
  * CODE BLOCK CONTAINER
92
105
  * ============================================================================ */
93
- .comment-content pre {
106
+ .comment-content pre,
107
+ .markdown-preview pre,
108
+ .creative-content pre,
109
+ .creative-title-content pre {
94
110
  background: var(--color-code-bg);
95
111
  color: var(--color-code-text);
96
112
  border: var(--border-1) solid var(--border-color);
@@ -103,7 +119,10 @@ body.dark-mode {
103
119
  line-height: var(--leading-3);
104
120
  }
105
121
 
106
- .comment-content pre code {
122
+ .comment-content pre code,
123
+ .markdown-preview pre code,
124
+ .creative-content pre code,
125
+ .creative-title-content pre code {
107
126
  background: none;
108
127
  border: none;
109
128
  padding: 0;
@@ -114,7 +133,10 @@ body.dark-mode {
114
133
  }
115
134
 
116
135
  /* Inline code */
117
- .comment-content code {
136
+ .comment-content code,
137
+ .markdown-preview code,
138
+ .creative-content code,
139
+ .creative-title-content code {
118
140
  background: var(--color-code-bg);
119
141
  color: var(--color-code-text);
120
142
  border-radius: var(--radius-1);
@@ -127,99 +149,195 @@ body.dark-mode {
127
149
  * SYNTAX HIGHLIGHTING RULES (token-based, theme-agnostic)
128
150
  * ============================================================================ */
129
151
  .comment-content .hljs-comment,
130
- .comment-content .hljs-quote {
152
+ .comment-content .hljs-quote,
153
+ .markdown-preview .hljs-comment,
154
+ .markdown-preview .hljs-quote,
155
+ .creative-content .hljs-comment,
156
+ .creative-content .hljs-quote,
157
+ .creative-title-content .hljs-comment,
158
+ .creative-title-content .hljs-quote {
131
159
  color: var(--syntax-comment);
132
160
  font-style: italic;
133
161
  }
134
162
 
135
163
  .comment-content .hljs-keyword,
136
164
  .comment-content .hljs-selector-tag,
137
- .comment-content .hljs-type {
165
+ .comment-content .hljs-type,
166
+ .markdown-preview .hljs-keyword,
167
+ .markdown-preview .hljs-selector-tag,
168
+ .markdown-preview .hljs-type,
169
+ .creative-content .hljs-keyword,
170
+ .creative-content .hljs-selector-tag,
171
+ .creative-content .hljs-type,
172
+ .creative-title-content .hljs-keyword,
173
+ .creative-title-content .hljs-selector-tag,
174
+ .creative-title-content .hljs-type {
138
175
  color: var(--syntax-keyword);
139
176
  }
140
177
 
141
- .comment-content .hljs-string {
178
+ .comment-content .hljs-string,
179
+ .markdown-preview .hljs-string,
180
+ .creative-content .hljs-string,
181
+ .creative-title-content .hljs-string {
142
182
  color: var(--syntax-string);
143
183
  }
144
184
 
145
185
  .comment-content .hljs-number,
146
- .comment-content .hljs-literal {
186
+ .comment-content .hljs-literal,
187
+ .markdown-preview .hljs-number,
188
+ .markdown-preview .hljs-literal,
189
+ .creative-content .hljs-number,
190
+ .creative-content .hljs-literal,
191
+ .creative-title-content .hljs-number,
192
+ .creative-title-content .hljs-literal {
147
193
  color: var(--syntax-number);
148
194
  }
149
195
 
150
196
  .comment-content .hljs-built_in,
151
- .comment-content .hljs-builtin-name {
197
+ .comment-content .hljs-builtin-name,
198
+ .markdown-preview .hljs-built_in,
199
+ .markdown-preview .hljs-builtin-name,
200
+ .creative-content .hljs-built_in,
201
+ .creative-content .hljs-builtin-name,
202
+ .creative-title-content .hljs-built_in,
203
+ .creative-title-content .hljs-builtin-name {
152
204
  color: var(--syntax-builtin);
153
205
  }
154
206
 
155
207
  .comment-content .hljs-title,
156
- .comment-content .hljs-title.function_ {
208
+ .comment-content .hljs-title.function_,
209
+ .markdown-preview .hljs-title,
210
+ .markdown-preview .hljs-title.function_,
211
+ .creative-content .hljs-title,
212
+ .creative-content .hljs-title.function_,
213
+ .creative-title-content .hljs-title,
214
+ .creative-title-content .hljs-title.function_ {
157
215
  color: var(--syntax-title);
158
216
  }
159
217
 
160
218
  .comment-content .hljs-attr,
161
- .comment-content .hljs-attribute {
219
+ .comment-content .hljs-attribute,
220
+ .markdown-preview .hljs-attr,
221
+ .markdown-preview .hljs-attribute,
222
+ .creative-content .hljs-attr,
223
+ .creative-content .hljs-attribute,
224
+ .creative-title-content .hljs-attr,
225
+ .creative-title-content .hljs-attribute {
162
226
  color: var(--syntax-attr);
163
227
  }
164
228
 
165
229
  .comment-content .hljs-variable,
166
- .comment-content .hljs-template-variable {
230
+ .comment-content .hljs-template-variable,
231
+ .markdown-preview .hljs-variable,
232
+ .markdown-preview .hljs-template-variable,
233
+ .creative-content .hljs-variable,
234
+ .creative-content .hljs-template-variable,
235
+ .creative-title-content .hljs-variable,
236
+ .creative-title-content .hljs-template-variable {
167
237
  color: var(--syntax-variable);
168
238
  }
169
239
 
170
- .comment-content .hljs-params {
240
+ .comment-content .hljs-params,
241
+ .markdown-preview .hljs-params,
242
+ .creative-content .hljs-params,
243
+ .creative-title-content .hljs-params {
171
244
  color: var(--color-code-text);
172
245
  }
173
246
 
174
- .comment-content .hljs-regexp {
247
+ .comment-content .hljs-regexp,
248
+ .markdown-preview .hljs-regexp,
249
+ .creative-content .hljs-regexp,
250
+ .creative-title-content .hljs-regexp {
175
251
  color: var(--syntax-regexp);
176
252
  }
177
253
 
178
- .comment-content .hljs-tag {
254
+ .comment-content .hljs-tag,
255
+ .markdown-preview .hljs-tag,
256
+ .creative-content .hljs-tag,
257
+ .creative-title-content .hljs-tag {
179
258
  color: var(--syntax-tag);
180
259
  }
181
260
 
182
- .comment-content .hljs-name {
261
+ .comment-content .hljs-name,
262
+ .markdown-preview .hljs-name,
263
+ .creative-content .hljs-name,
264
+ .creative-title-content .hljs-name {
183
265
  color: var(--syntax-name);
184
266
  }
185
267
 
186
268
  .comment-content .hljs-selector-class,
187
- .comment-content .hljs-selector-id {
269
+ .comment-content .hljs-selector-id,
270
+ .markdown-preview .hljs-selector-class,
271
+ .markdown-preview .hljs-selector-id,
272
+ .creative-content .hljs-selector-class,
273
+ .creative-content .hljs-selector-id,
274
+ .creative-title-content .hljs-selector-class,
275
+ .creative-title-content .hljs-selector-id {
188
276
  color: var(--syntax-selector);
189
277
  }
190
278
 
191
279
  .comment-content .hljs-selector-attr,
192
- .comment-content .hljs-selector-pseudo {
280
+ .comment-content .hljs-selector-pseudo,
281
+ .markdown-preview .hljs-selector-attr,
282
+ .markdown-preview .hljs-selector-pseudo,
283
+ .creative-content .hljs-selector-attr,
284
+ .creative-content .hljs-selector-pseudo,
285
+ .creative-title-content .hljs-selector-attr,
286
+ .creative-title-content .hljs-selector-pseudo {
193
287
  color: var(--syntax-attr);
194
288
  }
195
289
 
196
290
  .comment-content .hljs-symbol,
197
- .comment-content .hljs-bullet {
291
+ .comment-content .hljs-bullet,
292
+ .markdown-preview .hljs-symbol,
293
+ .markdown-preview .hljs-bullet,
294
+ .creative-content .hljs-symbol,
295
+ .creative-content .hljs-bullet,
296
+ .creative-title-content .hljs-symbol,
297
+ .creative-title-content .hljs-bullet {
198
298
  color: var(--syntax-number);
199
299
  }
200
300
 
201
- .comment-content .hljs-meta {
301
+ .comment-content .hljs-meta,
302
+ .markdown-preview .hljs-meta,
303
+ .creative-content .hljs-meta,
304
+ .creative-title-content .hljs-meta {
202
305
  color: var(--syntax-meta);
203
306
  }
204
307
 
205
- .comment-content .hljs-punctuation {
308
+ .comment-content .hljs-punctuation,
309
+ .markdown-preview .hljs-punctuation,
310
+ .creative-content .hljs-punctuation,
311
+ .creative-title-content .hljs-punctuation {
206
312
  color: var(--color-code-text);
207
313
  }
208
314
 
209
- .comment-content .hljs-deletion {
315
+ .comment-content .hljs-deletion,
316
+ .markdown-preview .hljs-deletion,
317
+ .creative-content .hljs-deletion,
318
+ .creative-title-content .hljs-deletion {
210
319
  color: var(--syntax-deletion-text);
211
320
  background: var(--syntax-deletion-bg);
212
321
  }
213
322
 
214
- .comment-content .hljs-addition {
323
+ .comment-content .hljs-addition,
324
+ .markdown-preview .hljs-addition,
325
+ .creative-content .hljs-addition,
326
+ .creative-title-content .hljs-addition {
215
327
  color: var(--syntax-addition-text);
216
328
  background: var(--syntax-addition-bg);
217
329
  }
218
330
 
219
- .comment-content .hljs-emphasis {
331
+ .comment-content .hljs-emphasis,
332
+ .markdown-preview .hljs-emphasis,
333
+ .creative-content .hljs-emphasis,
334
+ .creative-title-content .hljs-emphasis {
220
335
  font-style: italic;
221
336
  }
222
337
 
223
- .comment-content .hljs-strong {
338
+ .comment-content .hljs-strong,
339
+ .markdown-preview .hljs-strong,
340
+ .creative-content .hljs-strong,
341
+ .creative-title-content .hljs-strong {
224
342
  font-weight: var(--weight-7);
225
343
  }
@@ -1184,6 +1184,89 @@ body.chat-fullscreen {
1184
1184
  color: var(--text-on-btn);
1185
1185
  }
1186
1186
 
1187
+ /* --- Channel Chips (PR monitor etc) ------------------------------------ */
1188
+ #channel-chips-container,
1189
+ .channel-chips {
1190
+ display: inline-flex;
1191
+ flex-wrap: wrap;
1192
+ gap: var(--space-1);
1193
+ align-items: center;
1194
+ }
1195
+
1196
+ .channel-chip {
1197
+ display: inline-flex;
1198
+ align-items: center;
1199
+ gap: var(--space-px-1);
1200
+ padding: var(--space-px-1) var(--space-2);
1201
+ border: 1px solid var(--border-color);
1202
+ border-radius: var(--radius-2);
1203
+ background: var(--color-section-bg);
1204
+ font-size: var(--text-0);
1205
+ line-height: 1;
1206
+ white-space: nowrap;
1207
+ }
1208
+
1209
+ .channel-chip a {
1210
+ color: var(--color-text);
1211
+ text-decoration: none;
1212
+ }
1213
+
1214
+ .channel-chip a:hover {
1215
+ text-decoration: underline;
1216
+ }
1217
+
1218
+ .channel-chip button {
1219
+ background: none;
1220
+ border: 0;
1221
+ padding: 0 var(--space-px-1);
1222
+ color: var(--text-muted);
1223
+ cursor: pointer;
1224
+ font-size: 1.1em;
1225
+ line-height: 1;
1226
+ }
1227
+
1228
+ .channel-chip button:hover {
1229
+ color: var(--color-danger);
1230
+ }
1231
+
1232
+ /* Detached chips lose a touch of contrast so users can tell a closed/merged
1233
+ PR apart from one that is still actively monitored. */
1234
+ .channel-chip--detached {
1235
+ opacity: 0.7;
1236
+ }
1237
+
1238
+ .channel-chip-badge {
1239
+ display: inline-block;
1240
+ width: var(--space-2);
1241
+ height: var(--space-2);
1242
+ border-radius: 999px;
1243
+ flex-shrink: 0;
1244
+ background: var(--color-text);
1245
+ }
1246
+
1247
+ .channel-chip-badge--open {
1248
+ background: var(--color-success);
1249
+ }
1250
+
1251
+ .channel-chip-badge--merged {
1252
+ /* No purple token yet; --color-active (blue) is the closest neutral that
1253
+ reads as "shipped" without colliding with success/danger semantics. */
1254
+ background: var(--color-active);
1255
+ }
1256
+
1257
+ .channel-chip-badge--closed_without_merge {
1258
+ background: var(--color-danger);
1259
+ }
1260
+
1261
+ .channel-chip-badge--running {
1262
+ background: var(--color-success);
1263
+ }
1264
+
1265
+ .channel-chip-badge--stopped {
1266
+ background: var(--color-text);
1267
+ opacity: 0.5;
1268
+ }
1269
+
1187
1270
  /* --- Context Chips --- */
1188
1271
  .comment-contexts-list {
1189
1272
  display: flex;