@commonpub/layer 0.86.3 → 0.86.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/components/AppToast.vue +3 -3
  2. package/components/CommentSection.vue +2 -2
  3. package/components/ContentStarterForm.vue +2 -2
  4. package/components/CpubDateTimeField.vue +1 -1
  5. package/components/DiscussionItem.vue +1 -1
  6. package/components/FeedItem.vue +7 -7
  7. package/components/ImageUpload.vue +2 -2
  8. package/components/ImportUrlModal.vue +2 -2
  9. package/components/LayoutRow.vue +1 -1
  10. package/components/MemberCard.vue +2 -2
  11. package/components/MirrorDetailModal.vue +9 -9
  12. package/components/MirrorRequestApproveModal.vue +2 -2
  13. package/components/PostVoteButtons.vue +4 -4
  14. package/components/PublishErrorsModal.vue +2 -2
  15. package/components/RegistryDirectory.vue +4 -4
  16. package/components/RemoteFollowDialog.vue +1 -1
  17. package/components/SearchSidebar.vue +1 -1
  18. package/components/admin/layouts/AdminLayoutsAutoForm.vue +3 -3
  19. package/components/admin/layouts/AdminLayoutsConflictModal.vue +2 -2
  20. package/components/admin/layouts/AdminLayoutsInspectorSection.vue +1 -1
  21. package/components/admin/layouts/AdminLayoutsToolbar.vue +1 -1
  22. package/components/admin/theme/AdminThemeFamilyCard.vue +2 -2
  23. package/components/admin/theme/AdminThemeOverridesPanel.vue +1 -1
  24. package/components/admin/theme/AdminThemeSceneAdmin.vue +5 -5
  25. package/components/admin/theme/AdminThemeSceneSheet.vue +2 -2
  26. package/components/admin/theme/studio/AdminThemeStudio.vue +2 -2
  27. package/components/blocks/BlockCalloutView.vue +6 -6
  28. package/components/blocks/BlockCheckpointView.vue +1 -1
  29. package/components/blocks/BlockCompareColumnsView.vue +4 -4
  30. package/components/blocks/BlockQuizView.vue +11 -11
  31. package/components/blocks/BlockSliderView.vue +3 -3
  32. package/components/contest/ContestCriteriaEditor.vue +1 -1
  33. package/components/contest/ContestEditor.vue +13 -13
  34. package/components/contest/ContestEntries.vue +6 -6
  35. package/components/contest/ContestEntryPrivateData.vue +1 -1
  36. package/components/contest/ContestHero.vue +6 -6
  37. package/components/contest/ContestJudgeManager.vue +2 -2
  38. package/components/contest/ContestJudgingCriteria.vue +1 -1
  39. package/components/contest/ContestPrizes.vue +4 -4
  40. package/components/contest/ContestRules.vue +1 -1
  41. package/components/contest/ContestSidebar.vue +6 -6
  42. package/components/contest/ContestStageCard.vue +1 -1
  43. package/components/contest/ContestStageSubmission.vue +2 -2
  44. package/components/contest/ContestStageTemplateEditor.vue +1 -1
  45. package/components/contest/ContestStakeholderManager.vue +1 -1
  46. package/components/contest/ContestSubmissionField.vue +1 -1
  47. package/components/contest/blocks/CompareColumnsBlock.vue +1 -1
  48. package/components/contest/blocks/CriteriaBarBlock.vue +1 -1
  49. package/components/contest/blocks/JudgesShowcaseBlock.vue +1 -1
  50. package/components/contest/blocks/RoadmapBlock.vue +1 -1
  51. package/components/contest/blocks/SponsorsBlock.vue +1 -1
  52. package/components/contest/blocks/TableBlock.vue +1 -1
  53. package/components/contest/blocks/TabsBlock.vue +1 -1
  54. package/components/editors/ArticleEditor.vue +1 -1
  55. package/components/editors/DocsPageTree.vue +2 -2
  56. package/components/editors/ExplainerEditor.vue +1 -1
  57. package/components/editors/ProjectEditor.vue +1 -1
  58. package/components/homepage/EditorialSection.vue +1 -1
  59. package/components/homepage/HeroSection.vue +2 -2
  60. package/components/homepage/HubsSection.vue +1 -1
  61. package/components/hub/HubResources.vue +1 -1
  62. package/components/views/ArticleView.vue +3 -3
  63. package/components/views/ExplainerView.vue +2 -2
  64. package/components/views/ProjectView.vue +6 -6
  65. package/layouts/default.vue +1 -1
  66. package/package.json +7 -7
  67. package/pages/about.vue +1 -1
  68. package/pages/admin/api-keys.vue +5 -5
  69. package/pages/admin/categories.vue +2 -2
  70. package/pages/admin/content.vue +6 -6
  71. package/pages/admin/features.vue +2 -2
  72. package/pages/admin/federation.vue +3 -3
  73. package/pages/admin/homepage.vue +4 -4
  74. package/pages/admin/layouts/[id].vue +2 -2
  75. package/pages/admin/layouts/index.vue +1 -1
  76. package/pages/admin/navigation.vue +2 -2
  77. package/pages/admin/reports.vue +4 -4
  78. package/pages/admin/theme/edit/[id].vue +1 -1
  79. package/pages/admin/users.vue +3 -3
  80. package/pages/admin/video-categories.vue +1 -1
  81. package/pages/auth/forgot-password.vue +1 -1
  82. package/pages/auth/login.vue +1 -1
  83. package/pages/auth/register.vue +2 -2
  84. package/pages/auth/reset-password.vue +3 -3
  85. package/pages/auth/verify-email.vue +3 -3
  86. package/pages/authorize_interaction.vue +2 -2
  87. package/pages/cert/[code].vue +3 -3
  88. package/pages/contests/[slug]/entries/[entryId].vue +2 -2
  89. package/pages/contests/[slug]/judge.vue +4 -4
  90. package/pages/contests/[slug]/results.vue +4 -4
  91. package/pages/dashboard.vue +3 -3
  92. package/pages/docs/[siteSlug]/edit.vue +5 -5
  93. package/pages/explore.vue +1 -1
  94. package/pages/federated-hubs/[id]/posts/[postId].vue +1 -1
  95. package/pages/federation/users/[handle].vue +1 -1
  96. package/pages/hubs/[slug]/index.vue +2 -2
  97. package/pages/hubs/[slug]/invites.vue +2 -2
  98. package/pages/hubs/[slug]/members.vue +3 -3
  99. package/pages/hubs/[slug]/posts/[postId].vue +2 -2
  100. package/pages/index.vue +7 -7
  101. package/pages/learn/[slug]/[lessonSlug]/edit.vue +2 -2
  102. package/pages/learn/[slug]/[lessonSlug]/index.vue +10 -10
  103. package/pages/learn/[slug]/edit.vue +4 -4
  104. package/pages/learn/[slug]/index.vue +4 -4
  105. package/pages/learn/index.vue +6 -6
  106. package/pages/messages/index.vue +2 -2
  107. package/pages/mirror/[id].vue +1 -1
  108. package/pages/products/[slug].vue +1 -1
  109. package/pages/settings/account.vue +2 -2
  110. package/pages/settings/profile.vue +1 -1
  111. package/pages/u/[username]/[type]/[slug]/edit.vue +4 -4
  112. package/pages/u/[username]/index.vue +5 -5
  113. package/pages/videos/index.vue +3 -3
  114. package/theme/base.css +31 -0
  115. package/theme/components.css +8 -8
  116. package/theme/editor-panels.css +1 -1
  117. package/theme/forms.css +1 -1
  118. package/theme/layouts.css +6 -6
  119. package/theme/prose.css +1 -1
