keystone-design-bootstrap 1.0.99 → 1.0.101

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 (63) hide show
  1. package/README.md +4 -0
  2. package/package.json +1 -1
  3. package/src/next/routes/consumer-auth.ts +11 -3
  4. package/src/tracking/PostHogProvider.tsx +40 -1
  5. package/dist/blog-post-vWzW8yFb.d.ts +0 -50
  6. package/dist/contexts/index.d.ts +0 -13
  7. package/dist/contexts/index.js +0 -173
  8. package/dist/contexts/index.js.map +0 -1
  9. package/dist/design_system/components/DynamicFormFields.d.ts +0 -15
  10. package/dist/design_system/components/DynamicFormFields.js +0 -5176
  11. package/dist/design_system/components/DynamicFormFields.js.map +0 -1
  12. package/dist/design_system/elements/index.d.ts +0 -383
  13. package/dist/design_system/elements/index.js +0 -4007
  14. package/dist/design_system/elements/index.js.map +0 -1
  15. package/dist/design_system/logo/keystone-logo.d.ts +0 -6
  16. package/dist/design_system/logo/keystone-logo.js +0 -145
  17. package/dist/design_system/logo/keystone-logo.js.map +0 -1
  18. package/dist/design_system/sections/index.d.ts +0 -233
  19. package/dist/design_system/sections/index.js +0 -20048
  20. package/dist/design_system/sections/index.js.map +0 -1
  21. package/dist/form-C94A_PX_.d.ts +0 -36
  22. package/dist/index.d.ts +0 -70
  23. package/dist/index.js +0 -20608
  24. package/dist/index.js.map +0 -1
  25. package/dist/lib/component-registry.d.ts +0 -13
  26. package/dist/lib/component-registry.js +0 -36
  27. package/dist/lib/component-registry.js.map +0 -1
  28. package/dist/lib/hooks/index.d.ts +0 -83
  29. package/dist/lib/hooks/index.js +0 -182
  30. package/dist/lib/hooks/index.js.map +0 -1
  31. package/dist/lib/server-api.d.ts +0 -67
  32. package/dist/lib/server-api.js +0 -195
  33. package/dist/lib/server-api.js.map +0 -1
  34. package/dist/package-DeHKpQp7.d.ts +0 -121
  35. package/dist/photos-CmBdWiuZ.d.ts +0 -27
  36. package/dist/themes/index.d.ts +0 -17
  37. package/dist/themes/index.js +0 -29
  38. package/dist/themes/index.js.map +0 -1
  39. package/dist/tracking/index.d.ts +0 -254
  40. package/dist/tracking/index.js +0 -550
  41. package/dist/tracking/index.js.map +0 -1
  42. package/dist/types/index.d.ts +0 -313
  43. package/dist/types/index.js +0 -1
  44. package/dist/types/index.js.map +0 -1
  45. package/dist/utils/cx.d.ts +0 -15
  46. package/dist/utils/cx.js +0 -18
  47. package/dist/utils/cx.js.map +0 -1
  48. package/dist/utils/gradient-placeholder.d.ts +0 -7
  49. package/dist/utils/gradient-placeholder.js +0 -59
  50. package/dist/utils/gradient-placeholder.js.map +0 -1
  51. package/dist/utils/is-react-component.d.ts +0 -21
  52. package/dist/utils/is-react-component.js +0 -20
  53. package/dist/utils/is-react-component.js.map +0 -1
  54. package/dist/utils/markdown-toc.d.ts +0 -14
  55. package/dist/utils/markdown-toc.js +0 -29
  56. package/dist/utils/markdown-toc.js.map +0 -1
  57. package/dist/utils/phone-helpers.d.ts +0 -24
  58. package/dist/utils/phone-helpers.js +0 -26
  59. package/dist/utils/phone-helpers.js.map +0 -1
  60. package/dist/utils/photo-helpers.d.ts +0 -38
  61. package/dist/utils/photo-helpers.js +0 -41
  62. package/dist/utils/photo-helpers.js.map +0 -1
  63. package/dist/website-photos-Cl1YqAno.d.ts +0 -21
