Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .vercelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Vercel Ignore File
# Optimize deployment by excluding unnecessary files

# Development files
.git/
.gitignore
.DS_Store
.vscode/
.idea/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Hugo development files
resources/_gen/
.hugo_build.lock
hugo_stats.json

# Node modules (if any)
node_modules/
package-lock.json
yarn.lock

# Build artifacts (will be regenerated)
public/

# Development scripts
dev.sh
verify-urls.sh

# Documentation
readme.md
README.md
*.md

# Temporary files
*.tmp
*.temp
.cache/

# OS generated files
Thumbs.db
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db

# IDE files
*.swp
*.swo
*~
.vscode/
.idea/

# Hugo archetypes (not needed for production)
archetypes/

# Scripts (except build.sh)
scripts/
!build.sh
319 changes: 319 additions & 0 deletions assets/css/base.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,319 @@
/*
* Base Styles - Reset, Typography, Global Elements
* Modern CSS Architecture - Senior Frontend Developer Approach
*/

/* ===== CSS RESET & NORMALIZATION ===== */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}

html {
font-size: 16px;
line-height: 1.5;
-webkit-text-size-adjust: 100%;
scroll-behavior: smooth;
overflow-x: hidden;
}

body {
font-family: var(--font-family-base);
font-size: var(--font-size-base);
line-height: var(--line-height-base);
color: var(--color-text);
background-color: var(--color-background);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
margin: 0;
overflow-x: hidden;
}

/* ===== TYPOGRAPHY SCALE ===== */
h1, h2, h3, h4, h5, h6 {
font-family: var(--font-family-heading);
line-height: var(--line-height-tight);
margin-bottom: var(--space-4);
color: var(--color-text);
font-weight: 700;
}

h1 {
font-size: var(--font-size-5xl);
letter-spacing: -0.02em;
}

h2 {
font-size: var(--font-size-4xl);
letter-spacing: -0.01em;
}

h3 {
font-size: var(--font-size-3xl);
}

h4 {
font-size: var(--font-size-2xl);
}

h5 {
font-size: var(--font-size-xl);
}

h6 {
font-size: var(--font-size-lg);
}

p {
margin-bottom: var(--space-4);
color: var(--color-text);
}

/* ===== LINKS ===== */
a {
color: var(--color-primary);
text-decoration: none;
transition: color var(--transition-fast) ease-in-out;
}

a:hover,
a:focus {
color: var(--color-primary-hover);
text-decoration: underline;
}

a:focus {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}

/* ===== LISTS ===== */
ul, ol {
margin-bottom: var(--space-4);
padding-left: var(--space-6);
}

li {
margin-bottom: var(--space-2);
}

/* ===== IMAGES ===== */
img {
max-width: 100%;
height: auto;
display: block;
}

/* ===== FORM ELEMENTS ===== */
button {
font-family: inherit;
font-size: inherit;
line-height: inherit;
cursor: pointer;
border: none;
background: none;
padding: 0;
}

input, textarea, select {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}

/* ===== SELECTION ===== */
::selection {
background-color: var(--color-primary);
color: var(--color-white);
}

::-moz-selection {
background-color: var(--color-primary);
color: var(--color-white);
}

/* ===== SCROLLBAR STYLING ===== */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}

::-webkit-scrollbar-track {
background: var(--color-surface);
}

::-webkit-scrollbar-thumb {
background: var(--color-border);
border-radius: 4px;
}

::-webkit-scrollbar-thumb:hover {
background: var(--color-text-muted);
}

/* ===== ACCESSIBILITY ===== */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}

/* Enhanced focus management */
.js-focus-visible :focus:not(.focus-visible) {
outline: none;
}

:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
border-radius: var(--radius-sm);
}

/* High contrast mode support */
@media (prefers-contrast: high) {
:root {
--color-border: #000000;
--color-text: #000000;
--color-background: #ffffff;
}

[data-theme="dark"] {
--color-border: #ffffff;
--color-text: #ffffff;
--color-background: #000000;
}
}

/* Screen reader only content */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}

/* Skip link for keyboard navigation */
.skip-link {
position: absolute;
top: -40px;
left: 6px;
background: var(--color-primary);
color: var(--color-white);
padding: var(--space-2) var(--space-3);
text-decoration: none;
border-radius: var(--radius-base);
font-weight: 500;
z-index: 10000;
transition: top var(--transition-fast) var(--ease-out);
}

.skip-link:focus {
top: 6px;
outline: 2px solid var(--color-white);
outline-offset: 2px;
}

/* Improve text selection contrast */
::selection {
background-color: var(--color-primary);
color: var(--color-white);
text-shadow: none;
}

::-moz-selection {
background-color: var(--color-primary);
color: var(--color-white);
text-shadow: none;
}

/* Ensure interactive elements have sufficient size */
button,
a,
input,
select,
textarea {
min-height: 44px;
min-width: 44px;
}

/* Improve link accessibility */
a:not([class]) {
text-decoration: underline;
text-decoration-skip-ink: auto;
text-underline-offset: 0.3em;
}

a:not([class]):hover,
a:not([class]):focus {
text-decoration-thickness: 2px;
}

/* Print styles for accessibility */
@media print {
*,
*::before,
*::after {
background: transparent !important;
color: black !important;
box-shadow: none !important;
text-shadow: none !important;
}

a,
a:visited {
text-decoration: underline;
}

a[href]::after {
content: " (" attr(href) ")";
}

abbr[title]::after {
content: " (" attr(title) ")";
}

pre {
white-space: pre-wrap !important;
}

pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}

thead {
display: table-header-group;
}

tr,
img {
page-break-inside: avoid;
}

p,
h2,
h3 {
orphans: 3;
widows: 3;
}

h2,
h3 {
page-break-after: avoid;
}
}
Loading