@@ -66,19 +66,19 @@ const { toasts, dismiss } = useToast();
66
66
  .cpub-toast--success {
67
67
  border-color: var(--green);
68
68
  background: var(--green-bg);
69
- color: var(--green);
69
+ color: var(--green-text);
70
70
  }
71
71
 
72
72
  .cpub-toast--error {
73
73
  border-color: var(--red);
74
74
  background: var(--red-bg);
75
- color: var(--red);
75
+ color: var(--red-text);
76
76
  }
77
77
 
78
78
  .cpub-toast--info {
79
79
  border-color: var(--accent);
80
80
  background: var(--accent-bg);
81
- color: var(--accent);
81
+ color: var(--accent-text);
82
82
  }
83
83
 
84
84
  .cpub-toast-icon {
@@ -440,7 +440,7 @@ async function deleteComment(id: string): Promise<void> {
440
440
  }
441
441
 
442
442
  .cpub-comment-delete:hover {
443
- color: var(--red);
443
+ color: var(--red-text);
444
444
  }
445
445
 
446
446
  .cpub-comments-empty {
@@ -457,7 +457,7 @@ async function deleteComment(id: string): Promise<void> {
457
457
 
458
458
  .cpub-reply-sent {
459
459
  font-size: 12px;
460
- color: var(--green, #22c55e);
460
+ color: var(--green-text, #22c55e);
461
461
  display: flex;
462
462
  align-items: center;
463
463
  gap: 6px;
@@ -135,7 +135,7 @@ function updateField(key: string, value: unknown): void {
135
135
  .cpub-starter-error {
136
136
  padding: 10px 14px;
137
137
  background: var(--red-bg);
138
- color: var(--red);
138
+ color: var(--red-text);
139
139
  border: var(--border-width-default) solid var(--red);
140
140
  font-size: 0.8125rem;
141
141
  font-family: var(--font-mono);
@@ -154,7 +154,7 @@ function updateField(key: string, value: unknown): void {
154
154
  letter-spacing: 0.06em;
155
155
  }
156
156
 
157
- .cpub-starter-required { color: var(--red); }
157
+ .cpub-starter-required { color: var(--red-text); }
158
158
 
159
159
  .cpub-starter-input {
160
160
  padding: 10px 14px;
@@ -68,6 +68,6 @@ function onInput(e: Event): void {
68
68
  gap: var(--space-1);
69
69
  }
70
70
  .cpub-datetime-req {
71
- color: var(--red);
71
+ color: var(--red-text);
72
72
  }
73
73
  </style>
@@ -161,7 +161,7 @@ const lastReplyFormatted = computed((): string | null => {
161
161
  font-weight: var(--font-weight-semibold);
162
162
  text-transform: uppercase;
163
163
  letter-spacing: var(--tracking-wide);
164
- color: var(--green);
164
+ color: var(--green-text);
165
165
  background: var(--green-bg);
166
166
  border: var(--border-width-default) solid var(--green-border);
167
167
  }
@@ -121,7 +121,7 @@ const formattedDate = computed((): string => {
121
121
  font-size: var(--text-label);
122
122
  text-transform: uppercase;
123
123
  letter-spacing: var(--tracking-widest);
124
- color: var(--accent);
124
+ color: var(--accent-text);
125
125
  border-bottom: var(--border-width-default) solid var(--accent-border);
126
126
  }
127
127
 
@@ -148,25 +148,25 @@ const formattedDate = computed((): string => {
148
148
  }
149
149
 
150
150
  .cpub-feed-badge-accent {
151
- color: var(--accent);
151
+ color: var(--accent-text);
152
152
  background: var(--accent-bg);
153
153
  border-color: var(--accent-border);
154
154
  }
155
155
 
156
156
  .cpub-feed-badge-yellow {
157
- color: var(--yellow);
157
+ color: var(--yellow-text);
158
158
  background: var(--yellow-bg);
159
159
  border-color: var(--yellow-border);
160
160
  }
161
161
 
162
162
  .cpub-feed-badge-purple {
163
- color: var(--purple);
163
+ color: var(--purple-text);
164
164
  background: var(--purple-bg);
165
165
  border-color: var(--purple-border);
166
166
  }
167
167
 
168
168
  .cpub-feed-badge-red {
169
- color: var(--red);
169
+ color: var(--red-text);
170
170
  background: var(--red-bg);
171
171
  border-color: var(--red-border);
172
172
  }
@@ -279,12 +279,12 @@ const formattedDate = computed((): string => {
279
279
  transition: all 0.12s;
280
280
  }
281
281
  .cpub-feed-stat-btn:hover {
282
- color: var(--accent);
282
+ color: var(--accent-text);
283
283
  background: var(--accent-bg);
284
284
  border-color: var(--accent-border);
285
285
  }
286
286
  .cpub-feed-stat-voted {
287
- color: var(--accent);
287
+ color: var(--accent-text);
288
288
  border-color: var(--accent-border);
289
289
  }
290
290
  </style>
@@ -229,7 +229,7 @@ function clearImage(): void {
229
229
 
230
230
  .cpub-img-remove {
231
231
  font-size: 0.6875rem;
232
- color: var(--red);
232
+ color: var(--red-text);
233
233
  background: none;
234
234
  border: none;
235
235
  cursor: pointer;
@@ -244,6 +244,6 @@ function clearImage(): void {
244
244
 
245
245
  .cpub-img-error {
246
246
  font-size: 0.6875rem;
247
- color: var(--red);
247
+ color: var(--red-text);
248
248
  }
249
249
  </style>
@@ -283,7 +283,7 @@ useFocusTrap(dialogRef, () => props.show, handleClose);
283
283
  padding: 10px 14px;
284
284
  background: var(--red-bg, rgba(255, 80, 80, 0.08));
285
285
  border: var(--border-width-default) solid var(--red, #f55);
286
- color: var(--red, #f55);
286
+ color: var(--red-text, #f55);
287
287
  font-size: 12px;
288
288
  font-family: var(--font-mono);
289
289
  display: flex;
@@ -301,7 +301,7 @@ useFocusTrap(dialogRef, () => props.show, handleClose);
301
301
  padding: 10px 14px;
302
302
  background: var(--yellow-bg, rgba(255, 200, 50, 0.08));
303
303
  border: var(--border-width-default) solid var(--yellow, #fc3);
304
- color: var(--yellow, #fc3);
304
+ color: var(--yellow-text, #fc3);
305
305
  font-size: 12px;
306
306
  display: flex;
307
307
  align-items: center;
@@ -760,7 +760,7 @@ const isOver = computed<boolean>(() => isDragOver.value !== undefined);
760
760
  opacity: 1;
761
761
  }
762
762
  .cpub-layout-row-remove:hover {
763
- color: var(--red);
763
+ color: var(--red-text);
764
764
  border-color: var(--red);
765
765
  background: var(--red-bg, var(--surface));
766
766
  }
@@ -139,13 +139,13 @@ const joinedFormatted = computed((): string => {
139
139
  }
140
140
 
141
141
  .cpub-member-role-owner {
142
- color: var(--red);
142
+ color: var(--red-text);
143
143
  background: var(--red-bg);
144
144
  border-color: var(--red-border);
145
145
  }
146
146
 
147
147
  .cpub-member-role-mod {
148
- color: var(--purple);
148
+ color: var(--purple-text);
149
149
  background: var(--purple-bg);
150
150
  border-color: var(--purple-border);
151
151
  }
@@ -190,7 +190,7 @@ async function remove(): Promise<void> {
190
190
  .cpub-modal-close:hover { color: var(--text); }
191
191
 
192
192
  .cpub-mm-sub { font-size: 0.8125rem; color: var(--text-dim); line-height: 1.5; margin-bottom: 16px; }
193
- .cpub-mm-dir { font-weight: 700; color: var(--accent); font-family: var(--font-mono); }
193
+ .cpub-mm-dir { font-weight: 700; color: var(--accent-text); font-family: var(--font-mono); }
194
194
 
195
195
  .cpub-mm-facts { display: grid; grid-template-columns: 1fr; gap: 0; margin-bottom: 16px; border: var(--border-width-default) solid var(--border); }
196
196
  .cpub-mm-facts > div { display: flex; gap: 12px; padding: 8px 12px; border-bottom: var(--border-width-default) solid var(--border); font-size: 0.8125rem; }
@@ -199,9 +199,9 @@ async function remove(): Promise<void> {
199
199
  .cpub-mm-facts dd { flex: 1; min-width: 0; margin: 0; word-break: break-word; }
200
200
  .cpub-mm-mono { font-family: var(--font-mono); font-size: 0.75rem; }
201
201
  .cpub-mm-faint { color: var(--text-faint); }
202
- .cpub-mm-chip { display: inline-block; font-family: var(--font-mono); font-size: 10px; padding: 1px 6px; margin: 0 4px 4px 0; border: var(--border-width-default) solid var(--accent-border); background: var(--accent-bg); color: var(--accent); }
202
+ .cpub-mm-chip { display: inline-block; font-family: var(--font-mono); font-size: 10px; padding: 1px 6px; margin: 0 4px 4px 0; border: var(--border-width-default) solid var(--accent-border); background: var(--accent-bg); color: var(--accent-text); }
203
203
 
204
- .cpub-mm-error { font-size: 0.75rem; color: var(--red); background: var(--surface2); padding: 8px 12px; margin-bottom: 16px; border: var(--border-width-default) solid var(--red); word-break: break-word; }
204
+ .cpub-mm-error { font-size: 0.75rem; color: var(--red-text); background: var(--surface2); padding: 8px 12px; margin-bottom: 16px; border: var(--border-width-default) solid var(--red); word-break: break-word; }
205
205
 
206
206
  .cpub-mm-section { margin-bottom: 16px; }
207
207
  .cpub-mm-label { display: block; font-family: var(--font-mono); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-dim); margin-bottom: 6px; }
@@ -209,7 +209,7 @@ async function remove(): Promise<void> {
209
209
  .cpub-mm-hint { font-size: 0.75rem; color: var(--text-faint); margin-top: 6px; line-height: 1.4; }
210
210
 
211
211
  .cpub-modal-actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; border-top: var(--border-width-default) solid var(--border); padding-top: 16px; }
212
- .cpub-mm-confirm { font-size: 0.8125rem; color: var(--red); font-family: var(--font-mono); }
212
+ .cpub-mm-confirm { font-size: 0.8125rem; color: var(--red-text); font-family: var(--font-mono); }
213
213
 
214
214
  /* Shared federation control styles (also defined on the page; repeated here for the modal's scope). */
215
215
  .cpub-fed-input { flex: 1; padding: 8px 12px; font-family: var(--font-mono); font-size: 0.8125rem; border: var(--border-width-default) solid var(--border); background: var(--surface); color: var(--text); }
@@ -217,14 +217,14 @@ async function remove(): Promise<void> {
217
217
  .cpub-fed-btn:hover { box-shadow: none; transform: translate(2px, 2px); }
218
218
  .cpub-fed-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; }
219
219
  .cpub-fed-btn-sm { padding: 4px 10px; font-family: var(--font-mono); font-size: 10px; font-weight: 600; text-transform: uppercase; cursor: pointer; background: transparent; border: var(--border-width-default) solid var(--border); color: var(--text-dim); }
220
- .cpub-fed-btn-sm:hover { border-color: var(--accent); color: var(--accent); }
220
+ .cpub-fed-btn-sm:hover { border-color: var(--accent); color: var(--accent-text); }
221
221
  .cpub-fed-btn-sm:disabled { opacity: 0.5; cursor: not-allowed; }
222
- .cpub-fed-btn-danger { color: var(--red); border-color: var(--red); }
223
- .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red); background: var(--surface2); }
222
+ .cpub-fed-btn-danger { color: var(--red-text); border-color: var(--red); }
223
+ .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red-text); background: var(--surface2); }
224
224
  .cpub-fed-status { font-size: 10px; font-weight: 600; padding: 2px 6px; text-transform: uppercase; font-family: var(--font-mono); border: var(--border-width-default) solid var(--border); }
225
- .cpub-fed-status.active { color: var(--accent); border-color: var(--accent-border); background: var(--accent-bg); }
225
+ .cpub-fed-status.active { color: var(--accent-text); border-color: var(--accent-border); background: var(--accent-bg); }
226
226
  .cpub-fed-status.pending { color: var(--text-dim); }
227
227
  .cpub-fed-status.paused { color: var(--text-dim); background: var(--surface2); }
228
- .cpub-fed-status.failed { color: var(--red); border-color: var(--red); }
228
+ .cpub-fed-status.failed { color: var(--red-text); border-color: var(--red); }
229
229
  .cpub-fed-result { margin-top: 8px; padding: 10px 14px; font-size: 0.8125rem; font-family: var(--font-mono); background: var(--accent-bg); border: var(--border-width-default) solid var(--accent-border); color: var(--text); }
230
230
  </style>
@@ -160,6 +160,6 @@ async function reject(): Promise<void> {
160
160
  .cpub-fed-btn-sm { padding: 4px 10px; font-family: var(--font-mono); font-size: 10px; font-weight: 600; text-transform: uppercase; cursor: pointer; background: transparent; border: var(--border-width-default) solid var(--border); color: var(--text-dim); }
161
161
  .cpub-fed-btn-sm:hover { border-color: var(--accent); color: var(--accent); }
162
162
  .cpub-fed-btn-sm:disabled { opacity: 0.5; cursor: not-allowed; }
163
- .cpub-fed-btn-danger { color: var(--red); border-color: var(--red); }
164
- .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red); background: var(--surface2); }
163
+ .cpub-fed-btn-danger { color: var(--red-text); border-color: var(--red); }
164
+ .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red-text); background: var(--surface2); }
165
165
  </style>
@@ -92,8 +92,8 @@ async function vote(direction: VoteDirection): Promise<void> {
92
92
  .cpub-vote-btn:hover:not(:disabled) { color: var(--text); background: var(--surface2); }
93
93
  .cpub-vote-btn:disabled { opacity: 0.3; cursor: default; }
94
94
  .cpub-vote-btn.active { color: var(--accent); }
95
- .cpub-vote-up.active { color: var(--green, var(--accent)); }
96
- .cpub-vote-down.active { color: var(--red, var(--accent)); }
95
+ .cpub-vote-up.active { color: var(--green-text, var(--accent)); }
96
+ .cpub-vote-down.active { color: var(--red-text, var(--accent)); }
97
97
 
98
98
  .cpub-vote-score {
99
99
  font-family: var(--font-mono);
@@ -103,6 +103,6 @@ async function vote(direction: VoteDirection): Promise<void> {
103
103
  min-width: 20px;
104
104
  text-align: center;
105
105
  }
106
- .cpub-vote-score.positive { color: var(--green, var(--accent)); }
107
- .cpub-vote-score.negative { color: var(--red); }
106
+ .cpub-vote-score.positive { color: var(--green-text, var(--accent)); }
107
+ .cpub-vote-score.negative { color: var(--red-text); }
108
108
  </style>
@@ -60,7 +60,7 @@ useFocusTrap(dialogRef, () => props.show, () => emit('dismiss'));
60
60
  font-family: var(--font-mono);
61
61
  font-size: 1.125rem;
62
62
  font-weight: 700;
63
- color: var(--red);
63
+ color: var(--red-text);
64
64
  display: flex;
65
65
  align-items: center;
66
66
  gap: 8px;
@@ -96,7 +96,7 @@ useFocusTrap(dialogRef, () => props.show, () => emit('dismiss'));
96
96
  }
97
97
  .cpub-publish-errors-list li::before {
98
98
  content: '\2022';
99
- color: var(--red);
99
+ color: var(--red-text);
100
100
  font-weight: 700;
101
101
  }
102
102
 
@@ -126,10 +126,10 @@ async function setStatus(row: RegistryRow, status: 'active' | 'hidden' | 'blocke
126
126
  .cpub-fed-btn { padding: 8px 16px; font-family: var(--font-mono); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; cursor: pointer; background: var(--accent); color: var(--color-text-inverse); border: var(--border-width-default) solid var(--accent); box-shadow: var(--shadow-sm); }
127
127
  .cpub-fed-btn:hover { box-shadow: none; transform: translate(2px, 2px); }
128
128
  .cpub-fed-btn-sm { padding: 4px 10px; font-family: var(--font-mono); font-size: 10px; font-weight: 600; text-transform: uppercase; cursor: pointer; background: transparent; border: var(--border-width-default) solid var(--border); color: var(--text-dim); }
129
- .cpub-fed-btn-sm:hover { border-color: var(--accent); color: var(--accent); }
129
+ .cpub-fed-btn-sm:hover { border-color: var(--accent); color: var(--accent-text); }
130
130
  .cpub-fed-btn-sm:disabled { opacity: 0.5; cursor: not-allowed; }
131
- .cpub-fed-btn-danger { color: var(--red); border-color: var(--red); }
132
- .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red); background: var(--surface2); }
131
+ .cpub-fed-btn-danger { color: var(--red-text); border-color: var(--red); }
132
+ .cpub-fed-btn-danger:hover { border-color: var(--red); color: var(--red-text); background: var(--surface2); }
133
133
  .cpub-fed-activity-list { display: flex; flex-direction: column; }
134
134
  .cpub-fed-activity-row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 8px 0; border-bottom: var(--border-width-default) solid var(--border); font-size: 0.8125rem; }
135
135
  .cpub-fed-type { font-weight: 600; color: var(--text); }
@@ -137,5 +137,5 @@ async function setStatus(row: RegistryRow, status: 'active' | 'hidden' | 'blocke
137
137
  .cpub-fed-empty { color: var(--text-faint); padding: 16px 0; font-size: 0.8125rem; }
138
138
  .cpub-fed-status { font-size: 10px; font-weight: 600; padding: 2px 6px; text-transform: uppercase; font-family: var(--font-mono); border: var(--border-width-default) solid var(--border); }
139
139
  .cpub-fed-status.paused { color: var(--text-dim); background: var(--surface2); }
140
- .cpub-fed-status.failed { color: var(--red); border-color: var(--red); }
140
+ .cpub-fed-status.failed { color: var(--red-text); border-color: var(--red); }
141
141
  </style>
@@ -107,6 +107,6 @@ useFocusTrap(dialogRef, () => open.value, close);
107
107
  border: var(--border-width-default) solid var(--border);
108
108
  background: var(--surface); color: var(--text);
109
109
  }
110
- .cpub-rfd-error { font-size: 11px; color: var(--red, #ef4444); margin: 0; }
110
+ .cpub-rfd-error { font-size: 11px; color: var(--red-text, #ef4444); margin: 0; }
111
111
  .cpub-rfd-actions { display: flex; justify-content: flex-end; gap: 8px; }
112
112
  </style>
@@ -124,7 +124,7 @@ const { hubs: hubsEnabled } = useFeatures();
124
124
  font-size: 10px; font-family: var(--font-mono); display: flex; align-items: center; gap: 3px;
125
125
  }
126
126
 
127
- .trend-up { color: var(--green); }
127
+ .trend-up { color: var(--green-text); }
128
128
  .trend-down { color: var(--text-faint); }
129
129
 
130
130
  .cpub-tag-cloud { display: flex; flex-wrap: wrap; gap: 6px; }
@@ -292,7 +292,7 @@ function groupValue(field: AutoFormField): Record<string, unknown> {
292
292
  color: var(--text-dim);
293
293
  font-weight: var(--font-weight-semibold);
294
294
  }
295
- .cpub-autoform-required { color: var(--red); margin-left: 2px; }
295
+ .cpub-autoform-required { color: var(--red-text); margin-left: 2px; }
296
296
  .cpub-autoform-count {
297
297
  color: var(--text-faint);
298
298
  font-weight: var(--font-weight-normal);
@@ -326,7 +326,7 @@ function groupValue(field: AutoFormField): Record<string, unknown> {
326
326
  }
327
327
  .cpub-autoform-error {
328
328
  font-size: var(--text-xs);
329
- color: var(--red);
329
+ color: var(--red-text);
330
330
  margin: 0;
331
331
  }
332
332
  .cpub-autoform-unsupported {
@@ -395,7 +395,7 @@ function groupValue(field: AutoFormField): Record<string, unknown> {
395
395
  cursor: pointer;
396
396
  font-size: var(--text-xs);
397
397
  }
398
- .cpub-autoform-array-remove:hover { color: var(--red); border-color: var(--red); }
398
+ .cpub-autoform-array-remove:hover { color: var(--red-text); border-color: var(--red); }
399
399
  .cpub-autoform-array-remove:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
400
400
 
401
401
  .cpub-autoform-array-add {
@@ -201,7 +201,7 @@ onBeforeUnmount(() => {
201
201
  }
202
202
  .cpub-admin-layouts-conflict-icon {
203
203
  font-size: var(--text-xl);
204
- color: var(--red);
204
+ color: var(--red-text);
205
205
  }
206
206
  .cpub-admin-layouts-conflict-title {
207
207
  font-size: var(--text-lg);
@@ -259,7 +259,7 @@ onBeforeUnmount(() => {
259
259
  color: var(--surface);
260
260
  }
261
261
  .cpub-admin-layouts-conflict-btn--danger {
262
- color: var(--red);
262
+ color: var(--red-text);
263
263
  border-color: var(--red);
264
264
  }
265
265
  .cpub-admin-layouts-conflict-btn--danger:hover { background: var(--red); color: var(--surface); }
@@ -164,7 +164,7 @@ function onUpdate(value: Record<string, unknown>): void {
164
164
  background: var(--yellow-bg);
165
165
  border-color: var(--yellow-border);
166
166
  }
167
- .cpub-inspector-section-unknown i { color: var(--yellow); margin-top: 2px; }
167
+ .cpub-inspector-section-unknown i { color: var(--yellow-text); margin-top: 2px; }
168
168
  .cpub-inspector-section-unknown code {
169
169
  font-family: var(--font-mono);
170
170
  background: var(--surface);
@@ -446,7 +446,7 @@ const VIEWPORTS: Array<{ value: 'mobile' | 'tablet' | 'desktop'; icon: string; l
446
446
  .cpub-admin-layouts-toolbar-indicator[data-tone='neutral'] { color: var(--text-dim); }
447
447
  .cpub-admin-layouts-toolbar-indicator[data-tone='pending'] { color: var(--text-dim); }
448
448
  .cpub-admin-layouts-toolbar-indicator[data-tone='success'] { color: var(--accent); }
449
- .cpub-admin-layouts-toolbar-indicator[data-tone='error'] { color: var(--red); }
449
+ .cpub-admin-layouts-toolbar-indicator[data-tone='error'] { color: var(--red-text); }
450
450
 
451
451
  .cpub-admin-layouts-toolbar-actions { display: inline-flex; gap: var(--space-2); }
452
452
 
@@ -247,7 +247,7 @@ function badge(family: ThemeFamilyView): { label: string; tone: 'builtin' | 'reg
247
247
  color: var(--text-dim);
248
248
  }
249
249
  .tag-custom { color: var(--accent); border-color: var(--accent-border); background: var(--accent-bg); }
250
- .tag-registered { color: var(--purple); border-color: var(--purple-border); background: var(--purple-bg); }
250
+ .tag-registered { color: var(--purple-text); border-color: var(--purple-border); background: var(--purple-bg); }
251
251
 
252
252
  .theme-family-active {
253
253
  margin-left: auto;
@@ -277,7 +277,7 @@ function badge(family: ThemeFamilyView): { label: string; tone: 'builtin' | 'reg
277
277
  }
278
278
 
279
279
  .theme-family-action-danger {
280
- color: var(--red);
280
+ color: var(--red-text);
281
281
  border-color: var(--red-border);
282
282
  }
283
283
  .theme-family-action-danger:hover { background: var(--red-bg); }
@@ -193,7 +193,7 @@ function looksLikeColor(value: string): boolean {
193
193
  flex-shrink: 0;
194
194
  }
195
195
  .admin-override-remove { flex-shrink: 0; padding: var(--space-1); color: var(--text-faint); }
196
- .admin-override-remove:hover { color: var(--red); }
196
+ .admin-override-remove:hover { color: var(--red-text); }
197
197
 
198
198
  .admin-override-add {
199
199
  display: flex;
@@ -160,8 +160,8 @@
160
160
  }
161
161
  .scene-admin-stat-label { font-family: var(--font-mono); font-size: var(--text-label); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--text-dim); }
162
162
  .scene-admin-stat-value { font-size: var(--text-xl); font-weight: var(--font-weight-bold); color: var(--text); }
163
- .scene-admin-stat-delta { font-size: var(--text-sm); color: var(--green); }
164
- .scene-admin-stat-delta.tone-warn { color: var(--yellow); }
163
+ .scene-admin-stat-delta { font-size: var(--text-sm); color: var(--green-text); }
164
+ .scene-admin-stat-delta.tone-warn { color: var(--yellow-text); }
165
165
 
166
166
  .scene-admin-h2 { font-size: var(--text-md); font-weight: var(--font-weight-semibold); color: var(--text); margin: 0 0 var(--space-2); }
167
167
  .scene-admin-table-wrap { background: var(--surface); border: var(--border-width-default) solid var(--border); overflow: hidden; }
@@ -178,9 +178,9 @@
178
178
  text-transform: uppercase;
179
179
  border: var(--border-width-thin) solid var(--border2);
180
180
  }
181
- .scene-admin-pill.tone-green { color: var(--green); background: var(--green-bg); border-color: var(--green-border); }
182
- .scene-admin-pill.tone-yellow { color: var(--yellow); background: var(--yellow-bg); border-color: var(--yellow-border); }
183
- .scene-admin-pill.tone-red { color: var(--red); background: var(--red-bg); border-color: var(--red-border); }
181
+ .scene-admin-pill.tone-green { color: var(--green-text); background: var(--green-bg); border-color: var(--green-border); }
182
+ .scene-admin-pill.tone-yellow { color: var(--yellow-text); background: var(--yellow-bg); border-color: var(--yellow-border); }
183
+ .scene-admin-pill.tone-red { color: var(--red-text); background: var(--red-bg); border-color: var(--red-border); }
184
184
 
185
185
  @media (max-width: 540px) {
186
186
  .scene-admin-side { width: 50px; }
@@ -216,8 +216,8 @@ const contrastReadout = computed<{ ratio: string; band: string; ok: boolean } |
216
216
  .cpub-sheet-contrast-tag { font-family: var(--font-mono); font-size: var(--text-label); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--text-dim); }
217
217
  .cpub-sheet-contrast-val { font-family: var(--font-mono); font-size: var(--text-base); font-weight: var(--font-weight-bold); }
218
218
  .cpub-sheet-badge { font-family: var(--font-mono); font-size: var(--text-label); font-weight: var(--font-weight-bold); text-transform: uppercase; padding: 2px 8px; border: var(--border-width-thin) solid; }
219
- .cpub-sheet-badge.ok { color: var(--green); border-color: var(--green); }
220
- .cpub-sheet-badge.err { color: var(--red); border-color: var(--red); }
219
+ .cpub-sheet-badge.ok { color: var(--green-text); border-color: var(--green); }
220
+ .cpub-sheet-badge.err { color: var(--red-text); border-color: var(--red); }
221
221
 
222
222
  .cpub-sheet-roles { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); margin-bottom: var(--space-5); }
223
223
  .cpub-sheet-role { border: var(--border-width-thin) solid var(--border2); border-left: var(--border-width-thick) solid var(--accent); padding: var(--space-4); background: var(--surface); }
@@ -722,7 +722,7 @@ function finishWith(apply: boolean): void {
722
722
  .cpub-studio-foot { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-top: var(--border-width-default) solid var(--border); }
723
723
  .cpub-studio-audit { display: flex; gap: 4px; margin-left: auto; }
724
724
  .cpub-studio-chip { font-family: var(--font-mono); font-size: 9px; font-weight: var(--font-weight-bold); letter-spacing: var(--tracking-wide); text-transform: uppercase; padding: 2px 6px; border: var(--border-width-thin) solid; }
725
- .cpub-studio-chip.ok { color: var(--green); border-color: var(--green); }
726
- .cpub-studio-chip.bad { color: var(--red); border-color: var(--red); }
725
+ .cpub-studio-chip.ok { color: var(--green-text); border-color: var(--green); }
726
+ .cpub-studio-chip.bad { color: var(--red-text); border-color: var(--red); }
727
727
  .cpub-studio-foot .cpub-btn-primary { margin-left: var(--space-2); }
728
728
  </style>
@@ -51,9 +51,9 @@ const config = computed(() => variantConfig[variant.value] ?? variantConfig.info
51
51
  }
52
52
 
53
53
  .cpub-callout--info .cpub-callout-icon { color: var(--accent); }
54
- .cpub-callout--tip .cpub-callout-icon { color: var(--green); }
55
- .cpub-callout--warning .cpub-callout-icon { color: var(--yellow); }
56
- .cpub-callout--danger .cpub-callout-icon { color: var(--red); }
54
+ .cpub-callout--tip .cpub-callout-icon { color: var(--green-text); }
55
+ .cpub-callout--warning .cpub-callout-icon { color: var(--yellow-text); }
56
+ .cpub-callout--danger .cpub-callout-icon { color: var(--red-text); }
57
57
 
58
58
  .cpub-callout-body { flex: 1; min-width: 0; }
59
59
 
@@ -67,9 +67,9 @@ const config = computed(() => variantConfig[variant.value] ?? variantConfig.info
67
67
  }
68
68
 
69
69
  .cpub-callout--info .cpub-callout-label { color: var(--accent); }
70
- .cpub-callout--tip .cpub-callout-label { color: var(--green); }
71
- .cpub-callout--warning .cpub-callout-label { color: var(--yellow); }
72
- .cpub-callout--danger .cpub-callout-label { color: var(--red); }
70
+ .cpub-callout--tip .cpub-callout-label { color: var(--green-text); }
71
+ .cpub-callout--warning .cpub-callout-label { color: var(--yellow-text); }
72
+ .cpub-callout--danger .cpub-callout-label { color: var(--red-text); }
73
73
 
74
74
  .cpub-callout-text {
75
75
  font-size: 14px;
@@ -34,7 +34,7 @@ onMounted(() => {
34
34
  border: var(--border-width-default) solid var(--green);
35
35
  margin: 24px 0;
36
36
  font-size: 13px;
37
- color: var(--green);
37
+ color: var(--green-text);
38
38
  opacity: 0;
39
39
  transform: translateY(8px);
40
40
  transition: opacity 0.4s ease, transform 0.4s ease;
@@ -70,15 +70,15 @@ const toneIcon = (tone: CompareTone): string =>
70
70
  display: flex; align-items: center; gap: 8px; margin: 0 0 12px;
71
71
  font-size: var(--text-sm); font-weight: 700;
72
72
  }
73
- .cpub-cmp-positive .cpub-cmp-col-head { color: var(--green); }
74
- .cpub-cmp-negative .cpub-cmp-col-head { color: var(--red); }
73
+ .cpub-cmp-positive .cpub-cmp-col-head { color: var(--green-text); }
74
+ .cpub-cmp-negative .cpub-cmp-col-head { color: var(--red-text); }
75
75
  .cpub-cmp-neutral .cpub-cmp-col-head { color: var(--accent); }
76
76
 
77
77
  .cpub-cmp-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
78
78
  .cpub-cmp-item { display: flex; gap: 9px; font-size: var(--text-sm); line-height: 1.55; color: var(--text-dim); }
79
79
  .cpub-cmp-item-icon { flex-shrink: 0; margin-top: 3px; font-size: 12px; }
80
- .cpub-cmp-positive .cpub-cmp-item-icon { color: var(--green); }
81
- .cpub-cmp-negative .cpub-cmp-item-icon { color: var(--red); }
80
+ .cpub-cmp-positive .cpub-cmp-item-icon { color: var(--green-text); }
81
+ .cpub-cmp-negative .cpub-cmp-item-icon { color: var(--red-text); }
82
82
  .cpub-cmp-neutral .cpub-cmp-item-icon { color: var(--accent); }
83
83
 
84
84
  .cpub-cmp-note {
@@ -105,7 +105,7 @@ function optionClass(idx: number): string {
105
105
  font-family: var(--font-mono);
106
106
  font-size: 9px;
107
107
  letter-spacing: 0.08em;
108
- color: var(--yellow);
108
+ color: var(--yellow-text);
109
109
  background: var(--yellow-bg);
110
110
  border: var(--border-width-default) solid var(--yellow-border);
111
111
  padding: 3px 8px;
@@ -184,9 +184,9 @@ function optionClass(idx: number): string {
184
184
  margin-top: 1px;
185
185
  }
186
186
 
187
- .cpub-quiz-option.selected-correct .cpub-quiz-option-key { color: var(--green); }
188
- .cpub-quiz-option.selected-wrong .cpub-quiz-option-key { color: var(--red); }
189
- .cpub-quiz-option.reveal-correct .cpub-quiz-option-key { color: var(--green); }
187
+ .cpub-quiz-option.selected-correct .cpub-quiz-option-key { color: var(--green-text); }
188
+ .cpub-quiz-option.selected-wrong .cpub-quiz-option-key { color: var(--red-text); }
189
+ .cpub-quiz-option.reveal-correct .cpub-quiz-option-key { color: var(--green-text); }
190
190
 
191
191
  .cpub-quiz-option-text {
192
192
  font-size: 13px;
@@ -195,8 +195,8 @@ function optionClass(idx: number): string {
195
195
  flex: 1;
196
196
  }
197
197
 
198
- .cpub-quiz-option.selected-correct .cpub-quiz-option-text { color: var(--green); }
199
- .cpub-quiz-option.selected-wrong .cpub-quiz-option-text { color: var(--red); }
198
+ .cpub-quiz-option.selected-correct .cpub-quiz-option-text { color: var(--green-text); }
199
+ .cpub-quiz-option.selected-wrong .cpub-quiz-option-text { color: var(--red-text); }
200
200
 
201
201
  .cpub-quiz-option-indicator {
202
202
  font-size: 12px;
@@ -212,9 +212,9 @@ function optionClass(idx: number): string {
212
212
  opacity: 1;
213
213
  }
214
214
 
215
- .cpub-quiz-option.selected-correct .cpub-quiz-option-indicator { color: var(--green); }
216
- .cpub-quiz-option.selected-wrong .cpub-quiz-option-indicator { color: var(--red); }
217
- .cpub-quiz-option.reveal-correct .cpub-quiz-option-indicator { color: var(--green); }
215
+ .cpub-quiz-option.selected-correct .cpub-quiz-option-indicator { color: var(--green-text); }
216
+ .cpub-quiz-option.selected-wrong .cpub-quiz-option-indicator { color: var(--red-text); }
217
+ .cpub-quiz-option.reveal-correct .cpub-quiz-option-indicator { color: var(--green-text); }
218
218
 
219
219
  .cpub-quiz-feedback {
220
220
  margin-top: 14px;
@@ -228,12 +228,12 @@ function optionClass(idx: number): string {
228
228
  .cpub-quiz-feedback.correct {
229
229
  background: var(--green-bg);
230
230
  border: var(--border-width-default) solid var(--green-border);
231
- color: var(--green);
231
+ color: var(--green-text);
232
232
  }
233
233
 
234
234
  .cpub-quiz-feedback.wrong {
235
235
  background: var(--red-bg);
236
236
  border: var(--border-width-default) solid var(--red-border);
237
- color: var(--red);
237
+ color: var(--red-text);
238
238
  }
239
239
  </style>
@@ -214,21 +214,21 @@ const stateIcons: Record<string, string> = {
214
214
  .cpub-slider-output.state-low {
215
215
  background: var(--yellow-bg);
216
216
  border: var(--border-width-default) solid var(--yellow-border);
217
- color: var(--yellow);
217
+ color: var(--yellow-text);
218
218
  }
219
219
 
220
220
  .cpub-slider-output.state-ok,
221
221
  .cpub-slider-output.state-good {
222
222
  background: var(--green-bg);
223
223
  border: var(--border-width-default) solid var(--green-border);
224
- color: var(--green);
224
+ color: var(--green-text);
225
225
  }
226
226
 
227
227
  .cpub-slider-output.state-high,
228
228
  .cpub-slider-output.state-danger {
229
229
  background: var(--red-bg);
230
230
  border: var(--border-width-default) solid var(--red-border);
231
- color: var(--red);
231
+ color: var(--red-text);
232
232
  }
233
233
 
234
234
  .cpub-slider-output i { font-size: 13px; flex-shrink: 0; }
@@ -74,6 +74,6 @@ function remove(i: number): void {
74
74
  .cpub-criteria-main .cpub-input { flex: 1; }
75
75
  .cpub-criteria-pts { max-width: 80px; flex: none !important; text-align: center; }
76
76
  .cpub-criteria-del { background: var(--surface); border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 0 9px; flex-shrink: 0; }
77
- .cpub-criteria-del:hover { border-color: var(--red-border); color: var(--red); }
77
+ .cpub-criteria-del:hover { border-color: var(--red-border); color: var(--red-text); }
78
78
  .cpub-criteria-desc { font-size: var(--text-xs); }
79
79
  </style>