diff --git a/apps/cms/seed/page-content.ts b/apps/cms/seed/page-content.ts index de1e423..c405a6d 100644 --- a/apps/cms/seed/page-content.ts +++ b/apps/cms/seed/page-content.ts @@ -89,6 +89,8 @@ async function ensureMedia( payload: Payload, href: string | null | undefined, alt: string | null | undefined, + // Names the caller in the soft-miss warning below. + context = "kickoff", ): Promise { const filename = localMediaFilename(href); if (!filename) return null; @@ -103,7 +105,7 @@ async function ensureMedia( const sourcePath = path.join(webMediaDir, filename); if (!fs.existsSync(sourcePath)) { console.warn( - ` kickoff media missing on disk (${filename}); leaving upload unset until the file is added through Payload`, + ` ${context} media missing on disk (${filename}); leaving upload unset until the file is added through Payload`, ); return null; } @@ -121,17 +123,69 @@ async function run() { const payload = await getPayload({ config }); const content = readJson("page-content"); - // page-home + // page-home. The 2027 fields (hero badge and lead lines, countdown, partner + // row descriptions, audience tile links and photos, speaker highlights and + // lineup, social) are optional in the fixture and in the schema. A field + // the fixture does not carry is written as empty rather than skipped, so a + // re-seed always ends on exactly what the fixture says. { const home = content.home; + + // JSON carries a tile photo as a media filename (WhyCard.imageFile); the + // CMS field is the upload `image`. Soft-miss like the kickoff images. + const cards = []; + for (const card of home.whyAttend.cards) { + const image = card.imageFile + ? await ensureMedia( + payload, + `/media/${card.imageFile}`, + card.imageAlt, + "home audience tile", + ) + : null; + cards.push({ + title: card.title, + description: card.description, + eyebrow: card.eyebrow ?? null, + href: card.href ?? null, + linkLabel: card.linkLabel ?? null, + ...(image !== null ? { image } : {}), + imageAlt: card.imageAlt ?? null, + }); + } + + // A post row requires its image, so a post whose file is not on disk is + // left out instead of failing the whole seed. + const posts = []; + for (const post of home.social?.posts ?? []) { + const image = post.imageFile + ? await ensureMedia( + payload, + `/media/${post.imageFile}`, + post.imageAlt, + "home social post", + ) + : null; + if (image === null) continue; + posts.push({ + platform: post.platform, + href: post.href, + image, + imageAlt: post.imageAlt ?? null, + }); + } + + const speakers = home.previousSpeakers; await payload.updateGlobal({ slug: "page-home", data: { title: home.title, metaDescription: home.metaDescription, hero: { + badge: home.hero.badge ?? null, headline: home.hero.headline, tagline: home.hero.tagline, + leadLines: toTextRows(home.hero.leadLines ?? []), announcementLines: toTextRows(home.hero.announcementLines), cta: home.hero.cta, }, @@ -139,6 +193,15 @@ async function run() { startDate: home.event.startDate, endDate: home.event.endDate, }, + countdown: { + label: home.countdown?.label ?? null, + daysLabel: home.countdown?.daysLabel ?? null, + hoursLabel: home.countdown?.hoursLabel ?? null, + minutesLabel: home.countdown?.minutesLabel ?? null, + secondsLabel: home.countdown?.secondsLabel ?? null, + spokenLabel: home.countdown?.spokenLabel ?? null, + liveLabel: home.countdown?.liveLabel ?? null, + }, stats: { heading: home.stats.heading, intro: home.stats.intro, @@ -149,27 +212,59 @@ async function run() { })), }, partnerBand: { + eyebrow: home.partnerBand.eyebrow ?? null, + heading: home.partnerBand.heading ?? null, items: home.partnerBand.items.map((item: any) => ({ - value: item.value, + // May be empty: the 2027 partner rows show no count. + value: item.value ?? null, label: item.label, + description: item.description ?? null, logos: toTextRows(item.logos ?? []), })), cta: home.partnerBand.cta, }, - previousSpeakers: home.previousSpeakers, + previousSpeakers: { + eyebrow: speakers.eyebrow ?? null, + heading: speakers.heading, + intro: speakers.intro, + alumniLabel: speakers.alumniLabel ?? null, + highlights: toTextRows(speakers.highlights ?? []), + lineup: { + label: speakers.lineup?.label ?? null, + year: speakers.lineup?.year ?? null, + slots: speakers.lineup?.slots ?? 4, + showPlaceholders: speakers.lineup?.showPlaceholders ?? false, + placeholderName: speakers.lineup?.placeholderName ?? null, + placeholderRole: speakers.lineup?.placeholderRole ?? null, + }, + standIns: toTextRows(speakers.standIns ?? []), + standInLabel: speakers.standInLabel ?? null, + cta: speakers.cta, + }, whyAttend: { + eyebrow: home.whyAttend.eyebrow ?? null, heading: home.whyAttend.heading, intro: home.whyAttend.intro, - cards: home.whyAttend.cards, + cards, cta: home.whyAttend.cta, }, + social: { + eyebrow: home.social?.eyebrow ?? null, + heading: home.social?.heading ?? null, + intro: home.social?.intro ?? null, + linkedinLabel: home.social?.linkedinLabel ?? null, + instagramLabel: home.social?.instagramLabel ?? null, + posts, + }, faqSection: home.faqSection, _status: "published", }, user: seedUser, overrideAccess: true, }); - console.log("page-home: updated and published"); + console.log( + `page-home: updated and published (${cards.length} audience tiles, ${posts.length} social posts)`, + ); } // page-whyq (resolves each audience's photo to a media doc when present) diff --git a/apps/cms/seed/site-settings.ts b/apps/cms/seed/site-settings.ts index 27b359d..ef56fc4 100644 --- a/apps/cms/seed/site-settings.ts +++ b/apps/cms/seed/site-settings.ts @@ -16,9 +16,14 @@ interface SocialLink extends PageLink { "tiktok" | "instagram-qsummit" | "instagram-qhack" | "linkedin" | "youtube"; } +/** Nav item with its optional submenu (NavLink in apps/web site-settings.ts). */ +interface NavLink extends PageLink { + children?: PageLink[] | null; +} + interface SiteSettingsSource { siteTitle: string; - nav: PageLink[]; + nav: NavLink[]; footer: { tagline: string; links: PageLink[]; @@ -54,7 +59,15 @@ async function run() { slug: "site-settings", data: { siteTitle: data.siteTitle, - nav: data.nav, + // Sub-items are optional: an item without them seeds as a plain link. + nav: data.nav.map((item) => ({ + label: item.label, + href: item.href, + children: (item.children ?? []).map((child) => ({ + label: child.label, + href: child.href, + })), + })), footer: { tagline: data.footer.tagline, links: data.footer.links, @@ -80,6 +93,9 @@ async function run() { console.log("site-settings global: updated and published"); console.log(` - siteTitle: "${data.siteTitle}"`); console.log(` - nav items: ${data.nav.length}`); + console.log( + ` - nav sub-items: ${data.nav.reduce((sum, item) => sum + (item.children?.length ?? 0), 0)}`, + ); console.log(` - footer links: ${data.footer.links.length}`); console.log(` - social links: ${data.footer.socialLinks.length}`); console.log(` - llms key facts: ${data.llms?.keyFacts?.length ?? 0}`); diff --git a/apps/cms/src/globals/PageHome.ts b/apps/cms/src/globals/PageHome.ts index a5073de..35b22e8 100644 --- a/apps/cms/src/globals/PageHome.ts +++ b/apps/cms/src/globals/PageHome.ts @@ -1,5 +1,6 @@ -import type { GlobalConfig } from "payload"; +import type { Field, GlobalConfig, NumberFieldSingleValidation } from "payload"; +import { urlOrMailtoValidate } from "../lib/url-validate"; import { pageGlobal } from "./base"; import { groupSection, @@ -11,7 +12,125 @@ import { titleDescriptionArrayField, } from "./shared-fields"; -// Mirrors HomeContent in apps/web/src/lib/content.ts 1:1. +/* + * Homepage for the 2027 edition. + * + * Mirrors HomeContent and CmsPageHomeDoc in + * apps/web/src/lib/content/pages.ts 1:1: names and nesting are the REST keys + * the site reads. Everything added for 2027 (hero badge and lead lines, + * countdown, partner row descriptions, audience tile links and photos, + * speaker highlights and lineup, social) is optional at the schema level, so + * the page published before these fields existed stays valid and publishable + * untouched, and the migration only adds nullable columns and new tables. + * The site hides each new part until its fields are filled. + * + * Validators below pass on empty values for the same reason: drafts are + * validated on save (access/index.ts draftVersionsGlobal), so a validator + * that asked for a new field would block saving an untouched page. + */ + +const COUNTDOWN_PLACEHOLDERS = ["days", "hours", "minutes"] as const; + +/** + * The sentence read out instead of the countdown digits keeps {days}, + * {hours} and {minutes} once it is filled; the site replaces them with the + * numbers (apps/web/src/lib/countdown.ts spokenRemaining). + */ +export const validateSpokenLabel = (value: unknown): true | string => { + if (typeof value !== "string" || !value.trim()) return true; + const missing = COUNTDOWN_PLACEHOLDERS.filter( + (placeholder) => !value.includes(`{${placeholder}}`), + ); + return missing.length === 0 + ? true + : `Keep ${missing.map((p) => `{${p}}`).join(" and ")} in the text; the site replaces them with the numbers.`; +}; + +/** Whole conference year, the same range the speakers' own year accepts. */ +export const validateLineupYear: NumberFieldSingleValidation = (value) => { + if (value == null) return true; + return Number.isInteger(value) && value >= 2017 && value <= 2100 + ? true + : "Enter a four-digit conference year (2017 or later)."; +}; + +/** Whole number of lineup cards, 1 to 8. Empty passes: the site uses 4. */ +export const validateLineupSlots: NumberFieldSingleValidation = (value) => { + if (value == null) return true; + return Number.isInteger(value) && value >= 1 && value <= 8 + ? true + : "Enter a whole number from 1 to 8."; +}; + +/** + * The social section shows once its heading is filled and then renders + * every one of its texts (the two labels name the profile links), so they + * are required from that moment on. Without a heading the section is off + * and nothing is asked for. + */ +export const requiredWithSocialHeading = ( + value: unknown, + { siblingData }: { siblingData: unknown }, +): true | string => { + const heading = (siblingData as { heading?: unknown } | undefined)?.heading; + const sectionOn = typeof heading === "string" && heading.trim() !== ""; + return !sectionOn || (typeof value === "string" && value.trim() !== "") + ? true + : "Required while the section has a heading."; +}; + +// Extra fields on each whyAttend card (WhyCard in pages.ts). Passed to the +// shared title/description helper so only this array gains the columns. +const audienceTileFields: Field[] = [ + { + name: "eyebrow", + type: "text", + admin: { + description: 'Small label above the title, e.g. "For founders".', + }, + }, + { + name: "href", + type: "text", + admin: { + description: + 'Where the tile leads: an internal path (e.g. "/whyq/students") or a full URL (https://...). ' + + "Leave empty and the tile is not a link.", + }, + // Same rule as every other internal link (pageLinkFields), but optional. + validate: urlOrMailtoValidate({ + optional: true, + allowRelative: true, + allowMailto: true, + }), + }, + { + name: "linkLabel", + type: "text", + admin: { + description: 'Text of the link on the tile, e.g. "Learn more".', + }, + }, + { + name: "image", + type: "upload", + relationTo: "media", + admin: { + description: + "Photo on the tile. Upload the sharp original. Leave empty and the tile shows without a photo.", + sortOptions: "-createdAt", + }, + }, + { + name: "imageAlt", + type: "text", + admin: { + description: + "Short description of the photo for screen readers. Leave empty only while there is no photo.", + }, + }, +]; + export const PageHome: GlobalConfig = pageGlobal({ slug: "page-home", label: "Home", @@ -24,14 +143,27 @@ export const PageHome: GlobalConfig = pageGlobal({ name: "hero", open: true, description: - "Top-of-page hero: headline, tagline, and announcement banner.", + "Top of the page over the video: badge, headline, lead lines, button and tagline.", fields: [ + { + name: "badge", + type: "text", + admin: { + description: + 'Small pill above the headline, e.g. "10th edition · April 1 to 2, 2027 · Mannheim". Leave empty to hide it.', + }, + }, { name: "headline", type: "text", required: true }, { name: "tagline", type: "text", required: true }, + stringArrayField("leadLines", { + label: "Lead line", + description: + "Short lines under the headline, one per row. When filled, they are shown instead of the announcement lines.", + }), stringArrayField("announcementLines", { label: "Announcement line", description: - "Rotating banner lines (e.g. thank-you message, next date). Each row is one line.", + "Banner lines (e.g. thank-you message, next date). Each row is one line. Shown only while there are no lead lines.", }), pageLinkGroup( "cta", @@ -43,9 +175,10 @@ export const PageHome: GlobalConfig = pageGlobal({ label: "Conference dates", name: "event", description: - "Conference dates for search engines. These feed the Event structured data on the " + - "homepage (the rich result that can show the date in Google), not any visible text. " + - "Write the human-facing date in the hero announcement lines above.", + "Conference dates. The hero countdown counts down to the start date (to 00:00 German " + + "time on that day), and both dates feed the event details search engines read (the " + + "rich result that can show the date in Google). Neither date is printed as text: " + + "write the date visitors read in the hero badge or lead lines above.", fields: [ { name: "startDate", @@ -79,6 +212,72 @@ export const PageHome: GlobalConfig = pageGlobal({ }, ], }), + // No date field on purpose: the target is event.startDate at 00:00 + // Europe/Berlin (apps/web/src/lib/countdown.ts), so there is one date to + // maintain. The site shows the countdown only once every label is filled. + groupSection({ + label: "Countdown", + name: "countdown", + description: + "Countdown in the hero. It has no date of its own: it counts down to the start date " + + "under Conference dates, to 00:00 German time (Europe/Berlin) on that day. That is the " + + "very start of the first conference day, not the time the doors open. Only the wording " + + "is set here. The countdown appears once every field in this section is filled; leave " + + "them all empty to hide it.", + fields: [ + { + name: "label", + type: "text", + admin: { + description: + 'Name of the countdown for screen readers, e.g. "Countdown to Q-Summit 2027".', + }, + }, + { + type: "row", + fields: [ + { + name: "daysLabel", + type: "text", + admin: { width: "25%", description: 'e.g. "Days".' }, + }, + { + name: "hoursLabel", + type: "text", + admin: { width: "25%", description: 'e.g. "Hours".' }, + }, + { + name: "minutesLabel", + type: "text", + admin: { width: "25%", description: 'e.g. "Minutes".' }, + }, + { + name: "secondsLabel", + type: "text", + admin: { width: "25%", description: 'e.g. "Seconds".' }, + }, + ], + }, + { + name: "spokenLabel", + type: "text", + admin: { + description: + "Sentence screen readers hear instead of the digits. Keep {days}, {hours} and {minutes}; " + + 'the site replaces them with the numbers, e.g. "{days} days, {hours} hours and {minutes} minutes until Q-Summit 2027".', + }, + validate: validateSpokenLabel, + }, + { + name: "liveLabel", + type: "text", + admin: { + description: + 'Shown in place of the countdown once the first conference day has begun, e.g. "Q-Summit 2027 is live".', + }, + }, + ], + }), groupSection({ label: "Stats", name: "stats", @@ -95,11 +294,35 @@ export const PageHome: GlobalConfig = pageGlobal({ groupSection({ label: "Partner band", name: "partnerBand", - description: "Partner/network logo band beneath the stats.", + description: "Partner logo rows beneath the stats.", fields: [ + { + name: "eyebrow", + type: "text", + admin: { + description: + "Small label above the heading. Leave empty to hide it.", + }, + }, + { + name: "heading", + type: "text", + admin: { + description: + 'Heading of the section. Always name the edition the logos are from, e.g. "Partners of Q-Summit 2026".', + }, + }, pageStatArrayField( "items", - "One entry per logo group (Startup/Corporate, Network, ...).", + "One row of logos per entry (e.g. Startups, Corporates, Network), in display order.", + { + // The 2027 rows show label, description and logos; the count + // beside the label is gone, so a row no longer needs one. + optionalValue: + 'Count beside the label on the previous homepage, e.g. "50+". The new homepage does not show it, so it may stay empty.', + rowDescription: + 'Short line under the label, e.g. "Founders & scale-ups". Leave empty to show the label alone.', + }, ), pageLinkGroup("cta"), ], @@ -108,29 +331,287 @@ export const PageHome: GlobalConfig = pageGlobal({ label: "Previous speakers", name: "previousSpeakers", description: - "Previous-speakers teaser section (grid comes from the speakers collection).", + "Speaker section: highlights from past editions and, once speakers are announced, " + + "the lineup of the next edition. Photos and roles come from the Speakers list.", fields: [ + { + name: "eyebrow", + type: "text", + admin: { + description: + "Small label above the heading. Leave empty to hide it.", + }, + }, { name: "heading", type: "text", required: true }, { name: "intro", type: "textarea", required: true }, + { + // The stored name is historical. These are past speakers, not Q + // alumni (alumni are former team members), so neither the label + // editors see nor the example says "alumni". + name: "alumniLabel", + label: "Past Speaker Label", + type: "text", + admin: { + description: + 'Badge on past speakers, e.g. "Past Speaker", so nobody reads them as booked for the next edition. Do not call them alumni: Q alumni are former team members. Leave empty for no badge.', + }, + }, + stringArrayField("highlights", { + label: "Highlight", + description: + "Names of past speakers to show, in this order. Write each name exactly as it reads in the Speakers list. " + + 'Leave empty to show every speaker in the group "Main stage highlight (homepage)".', + }), + { + name: "lineup", + type: "group", + admin: { + description: + "Speakers of the next edition, shown after the past speakers. The cards are the published speakers in the group " + + '"Current edition speakers" with the year set here, so publishing a speaker fills a slot. ' + + "The lineup appears once Label and Year are filled.", + }, + fields: [ + { + type: "row", + fields: [ + { + name: "label", + type: "text", + admin: { + width: "34%", + description: 'Badge on each lineup card, e.g. "2027".', + }, + }, + { + name: "year", + type: "number", + admin: { + width: "33%", + step: 1, + description: + "Conference year whose speakers fill the lineup, e.g. 2027.", + }, + validate: validateLineupYear, + }, + { + name: "slots", + type: "number", + defaultValue: 4, + min: 1, + max: 8, + admin: { + width: "33%", + step: 1, + description: "How many cards the lineup holds, 1 to 8.", + }, + validate: validateLineupSlots, + }, + ], + }, + { + name: "showPlaceholders", + type: "checkbox", + defaultValue: false, + admin: { + description: + "For previews only. Fills open lineup slots with clearly marked placeholder cards, so the layout " + + "can be checked before speakers are announced. Keep this off for the live site: with it off, " + + "open slots are simply not shown.", + }, + }, + { + type: "row", + fields: [ + { + name: "placeholderName", + type: "text", + admin: { + width: "50%", + description: + 'Name on a placeholder card, e.g. "Speaker to be announced". Only used while Show Placeholders is on.', + }, + }, + { + name: "placeholderRole", + type: "text", + admin: { + width: "50%", + description: + "Line under the name on a placeholder card. Only used while Show Placeholders is on.", + }, + }, + ], + }, + ], + }, + // Beside the lineup group, not inside it: nested one level deeper the + // version table's index names would pass Postgres' 63 characters. + stringArrayField("standIns", { + label: "Stand-in", + description: + "Earlier speakers to show in the lineup's place while no speaker of the lineup year is published yet. " + + "Write each name exactly as it reads in the Speakers list. They disappear on their own as soon as the first speaker of that year is published.", + }), + { + name: "standInLabel", + type: "text", + admin: { + description: + 'Badge on a stand-in card, e.g. "Q-Summit 2026". It must say where the person spoke, so nobody reads them as booked for the next edition.', + }, + }, pageLinkGroup("cta"), ], }), groupSection({ label: "Why attend", name: "whyAttend", - description: '"Why Everyone\'s at Q-Summit" section.', + description: + "Audience tiles: one tile per audience, each leading to its own page.", fields: [ + { + name: "eyebrow", + type: "text", + admin: { + description: + "Small label above the heading. Leave empty to hide it.", + }, + }, { name: "heading", type: "text", required: true }, { name: "intro", type: "textarea", required: true }, - titleDescriptionArrayField("cards", "One card per reason to attend."), + titleDescriptionArrayField( + "cards", + "One tile per audience (e.g. students, startups, corporates, investors), in display order.", + { extraFields: audienceTileFields }, + ), pageLinkGroup("cta"), ], }), + groupSection({ + label: "Social", + name: "social", + description: + "LinkedIn and Instagram section. It appears once Heading is filled; leave Heading empty to " + + "hide the whole section. The two profile links are not set here: they come from Site " + + "Settings (Navigation, footer & AI identity, under Footer, the LinkedIn and Instagram " + + "(Q-Summit) social links).", + fields: [ + { + name: "eyebrow", + type: "text", + admin: { description: "Small label above the heading." }, + validate: requiredWithSocialHeading, + }, + { + name: "heading", + type: "text", + admin: { + description: + "Heading of the section. Filling it switches the section on.", + }, + }, + { + name: "intro", + type: "textarea", + admin: { description: "Short text under the heading." }, + validate: requiredWithSocialHeading, + }, + { + type: "row", + fields: [ + { + name: "linkedinLabel", + label: "LinkedIn Label", + type: "text", + admin: { + width: "50%", + description: + 'Text of the LinkedIn profile link, e.g. "Follow us on LinkedIn".', + }, + validate: requiredWithSocialHeading, + }, + { + name: "instagramLabel", + type: "text", + admin: { + width: "50%", + description: + 'Text of the Instagram profile link, e.g. "Follow us on Instagram".', + }, + validate: requiredWithSocialHeading, + }, + ], + }, + { + name: "posts", + type: "array", + // The page shows the newest four (apps/web lib/social-posts.ts); + // the rows beyond that are history the editor may clear out. + maxRows: 12, + labels: { singular: "Post", plural: "Posts" }, + admin: { + initCollapsed: true, + description: + "Add every new post as the last row. The page shows the newest four as image tiles that open the post: the last row at the far left, each older one a place further right. An older post drops out by itself, so nothing has to be moved or deleted (rows that no longer show may be removed). Without posts the section shows empty frames.", + }, + fields: [ + { + type: "row", + fields: [ + { + name: "platform", + type: "select", + required: true, + options: [ + { label: "LinkedIn", value: "linkedin" }, + { label: "Instagram", value: "instagram" }, + ], + admin: { width: "30%" }, + }, + { + name: "href", + type: "text", + required: true, + admin: { + width: "70%", + description: + "Full address of the post, starting with https://.", + }, + validate: urlOrMailtoValidate(), + }, + ], + }, + { + name: "image", + type: "upload", + relationTo: "media", + required: true, + admin: { + description: + "Image of the post, served from our own media library. Upload the sharp original.", + sortOptions: "-createdAt", + }, + }, + { + name: "imageAlt", + type: "text", + admin: { + description: + "Short description of the post image for screen readers.", + }, + }, + ], + }, + ], + }), + // Kept stored exactly as is: the 2027 homepage has no FAQ teaser, and a + // named group is never removed or reshaped (apps/cms AGENTS.md). groupSection({ label: "FAQ teaser", name: "faqSection", description: - "FAQ teaser section (questions come from the faqs collection).", + "FAQ teaser section. Currently not shown on the homepage; the content is kept.", fields: [ { name: "heading", type: "text", required: true }, { name: "intro", type: "textarea", required: true }, diff --git a/apps/cms/src/globals/PageWhyq.ts b/apps/cms/src/globals/PageWhyq.ts index 44dacba..11937e6 100644 --- a/apps/cms/src/globals/PageWhyq.ts +++ b/apps/cms/src/globals/PageWhyq.ts @@ -26,7 +26,7 @@ export const PageWhyq: GlobalConfig = pageGlobal({ required: true, admin: { description: - "One section per audience (attendees, startups, investors, partners, founders), in display order.", + "One section per audience. Each shows on its own page under Why Q?: attendees on /whyq/students/, startups on /whyq/startups/, partners on /whyq/corporates/, investors on /whyq/investors/. A section with another anchor id (founders) is kept but not shown on the site.", }, fields: [ { diff --git a/apps/cms/src/globals/SiteSettings.ts b/apps/cms/src/globals/SiteSettings.ts index 21c4be3..02ca91b 100644 --- a/apps/cms/src/globals/SiteSettings.ts +++ b/apps/cms/src/globals/SiteSettings.ts @@ -61,7 +61,28 @@ export const SiteSettings: GlobalConfig = reviewWorkflowGlobal({ type: "array", required: true, admin: { description: "Top navigation links, in display order." }, - fields: pageLinkFields(), + fields: [ + ...pageLinkFields(), + // NavLink.children in apps/web/src/lib/content/site-settings.ts: an + // optional submenu. Empty or missing reads as a plain link there, so + // existing nav items stay valid without it. + { + name: "children", + label: "Sub-items", + labels: { singular: "Sub-item", plural: "Sub-items" }, + type: "array", + admin: { + description: + "Optional links shown in a menu under this item, in display order (e.g. the audience pages under Why Q?). " + + "Leave empty for a plain link. The item itself always stays a link.", + initCollapsed: true, + components: { + RowLabel: "/components/array-row-label#TitleRowLabel", + }, + }, + fields: pageLinkFields(), + }, + ], }, { name: "footer", diff --git a/apps/cms/src/globals/shared-fields.ts b/apps/cms/src/globals/shared-fields.ts index eec87d1..73c9718 100644 --- a/apps/cms/src/globals/shared-fields.ts +++ b/apps/cms/src/globals/shared-fields.ts @@ -155,15 +155,46 @@ export function pageLinkGroup(name: string, description?: string): Field { }; } -/** PageStat = { value, label, logos?: string[] } (home hero/partner stats). */ -export function pageStatArrayField(name: string, description?: string): Field { +/** + * PageStat = { value, label, description?, logos?: string[] } (home stats + * and partner rows). + * + * Every array stores its rows in its own table, so a field added here for + * all callers would also add a column to arrays that never show it. The two + * options are therefore opt-in per array: + * - `rowDescription` adds the optional `description` line under the label + * and is its help text. + * - `optionalValue` lets `value` stay empty and is its help text, for rows + * whose number the page does not show (the home partner rows show the + * label, the description and the logos only). + */ +export function pageStatArrayField( + name: string, + description?: string, + opts: { rowDescription?: string; optionalValue?: string } = {}, +): Field { return { name, type: "array", admin: arrayAdmin(description), fields: [ - { name: "value", type: "text", required: true }, + opts.optionalValue + ? { + name: "value", + type: "text", + admin: { description: opts.optionalValue }, + } + : { name: "value", type: "text", required: true }, { name: "label", type: "text", required: true }, + ...(opts.rowDescription + ? [ + { + name: "description", + type: "text", + admin: { description: opts.rowDescription }, + } satisfies Field, + ] + : []), stringArrayField("logos", { label: "Logo", description: @@ -205,10 +236,17 @@ export function agendaItemsField( }; } -/** { title, description } cards (WhyCard / FeatureCard). */ +/** + * { title, description } cards (WhyCard / FeatureCard). + * + * `extraFields` are appended to the rows of that one array (the home + * audience tiles). Every array has its own table, so a caller that passes + * none (the hackathon benefits) gains no column. + */ export function titleDescriptionArrayField( name: string, description?: string, + { extraFields = [] }: { extraFields?: Field[] } = {}, ): Field { return { name, @@ -217,6 +255,7 @@ export function titleDescriptionArrayField( fields: [ { name: "title", type: "text", required: true }, { name: "description", type: "textarea", required: true }, + ...extraFields, ], }; } diff --git a/apps/cms/src/lib/live-preview-url.ts b/apps/cms/src/lib/live-preview-url.ts index d4e70bb..31f74ce 100644 --- a/apps/cms/src/lib/live-preview-url.ts +++ b/apps/cms/src/lib/live-preview-url.ts @@ -11,7 +11,9 @@ */ export const PATH_BY_GLOBAL: Record = { "page-home": "/", - "page-whyq": "/whyq/", + // "Why Q?" has no overview page: its content shows on the four audience + // pages (apps/web pages/whyq/[audience].astro); /whyq/ itself redirects. + "page-whyq": "/whyq/students/", "page-kickoff": "/kickoff/", "page-program": "/program/", "page-tickets": "/ticket-categories/", diff --git a/apps/cms/src/lib/media-usage.ts b/apps/cms/src/lib/media-usage.ts index 3204cd2..36ad013 100644 --- a/apps/cms/src/lib/media-usage.ts +++ b/apps/cms/src/lib/media-usage.ts @@ -59,6 +59,16 @@ export type MediaGlobalRef = { * The `logos` arrays on page-home are name registries, not uploads. */ export const MEDIA_GLOBAL_FIELDS = [ + { + slug: "page-home", + label: "Home", + path: "/", + refs: [ + { fieldPath: "whyAttend.cards[].image", titleField: "title" }, + // A post row has no title; its link is the one text that names it. + { fieldPath: "social.posts[].image", titleField: "href" }, + ], + }, { slug: "page-whyq", label: "Why Q?", diff --git a/apps/cms/src/migrations/20261111_104849_home_2027.json b/apps/cms/src/migrations/20261111_104849_home_2027.json new file mode 100644 index 0000000..ce3501f --- /dev/null +++ b/apps/cms/src/migrations/20261111_104849_home_2027.json @@ -0,0 +1,20614 @@ +{ + "version": "7", + "dialect": "postgresql", + "tables": { + "public.partners": { + "name": "partners", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "website_url": { + "name": "website_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "logo_id": { + "name": "logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tier": { + "name": "tier", + "type": "enum_partners_tier", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_partners_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "partners_name_idx": { + "name": "partners_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "partners_logo_idx": { + "name": "partners_logo_idx", + "columns": [ + { + "expression": "logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "partners_updated_at_idx": { + "name": "partners_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "partners_created_at_idx": { + "name": "partners_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "partners__status_idx": { + "name": "partners__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "partners_logo_id_media_id_fk": { + "name": "partners_logo_id_media_id_fk", + "tableFrom": "partners", + "tableTo": "media", + "columnsFrom": [ + "logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._partners_v": { + "name": "_partners_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_name": { + "name": "version_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_website_url": { + "name": "version_website_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_logo_id": { + "name": "version_logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_tier": { + "name": "version_tier", + "type": "enum__partners_v_version_tier", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__partners_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_partners_v_parent_idx": { + "name": "_partners_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_version_version_name_idx": { + "name": "_partners_v_version_version_name_idx", + "columns": [ + { + "expression": "version_name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_version_version_logo_idx": { + "name": "_partners_v_version_version_logo_idx", + "columns": [ + { + "expression": "version_logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_version_version_updated_at_idx": { + "name": "_partners_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_version_version_created_at_idx": { + "name": "_partners_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_version_version__status_idx": { + "name": "_partners_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_created_at_idx": { + "name": "_partners_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_updated_at_idx": { + "name": "_partners_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_partners_v_latest_idx": { + "name": "_partners_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_partners_v_parent_id_partners_id_fk": { + "name": "_partners_v_parent_id_partners_id_fk", + "tableFrom": "_partners_v", + "tableTo": "partners", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_partners_v_version_logo_id_media_id_fk": { + "name": "_partners_v_version_logo_id_media_id_fk", + "tableFrom": "_partners_v", + "tableTo": "media", + "columnsFrom": [ + "version_logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.jobs": { + "name": "jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "company": { + "name": "company", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "location": { + "name": "location", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "workload": { + "name": "workload", + "type": "enum_jobs_workload", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "apply_url": { + "name": "apply_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "logo_id": { + "name": "logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_jobs_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "jobs_logo_idx": { + "name": "jobs_logo_idx", + "columns": [ + { + "expression": "logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "jobs_slug_idx": { + "name": "jobs_slug_idx", + "columns": [ + { + "expression": "slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "jobs_updated_at_idx": { + "name": "jobs_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "jobs_created_at_idx": { + "name": "jobs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "jobs__status_idx": { + "name": "jobs__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "jobs_logo_id_media_id_fk": { + "name": "jobs_logo_id_media_id_fk", + "tableFrom": "jobs", + "tableTo": "media", + "columnsFrom": [ + "logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._jobs_v": { + "name": "_jobs_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_company": { + "name": "version_company", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_location": { + "name": "version_location", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_workload": { + "name": "version_workload", + "type": "enum__jobs_v_version_workload", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "version_description": { + "name": "version_description", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "version_apply_url": { + "name": "version_apply_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_logo_id": { + "name": "version_logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_slug": { + "name": "version_slug", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__jobs_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_jobs_v_parent_idx": { + "name": "_jobs_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_version_version_logo_idx": { + "name": "_jobs_v_version_version_logo_idx", + "columns": [ + { + "expression": "version_logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_version_version_slug_idx": { + "name": "_jobs_v_version_version_slug_idx", + "columns": [ + { + "expression": "version_slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_version_version_updated_at_idx": { + "name": "_jobs_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_version_version_created_at_idx": { + "name": "_jobs_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_version_version__status_idx": { + "name": "_jobs_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_created_at_idx": { + "name": "_jobs_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_updated_at_idx": { + "name": "_jobs_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_jobs_v_latest_idx": { + "name": "_jobs_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_jobs_v_parent_id_jobs_id_fk": { + "name": "_jobs_v_parent_id_jobs_id_fk", + "tableFrom": "_jobs_v", + "tableTo": "jobs", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_jobs_v_version_logo_id_media_id_fk": { + "name": "_jobs_v_version_logo_id_media_id_fk", + "tableFrom": "_jobs_v", + "tableTo": "media", + "columnsFrom": [ + "version_logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.speakers": { + "name": "speakers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "photo_id": { + "name": "photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "company": { + "name": "company", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role_line": { + "name": "role_line", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "bio": { + "name": "bio", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "group": { + "name": "group", + "type": "enum_speakers_group", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'current'" + }, + "year": { + "name": "year", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_speakers_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "speakers_photo_idx": { + "name": "speakers_photo_idx", + "columns": [ + { + "expression": "photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "speakers_updated_at_idx": { + "name": "speakers_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "speakers_created_at_idx": { + "name": "speakers_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "speakers__status_idx": { + "name": "speakers__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "speakers_photo_id_media_id_fk": { + "name": "speakers_photo_id_media_id_fk", + "tableFrom": "speakers", + "tableTo": "media", + "columnsFrom": [ + "photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._speakers_v": { + "name": "_speakers_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_name": { + "name": "version_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_photo_id": { + "name": "version_photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_role": { + "name": "version_role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_company": { + "name": "version_company", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_role_line": { + "name": "version_role_line", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_bio": { + "name": "version_bio", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_group": { + "name": "version_group", + "type": "enum__speakers_v_version_group", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'current'" + }, + "version_year": { + "name": "version_year", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__speakers_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_speakers_v_parent_idx": { + "name": "_speakers_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_version_version_photo_idx": { + "name": "_speakers_v_version_version_photo_idx", + "columns": [ + { + "expression": "version_photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_version_version_updated_at_idx": { + "name": "_speakers_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_version_version_created_at_idx": { + "name": "_speakers_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_version_version__status_idx": { + "name": "_speakers_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_created_at_idx": { + "name": "_speakers_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_updated_at_idx": { + "name": "_speakers_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_speakers_v_latest_idx": { + "name": "_speakers_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_speakers_v_parent_id_speakers_id_fk": { + "name": "_speakers_v_parent_id_speakers_id_fk", + "tableFrom": "_speakers_v", + "tableTo": "speakers", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_speakers_v_version_photo_id_media_id_fk": { + "name": "_speakers_v_version_photo_id_media_id_fk", + "tableFrom": "_speakers_v", + "tableTo": "media", + "columnsFrom": [ + "version_photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team": { + "name": "team", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "photo_id": { + "name": "photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "linkedin": { + "name": "linkedin", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "division": { + "name": "division", + "type": "enum_team_division", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "year": { + "name": "year", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_team_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "team_photo_idx": { + "name": "team_photo_idx", + "columns": [ + { + "expression": "photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "team_updated_at_idx": { + "name": "team_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "team_created_at_idx": { + "name": "team_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "team__status_idx": { + "name": "team__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "team_photo_id_media_id_fk": { + "name": "team_photo_id_media_id_fk", + "tableFrom": "team", + "tableTo": "media", + "columnsFrom": [ + "photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._team_v": { + "name": "_team_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_name": { + "name": "version_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_role": { + "name": "version_role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_photo_id": { + "name": "version_photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_linkedin": { + "name": "version_linkedin", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_email": { + "name": "version_email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_division": { + "name": "version_division", + "type": "enum__team_v_version_division", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "version_year": { + "name": "version_year", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__team_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_team_v_parent_idx": { + "name": "_team_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_version_version_photo_idx": { + "name": "_team_v_version_version_photo_idx", + "columns": [ + { + "expression": "version_photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_version_version_updated_at_idx": { + "name": "_team_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_version_version_created_at_idx": { + "name": "_team_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_version_version__status_idx": { + "name": "_team_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_created_at_idx": { + "name": "_team_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_updated_at_idx": { + "name": "_team_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_team_v_latest_idx": { + "name": "_team_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_team_v_parent_id_team_id_fk": { + "name": "_team_v_parent_id_team_id_fk", + "tableFrom": "_team_v", + "tableTo": "team", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_team_v_version_photo_id_media_id_fk": { + "name": "_team_v_version_photo_id_media_id_fk", + "tableFrom": "_team_v", + "tableTo": "media", + "columnsFrom": [ + "version_photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.past_teams": { + "name": "past_teams", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "year": { + "name": "year", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "photo_id": { + "name": "photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_past_teams_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "past_teams_year_idx": { + "name": "past_teams_year_idx", + "columns": [ + { + "expression": "year", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "past_teams_photo_idx": { + "name": "past_teams_photo_idx", + "columns": [ + { + "expression": "photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "past_teams_updated_at_idx": { + "name": "past_teams_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "past_teams_created_at_idx": { + "name": "past_teams_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "past_teams__status_idx": { + "name": "past_teams__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "past_teams_photo_id_media_id_fk": { + "name": "past_teams_photo_id_media_id_fk", + "tableFrom": "past_teams", + "tableTo": "media", + "columnsFrom": [ + "photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._past_teams_v": { + "name": "_past_teams_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_year": { + "name": "version_year", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_photo_id": { + "name": "version_photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__past_teams_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_past_teams_v_parent_idx": { + "name": "_past_teams_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_version_version_year_idx": { + "name": "_past_teams_v_version_version_year_idx", + "columns": [ + { + "expression": "version_year", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_version_version_photo_idx": { + "name": "_past_teams_v_version_version_photo_idx", + "columns": [ + { + "expression": "version_photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_version_version_updated_at_idx": { + "name": "_past_teams_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_version_version_created_at_idx": { + "name": "_past_teams_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_version_version__status_idx": { + "name": "_past_teams_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_created_at_idx": { + "name": "_past_teams_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_updated_at_idx": { + "name": "_past_teams_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_past_teams_v_latest_idx": { + "name": "_past_teams_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_past_teams_v_parent_id_past_teams_id_fk": { + "name": "_past_teams_v_parent_id_past_teams_id_fk", + "tableFrom": "_past_teams_v", + "tableTo": "past_teams", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_past_teams_v_version_photo_id_media_id_fk": { + "name": "_past_teams_v_version_photo_id_media_id_fk", + "tableFrom": "_past_teams_v", + "tableTo": "media", + "columnsFrom": [ + "version_photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.faqs": { + "name": "faqs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "question": { + "name": "question", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "answer": { + "name": "answer", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "page": { + "name": "page", + "type": "enum_faqs_page", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_faqs_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "faqs_updated_at_idx": { + "name": "faqs_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "faqs_created_at_idx": { + "name": "faqs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "faqs__status_idx": { + "name": "faqs__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._faqs_v": { + "name": "_faqs_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_question": { + "name": "version_question", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_answer": { + "name": "version_answer", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "version_page": { + "name": "version_page", + "type": "enum__faqs_v_version_page", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__faqs_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_faqs_v_parent_idx": { + "name": "_faqs_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_version_version_updated_at_idx": { + "name": "_faqs_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_version_version_created_at_idx": { + "name": "_faqs_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_version_version__status_idx": { + "name": "_faqs_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_created_at_idx": { + "name": "_faqs_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_updated_at_idx": { + "name": "_faqs_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_faqs_v_latest_idx": { + "name": "_faqs_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_faqs_v_parent_id_faqs_id_fk": { + "name": "_faqs_v_parent_id_faqs_id_fk", + "tableFrom": "_faqs_v", + "tableTo": "faqs", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.testimonials": { + "name": "testimonials", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "quote": { + "name": "quote", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "attribution": { + "name": "attribution", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "photo_id": { + "name": "photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "order": { + "name": "order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "_status": { + "name": "_status", + "type": "enum_testimonials_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + } + }, + "indexes": { + "testimonials_attribution_idx": { + "name": "testimonials_attribution_idx", + "columns": [ + { + "expression": "attribution", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "testimonials_photo_idx": { + "name": "testimonials_photo_idx", + "columns": [ + { + "expression": "photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "testimonials_updated_at_idx": { + "name": "testimonials_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "testimonials_created_at_idx": { + "name": "testimonials_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "testimonials__status_idx": { + "name": "testimonials__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "testimonials_photo_id_media_id_fk": { + "name": "testimonials_photo_id_media_id_fk", + "tableFrom": "testimonials", + "tableTo": "media", + "columnsFrom": [ + "photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._testimonials_v": { + "name": "_testimonials_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_quote": { + "name": "version_quote", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_attribution": { + "name": "version_attribution", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_photo_id": { + "name": "version_photo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_order": { + "name": "version_order", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__testimonials_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_testimonials_v_parent_idx": { + "name": "_testimonials_v_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_version_version_attribution_idx": { + "name": "_testimonials_v_version_version_attribution_idx", + "columns": [ + { + "expression": "version_attribution", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_version_version_photo_idx": { + "name": "_testimonials_v_version_version_photo_idx", + "columns": [ + { + "expression": "version_photo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_version_version_updated_at_idx": { + "name": "_testimonials_v_version_version_updated_at_idx", + "columns": [ + { + "expression": "version_updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_version_version_created_at_idx": { + "name": "_testimonials_v_version_version_created_at_idx", + "columns": [ + { + "expression": "version_created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_version_version__status_idx": { + "name": "_testimonials_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_created_at_idx": { + "name": "_testimonials_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_updated_at_idx": { + "name": "_testimonials_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_testimonials_v_latest_idx": { + "name": "_testimonials_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_testimonials_v_parent_id_testimonials_id_fk": { + "name": "_testimonials_v_parent_id_testimonials_id_fk", + "tableFrom": "_testimonials_v", + "tableTo": "testimonials", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_testimonials_v_version_photo_id_media_id_fk": { + "name": "_testimonials_v_version_photo_id_media_id_fk", + "tableFrom": "_testimonials_v", + "tableTo": "media", + "columnsFrom": [ + "version_photo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.media": { + "name": "media", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "alt": { + "name": "alt", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "url": { + "name": "url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "thumbnail_u_r_l": { + "name": "thumbnail_u_r_l", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filename": { + "name": "filename", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "mime_type": { + "name": "mime_type", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "filesize": { + "name": "filesize", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "width": { + "name": "width", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_x": { + "name": "focal_x", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "focal_y": { + "name": "focal_y", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "media_updated_at_idx": { + "name": "media_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "media_created_at_idx": { + "name": "media_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "media_filename_idx": { + "name": "media_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_divisions": { + "name": "users_divisions", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_users_divisions", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "users_divisions_order_idx": { + "name": "users_divisions_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_divisions_parent_idx": { + "name": "users_divisions_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_divisions_parent_fk": { + "name": "users_divisions_parent_fk", + "tableFrom": "users_divisions", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_roles": { + "name": "users_roles", + "schema": "", + "columns": { + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "enum_users_roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + } + }, + "indexes": { + "users_roles_order_idx": { + "name": "users_roles_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_roles_parent_idx": { + "name": "users_roles_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_roles_parent_fk": { + "name": "users_roles_parent_fk", + "tableFrom": "users_roles", + "tableTo": "users", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users_sessions": { + "name": "users_sessions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "users_sessions_order_idx": { + "name": "users_sessions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_sessions_parent_id_idx": { + "name": "users_sessions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "users_sessions_parent_id_fk": { + "name": "users_sessions_parent_id_fk", + "tableFrom": "users_sessions", + "tableTo": "users", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "sub": { + "name": "sub", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "reset_password_token": { + "name": "reset_password_token", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "reset_password_expiration": { + "name": "reset_password_expiration", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "salt": { + "name": "salt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "login_attempts": { + "name": "login_attempts", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "lock_until": { + "name": "lock_until", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "users_sub_idx": { + "name": "users_sub_idx", + "columns": [ + { + "expression": "sub", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_updated_at_idx": { + "name": "users_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_created_at_idx": { + "name": "users_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_email_idx": { + "name": "users_email_idx", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_kv": { + "name": "payload_kv", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "payload_kv_key_idx": { + "name": "payload_kv_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_locked_documents": { + "name": "payload_locked_documents", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "global_slug": { + "name": "global_slug", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_locked_documents_global_slug_idx": { + "name": "payload_locked_documents_global_slug_idx", + "columns": [ + { + "expression": "global_slug", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_updated_at_idx": { + "name": "payload_locked_documents_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_created_at_idx": { + "name": "payload_locked_documents_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_locked_documents_rels": { + "name": "payload_locked_documents_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "partners_id": { + "name": "partners_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "jobs_id": { + "name": "jobs_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "speakers_id": { + "name": "speakers_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "team_id": { + "name": "team_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "past_teams_id": { + "name": "past_teams_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "faqs_id": { + "name": "faqs_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "testimonials_id": { + "name": "testimonials_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "media_id": { + "name": "media_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "payload_locked_documents_rels_order_idx": { + "name": "payload_locked_documents_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_parent_idx": { + "name": "payload_locked_documents_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_path_idx": { + "name": "payload_locked_documents_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_partners_id_idx": { + "name": "payload_locked_documents_rels_partners_id_idx", + "columns": [ + { + "expression": "partners_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_jobs_id_idx": { + "name": "payload_locked_documents_rels_jobs_id_idx", + "columns": [ + { + "expression": "jobs_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_speakers_id_idx": { + "name": "payload_locked_documents_rels_speakers_id_idx", + "columns": [ + { + "expression": "speakers_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_team_id_idx": { + "name": "payload_locked_documents_rels_team_id_idx", + "columns": [ + { + "expression": "team_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_past_teams_id_idx": { + "name": "payload_locked_documents_rels_past_teams_id_idx", + "columns": [ + { + "expression": "past_teams_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_faqs_id_idx": { + "name": "payload_locked_documents_rels_faqs_id_idx", + "columns": [ + { + "expression": "faqs_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_testimonials_id_idx": { + "name": "payload_locked_documents_rels_testimonials_id_idx", + "columns": [ + { + "expression": "testimonials_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_media_id_idx": { + "name": "payload_locked_documents_rels_media_id_idx", + "columns": [ + { + "expression": "media_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_locked_documents_rels_users_id_idx": { + "name": "payload_locked_documents_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "payload_locked_documents_rels_parent_fk": { + "name": "payload_locked_documents_rels_parent_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "payload_locked_documents", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_partners_fk": { + "name": "payload_locked_documents_rels_partners_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "partners", + "columnsFrom": [ + "partners_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_jobs_fk": { + "name": "payload_locked_documents_rels_jobs_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "jobs", + "columnsFrom": [ + "jobs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_speakers_fk": { + "name": "payload_locked_documents_rels_speakers_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "speakers", + "columnsFrom": [ + "speakers_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_team_fk": { + "name": "payload_locked_documents_rels_team_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "team", + "columnsFrom": [ + "team_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_past_teams_fk": { + "name": "payload_locked_documents_rels_past_teams_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "past_teams", + "columnsFrom": [ + "past_teams_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_faqs_fk": { + "name": "payload_locked_documents_rels_faqs_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "faqs", + "columnsFrom": [ + "faqs_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_testimonials_fk": { + "name": "payload_locked_documents_rels_testimonials_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "testimonials", + "columnsFrom": [ + "testimonials_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_media_fk": { + "name": "payload_locked_documents_rels_media_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "media", + "columnsFrom": [ + "media_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_locked_documents_rels_users_fk": { + "name": "payload_locked_documents_rels_users_fk", + "tableFrom": "payload_locked_documents_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_preferences": { + "name": "payload_preferences", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_preferences_key_idx": { + "name": "payload_preferences_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_updated_at_idx": { + "name": "payload_preferences_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_created_at_idx": { + "name": "payload_preferences_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_preferences_rels": { + "name": "payload_preferences_rels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "parent_id": { + "name": "parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "users_id": { + "name": "users_id", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "payload_preferences_rels_order_idx": { + "name": "payload_preferences_rels_order_idx", + "columns": [ + { + "expression": "order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_parent_idx": { + "name": "payload_preferences_rels_parent_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_path_idx": { + "name": "payload_preferences_rels_path_idx", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_preferences_rels_users_id_idx": { + "name": "payload_preferences_rels_users_id_idx", + "columns": [ + { + "expression": "users_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "payload_preferences_rels_parent_fk": { + "name": "payload_preferences_rels_parent_fk", + "tableFrom": "payload_preferences_rels", + "tableTo": "payload_preferences", + "columnsFrom": [ + "parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "payload_preferences_rels_users_fk": { + "name": "payload_preferences_rels_users_fk", + "tableFrom": "payload_preferences_rels", + "tableTo": "users", + "columnsFrom": [ + "users_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.payload_migrations": { + "name": "payload_migrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "batch": { + "name": "batch", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "payload_migrations_updated_at_idx": { + "name": "payload_migrations_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "payload_migrations_created_at_idx": { + "name": "payload_migrations_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_hero_lead_lines": { + "name": "page_home_hero_lead_lines", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_hero_lead_lines_order_idx": { + "name": "page_home_hero_lead_lines_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_hero_lead_lines_parent_id_idx": { + "name": "page_home_hero_lead_lines_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_hero_lead_lines_parent_id_fk": { + "name": "page_home_hero_lead_lines_parent_id_fk", + "tableFrom": "page_home_hero_lead_lines", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_hero_announcement_lines": { + "name": "page_home_hero_announcement_lines", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_hero_announcement_lines_order_idx": { + "name": "page_home_hero_announcement_lines_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_hero_announcement_lines_parent_id_idx": { + "name": "page_home_hero_announcement_lines_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_hero_announcement_lines_parent_id_fk": { + "name": "page_home_hero_announcement_lines_parent_id_fk", + "tableFrom": "page_home_hero_announcement_lines", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_stats_items_logos": { + "name": "page_home_stats_items_logos", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_stats_items_logos_order_idx": { + "name": "page_home_stats_items_logos_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_stats_items_logos_parent_id_idx": { + "name": "page_home_stats_items_logos_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_stats_items_logos_parent_id_fk": { + "name": "page_home_stats_items_logos_parent_id_fk", + "tableFrom": "page_home_stats_items_logos", + "tableTo": "page_home_stats_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_stats_items": { + "name": "page_home_stats_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_stats_items_order_idx": { + "name": "page_home_stats_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_stats_items_parent_id_idx": { + "name": "page_home_stats_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_stats_items_parent_id_fk": { + "name": "page_home_stats_items_parent_id_fk", + "tableFrom": "page_home_stats_items", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_partner_band_items_logos": { + "name": "page_home_partner_band_items_logos", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_partner_band_items_logos_order_idx": { + "name": "page_home_partner_band_items_logos_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_partner_band_items_logos_parent_id_idx": { + "name": "page_home_partner_band_items_logos_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_partner_band_items_logos_parent_id_fk": { + "name": "page_home_partner_band_items_logos_parent_id_fk", + "tableFrom": "page_home_partner_band_items_logos", + "tableTo": "page_home_partner_band_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_partner_band_items": { + "name": "page_home_partner_band_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_partner_band_items_order_idx": { + "name": "page_home_partner_band_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_partner_band_items_parent_id_idx": { + "name": "page_home_partner_band_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_partner_band_items_parent_id_fk": { + "name": "page_home_partner_band_items_parent_id_fk", + "tableFrom": "page_home_partner_band_items", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_previous_speakers_highlights": { + "name": "page_home_previous_speakers_highlights", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_previous_speakers_highlights_order_idx": { + "name": "page_home_previous_speakers_highlights_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_previous_speakers_highlights_parent_id_idx": { + "name": "page_home_previous_speakers_highlights_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_previous_speakers_highlights_parent_id_fk": { + "name": "page_home_previous_speakers_highlights_parent_id_fk", + "tableFrom": "page_home_previous_speakers_highlights", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_previous_speakers_stand_ins": { + "name": "page_home_previous_speakers_stand_ins", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_previous_speakers_stand_ins_order_idx": { + "name": "page_home_previous_speakers_stand_ins_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_previous_speakers_stand_ins_parent_id_idx": { + "name": "page_home_previous_speakers_stand_ins_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_previous_speakers_stand_ins_parent_id_fk": { + "name": "page_home_previous_speakers_stand_ins_parent_id_fk", + "tableFrom": "page_home_previous_speakers_stand_ins", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_why_attend_cards": { + "name": "page_home_why_attend_cards", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "eyebrow": { + "name": "eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "link_label": { + "name": "link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_why_attend_cards_order_idx": { + "name": "page_home_why_attend_cards_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_why_attend_cards_parent_id_idx": { + "name": "page_home_why_attend_cards_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_why_attend_cards_image_idx": { + "name": "page_home_why_attend_cards_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_why_attend_cards_image_id_media_id_fk": { + "name": "page_home_why_attend_cards_image_id_media_id_fk", + "tableFrom": "page_home_why_attend_cards", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_home_why_attend_cards_parent_id_fk": { + "name": "page_home_why_attend_cards_parent_id_fk", + "tableFrom": "page_home_why_attend_cards", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home_social_posts": { + "name": "page_home_social_posts", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "enum_page_home_social_posts_platform", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home_social_posts_order_idx": { + "name": "page_home_social_posts_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_social_posts_parent_id_idx": { + "name": "page_home_social_posts_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_home_social_posts_image_idx": { + "name": "page_home_social_posts_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_home_social_posts_image_id_media_id_fk": { + "name": "page_home_social_posts_image_id_media_id_fk", + "tableFrom": "page_home_social_posts", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_home_social_posts_parent_id_fk": { + "name": "page_home_social_posts_parent_id_fk", + "tableFrom": "page_home_social_posts", + "tableTo": "page_home", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_home": { + "name": "page_home", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "hero_badge": { + "name": "hero_badge", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_headline": { + "name": "hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_tagline": { + "name": "hero_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_cta_label": { + "name": "hero_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_cta_href": { + "name": "hero_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "event_start_date": { + "name": "event_start_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "event_end_date": { + "name": "event_end_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "countdown_label": { + "name": "countdown_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_days_label": { + "name": "countdown_days_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_hours_label": { + "name": "countdown_hours_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_minutes_label": { + "name": "countdown_minutes_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_seconds_label": { + "name": "countdown_seconds_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_spoken_label": { + "name": "countdown_spoken_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "countdown_live_label": { + "name": "countdown_live_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "stats_heading": { + "name": "stats_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "stats_intro": { + "name": "stats_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "partner_band_eyebrow": { + "name": "partner_band_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "partner_band_heading": { + "name": "partner_band_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "partner_band_cta_label": { + "name": "partner_band_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "partner_band_cta_href": { + "name": "partner_band_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_eyebrow": { + "name": "previous_speakers_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_heading": { + "name": "previous_speakers_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_intro": { + "name": "previous_speakers_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_alumni_label": { + "name": "previous_speakers_alumni_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_lineup_label": { + "name": "previous_speakers_lineup_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_lineup_year": { + "name": "previous_speakers_lineup_year", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_lineup_slots": { + "name": "previous_speakers_lineup_slots", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 4 + }, + "previous_speakers_lineup_show_placeholders": { + "name": "previous_speakers_lineup_show_placeholders", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "previous_speakers_lineup_placeholder_name": { + "name": "previous_speakers_lineup_placeholder_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_lineup_placeholder_role": { + "name": "previous_speakers_lineup_placeholder_role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_stand_in_label": { + "name": "previous_speakers_stand_in_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_cta_label": { + "name": "previous_speakers_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "previous_speakers_cta_href": { + "name": "previous_speakers_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "why_attend_eyebrow": { + "name": "why_attend_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "why_attend_heading": { + "name": "why_attend_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "why_attend_intro": { + "name": "why_attend_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "why_attend_cta_label": { + "name": "why_attend_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "why_attend_cta_href": { + "name": "why_attend_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "social_eyebrow": { + "name": "social_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "social_heading": { + "name": "social_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "social_intro": { + "name": "social_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "social_linkedin_label": { + "name": "social_linkedin_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "social_instagram_label": { + "name": "social_instagram_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_heading": { + "name": "faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_intro": { + "name": "faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_cta_label": { + "name": "faq_section_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_cta_href": { + "name": "faq_section_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_home_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_home__status_idx": { + "name": "page_home__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_hero_lead_lines": { + "name": "_page_home_v_version_hero_lead_lines", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_hero_lead_lines_order_idx": { + "name": "_page_home_v_version_hero_lead_lines_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_hero_lead_lines_parent_id_idx": { + "name": "_page_home_v_version_hero_lead_lines_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_hero_lead_lines_parent_id_fk": { + "name": "_page_home_v_version_hero_lead_lines_parent_id_fk", + "tableFrom": "_page_home_v_version_hero_lead_lines", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_hero_announcement_lines": { + "name": "_page_home_v_version_hero_announcement_lines", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_hero_announcement_lines_order_idx": { + "name": "_page_home_v_version_hero_announcement_lines_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_hero_announcement_lines_parent_id_idx": { + "name": "_page_home_v_version_hero_announcement_lines_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_hero_announcement_lines_parent_id_fk": { + "name": "_page_home_v_version_hero_announcement_lines_parent_id_fk", + "tableFrom": "_page_home_v_version_hero_announcement_lines", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_stats_items_logos": { + "name": "_page_home_v_version_stats_items_logos", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_stats_items_logos_order_idx": { + "name": "_page_home_v_version_stats_items_logos_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_stats_items_logos_parent_id_idx": { + "name": "_page_home_v_version_stats_items_logos_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_stats_items_logos_parent_id_fk": { + "name": "_page_home_v_version_stats_items_logos_parent_id_fk", + "tableFrom": "_page_home_v_version_stats_items_logos", + "tableTo": "_page_home_v_version_stats_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_stats_items": { + "name": "_page_home_v_version_stats_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_stats_items_order_idx": { + "name": "_page_home_v_version_stats_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_stats_items_parent_id_idx": { + "name": "_page_home_v_version_stats_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_stats_items_parent_id_fk": { + "name": "_page_home_v_version_stats_items_parent_id_fk", + "tableFrom": "_page_home_v_version_stats_items", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_partner_band_items_logos": { + "name": "_page_home_v_version_partner_band_items_logos", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_partner_band_items_logos_order_idx": { + "name": "_page_home_v_version_partner_band_items_logos_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_partner_band_items_logos_parent_id_idx": { + "name": "_page_home_v_version_partner_band_items_logos_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_partner_band_items_logos_parent_id_fk": { + "name": "_page_home_v_version_partner_band_items_logos_parent_id_fk", + "tableFrom": "_page_home_v_version_partner_band_items_logos", + "tableTo": "_page_home_v_version_partner_band_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_partner_band_items": { + "name": "_page_home_v_version_partner_band_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_partner_band_items_order_idx": { + "name": "_page_home_v_version_partner_band_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_partner_band_items_parent_id_idx": { + "name": "_page_home_v_version_partner_band_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_partner_band_items_parent_id_fk": { + "name": "_page_home_v_version_partner_band_items_parent_id_fk", + "tableFrom": "_page_home_v_version_partner_band_items", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_previous_speakers_highlights": { + "name": "_page_home_v_version_previous_speakers_highlights", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_previous_speakers_highlights_order_idx": { + "name": "_page_home_v_version_previous_speakers_highlights_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_previous_speakers_highlights_parent_id_idx": { + "name": "_page_home_v_version_previous_speakers_highlights_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_previous_speakers_highlights_parent_id_fk": { + "name": "_page_home_v_version_previous_speakers_highlights_parent_id_fk", + "tableFrom": "_page_home_v_version_previous_speakers_highlights", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_previous_speakers_stand_ins": { + "name": "_page_home_v_version_previous_speakers_stand_ins", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_previous_speakers_stand_ins_order_idx": { + "name": "_page_home_v_version_previous_speakers_stand_ins_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_previous_speakers_stand_ins_parent_id_idx": { + "name": "_page_home_v_version_previous_speakers_stand_ins_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_previous_speakers_stand_ins_parent_id_fk": { + "name": "_page_home_v_version_previous_speakers_stand_ins_parent_id_fk", + "tableFrom": "_page_home_v_version_previous_speakers_stand_ins", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_why_attend_cards": { + "name": "_page_home_v_version_why_attend_cards", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "eyebrow": { + "name": "eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "link_label": { + "name": "link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_why_attend_cards_order_idx": { + "name": "_page_home_v_version_why_attend_cards_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_why_attend_cards_parent_id_idx": { + "name": "_page_home_v_version_why_attend_cards_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_why_attend_cards_image_idx": { + "name": "_page_home_v_version_why_attend_cards_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_why_attend_cards_image_id_media_id_fk": { + "name": "_page_home_v_version_why_attend_cards_image_id_media_id_fk", + "tableFrom": "_page_home_v_version_why_attend_cards", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_home_v_version_why_attend_cards_parent_id_fk": { + "name": "_page_home_v_version_why_attend_cards_parent_id_fk", + "tableFrom": "_page_home_v_version_why_attend_cards", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v_version_social_posts": { + "name": "_page_home_v_version_social_posts", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "enum__page_home_v_version_social_posts_platform", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_social_posts_order_idx": { + "name": "_page_home_v_version_social_posts_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_social_posts_parent_id_idx": { + "name": "_page_home_v_version_social_posts_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_version_social_posts_image_idx": { + "name": "_page_home_v_version_social_posts_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_home_v_version_social_posts_image_id_media_id_fk": { + "name": "_page_home_v_version_social_posts_image_id_media_id_fk", + "tableFrom": "_page_home_v_version_social_posts", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_home_v_version_social_posts_parent_id_fk": { + "name": "_page_home_v_version_social_posts_parent_id_fk", + "tableFrom": "_page_home_v_version_social_posts", + "tableTo": "_page_home_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_home_v": { + "name": "_page_home_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_hero_badge": { + "name": "version_hero_badge", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_headline": { + "name": "version_hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_tagline": { + "name": "version_hero_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_cta_label": { + "name": "version_hero_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_cta_href": { + "name": "version_hero_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_event_start_date": { + "name": "version_event_start_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_event_end_date": { + "name": "version_event_end_date", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_countdown_label": { + "name": "version_countdown_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_days_label": { + "name": "version_countdown_days_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_hours_label": { + "name": "version_countdown_hours_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_minutes_label": { + "name": "version_countdown_minutes_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_seconds_label": { + "name": "version_countdown_seconds_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_spoken_label": { + "name": "version_countdown_spoken_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_countdown_live_label": { + "name": "version_countdown_live_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_stats_heading": { + "name": "version_stats_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_stats_intro": { + "name": "version_stats_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_partner_band_eyebrow": { + "name": "version_partner_band_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_partner_band_heading": { + "name": "version_partner_band_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_partner_band_cta_label": { + "name": "version_partner_band_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_partner_band_cta_href": { + "name": "version_partner_band_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_eyebrow": { + "name": "version_previous_speakers_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_heading": { + "name": "version_previous_speakers_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_intro": { + "name": "version_previous_speakers_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_alumni_label": { + "name": "version_previous_speakers_alumni_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_lineup_label": { + "name": "version_previous_speakers_lineup_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_lineup_year": { + "name": "version_previous_speakers_lineup_year", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_lineup_slots": { + "name": "version_previous_speakers_lineup_slots", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 4 + }, + "version_previous_speakers_lineup_show_placeholders": { + "name": "version_previous_speakers_lineup_show_placeholders", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "version_previous_speakers_lineup_placeholder_name": { + "name": "version_previous_speakers_lineup_placeholder_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_lineup_placeholder_role": { + "name": "version_previous_speakers_lineup_placeholder_role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_stand_in_label": { + "name": "version_previous_speakers_stand_in_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_cta_label": { + "name": "version_previous_speakers_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_previous_speakers_cta_href": { + "name": "version_previous_speakers_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_why_attend_eyebrow": { + "name": "version_why_attend_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_why_attend_heading": { + "name": "version_why_attend_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_why_attend_intro": { + "name": "version_why_attend_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_why_attend_cta_label": { + "name": "version_why_attend_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_why_attend_cta_href": { + "name": "version_why_attend_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_social_eyebrow": { + "name": "version_social_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_social_heading": { + "name": "version_social_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_social_intro": { + "name": "version_social_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_social_linkedin_label": { + "name": "version_social_linkedin_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_social_instagram_label": { + "name": "version_social_instagram_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_heading": { + "name": "version_faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_intro": { + "name": "version_faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_cta_label": { + "name": "version_faq_section_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_cta_href": { + "name": "version_faq_section_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_home_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_home_v_version_version__status_idx": { + "name": "_page_home_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_created_at_idx": { + "name": "_page_home_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_updated_at_idx": { + "name": "_page_home_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_home_v_latest_idx": { + "name": "_page_home_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_kickoff_speakers": { + "name": "page_kickoff_kickoff_speakers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "bio": { + "name": "bio", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "linkedin": { + "name": "linkedin", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "crop_x": { + "name": "crop_x", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 50 + }, + "crop_y": { + "name": "crop_y", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 24 + }, + "crop_zoom": { + "name": "crop_zoom", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + }, + "crop_shift_y": { + "name": "crop_shift_y", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": { + "page_kickoff_kickoff_speakers_order_idx": { + "name": "page_kickoff_kickoff_speakers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_kickoff_speakers_parent_id_idx": { + "name": "page_kickoff_kickoff_speakers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_kickoff_speakers_image_idx": { + "name": "page_kickoff_kickoff_speakers_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_kickoff_speakers_image_id_media_id_fk": { + "name": "page_kickoff_kickoff_speakers_image_id_media_id_fk", + "tableFrom": "page_kickoff_kickoff_speakers", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_kickoff_kickoff_speakers_parent_id_fk": { + "name": "page_kickoff_kickoff_speakers_parent_id_fk", + "tableFrom": "page_kickoff_kickoff_speakers", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_socials_links": { + "name": "page_kickoff_socials_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "icon": { + "name": "icon", + "type": "enum_page_kickoff_socials_links_icon", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_socials_links_order_idx": { + "name": "page_kickoff_socials_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_socials_links_parent_id_idx": { + "name": "page_kickoff_socials_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_socials_links_parent_id_fk": { + "name": "page_kickoff_socials_links_parent_id_fk", + "tableFrom": "page_kickoff_socials_links", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_quiz_questions_answers_tags": { + "name": "page_kickoff_quiz_questions_answers_tags", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_quiz_questions_answers_tags_order_idx": { + "name": "page_kickoff_quiz_questions_answers_tags_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_quiz_questions_answers_tags_parent_id_idx": { + "name": "page_kickoff_quiz_questions_answers_tags_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_quiz_questions_answers_tags_parent_id_fk": { + "name": "page_kickoff_quiz_questions_answers_tags_parent_id_fk", + "tableFrom": "page_kickoff_quiz_questions_answers_tags", + "tableTo": "page_kickoff_quiz_questions_answers", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_quiz_questions_answers": { + "name": "page_kickoff_quiz_questions_answers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "answer_id": { + "name": "answer_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_quiz_questions_answers_order_idx": { + "name": "page_kickoff_quiz_questions_answers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_quiz_questions_answers_parent_id_idx": { + "name": "page_kickoff_quiz_questions_answers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_quiz_questions_answers_parent_id_fk": { + "name": "page_kickoff_quiz_questions_answers_parent_id_fk", + "tableFrom": "page_kickoff_quiz_questions_answers", + "tableTo": "page_kickoff_quiz_questions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_quiz_questions": { + "name": "page_kickoff_quiz_questions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "kicker": { + "name": "kicker", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "question": { + "name": "question", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_quiz_questions_order_idx": { + "name": "page_kickoff_quiz_questions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_quiz_questions_parent_id_idx": { + "name": "page_kickoff_quiz_questions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_quiz_questions_parent_id_fk": { + "name": "page_kickoff_quiz_questions_parent_id_fk", + "tableFrom": "page_kickoff_quiz_questions", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_quiz_results": { + "name": "page_kickoff_quiz_results", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "team": { + "name": "team", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "notion_href": { + "name": "notion_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_quiz_results_order_idx": { + "name": "page_kickoff_quiz_results_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_quiz_results_parent_id_idx": { + "name": "page_kickoff_quiz_results_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_quiz_results_parent_id_fk": { + "name": "page_kickoff_quiz_results_parent_id_fk", + "tableFrom": "page_kickoff_quiz_results", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_journey_moments": { + "name": "page_kickoff_journey_moments", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_journey_moments_order_idx": { + "name": "page_kickoff_journey_moments_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_journey_moments_parent_id_idx": { + "name": "page_kickoff_journey_moments_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_journey_moments_image_idx": { + "name": "page_kickoff_journey_moments_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_journey_moments_image_id_media_id_fk": { + "name": "page_kickoff_journey_moments_image_id_media_id_fk", + "tableFrom": "page_kickoff_journey_moments", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_kickoff_journey_moments_parent_id_fk": { + "name": "page_kickoff_journey_moments_parent_id_fk", + "tableFrom": "page_kickoff_journey_moments", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff_application_steps": { + "name": "page_kickoff_application_steps", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_application_steps_order_idx": { + "name": "page_kickoff_application_steps_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_application_steps_parent_id_idx": { + "name": "page_kickoff_application_steps_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_application_steps_parent_id_fk": { + "name": "page_kickoff_application_steps_parent_id_fk", + "tableFrom": "page_kickoff_application_steps", + "tableTo": "page_kickoff", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_kickoff": { + "name": "page_kickoff", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "hero_eyebrow": { + "name": "hero_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_headline": { + "name": "hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_copy": { + "name": "hero_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_image_id": { + "name": "hero_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "hero_image_alt": { + "name": "hero_image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_primary_cta_label": { + "name": "hero_primary_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_primary_cta_href": { + "name": "hero_primary_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_secondary_cta_label": { + "name": "hero_secondary_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_secondary_cta_href": { + "name": "hero_secondary_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_eyebrow": { + "name": "kickoff_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_heading": { + "name": "kickoff_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_intro": { + "name": "kickoff_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_date": { + "name": "kickoff_date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_location": { + "name": "kickoff_location", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_location_href": { + "name": "kickoff_location_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_panel_title": { + "name": "kickoff_panel_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_speaker_label": { + "name": "kickoff_ui_speaker_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_linkedin_label": { + "name": "kickoff_ui_linkedin_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_kickoff_label": { + "name": "kickoff_ui_kickoff_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_panel_label": { + "name": "kickoff_ui_panel_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_register_label": { + "name": "kickoff_ui_register_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_ui_register_href": { + "name": "kickoff_ui_register_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_company_name": { + "name": "kickoff_company_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_company_href": { + "name": "kickoff_company_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_company_logo_id": { + "name": "kickoff_company_logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "kickoff_company_logo_alt": { + "name": "kickoff_company_logo_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "socials_eyebrow": { + "name": "socials_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "socials_heading": { + "name": "socials_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_eyebrow": { + "name": "quiz_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_heading": { + "name": "quiz_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_intro": { + "name": "quiz_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_question_label": { + "name": "quiz_ui_question_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_of_label": { + "name": "quiz_ui_of_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_back_label": { + "name": "quiz_ui_back_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_next_label": { + "name": "quiz_ui_next_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_show_result_label": { + "name": "quiz_ui_show_result_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_place_label": { + "name": "quiz_ui_place_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_ui_team_link_label": { + "name": "quiz_ui_team_link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_start_eyebrow": { + "name": "quiz_start_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_start_heading": { + "name": "quiz_start_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_start_copy": { + "name": "quiz_start_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_start_button_label": { + "name": "quiz_start_button_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_eyebrow": { + "name": "quiz_result_copy_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_heading": { + "name": "quiz_result_copy_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_copy": { + "name": "quiz_result_copy_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_restart_label": { + "name": "quiz_result_copy_restart_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_application_cta_label": { + "name": "quiz_result_copy_application_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_application_cta_href": { + "name": "quiz_result_copy_application_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_all_teams_cta_label": { + "name": "quiz_result_copy_all_teams_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "quiz_result_copy_all_teams_cta_href": { + "name": "quiz_result_copy_all_teams_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "journey_eyebrow": { + "name": "journey_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "journey_heading": { + "name": "journey_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "journey_intro": { + "name": "journey_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "journey_hint": { + "name": "journey_hint", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "application_eyebrow": { + "name": "application_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "application_heading": { + "name": "application_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "application_intro": { + "name": "application_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "application_is_open": { + "name": "application_is_open", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "application_application_url": { + "name": "application_application_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "application_coming_soon_label": { + "name": "application_coming_soon_label", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'Coming Soon'" + }, + "final_cta_eyebrow": { + "name": "final_cta_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "final_cta_heading": { + "name": "final_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "final_cta_copy": { + "name": "final_cta_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "final_cta_cta_label": { + "name": "final_cta_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "final_cta_cta_href": { + "name": "final_cta_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_kickoff_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_kickoff_hero_hero_image_idx": { + "name": "page_kickoff_hero_hero_image_idx", + "columns": [ + { + "expression": "hero_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff_kickoff_company_kickoff_company_logo_idx": { + "name": "page_kickoff_kickoff_company_kickoff_company_logo_idx", + "columns": [ + { + "expression": "kickoff_company_logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_kickoff__status_idx": { + "name": "page_kickoff__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_kickoff_hero_image_id_media_id_fk": { + "name": "page_kickoff_hero_image_id_media_id_fk", + "tableFrom": "page_kickoff", + "tableTo": "media", + "columnsFrom": [ + "hero_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_kickoff_kickoff_company_logo_id_media_id_fk": { + "name": "page_kickoff_kickoff_company_logo_id_media_id_fk", + "tableFrom": "page_kickoff", + "tableTo": "media", + "columnsFrom": [ + "kickoff_company_logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_kickoff_speakers": { + "name": "_page_kickoff_v_version_kickoff_speakers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "bio": { + "name": "bio", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "linkedin": { + "name": "linkedin", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "crop_x": { + "name": "crop_x", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 50 + }, + "crop_y": { + "name": "crop_y", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 24 + }, + "crop_zoom": { + "name": "crop_zoom", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 100 + }, + "crop_shift_y": { + "name": "crop_shift_y", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_kickoff_speakers_order_idx": { + "name": "_page_kickoff_v_version_kickoff_speakers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_kickoff_speakers_parent_id_idx": { + "name": "_page_kickoff_v_version_kickoff_speakers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_kickoff_speakers_image_idx": { + "name": "_page_kickoff_v_version_kickoff_speakers_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_kickoff_speakers_image_id_media_id_fk": { + "name": "_page_kickoff_v_version_kickoff_speakers_image_id_media_id_fk", + "tableFrom": "_page_kickoff_v_version_kickoff_speakers", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_kickoff_v_version_kickoff_speakers_parent_id_fk": { + "name": "_page_kickoff_v_version_kickoff_speakers_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_kickoff_speakers", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_socials_links": { + "name": "_page_kickoff_v_version_socials_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "icon": { + "name": "icon", + "type": "enum__page_kickoff_v_version_socials_links_icon", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_socials_links_order_idx": { + "name": "_page_kickoff_v_version_socials_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_socials_links_parent_id_idx": { + "name": "_page_kickoff_v_version_socials_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_socials_links_parent_id_fk": { + "name": "_page_kickoff_v_version_socials_links_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_socials_links", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_quiz_questions_answers_tags": { + "name": "_page_kickoff_v_version_quiz_questions_answers_tags", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_quiz_questions_answers_tags_order_idx": { + "name": "_page_kickoff_v_version_quiz_questions_answers_tags_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_quiz_questions_answers_tags_parent_id_idx": { + "name": "_page_kickoff_v_version_quiz_questions_answers_tags_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_quiz_questions_answers_tags_parent_id_fk": { + "name": "_page_kickoff_v_version_quiz_questions_answers_tags_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_quiz_questions_answers_tags", + "tableTo": "_page_kickoff_v_version_quiz_questions_answers", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_quiz_questions_answers": { + "name": "_page_kickoff_v_version_quiz_questions_answers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "answer_id": { + "name": "answer_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_quiz_questions_answers_order_idx": { + "name": "_page_kickoff_v_version_quiz_questions_answers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_quiz_questions_answers_parent_id_idx": { + "name": "_page_kickoff_v_version_quiz_questions_answers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_quiz_questions_answers_parent_id_fk": { + "name": "_page_kickoff_v_version_quiz_questions_answers_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_quiz_questions_answers", + "tableTo": "_page_kickoff_v_version_quiz_questions", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_quiz_questions": { + "name": "_page_kickoff_v_version_quiz_questions", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "kicker": { + "name": "kicker", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "question": { + "name": "question", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_quiz_questions_order_idx": { + "name": "_page_kickoff_v_version_quiz_questions_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_quiz_questions_parent_id_idx": { + "name": "_page_kickoff_v_version_quiz_questions_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_quiz_questions_parent_id_fk": { + "name": "_page_kickoff_v_version_quiz_questions_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_quiz_questions", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_quiz_results": { + "name": "_page_kickoff_v_version_quiz_results", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "team": { + "name": "team", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "notion_href": { + "name": "notion_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_quiz_results_order_idx": { + "name": "_page_kickoff_v_version_quiz_results_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_quiz_results_parent_id_idx": { + "name": "_page_kickoff_v_version_quiz_results_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_quiz_results_parent_id_fk": { + "name": "_page_kickoff_v_version_quiz_results_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_quiz_results", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_journey_moments": { + "name": "_page_kickoff_v_version_journey_moments", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_id": { + "name": "image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_journey_moments_order_idx": { + "name": "_page_kickoff_v_version_journey_moments_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_journey_moments_parent_id_idx": { + "name": "_page_kickoff_v_version_journey_moments_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_journey_moments_image_idx": { + "name": "_page_kickoff_v_version_journey_moments_image_idx", + "columns": [ + { + "expression": "image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_journey_moments_image_id_media_id_fk": { + "name": "_page_kickoff_v_version_journey_moments_image_id_media_id_fk", + "tableFrom": "_page_kickoff_v_version_journey_moments", + "tableTo": "media", + "columnsFrom": [ + "image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_kickoff_v_version_journey_moments_parent_id_fk": { + "name": "_page_kickoff_v_version_journey_moments_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_journey_moments", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v_version_application_steps": { + "name": "_page_kickoff_v_version_application_steps", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_application_steps_order_idx": { + "name": "_page_kickoff_v_version_application_steps_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_application_steps_parent_id_idx": { + "name": "_page_kickoff_v_version_application_steps_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_application_steps_parent_id_fk": { + "name": "_page_kickoff_v_version_application_steps_parent_id_fk", + "tableFrom": "_page_kickoff_v_version_application_steps", + "tableTo": "_page_kickoff_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_kickoff_v": { + "name": "_page_kickoff_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_hero_eyebrow": { + "name": "version_hero_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_headline": { + "name": "version_hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_copy": { + "name": "version_hero_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_image_id": { + "name": "version_hero_image_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_hero_image_alt": { + "name": "version_hero_image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_primary_cta_label": { + "name": "version_hero_primary_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_primary_cta_href": { + "name": "version_hero_primary_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_secondary_cta_label": { + "name": "version_hero_secondary_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_secondary_cta_href": { + "name": "version_hero_secondary_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_eyebrow": { + "name": "version_kickoff_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_heading": { + "name": "version_kickoff_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_intro": { + "name": "version_kickoff_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_date": { + "name": "version_kickoff_date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_location": { + "name": "version_kickoff_location", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_location_href": { + "name": "version_kickoff_location_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_panel_title": { + "name": "version_kickoff_panel_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_speaker_label": { + "name": "version_kickoff_ui_speaker_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_linkedin_label": { + "name": "version_kickoff_ui_linkedin_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_kickoff_label": { + "name": "version_kickoff_ui_kickoff_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_panel_label": { + "name": "version_kickoff_ui_panel_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_register_label": { + "name": "version_kickoff_ui_register_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_ui_register_href": { + "name": "version_kickoff_ui_register_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_company_name": { + "name": "version_kickoff_company_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_company_href": { + "name": "version_kickoff_company_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_company_logo_id": { + "name": "version_kickoff_company_logo_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_company_logo_alt": { + "name": "version_kickoff_company_logo_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_socials_eyebrow": { + "name": "version_socials_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_socials_heading": { + "name": "version_socials_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_eyebrow": { + "name": "version_quiz_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_heading": { + "name": "version_quiz_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_intro": { + "name": "version_quiz_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_question_label": { + "name": "version_quiz_ui_question_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_of_label": { + "name": "version_quiz_ui_of_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_back_label": { + "name": "version_quiz_ui_back_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_next_label": { + "name": "version_quiz_ui_next_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_show_result_label": { + "name": "version_quiz_ui_show_result_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_place_label": { + "name": "version_quiz_ui_place_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_ui_team_link_label": { + "name": "version_quiz_ui_team_link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_start_eyebrow": { + "name": "version_quiz_start_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_start_heading": { + "name": "version_quiz_start_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_start_copy": { + "name": "version_quiz_start_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_start_button_label": { + "name": "version_quiz_start_button_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_eyebrow": { + "name": "version_quiz_result_copy_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_heading": { + "name": "version_quiz_result_copy_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_copy": { + "name": "version_quiz_result_copy_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_restart_label": { + "name": "version_quiz_result_copy_restart_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_application_cta_label": { + "name": "version_quiz_result_copy_application_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_application_cta_href": { + "name": "version_quiz_result_copy_application_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_all_teams_cta_label": { + "name": "version_quiz_result_copy_all_teams_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_quiz_result_copy_all_teams_cta_href": { + "name": "version_quiz_result_copy_all_teams_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_journey_eyebrow": { + "name": "version_journey_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_journey_heading": { + "name": "version_journey_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_journey_intro": { + "name": "version_journey_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_journey_hint": { + "name": "version_journey_hint", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_application_eyebrow": { + "name": "version_application_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_application_heading": { + "name": "version_application_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_application_intro": { + "name": "version_application_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_application_is_open": { + "name": "version_application_is_open", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "version_application_application_url": { + "name": "version_application_application_url", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_application_coming_soon_label": { + "name": "version_application_coming_soon_label", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'Coming Soon'" + }, + "version_final_cta_eyebrow": { + "name": "version_final_cta_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_final_cta_heading": { + "name": "version_final_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_final_cta_copy": { + "name": "version_final_cta_copy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_final_cta_cta_label": { + "name": "version_final_cta_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_final_cta_cta_href": { + "name": "version_final_cta_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_kickoff_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_kickoff_v_version_hero_version_hero_image_idx": { + "name": "_page_kickoff_v_version_hero_version_hero_image_idx", + "columns": [ + { + "expression": "version_hero_image_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_kickoff_company_version_kickoff__idx": { + "name": "_page_kickoff_v_version_kickoff_company_version_kickoff__idx", + "columns": [ + { + "expression": "version_kickoff_company_logo_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_version_version__status_idx": { + "name": "_page_kickoff_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_created_at_idx": { + "name": "_page_kickoff_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_updated_at_idx": { + "name": "_page_kickoff_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_kickoff_v_latest_idx": { + "name": "_page_kickoff_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_kickoff_v_version_hero_image_id_media_id_fk": { + "name": "_page_kickoff_v_version_hero_image_id_media_id_fk", + "tableFrom": "_page_kickoff_v", + "tableTo": "media", + "columnsFrom": [ + "version_hero_image_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_kickoff_v_version_kickoff_company_logo_id_media_id_fk": { + "name": "_page_kickoff_v_version_kickoff_company_logo_id_media_id_fk", + "tableFrom": "_page_kickoff_v", + "tableTo": "media", + "columnsFrom": [ + "version_kickoff_company_logo_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_whyq_audiences_items": { + "name": "page_whyq_audiences_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_whyq_audiences_items_order_idx": { + "name": "page_whyq_audiences_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_whyq_audiences_items_parent_id_idx": { + "name": "page_whyq_audiences_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_whyq_audiences_items_parent_id_fk": { + "name": "page_whyq_audiences_items_parent_id_fk", + "tableFrom": "page_whyq_audiences_items", + "tableTo": "page_whyq_audiences", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_whyq_audiences": { + "name": "page_whyq_audiences", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "anchor_id": { + "name": "anchor_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_file_id": { + "name": "image_file_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_left": { + "name": "image_left", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "page_whyq_audiences_order_idx": { + "name": "page_whyq_audiences_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_whyq_audiences_parent_id_idx": { + "name": "page_whyq_audiences_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_whyq_audiences_image_file_idx": { + "name": "page_whyq_audiences_image_file_idx", + "columns": [ + { + "expression": "image_file_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_whyq_audiences_image_file_id_media_id_fk": { + "name": "page_whyq_audiences_image_file_id_media_id_fk", + "tableFrom": "page_whyq_audiences", + "tableTo": "media", + "columnsFrom": [ + "image_file_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "page_whyq_audiences_parent_id_fk": { + "name": "page_whyq_audiences_parent_id_fk", + "tableFrom": "page_whyq_audiences", + "tableTo": "page_whyq", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_whyq": { + "name": "page_whyq", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_whyq_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_whyq__status_idx": { + "name": "page_whyq__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_whyq_v_version_audiences_items": { + "name": "_page_whyq_v_version_audiences_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_whyq_v_version_audiences_items_order_idx": { + "name": "_page_whyq_v_version_audiences_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_version_audiences_items_parent_id_idx": { + "name": "_page_whyq_v_version_audiences_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_whyq_v_version_audiences_items_parent_id_fk": { + "name": "_page_whyq_v_version_audiences_items_parent_id_fk", + "tableFrom": "_page_whyq_v_version_audiences_items", + "tableTo": "_page_whyq_v_version_audiences", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_whyq_v_version_audiences": { + "name": "_page_whyq_v_version_audiences", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "anchor_id": { + "name": "anchor_id", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_file_id": { + "name": "image_file_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_alt": { + "name": "image_alt", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "image_left": { + "name": "image_left", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_whyq_v_version_audiences_order_idx": { + "name": "_page_whyq_v_version_audiences_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_version_audiences_parent_id_idx": { + "name": "_page_whyq_v_version_audiences_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_version_audiences_image_file_idx": { + "name": "_page_whyq_v_version_audiences_image_file_idx", + "columns": [ + { + "expression": "image_file_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_whyq_v_version_audiences_image_file_id_media_id_fk": { + "name": "_page_whyq_v_version_audiences_image_file_id_media_id_fk", + "tableFrom": "_page_whyq_v_version_audiences", + "tableTo": "media", + "columnsFrom": [ + "image_file_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "_page_whyq_v_version_audiences_parent_id_fk": { + "name": "_page_whyq_v_version_audiences_parent_id_fk", + "tableFrom": "_page_whyq_v_version_audiences", + "tableTo": "_page_whyq_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_whyq_v": { + "name": "_page_whyq_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_intro": { + "name": "version_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_whyq_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_whyq_v_version_version__status_idx": { + "name": "_page_whyq_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_created_at_idx": { + "name": "_page_whyq_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_updated_at_idx": { + "name": "_page_whyq_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_whyq_v_latest_idx": { + "name": "_page_whyq_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_speaker_panels": { + "name": "page_speaker_panels", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "icon_key": { + "name": "icon_key", + "type": "enum_page_speaker_panels_icon_key", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_speaker_panels_order_idx": { + "name": "page_speaker_panels_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_speaker_panels_parent_id_idx": { + "name": "page_speaker_panels_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_speaker_panels_parent_id_fk": { + "name": "page_speaker_panels_parent_id_fk", + "tableFrom": "page_speaker_panels", + "tableTo": "page_speaker", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_speaker": { + "name": "page_speaker", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_speaker_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_speaker__status_idx": { + "name": "page_speaker__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_speaker_v_version_panels": { + "name": "_page_speaker_v_version_panels", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "icon_key": { + "name": "icon_key", + "type": "enum__page_speaker_v_version_panels_icon_key", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_speaker_v_version_panels_order_idx": { + "name": "_page_speaker_v_version_panels_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_speaker_v_version_panels_parent_id_idx": { + "name": "_page_speaker_v_version_panels_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_speaker_v_version_panels_parent_id_fk": { + "name": "_page_speaker_v_version_panels_parent_id_fk", + "tableFrom": "_page_speaker_v_version_panels", + "tableTo": "_page_speaker_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_speaker_v": { + "name": "_page_speaker_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_intro": { + "name": "version_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_speaker_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_speaker_v_version_version__status_idx": { + "name": "_page_speaker_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_speaker_v_created_at_idx": { + "name": "_page_speaker_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_speaker_v_updated_at_idx": { + "name": "_page_speaker_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_speaker_v_latest_idx": { + "name": "_page_speaker_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_partner": { + "name": "page_partner", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "cta_heading": { + "name": "cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "cta_text": { + "name": "cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "cta_button_label": { + "name": "cta_button_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "cta_button_href": { + "name": "cta_button_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_partner_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_partner__status_idx": { + "name": "page_partner__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_partner_v": { + "name": "_page_partner_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_cta_heading": { + "name": "version_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_cta_text": { + "name": "version_cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_cta_button_label": { + "name": "version_cta_button_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_cta_button_href": { + "name": "version_cta_button_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_partner_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_partner_v_version_version__status_idx": { + "name": "_page_partner_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_partner_v_created_at_idx": { + "name": "_page_partner_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_partner_v_updated_at_idx": { + "name": "_page_partner_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_partner_v_latest_idx": { + "name": "_page_partner_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_program_agenda_items": { + "name": "page_program_agenda_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_program_agenda_items_order_idx": { + "name": "page_program_agenda_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_program_agenda_items_parent_id_idx": { + "name": "page_program_agenda_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_program_agenda_items_parent_id_fk": { + "name": "page_program_agenda_items_parent_id_fk", + "tableFrom": "page_program_agenda_items", + "tableTo": "page_program", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_program": { + "name": "page_program", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "agenda_heading": { + "name": "agenda_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "agenda_intro": { + "name": "agenda_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_heading": { + "name": "faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_intro": { + "name": "faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_heading": { + "name": "closing_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_text": { + "name": "closing_cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_program_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_program__status_idx": { + "name": "page_program__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_program_v_version_agenda_items": { + "name": "_page_program_v_version_agenda_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_program_v_version_agenda_items_order_idx": { + "name": "_page_program_v_version_agenda_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_program_v_version_agenda_items_parent_id_idx": { + "name": "_page_program_v_version_agenda_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_program_v_version_agenda_items_parent_id_fk": { + "name": "_page_program_v_version_agenda_items_parent_id_fk", + "tableFrom": "_page_program_v_version_agenda_items", + "tableTo": "_page_program_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_program_v": { + "name": "_page_program_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_agenda_heading": { + "name": "version_agenda_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_agenda_intro": { + "name": "version_agenda_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_heading": { + "name": "version_faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_intro": { + "name": "version_faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_heading": { + "name": "version_closing_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_text": { + "name": "version_closing_cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_program_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_program_v_version_version__status_idx": { + "name": "_page_program_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_program_v_created_at_idx": { + "name": "_page_program_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_program_v_updated_at_idx": { + "name": "_page_program_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_program_v_latest_idx": { + "name": "_page_program_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_hackathon_partners_groups_partners": { + "name": "page_hackathon_partners_groups_partners", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "logo_file": { + "name": "logo_file", + "type": "hackathon_partner_logo_file", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_hackathon_partners_groups_partners_order_idx": { + "name": "page_hackathon_partners_groups_partners_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_hackathon_partners_groups_partners_parent_id_idx": { + "name": "page_hackathon_partners_groups_partners_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_hackathon_partners_groups_partners_parent_id_fk": { + "name": "page_hackathon_partners_groups_partners_parent_id_fk", + "tableFrom": "page_hackathon_partners_groups_partners", + "tableTo": "page_hackathon_partners_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_hackathon_partners_groups": { + "name": "page_hackathon_partners_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "group": { + "name": "group", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_hackathon_partners_groups_order_idx": { + "name": "page_hackathon_partners_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_hackathon_partners_groups_parent_id_idx": { + "name": "page_hackathon_partners_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_hackathon_partners_groups_parent_id_fk": { + "name": "page_hackathon_partners_groups_parent_id_fk", + "tableFrom": "page_hackathon_partners_groups", + "tableTo": "page_hackathon", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_hackathon_benefits_cards": { + "name": "page_hackathon_benefits_cards", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_hackathon_benefits_cards_order_idx": { + "name": "page_hackathon_benefits_cards_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_hackathon_benefits_cards_parent_id_idx": { + "name": "page_hackathon_benefits_cards_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_hackathon_benefits_cards_parent_id_fk": { + "name": "page_hackathon_benefits_cards_parent_id_fk", + "tableFrom": "page_hackathon_benefits_cards", + "tableTo": "page_hackathon", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_hackathon_schedule_items": { + "name": "page_hackathon_schedule_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_hackathon_schedule_items_order_idx": { + "name": "page_hackathon_schedule_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_hackathon_schedule_items_parent_id_idx": { + "name": "page_hackathon_schedule_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_hackathon_schedule_items_parent_id_fk": { + "name": "page_hackathon_schedule_items_parent_id_fk", + "tableFrom": "page_hackathon_schedule_items", + "tableTo": "page_hackathon", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_hackathon": { + "name": "page_hackathon", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "hero_headline": { + "name": "hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_tagline": { + "name": "hero_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_cta_label": { + "name": "hero_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_cta_href": { + "name": "hero_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "partners_heading": { + "name": "partners_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "benefits_heading": { + "name": "benefits_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "schedule_heading": { + "name": "schedule_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "schedule_intro": { + "name": "schedule_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_heading": { + "name": "faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "faq_section_intro": { + "name": "faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_heading": { + "name": "closing_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_text": { + "name": "closing_cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_mailto_label": { + "name": "closing_cta_mailto_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "closing_cta_mailto_email": { + "name": "closing_cta_mailto_email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_hackathon_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_hackathon__status_idx": { + "name": "page_hackathon__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_hackathon_v_version_partners_groups_partners": { + "name": "_page_hackathon_v_version_partners_groups_partners", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "logo_file": { + "name": "logo_file", + "type": "hackathon_partner_logo_file", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_hackathon_v_version_partners_groups_partners_order_idx": { + "name": "_page_hackathon_v_version_partners_groups_partners_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_version_partners_groups_partners_parent_id_idx": { + "name": "_page_hackathon_v_version_partners_groups_partners_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_hackathon_v_version_partners_groups_partners_parent_id_fk": { + "name": "_page_hackathon_v_version_partners_groups_partners_parent_id_fk", + "tableFrom": "_page_hackathon_v_version_partners_groups_partners", + "tableTo": "_page_hackathon_v_version_partners_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_hackathon_v_version_partners_groups": { + "name": "_page_hackathon_v_version_partners_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "group": { + "name": "group", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_hackathon_v_version_partners_groups_order_idx": { + "name": "_page_hackathon_v_version_partners_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_version_partners_groups_parent_id_idx": { + "name": "_page_hackathon_v_version_partners_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_hackathon_v_version_partners_groups_parent_id_fk": { + "name": "_page_hackathon_v_version_partners_groups_parent_id_fk", + "tableFrom": "_page_hackathon_v_version_partners_groups", + "tableTo": "_page_hackathon_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_hackathon_v_version_benefits_cards": { + "name": "_page_hackathon_v_version_benefits_cards", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_hackathon_v_version_benefits_cards_order_idx": { + "name": "_page_hackathon_v_version_benefits_cards_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_version_benefits_cards_parent_id_idx": { + "name": "_page_hackathon_v_version_benefits_cards_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_hackathon_v_version_benefits_cards_parent_id_fk": { + "name": "_page_hackathon_v_version_benefits_cards_parent_id_fk", + "tableFrom": "_page_hackathon_v_version_benefits_cards", + "tableTo": "_page_hackathon_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_hackathon_v_version_schedule_items": { + "name": "_page_hackathon_v_version_schedule_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "date": { + "name": "date", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_hackathon_v_version_schedule_items_order_idx": { + "name": "_page_hackathon_v_version_schedule_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_version_schedule_items_parent_id_idx": { + "name": "_page_hackathon_v_version_schedule_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_hackathon_v_version_schedule_items_parent_id_fk": { + "name": "_page_hackathon_v_version_schedule_items_parent_id_fk", + "tableFrom": "_page_hackathon_v_version_schedule_items", + "tableTo": "_page_hackathon_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_hackathon_v": { + "name": "_page_hackathon_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_hero_headline": { + "name": "version_hero_headline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_tagline": { + "name": "version_hero_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_cta_label": { + "name": "version_hero_cta_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_cta_href": { + "name": "version_hero_cta_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_partners_heading": { + "name": "version_partners_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_benefits_heading": { + "name": "version_benefits_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_schedule_heading": { + "name": "version_schedule_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_schedule_intro": { + "name": "version_schedule_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_heading": { + "name": "version_faq_section_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_faq_section_intro": { + "name": "version_faq_section_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_heading": { + "name": "version_closing_cta_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_text": { + "name": "version_closing_cta_text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_mailto_label": { + "name": "version_closing_cta_mailto_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_closing_cta_mailto_email": { + "name": "version_closing_cta_mailto_email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_hackathon_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_hackathon_v_version_version__status_idx": { + "name": "_page_hackathon_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_created_at_idx": { + "name": "_page_hackathon_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_updated_at_idx": { + "name": "_page_hackathon_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_hackathon_v_latest_idx": { + "name": "_page_hackathon_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_our_team": { + "name": "page_our_team", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_our_team_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_our_team__status_idx": { + "name": "page_our_team__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_our_team_v": { + "name": "_page_our_team_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_our_team_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_our_team_v_version_version__status_idx": { + "name": "_page_our_team_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_our_team_v_created_at_idx": { + "name": "_page_our_team_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_our_team_v_updated_at_idx": { + "name": "_page_our_team_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_our_team_v_latest_idx": { + "name": "_page_our_team_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_jobs": { + "name": "page_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "detail_how_to_contact_heading": { + "name": "detail_how_to_contact_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_jobs_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_jobs__status_idx": { + "name": "page_jobs__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_jobs_v": { + "name": "_page_jobs_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_intro": { + "name": "version_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_detail_how_to_contact_heading": { + "name": "version_detail_how_to_contact_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_jobs_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_jobs_v_version_version__status_idx": { + "name": "_page_jobs_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_jobs_v_created_at_idx": { + "name": "_page_jobs_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_jobs_v_updated_at_idx": { + "name": "_page_jobs_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_jobs_v_latest_idx": { + "name": "_page_jobs_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_phases_items": { + "name": "page_tickets_phases_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discount": { + "name": "discount", + "type": "numeric", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_phases_items_order_idx": { + "name": "page_tickets_phases_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_phases_items_parent_id_idx": { + "name": "page_tickets_phases_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_phases_items_parent_id_fk": { + "name": "page_tickets_phases_items_parent_id_fk", + "tableFrom": "page_tickets_phases_items", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_offer_tickets_highlights": { + "name": "page_tickets_offer_tickets_highlights", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_offer_tickets_highlights_order_idx": { + "name": "page_tickets_offer_tickets_highlights_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_offer_tickets_highlights_parent_id_idx": { + "name": "page_tickets_offer_tickets_highlights_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_offer_tickets_highlights_parent_id_fk": { + "name": "page_tickets_offer_tickets_highlights_parent_id_fk", + "tableFrom": "page_tickets_offer_tickets_highlights", + "tableTo": "page_tickets_offer_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_offer_tickets": { + "name": "page_tickets_offer_tickets", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "enum_page_tickets_offer_tickets_key", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "regular_price": { + "name": "regular_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_offer_tickets_order_idx": { + "name": "page_tickets_offer_tickets_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_offer_tickets_parent_id_idx": { + "name": "page_tickets_offer_tickets_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_offer_tickets_parent_id_fk": { + "name": "page_tickets_offer_tickets_parent_id_fk", + "tableFrom": "page_tickets_offer_tickets", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_included_groups_rows": { + "name": "page_tickets_included_groups_rows", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "student": { + "name": "student", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "young_professional": { + "name": "young_professional", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "start_up": { + "name": "start_up", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "investor": { + "name": "investor", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "corporate": { + "name": "corporate", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "page_tickets_included_groups_rows_order_idx": { + "name": "page_tickets_included_groups_rows_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_included_groups_rows_parent_id_idx": { + "name": "page_tickets_included_groups_rows_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_included_groups_rows_parent_id_fk": { + "name": "page_tickets_included_groups_rows_parent_id_fk", + "tableFrom": "page_tickets_included_groups_rows", + "tableTo": "page_tickets_included_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_included_groups": { + "name": "page_tickets_included_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kind": { + "name": "kind", + "type": "enum_page_tickets_included_groups_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'benefit'" + } + }, + "indexes": { + "page_tickets_included_groups_order_idx": { + "name": "page_tickets_included_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_included_groups_parent_id_idx": { + "name": "page_tickets_included_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_included_groups_parent_id_fk": { + "name": "page_tickets_included_groups_parent_id_fk", + "tableFrom": "page_tickets_included_groups", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_tiers_items_features": { + "name": "page_tickets_tiers_items_features", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_tiers_items_features_order_idx": { + "name": "page_tickets_tiers_items_features_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_tiers_items_features_parent_id_idx": { + "name": "page_tickets_tiers_items_features_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_tiers_items_features_parent_id_fk": { + "name": "page_tickets_tiers_items_features_parent_id_fk", + "tableFrom": "page_tickets_tiers_items_features", + "tableTo": "page_tickets_tiers_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_tiers_items": { + "name": "page_tickets_tiers_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "buy_label": { + "name": "buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "buy_href": { + "name": "buy_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_tiers_items_order_idx": { + "name": "page_tickets_tiers_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_tiers_items_parent_id_idx": { + "name": "page_tickets_tiers_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_tiers_items_parent_id_fk": { + "name": "page_tickets_tiers_items_parent_id_fk", + "tableFrom": "page_tickets_tiers_items", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_comparison_tiers": { + "name": "page_tickets_comparison_tiers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "audience": { + "name": "audience", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_comparison_tiers_order_idx": { + "name": "page_tickets_comparison_tiers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_comparison_tiers_parent_id_idx": { + "name": "page_tickets_comparison_tiers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_comparison_tiers_parent_id_fk": { + "name": "page_tickets_comparison_tiers_parent_id_fk", + "tableFrom": "page_tickets_comparison_tiers", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_comparison_groups_rows_included": { + "name": "page_tickets_comparison_groups_rows_included", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "page_tickets_comparison_groups_rows_included_order_idx": { + "name": "page_tickets_comparison_groups_rows_included_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_comparison_groups_rows_included_parent_id_idx": { + "name": "page_tickets_comparison_groups_rows_included_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_comparison_groups_rows_included_parent_id_fk": { + "name": "page_tickets_comparison_groups_rows_included_parent_id_fk", + "tableFrom": "page_tickets_comparison_groups_rows_included", + "tableTo": "page_tickets_comparison_groups_rows", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_comparison_groups_rows": { + "name": "page_tickets_comparison_groups_rows", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "feature": { + "name": "feature", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_comparison_groups_rows_order_idx": { + "name": "page_tickets_comparison_groups_rows_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_comparison_groups_rows_parent_id_idx": { + "name": "page_tickets_comparison_groups_rows_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_comparison_groups_rows_parent_id_fk": { + "name": "page_tickets_comparison_groups_rows_parent_id_fk", + "tableFrom": "page_tickets_comparison_groups_rows", + "tableTo": "page_tickets_comparison_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_comparison_groups": { + "name": "page_tickets_comparison_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "group": { + "name": "group", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_comparison_groups_order_idx": { + "name": "page_tickets_comparison_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_comparison_groups_parent_id_idx": { + "name": "page_tickets_comparison_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_comparison_groups_parent_id_fk": { + "name": "page_tickets_comparison_groups_parent_id_fk", + "tableFrom": "page_tickets_comparison_groups", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_categories_items_bullets": { + "name": "page_tickets_categories_items_bullets", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_categories_items_bullets_order_idx": { + "name": "page_tickets_categories_items_bullets_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_categories_items_bullets_parent_id_idx": { + "name": "page_tickets_categories_items_bullets_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_categories_items_bullets_parent_id_fk": { + "name": "page_tickets_categories_items_bullets_parent_id_fk", + "tableFrom": "page_tickets_categories_items_bullets", + "tableTo": "page_tickets_categories_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets_categories_items": { + "name": "page_tickets_categories_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets_categories_items_order_idx": { + "name": "page_tickets_categories_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_tickets_categories_items_parent_id_idx": { + "name": "page_tickets_categories_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_tickets_categories_items_parent_id_fk": { + "name": "page_tickets_categories_items_parent_id_fk", + "tableFrom": "page_tickets_categories_items", + "tableTo": "page_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_tickets": { + "name": "page_tickets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "hero_eyebrow": { + "name": "hero_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_heading": { + "name": "hero_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_intro": { + "name": "hero_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "hero_compare_label": { + "name": "hero_compare_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_label": { + "name": "phases_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_active_key": { + "name": "phases_active_key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_current_label": { + "name": "phases_current_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_upcoming_label": { + "name": "phases_upcoming_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_past_label": { + "name": "phases_past_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "phases_discount_label": { + "name": "phases_discount_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "offer_purchase_href": { + "name": "offer_purchase_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "offer_buy_label": { + "name": "offer_buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "offer_details_label": { + "name": "offer_details_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "offer_save_label": { + "name": "offer_save_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "offer_footnote": { + "name": "offer_footnote", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_heading": { + "name": "included_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_intro": { + "name": "included_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_ticket_buy_label": { + "name": "included_ticket_buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_count_label": { + "name": "included_count_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_included_label": { + "name": "included_included_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_not_included_label": { + "name": "included_not_included_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_required_label": { + "name": "included_required_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "included_not_required_label": { + "name": "included_not_required_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "compare_heading": { + "name": "compare_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "compare_intro": { + "name": "compare_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "compare_first_label": { + "name": "compare_first_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "compare_second_label": { + "name": "compare_second_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "tiers_heading": { + "name": "tiers_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "tiers_intro": { + "name": "tiers_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "comparison_heading": { + "name": "comparison_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "comparison_intro": { + "name": "comparison_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "comparison_academic_note": { + "name": "comparison_academic_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "categories_heading": { + "name": "categories_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_tickets_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_tickets__status_idx": { + "name": "page_tickets__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_phases_items": { + "name": "_page_tickets_v_version_phases_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discount": { + "name": "discount", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_phases_items_order_idx": { + "name": "_page_tickets_v_version_phases_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_phases_items_parent_id_idx": { + "name": "_page_tickets_v_version_phases_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_phases_items_parent_id_fk": { + "name": "_page_tickets_v_version_phases_items_parent_id_fk", + "tableFrom": "_page_tickets_v_version_phases_items", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_offer_tickets_highlights": { + "name": "_page_tickets_v_version_offer_tickets_highlights", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_offer_tickets_highlights_order_idx": { + "name": "_page_tickets_v_version_offer_tickets_highlights_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_offer_tickets_highlights_parent_id_idx": { + "name": "_page_tickets_v_version_offer_tickets_highlights_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_offer_tickets_highlights_parent_id_fk": { + "name": "_page_tickets_v_version_offer_tickets_highlights_parent_id_fk", + "tableFrom": "_page_tickets_v_version_offer_tickets_highlights", + "tableTo": "_page_tickets_v_version_offer_tickets", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_offer_tickets": { + "name": "_page_tickets_v_version_offer_tickets", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "enum__page_tickets_v_version_offer_tickets_key", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "regular_price": { + "name": "regular_price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_offer_tickets_order_idx": { + "name": "_page_tickets_v_version_offer_tickets_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_offer_tickets_parent_id_idx": { + "name": "_page_tickets_v_version_offer_tickets_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_offer_tickets_parent_id_fk": { + "name": "_page_tickets_v_version_offer_tickets_parent_id_fk", + "tableFrom": "_page_tickets_v_version_offer_tickets", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_included_groups_rows": { + "name": "_page_tickets_v_version_included_groups_rows", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "student": { + "name": "student", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "young_professional": { + "name": "young_professional", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "start_up": { + "name": "start_up", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "investor": { + "name": "investor", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "corporate": { + "name": "corporate", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_included_groups_rows_order_idx": { + "name": "_page_tickets_v_version_included_groups_rows_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_included_groups_rows_parent_id_idx": { + "name": "_page_tickets_v_version_included_groups_rows_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_included_groups_rows_parent_id_fk": { + "name": "_page_tickets_v_version_included_groups_rows_parent_id_fk", + "tableFrom": "_page_tickets_v_version_included_groups_rows", + "tableTo": "_page_tickets_v_version_included_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_included_groups": { + "name": "_page_tickets_v_version_included_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kind": { + "name": "kind", + "type": "enum__page_tickets_v_version_included_groups_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'benefit'" + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_included_groups_order_idx": { + "name": "_page_tickets_v_version_included_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_included_groups_parent_id_idx": { + "name": "_page_tickets_v_version_included_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_included_groups_parent_id_fk": { + "name": "_page_tickets_v_version_included_groups_parent_id_fk", + "tableFrom": "_page_tickets_v_version_included_groups", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_tiers_items_features": { + "name": "_page_tickets_v_version_tiers_items_features", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_tiers_items_features_order_idx": { + "name": "_page_tickets_v_version_tiers_items_features_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_tiers_items_features_parent_id_idx": { + "name": "_page_tickets_v_version_tiers_items_features_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_tiers_items_features_parent_id_fk": { + "name": "_page_tickets_v_version_tiers_items_features_parent_id_fk", + "tableFrom": "_page_tickets_v_version_tiers_items_features", + "tableTo": "_page_tickets_v_version_tiers_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_tiers_items": { + "name": "_page_tickets_v_version_tiers_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "note": { + "name": "note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "buy_label": { + "name": "buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "buy_href": { + "name": "buy_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_tiers_items_order_idx": { + "name": "_page_tickets_v_version_tiers_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_tiers_items_parent_id_idx": { + "name": "_page_tickets_v_version_tiers_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_tiers_items_parent_id_fk": { + "name": "_page_tickets_v_version_tiers_items_parent_id_fk", + "tableFrom": "_page_tickets_v_version_tiers_items", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_comparison_tiers": { + "name": "_page_tickets_v_version_comparison_tiers", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "price": { + "name": "price", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "audience": { + "name": "audience", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_comparison_tiers_order_idx": { + "name": "_page_tickets_v_version_comparison_tiers_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_comparison_tiers_parent_id_idx": { + "name": "_page_tickets_v_version_comparison_tiers_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_comparison_tiers_parent_id_fk": { + "name": "_page_tickets_v_version_comparison_tiers_parent_id_fk", + "tableFrom": "_page_tickets_v_version_comparison_tiers", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_comparison_groups_rows_included": { + "name": "_page_tickets_v_version_comparison_groups_rows_included", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "value": { + "name": "value", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_comparison_groups_rows_included_order_idx": { + "name": "_page_tickets_v_version_comparison_groups_rows_included_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_comparison_groups_rows_included_parent_id_idx": { + "name": "_page_tickets_v_version_comparison_groups_rows_included_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_comparison_groups_rows_included_parent_id_fk": { + "name": "_page_tickets_v_version_comparison_groups_rows_included_parent_id_fk", + "tableFrom": "_page_tickets_v_version_comparison_groups_rows_included", + "tableTo": "_page_tickets_v_version_comparison_groups_rows", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_comparison_groups_rows": { + "name": "_page_tickets_v_version_comparison_groups_rows", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "feature": { + "name": "feature", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_comparison_groups_rows_order_idx": { + "name": "_page_tickets_v_version_comparison_groups_rows_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_comparison_groups_rows_parent_id_idx": { + "name": "_page_tickets_v_version_comparison_groups_rows_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_comparison_groups_rows_parent_id_fk": { + "name": "_page_tickets_v_version_comparison_groups_rows_parent_id_fk", + "tableFrom": "_page_tickets_v_version_comparison_groups_rows", + "tableTo": "_page_tickets_v_version_comparison_groups", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_comparison_groups": { + "name": "_page_tickets_v_version_comparison_groups", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "group": { + "name": "group", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_comparison_groups_order_idx": { + "name": "_page_tickets_v_version_comparison_groups_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_comparison_groups_parent_id_idx": { + "name": "_page_tickets_v_version_comparison_groups_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_comparison_groups_parent_id_fk": { + "name": "_page_tickets_v_version_comparison_groups_parent_id_fk", + "tableFrom": "_page_tickets_v_version_comparison_groups", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_categories_items_bullets": { + "name": "_page_tickets_v_version_categories_items_bullets", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_categories_items_bullets_order_idx": { + "name": "_page_tickets_v_version_categories_items_bullets_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_categories_items_bullets_parent_id_idx": { + "name": "_page_tickets_v_version_categories_items_bullets_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_categories_items_bullets_parent_id_fk": { + "name": "_page_tickets_v_version_categories_items_bullets_parent_id_fk", + "tableFrom": "_page_tickets_v_version_categories_items_bullets", + "tableTo": "_page_tickets_v_version_categories_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v_version_categories_items": { + "name": "_page_tickets_v_version_categories_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_categories_items_order_idx": { + "name": "_page_tickets_v_version_categories_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_version_categories_items_parent_id_idx": { + "name": "_page_tickets_v_version_categories_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_tickets_v_version_categories_items_parent_id_fk": { + "name": "_page_tickets_v_version_categories_items_parent_id_fk", + "tableFrom": "_page_tickets_v_version_categories_items", + "tableTo": "_page_tickets_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_tickets_v": { + "name": "_page_tickets_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_hero_eyebrow": { + "name": "version_hero_eyebrow", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_heading": { + "name": "version_hero_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_intro": { + "name": "version_hero_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_hero_compare_label": { + "name": "version_hero_compare_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_label": { + "name": "version_phases_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_active_key": { + "name": "version_phases_active_key", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_current_label": { + "name": "version_phases_current_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_upcoming_label": { + "name": "version_phases_upcoming_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_past_label": { + "name": "version_phases_past_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_phases_discount_label": { + "name": "version_phases_discount_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_offer_purchase_href": { + "name": "version_offer_purchase_href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_offer_buy_label": { + "name": "version_offer_buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_offer_details_label": { + "name": "version_offer_details_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_offer_save_label": { + "name": "version_offer_save_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_offer_footnote": { + "name": "version_offer_footnote", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_heading": { + "name": "version_included_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_intro": { + "name": "version_included_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_ticket_buy_label": { + "name": "version_included_ticket_buy_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_count_label": { + "name": "version_included_count_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_included_label": { + "name": "version_included_included_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_not_included_label": { + "name": "version_included_not_included_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_required_label": { + "name": "version_included_required_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_included_not_required_label": { + "name": "version_included_not_required_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_compare_heading": { + "name": "version_compare_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_compare_intro": { + "name": "version_compare_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_compare_first_label": { + "name": "version_compare_first_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_compare_second_label": { + "name": "version_compare_second_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_tiers_heading": { + "name": "version_tiers_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_tiers_intro": { + "name": "version_tiers_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_comparison_heading": { + "name": "version_comparison_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_comparison_intro": { + "name": "version_comparison_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_comparison_academic_note": { + "name": "version_comparison_academic_note", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_categories_heading": { + "name": "version_categories_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_tickets_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_tickets_v_version_version__status_idx": { + "name": "_page_tickets_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_created_at_idx": { + "name": "_page_tickets_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_updated_at_idx": { + "name": "_page_tickets_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_tickets_v_latest_idx": { + "name": "_page_tickets_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact_board_paragraphs": { + "name": "page_contact_board_paragraphs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact_board_paragraphs_order_idx": { + "name": "page_contact_board_paragraphs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_contact_board_paragraphs_parent_id_idx": { + "name": "page_contact_board_paragraphs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_contact_board_paragraphs_parent_id_fk": { + "name": "page_contact_board_paragraphs_parent_id_fk", + "tableFrom": "page_contact_board_paragraphs", + "tableTo": "page_contact", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact_board_members": { + "name": "page_contact_board_members", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "link_label": { + "name": "link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact_board_members_order_idx": { + "name": "page_contact_board_members_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_contact_board_members_parent_id_idx": { + "name": "page_contact_board_members_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_contact_board_members_parent_id_fk": { + "name": "page_contact_board_members_parent_id_fk", + "tableFrom": "page_contact_board_members", + "tableTo": "page_contact", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact_reach_out_paragraphs": { + "name": "page_contact_reach_out_paragraphs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact_reach_out_paragraphs_order_idx": { + "name": "page_contact_reach_out_paragraphs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_contact_reach_out_paragraphs_parent_id_idx": { + "name": "page_contact_reach_out_paragraphs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_contact_reach_out_paragraphs_parent_id_fk": { + "name": "page_contact_reach_out_paragraphs_parent_id_fk", + "tableFrom": "page_contact_reach_out_paragraphs", + "tableTo": "page_contact", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact_reach_out_items_details": { + "name": "page_contact_reach_out_items_details", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact_reach_out_items_details_order_idx": { + "name": "page_contact_reach_out_items_details_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_contact_reach_out_items_details_parent_id_idx": { + "name": "page_contact_reach_out_items_details_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_contact_reach_out_items_details_parent_id_fk": { + "name": "page_contact_reach_out_items_details_parent_id_fk", + "tableFrom": "page_contact_reach_out_items_details", + "tableTo": "page_contact_reach_out_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact_reach_out_items": { + "name": "page_contact_reach_out_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact_reach_out_items_order_idx": { + "name": "page_contact_reach_out_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "page_contact_reach_out_items_parent_id_idx": { + "name": "page_contact_reach_out_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "page_contact_reach_out_items_parent_id_fk": { + "name": "page_contact_reach_out_items_parent_id_fk", + "tableFrom": "page_contact_reach_out_items", + "tableTo": "page_contact", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_contact": { + "name": "page_contact", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "board_heading": { + "name": "board_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "reach_out_heading": { + "name": "reach_out_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_contact_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_contact__status_idx": { + "name": "page_contact__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v_version_board_paragraphs": { + "name": "_page_contact_v_version_board_paragraphs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_board_paragraphs_order_idx": { + "name": "_page_contact_v_version_board_paragraphs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_version_board_paragraphs_parent_id_idx": { + "name": "_page_contact_v_version_board_paragraphs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_contact_v_version_board_paragraphs_parent_id_fk": { + "name": "_page_contact_v_version_board_paragraphs_parent_id_fk", + "tableFrom": "_page_contact_v_version_board_paragraphs", + "tableTo": "_page_contact_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v_version_board_members": { + "name": "_page_contact_v_version_board_members", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "link_label": { + "name": "link_label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_board_members_order_idx": { + "name": "_page_contact_v_version_board_members_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_version_board_members_parent_id_idx": { + "name": "_page_contact_v_version_board_members_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_contact_v_version_board_members_parent_id_fk": { + "name": "_page_contact_v_version_board_members_parent_id_fk", + "tableFrom": "_page_contact_v_version_board_members", + "tableTo": "_page_contact_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v_version_reach_out_paragraphs": { + "name": "_page_contact_v_version_reach_out_paragraphs", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_reach_out_paragraphs_order_idx": { + "name": "_page_contact_v_version_reach_out_paragraphs_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_version_reach_out_paragraphs_parent_id_idx": { + "name": "_page_contact_v_version_reach_out_paragraphs_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_contact_v_version_reach_out_paragraphs_parent_id_fk": { + "name": "_page_contact_v_version_reach_out_paragraphs_parent_id_fk", + "tableFrom": "_page_contact_v_version_reach_out_paragraphs", + "tableTo": "_page_contact_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v_version_reach_out_items_details": { + "name": "_page_contact_v_version_reach_out_items_details", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_reach_out_items_details_order_idx": { + "name": "_page_contact_v_version_reach_out_items_details_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_version_reach_out_items_details_parent_id_idx": { + "name": "_page_contact_v_version_reach_out_items_details_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_contact_v_version_reach_out_items_details_parent_id_fk": { + "name": "_page_contact_v_version_reach_out_items_details_parent_id_fk", + "tableFrom": "_page_contact_v_version_reach_out_items_details", + "tableTo": "_page_contact_v_version_reach_out_items", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v_version_reach_out_items": { + "name": "_page_contact_v_version_reach_out_items", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_reach_out_items_order_idx": { + "name": "_page_contact_v_version_reach_out_items_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_version_reach_out_items_parent_id_idx": { + "name": "_page_contact_v_version_reach_out_items_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_page_contact_v_version_reach_out_items_parent_id_fk": { + "name": "_page_contact_v_version_reach_out_items_parent_id_fk", + "tableFrom": "_page_contact_v_version_reach_out_items", + "tableTo": "_page_contact_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_contact_v": { + "name": "_page_contact_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_board_heading": { + "name": "version_board_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_reach_out_heading": { + "name": "version_reach_out_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_contact_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_contact_v_version_version__status_idx": { + "name": "_page_contact_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_created_at_idx": { + "name": "_page_contact_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_updated_at_idx": { + "name": "_page_contact_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_contact_v_latest_idx": { + "name": "_page_contact_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.page_past_teams": { + "name": "page_past_teams", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "heading": { + "name": "heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "intro": { + "name": "intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "meta_description": { + "name": "meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_page_past_teams_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "page_past_teams__status_idx": { + "name": "page_past_teams__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._page_past_teams_v": { + "name": "_page_past_teams_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_heading": { + "name": "version_heading", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_intro": { + "name": "version_intro", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_title": { + "name": "version_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_meta_description": { + "name": "version_meta_description", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__page_past_teams_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_page_past_teams_v_version_version__status_idx": { + "name": "_page_past_teams_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_past_teams_v_created_at_idx": { + "name": "_page_past_teams_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_past_teams_v_updated_at_idx": { + "name": "_page_past_teams_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_page_past_teams_v_latest_idx": { + "name": "_page_past_teams_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings_nav_children": { + "name": "site_settings_nav_children", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings_nav_children_order_idx": { + "name": "site_settings_nav_children_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "site_settings_nav_children_parent_id_idx": { + "name": "site_settings_nav_children_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "site_settings_nav_children_parent_id_fk": { + "name": "site_settings_nav_children_parent_id_fk", + "tableFrom": "site_settings_nav_children", + "tableTo": "site_settings_nav", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings_nav": { + "name": "site_settings_nav", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings_nav_order_idx": { + "name": "site_settings_nav_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "site_settings_nav_parent_id_idx": { + "name": "site_settings_nav_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "site_settings_nav_parent_id_fk": { + "name": "site_settings_nav_parent_id_fk", + "tableFrom": "site_settings_nav", + "tableTo": "site_settings", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings_footer_links": { + "name": "site_settings_footer_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings_footer_links_order_idx": { + "name": "site_settings_footer_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "site_settings_footer_links_parent_id_idx": { + "name": "site_settings_footer_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "site_settings_footer_links_parent_id_fk": { + "name": "site_settings_footer_links_parent_id_fk", + "tableFrom": "site_settings_footer_links", + "tableTo": "site_settings", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings_footer_social_links": { + "name": "site_settings_footer_social_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "platform": { + "name": "platform", + "type": "enum_site_settings_footer_social_links_platform", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings_footer_social_links_order_idx": { + "name": "site_settings_footer_social_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "site_settings_footer_social_links_parent_id_idx": { + "name": "site_settings_footer_social_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "site_settings_footer_social_links_parent_id_fk": { + "name": "site_settings_footer_social_links_parent_id_fk", + "tableFrom": "site_settings_footer_social_links", + "tableTo": "site_settings", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings_llms_key_facts": { + "name": "site_settings_llms_key_facts", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings_llms_key_facts_order_idx": { + "name": "site_settings_llms_key_facts_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "site_settings_llms_key_facts_parent_id_idx": { + "name": "site_settings_llms_key_facts_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "site_settings_llms_key_facts_parent_id_fk": { + "name": "site_settings_llms_key_facts_parent_id_fk", + "tableFrom": "site_settings_llms_key_facts", + "tableTo": "site_settings", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.site_settings": { + "name": "site_settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "site_title": { + "name": "site_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "footer_tagline": { + "name": "footer_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "footer_copyright_holder": { + "name": "footer_copyright_holder", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "llms_summary": { + "name": "llms_summary", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "llms_pitch": { + "name": "llms_pitch", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "llms_last_reviewed": { + "name": "llms_last_reviewed", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "kickoff_page_enabled": { + "name": "kickoff_page_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "kickoff_redirect_root": { + "name": "kickoff_redirect_root", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_site_settings_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "site_settings__status_idx": { + "name": "site_settings__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v_version_nav_children": { + "name": "_site_settings_v_version_nav_children", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_nav_children_order_idx": { + "name": "_site_settings_v_version_nav_children_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_version_nav_children_parent_id_idx": { + "name": "_site_settings_v_version_nav_children_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_site_settings_v_version_nav_children_parent_id_fk": { + "name": "_site_settings_v_version_nav_children_parent_id_fk", + "tableFrom": "_site_settings_v_version_nav_children", + "tableTo": "_site_settings_v_version_nav", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v_version_nav": { + "name": "_site_settings_v_version_nav", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_nav_order_idx": { + "name": "_site_settings_v_version_nav_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_version_nav_parent_id_idx": { + "name": "_site_settings_v_version_nav_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_site_settings_v_version_nav_parent_id_fk": { + "name": "_site_settings_v_version_nav_parent_id_fk", + "tableFrom": "_site_settings_v_version_nav", + "tableTo": "_site_settings_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v_version_footer_links": { + "name": "_site_settings_v_version_footer_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_footer_links_order_idx": { + "name": "_site_settings_v_version_footer_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_version_footer_links_parent_id_idx": { + "name": "_site_settings_v_version_footer_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_site_settings_v_version_footer_links_parent_id_fk": { + "name": "_site_settings_v_version_footer_links_parent_id_fk", + "tableFrom": "_site_settings_v_version_footer_links", + "tableTo": "_site_settings_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v_version_footer_social_links": { + "name": "_site_settings_v_version_footer_social_links", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "href": { + "name": "href", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "platform": { + "name": "platform", + "type": "enum__site_settings_v_version_footer_social_links_platform", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_footer_social_links_order_idx": { + "name": "_site_settings_v_version_footer_social_links_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_version_footer_social_links_parent_id_idx": { + "name": "_site_settings_v_version_footer_social_links_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_site_settings_v_version_footer_social_links_parent_id_fk": { + "name": "_site_settings_v_version_footer_social_links_parent_id_fk", + "tableFrom": "_site_settings_v_version_footer_social_links", + "tableTo": "_site_settings_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v_version_llms_key_facts": { + "name": "_site_settings_v_version_llms_key_facts", + "schema": "", + "columns": { + "_order": { + "name": "_order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "_parent_id": { + "name": "_parent_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "text": { + "name": "text", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "_uuid": { + "name": "_uuid", + "type": "varchar", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_llms_key_facts_order_idx": { + "name": "_site_settings_v_version_llms_key_facts_order_idx", + "columns": [ + { + "expression": "_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_version_llms_key_facts_parent_id_idx": { + "name": "_site_settings_v_version_llms_key_facts_parent_id_idx", + "columns": [ + { + "expression": "_parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "_site_settings_v_version_llms_key_facts_parent_id_fk": { + "name": "_site_settings_v_version_llms_key_facts_parent_id_fk", + "tableFrom": "_site_settings_v_version_llms_key_facts", + "tableTo": "_site_settings_v", + "columnsFrom": [ + "_parent_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._site_settings_v": { + "name": "_site_settings_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_site_title": { + "name": "version_site_title", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_footer_tagline": { + "name": "version_footer_tagline", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_footer_copyright_holder": { + "name": "version_footer_copyright_holder", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_llms_summary": { + "name": "version_llms_summary", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_llms_pitch": { + "name": "version_llms_pitch", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_llms_last_reviewed": { + "name": "version_llms_last_reviewed", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_kickoff_page_enabled": { + "name": "version_kickoff_page_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "version_kickoff_redirect_root": { + "name": "version_kickoff_redirect_root", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__site_settings_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_site_settings_v_version_version__status_idx": { + "name": "_site_settings_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_created_at_idx": { + "name": "_site_settings_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_updated_at_idx": { + "name": "_site_settings_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_site_settings_v_latest_idx": { + "name": "_site_settings_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.legal": { + "name": "legal", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "imprint": { + "name": "imprint", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "privacy_policy": { + "name": "privacy_policy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "terms_and_conditions": { + "name": "terms_and_conditions", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_by": { + "name": "last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_edited_at": { + "name": "last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "last_published_by": { + "name": "last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "last_published_at": { + "name": "last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "_status": { + "name": "_status", + "type": "enum_legal_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "legal__status_idx": { + "name": "legal__status_idx", + "columns": [ + { + "expression": "_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public._legal_v": { + "name": "_legal_v", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "version_imprint": { + "name": "version_imprint", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_privacy_policy": { + "name": "version_privacy_policy", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_terms_and_conditions": { + "name": "version_terms_and_conditions", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_by": { + "name": "version_last_edited_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_edited_at": { + "name": "version_last_edited_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_last_published_by": { + "name": "version_last_published_by", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "version_last_published_at": { + "name": "version_last_published_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version__status": { + "name": "version__status", + "type": "enum__legal_v_version_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'draft'" + }, + "version_updated_at": { + "name": "version_updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "version_created_at": { + "name": "version_created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp(3) with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "latest": { + "name": "latest", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "_legal_v_version_version__status_idx": { + "name": "_legal_v_version_version__status_idx", + "columns": [ + { + "expression": "version__status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_legal_v_created_at_idx": { + "name": "_legal_v_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_legal_v_updated_at_idx": { + "name": "_legal_v_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "_legal_v_latest_idx": { + "name": "_legal_v_latest_idx", + "columns": [ + { + "expression": "latest", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.enum_partners_tier": { + "name": "enum_partners_tier", + "schema": "public", + "values": [ + "platinum", + "gold", + "silver", + "starter", + "knowledge", + "event", + "mobility", + "university-and-network", + "media" + ] + }, + "public.enum_partners_status": { + "name": "enum_partners_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__partners_v_version_tier": { + "name": "enum__partners_v_version_tier", + "schema": "public", + "values": [ + "platinum", + "gold", + "silver", + "starter", + "knowledge", + "event", + "mobility", + "university-and-network", + "media" + ] + }, + "public.enum__partners_v_version_status": { + "name": "enum__partners_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_jobs_workload": { + "name": "enum_jobs_workload", + "schema": "public", + "values": [ + "full-time", + "internship", + "working-student" + ] + }, + "public.enum_jobs_status": { + "name": "enum_jobs_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__jobs_v_version_workload": { + "name": "enum__jobs_v_version_workload", + "schema": "public", + "values": [ + "full-time", + "internship", + "working-student" + ] + }, + "public.enum__jobs_v_version_status": { + "name": "enum__jobs_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_speakers_group": { + "name": "enum_speakers_group", + "schema": "public", + "values": [ + "current", + "moderation", + "panel", + "previous" + ] + }, + "public.enum_speakers_status": { + "name": "enum_speakers_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__speakers_v_version_group": { + "name": "enum__speakers_v_version_group", + "schema": "public", + "values": [ + "current", + "moderation", + "panel", + "previous" + ] + }, + "public.enum__speakers_v_version_status": { + "name": "enum__speakers_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_team_division": { + "name": "enum_team_division", + "schema": "public", + "values": [ + "chair", + "pr", + "partner", + "finance", + "operations", + "concept", + "it" + ] + }, + "public.enum_team_status": { + "name": "enum_team_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__team_v_version_division": { + "name": "enum__team_v_version_division", + "schema": "public", + "values": [ + "chair", + "pr", + "partner", + "finance", + "operations", + "concept", + "it" + ] + }, + "public.enum__team_v_version_status": { + "name": "enum__team_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_past_teams_status": { + "name": "enum_past_teams_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__past_teams_v_version_status": { + "name": "enum__past_teams_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_faqs_page": { + "name": "enum_faqs_page", + "schema": "public", + "values": [ + "home", + "program", + "hackathon" + ] + }, + "public.enum_faqs_status": { + "name": "enum_faqs_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__faqs_v_version_page": { + "name": "enum__faqs_v_version_page", + "schema": "public", + "values": [ + "home", + "program", + "hackathon" + ] + }, + "public.enum__faqs_v_version_status": { + "name": "enum__faqs_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_testimonials_status": { + "name": "enum_testimonials_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__testimonials_v_version_status": { + "name": "enum__testimonials_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_users_divisions": { + "name": "enum_users_divisions", + "schema": "public", + "values": [ + "chair", + "pr", + "partner", + "finance", + "operations", + "concept", + "it" + ] + }, + "public.enum_users_roles": { + "name": "enum_users_roles", + "schema": "public", + "values": [ + "editor", + "approver", + "admin" + ] + }, + "public.enum_page_home_social_posts_platform": { + "name": "enum_page_home_social_posts_platform", + "schema": "public", + "values": [ + "linkedin", + "instagram" + ] + }, + "public.enum_page_home_status": { + "name": "enum_page_home_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_home_v_version_social_posts_platform": { + "name": "enum__page_home_v_version_social_posts_platform", + "schema": "public", + "values": [ + "linkedin", + "instagram" + ] + }, + "public.enum__page_home_v_version_status": { + "name": "enum__page_home_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_kickoff_socials_links_icon": { + "name": "enum_page_kickoff_socials_links_icon", + "schema": "public", + "values": [ + "whatsapp", + "tiktok", + "instagram", + "linkedin" + ] + }, + "public.enum_page_kickoff_status": { + "name": "enum_page_kickoff_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_kickoff_v_version_socials_links_icon": { + "name": "enum__page_kickoff_v_version_socials_links_icon", + "schema": "public", + "values": [ + "whatsapp", + "tiktok", + "instagram", + "linkedin" + ] + }, + "public.enum__page_kickoff_v_version_status": { + "name": "enum__page_kickoff_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_whyq_status": { + "name": "enum_page_whyq_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_whyq_v_version_status": { + "name": "enum__page_whyq_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_speaker_panels_icon_key": { + "name": "enum_page_speaker_panels_icon_key", + "schema": "public", + "values": [ + "globe", + "refund", + "ai" + ] + }, + "public.enum_page_speaker_status": { + "name": "enum_page_speaker_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_speaker_v_version_panels_icon_key": { + "name": "enum__page_speaker_v_version_panels_icon_key", + "schema": "public", + "values": [ + "globe", + "refund", + "ai" + ] + }, + "public.enum__page_speaker_v_version_status": { + "name": "enum__page_speaker_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_partner_status": { + "name": "enum_page_partner_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_partner_v_version_status": { + "name": "enum__page_partner_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_program_status": { + "name": "enum_page_program_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_program_v_version_status": { + "name": "enum__page_program_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.hackathon_partner_logo_file": { + "name": "hackathon_partner_logo_file", + "schema": "public", + "values": [ + "69bfc230ceecbebceff708fc_new-logo.webp", + "69b17a0e089f34c65a5e14a2_Picnic_logo.svg", + "69bfc037724d038aa2ba26bc_image.png", + "69c25665fc7b9cf5fb7a2889_f6961aac836f-Logo__2_.webp", + "69d00444ac69243eaf2b4f4f_istari-logo.svg", + "69c255cf7613b98e497cf289_OpenAI-black-wordmark(1).webp", + "69b2e8289e0d3b7dd0ae9529_lovable_logo.svg", + "69c99a0acf960a512107bc95_Anthropic_logo.svg", + "69c256c8d3ff156cf6877066_elevenlabs-logo-black.webp", + "69ccf786df18a395b3fee7fd_n8n_pink%2Bblack_logo.svg", + "69d40a60aa0c813fdc6344eb_featherlessai-transparent.webp", + "69d675fef0b853cb5df97e4e_liveavatar_logo_vertical_dark.webp", + "69b458c74be9d2023714bcbf_itmx_logo.webp", + "69d00453416ddd4a45dad964_mlh-logo-color-dark.svg", + "digitalocean-logo-horizontal-blue.svg", + "dev-logo-black.svg", + "elevenlabs-logo-black.svg" + ] + }, + "public.enum_page_hackathon_status": { + "name": "enum_page_hackathon_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_hackathon_v_version_status": { + "name": "enum__page_hackathon_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_our_team_status": { + "name": "enum_page_our_team_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_our_team_v_version_status": { + "name": "enum__page_our_team_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_jobs_status": { + "name": "enum_page_jobs_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_jobs_v_version_status": { + "name": "enum__page_jobs_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_tickets_offer_tickets_key": { + "name": "enum_page_tickets_offer_tickets_key", + "schema": "public", + "values": [ + "student", + "young-professional", + "start-up", + "investor", + "corporate" + ] + }, + "public.enum_page_tickets_included_groups_kind": { + "name": "enum_page_tickets_included_groups_kind", + "schema": "public", + "values": [ + "benefit", + "eligibility" + ] + }, + "public.enum_page_tickets_status": { + "name": "enum_page_tickets_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_tickets_v_version_offer_tickets_key": { + "name": "enum__page_tickets_v_version_offer_tickets_key", + "schema": "public", + "values": [ + "student", + "young-professional", + "start-up", + "investor", + "corporate" + ] + }, + "public.enum__page_tickets_v_version_included_groups_kind": { + "name": "enum__page_tickets_v_version_included_groups_kind", + "schema": "public", + "values": [ + "benefit", + "eligibility" + ] + }, + "public.enum__page_tickets_v_version_status": { + "name": "enum__page_tickets_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_contact_status": { + "name": "enum_page_contact_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_contact_v_version_status": { + "name": "enum__page_contact_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_page_past_teams_status": { + "name": "enum_page_past_teams_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__page_past_teams_v_version_status": { + "name": "enum__page_past_teams_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_site_settings_footer_social_links_platform": { + "name": "enum_site_settings_footer_social_links_platform", + "schema": "public", + "values": [ + "tiktok", + "instagram-qsummit", + "instagram-qhack", + "linkedin", + "youtube" + ] + }, + "public.enum_site_settings_status": { + "name": "enum_site_settings_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__site_settings_v_version_footer_social_links_platform": { + "name": "enum__site_settings_v_version_footer_social_links_platform", + "schema": "public", + "values": [ + "tiktok", + "instagram-qsummit", + "instagram-qhack", + "linkedin", + "youtube" + ] + }, + "public.enum__site_settings_v_version_status": { + "name": "enum__site_settings_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum_legal_status": { + "name": "enum_legal_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + }, + "public.enum__legal_v_version_status": { + "name": "enum__legal_v_version_status", + "schema": "public", + "values": [ + "draft", + "published" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "id": "9727a697-f061-4b3b-ba8d-ed1635856f29", + "prevId": "00000000-0000-0000-0000-000000000000" +} \ No newline at end of file diff --git a/apps/cms/src/migrations/20261111_104849_home_2027.ts b/apps/cms/src/migrations/20261111_104849_home_2027.ts new file mode 100644 index 0000000..3fe4ebc --- /dev/null +++ b/apps/cms/src/migrations/20261111_104849_home_2027.ts @@ -0,0 +1,284 @@ +import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' + +export async function up({ db, payload, req }: MigrateUpArgs): Promise { + await db.execute(sql` + CREATE TYPE "public"."enum_page_home_social_posts_platform" AS ENUM('linkedin', 'instagram'); + CREATE TYPE "public"."enum__page_home_v_version_social_posts_platform" AS ENUM('linkedin', 'instagram'); + CREATE TABLE "page_home_hero_lead_lines" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "text" varchar + ); + + CREATE TABLE "page_home_previous_speakers_highlights" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "text" varchar + ); + + CREATE TABLE "page_home_previous_speakers_stand_ins" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "text" varchar + ); + + CREATE TABLE "page_home_social_posts" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "platform" "enum_page_home_social_posts_platform", + "href" varchar, + "image_id" integer, + "image_alt" varchar + ); + + CREATE TABLE "_page_home_v_version_hero_lead_lines" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" serial PRIMARY KEY NOT NULL, + "text" varchar, + "_uuid" varchar + ); + + CREATE TABLE "_page_home_v_version_previous_speakers_highlights" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" serial PRIMARY KEY NOT NULL, + "text" varchar, + "_uuid" varchar + ); + + CREATE TABLE "_page_home_v_version_previous_speakers_stand_ins" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" serial PRIMARY KEY NOT NULL, + "text" varchar, + "_uuid" varchar + ); + + CREATE TABLE "_page_home_v_version_social_posts" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" serial PRIMARY KEY NOT NULL, + "platform" "enum__page_home_v_version_social_posts_platform", + "href" varchar, + "image_id" integer, + "image_alt" varchar, + "_uuid" varchar + ); + + CREATE TABLE "site_settings_nav_children" ( + "_order" integer NOT NULL, + "_parent_id" varchar NOT NULL, + "id" varchar PRIMARY KEY NOT NULL, + "label" varchar, + "href" varchar + ); + + CREATE TABLE "_site_settings_v_version_nav_children" ( + "_order" integer NOT NULL, + "_parent_id" integer NOT NULL, + "id" serial PRIMARY KEY NOT NULL, + "label" varchar, + "href" varchar, + "_uuid" varchar + ); + + ALTER TABLE "page_home_partner_band_items" ADD COLUMN "description" varchar; + ALTER TABLE "page_home_why_attend_cards" ADD COLUMN "eyebrow" varchar; + ALTER TABLE "page_home_why_attend_cards" ADD COLUMN "href" varchar; + ALTER TABLE "page_home_why_attend_cards" ADD COLUMN "link_label" varchar; + ALTER TABLE "page_home_why_attend_cards" ADD COLUMN "image_id" integer; + ALTER TABLE "page_home_why_attend_cards" ADD COLUMN "image_alt" varchar; + ALTER TABLE "page_home" ADD COLUMN "hero_badge" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_days_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_hours_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_minutes_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_seconds_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_spoken_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "countdown_live_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "partner_band_eyebrow" varchar; + ALTER TABLE "page_home" ADD COLUMN "partner_band_heading" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_eyebrow" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_alumni_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_year" numeric; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_slots" numeric DEFAULT 4; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_show_placeholders" boolean DEFAULT false; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_placeholder_name" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_lineup_placeholder_role" varchar; + ALTER TABLE "page_home" ADD COLUMN "previous_speakers_stand_in_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "why_attend_eyebrow" varchar; + ALTER TABLE "page_home" ADD COLUMN "social_eyebrow" varchar; + ALTER TABLE "page_home" ADD COLUMN "social_heading" varchar; + ALTER TABLE "page_home" ADD COLUMN "social_intro" varchar; + ALTER TABLE "page_home" ADD COLUMN "social_linkedin_label" varchar; + ALTER TABLE "page_home" ADD COLUMN "social_instagram_label" varchar; + ALTER TABLE "_page_home_v_version_partner_band_items" ADD COLUMN "description" varchar; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD COLUMN "eyebrow" varchar; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD COLUMN "href" varchar; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD COLUMN "link_label" varchar; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD COLUMN "image_id" integer; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD COLUMN "image_alt" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_hero_badge" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_days_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_hours_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_minutes_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_seconds_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_spoken_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_countdown_live_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_partner_band_eyebrow" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_partner_band_heading" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_eyebrow" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_alumni_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_year" numeric; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_slots" numeric DEFAULT 4; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_show_placeholders" boolean DEFAULT false; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_placeholder_name" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_lineup_placeholder_role" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_previous_speakers_stand_in_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_why_attend_eyebrow" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_social_eyebrow" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_social_heading" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_social_intro" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_social_linkedin_label" varchar; + ALTER TABLE "_page_home_v" ADD COLUMN "version_social_instagram_label" varchar; + ALTER TABLE "page_home_hero_lead_lines" ADD CONSTRAINT "page_home_hero_lead_lines_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."page_home"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "page_home_previous_speakers_highlights" ADD CONSTRAINT "page_home_previous_speakers_highlights_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."page_home"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "page_home_previous_speakers_stand_ins" ADD CONSTRAINT "page_home_previous_speakers_stand_ins_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."page_home"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "page_home_social_posts" ADD CONSTRAINT "page_home_social_posts_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "page_home_social_posts" ADD CONSTRAINT "page_home_social_posts_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."page_home"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "_page_home_v_version_hero_lead_lines" ADD CONSTRAINT "_page_home_v_version_hero_lead_lines_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_page_home_v"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "_page_home_v_version_previous_speakers_highlights" ADD CONSTRAINT "_page_home_v_version_previous_speakers_highlights_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_page_home_v"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "_page_home_v_version_previous_speakers_stand_ins" ADD CONSTRAINT "_page_home_v_version_previous_speakers_stand_ins_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_page_home_v"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "_page_home_v_version_social_posts" ADD CONSTRAINT "_page_home_v_version_social_posts_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "_page_home_v_version_social_posts" ADD CONSTRAINT "_page_home_v_version_social_posts_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_page_home_v"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "site_settings_nav_children" ADD CONSTRAINT "site_settings_nav_children_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."site_settings_nav"("id") ON DELETE cascade ON UPDATE no action; + ALTER TABLE "_site_settings_v_version_nav_children" ADD CONSTRAINT "_site_settings_v_version_nav_children_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_site_settings_v_version_nav"("id") ON DELETE cascade ON UPDATE no action; + CREATE INDEX "page_home_hero_lead_lines_order_idx" ON "page_home_hero_lead_lines" USING btree ("_order"); + CREATE INDEX "page_home_hero_lead_lines_parent_id_idx" ON "page_home_hero_lead_lines" USING btree ("_parent_id"); + CREATE INDEX "page_home_previous_speakers_highlights_order_idx" ON "page_home_previous_speakers_highlights" USING btree ("_order"); + CREATE INDEX "page_home_previous_speakers_highlights_parent_id_idx" ON "page_home_previous_speakers_highlights" USING btree ("_parent_id"); + CREATE INDEX "page_home_previous_speakers_stand_ins_order_idx" ON "page_home_previous_speakers_stand_ins" USING btree ("_order"); + CREATE INDEX "page_home_previous_speakers_stand_ins_parent_id_idx" ON "page_home_previous_speakers_stand_ins" USING btree ("_parent_id"); + CREATE INDEX "page_home_social_posts_order_idx" ON "page_home_social_posts" USING btree ("_order"); + CREATE INDEX "page_home_social_posts_parent_id_idx" ON "page_home_social_posts" USING btree ("_parent_id"); + CREATE INDEX "page_home_social_posts_image_idx" ON "page_home_social_posts" USING btree ("image_id"); + CREATE INDEX "_page_home_v_version_hero_lead_lines_order_idx" ON "_page_home_v_version_hero_lead_lines" USING btree ("_order"); + CREATE INDEX "_page_home_v_version_hero_lead_lines_parent_id_idx" ON "_page_home_v_version_hero_lead_lines" USING btree ("_parent_id"); + CREATE INDEX "_page_home_v_version_previous_speakers_highlights_order_idx" ON "_page_home_v_version_previous_speakers_highlights" USING btree ("_order"); + CREATE INDEX "_page_home_v_version_previous_speakers_highlights_parent_id_idx" ON "_page_home_v_version_previous_speakers_highlights" USING btree ("_parent_id"); + CREATE INDEX "_page_home_v_version_previous_speakers_stand_ins_order_idx" ON "_page_home_v_version_previous_speakers_stand_ins" USING btree ("_order"); + CREATE INDEX "_page_home_v_version_previous_speakers_stand_ins_parent_id_idx" ON "_page_home_v_version_previous_speakers_stand_ins" USING btree ("_parent_id"); + CREATE INDEX "_page_home_v_version_social_posts_order_idx" ON "_page_home_v_version_social_posts" USING btree ("_order"); + CREATE INDEX "_page_home_v_version_social_posts_parent_id_idx" ON "_page_home_v_version_social_posts" USING btree ("_parent_id"); + CREATE INDEX "_page_home_v_version_social_posts_image_idx" ON "_page_home_v_version_social_posts" USING btree ("image_id"); + CREATE INDEX "site_settings_nav_children_order_idx" ON "site_settings_nav_children" USING btree ("_order"); + CREATE INDEX "site_settings_nav_children_parent_id_idx" ON "site_settings_nav_children" USING btree ("_parent_id"); + CREATE INDEX "_site_settings_v_version_nav_children_order_idx" ON "_site_settings_v_version_nav_children" USING btree ("_order"); + CREATE INDEX "_site_settings_v_version_nav_children_parent_id_idx" ON "_site_settings_v_version_nav_children" USING btree ("_parent_id"); + ALTER TABLE "page_home_why_attend_cards" ADD CONSTRAINT "page_home_why_attend_cards_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + ALTER TABLE "_page_home_v_version_why_attend_cards" ADD CONSTRAINT "_page_home_v_version_why_attend_cards_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + CREATE INDEX "page_home_why_attend_cards_image_idx" ON "page_home_why_attend_cards" USING btree ("image_id"); + CREATE INDEX "_page_home_v_version_why_attend_cards_image_idx" ON "_page_home_v_version_why_attend_cards" USING btree ("image_id");`) +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { + await db.execute(sql` + ALTER TABLE "page_home_hero_lead_lines" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "page_home_previous_speakers_highlights" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "page_home_previous_speakers_stand_ins" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "page_home_social_posts" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "_page_home_v_version_hero_lead_lines" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "_page_home_v_version_previous_speakers_highlights" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "_page_home_v_version_previous_speakers_stand_ins" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "_page_home_v_version_social_posts" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "site_settings_nav_children" DISABLE ROW LEVEL SECURITY; + ALTER TABLE "_site_settings_v_version_nav_children" DISABLE ROW LEVEL SECURITY; + DROP TABLE "page_home_hero_lead_lines" CASCADE; + DROP TABLE "page_home_previous_speakers_highlights" CASCADE; + DROP TABLE "page_home_previous_speakers_stand_ins" CASCADE; + DROP TABLE "page_home_social_posts" CASCADE; + DROP TABLE "_page_home_v_version_hero_lead_lines" CASCADE; + DROP TABLE "_page_home_v_version_previous_speakers_highlights" CASCADE; + DROP TABLE "_page_home_v_version_previous_speakers_stand_ins" CASCADE; + DROP TABLE "_page_home_v_version_social_posts" CASCADE; + DROP TABLE "site_settings_nav_children" CASCADE; + DROP TABLE "_site_settings_v_version_nav_children" CASCADE; + ALTER TABLE "page_home_why_attend_cards" DROP CONSTRAINT "page_home_why_attend_cards_image_id_media_id_fk"; + + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP CONSTRAINT "_page_home_v_version_why_attend_cards_image_id_media_id_fk"; + + DROP INDEX "page_home_why_attend_cards_image_idx"; + DROP INDEX "_page_home_v_version_why_attend_cards_image_idx"; + ALTER TABLE "page_home_partner_band_items" DROP COLUMN "description"; + ALTER TABLE "page_home_why_attend_cards" DROP COLUMN "eyebrow"; + ALTER TABLE "page_home_why_attend_cards" DROP COLUMN "href"; + ALTER TABLE "page_home_why_attend_cards" DROP COLUMN "link_label"; + ALTER TABLE "page_home_why_attend_cards" DROP COLUMN "image_id"; + ALTER TABLE "page_home_why_attend_cards" DROP COLUMN "image_alt"; + ALTER TABLE "page_home" DROP COLUMN "hero_badge"; + ALTER TABLE "page_home" DROP COLUMN "countdown_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_days_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_hours_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_minutes_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_seconds_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_spoken_label"; + ALTER TABLE "page_home" DROP COLUMN "countdown_live_label"; + ALTER TABLE "page_home" DROP COLUMN "partner_band_eyebrow"; + ALTER TABLE "page_home" DROP COLUMN "partner_band_heading"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_eyebrow"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_alumni_label"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_label"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_year"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_slots"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_show_placeholders"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_placeholder_name"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_lineup_placeholder_role"; + ALTER TABLE "page_home" DROP COLUMN "previous_speakers_stand_in_label"; + ALTER TABLE "page_home" DROP COLUMN "why_attend_eyebrow"; + ALTER TABLE "page_home" DROP COLUMN "social_eyebrow"; + ALTER TABLE "page_home" DROP COLUMN "social_heading"; + ALTER TABLE "page_home" DROP COLUMN "social_intro"; + ALTER TABLE "page_home" DROP COLUMN "social_linkedin_label"; + ALTER TABLE "page_home" DROP COLUMN "social_instagram_label"; + ALTER TABLE "_page_home_v_version_partner_band_items" DROP COLUMN "description"; + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP COLUMN "eyebrow"; + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP COLUMN "href"; + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP COLUMN "link_label"; + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP COLUMN "image_id"; + ALTER TABLE "_page_home_v_version_why_attend_cards" DROP COLUMN "image_alt"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_hero_badge"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_days_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_hours_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_minutes_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_seconds_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_spoken_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_countdown_live_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_partner_band_eyebrow"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_partner_band_heading"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_eyebrow"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_alumni_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_year"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_slots"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_show_placeholders"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_placeholder_name"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_lineup_placeholder_role"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_previous_speakers_stand_in_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_why_attend_eyebrow"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_social_eyebrow"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_social_heading"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_social_intro"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_social_linkedin_label"; + ALTER TABLE "_page_home_v" DROP COLUMN "version_social_instagram_label"; + DROP TYPE "public"."enum_page_home_social_posts_platform"; + DROP TYPE "public"."enum__page_home_v_version_social_posts_platform";`) +} diff --git a/apps/cms/src/migrations/index.ts b/apps/cms/src/migrations/index.ts index 2a16839..776e0dc 100644 --- a/apps/cms/src/migrations/index.ts +++ b/apps/cms/src/migrations/index.ts @@ -9,6 +9,7 @@ import * as migration_20261016_222725_hackathon_2026_partner_logos from './20261 import * as migration_20261107_215149_ticket_page_2027 from './20261107_215149_ticket_page_2027'; import * as migration_20261108_160000_ticket_rows_checkboxes_additive from './20261108_160000_ticket_rows_checkboxes_additive'; import * as migration_20261109_195959_ticket_phases from './20261109_195959_ticket_phases'; +import * as migration_20261111_104849_home_2027 from './20261111_104849_home_2027'; export const migrations = [ { @@ -64,6 +65,11 @@ export const migrations = [ { up: migration_20261109_195959_ticket_phases.up, down: migration_20261109_195959_ticket_phases.down, - name: '20261109_195959_ticket_phases' + name: '20261109_195959_ticket_phases', + }, + { + up: migration_20261111_104849_home_2027.up, + down: migration_20261111_104849_home_2027.down, + name: '20261111_104849_home_2027' }, ]; diff --git a/apps/cms/src/payload-types.ts b/apps/cms/src/payload-types.ts index 1f5b121..06cc075 100644 --- a/apps/cms/src/payload-types.ts +++ b/apps/cms/src/payload-types.ts @@ -836,10 +836,23 @@ export interface PayloadMigrationsSelect { export interface PageHome { id: number; hero: { + /** + * Small pill above the headline, e.g. "10th edition · April 1 to 2, 2027 · Mannheim". Leave empty to hide it. + */ + badge?: string | null; headline: string; tagline: string; /** - * Rotating banner lines (e.g. thank-you message, next date). Each row is one line. + * Short lines under the headline, one per row. When filled, they are shown instead of the announcement lines. + */ + leadLines?: + | { + text: string; + id?: string | null; + }[] + | null; + /** + * Banner lines (e.g. thank-you message, next date). Each row is one line. Shown only while there are no lead lines. */ announcementLines?: | { @@ -868,6 +881,36 @@ export interface PageHome { */ endDate: string; }; + countdown?: { + /** + * Name of the countdown for screen readers, e.g. "Countdown to Q-Summit 2027". + */ + label?: string | null; + /** + * e.g. "Days". + */ + daysLabel?: string | null; + /** + * e.g. "Hours". + */ + hoursLabel?: string | null; + /** + * e.g. "Minutes". + */ + minutesLabel?: string | null; + /** + * e.g. "Seconds". + */ + secondsLabel?: string | null; + /** + * Sentence screen readers hear instead of the digits. Keep {days}, {hours} and {minutes}; the site replaces them with the numbers, e.g. "{days} days, {hours} hours and {minutes} minutes until Q-Summit 2027". + */ + spokenLabel?: string | null; + /** + * Shown in place of the countdown once the first conference day has begun, e.g. "Q-Summit 2027 is live". + */ + liveLabel?: string | null; + }; stats: { heading: string; intro: string; @@ -893,12 +936,27 @@ export interface PageHome { }; partnerBand: { /** - * One entry per logo group (Startup/Corporate, Network, ...). + * Small label above the heading. Leave empty to hide it. + */ + eyebrow?: string | null; + /** + * Heading of the section. Always name the edition the logos are from, e.g. "Partners of Q-Summit 2026". + */ + heading?: string | null; + /** + * One row of logos per entry (e.g. Startups, Corporates, Network), in display order. */ items?: | { - value: string; + /** + * Count beside the label on the previous homepage, e.g. "50+". The new homepage does not show it, so it may stay empty. + */ + value?: string | null; label: string; + /** + * Short line under the label, e.g. "Founders & scale-ups". Leave empty to show the label alone. + */ + description?: string | null; /** * Partner/company names shown in the logo band (index page only). */ @@ -920,8 +978,67 @@ export interface PageHome { }; }; previousSpeakers: { + /** + * Small label above the heading. Leave empty to hide it. + */ + eyebrow?: string | null; heading: string; intro: string; + /** + * Badge on past speakers, e.g. "Q-Summit Alumni", so nobody reads them as booked for the next edition. Leave empty for no badge. + */ + alumniLabel?: string | null; + /** + * Names of past speakers to show, in this order. Write each name exactly as it reads in the Speakers list. Leave empty to show every speaker in the group "Main stage highlight (homepage)". + */ + highlights?: + | { + text: string; + id?: string | null; + }[] + | null; + /** + * Speakers of the next edition, shown after the past speakers. The cards are the published speakers in the group "Current edition speakers" with the year set here, so publishing a speaker fills a slot. The lineup appears once Label and Year are filled. + */ + lineup?: { + /** + * Badge on each lineup card, e.g. "2027". + */ + label?: string | null; + /** + * Conference year whose speakers fill the lineup, e.g. 2027. + */ + year?: number | null; + /** + * How many cards the lineup holds, 1 to 8. + */ + slots?: number | null; + /** + * For previews only. Fills open lineup slots with clearly marked placeholder cards, so the layout can be checked before speakers are announced. Keep this off for the live site: with it off, open slots are simply not shown. + */ + showPlaceholders?: boolean | null; + /** + * Name on a placeholder card, e.g. "Speaker to be announced". Only used while Show Placeholders is on. + */ + placeholderName?: string | null; + /** + * Line under the name on a placeholder card. Only used while Show Placeholders is on. + */ + placeholderRole?: string | null; + }; + /** + * Earlier speakers to show in the lineup's place while no speaker of the lineup year is published yet. Write each name exactly as it reads in the Speakers list. They disappear on their own as soon as the first speaker of that year is published. + */ + standIns?: + | { + text: string; + id?: string | null; + }[] + | null; + /** + * Badge on a stand-in card, e.g. "Q-Summit 2026". It must say where the person spoke, so nobody reads them as booked for the next edition. + */ + standInLabel?: string | null; cta: { label: string; /** @@ -931,15 +1048,39 @@ export interface PageHome { }; }; whyAttend: { + /** + * Small label above the heading. Leave empty to hide it. + */ + eyebrow?: string | null; heading: string; intro: string; /** - * One card per reason to attend. + * One tile per audience (e.g. students, startups, corporates, investors), in display order. */ cards?: | { title: string; description: string; + /** + * Small label above the title, e.g. "For founders". + */ + eyebrow?: string | null; + /** + * Where the tile leads: an internal path (e.g. "/whyq/students") or a full URL (https://...). Leave empty and the tile is not a link. + */ + href?: string | null; + /** + * Text of the link on the tile, e.g. "Learn more". + */ + linkLabel?: string | null; + /** + * Photo on the tile. Upload the sharp original. Leave empty and the tile shows without a photo. + */ + image?: (number | null) | Media; + /** + * Short description of the photo for screen readers. Leave empty only while there is no photo. + */ + imageAlt?: string | null; id?: string | null; }[] | null; @@ -951,6 +1092,49 @@ export interface PageHome { href: string; }; }; + social?: { + /** + * Small label above the heading. + */ + eyebrow?: string | null; + /** + * Heading of the section. Filling it switches the section on. + */ + heading?: string | null; + /** + * Short text under the heading. + */ + intro?: string | null; + /** + * Text of the LinkedIn profile link, e.g. "Follow us on LinkedIn". + */ + linkedinLabel?: string | null; + /** + * Text of the Instagram profile link, e.g. "Follow us on Instagram". + */ + instagramLabel?: string | null; + /** + * Up to four posts, shown as image tiles that open the post. Without posts the section shows empty frames. + */ + posts?: + | { + platform: 'linkedin' | 'instagram'; + /** + * Full address of the post, starting with https://. + */ + href: string; + /** + * Image of the post, served from our own media library. Upload the sharp original. + */ + image: number | Media; + /** + * Short description of the post image for screen readers. + */ + imageAlt?: string | null; + id?: string | null; + }[] + | null; + }; faqSection: { heading: string; intro: string; @@ -1987,6 +2171,19 @@ export interface SiteSetting { * A full URL (https://...), a mailto: address, an internal path (e.g. "/whyq"), or an in-page anchor (e.g. "#why-attend"). */ href: string; + /** + * Optional links shown in a menu under this item, in display order (e.g. the audience pages under Why Q?). Leave empty for a plain link. The item itself always stays a link. + */ + children?: + | { + label: string; + /** + * A full URL (https://...), a mailto: address, an internal path (e.g. "/whyq"), or an in-page anchor (e.g. "#why-attend"). + */ + href: string; + id?: string | null; + }[] + | null; id?: string | null; }[]; footer: { @@ -2099,8 +2296,15 @@ export interface PageHomeSelect { hero?: | T | { + badge?: T; headline?: T; tagline?: T; + leadLines?: + | T + | { + text?: T; + id?: T; + }; announcementLines?: | T | { @@ -2120,6 +2324,17 @@ export interface PageHomeSelect { startDate?: T; endDate?: T; }; + countdown?: + | T + | { + label?: T; + daysLabel?: T; + hoursLabel?: T; + minutesLabel?: T; + secondsLabel?: T; + spokenLabel?: T; + liveLabel?: T; + }; stats?: | T | { @@ -2142,11 +2357,14 @@ export interface PageHomeSelect { partnerBand?: | T | { + eyebrow?: T; + heading?: T; items?: | T | { value?: T; label?: T; + description?: T; logos?: | T | { @@ -2165,8 +2383,33 @@ export interface PageHomeSelect { previousSpeakers?: | T | { + eyebrow?: T; heading?: T; intro?: T; + alumniLabel?: T; + highlights?: + | T + | { + text?: T; + id?: T; + }; + lineup?: + | T + | { + label?: T; + year?: T; + slots?: T; + showPlaceholders?: T; + placeholderName?: T; + placeholderRole?: T; + }; + standIns?: + | T + | { + text?: T; + id?: T; + }; + standInLabel?: T; cta?: | T | { @@ -2177,6 +2420,7 @@ export interface PageHomeSelect { whyAttend?: | T | { + eyebrow?: T; heading?: T; intro?: T; cards?: @@ -2184,6 +2428,11 @@ export interface PageHomeSelect { | { title?: T; description?: T; + eyebrow?: T; + href?: T; + linkLabel?: T; + image?: T; + imageAlt?: T; id?: T; }; cta?: @@ -2193,6 +2442,24 @@ export interface PageHomeSelect { href?: T; }; }; + social?: + | T + | { + eyebrow?: T; + heading?: T; + intro?: T; + linkedinLabel?: T; + instagramLabel?: T; + posts?: + | T + | { + platform?: T; + href?: T; + image?: T; + imageAlt?: T; + id?: T; + }; + }; faqSection?: | T | { @@ -2957,6 +3224,13 @@ export interface SiteSettingsSelect { | { label?: T; href?: T; + children?: + | T + | { + label?: T; + href?: T; + id?: T; + }; id?: T; }; footer?: diff --git a/apps/cms/test/page-home.test.ts b/apps/cms/test/page-home.test.ts new file mode 100644 index 0000000..313e059 --- /dev/null +++ b/apps/cms/test/page-home.test.ts @@ -0,0 +1,490 @@ +import { describe, expect, it } from "vitest"; + +import { forceDraftData } from "../src/content-sync/force-draft"; +import { serializeDoc } from "../src/content-sync/serialize"; +import { PageHackathon } from "../src/globals/PageHackathon"; +import { + PageHome, + requiredWithSocialHeading, + validateLineupSlots, + validateLineupYear, + validateSpokenLabel, +} from "../src/globals/PageHome"; +import { SiteSettings } from "../src/globals/SiteSettings"; +import { MEDIA_GLOBAL_FIELDS } from "../src/lib/media-usage"; + +// The raw authored field tree, before Payload sanitizes it. Named groups and +// arrays add a path segment; rows and collapsible sections are layout only. +type RawField = { + name?: string; + type?: string; + required?: boolean; + validate?: (value: unknown, options: { siblingData: unknown }) => unknown; + fields?: RawField[]; +}; + +/** Every named field with its dotted path; an array is written `name[]`. */ +function namedFields( + fields: RawField[] | undefined, + prefix = "", +): { path: string; field: RawField }[] { + const out: { path: string; field: RawField }[] = []; + for (const field of fields ?? []) { + const segment = !field.name + ? "" + : field.type === "array" + ? `${field.name}[]` + : field.name; + const here = [prefix, segment].filter(Boolean).join("."); + if (field.name) out.push({ path: here, field }); + out.push(...namedFields(field.fields, here)); + } + return out; +} + +const homeFields = namedFields(PageHome.fields as RawField[]); +const homeField = (path: string) => + homeFields.find((entry) => entry.path === path)?.field; + +// The countdown has no date: it runs to event.startDate. Only its wording is +// stored, and the spoken sentence is the one text the site fills in. +describe("validateSpokenLabel", () => { + it("passes an empty value, so a page without a countdown still saves", () => { + expect(validateSpokenLabel(undefined)).toBe(true); + expect(validateSpokenLabel(null)).toBe(true); + expect(validateSpokenLabel(" ")).toBe(true); + }); + + it("passes a sentence that keeps all three placeholders", () => { + expect( + validateSpokenLabel( + "{days} days, {hours} hours and {minutes} minutes left.", + ), + ).toBe(true); + }); + + it("names every placeholder that went missing", () => { + const result = String(validateSpokenLabel("{days} days left.")); + expect(result).toContain("{hours}"); + expect(result).toContain("{minutes}"); + expect(result).not.toContain("{days}"); + }); +}); + +describe("lineup year and slots", () => { + const year = (value: number | null | undefined) => + validateLineupYear(value, {} as never); + const slots = (value: number | null | undefined) => + validateLineupSlots(value, {} as never); + + it("asks for nothing while the lineup is empty", () => { + expect(year(undefined)).toBe(true); + expect(year(null)).toBe(true); + expect(slots(undefined)).toBe(true); + expect(slots(null)).toBe(true); + }); + + it("takes a whole conference year", () => { + expect(year(2027)).toBe(true); + expect(year(2027.5)).not.toBe(true); + expect(year(27)).not.toBe(true); + expect(year(2101)).not.toBe(true); + }); + + it("takes whole slots from 1 to 8", () => { + expect(slots(1)).toBe(true); + expect(slots(4)).toBe(true); + expect(slots(8)).toBe(true); + expect(slots(0)).not.toBe(true); + expect(slots(9)).not.toBe(true); + expect(slots(2.5)).not.toBe(true); + }); +}); + +// The social section is on once it has a heading, and then prints every one +// of its texts; the two labels are the names of the profile links. +describe("requiredWithSocialHeading", () => { + const off = { siblingData: { heading: "" } }; + const on = { siblingData: { heading: "Follow the journey" } }; + + it("asks for nothing while the section has no heading", () => { + expect(requiredWithSocialHeading("", off)).toBe(true); + expect(requiredWithSocialHeading(undefined, { siblingData: {} })).toBe( + true, + ); + expect(requiredWithSocialHeading(null, { siblingData: undefined })).toBe( + true, + ); + }); + + it("requires the text once the heading is filled", () => { + expect(requiredWithSocialHeading("", on)).not.toBe(true); + expect(requiredWithSocialHeading(" ", on)).not.toBe(true); + expect(requiredWithSocialHeading("LinkedIn", on)).toBe(true); + }); +}); + +// The live Home page was published before any of these fields existed. It +// must stay valid and publishable untouched, so nothing new may be required +// outside the rows of a new array, and no validator may reject an empty +// value. Drafts are validated on save, so this also guards plain saving. +describe("page-home 2027 fields are additive", () => { + // Paths are the REST keys apps/web reads (CmsPageHomeDoc in pages.ts). + const OPTIONAL_2027 = [ + "hero.badge", + "hero.leadLines[]", + "countdown.label", + "countdown.daysLabel", + "countdown.hoursLabel", + "countdown.minutesLabel", + "countdown.secondsLabel", + "countdown.spokenLabel", + "countdown.liveLabel", + "partnerBand.eyebrow", + "partnerBand.heading", + "partnerBand.items[].description", + "previousSpeakers.eyebrow", + "previousSpeakers.alumniLabel", + "previousSpeakers.highlights[]", + "previousSpeakers.lineup.label", + "previousSpeakers.lineup.year", + "previousSpeakers.lineup.slots", + "previousSpeakers.lineup.showPlaceholders", + "previousSpeakers.lineup.placeholderName", + "previousSpeakers.lineup.placeholderRole", + "whyAttend.eyebrow", + "whyAttend.cards[].eyebrow", + "whyAttend.cards[].href", + "whyAttend.cards[].linkLabel", + "whyAttend.cards[].image", + "whyAttend.cards[].imageAlt", + "social.eyebrow", + "social.heading", + "social.intro", + "social.linkedinLabel", + "social.instagramLabel", + "social.posts[]", + "social.posts[].imageAlt", + ]; + + it.each(OPTIONAL_2027)("%s exists and is optional", (path) => { + const field = homeField(path); + expect(field, `no field at ${path}`).toBeDefined(); + expect(field?.required ?? false).toBe(false); + }); + + it("accepts an empty value in every validator on an optional field", () => { + const rejected = homeFields + .filter(({ field }) => !field.required && field.validate) + .filter( + ({ field }) => + field.validate!(undefined, { siblingData: {} }) !== true || + field.validate!(null, { siblingData: {} }) !== true, + ) + .map(({ path }) => path); + expect(rejected).toEqual([]); + }); + + it("requires nothing new outside the rows of the new arrays", () => { + const required = homeFields + .filter(({ field }) => field.required) + .map(({ path }) => path) + .sort(); + expect(required).toEqual( + [ + // Published before 2027. + "title", + "hero.headline", + "hero.tagline", + "hero.announcementLines[].text", + "hero.cta.label", + "hero.cta.href", + "event.startDate", + "event.endDate", + "stats.heading", + "stats.intro", + "stats.items[].value", + "stats.items[].label", + "stats.items[].logos[].text", + "partnerBand.items[].label", + "partnerBand.items[].logos[].text", + "partnerBand.cta.label", + "partnerBand.cta.href", + "previousSpeakers.heading", + "previousSpeakers.intro", + "previousSpeakers.cta.label", + "previousSpeakers.cta.href", + "whyAttend.heading", + "whyAttend.intro", + "whyAttend.cards[].title", + "whyAttend.cards[].description", + "whyAttend.cta.label", + "whyAttend.cta.href", + "faqSection.heading", + "faqSection.intro", + "faqSection.cta.label", + "faqSection.cta.href", + // New arrays: a row that exists must be complete. + "hero.leadLines[].text", + "previousSpeakers.highlights[].text", + "previousSpeakers.standIns[].text", + "social.posts[].platform", + "social.posts[].href", + "social.posts[].image", + ].sort(), + ); + }); + + it("keeps room for more posts than the four the page shows", () => { + // New posts are added at the end and the page shows the newest four, + // so the list must be able to hold a fifth without a row being deleted + // first. + expect( + (homeField("social.posts[]") as { maxRows?: number }).maxRows, + ).toBeGreaterThan(4); + }); + + it("links an audience tile like every other internal link", () => { + const validate = homeField("whyAttend.cards[].href")!.validate!; + const run = (value: unknown) => validate(value, { siblingData: {} }); + expect(run("/whyq/students")).toBe(true); + expect(run("https://example.com/students")).toBe(true); + expect(run("whyq students")).not.toBe(true); + }); + + it("takes only a full address for a social post", () => { + const validate = homeField("social.posts[].href")!.validate!; + const run = (value: unknown) => validate(value, { siblingData: {} }); + expect(run("https://www.linkedin.com/posts/example")).toBe(true); + expect(run("/whyq")).not.toBe(true); + expect(run("")).not.toBe(true); + }); +}); + +// Every array stores its rows in its own table. The shared helpers add the +// 2027 fields only where they are asked to, so arrays that do not show them +// gain no column. +describe("shared row helpers stay scoped to the home arrays that use them", () => { + const rowFields = (fields: RawField[], path: string) => + namedFields(fields) + .filter((entry) => entry.path.startsWith(`${path}.`)) + .map((entry) => entry.path.slice(path.length + 1)); + + it("adds the description line to the partner rows only", () => { + const home = PageHome.fields as RawField[]; + expect(rowFields(home, "partnerBand.items[]")).toEqual([ + "value", + "label", + "description", + "logos[]", + "logos[].text", + ]); + expect(rowFields(home, "stats.items[]")).toEqual([ + "value", + "label", + "logos[]", + "logos[].text", + ]); + }); + + it("lets a partner row go without a count, but not a stat", () => { + expect(homeField("partnerBand.items[].value")?.required ?? false).toBe( + false, + ); + expect(homeField("stats.items[].value")?.required).toBe(true); + }); + + it("leaves the hackathon benefit cards at title and description", () => { + expect( + rowFields(PageHackathon.fields as RawField[], "benefits.cards[]"), + ).toEqual(["title", "description"]); + }); +}); + +// NavLink.children in apps/web/src/lib/content/site-settings.ts. +describe("site-settings nav sub-items", () => { + const settings = namedFields(SiteSettings.fields as RawField[]); + const at = (path: string) => + settings.find((entry) => entry.path === path)?.field; + + it("is an optional array of label and href on each nav item", () => { + expect(at("nav[].children[]")?.required ?? false).toBe(false); + expect(at("nav[].children[].label")?.required).toBe(true); + expect(at("nav[].children[].href")?.required).toBe(true); + }); + + it("validates a sub-item link exactly like the nav item link", () => { + const item = at("nav[].href")!.validate!; + const child = at("nav[].children[].href")!.validate!; + for (const value of [ + "/whyq/students", + "#why-attend", + "https://example.com", + "mailto:jane@example.com", + "not a link", + "", + ]) { + expect(child(value, { siblingData: {} })).toBe( + item(value, { siblingData: {} }), + ); + } + expect(child("/whyq/students", { siblingData: {} })).toBe(true); + expect(child("not a link", { siblingData: {} })).not.toBe(true); + }); +}); + +// The "Used on" panel and the delete guard only see uploads registered in +// media-usage.ts; an unregistered one would call a file unused while a tile +// or a post still shows it. +describe("page-home uploads are registered for media usage", () => { + it("lists every upload field of the Home page", () => { + const uploads = homeFields + .filter(({ field }) => field.type === "upload") + .map(({ path }) => path) + .sort(); + const registered = MEDIA_GLOBAL_FIELDS.find( + (entry) => entry.slug === "page-home", + )?.refs.map((ref) => ref.fieldPath); + expect(uploads).toEqual([ + "social.posts[].image", + "whyAttend.cards[].image", + ]); + expect([...(registered ?? [])].sort()).toEqual(uploads); + }); +}); + +// Content packages treat uploads by shape, not by field name, so the new +// nested uploads need no entry anywhere. This pins that: the 2027 keys +// survive export and apply, and both uploads travel as filename refs. +describe("page-home 2027 fields survive the export -> propose round-trip", () => { + const media = (filename: string, alt: string) => ({ + id: 7, + filename, + alt, + url: `https://example.test/media/${filename}`, + mimeType: "image/webp", + filesize: 1234, + width: 800, + height: 533, + }); + + it("keeps every new key and maps both uploads to filename refs", () => { + const doc = { + id: 1, + hero: { + badge: "Fixture badge", + leadLines: [{ id: "row-a", text: "Fixture lead line" }], + }, + countdown: { spokenLabel: "{days} {hours} {minutes}" }, + partnerBand: { + heading: "Fixture partners", + items: [ + { id: "row-b", value: "", label: "Fixture", description: "Line" }, + ], + }, + previousSpeakers: { + highlights: [{ id: "row-c", text: "Fixture Speaker" }], + lineup: { label: "2099", year: 2099, slots: 4, showPlaceholders: true }, + }, + whyAttend: { + cards: [ + { + id: "row-d", + title: "Fixture audience", + description: "Fixture pitch", + eyebrow: "Fixture", + href: "/whyq/students", + linkLabel: "Fixture more", + image: media("fixture-tile.webp", "Fixture tile"), + imageAlt: "Fixture tile on the page", + }, + ], + }, + social: { + heading: "Fixture social", + posts: [ + { + id: "row-e", + platform: "linkedin", + href: "https://example.com/post", + image: media("fixture-post.webp", "Fixture post"), + imageAlt: "Fixture post on the page", + }, + ], + }, + _status: "published", + }; + + const applied = forceDraftData(serializeDoc(doc)); + + expect(applied).toEqual({ + hero: { + badge: "Fixture badge", + leadLines: [{ text: "Fixture lead line" }], + }, + countdown: { spokenLabel: "{days} {hours} {minutes}" }, + partnerBand: { + heading: "Fixture partners", + items: [{ value: "", label: "Fixture", description: "Line" }], + }, + previousSpeakers: { + highlights: [{ text: "Fixture Speaker" }], + lineup: { label: "2099", year: 2099, slots: 4, showPlaceholders: true }, + }, + whyAttend: { + cards: [ + { + title: "Fixture audience", + description: "Fixture pitch", + eyebrow: "Fixture", + href: "/whyq/students", + linkLabel: "Fixture more", + image: { filename: "fixture-tile.webp", alt: "Fixture tile" }, + imageAlt: "Fixture tile on the page", + }, + ], + }, + social: { + heading: "Fixture social", + posts: [ + { + platform: "linkedin", + href: "https://example.com/post", + image: { filename: "fixture-post.webp", alt: "Fixture post" }, + imageAlt: "Fixture post on the page", + }, + ], + }, + _status: "draft", + }); + }); + + it("keeps nav sub-items on a site-settings package", () => { + const applied = forceDraftData( + serializeDoc({ + id: 1, + nav: [ + { + id: "row-a", + label: "Why Q?", + href: "/whyq", + children: [ + { + id: "row-b", + label: "Fixture audience", + href: "/whyq/students", + }, + ], + }, + ], + }), + ); + expect(applied.nav).toEqual([ + { + label: "Why Q?", + href: "/whyq", + children: [{ label: "Fixture audience", href: "/whyq/students" }], + }, + ]); + }); +}); diff --git a/apps/web/DESIGN.md b/apps/web/DESIGN.md index f032bba..6025fc8 100644 --- a/apps/web/DESIGN.md +++ b/apps/web/DESIGN.md @@ -248,10 +248,11 @@ Every rule, with the token or class it is about. Cite these IDs verbatim in code | MOTION-3 | Animate transform and opacity only | `transform`, `opacity` | | MOTION-4 | No client-side animation runtime | `package.json` | | MOTION-5 | Page transitions and reveals have one implementation each | `@view-transition`, `ui/Timeline` | -| MOTION-6 | Liquid glass parts share one press, unfold and type motion | `--duration-glass-*`, `lib/motion/` | +| MOTION-6 | Liquid glass parts share one press and unfold motion | `--duration-glass-*`, `lib/motion/` | | KICKOFF-1 | Join Q is its own visual system | `components/kickoff/` | | HACK-1 | Q-Hack x Hacktoberfest is its own campaign system | `components/hackathon/` | | TICKETS-1 | The 2027 ticket page is its own sales system | `components/tickets/` | +| HOME-1 | The 2027 home page is its own visual system | `components/home/` | Astro implementation rules (`PRIM-1` to `PRIM-3`) live in [`AGENTS.md`](AGENTS.md). @@ -365,7 +366,7 @@ The footer's column labels are deliberately not `.u-eyebrow`: they label a navig **COMP-4 Accordions are native `
`/``.** The shared open and close animation lives in `global.css`, once, for every accordion on the site, and so does the summary row itself (`.u-accordion-summary`) and the chevron (`src/components/icons/IconChevron.astro`). No JS widget replaces the native element. What stays with each accordion is what genuinely differs: its hairline, its label type, and the `[open]` rotation, which targets that accordion's own chevron box. -**COMP-6 The site header is the floating liquid glass bar on every page.** `layout/Nav.astro` is the one header, rendered once by `Base.astro`; there is no plain-bar variant and no page-local copy. It is the bar first built for the ticket page (TICKETS-1): inset from the viewport edges, clear liquid glass in the home Buy Now's material (a thin white fill over a strong blur that lifts brightness and saturation, so what passes under it shows as color and shape but never as a second line of text, a still specular rim, a caustic cyan lower edge and a soft cyan halo), small uppercase chip links with a raised white chip for the current page, and on phones a sheet of blue-tinted clear glass (the Q27 blues over a strong blur) as the open menu. The sheet's glass is its own layer (`.nav-glass`) that unfolds out of the menu button; the links are never scaled or clipped and only appear once the glass is open, the links leave before it folds back, and the icon turns on the same timeline (MOTION-6). The bar's own glass also sits on a layer (`.nav-bar-glass`), not on `.nav-inner`: an element with `backdrop-filter` is a backdrop root, and the menu's blur inside it would otherwise only see the bar, not the page. Over a dark ground (`.section.is-dark`, including the home video hero, or anything marked `data-nav-tone="dark"`) the bar frosts to a denser white fill so the navy logo and links keep their contrast; `nav-tone.client.ts` switches it, and CSS sets the frosted state for a page that opens on a dark section so the first paint is right. The header and `.button.is-glass` may use the `ticket-*` tokens they are built from (radius, Q27 blues, ticket durations); nothing else on conference pages may. Its geometry (`--site-header-height` and friends) lives on `:root` so a section that runs under the bar, like the home hero video, can pull itself up by exactly that height. +**COMP-6 The site header is the floating liquid glass bar on every page.** `layout/Nav.astro` is the one header, rendered once by `Base.astro`; there is no plain-bar variant and no page-local copy. It is the bar first built for the ticket page (TICKETS-1): inset from the viewport edges, clear liquid glass in the home Buy Now's material (a thin white fill over a strong blur that lifts brightness and saturation, so what passes under it shows as color and shape but never as a second line of text, a still specular rim, a caustic cyan lower edge and a soft cyan halo), small uppercase chip links with a raised white chip for the current page, and on phones a sheet of blue-tinted clear glass (the Q27 blues over a strong blur) as the open menu. The sheet's glass is its own layer (`.nav-glass`) that unfolds out of the menu button; the links are never scaled or clipped and only appear once the glass is open, the links leave before it folds back, and the icon turns on the same timeline (MOTION-6). The bar's own glass also sits on a layer (`.nav-bar-glass`), not on `.nav-inner`: an element with `backdrop-filter` is a backdrop root, and the menu's blur inside it would otherwise only see the bar, not the page. Over a dark ground (`.section.is-dark`, including the home video hero, or anything marked `data-nav-tone="dark"`) the bar frosts to a denser white fill so the navy logo and links keep their contrast; `nav-tone.client.ts` switches it, and CSS sets the frosted state for a page that opens on a dark section so the first paint is right. The header and `.button.is-glass` may use the `ticket-*` tokens they are built from (radius, Q27 blues, ticket durations); nothing else on conference pages may. Its geometry (`--site-header-height` and friends) lives on `:root` so a section that runs under the bar, like the home hero video, can pull itself up by exactly that height. A nav item may carry sub-items (Why Q? and its four audience pages, from Site Settings). The parent is no page of its own: its label and a chevron are one disclosure button, set like the links beside it (click, touch and keyboard, with hover only as an extra on devices that hover), that opens a dropdown of frosted glass under the item, unfolding out of the button and folding back into it on transitions, so quick repeated toggles reverse from where they are (MOTION-6). In the phone sheet the same button expands the sub-items in place as an indented group; that group grows by `grid-template-rows`, the one layout property animated in the header, because the rows below it have to move with it (a documented MOTION-3 deviation, off for reduced motion). PRIM-3's note that the home and program FAQs are "intentionally separate" is about their section layouts, which really are two designs (a two-column copy-plus-list band, and a single left-aligned column). It is not a license to re-copy the summary row inside them. @@ -386,7 +387,6 @@ Motion is small, fast, purposeful, and interruptible. The timing model follows t | Glass press (MOTION-6) | `--ease-snappy` in, `--ease-glass-spring` back | `--duration-glass-press` 90ms, `--duration-glass-release` 420ms | | Glass surface unfolding out of its trigger (MOTION-6) | clip `--ease-emphasized`, size `--ease-glass-spring` | `--duration-glass-unfold` 380ms, stagger `--duration-glass-stagger` 28ms | | The same surface folding back | `--ease-emphasized` | `--duration-glass-fold` 220ms | -| Dynamic type, per word (MOTION-6) | `--ease-snappy` | `--duration-type-word` 150ms apart, each fading in `--duration-type-fade` 120ms | Exit is faster than enter, hover stays under 150ms, and nothing crosses 500ms. `linear` is for loops and for scroll-driven timelines whose progress is the scroll position rather than a clock: the partner-logo marquee, and the timeline's rail and reveal keyframes in `ui/Timeline.astro`. It is never the curve for a click-triggered transition, where it reads as robotic. @@ -421,13 +421,12 @@ Everything below is CSS. None of it ships an animation runtime, so none of it co A second component wanting a reveal extracts the shared utility at that point rather than copying Timeline's keyframes. `global.css` briefly carried a `.u-reveal` utility with no consumers while Timeline implemented its own; an extracted utility nothing extracts to is worse than no utility, so it was removed. -**MOTION-6 Liquid glass parts share one press, unfold and type motion.** The timings come from the team's reference videos (Apple's Liquid Glass demos), measured frame by frame, and live in the `--duration-glass-*`, `--duration-type-*` and `--ease-glass-spring` tokens. Every glass part uses the same three patterns, so new ones are composed rather than reinvented: +**MOTION-6 Liquid glass parts share one press and unfold motion.** The timings come from the team's reference videos (Apple's Liquid Glass demos), measured frame by frame, and live in the `--duration-glass-*` and `--ease-glass-spring` tokens. Every glass part uses the same two patterns, so new ones are composed rather than reinvented: - **Press.** Mark the element `data-glass-press` and give it a `.glass-light` child (it needs `position: relative` and a radius). `lib/motion/glass-press.ts`, booted once in `Base.astro`, sets `.is-pressed` for touch, mouse and Enter/Space alike and replays a light pulse from the touch point (`--press-x` / `--press-y`). The element gives a little on the first frame (`--duration-glass-press`) and springs back past its size on release (`--duration-glass-release`, `--ease-glass-spring`). Nothing waits for it: links navigate and buttons fire on the native event. Users: the home Buy Now (`.button.is-glass`), the header's menu button, the compare picker fields. - **Unfold and fold.** A surface grows out of the control that opened it: it starts clipped to and squeezed into the trigger's box, the clip opens on `--ease-emphasized` while the size springs (`--ease-glass-spring`, a small overshoot that settles), a light runs across it, and its contents follow `--duration-glass-stagger` apart, invisible while squeezed so text is never seen distorted. Folding plays back into the trigger faster (`--duration-glass-fold`) and fades only at the end; the element is hidden only after the fold. Toggles are CSS transitions on a state attribute, so a quick second tap reverses mid-way; panels that move between places use the Web Animations API and cancel what is still running. Users: the header's phone menu (`data-sheet`), the compare pickers' list (`data-state`), What's included (`tickets.client.ts`). -- **Dynamic type.** `lib/motion/typewriter.ts` writes a short line word by word: each word fades up in `--duration-type-fade`, one every `--duration-type-word`, capped at about 0.7s per line; no cursor, no loop. Every word is laid out from the first frame, so nothing reflows; screen readers get the sentence once from a visually hidden copy; calling it again replaces a line still typing, so a quick series of switches ends on the last one. Two entry points: `typeWords` for text that appears in an interaction, after its surface has unfolded (the ticket name and description in What's included, each compare column's description), and `typeOnView` (booted in `Base.astro`) for an element marked `data-type`, written once and never again on that page load: right away if any of it is on screen when the page loads (so a hero line at the bottom of a short window never sits blank), otherwise the first time half of it is in view; `data-type-after` delays it by that many `--duration-glass-unfold` steps so it follows the surface it sits in. Only short headings and their supporting lines (the ticket hero intro, the What's included and Compare tickets headings and intros); never a page's main heading (it is the largest paint), prices, buttons, navigation, options or compare data. Before the script runs, `html.js-type` (set by an inline head script, so no-JS never gets it) hides marked text so it does not flash in finished, and a CSS fallback shows it after a short delay in case the script never arrives. Words fill backwards only, so a finished line holds no animation. -Scale and clip stay on the glass surface itself, never on content that has to be compared or read in place: text sits on its own layer and appears only once its glass is open. A glass layer that has to blur what is behind it must not sit inside another element with `backdrop-filter` (a backdrop root); give the outer glass its own background layer instead. Each pattern has its reduced-motion escape (MOTION-2): no transition, no pulse, no typing. +Scale and clip stay on the glass surface itself, never on content that has to be compared or read in place: text sits on its own layer and appears only once its glass is open. A glass layer that has to blur what is behind it must not sit inside another element with `backdrop-filter` (a backdrop root); give the outer glass its own background layer instead. Each pattern has its reduced-motion escape (MOTION-2): no transition and no pulse. Progressive enhancement is the rule, not an aspiration: the fallback for every one of these is the un-animated state, never hidden content. Never gate visibility on an animation that may not run. @@ -449,12 +448,24 @@ The violet ramp is sampled from the Hack CI background artwork, which ships no w ## Tickets -`/ticket-categories/` is the 2027 ticket shop front, and it trades the conference minimalism for a calm, precise sales surface in the Q27 CI, built from liquid glass after the reference images the team picked. Liquid glass here means clear glass with a specular rim that catches light top left and bottom right, a caustic cyan glow along the lower inner edge, a little brightness and saturation lifted from what lies behind, and depth from light rather than from a flat fill (`.t-glass` in `tickets/ticket-theme.css`). A pale cool ground carries glowing light pools and Q bubbles; every ticket card is its own field of ice, cyan and Q27 blue light with Q bubbles inside, and the highlights sit on a glass panel that shows the light behind it blurred. A Q bubble is the original Q mark (`public/icon-512.png`) used as a mask and filled with flowing light; its rim is cut from the same mask, so the brand drawing is never redrawn, and it only floats, turns a few degrees and scales evenly, never stretched or skewed. Buttons are calm rounded rectangles (`--radius-ticket-button`) with a small uppercase label: buy buttons are navy glass with a lit rim, a Q27 blue inner glow and a trailing arrow; pressing one turns it light blue (`ticket-press`) with navy text, on touch, mouse and keyboard alike, and navigation is never delayed for the animation. Moving parts are glass too: a lens that glides to the picked tab and stretches as it moves (on phones the five tabs form a centered, symmetric three over two), glass carousel arrows and a small Q bubble marking the current ticket among the dots, and the compare pickers: a clear glass field in the home Buy Now's material that opens a listbox of its own (not the browser select, whose list flipped upward or could not be dismissed on some phones), always downward, easing the page down first when the list would not fit, closed again by a second tap, a tap outside or Escape without changing the pick; the list is one flat frosted glass tone, dense enough that nothing behind it shows through, unfolds out of the field and folds back into it (MOTION-6), and marks the picked ticket with a raised glass chip and a check, never with a color. Above the compare rows the two picked names stay pinned just under the site header, each at the left of its own column, on a transparent glass bar that blurs the rows passing under it; the compare sheet keeps its fill and blur on a pseudo layer so it is no backdrop root and that blur reaches the rows. Switching tickets under What's included grows the summary card out of the tab just picked, runs a light across it and writes its name and description in, then unrolls the benefit sheet in place, and the rows follow in a quick cascade with their status icons popping in (MOTION-6); statuses sit in one fixed-width column so icons align. The site header (COMP-6, first built for this page) is a floating bar of clear liquid glass inset from the viewport edges, with small chip links; its open menu on phones is blue-tinted clear glass in the Q27 blues, with light that turns slowly inside it, blurred strongly enough that nothing of the page ever reads through the text. The hero's Compare tickets jump link and the discount timeline are transparent glass: barely any fill and only a light blur without a saturation boost, so the page light and the Q bubbles behind stay visible as shapes, the glass reading from a hairline rim, a lit edge and a soft cyan halo. The pinned compare names are the same transparent glass with a slightly stronger blur, because rows pass under them and their text must never read as a second line next to the names. The page ends in a short glass fade into the footer (`.t-page-fade`), which replaces the footer's hairline on this page. The compare view is a product spec sheet in the CI: a glass sheet over the page light, navy ink and hairline rows, with the same buy buttons as the cards. The discount phases open the hero, right under the site header, as one panel of transparent glass with a faint Q27 blue tint (`TicketPhases.astro`). The phase on sale now carries the original Q mark (the same masked `icon-512.png` as the Q bubbles) with a cyan halo, its discount in heavy type and a navy glass pill; every other phase is a clear glass bead that mirrors the light (an almost clear body, a crisp white reflection, a counter glint, a lit rim and a cyan caustic). One glass rod per stretch joins them, a mirror with a bright top edge and a cyan lower edge, stopping short of each mark so it never runs through one, lit in the Q27 blues up to the current phase. Upcoming phases are quieter but readable, past ones fade further. With the timeline shown the hero has no separate Q tile, so the brand mark appears once. The panel unfolds once on load (on its glass layer, so the sheet is never a backdrop root), then the line draws and the phases follow one after another; nothing loops, so the current phase never seems to change. Phases, discounts and the current one come from the page content (`phases`, one source for the timeline and the screen reader price label); nothing switches by date, and without phases the hero shows its Q tile and eyebrow instead. On phones all four phases stay in one row with tighter type, never scrolling sideways. The cards and What's included carry no benefit counter or progress bar; the full benefit lists and the compare view say what a ticket includes. The hero Q tile, where shown, keeps its exact drawing: material comes only from light, a soft highlight and a shallow shadow, never from redrawing, tilting or distorting the mark. +`/ticket-categories/` is the 2027 ticket shop front, and it trades the conference minimalism for a calm, precise sales surface in the Q27 CI, built from liquid glass after the reference images the team picked. Liquid glass here means clear glass with a specular rim that catches light top left and bottom right, a caustic cyan glow along the lower inner edge, a little brightness and saturation lifted from what lies behind, and depth from light rather than from a flat fill (`.t-glass` in `tickets/ticket-theme.css`). A pale cool ground carries glowing light pools (no Q marks: the Q appears in the cards, not behind the page); every ticket card is its own field of ice, cyan and Q27 blue light with one glass Q floating high in its upper right corner, beside the ticket's name (no text ever lies over the Q: the description beside it keeps that column free and wraps, and it reserves the same number of lines on every ticket, so cards and summaries keep the same size), and the highlights sit on a glass panel lit by the card's light. That Q is the glass Q of the home ground (HOME-1): the Q mark rendered in 3D as thick clear glass from the brand file's own outline (`public/home/q-glass-s.webp`, a 400 px copy of the home render), so the brand drawing is never redrawn, and it only floats, turns a few degrees and scales evenly, never stretched or skewed. Buttons are calm rounded rectangles (`--radius-ticket-button`) with a small uppercase label: buy buttons are navy glass with a lit rim, a Q27 blue inner glow and a trailing arrow; pressing one turns it light blue (`ticket-press`) with navy text, on touch, mouse and keyboard alike, and navigation is never delayed for the animation. Moving parts are glass too: a lens that glides to the picked tab and stretches as it moves (on phones the five tabs form a centered, symmetric three over two), glass carousel arrows and a small Q (the original `public/icon-512.png` as a mask, filled with lit glass) marking the current ticket among the dots, and the compare pickers: a clear glass field in the home Buy Now's material that opens a listbox of its own (not the browser select, whose list flipped upward or could not be dismissed on some phones), always downward, easing the page down first when the list would not fit, closed again by a second tap, a tap outside or Escape without changing the pick; the list is one flat frosted glass tone, dense enough that nothing behind it shows through, unfolds out of the field and folds back into it (MOTION-6), and marks the picked ticket with a raised glass chip and a check, never with a color. Above the compare rows the two picked names stay pinned just under the site header, each at the left of its own column, on a transparent glass bar that blurs the rows passing under it; the compare sheet keeps its fill on a pseudo layer and has no backdrop filter of its own, so it is no backdrop root and that blur reaches the rows. Switching tickets under What's included grows the summary card out of the tab just picked, runs a light across it and shows its name and description at once, as plain text, then unrolls the benefit sheet in place, and the rows follow in a quick cascade with their status icons popping in (MOTION-6); statuses sit in one fixed-width column so icons align. The site header (COMP-6, first built for this page) is a floating bar of clear liquid glass inset from the viewport edges, with small chip links; its open menu on phones is blue-tinted clear glass in the Q27 blues, with light that turns slowly inside it, blurred strongly enough that nothing of the page ever reads through the text. The hero's Compare tickets jump link and the discount timeline are transparent glass: barely any fill (the jump link with a light blur without a saturation boost, the timeline with none), so the page light behind stays visible as color and shape, the glass reading from a hairline rim, a lit edge and a soft cyan halo. Live backdrop blur is reserved for glass that content passes under (the site header, the pinned compare names, an open picker list) and for small buttons; resting panels (highlights, tabs, benefit sheet, compare sheet, timeline) carry none, because behind them lies only soft, slowly moving light, where a blur changes nothing visible but is recomputed on every frame. For the same reason an entrance animation never fills forwards and a floating Q sits under one rounded clip only: both otherwise cost an offscreen pass per element on every frame. The pinned compare names are the same transparent glass with a slightly stronger blur, because rows pass under them and their text must never read as a second line next to the names. The page ends in a short glass fade into the footer (`.t-page-fade`), which replaces the footer's hairline on this page. The compare view is a product spec sheet in the CI: a glass sheet over the page light, navy ink and hairline rows, with the same buy buttons as the cards. The discount phases open the hero, right under the site header, as one panel of transparent glass with a faint Q27 blue tint (`TicketPhases.astro`). The phase on sale now carries the original Q mark (the masked `icon-512.png`) with a cyan halo, its discount in heavy type and a navy glass pill; every other phase is a clear glass bead that mirrors the light (an almost clear body, a crisp white reflection, a counter glint, a lit rim and a cyan caustic). One glass rod per stretch joins them, a mirror with a bright top edge and a cyan lower edge, stopping short of each mark so it never runs through one, lit in the Q27 blues up to the current phase. Upcoming phases are quieter but readable, past ones fade further. With the timeline shown the hero has no separate Q tile, so the brand mark appears once. The panel unfolds once on load (on its glass layer, so the sheet is never a backdrop root), then the line draws and the phases follow one after another; nothing loops, so the current phase never seems to change. Phases, discounts and the current one come from the page content (`phases`, one source for the timeline and the screen reader price label); nothing switches by date, and without phases the hero shows its Q tile and eyebrow instead. On phones all four phases stay in one row with tighter type, never scrolling sideways. The cards and What's included carry no benefit counter or progress bar; the full benefit lists and the compare view say what a ticket includes. The hero Q tile, where shown, keeps its exact drawing: material comes only from light, a soft highlight and a shallow shadow, never from redrawing, tilting or distorting the mark. On phones the cards become a scroll-snap carousel with exactly one card at rest, buttons, dots and a `1 / 5` count; it never autoplays and never captures vertical scrolling. Tablets and laptops show three cards over two, centered; wide screens show all five in one row. Without JavaScript the carousel still swipes, every panel of What's included is shown, and every buy link works. **TICKETS-1 The 2027 ticket page is its own sales system.** Components under `src/components/tickets/` and the `/ticket-categories` page shell may skip `.section` / `.container` padding rhythm / `.button` (LAYOUT-1, LAYOUT-3, COMP-1, TYPE-1), may use the `ticket-*` tokens, display type above the heading scale, and glass depth built from tinted, layered shadows and inset light edges rather than the `--shadow-*` steps (DEPTH-1). The ambient light fields loop longer than 500ms (`--duration-ticket-drift*`), move by transform only, pause off screen, and stop entirely for reduced motion, which shows a still frame of the same light. Everything else stays inside MOTION-2 and MOTION-3. Conference pages may not import the `ticket-*` tokens or `tickets/ticket-theme.css`; the one exception is the site header and `.button.is-glass` (COMP-6). Cite this ID on every tickets ` diff --git a/apps/web/src/components/home/FaqAccordion.vrt.ts b/apps/web/src/components/home/FaqAccordion.vrt.ts deleted file mode 100644 index 3692696..0000000 --- a/apps/web/src/components/home/FaqAccordion.vrt.ts +++ /dev/null @@ -1,47 +0,0 @@ -// VRT variants for FaqAccordion. Exercises the content-length edges a CMS -// produces: a normal set, many items, long answers that must wrap, and empty. -import FaqAccordion from "./FaqAccordion.astro"; - -// Realistic long English copy (not lorem ipsum): it wraps like real CMS answers -// and keeps the spell checker clean. See docs/dev/visual-testing.md. -const LONG = - "Q-Summit brings together thousands of ambitious students, founders and investors for two days of keynotes, workshops and hands-on sessions. Tickets include full access to every stage, the partner expo and the evening networking events, and are fully transferable up to the week before the conference. "; - -const faqs = (n: number, opts: { long?: boolean } = {}) => - Array.from({ length: n }, (_, i) => ({ - question: `What does question number ${i + 1} actually cover?`, - answerHtml: opts.long - ? `

${LONG.repeat(6)}

` - : "

A short, concise answer.

", - page: "index" as const, - })); - -export default { - component: FaqAccordion, - variants: { - default: { - heading: "Frequently asked questions", - intro: "Everything you need to know before you join.", - faqs: faqs(4), - cta: { label: "More questions", href: "#" }, - }, - "many-items": { - heading: "FAQ", - intro: "A long list stresses vertical rhythm and spacing.", - faqs: faqs(12), - cta: undefined, - }, - "long-answers": { - heading: "FAQ", - intro: "Long CMS answers must wrap cleanly, not overflow.", - faqs: faqs(3, { long: true }), - cta: undefined, - }, - empty: { - heading: "FAQ", - intro: "No questions have been published yet.", - faqs: [], - cta: undefined, - }, - }, -}; diff --git a/apps/web/src/components/home/GlassQ.astro b/apps/web/src/components/home/GlassQ.astro new file mode 100644 index 0000000..52c549b --- /dev/null +++ b/apps/web/src/components/home/GlassQ.astro @@ -0,0 +1,34 @@ +--- +// A glass Q (DESIGN.md HOME-1): the Q mark as a thick, clear glass object, +// rendered in 3D from the brand file's own outline (one small WebP with +// alpha, public/home/q-glass-a.webp). The home ground floats three of them +// behind the page (HomeGround.astro); the ticket cards carry the same +// render (tickets/TicketQBubble.astro). Decorative: empty alt, aria-hidden, no pointer events. +// Placement, size and motion come from the caller's class. +interface Props { + class?: string; +} + +const { class: className } = Astro.props; +--- + + + + diff --git a/apps/web/src/components/home/Hero.astro b/apps/web/src/components/home/Hero.astro index 4075122..927aeb9 100644 --- a/apps/web/src/components/home/Hero.astro +++ b/apps/web/src/components/home/Hero.astro @@ -12,20 +12,43 @@ // seamless. // Reduced-motion and data-saver users get the poster only; no video bytes // are fetched for them. No-JS clients get the 480p progressive fallback. -import type { PageLink } from "../../lib/content"; +// +// Copy (DESIGN.md HOME-1): a glass badge with the anniversary, dates and +// city, the headline, two short lead lines, the countdown, the glass +// Buy Now. The site tagline now heads the key figures below the hero +// (StatsBand.astro). The lead lines replace the older announcement +// lines when they are set; without them, and without countdown wording, +// the hero falls back to the announcement, so it builds on either content. +import type { HomeCountdown, PageLink } from "../../lib/content"; import { EVENTS } from "../../lib/analytics/events"; import Container from "../ui/Container.astro"; import IconArrowRight from "../icons/IconArrowRight.astro"; +import HeroCountdown from "./HeroCountdown.astro"; interface Props { headline: string; - tagline: string; - /** Announcement lines shown under the headline. */ + /** Announcement lines shown under the headline when there are no lead lines. */ announcement: string[]; cta: PageLink | undefined; + /** Pill above the headline. */ + badge?: string; + /** Short lines under the headline. */ + leadLines?: string[]; + /** Countdown wording; the countdown shows only with it. */ + countdown?: HomeCountdown; + /** First conference day (yyyy-mm-dd), the countdown's target. */ + startDate?: string; } -const { headline, tagline, announcement, cta } = Astro.props; +const { + headline, + announcement, + cta, + badge, + leadLines = [], + countdown, + startDate, +} = Astro.props; ---
@@ -179,9 +202,25 @@ const { headline, tagline, announcement, cta } = Astro.props;
+ { + badge && ( +

+ {badge} +

+ ) + }

{headline}

{ - announcement.length > 0 && ( + leadLines.length > 0 && ( +

+ {leadLines.map((line, i) => ( + {line} + ))} +

+ ) + } + { + leadLines.length === 0 && announcement.length > 0 && (

) } -

{tagline}

+ { + countdown && startDate && ( + + ) + } { cta && ( +
+ + + + + diff --git a/apps/web/src/components/home/HomeGround.astro b/apps/web/src/components/home/HomeGround.astro new file mode 100644 index 0000000..ac7e79f --- /dev/null +++ b/apps/web/src/components/home/HomeGround.astro @@ -0,0 +1,202 @@ +--- +// The ground behind the home page (DESIGN.md HOME-1), built like the +// ticket page's ground: a pale, cool base, three very large pools of ice, +// cyan and blue light that drift slowly, and three glass Qs that float, +// turn a few degrees and breathe. The Qs are one small 3D render of the Q +// mark as clear glass (GlassQ.astro), shown at three sizes. Fixed behind +// the content, so the glass panes always have light and shape to pick up. +// Decorative only: aria-hidden, no pointer events, transform-only motion, +// still while the hero video covers it (home.client.ts) and for reduced +// motion. +import GlassQ from "./GlassQ.astro"; +--- + + + + diff --git a/apps/web/src/components/home/PartnerLogos.astro b/apps/web/src/components/home/PartnerLogos.astro index ae7962d..6b143c8 100644 --- a/apps/web/src/components/home/PartnerLogos.astro +++ b/apps/web/src/components/home/PartnerLogos.astro @@ -1,34 +1,35 @@ --- -// Partner logo band, ported from the live site's stats/logo showcase rows: -// two rows (startup/corporate partners, network partners). Each row is one -// full-width marquee with the label (running count + name) rendered as a -// fixed layer ON TOP of the strip: logos flow underneath it, disappear -// into its feathered right edge, re-emerge from its feathered left edge, -// and travel on to the band's left edge where the viewport mask fades -// them out -- the "bridge" effect. Both rows share the same label inset -// and width, so the two labels align pixel-for-pixel. The logo track is -// two identical groups animated with a CSS keyframe translateX(-50%) loop -// (no client JS needed for a working marquee), paused on hover/focus, and -// falls back to a static wrapped grid under prefers-reduced-motion. +// Partner rows on the home page (DESIGN.md HOME-1): one logo strip per +// group (Startups, Corporates, Network), running from one edge of the +// window to the other, straight and on no surface of its own. Only the +// row's name sits on glass: a milky pane at the left, opaque behind the +// words and clearing only to their right, so the logos pass under it and +// dissolve into it. Every logo +// sits on a small slab of glass with a visible lower edge. // -// Seamless-loop coverage: translateX(-50%) is only gapless while one -// group is at least as wide as the viewport (worst case, exactly one -// group width of track remains on screen). A short row (the network -// partners) can't rely on a single logo set for that at 120rem, so each -// group repeats its set `repeats` times, computed at build time from the -// logos' rendered widths against the band's maximum width. +// Built to stay smooth: +// - a strip is two identical groups moving by translate3d(-50%), on its +// own compositor layer (will-change), so a frame only moves a texture +// and never repaints or lays out; +// - nothing filters or masks the moving strips: the milky pane is a +// plain gradient fill, not a backdrop blur, so it costs nothing per +// frame; +// - logos load eagerly, and home.client.ts swaps every logo for a copy +// scaled to its drawn size once the page is idle: the partner files +// are several hundred pixels wide, and decoding one each time it +// slid into view is what made the strips stutter; +// - a group repeats its logos only until it covers a wide window; +// - motion stops on hover and keyboard focus, with the Pause button and +// while the section is off screen (home.client.ts). +// The repeats are decorative (aria-hidden, no link), so keyboard and +// screen reader users meet every partner once. Reduced motion shows the +// strips as plain rows that scroll sideways by hand. // -// The band is a breakout (DESIGN.md LAYOUT-1's one documented exception, see -// tokens.css's --container-marquee): it runs to the actual browser edge on -// any viewport up to a full 1080p window (120rem) and is capped, centered, -// only on wider monitors. On phones it collapses to a stacked label above -// an edge-to-edge marquee with fades at both screen edges. -// -// Motion can be paused by hovering or focusing the track; reduced-motion -// removes the animation entirely (below). -import Section from "../ui/Section.astro"; -import Container from "../ui/Container.astro"; -import Button from "../ui/Button.astro"; +// Logos keep their proportions and get the same optical size: every logo +// is scaled to the same area inside a fixed slab, so a wide wordmark and a +// square mark carry the same weight. +import "./home-theme.css"; +import IconArrowRight from "../icons/IconArrowRight.astro"; export interface PartnerLogo { name: string; @@ -39,466 +40,462 @@ export interface PartnerLogo { } export interface PartnerLogoGroup { - value: string; label: string; + description?: string; logos: PartnerLogo[]; } interface Props { + eyebrow?: string; + heading?: string; groups: PartnerLogoGroup[]; cta?: { label: string; href: string }; } -const { groups, cta } = Astro.props; - -// Rendered strip metrics, mirroring the CSS below: logos display at 2rem -// (32px) tall capped at 7rem (112px) wide, with a 1.75rem (28px) flex gap, -// and each set carries a trailing 1.75rem padding. One group must cover -// the band's maximum width (--container-marquee, 120rem = 1920px) for the -// -50% loop to stay gapless; a small margin absorbs rounding. -const LOGO_HEIGHT_PX = 32; -const LOGO_MAX_WIDTH_PX = 112; -const LOGO_GAP_PX = 28; -const GROUP_MIN_WIDTH_PX = 1920 + LOGO_GAP_PX; - -function renderedSetWidth(logos: PartnerLogo[]): number { - return logos.reduce((sum, logo) => { - const scaled = Math.min( - (logo.width / logo.height) * LOGO_HEIGHT_PX, - LOGO_MAX_WIDTH_PX, - ); - return sum + scaled + LOGO_GAP_PX; - }, 0); +const { eyebrow, heading, groups, cta } = Astro.props; + +// Mirrors the CSS below (rem = 16px): slab 10rem wide, 0.75rem gap. +const SLAB_PX = 160; +const GAP_PX = 12; +// One group must cover a wide window (the strips run edge to edge). +const GROUP_MIN_PX = 2600; +// Every strip moves this many pixels per second. +const SPEED_PX_S = 30; + +// Same optical size for every logo: equal area, capped to the slab. +const LOGO_AREA = 2600; +const LOGO_MAX_W = 118; +const LOGO_MAX_H = 46; + +function logoBox(logo: PartnerLogo): { width: number; height: number } { + const ratio = logo.width / logo.height; + let width = Math.sqrt(LOGO_AREA * ratio); + let height = Math.sqrt(LOGO_AREA / ratio); + const fit = Math.min(1, LOGO_MAX_W / width, LOGO_MAX_H / height); + width *= fit; + height *= fit; + return { width: Math.round(width), height: Math.round(height) }; } -function repeatsFor(logos: PartnerLogo[]): number { - const setWidth = renderedSetWidth(logos); - return setWidth > 0 - ? Math.max(1, Math.ceil(GROUP_MIN_WIDTH_PX / setWidth)) - : 1; -} +const rows = groups.map((group, index) => { + const setWidth = group.logos.length * (SLAB_PX + GAP_PX); + const repeats = + setWidth > 0 ? Math.max(1, Math.ceil(GROUP_MIN_PX / setWidth)) : 1; + return { + ...group, + repeats, + reverse: index % 2 === 1, + seconds: Math.round((setWidth * repeats) / SPEED_PX_S), + logos: group.logos.map((logo) => ({ ...logo, box: logoBox(logo) })), + }; +}); --- { - groups.length > 0 && ( -
-
- {groups.map((group) => { - const repeats = repeatsFor(group.logos); - return ( -
0 && ( +
+
+
+
+ {eyebrow && ( +

+ {eyebrow} +

+ )} + {heading && ( +

+ {heading} +

+ )} +
+ {cta && ( +
-
-

{group.value}

-

{group.label}

-
-
-
-
- - {/* Coverage repeats: pad a short set out to the band's - maximum width. Decorative (plain img, no link) and - aria-hidden, so assistive tech and keyboard users - only ever encounter the real list once. */} - {Array.from({ length: repeats - 1 }).map(() => ( - - ))} -
- {/* Decorative duplicate group: continues the visual strip - so the -50% loop reads as seamless. Hidden from - assistive tech like the coverage repeats above. */} - +
+ +
+ {rows.map((row) => ( +
+
+

{row.label}

+ {row.description &&

{row.description}

} +
+
+
+ {[0, 1].map((half) => ( +
+ {Array.from({ length: row.repeats }).map((_, repeat) => { + const real = half === 0 && repeat === 0; + return ( +
    + {row.logos.map((logo) => { + const image = ( + + ); + return ( +
  • + {real ? ( + + {image} + + ) : ( + {image} + )} +
  • + ); + })} +
+ ); + })}
-
+ ))}
- ); - })} -
- {cta && ( - -
-
-
- )} -
+ ))} +
+ +
+ +
+
) } - - diff --git a/apps/web/src/components/home/PartnerLogos.vrt.ts b/apps/web/src/components/home/PartnerLogos.vrt.ts index 78b0bf5..be4bf49 100644 --- a/apps/web/src/components/home/PartnerLogos.vrt.ts +++ b/apps/web/src/components/home/PartnerLogos.vrt.ts @@ -1,5 +1,7 @@ -// VRT variants for PartnerLogos. Stresses the marquee's repeat-computation -// (repeatsFor) with different logo counts and the empty-groups short-circuit. +// VRT variants for PartnerLogos. Stresses the strip's repeat computation +// with different logo counts, logos of very different proportions (the +// equal-area sizing), a row without a description, and the empty +// short-circuit. See docs/dev/visual-testing.md. import PartnerLogos, { type PartnerLogoGroup } from "./PartnerLogos.astro"; const logo = (name: string, width: number, height: number) => ({ @@ -12,8 +14,8 @@ const logo = (name: string, width: number, height: number) => ({ const defaultGroups: PartnerLogoGroup[] = [ { - value: "50", - label: "Startup and corporate partners", + label: "Sample startups", + description: "Sample founders", logos: [ logo("Northwind Capital", 160, 40), logo("Bluepeak Systems", 140, 40), @@ -23,8 +25,16 @@ const defaultGroups: PartnerLogoGroup[] = [ ], }, { - value: "12", - label: "Network partners", + label: "Sample corporates", + description: "Sample companies", + logos: [ + logo("Wide Wordmark Holdings", 400, 40), + logo("Square Mark", 80, 80), + logo("Tall Mark", 40, 90), + ], + }, + { + label: "Sample network", logos: [ logo("Founders Guild", 130, 38), logo("Startup Alliance Bavaria", 170, 40), @@ -36,34 +46,18 @@ export default { component: PartnerLogos, variants: { default: { + eyebrow: "Sample partners", + heading: "Partners of the sample edition", groups: defaultGroups, - cta: { label: "Become a partner", href: "#partners" }, - }, - "many-logos": { - groups: [ - { - value: "80", - label: "Startup and corporate partners", - logos: Array.from({ length: 16 }, (_, i) => - logo(`Partner Company ${i + 1}`, 140, 40), - ), - }, - ], - cta: undefined, + cta: { label: "View all sample partners", href: "#partners" }, }, - "single-logo": { - groups: [ - { - value: "1", - label: "Network partners", - logos: [logo("Founders Guild", 130, 38)], - }, - ], - cta: undefined, + "one-row-no-cta": { + heading: "One row", + groups: defaultGroups.slice(0, 1), }, empty: { + heading: "No partners yet", groups: [], - cta: undefined, }, }, }; diff --git a/apps/web/src/components/home/SocialSection.astro b/apps/web/src/components/home/SocialSection.astro new file mode 100644 index 0000000..9c7784c --- /dev/null +++ b/apps/web/src/components/home/SocialSection.astro @@ -0,0 +1,356 @@ +--- +// LinkedIn and Instagram on the home page (DESIGN.md HOME-1): one pane of +// glass with the copy in the middle, the LinkedIn mark at the left and the +// Instagram mark at the right, each a link to the profile from Site +// Settings, and a projection screen for posts below. +// +// The marks are glass objects like the glass Q of the page ground: each +// brand glyph rendered in 3D as thick clear glass from its official +// outline, with the Q's material and light (small WebPs with alpha under +// public/home/), each on a square of deep blue light so the clear glass +// reads. They stand upright; hover lifts one, a press pushes it in. +// +// The screen is where posts will be shown, under a cone of light: four +// frames laid out like the grid of an Instagram profile, portrait tiles +// with square corners and one even, narrow gap between them, and no frame +// or housing around the grid. The +// frames show the newest four posts, the newest at the far left +// (lib/social-posts.ts: editors add each new post at the end of +// home.social.posts, every older one moves a place right and the oldest +// drops out by itself). Frames without a post stay empty: +// decorative, hidden from assistive tech, no invented post, no feed +// script, no third-party request. A filled frame is a plain link with the +// post image served from our own media. +import type { HomeSocial } from "../../lib/content"; +import { photoSrc } from "../../lib/media-filename"; +import { HOME_POST_FRAMES, latestPosts } from "../../lib/social-posts"; +import "./home-theme.css"; + +interface Props { + social: HomeSocial; + /** Profile URLs from Site Settings; a mark without a URL is not shown. */ + linkedinHref?: string; + instagramHref?: string; +} + +const { social, linkedinHref, instagramHref } = Astro.props; + +const marks = [ + { + key: "linkedin", + href: linkedinHref, + label: social.linkedinLabel, + image: "/home/glass-linkedin.webp", + }, + { + key: "instagram", + href: instagramHref, + label: social.instagramLabel, + image: "/home/glass-instagram.webp", + }, +] as const; +const [linkedin, instagram] = marks; + +const posts = latestPosts(social.posts); +const frames = Array.from( + { length: HOME_POST_FRAMES }, + (_, i) => posts[i] ?? null, +); +--- + +
+
+
+
+ { + [linkedin, instagram].map( + (mark) => + mark.href && ( + + + + + + {mark.label} + (opens in a new tab) + + + ), + ) + } +
+

{social.eyebrow}

+

+ {social.heading} +

+

+ {social.intro} +

+
+
+ +
+ +
    + { + frames.map((post) => ( +
  • + {post && ( + + + + )} +
  • + )) + } +
+
+
+
+
+ + diff --git a/apps/web/src/components/home/SocialSection.vrt.ts b/apps/web/src/components/home/SocialSection.vrt.ts new file mode 100644 index 0000000..9c0916e --- /dev/null +++ b/apps/web/src/components/home/SocialSection.vrt.ts @@ -0,0 +1,39 @@ +// VRT variants for the home LinkedIn / Instagram section: both profiles +// with the four empty frames (the launch state), one profile only, and a +// long heading. Posts need real media, so the filled state is not a +// variant. See docs/dev/visual-testing.md. +import SocialSection from "./SocialSection.astro"; + +const social = { + eyebrow: "Sample eyebrow", + heading: "Sample social heading", + intro: "Sample copy about what the two channels show.", + linkedinLabel: "Follow on sample one", + instagramLabel: "Follow on sample two", + posts: [], +}; + +export default { + component: SocialSection, + variants: { + default: { + social, + linkedinHref: "#linkedin", + instagramHref: "#instagram", + }, + "one-profile": { + social, + linkedinHref: "#linkedin", + }, + "long-copy": { + social: { + ...social, + heading: "A long sample heading that wraps between the two marks", + intro: + "A longer sample introduction that runs over two lines, so the copy between the two glass marks shows how it wraps on every screen.", + }, + linkedinHref: "#linkedin", + instagramHref: "#instagram", + }, + }, +}; diff --git a/apps/web/src/components/home/SpeakerGrid.astro b/apps/web/src/components/home/SpeakerGrid.astro index 0476afa..df6d66a 100644 --- a/apps/web/src/components/home/SpeakerGrid.astro +++ b/apps/web/src/components/home/SpeakerGrid.astro @@ -1,415 +1,565 @@ --- -// Previous Speakers carousel, rendered at build time from getSpeakers(). -// The Webflow site built this section as a client-side JS carousel with -// the speaker data inlined in a script tag; that JS is gone and the same -// people now come from the content layer. +// Speaker highlights on the home page (DESIGN.md HOME-1): a grid of +// portrait cards. A card is a tile of pale glass with three parts that +// never cover a face: a band at the top with the tag that says what the +// person is to Q-Summit (frosted glass, at the right), the portrait set +// into the tile below it, cut off straight at its lower edge, and under it +// a white foot that begins just above the name: the name stands on a slab +// of clear glass in the manner of the glass Q, on white. // -// This used to render as a 4-column grid, which for the current 5-speaker -// set wrapped 4+1 (a near-empty last row). A compact horizontal scroll-snap -// carousel reads correctly at any speaker count instead. +// alumni past speakers, badged with alumniLabel ("Past Speaker"), so +// nobody reads them as booked for the next edition. The prop +// names are historical: these are not Q alumni (former team +// members), and the badge must not call them that +// lineup the next edition's lineup, badged with its year; the cards are +// the published "current" speakers of that year, so publishing a +// speaker in the CMS is all it takes to fill a slot. While the +// edition has none, the page may pass earlier speakers in their +// place, with their own badge (index.astro) // -// The track (
/
, image, name, roleLine, bio) is a native -// scroll-snap container, keyboard- and touch-usable with zero JS. Track and -// slides are plain
s, not
    /
  • : each slide carries -// role="group" + aria-roledescription="slide" per the WAI-ARIA APG carousel -// pattern, and a list ancestor would conflict with that (a
      requires -// listitem children; overriding a child to role="group" instead breaks the -// list semantics the
        claims -- axe's list / aria-allowed-role rules, -// WCAG 1.3.1). Plain
        s claim no role at all, so nothing conflicts. -// The prev/next arrows and position dots are a progressive enhancement layered -// on top by the inline script and stay hidden without JS (gated on -// `.speakers-carousel[data-js]`), so there is never a dead control on -// screen. The infinite loop is done with head/tail clone slides plus an -// idle seam recentre: the clones are created in JS only (never in this -// markup) so the no-JS DOM stays at exactly N real slides. +// Open lineup slots render only when `placeholders` is on (local review): +// they are marked placeholder cards, never a name or a face. With it off, +// open slots simply do not exist, and without any lineup speaker the row +// is gone, so a live build never shows an unfinished lineup. import { Picture } from "../../lib/astro-assets"; import type { PageLink, Speaker } from "../../lib/content"; import { photoSrc } from "../../lib/media-filename"; import { resolveContentImage } from "../../lib/images"; -import Button from "../ui/Button.astro"; -import Container from "../ui/Container.astro"; -import Section from "../ui/Section.astro"; -import SectionHeader from "../ui/SectionHeader.astro"; +import IconArrowRight from "../icons/IconArrowRight.astro"; +import "./home-theme.css"; interface Props { + eyebrow?: string; heading: string; - intro: string; - speakers: Speaker[]; cta: PageLink | undefined; + /** Past speakers, in display order. */ + alumni: Speaker[]; + alumniLabel?: string; + /** Published speakers of the next edition. */ + lineup?: Speaker[]; + lineupLabel?: string; + /** How many lineup cards the row holds. */ + lineupSlots?: number; + /** Fill open lineup slots with marked placeholder cards. */ + placeholders?: boolean; + placeholderName?: string; + placeholderRole?: string; } -const { heading, intro, speakers, cta } = Astro.props; +const { + eyebrow, + heading, + cta, + alumni, + alumniLabel, + lineup = [], + lineupLabel, + lineupSlots = 0, + placeholders = false, + placeholderName = "", + placeholderRole = "", +} = Astro.props; + +type Card = + | { + kind: "speaker"; + speaker: Speaker; + badge?: string; + tone: "alumni" | "lineup"; + } + | { kind: "placeholder"; badge?: string }; + +const lineupCards: Card[] = lineup + .slice(0, lineupSlots || lineup.length) + .map((speaker) => ({ + kind: "speaker", + speaker, + badge: lineupLabel, + tone: "lineup", + })); +if (placeholders) { + while (lineupCards.length < lineupSlots) { + lineupCards.push({ kind: "placeholder", badge: lineupLabel }); + } +} -const speakerImages = await Promise.all( - speakers.map((speaker) => - resolveContentImage(speaker.photoFilename, `home speaker ${speaker.name}`), +const cards: Card[] = [ + ...alumni.map((speaker): Card => ({ + kind: "speaker", + speaker, + badge: alumniLabel, + tone: "alumni", + })), + ...lineupCards, +]; + +// Two rows: past speakers four across, the lineup row as many across as +// it has cards (up to five), so a row of five is not left with one card +// alone on a second line. +const indexed = cards.map((card, i) => ({ card, i })); + +// A name as first name and the rest, so a narrow card can set the two on +// lines of their own (every caption then has the same two name lines). +function nameParts(name: string): [string, string] { + const at = name.trim().indexOf(" "); + return at < 0 ? [name.trim(), ""] : [name.slice(0, at), name.slice(at + 1)]; +} +const rows = [ + { cols: 4, cards: indexed.slice(0, alumni.length) }, + { + cols: Math.min(5, Math.max(4, lineupCards.length)), + cards: indexed.slice(alumni.length), + }, +].filter((row) => row.cards.length > 0); + +const images = await Promise.all( + cards.map((card) => + card.kind === "speaker" + ? resolveContentImage( + card.speaker.photoFilename, + `home speaker ${card.speaker.name}`, + ) + : null, ), ); - -const total = speakers.length; --- -
        - - -

        {heading}

        -

        {intro}

        -
        - + {cta && ( + - - -
        - {speakers.map((speaker, i) => ( -
        - - ) - } -
        - { - cta && ( - - ) - } - - + + {rows.map((row) => ( +
          + {row.cards.map(({ card, i }) => ( +
        • +
          + {card.badge &&

          {card.badge}

          } +
          +
          + {card.kind === "placeholder" ? ( +
          +
          +
          +

          + {card.kind === "speaker" ? ( + <> + {nameParts(card.speaker.name)[0]}{" "} + {nameParts(card.speaker.name)[1]} + + ) : ( + placeholderName + )} +

          +

          + {card.kind === "speaker" + ? card.speaker.roleLine + : placeholderRole} +

          +
          +
          +
        • + ))} +
        + ))} +
+ + ) +} - - diff --git a/apps/web/src/components/home/SpeakerGrid.vrt.ts b/apps/web/src/components/home/SpeakerGrid.vrt.ts index 583383b..4b0024a 100644 --- a/apps/web/src/components/home/SpeakerGrid.vrt.ts +++ b/apps/web/src/components/home/SpeakerGrid.vrt.ts @@ -1,7 +1,8 @@ -// VRT variants for the previous-speakers carousel. Covers the 5-speaker set -// the live homepage ships (see the component's own header comment), a long -// list, a single speaker (nav/dots hidden below total > 1), and a long bio -// that must clamp to 3 lines. +// VRT variants for the home speaker highlights: past speakers alone, past +// speakers plus a partly filled lineup with placeholders (local review), +// the same lineup without placeholders (what a live build shows), and long +// names and roles. Photos are sample filenames that do not exist, so the +// cards show their light ground. See docs/dev/visual-testing.md. import SpeakerGrid from "./SpeakerGrid.astro"; import type { Speaker } from "../../lib/content"; @@ -15,59 +16,67 @@ const speaker = ( company: null, roleLine, photoFilename: `speaker-${name.toLowerCase().replace(/\s+/g, "-")}.jpg`, - group: "previous", - year: 2026, + group: "panel", + year: null, ...overrides, }); -const LONG_BIO = - "Started her first company while still studying computer science, later scaled it to serve customers across twelve European markets before joining an early-stage venture fund to back the next wave of student founders full time."; +const alumni = [ + speaker("Anna Keller", "Co-Founder of Northwind Capital"), + speaker("David Marsh", "Director DACH & EMEA @Bluepeak Systems"), + speaker("Priya Rao", "Founder of Rivertech Labs"), + speaker("Tobias Wagner", "Partner at Cedar Ventures"), +]; + +const lineup = [ + speaker("Sample Speaker", "Sample role, Sample company", { + group: "current", + year: 2027, + }), +]; + +const base = { + eyebrow: "Sample eyebrow", + heading: "Sample speaker highlights", + cta: { label: "See all sample speakers", href: "#speakers" }, + alumni, + alumniLabel: "Sample past speaker", +}; export default { component: SpeakerGrid, variants: { - default: { - heading: "Previous speakers", - intro: "A look back at who has taken the stage at Q-Summit.", - speakers: [ - speaker("Anna Keller", "Co-Founder of Northwind Capital", { - bio: "Co-founded Northwind Capital after five years building payment infrastructure for European retailers.", - }), - speaker("David Marsh", "Director DACH & EMEA @Bluepeak Systems"), - speaker("Priya Rao", "Founder of Rivertech Labs", { - bio: "Built Rivertech Labs from a university side project into a twenty-person logistics startup.", - }), - speaker("Tobias Wagner", "Partner at Cedar Ventures"), - speaker("Lena Fischer", "Head of Product at Solace Bank"), - ], - cta: { label: "See all speakers", href: "/speaker" }, + default: base, + "lineup-with-placeholders": { + ...base, + lineup, + lineupLabel: "2027", + lineupSlots: 4, + placeholders: true, + placeholderName: "Sample placeholder", + placeholderRole: "Placeholder, sample only", }, - "many-speakers": { - heading: "Previous speakers", - intro: "Twelve years of Q-Summit main stage guests.", - speakers: Array.from({ length: 12 }, (_, i) => - speaker(`Speaker Number ${i + 1}`, "Founder and Q-Summit alumnus"), - ), - cta: { label: "See all speakers", href: "/speaker" }, + "lineup-live": { + ...base, + lineup, + lineupLabel: "2027", + lineupSlots: 4, + placeholders: false, }, - "single-speaker": { - heading: "Previous speakers", - intro: "Only one highlight has been published so far.", - speakers: [speaker("Anna Keller", "Co-Founder of Northwind Capital")], - cta: undefined, - }, - "long-bio": { - heading: "Previous speakers", - intro: "Long CMS bios must clamp instead of overflowing the card.", - speakers: [ - speaker("Anna Keller", "Co-Founder of Northwind Capital", { - bio: LONG_BIO, - }), - speaker("David Marsh", "Director DACH & EMEA @Bluepeak Systems", { - bio: LONG_BIO, - }), + "long-names": { + ...base, + alumni: [ + speaker( + "Dr. Maximiliane Alexandra von Hohenberg-Sample", + "Managing Director and Chief Sample Officer, Sample Holdings International", + ), + ...alumni.slice(0, 2), ], + }, + empty: { + heading: "No speakers", cta: undefined, + alumni: [], }, }, }; diff --git a/apps/web/src/components/home/StatsBand.astro b/apps/web/src/components/home/StatsBand.astro index e93117d..80402d0 100644 --- a/apps/web/src/components/home/StatsBand.astro +++ b/apps/web/src/components/home/StatsBand.astro @@ -1,100 +1,253 @@ --- -// Numbers band, ported from the Webflow section_home_numbers. The old site -// animated the counters with client JS; the values render statically here. +// Key figures of the last edition (DESIGN.md HOME-1), right under the +// hero: the site's tagline as the heading, then the four figures on one +// pane of glass, set apart by rods of glass instead of each sitting on a +// pane of its own. +// +// The pane is simply there (no entrance); only the figures move: the first +// time the row is seen each one sharpens out of a blur while it counts up, +// once (home.client.ts). The final value is in the markup from the start +// and the digits are equal width, so nothing shifts; a visitor without +// JavaScript or with reduced motion sees the figures at once, and screen +// readers read the final value, never the running count. import type { PageStat } from "../../lib/content"; -import Section from "../ui/Section.astro"; +import "./home-theme.css"; interface Props { + /** Shown above the figures: the hero tagline. */ + tagline?: string; + /** Names the section when there is no tagline (not shown then). */ heading: string; - intro: string; stats: PageStat[]; } -const { heading, intro, stats } = Astro.props; - -// The live site's counters animate via client JS that formats with -// toLocaleString('de-DE') (adding "1.500"-style separators); this port -// renders the final value statically with no such JS, so it renders the -// content layer's plain digits ("1500") as-is, matching the site mirror. +const { tagline, heading, stats } = Astro.props; --- - -
-
-
-

{heading}

-

{intro}

-
-
+
+
+ { + tagline ? ( +

+ {tagline} +

+ ) : ( +

+ {heading} +

+ ) + } +
{ stats.map((stat) => ( -
+
{stat.label}
-
{stat.value}
+
+ + {stat.value} + + +
)) }
-
+
diff --git a/apps/web/src/components/home/StatsBand.vrt.ts b/apps/web/src/components/home/StatsBand.vrt.ts index 23809f9..7509362 100644 --- a/apps/web/src/components/home/StatsBand.vrt.ts +++ b/apps/web/src/components/home/StatsBand.vrt.ts @@ -1,5 +1,5 @@ // VRT variants for StatsBand. Content stresses the layout the way real CMS data -// will: the default set, long labels that can overflow a grid cell, and a short +// will: the default set, long labels that must wrap inside a tile, and a short // set. See docs/dev/visual-testing.md for the variant conventions. import StatsBand from "./StatsBand.astro"; @@ -7,21 +7,20 @@ export default { component: StatsBand, variants: { default: { + tagline: "A sample tagline that heads the sample figures", heading: "Q-Summit in numbers", - intro: "The event at a glance.", stats: [ { value: "3000", label: "Attendees" }, - { value: "120", label: "Speakers" }, + { value: "120+", label: "Speakers" }, { value: "2", label: "Days" }, - { value: "50", label: "Partners" }, + { value: "50+", label: "Partners" }, ], }, "long-labels": { heading: "Impact", - intro: "Long labels can overflow a fixed grid cell.", stats: [ { - value: "3000", + value: "3,000", label: "Ambitious students, founders and investors in one hall", }, { @@ -32,7 +31,6 @@ export default { }, few: { heading: "Numbers", - intro: "Only two stats published.", stats: [ { value: "10", label: "Years" }, { value: "1", label: "Mission" }, diff --git a/apps/web/src/components/home/WhyCards.astro b/apps/web/src/components/home/WhyCards.astro index 1bdf99e..ef2c633 100644 --- a/apps/web/src/components/home/WhyCards.astro +++ b/apps/web/src/components/home/WhyCards.astro @@ -1,169 +1,312 @@ --- -// "Why Everyone's at Q-Summit" cards, ported from the Webflow -// section_why_attend (layout249). Prefer Astro when the -// gitignored src/assets/media/ copy exists (local: `pnpm picture:sync`); -// otherwise fall back to the R2 /media/ -800 webp (CI/prod). -import type { PageLink } from "../../lib/content"; -import { EVENTS } from "../../lib/analytics/events"; -import { Picture } from "../../lib/astro-assets"; -import { resolveContentImage } from "../../lib/images"; -import Button from "../ui/Button.astro"; -import Container from "../ui/Container.astro"; -import Section from "../ui/Section.astro"; -import SectionHeader from "../ui/SectionHeader.astro"; - -export interface WhyCard { - title: string; - description: string; -} +// "Why Q?" on the home page (DESIGN.md HOME-1): one tile per audience +// (students and young professionals, startups, corporates, investors) as an +// entry point, not a summary of the audience pages. Each tile is a pane of +// clear glass with a photo set into it and a short pitch; the whole tile is +// one link (the title is the link, stretched over the tile), so the link's +// name is the audience, not "Learn more" four times. On a fine pointer the +// tile turns a degree or two toward the cursor and a small light follows it +// across the glass, never across the photo (home.client.ts); a press gives a little and springs back (MOTION-6). +// +// A tile without an href renders as plain content, and one without a photo +// keeps its shape with a pool of light, so older content still builds. +import type { WhyCard as WhyCardContent } from "../../lib/content"; +import { photoSrc } from "../../lib/media-filename"; +import IconArrowRight from "../icons/IconArrowRight.astro"; +import "./home-theme.css"; + +export type WhyCard = WhyCardContent; interface Props { + eyebrow?: string; heading: string; intro: string; cards: WhyCard[]; - cta: PageLink | undefined; } -const { heading, intro, cards, cta } = Astro.props; - -// Same order as the live page: speakers, formats, partners. -const imageFiles = [ - { - filename: "home-why-speakers-800.webp", - width: 800, - height: 800, - }, - { - filename: "home-why-formats-800.webp", - width: 800, - height: 533, - }, - { - filename: "home-why-partners-800.webp", - width: 800, - height: 1200, - }, -] as const; - -const images = await Promise.all( - imageFiles.map(async (image) => ({ - ...image, - asset: await resolveContentImage(image.filename, "why-attend card", { - quiet: true, - }), - })), -); +const { eyebrow, heading, intro, cards } = Astro.props; --- -
- - -

{heading}

-

{intro}

-
-
+
+
+
{ - cards.map((card, index) => { - const image = images[index % images.length]; - return ( -
- {image.asset ? ( - - ) : ( + eyebrow && ( +

+ {eyebrow} +

+ ) + } +

+ {heading} +

+

+ {intro} +

+
+ +
    + { + cards.map((card, i) => ( +
  • +
  • + )) } -
- { - cta && ( -
- -
- ) - } - -
+ +
+
diff --git a/apps/web/src/components/home/WhyCards.vrt.ts b/apps/web/src/components/home/WhyCards.vrt.ts index 47162db..55b0e86 100644 --- a/apps/web/src/components/home/WhyCards.vrt.ts +++ b/apps/web/src/components/home/WhyCards.vrt.ts @@ -1,25 +1,39 @@ -// VRT variants for WhyCards. The three card images are hardcoded inside the -// component (not a prop), so every variant here only varies heading/intro -// and the cards array: a normal set of three, a longer list that cycles the -// image set, long copy that must wrap, and empty. +// VRT variants for WhyCards (the home audience tiles). The photos are +// content (imageFile), so variants cover tiles with and without a photo, +// with and without a link, long copy that must wrap, and fewer than four. +// See docs/dev/visual-testing.md. import WhyCards from "./WhyCards.astro"; import type { WhyCard } from "./WhyCards.astro"; const cards: WhyCard[] = [ { - title: "World-class speakers", + eyebrow: "For sample talents", + title: "Sample students", description: - "Hear from founders, investors and operators who have built and scaled real companies.", + "Sample copy about workshops and direct access to roles, two short lines.", + href: "#students", + linkLabel: "Learn more", }, { - title: "Hands-on formats", - description: - "Workshops and panels you can actually apply, not just another keynote to sit through.", + eyebrow: "For sample founders", + title: "Sample startups", + description: "Sample copy about pitching in front of investors.", + href: "#startups", + linkLabel: "Learn more", }, { - title: "A room full of partners", - description: - "Meet the corporates and investors backing the next generation of student founders.", + eyebrow: "For sample companies", + title: "Sample corporates", + description: "Sample copy about meeting participants and scouting.", + href: "#corporates", + linkLabel: "Learn more", + }, + { + eyebrow: "For sample investors", + title: "Sample investors", + description: "Sample copy about the jury and early-stage startups.", + href: "#investors", + linkLabel: "Learn more", }, ]; @@ -27,62 +41,34 @@ export default { component: WhyCards, variants: { default: { - heading: "Why everyone's at Q-Summit", - intro: "Three reasons students, founders and partners keep coming back.", + eyebrow: "Sample eyebrow", + heading: "Why everyone is at the sample summit", + intro: "Pick a sample role and see what is in store.", cards, - cta: { label: "Learn more", href: "#why-attend" }, - }, - "many-cards": { - heading: "Why everyone's at Q-Summit", - intro: "A longer list cycles through the same three card images.", - cards: [ - ...cards, - { - title: "A stage for every idea", - description: - "From first-time founders to scale-ups, there is a track built for your stage.", - }, - { - title: "Real networking, not small talk", - description: - "Structured matchmaking sessions replace awkward hallway conversations.", - }, - { - title: "Munich's startup scene, in one hall", - description: - "Two days that bring the entire regional ecosystem under one roof.", - }, - ], - cta: undefined, }, "long-copy": { - heading: "Why founders, students and investors choose Q-Summit", + heading: + "A long sample heading that has to wrap onto a second line on every screen", intro: - "Long CMS copy must wrap cleanly inside the fixed three-column grid without breaking the layout.", - cards: [ - { - title: "Speakers who have actually built something", - description: - "Every speaker on stage has founded, scaled or invested in a real company, so the advice comes from lived experience rather than theory.", - }, - { - title: "Formats built for doing, not just listening", - description: - "Workshops are capped in size and run by practitioners, so you leave with a plan you can act on the same week, not just a set of slides.", - }, - { - title: "Partners who are genuinely hiring and investing", - description: - "The partner expo brings corporates and investors who are actively looking for talent and ideas, not just showing a logo on a banner.", - }, - ], - cta: undefined, + "A longer sample introduction that runs to a second line so the centered header shows how it wraps.", + cards: cards.map((card) => ({ + ...card, + title: `${card.title} and sample young professionals`, + description: `${card.description} ${card.description} ${card.description}`, + })), + }, + "plain-no-links": { + heading: "Tiles without links", + intro: "Older content has neither link nor eyebrow.", + cards: cards.slice(0, 3).map(({ title, description }) => ({ + title, + description, + })), }, empty: { - heading: "Why everyone's at Q-Summit", - intro: "No cards have been published yet.", + heading: "No tiles", + intro: "Nothing published yet.", cards: [], - cta: undefined, }, }, }; diff --git a/apps/web/src/components/home/countdown.client.ts b/apps/web/src/components/home/countdown.client.ts new file mode 100644 index 0000000..8acabdc --- /dev/null +++ b/apps/web/src/components/home/countdown.client.ts @@ -0,0 +1,203 @@ +/** + * Runs the home hero countdown (HeroCountdown.astro, DESIGN.md HOME-1). + * + * The time left is always recomputed from the real target instant and the + * current clock, never counted down by a timer, so a sleeping tab, a + * throttled background timer or a changed system clock cannot make it + * drift: the first tick after the page is visible again is correct. + * Ticks are aligned to the wall clock second and stop while the tab is + * hidden or the display is off screen. + * + * On load the display starts up: the figures run through random numbers + * while the display sharpens out of its blur (the hero's entrance), and the + * units settle on the real time from left to right. It runs once, takes + * about a second, shows only random figures (never a wrong time that could + * be read as one for longer than a frame) and is skipped for reduced + * motion. + */ +import { + COUNTDOWN_UNITS, + remainingUntil, + spokenRemaining, + unitText, + type CountdownUnit, +} from "../../lib/countdown"; + +/** Start-up timing: how long the figures run before the last unit settles. */ +const BOOT_SETTLE_MS = 1100; +const BOOT_FRAME_MS = 60; + +function initCountdown(root: HTMLElement): void { + const target = Number(root.dataset.target); + if (!Number.isFinite(target)) return; + + const row = root.querySelector("[data-countdown-row]"); + const spoken = root.querySelector("[data-countdown-spoken]"); + const live = root.querySelector("[data-countdown-live]"); + const template = root.dataset.spoken ?? ""; + const units = new Map(); + for (const unit of COUNTDOWN_UNITS) { + const box = root.querySelector( + `[data-unit="${unit}"] [data-digits]`, + ); + if (!box) return; + units.set(unit, { box, text: "" }); + } + if (!row) return; + + let timer = 0; + let onScreen = true; + let spokenMinute = -1; + let finished = false; + let lastDigits = -1; + let booting = false; + + /** Shows `text` in a unit: each figure takes the outline of its digit. */ + function show(box: HTMLElement, text: string): void { + let figures = [...box.querySelectorAll("[data-digit]")]; + // The day count loses (or, after a clock change, gains) a digit. + while (figures.length > text.length) figures.shift()!.remove(); + while (figures.length < text.length && figures[0]) { + const copy = figures[0].cloneNode(true) as SVGElement; + box.prepend(copy); + figures = [copy, ...figures]; + } + figures.forEach((figure, i) => { + const digit = text[i]!; + if (figure.dataset.value === digit) return; + figure.dataset.value = digit; + figure + .querySelector("rect") + ?.setAttribute("mask", `url(#hcd-figure-${digit})`); + }); + } + + function paint(): void { + const left = remainingUntil(target, Date.now()); + + if (left.done) { + finished = true; + row!.hidden = true; + if (live) live.hidden = false; + if (spoken) spoken.textContent = ""; + root.setAttribute("data-state", "live"); + return; + } + + let digits = 0; + for (const unit of COUNTDOWN_UNITS) { + const state = units.get(unit)!; + const text = unitText(unit, left); + digits += text.length; + if (text === state.text) continue; + show(state.box, text); + state.text = text; + } + // The figure size follows the number of figures in the display. + if (digits !== lastDigits) { + lastDigits = digits; + row!.style.setProperty("--digits", String(digits)); + } + + // Screen readers get one sentence, refreshed once a minute, not a + // stream of changing figures (no live region: read on demand). + const minute = Math.floor((target - Date.now()) / 60_000); + if (spoken && minute !== spokenMinute) { + spokenMinute = minute; + spoken.textContent = spokenRemaining(template, left); + } + root.setAttribute("data-state", "running"); + } + + function schedule(): void { + window.clearTimeout(timer); + if (finished || document.hidden || !onScreen) return; + // Wake just after the next full second of the wall clock. + timer = window.setTimeout(tick, 1000 - (Date.now() % 1000) + 12); + } + + function tick(): void { + // The power-on sequence owns the display until it hands over. + if (booting) return; + paint(); + schedule(); + } + + /** + * The start-up sequence. The display is sized for the real number first, + * so nothing shifts; every frame then shows random figures, until a + * unit's turn to settle, when it shows the real value. At the end the + * normal tick takes over. + */ + function boot(): void { + const first = remainingUntil(target, Date.now()); + const reduced = window.matchMedia( + "(prefers-reduced-motion: reduce)", + ).matches; + if (first.done || reduced) { + tick(); + return; + } + + booting = true; + root.setAttribute("data-state", "booting"); + const lengths = COUNTDOWN_UNITS.map((unit) => unitText(unit, first).length); + lastDigits = lengths.reduce((sum, n) => sum + n, 0); + row!.style.setProperty("--digits", String(lastDigits)); + + const start = performance.now(); + const end = (): void => { + booting = false; + // Whatever a unit shows now is not its state: repaint all of them. + for (const state of units.values()) state.text = ""; + tick(); + }; + const frame = (): void => { + const t = performance.now() - start; + if (t >= BOOT_SETTLE_MS || document.hidden) { + end(); + return; + } + const left = remainingUntil(target, Date.now()); + COUNTDOWN_UNITS.forEach((unit, i) => { + const { box } = units.get(unit)!; + const settleAt = (BOOT_SETTLE_MS * (i + 1)) / COUNTDOWN_UNITS.length; + if (t >= settleAt) { + show(box, unitText(unit, left).padStart(lengths[i]!, "0")); + } else { + let random = ""; + for (let n = 0; n < lengths[i]!; n++) { + random += String(Math.floor(Math.random() * 10)); + } + show(box, random); + } + }); + window.setTimeout(frame, BOOT_FRAME_MS); + }; + frame(); + } + + document.addEventListener("visibilitychange", () => { + if (!document.hidden) tick(); + else window.clearTimeout(timer); + }); + // A restored page (back/forward cache) is stale by however long it slept. + window.addEventListener("pageshow", tick); + + if ("IntersectionObserver" in window) { + new IntersectionObserver((entries) => { + onScreen = entries.some((entry) => entry.isIntersecting); + if (onScreen) tick(); + else window.clearTimeout(timer); + }).observe(root); + } + + boot(); +} + +document + .querySelectorAll("[data-countdown]:not([data-countdown-ready])") + .forEach((root) => { + root.setAttribute("data-countdown-ready", ""); + initCountdown(root); + }); diff --git a/apps/web/src/components/home/home-theme.css b/apps/web/src/components/home/home-theme.css new file mode 100644 index 0000000..1c3a129 --- /dev/null +++ b/apps/web/src/components/home/home-theme.css @@ -0,0 +1,237 @@ +/* + * Shared chrome of the 2027 home page (DESIGN.md HOME-1): page width, + * section rhythm, headers, the glass material and the scroll reveal. + * The home page has its own visual system: it shares the brand (colors, + * type, the Q mark) and proven techniques with the ticket page, not its + * surfaces. Only components under home/ import this file. Deviates from + * LAYOUT-1, LAYOUT-3, COMP-1, TYPE-1 and DEPTH-1 as HOME-1 allows. + */ + +.h-shell { + --h-gutter: clamp(1rem, 5vw, 2.5rem); + + width: min(100% - 2 * var(--h-gutter), var(--container-large)); + margin-inline: auto; +} + +.h-section { + position: relative; + padding-block: clamp(var(--space-xl), 9vw, 6.5rem); +} + +.h-section.is-tight { + padding-block: clamp(var(--space-lg), 5vw, var(--space-xl)); +} + +/* In-page jumps land below the floating header. */ +.h-anchor { + scroll-margin-top: 5.5rem; +} + +/* Section header: eyebrow, title, optional intro; a link may sit at its + right on wide screens (View all partners, See all speakers). */ +.h-head { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between; + gap: var(--space-sm) var(--space-lg); + margin-bottom: clamp(var(--space-md), 4vw, var(--space-xl)); +} + +.h-head.is-center { + flex-direction: column; + align-items: center; + text-align: center; +} + +.h-eyebrow { + margin: 0 0 var(--space-2xs); + color: var(--color-ticket-sky); + font-size: var(--text-size-small); + font-weight: var(--font-weight-extrabold); + letter-spacing: 0.16em; + line-height: 1.2; + text-transform: uppercase; +} + +@media (min-width: 768px) { + .h-eyebrow { + font-size: var(--text-size-regular); + } +} + +.h-title { + margin: 0; + color: var(--color-navy); + font-size: clamp(2rem, 4.6vw, 3.25rem); + font-weight: var(--font-weight-extrabold); + letter-spacing: -0.035em; + line-height: 1.05; + text-wrap: balance; +} + +.h-intro { + max-width: 36rem; + margin: var(--space-xs) 0 0; + color: color-mix(in srgb, var(--color-navy) 76%, transparent); + font-size: var(--text-size-medium); + line-height: 1.55; +} + +.h-head.is-center .h-intro { + margin-inline: auto; +} + +/* Quiet arrow link beside a section header. */ +.h-more { + display: inline-flex; + align-items: center; + gap: 0.4rem; + min-height: 2.75rem; + color: var(--color-navy); + font-size: var(--text-size-small); + font-weight: var(--font-weight-extrabold); + text-decoration: none; +} + +.h-more svg { + width: 1rem; + height: 1rem; + transition: transform var(--duration-hover) var(--ease-snappy); +} + +@media (hover: hover) { + .h-more:hover svg { + transform: translateX(3px); + } +} + +/* + * Glass, in the ticket page's transparent finish: barely any fill and a + * light blur, so the page light and the glass Qs behind stay visible as + * color and shape. The pane reads from one hairline rim, a lit top edge, a + * fine cyan line inside the lower edge and a soft cyan halo; there is no + * second border and no bevel band. Text on it stays navy at full strength. + */ +.h-glass { + position: relative; + border-radius: var(--radius-ticket-card); + background: linear-gradient( + 160deg, + color-mix(in srgb, var(--color-white) 16%, transparent) 0%, + color-mix(in srgb, var(--color-white) 4%, transparent) 50%, + color-mix(in srgb, var(--color-ticket-sky) 8%, transparent) 100% + ); + box-shadow: + inset 0 0 0 1px color-mix(in srgb, var(--color-white) 60%, transparent), + inset 0 1px 1px color-mix(in srgb, var(--color-white) 90%, transparent), + inset 0 -10px 16px -16px var(--color-ticket-cyan), + 0 14px 32px -26px color-mix(in srgb, var(--color-navy) 35%, transparent), + 0 0 22px -12px color-mix(in srgb, var(--color-ticket-cyan) 30%, transparent); + -webkit-backdrop-filter: blur(5px) saturate(110%); + backdrop-filter: blur(5px) saturate(110%); +} + +/* Without backdrop blur, a near-opaque fill keeps text on a calm surface. */ +@supports not ( + (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) +) { + .h-glass { + background: color-mix(in srgb, var(--color-white) 88%, transparent); + } +} + +/* + * Pointer light (home.client.ts): on a fine pointer, a soft highlight + * follows the cursor across a pane marked data-h-light and the pane turns + * a degree or two toward it, like a piece of glass picking up a lamp. + * --h-lx / --h-ly are the pointer in percent; --h-rx / --h-ry the tilt. + */ +.h-glare { + position: absolute; + inset: 0; + z-index: 2; + border-radius: inherit; + background: radial-gradient( + 22rem circle at var(--h-lx, 50%) var(--h-ly, 0%), + color-mix(in srgb, var(--color-white) 55%, transparent), + color-mix(in srgb, var(--color-ticket-cyan) 14%, transparent) 38%, + transparent 62% + ); + opacity: 0; + pointer-events: none; + transition: opacity var(--duration-open) var(--ease-snappy); +} + +[data-h-light].is-lit-by-pointer > .h-glare { + opacity: 1; +} + +/* + * Scroll reveal (page-local, HOME-1): what home.client.ts finds below the + * fold is held back and then sharpens out of a blur while it rises a + * little, once, a few frames apart inside a group (--i). Content is + * visible by default, so a page without the script is complete. A + * keyframe animation with backwards fill, not a transition: it cannot + * clash with a tile's own hover transition and leaves no state behind. + */ +[data-h-reveal="held"] { + opacity: 0; +} + +[data-h-reveal="in"] { + animation: h-blur-in var(--duration-reveal) var(--ease-emphasized) backwards; + animation-delay: calc(var(--duration-glass-stagger) * 3 * var(--i, 0)); +} + +@keyframes h-blur-in { + from { + opacity: 0; + filter: blur(10px); + transform: translateY(1rem); + } +} + +/* + * Into the footer: the page light fades to the footer's white under a + * short veil, so the ground never ends on a hard edge. + */ +.h-page-fade { + --h-fade: clamp(4rem, 8vw, 6rem); + + position: relative; + z-index: 1; + height: var(--h-fade); + margin-top: calc(-1 * var(--h-fade)); + background: linear-gradient( + 180deg, + transparent 0%, + color-mix(in srgb, var(--color-white) 45%, transparent) 55%, + var(--color-background) 100% + ); + pointer-events: none; +} + +body:has(.h-page-fade) .site-footer { + border-top-color: transparent; +} + +@media (prefers-reduced-motion: reduce) { + [data-h-reveal="held"] { + opacity: 1; + } + + [data-h-reveal="in"] { + animation: none; + } + + .h-more svg, + .h-glare { + transition: none; + } + + .h-more:hover svg { + transform: none; + } +} diff --git a/apps/web/src/components/home/home.client.ts b/apps/web/src/components/home/home.client.ts new file mode 100644 index 0000000..c6295e1 --- /dev/null +++ b/apps/web/src/components/home/home.client.ts @@ -0,0 +1,330 @@ +/** + * Home page behavior (DESIGN.md HOME-1). Every part is an enhancement: the + * page is complete without it. + * + * reveal content below the fold sharpens out of a blur, once + * thumbs partner logos are swapped for copies at their drawn size + * video the hero video rests while the hero is off screen + * count-up the key figures count up once, the first time they are seen + * marquee the partner strips stop off screen and with the Pause button + * ambient the page light rests while the hero video covers it + * light on a fine pointer, glass panes pick up the cursor as a light + */ + +const reduceMotion = () => + window.matchMedia("(prefers-reduced-motion: reduce)").matches; + +/** Holds back what is below the fold, then lets it rise in once. */ +function initReveal(): void { + const els = [...document.querySelectorAll("[data-h-reveal]")]; + if (!els.length || reduceMotion() || !("IntersectionObserver" in window)) { + return; + } + const observer = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (!entry.isIntersecting) continue; + const el = entry.target as HTMLElement; + observer.unobserve(el); + el.dataset.hReveal = "in"; + // The animation leaves nothing behind (backwards fill); drop the + // marker once it has played. + el.addEventListener( + "animationend", + () => el.removeAttribute("data-h-reveal"), + { once: true }, + ); + } + }, + { rootMargin: "0px 0px -8% 0px" }, + ); + for (const el of els) { + // Already on screen at load: leave it alone, no flash and no replay. + if (el.getBoundingClientRect().top < window.innerHeight) { + el.removeAttribute("data-h-reveal"); + continue; + } + el.dataset.hReveal = "held"; + observer.observe(el); + } +} + +/** "1500", "30+", "1,500": the leading number counts, the rest stays. */ +const FIGURE = /^(\D*)(\d[\d.,]*)(.*)$/; +const COUNT_MS = 1400; + +function countUp(el: HTMLElement): void { + const match = FIGURE.exec(el.textContent?.trim() ?? ""); + if (!match) return; + const [, before, digits, after] = match; + const end = Number(digits.replace(/[.,]/g, "")); + if (!Number.isFinite(end) || end <= 0) return; + // Keep the content's own grouping ("1,500" or "1500"). + const separator = /[.,]/.exec(digits)?.[0]; + const format = (n: number) => + separator + ? String(n).replace(/\B(?=(\d{3})+(?!\d))/g, separator) + : String(n); + // The figure sharpens out of a blur while it counts (StatsBand.astro). + el.classList.add("is-counting"); + el.addEventListener( + "animationend", + () => el.classList.remove("is-counting"), + { once: true }, + ); + const start = performance.now(); + const frame = (now: number) => { + const t = Math.min(1, (now - start) / COUNT_MS); + // Ease out: fast first, settling on the final figure. + const eased = 1 - Math.pow(1 - t, 3); + el.textContent = before + format(Math.round(end * eased)) + after; + if (t < 1) requestAnimationFrame(frame); + }; + requestAnimationFrame(frame); +} + +function initCountUp(): void { + const els = [...document.querySelectorAll("[data-count-up]")]; + if (!els.length || reduceMotion() || !("IntersectionObserver" in window)) { + return; + } + const observer = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (!entry.isIntersecting) continue; + // Once per page load: scrolling back never restarts it. + observer.unobserve(entry.target); + countUp(entry.target as HTMLElement); + } + }, + { threshold: 0.6 }, + ); + els.forEach((el) => observer.observe(el)); +} + +function initMarquee(): void { + const root = document.querySelector("[data-marquee]"); + if (!root) return; + const toggle = root.querySelector("[data-marquee-toggle]"); + const label = root.querySelector("[data-marquee-label]"); + toggle?.addEventListener("click", () => { + const paused = root.toggleAttribute("data-paused"); + toggle.setAttribute("aria-pressed", String(paused)); + if (label) { + label.textContent = + (paused ? label.dataset.play : label.dataset.pause) ?? ""; + } + }); + if ("IntersectionObserver" in window) { + new IntersectionObserver(([entry]) => { + root.toggleAttribute("data-offscreen", !entry.isIntersecting); + }).observe(root); + } +} + +/** + * The ground's light costs frames only while it can be seen: it is covered + * by the hero video until the hero has scrolled away. + */ +function initAmbient(): void { + if (!("IntersectionObserver" in window)) return; + const ground = document.querySelector("[data-home-ground]"); + const hero = document.querySelector(".hero"); + if (!ground || !hero) return; + new IntersectionObserver( + ([entry]) => { + // Still while the hero fills (nearly) the whole viewport. + ground.toggleAttribute( + "data-still", + entry.intersectionRect.height > window.innerHeight * 0.92, + ); + }, + { threshold: [0, 0.25, 0.5, 0.75, 0.92, 1] }, + ).observe(hero); +} + +/** Largest tilt of a pane toward the pointer, in degrees. */ +const TILT_DEG = 3; + +/** + * Pointer light: a pane marked data-h-light shows a soft highlight where + * the cursor is (--h-lx / --h-ly, read by .h-glare), and one that is also + * marked data-h-tilt turns a few degrees toward it (--h-rx / --h-ry). Only + * for a mouse or pen that can hover; touch and reduced motion get the + * resting pane. One listener for the page, one write per frame. + */ +function initPointerLight(): void { + if ( + reduceMotion() || + !window.matchMedia("(hover: hover) and (pointer: fine)").matches + ) { + return; + } + let pane: HTMLElement | null = null; + let x = 0; + let y = 0; + let queued = false; + + const rest = (el: HTMLElement) => { + el.classList.remove("is-lit-by-pointer"); + el.style.removeProperty("--h-rx"); + el.style.removeProperty("--h-ry"); + }; + + const paint = () => { + queued = false; + if (!pane) return; + const box = pane.getBoundingClientRect(); + const px = (x - box.left) / Math.max(1, box.width); + const py = (y - box.top) / Math.max(1, box.height); + pane.style.setProperty("--h-lx", `${(px * 100).toFixed(1)}%`); + pane.style.setProperty("--h-ly", `${(py * 100).toFixed(1)}%`); + if (pane.hasAttribute("data-h-tilt")) { + pane.style.setProperty( + "--h-ry", + `${((px - 0.5) * 2 * TILT_DEG).toFixed(2)}deg`, + ); + pane.style.setProperty( + "--h-rx", + `${((0.5 - py) * 2 * TILT_DEG).toFixed(2)}deg`, + ); + } + pane.classList.add("is-lit-by-pointer"); + }; + + document.addEventListener( + "pointermove", + (event) => { + if (event.pointerType === "touch") return; + const next = + event.target instanceof Element + ? event.target.closest("[data-h-light]") + : null; + if (next !== pane) { + if (pane) rest(pane); + pane = next; + } + if (!pane) return; + x = event.clientX; + y = event.clientY; + if (!queued) { + queued = true; + requestAnimationFrame(paint); + } + }, + { passive: true }, + ); + document.addEventListener("pointerleave", () => { + if (pane) rest(pane); + pane = null; + }); +} + +/** + * The partner files are made for the partner page: several hundred pixels + * wide, here drawn about a hundred wide. Left as they are, the browser + * decodes and scales one every time it slides into view, a hitch every + * second or two across three strips. Once the page is idle each distinct + * logo is drawn once into a bitmap of its drawn size (times the device + * pixel ratio) and every copy of it in the strips points at that small + * image instead. Same origin only, nothing leaves the page, and a logo + * that cannot be converted simply stays as it is. + */ +function initLogoThumbs(): void { + const imgs = [ + ...document.querySelectorAll(".h-partner-slab img"), + ]; + if (!imgs.length || !("createImageBitmap" in window)) return; + const bySrc = new Map(); + for (const img of imgs) { + const list = bySrc.get(img.src) ?? []; + list.push(img); + bySrc.set(img.src, list); + } + const scale = Math.min(3, Math.ceil(window.devicePixelRatio || 1)); + + async function convert(src: string, copies: HTMLImageElement[]) { + const first = copies[0]; + try { + await first.decode(); + const width = Math.max(1, Math.round(first.width * scale)); + const height = Math.max(1, Math.round(first.height * scale)); + // Nothing to gain from a file that is already small. + if (first.naturalWidth <= width * 1.25) return; + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + ctx.imageSmoothingQuality = "high"; + // Fit inside the box, as object-fit: contain draws it. + const ratio = Math.min( + width / first.naturalWidth, + height / first.naturalHeight, + ); + const w = first.naturalWidth * ratio; + const h = first.naturalHeight * ratio; + ctx.drawImage(first, (width - w) / 2, (height - h) / 2, w, h); + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, "image/png"), + ); + if (!blob) return; + const url = URL.createObjectURL(blob); + for (const img of copies) img.src = url; + } catch { + // A logo that cannot be read (broken file, tainted canvas) stays. + } + } + + const run = async () => { + for (const [src, copies] of bySrc) { + await convert(src, copies); + // One logo per idle slice, so the conversion itself never hitches. + await new Promise((resolve) => setTimeout(resolve, 0)); + } + }; + const start = () => + "requestIdleCallback" in window + ? window.requestIdleCallback(() => void run(), { timeout: 3000 }) + : setTimeout(() => void run(), 1200); + if (document.readyState === "complete") start(); + else window.addEventListener("load", start, { once: true }); +} + +/** The hero video costs decoding only while the hero can be seen. */ +function initHeroVideo(): void { + const hero = document.querySelector(".hero"); + if (!hero || !("IntersectionObserver" in window)) return; + new IntersectionObserver(([entry]) => { + // Looked up each time: the element is removed for reduced motion and + // data saver, and only starts playing once its stream is ready. + const video = hero.querySelector("video"); + if (!video) return; + if (entry.isIntersecting) { + if (video.paused && video.readyState > 1) { + video.play().catch(() => {}); + } + } else if (!video.paused) { + video.pause(); + } + }).observe(hero); +} + +/** A glass Q that cannot load leaves no broken image behind. */ +function initGlassQ(): void { + document.querySelectorAll("img.h-q").forEach((img) => { + if (img.complete && img.naturalWidth === 0) img.remove(); + else img.addEventListener("error", () => img.remove(), { once: true }); + }); +} + +export function initHomePage(): void { + initGlassQ(); + initReveal(); + initCountUp(); + initMarquee(); + initAmbient(); + initPointerLight(); + initLogoThumbs(); + initHeroVideo(); +} diff --git a/apps/web/src/components/home/speaker-carousel.client.ts b/apps/web/src/components/home/speaker-carousel.client.ts deleted file mode 100644 index d5748f7..0000000 --- a/apps/web/src/components/home/speaker-carousel.client.ts +++ /dev/null @@ -1,258 +0,0 @@ -/** Home previous-speakers carousel progressive enhancement (infinite loop + dots). */ -function setUpSpeakerCarousel(root: HTMLElement) { - const list = root.querySelector(".speakers-list"); - const dots = Array.from( - root.querySelectorAll(".speakers-dot"), - ); - const navButtons = Array.from( - root.querySelectorAll(".speakers-nav"), - ); - if (!list) return; - - const realCards = Array.from( - list.querySelectorAll(".speaker-card"), - ); - const n = realCards.length; - if (n < 2) return; - - const reduceMotion = window.matchMedia( - "(prefers-reduced-motion: reduce)", - ).matches; - - // --- Clone the full set once before and once after the real slides. --- - function makeClone(card: HTMLDivElement): HTMLDivElement { - const clone = card.cloneNode(true) as HTMLDivElement; - clone.removeAttribute("id"); - clone.setAttribute("aria-hidden", "true"); - clone.setAttribute("inert", ""); - clone.inert = true; - clone.querySelectorAll("[id]").forEach((el) => el.removeAttribute("id")); - return clone; - } - const before = realCards.map(makeClone); - const after = realCards.map(makeClone); - list.prepend(...before); - list.append(...after); - - // Absolute layout of every slide (real + clones): [0,n)=head clones, - // [n,2n)=real, [2n,3n)=tail clones. Recomputed on resize. Seam jumps use - // `jumpTo(n + realIndex())` (index math), not a pixel delta. - let centres: number[] = []; - let step = 0; - - function measure() { - const all = Array.from( - list!.querySelectorAll(".speaker-card"), - ); - centres = all.map((c) => c.offsetLeft + c.offsetWidth / 2); - step = - all.length > 1 - ? all[1].offsetLeft - all[0].offsetLeft - : all[0].offsetWidth; - } - - function nearestIndex(): number { - const centerPos = list!.scrollLeft + list!.clientWidth / 2; - let best = 0; - let bestDist = Infinity; - for (let i = 0; i < centres.length; i++) { - const d = Math.abs(centres[i] - centerPos); - if (d < bestDist) { - bestDist = d; - best = i; - } - } - return best; - } - - // Instant (non-animated) scroll to a slide, regardless of the CSS smooth - // default; used for the invisible seam jump onto a pixel-identical clone. - function jumpTo(absIndex: number) { - list!.style.scrollBehavior = "auto"; - list!.scrollLeft = centres[absIndex] - list!.clientWidth / 2; - void list!.offsetWidth; // flush before restoring - list!.style.scrollBehavior = ""; - } - - function go(dir: number) { - list!.scrollBy({ - left: dir * step, - behavior: reduceMotion ? "auto" : "smooth", - }); - } - - function realIndex(): number { - return ((nearestIndex() % n) + n) % n; - } - - function updateActive() { - const real = realIndex(); - dots.forEach((dot, i) => { - dot.setAttribute("aria-current", i === real ? "true" : "false"); - }); - } - - // Seam recentre: whenever the row comes to rest on a clone (outside the - // middle real set), teleport instantly onto the identical middle-set slide - // so the resting position is always the middle set and neither physical - // edge can ever be reached (no dead end mid-loop). Absolute so drift can - // never accumulate. Gated so it never runs mid-gesture (a finger on the - // glass or a mouse drag in progress): a teleport then would yank the fling. - let touchActive = false; - let dragging = false; - function recentre() { - if (touchActive || dragging) return; - const idx = nearestIndex(); - if (idx >= n && idx < 2 * n) return; // already in the middle set - jumpTo(n + realIndex()); - updateActive(); - } - - // "Idle" = scroll events have stopped. scrollend is the precise signal but - // does not fire after every momentum settle on every engine, so a debounced - // timer is the reliable primary trigger and scrollend an earlier hint. - let idle: number | undefined; - function armIdle() { - window.clearTimeout(idle); - idle = window.setTimeout(recentre, 120); - } - if ("onscrollend" in window) list.addEventListener("scrollend", recentre); - - // Controls. - navButtons.forEach((button) => { - button.addEventListener("click", () => go(Number(button.dataset.dir) || 0)); - }); - dots.forEach((dot) => { - dot.addEventListener("click", () => { - const i = Number(dot.dataset.index) || 0; - list!.scrollTo({ - left: centres[n + i] - list!.clientWidth / 2, - behavior: reduceMotion ? "auto" : "smooth", - }); - }); - }); - list.addEventListener("keydown", (event) => { - if (event.key === "ArrowRight") { - event.preventDefault(); - go(1); - } else if (event.key === "ArrowLeft") { - event.preventDefault(); - go(-1); - } - }); - - // Dot sync (rAF-throttled) + idle re-arm on every scroll tick. - let ticking = false; - list.addEventListener( - "scroll", - () => { - armIdle(); - if (ticking) return; - ticking = true; - requestAnimationFrame(() => { - updateActive(); - ticking = false; - }); - }, - { passive: true }, - ); - - // Touch gate: touchstart/end bracket a native pan reliably (a scrolling - // touch reports pointercancel rather than pointerup, so pointer events are - // not trustworthy here). Releasing arms an idle check for the settle. - list.addEventListener( - "touchstart", - () => { - touchActive = true; - }, - { passive: true }, - ); - const endTouch = () => { - touchActive = false; - armIdle(); - }; - list.addEventListener("touchend", endTouch, { passive: true }); - list.addEventListener("touchcancel", endTouch, { passive: true }); - - // Desktop drag-to-scroll (fine pointers, primary button only; touch already - // pans natively). Plain mouse events, not pointer events: a scrollable - // element cancels a pointer to start its own pan, so pointermove never - // arrives, whereas mouse events keep flowing. move/up bind to window so a - // drag continues past the edges. A movement threshold keeps a plain click - // intact; past it the closing click is swallowed so a drag never navigates - // a card link. Snap is suspended (.is-dragging) for 1:1 tracking. - if (window.matchMedia("(pointer: fine)").matches) { - let startX = 0; - let startLeft = 0; - let down = false; - list.addEventListener("mousedown", (event) => { - if (event.button !== 0) return; - down = true; - dragging = false; - startX = event.clientX; - startLeft = list!.scrollLeft; - }); - window.addEventListener("mousemove", (event) => { - if (!down) return; - const dx = event.clientX - startX; - if (!dragging) { - if (Math.abs(dx) < 6) return; // below threshold: leave clicks intact - dragging = true; - list!.classList.add("is-dragging"); - } - list!.scrollLeft = startLeft - dx; - event.preventDefault(); - }); - window.addEventListener("mouseup", () => { - if (!down) return; - down = false; - if (!dragging) return; - dragging = false; - list!.classList.remove("is-dragging"); - // Snap back on (class removed), then a smooth scroll settles onto the - // nearest card; the seam recentre follows once idle. - list!.scrollTo({ - left: centres[nearestIndex()] - list!.clientWidth / 2, - behavior: reduceMotion ? "auto" : "smooth", - }); - list!.addEventListener( - "click", - (click) => { - click.preventDefault(); - click.stopPropagation(); - }, - { capture: true, once: true }, - ); - armIdle(); - }); - } - - // Resize: recompute layout, keep the current real slide centred. - let resizeTimer: number | undefined; - window.addEventListener("resize", () => { - window.clearTimeout(resizeTimer); - resizeTimer = window.setTimeout(() => { - const real = realIndex(); - measure(); - jumpTo(n + real); - updateActive(); - }, 150); - }); - - // Init: enable controls, measure, centre the first real slide. - root.setAttribute("data-js", "true"); - measure(); - jumpTo(n); - updateActive(); -} - -export function initSpeakerCarousels(): void { - // The VRT gallery marks ; skip the carousel enhancement there - // so the screenshot captures the deterministic SSR layout. The live carousel - // does an idle recentre onto a viewport-dependent resting slide, which would - // otherwise vary the baseline between runs and breakpoints. - if (document.documentElement.hasAttribute("data-vrt")) return; - document - .querySelectorAll(".speakers-carousel") - .forEach(setUpSpeakerCarousel); -} diff --git a/apps/web/src/components/layout/Nav.astro b/apps/web/src/components/layout/Nav.astro index 02e52a7..2c19635 100644 --- a/apps/web/src/components/layout/Nav.astro +++ b/apps/web/src/components/layout/Nav.astro @@ -1,7 +1,18 @@ --- // Site navigation, shared by every page (DESIGN.md COMP-6). Link targets // keep the live site's URL paths so existing inbound links keep working at -// cutover: 7 items, home reachable via the logo only. +// cutover; the items come from site settings, home is reachable via the +// logo only. +// +// An item with `children` (the audience pages under "Why Q?") is one +// disclosure button (WAI APG disclosure navigation): the item is no page of +// its own, so its label and chevron are a single button that opens the +// submenu, and the item's own href is not used. From 768px up the submenu +// is a small glass dropdown under the item; below, it expands in place +// inside the menu sheet. nav-submenu.client.ts drives both. Without JS the +// button does nothing by itself: the dropdown opens on hover and keyboard +// focus (the button takes the focus), and the phone list shows the +// children expanded under it. // // The header is the floating liquid glass bar first built for the 2027 // ticket page (DESIGN.md TICKETS-1), now the one header of the site. It is @@ -15,6 +26,7 @@ import { logoHeight, logoSrc, logoWidth } from "../../assets/media/brand"; import { getSiteSettings } from "../../lib/content"; import { normalizeInternalHref } from "../../lib/href"; +import IconChevron from "../icons/IconChevron.astro"; import IconClose from "../icons/IconClose.astro"; import IconMenu from "../icons/IconMenu.astro"; @@ -39,6 +51,26 @@ const currentPath = normalizeInternalHref(Astro.url.pathname); const isCurrent = (href: string): boolean => currentPath === href || (href !== "/" && href.startsWith("/") && currentPath.startsWith(href)); + +// One entry per nav item. A plain item is highlighted on its own page +// ("page", also for a section prefix of it). An item with a submenu is a +// button, never the current page: it is highlighted ("true") while the +// current page is one of its children, which then carries "page" itself. +const items = nav.map((link) => { + const children = (link.children ?? []).map((child) => ({ + ...child, + current: isCurrent(child.href), + })); + const within = + isCurrent(link.href) || children.some((child) => child.current); + const onChild = children.length > 0 && currentPath !== link.href; + const current: "page" | "true" | undefined = !within + ? undefined + : onChild + ? "true" + : "page"; + return { ...link, children, current }; +}); ---
diff --git a/apps/web/src/pages/index.astro b/apps/web/src/pages/index.astro index bd47e12..6186d37 100644 --- a/apps/web/src/pages/index.astro +++ b/apps/web/src/pages/index.astro @@ -1,26 +1,29 @@ --- -// Homepage, ported from the Webflow index page. All content loads at build -// time from the content layer (src/lib/content.ts): semantic page copy from -// page-content.json, speakers from speakers.json, FAQs from faqs.json. -// Client JS is minimal: the old counter animation renders as static numbers -// and the FAQ uses details/summary (both JS-free); Hero streams its -// background video via a bundled hls.js import (no CDN), and the speaker -// carousel is native scroll-snap with a small progressive-enhancement script. +// Homepage for the 10th edition (DESIGN.md HOME-1): video hero with the +// anniversary message, a countdown and Buy Now, then key figures, +// partner rows, the four audience tiles, speaker highlights and the +// LinkedIn / Instagram section, on a ground of light with clear glass +// panes and glass Q objects. +// All content loads at build time from the content layer +// (src/lib/content.ts). The page is complete without JavaScript; scripts +// only add the video stream, the countdown and the motion +// (components/home/home.client.ts). import Base from "../layouts/Base.astro"; import Hero from "../components/home/Hero.astro"; import StatsBand from "../components/home/StatsBand.astro"; import PartnerLogos from "../components/home/PartnerLogos.astro"; import SpeakerGrid from "../components/home/SpeakerGrid.astro"; import WhyCards from "../components/home/WhyCards.astro"; -import FaqAccordion from "../components/home/FaqAccordion.astro"; +import SocialSection from "../components/home/SocialSection.astro"; +import HomeGround from "../components/home/HomeGround.astro"; import JsonLd from "../components/seo/JsonLd.astro"; import logoManifest from "../components/partner/logo-manifest.json"; import { - getFaqs, getPageContent, getPartners, getSiteSettings, getSpeakers, + speakersForEdition, } from "../lib/content"; import type { PageStat, Partner } from "../lib/content"; import { @@ -35,11 +38,10 @@ if (kickoff.pageEnabled && kickoff.redirectRoot) { const partnerLogoManifest = logoManifest as Record; -const [pageContent, allSpeakers, allFaqs, allPartners, { siteTitle, footer }] = +const [pageContent, allSpeakers, allPartners, { siteTitle, footer }] = await Promise.all([ getPageContent(), getSpeakers(), - getFaqs(), getPartners(), getSiteSettings(), ]); @@ -67,8 +69,8 @@ function findPartner(name: string): Partner | undefined { function resolvePartnerLogoGroups(stats: PageStat[]) { return stats .map((stat) => ({ - value: stat.value, label: stat.label, + description: stat.description, logos: (stat.logos ?? []).flatMap((name) => { const partner = findPartner(name); if (!partner) { @@ -90,12 +92,56 @@ function resolvePartnerLogoGroups(stats: PageStat[]) { const partnerLogoGroups = resolvePartnerLogoGroups(home.partnerBand.items); -// The old site inlined these speakers in a client-side carousel script; -// its slides are the "panel" (main stage highlight) group (verified against -// raw/index.html), rendered here as a static grid. -const speakers = allSpeakers.filter((s) => s.group === "panel"); +// Past speakers: the names the content lists, in that order, looked up in +// the speakers collection (photo and role come from there, never from this +// page). A name with no published speaker is skipped with a warning. +// Without a list, the "panel" group (the main stage highlights) is shown. +const speakerHighlights = home.previousSpeakers.highlights; +const alumni = speakerHighlights + ? speakerHighlights.flatMap((name) => { + const speaker = + allSpeakers.find((s) => s.name === name && s.group === "panel") ?? + allSpeakers.find((s) => s.name === name); + if (!speaker) { + console.warn( + `[index] speaker highlights: no speaker named "${name}" found; skipped`, + ); + } + return speaker ? [speaker] : []; + }) + : allSpeakers.filter((s) => s.group === "panel"); + +// The next edition's lineup: its published "current" speakers. While it +// has none, the content may name earlier speakers to show in its place +// (stand-ins); they keep their own badge and are never shown as booked. +const lineupConfig = home.previousSpeakers.lineup; +const booked = lineupConfig + ? speakersForEdition(allSpeakers, "current", lineupConfig.year) + : []; +const standIns = + booked.length === 0 + ? (home.previousSpeakers.standIns ?? []).flatMap((name) => { + // The same person may be listed under several groups; take the + // edition entry first (it carries the current role and photo). + const speaker = + allSpeakers.find((s) => s.name === name && s.group === "current") ?? + allSpeakers.find((s) => s.name === name && s.group === "panel") ?? + allSpeakers.find((s) => s.name === name); + if (!speaker) { + console.warn( + `[index] lineup stand-ins: no speaker named "${name}" found; skipped`, + ); + } + return speaker ? [speaker] : []; + }) + : []; +const lineup = booked.length > 0 ? booked : standIns; +const lineupLabel = + booked.length > 0 ? lineupConfig?.label : home.previousSpeakers.standInLabel; -const faqs = allFaqs.filter((f) => f.page === "index"); +// Profile links are the ones Site Settings already holds. +const socialHref = (platform: string) => + footer.socialLinks.find((link) => link.platform === platform)?.href; /* Structured data (homepage only; see SEO spec s4). Every value traces to a * content field: no invented facts. URLs are absolute, built from Astro.site @@ -202,32 +248,60 @@ const eventLd = { - - - - - +
+ + + + + + { + home.social && ( + + ) + } + +
+ + diff --git a/apps/web/src/pages/whyq/[audience].astro b/apps/web/src/pages/whyq/[audience].astro new file mode 100644 index 0000000..ed5237e --- /dev/null +++ b/apps/web/src/pages/whyq/[audience].astro @@ -0,0 +1,118 @@ +--- +// /whyq/students/, /whyq/startups/, /whyq/corporates/, /whyq/investors/: +// one page per audience, the targets of the "Why Q?" submenu and of the +// home page's audience tiles. Together they are "Why Q?": there is no +// overview page (/whyq/ redirects to the tiles on the home page, +// astro.config.mjs). +// +// Provisional on purpose: each page shows its audience's section of the +// page-whyq content (FeatureSection) under a short header, plus the way to +// the tickets. The real design of these pages is a later task, so this +// file stays lean and adds no copy of its own: the audience name and the +// eyebrow come from the site-settings nav (the submenu entry and its +// parent), the intro and the section from page-whyq, the ticket link's +// label from the ticket page. The registry of routes and the audience each +// one shows lives in lib/whyq-audiences.ts. +import Base from "../../layouts/Base.astro"; +import FeatureSection from "../../components/whyq/FeatureSection.astro"; +import Button from "../../components/ui/Button.astro"; +import Container from "../../components/ui/Container.astro"; +import Section from "../../components/ui/Section.astro"; +import { getPageContent, getSiteSettings } from "../../lib/content"; +import { + WHYQ_AUDIENCE_PAGES, + whyqAudienceNames, +} from "../../lib/whyq-audiences"; +import { resolveWhyqImage } from "../../lib/whyq-images"; + +export function getStaticPaths() { + return WHYQ_AUDIENCE_PAGES.map(({ slug, audienceId }) => ({ + params: { audience: slug }, + props: { slug, audienceId }, + })); +} + +interface Props { + slug: string; + audienceId: string; +} + +const { slug, audienceId } = Astro.props; + +const [{ whyq, ticketCategories }, { nav }] = await Promise.all([ + getPageContent(), + getSiteSettings(), +]); + +const { label, parentLabel } = whyqAudienceNames(slug, nav); +// A nav without a "Why Q?" item still gets an eyebrow from content. +const eyebrow = parentLabel ?? whyq.heading; + +// An audience an editor removed or renamed must not fail the build: the +// page then renders without its section. +const audience = whyq.audiences.find((entry) => entry.id === audienceId); +const image = audience + ? await resolveWhyqImage(audience.imageFile, audience.imageAlt) + : undefined; +--- + + +
+ +
+

{eyebrow}

+

{label}

+

{whyq.intro}

+
+
+
+ + { + audience && image && ( + + ) + } + +
+ + + +
+ + + diff --git a/apps/web/src/styles/global.css b/apps/web/src/styles/global.css index 62b7449..bce4c2b 100644 --- a/apps/web/src/styles/global.css +++ b/apps/web/src/styles/global.css @@ -568,74 +568,10 @@ a { } } -/* - Dynamic type (lib/motion/typewriter.ts): words are laid out at full size - from the start and only fade up in turn, so nothing reflows. Inline-block - lets each word rise a touch; the spaces between stay real text so lines - break exactly as the plain text would. -*/ -/* Backwards fill only: the word waits invisible through its delay and - ends on its own style, so a finished word holds no animation (and no - compositor layer). */ -.type-word { - display: inline-block; - animation: type-word-in var(--duration-type-fade) var(--ease-snappy) backwards; -} - -@keyframes type-word-in { - from { - opacity: 0; - transform: translateY(0.2em); - } - - to { - opacity: 1; - transform: none; - } -} - -/* Laid out and invisible, waiting to be written (typeOnView). */ -.type-words.is-held .type-word { - opacity: 0; - animation: none; -} - -/* - Text marked data-type stays hidden only while the script is on its way - (Base.astro sets html.js-type before first paint); should the script - never arrive, it shows after a moment anyway, so it is never lost. -*/ -@media (prefers-reduced-motion: no-preference) { - .js-type [data-type]:not([data-type-ready]) { - opacity: 0; - animation: type-safety var(--duration-hover) linear - calc(var(--duration-reveal) * 3) forwards; - } -} - -@keyframes type-safety { - to { - opacity: 1; - } -} - -@media print { - .type-word, - .type-words.is-held .type-word { - opacity: 1; - animation: none; - } -} - @media (prefers-reduced-motion: reduce) { .is-lit > .glass-light::before { animation: none; } - - .type-word { - opacity: 1; - animation: none; - } } /* There is deliberately NO orange button variant (DESIGN.md COLOR-1): the live site has no diff --git a/apps/web/src/styles/tokens.css b/apps/web/src/styles/tokens.css index 772bd05..fe6bddc 100644 --- a/apps/web/src/styles/tokens.css +++ b/apps/web/src/styles/tokens.css @@ -194,8 +194,6 @@ --duration-glass-fold: 220ms; --duration-glass-light: 520ms; --duration-glass-stagger: 28ms; - --duration-type-word: 150ms; - --duration-type-fade: 120ms; /* Kickoff glass motion (DESIGN.md KICKOFF-1). Longer than the conference 500ms ceiling on purpose: the zip's blob pulse and album card snap are the look of this page. */ diff --git a/apps/web/test/content.test.ts b/apps/web/test/content.test.ts index 9c03c4f..b5f8463 100644 --- a/apps/web/test/content.test.ts +++ b/apps/web/test/content.test.ts @@ -5,7 +5,13 @@ // run in the Workers pool. This file therefore runs in the "node" vitest // project (see ../vitest.config.ts) and is typechecked by // ./tsconfig.node.json, which pulls in @types/node. -import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { + existsSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync, +} from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; @@ -17,7 +23,15 @@ import { currentSpeakerEdition, speakersForEdition, } from "../src/lib/content"; +import type { PageContent, SiteSettings } from "../src/lib/content"; import { assertTicketPage } from "../src/lib/content/pages"; +import { toNavLink } from "../src/lib/content/site-settings"; +import { buildLlmsFullTxt, buildRouteTable } from "../src/lib/llms"; +import { + WHYQ_AUDIENCE_PAGES, + whyqAudienceNames, + whyqAudiencePath, +} from "../src/lib/whyq-audiences"; describe("normalizeHrefsDeep", () => { it("rewrites href-like keys case-insensitively, recursing objects and arrays", () => { @@ -285,3 +299,189 @@ describe("assertTicketPage", () => { expect(() => assertTicketPage(withoutPhases)).not.toThrow(); }); }); + +describe("toNavLink (site-settings nav submenu)", () => { + it("maps children and keeps the parent's own link", () => { + expect( + toNavLink({ + label: "Why Q?", + href: "/whyq", + children: [{ label: "Fixture audience A", href: "/whyq/students" }], + }), + ).toEqual({ + label: "Why Q?", + href: "/whyq", + children: [{ label: "Fixture audience A", href: "/whyq/students" }], + }); + }); + + it("leaves the key off when children are absent, null or empty", () => { + // Absent is what a CMS without the field (or an old snapshot) returns. + for (const children of [undefined, null, []]) { + const link = toNavLink({ label: "Speaker", href: "/speaker", children }); + expect(link).toEqual({ label: "Speaker", href: "/speaker" }); + expect("children" in link).toBe(false); + } + }); +}); + +describe("whyq audience pages", () => { + const readFixture = (file: string): T => + JSON.parse( + readFileSync( + new URL(`./fixtures/ci-content/${file}`, import.meta.url), + "utf-8", + ), + ) as T; + const content = readFixture("page-content.json"); + // Raw fixture hrefs have no trailing slash; the loader adds it the same way. + const settings = normalizeHrefsDeep( + readFixture("site-settings.json"), + ); + + it("names a page after its submenu entry and that entry's parent", () => { + const nav = [ + { label: "Speaker", href: "/speaker/" }, + { + label: "Why Q?", + href: "/whyq/", + // No trailing slash on purpose: matching must not depend on the loader. + children: [{ label: "Fixture audience B", href: "/whyq/startups" }], + }, + ]; + expect(whyqAudienceNames("startups", nav)).toEqual({ + label: "Fixture audience B", + parentLabel: "Why Q?", + }); + }); + + it("falls back to the capitalized slug when the nav has no submenu entry", () => { + expect( + whyqAudienceNames("investors", [{ label: "Why Q?", href: "/whyq/" }]), + ).toEqual({ label: "Investors", parentLabel: "Why Q?" }); + expect(whyqAudienceNames("investors", [])).toEqual({ + label: "Investors", + parentLabel: undefined, + }); + }); + + it("every page in the registry has a submenu entry and an audience in the fixture", () => { + const children = settings.nav.flatMap((item) => item.children ?? []); + const audienceIds = content.whyq.audiences.map((audience) => audience.id); + for (const { slug, audienceId } of WHYQ_AUDIENCE_PAGES) { + expect(children.map((child) => child.href)).toContain( + whyqAudiencePath(slug), + ); + expect(audienceIds).toContain(audienceId); + } + }); + + it("lists the audience pages as main pages of the llms route table, named from the nav", () => { + const { mainPages } = buildRouteTable(content, settings); + const slugs = mainPages.map((entry) => entry.slug); + for (const { slug } of WHYQ_AUDIENCE_PAGES) { + expect(slugs).toContain(whyqAudiencePath(slug)); + } + expect( + mainPages.find((entry) => entry.slug === "/whyq/students/")?.label, + ).toBe("Why Q-Summit: Fixture audience A"); + }); + + it("gives every audience page its own block in the full text", () => { + const full = buildLlmsFullTxt({ + site: "https://q-summit.com", + siteSettings: settings, + pageContent: content, + }); + for (const { slug, audienceId } of WHYQ_AUDIENCE_PAGES) { + expect(full).toContain( + `Source: https://q-summit.com${whyqAudiencePath(slug)}`, + ); + const audience = content.whyq.audiences.find( + (entry) => entry.id === audienceId, + ); + expect(full).toContain(audience!.heading); + } + }); +}); + +describe("/whyq/ has no overview page", () => { + const readText = (path: string) => + readFileSync(new URL(path, import.meta.url), "utf-8"); + const content = JSON.parse( + readText("./fixtures/ci-content/page-content.json"), + ) as PageContent; + const settings = normalizeHrefsDeep( + JSON.parse( + readText("./fixtures/ci-content/site-settings.json"), + ) as SiteSettings, + ); + + it("is in neither llms surface, only its audience pages are", () => { + const { mainPages, optional } = buildRouteTable(content, settings); + const slugs = [...mainPages, ...optional].map((entry) => entry.slug); + expect(slugs.filter((slug) => /^\/whyq\/?$/.test(slug))).toEqual([]); + const full = buildLlmsFullTxt({ + site: "https://q-summit.com", + siteSettings: settings, + pageContent: content, + }); + expect(full).not.toContain("Source: https://q-summit.com/whyq/\n"); + }); + + it("has no page file and a redirect to the audience tiles on the homepage", () => { + expect( + existsSync(new URL("../src/pages/whyq.astro", import.meta.url)), + ).toBe(false); + const config = readText("../astro.config.mjs"); + expect(config).toMatch( + /"\/whyq":\s*\{\s*status:\s*302,\s*destination:\s*"\/#why-attend"/, + ); + // The target of that redirect exists on the homepage. + expect(readText("../src/components/home/WhyCards.astro")).toContain( + 'id="why-attend"', + ); + }); +}); + +describe("/program is offline", () => { + const readText = (path: string) => + readFileSync(new URL(path, import.meta.url), "utf-8"); + const content = JSON.parse( + readText("./fixtures/ci-content/page-content.json"), + ) as PageContent; + const settings = JSON.parse( + readText("./fixtures/ci-content/site-settings.json"), + ) as SiteSettings; + + it("is in neither llms surface", () => { + const { mainPages, optional } = buildRouteTable(content, settings); + const slugs = [...mainPages, ...optional].map((entry) => entry.slug); + expect(slugs.filter((slug) => slug.startsWith("/program"))).toEqual([]); + const full = buildLlmsFullTxt({ + site: "https://q-summit.com", + siteSettings: settings, + pageContent: content, + }); + expect(full).not.toContain("q-summit.com/program"); + }); + + it("is not linked from the fixture navigation or footer", () => { + const links = [ + ...settings.nav, + ...settings.nav.flatMap((item) => item.children ?? []), + ...settings.footer.links, + ]; + expect(links.filter((link) => link.href.startsWith("/program"))).toEqual( + [], + ); + }); + + it("is redirected to the homepage in the site config", () => { + // astro.config.mjs is the one source: the dev server answers from it and + // its integration writes the same rule to dist/_redirects for production. + expect(readText("../astro.config.mjs")).toMatch( + /"\/program":\s*\{\s*status:\s*302,\s*destination:\s*"\/"\s*\}/, + ); + }); +}); diff --git a/apps/web/test/countdown.test.ts b/apps/web/test/countdown.test.ts new file mode 100644 index 0000000..a1a00e1 --- /dev/null +++ b/apps/web/test/countdown.test.ts @@ -0,0 +1,111 @@ +import { describe, expect, it } from "vitest"; + +import { + EVENT_TIME_ZONE, + remainingUntil, + spokenRemaining, + unitText, + zonedDayStart, +} from "../src/lib/countdown"; + +describe("zonedDayStart", () => { + it("starts the first conference day at midnight in Mannheim (summer time)", () => { + // 1 April 2027 is CEST (UTC+2): the day begins at 22:00 UTC the day before. + expect(zonedDayStart("2027-04-01", EVENT_TIME_ZONE)).toBe( + Date.UTC(2027, 2, 31, 22, 0, 0), + ); + }); + + it("uses winter time for a winter date", () => { + // CET (UTC+1). + expect(zonedDayStart("2027-01-15", EVENT_TIME_ZONE)).toBe( + Date.UTC(2027, 0, 14, 23, 0, 0), + ); + }); + + it("handles the days the clocks change", () => { + // Clocks go forward on 28 March 2027 at 02:00; midnight is still CET. + expect(zonedDayStart("2027-03-28", EVENT_TIME_ZONE)).toBe( + Date.UTC(2027, 2, 27, 23, 0, 0), + ); + // The day after is CEST. + expect(zonedDayStart("2027-03-29", EVENT_TIME_ZONE)).toBe( + Date.UTC(2027, 2, 28, 22, 0, 0), + ); + // Clocks go back on 31 October 2027 at 03:00; midnight is still CEST. + expect(zonedDayStart("2027-10-31", EVENT_TIME_ZONE)).toBe( + Date.UTC(2027, 9, 30, 22, 0, 0), + ); + }); + + it("does not depend on the zone the build runs in", () => { + expect(zonedDayStart("2027-04-01", "UTC")).toBe(Date.UTC(2027, 3, 1)); + expect(zonedDayStart("2027-04-01", "America/Los_Angeles")).toBe( + Date.UTC(2027, 3, 1, 7), + ); + }); + + it("rejects something that is not an ISO day", () => { + expect(() => zonedDayStart("April 1", EVENT_TIME_ZONE)).toThrow(/ISO day/); + }); +}); + +describe("remainingUntil", () => { + const target = Date.UTC(2027, 2, 31, 22); + + it("splits the time left into whole units", () => { + const now = target - (142 * 86_400 + 12 * 3600 + 14 * 60 + 9) * 1000; + expect(remainingUntil(target, now)).toEqual({ + days: 142, + hours: 12, + minutes: 14, + seconds: 9, + done: false, + }); + }); + + it("never shows a unit that has not fully passed", () => { + expect(remainingUntil(target, target - 999)).toMatchObject({ + seconds: 0, + done: false, + }); + expect(remainingUntil(target, target - 1000)).toMatchObject({ seconds: 1 }); + }); + + it("stops at zero, at the target and after it", () => { + for (const now of [target, target + 5000, target + 86_400_000]) { + expect(remainingUntil(target, now)).toEqual({ + days: 0, + hours: 0, + minutes: 0, + seconds: 0, + done: true, + }); + } + }); +}); + +describe("spokenRemaining", () => { + it("fills the sentence read out instead of the digits", () => { + expect( + spokenRemaining("{days} days, {hours} hours and {minutes} minutes left", { + days: 3, + hours: 4, + minutes: 5, + seconds: 6, + done: false, + }), + ).toBe("3 days, 4 hours and 5 minutes left"); + }); +}); + +describe("figures of a unit", () => { + it("always shows two digits, and as many as the days need", () => { + const left = { days: 142, hours: 3, minutes: 0, seconds: 59, done: false }; + expect(unitText("days", left)).toBe("142"); + expect(unitText("hours", left)).toBe("03"); + expect(unitText("minutes", left)).toBe("00"); + expect(unitText("seconds", left)).toBe("59"); + expect(unitText("days", { ...left, days: 7 })).toBe("07"); + }); +}); diff --git a/apps/web/test/fixtures/ci-content/page-content.json b/apps/web/test/fixtures/ci-content/page-content.json index e72f698..ef79b86 100644 --- a/apps/web/test/fixtures/ci-content/page-content.json +++ b/apps/web/test/fixtures/ci-content/page-content.json @@ -13,7 +13,9 @@ "cta": { "label": "Learn more", "href": "#why-attend" - } + }, + "badge": "Fixture badge · Fixture dates · Fixture city", + "leadLines": ["Fixture lead line one.", "Fixture lead line two."] }, "event": { "startDate": "2027-04-01", @@ -44,46 +46,42 @@ "partnerBand": { "items": [ { - "value": "50+", - "label": "Startup and Corporate Partners", + "value": "", + "label": "Fixture startups", + "description": "Fixture founders", "logos": [ "Fixture Platinum Partner 1", "Fixture Gold Partner 2", - "Fixture Silver Partner 3", - "Fixture Starter Partner 4", - "Fixture Knowledge Partner 5", - "Fixture Event Partner 6", - "Fixture Mobility Partner 7", - "Fixture University and Network Partner 8", - "Fixture Media Partner 9", - "Fixture Platinum Partner 1", - "Fixture Gold Partner 2", - "Fixture Silver Partner 3", - "Fixture Starter Partner 4", - "Fixture Knowledge Partner 5", - "Fixture Event Partner 6", - "Fixture Mobility Partner 7", - "Fixture University and Network Partner 8" + "Fixture Silver Partner 3" ] }, { - "value": "20+", - "label": "Network Partners", + "value": "", + "label": "Fixture corporates", + "description": "Fixture companies", "logos": [ - "Fixture Media Partner 9", - "Fixture Platinum Partner 1", - "Fixture Gold Partner 2", - "Fixture Silver Partner 3", "Fixture Starter Partner 4", "Fixture Knowledge Partner 5", "Fixture Event Partner 6" ] + }, + { + "value": "", + "label": "Fixture network", + "description": "Fixture community", + "logos": [ + "Fixture Mobility Partner 7", + "Fixture University and Network Partner 8", + "Fixture Media Partner 9" + ] } ], "cta": { "label": "View all our Partners", "href": "/partner" - } + }, + "eyebrow": "Fixture partners", + "heading": "Partners of the fixture edition" }, "previousSpeakers": { "heading": "Previous Speakers", @@ -91,29 +89,58 @@ "cta": { "label": "View more Speakers", "href": "/speaker" - } + }, + "eyebrow": "Fixture stage", + "alumniLabel": "Fixture past speaker", + "lineup": { + "label": "Fixture lineup", + "year": 2099, + "slots": 4, + "showPlaceholders": true, + "placeholderName": "Fixture placeholder", + "placeholderRole": "Placeholder, fixture only" + }, + "standIns": [], + "standInLabel": "Fixture earlier edition" }, "whyAttend": { "heading": "Why Everyone's at Q‑Summit", "intro": "Whether participants, companies, startups or investors, Q-Summit brings together people from a wide variety of regions and professions.", "cards": [ { - "title": "Inspiring Speakers!", - "description": "At Q-Summit, inspiring speakers ignite passion and spark bold ideas. Hear from visionaries who empower you to think bigger and make an impact!" + "eyebrow": "Fixture talents", + "title": "Fixture audience A", + "description": "Sample pitch for fixture audience a used in CI builds.", + "href": "/whyq/students", + "linkLabel": "Fixture more" + }, + { + "eyebrow": "Fixture founders", + "title": "Fixture audience B", + "description": "Sample pitch for fixture audience b used in CI builds.", + "href": "/whyq/startups", + "linkLabel": "Fixture more" }, { - "title": "Insightful Formats!", - "description": "Q-Summit’s engaging formats turn ideas into action. From hands-on workshops to thought-provoking panels, every moment is designed for meaningful growth and real-world impact!" + "eyebrow": "Fixture companies", + "title": "Fixture audience C", + "description": "Sample pitch for fixture audience c used in CI builds.", + "href": "/whyq/corporates", + "linkLabel": "Fixture more" }, { - "title": "Innovative Partners!", - "description": "Q-Summit connects you with innovative partners shaping the future. Discover cutting-edge ideas, build lasting connections, and unlock opportunities with industry leaders!" + "eyebrow": "Fixture investors", + "title": "Fixture audience D", + "description": "Sample pitch for fixture audience d used in CI builds.", + "href": "/whyq/investors", + "linkLabel": "Fixture more" } ], "cta": { "label": "Why Q-Summit?", "href": "/whyq" - } + }, + "eyebrow": "Fixture why" }, "faqSection": { "heading": "FAQs", @@ -122,6 +149,23 @@ "label": "Contact", "href": "/contact" } + }, + "countdown": { + "label": "Fixture countdown", + "daysLabel": "Fixture days", + "hoursLabel": "Fixture hours", + "minutesLabel": "Fixture min", + "secondsLabel": "Fixture sec", + "spokenLabel": "{days} fixture days, {hours} fixture hours and {minutes} fixture minutes left.", + "liveLabel": "The fixture event is on" + }, + "social": { + "eyebrow": "Fixture social", + "heading": "Fixture social heading", + "intro": "Sample copy for the social section used in CI builds.", + "linkedinLabel": "Fixture channel one", + "instagramLabel": "Fixture channel two", + "posts": [] } }, "whyq": { diff --git a/apps/web/test/fixtures/ci-content/site-settings.json b/apps/web/test/fixtures/ci-content/site-settings.json index 7790941..bd0ddd3 100644 --- a/apps/web/test/fixtures/ci-content/site-settings.json +++ b/apps/web/test/fixtures/ci-content/site-settings.json @@ -3,7 +3,25 @@ "nav": [ { "label": "Why Q?", - "href": "/whyq" + "href": "/whyq", + "children": [ + { + "label": "Fixture audience A", + "href": "/whyq/students" + }, + { + "label": "Fixture audience B", + "href": "/whyq/startups" + }, + { + "label": "Fixture audience C", + "href": "/whyq/corporates" + }, + { + "label": "Fixture audience D", + "href": "/whyq/investors" + } + ] }, { "label": "Speaker", @@ -13,10 +31,6 @@ "label": "Partner", "href": "/partner" }, - { - "label": "Program", - "href": "/program" - }, { "label": "Hackathon", "href": "/hackathon" diff --git a/apps/web/test/social-posts.test.ts b/apps/web/test/social-posts.test.ts new file mode 100644 index 0000000..a0dcf60 --- /dev/null +++ b/apps/web/test/social-posts.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from "vitest"; + +import { HOME_POST_FRAMES, latestPosts } from "../src/lib/social-posts"; + +describe("posts on the home page", () => { + it("shows four posts", () => { + expect(HOME_POST_FRAMES).toBe(4); + }); + + it("puts the row added last at the far left", () => { + expect(latestPosts(["first", "second", "third"])).toEqual([ + "third", + "second", + "first", + ]); + }); + + it("moves every post one place right when a new one is added, and drops the oldest", () => { + const before = ["a", "b", "c", "d"]; + expect(latestPosts(before)).toEqual(["d", "c", "b", "a"]); + expect(latestPosts([...before, "e"])).toEqual(["e", "d", "c", "b"]); + expect(latestPosts([...before, "e", "f"])).toEqual(["f", "e", "d", "c"]); + }); + + it("shows fewer posts while the list is short, and none for an empty one", () => { + expect(latestPosts(["only"])).toEqual(["only"]); + expect(latestPosts([])).toEqual([]); + }); + + it("leaves the list itself untouched", () => { + const list = ["a", "b", "c", "d", "e"]; + latestPosts(list); + expect(list).toEqual(["a", "b", "c", "d", "e"]); + }); + + it("takes another number of frames", () => { + expect(latestPosts(["a", "b", "c"], 2)).toEqual(["c", "b"]); + expect(latestPosts(["a", "b", "c"], 0)).toEqual([]); + }); +}); diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-1280.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-1280.png deleted file mode 100644 index d00ca74..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-390.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-390.png deleted file mode 100644 index a42bc5d..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-768.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-768.png deleted file mode 100644 index 77066e3..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--default-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-1280.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-1280.png deleted file mode 100644 index 52e0558..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-390.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-390.png deleted file mode 100644 index 59a6223..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-768.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-768.png deleted file mode 100644 index 2867ade..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--empty-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-1280.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-1280.png deleted file mode 100644 index e3dda56..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-390.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-390.png deleted file mode 100644 index 4c4c074..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-768.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-768.png deleted file mode 100644 index 1b8e0f6..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--long-answers-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-1280.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-1280.png deleted file mode 100644 index 91e1b6f..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-390.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-390.png deleted file mode 100644 index a974b0f..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-768.png b/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-768.png deleted file mode 100644 index 210b952..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-faq-accordion--many-items-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-1280.png b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-1280.png new file mode 100644 index 0000000..47dc696 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-390.png b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-390.png new file mode 100644 index 0000000..a5324a0 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-768.png b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-768.png new file mode 100644 index 0000000..c855ff5 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-hero--badge-and-lead-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--default-1280.png b/apps/web/tests/visual/__screenshots__/home-hero--default-1280.png index 5cefa4a..8393822 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--default-1280.png and b/apps/web/tests/visual/__screenshots__/home-hero--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--default-390.png b/apps/web/tests/visual/__screenshots__/home-hero--default-390.png index 29d2c37..c829734 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--default-390.png and b/apps/web/tests/visual/__screenshots__/home-hero--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--default-768.png b/apps/web/tests/visual/__screenshots__/home-hero--default-768.png index f328c2e..38cf2aa 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--default-768.png and b/apps/web/tests/visual/__screenshots__/home-hero--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--german-1280.png b/apps/web/tests/visual/__screenshots__/home-hero--german-1280.png index e81204a..a1bf47f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--german-1280.png and b/apps/web/tests/visual/__screenshots__/home-hero--german-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--german-390.png b/apps/web/tests/visual/__screenshots__/home-hero--german-390.png index fcc4eb9..51f2947 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--german-390.png and b/apps/web/tests/visual/__screenshots__/home-hero--german-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--german-768.png b/apps/web/tests/visual/__screenshots__/home-hero--german-768.png index f73bf34..945322f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--german-768.png and b/apps/web/tests/visual/__screenshots__/home-hero--german-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-1280.png b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-1280.png index 12ac395..957e0b0 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-1280.png and b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-390.png b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-390.png index bb837e8..65fdaa7 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-390.png and b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-768.png b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-768.png index 378965c..4cae36f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--long-copy-768.png and b/apps/web/tests/visual/__screenshots__/home-hero--long-copy-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-1280.png b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-1280.png index 6e25e08..297137f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-1280.png and b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-390.png b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-390.png index 12e811f..ce958a0 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-390.png and b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-768.png b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-768.png index afc8de2..27ce33f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-768.png and b/apps/web/tests/visual/__screenshots__/home-hero--no-announcement-no-cta-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-1280.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-1280.png index 90d2da4..829165b 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-1280.png and b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-390.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-390.png index 8a9393f..2380086 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-390.png and b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-768.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-768.png index bcad547..0c485ae 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--default-768.png and b/apps/web/tests/visual/__screenshots__/home-partner-logos--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-1280.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-1280.png deleted file mode 100644 index 710e98f..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-390.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-390.png deleted file mode 100644 index bbc8a21..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-768.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-768.png deleted file mode 100644 index 314dd41..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--many-logos-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-1280.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-1280.png new file mode 100644 index 0000000..62742a5 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-390.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-390.png new file mode 100644 index 0000000..89c0d53 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-768.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-768.png new file mode 100644 index 0000000..e132586 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-partner-logos--one-row-no-cta-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-1280.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-1280.png deleted file mode 100644 index baa09da..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-390.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-390.png deleted file mode 100644 index 7fb7f1f..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-768.png b/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-768.png deleted file mode 100644 index 54c4944..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-partner-logos--single-logo-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--default-1280.png b/apps/web/tests/visual/__screenshots__/home-social-section--default-1280.png new file mode 100644 index 0000000..02e7bf6 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--default-390.png b/apps/web/tests/visual/__screenshots__/home-social-section--default-390.png new file mode 100644 index 0000000..d0ff7de Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--default-768.png b/apps/web/tests/visual/__screenshots__/home-social-section--default-768.png new file mode 100644 index 0000000..00352e9 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-1280.png b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-1280.png new file mode 100644 index 0000000..aef3ce9 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-390.png b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-390.png new file mode 100644 index 0000000..3bc7a53 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-768.png b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-768.png new file mode 100644 index 0000000..27625c9 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--long-copy-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-1280.png b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-1280.png new file mode 100644 index 0000000..f0e5361 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-390.png b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-390.png new file mode 100644 index 0000000..d493da3 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-768.png b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-768.png new file mode 100644 index 0000000..2976d5c Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-social-section--one-profile-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-1280.png index 7e407ec..cb30e6f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-1280.png and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-390.png index 48b1da0..bd66031 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-390.png and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-768.png index 95a4124..e8b1077 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-768.png and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-1280.png new file mode 100644 index 0000000..5dca003 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-390.png new file mode 100644 index 0000000..04200dc Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-768.png new file mode 100644 index 0000000..025fb3f Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--empty-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-1280.png new file mode 100644 index 0000000..7d90a38 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-390.png new file mode 100644 index 0000000..297d5ee Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-768.png new file mode 100644 index 0000000..1868b8a Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-live-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-1280.png new file mode 100644 index 0000000..9ee7ad5 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-390.png new file mode 100644 index 0000000..e4d5618 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-768.png new file mode 100644 index 0000000..f7bb2e8 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--lineup-with-placeholders-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-1280.png deleted file mode 100644 index 8314d54..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-390.png deleted file mode 100644 index 1faa2cc..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-768.png deleted file mode 100644 index 7535e34..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-bio-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-1280.png new file mode 100644 index 0000000..3d4408d Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-390.png new file mode 100644 index 0000000..6d0c7ed Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-768.png new file mode 100644 index 0000000..ada9bb3 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-speaker-grid--long-names-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-1280.png deleted file mode 100644 index ce0a629..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-390.png deleted file mode 100644 index 28b4910..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-768.png deleted file mode 100644 index 85f5a5c..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--many-speakers-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-1280.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-1280.png deleted file mode 100644 index 055ce36..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-390.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-390.png deleted file mode 100644 index 39cd964..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-768.png b/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-768.png deleted file mode 100644 index 0956d34..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-speaker-grid--single-speaker-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--default-1280.png b/apps/web/tests/visual/__screenshots__/home-stats-band--default-1280.png index 7ed9f75..6f8c916 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--default-1280.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--default-390.png b/apps/web/tests/visual/__screenshots__/home-stats-band--default-390.png index 2e12818..77fcd1a 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--default-390.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--default-768.png b/apps/web/tests/visual/__screenshots__/home-stats-band--default-768.png index 09539a2..cf89df5 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--default-768.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--few-1280.png b/apps/web/tests/visual/__screenshots__/home-stats-band--few-1280.png index 845f5fa..de7f395 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--few-1280.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--few-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--few-390.png b/apps/web/tests/visual/__screenshots__/home-stats-band--few-390.png index 9dd9fe1..b73b250 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--few-390.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--few-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--few-768.png b/apps/web/tests/visual/__screenshots__/home-stats-band--few-768.png index fd70e4c..6a3254c 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--few-768.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--few-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-1280.png b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-1280.png index 9ce8f4d..39969a3 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-1280.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-390.png b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-390.png index 7c09dbf..e2ac6ca 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-390.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-768.png b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-768.png index 66b0de1..cd72aa1 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-768.png and b/apps/web/tests/visual/__screenshots__/home-stats-band--long-labels-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--default-1280.png b/apps/web/tests/visual/__screenshots__/home-why-cards--default-1280.png index b3a8e23..c55f357 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--default-1280.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--default-390.png b/apps/web/tests/visual/__screenshots__/home-why-cards--default-390.png index 7a9623a..674f7c5 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--default-390.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--default-768.png b/apps/web/tests/visual/__screenshots__/home-why-cards--default-768.png index 3bc21be..d485d9b 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--default-768.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-1280.png b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-1280.png index 9241c73..738dffc 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-1280.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-390.png b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-390.png index 53f5f56..6a56efc 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-390.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-768.png b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-768.png index f2312eb..9b0a355 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--empty-768.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--empty-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-1280.png b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-1280.png index d70fdd2..2a4d2d9 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-1280.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-390.png b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-390.png index cf8734f..a28ea4f 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-390.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-768.png b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-768.png index 7bb7ca8..9d4b3ce 100644 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-768.png and b/apps/web/tests/visual/__screenshots__/home-why-cards--long-copy-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-1280.png b/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-1280.png deleted file mode 100644 index ad8a431..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-1280.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-390.png b/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-390.png deleted file mode 100644 index 5408d0d..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-390.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-768.png b/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-768.png deleted file mode 100644 index d747831..0000000 Binary files a/apps/web/tests/visual/__screenshots__/home-why-cards--many-cards-768.png and /dev/null differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-1280.png b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-1280.png new file mode 100644 index 0000000..a5e6eaa Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-390.png b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-390.png new file mode 100644 index 0000000..e8861d5 Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-768.png b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-768.png new file mode 100644 index 0000000..1a77c5b Binary files /dev/null and b/apps/web/tests/visual/__screenshots__/home-why-cards--plain-no-links-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/layout-nav--default-1280.png b/apps/web/tests/visual/__screenshots__/layout-nav--default-1280.png index 692b260..cbab1ef 100644 Binary files a/apps/web/tests/visual/__screenshots__/layout-nav--default-1280.png and b/apps/web/tests/visual/__screenshots__/layout-nav--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/layout-nav--default-768.png b/apps/web/tests/visual/__screenshots__/layout-nav--default-768.png index f9ab30a..32b1293 100644 Binary files a/apps/web/tests/visual/__screenshots__/layout-nav--default-768.png and b/apps/web/tests/visual/__screenshots__/layout-nav--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-1280.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-1280.png index 20992c8..aa8c05b 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-1280.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-390.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-390.png index f44c3f9..62daad7 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-390.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-768.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-768.png index 04aa640..1a05dd1 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-768.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-cards--default-768.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-compare--default-1280.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-compare--default-1280.png index 2c3f215..4f31414 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-compare--default-1280.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-compare--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-1280.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-1280.png index 59d503e..542c0bb 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-1280.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-1280.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-390.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-390.png index 99dea79..25090f1 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-390.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-390.png differ diff --git a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-768.png b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-768.png index 14ac7a1..761b9a4 100644 Binary files a/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-768.png and b/apps/web/tests/visual/__screenshots__/tickets-ticket-included--default-768.png differ diff --git a/cspell.config.yaml b/cspell.config.yaml index 672d227..23da5f1 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -84,8 +84,10 @@ words: - cloover - CMCD - cmdline + - Consolas - cookieless - cooldown + - corporates - creds - currentcolor - cutover @@ -164,6 +166,7 @@ words: - maximalism - Mbps - mediump + - Menlo - metacharacter - miniflare - misalign diff --git a/docs/architecture/08-concepts.md b/docs/architecture/08-concepts.md index 0f3accb..8528c1e 100644 --- a/docs/architecture/08-concepts.md +++ b/docs/architecture/08-concepts.md @@ -23,12 +23,14 @@ The standing rules of the system, set by [ADR-0002](../decisions/0002-payload-cm - **Editions:** some collections carry a year field. Full create-alongside / archive rollover is still owed ([section 9](09-architecture-decisions.md)). - **Media:** images upload through Payload into R2 (editors create; admins update/delete so one division cannot overwrite another's assets). The site references `/media/` (Worker → R2); binaries are never committed. Large hero/hack video is seeded into R2 outside the image-only Media allowlist. Deletion is additionally guarded by reverse reference: a `beforeDelete` hook resolves every collection and global pointing at the file (`apps/cms/src/lib/media-usage.ts`) and refuses while any live or draft entry still uses it. The same loader backs the "Used on" panel on a media document and the `/media-usage` admin view. It covers published rows plus the latest draft, not older version rows, so a delete can still orphan a restorable version; the UI says so in all three places. - **Structure is code, content is CMS:** page layouts and components live in `apps/web`; every user-visible string comes from the content layer (Payload in production; a local JSON snapshot or the committed fake fixture in JSON mode). No literal marketing copy in `.astro` files. The homepage Event JSON-LD dates now come from a real CMS field too (`event.startDate` / `event.endDate` on the Home page global); `pages/index.astro` only formats them. They were previously regex-parsed out of the hero announcement copy, which meant a routine rephrasing failed the build. -- **Page globals (12):** one drafts-enabled `page-*` global per public marketing page. Slugs: `page-home` (`/`), `page-whyq` (`/whyq/`), `page-speaker` (`/speaker/`), `page-partner` (`/partner/`), `page-program` (`/program/`), `page-hackathon` (`/hackathon/`), `page-our-team` (`/our-team/`), `page-jobs` (`/job-listings/`), `page-tickets` (`/ticket-categories/`), `page-contact` (`/contact/`), `page-past-teams` (`/past-teams/`), and **`page-kickoff` (`/kickoff/`, Join Q / Kickoff)**. PR and Concept share most pages; Partner owns `page-partner` and `page-jobs`. Payload registers 14 globals in total: these 12, plus `site-settings` and `legal`. A CMS-mode site build treats a missing `page-kickoff` (404 before the CMS migration is live) as an empty page rather than failing the whole deploy. +- **Page globals (12):** one drafts-enabled `page-*` global per public marketing page. Slugs: `page-home` (`/`), `page-whyq` (the four audience pages `/whyq/students/`, `/whyq/startups/`, `/whyq/corporates/` and `/whyq/investors/`; there is no overview page, `/whyq/` redirects to the audience tiles on the homepage), `page-speaker` (`/speaker/`), `page-partner` (`/partner/`), `page-program` (`/program/`, offline for now: the route redirects to the homepage, see Crosscutting rules; the global and its content stay), `page-hackathon` (`/hackathon/`), `page-our-team` (`/our-team/`), `page-jobs` (`/job-listings/`), `page-tickets` (`/ticket-categories/`), `page-contact` (`/contact/`), `page-past-teams` (`/past-teams/`), and **`page-kickoff` (`/kickoff/`, Join Q / Kickoff)**. PR and Concept share most pages; Partner owns `page-partner` and `page-jobs`. Payload registers 14 globals in total: these 12, plus `site-settings` and `legal`. `page-whyq` also feeds the four audience pages under `/whyq/` (`students`, `startups`, `corporates`, `investors`; registry in `apps/web/src/lib/whyq-audiences.ts`): each shows one audience section of `/whyq/` and takes its name from the matching submenu entry of the Site Settings navigation, so they have no global of their own. A CMS-mode site build treats a missing `page-kickoff` (404 before the CMS migration is live) as an empty page rather than failing the whole deploy. - **Site Settings Kickoff flags** (PR-owned group `kickoff` on `site-settings`): `pageEnabled` makes `/kickoff/` a public route; `redirectRoot` forwards `/` there when the page is on (ignored while it is off). Both bake in at build time. Off `pageEnabled` means the public path 404s; Live Preview still works. - **Join Q speaker cards** take portrait crop (`crop.x` / `y` / `zoom` / `shiftY`) and the optional location-card badge (`kickoff.ui.registerLabel` + `registerHref`) from `page-kickoff`. An empty label hides the pill. A URL turns the pill into an outbound link; no third-party embed. Code must not key crops or copy to speaker names. - **Join Q quiz Notion links** live on `page-kickoff` `quiz.results.notionHref`. The site attaches them to the hardcoded quiz team names (`Corporate`, `Startup & Venture Capital`, `Speaker`, `Growth & Partnerships`, and the rest of `TEAM_ORDER`). CMS labels such as `Corporate Relations` or `Startup & VC` are aliases of those names, not separate teams. - **Join Q apply CTAs** take `application.applicationUrl` (outbound Typeform or similar; no embed). Both the quiz-result Apply button and the Ready for Q band (rendered after the hero, before the kickoff panel) open that URL in a new tab whenever it is filled. `application.isOpen` only switches the label from Coming Soon to Apply now. An empty URL keeps the buttons on-page. - **Ticket model (`page-tickets`, 2027 onwards):** one model drives the cards, What's included and Compare tickets on `/ticket-categories/`. Each ticket has a `key` from a fixed registry (`student`, `young-professional`, `start-up`, `investor`, `corporate`; a `select` mirrored by `TICKET_KEYS` in `apps/web/src/lib/content/pages.ts`), whole-euro `regularPrice` and `price` (the saving is computed, never typed), up to five card highlights and an optional requirement note. Benefit rows live in groups of kind `benefit` (Included / Not included) or `eligibility` (Required / Not required) and carry one checkbox per ticket category (plain columns: a multi-select nested in arrays cannot be stored in Payload's version tables). One `offer.purchaseHref` is the shop link for every buy button. The 2026 groups (`tiers`, `comparison`, `categories`) stay stored and read-only as the 2026 archive; the site no longer reads them, and a CMS-mode build fails with a named error until the 2027 groups are published. An optional `phases` group (label, ordered items of key, label and whole-percent discount, the `activeKey` of the current phase, and state and discount labels) drives the hero's discount timeline and the screen reader name of the sale price; it is set by hand, never switched by date, and is validated at build (unique keys, discount 1 to 99, `activeKey` among the items). Payload validates the same rules on publish and requires the labels only once a phase exists; with no phases the hero shows its eyebrow. The group holds no dates. +- **Home page model (`page-home`, 2027 additions):** the rebuilt homepage reads optional fields next to the ones published before. Nothing new is required outside the rows of a new array and every new validator passes on an empty value, so the page published before these fields existed stays valid and publishable untouched, and the site hides each part until it is filled. Current in the schema, with one additive migration (new nullable columns and new tables only); production gets the columns when the CMS deploys. `hero.badge` and `hero.leadLines` sit above and below the headline (lead lines replace `announcementLines` once filled). A `countdown` group holds wording only (`label`, four unit labels, `spokenLabel` keeping `{days}`, `{hours}` and `{minutes}`, `liveLabel`); it has no date field and counts down to `event.startDate` at 00:00 Europe/Berlin, so the conference dates now drive the countdown as well as the Event JSON-LD, and it shows once every label is filled. `partnerBand` gains `eyebrow`, `heading` and a `description` per row; a row's `value` may stay empty because the 2027 rows show no count. `previousSpeakers` gains `eyebrow`, `alumniLabel`, `highlights` (names of past speakers in display order, looked up in the speakers collection; without them the `panel` group shows) and a `lineup` group (`label`, `year`, `slots` from 1 to 8, placeholder wording, and `showPlaceholders`, a preview-only switch that stays off for the live site): the lineup cards are the published `current` speakers of that year. `whyAttend` gains `eyebrow`, and each card an `eyebrow`, `href`, `linkLabel`, `image` and `imageAlt`, which turns the cards into the audience tiles. A `social` group (`eyebrow`, `heading`, `intro`, `linkedinLabel`, `instagramLabel`, up to four `posts` of platform, link and uploaded image) shows once it has a heading, and Payload then requires its other texts; the profile links are the `linkedin` and `instagram-qsummit` entries of Site Settings `footer.socialLinks`, and no feed or third-party embed is involved. `faqSection` stays stored but the homepage no longer shows it. Both new uploads are registered in `media-usage.ts`. While the lineup year has no published speaker, `previousSpeakers.standIns` (names of earlier speakers) fill its row with their own badge `standInLabel`; they are looked up in the speakers collection and are replaced as soon as a speaker of the lineup year is published. +- **Navigation sub-items** (`site-settings`, `nav[].children`): an optional list of `{ label, href }` under a nav item, validated like the item's own link. An item without it is a plain link, and the item itself always navigates. The audience pages under Why Q? use it. Current in the schema, in the same migration as the home page fields. - **Semantic fields:** editors see named fields (`home.hero.headline`, ticket tiers, and so on), not scrape-shaped positional headings. Deterministic `order` fields on every ordered list collection keep list order stable across CMS and JSON mode; seeds space them in steps of 10 so editors insert between neighbors without renumbering. - **Legal globals:** imprint / privacy / terms stay raw HTML, admin-only, never rich-text converted. @@ -36,7 +38,7 @@ The standing rules of the system, set by [ADR-0002](../decisions/0002-payload-cm - No cookies, no third-party CDNs, no consent-requiring embeds; every asset is self-hosted. This keeps the site consent-banner-free ([ADR-0003](../decisions/0003-posthog-cookieless-analytics.md)) and it is a review gate, not a preference. - Personal data in the CMS (speakers, team, contact persons) must stay answerable, exportable, and deletable per GDPR; DPAs with sub-processors are tracked offsite. -- Published URLs are permanent: when a page moves, add an explicit redirect in the site config in the same PR; never leave a dead public path. +- Published URLs are permanent: when a page moves or goes offline, add an explicit redirect in the site config (`redirects` in `apps/web/astro.config.mjs`) in the same PR; never leave a dead public path. That one map drives the dev server, the static fallback page, and `dist/_redirects`, which Cloudflare's asset layer turns into a real HTTP redirect in production. `/program/` is redirected to the homepage this way (302, the page returns later), and so is `/whyq/`, whose overview gave way to the four audience pages under it (302 to the audience tiles on the homepage, `/#why-attend`). - The site never fetches from the CMS at runtime; all content is baked in at build time. - **Type-mirror contract:** the `Cms*Doc` interfaces in `apps/web/src/lib/content.ts` are hand-written mirrors of the Payload schema; `apps/cms/src/payload-types.ts` is the generated authority, and `apps/web` deliberately does not import it (the two apps build in isolation). Any PR that renames, removes, or retypes a Payload field must update the matching `Cms*Doc` interface and mapper in `content.ts` in the same PR, or CMS-mode builds silently map the field to `undefined` with no type or test failure. diff --git a/docs/dev/incident.md b/docs/dev/incident.md index aaf37e9..f5790ed 100644 --- a/docs/dev/incident.md +++ b/docs/dev/incident.md @@ -4,7 +4,7 @@ What to do when the live site, the CMS, or published content is down or wrong. S ## Detection -- **External uptime monitor.** A dedicated external service, deliberately not a workflow in this repo. At go-live, point it (owner picks the service; any plain HTTPS checker works, no vendor config enters the repo) at `https://q-summit.com/`, `/whyq/`, `/llms.txt`, and `/media/hero-poster.jpg` (stable ops-controlled key; a 404 there means R2 seeding regressed, see [`go-live.md`](go-live.md)), treat any non-2xx as down, and alert to email or the team channel. On an alert, open or update one tracking issue titled "Uptime: production is failing" (label `area: infra`) and run the response in it. +- **External uptime monitor.** A dedicated external service, deliberately not a workflow in this repo. At go-live, point it (owner picks the service; any plain HTTPS checker works, no vendor config enters the repo) at `https://q-summit.com/`, `/whyq/students/` (not `/whyq/`, which is a redirect and so never a 2xx), `/llms.txt`, and `/media/hero-poster.jpg` (stable ops-controlled key; a 404 there means R2 seeding regressed, see [`go-live.md`](go-live.md)), treat any non-2xx as down, and alert to email or the team channel. On an alert, open or update one tracking issue titled "Uptime: production is failing" (label `area: infra`) and run the response in it. - **Human report.** Someone reports that a page is down or broken. Capture the URL, the time, what they saw, and whether it reproduces from another network, then open or comment on that same tracking issue. ## Triage diff --git a/docs/editors/README.md b/docs/editors/README.md index cebc435..de75176 100644 --- a/docs/editors/README.md +++ b/docs/editors/README.md @@ -78,6 +78,10 @@ There is deliberately no way to place an image inside this text. Images belong i | Chair | Team and Past Teams (with PR) | (none alone) | | Finance / Operations / IT | (no content collections today) | IT admins manage users and Legal | +**Home.** The sections of the Home page follow the page from top to bottom. Under **Hero**, **Badge** is the small pill above the headline (leave it empty to hide it) and **Lead Lines** are the short lines under the headline; once there is at least one lead line, the **Announcement Lines** are no longer shown. **Countdown** holds only the wording of the countdown in the hero. It has no date of its own: it always counts down to the **Start Date** under **Conference dates**, to 00:00 German time at the very start of that day, so changing the conference date moves the countdown too. The countdown appears once every field in the section is filled. Keep `{days}`, `{hours}` and `{minutes}` in **Spoken Label**; the site replaces them with the numbers for screen readers. Under **Partner band**, **Heading** should always name the edition the logos are from. Each row under **Items** is one line of logos: a **Label**, an optional **Description** under it, and the partner names under **Logos** (**Value** is not shown on the new homepage and may stay empty). Under **Why attend**, each row under **Cards** is one audience tile: **Eyebrow**, **Title** and **Description** are its text, **Image** and **Image Alt** its photo, and **Href** is where the tile leads (for example `/whyq/students`), with **Link Label** as the link text. Without **Href** the tile is not a link. Under **Previous speakers**, **Highlights** lists the past speakers to show, one name per row in the order you want, written exactly as under **Lists & people → Speakers**; leave it empty to show the main stage highlights. **Past Speaker Label** is the badge on those speakers, for example "Past Speaker" (do not call them alumni: Q alumni are former team members). **Lineup** is the next edition: enter its **Label** (the badge on the cards, such as `2027`) and its **Year**, and every published speaker of that year in the group **Current edition speakers** appears, up to the number under **Slots**. **Show Placeholders** is for previews only: it fills open slots with marked placeholder cards so the layout can be checked before speakers are announced. Keep it off for the live site; open slots are then simply not shown. **Stand Ins** lists earlier speakers to show in the lineup's place while no speaker of the lineup year is published yet, one name per row, written exactly as under **Lists & people → Speakers**; **Stand In Label** is the badge on their cards and must say where they spoke (for example `Q-Summit 2026`), so nobody reads them as booked for the next edition. They disappear on their own as soon as the first speaker of the lineup year is published. **Social** is the LinkedIn and Instagram section. It appears once its **Heading** is filled, and from then on the other texts in the section are required. The two profile links are not set there: they are the LinkedIn and Instagram (Q-Summit) entries under **Site-wide → Navigation, footer & AI identity → Footer → Social Links**. Under **Posts** you add posts, each with its **Platform**, the full address of the post under **Href**, and an **Image**. Always add a new post as the last row: the page shows the newest four, the last row at the far left and each older one a place further right, and the oldest drops out by itself, so you never have to move or delete a row (rows that no longer show may be removed). Without posts the section shows empty frames. **FAQ teaser** is kept, but it is currently not shown on the homepage. + +**Navigation sub-items.** Under **Site-wide → Navigation, footer & AI identity → Nav**, each item can carry **Sub-items**: links shown in a menu under that item, such as the audience pages under Why Q?. A sub-item has a **Label** and an **Href**, like the item itself. Leave **Sub-items** empty for a plain link. An item with sub-items is no link of its own: clicking it opens the menu, and its own **Href** is not used. Why Q? works this way: it has no overview page, only its four audience pages (Students, Startups, Corporates, Investors), and the old address `/whyq/` leads to the audience tiles on the homepage. The texts and photos of those four pages come from **Pages → Why Q?**, one **Audiences** section each. + **Tickets.** One list feeds the whole ticket page: the cards, **What's included** and **Compare tickets** all read the same tickets and benefits, so you change a price or a benefit once. Under **Tickets**, **Ticket shop link** is the one address every buy button opens. Each ticket has a **Key** (which category it is), its name and description, the **Regular price** and the current **Price** in whole euros (the site works out "Save €…" itself), up to five highlights for the card, and an optional **Requirement** such as "Valid student ID required". Under **What's included**, each group is either **Benefits** (shown as Included / Not included) or **Requirements** (Required / Not required, never counted as a benefit). On each row, tick the tickets it applies to. Keep `{ticket}`, `{included}` and `{total}` in the buy button and count labels; the site fills them in (the count is not shown on the page at the moment). **Discount phases** is the timeline at the top of the page: add the phases in order, each with a **Key** (a short id such as `early-bird`), the shown name and the **Discount** in whole percent, then enter the key of the phase selling now under **On sale now**. Earlier phases show as over and later ones as coming; nothing switches by date, so change **On sale now** when the shop moves on. Keep `{discount}` in the discount label. Leave **Discount phases** empty to show the small label from **Header** instead. The **2026 archive** section at the bottom is read-only and no longer shown on the site. **Join Q / Kickoff.** Heads publish the Join Q / Kickoff Website page. Two toggles under **Site-wide → Navigation, footer & AI identity → Join Q / Kickoff** (PR only) control whether `/kickoff/` is public and whether `/` forwards there. On each speaker row, **Portrait crop** sets how the photo sits in the card. The **Register label** under Small UI labels is the small badge on the location card; leave it empty to hide the badge. **Register URL** turns that badge into an outbound signup link. Leave the URL empty to keep a non-clickable label. Do not paste an embed snippet. On each quiz **Team result**, **Team page URL** is that team's Notion page. Use the quiz team names (Corporate, Startup & Venture Capital, Speaker, Growth & Partnerships) so the result cards actually link. Under **Application flow**, paste the Typeform address into **Application URL**. That same address is what the quiz **Apply** button and the **Ready for Q** button (directly under the hero, above the kickoff panel) open (in a new tab), even while the label still says Coming Soon. Tick **Applications open** to switch those buttons to Apply now. Leave the URL empty to keep them on-page. Do not paste an embed snippet there either. diff --git a/scripts/check/design.mjs b/scripts/check/design.mjs index 3b65e68..448a397 100644 --- a/scripts/check/design.mjs +++ b/scripts/check/design.mjs @@ -369,8 +369,6 @@ const UNMAPPED_TOKENS = new Map([ ["--duration-glass-fold", "see --ease-glass-spring"], ["--duration-glass-light", "see --ease-glass-spring"], ["--duration-glass-stagger", "see --ease-glass-spring"], - ["--duration-type-word", "see --ease-glass-spring"], - ["--duration-type-fade", "see --ease-glass-spring"], [ "--duration-hack-fall", "see --ease-snappy; Q-Hack campaign only (DESIGN.md HACK-1)",