@bygghammar/cms-platform 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +76 -0
- package/README.md +18 -0
- package/docs/NEW-SITE.md +103 -0
- package/package.json +10 -3
- package/scripts/sync-migrations.mjs +49 -0
- package/src/platform/contract.ts +0 -5
- package/src/server/forms-core.ts +820 -0
- package/migrations/20260811112455_217c4028-f587-4c98-9e4f-9e6c452ab761.sql +0 -20
- package/migrations/20260811114438_6687d67d-bad3-4803-9638-8b7670d2e5d4.sql +0 -86
- package/migrations/20260811220548_80d99ec2-bd4b-475d-a627-9408bb60ce56.sql +0 -1
- package/migrations/20260811222519_6b040f56-4de3-49e0-92e4-d9deec5ead6a.sql +0 -3
- package/migrations/20260812000000_seed_voyara_content.sql +0 -390
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
-- Voyara content seed: pages, published versions, SEO and managed forms.
|
|
2
|
-
-- Replaces the inherited demo content. Customer data is never touched.
|
|
3
|
-
begin;
|
|
4
|
-
|
|
5
|
-
-- 1. Retire inherited pages that do not exist on voyara.se.
|
|
6
|
-
delete from public.pages where key in ('destinationer', 'datum', 'utbildningen', 'bartenderkurs', 'ayia-napa', 'om-oss');
|
|
7
|
-
delete from public.page_seo where page_key in ('destinationer', 'datum', 'utbildningen', 'bartenderkurs', 'ayia-napa', 'om-oss');
|
|
8
|
-
|
|
9
|
-
-- 2. Managed forms.
|
|
10
|
-
insert into public.forms (key, name, form_type, fields, public_settings, private_settings, is_active)
|
|
11
|
-
values ('kontakt', 'Kontaktformulär', 'contact', '[{"key": "firstName", "type": "text", "label": {"sv": "Förnamn"}, "enabled": true, "required": true}, {"key": "lastName", "type": "text", "label": {"sv": "Efternamn"}, "enabled": true, "required": true}, {"key": "email", "type": "email", "label": {"sv": "E-post"}, "enabled": true, "required": true}, {"key": "phone", "type": "tel", "label": {"sv": "Telefonnummer"}, "enabled": true, "required": false}, {"key": "bookingNumber", "type": "text", "label": {"sv": "Bokningsnummer (6 siffror)"}, "enabled": true, "required": false, "wide": true, "help": {"sv": "Har du ett bokningsnummer, ange det gärna för snabbare svar."}}, {"key": "message", "type": "textarea", "label": {"sv": "Meddelande"}, "enabled": true, "required": true, "wide": true}]'::jsonb, '{"title": {"sv": "Kontakta oss"}, "intro": {"sv": "Vi återkommer så snart som möjligt, vardagar 09:00–17:00."}, "submitLabel": {"sv": "Skicka"}, "requireConsent": true, "consentText": {"sv": "Jag accepterar [villkoren](privacy) och att Voyara lagrar mina uppgifter för att kunna svara mig."}, "thankyouMode": "inline", "thankyouMessage": {"sv": "Tack för ditt meddelande! Vi hör av oss så snart vi kan."}}'::jsonb, '{}'::jsonb, true)
|
|
12
|
-
on conflict (key) do update set
|
|
13
|
-
name = excluded.name,
|
|
14
|
-
form_type = excluded.form_type,
|
|
15
|
-
fields = excluded.fields,
|
|
16
|
-
public_settings = excluded.public_settings,
|
|
17
|
-
is_active = true;
|
|
18
|
-
insert into public.form_versions (form_id, form_key, version_no, name, form_type, fields, public_settings, private_settings, note)
|
|
19
|
-
select f.id, f.key, 1, f.name, f.form_type, f.fields, f.public_settings, f.private_settings, 'Voyara seed'
|
|
20
|
-
from public.forms f where f.key = 'kontakt'
|
|
21
|
-
on conflict (form_key, version_no) do nothing;
|
|
22
|
-
|
|
23
|
-
insert into public.forms (key, name, form_type, fields, public_settings, private_settings, is_active)
|
|
24
|
-
values ('intresse', 'Intresseanmälan', 'interest', '[{"key": "name", "type": "text", "label": {"sv": "Namn"}, "enabled": true, "required": true}, {"key": "email", "type": "email", "label": {"sv": "E-post"}, "enabled": true, "required": true}, {"key": "phone", "type": "tel", "label": {"sv": "Telefonnummer"}, "enabled": true, "required": true}, {"key": "school", "type": "text", "label": {"sv": "Skola"}, "enabled": true, "required": false}, {"key": "city", "type": "text", "label": {"sv": "Stad"}, "enabled": true, "required": false}, {"key": "people", "type": "number", "label": {"sv": "Antal personer"}, "enabled": true, "required": false}, {"key": "message", "type": "textarea", "label": {"sv": "Övrigt"}, "enabled": true, "required": false, "wide": true}]'::jsonb, '{"title": {"sv": "Intresseanmälan"}, "intro": {"sv": "Säkra din plats och få en exklusiv rabatt inför årets kryssning."}, "submitLabel": {"sv": "Skicka"}, "requireConsent": true, "consentText": {"sv": "Jag godkänner [villkoren](privacy) och att Voyara tar del av informationen jag angivit."}, "thankyouMode": "inline", "thankyouMessage": {"sv": "Tack! Vi hör av oss med årets erbjudande."}}'::jsonb, '{}'::jsonb, true)
|
|
25
|
-
on conflict (key) do update set
|
|
26
|
-
name = excluded.name,
|
|
27
|
-
form_type = excluded.form_type,
|
|
28
|
-
fields = excluded.fields,
|
|
29
|
-
public_settings = excluded.public_settings,
|
|
30
|
-
is_active = true;
|
|
31
|
-
insert into public.form_versions (form_id, form_key, version_no, name, form_type, fields, public_settings, private_settings, note)
|
|
32
|
-
select f.id, f.key, 1, f.name, f.form_type, f.fields, f.public_settings, f.private_settings, 'Voyara seed'
|
|
33
|
-
from public.forms f where f.key = 'intresse'
|
|
34
|
-
on conflict (form_key, version_no) do nothing;
|
|
35
|
-
|
|
36
|
-
insert into public.forms (key, name, form_type, fields, public_settings, private_settings, is_active)
|
|
37
|
-
values ('samarbete', 'Kårer och kommittéer', 'interest', '[{"key": "organisation", "type": "text", "label": {"sv": "Namn på elevkår/studentkommitté"}, "enabled": true, "required": true, "wide": true}, {"key": "city", "type": "text", "label": {"sv": "Ort/skola"}, "enabled": true, "required": true}, {"key": "students", "type": "number", "label": {"sv": "Uppskattat antal elever som vill resa"}, "enabled": true, "required": false}, {"key": "name", "type": "text", "label": {"sv": "Kontaktperson"}, "enabled": true, "required": true}, {"key": "email", "type": "email", "label": {"sv": "E-post"}, "enabled": true, "required": true}, {"key": "phone", "type": "tel", "label": {"sv": "Telefonnummer"}, "enabled": true, "required": true}, {"key": "message", "type": "textarea", "label": {"sv": "Eventuella kommentarer eller frågor"}, "enabled": true, "required": false, "wide": true}]'::jsonb, '{"title": {"sv": "Anmäl ert intresse"}, "intro": {"sv": "En eventproducent kontaktar er och guidar er genom hela processen."}, "submitLabel": {"sv": "Skicka in"}, "requireConsent": true, "consentText": {"sv": "Jag accepterar [villkoren](privacy) och att Voyara lagrar uppgifterna för att kunna återkomma."}, "thankyouMode": "inline", "thankyouMessage": {"sv": "Tack! Vi återkommer till er inom kort."}}'::jsonb, '{}'::jsonb, true)
|
|
38
|
-
on conflict (key) do update set
|
|
39
|
-
name = excluded.name,
|
|
40
|
-
form_type = excluded.form_type,
|
|
41
|
-
fields = excluded.fields,
|
|
42
|
-
public_settings = excluded.public_settings,
|
|
43
|
-
is_active = true;
|
|
44
|
-
insert into public.form_versions (form_id, form_key, version_no, name, form_type, fields, public_settings, private_settings, note)
|
|
45
|
-
select f.id, f.key, 1, f.name, f.form_type, f.fields, f.public_settings, f.private_settings, 'Voyara seed'
|
|
46
|
-
from public.forms f where f.key = 'samarbete'
|
|
47
|
-
on conflict (form_key, version_no) do nothing;
|
|
48
|
-
|
|
49
|
-
insert into public.forms (key, name, form_type, fields, public_settings, private_settings, is_active)
|
|
50
|
-
values ('ambassador', 'Bli ambassadör', 'interest', '[{"key": "name", "type": "text", "label": {"sv": "Namn"}, "enabled": true, "required": true}, {"key": "email", "type": "email", "label": {"sv": "E-post"}, "enabled": true, "required": true}, {"key": "phone", "type": "tel", "label": {"sv": "Telefonnummer"}, "enabled": true, "required": true}, {"key": "school", "type": "text", "label": {"sv": "Skola/ort"}, "enabled": true, "required": true}, {"key": "students", "type": "number", "label": {"sv": "Uppskattat antal elever som vill resa"}, "enabled": true, "required": false}, {"key": "message", "type": "textarea", "label": {"sv": "Berätta kort om dig"}, "enabled": true, "required": false, "wide": true}]'::jsonb, '{"title": {"sv": "Bli ambassadör"}, "intro": {"sv": "Vi hör av oss med upplägg, förmåner och material."}, "submitLabel": {"sv": "Skicka in"}, "requireConsent": true, "consentText": {"sv": "Jag accepterar [villkoren](privacy) och att Voyara lagrar mina uppgifter."}, "thankyouMode": "inline", "thankyouMessage": {"sv": "Tack! Vi hör av oss inom kort."}}'::jsonb, '{}'::jsonb, true)
|
|
51
|
-
on conflict (key) do update set
|
|
52
|
-
name = excluded.name,
|
|
53
|
-
form_type = excluded.form_type,
|
|
54
|
-
fields = excluded.fields,
|
|
55
|
-
public_settings = excluded.public_settings,
|
|
56
|
-
is_active = true;
|
|
57
|
-
insert into public.form_versions (form_id, form_key, version_no, name, form_type, fields, public_settings, private_settings, note)
|
|
58
|
-
select f.id, f.key, 1, f.name, f.form_type, f.fields, f.public_settings, f.private_settings, 'Voyara seed'
|
|
59
|
-
from public.forms f where f.key = 'ambassador'
|
|
60
|
-
on conflict (form_key, version_no) do nothing;
|
|
61
|
-
|
|
62
|
-
-- 3. Pages, one published version each.
|
|
63
|
-
insert into public.pages (key, name, is_system, status)
|
|
64
|
-
values ('home', 'Startsida', true, 'published')
|
|
65
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
66
|
-
with p as (select id from public.pages where key = 'home'),
|
|
67
|
-
v as (
|
|
68
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
69
|
-
select p.id,
|
|
70
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
71
|
-
'[{"id": "heroFull-1", "type": "heroFull", "props": {"eyebrow": {"sv": "Stockholm – Tallinn · Januari 2027"}, "title": {"sv": "Partykryssning Voyara"}, "body": {"sv": "Välkommen till en upplevelse utöver det vanliga. Voyara är kryssningen fylld med DJ:s, spektakulära shower och liveframträdanden varje kväll."}, "mediaType": "video", "height": "full", "overlay": "strong", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "videoSrc": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero.mp4", "posterSrc": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "videoAutoplay": true, "videoLoop": true, "videoMuted": true, "showScrollCue": true, "primaryCta": {"label": {"sv": "Boka nu"}, "href": "/boka"}, "secondaryCta": {"label": {"sv": "Se artisterna"}, "href": "/artister"}}, "visible": true}, {"id": "iconGrid-9", "type": "iconGrid", "props": {"eyebrow": {"sv": "Ombord"}, "title": {"sv": "Vad är Voyara?"}, "lead": {"sv": "Nordens största partykryssning — allt samlat på samma båt."}, "note": {"sv": ""}, "tone": "paper", "columns": 4, "iconStyle": "circle", "iconAlign": "center", "cardStyle": "bordered", "items": [{"id": "g-2", "icon": "partyPopper", "title": {"sv": "Hyttfester"}, "body": {"sv": "Korridorerna är halva festen. Samla vännerna i hytten innan kvällens shower drar igång."}}, {"id": "g-3", "icon": "martini", "title": {"sv": "Artister och DJ:s"}, "body": {"sv": "Liveframträdanden varje kväll och resident DJ:s från Ayia Napa, Magaluf och Rhodos."}}, {"id": "g-4", "icon": "flame", "title": {"sv": "Nattklubbar och barer"}, "body": {"sv": "Flera klubbar och barer ombord med olika musikstilar — öppet till långt in på småtimmarna."}}, {"id": "g-5", "icon": "ticket", "title": {"sv": "Taxfree-shopping"}, "body": {"sv": "En av Östersjöns största taxfree-butiker, öppen både på ditresan och hemresan."}}, {"id": "g-6", "icon": "bed", "title": {"sv": "Boende"}, "body": {"sv": "Egen hytt med säng, dusch och wc. Uppgradera till havsutsikt, DeLuxe eller Suite."}}, {"id": "g-7", "icon": "glassWater", "title": {"sv": "Omtyckta restauranger"}, "body": {"sv": "Förboka buffé med fri bar, frukost och brunch — kupongerna gäller i alla restauranger ombord."}}, {"id": "g-8", "icon": "sparkles", "title": {"sv": "Tävlingar och giveaways"}, "body": {"sv": "Priser, uppgraderingar och överraskningar under hela kryssningen."}}]}, "visible": true}, {"id": "mediaSplit-10", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Stämningen"}, "title": {"sv": "Det ultimata eventet"}, "lead": {"sv": ""}, "body": {"sv": "Voyara är den ultimata festkryssningen för dig som vill uppleva Nordens största partybåt. Här samlas ungdomar och studenter från hela Sverige för att umgås, dansa och festa. Artister och personal från Ayia Napa, Magaluf och Rhodos samlas på samma båt och får havet att gunga."}, "mediaSide": "right", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "white", "rounded": true, "aspect": "landscape", "mediaType": "image", "mediaFit": "cover", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/partykryssning-dansgolv.jpg", "imageAlt": {"sv": "Det ultimata eventet"}, "cta": {"label": {"sv": "Se galleriet"}, "href": "/galleri"}}, "visible": true}, {"id": "mediaSplit-11", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "I land"}, "title": {"sv": "Upplev Tallinn"}, "lead": {"sv": ""}, "body": {"sv": "Båten lägger till i land på morgonen ca kl 10.45, så du har ungefär sju timmar på dig att upptäcka Tallinn. Gå på restaurang, shoppa eller ta en lokal öl på en av stadens många barer — eller häng med på vår dagsfest."}, "mediaSide": "left", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "white", "rounded": true, "aspect": "landscape", "mediaType": "image", "mediaFit": "cover", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/tallinn-by-night.jpg", "imageAlt": {"sv": "Upplev Tallinn"}, "cta": {"label": {"sv": "Utforska Tallinn"}, "href": "/tallinn"}}, "visible": true}, {"id": "courseList-14", "type": "courseList", "props": {"eyebrow": {"sv": "Avgångar"}, "title": {"sv": "Voyara 2027"}, "lead": {"sv": "Priset gäller per person i delad hytt och inkluderar kryssningen samt tillgång till alla shower och klubbar ombord."}, "note": {"sv": "Måltider, VIP-band och avbeställningsskydd väljs till i bokningen."}, "tone": "paper", "columns": 2, "source": "custom", "anchor": "datum", "items": [{"id": "c-12", "year": "2027", "courseNo": {"sv": "Kryssning 1"}, "location": {"sv": "Stockholm – Tallinn"}, "dates": {"sv": "8–10 januari 2027"}, "accommodation": {"sv": "Hytt: Ingår"}, "price": {"sv": "1 095 kr"}, "oldPrice": {"sv": "1 395 kr"}, "bookLabel": {"sv": "Boka"}, "bookUrl": "https://booking.summerinvasion.se"}, {"id": "c-13", "year": "2027", "courseNo": {"sv": "Kryssning 2"}, "location": {"sv": "Stockholm – Tallinn"}, "dates": {"sv": "22–24 januari 2027"}, "accommodation": {"sv": "Hytt: Ingår"}, "price": {"sv": "1 095 kr"}, "oldPrice": {"sv": "1 395 kr"}, "bookLabel": {"sv": "Boka"}, "featured": true, "bookUrl": "https://booking.summerinvasion.se"}]}, "visible": true}, {"id": "imageMarquee-23", "type": "imageMarquee", "props": {"eyebrow": {"sv": "Galleri"}, "title": {"sv": "Från tidigare kryssningar"}, "lead": {"sv": ""}, "textPosition": "none", "columns": 3, "firstDirection": "up", "speed": "normal", "aspect": "portrait", "gap": "md", "rounded": true, "tone": "white", "items": [{"id": "i-15", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2026-januari-23-25.jpg", "alt": {"sv": "Voyara januari 2026, avgång 23–25"}}, {"id": "i-16", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2026-januari-9-11.jpg", "alt": {"sv": "Voyara januari 2026, avgång 9–11"}}, {"id": "i-17", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2025-januari-25-26.jpg", "alt": {"sv": "Voyara januari 2025, avgång 25–26"}}, {"id": "i-18", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2025-januari-10-12.jpg", "alt": {"sv": "Voyara januari 2025, avgång 10–12"}}, {"id": "i-19", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2024.jpg", "alt": {"sv": "Stämning ombord 2024"}}, {"id": "i-20", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2023.jpg", "alt": {"sv": "Stämning ombord 2023"}}, {"id": "i-21", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2022-mars-25-27.jpg", "alt": {"sv": "Kryssningen 25–27 mars 2022"}}, {"id": "i-22", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2022-mars-11-13.jpg", "alt": {"sv": "Kryssningen 11–13 mars 2022"}}]}, "visible": true}, {"id": "faq-30", "type": "faq", "props": {"title": {"sv": "Vanliga frågor"}, "columns": 1, "items": [{"id": "q-24", "q": {"sv": "Vad är det för betalningsvillkor?"}, "a": {"sv": "Betalningen sker i två omgångar. Första betalningen avser anmälningsavgiften (350 SEK) och ska vara oss tillhanda senast 1 dag efter utförd bokning. Anmälningsavgiften är en del av den totala kostnaden. Resterande belopp betalas senast 60 dagar innan avresa via ”Min bokning”."}}, {"id": "q-25", "q": {"sv": "Kan man byta namn på biljetten?"}, "a": {"sv": "Ja. Fram till 2 dagar innan avgång kostar ett namnbyte 200 kr per resenär. Huvudbokaren gör ändringen själv under fliken ”Resenärer” i Min bokning, eller mejlar oss med bokningsnummer, nuvarande och ny resenär samt godkännande av avgiften."}}, {"id": "q-26", "q": {"sv": "Kan man byta huvudbokare?"}, "a": {"sv": "Både nuvarande och ny huvudbokare mejlar oss från sina respektive e-postadresser med bokningsnummer, namn, födelsedata, adress och telefonnummer. Den nya huvudbokaren bekräftar samtidigt att hen accepterar resevillkoren."}}, {"id": "q-27", "q": {"sv": "Hur fungerar avbokning?"}, "a": {"sv": "Vid avbokning tidigare än 60 dagar före avresa återbetalas inbetalt belopp med avdrag för anmälningsavgiften och eventuellt rumstillägg. Mellan 60 och 10 dagar före avresa återbetalas inte 50 % av resans pris. 9–0 dagar före avresa sker ingen återbetalning."}}, {"id": "q-28", "q": {"sv": "Vad innebär avbeställningsskyddet?"}, "a": {"sv": "Avbeställningsskydd (150 SEK) innebär att du kan avbeställa din resa mot giltigt läkarintyg ända fram till 2 timmar innan avresa. Du får då tillbaka hela beloppet förutom anmälningsavgiften och eventuellt rumstillägg."}}, {"id": "q-29", "q": {"sv": "Måste man ha pass med sig?"}, "a": {"sv": "Godkänd resehandling krävs: nationellt ID-kort eller pass. Körkort är INTE en godkänd resehandling. Reglerna kommer från rederiet och kan inte frångås."}}]}, "visible": true}, {"id": "form-31", "type": "form", "props": {"formKey": "intresse", "title": {"sv": "Intresseanmälan"}, "lead": {"sv": "Hytterna fylls snabbt och de bästa priserna släpps först. Skicka en intresseanmälan så hör vi av oss med en exklusiv rabatt."}, "tone": "paper", "anchor": "kontakt-form"}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
72
|
-
from p
|
|
73
|
-
returning id, page_id
|
|
74
|
-
),
|
|
75
|
-
d as (update public.page_publications pp set is_active = false
|
|
76
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
77
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
78
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
79
|
-
update public.pages p
|
|
80
|
-
set current_version_id = (
|
|
81
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
82
|
-
)
|
|
83
|
-
where p.key = 'home';
|
|
84
|
-
|
|
85
|
-
insert into public.pages (key, name, is_system, status)
|
|
86
|
-
values ('artister', 'Artister', false, 'published')
|
|
87
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
88
|
-
with p as (select id from public.pages where key = 'artister'),
|
|
89
|
-
v as (
|
|
90
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
91
|
-
select p.id,
|
|
92
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
93
|
-
'[{"id": "heroFull-32", "type": "heroFull", "props": {"eyebrow": {"sv": "Voyara"}, "title": {"sv": "Artister & DJ:s"}, "body": {"sv": "Liveframträdanden varje kväll — och du är med och röstar fram namnen."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artister-hero.jpg", "imageAlt": {"sv": "Voyara"}}, "visible": true}, {"id": "prose-35", "type": "prose", "props": {"eyebrow": {"sv": "Line-up"}, "title": {"sv": "Artister och DJ:s som uppträtt på Voyara"}, "lead": {"sv": "Genom åren har Voyara alltid bjudit på fantastiska uppträdanden från både artister och DJ:s. Konceptet är unikt: NI är med och röstar fram vilka som ska stå på scenen. Håll utkik i våra sociala medier — snart släpps de första artisterna för nästa kryssning."}, "layout": "two-col", "tone": "white", "items": [{"id": "p-33", "heading": {"sv": "Artister 2026"}, "body": {"sv": "ADAAM · GREEKAZO · TRES AMIGOS"}}, {"id": "p-34", "heading": {"sv": "Artister 2025"}, "body": {"sv": "DIZZY · GREEKAZO · PAPI SANTANA"}}]}, "visible": true}, {"id": "imageMarquee-55", "type": "imageMarquee", "props": {"eyebrow": {"sv": "Genom åren"}, "title": {"sv": "Tidigare artister"}, "lead": {"sv": ""}, "textPosition": "none", "columns": 3, "firstDirection": "up", "speed": "normal", "aspect": "portrait", "gap": "md", "rounded": true, "tone": "white", "items": [{"id": "i-36", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-adaam.jpg", "alt": {"sv": "Adaam på scen"}}, {"id": "i-37", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-greekazo.jpg", "alt": {"sv": "Greekazo på scen"}}, {"id": "i-38", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-tres-amigos.jpg", "alt": {"sv": "Tres Amigos på scen"}}, {"id": "i-39", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-dizzy.jpg", "alt": {"sv": "Dizzy på scen"}}, {"id": "i-40", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-papi-santana.jpg", "alt": {"sv": "Papi Santana på scen"}}, {"id": "i-41", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-dani-m.jpg", "alt": {"sv": "Dani M på scen"}}, {"id": "i-42", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-lov1.jpg", "alt": {"sv": "LOV1 på scen"}}, {"id": "i-43", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-mehmet.jpg", "alt": {"sv": "Mehmet på scen"}}, {"id": "i-44", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-luc1ano.jpg", "alt": {"sv": "Luc1ano på scen"}}, {"id": "i-45", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-vc-barre.jpg", "alt": {"sv": "VC Barre på scen"}}, {"id": "i-46", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-ricky-rich.jpg", "alt": {"sv": "Ricky Rich på scen"}}, {"id": "i-47", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-black-moose.jpg", "alt": {"sv": "DJ Black Moose bakom skivorna"}}, {"id": "i-48", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-alfons.jpg", "alt": {"sv": "Alfons på scen"}}, {"id": "i-49", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-alibrorsh.jpg", "alt": {"sv": "Alibrorsh på scen"}}, {"id": "i-50", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-elov-beny.jpg", "alt": {"sv": "Elov & Benny på scen"}}, {"id": "i-51", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-dogge-gozzi.jpg", "alt": {"sv": "Dogge & Gozzi på scen"}}, {"id": "i-52", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-alex-drosso.jpg", "alt": {"sv": "Alex D''Rosso bakom skivorna"}}, {"id": "i-53", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-ken-ring.jpg", "alt": {"sv": "Ken Ring på scen"}}, {"id": "i-54", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artist-lbsb.jpg", "alt": {"sv": "LBSB på scen"}}]}, "visible": true}, {"id": "prose-64", "type": "prose", "props": {"eyebrow": {"sv": "Tidigare artister"}, "title": {"sv": "Några av namnen som stått på vår scen"}, "layout": "two-col", "tone": "paper", "items": [{"id": "p-56", "heading": {"sv": "Dani M"}, "body": {"sv": "Rapparen och artisten Dani M gör som vanligt succé inom svensk hiphop. Låtar som Mina områden, F.A.M.E och Naiv lämnar ingen på båten oberörd."}}, {"id": "p-57", "heading": {"sv": "Greekazo"}, "body": {"sv": "Ett av de största namnen på den svenska hiphopscenen, med musik på topplistor i hela Norden och hits som Hot Spot, Helgen och Försent."}}, {"id": "p-58", "heading": {"sv": "LOV1 & Mehmet"}, "body": {"sv": "Tillsammans har duon över 67 miljoner streams. Hits som Sexcigg och Göre Före Money har legat månader på Sverige topp 50."}}, {"id": "p-59", "heading": {"sv": "Luc1ano"}, "body": {"sv": "Med albumet L1 och singeln Mandy tog Luc1ano över sociala medier och byggde på kort tid en stark publik."}}, {"id": "p-60", "heading": {"sv": "Adaam & VC Barre"}, "body": {"sv": "Grind Gang-duon bakom TOPP med nästan 12 miljoner streams. Adaams DANSA tillsammans med Einar har närmare 10 miljoner streams."}}, {"id": "p-61", "heading": {"sv": "Ricky Rich & Aram Mafia"}, "body": {"sv": "Ricky Rich slog igenom med dubbelplatinalåten Habibi och har tillsammans med producentduon Aram Mafia gjort kaos på vår scen flera gånger."}}, {"id": "p-62", "heading": {"sv": "DJ Black Moose"}, "body": {"sv": "Trefaldig vinnare av Kingsize Magazines ”DJ of the year” och har öppnat för The Game, Ice Cube och 50 Cent. Har spelat på samtliga av våra kryssningar."}}, {"id": "p-63", "heading": {"sv": "Alfons"}, "body": {"sv": "Ganjaman har nästan 150 miljoner streams och är en av Sveriges mest spelade låtar någonsin. Sammanlagt över 195 miljoner spelningar."}}]}, "visible": true}, {"id": "ctaBanner-65", "type": "ctaBanner", "props": {"title": {"sv": "Vill du se dem live?"}, "body": {"sv": "Boka din plats på nästa Voyara innan hytterna tar slut."}, "tone": "ink", "cta": {"label": {"sv": "Boka nu"}, "href": "/boka"}, "secondaryCta": {"label": {"sv": "Skicka intresseanmälan"}, "href": "/intresse"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
94
|
-
from p
|
|
95
|
-
returning id, page_id
|
|
96
|
-
),
|
|
97
|
-
d as (update public.page_publications pp set is_active = false
|
|
98
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
99
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
100
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
101
|
-
update public.pages p
|
|
102
|
-
set current_version_id = (
|
|
103
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
104
|
-
)
|
|
105
|
-
where p.key = 'artister';
|
|
106
|
-
|
|
107
|
-
insert into public.pages (key, name, is_system, status)
|
|
108
|
-
values ('hytter', 'Hytter', false, 'published')
|
|
109
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
110
|
-
with p as (select id from public.pages where key = 'hytter'),
|
|
111
|
-
v as (
|
|
112
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
113
|
-
select p.id,
|
|
114
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
115
|
-
'[{"id": "heroFull-66", "type": "heroFull", "props": {"eyebrow": {"sv": "Boende ombord"}, "title": {"sv": "Hytter"}, "body": {"sv": "Alla hytter har sängar, dusch och wc. Välj den standard som passar er grupp."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/kryssning-fartyg.jpg", "imageAlt": {"sv": "Boende ombord"}}, "visible": true}, {"id": "prose-67", "type": "prose", "props": {"eyebrow": {"sv": "Bra att veta"}, "title": {"sv": "Din hytt ingår alltid"}, "lead": {"sv": "Lakan, handdukar och tvål finns i hytten för det antal som ska bo i den. Det finns ingen micro eller kokmöjlighet ombord, och det råder strikt rökförbud i samtliga hytter."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "mediaSplit-75", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "E-hytt"}, "lead": {"sv": ""}, "body": {"sv": "E-hytt (9 m²) för 2 eller 4 personer på däck 5 och 8. Störningar kan förekomma på grund av hyttens läge. E-hytterna ligger i olika delar av fartyget."}, "mediaSide": "left", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "white", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-68", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-e-1.jpg", "alt": {"sv": "E-hytt ombord"}}, {"id": "s-69", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-e-2.jpg", "alt": {"sv": "E-hytt ombord, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-70", "text": {"sv": "Insideshytt"}}, {"id": "b-71", "text": {"sv": "Separata sängar"}}, {"id": "b-72", "text": {"sv": "Dusch och wc"}}, {"id": "b-73", "text": {"sv": "LCD-TV"}}, {"id": "b-74", "text": {"sv": "2 eller 4 bäddar beroende på antal resenärer"}}]}, "visible": true}, {"id": "mediaSplit-83", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "B-hytt"}, "lead": {"sv": ""}, "body": {"sv": "B-hytt (9 m²) för 2–4 personer på däck 5, 8 och 9. Allergivänliga B-hytter finns att tillgå."}, "mediaSide": "right", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "paper", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-76", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-b-1.jpg", "alt": {"sv": "B-hytt ombord"}}, {"id": "s-77", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-b-2.jpg", "alt": {"sv": "B-hytt ombord, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-78", "text": {"sv": "Insideshytt"}}, {"id": "b-79", "text": {"sv": "Separata sängar"}}, {"id": "b-80", "text": {"sv": "Dusch och wc"}}, {"id": "b-81", "text": {"sv": "LCD-TV"}}, {"id": "b-82", "text": {"sv": "2, 3 eller 4 bäddar"}}]}, "visible": true}, {"id": "mediaSplit-91", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "A-hytt"}, "lead": {"sv": ""}, "body": {"sv": "A-hytt (9–10 m²) med havsutsikt för 2–4 personer på däck 5, 8 och 9. Allergivänliga och handikappanpassade A-hytter finns."}, "mediaSide": "left", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "white", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-84", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-a-1.jpg", "alt": {"sv": "A-hytt med havsutsikt"}}, {"id": "s-85", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-a-2.jpg", "alt": {"sv": "A-hytt, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-86", "text": {"sv": "Havsutsikt"}}, {"id": "b-87", "text": {"sv": "Separata sängar"}}, {"id": "b-88", "text": {"sv": "Dusch och wc"}}, {"id": "b-89", "text": {"sv": "LCD-TV"}}, {"id": "b-90", "text": {"sv": "2, 3 eller 4 bäddar"}}]}, "visible": true}, {"id": "mediaSplit-98", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "A Premium"}, "lead": {"sv": ""}, "body": {"sv": "A Premium-hytt (9 m²) med havsutsikt för 2 personer på däck 8 och 9."}, "mediaSide": "right", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "paper", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-92", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-a-premium-1.jpg", "alt": {"sv": "A Premium-hytt"}}, {"id": "s-93", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-a-premium-2.jpg", "alt": {"sv": "A Premium-hytt, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-94", "text": {"sv": "Havsutsikt"}}, {"id": "b-95", "text": {"sv": "Dubbelsäng"}}, {"id": "b-96", "text": {"sv": "Dusch och wc"}}, {"id": "b-97", "text": {"sv": "LCD-TV"}}]}, "visible": true}, {"id": "mediaSplit-107", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "DeLuxe"}, "lead": {"sv": ""}, "body": {"sv": "DeLuxe-hytt (11–14 m²) med havsutsikt för 2 personer på däck 8 och 9. Specialfrukost inklusive ett glas mousserande vin ingår och serveras i en av à la carte-restaurangerna."}, "mediaSide": "left", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "white", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-99", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-deluxe-1.jpg", "alt": {"sv": "DeLuxe-hytt"}}, {"id": "s-100", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-deluxe-2.jpg", "alt": {"sv": "DeLuxe-hytt, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-101", "text": {"sv": "Havsutsikt"}}, {"id": "b-102", "text": {"sv": "Dubbelsäng"}}, {"id": "b-103", "text": {"sv": "Dusch och wc"}}, {"id": "b-104", "text": {"sv": "LCD-TV"}}, {"id": "b-105", "text": {"sv": "Hårtork, telefon och minibar"}}, {"id": "b-106", "text": {"sv": "Specialfrukost ingår"}}]}, "visible": true}, {"id": "mediaSplit-117", "type": "mediaSplit", "props": {"style": "editorial", "eyebrow": {"sv": "Hyttyp"}, "title": {"sv": "Suite"}, "lead": {"sv": ""}, "body": {"sv": "Suite (24–31 m²) med separat sovrum och vardagsrum med havsutsikt, för 2 personer i fören på däck 8 och 9. Specialfrukost inklusive ett glas mousserande vin ingår."}, "mediaSide": "right", "mediaRatio": "50", "align": "center", "padding": "normal", "tone": "paper", "rounded": true, "aspect": "landscape", "mediaType": "slideshow", "mediaFit": "cover", "slides": [{"id": "s-108", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-suite-1.jpg", "alt": {"sv": "Suite ombord"}}, {"id": "s-109", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-suite-2.jpg", "alt": {"sv": "Suite, vardagsrum"}}, {"id": "s-110", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/hytt-suite-3.jpg", "alt": {"sv": "Suite, detalj"}}], "autoplay": true, "intervalMs": 5000, "showDots": true, "showArrows": true, "loop": true, "bullets": [{"id": "b-111", "text": {"sv": "Havsutsikt"}}, {"id": "b-112", "text": {"sv": "Separat sovrum och vardagsrum"}}, {"id": "b-113", "text": {"sv": "Dubbelsäng och soffgrupp"}}, {"id": "b-114", "text": {"sv": "Dusch och wc"}}, {"id": "b-115", "text": {"sv": "Hårtork, telefon och minibar"}}, {"id": "b-116", "text": {"sv": "Specialfrukost ingår"}}]}, "visible": true}, {"id": "ctaBanner-118", "type": "ctaBanner", "props": {"title": {"sv": "Redo att boka din hytt?"}, "body": {"sv": "Antalet hytter av varje typ är begränsat och de bästa går först."}, "tone": "ink", "cta": {"label": {"sv": "Boka nu"}, "href": "/boka"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
116
|
-
from p
|
|
117
|
-
returning id, page_id
|
|
118
|
-
),
|
|
119
|
-
d as (update public.page_publications pp set is_active = false
|
|
120
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
121
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
122
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
123
|
-
update public.pages p
|
|
124
|
-
set current_version_id = (
|
|
125
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
126
|
-
)
|
|
127
|
-
where p.key = 'hytter';
|
|
128
|
-
|
|
129
|
-
insert into public.pages (key, name, is_system, status)
|
|
130
|
-
values ('mat-och-dryck', 'Mat och dryck', false, 'published')
|
|
131
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
132
|
-
with p as (select id from public.pages where key = 'mat-och-dryck'),
|
|
133
|
-
v as (
|
|
134
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
135
|
-
select p.id,
|
|
136
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
137
|
-
'[{"id": "heroFull-119", "type": "heroFull", "props": {"eyebrow": {"sv": "Ombord"}, "title": {"sv": "Mat och dryck"}, "body": {"sv": "Förboka dina måltider innan avresa — du sparar pengar och maximerar upplevelsen."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/ombord-2.jpg", "imageAlt": {"sv": "Ombord"}}, "visible": true}, {"id": "prose-120", "type": "prose", "props": {"eyebrow": {"sv": "Förboka"}, "title": {"sv": "Spara pengar genom att lägga till måltider i förväg"}, "lead": {"sv": "Att förboka innebär inte bara att du säkrar din plats vid våra spektakulära måltider — jämfört med att köpa ombord sparar du betydligt mer pengar genom att lägga till måltiderna och den fria baren innan avresa."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "iconGrid-125", "type": "iconGrid", "props": {"eyebrow": {"sv": "Meny"}, "title": {"sv": "Måltider att välja till"}, "lead": {"sv": ""}, "note": {"sv": "Priserna gäller vid förbokning. Sista insläpp anges i bokningsbekräftelsen."}, "tone": "paper", "columns": 4, "iconStyle": "circle", "iconAlign": "center", "cardStyle": "bordered", "items": [{"id": "g-121", "icon": "glassWater", "title": {"sv": "Amerikansk buffé med fri bar"}, "meta": {"sv": "395 kr"}, "body": {"sv": "Fredagens smakresa genom USA:s kulinariska landskap — klassiker från östkust till västkust. Fri öl, vin, läsk och vatten ingår."}}, {"id": "g-122", "icon": "glassWater", "title": {"sv": "Italiensk buffé med fri bar"}, "meta": {"sv": "395 kr"}, "body": {"sv": "Lördagens italienska buffé med färsk pasta, pizza och ljuvliga efterrätter. Fri öl, vin, läsk och vatten ingår."}}, {"id": "g-123", "icon": "sun", "title": {"sv": "Frukostbuffé"}, "meta": {"sv": "195 kr/dag"}, "body": {"sv": "Färsk frukt, nybakat bröd, äggröra, knaperstekt bacon och mycket mer. Serveras lördag och söndag morgon."}}, {"id": "g-124", "icon": "heart", "title": {"sv": "Brunchbuffé"}, "meta": {"sv": "295 kr/dag"}, "body": {"sv": "Den ultimata mixen mellan frukostens fräschör och lunchens generositet — perfekt efter en välbehövlig sovmorgon."}}]}, "visible": true}, {"id": "prose-132", "type": "prose", "props": {"eyebrow": {"sv": "Serveringstider"}, "title": {"sv": "Öppettider i restaurangen"}, "layout": "two-col", "tone": "paper", "items": [{"id": "p-126", "heading": {"sv": "Frukostbuffé"}, "body": {"sv": "Lördag 07:30–10:45 (sista insläpp 10:00). Söndag 07:30–10:15 (sista insläpp 09:30)."}}, {"id": "p-127", "heading": {"sv": "Brunch"}, "body": {"sv": "Lördag 09:30–12:00 (sista insläpp 11:15). Söndag 08:00–10:15 (sista insläpp 09:30)."}}, {"id": "p-128", "heading": {"sv": "Amerikansk buffé fredag"}, "body": {"sv": "Första sittningen 17:45–19:45 (sista insläpp 18:45). Andra sittningen 20:15–22:15 (sista insläpp 21:15)."}}, {"id": "p-129", "heading": {"sv": "Måste jag äta i bufférestaurangen?"}, "body": {"sv": "Nej. Det laddade värdet på kupongerna gäller i samtliga restauranger och caféer ombord — från snabbmat och baguetter till en gourmetmiddag i någon av à la carte-restaurangerna."}}, {"id": "p-130", "heading": {"sv": "Hur lägger jag till måltider?"}, "body": {"sv": "Enklast gör du det direkt i bokningen. Har du redan bokat hör du av dig till vår kundtjänst så hjälper vi dig."}}, {"id": "p-131", "heading": {"sv": "Tiderna är preliminära"}, "body": {"sv": "Serveringstider kan komma att ändras. De slutgiltiga tiderna meddelas närmare avresa."}}]}, "visible": true}, {"id": "ctaBanner-133", "type": "ctaBanner", "props": {"title": {"sv": "Lägg till måltider i din bokning"}, "body": {"sv": "Kontakta kundtjänst om du redan har bokat din resa."}, "tone": "sea", "cta": {"label": {"sv": "Kontakta oss"}, "href": "/kontakt"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
138
|
-
from p
|
|
139
|
-
returning id, page_id
|
|
140
|
-
),
|
|
141
|
-
d as (update public.page_publications pp set is_active = false
|
|
142
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
143
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
144
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
145
|
-
update public.pages p
|
|
146
|
-
set current_version_id = (
|
|
147
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
148
|
-
)
|
|
149
|
-
where p.key = 'mat-och-dryck';
|
|
150
|
-
|
|
151
|
-
insert into public.pages (key, name, is_system, status)
|
|
152
|
-
values ('tallinn', 'Utforska Tallinn', false, 'published')
|
|
153
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
154
|
-
with p as (select id from public.pages where key = 'tallinn'),
|
|
155
|
-
v as (
|
|
156
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
157
|
-
select p.id,
|
|
158
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
159
|
-
'[{"id": "heroFull-134", "type": "heroFull", "props": {"eyebrow": {"sv": "7 timmar i land"}, "title": {"sv": "Utforska Tallinn"}, "body": {"sv": "En stad där medeltida charm möter moderna upplevelser."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/tallinn-by-night.jpg", "imageAlt": {"sv": "7 timmar i land"}}, "visible": true}, {"id": "prose-135", "type": "prose", "props": {"eyebrow": {"sv": "I land"}, "title": {"sv": "Sju timmar att upptäcka staden"}, "lead": {"sv": "På Voyaras kryssning till Tallinn får du hela sju timmar i land. För yngre resenärer erbjuder staden spännande shopping på platser som Viru Keskus och Telliskivi Creative City, en mångfald av restauranger med både traditionell estnisk mat och moderna kulinariska upplevelser samt ett uteliv med barer för alla smaker."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "checklist-146", "type": "checklist", "props": {"eyebrow": {"sv": "Höjdpunkter"}, "title": {"sv": "Så får du ut mest av dagen"}, "tone": "paper", "note": {"sv": "Håll koll på tiden och planera resvägarna — båten väntar inte."}, "columns": [{"id": "col-136", "title": {"sv": "Uppleva"}, "entries": [{"id": "e-137", "text": {"sv": "Dagsfest på en utvald bar i Tallinn tillsammans med gäster och personal — mat och dryck till fördelaktiga priser för alla med VIP-band."}}, {"id": "e-138", "text": {"sv": "Gamla stan (Vanalinn) med kullerstensgator, Raekoja plats och Domkyrkan."}}, {"id": "e-139", "text": {"sv": "Kadriorg Park & Palace med slott och konstmuseum."}}, {"id": "e-140", "text": {"sv": "Telliskivi Creative City med konstgallerier, butiker, kaféer och street food."}}]}, {"id": "col-141", "title": {"sv": "Praktiskt"}, "entries": [{"id": "e-142", "text": {"sv": "Testa estniska delikatesser som mulgipuder eller en lokal öl."}}, {"id": "e-143", "text": {"sv": "Uber och Bolt är vanliga och prisvärda — cirka 4 euro från färjeterminalen till centrum."}}, {"id": "e-144", "text": {"sv": "Promenaden till stadskärnan tar ungefär 15 minuter från färjan."}}, {"id": "e-145", "text": {"sv": "Prisvärda spa- och wellnessanläggningar, till exempel Tallink Spa, Grand Rose Spa och Hestia Hotel Europa."}}]}]}, "visible": true}, {"id": "ctaBanner-147", "type": "ctaBanner", "props": {"title": {"sv": "Följ med till Tallinn"}, "body": {"sv": "Boka din plats på nästa avgång från Värtahamnen."}, "tone": "ink", "cta": {"label": {"sv": "Se avgångar"}, "href": "/boka"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
160
|
-
from p
|
|
161
|
-
returning id, page_id
|
|
162
|
-
),
|
|
163
|
-
d as (update public.page_publications pp set is_active = false
|
|
164
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
165
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
166
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
167
|
-
update public.pages p
|
|
168
|
-
set current_version_id = (
|
|
169
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
170
|
-
)
|
|
171
|
-
where p.key = 'tallinn';
|
|
172
|
-
|
|
173
|
-
insert into public.pages (key, name, is_system, status)
|
|
174
|
-
values ('sakerhet', 'Säkerhet', false, 'published')
|
|
175
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
176
|
-
with p as (select id from public.pages where key = 'sakerhet'),
|
|
177
|
-
v as (
|
|
178
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
179
|
-
select p.id,
|
|
180
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
181
|
-
'[{"id": "heroFull-148", "type": "heroFull", "props": {"eyebrow": {"sv": "Trygghet ombord"}, "title": {"sv": "Säkerhet"}, "body": {"sv": "Tillsammans skapar vi en trygg och säker miljö."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/ombord-3.jpg", "imageAlt": {"sv": "Trygghet ombord"}}, "visible": true}, {"id": "prose-149", "type": "prose", "props": {"eyebrow": {"sv": "Vårt löfte"}, "title": {"sv": "Trygghet har högsta prioritet"}, "lead": {"sv": "Voyara sätter trygghet och säkerhet främst ombord på våra kryssningar. Alla ombord har ett ansvar — ser eller hör du något som inte känns bra ska det alltid rapporteras till personalen på båten."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "checklist-160", "type": "checklist", "props": {"eyebrow": {"sv": "Så arbetar vi"}, "title": {"sv": "Åtgärder ombord"}, "tone": "paper", "columns": [{"id": "col-150", "title": {"sv": "Personal och närvaro"}, "entries": [{"id": "e-151", "text": {"sv": "Trygghetsvärdar vars enda uppgift är att röra sig i korridorerna."}}, {"id": "e-152", "text": {"sv": "Fler säkerhetsvakter och trygghetsvärdar än vad lagen kräver."}}, {"id": "e-153", "text": {"sv": "Ökad synlighet av personal och vakter dygnet runt."}}, {"id": "e-154", "text": {"sv": "Hundratals övervakningskameror runt om i båten."}}]}, {"id": "col-155", "title": {"sv": "Ansvar och samarbeten"}, "entries": [{"id": "e-156", "text": {"sv": "Nära samarbete med Polis och Tull i hamnen och ombord."}}, {"id": "e-157", "text": {"sv": "Narkotikahundar på plats vid ombordstigning."}}, {"id": "e-158", "text": {"sv": "Regelbunden utbildning av serveringspersonal i ansvarsfull alkoholservering."}}, {"id": "e-159", "text": {"sv": "Extra tillgång till vatten i samtliga barer."}}]}]}, "visible": true}, {"id": "prose-165", "type": "prose", "props": {"eyebrow": {"sv": "Mer om säkerheten"}, "title": {"sv": "Aldrig ensam ombord"}, "layout": "two-col", "tone": "white", "items": [{"id": "p-161", "heading": {"sv": "Alltid någon att vända sig till"}, "body": {"sv": "All personal har som uppgift att aktivt förebygga brott och våldshandlingar och finnas nära till hands — dygnet runt och oavsett vad det gäller. Personalen har lång erfarenhet av att arbeta på event för ungdomar och är synlig runt om på båten under dygnets alla timmar."}}, {"id": "p-162", "heading": {"sv": "Nekad ombordstigning"}, "body": {"sv": "Polis och tullpersonal finns på plats för att genomsöka passagerare och bagage efter vapen, stickföremål och droger. Personalen har rätt att neka ombordstigning för personer som är märkbart berusade eller beter sig olämpligt."}}, {"id": "p-163", "heading": {"sv": "Fartygets säkerhet"}, "body": {"sv": "Sjöfartsmyndigheten kontrollerar och godkänner regelbundet säkerhetsorganisationen ombord. Varje vecka arrangeras säkerhetsövningar för personalen, och flera i besättningen har vidareutbildning i brandbekämpning och hantering av livbåtar."}}, {"id": "p-164", "heading": {"sv": "Hjälp oss bli bättre"}, "body": {"sv": "Vi tar gärna emot feedback och åsikter på hur vi kan utvecklas i vårt säkerhetsarbete. Hör av dig till oss med dina förslag."}}]}, "visible": true}, {"id": "ctaBanner-166", "type": "ctaBanner", "props": {"title": {"sv": "Har du en fråga om säkerheten?"}, "body": {"sv": "Kontakta oss så svarar vi så snart vi kan."}, "tone": "sea", "cta": {"label": {"sv": "Kontakta oss"}, "href": "/kontakt"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
182
|
-
from p
|
|
183
|
-
returning id, page_id
|
|
184
|
-
),
|
|
185
|
-
d as (update public.page_publications pp set is_active = false
|
|
186
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
187
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
188
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
189
|
-
update public.pages p
|
|
190
|
-
set current_version_id = (
|
|
191
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
192
|
-
)
|
|
193
|
-
where p.key = 'sakerhet';
|
|
194
|
-
|
|
195
|
-
insert into public.pages (key, name, is_system, status)
|
|
196
|
-
values ('galleri', 'Galleri', false, 'published')
|
|
197
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
198
|
-
with p as (select id from public.pages where key = 'galleri'),
|
|
199
|
-
v as (
|
|
200
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
201
|
-
select p.id,
|
|
202
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
203
|
-
'[{"id": "heroFull-167", "type": "heroFull", "props": {"eyebrow": {"sv": "Voyara"}, "title": {"sv": "Galleri"}, "body": {"sv": "Bilder och filmer från tidigare kryssningar."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-hero.jpg", "imageAlt": {"sv": "Voyara"}}, "visible": true}, {"id": "prose-168", "type": "prose", "props": {"eyebrow": {"sv": "Från kryssningarna"}, "title": {"sv": "Sveriges bästa festkryssning, förevigad"}, "lead": {"sv": "Självklart har vi flera fotografer på plats för att föreviga stämningen ombord. Nedan hittar du bilder från de tidigare Voyara-kryssningarna."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "imageMarquee-181", "type": "imageMarquee", "props": {"eyebrow": {"sv": ""}, "title": {"sv": ""}, "lead": {"sv": ""}, "textPosition": "none", "columns": 3, "firstDirection": "up", "speed": "normal", "aspect": "portrait", "gap": "md", "rounded": true, "tone": "white", "items": [{"id": "i-169", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2026-januari-23-25.jpg", "alt": {"sv": "Voyara januari 2026, avgång 23–25"}}, {"id": "i-170", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2026-januari-9-11.jpg", "alt": {"sv": "Voyara januari 2026, avgång 9–11"}}, {"id": "i-171", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2025-januari-25-26.jpg", "alt": {"sv": "Voyara januari 2025, avgång 25–26"}}, {"id": "i-172", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2025-januari-10-12.jpg", "alt": {"sv": "Voyara januari 2025, avgång 10–12"}}, {"id": "i-173", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2024.jpg", "alt": {"sv": "Stämning ombord 2024"}}, {"id": "i-174", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2023.jpg", "alt": {"sv": "Stämning ombord 2023"}}, {"id": "i-175", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2022-mars-25-27.jpg", "alt": {"sv": "Kryssningen 25–27 mars 2022"}}, {"id": "i-176", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2022-mars-11-13.jpg", "alt": {"sv": "Kryssningen 11–13 mars 2022"}}, {"id": "i-177", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2020.jpg", "alt": {"sv": "Stämning ombord 2020"}}, {"id": "i-178", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2019.jpg", "alt": {"sv": "Stämning ombord 2019"}}, {"id": "i-179", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2018.jpg", "alt": {"sv": "Stämning ombord 2018"}}, {"id": "i-180", "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/galleri-2017.jpg", "alt": {"sv": "Stämning ombord 2017"}}]}, "visible": true}, {"id": "ctaBanner-182", "type": "ctaBanner", "props": {"title": {"sv": "Vill du vara med nästa gång?"}, "body": {"sv": "Boka din plats på Voyara 2027."}, "tone": "ink", "cta": {"label": {"sv": "Boka nu"}, "href": "/boka"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
204
|
-
from p
|
|
205
|
-
returning id, page_id
|
|
206
|
-
),
|
|
207
|
-
d as (update public.page_publications pp set is_active = false
|
|
208
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
209
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
210
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
211
|
-
update public.pages p
|
|
212
|
-
set current_version_id = (
|
|
213
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
214
|
-
)
|
|
215
|
-
where p.key = 'galleri';
|
|
216
|
-
|
|
217
|
-
insert into public.pages (key, name, is_system, status)
|
|
218
|
-
values ('faq', 'FAQ', false, 'published')
|
|
219
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
220
|
-
with p as (select id from public.pages where key = 'faq'),
|
|
221
|
-
v as (
|
|
222
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
223
|
-
select p.id,
|
|
224
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
225
|
-
'[{"id": "heroFull-183", "type": "heroFull", "props": {"eyebrow": {"sv": "Vanliga frågor"}, "title": {"sv": "FAQ"}, "body": {"sv": "Svaren på de vanligaste frågorna om Voyara."}, "mediaType": "image", "height": "medium", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/faq-bakgrund.jpg", "imageAlt": {"sv": "Vanliga frågor"}}, "visible": true}, {"id": "faq-203", "type": "faq", "props": {"title": {"sv": "Vanliga frågor och svar"}, "columns": 1, "items": [{"id": "q-184", "q": {"sv": "Vad är det för betalningsvillkor?"}, "a": {"sv": "Betalningen sker i två omgångar. Första betalningen avser anmälningsavgiften (350 SEK) och ska vara oss tillhanda senast 1 dag efter utförd bokning. Anmälningsavgiften är en del av den totala kostnaden. Resterande belopp betalas senast 60 dagar innan avresa via ”Min bokning”."}}, {"id": "q-185", "q": {"sv": "Kan man byta namn på biljetten?"}, "a": {"sv": "Ja. Fram till 2 dagar innan avgång kostar ett namnbyte 200 kr per resenär. Huvudbokaren gör ändringen själv under fliken ”Resenärer” i Min bokning, eller mejlar oss med bokningsnummer, nuvarande och ny resenär samt godkännande av avgiften."}}, {"id": "q-186", "q": {"sv": "Kan man byta huvudbokare?"}, "a": {"sv": "Både nuvarande och ny huvudbokare mejlar oss från sina respektive e-postadresser med bokningsnummer, namn, födelsedata, adress och telefonnummer. Den nya huvudbokaren bekräftar samtidigt att hen accepterar resevillkoren."}}, {"id": "q-187", "q": {"sv": "Hur fungerar avbokning?"}, "a": {"sv": "Vid avbokning tidigare än 60 dagar före avresa återbetalas inbetalt belopp med avdrag för anmälningsavgiften och eventuellt rumstillägg. Mellan 60 och 10 dagar före avresa återbetalas inte 50 % av resans pris. 9–0 dagar före avresa sker ingen återbetalning."}}, {"id": "q-188", "q": {"sv": "Vad innebär avbeställningsskyddet?"}, "a": {"sv": "Avbeställningsskydd (150 SEK) innebär att du kan avbeställa din resa mot giltigt läkarintyg ända fram till 2 timmar innan avresa. Du får då tillbaka hela beloppet förutom anmälningsavgiften och eventuellt rumstillägg."}}, {"id": "q-189", "q": {"sv": "Måste man ha pass med sig?"}, "a": {"sv": "Godkänd resehandling krävs: nationellt ID-kort eller pass. Körkort är INTE en godkänd resehandling. Reglerna kommer från rederiet och kan inte frångås."}}, {"id": "q-190", "q": {"sv": "Vad är åldersgränsen?"}, "a": {"sv": "Åldersgränsen ombord är 18 år. Är huvudbokaren under 18 år vid bokningstillfället krävs målsmansintyg."}}, {"id": "q-191", "q": {"sv": "Vilka tider och datum gäller?"}, "a": {"sv": "Kryssning 1: 8–10 januari 2027. Kryssning 2: 22–24 januari 2027. Avgång från Värtahamnen i Stockholm kl. 17:30 och hemkomst kl. 10:30."}}, {"id": "q-192", "q": {"sv": "Vad finns det för tillval?"}, "a": {"sv": "Frukostbuffé 195 SEK, brunch 295 SEK, amerikansk middagsbuffé fredag 395 SEK, italiensk middagsbuffé lördag 395 SEK, VIP-band 195 SEK och avbeställningsskydd 150 SEK."}}, {"id": "q-193", "q": {"sv": "Vad innebär VIP-bandet?"}, "a": {"sv": "Med VIP-bandet får du tillgång till VIP-förfesten på en av nattklubbarna ombord, ett stort VIP-område under hela kryssningen samt dagsfesten inomhus i Tallinn."}}, {"id": "q-194", "q": {"sv": "Vilka tider är taxfree öppet?"}, "a": {"sv": "Dag 1: 17.30–22.00. Dag 2: 08.30–10.45 och 17.30–23.00. Dag 3: 08.00–10.30. Tiderna är preliminära. Åldersgränsen är 18 år på ditresan och 20 år på hemresan."}}, {"id": "q-195", "q": {"sv": "Får man ta med alkohol ombord?"}, "a": {"sv": "Nej. Egen alkohol får inte tas med ombord."}}, {"id": "q-196", "q": {"sv": "Vad finns det i hytterna?"}, "a": {"sv": "Alla hytter har sängar, toalett och dusch. Lakan, handdukar och tvål ingår för det antal som bor i hytten. Det finns ingen micro eller kokmöjlighet, och det råder strikt rökförbud i samtliga hytter."}}, {"id": "q-197", "q": {"sv": "Får man ta med högtalare?"}, "a": {"sv": "Ja, så länge du spelar på en lagom ljudnivå och inte stör övriga hytter eller korridorer."}}, {"id": "q-198", "q": {"sv": "Hur tar jag mig till båten?"}, "a": {"sv": "Vi avgår från Värtaterminalen i Stockholm. Ta tunnelbanans röda linje mot Ropsten och kliv av vid Gärdet (ca 800 m promenad) eller buss 76 till hållplats Värtahamnens färjeterminal. Det finns gott om parkering vid terminalen, Hamnpirsvägen 10."}}, {"id": "q-199", "q": {"sv": "Får man ta med mat ombord?"}, "a": {"sv": "Nej, men mindre snacks och bars går bra."}}, {"id": "q-200", "q": {"sv": "Hur mycket bagage får jag ta med?"}, "a": {"sv": "Så mycket du själv orkar bära."}}, {"id": "q-201", "q": {"sv": "Receptbelagd medicin?"}, "a": {"sv": "Ta med recept eller intyg som styrker att du får medföra din receptbelagda medicin, så att du kan visa upp det för tullen vid anmodan."}}, {"id": "q-202", "q": {"sv": "Är Voyara en studentkryssning?"}, "a": {"sv": "Voyara är en partykryssning för alla. Vi välkomnar resenärer, studenter, workers och alla festglada människor som vill uppleva en kryssning utöver det vanliga."}}]}, "visible": true}, {"id": "ctaBanner-204", "type": "ctaBanner", "props": {"title": {"sv": "Hittar du inte svaret?"}, "body": {"sv": "Hör av dig till kundtjänst så hjälper vi dig."}, "tone": "sea", "cta": {"label": {"sv": "Kontakta oss"}, "href": "/kontakt"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
226
|
-
from p
|
|
227
|
-
returning id, page_id
|
|
228
|
-
),
|
|
229
|
-
d as (update public.page_publications pp set is_active = false
|
|
230
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
231
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
232
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
233
|
-
update public.pages p
|
|
234
|
-
set current_version_id = (
|
|
235
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
236
|
-
)
|
|
237
|
-
where p.key = 'faq';
|
|
238
|
-
|
|
239
|
-
insert into public.pages (key, name, is_system, status)
|
|
240
|
-
values ('boka', 'Boka nu', false, 'published')
|
|
241
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
242
|
-
with p as (select id from public.pages where key = 'boka'),
|
|
243
|
-
v as (
|
|
244
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
245
|
-
select p.id,
|
|
246
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
247
|
-
'[{"id": "heroFull-205", "type": "heroFull", "props": {"eyebrow": {"sv": "Voyara 2027"}, "title": {"sv": "Boka nu"}, "body": {"sv": "Välj avgång, hytt och tillval — och säkra din plats ombord."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/boka-nu.jpg", "imageAlt": {"sv": "Voyara 2027"}, "primaryCta": {"label": {"sv": "Till bokningen"}, "href": "https://booking.summerinvasion.se"}}, "visible": true}, {"id": "courseList-208", "type": "courseList", "props": {"eyebrow": {"sv": "Avgångar"}, "title": {"sv": "Voyara 2027"}, "lead": {"sv": "Priset gäller per person i delad hytt och inkluderar kryssningen samt tillgång till alla shower och klubbar ombord."}, "note": {"sv": "Måltider, VIP-band och avbeställningsskydd väljs till i bokningen."}, "tone": "paper", "columns": 2, "source": "custom", "anchor": "datum", "items": [{"id": "c-206", "year": "2027", "courseNo": {"sv": "Kryssning 1"}, "location": {"sv": "Stockholm – Tallinn"}, "dates": {"sv": "8–10 januari 2027"}, "accommodation": {"sv": "Hytt: Ingår"}, "price": {"sv": "1 095 kr"}, "oldPrice": {"sv": "1 395 kr"}, "bookLabel": {"sv": "Boka"}, "bookUrl": "https://booking.summerinvasion.se"}, {"id": "c-207", "year": "2027", "courseNo": {"sv": "Kryssning 2"}, "location": {"sv": "Stockholm – Tallinn"}, "dates": {"sv": "22–24 januari 2027"}, "accommodation": {"sv": "Hytt: Ingår"}, "price": {"sv": "1 095 kr"}, "oldPrice": {"sv": "1 395 kr"}, "bookLabel": {"sv": "Boka"}, "featured": true, "bookUrl": "https://booking.summerinvasion.se"}]}, "visible": true}, {"id": "checklist-219", "type": "checklist", "props": {"eyebrow": {"sv": "Tillval"}, "title": {"sv": "Lägg till i din bokning"}, "tone": "white", "note": {"sv": "Tillvalen väljs enklast direkt i bokningen. Har du redan bokat hjälper kundtjänst dig."}, "columns": [{"id": "col-209", "title": {"sv": "Mat och dryck"}, "entries": [{"id": "e-210", "text": {"sv": "Frukostbuffé 195 kr"}}, {"id": "e-211", "text": {"sv": "Brunch 295 kr"}}, {"id": "e-212", "text": {"sv": "Amerikansk middagsbuffé fredag 395 kr"}}, {"id": "e-213", "text": {"sv": "Italiensk middagsbuffé lördag 395 kr"}}]}, {"id": "col-214", "title": {"sv": "Upplevelse och trygghet"}, "entries": [{"id": "e-215", "text": {"sv": "VIP-band 195 kr — förfest, VIP-område och dagsfest i Tallinn"}}, {"id": "e-216", "text": {"sv": "Avbeställningsskydd 150 kr"}}, {"id": "e-217", "text": {"sv": "Uppgradering till hytt med havsutsikt"}}, {"id": "e-218", "text": {"sv": "Anmälningsavgift 350 kr betalas inom 1 dag efter bokning"}}]}]}, "visible": true}, {"id": "ctaBanner-220", "type": "ctaBanner", "props": {"title": {"sv": "Klar att boka?"}, "body": {"sv": "Bokningen öppnar i ett nytt fönster hos vår bokningspartner."}, "tone": "ink", "cta": {"label": {"sv": "Till bokningen"}, "href": "https://booking.summerinvasion.se"}, "secondaryCta": {"label": {"sv": "Skicka intresseanmälan"}, "href": "/intresse"}}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
248
|
-
from p
|
|
249
|
-
returning id, page_id
|
|
250
|
-
),
|
|
251
|
-
d as (update public.page_publications pp set is_active = false
|
|
252
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
253
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
254
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
255
|
-
update public.pages p
|
|
256
|
-
set current_version_id = (
|
|
257
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
258
|
-
)
|
|
259
|
-
where p.key = 'boka';
|
|
260
|
-
|
|
261
|
-
insert into public.pages (key, name, is_system, status)
|
|
262
|
-
values ('samarbete', 'Kårer och kommittéer', false, 'published')
|
|
263
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
264
|
-
with p as (select id from public.pages where key = 'samarbete'),
|
|
265
|
-
v as (
|
|
266
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
267
|
-
select p.id,
|
|
268
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
269
|
-
'[{"id": "heroFull-221", "type": "heroFull", "props": {"eyebrow": {"sv": "För elevkårer och studentkommittéer"}, "title": {"sv": "Samarbeta med Voyara"}, "body": {"sv": "Studentkryssningen alla pratar om — vi tar hand om allt det praktiska."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-publik.jpg", "imageAlt": {"sv": "För elevkårer och studentkommittéer"}}, "visible": true}, {"id": "prose-223", "type": "prose", "props": {"eyebrow": {"sv": "Samarbete"}, "title": {"sv": "Ge era elever en oförglömlig upplevelse till havs"}, "lead": {"sv": "Varje år samarbetar Voyara med hundratals elevkårer och studentkommittéer för att ge deras elever den ultimata studentfesten. Tillsammans skapar vi en unik kryssningsupplevelse fylld med liveartister, DJ:s, temafester och en stämning som måste upplevas."}, "layout": "single", "tone": "white", "items": [{"id": "p-222", "body": {"sv": "Vi är en erfaren, trygg och stabil samarbetspartner som tar hand om allt från biljetthantering till färdigt marknadsföringsmaterial — så att ni kan fokusera på att samla deltagare och peppa inför avresan."}}]}, "visible": true}, {"id": "checklist-229", "type": "checklist", "props": {"eyebrow": {"sv": "Som samarbetspartner får ni"}, "title": {"sv": "Allt ni behöver — vi sköter resten"}, "tone": "paper", "note": {"sv": "Även du som är enskild elev och vill ta initiativ till att få kryssningen till din skola är varmt välkommen att höra av dig."}, "columns": [{"id": "col-224", "entries": [{"id": "e-225", "text": {"sv": "Exklusiva erbjudanden för era elever"}}, {"id": "e-226", "text": {"sv": "En personlig eventproducent som guidar er genom hela processen"}}, {"id": "e-227", "text": {"sv": "Trygga avtal och en beprövad arrangör med lång erfarenhet"}}, {"id": "e-228", "text": {"sv": "Hjälp med planering, marknadsföring och all praktisk hantering"}}]}]}, "visible": true}, {"id": "form-230", "type": "form", "props": {"formKey": "samarbete", "title": {"sv": "Anmäl ert intresse"}, "lead": {"sv": "Fyll i formuläret så kontaktar en av våra eventproducenter er."}, "tone": "paper", "anchor": "kontakt-form"}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
270
|
-
from p
|
|
271
|
-
returning id, page_id
|
|
272
|
-
),
|
|
273
|
-
d as (update public.page_publications pp set is_active = false
|
|
274
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
275
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
276
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
277
|
-
update public.pages p
|
|
278
|
-
set current_version_id = (
|
|
279
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
280
|
-
)
|
|
281
|
-
where p.key = 'samarbete';
|
|
282
|
-
|
|
283
|
-
insert into public.pages (key, name, is_system, status)
|
|
284
|
-
values ('ambassador', 'Bli ambassadör', false, 'published')
|
|
285
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
286
|
-
with p as (select id from public.pages where key = 'ambassador'),
|
|
287
|
-
v as (
|
|
288
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
289
|
-
select p.id,
|
|
290
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
291
|
-
'[{"id": "heroFull-231", "type": "heroFull", "props": {"eyebrow": {"sv": "För dig som vill ta initiativet"}, "title": {"sv": "Bli ambassadör"}, "body": {"sv": "Ta med din skola på Voyara och få exklusiva förmåner."}, "mediaType": "image", "height": "tall", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/artister-scen.jpg", "imageAlt": {"sv": "För dig som vill ta initiativet"}}, "visible": true}, {"id": "prose-232", "type": "prose", "props": {"eyebrow": {"sv": "Ambassadör"}, "title": {"sv": "Samarbeta med Voyara"}, "lead": {"sv": "Varje år samarbetar Voyara med hundratals personer, elevkårer och studentkommittéer för att skapa den ultimata studentfesten. Som ambassadör blir du länken mellan din skola och Nordens största partykryssning."}, "layout": "single", "tone": "white", "items": []}, "visible": true}, {"id": "checklist-238", "type": "checklist", "props": {"eyebrow": {"sv": "Som ambassadör får du"}, "title": {"sv": "Förmåner och stöd"}, "tone": "paper", "columns": [{"id": "col-233", "entries": [{"id": "e-234", "text": {"sv": "Exklusiva erbjudanden för era elever"}}, {"id": "e-235", "text": {"sv": "En personlig eventproducent som guidar er genom hela processen"}}, {"id": "e-236", "text": {"sv": "Trygga avtal och en beprövad arrangör med lång erfarenhet"}}, {"id": "e-237", "text": {"sv": "Hjälp med planering, marknadsföring och all praktisk hantering"}}]}]}, "visible": true}, {"id": "form-239", "type": "form", "props": {"formKey": "ambassador", "title": {"sv": "Ansök om att bli ambassadör"}, "lead": {"sv": "Berätta lite om dig själv och din skola så hör vi av oss."}, "tone": "paper", "anchor": "kontakt-form"}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
292
|
-
from p
|
|
293
|
-
returning id, page_id
|
|
294
|
-
),
|
|
295
|
-
d as (update public.page_publications pp set is_active = false
|
|
296
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
297
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
298
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
299
|
-
update public.pages p
|
|
300
|
-
set current_version_id = (
|
|
301
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
302
|
-
)
|
|
303
|
-
where p.key = 'ambassador';
|
|
304
|
-
|
|
305
|
-
insert into public.pages (key, name, is_system, status)
|
|
306
|
-
values ('kontakt', 'Kontakta oss', false, 'published')
|
|
307
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
308
|
-
with p as (select id from public.pages where key = 'kontakt'),
|
|
309
|
-
v as (
|
|
310
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
311
|
-
select p.id,
|
|
312
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
313
|
-
'[{"id": "heroFull-240", "type": "heroFull", "props": {"eyebrow": {"sv": "Voyara"}, "title": {"sv": "Kontakta oss"}, "body": {"sv": "Frågor om hemsidan, kryssningen eller din bokning? Vi hjälper dig."}, "mediaType": "image", "height": "medium", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/kontakt-bakgrund.jpg", "imageAlt": {"sv": "Voyara"}}, "visible": true}, {"id": "iconGrid-245", "type": "iconGrid", "props": {"eyebrow": {"sv": "Kontakt"}, "title": {"sv": "Så når du oss"}, "lead": {"sv": ""}, "note": {"sv": ""}, "tone": "paper", "columns": 4, "iconStyle": "circle", "iconAlign": "center", "cardStyle": "bordered", "items": [{"id": "g-241", "icon": "calendarClock", "title": {"sv": "Telefontider"}, "meta": {"sv": "Kundtjänst"}, "body": {"sv": "Måndag–fredag 09:00–17:00"}}, {"id": "g-242", "icon": "users", "title": {"sv": "Telefon"}, "meta": {"sv": "Ring oss"}, "body": {"sv": "010-14 75 045"}}, {"id": "g-243", "icon": "badgeCheck", "title": {"sv": "E-post"}, "meta": {"sv": "Mejla oss"}, "body": {"sv": "info@voyara.se"}}, {"id": "g-244", "icon": "ticket", "title": {"sv": "Bokningsnummer"}, "meta": {"sv": "Bra att veta"}, "body": {"sv": "Ange gärna ditt sexsiffriga bokningsnummer för snabbare svar."}}]}, "visible": true}, {"id": "form-246", "type": "form", "props": {"formKey": "kontakt", "title": {"sv": "Skicka ett meddelande"}, "lead": {"sv": "Enklast når du oss genom formuläret här nedan. Vi svarar så snart vi kan."}, "tone": "paper", "anchor": "kontakt-form"}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
314
|
-
from p
|
|
315
|
-
returning id, page_id
|
|
316
|
-
),
|
|
317
|
-
d as (update public.page_publications pp set is_active = false
|
|
318
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
319
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
320
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
321
|
-
update public.pages p
|
|
322
|
-
set current_version_id = (
|
|
323
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
324
|
-
)
|
|
325
|
-
where p.key = 'kontakt';
|
|
326
|
-
|
|
327
|
-
insert into public.pages (key, name, is_system, status)
|
|
328
|
-
values ('intresse', 'Intresseanmälan', false, 'published')
|
|
329
|
-
on conflict (key) do update set name = excluded.name, status = 'published';
|
|
330
|
-
with p as (select id from public.pages where key = 'intresse'),
|
|
331
|
-
v as (
|
|
332
|
-
insert into public.page_versions (page_id, version_no, blocks, note, created_by_email)
|
|
333
|
-
select p.id,
|
|
334
|
-
coalesce((select max(version_no) from public.page_versions pv where pv.page_id = p.id), 0) + 1,
|
|
335
|
-
'[{"id": "heroFull-247", "type": "heroFull", "props": {"eyebrow": {"sv": "Voyara 2027"}, "title": {"sv": "Intresseanmälan"}, "body": {"sv": "Fyll i din intresseanmälan idag för att säkra din plats och få en exklusiv rabatt."}, "mediaType": "image", "height": "medium", "overlay": "medium", "textAlign": "center", "verticalAlign": "center", "textTone": "light", "contentWidth": "normal", "titleSize": "lg", "titleFont": "serif", "titleUppercase": true, "image": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-publik.jpg", "imageAlt": {"sv": "Voyara 2027"}}, "visible": true}, {"id": "iconGrid-255", "type": "iconGrid", "props": {"eyebrow": {"sv": "Ombord"}, "title": {"sv": "Vad är Voyara?"}, "lead": {"sv": ""}, "note": {"sv": ""}, "tone": "paper", "columns": 4, "iconStyle": "circle", "iconAlign": "center", "cardStyle": "bordered", "items": [{"id": "g-248", "icon": "partyPopper", "title": {"sv": "Hyttfester"}, "body": {"sv": "Korridorerna är halva festen. Samla vännerna i hytten innan kvällens shower drar igång."}}, {"id": "g-249", "icon": "martini", "title": {"sv": "Artister och DJ:s"}, "body": {"sv": "Liveframträdanden varje kväll och resident DJ:s från Ayia Napa, Magaluf och Rhodos."}}, {"id": "g-250", "icon": "flame", "title": {"sv": "Nattklubbar och barer"}, "body": {"sv": "Flera klubbar och barer ombord med olika musikstilar — öppet till långt in på småtimmarna."}}, {"id": "g-251", "icon": "ticket", "title": {"sv": "Taxfree-shopping"}, "body": {"sv": "En av Östersjöns största taxfree-butiker, öppen både på ditresan och hemresan."}}, {"id": "g-252", "icon": "bed", "title": {"sv": "Boende"}, "body": {"sv": "Egen hytt med säng, dusch och wc. Uppgradera till havsutsikt, DeLuxe eller Suite."}}, {"id": "g-253", "icon": "glassWater", "title": {"sv": "Omtyckta restauranger"}, "body": {"sv": "Förboka buffé med fri bar, frukost och brunch — kupongerna gäller i alla restauranger ombord."}}, {"id": "g-254", "icon": "sparkles", "title": {"sv": "Tävlingar och giveaways"}, "body": {"sv": "Priser, uppgraderingar och överraskningar under hela kryssningen."}}]}, "visible": true}, {"id": "form-256", "type": "form", "props": {"formKey": "intresse", "title": {"sv": "Skicka din intresseanmälan"}, "lead": {"sv": "Varje år åker hundratals ungdomar och studenter från hela Sverige med oss. Anmäl ditt intresse så hör vi av oss med årets erbjudande."}, "tone": "paper", "anchor": "kontakt-form"}, "visible": true}]'::jsonb, 'Voyara seed', 'seed@voyara.se'
|
|
336
|
-
from p
|
|
337
|
-
returning id, page_id
|
|
338
|
-
),
|
|
339
|
-
d as (update public.page_publications pp set is_active = false
|
|
340
|
-
where pp.page_id = (select id from p) and pp.is_active)
|
|
341
|
-
insert into public.page_publications (page_id, version_id, note)
|
|
342
|
-
select v.page_id, v.id, 'Voyara seed' from v;
|
|
343
|
-
update public.pages p
|
|
344
|
-
set current_version_id = (
|
|
345
|
-
select pv.id from public.page_versions pv where pv.page_id = p.id order by pv.version_no desc limit 1
|
|
346
|
-
)
|
|
347
|
-
where p.key = 'intresse';
|
|
348
|
-
|
|
349
|
-
-- 4. SEO rows.
|
|
350
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
351
|
-
values ('home', '{"sv": ""}'::jsonb, '{"title": {"sv": "Voyara · Nordens största partykryssning"}, "description": {"sv": "Voyara är partykryssningen alla pratar om. Artister, DJ:s och shower varje kväll mellan Stockholm och Tallinn — plus sju timmar i land."}, "ogTitle": {"sv": "Voyara · Nordens största partykryssning"}, "ogDescription": {"sv": "Voyara är partykryssningen alla pratar om. Artister, DJ:s och shower varje kväll mellan Stockholm och Tallinn — plus sju timmar i land."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "website", "twitterCard": "summary_large_image"}'::jsonb)
|
|
352
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
353
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
354
|
-
values ('artister', '{"sv": "artister"}'::jsonb, '{"title": {"sv": "Artister & DJ:s · Voyara partykryssning"}, "description": {"sv": "Se artisterna och DJ:s som uppträtt på Voyara genom åren — och håll utkik när årets namn släpps."}, "ogTitle": {"sv": "Artister & DJ:s · Voyara partykryssning"}, "ogDescription": {"sv": "Se artisterna och DJ:s som uppträtt på Voyara genom åren — och håll utkik när årets namn släpps."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
355
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
356
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
357
|
-
values ('hytter', '{"sv": "hytter"}'::jsonb, '{"title": {"sv": "Hytter ombord · E, B, A, Premium, DeLuxe & Suite | Voyara"}, "description": {"sv": "Alla hytter har säng, dusch och wc. Jämför E-hytt, B-hytt, A-hytt med havsutsikt, A Premium, DeLuxe och Suite."}, "ogTitle": {"sv": "Hytter ombord · E, B, A, Premium, DeLuxe & Suite | Voyara"}, "ogDescription": {"sv": "Alla hytter har säng, dusch och wc. Jämför E-hytt, B-hytt, A-hytt med havsutsikt, A Premium, DeLuxe och Suite."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
358
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
359
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
360
|
-
values ('mat-och-dryck', '{"sv": "mat-och-dryck"}'::jsonb, '{"title": {"sv": "Mat och dryck ombord · Buffé med fri bar | Voyara"}, "description": {"sv": "Förboka amerikansk eller italiensk middagsbuffé med fri bar, frukost och brunch. Kupongerna gäller i alla restauranger ombord."}, "ogTitle": {"sv": "Mat och dryck ombord · Buffé med fri bar | Voyara"}, "ogDescription": {"sv": "Förboka amerikansk eller italiensk middagsbuffé med fri bar, frukost och brunch. Kupongerna gäller i alla restauranger ombord."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
361
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
362
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
363
|
-
values ('tallinn', '{"sv": "tallinn"}'::jsonb, '{"title": {"sv": "Utforska Tallinn · 7 timmar i land | Voyara"}, "description": {"sv": "Sju timmar i Tallinn: Gamla stan, Telliskivi, shopping, spa, restauranger och dagsfest med Voyara."}, "ogTitle": {"sv": "Utforska Tallinn · 7 timmar i land | Voyara"}, "ogDescription": {"sv": "Sju timmar i Tallinn: Gamla stan, Telliskivi, shopping, spa, restauranger och dagsfest med Voyara."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
364
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
365
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
366
|
-
values ('sakerhet', '{"sv": "sakerhet"}'::jsonb, '{"title": {"sv": "Säkerhet & trygghet ombord · Voyara"}, "description": {"sv": "Trygghetsvärdar, extra säkerhetsvakter, ansvarsfull alkoholservering och nära samarbete med Polis och Tull — dygnet runt."}, "ogTitle": {"sv": "Säkerhet & trygghet ombord · Voyara"}, "ogDescription": {"sv": "Trygghetsvärdar, extra säkerhetsvakter, ansvarsfull alkoholservering och nära samarbete med Polis och Tull — dygnet runt."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
367
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
368
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
369
|
-
values ('galleri', '{"sv": "galleri"}'::jsonb, '{"title": {"sv": "Galleri · Bilder från tidigare kryssningar | Voyara"}, "description": {"sv": "Bilder och filmer från tidigare Voyara-kryssningar. Se stämningen ombord och artisterna på scen."}, "ogTitle": {"sv": "Galleri · Bilder från tidigare kryssningar | Voyara"}, "ogDescription": {"sv": "Bilder och filmer från tidigare Voyara-kryssningar. Se stämningen ombord och artisterna på scen."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
370
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
371
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
372
|
-
values ('faq', '{"sv": "faq"}'::jsonb, '{"title": {"sv": "FAQ · Vanliga frågor om Voyara"}, "description": {"sv": "Betalning, avbokning, namnbyte, resehandlingar, åldersgräns, tillval och transport till Värtaterminalen."}, "ogTitle": {"sv": "FAQ · Vanliga frågor om Voyara"}, "ogDescription": {"sv": "Betalning, avbokning, namnbyte, resehandlingar, åldersgräns, tillval och transport till Värtaterminalen."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
373
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
374
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
375
|
-
values ('boka', '{"sv": "boka"}'::jsonb, '{"title": {"sv": "Boka Voyara 2027 · Partykryssning Stockholm–Tallinn"}, "description": {"sv": "Boka din plats på Voyara 2027. Välj avgång och hytt, lägg till måltider, VIP-band och avbeställningsskydd."}, "ogTitle": {"sv": "Boka Voyara 2027 · Partykryssning Stockholm–Tallinn"}, "ogDescription": {"sv": "Boka din plats på Voyara 2027. Välj avgång och hytt, lägg till måltider, VIP-band och avbeställningsskydd."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
376
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
377
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
378
|
-
values ('samarbete', '{"sv": "samarbete"}'::jsonb, '{"title": {"sv": "Kårer och kommittéer · Samarbeta med Voyara"}, "description": {"sv": "Vi samarbetar med elevkårer och studentkommittéer: exklusiva erbjudanden, egen eventproducent och färdigt material."}, "ogTitle": {"sv": "Kårer och kommittéer · Samarbeta med Voyara"}, "ogDescription": {"sv": "Vi samarbetar med elevkårer och studentkommittéer: exklusiva erbjudanden, egen eventproducent och färdigt material."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
379
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
380
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
381
|
-
values ('ambassador', '{"sv": "ambassador"}'::jsonb, '{"title": {"sv": "Bli ambassadör för Voyara"}, "description": {"sv": "Ta med din skola på Voyara. Exklusiva erbjudanden, personlig eventproducent och hjälp med all praktisk hantering."}, "ogTitle": {"sv": "Bli ambassadör för Voyara"}, "ogDescription": {"sv": "Ta med din skola på Voyara. Exklusiva erbjudanden, personlig eventproducent och hjälp med all praktisk hantering."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
382
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
383
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
384
|
-
values ('kontakt', '{"sv": "kontakt"}'::jsonb, '{"title": {"sv": "Kontakta oss · Voyara"}, "description": {"sv": "Frågor om kryssningen eller din bokning? Nå oss på 010-14 75 045 eller info@voyara.se. Kundtjänst vardagar 09:00–17:00."}, "ogTitle": {"sv": "Kontakta oss · Voyara"}, "ogDescription": {"sv": "Frågor om kryssningen eller din bokning? Nå oss på 010-14 75 045 eller info@voyara.se. Kundtjänst vardagar 09:00–17:00."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
385
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
386
|
-
insert into public.page_seo (page_key, slugs, seo)
|
|
387
|
-
values ('intresse', '{"sv": "intresse"}'::jsonb, '{"title": {"sv": "Intresseanmälan · Voyara 2027"}, "description": {"sv": "Skicka en intresseanmälan till Voyara 2027 och få en exklusiv rabatt inför årets mest efterlängtade partykryssning."}, "ogTitle": {"sv": "Intresseanmälan · Voyara 2027"}, "ogDescription": {"sv": "Skicka en intresseanmälan till Voyara 2027 och få en exklusiv rabatt inför årets mest efterlängtade partykryssning."}, "ogImage": {"src": "https://ybnqylupuisyhuldqrgt.supabase.co/storage/v1/object/public/media/voyara-hero-poster.jpg", "alt": {"sv": "Publiken på Voyaras partykryssning"}}, "ogType": "article", "twitterCard": "summary_large_image"}'::jsonb)
|
|
388
|
-
on conflict (page_key) do update set slugs = excluded.slugs, seo = excluded.seo;
|
|
389
|
-
|
|
390
|
-
commit;
|