mirror of
https://github.com/nexu-io/open-design.git
synced 2026-05-31 19:04:39 +07:00
feat(landing-page): surface Discord + X in header, restructure site footer (#3230)
Some checks failed
ci / Detect CI change scopes (push) Successful in 0s
visual-baseline / Capture visual baselines (push) Waiting to run
landing-page-ci / Validate landing page (push) Failing after 2s
landing-page-staging / Deploy landing page to staging (push) Has been skipped
nix-check / build (push) Failing after 2s
ci / Validate Nix flake (push) Has been skipped
ci / Preflight (push) Failing after 2s
ci / Workspace unit tests (push) Failing after 2s
ci / Daemon workspace tests (push) Failing after 1s
ci / Web workspace tests (push) Failing after 1s
ci / Browser tests (push) Failing after 1s
ci / Build workspaces (push) Failing after 2s
ci / Validate workspace (push) Failing after 0s
ci / Runtime trace (push) Has been skipped
Some checks failed
ci / Detect CI change scopes (push) Successful in 0s
visual-baseline / Capture visual baselines (push) Waiting to run
landing-page-ci / Validate landing page (push) Failing after 2s
landing-page-staging / Deploy landing page to staging (push) Has been skipped
nix-check / build (push) Failing after 2s
ci / Validate Nix flake (push) Has been skipped
ci / Preflight (push) Failing after 2s
ci / Workspace unit tests (push) Failing after 2s
ci / Daemon workspace tests (push) Failing after 1s
ci / Web workspace tests (push) Failing after 1s
ci / Browser tests (push) Failing after 1s
ci / Build workspaces (push) Failing after 2s
ci / Validate workspace (push) Failing after 0s
ci / Runtime trace (push) Has been skipped
* feat(landing-page): surface Discord + X in header, restructure site footer
Two related public-chrome adjustments:
- **Header gains compact Discord + X icon buttons.** Both community
channels were previously buried in the footer, so the typical
visitor never saw them on a page-deep scroll. They now sit before
the Download / Star CTAs in `nav-side`, share the ghost-button
outline language, and stay icon-only with `aria-label` so they
read as social affordances rather than competing with the text
CTAs. At ≤1080px the icon buttons hide alongside the existing
ghost CTA, so the bar still collapses cleanly into the hamburger
panel — Star stays in the bar at every breakpoint.
- **Footer restructured into 4 columns: Products / Plugins /
Resources / Connect.** The old `Plugins / Open Design / Connect`
three-column layout muddled three different things — sister
products, the artifact catalogue, and contributor channels —
under one roof, so visitors hunting for "the other thing this
team makes" had nowhere obvious to go.
- **Products** (new) lists the team's apps: Open Design (links
to homepage) and HTML Anything. Two entries by design — adding
more products without an editorial pass would dilute the
column.
- **Plugins** mirrors the topbar `Plugins` dropdown verbatim:
Templates / Skills / Systems / Craft, with no count prefix on
Systems / Craft so it reads identically to the nav.
- **Resources** (renamed from `Open Design`) carries the
docs-style links: Official source / Quickstart / Agents locaux
/ Compare / Claude Design alternative. The old column heading
was confusing because the OD logo + brand name already sit
under the column.
- **Connect** gains an X / Twitter row pointing at
`@nexudotio`. The brand entries on this column are
contributor / community surfaces only — code, releases,
chat, social, RSS, contact form.
Implementation:
- `_components/header.tsx` — `DISCORD` and `X_TWITTER` consts at
the top alongside `REPO`. Two `<a class="nav-icon">` blocks with
inline SVG before the existing Download / Star CTAs.
- `_components/site-footer.astro` — `HTML_ANYTHING` and `NEXU_IO`
consts. `<div class="sub-footer-col">` re-ordered to put
Products first, Plugins second (no longer carries `counts.*`
values), Resources third, Connect fourth (with the new X / Twitter
row).
- `globals.css` — `.nav-icon` rule cloned from the ghost CTA's
visual language (transparent + 1px line, fills on hover) but
square (36×36 round) so it reads as a social-icon affordance.
Added `display: none` for `.nav-side .nav-icon` to the existing
≤1080px and ≤880px media queries so the icons follow the same
collapse behaviour as the Download CTA.
- `sub-pages.css` — `.sub-footer-grid` switches from
`1.6fr 1fr 1fr 1fr` to `1.4fr 1fr 1fr 1fr 1fr` (brand + 4
columns). At ≤1080px it falls back to a 3-column shape so each
column has room to breathe; at ≤720px it stays a single column
(existing behaviour).
- `i18n.ts` — adds `products`, `resources`, `xTwitter`,
`sisterProjects`, `htmlAnything`, `nexuIo` to `LandingUiCopy.footer`
(the last three are kept around even though `sisterProjects` is no
longer rendered after the column was renamed Products — they're
harmless and avoid churning the type if a future iteration brings
the Sister-projects framing back). All 17 non-English landing
locales gain translations for the new keys via the existing
`LOCALIZED_LANDING_FOOTER_COPY` map (and the `LANDING_UI_COPY_OVERRIDES`
block for `zh` / `zh-tw`). Translations were generated with
`claude-haiku-4-5` over OpenRouter, with explicit instructions
to keep "Open Design", "HTML Anything", and "X / Twitter" in
English and to render "Products" / "Resources" in sentence case
per locale convention. Spot-checked against rendered pages on
`/zh/`, `/zh-tw/`, `/ja/`, `/ko/`, `/de/`, `/fr/` (and `/ar/` for
RTL) for natural phrasing.
Validation: `pnpm --filter @open-design/landing-page typecheck` ->
0 errors / 0 warnings; local dev server smoke-tested on en root
(`/html-anything/`) and 5 locale variants (`/zh/`, `/zh-tw/`,
`/ja/`, `/de/`, `/fr/`) — header renders 2 nav-icon buttons,
footer renders 4 localized column headings in the correct order
with the right link targets.
* fix(landing-page): address PR #3230 review — locale-aware HTML Anything link + drop unused const
Two non-blocking inline review points from @PerishCode on PR #3230:
- The HTML Anything entry in the new Products column hardcoded
`https://open-design.ai/html-anything/` via a top-level
`HTML_ANYTHING` const, but `/html-anything/` is a real localized
route in this app (`pages/[locale]/html-anything/index.astro`)
and `open-design.ai` is the same site's live domain. A visitor
on `/zh/…` clicking through landed on the English route and lost
locale context, and hardcoding the production domain meant a
preview build would surface a link that bounces visitors back
to prod. Switch to `href('/html-anything/')` so the locale prefix
+ the current site's domain (resolved by `localizedHref`) are
honored, matching every other footer link.
- `NEXU_IO` was declared at the top of the component but never
referenced — leftover from an earlier iteration that listed
`nexu.io` as a Sister-projects entry before the column was
renamed Products and reduced to OD + HTML Anything. Removed.
No behavior change beyond the locale routing fix; the i18n keys
and column structure stay as they landed in the original commit.
* fix(landing-page): correct nav-icon comment to match actual responsive behaviour
The JSX comment introduced for the new Discord + X icon buttons in
PR #3230 claimed the icons "survive at narrow widths while text-only
nav items get pushed off". The CSS that shipped in the same PR does
the opposite: both `@media (max-width: 1080px)` and `@media (max-width:
880px)` blocks add `.nav-side .nav-icon { display: none; }`, so at
narrow widths the icons collapse alongside the ghost Download CTA
while the text nav <ul> moves into the hamburger panel — only the
Star CTA remains visible in the bar.
Rewrite the comment to describe the actual responsive contract so
the next reader of `header.tsx` doesn't have to cross-reference
`globals.css` to figure out which surface stays. Reviewer flag from
@PerishCode on PR #3230.
No code-path change; comment-only.
* fix(landing-page): correct sub-footer 1080px comment to describe actual 3-column grid
The CSS comment introduced for the new sub-footer grid claimed the
≤1080px breakpoint drops to "brand + 2x2 grid of columns" — but the
rule produces a 3-column grid, not a 2x2.
`.sub-footer-grid` has 5 children at this breakpoint (the brand
block + the four footer columns) and `.sub-footer-brand` carries
no `grid-column` span, so with `grid-template-columns: 1.6fr
repeat(2, 1fr)` they flow as: row 1 = brand · Products · Plugins,
row 2 = Resources · Connect · empty cell. The brand sits inline
with two columns rather than on its own, and the four content
columns are not a clean 2x2.
The layout itself is fine; only the comment misleads the next
reader about how the columns wrap. Same flavor as the `header.tsx`
icon comment fixed in 744daec — describe what the rule actually
does so the comment doesn't drift from the CSS. Reviewer flag
from @PerishCode on PR #3230.
Comment-only change.
---------
Co-authored-by: Joey-nexu <joeylee12629@gmail.com>
This commit is contained in:
parent
98a2c63973
commit
3f4fd58937
5 changed files with 203 additions and 8 deletions
|
|
@ -21,6 +21,8 @@ import {
|
|||
|
||||
const REPO = 'https://github.com/nexu-io/open-design';
|
||||
const REPO_RELEASES = `${REPO}/releases`;
|
||||
const DISCORD = 'https://discord.gg/9ptkbbqRu';
|
||||
const X_TWITTER = 'https://x.com/nexudotio';
|
||||
|
||||
const ext = {
|
||||
target: '_blank',
|
||||
|
|
@ -274,6 +276,37 @@ export function Header({
|
|||
</ul>
|
||||
</nav>
|
||||
<div className='nav-side'>
|
||||
{/*
|
||||
Discord + X icon buttons live before Download / Star so the
|
||||
community channels are reachable from every page without
|
||||
burning a nav text slot. The icons are aria-labeled and
|
||||
otherwise unlabeled. At ≤1080px they collapse alongside the
|
||||
ghost Download CTA and the text-only nav <ul> (the latter
|
||||
moves into the hamburger panel) — only the Star CTA stays
|
||||
visible in the bar.
|
||||
*/}
|
||||
<a
|
||||
className='nav-icon'
|
||||
href={DISCORD}
|
||||
aria-label='Join Open Design on Discord'
|
||||
title='Discord'
|
||||
{...ext}
|
||||
>
|
||||
<svg viewBox='0 0 24 24' width='18' height='18' fill='currentColor' aria-hidden='true'>
|
||||
<path d='M19.27 5.33A18 18 0 0 0 14.72 4l-.2.4a13.7 13.7 0 0 0-5.04 0L9.27 4a18 18 0 0 0-4.54 1.33C2.4 8.94 1.78 12.45 2.09 15.9a18.4 18.4 0 0 0 5.6 2.83l1.13-1.55a11.6 11.6 0 0 1-1.78-.86l.44-.34a13 13 0 0 0 11.04 0l.44.34c-.55.33-1.16.61-1.78.86l1.13 1.55a18.3 18.3 0 0 0 5.6-2.83c.45-4.05-.5-7.53-2.64-10.57ZM9.5 14.07c-1.07 0-1.95-.99-1.95-2.21 0-1.22.86-2.22 1.95-2.22 1.1 0 1.97 1 1.95 2.22 0 1.22-.86 2.21-1.95 2.21Zm5 0c-1.07 0-1.95-.99-1.95-2.21 0-1.22.87-2.22 1.96-2.22 1.1 0 1.96 1 1.95 2.22 0 1.22-.86 2.21-1.96 2.21Z' />
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
className='nav-icon'
|
||||
href={X_TWITTER}
|
||||
aria-label='Follow Open Design on X'
|
||||
title='X / Twitter'
|
||||
{...ext}
|
||||
>
|
||||
<svg viewBox='0 0 24 24' width='16' height='16' fill='currentColor' aria-hidden='true'>
|
||||
<path d='M17.53 3H21l-7.39 8.45L22 21h-6.83l-5.36-6.99L3.7 21H.23l7.9-9.04L0 3h7l4.85 6.41L17.53 3Zm-2.39 16h2.04L5.96 4.9H3.78L15.14 19Z' />
|
||||
</svg>
|
||||
</a>
|
||||
<a
|
||||
className='nav-cta ghost'
|
||||
href={REPO_RELEASES}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ const ui = getLandingUiCopy(locale);
|
|||
const href = (path: string) => localizedHref(path, locale);
|
||||
const REPO = 'https://github.com/nexu-io/open-design';
|
||||
const DISCORD = 'https://discord.gg/9ptkbbqRu';
|
||||
const X_TWITTER = 'https://x.com/nexudotio';
|
||||
---
|
||||
|
||||
<footer class='sub-footer' data-od-id='sub-footer'>
|
||||
|
|
@ -36,17 +37,24 @@ const DISCORD = 'https://discord.gg/9ptkbbqRu';
|
|||
{ui.footer.summary}
|
||||
</p>
|
||||
</div>
|
||||
<div class='sub-footer-col'>
|
||||
<h5>{ui.footer.products}</h5>
|
||||
<ul>
|
||||
<li><a href={href('/')}>Open Design</a></li>
|
||||
<li><a href={href('/html-anything/')}>{ui.footer.htmlAnything}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='sub-footer-col'>
|
||||
<h5>{copy.nav.plugins}</h5>
|
||||
<ul>
|
||||
<li><a href={href('/plugins/templates/')}>{copy.nav.templates}</a></li>
|
||||
<li><a href={href('/plugins/skills/')}>{copy.nav.skills}</a></li>
|
||||
<li><a href={href('/plugins/systems/')}>{counts.systems} {copy.nav.systems}</a></li>
|
||||
<li><a href={href('/plugins/craft/')}>{counts.craft} {copy.nav.craft}</a></li>
|
||||
<li><a href={href('/plugins/systems/')}>{copy.nav.systems}</a></li>
|
||||
<li><a href={href('/plugins/craft/')}>{copy.nav.craft}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='sub-footer-col'>
|
||||
<h5>{ui.footer.openDesign}</h5>
|
||||
<h5>{ui.footer.resources}</h5>
|
||||
<ul>
|
||||
<li><a href={href('/official/')}>{ui.footer.official}</a></li>
|
||||
<li><a href={href('/quickstart/')}>{ui.footer.quickstart}</a></li>
|
||||
|
|
@ -62,6 +70,7 @@ const DISCORD = 'https://discord.gg/9ptkbbqRu';
|
|||
<li><a href={`${REPO}/issues`} target='_blank' rel='noopener'>{ui.footer.issues}</a></li>
|
||||
<li><a href={`${REPO}/releases`} target='_blank' rel='noopener'>{ui.footer.releases}</a></li>
|
||||
<li><a href={DISCORD} target='_blank' rel='noopener'>{ui.footer.discord}</a></li>
|
||||
<li><a href={X_TWITTER} target='_blank' rel='noopener'>{ui.footer.xTwitter}</a></li>
|
||||
<li><a href='/blog/rss.xml'>{ui.footer.rss}</a></li>
|
||||
<li><a href={href('/#contact')}>{copy.nav.contact}</a></li>
|
||||
</ul>
|
||||
|
|
|
|||
|
|
@ -606,6 +606,34 @@ body::before {
|
|||
align-items: center;
|
||||
gap: 18px;
|
||||
}
|
||||
/*
|
||||
* Compact icon-only chrome buttons for community-channel links
|
||||
* (Discord, X) sitting beside the Download / Star CTAs. They share
|
||||
* the ghost-button outline language but stay square so they read as
|
||||
* social affordances and don't compete with the text CTAs.
|
||||
*/
|
||||
.nav-icon {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid rgba(21, 20, 15, 0.18);
|
||||
color: var(--ink);
|
||||
background: transparent;
|
||||
text-decoration: none;
|
||||
transition: background 160ms ease, border-color 160ms ease, color 160ms ease;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.nav-icon:hover {
|
||||
background: var(--ink);
|
||||
border-color: var(--ink);
|
||||
color: var(--paper);
|
||||
}
|
||||
.nav-icon svg {
|
||||
display: block;
|
||||
}
|
||||
.nav-cta {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
|
|
@ -2470,8 +2498,9 @@ footer {
|
|||
@media (max-width: 1080px) {
|
||||
.nav-toggle { display: inline-flex; }
|
||||
.brand { white-space: nowrap; }
|
||||
/* Hide Download from the bar (Star stays). */
|
||||
/* Hide Download + Discord/X icon buttons from the bar (Star stays). */
|
||||
.nav-side .nav-cta.ghost { display: none; }
|
||||
.nav-side .nav-icon { display: none; }
|
||||
/* Collapse the nav <ul> into a panel that drops below the header bar.
|
||||
* The header is `position: sticky`, so absolute-positioning the panel
|
||||
* relative to the header element keeps it pinned correctly. */
|
||||
|
|
@ -2620,11 +2649,13 @@ footer {
|
|||
.foot-bottom { flex-direction: column; align-items: flex-start; gap: 12px; }
|
||||
.foot-bottom .right { flex-wrap: wrap; gap: 12px 20px; }
|
||||
/* nav — at ≤880px tighten padding; nav-links stay reachable through
|
||||
* the hamburger panel introduced at ≤1080px. Brand meta and Download
|
||||
* stay hidden; Star CTA still pings in the bar. */
|
||||
* the hamburger panel introduced at ≤1080px. Brand meta, Download,
|
||||
* and the Discord/X icon buttons stay hidden; Star CTA still pings
|
||||
* in the bar. */
|
||||
.nav { padding: 16px 0; }
|
||||
.brand-meta { display: none; }
|
||||
.nav-side .nav-cta.ghost { display: none; }
|
||||
.nav-side .nav-icon { display: none; }
|
||||
}
|
||||
@media (max-width: 640px) {
|
||||
.topbar-inner { gap: 14px; }
|
||||
|
|
|
|||
|
|
@ -698,6 +698,8 @@ export interface LandingUiCopy {
|
|||
summary: string;
|
||||
catalog: string;
|
||||
openDesign: string;
|
||||
products: string;
|
||||
resources: string;
|
||||
official: string;
|
||||
quickstart: string;
|
||||
agents: string;
|
||||
|
|
@ -709,7 +711,11 @@ export interface LandingUiCopy {
|
|||
contributors: string;
|
||||
releases: string;
|
||||
discord: string;
|
||||
xTwitter: string;
|
||||
rss: string;
|
||||
sisterProjects: string;
|
||||
htmlAnything: string;
|
||||
nexuIo: string;
|
||||
bottomLeft: string;
|
||||
bottomRight: string;
|
||||
};
|
||||
|
|
@ -2993,6 +2999,8 @@ const LANDING_UI_COPY: LandingUiCopy = {
|
|||
'The official open-source, local-first alternative to Claude Design. Apache-2.0, BYOK at every layer.',
|
||||
catalog: 'Catalog',
|
||||
openDesign: 'Open Design',
|
||||
products: 'Products',
|
||||
resources: 'Resources',
|
||||
official: 'Official source page',
|
||||
quickstart: 'Quickstart',
|
||||
agents: 'Agents locaux',
|
||||
|
|
@ -3004,7 +3012,11 @@ const LANDING_UI_COPY: LandingUiCopy = {
|
|||
contributors: 'Contributors',
|
||||
releases: 'Releases',
|
||||
discord: 'Discord',
|
||||
xTwitter: 'X / Twitter',
|
||||
rss: 'RSS',
|
||||
sisterProjects: 'Sister projects',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Issue Nº 26',
|
||||
bottomRight: 'Berlin / Open / Earth · 52.5200° N · 13.4050° E',
|
||||
},
|
||||
|
|
@ -3272,6 +3284,8 @@ const LANDING_UI_COPY_OVERRIDES: Partial<
|
|||
summary:
|
||||
'官方开源、本地优先的 Claude Design 替代方案。Apache-2.0,所有层都 BYOK。',
|
||||
catalog: '目录',
|
||||
products: '产品',
|
||||
resources: '资源',
|
||||
official: '官方来源页',
|
||||
quickstart: '快速开始',
|
||||
agents: 'Agent',
|
||||
|
|
@ -3283,7 +3297,11 @@ const LANDING_UI_COPY_OVERRIDES: Partial<
|
|||
contributors: '贡献者',
|
||||
releases: '版本发布',
|
||||
discord: 'Discord',
|
||||
xTwitter: 'X / Twitter',
|
||||
rss: 'RSS',
|
||||
sisterProjects: '姊妹项目',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / 第 01 卷 / 第 26 期',
|
||||
bottomRight: '柏林 / 开放 / 地球 · 52.5200° N · 13.4050° E',
|
||||
},
|
||||
|
|
@ -3547,6 +3565,8 @@ const LANDING_UI_COPY_OVERRIDES: Partial<
|
|||
summary:
|
||||
'官方開源、本地優先的 Claude Design 替代方案。Apache-2.0,每一層都 BYOK。',
|
||||
catalog: '目錄',
|
||||
products: '產品',
|
||||
resources: '資源',
|
||||
official: '官方來源頁',
|
||||
quickstart: '快速開始',
|
||||
agents: 'Agent',
|
||||
|
|
@ -3558,7 +3578,11 @@ const LANDING_UI_COPY_OVERRIDES: Partial<
|
|||
contributors: '貢獻者',
|
||||
releases: '版本發布',
|
||||
discord: 'Discord',
|
||||
xTwitter: 'X / Twitter',
|
||||
rss: 'RSS',
|
||||
sisterProjects: '姊妹專案',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / 第 01 卷 / 第 26 期',
|
||||
bottomRight: '柏林 / 開放 / 地球 · 52.5200° N · 13.4050° E',
|
||||
},
|
||||
|
|
@ -3952,6 +3976,8 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
summary:
|
||||
'Claude Design の公式オープンソース、ローカル優先の代替。Apache-2.0、すべての層で BYOK。',
|
||||
catalog: 'カタログ',
|
||||
products: 'プロダクト',
|
||||
resources: 'リソース',
|
||||
official: '公式ソースページ',
|
||||
quickstart: 'クイックスタート',
|
||||
agents: 'Agent',
|
||||
|
|
@ -3966,11 +3992,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / 第 01 巻 / 第 26 号',
|
||||
bottomRight: 'ベルリン / オープン / 地球 · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: '姉妹プロジェクト',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
ko: {
|
||||
summary:
|
||||
'Claude Design의 공식 오픈소스, 로컬 우선 대안입니다. Apache-2.0, 모든 계층에서 BYOK.',
|
||||
catalog: '카탈로그',
|
||||
products: '제품',
|
||||
resources: '리소스',
|
||||
official: '공식 소스 페이지',
|
||||
quickstart: '빠른 시작',
|
||||
agents: 'Agent',
|
||||
|
|
@ -3985,11 +4017,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / 01권 / 26호',
|
||||
bottomRight: '베를린 / 오픈 / 지구 · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: '자매 프로젝트',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
de: {
|
||||
summary:
|
||||
'Die offizielle quelloffene, lokal zuerst gedachte Alternative zu Claude Design. Apache-2.0, BYOK auf jeder Ebene.',
|
||||
catalog: 'Katalog',
|
||||
products: 'Produkte',
|
||||
resources: 'Ressourcen',
|
||||
official: 'Offizielle Quellseite',
|
||||
quickstart: 'Schnellstart',
|
||||
agents: 'Agenten',
|
||||
|
|
@ -4004,11 +4042,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Band 01 / Ausgabe Nr. 26',
|
||||
bottomRight: 'Berlin / Offen / Erde · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Schwesterprojekte',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
fr: {
|
||||
summary:
|
||||
"L'alternative officielle open source et locale d'abord à Claude Design. Apache-2.0, BYOK à chaque couche.",
|
||||
catalog: 'Catalogue',
|
||||
products: 'Produits',
|
||||
resources: 'Ressources',
|
||||
official: 'Page source officielle',
|
||||
quickstart: 'Démarrage rapide',
|
||||
agents: 'Lokale agents',
|
||||
|
|
@ -4023,11 +4067,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Numéro 26',
|
||||
bottomRight: 'Berlin / Ouvert / Terre · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Projets sœurs',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
ru: {
|
||||
summary:
|
||||
'Официальная открытая и локально ориентированная альтернатива Claude Design. Apache-2.0, BYOK на каждом уровне.',
|
||||
catalog: 'Каталог',
|
||||
products: 'Продукты',
|
||||
resources: 'Ресурсы',
|
||||
official: 'Официальная страница источника',
|
||||
quickstart: 'Быстрый старт',
|
||||
agents: 'Агенты',
|
||||
|
|
@ -4042,11 +4092,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Том 01 / Выпуск № 26',
|
||||
bottomRight: 'Берлин / Открыто / Земля · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Родственные проекты',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
es: {
|
||||
summary:
|
||||
'La alternativa oficial de código abierto y local-first a Claude Design. Apache-2.0, BYOK en cada capa.',
|
||||
catalog: 'Catálogo',
|
||||
products: 'Productos',
|
||||
resources: 'Recursos',
|
||||
official: 'Página fuente oficial',
|
||||
quickstart: 'Inicio rápido',
|
||||
agents: 'Agentes',
|
||||
|
|
@ -4061,11 +4117,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volumen 01 / Número 26',
|
||||
bottomRight: 'Berlín / Abierto / Tierra · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Proyectos relacionados',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
'pt-br': {
|
||||
summary:
|
||||
'A alternativa oficial, de código aberto e local-first ao Claude Design. Apache-2.0, BYOK em todas as camadas.',
|
||||
catalog: 'Catálogo',
|
||||
products: 'Produtos',
|
||||
resources: 'Recursos',
|
||||
official: 'Página oficial de origem',
|
||||
quickstart: 'Início rápido',
|
||||
agents: 'Agentes',
|
||||
|
|
@ -4080,11 +4142,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Edição Nº 26',
|
||||
bottomRight: 'Berlim / Aberto / Terra · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Projetos irmãos',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
it: {
|
||||
summary:
|
||||
"L'alternativa ufficiale open source e locale-first a Claude Design. Apache-2.0, BYOK a ogni livello.",
|
||||
catalog: 'Catalogo',
|
||||
products: 'Prodotti',
|
||||
resources: 'Risorse',
|
||||
official: 'Pagina sorgente ufficiale',
|
||||
quickstart: 'Avvio rapido',
|
||||
agents: 'Agent',
|
||||
|
|
@ -4099,11 +4167,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Numero 26',
|
||||
bottomRight: 'Berlino / Aperto / Terra · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Progetti correlati',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
vi: {
|
||||
summary:
|
||||
'Lựa chọn chính thức, mã nguồn mở và ưu tiên cục bộ thay Claude Design. Apache-2.0, BYOK ở mọi lớp.',
|
||||
catalog: 'Danh mục',
|
||||
products: 'Sản phẩm',
|
||||
resources: 'Tài nguyên',
|
||||
official: 'Trang nguồn chính thức',
|
||||
quickstart: 'Bắt đầu nhanh',
|
||||
agents: 'Agent',
|
||||
|
|
@ -4118,11 +4192,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Tập 01 / Số 26',
|
||||
bottomRight: 'Berlin / Mở / Trái đất · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Dự án liên quan',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
pl: {
|
||||
summary:
|
||||
'Oficjalna, otwartoźródłowa i lokalna alternatywa dla Claude Design. Apache-2.0, BYOK na każdej warstwie.',
|
||||
catalog: 'Katalog',
|
||||
products: 'Produkty',
|
||||
resources: 'Zasoby',
|
||||
official: 'Oficjalna strona źródłowa',
|
||||
quickstart: 'Szybki start',
|
||||
agents: 'Agenci',
|
||||
|
|
@ -4137,11 +4217,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Tom 01 / Numer 26',
|
||||
bottomRight: 'Berlin / Otwarte / Ziemia · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Projekty siostrzane',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
id: {
|
||||
summary:
|
||||
'Alternatif resmi, sumber terbuka, dan mengutamakan lokal untuk Claude Design. Apache-2.0, BYOK di setiap lapisan.',
|
||||
catalog: 'Katalog',
|
||||
products: 'Produk',
|
||||
resources: 'Sumber daya',
|
||||
official: 'Halaman sumber resmi',
|
||||
quickstart: 'Mulai cepat',
|
||||
agents: 'Agent',
|
||||
|
|
@ -4156,11 +4242,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Edisi Nº 26',
|
||||
bottomRight: 'Berlin / Terbuka / Bumi · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Proyek terkait',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
nl: {
|
||||
summary:
|
||||
'Het officiële open-source en local-first alternatief voor Claude Design. Apache-2.0, BYOK in elke laag.',
|
||||
catalog: 'Catalogus',
|
||||
products: 'Producten',
|
||||
resources: 'Bronnen',
|
||||
official: 'Officiële bronpagina',
|
||||
quickstart: 'Snelstart',
|
||||
agents: 'Agents',
|
||||
|
|
@ -4175,11 +4267,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Volume 01 / Editie Nº 26',
|
||||
bottomRight: 'Berlijn / Open / Aarde · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'Zusterprojecten',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
ar: {
|
||||
summary:
|
||||
'البديل الرسمي مفتوح المصدر والمحلي أولاً لـ Claude Design. Apache-2.0 وBYOK في كل طبقة.',
|
||||
catalog: 'الفهرس',
|
||||
products: 'المنتجات',
|
||||
resources: 'الموارد',
|
||||
official: 'صفحة المصدر الرسمية',
|
||||
quickstart: 'البدء السريع',
|
||||
agents: 'الوكلاء',
|
||||
|
|
@ -4194,11 +4292,17 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
rss: 'RSS',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / المجلد 01 / العدد 26',
|
||||
bottomRight: 'برلين / مفتوح / الأرض · 52.5200° N · 13.4050° E',
|
||||
xTwitter: 'X / Twitter',
|
||||
sisterProjects: 'المشاريع الشقيقة',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
},
|
||||
tr: {
|
||||
summary:
|
||||
"Claude Design için resmi, açık kaynak ve yerel öncelikli alternatif. Apache-2.0, her katmanda BYOK.",
|
||||
catalog: 'Katalog',
|
||||
products: 'Ürünler',
|
||||
resources: 'Kaynaklar',
|
||||
official: 'Resmi kaynak sayfası',
|
||||
quickstart: 'Hızlı başlangıç',
|
||||
agents: 'Agentlar',
|
||||
|
|
@ -4210,7 +4314,11 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
contributors: 'Katkıda bulunanlar',
|
||||
releases: 'Sürümler',
|
||||
discord: 'Discord',
|
||||
xTwitter: 'X / Twitter',
|
||||
rss: 'RSS',
|
||||
sisterProjects: 'Kardeş projeler',
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Cilt 01 / Sayı Nº 26',
|
||||
bottomRight: 'Berlin / Açık / Dünya · 52.5200° N · 13.4050° E',
|
||||
},
|
||||
|
|
@ -4218,6 +4326,8 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
summary:
|
||||
'Офіційна відкрита та локально орієнтована альтернатива Claude Design. Apache-2.0, BYOK на кожному рівні.',
|
||||
catalog: 'Каталог',
|
||||
products: 'Продукти',
|
||||
resources: 'Ресурси',
|
||||
official: 'Офіційна сторінка джерела',
|
||||
quickstart: 'Швидкий старт',
|
||||
agents: 'Агенти',
|
||||
|
|
@ -4229,7 +4339,11 @@ const LOCALIZED_LANDING_FOOTER_COPY: Partial<
|
|||
contributors: 'Учасники',
|
||||
releases: 'Релізи',
|
||||
discord: 'Discord',
|
||||
xTwitter: 'X / Twitter',
|
||||
rss: 'RSS',
|
||||
sisterProjects: "Пов'язані проєкти",
|
||||
htmlAnything: 'HTML Anything',
|
||||
nexuIo: 'nexu.io',
|
||||
bottomLeft: '● Open Design · Apache-2.0 · 2026 / Том 01 / Випуск № 26',
|
||||
bottomRight: 'Берлін / Відкрито / Земля · 52.5200° N · 13.4050° E',
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1035,10 +1035,18 @@ body.sub-page {
|
|||
}
|
||||
.sub-footer-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.6fr 1fr 1fr 1fr;
|
||||
gap: 48px;
|
||||
grid-template-columns: 1.4fr 1fr 1fr 1fr 1fr;
|
||||
gap: 40px;
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
@media (max-width: 1080px) {
|
||||
/* At medium widths, drop to a 3-column grid (brand + two columns
|
||||
per row, since `.sub-footer-brand` carries no `grid-column` span)
|
||||
so no column collapses to a single line of unrecognizable text.
|
||||
With 5 children that flows as: row 1 = brand · Products · Plugins,
|
||||
row 2 = Resources · Connect · empty cell. */
|
||||
.sub-footer-grid { grid-template-columns: 1.6fr repeat(2, 1fr); }
|
||||
}
|
||||
.sub-footer-brand .brand {
|
||||
text-decoration: none;
|
||||
color: var(--ink);
|
||||
|
|
|
|||
Loading…
Reference in a new issue