Skip to content

Commit 48fe9c1

Browse files
ScarletttMoonScarlett Huang
andauthored
add Launch Week Vol.01 campaign page (#6647)
* feat(landing-page): add Launch Week Vol.01 event page Five-day campaign page at /community/events/launch-week/ for Aug 10–14. Structure: full-screen campaign hero (stateless — nothing here needs a daily edit), a pinned lineup panel beside a sticky stack of five drop cards, the All-Week Pass / Community Open Call tickets, and a short closing CTA into Discord and Feishu. Drop state is derived, not authored. Each day flips at 08:00 UTC+8 (00:00 UTC, no DST to resolve), computed client-side so a cached page still shows the right day without a redeploy. Sealed days render as full cards with their contents redacted, so the pile reads on day one when traffic peaks rather than as four flat bars. `?preview=all` and `?preview=1`–`5` simulate any day for review. All CSS is scoped under `.lw` and the two campaign faces (Anton, IBM Plex Mono) are self-hosted latin subsets, 36 KB total — no third-party font request, and nothing leaks into the rest of the site. Motion is limited to one entrance per element behind a `prefers-reduced-motion` guard; with motion reduced every element renders in its final state. * fix(landing-page): gate Launch Week preview and settle the page chrome Preview modes now need a shared key (`?preview=<day>&key=…`); without it the parameter is ignored and the real schedule applies, so the running order can't be read off a URL guess before each drop opens. The page also stops borrowing `.sub-main`. That class assumes a normal article column — a 140px top gap and a 48px bottom gap — which left dead space under the nav and a beige seam between the closing CTA and the site footer. The page now declares only the offset it needs (clearance for the sticky nav) and butts straight against the footer, matching how the story pages sit. Dropped our own copyright baseline: the site footer already carries it. * fix(landing-page): restore the Launch Week hero wash and size the closing CTA The hero's paper wash and drawing grid were never painting. Two causes stacked: the rule hung off `.hero::before`, which globals.css already owns as a section divider it sets to `display: none`, and even without that collision an absolute pseudo-element inside the flex hero collapsed to a 1px sliver. The wash is now its own `.lw-wash` element with explicit dimensions, so the paint reads at the intended strength instead of full saturation. The closing CTA was also shorter than the section CTAs on neighbouring /community pages. It now carries a comparable height and headline scale. * fix(landing-page): drop the Launch Week masthead strip, rebuild the closing CTA The strip under the site header repeated the logo beside it and read as a second navigation bar. Removed; the date it carried moves into the hero as a normal eyebrow, where a campaign page usually puts it. The closing CTA now follows the house `.v4final` pattern used by the story and community pages: a single left-aligned column stepping from eyebrow to headline to copy to one row of buttons, over a darkened image rather than flat black. Previously it split 60/40 with the buttons stranded in their own column, which is why it read as under-designed next to its neighbours. The darkening image is our own plate, so the campaign's material carries to the last screen. * fix(landing-page): restore Launch Week's screen-by-screen scroll rhythm Scroll snapping was silently lost in the port. In the mockup it lived on `html`; scoping every rule under `.lw` moved it onto `<main>`, which is not a scroll port, so the property had no effect and the ticket section spilled past the fold. It now sits on `html:has(main.lw)` — this stylesheet ships only with this page, so the scope still holds — with `scroll-padding-top` so a snapped section clears the sticky nav. The hero and the ticket section also disagreed on what "one screen" meant. The hero opens below the nav and takes `100svh - header`; every later full-screen section is reached with the nav scrolled away and takes the whole viewport. Also rewrote the closing paragraph as one sentence — the previous four clipped sentences read as a list rather than an invitation. * copy(landing-page): sharpen the Launch Week closing paragraph Leads with what the community actually gives you — how to claim the perks, what each drop really does, how to enter the Open Call — then the people, the team, and what comes next. Drops the perk list that the two tickets already cover in full, and stops naming Discord and Feishu in prose since the buttons below already do. * feat(landing-page): lead the events page with Launch Week Launch Week was buried in the "Coming soon" grid below a July recap, which read as if the flagship event were an afterthought. It now opens the page as its own band directly under the hero, and comes out of the grid so it appears once. The band shows the approved key visual whole rather than a page screenshot — the poster already carries the name, the dates, the five days, the challenge and the Pass, so the only things laid over it are what it cannot say: that the week is live, and where to go next. Those sit in a bar beneath the art instead of on top of it. The share card now uses the same key visual for the same reason. * fix(landing-page): scale the Launch Week band to a feature card Full-bleed 16:9 made the poster over 600px tall and swallowed the page. It is now a horizontal card the same size as the recap feature below it (352px), with the art in a 16:9 column so the key visual still shows whole, and the copy the poster cannot carry beside it. * fix(landing-page): let the Launch Week poster be the only loud thing The copy column repeated the poster's own palette — ink, acid, high contrast — so the band read as two competing halves. It is now the same neutral white card as every other event on the page, using the shared pill. The artwork carries the campaign; the card carries the facts. * fix(landing-page): give every Launch Week day a sealed card Only days 3–5 had a sealed twin, carried over from a mockup that assumed the first two days were always already out. Before the week opens — and on day one, when traffic peaks — the page was therefore short two and one cards. Every day now has both halves, and the no-JS fallback shows all five sealed, which is honest on any date; the script then opens whichever days have happened. * fix(landing-page): keep the TBA stamp clear of the stacked card above it The stamp sat low enough in a sealed card that the next card in the sticky stack sliced it in half. It now sits centred against the redacted lines, inside the area the peek leaves visible. * seo(landing-page): tighten Launch Week metadata and image loading Audit of the built page found the basics sound — canonical, 12 hreflang alternates, full OG/Twitter set, one H1, no missing alt, in the sitemap — with five gaps: - Title was 30 characters and carried no brand, wasting half the SERP line. Now states what the week is and ends in "Open Design". - Description opened on a sentence fragment and buried the premise; rewritten to 156 characters that lead with the dates and the promise. - Event schema lacked `image`, `performer`, `offers` and `isAccessibleForFree`, which Google wants before it will render an event rich result. - Seventeen images all loaded eagerly on a page read a screen at a time; the ten below the fold are now lazy with async decoding. - Target logos had no intrinsic size, so each one could shift layout on load. * i18n(landing-page): localise Launch Week into the ten non-English locales Adds a body partial per active locale plus the meta table, wired through `localeFromPath` like the story pages. The client script that writes drop states receives this locale's words too, so a translated page does not flip back to English once it runs. What stays English everywhere, deliberately: the campaign lockup ("Launch Week Vol.01"), the kill questions — each reads against a competitor's brand name — the ticket furniture, and the rubber stamps, which are artwork with the word cut into them. CJK sets far wider than Anton at the same size, so zh/ja/ko get their own step for the headline scales; without it the drop titles and the lineup title spilled past two lines. Translations are machine-drafted and want a native read per locale before this goes to production. * i18n(landing-page): translate the closing headline as a whole line "Get inside." is split across two elements so the second half can take the acid colour, and the word-level pass never matched the first half — every locale shipped a literal "Get" followed by a translated fragment, and French read "GET À L'INTÉRIEUR." Each locale now supplies the whole headline, with its own choice of which words carry the accent. * i18n(landing-page): drop the CJK word space, even out the join buttons Splitting the closing headline so the second half can take the accent colour left a space between the two halves — correct in Latin scripts, wrong in zh/ja/ko, where "进来 一起做。" should read without the gap. The two community buttons also sit at very different widths once translated ("加入 DISCORD" beside "加入飞书群"); a shared minimum keeps the pair level in every locale. * fix(landing-page): stop shipping unopened Launch Week drops in the HTML Self-audit found the campaign's central mechanism was not actually holding: a static page sends its whole DOM to every visitor, so each unopened day's headline and target sat in view-source days early. The preview key gated the display, never the markup — anyone could read the running order straight out of the page. Unopened drops are now dropped at build time. The sealed twin always ships; its revealed counterpart is emitted only once its date has passed, so the secret is never in the response. The cost is that a day opens on the next deploy rather than on the hour, which needs a scheduled build during the week. Also from the audit: - Mobile had no breakpoint at all. The kill list collapsed into an unreadable row, the lineup kept its two-column desktop shape, and the pass ticket overflowed because its grid track held the desktop intrinsic width. All three now have a narrow-screen layout. - `white-space: nowrap` on the hero lockup keeps it on one line on desktop, but every translated slogan is longer than the English and ran off a phone screen; it wraps below 900px. - Six assets were left behind by earlier revisions and no longer referenced. * fix(landing-page): release Launch Week drops at request time, not build time 504a8e5 kept unopened drops out of the HTML by stripping them at build, which bought secrecy at the cost of needing a deploy every morning of the week — five scheduled production builds, each one able to fail on the one day it matters. Serve them from a Pages Function instead. The page ships only the sealed cards; `/launch-week/drops` returns the markup for days that have actually opened and the browser slots it in. A day now flips on its own, and an unopened one is never in a response for anyone to read early. - Revealed markup moves to `_partials/launch-week-drops.ts`, per locale. - Edge cache expires at the next 00:00 UTC boundary, so a stale day-1 response cannot survive into day 2. - `?preview=N&key=…` still rehearses any day, and is served `no-store`. - A failed fetch leaves the sealed cards up: it fails toward the pre-launch page, never toward a leak. Tests cover the boundary, the key gate, cache lifetime, locale fallback, and that no locale partial carries revealed markup. Verified in the browser across 11 locales x 3 viewports, with scroll reveal and reduced motion. * fix(landing-page): drop the Watch button until its post exists The X post for a day is not written when the page ships, so the button on the live card pointed at `href="#"` — the most prominent control on the card, and clicking it threw the visitor back to the top of the page for nothing. Serve the button only once `DROP_LINKS` has that day's URL. The card reads fine without it: the kill strip becomes the closing line and the composition still balances. Filling a link in costs a production deploy and a `landing-deployers` approval, so the comment says to batch the days rather than edit it each morning. * fix(landing-page): stop shipping the Launch Week preview key to visitors The page carried `PREVIEW_KEY` in its inline script, so every visitor was served the key that unlocks the unreleased days. Read it off the page, request `?preview=all&key=…`, and the endpoint handed back all five days — the schedule protected nothing. Caught in review on the PR preview deployment. The key now comes from `LAUNCH_WEEK_PREVIEW_KEY`, a Pages secret, and appears neither in the page nor in this repository — both are public, so a key in either is a key everyone has. Unset means preview is off rather than open: a missing secret must not open the week up. The page no longer needs to know the key. It forwards whatever `?preview=` and `?key=` are in the URL and the endpoint decides; the response reports which preview it honoured, and the day labels are rebuilt from that. Two tests now guard the leak directly: one asserts the page source carries no key, the other that no literal key sits in the function. Requires `LAUNCH_WEEK_PREVIEW_KEY` on both the staging and production Pages projects. Until it is set, preview is simply unavailable — the live schedule is unaffected. --------- Co-authored-by: Scarlett Huang <scarletthuang@Scarletts-MacBook-Air.local>
1 parent f580271 commit 48fe9c1

42 files changed

Lines changed: 4751 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/landing-page/app/_partials/launch-week-drops.ts

Lines changed: 843 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Localised copy for the Launch Week Vol.01 event page.
3+
*
4+
* The campaign lockup ("Launch Week Vol.01"), the kill questions — which read
5+
* against a competitor's brand name — the ticket furniture and the rubber
6+
* stamps stay English in every locale on purpose: they are the campaign's
7+
* identity, not its copy. Everything else is translated.
8+
*
9+
* Machine-drafted; each locale still wants a native read before it ships.
10+
*/
11+
import en from "./launch-week-main.html?raw";
12+
import zh from "./launch-week-main.zh.html?raw";
13+
import ja from "./launch-week-main.ja.html?raw";
14+
import ko from "./launch-week-main.ko.html?raw";
15+
import de from "./launch-week-main.de.html?raw";
16+
import ru from "./launch-week-main.ru.html?raw";
17+
import fr from "./launch-week-main.fr.html?raw";
18+
import es from "./launch-week-main.es.html?raw";
19+
import ptbr from "./launch-week-main.pt-br.html?raw";
20+
import it from "./launch-week-main.it.html?raw";
21+
import tr from "./launch-week-main.tr.html?raw";
22+
23+
export const LW_BODY: { en: string } & Record<string, string | undefined> = { en, zh, ja, ko, de, ru, fr, es, "pt-br": ptbr, it, tr };
24+
25+
export interface LaunchWeekMeta { title: string; description: string }
26+
export const LW_META: { en: LaunchWeekMeta } & Record<string, LaunchWeekMeta | undefined> = {
27+
en: { title: "Launch Week Vol.01: five design launches in five days — Open Design", description: "Open Design Launch Week runs Aug 10–14: one new design capability a day, each aimed at a tool your team already pays for. Five days, five design jobs, five targets." },
28+
zh: { title: "Launch Week Vol.01:五天,五场设计发布 — Open Design", description: "Open Design Launch Week 于 8 月 10–14 日举行:每天上线一项新的设计能力,每一项都对准你的团队已经在付费的工具。五天,五项设计任务,五个目标。" },
29+
ja: { title: "Launch Week Vol.01:5日間で5つのデザイン・ローンチ — Open Design", description: "Open Design Launch Week は8月10〜14日開催。毎日ひとつ、新しいデザイン機能を公開します。狙うのは、あなたのチームがすでに課金しているツール。5日間、5つのデザイン業務、5つの標的。" },
30+
ko: { title: "Launch Week Vol.01: 5일간 다섯 번의 디자인 출시 — Open Design", description: "Open Design Launch Week는 8월 10–14일에 열립니다. 매일 하나씩 새로운 디자인 기능을 공개하며, 각각은 팀이 이미 비용을 지불하고 있는 도구를 겨냥합니다. 5일, 다섯 가지 디자인 작업, 다섯 개의 표적." },
31+
de: { title: "Launch Week Vol.01: fünf Design-Launches in fünf Tagen — Open Design", description: "Open Design Launch Week läuft vom 10. bis 14. August: jeden Tag eine neue Design-Fähigkeit, jede auf ein Tool gerichtet, für das dein Team bereits zahlt. Fünf Tage, fünf Design-Aufgaben, fünf Ziele." },
32+
ru: { title: "Launch Week Vol.01: пять дизайн-запусков за пять дней — Open Design", description: "Open Design Launch Week пройдёт 10–14 августа: каждый день — новая дизайн-возможность, и каждая нацелена на инструмент, за который ваша команда уже платит. Пять дней, пять задач, пять целей." },
33+
fr: { title: "Launch Week Vol.01 : cinq lancements design en cinq jours — Open Design", description: "L'Open Design Launch Week se tient du 10 au 14 août : chaque jour une nouvelle capacité de design, chacune visant un outil que votre équipe paie déjà. Cinq jours, cinq métiers du design, cinq cibles." },
34+
es: { title: "Launch Week Vol.01: cinco lanzamientos de diseño en cinco días — Open Design", description: "Open Design Launch Week se celebra del 10 al 14 de agosto: cada día una nueva capacidad de diseño, cada una apuntando a una herramienta que tu equipo ya paga. Cinco días, cinco trabajos de diseño, cinco objetivos." },
35+
"pt-br": { title: "Launch Week Vol.01: cinco lançamentos de design em cinco dias — Open Design", description: "A Open Design Launch Week acontece de 10 a 14 de agosto: a cada dia uma nova capacidade de design, cada uma mirando uma ferramenta que seu time já paga. Cinco dias, cinco trabalhos de design, cinco alvos." },
36+
it: { title: "Launch Week Vol.01: cinque lanci di design in cinque giorni — Open Design", description: "L'Open Design Launch Week si tiene dal 10 al 14 agosto: ogni giorno una nuova capacità di design, ognuna puntata su uno strumento che il tuo team già paga. Cinque giorni, cinque lavori di design, cinque bersagli." },
37+
tr: { title: "Launch Week Vol.01: beş günde beş tasarım lansmanı — Open Design", description: "Open Design Launch Week 10–14 Ağustos'ta: her gün yeni bir tasarım yeteneği, her biri ekibinizin zaten para ödediği bir araca nişan alıyor. Beş gün, beş tasarım işi, beş hedef." },
38+
};
39+
40+
/** Drop states are written by the client script, so they need their own table. */
41+
export const LW_STATUS: Record<string, { en: string } & Record<string, string | undefined>> = {
42+
RELEASED: { en: "RELEASED", "zh": "已发布", "ja": "公開済み", "ko": "공개됨", "de": "VERÖFFENTLICHT", "ru": "ВЫШЛО", "fr": "PUBLIÉ", "es": "PUBLICADO", "pt-br": "PUBLICADO", "it": "PUBBLICATO", "tr": "YAYINLANDI" },
43+
LIVE: { en: "LIVE", "zh": "进行中", "ja": "公開中", "ko": "진행 중", "de": "LIVE", "ru": "В ЭФИРЕ", "fr": "EN DIRECT", "es": "EN VIVO", "pt-br": "AO VIVO", "it": "IN DIRETTA", "tr": "CANLI" },
44+
CLASSIFIED: { en: "CLASSIFIED", "zh": "保密中", "ja": "未公開", "ko": "비공개", "de": "GEHEIM", "ru": "ЗАСЕКРЕЧЕНО", "fr": "CLASSÉ", "es": "CLASIFICADO", "pt-br": "CONFIDENCIAL", "it": "RISERVATO", "tr": "GİZLİ" },
45+
};
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
<!-- ═══════════ SCREEN 1 · campaign hero ═══════════ -->
2+
<section class="hero">
3+
<span class="lw-wash" aria-hidden="true"></span>
4+
5+
<div class="hero-main">
6+
<p class="hero-eyebrow">10.–14. AUG · FÜNF TAGE DESIGN-TEST · TÄGLICH LIVE</p>
7+
8+
<div class="hero-brand">
9+
<span class="sel-marquee" aria-hidden="true"></span>
10+
<h1 class="nowrap">Launch Week <span class="ed"><em>Vol.</em>01</span></h1>
11+
<span class="promise">Wie Teams designen, neu gedacht.</span>
12+
</div>
13+
14+
<div class="hero-lower">
15+
<div class="hero-band">
16+
<p class="hero-q">
17+
<span>Was können</span>
18+
<span class="models">
19+
<img src="/launch-week/codex-icon.svg" alt="Codex">
20+
<img src="/launch-week/deepseek-icon.svg" alt="DeepSeek">
21+
<img src="/launch-week/minimax-icon-solid.svg" alt="MiniMax">
22+
</span>
23+
<span class="plus">+</span>
24+
<img class="od-lockup" src="/launch-week/open-design-lockup.svg" alt="Open Design">
25+
<span class="kill">töten?</span>
26+
</p>
27+
<p class="hero-note">Fünf Tage.<br>Fünf Design-Aufgaben.<br>Ein Launch pro Tag.</p>
28+
</div>
29+
30+
<div class="hero-ctas">
31+
<a class="button is-acid" href="https://discord.gg/HESJFn53B" target="_blank" rel="noopener">DISCORD BEITRETEN <span></span></a>
32+
<a class="button" href="https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=76ao915b-3a37-43dd-ba0e-152ae1aae78d" target="_blank" rel="noopener">FEISHU-GRUPPE BEITRETEN <span></span></a>
33+
</div>
34+
</div>
35+
</div>
36+
37+
<div class="killticker">
38+
<div class="kt-label"><b>Die Kill-Liste</b></div>
39+
<ol>
40+
<li data-launch-day="1"><a href="#day-1">DAY 01 · <span data-state-label class="is-done">VERÖFFENTLICHT</span></a></li>
41+
<li data-launch-day="2"><a href="#day-2">DAY 02 · <span data-state-label class="is-live">LIVE</span></a></li>
42+
<li data-launch-day="3"><a href="#day-3">DAY 03 · <span data-state-label class="is-classified">GEHEIM</span></a></li>
43+
<li data-launch-day="4"><a href="#day-4">DAY 04 · <span data-state-label class="is-classified">GEHEIM</span></a></li>
44+
<li data-launch-day="5"><a href="#day-5">DAY 05 · <span data-state-label class="is-classified">GEHEIM</span></a></li>
45+
</ol>
46+
</div>
47+
</section>
48+
49+
<div class="dualrail">
50+
51+
<!-- ═══════════ LEFT · pinned lineup panel ═══════════ -->
52+
<aside class="cabin">
53+
<p class="eyebrow">10.–14. AUG</p>
54+
<h2 class="cabin-title">Das<br>Launch<br>Lineup</h2>
55+
<p class="cabin-sub">Fünf Tage. Fünf Ziele.</p>
56+
57+
</aside>
58+
59+
<!-- ═══════════ RIGHT · scrolling drops rail ═══════════ -->
60+
<section class="rail" id="drops">
61+
62+
<div class="drop-stack">
63+
64+
<!-- Sealed twin for every day; the script shows whichever half matches the date. -->
65+
<article class="drop is-classified reveal" data-launch-day="1">
66+
<div class="drop-meta">
67+
<span class="day">DAY 01/05</span>
68+
<span>10. AUG</span>
69+
<span class="classified-tag">GEHEIM</span>
70+
</div>
71+
<div class="drop-content">
72+
<div class="redact" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
73+
<p class="tba"><img src="/launch-week/stamp-tba.svg" alt="To be announced" loading="lazy" decoding="async"></p>
74+
</div>
75+
</article>
76+
<article class="drop is-classified reveal" data-launch-day="2">
77+
<div class="drop-meta">
78+
<span class="day">DAY 02/05</span>
79+
<span>11. AUG</span>
80+
<span class="classified-tag">GEHEIM</span>
81+
</div>
82+
<div class="drop-content">
83+
<div class="redact" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
84+
<p class="tba"><img src="/launch-week/stamp-tba.svg" alt="To be announced" loading="lazy" decoding="async"></p>
85+
</div>
86+
</article>
87+
<article class="drop is-classified reveal" data-launch-day="3">
88+
<div class="drop-meta">
89+
<span class="day">DAY 03/05</span>
90+
<span>12. AUG</span>
91+
<span class="classified-tag">GEHEIM</span>
92+
</div>
93+
<div class="drop-content">
94+
<div class="redact" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
95+
<p class="tba"><img src="/launch-week/stamp-tba.svg" alt="To be announced" loading="lazy" decoding="async"></p>
96+
</div>
97+
</article>
98+
<article class="drop is-classified reveal" data-launch-day="4">
99+
<div class="drop-meta">
100+
<span class="day">DAY 04/05</span>
101+
<span>13. AUG</span>
102+
<span class="classified-tag">GEHEIM</span>
103+
</div>
104+
<div class="drop-content">
105+
<div class="redact" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
106+
<p class="tba"><img src="/launch-week/stamp-tba.svg" alt="To be announced" loading="lazy" decoding="async"></p>
107+
</div>
108+
</article>
109+
<article class="drop is-classified reveal" data-launch-day="5">
110+
<div class="drop-meta">
111+
<span class="day">DAY 05/05</span>
112+
<span>14. AUG</span>
113+
<span class="classified-tag">GEHEIM</span>
114+
</div>
115+
<div class="drop-content">
116+
<div class="redact" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i></div>
117+
<p class="tba"><img src="/launch-week/stamp-tba.svg" alt="To be announced" loading="lazy" decoding="async"></p>
118+
</div>
119+
</article>
120+
</div>
121+
122+
</section>
123+
</div>
124+
125+
<!-- ═══════════ GET INSIDE LAUNCH WEEK ═══════════ -->
126+
<section class="join" id="inside">
127+
<div class="join-heading reveal">
128+
<div>
129+
<p class="eyebrow">ALL-WEEK-PASS · COMMUNITY OPEN CALL</p>
130+
<h2>Was du diese Woche bekommst.</h2>
131+
</div>
132+
</div>
133+
134+
<div class="ticket pass-ticket reveal">
135+
<div class="pass-body">
136+
<div>
137+
<p class="ticket-kicker">ALL-WEEK-PASS · BIG DROP</p>
138+
<h3>The $5 Go Plan,<br>jetzt auch für Design.</h3>
139+
<p class="ticket-bridge">VON OPEN CODE ZU OPEN DESIGN.</p>
140+
<p class="ticket-copy">Günstiges agentisches Design für alle.</p>
141+
</div>
142+
<div class="ticket-drop">
143+
<span>LAUNCH-WEEK-EXTRA</span>
144+
<strong>DEEPSEEK V4 FLASH UNLIMITED</strong>
145+
<p>Upgrade auf einen bezahlten Plan bis zum 14. August und nutze den Zugang bis zum Ende der Launch Week.</p>
146+
</div>
147+
<div>
148+
<p class="go-slogan">GEH ETWAS SCHÖNES BAUEN.</p>
149+
</div>
150+
</div>
151+
<div class="pass-stub">
152+
<span class="stub-label">ADMIT ONE · 10.–14. AUG</span>
153+
<span class="stub-barcode" aria-hidden="true"></span>
154+
<span class="stub-no">№ 00147</span>
155+
</div>
156+
</div>
157+
158+
<div class="ticket challenge-ticket reveal" id="open-call">
159+
<div>
160+
<p class="ticket-kicker">COMMUNITY OPEN CALL</p>
161+
<h3>Zeig uns,<br>was du gebaut hast.</h3>
162+
<p class="ticket-copy">Etwas Cooles mit Open Design gebaut?<br>Teile es mit der Community.</p>
163+
</div>
164+
<div class="reaction-callout">
165+
<strong>HERAUSRAGENDE PROJEKTE ERHALTEN:</strong>
166+
<ul class="reward-grid">
167+
<li>1 MONAT PRO</li>
168+
<li>OFFIZIELLES SPOTLIGHT</li>
169+
<li>EIGENE PROJEKTSEITE</li>
170+
<li>BERÜCKSICHTIGUNG ALS BOTSCHAFTER</li>
171+
</ul>
172+
</div>
173+
<div>
174+
<p class="go-slogan">BRING DEINE ARBEIT ANS LICHT.</p>
175+
</div>
176+
</div>
177+
</section>
178+
179+
<section class="finale" id="community">
180+
<div class="finale-row reveal">
181+
<p class="eyebrow">OPEN DESIGN LAUNCH WEEK · 10.–14. AUG</p>
182+
<h2>Komm <span class="turn">rein.</span></h2>
183+
<p>Alles, was du brauchst, ist in unserer Community: wie du die Vorteile einlöst, was jeder Drop wirklich kann und wie du beim Open Call mitmachst. Dort findest du auch die Leute, die neben dir bauen, das Team hinter Open Design und den ersten Blick auf das, was als Nächstes kommt.</p>
184+
<div class="ctas">
185+
<a class="button is-acid" href="https://discord.gg/HESJFn53B" target="_blank" rel="noopener">DISCORD BEITRETEN <span></span></a>
186+
<a class="button" href="https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=76ao915b-3a37-43dd-ba0e-152ae1aae78d" target="_blank" rel="noopener">FEISHU-GRUPPE BEITRETEN <span></span></a>
187+
</div>
188+
</div>
189+
</section>

0 commit comments

Comments
 (0)