@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.
- package/components/AppToast.vue +3 -3
- package/components/CommentSection.vue +2 -2
- package/components/ContentStarterForm.vue +2 -2
- package/components/CpubDateTimeField.vue +1 -1
- package/components/DiscussionItem.vue +1 -1
- package/components/FeedItem.vue +7 -7
- package/components/ImageUpload.vue +2 -2
- package/components/ImportUrlModal.vue +2 -2
- package/components/LayoutRow.vue +1 -1
- package/components/MemberCard.vue +2 -2
- package/components/MirrorDetailModal.vue +9 -9
- package/components/MirrorRequestApproveModal.vue +2 -2
- package/components/PostVoteButtons.vue +4 -4
- package/components/PublishErrorsModal.vue +2 -2
- package/components/RegistryDirectory.vue +4 -4
- package/components/RemoteFollowDialog.vue +1 -1
- package/components/SearchSidebar.vue +1 -1
- package/components/admin/layouts/AdminLayoutsAutoForm.vue +3 -3
- package/components/admin/layouts/AdminLayoutsConflictModal.vue +2 -2
- package/components/admin/layouts/AdminLayoutsInspectorSection.vue +1 -1
- package/components/admin/layouts/AdminLayoutsToolbar.vue +1 -1
- package/components/admin/theme/AdminThemeFamilyCard.vue +2 -2
- package/components/admin/theme/AdminThemeOverridesPanel.vue +1 -1
- package/components/admin/theme/AdminThemeSceneAdmin.vue +5 -5
- package/components/admin/theme/AdminThemeSceneSheet.vue +2 -2
- package/components/admin/theme/studio/AdminThemeStudio.vue +2 -2
- package/components/blocks/BlockCalloutView.vue +6 -6
- package/components/blocks/BlockCheckpointView.vue +1 -1
- package/components/blocks/BlockCompareColumnsView.vue +4 -4
- package/components/blocks/BlockQuizView.vue +11 -11
- package/components/blocks/BlockSliderView.vue +3 -3
- package/components/contest/ContestCriteriaEditor.vue +1 -1
- package/components/contest/ContestEditor.vue +13 -13
- package/components/contest/ContestEntries.vue +6 -6
- package/components/contest/ContestEntryPrivateData.vue +1 -1
- package/components/contest/ContestHero.vue +6 -6
- package/components/contest/ContestJudgeManager.vue +2 -2
- package/components/contest/ContestJudgingCriteria.vue +1 -1
- package/components/contest/ContestPrizes.vue +4 -4
- package/components/contest/ContestRules.vue +1 -1
- package/components/contest/ContestSidebar.vue +6 -6
- package/components/contest/ContestStageCard.vue +1 -1
- package/components/contest/ContestStageSubmission.vue +2 -2
- package/components/contest/ContestStageTemplateEditor.vue +1 -1
- package/components/contest/ContestStakeholderManager.vue +1 -1
- package/components/contest/ContestSubmissionField.vue +1 -1
- package/components/contest/blocks/CompareColumnsBlock.vue +1 -1
- package/components/contest/blocks/CriteriaBarBlock.vue +1 -1
- package/components/contest/blocks/JudgesShowcaseBlock.vue +1 -1
- package/components/contest/blocks/RoadmapBlock.vue +1 -1
- package/components/contest/blocks/SponsorsBlock.vue +1 -1
- package/components/contest/blocks/TableBlock.vue +1 -1
- package/components/contest/blocks/TabsBlock.vue +1 -1
- package/components/editors/ArticleEditor.vue +1 -1
- package/components/editors/DocsPageTree.vue +2 -2
- package/components/editors/ExplainerEditor.vue +1 -1
- package/components/editors/ProjectEditor.vue +1 -1
- package/components/homepage/EditorialSection.vue +1 -1
- package/components/homepage/HeroSection.vue +2 -2
- package/components/homepage/HubsSection.vue +1 -1
- package/components/hub/HubResources.vue +1 -1
- package/components/views/ArticleView.vue +3 -3
- package/components/views/ExplainerView.vue +2 -2
- package/components/views/ProjectView.vue +6 -6
- package/package.json +7 -7
- package/pages/about.vue +1 -1
- package/pages/admin/api-keys.vue +5 -5
- package/pages/admin/categories.vue +2 -2
- package/pages/admin/content.vue +6 -6
- package/pages/admin/features.vue +2 -2
- package/pages/admin/federation.vue +3 -3
- package/pages/admin/homepage.vue +4 -4
- package/pages/admin/layouts/[id].vue +2 -2
- package/pages/admin/layouts/index.vue +1 -1
- package/pages/admin/navigation.vue +2 -2
- package/pages/admin/reports.vue +4 -4
- package/pages/admin/theme/edit/[id].vue +1 -1
- package/pages/admin/users.vue +3 -3
- package/pages/admin/video-categories.vue +1 -1
- package/pages/auth/forgot-password.vue +1 -1
- package/pages/auth/login.vue +1 -1
- package/pages/auth/register.vue +2 -2
- package/pages/auth/reset-password.vue +3 -3
- package/pages/auth/verify-email.vue +3 -3
- package/pages/authorize_interaction.vue +2 -2
- package/pages/cert/[code].vue +3 -3
- package/pages/contests/[slug]/entries/[entryId].vue +2 -2
- package/pages/contests/[slug]/judge.vue +4 -4
- package/pages/contests/[slug]/results.vue +4 -4
- package/pages/dashboard.vue +3 -3
- package/pages/docs/[siteSlug]/edit.vue +5 -5
- package/pages/explore.vue +1 -1
- package/pages/federated-hubs/[id]/posts/[postId].vue +1 -1
- package/pages/federation/users/[handle].vue +1 -1
- package/pages/hubs/[slug]/index.vue +2 -2
- package/pages/hubs/[slug]/invites.vue +2 -2
- package/pages/hubs/[slug]/members.vue +3 -3
- package/pages/hubs/[slug]/posts/[postId].vue +2 -2
- package/pages/index.vue +7 -7
- package/pages/learn/[slug]/[lessonSlug]/edit.vue +2 -2
- package/pages/learn/[slug]/[lessonSlug]/index.vue +10 -10
- package/pages/learn/[slug]/edit.vue +4 -4
- package/pages/learn/[slug]/index.vue +4 -4
- package/pages/learn/index.vue +6 -6
- package/pages/messages/index.vue +2 -2
- package/pages/mirror/[id].vue +1 -1
- package/pages/products/[slug].vue +1 -1
- package/pages/settings/account.vue +2 -2
- package/pages/settings/profile.vue +1 -1
- package/pages/u/[username]/[type]/[slug]/edit.vue +4 -4
- package/pages/u/[username]/index.vue +5 -5
- package/pages/videos/index.vue +3 -3
- package/theme/base.css +31 -0
|
@@ -236,15 +236,15 @@ async function unbanMember(userId: string, username: string): Promise<void> {
|
|
|
236
236
|
.member-role-select { padding: 3px 6px; border: var(--border-width-default) solid var(--border2); background: var(--surface); color: var(--text-dim); font-size: 10px; font-family: var(--font-mono); text-transform: capitalize; cursor: pointer; }
|
|
237
237
|
.member-role-select:focus { border-color: var(--accent); outline: none; }
|
|
238
238
|
.member-kick-btn { background: none; border: var(--border-width-default) solid var(--border2); color: var(--text-faint); cursor: pointer; font-size: 10px; padding: 3px 6px; }
|
|
239
|
-
.member-kick-btn:hover { color: var(--red); border-color: var(--red); }
|
|
239
|
+
.member-kick-btn:hover { color: var(--red-text); border-color: var(--red); }
|
|
240
240
|
.member-ban-btn { background: none; border: var(--border-width-default) solid var(--border2); color: var(--text-faint); cursor: pointer; font-size: 10px; padding: 3px 6px; }
|
|
241
|
-
.member-ban-btn:hover { color: var(--red); border-color: var(--red); }
|
|
241
|
+
.member-ban-btn:hover { color: var(--red-text); border-color: var(--red); }
|
|
242
242
|
|
|
243
243
|
.members-empty { text-align: center; padding: 48px 0; color: var(--text-faint); }
|
|
244
244
|
|
|
245
245
|
.requests-section { margin-bottom: 28px; }
|
|
246
246
|
.requests-title { font-size: 13px; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-dim); margin-bottom: 10px; }
|
|
247
|
-
.member-deny-btn:hover { color: var(--red); border-color: var(--red); }
|
|
247
|
+
.member-deny-btn:hover { color: var(--red-text); border-color: var(--red); }
|
|
248
248
|
|
|
249
249
|
.bans-section { margin-top: 28px; }
|
|
250
250
|
.bans-title { font-size: 13px; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-dim); margin-bottom: 10px; }
|
|
@@ -371,7 +371,7 @@ useSeoMeta({
|
|
|
371
371
|
padding: 4px 8px; border: var(--border-width-default) solid var(--border); transition: all 0.1s;
|
|
372
372
|
}
|
|
373
373
|
.cpub-post-action-btn:hover:not(:disabled) { color: var(--accent); border-color: var(--accent-border); }
|
|
374
|
-
.cpub-post-action-btn.active { color: var(--red); border-color: var(--red); }
|
|
374
|
+
.cpub-post-action-btn.active { color: var(--red-text); border-color: var(--red); }
|
|
375
375
|
.cpub-post-action-btn:disabled { opacity: 0.5; cursor: default; }
|
|
376
376
|
|
|
377
377
|
.cpub-post-mod-bar {
|
|
@@ -382,7 +382,7 @@ useSeoMeta({
|
|
|
382
382
|
.cpub-btn-primary { background: var(--accent); color: var(--color-on-accent); border-color: var(--accent); }
|
|
383
383
|
.cpub-btn-primary:hover:not(:disabled) { opacity: 0.9; }
|
|
384
384
|
.cpub-btn-primary:disabled { opacity: 0.5; cursor: default; }
|
|
385
|
-
.cpub-btn-danger { color: var(--red); border-color: var(--red); }
|
|
385
|
+
.cpub-btn-danger { color: var(--red-text); border-color: var(--red); }
|
|
386
386
|
.cpub-btn-danger:hover { background: var(--red); color: var(--color-on-accent); }
|
|
387
387
|
|
|
388
388
|
/* Reply form */
|
package/pages/index.vue
CHANGED
|
@@ -527,13 +527,13 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
527
527
|
padding: 3px 9px;
|
|
528
528
|
background: var(--yellow-bg);
|
|
529
529
|
border: var(--border-width-default) solid var(--yellow);
|
|
530
|
-
color: var(--yellow);
|
|
530
|
+
color: var(--yellow-text);
|
|
531
531
|
}
|
|
532
532
|
|
|
533
533
|
.cpub-hero-badge-live {
|
|
534
534
|
background: var(--green-bg);
|
|
535
535
|
border-color: var(--green);
|
|
536
|
-
color: var(--green);
|
|
536
|
+
color: var(--green-text);
|
|
537
537
|
display: flex;
|
|
538
538
|
align-items: center;
|
|
539
539
|
gap: 5px;
|
|
@@ -674,7 +674,7 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
674
674
|
font-weight: 700;
|
|
675
675
|
letter-spacing: 0.08em;
|
|
676
676
|
text-transform: uppercase;
|
|
677
|
-
color: var(--teal);
|
|
677
|
+
color: var(--teal-text);
|
|
678
678
|
display: flex;
|
|
679
679
|
align-items: center;
|
|
680
680
|
gap: 6px;
|
|
@@ -741,7 +741,7 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
741
741
|
z-index: 1;
|
|
742
742
|
font-size: 48px;
|
|
743
743
|
opacity: 0.2;
|
|
744
|
-
color: var(--teal);
|
|
744
|
+
color: var(--teal-text);
|
|
745
745
|
}
|
|
746
746
|
|
|
747
747
|
.cpub-thumb-overlay {
|
|
@@ -760,7 +760,7 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
760
760
|
.cpub-badge-featured {
|
|
761
761
|
background: var(--yellow-bg);
|
|
762
762
|
border: var(--border-width-default) solid var(--yellow);
|
|
763
|
-
color: var(--yellow);
|
|
763
|
+
color: var(--yellow-text);
|
|
764
764
|
font-size: 9px;
|
|
765
765
|
font-family: var(--font-mono);
|
|
766
766
|
text-transform: uppercase;
|
|
@@ -1066,7 +1066,7 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
1066
1066
|
flex-shrink: 0;
|
|
1067
1067
|
border: var(--border-width-default) solid var(--teal);
|
|
1068
1068
|
background: var(--teal-bg);
|
|
1069
|
-
color: var(--teal);
|
|
1069
|
+
color: var(--teal-text);
|
|
1070
1070
|
overflow: hidden;
|
|
1071
1071
|
}
|
|
1072
1072
|
.cpub-hub-icon-img {
|
|
@@ -1116,7 +1116,7 @@ async function handleHubJoin(hubSlug: string): Promise<void> {
|
|
|
1116
1116
|
padding: 4px 10px;
|
|
1117
1117
|
background: var(--green-bg);
|
|
1118
1118
|
border: var(--border-width-default) solid var(--green-border);
|
|
1119
|
-
color: var(--green);
|
|
1119
|
+
color: var(--green-text);
|
|
1120
1120
|
font-size: 10px;
|
|
1121
1121
|
font-family: var(--font-mono);
|
|
1122
1122
|
flex-shrink: 0;
|
|
@@ -279,7 +279,7 @@ const videoEmbedUrl = computed(() => {
|
|
|
279
279
|
|
|
280
280
|
<!-- LINKED CONTENT -->
|
|
281
281
|
<section v-if="lesson.contentItemId" class="lesson-section">
|
|
282
|
-
<h2 class="lesson-section-title"><i class="fa-solid fa-link" style="color: var(--teal); margin-right: 6px;"></i>Linked Content</h2>
|
|
282
|
+
<h2 class="lesson-section-title"><i class="fa-solid fa-link" style="color: var(--teal-text); margin-right: 6px;"></i>Linked Content</h2>
|
|
283
283
|
<div class="linked-content-info">
|
|
284
284
|
<div class="linked-content-card">
|
|
285
285
|
<span class="cpub-lesson-type-badge" style="margin-right: 8px;">{{ lesson.type }}</span>
|
|
@@ -289,7 +289,7 @@ const videoEmbedUrl = computed(() => {
|
|
|
289
289
|
<NuxtLink :to="`/u/${(lessonData?.linkedContent as any)?.author?.username ?? ''}/${lesson.type}/${lessonData?.linkedContent?.slug || ''}/edit`" class="cpub-btn cpub-btn-sm">
|
|
290
290
|
<i class="fa-solid fa-pen"></i> Edit Content
|
|
291
291
|
</NuxtLink>
|
|
292
|
-
<button class="cpub-btn cpub-btn-sm" style="color: var(--red); border-color: var(--red-border);" @click="unlinkContent">
|
|
292
|
+
<button class="cpub-btn cpub-btn-sm" style="color: var(--red-text); border-color: var(--red-border);" @click="unlinkContent">
|
|
293
293
|
<i class="fa-solid fa-link-slash"></i> Unlink
|
|
294
294
|
</button>
|
|
295
295
|
</div>
|
|
@@ -474,7 +474,7 @@ const isOwner = computed(() => user.value?.id === path.value?.author?.id);
|
|
|
474
474
|
.lesson-quiz { margin-bottom: 24px; }
|
|
475
475
|
.quiz-card { border: var(--border-width-default) solid var(--border); padding: 20px; margin-bottom: 16px; background: var(--surface); box-shadow: var(--shadow-md); }
|
|
476
476
|
.quiz-header { margin-bottom: 12px; }
|
|
477
|
-
.quiz-badge { font-size: 9px; font-family: var(--font-mono); letter-spacing: 0.08em; color: var(--yellow); background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow-border); padding: 3px 8px; }
|
|
477
|
+
.quiz-badge { font-size: 9px; font-family: var(--font-mono); letter-spacing: 0.08em; color: var(--yellow-text); background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow-border); padding: 3px 8px; }
|
|
478
478
|
.quiz-question { font-size: 16px; font-weight: 600; margin-bottom: 16px; line-height: 1.5; }
|
|
479
479
|
.quiz-options { display: flex; flex-direction: column; gap: 8px; }
|
|
480
480
|
.quiz-option { display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; background: var(--surface); border: var(--border-width-default) solid var(--border); cursor: pointer; text-align: left; font-family: inherit; font-size: 13px; }
|
|
@@ -483,12 +483,12 @@ const isOwner = computed(() => user.value?.id === path.value?.author?.id);
|
|
|
483
483
|
.quiz-option.selected-wrong { background: var(--red-bg); border-color: var(--red); cursor: default; }
|
|
484
484
|
.quiz-option.answered { cursor: default; }
|
|
485
485
|
.quiz-option-key { font-family: var(--font-mono); font-size: 11px; font-weight: 700; color: var(--text-faint); width: 18px; flex-shrink: 0; }
|
|
486
|
-
.quiz-option.selected-correct .quiz-option-key { color: var(--green); }
|
|
487
|
-
.quiz-option.selected-wrong .quiz-option-key { color: var(--red); }
|
|
486
|
+
.quiz-option.selected-correct .quiz-option-key { color: var(--green-text); }
|
|
487
|
+
.quiz-option.selected-wrong .quiz-option-key { color: var(--red-text); }
|
|
488
488
|
.quiz-option-text { flex: 1; color: var(--text-dim); line-height: 1.5; }
|
|
489
489
|
.quiz-option-indicator { font-size: 12px; flex-shrink: 0; }
|
|
490
|
-
.quiz-option.selected-correct .quiz-option-indicator { color: var(--green); }
|
|
491
|
-
.quiz-option.selected-wrong .quiz-option-indicator { color: var(--red); }
|
|
490
|
+
.quiz-option.selected-correct .quiz-option-indicator { color: var(--green-text); }
|
|
491
|
+
.quiz-option.selected-wrong .quiz-option-indicator { color: var(--red-text); }
|
|
492
492
|
.quiz-option.selected-pending { background: var(--accent-bg); border-color: var(--accent); }
|
|
493
493
|
.quiz-option.selected-pending .quiz-option-key { color: var(--accent); }
|
|
494
494
|
.quiz-option.selected-pending .quiz-option-text { color: var(--text); }
|
|
@@ -500,11 +500,11 @@ const isOwner = computed(() => user.value?.id === path.value?.author?.id);
|
|
|
500
500
|
.quiz-signin-hint { font-size: 12px; color: var(--text-faint); font-family: var(--font-mono); }
|
|
501
501
|
.quiz-score { text-align: center; padding: 20px; border: var(--border-width-default) solid var(--green); background: var(--green-bg); }
|
|
502
502
|
.quiz-score.passed { border-color: var(--green); background: var(--green-bg); }
|
|
503
|
-
.quiz-score.passed .quiz-score-value, .quiz-score.passed .quiz-score-label { color: var(--green); }
|
|
503
|
+
.quiz-score.passed .quiz-score-value, .quiz-score.passed .quiz-score-label { color: var(--green-text); }
|
|
504
504
|
.quiz-score.failed { border-color: var(--red); background: var(--red-bg); }
|
|
505
|
-
.quiz-score.failed .quiz-score-value, .quiz-score.failed .quiz-score-label { color: var(--red); }
|
|
506
|
-
.quiz-score-value { font-size: 28px; font-weight: 700; font-family: var(--font-mono); color: var(--green); }
|
|
507
|
-
.quiz-score-label { font-size: 11px; font-family: var(--font-mono); color: var(--green); text-transform: uppercase; letter-spacing: 0.08em; }
|
|
505
|
+
.quiz-score.failed .quiz-score-value, .quiz-score.failed .quiz-score-label { color: var(--red-text); }
|
|
506
|
+
.quiz-score-value { font-size: 28px; font-weight: 700; font-family: var(--font-mono); color: var(--green-text); }
|
|
507
|
+
.quiz-score-label { font-size: 11px; font-family: var(--font-mono); color: var(--green-text); text-transform: uppercase; letter-spacing: 0.08em; }
|
|
508
508
|
.quiz-retry-btn { margin-top: 12px; padding: 8px 16px; background: var(--surface); color: var(--text); border: var(--border-width-default) solid var(--border); font-size: 12px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; font-family: inherit; }
|
|
509
509
|
.quiz-retry-btn:hover { background: var(--surface2); }
|
|
510
510
|
|
|
@@ -517,7 +517,7 @@ const isOwner = computed(() => user.value?.id === path.value?.author?.id);
|
|
|
517
517
|
.lesson-complete-btn { padding: 10px 20px; background: var(--accent); color: var(--color-text-inverse); border: var(--border-width-default) solid var(--border); font-size: 13px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; box-shadow: var(--shadow-md); }
|
|
518
518
|
.lesson-complete-btn:hover { box-shadow: var(--shadow-sm); transform: translate(1px, 1px); }
|
|
519
519
|
.lesson-complete-btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
520
|
-
.lesson-completed-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--green); font-size: 14px; font-weight: 600; }
|
|
520
|
+
.lesson-completed-badge { display: inline-flex; align-items: center; gap: 6px; color: var(--green-text); font-size: 14px; font-weight: 600; }
|
|
521
521
|
|
|
522
522
|
.lesson-nav-footer { display: flex; justify-content: space-between; gap: 16px; }
|
|
523
523
|
.lesson-nav-btn { display: flex; flex-direction: column; gap: 4px; padding: 12px 16px; border: var(--border-width-default) solid var(--border); background: var(--surface); text-decoration: none; max-width: 48%; box-shadow: var(--shadow-md); transition: box-shadow 0.15s, transform 0.15s; }
|
|
@@ -224,7 +224,7 @@ async function handlePublish(): Promise<void> {
|
|
|
224
224
|
>
|
|
225
225
|
<i class="fa-solid fa-rocket"></i> {{ publishing ? 'Publishing...' : 'Publish' }}
|
|
226
226
|
</button>
|
|
227
|
-
<button class="cpub-btn" style="color: var(--red); border-color: var(--red-border);" @click="deletePath">
|
|
227
|
+
<button class="cpub-btn" style="color: var(--red-text); border-color: var(--red-border);" @click="deletePath">
|
|
228
228
|
<i class="fa-solid fa-trash"></i>
|
|
229
229
|
</button>
|
|
230
230
|
</div>
|
|
@@ -360,7 +360,7 @@ async function handlePublish(): Promise<void> {
|
|
|
360
360
|
|
|
361
361
|
.cpub-status-badge { font-size: 10px; font-family: var(--font-mono); text-transform: uppercase; padding: 2px 8px; letter-spacing: 0.06em; }
|
|
362
362
|
.cpub-status-draft { background: var(--surface3); color: var(--text-faint); border: var(--border-width-default) solid var(--border2); }
|
|
363
|
-
.cpub-status-published { background: var(--green-bg); color: var(--green); border: var(--border-width-default) solid var(--green-border); }
|
|
363
|
+
.cpub-status-published { background: var(--green-bg); color: var(--green-text); border: var(--border-width-default) solid var(--green-border); }
|
|
364
364
|
|
|
365
365
|
.cpub-meta-section { background: var(--surface); border: var(--border-width-default) solid var(--border); padding: 16px 20px; margin-bottom: 24px; box-shadow: var(--shadow-md); }
|
|
366
366
|
.cpub-meta-section-title { font-size: 13px; font-weight: 700; margin-bottom: 12px; }
|
|
@@ -387,7 +387,7 @@ async function handlePublish(): Promise<void> {
|
|
|
387
387
|
.cpub-lesson-grip { color: var(--text-faint); font-size: 10px; cursor: grab; }
|
|
388
388
|
.cpub-lesson-type-badge { font-size: 9px; font-family: var(--font-mono); text-transform: uppercase; padding: 1px 6px; border: var(--border-width-default) solid var(--border2); color: var(--text-faint); background: var(--surface2); }
|
|
389
389
|
.cpub-lesson-title { font-size: 13px; color: var(--text); flex: 1; }
|
|
390
|
-
.cpub-lesson-empty-badge { font-size: 9px; font-family: var(--font-mono); color: var(--yellow); background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow-border); padding: 1px 6px; text-transform: uppercase; }
|
|
390
|
+
.cpub-lesson-empty-badge { font-size: 9px; font-family: var(--font-mono); color: var(--yellow-text); background: var(--yellow-bg); border: var(--border-width-default) solid var(--yellow-border); padding: 1px 6px; text-transform: uppercase; }
|
|
391
391
|
.cpub-lesson-edit-btn { font-size: 10px; color: var(--text-faint); padding: 3px 6px; border: var(--border-width-default) solid var(--border2); text-decoration: none; }
|
|
392
392
|
.cpub-lesson-edit-btn:hover { color: var(--accent); border-color: var(--accent); }
|
|
393
393
|
|
|
@@ -402,7 +402,7 @@ async function handlePublish(): Promise<void> {
|
|
|
402
402
|
.cpub-link-btn { padding: 6px 10px; background: var(--surface2); color: var(--text-dim); border: var(--border-width-default) solid var(--border); font-size: 10px; font-family: var(--font-mono); cursor: pointer; display: flex; align-items: center; gap: 5px; margin-left: 4px; }
|
|
403
403
|
.cpub-link-btn:hover { border-color: var(--accent); color: var(--accent); }
|
|
404
404
|
.cpub-link-btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
405
|
-
.cpub-lesson-linked-badge { font-size: 9px; color: var(--teal); display: flex; align-items: center; flex-shrink: 0; }
|
|
405
|
+
.cpub-lesson-linked-badge { font-size: 9px; color: var(--teal-text); display: flex; align-items: center; flex-shrink: 0; }
|
|
406
406
|
|
|
407
407
|
.cpub-empty-modules { text-align: center; padding: 32px; color: var(--text-faint); font-size: 13px; }
|
|
408
408
|
|
|
@@ -265,9 +265,9 @@ function getDifficultyClass(d: string | null): string {
|
|
|
265
265
|
.cpub-path-header-row { display: flex; gap: 16px; }
|
|
266
266
|
.cpub-path-header-info { flex: 1; }
|
|
267
267
|
.cpub-path-difficulty { font-family: var(--font-mono); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; padding: 2px 8px; border: var(--border-width-default) solid; display: inline-block; margin-bottom: 8px; }
|
|
268
|
-
.diff-beginner { color: var(--green); border-color: var(--green-border); background: var(--green-bg); }
|
|
269
|
-
.diff-intermediate { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
|
|
270
|
-
.diff-advanced { color: var(--red); border-color: var(--red-border); background: var(--red-bg); }
|
|
268
|
+
.diff-beginner { color: var(--green-text); border-color: var(--green-border); background: var(--green-bg); }
|
|
269
|
+
.diff-intermediate { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
|
|
270
|
+
.diff-advanced { color: var(--red-text); border-color: var(--red-border); background: var(--red-bg); }
|
|
271
271
|
.cpub-path-draft { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; padding: 2px 8px; background: var(--surface3); color: var(--text-faint); border: var(--border-width-default) solid var(--border2); display: inline-block; margin-left: 8px; margin-bottom: 8px; }
|
|
272
272
|
.cpub-path-title { font-size: 26px; font-weight: 700; margin-bottom: 8px; line-height: 1.2; letter-spacing: -0.02em; }
|
|
273
273
|
.cpub-path-desc { font-size: 14px; color: var(--text-dim); line-height: 1.6; margin-bottom: 12px; }
|
|
@@ -280,7 +280,7 @@ function getDifficultyClass(d: string | null): string {
|
|
|
280
280
|
.cpub-continue-btn { padding: 10px 22px; background: var(--green); color: var(--color-text-inverse); border: var(--border-width-default) solid var(--border); font-size: 13px; font-weight: 600; text-decoration: none; box-shadow: var(--shadow-md); display: inline-flex; align-items: center; gap: 6px; }
|
|
281
281
|
.cpub-continue-btn:hover { box-shadow: var(--shadow-sm); transform: translate(1px, 1px); }
|
|
282
282
|
.cpub-unenroll-btn { padding: 6px 14px; background: var(--surface); border: var(--border-width-default) solid var(--border); color: var(--text-dim); font-size: 12px; cursor: pointer; }
|
|
283
|
-
.cpub-unenroll-btn:hover { color: var(--red); border-color: var(--red); }
|
|
283
|
+
.cpub-unenroll-btn:hover { color: var(--red-text); border-color: var(--red); }
|
|
284
284
|
.cpub-edit-link { padding: 6px 14px; border: var(--border-width-default) solid var(--border2); font-size: 12px; color: var(--text-dim); text-decoration: none; display: inline-flex; align-items: center; gap: 6px; }
|
|
285
285
|
.cpub-edit-link:hover { color: var(--accent); border-color: var(--accent); }
|
|
286
286
|
|
package/pages/learn/index.vue
CHANGED
|
@@ -270,7 +270,7 @@ const activeDifficultyFilter = ref('');
|
|
|
270
270
|
.cpub-path-meta-item { font-size: 11px; font-family: var(--font-mono); color: var(--text-faint); display: flex; align-items: center; gap: 5px; }
|
|
271
271
|
.cpub-path-courses-preview { display: flex; gap: 6px; margin-top: 12px; padding-top: 12px; border-top: var(--border-width-default) solid var(--border2); overflow-x: auto; }
|
|
272
272
|
.cpub-path-course-pill { font-size: 10px; font-family: var(--font-mono); padding: 3px 10px; border-radius: 0; border: var(--border-width-default) solid var(--border); background: var(--surface2); color: var(--text-dim); white-space: nowrap; display: inline-flex; align-items: center; gap: 4px; }
|
|
273
|
-
.cpub-pill-done { border-color: var(--green-border); color: var(--green); background: var(--green-bg); }
|
|
273
|
+
.cpub-pill-done { border-color: var(--green-border); color: var(--green-text); background: var(--green-bg); }
|
|
274
274
|
.cpub-path-aside { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; flex-shrink: 0; }
|
|
275
275
|
.cpub-path-aside-meta { font-size: 11px; font-family: var(--font-mono); color: var(--text-faint); }
|
|
276
276
|
|
|
@@ -281,16 +281,16 @@ const activeDifficultyFilter = ref('');
|
|
|
281
281
|
.cpub-course-cover { height: 120px; position: relative; display: flex; align-items: center; justify-content: center; overflow: hidden; background: var(--surface3); border-bottom: var(--border-width-default) solid var(--border); }
|
|
282
282
|
.cpub-course-cover-icon { font-size: 28px; position: relative; z-index: 1; color: var(--text-dim); }
|
|
283
283
|
.cpub-course-cover-price { position: absolute; top: 10px; right: 10px; z-index: 2; font-size: 11px; font-family: var(--font-mono); padding: 3px 8px; border-radius: 0; background: var(--surface); border: var(--border-width-default) solid var(--border); }
|
|
284
|
-
.cpub-price-free { color: var(--green); border-color: var(--green); }
|
|
284
|
+
.cpub-price-free { color: var(--green-text); border-color: var(--green); }
|
|
285
285
|
.cpub-price-paid { color: var(--text); }
|
|
286
286
|
.cpub-course-body { padding: 14px; flex: 1; display: flex; flex-direction: column; }
|
|
287
287
|
.cpub-course-title { font-size: 13px; font-weight: 600; margin-bottom: 6px; line-height: 1.35; }
|
|
288
288
|
.cpub-course-instructor { font-size: 11px; color: var(--text-dim); margin-bottom: 8px; display: flex; align-items: center; gap: 6px; }
|
|
289
289
|
.cpub-instructor-dot { width: 16px; height: 16px; border-radius: 50%; background: var(--surface3); border: var(--border-width-default) solid var(--border); font-size: 8px; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); color: var(--text-faint); flex-shrink: 0; }
|
|
290
290
|
.cpub-course-stars { display: flex; align-items: center; gap: 3px; margin-bottom: 8px; }
|
|
291
|
-
.cpub-star { color: var(--yellow); font-size: 10px; }
|
|
291
|
+
.cpub-star { color: var(--yellow-text); font-size: 10px; }
|
|
292
292
|
.cpub-star-empty { color: var(--border2); }
|
|
293
|
-
.cpub-star-score { font-size: 11px; font-family: var(--font-mono); color: var(--yellow); margin-left: 2px; }
|
|
293
|
+
.cpub-star-score { font-size: 11px; font-family: var(--font-mono); color: var(--yellow-text); margin-left: 2px; }
|
|
294
294
|
.cpub-star-count { font-size: 10px; color: var(--text-faint); font-family: var(--font-mono); margin-left: 2px; }
|
|
295
295
|
.cpub-course-meta-row { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
|
|
296
296
|
.cpub-course-meta-item { font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); display: flex; align-items: center; gap: 4px; }
|
|
@@ -345,7 +345,7 @@ const activeDifficultyFilter = ref('');
|
|
|
345
345
|
.cpub-sb-tag:hover { border-color: var(--border); color: var(--text-dim); background: var(--surface3); }
|
|
346
346
|
.cpub-cert-grid { display: flex; flex-direction: column; gap: 8px; }
|
|
347
347
|
.cpub-cert-item { background: var(--surface2); border: var(--border-width-default) solid var(--border); border-radius: var(--radius); padding: 10px 12px; display: flex; align-items: center; gap: 10px; box-shadow: var(--shadow-sm); }
|
|
348
|
-
.cpub-cert-badge { width: 32px; height: 32px; border-radius: 50%; border: var(--border-width-default) solid var(--yellow); background: var(--yellow-bg); display: flex; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; color: var(--yellow); }
|
|
348
|
+
.cpub-cert-badge { width: 32px; height: 32px; border-radius: 50%; border: var(--border-width-default) solid var(--yellow); background: var(--yellow-bg); display: flex; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; color: var(--yellow-text); }
|
|
349
349
|
.cpub-cert-info { flex: 1; }
|
|
350
350
|
.cpub-cert-name { font-size: 11px; font-weight: 600; color: var(--text); margin-bottom: 2px; }
|
|
351
351
|
.cpub-cert-date { font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); }
|
|
@@ -357,7 +357,7 @@ const activeDifficultyFilter = ref('');
|
|
|
357
357
|
.cpub-my-path-title { font-size: 13px; font-weight: 600; color: var(--text); text-decoration: none; }
|
|
358
358
|
.cpub-my-path-title:hover { color: var(--accent); }
|
|
359
359
|
.cpub-my-path-status { font-size: 10px; font-family: var(--font-mono); padding: 2px 8px; border: var(--border-width-default) solid var(--border); color: var(--text-dim); }
|
|
360
|
-
.cpub-my-path-status.draft { color: var(--yellow); border-color: var(--yellow-border); background: var(--yellow-bg); }
|
|
360
|
+
.cpub-my-path-status.draft { color: var(--yellow-text); border-color: var(--yellow-border); background: var(--yellow-bg); }
|
|
361
361
|
.cpub-my-path-meta { display: flex; gap: 12px; font-size: 11px; font-family: var(--font-mono); color: var(--text-faint); }
|
|
362
362
|
|
|
363
363
|
/* EMPTY STATE (page-specific) */
|
package/pages/messages/index.vue
CHANGED
|
@@ -427,7 +427,7 @@ async function startConversation(): Promise<void> {
|
|
|
427
427
|
.cpub-new-msg-error {
|
|
428
428
|
padding: 8px 10px;
|
|
429
429
|
background: var(--red-bg);
|
|
430
|
-
color: var(--red);
|
|
430
|
+
color: var(--red-text);
|
|
431
431
|
border: var(--border-width-default) solid var(--red);
|
|
432
432
|
font-size: 12px;
|
|
433
433
|
border-radius: var(--radius);
|
|
@@ -463,7 +463,7 @@ async function startConversation(): Promise<void> {
|
|
|
463
463
|
}
|
|
464
464
|
|
|
465
465
|
.cpub-new-msg-chip-remove:hover {
|
|
466
|
-
color: var(--red);
|
|
466
|
+
color: var(--red-text);
|
|
467
467
|
}
|
|
468
468
|
|
|
469
469
|
.cpub-new-msg-hint {
|
package/pages/mirror/[id].vue
CHANGED
|
@@ -152,7 +152,7 @@ useSeoMeta({
|
|
|
152
152
|
}
|
|
153
153
|
.cpub-fed-banner-follow:hover { opacity: 0.9; }
|
|
154
154
|
.cpub-fed-banner-follow:disabled { opacity: 0.6; cursor: default; }
|
|
155
|
-
.cpub-fed-banner-followed { margin-left: auto; font-size: 11px; color: var(--green, #22c55e); font-weight: 600; display: flex; align-items: center; gap: 4px; }
|
|
155
|
+
.cpub-fed-banner-followed { margin-left: auto; font-size: 11px; color: var(--green-text, #22c55e); font-weight: 600; display: flex; align-items: center; gap: 4px; }
|
|
156
156
|
.cpub-fed-banner-link:hover { text-decoration: underline; }
|
|
157
157
|
|
|
158
158
|
/* Fallback for non-CommonPub content */
|
|
@@ -149,7 +149,7 @@ useSeoMeta({
|
|
|
149
149
|
.product-header { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; }
|
|
150
150
|
.product-header-main { flex: 1; min-width: 0; }
|
|
151
151
|
.product-header-actions { display: flex; gap: 8px; flex-shrink: 0; }
|
|
152
|
-
.cpub-product-delete:hover { color: var(--red); border-color: var(--red); }
|
|
152
|
+
.cpub-product-delete:hover { color: var(--red-text); border-color: var(--red); }
|
|
153
153
|
.product-icon { width: 56px; height: 56px; border: var(--border-width-default) solid var(--border); background: var(--accent-bg); display: flex; align-items: center; justify-content: center; font-size: 24px; color: var(--accent); }
|
|
154
154
|
.product-name { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }
|
|
155
155
|
.product-category { font-size: 11px; font-family: var(--font-mono); color: var(--text-faint); text-transform: capitalize; }
|
|
@@ -145,7 +145,7 @@ async function handleDeleteAccount(): Promise<void> {
|
|
|
145
145
|
.cpub-danger-title {
|
|
146
146
|
font-size: 14px;
|
|
147
147
|
font-weight: 600;
|
|
148
|
-
color: var(--red);
|
|
148
|
+
color: var(--red-text);
|
|
149
149
|
margin-bottom: var(--space-2);
|
|
150
150
|
}
|
|
151
151
|
|
|
@@ -163,7 +163,7 @@ async function handleDeleteAccount(): Promise<void> {
|
|
|
163
163
|
|
|
164
164
|
.cpub-btn-danger {
|
|
165
165
|
background: var(--red-bg);
|
|
166
|
-
color: var(--red);
|
|
166
|
+
color: var(--red-text);
|
|
167
167
|
border-color: var(--red);
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -697,8 +697,8 @@ async function handleUrlImport(result: ImportedContent): Promise<void> {
|
|
|
697
697
|
flex-shrink: 0;
|
|
698
698
|
}
|
|
699
699
|
|
|
700
|
-
.cpub-autosave-status--saved { color: var(--green); }
|
|
701
|
-
.cpub-autosave-status--error { color: var(--red); }
|
|
700
|
+
.cpub-autosave-status--saved { color: var(--green-text); }
|
|
701
|
+
.cpub-autosave-status--error { color: var(--red-text); }
|
|
702
702
|
|
|
703
703
|
.cpub-topbar-undo-redo {
|
|
704
704
|
display: flex;
|
|
@@ -785,13 +785,13 @@ async function handleUrlImport(result: ImportedContent): Promise<void> {
|
|
|
785
785
|
box-shadow: var(--shadow-md);
|
|
786
786
|
}
|
|
787
787
|
.cpub-topbar-btn-primary:hover { box-shadow: var(--shadow-sm); }
|
|
788
|
-
.cpub-topbar-btn-import { border-color: var(--teal); color: var(--teal); }
|
|
788
|
+
.cpub-topbar-btn-import { border-color: var(--teal); color: var(--teal-text); }
|
|
789
789
|
.cpub-topbar-btn-import:hover { background: var(--teal-bg, var(--surface2)); }
|
|
790
790
|
|
|
791
791
|
.cpub-editor-error {
|
|
792
792
|
padding: 10px 16px;
|
|
793
793
|
background: var(--red-bg);
|
|
794
|
-
color: var(--red);
|
|
794
|
+
color: var(--red-text);
|
|
795
795
|
border-bottom: var(--border-width-default) solid var(--red);
|
|
796
796
|
font-size: 12px;
|
|
797
797
|
font-family: var(--font-mono);
|
|
@@ -344,7 +344,7 @@ async function handleReport(): Promise<void> {
|
|
|
344
344
|
<!-- Certificates -->
|
|
345
345
|
<template v-if="learningData?.certificates?.length">
|
|
346
346
|
<div class="cpub-sec-head">
|
|
347
|
-
<h2><i class="fa-solid fa-medal" style="color: var(--yellow); margin-right: 6px"></i>Certificates</h2>
|
|
347
|
+
<h2><i class="fa-solid fa-medal" style="color: var(--yellow-text); margin-right: 6px"></i>Certificates</h2>
|
|
348
348
|
</div>
|
|
349
349
|
<div class="cpub-cert-list">
|
|
350
350
|
<NuxtLink
|
|
@@ -411,7 +411,7 @@ async function handleReport(): Promise<void> {
|
|
|
411
411
|
<!-- Info -->
|
|
412
412
|
<div style="margin-bottom: 32px">
|
|
413
413
|
<div class="cpub-sec-head">
|
|
414
|
-
<h2><i class="fa-solid fa-circle-info" style="color: var(--teal); margin-right: 6px"></i>Details</h2>
|
|
414
|
+
<h2><i class="fa-solid fa-circle-info" style="color: var(--teal-text); margin-right: 6px"></i>Details</h2>
|
|
415
415
|
</div>
|
|
416
416
|
<div class="cpub-about-details">
|
|
417
417
|
<div v-if="p.location" class="cpub-about-detail"><i class="fa-solid fa-location-dot"></i> {{ p.location }}</div>
|
|
@@ -424,7 +424,7 @@ async function handleReport(): Promise<void> {
|
|
|
424
424
|
<!-- Skills -->
|
|
425
425
|
<div class="cpub-skills-section">
|
|
426
426
|
<div class="cpub-sec-head">
|
|
427
|
-
<h2><i class="fa-solid fa-microchip" style="color: var(--teal); margin-right: 6px"></i>Skills</h2>
|
|
427
|
+
<h2><i class="fa-solid fa-microchip" style="color: var(--teal-text); margin-right: 6px"></i>Skills</h2>
|
|
428
428
|
</div>
|
|
429
429
|
<div v-if="p.skills?.length" class="cpub-tag-row" style="flex-wrap: wrap; gap: 6px;">
|
|
430
430
|
<span v-for="skill in p.skills" :key="skill" class="cpub-tag">{{ skill }}</span>
|
|
@@ -437,7 +437,7 @@ async function handleReport(): Promise<void> {
|
|
|
437
437
|
<!-- Experience -->
|
|
438
438
|
<div v-if="p.experience?.length" class="cpub-experience-section">
|
|
439
439
|
<div class="cpub-sec-head">
|
|
440
|
-
<h2><i class="fa-solid fa-briefcase" style="color: var(--purple); margin-right: 6px"></i>Experience</h2>
|
|
440
|
+
<h2><i class="fa-solid fa-briefcase" style="color: var(--purple-text); margin-right: 6px"></i>Experience</h2>
|
|
441
441
|
</div>
|
|
442
442
|
<div class="cpub-experience-list">
|
|
443
443
|
<div v-for="(exp, idx) in p.experience" :key="idx" class="cpub-experience-item">
|
|
@@ -845,7 +845,7 @@ async function handleReport(): Promise<void> {
|
|
|
845
845
|
.cpub-cert-list { display: flex; flex-direction: column; gap: 8px; }
|
|
846
846
|
.cpub-cert-card-profile { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border: var(--border-width-default) solid var(--border); background: var(--surface); text-decoration: none; color: var(--text); box-shadow: var(--shadow-md); transition: box-shadow 0.15s, transform 0.15s; }
|
|
847
847
|
.cpub-cert-card-profile:hover { box-shadow: var(--shadow-sm); transform: translate(1px, 1px); }
|
|
848
|
-
.cpub-cert-card-badge { width: 40px; height: 40px; border-radius: 50%; border: var(--border-width-default) solid var(--yellow); background: var(--yellow-bg); display: flex; align-items: center; justify-content: center; font-size: 18px; color: var(--yellow); flex-shrink: 0; }
|
|
848
|
+
.cpub-cert-card-badge { width: 40px; height: 40px; border-radius: 50%; border: var(--border-width-default) solid var(--yellow); background: var(--yellow-bg); display: flex; align-items: center; justify-content: center; font-size: 18px; color: var(--yellow-text); flex-shrink: 0; }
|
|
849
849
|
.cpub-cert-card-info { flex: 1; }
|
|
850
850
|
.cpub-cert-card-path { font-size: 14px; font-weight: 600; margin-bottom: 2px; }
|
|
851
851
|
.cpub-cert-card-date { font-size: 11px; font-family: var(--font-mono); color: var(--text-faint); }
|
package/pages/videos/index.vue
CHANGED
|
@@ -289,10 +289,10 @@ function formatDate(dateStr: string): string {
|
|
|
289
289
|
.cpub-live-item-top { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 6px; }
|
|
290
290
|
.cpub-live-thumb { width: 56px; height: 38px; border-radius: var(--radius); border: var(--border-width-default) solid var(--border); background: var(--red-bg); display: flex; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; position: relative; overflow: hidden; }
|
|
291
291
|
.cpub-live-thumb-bg { position: absolute; inset: 0; background: var(--red-bg); }
|
|
292
|
-
.cpub-live-thumb-icon { position: relative; z-index: 1; color: var(--red); }
|
|
292
|
+
.cpub-live-thumb-icon { position: relative; z-index: 1; color: var(--red-text); }
|
|
293
293
|
.cpub-live-title { font-size: 12px; font-weight: 600; line-height: 1.3; transition: color .1s; }
|
|
294
294
|
.cpub-live-meta { display: flex; align-items: center; gap: 8px; font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); }
|
|
295
|
-
.cpub-live-viewers { display: flex; align-items: center; gap: 4px; color: var(--red); }
|
|
295
|
+
.cpub-live-viewers { display: flex; align-items: center; gap: 4px; color: var(--red-text); }
|
|
296
296
|
.cpub-live-viewers::before { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--red); animation: cpub-livepulse 1.5s infinite; }
|
|
297
297
|
|
|
298
298
|
/* PLAYLISTS */
|
|
@@ -318,7 +318,7 @@ function formatDate(dateStr: string): string {
|
|
|
318
318
|
.cpub-creator-subs { font-size: 10px; font-family: var(--font-mono); color: var(--text-faint); }
|
|
319
319
|
.cpub-creator-sub-btn { font-size: 10px; font-family: var(--font-mono); padding: 5px 12px; border-radius: var(--radius); border: var(--border-width-default) solid var(--border); background: var(--surface); color: var(--text-dim); cursor: pointer; white-space: nowrap; }
|
|
320
320
|
.cpub-creator-sub-btn:hover { background: var(--surface2); }
|
|
321
|
-
.cpub-subbed { border-color: var(--green); color: var(--green); background: var(--green-bg); }
|
|
321
|
+
.cpub-subbed { border-color: var(--green); color: var(--green-text); background: var(--green-bg); }
|
|
322
322
|
|
|
323
323
|
/* PAGINATION (page-specific) */
|
|
324
324
|
.cpub-page-info { font-size: 11px; font-family: var(--font-mono); color: var(--text-dim); }
|
package/theme/base.css
CHANGED
|
@@ -116,6 +116,27 @@
|
|
|
116
116
|
the readable fallback. */
|
|
117
117
|
--code-inline: var(--text);
|
|
118
118
|
|
|
119
|
+
/* === READABLE SEMANTIC TEXT COLORS ===
|
|
120
|
+
The raw vivid semantics (--green/--yellow/--red/--teal/--purple/--pink/--accent)
|
|
121
|
+
fail WCAG AA as small TEXT on light surfaces (≈2-4:1 — e.g. --yellow ≈2.2:1,
|
|
122
|
+
--green ≈2.3:1 on white). These -text variants mix the vivid toward --text so
|
|
123
|
+
they read ≥4.5:1 on light AND dark (the mix targets the theme's own --text, so
|
|
124
|
+
a single definition adapts per theme — deveco's green, dark mode's light text).
|
|
125
|
+
Use these for any vivid color applied as TEXT; keep the raw --vivid for fills,
|
|
126
|
+
borders, and icons over the dark badge overlay. The @supports block (after
|
|
127
|
+
:root) upgrades them to color-mix; the raw vivid is the no-color-mix fallback
|
|
128
|
+
(<5% of browsers) = today's behavior, so there is never a regression.
|
|
129
|
+
Per-color mix % is tuned to clear 4.5:1 on the lightest surface (white). */
|
|
130
|
+
--green-text: var(--green);
|
|
131
|
+
--yellow-text: var(--yellow);
|
|
132
|
+
--red-text: var(--red);
|
|
133
|
+
--teal-text: var(--teal);
|
|
134
|
+
--purple-text: var(--purple);
|
|
135
|
+
--pink-text: var(--pink);
|
|
136
|
+
/* Distinct from --color-accent-text (= white, for text ON an accent fill).
|
|
137
|
+
--accent-text is the accent usable AS text on a light surface. */
|
|
138
|
+
--accent-text: var(--accent);
|
|
139
|
+
|
|
119
140
|
/* Code block tokens (GitHub Dark defaults — overridable by themes) */
|
|
120
141
|
--code-bg: #0d1117;
|
|
121
142
|
--code-text: #e6edf3;
|
|
@@ -321,6 +342,16 @@
|
|
|
321
342
|
@supports (color: color-mix(in srgb, red, white)) {
|
|
322
343
|
:root {
|
|
323
344
|
--code-inline: color-mix(in srgb, var(--teal), var(--text) 50%);
|
|
345
|
+
/* Mix % tuned per color so each clears ≥4.5:1 on white/--surface2/own *-bg
|
|
346
|
+
(verified empirically). Mixing toward --text only lightens vivids on dark
|
|
347
|
+
themes, so the same values pass there too (6.9-10.8:1). */
|
|
348
|
+
--green-text: color-mix(in srgb, var(--green), var(--text) 50%);
|
|
349
|
+
--yellow-text: color-mix(in srgb, var(--yellow), var(--text) 50%);
|
|
350
|
+
--red-text: color-mix(in srgb, var(--red), var(--text) 25%);
|
|
351
|
+
--teal-text: color-mix(in srgb, var(--teal), var(--text) 45%);
|
|
352
|
+
--purple-text: color-mix(in srgb, var(--purple), var(--text) 20%);
|
|
353
|
+
--pink-text: color-mix(in srgb, var(--pink), var(--text) 30%);
|
|
354
|
+
--accent-text: color-mix(in srgb, var(--accent), var(--text) 40%);
|
|
324
355
|
}
|
|
325
356
|
}
|
|
326
357
|
|