redesign the homepage
Build & Deploy / Build & Push Docker Image (push) Failing after 47s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m4s
Test / Marketplace Unit Tests (push) Failing after 4m55s
Test / Admin Unit Tests (push) Successful in 9m37s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s

This commit is contained in:
root
2026-06-26 16:27:21 -04:00
parent 256ff0814e
commit d7fb7b7a7b
1030 changed files with 107374 additions and 2657 deletions
@@ -0,0 +1,127 @@
/*
* Phase 11 component-facing token layer.
* Raw palette values remain in the immutable Phase 9 token source. Components consume only
* the semantic aliases below. Added roles are documented in docs/TOKEN_IMPLEMENTATION_v1.0.md.
*/
:root {
--surface-page: var(--color-canvas);
--surface-primary: var(--color-surface);
--surface-elevated: var(--color-surface-raised);
--surface-muted: var(--color-surface-muted);
--surface-strong: var(--color-surface-strong);
--text-primary: var(--color-text);
--text-secondary: var(--color-text-muted);
--text-subdued: var(--color-gray-500);
--text-inverse: var(--color-on-inverse);
--border-standard: var(--color-border);
--border-strong: var(--color-border-strong);
--interactive-primary: var(--color-action-primary);
--interactive-primary-hover: var(--color-action-primary-hover);
--interactive-conversion: var(--color-action-conversion);
--interactive-conversion-hover: var(--color-action-conversion-hover);
--interactive-danger: var(--color-red-700);
--link-default: var(--color-action-primary);
--link-hover: var(--color-action-primary-hover);
--focus-ring: var(--color-focus);
--status-success-surface: var(--color-green-100);
--status-success-text: var(--color-green-700);
--status-warning-surface: var(--color-amber-100);
--status-warning-text: var(--color-amber-800);
--status-error-surface: var(--color-red-100);
--status-error-text: var(--color-red-700);
--status-info-surface: var(--color-soft-blue);
--status-info-text: var(--color-blue-800);
--overlay-scrim: color-mix(in srgb, var(--color-navy-950) 72%, transparent);
--control-disabled-surface: var(--color-gray-100);
--control-disabled-text: var(--color-gray-600);
--selection-surface: var(--color-blue-200);
--selection-text: var(--color-gray-900);
--skeleton-base: var(--color-surface-strong);
--skeleton-highlight: var(--color-surface-raised);
--shadow-subtle: 0 1px 2px var(--shadow-color);
--shadow-card: 0 20px 60px var(--shadow-color);
--shadow-overlay: 0 28px 80px var(--shadow-color);
--container-wide: var(--size-container-max);
--container-content: 960px;
--container-reading: 720px;
--layout-gutter: clamp(var(--space-4), 4vw, var(--space-10));
--section-space: clamp(var(--space-12), 8vw, var(--space-24));
--header-min-block-size: 76px;
--header-offset: 92px;
--layer-base: 0;
--layer-sticky: 100;
--layer-overlay: 500;
--layer-skip-link: 1000;
--opacity-disabled: 0.62;
--type-display-size: clamp(2.25rem, 6vw, 4.75rem);
--type-heading-1-size: clamp(2rem, 5vw, 4rem);
--type-heading-2-size: clamp(1.75rem, 3vw, 2.75rem);
--type-heading-3-size: clamp(1.25rem, 2vw, 1.75rem);
--type-body-large-size: clamp(1.0625rem, 1.5vw, 1.25rem);
--type-body-size: 1rem;
--type-label-size: 0.875rem;
--type-caption-size: 0.8125rem;
--line-display: 1.05;
--line-heading: 1.18;
--line-body: 1.65;
--line-arabic-body: 1.85;
--tracking-display: -0.035em;
--tracking-label: 0.04em;
}
html[data-theme='dark'] {
--text-subdued: var(--color-gray-300);
--status-success-surface: color-mix(in srgb, var(--color-green-700) 24%, var(--color-navy-900));
--status-success-text: var(--color-green-100);
--status-warning-surface: color-mix(in srgb, var(--color-amber-800) 30%, var(--color-navy-900));
--status-warning-text: var(--color-amber-100);
--status-error-surface: color-mix(in srgb, var(--color-red-700) 28%, var(--color-navy-900));
--status-error-text: var(--color-red-100);
--status-info-text: var(--color-blue-100);
--control-disabled-surface: var(--color-navy-800);
--control-disabled-text: var(--color-gray-300);
--selection-surface: var(--color-blue-800);
--selection-text: var(--color-gray-25);
}
/* CSS-only fallback for system theme when JavaScript is unavailable or delayed. */
@media (prefers-color-scheme: dark) {
html[data-theme-preference='system'] {
--surface-page: var(--color-navy-950);
--surface-primary: var(--color-navy-900);
--surface-elevated: var(--color-navy-850);
--surface-muted: var(--color-navy-900);
--surface-strong: var(--color-navy-800);
--text-primary: var(--color-blue-50);
--text-secondary: var(--color-gray-300);
--text-subdued: var(--color-gray-300);
--text-inverse: var(--color-navy-950);
--border-standard: var(--color-navy-800);
--border-strong: var(--color-gray-600);
--interactive-primary: var(--color-blue-200);
--interactive-primary-hover: var(--color-blue-100);
--interactive-conversion: var(--color-orange-400);
--interactive-conversion-hover: var(--color-orange-100);
--link-default: var(--color-blue-200);
--link-hover: var(--color-blue-100);
--focus-ring: var(--color-orange-400);
--status-success-surface: color-mix(in srgb, var(--color-green-700) 24%, var(--color-navy-900));
--status-success-text: var(--color-green-100);
--status-warning-surface: color-mix(in srgb, var(--color-amber-800) 30%, var(--color-navy-900));
--status-warning-text: var(--color-amber-100);
--status-error-surface: color-mix(in srgb, var(--color-red-700) 28%, var(--color-navy-900));
--status-error-text: var(--color-red-100);
--status-info-surface: var(--color-navy-800);
--status-info-text: var(--color-blue-100);
--control-disabled-surface: var(--color-navy-800);
--control-disabled-text: var(--color-gray-300);
--selection-surface: var(--color-blue-800);
--selection-text: var(--color-gray-25);
--skeleton-base: var(--color-navy-800);
--skeleton-highlight: var(--color-navy-850);
--shadow-subtle: 0 1px 2px color-mix(in srgb, var(--color-navy-950) 70%, transparent);
--shadow-card: 0 20px 60px color-mix(in srgb, var(--color-navy-950) 70%, transparent);
--shadow-overlay: 0 28px 80px color-mix(in srgb, var(--color-navy-950) 78%, transparent);
color-scheme: dark;
}
}
+156
View File
@@ -0,0 +1,156 @@
* {
box-sizing: border-box;
}
html {
min-inline-size: 320px;
background: var(--surface-page);
color: var(--text-primary);
color-scheme: light;
scroll-behavior: smooth;
scroll-padding-block-start: var(--header-offset);
text-rendering: optimizeLegibility;
}
html[data-theme='dark'] {
color-scheme: dark;
}
body {
min-block-size: 100dvh;
margin: 0;
overflow-wrap: anywhere;
background: var(--surface-page);
color: var(--text-primary);
font-family: var(--font-latin);
font-size: var(--type-body-size);
line-height: var(--line-body);
}
body[data-navigation-open='true'] {
overflow: hidden;
}
html[lang='ar'] body {
font-family: var(--font-arabic);
line-height: var(--line-arabic-body);
}
button,
input,
select,
textarea {
font: inherit;
}
button,
select,
a {
-webkit-tap-highlight-color: transparent;
}
img,
picture,
svg,
video {
display: block;
max-inline-size: 100%;
}
h1,
h2,
h3,
p {
margin-block-start: 0;
}
h1,
h2,
h3 {
line-height: var(--line-heading);
text-wrap: balance;
}
p {
text-wrap: pretty;
}
a {
color: var(--link-default);
text-underline-offset: 0.18em;
}
a:hover {
color: var(--link-hover);
}
::selection {
background: var(--selection-surface);
color: var(--selection-text);
}
:focus-visible {
outline: 3px solid var(--focus-ring);
outline-offset: 3px;
}
:target {
scroll-margin-block-start: var(--header-offset);
}
.skip-link {
position: fixed;
z-index: var(--layer-skip-link);
inset-block-start: var(--space-2);
inset-inline-start: var(--space-2);
padding-block: var(--space-3);
padding-inline: var(--space-4);
border-radius: var(--radius-sm);
background: var(--interactive-primary);
color: var(--text-inverse);
font-weight: 700;
text-decoration: none;
transform: translateY(-160%);
transition: transform var(--duration-fast) var(--easing-productive);
}
.skip-link:focus {
transform: translateY(0);
}
.visually-hidden {
position: absolute;
inline-size: 1px;
block-size: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
border: 0;
clip-path: inset(50%);
white-space: nowrap;
}
[aria-disabled='true'] {
cursor: not-allowed;
}
bdi,
[data-bidi-isolate='true'] {
unicode-bidi: isolate;
}
@media (forced-colors: active) {
:focus-visible {
outline: 3px solid CanvasText;
}
.skip-link {
border: 1px solid CanvasText;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
+130
View File
@@ -0,0 +1,130 @@
:root {
--color-blue-50: #eff6ff;
--color-blue-100: #dbeafe;
--color-blue-200: #bfdbfe;
--color-blue-500: #2874e8;
--color-blue-600: #1b5dd8;
--color-blue-700: #174bb5;
--color-blue-800: #183d88;
--color-orange-100: #ffedd5;
--color-orange-400: #fb923c;
--color-orange-600: #ea580c;
--color-orange-700: #c2410c;
--color-navy-950: #081426;
--color-navy-900: #0d1b2e;
--color-navy-850: #11233b;
--color-navy-800: #162b46;
--color-gray-25: #fbfdff;
--color-gray-50: #f7f9fc;
--color-gray-100: #eef2f7;
--color-gray-200: #dbe3ed;
--color-gray-300: #c6d0dc;
--color-gray-500: #64748b;
--color-gray-600: #475569;
--color-gray-700: #334155;
--color-gray-800: #1e293b;
--color-gray-900: #0f172a;
--color-green-100: #dcfce7;
--color-green-700: #15803d;
--color-amber-100: #fef3c7;
--color-amber-800: #92400e;
--color-red-100: #fee2e2;
--color-red-700: #b91c1c;
--space-0: 0px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-7: 28px;
--space-8: 32px;
--space-9: 36px;
--space-10: 40px;
--space-11: 44px;
--space-12: 48px;
--space-13: 52px;
--space-14: 56px;
--space-15: 60px;
--space-16: 64px;
--space-17: 68px;
--space-18: 72px;
--space-19: 76px;
--space-20: 80px;
--space-21: 84px;
--space-22: 88px;
--space-23: 92px;
--space-24: 96px;
--radius-sm: 10px;
--radius-md: 16px;
--radius-lg: 24px;
--radius-xl: 32px;
--radius-pill: 999px;
--size-touch-min: 44px;
--size-container-max: 1280px;
--duration-fast: 120ms;
--duration-standard: 160ms;
--duration-overlay: 220ms;
--easing-standard: ease;
--easing-productive: cubic-bezier(0.2, 0, 0, 1);
--font-latin: Inter Variable, Inter, Arial, sans-serif;
--font-arabic: Noto Sans Arabic, Arial, sans-serif;
--breakpoint-medium: 768px;
--breakpoint-wide: 1120px;
}
html[data-theme='light'] {
--color-canvas: var(--color-gray-25);
--color-surface: #ffffff;
--color-surface-raised: #ffffff;
--color-surface-muted: #f2f6fb;
--color-surface-strong: #e8f0fa;
--color-text: #102035;
--color-text-muted: #52647a;
--color-border: #d8e2ee;
--color-border-strong: #bdcad9;
--color-action-primary: var(--color-blue-700);
--color-action-primary-hover: var(--color-blue-800);
--color-action-conversion: var(--color-orange-700);
--color-action-conversion-hover: #9a3412;
--color-focus: #f97316;
--color-on-inverse: #f8fafc;
--color-soft-blue: #eef5ff;
--color-soft-orange: #fff7ed;
--shadow-color: rgba(8, 20, 38, 0.12);
color-scheme: light;
}
html[data-theme='dark'] {
--color-canvas: var(--color-navy-950);
--color-surface: var(--color-navy-900);
--color-surface-raised: var(--color-navy-850);
--color-surface-muted: #0b1a2d;
--color-surface-strong: #172d48;
--color-text: #eef5ff;
--color-text-muted: #adbed2;
--color-border: #263c56;
--color-border-strong: #3a536e;
--color-action-primary: #76a9ff;
--color-action-primary-hover: #9bc2ff;
--color-action-conversion: var(--color-orange-400);
--color-action-conversion-hover: #fdba74;
--color-focus: var(--color-orange-400);
--color-on-inverse: var(--color-navy-950);
--color-soft-blue: #10284a;
--color-soft-orange: #3a2015;
--shadow-color: rgba(0, 0, 0, 0.36);
color-scheme: dark;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}