@fayz-ai/plugin-linkinbio 0.9.1 → 0.10.1
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/dist/public/{data.d.ts → data/index.d.ts} +2 -2
- package/dist/public/data/index.d.ts.map +1 -0
- package/dist/public/{data.supabase.d.ts → data/supabase.d.ts} +2 -2
- package/dist/public/data/supabase.d.ts.map +1 -0
- package/dist/public/index.d.ts +8 -8
- package/dist/public/index.d.ts.map +1 -1
- package/dist/public/index.js +2 -2
- package/dist/public/index.js.map +1 -1
- package/dist/public/{registry.d.ts → lib/registry.d.ts} +1 -1
- package/dist/public/lib/registry.d.ts.map +1 -0
- package/dist/public/{utils.d.ts → lib/utils.d.ts} +1 -1
- package/dist/public/lib/utils.d.ts.map +1 -0
- package/dist/public/views/BioPage.d.ts.map +1 -0
- package/dist/public/{BioPageRenderer.d.ts → views/BioPageRenderer.d.ts} +1 -1
- package/dist/public/views/BioPageRenderer.d.ts.map +1 -0
- package/package.json +12 -15
- package/dist/index.cjs +0 -33
- package/dist/index.cjs.map +0 -1
- package/dist/public/BioPage.d.ts.map +0 -1
- package/dist/public/BioPageRenderer.d.ts.map +0 -1
- package/dist/public/__tests__/manifest.test.d.ts +0 -2
- package/dist/public/__tests__/manifest.test.d.ts.map +0 -1
- package/dist/public/data.d.ts.map +0 -1
- package/dist/public/data.supabase.d.ts.map +0 -1
- package/dist/public/index.cjs +0 -1984
- package/dist/public/index.cjs.map +0 -1
- package/dist/public/registry.d.ts.map +0 -1
- package/dist/public/utils.d.ts.map +0 -1
- package/src/index.ts +0 -56
- package/src/public/BioPage.tsx +0 -123
- package/src/public/BioPageRenderer.tsx +0 -251
- package/src/public/__tests__/manifest.test.ts +0 -39
- package/src/public/blocks/BioSection.tsx +0 -66
- package/src/public/blocks/CTASection.tsx +0 -56
- package/src/public/blocks/EmbedSection.tsx +0 -53
- package/src/public/blocks/FeaturedBlock.tsx +0 -70
- package/src/public/blocks/GallerySection.tsx +0 -148
- package/src/public/blocks/HeroSection.tsx +0 -107
- package/src/public/blocks/LinksBlock.tsx +0 -80
- package/src/public/blocks/MusicReleasesBlock.tsx +0 -83
- package/src/public/blocks/ProfileHeader.tsx +0 -174
- package/src/public/blocks/ProjectSection.tsx +0 -158
- package/src/public/blocks/SocialLinksSection.tsx +0 -125
- package/src/public/blocks/StatsSection.tsx +0 -46
- package/src/public/blocks/TextSection.tsx +0 -29
- package/src/public/blocks/TourDatesBlock.tsx +0 -83
- package/src/public/blocks/VenueListSection.tsx +0 -91
- package/src/public/blocks/VideoGridSection.tsx +0 -105
- package/src/public/blocks/index.ts +0 -16
- package/src/public/components/Carousel.tsx +0 -90
- package/src/public/components/MediaKit.tsx +0 -249
- package/src/public/components/PlatformIcon.tsx +0 -56
- package/src/public/components/Reveal.tsx +0 -58
- package/src/public/context.tsx +0 -30
- package/src/public/createPublicLinkInBioPlugin.ts +0 -81
- package/src/public/data.supabase.ts +0 -31
- package/src/public/data.ts +0 -29
- package/src/public/index.ts +0 -75
- package/src/public/registry.ts +0 -40
- package/src/public/utils.ts +0 -102
- package/src/types.ts +0 -337
- /package/dist/public/{BioPage.d.ts → views/BioPage.d.ts} +0 -0
package/src/public/utils.ts
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { Instagram, Music, Youtube, Globe, Mail, Phone, Facebook, Twitter } from 'lucide-react';
|
|
2
|
-
import type { BioBranding } from '../types';
|
|
3
|
-
|
|
4
|
-
// Lightweight markdown → HTML renderer (bold, italic, links, paragraphs)
|
|
5
|
-
export function renderMarkdown(md: string): string {
|
|
6
|
-
return md
|
|
7
|
-
.split(/\n\n+/)
|
|
8
|
-
.map((block) => {
|
|
9
|
-
const html = block
|
|
10
|
-
.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>')
|
|
11
|
-
.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
|
12
|
-
.replace(/\*(.+?)\*/g, '<em>$1</em>')
|
|
13
|
-
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>')
|
|
14
|
-
.replace(/\n/g, '<br />');
|
|
15
|
-
return `<p>${html}</p>`;
|
|
16
|
-
})
|
|
17
|
-
.join('');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const platformColors: Record<string, string> = {
|
|
21
|
-
instagram: '#E4405F',
|
|
22
|
-
spotify: '#1DB954',
|
|
23
|
-
soundcloud: '#FF5500',
|
|
24
|
-
youtube: '#FF0000',
|
|
25
|
-
tiktok: '#000000',
|
|
26
|
-
whatsapp: '#25D366',
|
|
27
|
-
email: '#EA4335',
|
|
28
|
-
twitter: '#1DA1F2',
|
|
29
|
-
facebook: '#1877F2',
|
|
30
|
-
bandcamp: '#629AA9',
|
|
31
|
-
mixcloud: '#5000FF',
|
|
32
|
-
beatport: '#94D500',
|
|
33
|
-
'apple-music': '#FC3C44',
|
|
34
|
-
deezer: '#FEAA2D',
|
|
35
|
-
telegram: '#0088CC',
|
|
36
|
-
website: '#888888',
|
|
37
|
-
custom: '#888888',
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export const platformLabels: Record<string, string> = {
|
|
41
|
-
instagram: 'Instagram',
|
|
42
|
-
spotify: 'Spotify',
|
|
43
|
-
soundcloud: 'SoundCloud',
|
|
44
|
-
youtube: 'YouTube',
|
|
45
|
-
tiktok: 'TikTok',
|
|
46
|
-
whatsapp: 'WhatsApp',
|
|
47
|
-
email: 'Email',
|
|
48
|
-
twitter: 'Twitter / X',
|
|
49
|
-
facebook: 'Facebook',
|
|
50
|
-
bandcamp: 'Bandcamp',
|
|
51
|
-
mixcloud: 'Mixcloud',
|
|
52
|
-
beatport: 'Beatport',
|
|
53
|
-
'apple-music': 'Apple Music',
|
|
54
|
-
deezer: 'Deezer',
|
|
55
|
-
telegram: 'Telegram',
|
|
56
|
-
website: 'Website',
|
|
57
|
-
custom: 'Link',
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const platformIconMap: Record<string, typeof Instagram> = {
|
|
61
|
-
instagram: Instagram,
|
|
62
|
-
spotify: Music,
|
|
63
|
-
soundcloud: Music,
|
|
64
|
-
youtube: Youtube,
|
|
65
|
-
tiktok: Music,
|
|
66
|
-
whatsapp: Phone,
|
|
67
|
-
email: Mail,
|
|
68
|
-
twitter: Twitter,
|
|
69
|
-
facebook: Facebook,
|
|
70
|
-
bandcamp: Music,
|
|
71
|
-
mixcloud: Music,
|
|
72
|
-
beatport: Music,
|
|
73
|
-
'apple-music': Music,
|
|
74
|
-
deezer: Music,
|
|
75
|
-
telegram: Globe,
|
|
76
|
-
website: Globe,
|
|
77
|
-
custom: Globe,
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
export const borderRadiusMap: Record<string, string> = {
|
|
81
|
-
none: '0px',
|
|
82
|
-
sm: '4px',
|
|
83
|
-
md: '8px',
|
|
84
|
-
lg: '16px',
|
|
85
|
-
full: '9999px',
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export function getBrandingVars(branding: BioBranding): Record<string, string> {
|
|
89
|
-
return {
|
|
90
|
-
'--pk-primary': branding.primaryColor,
|
|
91
|
-
'--pk-secondary': branding.secondaryColor,
|
|
92
|
-
'--pk-accent': branding.accentColor,
|
|
93
|
-
'--pk-bg': branding.backgroundColor,
|
|
94
|
-
'--pk-text': branding.textColor,
|
|
95
|
-
'--pk-muted': branding.mutedTextColor,
|
|
96
|
-
'--pk-radius': borderRadiusMap[branding.borderRadius ?? 'md'],
|
|
97
|
-
'--pk-font-heading': branding.fontHeading ?? "'Space Grotesk', sans-serif",
|
|
98
|
-
'--pk-font-body': branding.fontBody ?? "'DM Sans', sans-serif",
|
|
99
|
-
'--pk-alt-bg': branding.sectionAltBg ?? branding.backgroundColor,
|
|
100
|
-
'--pk-alt-bg2': branding.sectionAltBg2 ?? branding.backgroundColor,
|
|
101
|
-
};
|
|
102
|
-
}
|
package/src/types.ts
DELETED
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// @fayz-ai/plugin-linkinbio — domain types.
|
|
3
|
-
//
|
|
4
|
-
// A BioPage is a komi/linktree-style public page for any creator: an identity +
|
|
5
|
-
// branding + an ordered list of content blocks (held in `sections` for backward
|
|
6
|
-
// compatibility with existing `press_kits.data` jsonb payloads). The block union
|
|
7
|
-
// is a discriminated union on `type`; the built-in blocks below cover the common
|
|
8
|
-
// creator surfaces, and hosts can register niche block types via `registerBlock`.
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
|
|
11
|
-
// ── Media primitives ──
|
|
12
|
-
|
|
13
|
-
export interface BioMediaItem {
|
|
14
|
-
type: 'image' | 'video' | 'audio';
|
|
15
|
-
url: string;
|
|
16
|
-
thumbnailUrl?: string;
|
|
17
|
-
alt?: string;
|
|
18
|
-
caption?: string;
|
|
19
|
-
aspectRatio?: '1:1' | '4:3' | '16:9' | '9:16' | '3:4';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface BioSocialLink {
|
|
23
|
-
platform:
|
|
24
|
-
| 'instagram'
|
|
25
|
-
| 'spotify'
|
|
26
|
-
| 'soundcloud'
|
|
27
|
-
| 'youtube'
|
|
28
|
-
| 'tiktok'
|
|
29
|
-
| 'whatsapp'
|
|
30
|
-
| 'email'
|
|
31
|
-
| 'twitter'
|
|
32
|
-
| 'facebook'
|
|
33
|
-
| 'bandcamp'
|
|
34
|
-
| 'mixcloud'
|
|
35
|
-
| 'beatport'
|
|
36
|
-
| 'apple-music'
|
|
37
|
-
| 'deezer'
|
|
38
|
-
| 'telegram'
|
|
39
|
-
| 'website'
|
|
40
|
-
| 'drive'
|
|
41
|
-
| 'custom';
|
|
42
|
-
url: string;
|
|
43
|
-
label?: string;
|
|
44
|
-
icon?: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// ── Branding ──
|
|
48
|
-
|
|
49
|
-
export interface BioBranding {
|
|
50
|
-
primaryColor: string;
|
|
51
|
-
secondaryColor: string;
|
|
52
|
-
accentColor: string;
|
|
53
|
-
backgroundColor: string;
|
|
54
|
-
textColor: string;
|
|
55
|
-
mutedTextColor: string;
|
|
56
|
-
fontHeading?: string;
|
|
57
|
-
fontBody?: string;
|
|
58
|
-
logoUrl?: string;
|
|
59
|
-
backgroundImageUrl?: string;
|
|
60
|
-
borderRadius?: 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
61
|
-
sectionAltBg?: string; // alternate section background (e.g. wine/dark brown)
|
|
62
|
-
sectionAltBg2?: string; // third background variant for variety
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface BioFloatingCTA {
|
|
66
|
-
label: string;
|
|
67
|
-
url: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// ── Identity ──
|
|
71
|
-
|
|
72
|
-
export interface BioIdentity {
|
|
73
|
-
name: string;
|
|
74
|
-
slug: string;
|
|
75
|
-
tagline?: string;
|
|
76
|
-
genres: string[];
|
|
77
|
-
location?: string;
|
|
78
|
-
pronouns?: string;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ── SEO ──
|
|
82
|
-
|
|
83
|
-
export interface BioSEO {
|
|
84
|
-
title?: string;
|
|
85
|
-
description?: string;
|
|
86
|
-
ogImageUrl?: string;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ── Block types (discriminated union) ──
|
|
90
|
-
|
|
91
|
-
interface BioBlockBase {
|
|
92
|
-
id: string;
|
|
93
|
-
label?: string;
|
|
94
|
-
title?: string;
|
|
95
|
-
visible?: boolean;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export interface HeroSection extends BioBlockBase {
|
|
99
|
-
type: 'hero';
|
|
100
|
-
backgroundImageUrl: string;
|
|
101
|
-
backgroundImageUrls?: string[];
|
|
102
|
-
overlayGradient?: string;
|
|
103
|
-
layout?: 'centered' | 'bottom-left' | 'bottom-center' | 'split';
|
|
104
|
-
showLogo?: boolean;
|
|
105
|
-
showGenres?: boolean;
|
|
106
|
-
showLocation?: boolean;
|
|
107
|
-
ctaText?: string;
|
|
108
|
-
ctaUrl?: string;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export interface BioSection extends BioBlockBase {
|
|
112
|
-
type: 'bio';
|
|
113
|
-
content: string;
|
|
114
|
-
imageUrl?: string;
|
|
115
|
-
imagePosition?: 'left' | 'right' | 'top' | 'none';
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export interface GallerySection extends BioBlockBase {
|
|
119
|
-
type: 'gallery';
|
|
120
|
-
media: BioMediaItem[];
|
|
121
|
-
layout?: 'grid' | 'masonry' | 'carousel' | 'featured-grid';
|
|
122
|
-
columns?: 2 | 3 | 4;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export interface VideoGridSection extends BioBlockBase {
|
|
126
|
-
type: 'video-grid';
|
|
127
|
-
videos: {
|
|
128
|
-
platform: 'youtube' | 'vimeo';
|
|
129
|
-
videoId: string;
|
|
130
|
-
title?: string;
|
|
131
|
-
thumbnailUrl?: string;
|
|
132
|
-
}[];
|
|
133
|
-
layout?: 'grid' | 'list' | 'featured';
|
|
134
|
-
channelUrl?: string;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export interface SocialLinksSection extends BioBlockBase {
|
|
138
|
-
type: 'social-links';
|
|
139
|
-
links: BioSocialLink[];
|
|
140
|
-
layout?: 'icons' | 'buttons' | 'list';
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export interface EmbedSection extends BioBlockBase {
|
|
144
|
-
type: 'embed';
|
|
145
|
-
embedType: 'soundcloud' | 'spotify' | 'youtube' | 'bandcamp' | 'mixcloud' | 'custom';
|
|
146
|
-
embedUrl: string;
|
|
147
|
-
embedHtml?: string;
|
|
148
|
-
aspectRatio?: '1:1' | '16:9' | 'auto';
|
|
149
|
-
height?: number;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export interface ProjectSection extends BioBlockBase {
|
|
153
|
-
type: 'project';
|
|
154
|
-
content?: string;
|
|
155
|
-
media?: BioMediaItem[];
|
|
156
|
-
links?: { label: string; url: string }[];
|
|
157
|
-
date?: string;
|
|
158
|
-
tags?: string[];
|
|
159
|
-
layout?: 'card' | 'full-width' | 'side-by-side';
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export interface StatsSection extends BioBlockBase {
|
|
163
|
-
type: 'stats';
|
|
164
|
-
stats: {
|
|
165
|
-
value: string;
|
|
166
|
-
label: string;
|
|
167
|
-
icon?: string;
|
|
168
|
-
}[];
|
|
169
|
-
layout?: 'row' | 'grid';
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export interface VenueListSection extends BioBlockBase {
|
|
173
|
-
type: 'venue-list';
|
|
174
|
-
venues: {
|
|
175
|
-
name: string;
|
|
176
|
-
city?: string;
|
|
177
|
-
country?: string;
|
|
178
|
-
logoUrl?: string;
|
|
179
|
-
year?: string;
|
|
180
|
-
}[];
|
|
181
|
-
layout?: 'grid' | 'list' | 'logo-cloud';
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export interface CTASection extends BioBlockBase {
|
|
185
|
-
type: 'cta';
|
|
186
|
-
content?: string;
|
|
187
|
-
whatsappNumber?: string;
|
|
188
|
-
whatsappMessage?: string;
|
|
189
|
-
email?: string;
|
|
190
|
-
bookingUrl?: string;
|
|
191
|
-
ctaButtons: {
|
|
192
|
-
label: string;
|
|
193
|
-
url: string;
|
|
194
|
-
variant?: 'primary' | 'secondary' | 'outline';
|
|
195
|
-
icon?: string;
|
|
196
|
-
}[];
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
export interface TextSection extends BioBlockBase {
|
|
200
|
-
type: 'text';
|
|
201
|
-
content: string;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// ── Komi-style link-hub blocks (mobile-first) ──
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Full-bleed profile header: hero/portrait image with the name overlaid, an
|
|
208
|
-
* optional social-icon row, and optional quick-nav pills that scroll to blocks
|
|
209
|
-
* by id. This is the top block of a `link-hub` page.
|
|
210
|
-
*/
|
|
211
|
-
export interface ProfileHeaderSection extends BioBlockBase {
|
|
212
|
-
type: 'profile-header';
|
|
213
|
-
imageUrl?: string;
|
|
214
|
-
/**
|
|
215
|
-
* Push the cover image down the page — a reusable framing knob per creator.
|
|
216
|
-
* Any CSS length (e.g. '6vh', '3rem'); adds space above the hero so the
|
|
217
|
-
* subject isn't jammed against the top edge. Default: none.
|
|
218
|
-
*/
|
|
219
|
-
imageOffsetTop?: string;
|
|
220
|
-
/** CSS object-position for the cover image crop (e.g. 'center 30%'). Default 'center'. */
|
|
221
|
-
imageObjectPosition?: string;
|
|
222
|
-
overlayGradient?: string;
|
|
223
|
-
showLogo?: boolean;
|
|
224
|
-
showGenres?: boolean;
|
|
225
|
-
showLocation?: boolean;
|
|
226
|
-
/** Social icons under the name. Falls back to page.socialLinks when omitted. */
|
|
227
|
-
socials?: BioSocialLink[];
|
|
228
|
-
/** Quick-nav pills that smooth-scroll to a block id (komi's section nav). */
|
|
229
|
-
navPills?: { label: string; targetId: string }[];
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/** A single tappable link card (thumbnail + title + subtitle + chevron). */
|
|
233
|
-
export interface LinkCardItem {
|
|
234
|
-
title: string;
|
|
235
|
-
subtitle?: string;
|
|
236
|
-
url: string;
|
|
237
|
-
thumbnailUrl?: string;
|
|
238
|
-
/** lucide icon name or social platform key, used when no thumbnail. */
|
|
239
|
-
icon?: string;
|
|
240
|
-
badge?: string;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export interface LinksSection extends BioBlockBase {
|
|
244
|
-
type: 'links';
|
|
245
|
-
links: LinkCardItem[];
|
|
246
|
-
layout?: 'list' | 'grid';
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** A music release (artwork + title + artist + play/listen CTA). */
|
|
250
|
-
export interface MusicReleaseItem {
|
|
251
|
-
title: string;
|
|
252
|
-
artist?: string;
|
|
253
|
-
artworkUrl: string;
|
|
254
|
-
url: string;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export interface MusicReleasesSection extends BioBlockBase {
|
|
258
|
-
type: 'music-releases';
|
|
259
|
-
releases: MusicReleaseItem[];
|
|
260
|
-
layout?: 'carousel' | 'grid';
|
|
261
|
-
ctaLabel?: string;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/** A tour date (date chip + venue + city + tickets CTA). */
|
|
265
|
-
export interface TourDateItem {
|
|
266
|
-
/** ISO-ish date string, e.g. '2026-07-18'. */
|
|
267
|
-
date: string;
|
|
268
|
-
venue: string;
|
|
269
|
-
city?: string;
|
|
270
|
-
/** Tickets link. With a url → "Ingressos"; without → "Em breve" (or "Esgotado" if soldOut). */
|
|
271
|
-
url?: string;
|
|
272
|
-
soldOut?: boolean;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
export interface TourDatesSection extends BioBlockBase {
|
|
276
|
-
type: 'tour-dates';
|
|
277
|
-
dates: TourDateItem[];
|
|
278
|
-
ctaLabel?: string;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** A single large featured link (image + headline + CTA) — komi's "Out Now". */
|
|
282
|
-
export interface FeaturedSection extends BioBlockBase {
|
|
283
|
-
type: 'featured';
|
|
284
|
-
headline: string;
|
|
285
|
-
subtitle?: string;
|
|
286
|
-
imageUrl?: string;
|
|
287
|
-
url: string;
|
|
288
|
-
ctaLabel?: string;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/** The union of every built-in block. Host-registered niche blocks widen this at runtime. */
|
|
292
|
-
export type BioBlock =
|
|
293
|
-
| HeroSection
|
|
294
|
-
| BioSection
|
|
295
|
-
| GallerySection
|
|
296
|
-
| VideoGridSection
|
|
297
|
-
| SocialLinksSection
|
|
298
|
-
| EmbedSection
|
|
299
|
-
| ProjectSection
|
|
300
|
-
| StatsSection
|
|
301
|
-
| VenueListSection
|
|
302
|
-
| CTASection
|
|
303
|
-
| TextSection
|
|
304
|
-
| ProfileHeaderSection
|
|
305
|
-
| LinksSection
|
|
306
|
-
| MusicReleasesSection
|
|
307
|
-
| TourDatesSection
|
|
308
|
-
| FeaturedSection;
|
|
309
|
-
|
|
310
|
-
// ── Root schema ──
|
|
311
|
-
|
|
312
|
-
export interface BioPage {
|
|
313
|
-
identity: BioIdentity;
|
|
314
|
-
branding: BioBranding;
|
|
315
|
-
seo: BioSEO;
|
|
316
|
-
socialLinks: BioSocialLink[];
|
|
317
|
-
/** Ordered content blocks. Named `sections` for backward compat with press_kits.data. */
|
|
318
|
-
sections: BioBlock[];
|
|
319
|
-
floatingCta?: BioFloatingCTA;
|
|
320
|
-
/**
|
|
321
|
-
* Page shell: 'scroll' (default) is the full-bleed EPK/press-kit scroll; 'hub'
|
|
322
|
-
* is the komi/linktree centered narrow column (mobile-first link hub, no
|
|
323
|
-
* alternating section backgrounds).
|
|
324
|
-
*/
|
|
325
|
-
layout?: 'scroll' | 'hub';
|
|
326
|
-
/**
|
|
327
|
-
* Press/media kit — a downloadable-assets modal for bookers. Photos, logo and
|
|
328
|
-
* bio are auto-derived from the page; add `driveUrl` (full kit) and extra
|
|
329
|
-
* `assets` (rider, tech sheet, etc.) here.
|
|
330
|
-
*/
|
|
331
|
-
mediaKit?: {
|
|
332
|
-
driveUrl?: string;
|
|
333
|
-
assets?: { label: string; url: string; kind?: 'image' | 'logo' | 'doc' | 'audio' | 'link' }[];
|
|
334
|
-
};
|
|
335
|
-
template?: string;
|
|
336
|
-
updatedAt?: string;
|
|
337
|
-
}
|
|
File without changes
|