feat: build IPTEK company website with full bilingual support

- Complete Next.js 16 app with App Router: Home, About, Products, Contact, Privacy pages
- Product detail pages: ZappCare, Unified TMS, EMR Clinic
- Bilingual support (Indonesian/English) via LanguageContext + translations.ts
- Language switcher pill button (🇮🇩 ID / 🇬🇧 EN) in Navbar with localStorage persistence
- Navbar with logo, responsive mobile menu, translated nav links
- Contact form with captcha, server action email sending, translated labels
- Material Design 3 color tokens, Manrope + Inter fonts, Material Symbols icons
- Local product image assets and company logo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Wira Basalamah
2026-04-21 12:25:03 +07:00
parent c96a117764
commit c955792497
25 changed files with 2671 additions and 85 deletions

View File

@ -1,26 +1,97 @@
@import "tailwindcss";
:root {
--background: #ffffff;
--foreground: #171717;
--primary: #004cca;
--primary-container: #0062ff;
--on-primary: #ffffff;
--on-primary-fixed: #00174b;
--primary-fixed: #dbe1ff;
--primary-fixed-dim: #b4c5ff;
--inverse-primary: #b4c5ff;
--secondary: #495f84;
--on-secondary: #ffffff;
--secondary-container: #bcd2fe;
--on-secondary-container: #445a7f;
--tertiary: #005f75;
--on-tertiary: #ffffff;
--tertiary-container: #007995;
--on-tertiary-container: #e3f6ff;
--surface: #f7f9fb;
--surface-dim: #d8dadc;
--surface-bright: #f7f9fb;
--surface-container-lowest: #ffffff;
--surface-container-low: #f2f4f6;
--surface-container: #eceef0;
--surface-container-high: #e6e8ea;
--surface-container-highest: #e0e3e5;
--on-surface: #191c1e;
--on-surface-variant: #424656;
--outline: #737687;
--outline-variant: #c2c6d9;
--inverse-surface: #2d3133;
--inverse-on-surface: #eff1f3;
--error: #ba1a1a;
--on-error: #ffffff;
--error-container: #ffdad6;
--background: #f7f9fb;
--on-background: #191c1e;
}
@theme inline {
--color-primary: var(--primary);
--color-primary-container: var(--primary-container);
--color-on-primary: var(--on-primary);
--color-on-primary-fixed: var(--on-primary-fixed);
--color-primary-fixed: var(--primary-fixed);
--color-primary-fixed-dim: var(--primary-fixed-dim);
--color-inverse-primary: var(--inverse-primary);
--color-secondary: var(--secondary);
--color-on-secondary: var(--on-secondary);
--color-secondary-container: var(--secondary-container);
--color-on-secondary-container: var(--on-secondary-container);
--color-tertiary: var(--tertiary);
--color-on-tertiary: var(--on-tertiary);
--color-tertiary-container: var(--tertiary-container);
--color-on-tertiary-container: var(--on-tertiary-container);
--color-surface: var(--surface);
--color-surface-dim: var(--surface-dim);
--color-surface-bright: var(--surface-bright);
--color-surface-container-lowest: var(--surface-container-lowest);
--color-surface-container-low: var(--surface-container-low);
--color-surface-container: var(--surface-container);
--color-surface-container-high: var(--surface-container-high);
--color-surface-container-highest: var(--surface-container-highest);
--color-on-surface: var(--on-surface);
--color-on-surface-variant: var(--on-surface-variant);
--color-outline: var(--outline);
--color-outline-variant: var(--outline-variant);
--color-inverse-surface: var(--inverse-surface);
--color-inverse-on-surface: var(--inverse-on-surface);
--color-error: var(--error);
--color-on-error: var(--on-error);
--color-error-container: var(--error-container);
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
--color-on-background: var(--on-background);
--font-headline: "Manrope", sans-serif;
--font-body: "Inter", sans-serif;
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}
body {
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
.material-symbols-outlined {
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
vertical-align: middle;
}