@@ -1,313 +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-vWzW8yFb.js';
3
- export { C as CompanyInformation, a as CompanyInformationResponse, O as OfferPublic, P as Package, b as PackageItem, S as Service, c as ServiceItem, d as ServiceParams, e as ServiceResponse } from '../package-DeHKpQp7.js';
4
- import { P as PhotoAttachment } from '../photos-CmBdWiuZ.js';
5
- export { a as Photo } from '../photos-CmBdWiuZ.js';
6
- export { F as FormDefinition, a as FormFieldDefinition, b as FormFieldItem, c as FormFieldOption, d as FormType } from '../form-C94A_PX_.js';
7
- export { a as WebsitePhoto, W as WebsitePhotos, b as WebsitePhotosResponse } from '../website-photos-Cl1YqAno.js';
8
-
9
- interface NavItem {
10
- label: string;
11
- href: string;
12
- subtitle?: string;
13
- children?: NavItem[];
14
- }
15
- interface SiteConfig {
16
- site: {
17
- title: string;
18
- description: string;
19
- theme: Theme;
20
- };
21
- navigation: {
22
- header: NavItem[];
23
- footer: NavItem[][];
24
- };
25
- }
26
-
27
- interface Testimonial {
28
- id: number;
29
- reviewer_name: string;
30
- reviewer_title?: string;
31
- company?: string;
32
- rating?: number;
33
- content_markdown: string;
34
- source?: string;
35
- source_url?: string;
36
- featured: boolean;
37
- reviewed_at: string;
38
- created_at: string;
39
- updated_at: string;
40
- photo_attachments?: PhotoAttachment[];
41
- }
42
- interface TestimonialParams {
43
- source?: string;
44
- rating?: number;
45
- verified?: boolean;
46
- featured?: boolean;
47
- page?: number;
48
- per_page?: number;
49
- }
50
- type TestimonialResponse = Testimonial[];
51
-
52
- interface TeamMember {
53
- id: number;
54
- name: string;
55
- position: string;
56
- bio_markdown: string;
57
- experience_markdown: string;
58
- email: string;
59
- phone: string;
60
- sort_order: number;
61
- featured: boolean;
62
- specialties_markdown: string;
63
- education_markdown: string;
64
- certifications_markdown: string;
65
- linkedin_url: string;
66
- twitter_url: string;
67
- photo_attachments?: PhotoAttachment[];
68
- }
69
- interface TeamMemberParams {
70
- featured?: boolean;
71
- sort_order?: number;
72
- page?: number;
73
- per_page?: number;
74
- }
75
- type TeamMemberResponse = TeamMember[];
76
-
77
- interface Location {
78
- id: number;
79
- name: string;
80
- slug: string;
81
- address_line_1: string;
82
- address_line_2?: string;
83
- city: string;
84
- state: string;
85
- zip_code: string;
86
- country?: string;
87
- latitude?: number;
88
- longitude?: number;
89
- phone?: string;
90
- email?: string;
91
- description_markdown?: string;
92
- business_hours?: string;
93
- is_primary: boolean;
94
- active: boolean;
95
- sort_order: number;
96
- created_at: string;
97
- updated_at: string;
98
- photo_attachments?: PhotoAttachment[];
99
- }
100
- interface LocationParams {
101
- active?: boolean;
102
- is_primary?: boolean;
103
- sort_order?: number;
104
- page?: number;
105
- per_page?: number;
106
- }
107
- type LocationResponse = Location[];
108
-
109
- interface SocialPost {
110
- id: number;
111
- platform: string;
112
- content_markdown: string;
113
- posted_at: string;
114
- status?: string;
115
- created_at: string;
116
- updated_at: string;
117
- /** Image URLs from photo_attachments (preferred for display) */
118
- image_urls?: string[];
119
- /** Video URLs from photo_attachments (exclude these when choosing img src) */
120
- video_urls?: string[];
121
- /** Photo attachments (same pattern as blog post, team member, etc.) */
122
- photo_attachments?: PhotoAttachment[];
123
- /** Legacy; prefer image_urls / photo_attachments */
124
- media_urls?: {
125
- images?: string[];
126
- videos?: string[];
127
- };
128
- engagement_metrics?: {
129
- likes?: number;
130
- comments?: number;
131
- shares?: number;
132
- views?: number;
133
- };
134
- /** Permalink to the post on the platform when available; only link when present to avoid broken links */
135
- external_post_url?: string | null;
136
- }
137
- interface SocialPostParams {
138
- platform?: string;
139
- featured?: boolean;
140
- page?: number;
141
- per_page?: number;
142
- }
143
- type SocialPostResponse = SocialPost[];
144
-
145
- interface FaqQuestion {
146
- id: number;
147
- question: string;
148
- answer: string;
149
- answer_markdown?: string;
150
- category_slug?: string;
151
- featured: boolean;
152
- sort_order: number;
153
- created_at: string;
154
- updated_at: string;
155
- photo_attachments?: PhotoAttachment[];
156
- }
157
- interface FaqCategory {
158
- id: number;
159
- name: string;
160
- slug: string;
161
- description?: string;
162
- active: boolean;
163
- sort_order: number;
164
- questions_count: number;
165
- }
166
- interface FaqParams {
167
- category_slug?: string;
168
- featured?: boolean;
169
- q?: string;
170
- page?: number;
171
- per_page?: number;
172
- }
173
- type FaqResponse = FaqQuestion[];
174
- type FaqCategoryResponse = FaqCategory[];
175
-
176
- interface JobPosting {
177
- id: number;
178
- title: string;
179
- slug: string;
180
- description_markdown: string;
181
- requirements_markdown?: string;
182
- benefits_markdown?: string;
183
- employment_type: string;
184
- location: string;
185
- experience_level?: string;
186
- remote_ok?: boolean;
187
- salary_range?: string;
188
- posted_at: string;
189
- expires_at?: string;
190
- status: 'active' | 'inactive' | 'expired';
191
- featured: boolean;
192
- created_at: string;
193
- updated_at: string;
194
- photo_attachments?: PhotoAttachment[];
195
- }
196
- interface JobPostingParams {
197
- featured?: boolean;
198
- employment_type?: string;
199
- location?: string;
200
- q?: string;
201
- page?: number;
202
- per_page?: number;
203
- }
204
- type JobPostingResponse = JobPosting[];
205
-
206
- /** Consumer and messaging types (aligned with Rails ConsumerSerializer and conversation endpoints). */
207
- interface Consumer {
208
- id: number;
209
- email: string | null;
210
- phone: string | null;
211
- primary_identifier: string | null;
212
- contacts?: ConsumerContact[];
213
- }
214
- interface ConsumerContact {
215
- id: number;
216
- display_name: string;
217
- account?: {
218
- id: number;
219
- name: string;
220
- slug?: string;
221
- };
222
- }
223
- interface ConversationSummary {
224
- contact_id: number;
225
- business?: {
226
- id: number;
227
- name: string;
228
- company_name?: string;
229
- };
230
- last_message_at: string | null;
231
- last_message_preview?: string | null;
232
- message_count: number;
233
- }
234
- interface Message {
235
- id: number;
236
- body: string | null;
237
- /** "outbound" = sent by the business; "inbound" = sent by the contact/member. */
238
- direction: 'inbound' | 'outbound';
239
- sender_type: 'contact' | 'agent' | 'human';
240
- sender_display_name?: string;
241
- created_at: string;
242
- }
243
- interface ContactSummary {
244
- id: number;
245
- display_name: string;
246
- business?: {
247
- id: number;
248
- name: string;
249
- company_name?: string;
250
- };
251
- }
252
-
253
- interface ContactInfo {
254
- id?: number;
255
- about_text_markdown?: string;
256
- business_hours?: Record<string, {
257
- open: string;
258
- close: string;
259
- }>;
260
- company_name?: string;
261
- description_markdown?: string;
262
- facebook_url?: string;
263
- favicon_url?: string;
264
- founded_year?: string;
265
- google_my_business_url?: string;
266
- google_reviews_url?: string;
267
- instagram_url?: string;
268
- linkedin_url?: string;
269
- mission_statement_markdown?: string;
270
- pinterest_url?: string;
271
- primary_address_line_1?: string;
272
- primary_address_line_2?: string;
273
- primary_city?: string;
274
- primary_country?: string;
275
- primary_email?: string;
276
- primary_phone?: string;
277
- primary_state?: string;
278
- primary_zip_code?: string;
279
- sales_email?: string;
280
- stats_markdown?: string;
281
- support_email?: string;
282
- tagline?: string;
283
- tiktok_url?: string;
284
- tripadvisor_url?: string;
285
- twitter_url?: string;
286
- values_markdown?: string;
287
- yelp_url?: string;
288
- youtube_url?: string;
289
- photo_attachments?: PhotoAttachment[];
290
- }
291
- interface ContactFormSubmission {
292
- id: number;
293
- name: string;
294
- email: string;
295
- phone?: string;
296
- message: string;
297
- source: string;
298
- created_at: string;
299
- }
300
- interface ContactFormData {
301
- name: string;
302
- email: string;
303
- phone?: string;
304
- message: string;
305
- source?: string;
306
- }
307
- type ContactResponse = ContactInfo | null;
308
- interface ContactFormResponse {
309
- message: string;
310
- data: ContactFormSubmission;
311
- }
312
-
313
- export { type Consumer, type ConsumerContact, type ContactFormData, type ContactFormResponse, type ContactFormSubmission, type ContactInfo, type ContactResponse, type ContactSummary, type ConversationSummary, type FaqCategory, type FaqCategoryResponse, type FaqParams, type FaqQuestion, type FaqResponse, type JobPosting, type JobPostingParams, type JobPostingResponse, type Location, type LocationParams, type LocationResponse, type Message, 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 +0,0 @@
1
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -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 };
package/dist/utils/cx.js DELETED
@@ -1,18 +0,0 @@
1
- // src/utils/cx.ts
2
- import { extendTailwindMerge } from "tailwind-merge";
3
- var twMerge = extendTailwindMerge({
4
- extend: {
5
- theme: {
6
- text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
7
- }
8
- }
9
- });
10
- var cx = twMerge;
11
- function sortCx(classes) {
12
- return classes;
13
- }
14
- export {
15
- cx,
16
- sortCx
17
- };
18
- //# sourceMappingURL=cx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/cx.ts"],"sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n\n"],"mappings":";AAAA,SAAS,2BAA2B;AAEpC,IAAM,UAAU,oBAAoB;AAAA,EAChC,QAAQ;AAAA,IACJ,OAAO;AAAA,MACH,MAAM,CAAC,cAAc,cAAc,cAAc,cAAc,cAAc,aAAa;AAAA,IAC9F;AAAA,EACJ;AACJ,CAAC;AAMM,IAAM,KAAK;AAOX,SAAS,OAAsH,SAAe;AACjJ,SAAO;AACX;","names":[]}
@@ -1,7 +0,0 @@
1
- /**
2
- * Generates a beautiful gradient SVG data URL using the full color palette
3
- * Each seed (post ID or index) will consistently return the same gradient
4
- */
5
- declare const getGradientUrl: (seed: string | number) => string;
6
-
7
- export { getGradientUrl };
@@ -1,59 +0,0 @@
1
- // src/utils/gradient-placeholder.ts
2
- var getGradientUrl = (seed) => {
3
- const gradients = [
4
- // Purple gradients (like from-purple-200 to-purple-300)
5
- ["rgb(233, 213, 255)", "rgb(221, 214, 254)", "rgb(196, 181, 253)"],
6
- // purple-200 to purple-300
7
- ["rgb(250, 232, 255)", "rgb(251, 207, 232)", "rgb(244, 114, 182)"],
8
- // pink-200 to pink-300 via pink-400
9
- // Blue gradients (like from-blue-200 to-blue-300)
10
- ["rgb(191, 219, 254)", "rgb(147, 197, 253)", "rgb(96, 165, 250)"],
11
- // blue-200 to blue-300 to blue-400
12
- // Green gradients (like from-green-200 to-green-300)
13
- ["rgb(187, 247, 208)", "rgb(134, 239, 172)", "rgb(74, 222, 128)"],
14
- // green-200 to green-300 to green-400
15
- // Pink to Purple (like from-pink-400 to-purple-500)
16
- ["rgb(244, 114, 182)", "rgb(217, 70, 239)", "rgb(168, 85, 247)"],
17
- // pink-400 to purple-500
18
- // Blue to Purple (like from-blue-500 to-purple-600)
19
- ["rgb(59, 130, 246)", "rgb(147, 51, 234)", "rgb(147, 51, 234)"],
20
- // blue-500 to purple-600
21
- // Indigo to Purple (like from-indigo-500 to-purple-600)
22
- ["rgb(99, 102, 241)", "rgb(139, 92, 246)", "rgb(147, 51, 234)"],
23
- // indigo-500 to purple-600
24
- // Orange gradients (like from-orange-200 to-orange-300)
25
- ["rgb(254, 215, 170)", "rgb(253, 186, 116)", "rgb(251, 146, 60)"],
26
- // orange-200 to orange-300 to orange-400
27
- // Purple to Pink (like from-purple-400 to-pink-400)
28
- ["rgb(192, 132, 252)", "rgb(232, 121, 249)", "rgb(244, 114, 182)"],
29
- // purple-400 to pink-400
30
- // Softer blue-green blend
31
- ["rgb(165, 243, 252)", "rgb(103, 232, 249)", "rgb(134, 239, 172)"],
32
- // cyan-300 to green-400
33
- // Warm pink-orange
34
- ["rgb(251, 207, 232)", "rgb(254, 202, 202)", "rgb(253, 186, 116)"],
35
- // pink-200 to orange-300
36
- // Cool indigo-blue
37
- ["rgb(199, 210, 254)", "rgb(165, 180, 252)", "rgb(129, 140, 248)"]
38
- // indigo-200 to indigo-400
39
- ];
40
- const index = typeof seed === "string" ? seed.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0) % gradients.length : Number(seed) % gradients.length;
41
- const [color1, color2, color3] = gradients[index];
42
- const svg = `
43
- <svg width="600" height="400" xmlns="http://www.w3.org/2000/svg">
44
- <defs>
45
- <linearGradient id="grad${index}" x1="0%" y1="0%" x2="100%" y2="100%">
46
- <stop offset="0%" style="stop-color:${color1};stop-opacity:1" />
47
- <stop offset="50%" style="stop-color:${color2};stop-opacity:1" />
48
- <stop offset="100%" style="stop-color:${color3};stop-opacity:1" />
49
- </linearGradient>
50
- </defs>
51
- <rect width="600" height="400" fill="url(#grad${index})" />
52
- </svg>
53
- `.trim();
54
- return `data:image/svg+xml;base64,${btoa(svg)}`;
55
- };
56
- export {
57
- getGradientUrl
58
- };
59
- //# sourceMappingURL=gradient-placeholder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/gradient-placeholder.ts"],"sourcesContent":["/**\n * Generates a beautiful gradient SVG data URL using the full color palette\n * Each seed (post ID or index) will consistently return the same gradient\n */\nexport const getGradientUrl = (seed: string | number): string => {\n // Colors match Tailwind's default palette (purple, pink, blue, green, orange, indigo)\n const gradients = [\n // Purple gradients (like from-purple-200 to-purple-300)\n ['rgb(233, 213, 255)', 'rgb(221, 214, 254)', 'rgb(196, 181, 253)'], // purple-200 to purple-300\n ['rgb(250, 232, 255)', 'rgb(251, 207, 232)', 'rgb(244, 114, 182)'], // pink-200 to pink-300 via pink-400\n // Blue gradients (like from-blue-200 to-blue-300)\n ['rgb(191, 219, 254)', 'rgb(147, 197, 253)', 'rgb(96, 165, 250)'], // blue-200 to blue-300 to blue-400\n // Green gradients (like from-green-200 to-green-300)\n ['rgb(187, 247, 208)', 'rgb(134, 239, 172)', 'rgb(74, 222, 128)'], // green-200 to green-300 to green-400\n // Pink to Purple (like from-pink-400 to-purple-500)\n ['rgb(244, 114, 182)', 'rgb(217, 70, 239)', 'rgb(168, 85, 247)'], // pink-400 to purple-500\n // Blue to Purple (like from-blue-500 to-purple-600)\n ['rgb(59, 130, 246)', 'rgb(147, 51, 234)', 'rgb(147, 51, 234)'], // blue-500 to purple-600\n // Indigo to Purple (like from-indigo-500 to-purple-600)\n ['rgb(99, 102, 241)', 'rgb(139, 92, 246)', 'rgb(147, 51, 234)'], // indigo-500 to purple-600\n // Orange gradients (like from-orange-200 to-orange-300)\n ['rgb(254, 215, 170)', 'rgb(253, 186, 116)', 'rgb(251, 146, 60)'], // orange-200 to orange-300 to orange-400\n // Purple to Pink (like from-purple-400 to-pink-400)\n ['rgb(192, 132, 252)', 'rgb(232, 121, 249)', 'rgb(244, 114, 182)'], // purple-400 to pink-400\n // Softer blue-green blend\n ['rgb(165, 243, 252)', 'rgb(103, 232, 249)', 'rgb(134, 239, 172)'], // cyan-300 to green-400\n // Warm pink-orange\n ['rgb(251, 207, 232)', 'rgb(254, 202, 202)', 'rgb(253, 186, 116)'], // pink-200 to orange-300\n // Cool indigo-blue\n ['rgb(199, 210, 254)', 'rgb(165, 180, 252)', 'rgb(129, 140, 248)'], // indigo-200 to indigo-400\n ];\n \n // Calculate consistent index from seed\n const index = typeof seed === 'string' \n ? seed.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0) % gradients.length\n : Number(seed) % gradients.length;\n \n const [color1, color2, color3] = gradients[index];\n \n // Generate SVG with gradient (diagonal like bg-gradient-to-br)\n const svg = `\n <svg width=\"600\" height=\"400\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"grad${index}\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" style=\"stop-color:${color1};stop-opacity:1\" />\n <stop offset=\"50%\" style=\"stop-color:${color2};stop-opacity:1\" />\n <stop offset=\"100%\" style=\"stop-color:${color3};stop-opacity:1\" />\n </linearGradient>\n </defs>\n <rect width=\"600\" height=\"400\" fill=\"url(#grad${index})\" />\n </svg>\n `.trim();\n \n // Convert to base64 data URL\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n};\n\n"],"mappings":";AAIO,IAAM,iBAAiB,CAAC,SAAkC;AAE/D,QAAM,YAAY;AAAA;AAAA,IAEhB,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA,IACjE,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA;AAAA,IAEjE,CAAC,sBAAsB,sBAAsB,mBAAmB;AAAA;AAAA;AAAA,IAEhE,CAAC,sBAAsB,sBAAsB,mBAAmB;AAAA;AAAA;AAAA,IAEhE,CAAC,sBAAsB,qBAAqB,mBAAmB;AAAA;AAAA;AAAA,IAE/D,CAAC,qBAAqB,qBAAqB,mBAAmB;AAAA;AAAA;AAAA,IAE9D,CAAC,qBAAqB,qBAAqB,mBAAmB;AAAA;AAAA;AAAA,IAE9D,CAAC,sBAAsB,sBAAsB,mBAAmB;AAAA;AAAA;AAAA,IAEhE,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA;AAAA,IAEjE,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA;AAAA,IAEjE,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA;AAAA,IAEjE,CAAC,sBAAsB,sBAAsB,oBAAoB;AAAA;AAAA,EACnE;AAGA,QAAM,QAAQ,OAAO,SAAS,WAC1B,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI,UAAU,SAC9E,OAAO,IAAI,IAAI,UAAU;AAE7B,QAAM,CAAC,QAAQ,QAAQ,MAAM,IAAI,UAAU,KAAK;AAGhD,QAAM,MAAM;AAAA;AAAA;AAAA,kCAGoB,KAAK;AAAA,gDACS,MAAM;AAAA,iDACL,MAAM;AAAA,kDACL,MAAM;AAAA;AAAA;AAAA,sDAGF,KAAK;AAAA;AAAA,IAEvD,KAAK;AAGP,SAAO,6BAA6B,KAAK,GAAG,CAAC;AAC/C;","names":[]}
@@ -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 };
@@ -1,20 +0,0 @@
1
- // src/utils/is-react-component.ts
2
- var isFunctionComponent = (component) => {
3
- return typeof component === "function";
4
- };
5
- var isClassComponent = (component) => {
6
- return typeof component === "function" && typeof component === "function" && component.prototype !== void 0 && component.prototype !== null && (!!component.prototype.isReactComponent || !!component.prototype.render);
7
- };
8
- var isForwardRefComponent = (component) => {
9
- return typeof component === "object" && component !== null && "$$typeof" in component && component.$$typeof !== void 0 && component.$$typeof !== null && component.$$typeof.toString() === "Symbol(react.forward_ref)";
10
- };
11
- var isReactComponent = (component) => {
12
- return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);
13
- };
14
- export {
15
- isClassComponent,
16
- isForwardRefComponent,
17
- isFunctionComponent,
18
- isReactComponent
19
- };
20
- //# sourceMappingURL=is-react-component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/is-react-component.ts"],"sourcesContent":["import type React from \"react\";\n\n// Use unknown for inputs since we're checking if an unknown value is a React component\n// The return types use proper type guards to narrow the type after validation\ntype ReactComponent = React.FC<unknown> | React.ComponentClass<unknown, unknown>;\n\n/**\n * Checks if a given value is a function component.\n */\nexport const isFunctionComponent = (component: unknown): component is React.FC<unknown> => {\n return typeof component === \"function\";\n};\n\n/**\n * Checks if a given value is a class component.\n */\nexport const isClassComponent = (component: unknown): component is React.ComponentClass<unknown, unknown> => {\n return typeof component === \"function\" && \n typeof component === \"function\" && \n component.prototype !== undefined && \n component.prototype !== null &&\n (!!component.prototype.isReactComponent || !!component.prototype.render);\n};\n\n/**\n * Checks if a given value is a forward ref component.\n */\nexport const isForwardRefComponent = (component: unknown): component is React.ForwardRefExoticComponent<unknown> => {\n return typeof component === \"object\" && \n component !== null && \n '$$typeof' in component &&\n component.$$typeof !== undefined &&\n component.$$typeof !== null &&\n component.$$typeof.toString() === \"Symbol(react.forward_ref)\";\n};\n\n/**\n * Checks if a given value is a valid React component.\n */\nexport const isReactComponent = (component: unknown): component is ReactComponent => {\n return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);\n};\n"],"mappings":";AASO,IAAM,sBAAsB,CAAC,cAAuD;AACvF,SAAO,OAAO,cAAc;AAChC;AAKO,IAAM,mBAAmB,CAAC,cAA4E;AACzG,SAAO,OAAO,cAAc,cACrB,OAAO,cAAc,cACrB,UAAU,cAAc,UACxB,UAAU,cAAc,SACvB,CAAC,CAAC,UAAU,UAAU,oBAAoB,CAAC,CAAC,UAAU,UAAU;AAC5E;AAKO,IAAM,wBAAwB,CAAC,cAA8E;AAChH,SAAO,OAAO,cAAc,YACrB,cAAc,QACd,cAAc,aACd,UAAU,aAAa,UACvB,UAAU,aAAa,QACvB,UAAU,SAAS,SAAS,MAAM;AAC7C;AAKO,IAAM,mBAAmB,CAAC,cAAoD;AACjF,SAAO,oBAAoB,SAAS,KAAK,sBAAsB,SAAS,KAAK,iBAAiB,SAAS;AAC3G;","names":[]}
@@ -1,14 +0,0 @@
1
- /**
2
- * Utility functions for extracting table of contents from markdown
3
- */
4
- interface TableOfContentsItem {
5
- id: string;
6
- title: string;
7
- level: number;
8
- }
9
- /**
10
- * Extract headings from markdown content and generate table of contents
11
- */
12
- declare function extractTableOfContents(markdown: string): TableOfContentsItem[];
13
-
14
- export { type TableOfContentsItem, extractTableOfContents };
@@ -1,29 +0,0 @@
1
- // src/utils/markdown-toc.ts
2
- function slugify(text) {
3
- return text.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
4
- }
5
- function extractTableOfContents(markdown) {
6
- if (!markdown) return [];
7
- const toc = [];
8
- const lines = markdown.split("\n");
9
- for (const line of lines) {
10
- const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
11
- if (headingMatch) {
12
- const level = headingMatch[1].length;
13
- const title = headingMatch[2].trim();
14
- if (level >= 2 && level <= 3) {
15
- const id = slugify(title);
16
- toc.push({
17
- id,
18
- title,
19
- level
20
- });
21
- }
22
- }
23
- }
24
- return toc;
25
- }
26
- export {
27
- extractTableOfContents
28
- };
29
- //# sourceMappingURL=markdown-toc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/markdown-toc.ts"],"sourcesContent":["/**\n * Utility functions for extracting table of contents from markdown\n */\n\nexport interface TableOfContentsItem {\n id: string;\n title: string;\n level: number;\n}\n\n/**\n * Generate a URL-friendly ID from a heading text\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '') // Remove special characters\n .replace(/[\\s_-]+/g, '-') // Replace spaces and underscores with hyphens\n .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n}\n\n/**\n * Extract headings from markdown content and generate table of contents\n */\nexport function extractTableOfContents(markdown: string): TableOfContentsItem[] {\n if (!markdown) return [];\n\n const toc: TableOfContentsItem[] = [];\n const lines = markdown.split('\\n');\n\n for (const line of lines) {\n // Match markdown headings (##, ###, etc.)\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n const title = headingMatch[2].trim();\n \n // Only include h2 and h3 headings in TOC\n if (level >= 2 && level <= 3) {\n const id = slugify(title);\n toc.push({\n id,\n title,\n level,\n });\n }\n }\n }\n\n return toc;\n}\n\n\n"],"mappings":";AAaA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KACJ,YAAY,EACZ,KAAK,EACL,QAAQ,aAAa,EAAE,EACvB,QAAQ,YAAY,GAAG,EACvB,QAAQ,YAAY,EAAE;AAC3B;AAKO,SAAS,uBAAuB,UAAyC;AAC9E,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAM,MAA6B,CAAC;AACpC,QAAM,QAAQ,SAAS,MAAM,IAAI;AAEjC,aAAW,QAAQ,OAAO;AAExB,UAAM,eAAe,KAAK,MAAM,mBAAmB;AACnD,QAAI,cAAc;AAChB,YAAM,QAAQ,aAAa,CAAC,EAAE;AAC9B,YAAM,QAAQ,aAAa,CAAC,EAAE,KAAK;AAGnC,UAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,cAAM,KAAK,QAAQ,KAAK;AACxB,YAAI,KAAK;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,24 +0,0 @@
1
- /**
2
- * List of countries with their respective country code, flag, phone code, and phone mask.
3
- */
4
- declare const countries: ({
5
- name: string;
6
- code: string;
7
- flag: string;
8
- phoneCode: string;
9
- phoneMask: string;
10
- } | {
11
- name: string;
12
- code: string;
13
- flag: string;
14
- phoneCode: string;
15
- phoneMask?: undefined;
16
- })[];
17
-
18
- type Country = (typeof countries)[0];
19
- /** Get national-format mask from country by stripping the country code prefix (e.g. "+1 (###) ###-####" → "(###) ###-####"). */
20
- declare function getNationalMask(country: Country | undefined): string;
21
- /** Format a raw digit string into a mask pattern where '#' represents one digit. No trailing literals so backspace works naturally. */
22
- declare function formatDigitsToMask(digits: string, mask: string): string;
23
-
24
- export { formatDigitsToMask, getNationalMask };
@@ -1,26 +0,0 @@
1
- // src/utils/phone-helpers.ts
2
- function getNationalMask(country) {
3
- if (!(country == null ? void 0 : country.phoneMask)) return "";
4
- const code = country.phoneCode.startsWith("+") ? country.phoneCode : `+${country.phoneCode}`;
5
- const escaped = code.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
- return country.phoneMask.replace(new RegExp(`^\\s*${escaped}[\\s-]*`), "").trim();
7
- }
8
- function formatDigitsToMask(digits, mask) {
9
- if (digits.length === 0) return "";
10
- let i = 0;
11
- let out = "";
12
- for (const c of mask) {
13
- if (c === "#") {
14
- if (i < digits.length) out += digits[i++];
15
- else break;
16
- } else if (i < digits.length) {
17
- out += c;
18
- }
19
- }
20
- return out;
21
- }
22
- export {
23
- formatDigitsToMask,
24
- getNationalMask
25
- };
26
- //# sourceMappingURL=phone-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/phone-helpers.ts"],"sourcesContent":["import type countries from './countries';\n\ntype Country = (typeof countries)[0];\n\n/** Get national-format mask from country by stripping the country code prefix (e.g. \"+1 (###) ###-####\" → \"(###) ###-####\"). */\nexport function getNationalMask(country: Country | undefined): string {\n if (!country?.phoneMask) return '';\n const code = country.phoneCode.startsWith('+') ? country.phoneCode : `+${country.phoneCode}`;\n const escaped = code.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return country.phoneMask.replace(new RegExp(`^\\\\s*${escaped}[\\\\s-]*`), '').trim();\n}\n\n/** Format a raw digit string into a mask pattern where '#' represents one digit. No trailing literals so backspace works naturally. */\nexport function formatDigitsToMask(digits: string, mask: string): string {\n if (digits.length === 0) return '';\n let i = 0;\n let out = '';\n for (const c of mask) {\n if (c === '#') {\n if (i < digits.length) out += digits[i++];\n else break;\n } else if (i < digits.length) {\n out += c;\n }\n }\n return out;\n}\n"],"mappings":";AAKO,SAAS,gBAAgB,SAAsC;AACpE,MAAI,EAAC,mCAAS,WAAW,QAAO;AAChC,QAAM,OAAO,QAAQ,UAAU,WAAW,GAAG,IAAI,QAAQ,YAAY,IAAI,QAAQ,SAAS;AAC1F,QAAM,UAAU,KAAK,QAAQ,uBAAuB,MAAM;AAC1D,SAAO,QAAQ,UAAU,QAAQ,IAAI,OAAO,QAAQ,OAAO,SAAS,GAAG,EAAE,EAAE,KAAK;AAClF;AAGO,SAAS,mBAAmB,QAAgB,MAAsB;AACvE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,IAAI;AACR,MAAI,MAAM;AACV,aAAW,KAAK,MAAM;AACpB,QAAI,MAAM,KAAK;AACb,UAAI,IAAI,OAAO,OAAQ,QAAO,OAAO,GAAG;AAAA,UACnC;AAAA,IACP,WAAW,IAAI,OAAO,QAAQ;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,38 +0,0 @@
1
- import { P as PhotoAttachment } from '../photos-CmBdWiuZ.js';
2
- import { W as WebsitePhotos } from '../website-photos-Cl1YqAno.js';
3
-
4
- /**
5
- * Helper functions for extracting photo URLs from photo associations
6
- */
7
-
8
- /**
9
- * True if the URL looks like a video by path extension. Used to avoid using video URLs in img src.
10
- */
11
- declare function isVideoUrl(url: string | null | undefined): boolean;
12
- /**
13
- * Get the best available photo URL from a photos array
14
- * Priority: featured photo > first photo > fallback
15
- */
16
- declare function getPhotoUrl(photos?: PhotoAttachment[]): string | null;
17
- /**
18
- * Get avatar URL for team members or authors.
19
- * Returns a URL only when there is a real photo in attachments; otherwise null.
20
- * Callers should use PhotoWithFallback (gradient fallback) or Avatar with initials when null.
21
- */
22
- /** Optional fallbackId/name reserved for future use (e.g. deterministic fallback). */
23
- declare function getAvatarUrl(photos?: PhotoAttachment[], _fallbackId?: number | string, _name?: string): string | null;
24
- /**
25
- * Get featured image URL for blog posts
26
- */
27
- declare function getFeaturedImageUrl(photos?: PhotoAttachment[]): string | null;
28
- /**
29
- * Get logo URL from website_photos API (which aggregates from account_photos)
30
- *
31
- * The website_photos API endpoint returns logos from account_photos with photo_type: 'logo',
32
- * with industry fallback. This is the primary and only source for logos.
33
- *
34
- * Returns undefined if no logo is available (for PhotoWithFallback gradient fallback)
35
- */
36
- declare function getLogoUrl(websitePhotos?: WebsitePhotos | null): string | undefined;
37
-
38
- export { PhotoAttachment, getAvatarUrl, getFeaturedImageUrl, getLogoUrl, getPhotoUrl, isVideoUrl };