keystone-design-bootstrap 1.0.55 → 1.0.57

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.
Files changed (55) hide show
  1. package/dist/design_system/elements/index.js +8 -3
  2. package/dist/design_system/elements/index.js.map +1 -1
  3. package/dist/design_system/sections/index.js +203 -106
  4. package/dist/design_system/sections/index.js.map +1 -1
  5. package/dist/index.js +303 -247
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/hooks/index.js +72 -0
  8. package/dist/lib/hooks/index.js.map +1 -1
  9. package/dist/lib/server-api.js.map +1 -1
  10. package/dist/utils/phone-helpers.js +26 -0
  11. package/dist/utils/phone-helpers.js.map +1 -0
  12. package/package.json +5 -2
  13. package/src/design_system/components/ChatWidget.tsx +51 -34
  14. package/src/design_system/components/DynamicFormFields.tsx +1 -24
  15. package/src/design_system/elements/modal/modal.tsx +54 -35
  16. package/src/design_system/portal/LoginForm.tsx +358 -0
  17. package/src/design_system/portal/LoginModalController.tsx +63 -0
  18. package/src/design_system/portal/LogoutButton.tsx +22 -0
  19. package/src/design_system/portal/MessageComposer.tsx +92 -0
  20. package/src/design_system/portal/PortalPage.tsx +754 -0
  21. package/src/design_system/portal/RowThumbnail.tsx +76 -0
  22. package/src/design_system/portal/index.ts +5 -0
  23. package/src/design_system/sections/index.tsx +1 -1
  24. package/src/design_system/sections/service-menu-section.tsx +7 -108
  25. package/src/lib/actions.ts +51 -115
  26. package/src/lib/consumer-session.ts +74 -0
  27. package/src/lib/hooks/index.ts +2 -0
  28. package/src/lib/hooks/use-image-cycle.ts +105 -0
  29. package/src/lib/server-api.ts +7 -6
  30. package/src/next/routes/chat.ts +30 -58
  31. package/src/next/routes/consumer-auth.ts +180 -0
  32. package/src/types/api/consumer.ts +39 -0
  33. package/src/types/api/offer.ts +1 -1
  34. package/src/types/api/package.ts +20 -0
  35. package/src/types/api/service.ts +6 -24
  36. package/src/types/index.ts +2 -0
  37. package/src/utils/phone-helpers.ts +27 -0
  38. package/dist/blog-post-DGjaJ3wf.d.ts +0 -50
  39. package/dist/contexts/index.d.ts +0 -13
  40. package/dist/design_system/elements/index.d.ts +0 -372
  41. package/dist/design_system/logo/keystone-logo.d.ts +0 -6
  42. package/dist/design_system/sections/index.d.ts +0 -237
  43. package/dist/form-CpsCONG5.d.ts +0 -151
  44. package/dist/index.d.ts +0 -76
  45. package/dist/lib/component-registry.d.ts +0 -13
  46. package/dist/lib/hooks/index.d.ts +0 -64
  47. package/dist/lib/server-api.d.ts +0 -43
  48. package/dist/themes/index.d.ts +0 -16
  49. package/dist/types/index.d.ts +0 -264
  50. package/dist/utils/cx.d.ts +0 -15
  51. package/dist/utils/gradient-placeholder.d.ts +0 -8
  52. package/dist/utils/is-react-component.d.ts +0 -21
  53. package/dist/utils/markdown-toc.d.ts +0 -14
  54. package/dist/utils/photo-helpers.d.ts +0 -37
  55. package/dist/website-photos-Bm-CBK9g.d.ts +0 -47
