@commonpub/layer 0.86.3 → 0.86.4

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 (113) 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/package.json +7 -7
  66. package/pages/about.vue +1 -1
  67. package/pages/admin/api-keys.vue +5 -5
  68. package/pages/admin/categories.vue +2 -2
  69. package/pages/admin/content.vue +6 -6
  70. package/pages/admin/features.vue +2 -2
  71. package/pages/admin/federation.vue +3 -3
  72. package/pages/admin/homepage.vue +4 -4
  73. package/pages/admin/layouts/[id].vue +2 -2
  74. package/pages/admin/layouts/index.vue +1 -1
  75. package/pages/admin/navigation.vue +2 -2
  76. package/pages/admin/reports.vue +4 -4
  77. package/pages/admin/theme/edit/[id].vue +1 -1
  78. package/pages/admin/users.vue +3 -3
  79. package/pages/admin/video-categories.vue +1 -1
  80. package/pages/auth/forgot-password.vue +1 -1
  81. package/pages/auth/login.vue +1 -1
  82. package/pages/auth/register.vue +2 -2
  83. package/pages/auth/reset-password.vue +3 -3
  84. package/pages/auth/verify-email.vue +3 -3
  85. package/pages/authorize_interaction.vue +2 -2
  86. package/pages/cert/[code].vue +3 -3
  87. package/pages/contests/[slug]/entries/[entryId].vue +2 -2
  88. package/pages/contests/[slug]/judge.vue +4 -4
  89. package/pages/contests/[slug]/results.vue +4 -4
  90. package/pages/dashboard.vue +3 -3
  91. package/pages/docs/[siteSlug]/edit.vue +5 -5
  92. package/pages/explore.vue +1 -1
  93. package/pages/federated-hubs/[id]/posts/[postId].vue +1 -1
  94. package/pages/federation/users/[handle].vue +1 -1
  95. package/pages/hubs/[slug]/index.vue +2 -2
  96. package/pages/hubs/[slug]/invites.vue +2 -2
  97. package/pages/hubs/[slug]/members.vue +3 -3
  98. package/pages/hubs/[slug]/posts/[postId].vue +2 -2
  99. package/pages/index.vue +7 -7
  100. package/pages/learn/[slug]/[lessonSlug]/edit.vue +2 -2
  101. package/pages/learn/[slug]/[lessonSlug]/index.vue +10 -10
  102. package/pages/learn/[slug]/edit.vue +4 -4
  103. package/pages/learn/[slug]/index.vue +4 -4
  104. package/pages/learn/index.vue +6 -6
  105. package/pages/messages/index.vue +2 -2
  106. package/pages/mirror/[id].vue +1 -1
  107. package/pages/products/[slug].vue +1 -1
  108. package/pages/settings/account.vue +2 -2
  109. package/pages/settings/profile.vue +1 -1
  110. package/pages/u/[username]/[type]/[slug]/edit.vue +4 -4
  111. package/pages/u/[username]/index.vue +5 -5
  112. package/pages/videos/index.vue +3 -3
  113. package/theme/base.css +31 -0
