keystone-design-bootstrap 1.0.3
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/README.md +179 -0
- package/package.json +59 -0
- package/src/contexts/ThemeContext.tsx +34 -0
- package/src/contexts/index.ts +1 -0
- package/src/design_system/elements/IconComponent.tsx +98 -0
- package/src/design_system/elements/avatar/avatar-label-group.tsx +30 -0
- package/src/design_system/elements/avatar/avatar-profile-photo.tsx +125 -0
- package/src/design_system/elements/avatar/avatar.tsx +131 -0
- package/src/design_system/elements/avatar/base-components/avatar-add-button.tsx +34 -0
- package/src/design_system/elements/avatar/base-components/avatar-company-icon.tsx +26 -0
- package/src/design_system/elements/avatar/base-components/avatar-online-indicator.tsx +31 -0
- package/src/design_system/elements/avatar/base-components/index.tsx +4 -0
- package/src/design_system/elements/avatar/base-components/verified-tick.tsx +34 -0
- package/src/design_system/elements/avatar/utils.ts +12 -0
- package/src/design_system/elements/badges/avatar.tsx +132 -0
- package/src/design_system/elements/badges/badge-groups.tsx +176 -0
- package/src/design_system/elements/badges/badge-types.ts +266 -0
- package/src/design_system/elements/badges/badges.tsx +430 -0
- package/src/design_system/elements/breadcrumb/Breadcrumb.tsx +33 -0
- package/src/design_system/elements/button-group/button-group.tsx +106 -0
- package/src/design_system/elements/buttons/app-store-buttons-outline.tsx +378 -0
- package/src/design_system/elements/buttons/app-store-buttons.tsx +567 -0
- package/src/design_system/elements/buttons/button-utility.tsx +116 -0
- package/src/design_system/elements/buttons/button.aman.tsx +174 -0
- package/src/design_system/elements/buttons/button.tsx +271 -0
- package/src/design_system/elements/buttons/close-button.tsx +42 -0
- package/src/design_system/elements/buttons/round-button.tsx +29 -0
- package/src/design_system/elements/buttons/social-button.tsx +148 -0
- package/src/design_system/elements/buttons/social-logos.tsx +115 -0
- package/src/design_system/elements/carousel/carousel-base.tsx +308 -0
- package/src/design_system/elements/carousel/carousel.tsx +308 -0
- package/src/design_system/elements/checkbox/checkbox.tsx +120 -0
- package/src/design_system/elements/date-picker/calendar.tsx +101 -0
- package/src/design_system/elements/date-picker/cell.tsx +106 -0
- package/src/design_system/elements/date-picker/date-input.tsx +32 -0
- package/src/design_system/elements/date-picker/date-picker.tsx +86 -0
- package/src/design_system/elements/date-picker/date-range-picker.tsx +163 -0
- package/src/design_system/elements/date-picker/range-calendar.tsx +161 -0
- package/src/design_system/elements/date-picker/range-preset.tsx +28 -0
- package/src/design_system/elements/featured-icon/featured-icon.tsx +154 -0
- package/src/design_system/elements/form/form.tsx +10 -0
- package/src/design_system/elements/form/hook-form.tsx +75 -0
- package/src/design_system/elements/hint-text/hint-text.tsx +33 -0
- package/src/design_system/elements/index.tsx +158 -0
- package/src/design_system/elements/input/hint-text.tsx +33 -0
- package/src/design_system/elements/input/input-group.tsx +133 -0
- package/src/design_system/elements/input/input.aman.tsx +172 -0
- package/src/design_system/elements/input/input.tsx +271 -0
- package/src/design_system/elements/input/label.tsx +50 -0
- package/src/design_system/elements/label/label.tsx +50 -0
- package/src/design_system/elements/loading-indicator/loading-indicator.tsx +123 -0
- package/src/design_system/elements/map/GoogleMap.tsx +286 -0
- package/src/design_system/elements/markdown-renderer/MarkdownRenderer.tsx +155 -0
- package/src/design_system/elements/modals/modal.tsx +41 -0
- package/src/design_system/elements/pagination/pagination-base.tsx +378 -0
- package/src/design_system/elements/pagination/pagination-dot.tsx +54 -0
- package/src/design_system/elements/pagination/pagination-line.tsx +50 -0
- package/src/design_system/elements/pagination/pagination.tsx +330 -0
- package/src/design_system/elements/photo-fallback/photo-fallback.tsx +143 -0
- package/src/design_system/elements/progress-indicators/progress-circles.tsx +176 -0
- package/src/design_system/elements/progress-indicators/progress-indicators.tsx +123 -0
- package/src/design_system/elements/progress-indicators/simple-circle.tsx +29 -0
- package/src/design_system/elements/radio-buttons/radio-buttons.tsx +129 -0
- package/src/design_system/elements/rating/rating-badge.tsx +144 -0
- package/src/design_system/elements/rating/rating-stars.tsx +77 -0
- package/src/design_system/elements/select/combobox.tsx +152 -0
- package/src/design_system/elements/select/multi-select.tsx +363 -0
- package/src/design_system/elements/select/popover.tsx +34 -0
- package/src/design_system/elements/select/select-item.tsx +97 -0
- package/src/design_system/elements/select/select-native.tsx +69 -0
- package/src/design_system/elements/select/select.aman.tsx +75 -0
- package/src/design_system/elements/select/select.tsx +146 -0
- package/src/design_system/elements/shared-assets/credit-card/credit-card.tsx +237 -0
- package/src/design_system/elements/shared-assets/credit-card/icons.tsx +75 -0
- package/src/design_system/elements/shared-assets/iphone-mockup.tsx +172 -0
- package/src/design_system/elements/shared-assets/section-divider.tsx +12 -0
- package/src/design_system/elements/slideout-menus/slideout-menu.tsx +122 -0
- package/src/design_system/elements/tabs/tabs.tsx +225 -0
- package/src/design_system/elements/tags/base-components/tag-checkbox.tsx +45 -0
- package/src/design_system/elements/tags/base-components/tag-close-x.tsx +34 -0
- package/src/design_system/elements/tags/tags.tsx +176 -0
- package/src/design_system/elements/textarea/textarea.aman.tsx +52 -0
- package/src/design_system/elements/textarea/textarea.tsx +111 -0
- package/src/design_system/elements/toggle/toggle.tsx +140 -0
- package/src/design_system/elements/tooltip/tooltip.tsx +109 -0
- package/src/design_system/hooks/use-breakpoint.ts +37 -0
- package/src/design_system/hooks/use-resize-observer.ts +68 -0
- package/src/design_system/logo/keystone-logo-minimal.tsx +93 -0
- package/src/design_system/logo/keystone-logo.tsx +22 -0
- package/src/design_system/sections/about-home.aman.tsx +85 -0
- package/src/design_system/sections/about-home.tsx +115 -0
- package/src/design_system/sections/blog-cards.tsx +848 -0
- package/src/design_system/sections/blog-gallery.aman.tsx +77 -0
- package/src/design_system/sections/blog-gallery.tsx +204 -0
- package/src/design_system/sections/blog-home.aman.tsx +84 -0
- package/src/design_system/sections/blog-home.tsx +153 -0
- package/src/design_system/sections/blog-post.aman.tsx +74 -0
- package/src/design_system/sections/blog-post.tsx +301 -0
- package/src/design_system/sections/blog-section.aman.tsx +101 -0
- package/src/design_system/sections/blog-section.tsx +179 -0
- package/src/design_system/sections/contact-home.tsx +25 -0
- package/src/design_system/sections/contact-section.aman.tsx +173 -0
- package/src/design_system/sections/contact-section.tsx +143 -0
- package/src/design_system/sections/faq-grid.aman.tsx +79 -0
- package/src/design_system/sections/faq-grid.tsx +102 -0
- package/src/design_system/sections/faq-home.aman.tsx +92 -0
- package/src/design_system/sections/faq-home.tsx +134 -0
- package/src/design_system/sections/feature-tab.tsx +43 -0
- package/src/design_system/sections/feature-text.tsx +284 -0
- package/src/design_system/sections/footer-home.aman.tsx +62 -0
- package/src/design_system/sections/footer-home.tsx +259 -0
- package/src/design_system/sections/generic-header-component.tsx +103 -0
- package/src/design_system/sections/header-navigation.aman.tsx +360 -0
- package/src/design_system/sections/header-navigation.tsx +334 -0
- package/src/design_system/sections/hero-faq.aman.tsx +38 -0
- package/src/design_system/sections/hero-faq.tsx +55 -0
- package/src/design_system/sections/hero-generic-text.aman.tsx +49 -0
- package/src/design_system/sections/hero-generic-text.tsx +51 -0
- package/src/design_system/sections/hero-home.aman.tsx +84 -0
- package/src/design_system/sections/hero-home.tsx +246 -0
- package/src/design_system/sections/hero-location-detail.aman.tsx +33 -0
- package/src/design_system/sections/hero-location-detail.tsx +72 -0
- package/src/design_system/sections/hero-service-detail.aman.tsx +53 -0
- package/src/design_system/sections/hero-service-detail.tsx +51 -0
- package/src/design_system/sections/hero-social-media.aman.tsx +42 -0
- package/src/design_system/sections/hero-social-media.tsx +35 -0
- package/src/design_system/sections/hero-testimonials.aman.tsx +38 -0
- package/src/design_system/sections/hero-testimonials.tsx +55 -0
- package/src/design_system/sections/home-hero-component.tsx +228 -0
- package/src/design_system/sections/index.tsx +131 -0
- package/src/design_system/sections/job-gallery.aman.tsx +91 -0
- package/src/design_system/sections/job-gallery.tsx +183 -0
- package/src/design_system/sections/location-details-section.aman.tsx +179 -0
- package/src/design_system/sections/location-details-section.tsx +196 -0
- package/src/design_system/sections/location-grid.aman.tsx +76 -0
- package/src/design_system/sections/location-grid.tsx +123 -0
- package/src/design_system/sections/services-grid.aman.tsx +85 -0
- package/src/design_system/sections/services-grid.tsx +104 -0
- package/src/design_system/sections/services-home.aman.tsx +78 -0
- package/src/design_system/sections/services-home.tsx +131 -0
- package/src/design_system/sections/social-media-grid.aman.tsx +132 -0
- package/src/design_system/sections/social-media-grid.tsx +189 -0
- package/src/design_system/sections/statistics-section.aman.tsx +79 -0
- package/src/design_system/sections/statistics-section.tsx +97 -0
- package/src/design_system/sections/team-grid.aman.tsx +85 -0
- package/src/design_system/sections/team-grid.tsx +88 -0
- package/src/design_system/sections/testimonials-home.aman.tsx +113 -0
- package/src/design_system/sections/testimonials-home.tsx +90 -0
- package/src/design_system/sections/values-section.aman.tsx +73 -0
- package/src/design_system/sections/values-section.tsx +128 -0
- package/src/design_system/utils/icon-mapping.tsx +28 -0
- package/src/index.ts +7 -0
- package/src/lib/component-registry.ts +53 -0
- package/src/lib/hooks/index.ts +8 -0
- package/src/lib/hooks/use-breakpoint.ts +37 -0
- package/src/lib/hooks/use-clipboard.ts +79 -0
- package/src/lib/hooks/use-resize-observer.ts +68 -0
- package/src/lib/server-api.ts +115 -0
- package/src/styles/style-overrides.aman.css +101 -0
- package/src/styles/theme.css +224 -0
- package/src/styles/typography.css +430 -0
- package/src/themes/index.ts +23 -0
- package/src/types/api/blog-post.ts +53 -0
- package/src/types/api/company-information.ts +44 -0
- package/src/types/api/contact.ts +63 -0
- package/src/types/api/faq.ts +37 -0
- package/src/types/api/job-posting.ts +34 -0
- package/src/types/api/location.ts +36 -0
- package/src/types/api/photos.ts +28 -0
- package/src/types/api/service.ts +37 -0
- package/src/types/api/social-post.ts +28 -0
- package/src/types/api/team-member.ts +29 -0
- package/src/types/api/testimonial.ts +29 -0
- package/src/types/api/website-photos.ts +22 -0
- package/src/types/config.ts +21 -0
- package/src/types/index.ts +21 -0
- package/src/utils/countries.tsx +1351 -0
- package/src/utils/cx.ts +25 -0
- package/src/utils/gradient-placeholder.ts +59 -0
- package/src/utils/is-react-component.ts +33 -0
- package/src/utils/markdown-toc.ts +54 -0
- package/src/utils/photo-helpers.ts +94 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import type { RefObject } from "@react-types/shared";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Checks if the ResizeObserver API is supported.
|
|
6
|
+
* @returns True if the ResizeObserver API is supported, false otherwise.
|
|
7
|
+
*/
|
|
8
|
+
function hasResizeObserver() {
|
|
9
|
+
return typeof window.ResizeObserver !== "undefined";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The options for the useResizeObserver hook.
|
|
14
|
+
*/
|
|
15
|
+
type useResizeObserverOptionsType<T> = {
|
|
16
|
+
/**
|
|
17
|
+
* The ref to the element to observe.
|
|
18
|
+
*/
|
|
19
|
+
ref: RefObject<T | undefined | null> | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* The box to observe.
|
|
22
|
+
*/
|
|
23
|
+
box?: ResizeObserverBoxOptions;
|
|
24
|
+
/**
|
|
25
|
+
* The callback function to call when the size changes.
|
|
26
|
+
*/
|
|
27
|
+
onResize: () => void;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A hook that observes the size of an element and calls a callback function when the size changes.
|
|
32
|
+
* @param options - The options for the hook.
|
|
33
|
+
*/
|
|
34
|
+
export function useResizeObserver<T extends Element>(options: useResizeObserverOptionsType<T>) {
|
|
35
|
+
const { ref, box, onResize } = options;
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const element = ref?.current;
|
|
39
|
+
if (!element) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (!hasResizeObserver()) {
|
|
44
|
+
window.addEventListener("resize", onResize, false);
|
|
45
|
+
|
|
46
|
+
return () => {
|
|
47
|
+
window.removeEventListener("resize", onResize, false);
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
const resizeObserverInstance = new window.ResizeObserver((entries) => {
|
|
51
|
+
if (!entries.length) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
onResize();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
resizeObserverInstance.observe(element, { box });
|
|
59
|
+
|
|
60
|
+
return () => {
|
|
61
|
+
if (element) {
|
|
62
|
+
resizeObserverInstance.unobserve(element);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}, [onResize, ref, box]);
|
|
67
|
+
}
|
|
68
|
+
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side API client for SSR
|
|
3
|
+
* API key is stored securely on the server - never exposed to browser
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const API_URL = process.env.API_URL || 'http://localhost:3000/api/v1';
|
|
7
|
+
const API_KEY = process.env.API_KEY || '';
|
|
8
|
+
|
|
9
|
+
interface FetchOptions {
|
|
10
|
+
cache?: RequestCache;
|
|
11
|
+
revalidate?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function serverFetch<T>(endpoint: string, options: FetchOptions = {}): Promise<T | null> {
|
|
15
|
+
const url = `${API_URL}${endpoint}`;
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
const fetchOptions: RequestInit & { next?: { revalidate?: number } } = {
|
|
19
|
+
headers: {
|
|
20
|
+
'X-API-Key': API_KEY,
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
},
|
|
23
|
+
cache: options.cache,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
if (options.revalidate) {
|
|
27
|
+
fetchOptions.next = { revalidate: options.revalidate };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const response = await fetch(url, fetchOptions);
|
|
31
|
+
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
console.error(`[Server API] Error ${response.status} for ${endpoint}`);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const json = await response.json();
|
|
38
|
+
|
|
39
|
+
// Rails API returns { data: [...], meta: {...} }
|
|
40
|
+
return json.data ?? json;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(`[Server API] Failed to fetch ${endpoint}:`, error);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Generic serverApi object for flexible endpoint access
|
|
49
|
+
*/
|
|
50
|
+
export const serverApi = {
|
|
51
|
+
get: <T = any>(endpoint: string, options?: FetchOptions): Promise<T | null> => {
|
|
52
|
+
return serverFetch<T>(endpoint, options || { revalidate: 60 });
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Revalidate data every 60 seconds (ISR)
|
|
57
|
+
const defaultOptions: FetchOptions = { revalidate: 60 };
|
|
58
|
+
|
|
59
|
+
export async function getCompanyInformation() {
|
|
60
|
+
return serverFetch('/public/company_information', defaultOptions);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function getServices() {
|
|
64
|
+
return serverFetch('/public/services', defaultOptions);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function getService(slug: string) {
|
|
68
|
+
return serverFetch(`/public/services/by_slug/${slug}`, defaultOptions);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function getLocations() {
|
|
72
|
+
return serverFetch('/public/locations', defaultOptions);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export async function getLocation(slug: string) {
|
|
76
|
+
return serverFetch(`/public/locations/by_slug/${slug}`, defaultOptions);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function getReviews() {
|
|
80
|
+
return serverFetch('/public/reviews', defaultOptions);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function getFAQs() {
|
|
84
|
+
return serverFetch('/public/faq_questions', defaultOptions);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export async function getBlogPosts() {
|
|
88
|
+
return serverFetch('/public/blog_posts', defaultOptions);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function getBlogPost(slug: string) {
|
|
92
|
+
return serverFetch(`/public/blog_posts/by_slug/${slug}`, defaultOptions);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function getTeamMembers() {
|
|
96
|
+
return serverFetch('/public/team_members', defaultOptions);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export async function getWebsitePhotos() {
|
|
100
|
+
return serverFetch('/public/website_photos', defaultOptions);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function getJobPostings() {
|
|
104
|
+
return serverFetch('/public/job_postings', defaultOptions);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function getJobPosting(slug: string) {
|
|
108
|
+
return serverFetch(`/public/job_postings/by_slug/${slug}`, defaultOptions);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Alias for testimonials (API uses "reviews")
|
|
112
|
+
export async function getTestimonials() {
|
|
113
|
+
return getReviews();
|
|
114
|
+
}
|
|
115
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* Aman Theme Overrides */
|
|
2
|
+
|
|
3
|
+
/* Aman theme typography and colors */
|
|
4
|
+
[data-theme="aman"] {
|
|
5
|
+
/* Typography - use actual font names since CSS variables from next/font are scoped to body */
|
|
6
|
+
--font-body: "Inter", "Inter Fallback", -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
|
|
7
|
+
--font-display: "Playfair Display", "Playfair Display Fallback", "Didot", "Georgia", serif;
|
|
8
|
+
|
|
9
|
+
/* Aman color palette - warm, elegant tones */
|
|
10
|
+
--color-bg-primary: #F9F7F0; /* Light warm beige */
|
|
11
|
+
--color-bg-secondary: #F9F7F0;
|
|
12
|
+
--background-color-primary: #F9F7F0;
|
|
13
|
+
--background-color-secondary: #F9F7F0;
|
|
14
|
+
|
|
15
|
+
/* Text colors */
|
|
16
|
+
--color-text-primary: #1E1E1E; /* Near black for elegant contrast */
|
|
17
|
+
--color-text-secondary: #505050;
|
|
18
|
+
--color-text-tertiary: #787878;
|
|
19
|
+
|
|
20
|
+
/* Foreground colors for text classes */
|
|
21
|
+
--color-fg-primary: #1E1E1E;
|
|
22
|
+
--color-fg-secondary: #505050;
|
|
23
|
+
--color-fg-tertiary: #787878;
|
|
24
|
+
|
|
25
|
+
/* Brand accent - elegant gold/bronze */
|
|
26
|
+
--color-text-brand-accent: #B48C64;
|
|
27
|
+
--color-text-brand-secondary: #8C6440;
|
|
28
|
+
|
|
29
|
+
/* Border colors */
|
|
30
|
+
--color-border-primary: #E5E2D9;
|
|
31
|
+
--color-border-secondary: #D5D2C9;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Body text uses Inter */
|
|
35
|
+
[data-theme="aman"] body {
|
|
36
|
+
font-family: "Inter", "Inter Fallback", -apple-system, "Segoe UI", Roboto, Arial, sans-serif !important;
|
|
37
|
+
background-color: #F9F7F0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Headings use Playfair Display */
|
|
41
|
+
[data-theme="aman"] h1,
|
|
42
|
+
[data-theme="aman"] h2,
|
|
43
|
+
[data-theme="aman"] h3,
|
|
44
|
+
[data-theme="aman"] h4,
|
|
45
|
+
[data-theme="aman"] h5,
|
|
46
|
+
[data-theme="aman"] h6 {
|
|
47
|
+
font-family: "Playfair Display", "Playfair Display Fallback", "Didot", "Georgia", serif !important;
|
|
48
|
+
font-weight: 400;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* .font-display class also uses Playfair */
|
|
52
|
+
[data-theme="aman"] .font-display {
|
|
53
|
+
font-family: "Playfair Display", "Playfair Display Fallback", "Didot", "Georgia", serif !important;
|
|
54
|
+
font-weight: 400;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* .font-body class uses Inter */
|
|
58
|
+
[data-theme="aman"] .font-body {
|
|
59
|
+
font-family: "Inter", "Inter Fallback", -apple-system, "Segoe UI", Roboto, Arial, sans-serif !important;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Fix header background - ensure solid color */
|
|
63
|
+
[data-theme="aman"] header {
|
|
64
|
+
background-color: #F9F7F0 !important;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Ensure prose content doesn't have white backgrounds */
|
|
68
|
+
[data-theme="aman"] .prose,
|
|
69
|
+
[data-theme="aman"] .prose-lg {
|
|
70
|
+
background-color: transparent;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Navigation styling */
|
|
74
|
+
[data-theme="aman"] nav {
|
|
75
|
+
font-family: "Inter", "Inter Fallback", -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Button text */
|
|
79
|
+
[data-theme="aman"] button,
|
|
80
|
+
[data-theme="aman"] .btn {
|
|
81
|
+
font-family: "Inter", "Inter Fallback", -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Sections should use the beige background */
|
|
85
|
+
[data-theme="aman"] section {
|
|
86
|
+
background-color: #F9F7F0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Override bg-primary class directly */
|
|
90
|
+
[data-theme="aman"] .bg-primary {
|
|
91
|
+
background-color: #F9F7F0 !important;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Paragraphs and general text */
|
|
95
|
+
[data-theme="aman"] p,
|
|
96
|
+
[data-theme="aman"] span,
|
|
97
|
+
[data-theme="aman"] div,
|
|
98
|
+
[data-theme="aman"] li,
|
|
99
|
+
[data-theme="aman"] a {
|
|
100
|
+
font-family: inherit;
|
|
101
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme CSS
|
|
3
|
+
* Contains the colors and utilities used by the site template
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
@theme {
|
|
7
|
+
/* ==================== FONTS ==================== */
|
|
8
|
+
--font-body: var(--font-inter, "Inter"), -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
|
|
9
|
+
--font-display: var(--font-inter, "Inter"), -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
|
|
10
|
+
--font-mono: ui-monospace, "Roboto Mono", SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
11
|
+
|
|
12
|
+
/* ==================== FONT SIZES ==================== */
|
|
13
|
+
--text-xs: 0.75rem;
|
|
14
|
+
--text-xs--line-height: 1.125rem;
|
|
15
|
+
--text-sm: 0.875rem;
|
|
16
|
+
--text-sm--line-height: 1.25rem;
|
|
17
|
+
--text-md: 1rem;
|
|
18
|
+
--text-md--line-height: 1.5rem;
|
|
19
|
+
--text-lg: 1.125rem;
|
|
20
|
+
--text-lg--line-height: 1.75rem;
|
|
21
|
+
--text-xl: 1.25rem;
|
|
22
|
+
--text-xl--line-height: 1.875rem;
|
|
23
|
+
--text-display-xs: 1.5rem;
|
|
24
|
+
--text-display-xs--line-height: 2rem;
|
|
25
|
+
--text-display-sm: 1.875rem;
|
|
26
|
+
--text-display-sm--line-height: 2.375rem;
|
|
27
|
+
--text-display-md: 2.25rem;
|
|
28
|
+
--text-display-md--line-height: 2.75rem;
|
|
29
|
+
--text-display-md--letter-spacing: -0.72px;
|
|
30
|
+
--text-display-lg: 3rem;
|
|
31
|
+
--text-display-lg--line-height: 3.75rem;
|
|
32
|
+
--text-display-lg--letter-spacing: -0.96px;
|
|
33
|
+
--text-display-xl: 3.75rem;
|
|
34
|
+
--text-display-xl--line-height: 4.5rem;
|
|
35
|
+
--text-display-xl--letter-spacing: -1.2px;
|
|
36
|
+
--text-display-2xl: 4.5rem;
|
|
37
|
+
--text-display-2xl--line-height: 5.625rem;
|
|
38
|
+
--text-display-2xl--letter-spacing: -1.44px;
|
|
39
|
+
|
|
40
|
+
/* ==================== LAYOUT ==================== */
|
|
41
|
+
--max-width-container: 1280px;
|
|
42
|
+
--breakpoint-xxs: 320px;
|
|
43
|
+
--breakpoint-xs: 600px;
|
|
44
|
+
|
|
45
|
+
/* ==================== RADIUS ==================== */
|
|
46
|
+
--radius-none: 0px;
|
|
47
|
+
--radius-xs: 0.125rem;
|
|
48
|
+
--radius-sm: 0.25rem;
|
|
49
|
+
--radius-DEFAULT: 0.25rem;
|
|
50
|
+
--radius-md: 0.375rem;
|
|
51
|
+
--radius-lg: 0.5rem;
|
|
52
|
+
--radius-xl: 0.75rem;
|
|
53
|
+
--radius-2xl: 1rem;
|
|
54
|
+
--radius-3xl: 1.5rem;
|
|
55
|
+
--radius-full: 9999px;
|
|
56
|
+
|
|
57
|
+
/* ==================== SHADOWS ==================== */
|
|
58
|
+
--shadow-xs: 0px 1px 2px rgba(10, 13, 18, 0.05);
|
|
59
|
+
--shadow-sm: 0px 1px 3px rgba(10, 13, 18, 0.1), 0px 1px 2px -1px rgba(10, 13, 18, 0.1);
|
|
60
|
+
--shadow-md: 0px 4px 6px -1px rgba(10, 13, 18, 0.1), 0px 2px 4px -2px rgba(10, 13, 18, 0.06);
|
|
61
|
+
--shadow-lg: 0px 12px 16px -4px rgba(10, 13, 18, 0.08), 0px 4px 6px -2px rgba(10, 13, 18, 0.03);
|
|
62
|
+
--shadow-xl: 0px 20px 24px -4px rgba(10, 13, 18, 0.08), 0px 8px 8px -4px rgba(10, 13, 18, 0.03);
|
|
63
|
+
--shadow-2xl: 0px 24px 48px -12px rgba(10, 13, 18, 0.18);
|
|
64
|
+
|
|
65
|
+
/* ==================== ANIMATIONS ==================== */
|
|
66
|
+
--animate-marquee: marquee 60s linear infinite;
|
|
67
|
+
|
|
68
|
+
@keyframes marquee {
|
|
69
|
+
0% { transform: translateX(0); }
|
|
70
|
+
100% { transform: translateX(-100%); }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* ==================== BASE COLORS ==================== */
|
|
74
|
+
--color-transparent: transparent;
|
|
75
|
+
--color-white: rgb(255 255 255);
|
|
76
|
+
--color-black: rgb(0 0 0);
|
|
77
|
+
|
|
78
|
+
/* Gray scale - the main palette we actually use */
|
|
79
|
+
--color-gray-25: rgb(253 253 253);
|
|
80
|
+
--color-gray-50: rgb(250 250 250);
|
|
81
|
+
--color-gray-100: rgb(245 245 245);
|
|
82
|
+
--color-gray-200: rgb(233 234 235);
|
|
83
|
+
--color-gray-300: rgb(213 215 218);
|
|
84
|
+
--color-gray-400: rgb(164 167 174);
|
|
85
|
+
--color-gray-500: rgb(113 118 128);
|
|
86
|
+
--color-gray-600: rgb(83 88 98);
|
|
87
|
+
--color-gray-700: rgb(65 70 81);
|
|
88
|
+
--color-gray-800: rgb(37 43 55);
|
|
89
|
+
--color-gray-900: rgb(24 29 39);
|
|
90
|
+
--color-gray-950: rgb(10 13 18);
|
|
91
|
+
|
|
92
|
+
/* Blue - used for links, social icons */
|
|
93
|
+
--color-blue-50: rgb(239 248 255);
|
|
94
|
+
--color-blue-400: rgb(83 177 253);
|
|
95
|
+
--color-blue-500: rgb(46 144 250);
|
|
96
|
+
--color-blue-600: rgb(21 112 239);
|
|
97
|
+
--color-blue-700: rgb(23 92 211);
|
|
98
|
+
--color-blue-800: rgb(24 73 169);
|
|
99
|
+
|
|
100
|
+
/* Pink - used for Instagram icon */
|
|
101
|
+
--color-pink-500: rgb(238 70 188);
|
|
102
|
+
--color-pink-600: rgb(221 37 144);
|
|
103
|
+
|
|
104
|
+
/* Brand (green) - minimal set for accent */
|
|
105
|
+
--color-brand-500: rgb(66 214 116);
|
|
106
|
+
--color-brand-600: rgb(52 190 100);
|
|
107
|
+
--color-brand-700: rgb(38 166 84);
|
|
108
|
+
|
|
109
|
+
/* Error (red) - for form validation */
|
|
110
|
+
--color-error-500: rgb(240 68 56);
|
|
111
|
+
--color-error-600: rgb(217 45 32);
|
|
112
|
+
|
|
113
|
+
/* Warning (yellow/orange) - for ratings, alerts */
|
|
114
|
+
--color-warning-400: rgb(253 176 34);
|
|
115
|
+
--color-warning-500: rgb(247 144 9);
|
|
116
|
+
--color-warning-600: rgb(220 104 3);
|
|
117
|
+
|
|
118
|
+
/* Success (green) - for success states */
|
|
119
|
+
--color-success-500: rgb(23 178 106);
|
|
120
|
+
--color-success-600: rgb(7 148 85);
|
|
121
|
+
|
|
122
|
+
/* ==================== SEMANTIC COLORS (Light Mode) ==================== */
|
|
123
|
+
|
|
124
|
+
/* Text colors */
|
|
125
|
+
--color-text-primary: var(--color-gray-900);
|
|
126
|
+
--color-text-secondary: var(--color-gray-700);
|
|
127
|
+
--color-text-tertiary: var(--color-gray-600);
|
|
128
|
+
--color-text-quaternary: var(--color-gray-500);
|
|
129
|
+
--color-text-disabled: var(--color-gray-500);
|
|
130
|
+
--color-text-placeholder: var(--color-gray-500);
|
|
131
|
+
--color-text-white: var(--color-white);
|
|
132
|
+
--color-text-error-primary: var(--color-error-600);
|
|
133
|
+
--color-text-brand-secondary: var(--color-brand-700);
|
|
134
|
+
|
|
135
|
+
/* Foreground colors (icons, UI elements) */
|
|
136
|
+
--color-fg-primary: var(--color-gray-900);
|
|
137
|
+
--color-fg-secondary: var(--color-gray-700);
|
|
138
|
+
--color-fg-tertiary: var(--color-gray-600);
|
|
139
|
+
--color-fg-quaternary: var(--color-gray-400);
|
|
140
|
+
--color-fg-disabled: var(--color-gray-400);
|
|
141
|
+
--color-fg-white: var(--color-white);
|
|
142
|
+
--color-fg-brand-primary: var(--color-brand-600);
|
|
143
|
+
--color-fg-brand-secondary: var(--color-brand-500);
|
|
144
|
+
--color-fg-error-primary: var(--color-error-600);
|
|
145
|
+
|
|
146
|
+
/* Background colors */
|
|
147
|
+
--color-bg-primary: var(--color-white);
|
|
148
|
+
--color-bg-secondary: var(--color-gray-50);
|
|
149
|
+
--color-bg-tertiary: var(--color-gray-100);
|
|
150
|
+
--color-bg-quaternary: var(--color-gray-200);
|
|
151
|
+
--color-bg-disabled: var(--color-gray-100);
|
|
152
|
+
--color-bg-primary_hover: var(--color-gray-50);
|
|
153
|
+
--color-bg-secondary_hover: var(--color-gray-100);
|
|
154
|
+
--color-bg-brand-solid: var(--color-brand-600);
|
|
155
|
+
--color-bg-brand-solid_hover: var(--color-brand-700);
|
|
156
|
+
--color-bg-error-primary: rgb(254 243 242);
|
|
157
|
+
|
|
158
|
+
/* Border colors */
|
|
159
|
+
--color-border-primary: var(--color-gray-300);
|
|
160
|
+
--color-border-secondary: var(--color-gray-200);
|
|
161
|
+
--color-border-tertiary: var(--color-gray-100);
|
|
162
|
+
--color-border-disabled: var(--color-gray-300);
|
|
163
|
+
--color-border-brand: var(--color-brand-500);
|
|
164
|
+
--color-border-error: var(--color-error-500);
|
|
165
|
+
|
|
166
|
+
/* Focus ring */
|
|
167
|
+
--color-focus-ring: var(--color-brand-500);
|
|
168
|
+
|
|
169
|
+
/* ==================== TAILWIND PROPERTY MAPPINGS ==================== */
|
|
170
|
+
|
|
171
|
+
/* Background property colors */
|
|
172
|
+
--background-color-primary: var(--color-bg-primary);
|
|
173
|
+
--background-color-secondary: var(--color-bg-secondary);
|
|
174
|
+
--background-color-tertiary: var(--color-bg-tertiary);
|
|
175
|
+
--background-color-quaternary: var(--color-bg-quaternary);
|
|
176
|
+
--background-color-disabled: var(--color-bg-disabled);
|
|
177
|
+
--background-color-primary_hover: var(--color-bg-primary_hover);
|
|
178
|
+
--background-color-secondary_hover: var(--color-bg-secondary_hover);
|
|
179
|
+
--background-color-brand-solid: var(--color-bg-brand-solid);
|
|
180
|
+
--background-color-brand-solid_hover: var(--color-bg-brand-solid_hover);
|
|
181
|
+
--background-color-error-primary: var(--color-bg-error-primary);
|
|
182
|
+
|
|
183
|
+
/* Text property colors */
|
|
184
|
+
--text-color-primary: var(--color-text-primary);
|
|
185
|
+
--text-color-secondary: var(--color-text-secondary);
|
|
186
|
+
--text-color-tertiary: var(--color-text-tertiary);
|
|
187
|
+
--text-color-quaternary: var(--color-text-quaternary);
|
|
188
|
+
--text-color-disabled: var(--color-text-disabled);
|
|
189
|
+
--text-color-placeholder: var(--color-text-placeholder);
|
|
190
|
+
--text-color-brand-secondary: var(--color-text-brand-secondary);
|
|
191
|
+
--text-color-error-primary: var(--color-text-error-primary);
|
|
192
|
+
|
|
193
|
+
/* Border property colors */
|
|
194
|
+
--border-color-primary: var(--color-border-primary);
|
|
195
|
+
--border-color-secondary: var(--color-border-secondary);
|
|
196
|
+
--border-color-tertiary: var(--color-border-tertiary);
|
|
197
|
+
--border-color-disabled: var(--color-border-disabled);
|
|
198
|
+
--border-color-brand: var(--color-border-brand);
|
|
199
|
+
--border-color-error: var(--color-border-error);
|
|
200
|
+
|
|
201
|
+
/* Ring property colors */
|
|
202
|
+
--ring-color-primary: var(--color-border-primary);
|
|
203
|
+
--ring-color-secondary: var(--color-border-secondary);
|
|
204
|
+
--ring-color-brand: var(--color-border-brand);
|
|
205
|
+
--ring-color-error: var(--color-border-error);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* ==================== SECTION STYLES ==================== */
|
|
209
|
+
|
|
210
|
+
/* Apply consistent styling to sections in main content */
|
|
211
|
+
:not([data-design-gallery]) > section,
|
|
212
|
+
:not([data-design-gallery]) section {
|
|
213
|
+
@apply bg-primary py-16 md:py-24;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* Design gallery previews: no padding or background */
|
|
217
|
+
[data-design-gallery] section {
|
|
218
|
+
@apply bg-transparent p-0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* Sample site sections: restore padding */
|
|
222
|
+
[data-sample-site] section {
|
|
223
|
+
@apply bg-primary py-16 md:py-24;
|
|
224
|
+
}
|