@@ -1,151 +0,0 @@
1
- import { P as PhotoAttachment, a as Photo } from './website-photos-Bm-CBK9g.js';
2
-
3
- /** Nested under `service_items[].offers` and `packages[].offers` in public API. */
4
- interface OfferPublic {
5
- id: number;
6
- name: string;
7
- description: string | null;
8
- value_terms: string | null;
9
- active: boolean;
10
- expires_at?: string | null;
11
- expired?: boolean;
12
- photo_attachments?: PhotoAttachment[];
13
- }
14
-
15
- interface Service {
16
- id: number;
17
- name: string;
18
- slug: string;
19
- description_markdown: string;
20
- summary?: string;
21
- pricing_info?: string;
22
- features_markdown?: string;
23
- featured: boolean;
24
- sort_order: number;
25
- photo_attachments?: Array<{
26
- id: number;
27
- featured: boolean;
28
- attachable_id?: number;
29
- attachable_type?: string;
30
- photo?: {
31
- id: number;
32
- title: string;
33
- thumbnail_url?: string;
34
- medium_url?: string;
35
- large_url?: string;
36
- original_url?: string;
37
- };
38
- }>;
39
- /** Menu items under this service category (when loaded with associations). */
40
- service_items?: ServiceItem[];
41
- created_at: string;
42
- updated_at: string;
43
- }
44
- /** Single menu item under a service category. */
45
- interface ServiceItem {
46
- id: number;
47
- name: string;
48
- slug: string;
49
- summary?: string | null;
50
- description_markdown?: string | null;
51
- pricing_info?: string | null;
52
- price_cents?: number | null;
53
- duration_minutes?: number | null;
54
- sort_order: number;
55
- service_id?: number;
56
- /** Present when loaded for public/menu (from related service’s photos). */
57
- photo_attachments?: Array<{
58
- id: number;
59
- photo?: {
60
- thumbnail_url?: string;
61
- medium_url?: string;
62
- large_url?: string;
63
- original_url?: string;
64
- title?: string;
65
- alt_text?: string;
66
- };
67
- }>;
68
- /** Active offers that apply to this menu item (public API). */
69
- offers?: OfferPublic[];
70
- }
71
- interface ServiceParams {
72
- featured?: boolean;
73
- q?: string;
74
- page?: number;
75
- per_page?: number;
76
- }
77
- type ServiceResponse = Service[];
78
-
79
- interface CompanyInformation {
80
- id: number;
81
- company_name: string;
82
- tagline: string;
83
- mission_statement_markdown?: string;
84
- about_text_markdown?: string;
85
- description_markdown?: string;
86
- values_markdown?: string;
87
- stats_markdown?: string;
88
- founded_year?: number;
89
- logo_photo?: Photo;
90
- favicon_url?: string;
91
- facebook_url?: string;
92
- instagram_url?: string;
93
- tiktok_url?: string;
94
- linkedin_url?: string;
95
- twitter_url?: string;
96
- youtube_url?: string;
97
- pinterest_url?: string;
98
- google_my_business_url?: string;
99
- yelp_url?: string;
100
- tripadvisor_url?: string;
101
- google_reviews_url?: string;
102
- primary_phone?: string;
103
- primary_email?: string;
104
- primary_address_line_1?: string;
105
- primary_address_line_2?: string;
106
- primary_city?: string;
107
- primary_state?: string;
108
- primary_zip_code?: string;
109
- primary_country?: string;
110
- support_email?: string;
111
- sales_email?: string;
112
- business_hours?: string;
113
- external_management_url?: string;
114
- created_at: string;
115
- updated_at: string;
116
- photo_attachments?: PhotoAttachment[];
117
- account_status?: string;
118
- chat_enabled?: boolean;
119
- }
120
- type CompanyInformationResponse = CompanyInformation | null;
121
-
122
- /**
123
- * Form definition from API (GET /public/forms/:form_type).
124
- * fields is an ordered array; each item is a single field or an array of fields (inline row). Max depth 2.
125
- */
126
- interface FormFieldDefinition {
127
- name: string;
128
- type: string;
129
- label: string;
130
- required?: boolean;
131
- placeholder?: string;
132
- /** For hidden fields, optional value to submit. */
133
- value?: string;
134
- }
135
- /** One item in the fields array: either a single field or a row of fields (inline). */
136
- type FormFieldItem = FormFieldDefinition | FormFieldDefinition[];
137
- interface FormDefinition {
138
- id: number;
139
- name: string;
140
- form_type: string;
141
- /** Ordered array; each element is a field or an array of fields (inline row). */
142
- fields: FormFieldItem[];
143
- settings?: Record<string, unknown>;
144
- /** Business name for consent copy (e.g. "{{company_name}}" in checkbox labels). */
145
- company_name?: string;
146
- created_at?: string;
147
- updated_at?: string;
148
- }
149
- type FormType = 'lead' | 'job_application';
150
-
151
- export type { CompanyInformation as C, FormDefinition as F, OfferPublic as O, Service as S, CompanyInformationResponse as a, FormFieldDefinition as b, FormFieldItem as c, FormType as d, ServiceItem as e, ServiceParams as f, ServiceResponse as g };
package/dist/index.d.ts DELETED
@@ -1,76 +0,0 @@
1
- export { AboutHome, BlogCardFullWidthHorizontal, BlogCardFullWidthHorizontalAlt, BlogCardFullWidthHorizontalCompact, BlogCardFullWidthHorizontalMinimal, BlogCardFullWidthVertical, BlogCardFullWidthVerticalAlt, BlogCardFullWidthVerticalCompact, BlogCardFullWidthVerticalMinimal, BlogCardHorizontal, BlogCardHorizontalBadge, BlogCardHorizontalCompact, BlogCardHorizontalMinimal, BlogCardVertical, BlogCardVerticalBadge, BlogCardVerticalCompact, BlogCardVerticalMinimal, BlogGallery, BlogHome, BlogPostSection, BlogSection, ContactHome, ContactSection, FAQGrid, FAQHero, FAQHome, FeatureTabHorizontal, FeatureTabVertical, FeatureTextCentered, FeatureTextFeaturedIconBox, FeatureTextFeaturedIconCard, FeatureTextFeaturedIconLeft, FeatureTextFeaturedIconTopCentered, FeatureTextFeaturedIconTopCenteredBrand, FeatureTextFeaturedIconTopLeft, FeatureTextFeaturedIconTopLeftBrand, FeatureTextIconCard, FeatureTextIconLeft, FeatureTextIconTopCentered, FeatureTextIconTopLeft, FeatureTextIntegrationIconBox, FeatureTextIntegrationIconLeft, FeatureTextIntegrationIconTopCentered, FeatureTextIntegrationIconTopLeft, FeatureTextLeft, FeatureTextLeftBrand, FooterHome, GenericHeaderComponent, GenericTextHero, HeaderNavigation, HeroHome, HomeHeroComponent, JobApplicationForm, JobDetailHero, JobDetailSection, JobGallery, LocationDetailHero, LocationDetailsSection, LocationGrid, PackagePublic, PolicyDocumentSection, ServiceDetailContent, ServiceDetailHero, ServiceMenuSection, ServiceMenuSectionProps, ServicesGrid, ServicesHome, SocialMediaGrid, SocialMediaHero, StatisticsSection, TeamGrid, TestimonialsGrid, TestimonialsHero, TestimonialsHome, ValuesSection, getBlogPostData } from './design_system/sections/index.js';
2
- export { Avatar, AvatarLabelGroup, Badge, BadgeGroup, BadgeWithDot, Breadcrumb, Button, ButtonGroup, Carousel, CarouselContext, CarouselSectionWrapper, ComboBox, FeaturedIcon, Form, FormContainer, GoogleMap, HintText, Input, InputBase, InputGroup, Label, MarkdownRenderer, Modal, ModalProps, NativeSelect, Pagination, PaginationPageDefault, PaginationPageMinimalCenter, PhotoWithFallback, PrivacyCheckbox, RatingBadge, RatingStars, RoundButton, Select, SelectItem, SocialIcon, StarIcon, Textarea, Tooltip, VerifiedTick, VideoModal, VideoPlayButton, Wreath, getSocialIcon, getStarProgress, useCarousel } from './design_system/elements/index.js';
3
- import { C as CompanyInformation } from './form-CpsCONG5.js';
4
- export { ThemeProvider, useTheme } from './contexts/index.js';
5
- import React__default from 'react';
6
- export { Theme } from './themes/index.js';
7
- import './blog-post-DGjaJ3wf.js';
8
- import './website-photos-Bm-CBK9g.js';
9
- import 'react-aria-components';
10
- import 'embla-carousel-react';
11
-
12
- /**
13
- * Server Actions for form submissions
14
- * These run on the server and can safely use API_KEY without exposing it to the browser
15
- */
16
- interface ContactFormResult {
17
- success: boolean;
18
- message?: string;
19
- error?: string;
20
- /** Present on lead form success; use for Meta Pixel dedup: fbq('track', 'Lead', {}, { eventID: eventId }) */
21
- eventId?: string;
22
- }
23
- /**
24
- * Submit contact form via Server Action
25
- */
26
- declare function submitContactFormAction(formData: FormData): Promise<ContactFormResult>;
27
- /**
28
- * Submit lead form via Server Action
29
- */
30
- declare function submitLeadFormAction(formData: FormData): Promise<ContactFormResult>;
31
-
32
- /**
33
- * Single place that defines default primary and secondary CTA URLs.
34
- * Primary = external management (booking) URL when present, else /contact.
35
- * Secondary = /contact.
36
- */
37
-
38
- /** True when the href is absolute (external); use for target="_blank" and rel="noopener noreferrer". */
39
- declare function isExternalCtaUrl(href: string): boolean;
40
- interface CtaUrlOverrides {
41
- primaryHrefOverride?: string | null;
42
- secondaryHrefOverride?: string | null;
43
- }
44
- interface CtaButtonLike {
45
- href?: string | null;
46
- secondary_href?: string | null;
47
- }
48
- interface ResolvedCtaUrls {
49
- primaryHref: string;
50
- secondaryHref: string;
51
- hasSecondary: boolean;
52
- }
53
- /**
54
- * Resolve primary and secondary CTA hrefs from company info and optional overrides.
55
- * - primaryHref = external_management_url (if set) else /contact
56
- * - secondaryHref = /contact
57
- * Overrides win when provided.
58
- */
59
- declare function resolveCtaUrls(companyInformation?: CompanyInformation | null, _ctaButton?: CtaButtonLike | null, overrides?: CtaUrlOverrides | null): ResolvedCtaUrls;
60
-
61
- interface TeamMember {
62
- id: number;
63
- name: string;
64
- position?: string;
65
- photo_url?: string;
66
- }
67
- interface ChatWidgetProps {
68
- position?: 'bottom-right' | 'bottom-left';
69
- primaryColor?: string;
70
- sessionId?: string;
71
- displayName?: string;
72
- teamMembers?: TeamMember[];
73
- }
74
- declare function ChatWidget({ position, primaryColor, sessionId: providedSessionId, displayName: providedDisplayName, teamMembers }: ChatWidgetProps): React__default.JSX.Element;
75
-
76
- export { ChatWidget, type CtaUrlOverrides, type ResolvedCtaUrls, isExternalCtaUrl, resolveCtaUrls, submitContactFormAction, submitLeadFormAction };
@@ -1,13 +0,0 @@
1
- import React__default from 'react';
2
- import { Theme } from '../themes/index.js';
3
-
4
- /**
5
- * Component Registry
6
- * Runtime registry for component theme variants
7
- */
8
-
9
- declare function registerThemeVariant<P = unknown>(componentName: string, theme: string, component: React__default.ComponentType<P>): void;
10
- declare function getThemedComponent(componentName: string, theme?: Theme): React__default.ComponentType<unknown>;
11
- declare function getRegistry(): Record<string, string[]>;
12
-
13
- export { getRegistry, getThemedComponent, registerThemeVariant };
@@ -1,64 +0,0 @@
1
- import { RefObject } from '@react-types/shared';
2
-
3
- /**
4
- * Checks whether a particular Tailwind CSS viewport size applies.
5
- *
6
- * @param size The size to check, which must either be included in Tailwind CSS's
7
- * list of default screen sizes, or added to the Tailwind CSS config file.
8
- *
9
- * @returns A boolean indicating whether the viewport size applies.
10
- */
11
- declare const useBreakpoint: (size: "sm" | "md" | "lg" | "xl" | "2xl") => boolean;
12
-
13
- type UseClipboardReturnType = {
14
- /**
15
- * The state indicating whether the text has been copied.
16
- * If a string is provided, it will be used as the identifier for the copied state.
17
- */
18
- copied: string | boolean;
19
- /**
20
- * Function to copy text to the clipboard using the modern clipboard API.
21
- * Falls back to the fallback function if the modern API fails.
22
- *
23
- * @param {string} text - The text to be copied.
24
- * @param {string} [id] - Optional identifier to set the copied state.
25
- * @returns {Promise<Object>} - A promise that resolves to an object containing:
26
- * - `success` (boolean): Whether the copy operation was successful.
27
- * - `error` (Error | undefined): The error object if the copy operation failed.
28
- */
29
- copy: (text: string, id?: string) => Promise<{
30
- success: boolean;
31
- error?: Error;
32
- }>;
33
- };
34
- /**
35
- * Custom hook to copy text to the clipboard.
36
- *
37
- * @returns {UseClipboardReturnType} - An object containing the copied state and the copy function.
38
- */
39
- declare const useClipboard: () => UseClipboardReturnType;
40
-
41
- /**
42
- * The options for the useResizeObserver hook.
43
- */
44
- type useResizeObserverOptionsType<T> = {
45
- /**
46
- * The ref to the element to observe.
47
- */
48
- ref: RefObject<T | undefined | null> | undefined;
49
- /**
50
- * The box to observe.
51
- */
52
- box?: ResizeObserverBoxOptions;
53
- /**
54
- * The callback function to call when the size changes.
55
- */
56
- onResize: () => void;
57
- };
58
- /**
59
- * A hook that observes the size of an element and calls a callback function when the size changes.
60
- * @param options - The options for the hook.
61
- */
62
- declare function useResizeObserver<T extends Element>(options: useResizeObserverOptionsType<T>): void;
63
-
64
- export { useBreakpoint, useClipboard, useResizeObserver };
@@ -1,43 +0,0 @@
1
- import { C as CompanyInformation, F as FormDefinition, S as Service } from '../form-CpsCONG5.js';
2
- import { W as WebsitePhotos } from '../website-photos-Bm-CBK9g.js';
3
-
4
- interface FetchOptions {
5
- cache?: RequestCache;
6
- revalidate?: number;
7
- }
8
- /**
9
- * Generic serverApi object for flexible endpoint access
10
- */
11
- declare const serverApi: {
12
- get: <T = unknown>(endpoint: string, options?: FetchOptions) => Promise<T | null>;
13
- };
14
- declare function getCompanyInformation(): Promise<CompanyInformation | null>;
15
- /** Ads config (e.g. Meta Pixel). Returns { meta_pixel_id?: string } or {}. Only present when account has connected Meta Ads. */
16
- declare function getAdsConfig(): Promise<{
17
- meta_pixel_id?: string;
18
- } | null>;
19
- /** Extract Meta Pixel ID from ads config for use with <MetaPixel pixelId={...} />. Only returns a value when present and valid (numeric). */
20
- declare function getMetaPixelId(adsConfig: {
21
- meta_pixel_id?: string;
22
- } | null | undefined): string | null;
23
- declare function getServices(): Promise<unknown>;
24
- declare function getService(slug: string): Promise<Service | null>;
25
- declare function getLocations(): Promise<unknown>;
26
- declare function getLocation(slug: string): Promise<unknown>;
27
- declare function getReviews(): Promise<unknown>;
28
- declare function getFAQs(): Promise<unknown>;
29
- declare function getBlogPosts(): Promise<unknown>;
30
- declare function getBlogPost(slug: string): Promise<unknown>;
31
- declare function getTeamMembers(): Promise<unknown>;
32
- declare function getWebsitePhotos(): Promise<WebsitePhotos | null>;
33
- declare function getJobPostings(): Promise<unknown>;
34
- declare function getJobPosting(slug: string): Promise<unknown>;
35
- declare function getSocialPosts(): Promise<unknown>;
36
- /** Packages (bundles of service items). */
37
- declare function getPackages(): Promise<unknown>;
38
- declare function getPackage(slug: string): Promise<unknown>;
39
- declare function getTestimonials(): Promise<unknown>;
40
- /** Form definition for dynamic form rendering (fields may include optional placeholder). */
41
- declare function getForm(formType: string): Promise<FormDefinition | null>;
42
-
43
- export { getAdsConfig, getBlogPost, getBlogPosts, getCompanyInformation, getFAQs, getForm, getJobPosting, getJobPostings, getLocation, getLocations, getMetaPixelId, getPackage, getPackages, getReviews, getService, getServices, getSocialPosts, getTeamMembers, getTestimonials, getWebsitePhotos, serverApi };
@@ -1,16 +0,0 @@
1
- /**
2
- * Theme Configuration
3
- * Single source of truth for all themes
4
- */
5
- declare const THEME_CONFIG: {
6
- readonly classic: "";
7
- readonly aman: ".aman";
8
- readonly barelux: ".barelux";
9
- readonly balance: ".balance";
10
- };
11
- type Theme = keyof typeof THEME_CONFIG;
12
- declare function getAvailableThemes(): Theme[];
13
- declare function getThemeSuffix(theme: Theme): string;
14
- declare function isValidTheme(theme: string): theme is Theme;
15
-
16
- export { THEME_CONFIG, type Theme, getAvailableThemes, getThemeSuffix, isValidTheme };
@@ -1,264 +0,0 @@
1
- import { Theme } from '../themes/index.js';
2
- export { B as BlogPost, a as BlogPostAuthor, b as BlogPostParams, c as BlogPostResponse, d as BlogPostTag } from '../blog-post-DGjaJ3wf.js';
3
- export { C as CompanyInformation, a as CompanyInformationResponse, F as FormDefinition, b as FormFieldDefinition, c as FormFieldItem, d as FormType, O as OfferPublic, S as Service, e as ServiceItem, f as ServiceParams, g as ServiceResponse } from '../form-CpsCONG5.js';
4
- import { P as PhotoAttachment } from '../website-photos-Bm-CBK9g.js';
5
- export { a as Photo, b as WebsitePhoto, W as WebsitePhotos, c as WebsitePhotosResponse } from '../website-photos-Bm-CBK9g.js';
6
-
7
- interface NavItem {
8
- label: string;
9
- href: string;
10
- subtitle?: string;
11
- children?: NavItem[];
12
- }
13
- interface SiteConfig {
14
- site: {
15
- title: string;
16
- description: string;
17
- theme: Theme;
18
- };
19
- navigation: {
20
- header: NavItem[];
21
- footer: NavItem[][];
22
- };
23
- }
24
-
25
- interface Testimonial {
26
- id: number;
27
- reviewer_name: string;
28
- reviewer_title?: string;
29
- company?: string;
30
- rating?: number;
31
- content_markdown: string;
32
- source?: string;
33
- source_url?: string;
34
- featured: boolean;
35
- reviewed_at: string;
36
- created_at: string;
37
- updated_at: string;
38
- photo_attachments?: PhotoAttachment[];
39
- }
40
- interface TestimonialParams {
41
- source?: string;
42
- rating?: number;
43
- verified?: boolean;
44
- featured?: boolean;
45
- page?: number;
46
- per_page?: number;
47
- }
48
- type TestimonialResponse = Testimonial[];
49
-
50
- interface TeamMember {
51
- id: number;
52
- name: string;
53
- position: string;
54
- bio_markdown: string;
55
- experience_markdown: string;
56
- email: string;
57
- phone: string;
58
- sort_order: number;
59
- featured: boolean;
60
- specialties_markdown: string;
61
- education_markdown: string;
62
- certifications_markdown: string;
63
- linkedin_url: string;
64
- twitter_url: string;
65
- photo_attachments?: PhotoAttachment[];
66
- }
67
- interface TeamMemberParams {
68
- featured?: boolean;
69
- sort_order?: number;
70
- page?: number;
71
- per_page?: number;
72
- }
73
- type TeamMemberResponse = TeamMember[];
74
-
75
- interface Location {
76
- id: number;
77
- name: string;
78
- slug: string;
79
- address_line_1: string;
80
- address_line_2?: string;
81
- city: string;
82
- state: string;
83
- zip_code: string;
84
- country?: string;
85
- latitude?: number;
86
- longitude?: number;
87
- phone?: string;
88
- email?: string;
89
- description_markdown?: string;
90
- business_hours?: string;
91
- is_primary: boolean;
92
- active: boolean;
93
- sort_order: number;
94
- created_at: string;
95
- updated_at: string;
96
- photo_attachments?: PhotoAttachment[];
97
- }
98
- interface LocationParams {
99
- active?: boolean;
100
- is_primary?: boolean;
101
- sort_order?: number;
102
- page?: number;
103
- per_page?: number;
104
- }
105
- type LocationResponse = Location[];
106
-
107
- interface SocialPost {
108
- id: number;
109
- platform: string;
110
- content_markdown: string;
111
- posted_at: string;
112
- status?: string;
113
- created_at: string;
114
- updated_at: string;
115
- /** Image URLs from photo_attachments (preferred for display) */
116
- image_urls?: string[];
117
- /** Video URLs from photo_attachments (exclude these when choosing img src) */
118
- video_urls?: string[];
119
- /** Photo attachments (same pattern as blog post, team member, etc.) */
120
- photo_attachments?: PhotoAttachment[];
121
- /** Legacy; prefer image_urls / photo_attachments */
122
- media_urls?: {
123
- images?: string[];
124
- videos?: string[];
125
- };
126
- engagement_metrics?: {
127
- likes?: number;
128
- comments?: number;
129
- shares?: number;
130
- views?: number;
131
- };
132
- /** Permalink to the post on the platform when available; only link when present to avoid broken links */
133
- external_post_url?: string | null;
134
- }
135
- interface SocialPostParams {
136
- platform?: string;
137
- featured?: boolean;
138
- page?: number;
139
- per_page?: number;
140
- }
141
- type SocialPostResponse = SocialPost[];
142
-
143
- interface FaqQuestion {
144
- id: number;
145
- question: string;
146
- answer: string;
147
- answer_markdown?: string;
148
- category_slug?: string;
149
- featured: boolean;
150
- sort_order: number;
151
- created_at: string;
152
- updated_at: string;
153
- photo_attachments?: PhotoAttachment[];
154
- }
155
- interface FaqCategory {
156
- id: number;
157
- name: string;
158
- slug: string;
159
- description?: string;
160
- active: boolean;
161
- sort_order: number;
162
- questions_count: number;
163
- }
164
- interface FaqParams {
165
- category_slug?: string;
166
- featured?: boolean;
167
- q?: string;
168
- page?: number;
169
- per_page?: number;
170
- }
171
- type FaqResponse = FaqQuestion[];
172
- type FaqCategoryResponse = FaqCategory[];
173
-
174
- interface JobPosting {
175
- id: number;
176
- title: string;
177
- slug: string;
178
- description_markdown: string;
179
- requirements_markdown?: string;
180
- benefits_markdown?: string;
181
- employment_type: string;
182
- location: string;
183
- experience_level?: string;
184
- remote_ok?: boolean;
185
- salary_range?: string;
186
- posted_at: string;
187
- expires_at?: string;
188
- status: 'active' | 'inactive' | 'expired';
189
- featured: boolean;
190
- created_at: string;
191
- updated_at: string;
192
- photo_attachments?: PhotoAttachment[];
193
- }
194
- interface JobPostingParams {
195
- featured?: boolean;
196
- employment_type?: string;
197
- location?: string;
198
- q?: string;
199
- page?: number;
200
- per_page?: number;
201
- }
202
- type JobPostingResponse = JobPosting[];
203
-
204
- interface ContactInfo {
205
- id?: number;
206
- about_text_markdown?: string;
207
- business_hours?: Record<string, {
208
- open: string;
209
- close: string;
210
- }>;
211
- company_name?: string;
212
- description_markdown?: string;
213
- facebook_url?: string;
214
- favicon_url?: string;
215
- founded_year?: string;
216
- google_my_business_url?: string;
217
- google_reviews_url?: string;
218
- instagram_url?: string;
219
- linkedin_url?: string;
220
- mission_statement_markdown?: string;
221
- pinterest_url?: string;
222
- primary_address_line_1?: string;
223
- primary_address_line_2?: string;
224
- primary_city?: string;
225
- primary_country?: string;
226
- primary_email?: string;
227
- primary_phone?: string;
228
- primary_state?: string;
229
- primary_zip_code?: string;
230
- sales_email?: string;
231
- stats_markdown?: string;
232
- support_email?: string;
233
- tagline?: string;
234
- tiktok_url?: string;
235
- tripadvisor_url?: string;
236
- twitter_url?: string;
237
- values_markdown?: string;
238
- yelp_url?: string;
239
- youtube_url?: string;
240
- photo_attachments?: PhotoAttachment[];
241
- }
242
- interface ContactFormSubmission {
243
- id: number;
244
- name: string;
245
- email: string;
246
- phone?: string;
247
- message: string;
248
- source: string;
249
- created_at: string;
250
- }
251
- interface ContactFormData {
252
- name: string;
253
- email: string;
254
- phone?: string;
255
- message: string;
256
- source?: string;
257
- }
258
- type ContactResponse = ContactInfo | null;
259
- interface ContactFormResponse {
260
- message: string;
261
- data: ContactFormSubmission;
262
- }
263
-
264
- export { type ContactFormData, type ContactFormResponse, type ContactFormSubmission, type ContactInfo, type ContactResponse, type FaqCategory, type FaqCategoryResponse, type FaqParams, type FaqQuestion, type FaqResponse, type JobPosting, type JobPostingParams, type JobPostingResponse, type Location, type LocationParams, type LocationResponse, type NavItem, PhotoAttachment, type SiteConfig, type SocialPost, type SocialPostParams, type SocialPostResponse, type TeamMember, type TeamMemberParams, type TeamMemberResponse, type Testimonial, type TestimonialParams, type TestimonialResponse, Theme };
@@ -1,15 +0,0 @@
1
- import * as tailwind_merge from 'tailwind-merge';
2
-
3
- /**
4
- * This function is a wrapper around the twMerge function.
5
- * It is used to merge the classes inside style objects.
6
- */
7
- declare const cx: (...classLists: tailwind_merge.ClassNameValue[]) => string;
8
- /**
9
- * This function does nothing besides helping us to be able to
10
- * sort the classes inside style objects which is not supported
11
- * by the Tailwind IntelliSense by default.
12
- */
13
- declare function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T;
14
-
15
- export { cx, sortCx };
@@ -1,8 +0,0 @@
1
- /**
2
- * Generates a beautiful gradient SVG data URL using the full color palette
3
- * Based on gradients used in corporate marketing site animations
4
- * Each seed (post ID or index) will consistently return the same gradient
5
- */
6
- declare const getGradientUrl: (seed: string | number) => string;
7
-
8
- export { getGradientUrl };
@@ -1,21 +0,0 @@
1
- import React__default from 'react';
2
-
3
- type ReactComponent = React__default.FC<unknown> | React__default.ComponentClass<unknown, unknown>;
4
- /**
5
- * Checks if a given value is a function component.
6
- */
7
- declare const isFunctionComponent: (component: unknown) => component is React__default.FC<unknown>;
8
- /**
9
- * Checks if a given value is a class component.
10
- */
11
- declare const isClassComponent: (component: unknown) => component is React__default.ComponentClass<unknown, unknown>;
12
- /**
13
- * Checks if a given value is a forward ref component.
14
- */
15
- declare const isForwardRefComponent: (component: unknown) => component is React__default.ForwardRefExoticComponent<unknown>;
16
- /**
17
- * Checks if a given value is a valid React component.
18
- */
19
- declare const isReactComponent: (component: unknown) => component is ReactComponent;
20
-
21
- export { isClassComponent, isForwardRefComponent, isFunctionComponent, isReactComponent };