@@ -768,7 +768,7 @@ const reviewStages = computed(() => (contest.value?.stages ?? []).filter((s) =>
768
768
  .cpub-ce-dirty i { font-size: 6px; }
769
769
  .cpub-ce-autosave { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--text-faint); white-space: nowrap; }
770
770
  .cpub-ce-autosave i { font-size: 9px; }
771
- .cpub-ce-autosave-err { color: var(--red); }
771
+ .cpub-ce-autosave-err { color: var(--red-text); }
772
772
  .cpub-ce-topbar-spacer { flex: 1; }
773
773
  .cpub-ce-topbar-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
774
774
  .cpub-ce-topbar-btn {
@@ -799,11 +799,11 @@ const reviewStages = computed(() => (contest.value?.stages ?? []).filter((s) =>
799
799
  }
800
800
  .cpub-ce-status-item:hover { background: var(--surface2); border-color: var(--border2); color: var(--text); }
801
801
  .cpub-ce-status-item i { width: 14px; text-align: center; font-size: 11px; }
802
- .cpub-ce-status-go { color: var(--green); }
803
- .cpub-ce-status-warn { color: var(--yellow); }
804
- .cpub-ce-status-danger { color: var(--red); }
802
+ .cpub-ce-status-go { color: var(--green-text); }
803
+ .cpub-ce-status-warn { color: var(--yellow-text); }
804
+ .cpub-ce-status-danger { color: var(--red-text); }
805
805
  .cpub-ce-status-empty { font-size: 11px; color: var(--text-dim); margin: 0; padding: 8px 10px; display: flex; align-items: center; gap: 6px; }
806
- .cpub-ce-status-empty i { color: var(--green); }
806
+ .cpub-ce-status-empty i { color: var(--green-text); }
807
807
 
808
808
  /* 3-panel shell */
809
809
  .cpub-ce-shell { display: flex; flex: 1; overflow: hidden; }
@@ -818,12 +818,12 @@ const reviewStages = computed(() => (contest.value?.stages ?? []).filter((s) =>
818
818
  /* --- Status badge (also used in the topbar) --- */
819
819
  .cpub-status-badge { font-size: 10px; font-family: var(--font-mono); text-transform: uppercase; padding: 2px 8px; border: var(--border-width-default) solid; flex-shrink: 0; }
820
820
  .cpub-status-draft { color: var(--text-faint); border-color: var(--border2); background: var(--surface2); border-style: dashed; }
821
- .cpub-status-upcoming { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
822
- .cpub-status-active { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
823
- .cpub-status-paused { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
821
+ .cpub-status-upcoming { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
822
+ .cpub-status-active { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
823
+ .cpub-status-paused { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
824
824
  .cpub-status-judging { color: var(--accent); border-color: var(--accent-border); background: var(--accent-bg); }
825
825
  .cpub-status-completed { color: var(--text-faint); border-color: var(--border2); background: var(--surface2); }
826
- .cpub-status-cancelled { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
826
+ .cpub-status-cancelled { color: var(--red-text); border-color: var(--red-border); background: var(--red-bg); }
827
827
 
828
828
  /* --- Form fields inside the rail (carried over verbatim) --- */
829
829
  .cpub-form-field { display: flex; flex-direction: column; gap: var(--space-1); margin-bottom: var(--space-3); }
@@ -834,7 +834,7 @@ const reviewStages = computed(() => (contest.value?.stages ?? []).filter((s) =>
834
834
  background: var(--surface); color: var(--text); font-size: var(--text-sm); font-family: var(--font-sans);
835
835
  }
836
836
  .cpub-form-input:focus { border-color: var(--accent); outline: none; box-shadow: var(--shadow-accent); }
837
- .cpub-form-error { font-size: 12px; color: var(--red); margin-top: 8px; }
837
+ .cpub-form-error { font-size: 12px; color: var(--red-text); margin-top: 8px; }
838
838
  .cpub-form-check { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-dim); cursor: pointer; }
839
839
  .cpub-form-check input { width: 14px; height: 14px; flex-shrink: 0; }
840
840
  .cpub-type-options { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 6px; }
@@ -846,14 +846,14 @@ const reviewStages = computed(() => (contest.value?.stages ?? []).filter((s) =>
846
846
  .cpub-prize-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
847
847
  .cpub-prize-label { font-size: 11px; font-weight: 700; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); }
848
848
  .cpub-prize-remove { background: none; border: none; color: var(--text-faint); cursor: pointer; font-size: 12px; }
849
- .cpub-prize-remove:hover { color: var(--red); }
849
+ .cpub-prize-remove:hover { color: var(--red-text); }
850
850
 
851
851
  /* Stages tab (center) — the form tab gets a little breathing room. */
852
852
  .cpub-ce-stages-tab { display: flex; flex-direction: column; gap: 4px; }
853
853
 
854
854
  /* Danger zone */
855
- .cpub-danger-label { font-size: 13px; font-weight: 600; margin: 0 0 2px; color: var(--red); }
856
- .cpub-danger-btn { color: var(--red); border-color: var(--red-border); margin-top: 6px; }
855
+ .cpub-danger-label { font-size: 13px; font-weight: 600; margin: 0 0 2px; color: var(--red-text); }
856
+ .cpub-danger-btn { color: var(--red-text); border-color: var(--red-border); margin-top: 6px; }
857
857
  .cpub-danger-btn:hover:not(:disabled) { background: var(--red-bg); }
858
858
 
859
859
  .cpub-not-found { text-align: center; padding: 64px; color: var(--text-dim); display: flex; flex-direction: column; align-items: center; gap: 12px; }
@@ -91,7 +91,7 @@ function entryLink(entry: Serialized<ContestEntryItem>): string {
91
91
  <template>
92
92
  <div class="cpub-entries-section">
93
93
  <div class="cpub-sec-head">
94
- <h2><i class="fa fa-box-open" style="color: var(--teal);"></i> Submitted Entries</h2>
94
+ <h2><i class="fa fa-box-open" style="color: var(--teal-text);"></i> Submitted Entries</h2>
95
95
  <span class="cpub-sec-sub">{{ entries.length }} entries</span>
96
96
  </div>
97
97
  <div v-if="entries.length" class="cpub-entry-grid">
@@ -172,12 +172,12 @@ function entryLink(entry: Serialized<ContestEntryItem>): string {
172
172
  .cpub-entry-grid-pat { position: absolute; inset: 0; background-image: linear-gradient(var(--border2) 1px, transparent 1px), linear-gradient(90deg, var(--border2) 1px, transparent 1px); background-size: 20px 20px; opacity: .3; }
173
173
  .cpub-entry-icon { position: relative; z-index: 1; font-size: 22px; opacity: .65; color: var(--accent); }
174
174
  .cpub-entry-rank { position: absolute; top: 8px; left: 8px; z-index: 2; font-size: 10px; font-family: var(--font-mono); font-weight: 700; padding: 2px 7px; border-radius: var(--radius); }
175
- .cpub-rank-1 { background: var(--yellow-bg); color: var(--yellow); border: var(--border-width-default) solid var(--yellow); }
175
+ .cpub-rank-1 { background: var(--yellow-bg); color: var(--yellow-text); border: var(--border-width-default) solid var(--yellow); }
176
176
  .cpub-rank-2 { background: var(--surface2); color: var(--text-faint); border: var(--border-width-default) solid var(--text-faint); }
177
177
  .cpub-rank-3 { background: var(--surface2); color: var(--bronze); border: var(--border-width-default) solid var(--bronze); }
178
178
  .cpub-rank-other { background: var(--surface2); color: var(--text-dim); border: var(--border-width-default) solid var(--border); }
179
179
  .cpub-entry-cohort { position: absolute; top: 8px; right: 8px; z-index: 2; font-size: 9px; font-family: var(--font-mono); font-weight: 700; text-transform: uppercase; letter-spacing: .05em; padding: 2px 7px; border-radius: var(--radius); display: inline-flex; align-items: center; gap: 4px; }
180
- .cpub-cohort-in { background: var(--green-bg); color: var(--green); border: var(--border-width-default) solid var(--green-border); }
180
+ .cpub-cohort-in { background: var(--green-bg); color: var(--green-text); border: var(--border-width-default) solid var(--green-border); }
181
181
  .cpub-cohort-out { background: var(--surface2); color: var(--text-faint); border: var(--border-width-default) solid var(--border2); }
182
182
  .cpub-entry-cohort i { font-size: 8px; }
183
183
  .cpub-entry-out { opacity: .6; }
@@ -202,12 +202,12 @@ function entryLink(entry: Serialized<ContestEntryItem>): string {
202
202
  background: var(--surface); color: var(--text-dim); cursor: pointer;
203
203
  transition: all 0.15s;
204
204
  }
205
- .cpub-entry-vote-btn:hover:not(:disabled) { border-color: var(--red); color: var(--red); }
206
- .cpub-entry-vote-btn.voted { color: var(--red); border-color: var(--red); }
205
+ .cpub-entry-vote-btn:hover:not(:disabled) { border-color: var(--red); color: var(--red-text); }
206
+ .cpub-entry-vote-btn.voted { color: var(--red-text); border-color: var(--red); }
207
207
  .cpub-entry-vote-btn:disabled { opacity: 0.4; cursor: default; }
208
208
  .cpub-entry-vote-btn i { font-size: 10px; }
209
209
 
210
- .cpub-withdraw-btn { display: flex; align-items: center; justify-content: center; gap: 4px; font-size: 10px; font-family: var(--font-mono); padding: 4px 10px; min-height: 28px; border-radius: var(--radius); border: var(--border-width-default) solid var(--red-border); background: var(--surface); color: var(--red); cursor: pointer; margin-left: auto; }
210
+ .cpub-withdraw-btn { display: flex; align-items: center; justify-content: center; gap: 4px; font-size: 10px; font-family: var(--font-mono); padding: 4px 10px; min-height: 28px; border-radius: var(--radius); border: var(--border-width-default) solid var(--red-border); background: var(--surface); color: var(--red-text); cursor: pointer; margin-left: auto; }
211
211
  .cpub-withdraw-btn:hover { background: var(--red-bg); }
212
212
 
213
213
  .cpub-empty-state { text-align: center; padding: 32px 0; }
@@ -111,7 +111,7 @@ const hasData = computed(() => fieldRows.value.length > 0 || props.agreements.le
111
111
  .cpub-epd-agree { border: var(--border-width-default) solid var(--border); background: var(--surface); padding: 10px 12px; }
112
112
  .cpub-epd-agree-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
113
113
  .cpub-epd-agree-label { font-size: 12px; font-weight: 600; display: inline-flex; align-items: center; gap: 6px; }
114
- .cpub-epd-agree-label i { color: var(--green); font-size: 11px; }
114
+ .cpub-epd-agree-label i { color: var(--green-text); font-size: 11px; }
115
115
  .cpub-epd-agree-when { font-size: 10px; color: var(--text-faint); font-family: var(--font-mono); }
116
116
  .cpub-epd-terms { margin: 8px 0 4px; }
117
117
  .cpub-epd-terms summary { font-size: 11px; color: var(--accent); cursor: pointer; }
@@ -242,18 +242,18 @@ const entryCount = computed<number>(() => c.value?.entryCount ?? 0);
242
242
  .cpub-hero-bar { background: var(--surface); border-bottom: var(--border-width-default) solid var(--border); }
243
243
  .cpub-hero-bar-inner { max-width: 1100px; margin: 0 auto; padding: 20px 32px; }
244
244
 
245
- .cpub-cancelled-banner { background: var(--red-bg); border: var(--border-width-default) solid var(--red-border); color: var(--red); padding: 10px 14px; font-size: 12px; font-weight: 600; display: flex; align-items: center; gap: 8px; margin-bottom: 16px; }
245
+ .cpub-cancelled-banner { background: var(--red-bg); border: var(--border-width-default) solid var(--red-border); color: var(--red-text); padding: 10px 14px; font-size: 12px; font-weight: 600; display: flex; align-items: center; gap: 8px; margin-bottom: 16px; }
246
246
 
247
247
  .cpub-hero-top { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
248
248
  .cpub-contest-badge { font-size: 9px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; font-family: var(--font-mono); color: var(--accent); background: var(--accent-bg); border: var(--border-width-default) solid var(--accent); padding: 3px 10px; border-radius: var(--radius); display: inline-flex; align-items: center; gap: 5px; }
249
249
  .cpub-contest-badge i { font-size: 8px; }
250
250
  .cpub-status-pill { font-size: 9px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; font-family: var(--font-mono); padding: 3px 10px; border-radius: var(--radius); border: var(--border-width-default) solid var(--border2); color: var(--text-dim); }
251
- .cpub-status-pill[data-status="active"] { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
251
+ .cpub-status-pill[data-status="active"] { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
252
252
  .cpub-status-pill[data-status="judging"] { color: var(--accent); border-color: var(--accent-border); background: var(--accent-bg); }
253
- .cpub-status-pill[data-status="upcoming"] { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
254
- .cpub-status-pill[data-status="paused"] { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
253
+ .cpub-status-pill[data-status="upcoming"] { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
254
+ .cpub-status-pill[data-status="paused"] { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
255
255
  .cpub-status-pill[data-status="draft"] { color: var(--text-faint); border-color: var(--border2); border-style: dashed; }
256
- .cpub-status-pill[data-status="completed"], .cpub-status-pill[data-status="cancelled"] { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
256
+ .cpub-status-pill[data-status="completed"], .cpub-status-pill[data-status="cancelled"] { color: var(--red-text); border-color: var(--red-border); background: var(--red-bg); }
257
257
  .cpub-stage-chip { font-size: 9px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; font-family: var(--font-mono); padding: 3px 10px; border-radius: var(--radius); border: var(--border-width-default) solid var(--accent-border); color: var(--accent); background: var(--accent-bg); display: inline-flex; align-items: center; gap: 5px; }
258
258
  .cpub-stage-chip i { font-size: 8px; }
259
259
 
@@ -270,7 +270,7 @@ const entryCount = computed<number>(() => c.value?.entryCount ?? 0);
270
270
  .cpub-hero-meta { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; font-size: 11px; color: var(--text-faint); font-family: var(--font-mono); }
271
271
  .cpub-hero-meta-item { display: flex; align-items: center; gap: 6px; }
272
272
  .cpub-hero-cta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
273
- .cpub-btn-cancel { color: var(--red); border-color: var(--red-border); }
273
+ .cpub-btn-cancel { color: var(--red-text); border-color: var(--red-border); }
274
274
  .cpub-btn-cancel:hover { background: var(--red-bg); }
275
275
 
276
276
  .cpub-admin-controls { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 14px; padding: 10px 14px; background: var(--accent-bg); border: var(--border-width-default) solid var(--accent-border); }
@@ -159,9 +159,9 @@ const roleLabels: Record<string, string> = {
159
159
  .cpub-judge-avatar-sm { width: 20px; height: 20px; font-size: 8px; }
160
160
  .cpub-judge-name { font-size: 12px; font-weight: 600; }
161
161
  .cpub-judge-role { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; color: var(--text-faint); }
162
- .cpub-judge-pending { font-family: var(--font-mono); font-size: 9px; color: var(--yellow, var(--text-faint)); }
162
+ .cpub-judge-pending { font-family: var(--font-mono); font-size: 9px; color: var(--yellow-text, var(--text-faint)); }
163
163
  .cpub-judge-remove { background: none; border: none; color: var(--text-faint); cursor: pointer; font-size: 10px; padding: 4px; }
164
- .cpub-judge-remove:hover { color: var(--red); }
164
+ .cpub-judge-remove:hover { color: var(--red-text); }
165
165
 
166
166
  .cpub-judges-empty { font-size: 12px; color: var(--text-faint); font-style: italic; margin-bottom: 12px; }
167
167
 
@@ -14,7 +14,7 @@ const hasWeights = computed(() => props.criteria.some((c) => (c.weight ?? 0) > 0
14
14
  <template>
15
15
  <div v-if="criteria.length > 0" class="cpub-criteria-section" :class="{ 'cpub-criteria-compact': compact }">
16
16
  <div v-if="!compact" class="cpub-sec-head">
17
- <h2><i class="fa-solid fa-list-check" style="color: var(--teal);"></i> Judging Criteria</h2>
17
+ <h2><i class="fa-solid fa-list-check" style="color: var(--teal-text);"></i> Judging Criteria</h2>
18
18
  <span v-if="hasWeights" class="cpub-sec-sub">{{ totalWeight }} pts total</span>
19
19
  </div>
20
20
  <div class="cpub-criteria-card">
@@ -38,7 +38,7 @@ function prizeIcon(prize: Prize): string {
38
38
  <template>
39
39
  <div class="cpub-prizes-section">
40
40
  <div class="cpub-sec-head">
41
- <h2><i class="fa fa-trophy" style="color: var(--yellow);"></i> Prizes</h2>
41
+ <h2><i class="fa fa-trophy" style="color: var(--yellow-text);"></i> Prizes</h2>
42
42
  </div>
43
43
  <BlocksBlockContentRenderer
44
44
  v-if="blocks?.length"
@@ -75,19 +75,19 @@ function prizeIcon(prize: Prize): string {
75
75
  .cpub-prize-gold { box-shadow: var(--shadow-accent); }
76
76
 
77
77
  .cpub-prize-rank { font-size: 11px; font-family: var(--font-mono); font-weight: 600; letter-spacing: .08em; margin-bottom: 8px; }
78
- .cpub-prize-rank-gold { color: var(--yellow); }
78
+ .cpub-prize-rank-gold { color: var(--yellow-text); }
79
79
  .cpub-prize-rank-silver { color: var(--silver); }
80
80
  .cpub-prize-rank-bronze { color: var(--bronze); }
81
81
  .cpub-prize-rank-default { color: var(--text-dim); }
82
82
 
83
83
  .cpub-prize-icon { font-size: 28px; margin-bottom: 8px; }
84
- .cpub-prize-icon-gold { color: var(--yellow); }
84
+ .cpub-prize-icon-gold { color: var(--yellow-text); }
85
85
  .cpub-prize-icon-silver { color: var(--silver); }
86
86
  .cpub-prize-icon-bronze { color: var(--bronze); }
87
87
  .cpub-prize-icon-default { color: var(--text-dim); }
88
88
 
89
89
  .cpub-prize-amount { font-size: 24px; font-weight: 800; font-family: var(--font-mono); margin-bottom: 4px; }
90
- .cpub-prize-amount-gold { color: var(--yellow); }
90
+ .cpub-prize-amount-gold { color: var(--yellow-text); }
91
91
  .cpub-prize-amount-silver { color: var(--silver); }
92
92
  .cpub-prize-amount-bronze { color: var(--bronze); }
93
93
  .cpub-prize-amount-default { color: var(--text-dim); }
@@ -17,7 +17,7 @@ defineProps<{
17
17
  <template>
18
18
  <div class="cpub-rules-section">
19
19
  <div class="cpub-sec-head">
20
- <h2><i class="fa fa-file-lines" style="color: var(--purple);"></i> Rules</h2>
20
+ <h2><i class="fa fa-file-lines" style="color: var(--purple-text);"></i> Rules</h2>
21
21
  </div>
22
22
  <div class="cpub-rules-card">
23
23
  <BlocksBlockContentRenderer
@@ -120,12 +120,12 @@ function statusClass(status: string): string {
120
120
  .cpub-sb-row { display: flex; align-items: center; gap: 6px; }
121
121
  .cpub-sb-status { font-size: 10px; font-family: var(--font-mono); text-transform: uppercase; padding: 2px 8px; border: var(--border-width-default) solid; }
122
122
  .cpub-status-draft { color: var(--text-faint); border-color: var(--border2); background: var(--surface2); border-style: dashed; }
123
- .cpub-status-upcoming { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
124
- .cpub-status-active { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
125
- .cpub-status-paused { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
123
+ .cpub-status-upcoming { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
124
+ .cpub-status-active { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
125
+ .cpub-status-paused { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
126
126
  .cpub-status-judging { color: var(--accent); border-color: var(--accent-border); background: var(--accent-bg); }
127
127
  .cpub-status-completed { color: var(--text-faint); border-color: var(--border2); background: var(--surface2); }
128
- .cpub-status-cancelled { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
128
+ .cpub-status-cancelled { color: var(--red-text); border-color: var(--red-border); background: var(--red-bg); }
129
129
 
130
130
  /* TIMELINE */
131
131
  .cpub-timeline { list-style: none; margin: 14px 0 0; padding: 0; }
@@ -137,12 +137,12 @@ function statusClass(status: string): string {
137
137
  .cpub-tl-date { font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); margin-top: 1px; }
138
138
  .cpub-tl-now { font-size: 8px; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: .08em; color: var(--accent); border: var(--border-width-default) solid var(--accent-border); background: var(--accent-bg); padding: 1px 5px; }
139
139
 
140
- .cpub-tl-done .cpub-tl-dot { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
140
+ .cpub-tl-done .cpub-tl-dot { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
141
141
  .cpub-tl-done .cpub-tl-label { color: var(--text); }
142
142
  .cpub-tl-current .cpub-tl-dot { color: var(--accent); border-color: var(--accent); background: var(--accent-bg); }
143
143
  .cpub-tl-current .cpub-tl-label { color: var(--text); font-weight: 700; }
144
144
 
145
- .cpub-sb-cancelled { font-size: 11px; color: var(--red); margin: 10px 0 0; }
145
+ .cpub-sb-cancelled { font-size: 11px; color: var(--red-text); margin: 10px 0 0; }
146
146
 
147
147
  .cpub-sb-actions { display: flex; gap: 6px; flex-wrap: wrap; }
148
148
  .cpub-sb-btn { flex: 1; justify-content: center; }
@@ -199,7 +199,7 @@ function onInstructionsUpdate(blocks: BlockTuple[]): void {
199
199
  .cpub-stage-iconbtn { background: var(--surface); border: var(--border-width-default) solid var(--border); color: var(--text-dim); cursor: pointer; width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; }
200
200
  .cpub-stage-iconbtn:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
201
201
  .cpub-stage-iconbtn:disabled { opacity: .4; cursor: not-allowed; }
202
- .cpub-stage-del:hover { border-color: var(--red-border); color: var(--red); }
202
+ .cpub-stage-del:hover { border-color: var(--red-border); color: var(--red-text); }
203
203
  .cpub-stage-kind-help { font-size: 11px; color: var(--text-faint); line-height: 1.5; margin: 0 0 4px; display: flex; gap: 6px; }
204
204
  .cpub-stage-kind-help i { color: var(--accent); margin-top: 2px; flex-shrink: 0; }
205
205
  .cpub-stage-criteria { border: var(--border-width-default) dashed var(--border2); padding: 10px; margin-top: 4px; background: var(--surface); }
@@ -133,13 +133,13 @@ function submittedAtLabel(iso: string): string {
133
133
  .cpub-stagesub-title { font-size: 14px; font-weight: 700; display: flex; align-items: center; gap: 8px; margin: 0; }
134
134
  .cpub-stagesub-title i { color: var(--accent); }
135
135
  .cpub-stagesub-badge { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: .05em; padding: 3px 8px; border: var(--border-width-default) solid; }
136
- .cpub-stagesub-done { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
136
+ .cpub-stagesub-done { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
137
137
  .cpub-stagesub-todo { color: var(--text-dim); border-color: var(--border2); background: var(--surface2); }
138
138
  .cpub-stagesub-desc { font-size: 12px; color: var(--text-dim); margin: 0 0 12px; line-height: 1.6; }
139
139
  .cpub-stagesub-intro { margin: 0 0 12px; }
140
140
  .cpub-stagesub-field { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }
141
141
  .cpub-stagesub-label { font-size: 11px; font-weight: 600; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: .05em; color: var(--text-dim); }
142
- .cpub-stagesub-req { color: var(--red); }
142
+ .cpub-stagesub-req { color: var(--red-text); }
143
143
  .cpub-stagesub-input { width: 100%; padding: var(--space-2) var(--space-3); border: var(--border-width-default) solid var(--border); background: var(--surface); color: var(--text); font-size: var(--text-sm); font-family: var(--font-sans); }
144
144
  .cpub-stagesub-input:focus { border-color: var(--accent); outline: none; box-shadow: var(--shadow-accent); }
145
145
  .cpub-stagesub-textarea { resize: vertical; }
@@ -337,7 +337,7 @@ function toggleIntro(): void {
337
337
 
338
338
  .cpub-stage-iconbtn { background: var(--surface); border: var(--border-width-default) solid var(--border); color: var(--text-dim); cursor: pointer; width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; }
339
339
  .cpub-stage-iconbtn:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
340
- .cpub-stage-del:hover { border-color: var(--red-border); color: var(--red); }
340
+ .cpub-stage-del:hover { border-color: var(--red-border); color: var(--red-text); }
341
341
 
342
342
  .cpub-stage-criteria { border: var(--border-width-default) dashed var(--border2); padding: 10px; margin-top: 4px; background: var(--surface); }
343
343
  .cpub-stage-criteria-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
@@ -144,7 +144,7 @@ async function removeStakeholder(userId: string): Promise<void> {
144
144
  .cpub-sh-role { font-size: 11px; padding: 4px 6px; border: var(--border-width-default) solid var(--border); background: var(--bg); color: var(--text); outline: none; flex-shrink: 0; }
145
145
  .cpub-sh-role:focus { border-color: var(--accent); }
146
146
  .cpub-sh-remove { background: none; border: none; color: var(--text-faint); cursor: pointer; font-size: 12px; padding: 6px; min-height: 28px; }
147
- .cpub-sh-remove:hover { color: var(--red); }
147
+ .cpub-sh-remove:hover { color: var(--red-text); }
148
148
  .cpub-sh-empty { font-size: 12px; color: var(--text-faint); font-style: italic; margin-bottom: 12px; }
149
149
  .cpub-sh-search { position: relative; }
150
150
  .cpub-sh-search-row { display: flex; gap: 8px; }
@@ -127,7 +127,7 @@ function setChecked(on: boolean): void {
127
127
  <style scoped>
128
128
  .cpub-subfield { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }
129
129
  .cpub-subfield-label { font-size: 11px; font-weight: 600; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: .05em; color: var(--text-dim); }
130
- .cpub-subfield-req { color: var(--red); }
130
+ .cpub-subfield-req { color: var(--red-text); }
131
131
  .cpub-subfield-input { width: 100%; padding: var(--space-2) var(--space-3); border: var(--border-width-default) solid var(--border); background: var(--surface); color: var(--text); font-size: var(--text-sm); font-family: var(--font-sans); }
132
132
  .cpub-subfield-input:focus { border-color: var(--accent); outline: none; box-shadow: var(--shadow-accent); }
133
133
  .cpub-subfield-textarea { resize: vertical; }
@@ -116,7 +116,7 @@ function removeItem(ci: number, ii: number): void {
116
116
  .cpub-cmpedit-remove,
117
117
  .cpub-cmpedit-itemremove { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 0 8px; flex-shrink: 0; }
118
118
  .cpub-cmpedit-remove:hover,
119
- .cpub-cmpedit-itemremove:hover { border-color: var(--red-border); color: var(--red); }
119
+ .cpub-cmpedit-itemremove:hover { border-color: var(--red-border); color: var(--red-text); }
120
120
  .cpub-cmpedit-itemadd { align-self: flex-start; font-family: var(--font-mono); font-size: 10px; padding: 3px 8px; background: transparent; border: var(--border-width-default) solid var(--border2); color: var(--text-dim); cursor: pointer; display: flex; align-items: center; gap: 4px; }
121
121
  .cpub-cmpedit-itemadd:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-bg); }
122
122
 
@@ -111,7 +111,7 @@ function useRubric(): void {
111
111
  .cpub-cbedit-swatch { width: 18px; height: 18px; border: var(--border-width-default) solid var(--border2); cursor: pointer; padding: 0; }
112
112
  .cpub-cbedit-swatch-on { outline: 2px solid var(--text); outline-offset: 1px; }
113
113
  .cpub-cbedit-remove { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 4px 8px; }
114
- .cpub-cbedit-remove:hover { border-color: var(--red-border); color: var(--red); }
114
+ .cpub-cbedit-remove:hover { border-color: var(--red-border); color: var(--red-text); }
115
115
  .cpub-cbedit-empty { padding: 16px; text-align: center; font-size: 12px; color: var(--text-faint); cursor: pointer; border: var(--border-width-default) dashed var(--border2); }
116
116
  .cpub-cbedit-empty:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-bg); }
117
117
  .cpub-cbedit-check { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-dim); cursor: pointer; }
@@ -187,7 +187,7 @@ async function importPanelJudges(): Promise<void> {
187
187
  .cpub-jedit-iconbtn:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
188
188
  .cpub-jedit-iconbtn:disabled { opacity: .4; cursor: not-allowed; }
189
189
  .cpub-jedit-remove { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 0 8px; flex-shrink: 0; }
190
- .cpub-jedit-remove:hover { border-color: var(--red-border); color: var(--red); }
190
+ .cpub-jedit-remove:hover { border-color: var(--red-border); color: var(--red-text); }
191
191
 
192
192
  .cpub-jedit-avatar-row { display: flex; gap: 6px; align-items: center; }
193
193
  .cpub-jedit-avatar-row .cpub-jedit-input { flex: 1; }
@@ -120,7 +120,7 @@ function pullFromSchedule(): void {
120
120
  .cpub-rmedit-move:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
121
121
  .cpub-rmedit-move:disabled { opacity: 0.4; cursor: not-allowed; }
122
122
  .cpub-rmedit-remove { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 0 8px; flex-shrink: 0; }
123
- .cpub-rmedit-remove:hover { border-color: var(--red-border); color: var(--red); }
123
+ .cpub-rmedit-remove:hover { border-color: var(--red-border); color: var(--red-text); }
124
124
 
125
125
  .cpub-rmedit-empty { padding: 20px; text-align: center; font-size: 12px; color: var(--text-faint); cursor: pointer; border: var(--border-width-default) dashed var(--border2); }
126
126
  .cpub-rmedit-empty:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-bg); }
@@ -119,7 +119,7 @@ async function onFile(i: number, event: Event): Promise<void> {
119
119
  .cpub-spedit-upload { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 30px; border: var(--border-width-default) solid var(--border); background: var(--surface2); color: var(--text-dim); cursor: pointer; }
120
120
  .cpub-spedit-upload:hover { border-color: var(--accent); color: var(--accent); }
121
121
  .cpub-spedit-remove { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 11px; padding: 0 8px; flex-shrink: 0; align-self: stretch; }
122
- .cpub-spedit-remove:hover { border-color: var(--red-border); color: var(--red); }
122
+ .cpub-spedit-remove:hover { border-color: var(--red-border); color: var(--red-text); }
123
123
 
124
124
  .cpub-spedit-empty { padding: 20px; text-align: center; font-size: 12px; color: var(--text-faint); cursor: pointer; border: var(--border-width-default) dashed var(--border2); }
125
125
  .cpub-spedit-empty:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-bg); }
@@ -94,7 +94,7 @@ function removeRow(r: number): void {
94
94
  .cpub-tedit-grid td { padding: 0 4px 4px 0; }
95
95
  .cpub-tedit-grid td .cpub-tedit-input { min-width: 120px; }
96
96
  .cpub-tedit-del { background: none; border: var(--border-width-default) solid var(--border); color: var(--text-faint); cursor: pointer; font-size: 10px; padding: 4px 6px; margin-top: 3px; }
97
- .cpub-tedit-del:hover:not(:disabled) { border-color: var(--red-border); color: var(--red); }
97
+ .cpub-tedit-del:hover:not(:disabled) { border-color: var(--red-border); color: var(--red-text); }
98
98
  .cpub-tedit-del:disabled { opacity: 0.35; cursor: not-allowed; }
99
99
  .cpub-tedit-rowspacer { width: 28px; }
100
100
  .cpub-tedit-rowdel { width: 28px; text-align: center; }
@@ -162,7 +162,7 @@ function moveTab(i: number, dir: -1 | 1): void {
162
162
  .cpub-tabsedit-mbtn { width: 26px; height: 26px; background: var(--surface2); border: var(--border-width-default) solid var(--border2); color: var(--text-faint); cursor: pointer; font-size: 10px; display: inline-flex; align-items: center; justify-content: center; }
163
163
  .cpub-tabsedit-mbtn:hover:not(:disabled) { color: var(--text); }
164
164
  .cpub-tabsedit-mbtn:disabled { opacity: 0.35; cursor: not-allowed; }
165
- .cpub-tabsedit-mbtn--danger:hover:not(:disabled) { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
165
+ .cpub-tabsedit-mbtn--danger:hover:not(:disabled) { color: var(--red-text); border-color: var(--red-border); background: var(--red-bg); }
166
166
  .cpub-tabsedit-empty { padding: 18px; text-align: center; font-size: 12px; color: var(--text-faint); cursor: pointer; margin: 12px 14px; border: var(--border-width-default) dashed var(--border2); }
167
167
  .cpub-tabsedit-empty:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-bg); }
168
168
  </style>
@@ -583,7 +583,7 @@ const canvasMaxWidth = computed(() => {
583
583
  .cpub-ae-assets-drop-sub { font-size: 10px; color: var(--text-faint); font-family: var(--font-mono); }
584
584
  .cpub-ae-assets-error {
585
585
  margin: 4px 8px 8px; padding: 6px 10px; font-size: 10px; font-family: var(--font-mono);
586
- color: var(--red); background: var(--red-bg); border: var(--border-width-default) solid var(--red);
586
+ color: var(--red-text); background: var(--red-bg); border: var(--border-width-default) solid var(--red);
587
587
  display: flex; align-items: center; gap: 6px;
588
588
  }
589
589
  .cpub-ae-assets-list { padding: 8px 12px; }
@@ -574,10 +574,10 @@ onUnmounted(() => {
574
574
  }
575
575
 
576
576
  .cpub-tree-context-danger {
577
- color: var(--red);
577
+ color: var(--red-text);
578
578
  }
579
579
 
580
580
  .cpub-tree-context-danger i {
581
- color: var(--red);
581
+ color: var(--red-text);
582
582
  }
583
583
  </style>
@@ -400,7 +400,7 @@ const blockCount = computed(() => props.blockEditor.blocks.value.length);
400
400
  .cpub-ee-section-title { font-size: 12px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
401
401
  .cpub-ee-section-meta { font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); display: flex; align-items: center; gap: 6px; }
402
402
  .cpub-ee-section-interactive-badge { display: inline-flex; align-items: center; gap: 3px; color: var(--accent); font-weight: 600; }
403
- .cpub-ee-section-no-interactive { color: var(--yellow); font-style: italic; }
403
+ .cpub-ee-section-no-interactive { color: var(--yellow-text); font-style: italic; }
404
404
 
405
405
  /* Empty state */
406
406
  .cpub-ee-structure-empty {
@@ -469,7 +469,7 @@ const blockCount = computed(() => props.blockEditor.blocks.value.length);
469
469
  .cpub-pe-checklist { display: flex; flex-direction: column; gap: 5px; }
470
470
  .cpub-pe-check-item { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--text-faint); }
471
471
  .cpub-pe-check-item.pass { color: var(--text); }
472
- .cpub-pe-checklist-summary { margin-top: 8px; font-family: var(--font-mono); font-size: 10px; color: var(--green); }
472
+ .cpub-pe-checklist-summary { margin-top: 8px; font-family: var(--font-mono); font-size: 10px; color: var(--green-text); }
473
473
 
474
474
  /* Cover image */
475
475
  .cpub-pe-cover {
@@ -24,7 +24,7 @@ const { data: editorialPicks } = await useFetch<PaginatedResponse<Serialized<Con
24
24
  <style scoped>
25
25
  .cpub-editorial-section { margin-bottom: 24px; }
26
26
  .cpub-editorial-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
27
- .cpub-editorial-heading { font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--teal); display: flex; align-items: center; gap: 6px; }
27
+ .cpub-editorial-heading { font-family: var(--font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--teal-text); display: flex; align-items: center; gap: 6px; }
28
28
  .cpub-editorial-heading i { font-size: 10px; }
29
29
  .cpub-editorial-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--cpub-card-min, 260px), 1fr)); gap: var(--cpub-card-gap, 20px); }
30
30
  .cpub-editorial-single { grid-template-columns: 1fr; max-width: 400px; }
@@ -157,8 +157,8 @@ watchEffect(() => {
157
157
  .cpub-hero-inner { position: relative; z-index: 1; max-width: 1280px; margin: 0 auto; padding: 36px 32px; width: 100%; display: flex; align-items: center; gap: 48px; }
158
158
  .cpub-hero-content { flex: 1; min-width: 0; }
159
159
  .cpub-hero-eyebrow { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
160
- .cpub-hero-badge { font-size: 9px; font-family: var(--font-mono); letter-spacing: 0.1em; text-transform: uppercase; padding: 3px 9px; background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow); color: var(--yellow); }
161
- .cpub-hero-badge-live { background: var(--green-bg); border-color: var(--green); color: var(--green); display: flex; align-items: center; gap: 5px; }
160
+ .cpub-hero-badge { font-size: 9px; font-family: var(--font-mono); letter-spacing: 0.1em; text-transform: uppercase; padding: 3px 9px; background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow); color: var(--yellow-text); }
161
+ .cpub-hero-badge-live { background: var(--green-bg); border-color: var(--green); color: var(--green-text); display: flex; align-items: center; gap: 5px; }
162
162
  .cpub-live-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--green); animation: cpub-pulse 2s ease-in-out infinite; }
163
163
  @keyframes cpub-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
164
164
  .cpub-hero-title { font-size: 22px; font-weight: 700; line-height: 1.25; margin-bottom: 10px; }
@@ -62,5 +62,5 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
62
62
  .cpub-hub-members { font-family: var(--font-mono); font-size: 10px; color: var(--text-faint); }
63
63
  .cpub-btn-join { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; padding: 3px 10px; border: var(--border-width-default) solid var(--accent); color: var(--accent); background: none; cursor: pointer; }
64
64
  .cpub-btn-join:hover { background: var(--accent-bg); }
65
- .cpub-btn-joined { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; padding: 3px 10px; border: var(--border-width-default) solid var(--green-border); color: var(--green); background: var(--green-bg); cursor: default; display: flex; align-items: center; gap: 3px; }
65
+ .cpub-btn-joined { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; padding: 3px 10px; border: var(--border-width-default) solid var(--green-border); color: var(--green-text); background: var(--green-bg); cursor: default; display: flex; align-items: center; gap: 3px; }
66
66
  </style>
@@ -258,7 +258,7 @@ async function handleDelete(id: string): Promise<void> {
258
258
  }
259
259
 
260
260
  .cpub-resource-delete:hover {
261
- color: var(--red);
261
+ color: var(--red-text);
262
262
  }
263
263
 
264
264
  @media (max-width: 640px) {
@@ -481,7 +481,7 @@ useJsonLd({
481
481
 
482
482
  .cpub-tag-teal {
483
483
  border-color: var(--teal-border);
484
- color: var(--teal);
484
+ color: var(--teal-text);
485
485
  background: var(--teal-bg);
486
486
  }
487
487
 
@@ -523,8 +523,8 @@ useJsonLd({
523
523
  }
524
524
 
525
525
  .cpub-eng-btn:hover { background: var(--surface2); color: var(--text); }
526
- .cpub-eng-btn.liked { color: var(--red); border-color: var(--border); background: var(--red-bg); }
527
- .cpub-eng-btn.bookmarked { color: var(--yellow); border-color: var(--border); background: var(--yellow-bg); }
526
+ .cpub-eng-btn.liked { color: var(--red-text); border-color: var(--border); background: var(--red-bg); }
527
+ .cpub-eng-btn.bookmarked { color: var(--yellow-text); border-color: var(--border); background: var(--yellow-bg); }
528
528
 
529
529
  .cpub-eng-sep {
530
530
  width: 2px;
@@ -515,7 +515,7 @@ onUnmounted(() => { document.removeEventListener('keydown', onKeydown); });
515
515
  .cpub-toc-item.active button { background: var(--accent-bg); border-left-color: var(--accent); color: var(--accent); font-weight: 500; }
516
516
  .cpub-toc-item.completed button { color: var(--text-dim); }
517
517
  .cpub-toc-icon { width: 14px; font-size: 10px; flex-shrink: 0; text-align: center; }
518
- .cpub-toc-item.completed .cpub-toc-icon { color: var(--green); }
518
+ .cpub-toc-item.completed .cpub-toc-icon { color: var(--green-text); }
519
519
  .cpub-toc-item.active .cpub-toc-icon { color: var(--accent); }
520
520
  .cpub-toc-num { font-family: var(--font-mono); font-size: 9px; color: var(--text-faint); flex-shrink: 0; }
521
521
  .cpub-toc-item.active .cpub-toc-num { color: var(--accent-border); }
@@ -716,7 +716,7 @@ onUnmounted(() => { document.removeEventListener('keydown', onKeydown); });
716
716
  border: var(--border-width-default) solid var(--green);
717
717
  margin-top: 24px;
718
718
  font-size: 13px;
719
- color: var(--green);
719
+ color: var(--green-text);
720
720
  opacity: 0;
721
721
  transform: translateY(8px);
722
722
  transition: opacity 0.4s ease, transform 0.4s ease;
@@ -533,7 +533,7 @@ async function handleBuild(): Promise<void> {
533
533
  opacity: 0.22;
534
534
  font-family: var(--font-mono);
535
535
  font-size: 11px;
536
- color: var(--teal);
536
+ color: var(--teal-text);
537
537
  letter-spacing: 0.05em;
538
538
  }
539
539
 
@@ -576,7 +576,7 @@ async function handleBuild(): Promise<void> {
576
576
  .cpub-badge-featured {
577
577
  background: var(--yellow-bg);
578
578
  border: var(--border-width-default) solid var(--border);
579
- color: var(--yellow);
579
+ color: var(--yellow-text);
580
580
  box-shadow: var(--shadow-sm);
581
581
  }
582
582
 
@@ -730,11 +730,11 @@ async function handleBuild(): Promise<void> {
730
730
  }
731
731
 
732
732
  .cpub-engage-btn:hover { color: var(--text); background: var(--surface2); }
733
- .cpub-engage-btn.liked { color: var(--red); background: var(--red-bg); }
733
+ .cpub-engage-btn.liked { color: var(--red-text); background: var(--red-bg); }
734
734
  .cpub-engage-btn.bookmarked { color: var(--accent); background: var(--accent-bg); }
735
735
 
736
736
  .cpub-engage-btn-green {
737
- color: var(--green);
737
+ color: var(--green-text);
738
738
  background: var(--green-bg);
739
739
  }
740
740
 
@@ -1153,7 +1153,7 @@ async function handleBuild(): Promise<void> {
1153
1153
  .cpub-bom-summary-row:last-child { border-bottom: none; }
1154
1154
  .cpub-bom-label { color: var(--text-dim); }
1155
1155
  .cpub-bom-val { font-family: var(--font-mono); color: var(--text); font-weight: 600; }
1156
- .cpub-bom-green { color: var(--green); }
1156
+ .cpub-bom-green { color: var(--green-text); }
1157
1157
 
1158
1158
  /* Hub card */
1159
1159
  .cpub-hub-card-inner {
@@ -1170,7 +1170,7 @@ async function handleBuild(): Promise<void> {
1170
1170
  align-items: center;
1171
1171
  justify-content: center;
1172
1172
  font-size: 18px;
1173
- color: var(--purple);
1173
+ color: var(--purple-text);
1174
1174
  margin: 0 auto 10px;
1175
1175
  }
1176
1176
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonpub/layer",
3
- "version": "0.86.3",
3
+ "version": "0.86.4",
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
6
  "files": [
@@ -56,15 +56,15 @@
56
56
  "zod": "^4.3.6",
57
57
  "@commonpub/auth": "0.8.0",
58
58
  "@commonpub/docs": "0.6.3",
59
+ "@commonpub/config": "0.23.0",
59
60
  "@commonpub/explainer": "0.8.0",
60
- "@commonpub/schema": "0.48.0",
61
- "@commonpub/protocol": "0.14.0",
62
61
  "@commonpub/editor": "0.9.0",
63
- "@commonpub/config": "0.23.0",
64
- "@commonpub/theme-studio": "0.6.1",
62
+ "@commonpub/protocol": "0.14.0",
63
+ "@commonpub/learning": "0.5.2",
64
+ "@commonpub/schema": "0.48.0",
65
65
  "@commonpub/server": "2.92.0",
66
- "@commonpub/ui": "0.13.1",
67
- "@commonpub/learning": "0.5.2"
66
+ "@commonpub/theme-studio": "0.6.1",
67
+ "@commonpub/ui": "0.13.1"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@testing-library/jest-dom": "^6.9.1",