@nebutra/brand 2.0.0 → 3.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/metadata.ts","../src/metadata-helpers.ts","../src/components/Logo.tsx","../src/components/LogoSVG.tsx","../src/guidelines/color.ts","../src/guidelines/logo.ts","../src/guidelines/index.ts","../src/easter-egg-registry.json","../src/microcopy.ts","../src/motion.ts","../src/positioning.ts"],"sourcesContent":["/**\n * Nebutra Brand Metadata\n * Central source of truth for brand identity\n *\n * AUTO-GENERATED by `pnpm brand:apply` from `scripts/brand-types.ts`\n * (DEFAULT_BRAND) or a sibling `brand.config.ts` if present. Do NOT\n * edit by hand — your edits will be wiped on the next brand:apply.\n *\n * To rebrand, edit DEFAULT_BRAND in scripts/brand-types.ts and run\n * `pnpm brand:apply`. To extend the shape, add a field to BrandConfig,\n * set its value in DEFAULT_BRAND, then read it from this writer.\n *\n * Pipeline guard: tests/architecture/brand-metadata-drift.test.ts\n * asserts `metadata.ts` is byte-identical to what brand:apply emits.\n */\n\nexport const brand = {\n name: \"Nebutra\",\n nameCn: \"云毓智能\",\n nameFull: \"无锡云毓智能科技有限公司\",\n nameFullEn: \"Wuxi Nebutra Intelligence Technology Co., Ltd.\",\n\n tagline: \"Ship AI products, not boilerplate.\",\n taglineCn: \"AI原生·快速出海·即刻交付\",\n description:\n \"Production-ready Next.js monorepo template for AI SaaS products. Auth, billing, multi-tenancy, AI services, design system, and enterprise infrastructure — pre-configured.\",\n descriptionCn:\n \"面向AI创业者的一体化SaaS基础设施模板,覆盖认证、计费、多租户、AI服务与设计系统,开箱即产品\",\n\n story: {\n concept:\n \"Logo以首字母N的基础造型概念为主要设计框架,通过几何正负空间构建隐形'N',形成近似六边形的稳定结构\",\n colorMeaning: \"蓝绿渐变体现未来感与科技锋芒,'云'代表云端平台,'毓'寓意孕育与转化\",\n values: [\"AI Native\", \"Ship Fast\", \"Open by Default\", \"Global-Ready\", \"Enterprise-Grade\"],\n missionStatement:\n \"Help AI founders and SaaS teams go from idea to production 10x faster by providing the infrastructure layer they shouldn't have to build.\",\n },\n\n domains: {\n landing: \"nebutra.com\",\n app: \"app.nebutra.com\",\n api: \"api.nebutra.com\",\n auth: \"auth.nebutra.com\",\n sso: \"sso.nebutra.com\",\n docs: \"docs.nebutra.com\",\n studio: \"studio.nebutra.com\",\n cdn: \"cdn.nebutra.com\",\n router: \"router.nebutra.com\",\n forge: \"forge.nebutra.com\",\n design: \"design.nebutra.com\",\n status: \"status.nebutra.com\",\n open: \"open.nebutra.com\",\n admin: \"admin.nebutra.com\",\n analytics: \"analytics.nebutra.com\",\n pebble: \"pebble.nebutra.com\",\n carina: \"carina.nebutra.com\",\n kuanlan: \"kuanlan.nebutra.com\",\n origin: \"origin.nebutra.com\",\n },\n\n social: {\n twitter: \"https://twitter.com/nebutra\",\n github: \"https://github.com/nebutra\",\n discord: \"https://discord.gg/nebutra\",\n linkedin: \"https://linkedin.com/company/nebutra\",\n },\n} as const;\n\n/**\n * Brand Colors — full VI palette + brand gradients + semantic colors.\n * Aligned with @nebutra/design-tokens DTCG SSOT (tokens/core.json).\n */\nexport const colors = {\n primary: {\n \"50\": \"#f0f4ff\",\n \"100\": \"#dbe4ff\",\n \"200\": \"#bac8ff\",\n \"300\": \"#91a7ff\",\n \"400\": \"#5c7cfa\",\n \"500\": \"#0033FE\",\n \"600\": \"#002ad4\",\n \"700\": \"#0021ab\",\n \"800\": \"#001882\",\n \"900\": \"#000f59\",\n \"950\": \"#000830\",\n },\n accent: {\n \"50\": \"#e6fff8\",\n \"100\": \"#b3ffec\",\n \"200\": \"#80ffe0\",\n \"300\": \"#4dfcd4\",\n \"400\": \"#1af7c8\",\n \"500\": \"#0BF1C3\",\n \"600\": \"#09c9a3\",\n \"700\": \"#07a183\",\n \"800\": \"#057963\",\n \"900\": \"#035143\",\n \"950\": \"#012923\",\n },\n neutral: {\n \"0\": \"#ffffff\",\n \"50\": \"#f8fafc\",\n \"100\": \"#f1f5f9\",\n \"200\": \"#e2e8f0\",\n \"300\": \"#cbd5e1\",\n \"400\": \"#94a3b8\",\n \"500\": \"#64748b\",\n \"600\": \"#475569\",\n \"700\": \"#334155\",\n \"800\": \"#1e293b\",\n \"900\": \"#0f172a\",\n \"950\": \"#020617\",\n },\n white: \"#FFFFFF\",\n black: \"#000000\",\n gradient: {\n primary: \"linear-gradient(135deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n primaryReverse: \"linear-gradient(135deg, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n primaryVertical: \"linear-gradient(180deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n primaryRadial: \"radial-gradient(circle, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n },\n p3Overrides: {\n primary500: \"color(display-p3 0.03 0.19 0.99)\",\n accent500: \"color(display-p3 0.07 0.94 0.79)\",\n },\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#0033FE\",\n} as const;\n\n/**\n * Typography — \"Precision Stack\" (Geist + Noto Sans SC + Geist Mono).\n */\nexport const typography = {\n fontFamily: {\n en: '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n cn: '\"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n sans: '\"Geist\", \"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n display: '\"Geist\", \"Noto Sans SC\", sans-serif',\n heading: '\"Geist\", \"Noto Sans SC\", sans-serif',\n brandPrint: '\"Noto Sans SC\", \"PingFang SC\", sans-serif',\n },\n cssVars: {\n sans: \"var(--font-geist-sans)\",\n mono: \"var(--font-geist-mono)\",\n cnSans: \"var(--font-noto-sc)\",\n },\n fontWeight: {\n thin: 100,\n extraLight: 200,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extraBold: 800,\n black: 900,\n },\n letterSpacing: {\n display: \"-0.04em\",\n heading: \"-0.03em\",\n subheading: \"-0.02em\",\n body: \"0em\",\n caption: \"0.01em\",\n mono: \"0em\",\n },\n lineHeight: {\n none: 1,\n tight: 1.2,\n snug: 1.4,\n normal: 1.6,\n relaxed: 1.75,\n loose: 2,\n },\n} as const;\n\n/**\n * Logo asset paths (relative to package), dual-edition structure:\n * - classic (v1.0): preferred for UX / product surfaces\n * - compliant (v2.0): required for commercial / legal contexts\n */\nexport const logoAssets = {\n classic: {\n default: \"assets/logo/logo-color.svg\",\n color: \"assets/logo/logo-color.svg\",\n inverse: \"assets/logo/logo-inverse.svg\",\n mono: \"assets/logo/logo-mono.svg\",\n en: \"assets/logo/logo-en.svg\",\n zh: \"assets/logo/logo-zh.svg\",\n zhEn: \"assets/logo/logo-zh-en.svg\",\n horizontalEn: \"assets/logo/logo-horizontal-en.svg\",\n horizontalZh: \"assets/logo/logo-horizontal-zh.svg\",\n verticalEn: \"assets/logo/logo-vertical-en.svg\",\n verticalZh: \"assets/logo/logo-vertical-zh.svg\",\n },\n compliant: {\n default: \"assets/logo-compliant/logo-color.svg\",\n color: \"assets/logo-compliant/logo-color.svg\",\n inverse: \"assets/logo-compliant/logo-inverse.svg\",\n mono: \"assets/logo-compliant/logo-mono.svg\",\n en: \"assets/logo-compliant/logo-en.svg\",\n zh: \"assets/logo-compliant/logo-zh.svg\",\n zhEn: \"assets/logo-compliant/logo-zh-en.svg\",\n horizontalEn: \"assets/logo-compliant/logo-horizontal-en.svg\",\n horizontalZh: \"assets/logo-compliant/logo-horizontal-zh.svg\",\n verticalEn: \"assets/logo-compliant/logo-vertical-en.svg\",\n verticalZh: \"assets/logo-compliant/logo-vertical-zh.svg\",\n horizontalEnMono: \"assets/logo-compliant/logo-horizontal-en-mono.svg\",\n horizontalZhMono: \"assets/logo-compliant/logo-horizontal-zh-mono.svg\",\n verticalEnMono: \"assets/logo-compliant/logo-vertical-en-mono.svg\",\n verticalZhMono: \"assets/logo-compliant/logo-vertical-zh-mono.svg\",\n },\n} as const;\n\n/**\n * Font asset paths (relative to package).\n */\nexport const fontAssets = {\n poppins: {\n thin: \"assets/fonts/poppins/Poppins-Thin.otf\",\n thinItalic: \"assets/fonts/poppins/Poppins-ThinItalic.otf\",\n extraLight: \"assets/fonts/poppins/Poppins-ExtraLight.otf\",\n extraLightItalic: \"assets/fonts/poppins/Poppins-ExtraLightItalic.otf\",\n light: \"assets/fonts/poppins/Poppins-Light.otf\",\n lightItalic: \"assets/fonts/poppins/Poppins-LightItalic.otf\",\n regular: \"assets/fonts/poppins/Poppins-Regular.otf\",\n italic: \"assets/fonts/poppins/Poppins-Italic.otf\",\n medium: \"assets/fonts/poppins/Poppins-Medium.otf\",\n mediumItalic: \"assets/fonts/poppins/Poppins-MediumItalic.otf\",\n semiBold: \"assets/fonts/poppins/Poppins-SemiBold.otf\",\n semiBoldItalic: \"assets/fonts/poppins/Poppins-SemiBoldItalic.otf\",\n bold: \"assets/fonts/poppins/Poppins-Bold.otf\",\n boldItalic: \"assets/fonts/poppins/Poppins-BoldItalic.otf\",\n extraBold: \"assets/fonts/poppins/Poppins-ExtraBold.otf\",\n extraBoldItalic: \"assets/fonts/poppins/Poppins-ExtraBoldItalic.otf\",\n black: \"assets/fonts/poppins/Poppins-Black.otf\",\n blackItalic: \"assets/fonts/poppins/Poppins-BlackItalic.otf\",\n },\n} as const;\n\n/**\n * Favicon assets.\n */\nexport const faviconAssets = {\n ico: \"assets/favicon/favicon.ico\",\n svg: \"assets/favicon/favicon.svg\",\n apple: \"assets/favicon/apple-touch-icon.png\",\n android192: \"assets/favicon/android-chrome-192x192.png\",\n android512: \"assets/favicon/android-chrome-512x512.png\",\n} as const;\n\n/**\n * OG Image dimensions.\n */\nexport const ogImageDimensions = {\n default: {\n width: 1200,\n height: 630,\n },\n twitter: {\n width: 1200,\n height: 600,\n },\n square: {\n width: 1200,\n height: 1200,\n },\n} as const;\n\nexport type BrandColors = typeof colors;\nexport type BrandTypography = typeof typography;\nexport type LogoAssets = typeof logoAssets;\n","/**\n * @nebutra/brand — metadata-helpers\n *\n * Pure functions deriving Next.js Metadata, JSON-LD objects, PWA manifest,\n * and feed channel headers from the single `brand` + `colors` SSOT.\n *\n * Zero hardcoded brand-name literals — every string is derived from `brand`\n * or `colors`. The arch drift guard `tests/architecture/brand-metadata-drift.test.ts`\n * asserts this invariant at CI time.\n *\n * NOTE: `next` is a TYPE-ONLY import here. The package declares `next` as an\n * optional peer dep + devDep (catalog:). skipLibCheck:true is set in tsconfig.json.\n * Adding `import \"server-only\"` is intentionally omitted: this file is consumed\n * by both server and client render paths in tests; the CALLER must enforce\n * server-only boundaries if needed.\n *\n * NOTE: getSiteUrl(service) in this module is DISTINCT from the zero-param\n * getSiteUrl() in apps/landing/src/lib/seo/site-routes.ts — different\n * modules, no collision. The local one remains the landing URL util.\n */\n\nimport type { Metadata, MetadataRoute } from \"next\";\nimport { brand, colors } from \"./metadata\";\n\n/** Services that have a canonical domain in brand.domains */\nexport type BrandService = keyof typeof brand.domains;\n\n/** Absolute origin from brand.domains only (no env hijack). */\nexport function getBrandOrigin(service: BrandService): string {\n const host = brand.domains[service];\n if (!host?.trim()) {\n throw new Error(`brand.domains.${String(service)} is empty — run brand:apply`);\n }\n return `https://${host.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\")}`;\n}\n\n/**\n * Public object on `nebutra-assets` via `cdn.nebutra.com`.\n * R2_PUBLIC_URL / NEXT_PUBLIC_R2_PUBLIC_URL may override the origin for dogfood.\n */\nexport function publicAssetUrl(key: string, base?: string): string {\n const origin = (\n base ||\n process.env.NEXT_PUBLIC_R2_PUBLIC_URL ||\n process.env.R2_PUBLIC_URL ||\n getBrandOrigin(\"cdn\")\n ).replace(/\\/+$/, \"\");\n const path = key.replace(/^\\/+/, \"\");\n if (!path || path.includes(\"..\") || path.includes(\"\\\\\")) {\n throw new Error(\"invalid_public_asset_key\");\n }\n return `${origin}/${path}`;\n}\n\n/**\n * Bare query flag that keeps a signed-in visitor on the marketing homepage\n * (`?home`, no value). Apex `/` without it is a product launcher.\n */\nexport const MARKETING_HOME_PARAM = \"home\";\n\n/**\n * Marketing homepage path. Always includes the `?home` skip — that is the\n * only signal landing honours. `getBrandOrigin(\"landing\")` is the launcher.\n *\n * `defaultLocale` is the landing path locale that lives on `/` (today `en`).\n * Pass it from `@nebutra/i18n` so brand does not import the i18n package.\n */\nexport function getMarketingHomePath(options?: {\n locale?: string;\n defaultLocale?: string;\n}): string {\n const defaultLocale = options?.defaultLocale?.trim() || \"en\";\n const locale = options?.locale?.trim();\n const path = locale && locale !== defaultLocale ? `/${locale}` : \"/\";\n return path === \"/\" ? `/?${MARKETING_HOME_PARAM}` : `${path}?${MARKETING_HOME_PARAM}`;\n}\n\n/** Absolute marketing homepage. Same contract as `getMarketingHomePath`. */\nexport function getMarketingHomeUrl(options?: { locale?: string; defaultLocale?: string }): string {\n const origin = getBrandOrigin(\"landing\");\n return new URL(getMarketingHomePath(options), `${origin}/`).toString();\n}\n\n/** Cookie parent domain from landing apex (e.g. `.example.com`). */\nexport function getBrandCookieDomain(): string {\n const apex = brand.domains.landing.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n if (!apex) return \"\";\n return apex.startsWith(\".\") ? apex : `.${apex}`;\n}\n\n/**\n * Canonical base URL. NEXT_PUBLIC_SITE_URL only overrides landing.\n */\nexport function getSiteUrl(service: BrandService = \"landing\"): string {\n if (service === \"landing\") {\n const envUrl = process.env[\"NEXT_PUBLIC_SITE_URL\"];\n if (envUrl && envUrl.trim() !== \"\") {\n return envUrl.trim().replace(/\\/+$/, \"\");\n }\n }\n return getBrandOrigin(service);\n}\n\n/** Production multi-app public URL map (dogfood brand.domains). */\nexport function getBrandPublicUrls() {\n return {\n siteUrl: getBrandOrigin(\"landing\"),\n appUrl: getBrandOrigin(\"app\"),\n apiUrl: getBrandOrigin(\"api\"),\n authUrl: getBrandOrigin(\"auth\"),\n ssoUrl: getBrandOrigin(\"sso\"),\n docsUrl: getBrandOrigin(\"docs\"),\n routerUrl: getBrandOrigin(\"router\"),\n forgeUrl: getBrandOrigin(\"forge\"),\n designUrl: getBrandOrigin(\"design\"),\n statusUrl: getBrandOrigin(\"status\"),\n openUrl: getBrandOrigin(\"open\"),\n studioUrl: getBrandOrigin(\"studio\"),\n cdnUrl: getBrandOrigin(\"cdn\"),\n analyticsUrl: getBrandOrigin(\"analytics\"),\n pebbleUrl: getBrandOrigin(\"pebble\"),\n carinaUrl: getBrandOrigin(\"carina\"),\n cookieDomain: getBrandCookieDomain(),\n } as const;\n}\n\n/**\n * Product mailbox derived from landing apex — rebrand-safe.\n * e.g. getBrandEmail(\"contact\") → contact@example.com\n */\nexport function getBrandEmail(localPart: string): string {\n const apex = brand.domains.landing\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\")\n .replace(/^www\\./, \"\");\n if (!apex) {\n throw new Error(\"brand.domains.landing is empty — run brand:apply\");\n }\n const local = localPart.trim().replace(/@.*$/, \"\");\n if (!local) {\n throw new Error(\"getBrandEmail requires a non-empty local part\");\n }\n return `${local}@${apex}`;\n}\n\n/** Default transactional From header: `Brand <noreply@apex>`. */\nexport function getBrandMailFrom(): string {\n return `${brand.name} <${getBrandEmail(\"noreply\")}>`;\n}\n\n// ─── Metadata ────────────────────────────────────────────────────────────────\n\nexport interface SiteMetadataOptions {\n readonly service: BrandService;\n readonly title?: string;\n readonly description?: string;\n}\n\n/**\n * Returns a partial Next.js Metadata object suitable for spreading into a\n * layout.tsx export const metadata. Callers may override any field.\n */\nexport function getSiteMetadata(opts: SiteMetadataOptions): Metadata {\n const siteUrl = getSiteUrl(opts.service);\n const title = opts.title ?? brand.name;\n const description = opts.description ?? brand.tagline;\n\n return {\n applicationName: brand.name,\n title: {\n default: title,\n template: `%s — ${brand.name}`,\n },\n description,\n metadataBase: new URL(siteUrl),\n authors: [{ name: brand.name, url: siteUrl }],\n creator: brand.name,\n publisher: brand.name,\n openGraph: {\n type: \"website\",\n siteName: brand.name,\n title,\n description,\n url: siteUrl,\n },\n twitter: {\n card: \"summary_large_image\",\n site: brand.social.twitter.replace(\"https://twitter.com/\", \"@\"),\n title,\n description,\n },\n };\n}\n\n// ─── JSON-LD types ─────────────────────────────────────────────────────────────\n\nexport interface OrganizationJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"Organization\";\n \"@id\": string;\n name: string;\n alternateName: string;\n url: string;\n sameAs: string[];\n [key: string]: unknown;\n}\n\nexport interface WebSiteJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"WebSite\";\n \"@id\": string;\n name: string;\n url: string;\n description: string;\n publisher: { \"@id\": string };\n inLanguage: string[];\n [key: string]: unknown;\n}\n\nexport interface SoftwareApplicationJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"SoftwareApplication\";\n name: string;\n applicationCategory: string;\n url: string;\n author: { \"@id\": string };\n [key: string]: unknown;\n}\n\nexport interface FeedChannelMeta {\n title: string;\n link: string;\n description: string;\n feedUrl: string;\n language: string;\n}\n\n// ─── JSON-LD builders ────────────────────────────────────────────────────────\n\n/**\n * Base Organization JSON-LD — company-specific fields\n * (foundingDate, address, contactPoint) are intentionally omitted here.\n * Merge them at the call site to avoid hard-coding values here.\n */\nexport function buildOrganizationJsonLd(): OrganizationJsonLd {\n const siteUrl = getSiteUrl(\"landing\");\n const id = `${siteUrl}/#organization`;\n\n const sameAs = [\n brand.social.github,\n brand.social.twitter.replace(\"https://twitter.com/\", \"https://x.com/\"),\n brand.social.linkedin,\n brand.social.discord,\n ].filter((url) => url.trim() !== \"\");\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n \"@id\": id,\n name: brand.name,\n alternateName: brand.nameCn,\n url: siteUrl,\n sameAs,\n };\n}\n\nexport function buildWebSiteJsonLd(): WebSiteJsonLd {\n const siteUrl = getSiteUrl(\"landing\");\n const org = buildOrganizationJsonLd();\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"@id\": `${siteUrl}/#website`,\n name: brand.name,\n url: siteUrl,\n description: brand.tagline,\n publisher: { \"@id\": org[\"@id\"] },\n inLanguage: [\"en\", \"zh\"],\n };\n}\n\nexport function buildSoftwareApplicationJsonLd(): SoftwareApplicationJsonLd {\n const org = buildOrganizationJsonLd();\n const githubPath = brand.social.github.replace(\"https://github.com/\", \"\");\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"SoftwareApplication\",\n name: `${brand.name} Sailor`,\n applicationCategory: \"DeveloperApplication\",\n url: `https://github.com/${githubPath}`,\n author: { \"@id\": org[\"@id\"] },\n };\n}\n\n// ─── PWA Manifest ────────────────────────────────────────────────────────────\n\n/**\n * Returns a base PWA manifest derived from brand + colors.\n * background_color and theme_color use the palette's canonical hex values\n * (NOT CSS variables — service workers do not resolve var()).\n *\n * CONTRAST CAVEAT: theme_color = colors.primary[\"500\"] assumes a dark\n * background context. If a rebrand sets a light primary, update this value.\n */\nexport function buildPwaManifest(): MetadataRoute.Manifest {\n return {\n name: `${brand.name} — ${brand.tagline}`,\n short_name: brand.name,\n description: brand.description,\n start_url: \"/\",\n display: \"standalone\",\n background_color: colors.neutral[\"950\"],\n theme_color: colors.primary[\"500\"],\n orientation: \"portrait-primary\",\n scope: \"/\",\n lang: \"en\",\n categories: [\"business\", \"productivity\", \"utilities\"],\n icons: [\n {\n src: \"/favicon.ico\",\n sizes: \"any\",\n type: \"image/x-icon\",\n },\n {\n src: \"/android-chrome-192x192.png\",\n sizes: \"192x192\",\n type: \"image/png\",\n purpose: \"maskable\",\n },\n {\n src: \"/android-chrome-512x512.png\",\n sizes: \"512x512\",\n type: \"image/png\",\n purpose: \"maskable\",\n },\n {\n src: \"/android-chrome-192x192.png\",\n sizes: \"192x192\",\n type: \"image/png\",\n purpose: \"any\",\n },\n {\n src: \"/android-chrome-512x512.png\",\n sizes: \"512x512\",\n type: \"image/png\",\n purpose: \"any\",\n },\n ],\n };\n}\n\n// ─── Feed ────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the shared channel-level fields for RSS and Atom feeds.\n * Item-level links are built at the call site using the version string.\n */\nexport function buildFeedChannelMeta(): FeedChannelMeta {\n const siteUrl = getSiteUrl(\"landing\");\n\n return {\n title: `${brand.name} Changelog`,\n link: `${siteUrl}/changelog`,\n description: brand.tagline,\n feedUrl: `${siteUrl}/api/changelog`,\n language: \"en-us\",\n };\n}\n","\"use client\";\n\nimport { brand } from \"../metadata\";\nimport { publicAssetUrl } from \"../metadata-helpers\";\n\nexport type LogoVariant =\n | \"color\"\n | \"inverse\"\n | \"mono\"\n | \"en\"\n | \"zh\"\n | \"zh-en\"\n | \"horizontal-en\"\n | \"horizontal-zh\"\n | \"vertical-en\"\n | \"vertical-zh\"\n | \"horizontal-en-mono\"\n | \"horizontal-zh-mono\"\n | \"vertical-en-mono\"\n | \"vertical-zh-mono\";\n\n/**\n * Logo edition: classic (v1.0) or compliant (v2.0)\n *\n * - classic: 经典版,\"毓\"字更美观,用于用户体验场景 (App/网站/产品)\n * - compliant: 合规版,\"毓\"字符合商标规范,用于商务场景 (法律/商标/正式文件)\n */\nexport type LogoEdition = \"classic\" | \"compliant\";\n\n/** Variants that only exist in the compliant edition */\nconst COMPLIANT_ONLY_VARIANTS: ReadonlySet<LogoVariant> = new Set([\n \"horizontal-en-mono\",\n \"horizontal-zh-mono\",\n \"vertical-en-mono\",\n \"vertical-zh-mono\",\n]);\n\nexport interface LogoProps {\n /**\n * Logo variant\n * @default \"en\" (Nebutra with English wordmark)\n */\n variant?: LogoVariant;\n\n /**\n * Logo edition\n * - \"classic\" (default): v1.0 经典版,更美观\n * - \"compliant\": v2.0 合规版,符合商标规范\n *\n * Mono combination variants automatically use compliant edition.\n * @default \"classic\"\n */\n edition?: LogoEdition;\n\n /**\n * Logo size (width in pixels)\n * @default 120\n */\n size?: number;\n\n /**\n * Custom className\n */\n className?: string;\n\n /**\n * Invert colors for dark backgrounds.\n * When true, black becomes white (useful for dark mode).\n *\n * Note: For pure white logomark, use variant=\"inverse\" instead.\n */\n inverted?: boolean;\n}\n\n/**\n * Resolve the CDN object for a logo variant + edition combination.\n * Mono combination variants always route to the compliant directory.\n * `public/` copies from `pnpm brand:sync` stay as seed, not consumption.\n */\nexport function logoPublicSrc(variant: LogoVariant, edition: LogoEdition): string {\n const dir =\n edition === \"compliant\" || COMPLIANT_ONLY_VARIANTS.has(variant)\n ? \"brand/logo-compliant\"\n : \"brand/logo\";\n return publicAssetUrl(`${dir}/logo-${variant}.svg`);\n}\n\n/**\n * Aspect ratios for different logo variants\n * width:height ratio (e.g. 5.25 means width is 5.25x height)\n */\nconst ASPECT_RATIOS: Record<LogoVariant, number> = {\n color: 1.07, // 535.71 x 500 ≈ 1.07\n inverse: 1.07, // 535.71 x 500 ≈ 1.07\n mono: 1.07, // Same as color/inverse\n en: 5.25, // 544.21 x 103.74 ≈ 5.25 (horizontal text)\n zh: 3.5, // Estimated for Chinese wordmark\n \"zh-en\": 4.0, // Estimated for bilingual\n \"horizontal-en\": 5.25, // Similar to \"en\"\n \"horizontal-zh\": 4.5, // Estimated\n \"vertical-en\": 0.8, // Taller than wide\n \"vertical-zh\": 0.8, // Taller than wide\n \"horizontal-en-mono\": 5.25, // Same as horizontal-en\n \"horizontal-zh-mono\": 4.5, // Same as horizontal-zh\n \"vertical-en-mono\": 0.8, // Same as vertical-en\n \"vertical-zh-mono\": 0.8, // Same as vertical-zh\n};\n\n/**\n * Nebutra Logo Component\n *\n * Renders the official Nebutra brand logo from SVG assets (fixed VI fills).\n * Browser src is `https://cdn.nebutra.com/brand/logo{,-compliant}/…`.\n * `pnpm brand:sync` still copies seed files into each app `public/`.\n *\n * For product chrome that must recolor with Brand Package skins (roles.brand),\n * prefer LogomarkSVG / LogoEnSVG with default `text-brand-mark` instead of\n * raster VI color SVGs or `text-primary` (CTA / roles.action).\n *\n * @example\n * ```tsx\n * // Logomark only (square icon)\n * <Logo variant=\"inverse\" size={40} />\n *\n * // Full logo with English wordmark\n * <Logo variant=\"en\" size={150} />\n *\n * // Chinese wordmark\n * <Logo variant=\"zh\" size={120} />\n * ```\n */\nexport function Logo({\n variant = \"en\",\n edition = \"classic\",\n size = 120,\n className,\n inverted = false,\n}: LogoProps) {\n const aspectRatio = ASPECT_RATIOS[variant];\n const height = Math.round(size / aspectRatio);\n const src = logoPublicSrc(variant, edition);\n\n // For dark backgrounds, invert black to white\n const filterStyle = inverted ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={height}\n className={className}\n style={{ width: size, height, ...filterStyle }}\n />\n );\n}\n\n/**\n * Logomark only (the abstract icon without text)\n *\n * This uses the \"color\" or \"inverse\" variant which is just the icon.\n *\n * @example\n * ```tsx\n * <Logomark variant=\"inverse\" size={32} />\n * ```\n */\nexport function Logomark({\n size = 32,\n className,\n variant = \"color\",\n edition = \"classic\",\n inverted = false,\n}: {\n size?: number;\n className?: string;\n variant?: \"color\" | \"inverse\" | \"mono\";\n edition?: LogoEdition;\n inverted?: boolean;\n}) {\n const src = logoPublicSrc(variant, edition);\n\n // For dark backgrounds, invert black to white (unless using \"inverse\" variant which is already white)\n const filterStyle =\n inverted && variant !== \"inverse\" ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={size}\n className={className}\n style={{ width: size, height: size, ...filterStyle }}\n />\n );\n}\n\n/**\n * Wordmark only (text \"Nebutra\" without the icon)\n *\n * Uses the \"en\" variant which has the full wordmark.\n * For icon + text, use Logo with variant=\"en\".\n */\nexport function Wordmark({\n size = 100,\n className,\n variant = \"en\",\n edition = \"classic\",\n inverted = false,\n}: {\n size?: number;\n className?: string;\n variant?: \"en\" | \"zh\" | \"zh-en\";\n edition?: LogoEdition;\n inverted?: boolean;\n}) {\n const aspectRatio = ASPECT_RATIOS[variant];\n const height = Math.round(size / aspectRatio);\n const src = logoPublicSrc(variant, edition);\n\n const filterStyle = inverted ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={height}\n className={className}\n style={{ width: size, height, ...filterStyle }}\n />\n );\n}\n\nexport default Logo;\n","/**\n * Inline SVG Logo Components\n *\n * These components render SVG paths directly in JSX (no <img> tag, no public folder).\n *\n * ## Asset taxonomy (do not conflate)\n *\n * | Kind | What it is | Use |\n * |------|------------|-----|\n * | **正标 multi-path** | Illustrator export: real facet paths + true gradients (`logo-color.svg`, `logo-horizontal-en.svg`) | Light / print-faithful color |\n * | **Mono path** | Single `LOGOMARK_PATH` + `currentColor` (`LogomarkSVG`, `LogoEnSVG`) | Dark inverse, themed chrome |\n * | **LogoEnColorSVG** | Mono path painted with a fake linearGradient + baked `#060307` wordmark | **Avoid for nav** — not VI 正标 |\n *\n * ## Product chrome: 图形 / 文字 must be decoupled\n *\n * Swapping one baked horizontal SVG (light) for one mono composite (dark) locks\n * mark fills to the wordmark and fails \"文字 logo 解耦\". Preferred pattern:\n *\n * ```tsx\n * // Light: official multi-path color MARK only\n * <Image src={logoColor} className=\"h-6 w-auto dark:hidden\" unoptimized alt=\"\" />\n * // Dark: mono MARK\n * <LogomarkSVG className=\"hidden h-6 w-6 !text-white dark:block\" />\n * // BOTH themes: independent WORDMARK (currentColor)\n * <WordmarkEnSVG className=\"h-4.5 w-auto !text-[var(--neutral-12)] dark:!text-white\" />\n * ```\n *\n * Reference implementation: `apps/sailor-docs/src/app/[lang]/layout.tsx` nav title.\n *\n * **Mono** (`LogoEnSVG` / `LogomarkSVG` / `WordmarkEnSVG`): fill=\"currentColor\".\n * Default class injects `text-brand-mark`; override with `!text-*` when needed.\n *\n * Source assets: packages/design/brand/assets/logo/\n */\n\n/** Default logo fill = brand-mark (not product CTA primary). */\nconst LOGO_MARK_CLASS = \"text-brand-mark\";\n\n/** className last so callers can override color (e.g. dark:!text-white). */\nfunction mergeLogoClass(className?: string): string {\n return className ? `${LOGO_MARK_CLASS} ${className}` : LOGO_MARK_CLASS;\n}\n\ninterface SVGProps {\n className?: string;\n width?: number;\n height?: number;\n \"aria-label\"?: string;\n}\n\n// ─── Logomark (hexagonal N icon) ──────────────────────────────────────────────\n// Source: assets/logo/logo-inverse.svg viewBox=\"0 0 535.71 500\"\n\nconst LOGOMARK_PATH =\n \"M518.13,184.13c-12.15-21.05-29.76-37.95-50.42-49.37c0.53-23.73-5.29-47.58-17.52-68.75l-0.14-0.25\" +\n \"c-22.88-39.63-65.11-64.6-110.74-65.72C338.93,0.02,338.55,0,338.17,0h-1.77h-0.25H199.87c-46.89,0-90.58,25.23-114.02,65.83\" +\n \"L17.58,184.07c-23.45,40.61-23.45,91.06,0,131.66C29.74,336.78,47.34,353.69,68,365.1c-0.56,23.78,5.28,47.68,17.53,68.91l0.13,0.22\" +\n \"c23.37,40.48,66.92,65.68,113.66,65.77c0.09,0,0.17,0,0.26,0c1.86,0,3.71-0.05,5.56-0.13h130.7c46.89,0,90.58-25.23,114.02-65.83\" +\n \"l68.26-118.24C541.58,275.19,541.58,224.74,518.13,184.13z M279.32,473.01c13.65-10.39,25.34-23.48,34.17-38.76l102.56-177.57\" +\n \"l34.14-59.1c6.16-10.67,10.69-22.03,13.61-33.7c12.53,8.68,23.24,20.09,31.08,33.68c18.66,32.33,18.66,72.49,0,104.81l-68.26,118.24\" +\n \"c-18.66,32.33-53.44,52.41-90.77,52.41H279.32z M108.77,420.56c-7.92-13.72-12.46-28.85-13.65-44.2c-0.24-3.1-0.34-6.22-0.31-9.33\" +\n \"c8.79,8.47,20.26,13.61,32.79,14.47c1.24,0.09,2.5,0.13,3.76,0.13h75.97l60.51-104.81l18.47,31.99l4.01,6.95\" +\n \"c1.21,2.09,2.54,4.08,3.98,5.95c2.87,3.73,6.17,7.01,9.82,9.79c8.89,6.78,19.83,10.58,31.54,10.68l-45.42,78.64\" +\n \"c-14.76,25.56-39.6,43.43-67.81,49.78c-5.54,1.25-11.21,2.05-16.97,2.37c-1.95,0.11-3.91,0.18-5.88,0.18c-0.07,0-0.14,0-0.21,0\" +\n \"c-3.13-0.01-6.24-0.17-9.33-0.45c-33.59-3.1-64.1-22.39-81.14-51.92L108.77,420.56z M199.87,26.85h56.7\" +\n \"c-13.72,10.41-25.48,23.55-34.35,38.9l-67.45,116.78c-0.34,0.54-0.67,1.09-0.99,1.64L85.57,302.33c-0.35,0.61-0.68,1.22-1.01,1.83\" +\n \"c-5.65,10.13-9.85,20.84-12.62,31.85c-12.55-8.68-23.26-20.1-31.11-33.7c-18.66-32.33-18.66-72.49,0-104.81L109.1,79.26\" +\n \"C127.77,46.93,162.55,26.85,199.87,26.85z M426.94,79.44c7.9,13.68,12.44,28.77,13.64,44.06c0.25,3.14,0.36,6.29,0.32,9.44\" +\n \"c-9.22-8.91-21.4-14.14-34.65-14.6c-0.64-0.02-1.29-0.04-1.93-0.04h-0.21h-75.76l-60.51,104.81l-18.46-31.98l-4.02-6.96\" +\n \"c-1.21-2.09-2.54-4.08-3.98-5.95c-2.87-3.73-6.17-7.01-9.82-9.8c-8.87-6.76-19.78-10.57-31.46-10.68l45.38-78.57\" +\n \"c14.75-25.54,39.55-43.4,67.72-49.76c5.54-1.25,11.22-2.06,16.97-2.39c1.98-0.11,3.97-0.18,5.96-0.18c0.07,0,0.13,0,0.2,0\" +\n \"c3.11,0.01,6.19,0.16,9.25,0.44c33.62,3.08,64.16,22.38,81.2,51.9L426.94,79.44z\";\n\nexport function LogomarkSVG({\n className,\n width = 32,\n height = 32,\n \"aria-label\": ariaLabel,\n}: SVGProps) {\n const mergedClass = mergeLogoClass(className);\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 535.71 500\"\n width={width}\n height={height}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n fill=\"currentColor\"\n >\n <path d={LOGOMARK_PATH} />\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 535.71 500\"\n width={width}\n height={height}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n fill=\"currentColor\"\n >\n <path d={LOGOMARK_PATH} />\n </svg>\n );\n}\n\n// ─── English Wordmark (\"Nebutra\" text) ────────────────────────────────────────\n// Source: assets/logo/logo-en.svg viewBox=\"0 0 544.21 103.74\"\n\nfunction WordmarkPaths() {\n return (\n <>\n {/* N */}\n <path\n d=\"M78.69,102.73H67.76c-3.87,0-7.47-1.96-9.56-5.21L18.27,35.5v55.86c0,6.28-5.09,11.37-11.37,11.37H0V0h10.93\n c3.87,0,7.47,1.96,9.56,5.21l39.94,62.01V11.37C60.43,5.09,65.52,0,71.8,0h6.89V102.73z\"\n />\n {/* E */}\n <rect x=\"102.92\" y=\"53.18\" width=\"66.72\" height=\"18.27\" />\n <path\n d=\"M147.44,80.28c-4.3,3.7-10.07,5.73-16.31,5.07c-9.76-1.04-17.69-8.78-18.93-18.52\n c-1.78-14.01,10.06-25.86,24.08-24.06c9.61,1.23,17.29,8.97,18.47,18.58c0.44,3.58-0.02,7-1.16,10.1h18.89\n c0.46-2.41,0.71-4.88,0.71-7.42c0-22.91-19.49-41.34-42.76-39.6C111,25.89,95.33,41.56,93.87,60.98\n c-1.75,23.27,16.69,42.76,39.6,42.76c14.91,0,27.92-8.26,34.71-20.45l-7.81-4.33C156.21,76.65,151.05,77.18,147.44,80.28z\"\n />\n {/* I */}\n <path d=\"M205.06,102.73h-6.89c-6.28,0-11.37-5.09-11.37-11.37V0h6.89c6.28,0,11.37,5.09,11.37,11.37V102.73z\" />\n {/* O */}\n <path\n d=\"M226.5,103.74c-21.9,0-39.71-17.81-39.71-39.71s17.81-39.71,39.71-39.71s39.71,17.81,39.71,39.71\n S248.4,103.74,226.5,103.74z M226.5,42.58c-11.83,0-21.45,9.62-21.45,21.45c0,11.83,9.62,21.45,21.45,21.45\n c11.82,0,21.45-9.62,21.45-21.45C247.95,52.2,238.33,42.58,226.5,42.58z\"\n />\n {/* U */}\n <path\n d=\"M315.89,103.74c-19.34,0.33-35.17-15.84-35.17-35.18V24.32h6.89c6.28,0,11.37,5.09,11.37,11.37v33.08\n c0,8.83,6.85,16.36,15.68,16.7c9.28,0.35,16.94-7.09,16.94-16.29V35.69c0-6.28,5.09-11.37,11.37-11.37h6.89v44.85\n C349.86,88.03,334.67,103.41,315.89,103.74z\"\n />\n {/* L */}\n <path\n d=\"M403.08,102.73c-20.83,0-37.77-16.95-37.77-37.77V11.37C365.3,5.09,370.4,0,376.68,0h6.89v64.96\n c0,8.22,5.11,15.26,12.31,18.13c4.34,1.73,7.2,5.9,7.2,10.57V102.73z\"\n />\n <path d=\"M391.71,44.44h-17.27V26.17h28.64v6.89C403.08,39.35,397.99,44.44,391.71,44.44z\" />\n {/* R */}\n <path\n d=\"M436.06,102.74h-6.89c-6.28,0-11.37-5.09-11.37-11.37V65.35c0-22.63,18.41-41.03,41.03-41.03v8.85\n c0,4.84-3.08,9.11-7.63,10.74c-8.81,3.14-15.13,11.57-15.13,21.45V102.74z\"\n />\n {/* A */}\n <path d=\"M544.21,102.73h-6.89c-6.28,0-11.37-5.09-11.37-11.37V64.03h18.27V102.73z\" />\n <path\n d=\"M504.5,103.74c-21.9,0-39.71-17.81-39.71-39.71s17.81-39.71,39.71-39.71c21.9,0,39.71,17.81,39.71,39.71\n S526.4,103.74,504.5,103.74z M504.5,42.58c-11.83,0-21.45,9.62-21.45,21.45c0,11.83,9.62,21.45,21.45,21.45\n c11.82,0,21.45-9.62,21.45-21.45C525.94,52.2,516.32,42.58,504.5,42.58z\"\n />\n </>\n );\n}\n\nexport function WordmarkEnSVG({\n className,\n width = 150,\n height,\n \"aria-label\": ariaLabel,\n}: SVGProps) {\n const computedHeight = height ?? Math.round((width * 103.74) / 544.21);\n const mergedClass = mergeLogoClass(className);\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 544.21 103.74\"\n width={width}\n height={computedHeight}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 544.21 103.74\"\n width={width}\n height={computedHeight}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </svg>\n );\n}\n\n// ─── Full Logo (logomark + wordmark, horizontal) ───────────────────────────────\n// Composite of logomark + English wordmark side-by-side, matching Logo variant=\"en\"\n\nexport interface LogoEnSVGProps extends SVGProps {\n /** Gap between logomark and wordmark (default 12px) */\n gap?: number;\n}\n\nfunction layoutLogoEn(width: number, gap: number) {\n const logomarkAspect = 535.71 / 500;\n const wordmarkAspect = 544.21 / 103.74;\n const h = Math.round(width / (logomarkAspect + gap / width + wordmarkAspect));\n const logomarkW = Math.round(h * logomarkAspect);\n const wordmarkW = Math.round(h * wordmarkAspect);\n const totalW = logomarkW + gap + wordmarkW;\n return { h, logomarkW, wordmarkW, totalW };\n}\n\nexport function LogoEnSVG({\n className,\n width = 160,\n gap = 12,\n \"aria-label\": ariaLabel,\n}: LogoEnSVGProps) {\n const { h, logomarkW, wordmarkW, totalW } = layoutLogoEn(width, gap);\n const mergedClass = mergeLogoClass(className);\n\n const children = (\n <>\n <g transform={`scale(${logomarkW / 535.71}, ${h / 500})`} fill=\"currentColor\">\n <path d={LOGOMARK_PATH} />\n </g>\n <g\n transform={`translate(${logomarkW + gap}, 0) scale(${wordmarkW / 544.21}, ${h / 103.74})`}\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </g>\n </>\n );\n\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n >\n {children}\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n >\n {children}\n </svg>\n );\n}\n\n// Per-render unique gradient ids (duplicate fixed ids break fill=url(#…) when\n// nav renders twice or a sibling SVG is display:none — mark becomes invisible).\nlet logoColorGradSeq = 0;\n\n/**\n * Full English logo with VI color fills (gradient mark + #060307 wordmark).\n * For light surfaces. Dark inverse: use LogoEnSVG with text-white instead.\n */\nexport function LogoEnColorSVG({\n className,\n width = 160,\n gap = 12,\n \"aria-label\": ariaLabel,\n}: LogoEnSVGProps) {\n const { h, logomarkW, wordmarkW, totalW } = layoutLogoEn(width, gap);\n logoColorGradSeq += 1;\n const gradId = `nebutra-logo-en-color-grad-${logoColorGradSeq}`;\n\n // objectBoundingBox: gradient follows the path's painted bbox after scale().\n // userSpaceOnUse with native 0–535 coords was wrong — root viewBox is ~151×22,\n // so the gradient sat outside the mark and the icon looked empty (wordmark only).\n const children = (\n <>\n <defs>\n <linearGradient id={gradId} gradientUnits=\"objectBoundingBox\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#0033FE\" />\n <stop offset=\"0.5\" stopColor=\"#00A2E9\" />\n <stop offset=\"1\" stopColor=\"#0BF1C3\" />\n </linearGradient>\n </defs>\n <g transform={`scale(${logomarkW / 535.71}, ${h / 500})`}>\n <path d={LOGOMARK_PATH} fill={`url(#${gradId})`} />\n </g>\n <g\n transform={`translate(${logomarkW + gap}, 0) scale(${wordmarkW / 544.21}, ${h / 103.74})`}\n fill=\"#060307\"\n >\n <WordmarkPaths />\n </g>\n </>\n );\n\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={className}\n aria-label={ariaLabel}\n role=\"img\"\n >\n {children}\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={className}\n aria-hidden=\"true\"\n role=\"img\"\n >\n {children}\n </svg>\n );\n}\n","/**\n * Color Usage Guidelines - 品牌色彩使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n *\n * SSOT: Color scale values are sourced from `../metadata.ts` (`colors`),\n * which itself mirrors `@nebutra/design-tokens/tokens/core.json`.\n * The scale exports below (`nebutraBlueScale`, `nebutraCyanScale`,\n * `nebutraNeutralScale`) are kept for backwards compatibility and\n * redirect to `colors.primary`, `colors.accent`, and `colors.neutral`.\n */\nimport { colors } from \"../metadata\";\n\n/**\n * Brand Primary Color - 云毓蓝 (Nebutra Blue)\n *\n * 云毓蓝是品牌的核心标准色。蓝色象征科技与信任,契合云毓智能在AI-SaaS与云端数据智能领域的专业定位。\n * \"云\"代表云端平台,\"毓\"寓意孕育与转化。\n */\nexport const nebutraBlue = {\n name: \"云毓蓝\",\n nameEn: \"Nebutra Blue\",\n\n /** Color values */\n hex: \"#0033FE\",\n rgb: { r: 0, g: 51, b: 254 },\n hsl: { h: 228, s: 100, l: 50 },\n\n /** Print color values (if needed) */\n cmyk: { c: 100, m: 80, y: 0, k: 0 },\n\n /** Semantic meaning */\n meaning: \"象征科技与信任,体现创新、可靠与无限潜力\",\n\n /** Usage */\n usage: [\"主要品牌色\", \"标志主色\", \"重要按钮/CTA\", \"标题强调\", \"链接颜色\"],\n} as const;\n\n/**\n * Brand Secondary Color - 云毓青 (Nebutra Cyan)\n *\n * 品牌主要辅助色定义为\"云毓青\"。它源于数据流动与智能交互的瞬间,\n * 青色的通透感象征着信息的清晰与算法的灵动。\n */\nexport const nebutraCyan = {\n name: \"云毓青\",\n nameEn: \"Nebutra Cyan\",\n\n /** Color values */\n hex: \"#0BF1C3\",\n rgb: { r: 11, g: 241, b: 195 },\n hsl: { h: 168, s: 91, l: 49 },\n\n /** Print color values (if needed) */\n cmyk: { c: 55, m: 0, y: 35, k: 0 },\n\n /** Semantic meaning */\n meaning: \"象征信息的清晰与算法的灵动,体现从原始数据到智慧产品的转化路径\",\n\n /** Usage */\n usage: [\"辅助品牌色\", \"渐变终止色\", \"交互反馈\", \"成功状态\", \"数据可视化\"],\n} as const;\n\n/**\n * Brand Gradient - 品牌渐变\n *\n * 色彩上使用清新明快的蓝绿渐变,通过线性渐变与角度渐变的方式填充,\n * 让整体更具未来感与科技的锋芒。\n */\nexport const brandGradient = {\n /** Primary gradient (135°) - Logo标准渐变;中点为 OKLab 感知中点,控中段避免脏灰 */\n primary: {\n css: \"linear-gradient(135deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n angle: 135,\n stops: [\n { color: \"#0033FE\", position: 0 },\n { color: \"#00A2E9\", position: 50, note: \"OKLab midpoint\" },\n { color: \"#0BF1C3\", position: 100 },\n ],\n usage: \"Logo、Hero区域、VI 品牌资产(产品 CTA 用 solid primary)\",\n },\n\n /** Reverse gradient */\n reverse: {\n css: \"linear-gradient(135deg, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n angle: 135,\n stops: [\n { color: \"#0BF1C3\", position: 0 },\n { color: \"#00A2E9\", position: 50, note: \"OKLab midpoint\" },\n { color: \"#0033FE\", position: 100 },\n ],\n usage: \"次要元素、hover状态\",\n },\n\n /** Vertical gradient */\n vertical: {\n css: \"linear-gradient(180deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n angle: 180,\n stops: [\n { color: \"#0033FE\", position: 0 },\n { color: \"#00A2E9\", position: 50, note: \"OKLab midpoint\" },\n { color: \"#0BF1C3\", position: 100 },\n ],\n usage: \"垂直布局元素、页面分割\",\n },\n\n /** Radial gradient */\n radial: {\n css: \"radial-gradient(circle, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n type: \"radial\",\n stops: [\n { color: \"#0BF1C3\", position: 0 },\n { color: \"#00A2E9\", position: 50, note: \"OKLab midpoint\" },\n { color: \"#0033FE\", position: 100 },\n ],\n usage: \"背景光晕、焦点效果\",\n },\n} as const;\n\n/**\n * Neutral Colors - 黑白 (VI标准)\n */\nexport const neutralColors = {\n white: {\n name: \"白\",\n nameEn: \"White\",\n hex: \"#FFFFFF\",\n rgb: { r: 255, g: 255, b: 255 },\n usage: \"背景、文字反白\",\n },\n black: {\n name: \"黑\",\n nameEn: \"Black\",\n hex: \"#000000\",\n rgb: { r: 0, g: 0, b: 0 },\n usage: \"正文文字、墨稿标志\",\n },\n} as const;\n\n/**\n * Color Prohibited Uses - 色彩禁用示例\n *\n * 为了使品牌标准色彩在未来的传播中更加科学有效,设置标准色和辅助色的使用规范。\n */\nexport const colorProhibitedUses = [\n {\n id: \"high-saturation-overlay\",\n name: \"高饱和度背景与颜色重叠\",\n description: \"禁用高饱和度背景与颜色重叠,避免颜色过于刺眼,影响品牌形象\",\n example: \"不要在高饱和度的红、橙、黄等背景上使用品牌色\",\n },\n {\n id: \"high-brightness-overlay\",\n name: \"明度过高的重叠颜色\",\n description: \"禁用明度过高的重叠颜色,避免影响内容的识别性\",\n example: \"不要将浅色品牌色放在浅色背景上\",\n },\n {\n id: \"modify-brand-colors\",\n name: \"修改品牌标准色\",\n description: \"禁止调整品牌色的色相、饱和度或明度\",\n example: \"不要将云毓蓝调成紫色或浅蓝\",\n },\n {\n id: \"non-brand-gradient\",\n name: \"非品牌渐变\",\n description: \"禁止使用非品牌标准的渐变组合\",\n example: \"不要将云毓蓝与其他非品牌色进行渐变\",\n },\n] as const;\n\n/**\n * Allowed Color Combinations - 允许使用的色彩组合\n */\nexport const allowedColorCombinations = [\n {\n name: \"品牌渐变背景 + 白色文字\",\n background: brandGradient.primary.css,\n foreground: \"#FFFFFF\",\n contrast: \"AAA\",\n },\n {\n name: \"白色背景 + 云毓蓝文字\",\n background: \"#FFFFFF\",\n foreground: \"#0033FE\",\n contrast: \"AAA\",\n },\n {\n name: \"深色背景 + 云毓青强调\",\n background: \"#000000\",\n foreground: \"#0BF1C3\",\n contrast: \"AAA\",\n },\n {\n name: \"云毓蓝背景 + 白色文字\",\n background: \"#0033FE\",\n foreground: \"#FFFFFF\",\n contrast: \"AAA\",\n },\n] as const;\n\n/**\n * Nebutra Blue Color Scale - 云毓蓝色阶\n *\n * Re-exported from `colors.primary` (metadata.ts SSOT).\n * Direct hex literals were removed to eliminate the multi-source drift documented\n * in docs/design-system/token-drift-audit.md.\n */\nexport const nebutraBlueScale = colors.primary;\n\n/**\n * Nebutra Cyan Color Scale - 云毓青色阶\n *\n * Re-exported from `colors.accent` (metadata.ts SSOT).\n */\nexport const nebutraCyanScale = colors.accent;\n\n/**\n * Extended Neutral Colors - Slate (cool blue-undertone gray scale)\n *\n * Re-exported from `colors.neutral` (metadata.ts SSOT). Slate, not Zinc.\n * The `0` step (white) is omitted to keep the legacy 50–950 scale shape intact.\n */\nexport const nebutraNeutralScale = {\n 50: colors.neutral[50],\n 100: colors.neutral[100],\n 200: colors.neutral[200],\n 300: colors.neutral[300],\n 400: colors.neutral[400],\n 500: colors.neutral[500],\n 600: colors.neutral[600],\n 700: colors.neutral[700],\n 800: colors.neutral[800],\n 900: colors.neutral[900],\n 950: colors.neutral[950],\n} as const;\n\n/**\n * Semantic Color Tokens - 语义化颜色\n *\n * Pre-defined combinations for common UI patterns\n */\nexport const semanticColors = {\n // Surface colors\n surface: {\n light: {\n default: nebutraNeutralScale[50],\n subtle: nebutraNeutralScale[100],\n muted: nebutraNeutralScale[200],\n },\n dark: {\n default: nebutraNeutralScale[950],\n subtle: nebutraNeutralScale[900],\n muted: nebutraNeutralScale[800],\n },\n },\n\n // Text colors\n text: {\n light: {\n primary: nebutraNeutralScale[900],\n secondary: nebutraNeutralScale[600],\n muted: nebutraNeutralScale[400],\n inverse: \"#ffffff\",\n },\n dark: {\n primary: nebutraNeutralScale[50],\n secondary: nebutraNeutralScale[300],\n muted: nebutraNeutralScale[500],\n inverse: nebutraNeutralScale[900],\n },\n },\n\n // Border colors\n border: {\n light: {\n default: nebutraNeutralScale[200],\n subtle: nebutraNeutralScale[100],\n strong: nebutraNeutralScale[300],\n },\n dark: {\n default: nebutraNeutralScale[800],\n subtle: nebutraNeutralScale[900],\n strong: nebutraNeutralScale[700],\n },\n },\n\n // Brand emphasis\n brand: {\n primary: nebutraBlueScale[500],\n primaryHover: nebutraBlueScale[600],\n primaryActive: nebutraBlueScale[700],\n accent: nebutraCyanScale[500],\n accentHover: nebutraCyanScale[600],\n accentActive: nebutraCyanScale[700],\n },\n} as const;\n\n/**\n * Color Scale Generator (legacy - prefer using pre-defined scales)\n */\nexport const generateColorScale = (baseHex: string) => {\n // For runtime generation, return the appropriate pre-defined scale\n if (baseHex === \"#0033FE\") return nebutraBlueScale;\n if (baseHex === \"#0BF1C3\") return nebutraCyanScale;\n\n // Fallback: return base color for all steps\n return {\n 50: baseHex,\n 100: baseHex,\n 200: baseHex,\n 300: baseHex,\n 400: baseHex,\n 500: baseHex,\n 600: baseHex,\n 700: baseHex,\n 800: baseHex,\n 900: baseHex,\n 950: baseHex,\n };\n};\n\n// Type exports\nexport type ColorProhibitedUse = (typeof colorProhibitedUses)[number];\nexport type AllowedColorCombination = (typeof allowedColorCombinations)[number];\n","/**\n * Logo Usage Guidelines - 品牌标志使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n */\n\n/**\n * Logo Safety Zone (安全空间)\n *\n * 标志应用时必须保留安全空间,最小边距不小于标志高度的 1/4\n * The minimum margin around the logo should be at least 1/4 of the logo height\n */\nexport const logoSafetyZone = {\n /** Safety zone ratio relative to logo height */\n ratio: 0.25, // 1/4 of logo height\n\n /** Calculate safety zone in pixels */\n calculate: (logoHeight: number) => ({\n margin: Math.ceil(logoHeight * 0.25),\n totalWidth: Math.ceil(logoHeight + logoHeight * 0.5), // logo + 2x margin\n totalHeight: Math.ceil(logoHeight + logoHeight * 0.5),\n }),\n} as const;\n\n/**\n * Minimum Logo Sizes (最小化比例限定)\n */\nexport const logoMinSize = {\n /** Print media: height ≥ 6mm */\n print: {\n minHeightMm: 6,\n description: \"印刷媒体上最小使用:高度大于等于 6mm\",\n },\n\n /** Digital media: height ≥ 35px */\n digital: {\n minHeightPx: 35,\n description: \"网络媒体上最小使用:高度大于等于 35px\",\n },\n} as const;\n\n/**\n * Logo Variants (标志组合形式)\n */\nexport const logoVariants = {\n /** 标志左右组合 - Horizontal combination */\n horizontal: {\n zh: \"logo-horizontal-zh\",\n en: \"logo-horizontal-en\",\n useCase: \"适配横向空间(如门店招牌、横幅广告)\",\n },\n\n /** 标志上下组合 - Vertical combination */\n vertical: {\n zh: \"logo-vertical-zh\",\n en: \"logo-vertical-en\",\n useCase: \"适配纵向空间(如名片、工牌)\",\n },\n\n /** 单色组合 - Monochrome combinations (compliant edition only) */\n horizontalMono: {\n zh: \"logo-horizontal-zh-mono\",\n en: \"logo-horizontal-en-mono\",\n useCase: \"适配单色印刷横向场景(传真、黑白打印)\",\n },\n verticalMono: {\n zh: \"logo-vertical-zh-mono\",\n en: \"logo-vertical-en-mono\",\n useCase: \"适配单色印刷纵向场景(名片黑白版、工牌单色版)\",\n },\n\n /** 标志单独使用 */\n logomark: {\n color: \"logo-color\",\n inverse: \"logo-inverse\",\n mono: \"logo-mono\",\n },\n\n /** 品牌名称单独使用 */\n wordmark: {\n zh: \"logo-zh\",\n en: \"logo-en\",\n zhEn: \"logo-zh-en\",\n },\n} as const;\n\n/**\n * Product-chrome dual-theme rule (2026-07 lesson)\n *\n * Nav / shell must **decouple** logomark from wordmark:\n * - Light mark: multi-path VI color asset (`logo-color`), not mono+fake gradient\n * - Dark mark: mono `currentColor` white\n * - Wordmark: independent `currentColor` both themes\n *\n * Do not theme by swapping one baked horizontal file for one mono composite.\n * See packages/design/brand/README.md and apps/sailor-docs nav layout.\n */\nexport const productChromeLogoRule = {\n decoupleMarkAndWordmark: true,\n lightMark: \"logo-color\",\n darkMark: \"LogomarkSVG + text-white\",\n wordmark: \"WordmarkEnSVG + theme text token\",\n avoid: [\n \"LogoEnColorSVG for nav\",\n \"logo-horizontal-en light + LogoEnSVG dark whole-swap\",\n \"CSS filter invert on color SVGs\",\n ],\n} as const;\n\n/**\n * Logo Editions (品牌标志版本)\n *\n * v1.0 经典版与 v2.0 合规版的区别在于中文\"毓\"字的写法。\n */\nexport const logoEditions = {\n classic: {\n version: \"1.0\",\n name: \"经典版\",\n nameEn: \"Classic\",\n description: \"原始设计版本,'毓'字更美观流畅\",\n useCases: [\"App界面\", \"网站\", \"产品内嵌\", \"营销物料\", \"社交媒体\"],\n directory: \"logo\",\n },\n compliant: {\n version: \"2.0\",\n name: \"合规版\",\n nameEn: \"Compliant\",\n description: \"商标合规版本,'毓'字符合标准字形规范\",\n useCases: [\"法律文件\", \"商标注册\", \"正式合同\", \"政府报备\", \"发票/收据\"],\n directory: \"logo-compliant\",\n },\n} as const;\n\n/**\n * Logo Color Usage (标志颜色使用)\n */\nexport const logoColorUsage = {\n /** Preferred: Full color gradient (彩色渐变) */\n preferred: \"color\",\n\n /** Allowed: Single color versions */\n allowed: [\"inverse\", \"mono\"] as const,\n\n /** Rules */\n rules: {\n lightBackground: \"优先使用彩色标识\",\n darkBackground: \"允许使用反白标识\",\n complexBackground: \"禁止在复杂背景中使用反白标识,以防辨识度降低\",\n print: \"单色印刷时使用墨稿版本\",\n special: \"烫金、烫银等特殊工艺使用对应墨稿版本\",\n },\n} as const;\n\n/**\n * Prohibited Logo Uses (使用限定 / 禁用规则)\n *\n * 从\"反向约束\"角度保障品牌标志的完整性、识别性和品牌形象的一致性\n */\nexport const logoProhibitedUses = [\n {\n id: \"stretch\",\n name: \"拉伸变形\",\n description: \"禁止对标志进行任何方向的拉伸或压缩\",\n },\n {\n id: \"rotate\",\n name: \"旋转\",\n description: \"禁止旋转标志角度\",\n },\n {\n id: \"outline\",\n name: \"描边\",\n description: \"禁止给标志添加描边效果\",\n },\n {\n id: \"shadow\",\n name: \"投影\",\n description: \"禁止给标志添加投影效果\",\n },\n {\n id: \"gradient-modify\",\n name: \"修改渐变\",\n description: \"禁止修改标志原有的渐变色彩\",\n },\n {\n id: \"recolor\",\n name: \"随意换色\",\n description: \"禁止使用非品牌标准色替换标志颜色\",\n },\n {\n id: \"partial\",\n name: \"部分使用\",\n description: \"禁止只使用标志的一部分\",\n },\n {\n id: \"modify-elements\",\n name: \"修改元素\",\n description: \"禁止添加、删除或修改标志中的任何元素\",\n },\n {\n id: \"low-contrast\",\n name: \"低对比度\",\n description: \"禁止在对比度过低的背景上使用标志\",\n },\n {\n id: \"complex-bg\",\n name: \"复杂背景\",\n description: \"禁止在浅色或复杂背景中使用反白标识\",\n },\n] as const;\n\n/**\n * Logo Grid System (方格制图)\n *\n * 通过精确的网格比例,规定标志中各元素的尺寸、间距等参数\n */\nexport const logoGrid = {\n /** Logo mark grid unit */\n logomark: {\n gridUnit: \"a\",\n width: \"7.5a\",\n height: \"7.5a\",\n },\n\n /** Chinese wordmark grid */\n wordmarkCn: {\n gridUnit: \"a\",\n width: \"13.5a\",\n height: \"3a\",\n },\n\n /** English wordmark grid */\n wordmarkEn: {\n gridUnit: \"a\",\n width: \"14a\",\n height: \"2a\",\n },\n\n /** Combined logo grid (Chinese + English) */\n combined: {\n gridUnit: \"a\",\n width: \"13.5a\",\n height: \"5.5a\",\n },\n} as const;\n\n/**\n * Logo Special Versions (特殊版本)\n */\nexport const logoSpecialVersions = {\n /** 墨稿版本 - Monochrome versions */\n monochrome: {\n black: \"用于单色印刷、传真等场景\",\n white: \"用于深色背景、反白印刷\",\n },\n\n /** 工艺版本 - Special process versions */\n process: {\n gold: \"烫金工艺\",\n silver: \"烫银工艺\",\n },\n} as const;\n\n// Type exports\nexport type LogoVariant = keyof typeof logoVariants;\nexport type LogoProhibitedUse = (typeof logoProhibitedUses)[number];\n","/**\n * Brand Guidelines - 品牌使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n *\n * This module provides programmatic access to brand guidelines for:\n * - Design system integration\n * - Automated compliance checking\n * - Documentation generation\n */\n\nexport type { AllowedColorCombination, ColorProhibitedUse } from \"./color\";\n// Color Guidelines\nexport {\n allowedColorCombinations,\n brandGradient,\n colorProhibitedUses,\n generateColorScale,\n nebutraBlue,\n // Complete color scales\n nebutraBlueScale,\n nebutraCyan,\n nebutraCyanScale,\n nebutraNeutralScale,\n neutralColors,\n semanticColors,\n} from \"./color\";\nexport type { LogoProhibitedUse, LogoVariant } from \"./logo\";\n// Logo Guidelines\nexport {\n logoColorUsage,\n logoEditions,\n logoGrid,\n logoMinSize,\n logoProhibitedUses,\n logoSafetyZone,\n logoSpecialVersions,\n logoVariants,\n productChromeLogoRule,\n} from \"./logo\";\n\n/**\n * Complete Brand Guidelines Object\n *\n * Unified export for easy consumption\n */\nexport const brandGuidelines = {\n // Logo\n logo: {\n safetyZone: {\n ratio: 0.25,\n description: \"最小边距不小于标志高度的 1/4\",\n },\n minSize: {\n print: { minHeightMm: 6 },\n digital: { minHeightPx: 35 },\n },\n },\n\n // Colors\n colors: {\n primary: {\n name: \"云毓蓝\",\n hex: \"#0033FE\",\n },\n secondary: {\n name: \"云毓青\",\n hex: \"#0BF1C3\",\n },\n gradient: \"linear-gradient(135deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n },\n\n // Typography\n typography: {\n cn: \"Noto Sans SC\",\n en: \"Geist\",\n weights: [\"Regular\", \"Medium\", \"SemiBold\", \"Bold\"],\n },\n} as const;\n\nexport type BrandGuidelines = typeof brandGuidelines;\n","[\n {\n \"id\": \"echo-localhost\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"它终于离开了 localhost。\",\n \"secondaryCopy\": \"It finally left localhost.\",\n \"sourceInspiration\": \"开发者第一次把服务跑出本地机器的那一刻 — the moment a service escapes the developer's own machine\",\n \"usedInSurface\": \"deployment\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-general-magic\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"有些项目不是失败,是把团队练出来了。\",\n \"secondaryCopy\": \"Some projects don't fail. They train the team that comes next.\",\n \"sourceInspiration\": \"General Magic — 伟大的失败孕育了改变世界的一代工程师 (the project failed but its alumni built the next era)\",\n \"usedInSurface\": \"failure_state\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-ramen\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"先活下来,不丢人。\",\n \"secondaryCopy\": \"Staying alive is not shameful. Ramen counts.\",\n \"sourceInspiration\": \"ramen profitability — Paul Graham 提出的生存美学:赚够吃泡面的钱就是真正的盈利起点\",\n \"usedInSurface\": \"revenue\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-first-room\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"第一间房间不必体面,但方向必须真实。\",\n \"secondaryCopy\": \"The first room doesn't have to be impressive. The direction does.\",\n \"sourceInspiration\": \"车库/湖畔花园 — 所有伟大公司的共同起点:非正式空间里诞生的认真事业 (HP garage, Alibaba's Lakeside apartment)\",\n \"usedInSurface\": \"onboarding\",\n \"riskLevel\": \"low\"\n }\n]\n","/**\n * @nebutra/brand — Microcopy SSOT\n *\n * Typed projection of the Nebutra Microcopy System methodology bible\n * (docs/microcopy/nebutra-microcopy-system.md).\n *\n * This module is the machine-readable SSOT for §8.2 (NebutraMicrocopy type),\n * §8.3 (Milestone Copy Pack, 14 entries), and §6.7 (Easter Egg Registry).\n *\n * IMPORTANT: Do NOT hand-edit copy strings here without re-reading the bible.\n * The §8.3 table is the authority. Run `pnpm --filter @nebutra/brand test` to\n * verify invariants after any change.\n *\n * MC-H2: `act` carries only the three-act model ('starting'|'building'|'growing').\n * Failure & Milestone are cross-cutting throughlines, not a 4th act; they are\n * modelled with the optional `throughline` field. 'First Reset' has act:'starting'\n * (it can occur at any phase) + throughline:'failure'.\n *\n * MC-H4: locale is resolved via locale-keyed maps (MILESTONE_COPY_PACK entries\n * carry a `copy` record keyed by locale, not one row per (id, locale)).\n */\n\nimport easterEggRegistryData from \"./easter-egg-registry.json\";\n\n// ---------------------------------------------------------------------------\n// Locale\n// ---------------------------------------------------------------------------\n\nexport type SupportedLocale = \"zh-CN\" | \"en-US\";\n\n// ---------------------------------------------------------------------------\n// NebutraMicrocopy type — verbatim §8.2 + MC-H2/MC-H3 corrections\n// ---------------------------------------------------------------------------\n\n/**\n * Structured microcopy asset as defined in §8.2 of the microcopy system bible.\n *\n * MC-H2 fix: `act` is the three-act model (starting/building/growing).\n * Failure and Milestone are cross-cutting states modelled via `throughline`.\n * MC-H3: all §8.2 fields are present including id, locale, secondaryCopy?,\n * ctaCopy?, and surface includes 'graduation'.\n */\nexport type NebutraMicrocopy = {\n id: string;\n locale: SupportedLocale | string; // scalar: the locale this entry targets\n\n /** Three-act model (user-visible). Failure/Milestone use `throughline`. */\n act: \"starting\" | \"building\" | \"growing\";\n\n /**\n * Cross-cutting states that span all acts (§4.4 纵贯线).\n * Failure and Milestone are not acts; they appear at any act.\n */\n throughline?: \"failure\" | \"milestone\";\n\n /** Nine-stage production taxonomy (§4.3). */\n stage:\n | \"imagining\"\n | \"validating\"\n | \"assembling\"\n | \"building\"\n | \"shipping\"\n | \"operating\"\n | \"growing\"\n | \"scaling\"\n | \"graduating\";\n\n /** Product surface where the copy appears. MC-H3: includes 'graduation'. */\n surface:\n | \"onboarding\"\n | \"empty_state\"\n | \"success_state\"\n | \"failure_state\"\n | \"milestone\"\n | \"team\"\n | \"revenue\"\n | \"growth\"\n | \"deployment\"\n | \"graduation\"\n | \"tool_recommendation\"\n | \"warning\";\n\n /** Five voice registers (§2.4). */\n voiceRegister: \"companion\" | \"mentor\" | \"historian\" | \"operator\" | \"graduation\";\n\n /** User's emotional state at this moment. */\n userEmotion: \"uncertain\" | \"excited\" | \"stuck\" | \"proud\" | \"anxious\" | \"focused\" | \"ready\";\n\n /** Seven cultural motifs (§3.2). */\n culturalMotif:\n | \"small_room\"\n | \"first_believer\"\n | \"the_table\"\n | \"survival_first\"\n | \"ship_it\"\n | \"honest_restart\"\n | \"new_garage\";\n\n /** Three-layer easter egg classification (§6.1). */\n easterEggLayer: \"functional\" | \"metaphor\" | \"echo\";\n\n primaryCopy: string;\n secondaryCopy?: string;\n ctaCopy?: string;\n\n variables?: Array<\n \"{company}\" | \"{project}\" | \"{tool}\" | \"{member}\" | \"{user_count}\" | \"{revenue}\" | \"{stage}\"\n >;\n\n riskLevel: \"low\" | \"medium\" | \"high\";\n\n /**\n * Echo-layer REQUIRED (§8.2): the real-world story / cultural inspiration\n * behind the second layer. Must be non-empty for any entry with\n * easterEggLayer === 'echo'.\n */\n sourceInspiration?: string;\n\n notes?: string;\n};\n\n// ---------------------------------------------------------------------------\n// MilestoneId\n// ---------------------------------------------------------------------------\n\nexport type MilestoneId =\n | \"first_room\"\n | \"first_folder\"\n | \"first_table\"\n | \"first_signal\"\n | \"first_ship\"\n | \"first_believer\"\n | \"first_revenue\"\n | \"first_return\"\n | \"first_team\"\n | \"first_crowd\"\n | \"first_reset\"\n | \"first_public\"\n | \"first_demo\"\n | \"graduation\";\n\n// ---------------------------------------------------------------------------\n// MilestoneCopyEntry — bilingual via locale-keyed map (MC-H4)\n// ---------------------------------------------------------------------------\n\n/**\n * A single Milestone Copy Pack entry keyed by locale.\n *\n * MC-H4: bilingual copy is stored as a locale-keyed map so a single entry\n * covers both zh-CN and en-US without duplicating the metadata fields.\n * getMilestoneCopy(id, locale) slices out the requested locale.\n */\nexport type MilestoneCopyEntry = {\n id: MilestoneId;\n /** Locale-keyed copy strings. Each locale has primary, optional secondary/cta. */\n copy: Readonly<\n Record<\n SupportedLocale,\n {\n primary: string;\n secondary?: string;\n cta?: string;\n }\n >\n >;\n /** Three-act model; 'first_reset' is 'starting' + throughline:'failure'. */\n act: \"starting\" | \"building\" | \"growing\";\n throughline?: \"failure\" | \"milestone\";\n stage: NebutraMicrocopy[\"stage\"];\n surface: NebutraMicrocopy[\"surface\"];\n voiceRegister: NebutraMicrocopy[\"voiceRegister\"];\n culturalMotif: NebutraMicrocopy[\"culturalMotif\"];\n easterEggLayer: NebutraMicrocopy[\"easterEggLayer\"];\n riskLevel: NebutraMicrocopy[\"riskLevel\"];\n sourceInspiration?: string;\n};\n\n// ---------------------------------------------------------------------------\n// MILESTONE_COPY_PACK — 14 §8.3 entries (typed bilingual data)\n// ---------------------------------------------------------------------------\n\n/**\n * The 14-entry Milestone Copy Pack, typed bilingual data directly from §8.3.\n *\n * These are the canonical typed objects; the i18n catalog\n * (packages/platform/i18n/locales/{en,zh}.json under startupOs.milestone.*)\n * mirrors these strings for runtime next-intl delivery.\n *\n * \"First Reset\" has act:'starting' because a pivot can occur at any stage in\n * the first act — not '纵贯' (which is not a valid act value).\n */\nexport const MILESTONE_COPY_PACK: readonly MilestoneCopyEntry[] = [\n {\n id: \"first_room\",\n copy: {\n \"zh-CN\": { primary: \"第一间房间已经准备好。\" },\n \"en-US\": { primary: \"The first room is ready.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"imagining\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_folder\",\n copy: {\n \"zh-CN\": { primary: \"许多公司,最初只是一个文件夹。\" },\n \"en-US\": { primary: \"Many companies begin as a folder.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"imagining\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_table\",\n copy: {\n \"zh-CN\": { primary: \"第一张桌子有了第二个人。\" },\n \"en-US\": { primary: \"The first table has a second seat.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"assembling\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_signal\",\n copy: {\n \"zh-CN\": { primary: \"真实世界开始说话了。\" },\n \"en-US\": { primary: \"The real world has started talking.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"validating\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_ship\",\n copy: {\n \"zh-CN\": { primary: \"世界第一次看见它。\" },\n \"en-US\": { primary: \"The world sees it for the first time.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_believer\",\n copy: {\n \"zh-CN\": { primary: \"从今天起,你不再只为自己开发。\" },\n \"en-US\": {\n primary: \"From today, you are no longer building only for yourself.\",\n },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"first_believer\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_revenue\",\n copy: {\n \"zh-CN\": { primary: \"梦想开始拥有现金流。\" },\n \"en-US\": { primary: \"The dream has cash flow now.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"operating\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"survival_first\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_return\",\n copy: {\n \"zh-CN\": { primary: \"回来,比来过更重要。\" },\n \"en-US\": { primary: \"Returning matters more than visiting.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"growing\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"first_believer\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_team\",\n copy: {\n \"zh-CN\": { primary: \"三个人,局就开始成形。\" },\n \"en-US\": { primary: \"Three people can begin to form a company.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"assembling\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_crowd\",\n copy: {\n \"zh-CN\": { primary: \"第一张桌子坐不下了。\" },\n \"en-US\": { primary: \"The first table is getting crowded.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"scaling\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"echo\",\n riskLevel: \"low\",\n sourceInspiration:\n \"回响第一张桌子 (first_table) — 从第一个同伴到桌子坐满人,是从二人对话到真正组织的跃迁;the same table that once seated two now cannot hold the team\",\n },\n {\n id: \"first_reset\",\n // MC-H2: First Reset's real act is 'starting' (a pivot sends you back to start).\n // It is NOT act:'纵贯'. throughline:'failure' captures the cross-cutting nature.\n act: \"starting\",\n throughline: \"failure\",\n copy: {\n \"zh-CN\": { primary: \"重启不是失败,是更诚实的开始。\" },\n \"en-US\": { primary: \"A restart is a more honest beginning.\" },\n },\n stage: \"imagining\",\n surface: \"failure_state\",\n voiceRegister: \"mentor\",\n culturalMotif: \"honest_restart\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_public\",\n copy: {\n \"zh-CN\": { primary: \"把一部分未来,交给世界。\" },\n \"en-US\": { primary: \"Put a piece of the future in public.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"growing\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"new_garage\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_demo\",\n copy: {\n \"zh-CN\": { primary: \"这不是展示,是接受检验。\" },\n \"en-US\": { primary: \"This is not a show. It is a test.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"graduation\",\n copy: {\n \"zh-CN\": { primary: \"你出师了。下一程需要更强的装备。\" },\n \"en-US\": {\n primary: \"You've outgrown the basics. The road ahead needs stronger tools.\",\n },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"graduating\",\n surface: \"graduation\",\n voiceRegister: \"graduation\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n] as const;\n\n// ---------------------------------------------------------------------------\n// getMilestoneCopy — locale lookup helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the copy strings for a given milestone and locale.\n *\n * @param id - The MilestoneId to look up (e.g. 'first_folder')\n * @param locale - The locale to retrieve ('zh-CN' or 'en-US')\n * @returns Object with primary string, optional secondary and cta.\n *\n * @example\n * getMilestoneCopy(\"first_folder\", \"zh-CN\").primary\n * // => \"许多公司,最初只是一个文件夹。\"\n */\nexport function getMilestoneCopy(\n id: MilestoneId,\n locale: SupportedLocale,\n): { primary: string; secondary?: string; cta?: string } {\n const entry = MILESTONE_COPY_PACK.find((e) => e.id === id);\n if (!entry) {\n throw new Error(`getMilestoneCopy: unknown MilestoneId \"${id}\"`);\n }\n const localeCopy = entry.copy[locale];\n if (!localeCopy) {\n throw new Error(`getMilestoneCopy: locale \"${locale}\" not found for milestone \"${id}\"`);\n }\n return {\n primary: localeCopy.primary,\n ...(localeCopy.secondary !== undefined ? { secondary: localeCopy.secondary } : {}),\n ...(localeCopy.cta !== undefined ? { cta: localeCopy.cta } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// EasterEggEntry — §6.7 schema (MC-M1: echo-layer only)\n// ---------------------------------------------------------------------------\n\n/**\n * Easter Egg Registry entry. Per §6.7 and MC-M1, only echo-layer彩蛋 are\n * registered here — functional and metaphor layers do not require防油/防侵权\n * tracking. Echo-layer entries MUST have a non-empty secondaryCopy and\n * sourceInspiration (the \"second layer\" cultural anchor).\n */\nexport type EasterEggEntry = {\n id: string;\n /** MC-M1: only 'echo' entries go in the registry. */\n layer: \"echo\";\n primaryCopy: string;\n /** Required for echo-layer: the second layer (同行 visible). */\n secondaryCopy: string;\n /**\n * Required for echo-layer (§8.2 \"回响层必填\"): the real-world story /\n * cultural inspiration that anchors the second layer.\n * Used by防重防油 check: same sourceInspiration must not appear in\n * adjacent surfaces.\n */\n sourceInspiration: string;\n usedInSurface: NebutraMicrocopy[\"surface\"];\n riskLevel: \"low\" | \"medium\" | \"high\";\n};\n\n// ---------------------------------------------------------------------------\n// EASTER_EGG_REGISTRY — seeded with §6.3 canonical echo examples\n// ---------------------------------------------------------------------------\n\n/**\n * Registry of echo-layer easter eggs as typed data (§6.7).\n * Seeded with the four canonical §6.3 examples.\n *\n * Add new echo-layer entries here when writing new回响层彩蛋.\n * Each entry's sourceInspiration must be unique within the registry (防重).\n */\nexport const EASTER_EGG_REGISTRY: readonly EasterEggEntry[] =\n easterEggRegistryData as EasterEggEntry[];\n","/**\n * Nebutra Brand Motion Language\n *\n * Three core motions derived from the \"云端聚合\" concept:\n * - emerge (涌现): data materializing from the cloud\n * - flow (流动): data streaming through pipelines\n * - pulse (脉动): system breathing / alive indicator\n */\n\n// =============================================================================\n// Easing Curves (Framer Motion compatible)\n// =============================================================================\n\nexport const brandEasing = {\n /** Signature Nebutra ease — smooth deceleration with slight overshoot */\n brand: [0.16, 1, 0.3, 1] as const,\n /** For enter animations */\n enter: [0.16, 1, 0.3, 1] as const,\n /** For exit animations — ease-out, never ease-in */\n exit: [0.16, 1, 0.3, 1] as const,\n /** Spring-like bounce */\n spring: [0.34, 1.56, 0.64, 1] as const,\n} as const;\n\n// =============================================================================\n// Duration Bridge — Framer Motion needs seconds; CSS tokens hold ms.\n//\n// SSOT lives in @nebutra/design-tokens (core.json → duration.*). These\n// constants mirror the four rails for JS callers (Framer transition props).\n// If the SSOT changes, update here AND in @nebutra/tokens/styles.css.\n// =============================================================================\n\n/** Four-rail motion durations in seconds (Framer Motion `transition.duration`). */\nexport const motionDurationSec = {\n /** 100ms — micro-feedback */\n micro: 0.1,\n /** 200ms — state flow (default) */\n flow: 0.2,\n /** 300ms — content unveil */\n reveal: 0.3,\n /** 500ms — hero-grade cinematic */\n cinematic: 0.5,\n} as const;\n\n// =============================================================================\n// Spring Presets (Framer Motion spring config)\n// =============================================================================\n\nexport const brandSpring = {\n /** Default interactive spring */\n default: { type: \"spring\" as const, stiffness: 200, damping: 24, mass: 1 },\n /** Bouncy, playful spring */\n bouncy: { type: \"spring\" as const, stiffness: 300, damping: 15, mass: 0.8 },\n /** Heavy, deliberate spring */\n heavy: { type: \"spring\" as const, stiffness: 120, damping: 28, mass: 1.5 },\n /** Gentle reveal spring */\n gentle: { type: \"spring\" as const, stiffness: 80, damping: 20, mass: 1 },\n} as const;\n\n// =============================================================================\n// Core Motion Signatures\n// =============================================================================\n\n/** 涌现 — data materializing from the cloud. Cinematic entrance rail. */\nexport const emerge = {\n initial: { opacity: 0, transform: \"translateY(16px)\", filter: \"blur(6px)\" },\n animate: { opacity: 1, transform: \"translateY(0px)\", filter: \"blur(0px)\" },\n exit: {\n opacity: 0,\n transform: \"translateY(-8px)\",\n filter: \"blur(4px)\",\n transition: { duration: motionDurationSec.flow, ease: brandEasing.exit },\n },\n transition: { duration: motionDurationSec.cinematic, ease: brandEasing.brand },\n} as const;\n\n/** 流动 — data streaming through pipelines. Reveal rail. */\nexport const flow = {\n initial: { opacity: 0, transform: \"translateX(-20px)\" },\n animate: { opacity: 1, transform: \"translateX(0px)\" },\n exit: {\n opacity: 0,\n transform: \"translateX(20px)\",\n transition: { duration: motionDurationSec.flow, ease: brandEasing.exit },\n },\n transition: { duration: motionDurationSec.reveal, ease: brandEasing.enter },\n} as const;\n\n/** 脉动 — system breathing / alive */\nexport const pulse = {\n animate: { scale: [1, 1.015, 1], opacity: [1, 0.85, 1] },\n transition: { duration: 3, repeat: Infinity, ease: \"easeInOut\" },\n} as const;\n\n/** 漂浮 — gentle vertical drift for floating UI elements */\nexport const float = {\n animate: { y: [0, -8, 0] },\n transition: { duration: 4, repeat: Infinity, ease: \"easeInOut\" },\n} as const;\n\n// =============================================================================\n// Composition Helpers\n// =============================================================================\n\n/** Stagger container for emerge animations */\nexport const stagger = (delayPerChild = 0.08) =>\n ({\n animate: { transition: { staggerChildren: delayPerChild } },\n }) as const;\n\n/** Interactive micro-motions — flow rail for hover, micro rail for tap. */\nexport const interactive = {\n hover: {\n scale: 1.02,\n transition: { duration: motionDurationSec.flow, ease: brandEasing.brand },\n },\n tap: { scale: 0.98, transition: { duration: motionDurationSec.micro } },\n hoverLift: {\n y: -4,\n transition: { duration: motionDurationSec.flow, ease: brandEasing.brand },\n },\n} as const;\n\n/** Viewport trigger defaults */\nexport const viewport = {\n once: { once: true, margin: \"-80px\" as const },\n always: { once: false, margin: \"-40px\" as const },\n} as const;\n\n// =============================================================================\n// Unified Export\n// =============================================================================\n\nexport const brandMotion = {\n emerge,\n flow,\n pulse,\n float,\n stagger,\n interactive,\n viewport,\n brandEasing,\n brandSpring,\n motionDurationSec,\n} as const;\n","/**\n * Nebutra-Sailor — Product Positioning DNA\n *\n * Source of truth for product identity, use-case copy, and ICP definition.\n * Consumed by GitHub README, About pages, and marketing copy.\n *\n * Principle: Every claim here is substantiated by code in this monorepo.\n * Do not add aspirational copy without backing infrastructure.\n */\n\n// ── Core identity ─────────────────────────────────────────────────────────────\n\nexport const positioning = {\n /**\n * One-liner for README, og:description, pitch decks.\n * Audience: AI founders, SaaS engineering teams (1–10 engineers).\n */\n tagline: \"Ship AI products, not boilerplate.\",\n\n /**\n * Two-sentence elevator pitch.\n */\n description:\n \"Nebutra-Sailor is a production-ready Next.js monorepo template for AI SaaS products. \" +\n \"Auth, billing, multi-tenancy, AI services, design system, and enterprise infrastructure — \" +\n \"pre-configured so you ship on day one.\",\n\n /**\n * GitHub repository description (160 chars max).\n */\n repoDescription:\n \"AI-native SaaS monorepo: Next.js 16 + Hono + Python services · Clerk · Stripe · multi-tenancy · K8s · OTel · design system\",\n\n // ── Target audience ──────────────────────────────────────────────────────────\n\n icp: {\n primary: \"AI founders building SaaS products with small engineering teams (1–10 people)\",\n secondary: \"SaaS engineering teams adopting AI features into existing products\",\n antiTarget:\n \"Large enterprise teams with dedicated platform engineering — this template makes opinionated choices they will override\",\n },\n\n // ── What ships out of the box ─────────────────────────────────────────────\n\n /**\n * Capability pillars — each backed by actual packages/apps in this repo.\n * Update when underlying packages change.\n */\n pillars: [\n {\n id: \"ai-native\",\n title: \"AI-Native Architecture\",\n headline: \"AI capabilities built in, not bolted on.\",\n bullets: [\n \"Python FastAPI AI service with OpenAI / Anthropic client patterns\",\n \"Streaming responses and embeddings pipelines\",\n \"RecommendationSystem (recsys) service for personalization\",\n \"Event ingestion pipeline for AI training data collection\",\n ],\n packages: [\"backends/python/ai\", \"backends/python/recsys\", \"backends/python/event-ingest\"],\n },\n {\n id: \"saas-complete\",\n title: \"SaaS-Complete Infrastructure\",\n headline: \"Every SaaS primitive, wired together.\",\n bullets: [\n \"Clerk authentication with multi-tenant org support\",\n \"Stripe subscriptions, usage billing, and credits via @nebutra/billing\",\n \"Entitlement system for feature gating\",\n \"RBAC-ready tenant context propagated through the API gateway\",\n ],\n packages: [\"packages/billing\", \"backends/gateway\", \"packages/preset\"],\n },\n {\n id: \"design-system\",\n title: \"Production Design System\",\n headline: \"Ship polished UI from day one.\",\n bullets: [\n \"541 Geist icons as tree-shakable TSX components\",\n \"Radix UI + Lobe UI component library with brand tokens\",\n \"Design-language swap via Brand Packages (html[data-brand] + applyLanguage)\",\n \"Storybook 8 with auto-generated docs and visual regression via Chromatic\",\n ],\n packages: [\"packages/ui\", \"packages/tokens\", \"packages/icons\", \"apps/storybook\"],\n },\n {\n id: \"polyglot-monorepo\",\n title: \"Polyglot Monorepo\",\n headline: \"Right tool for each service, one unified repo.\",\n bullets: [\n \"Next.js 16 apps (web dashboard, landing page, design docs)\",\n \"Hono API gateway with OpenAPI spec and type-safe routes\",\n \"Python FastAPI microservices for AI, billing, content, e-commerce, web3\",\n \"Turborepo with affected-only builds and remote caching\",\n ],\n packages: [\"apps/web\", \"backends/gateway\", \"backends/python/*\"],\n },\n {\n id: \"enterprise-infra\",\n title: \"Enterprise-Grade Infrastructure\",\n headline: \"Production patterns, not prototyping shortcuts.\",\n bullets: [\n \"OpenTelemetry distributed tracing via @nebutra/logger (Pino + OTLP)\",\n \"Kubernetes with NetworkPolicy, PDB, HPA, and hardened security contexts\",\n \"Supply chain security: SHA-pinned Docker images and GitHub Actions\",\n \"CSP nonce-based headers, rate limiting, and structured error handling\",\n ],\n packages: [\"packages/logger\", \"packages/rate-limit\", \"infra/iac/k8s\"],\n },\n ],\n\n // ── Use cases ─────────────────────────────────────────────────────────────\n\n /**\n * Three genuine use cases with corresponding apps/packages in this repo.\n * These are templates for what you build ON TOP of Nebutra-Sailor,\n * not features of the template itself.\n */\n useCases: [\n {\n id: \"ai-saas\",\n title: \"AI SaaS Product\",\n description:\n \"Build a multi-tenant AI SaaS product from MVP to production. \" +\n \"Auth, billing, AI services, and dashboard are pre-wired.\",\n examples: [\"AI writing tools\", \"AI data analysis\", \"AI copilots\", \"AI workflow automation\"],\n starterCommand: \"pnpm dev\",\n },\n {\n id: \"marketing-landing\",\n title: \"SaaS Marketing & Landing Pages\",\n description:\n \"Launch performance-optimized marketing sites with built-in SEO, \" +\n \"Lighthouse CI gates, and analytics.\",\n examples: [\"Product landing pages\", \"Pricing pages\", \"Blog + SEO content\"],\n starterCommand: \"pnpm dev:landing\",\n },\n {\n id: \"design-system-standalone\",\n title: \"AI Product Design System\",\n description:\n \"Use @nebutra/ui and @nebutra/tokens as the design system foundation \" +\n \"for your AI product team.\",\n examples: [\"Internal component libraries\", \"Multi-product design systems\"],\n starterCommand: \"pnpm dev:design\",\n },\n ],\n\n // ── Benchmark positioning ─────────────────────────────────────────────────\n\n /**\n * Honest competitive context. Not claims, just positioning anchors.\n */\n benchmarks: {\n template: \"t3-app, create-t3-turbo — adds AI services, Python backend, design system\",\n infra: \"Vercel templates — adds Kubernetes, multi-service, enterprise security\",\n aiFramework: \"LangChain templates — adds full SaaS commercialization layer\",\n },\n} as const;\n\nexport type Positioning = typeof positioning;\nexport type ProductPillar = (typeof positioning.pillars)[number];\nexport type UseCase = (typeof positioning.useCases)[number];\n"],"mappings":";AAgBO,IAAM,QAAQ;AAAA,EACnB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,aACE;AAAA,EACF,eACE;AAAA,EAEF,OAAO;AAAA,IACL,SACE;AAAA,IACF,cAAc;AAAA,IACd,QAAQ,CAAC,aAAa,aAAa,mBAAmB,gBAAgB,kBAAkB;AAAA,IACxF,kBACE;AAAA,EACJ;AAAA,EAEA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EAEA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAMO,IAAM,SAAS;AAAA,EACpB,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,IACR,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,aAAa;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAKO,IAAM,aAAa;AAAA,EACxB,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,eAAe;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAOO,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAKO,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAKO,IAAM,gBAAgB;AAAA,EAC3B,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,YAAY;AACd;AAKO,IAAM,oBAAoB;AAAA,EAC/B,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;;;ACjPO,SAAS,eAAe,SAA+B;AAC5D,QAAM,OAAO,MAAM,QAAQ,OAAO;AAClC,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,MAAM,iBAAiB,OAAO,OAAO,CAAC,kCAA6B;AAAA,EAC/E;AACA,SAAO,WAAW,KAAK,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,QAAQ,EAAE,CAAC;AACxE;AAMO,SAAS,eAAe,KAAa,MAAuB;AACjE,QAAM,UACJ,QACA,QAAQ,IAAI,6BACZ,QAAQ,IAAI,iBACZ,eAAe,KAAK,GACpB,QAAQ,QAAQ,EAAE;AACpB,QAAM,OAAO,IAAI,QAAQ,QAAQ,EAAE;AACnC,MAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AACvD,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,SAAO,GAAG,MAAM,IAAI,IAAI;AAC1B;AAMO,IAAM,uBAAuB;AAS7B,SAAS,qBAAqB,SAG1B;AACT,QAAM,gBAAgB,SAAS,eAAe,KAAK,KAAK;AACxD,QAAM,SAAS,SAAS,QAAQ,KAAK;AACrC,QAAM,OAAO,UAAU,WAAW,gBAAgB,IAAI,MAAM,KAAK;AACjE,SAAO,SAAS,MAAM,KAAK,oBAAoB,KAAK,GAAG,IAAI,IAAI,oBAAoB;AACrF;AAGO,SAAS,oBAAoB,SAA+D;AACjG,QAAM,SAAS,eAAe,SAAS;AACvC,SAAO,IAAI,IAAI,qBAAqB,OAAO,GAAG,GAAG,MAAM,GAAG,EAAE,SAAS;AACvE;AAGO,SAAS,uBAA+B;AAC7C,QAAM,OAAO,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACjF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC/C;AAKO,SAAS,WAAW,UAAwB,WAAmB;AACpE,MAAI,YAAY,WAAW;AACzB,UAAM,SAAS,QAAQ,IAAI,sBAAsB;AACjD,QAAI,UAAU,OAAO,KAAK,MAAM,IAAI;AAClC,aAAO,OAAO,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAAA,IACzC;AAAA,EACF;AACA,SAAO,eAAe,OAAO;AAC/B;AAGO,SAAS,qBAAqB;AACnC,SAAO;AAAA,IACL,SAAS,eAAe,SAAS;AAAA,IACjC,QAAQ,eAAe,KAAK;AAAA,IAC5B,QAAQ,eAAe,KAAK;AAAA,IAC5B,SAAS,eAAe,MAAM;AAAA,IAC9B,QAAQ,eAAe,KAAK;AAAA,IAC5B,SAAS,eAAe,MAAM;AAAA,IAC9B,WAAW,eAAe,QAAQ;AAAA,IAClC,UAAU,eAAe,OAAO;AAAA,IAChC,WAAW,eAAe,QAAQ;AAAA,IAClC,WAAW,eAAe,QAAQ;AAAA,IAClC,SAAS,eAAe,MAAM;AAAA,IAC9B,WAAW,eAAe,QAAQ;AAAA,IAClC,QAAQ,eAAe,KAAK;AAAA,IAC5B,cAAc,eAAe,WAAW;AAAA,IACxC,WAAW,eAAe,QAAQ;AAAA,IAClC,WAAW,eAAe,QAAQ;AAAA,IAClC,cAAc,qBAAqB;AAAA,EACrC;AACF;AAMO,SAAS,cAAc,WAA2B;AACvD,QAAM,OAAO,MAAM,QAAQ,QACxB,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,QAAQ,EAAE,EAClB,QAAQ,UAAU,EAAE;AACvB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,uDAAkD;AAAA,EACpE;AACA,QAAM,QAAQ,UAAU,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACjD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,GAAG,KAAK,IAAI,IAAI;AACzB;AAGO,SAAS,mBAA2B;AACzC,SAAO,GAAG,MAAM,IAAI,KAAK,cAAc,SAAS,CAAC;AACnD;AAcO,SAAS,gBAAgB,MAAqC;AACnE,QAAM,UAAU,WAAW,KAAK,OAAO;AACvC,QAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,QAAM,cAAc,KAAK,eAAe,MAAM;AAE9C,SAAO;AAAA,IACL,iBAAiB,MAAM;AAAA,IACvB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,aAAQ,MAAM,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,cAAc,IAAI,IAAI,OAAO;AAAA,IAC7B,SAAS,CAAC,EAAE,MAAM,MAAM,MAAM,KAAK,QAAQ,CAAC;AAAA,IAC5C,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,WAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM,MAAM,OAAO,QAAQ,QAAQ,wBAAwB,GAAG;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAoDO,SAAS,0BAA8C;AAC5D,QAAM,UAAU,WAAW,SAAS;AACpC,QAAM,KAAK,GAAG,OAAO;AAErB,QAAM,SAAS;AAAA,IACb,MAAM,OAAO;AAAA,IACb,MAAM,OAAO,QAAQ,QAAQ,wBAAwB,gBAAgB;AAAA,IACrE,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK,MAAM,EAAE;AAEnC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM,MAAM;AAAA,IACZ,eAAe,MAAM;AAAA,IACrB,KAAK;AAAA,IACL;AAAA,EACF;AACF;AAEO,SAAS,qBAAoC;AAClD,QAAM,UAAU,WAAW,SAAS;AACpC,QAAM,MAAM,wBAAwB;AAEpC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO,GAAG,OAAO;AAAA,IACjB,MAAM,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,WAAW,EAAE,OAAO,IAAI,KAAK,EAAE;AAAA,IAC/B,YAAY,CAAC,MAAM,IAAI;AAAA,EACzB;AACF;AAEO,SAAS,iCAA4D;AAC1E,QAAM,MAAM,wBAAwB;AACpC,QAAM,aAAa,MAAM,OAAO,OAAO,QAAQ,uBAAuB,EAAE;AAExE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM,GAAG,MAAM,IAAI;AAAA,IACnB,qBAAqB;AAAA,IACrB,KAAK,sBAAsB,UAAU;AAAA,IACrC,QAAQ,EAAE,OAAO,IAAI,KAAK,EAAE;AAAA,EAC9B;AACF;AAYO,SAAS,mBAA2C;AACzD,SAAO;AAAA,IACL,MAAM,GAAG,MAAM,IAAI,WAAM,MAAM,OAAO;AAAA,IACtC,YAAY,MAAM;AAAA,IAClB,aAAa,MAAM;AAAA,IACnB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,kBAAkB,OAAO,QAAQ,KAAK;AAAA,IACtC,aAAa,OAAO,QAAQ,KAAK;AAAA,IACjC,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,CAAC,YAAY,gBAAgB,WAAW;AAAA,IACpD,OAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,uBAAwC;AACtD,QAAM,UAAU,WAAW,SAAS;AAEpC,SAAO;AAAA,IACL,OAAO,GAAG,MAAM,IAAI;AAAA,IACpB,MAAM,GAAG,OAAO;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,SAAS,GAAG,OAAO;AAAA,IACnB,UAAU;AAAA,EACZ;AACF;;;AC/NI;AApHJ,IAAM,0BAAoD,oBAAI,IAAI;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AA4CM,SAAS,cAAc,SAAsB,SAA8B;AAChF,QAAM,MACJ,YAAY,eAAe,wBAAwB,IAAI,OAAO,IAC1D,yBACA;AACN,SAAO,eAAe,GAAG,GAAG,SAAS,OAAO,MAAM;AACpD;AAMA,IAAM,gBAA6C;AAAA,EACjD,OAAO;AAAA;AAAA,EACP,SAAS;AAAA;AAAA,EACT,MAAM;AAAA;AAAA,EACN,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,SAAS;AAAA;AAAA,EACT,iBAAiB;AAAA;AAAA,EACjB,iBAAiB;AAAA;AAAA,EACjB,eAAe;AAAA;AAAA,EACf,eAAe;AAAA;AAAA,EACf,sBAAsB;AAAA;AAAA,EACtB,sBAAsB;AAAA;AAAA,EACtB,oBAAoB;AAAA;AAAA,EACpB,oBAAoB;AAAA;AACtB;AAyBO,SAAS,KAAK;AAAA,EACnB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AACb,GAAc;AACZ,QAAM,cAAc,cAAc,OAAO;AACzC,QAAM,SAAS,KAAK,MAAM,OAAO,WAAW;AAC5C,QAAM,MAAM,cAAc,SAAS,OAAO;AAG1C,QAAM,cAAc,WAAW,EAAE,QAAQ,0BAA0B,IAAI,CAAC;AAExE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK,MAAM;AAAA,MACX,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,OAAO,EAAE,OAAO,MAAM,QAAQ,GAAG,YAAY;AAAA;AAAA,EAC/C;AAEJ;AAYO,SAAS,SAAS;AAAA,EACvB,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb,GAMG;AACD,QAAM,MAAM,cAAc,SAAS,OAAO;AAG1C,QAAM,cACJ,YAAY,YAAY,YAAY,EAAE,QAAQ,0BAA0B,IAAI,CAAC;AAE/E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK,MAAM;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,YAAY;AAAA;AAAA,EACrD;AAEJ;AAQO,SAAS,SAAS;AAAA,EACvB,OAAO;AAAA,EACP;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb,GAMG;AACD,QAAM,cAAc,cAAc,OAAO;AACzC,QAAM,SAAS,KAAK,MAAM,OAAO,WAAW;AAC5C,QAAM,MAAM,cAAc,SAAS,OAAO;AAE1C,QAAM,cAAc,WAAW,EAAE,QAAQ,0BAA0B,IAAI,CAAC;AAExE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,KAAK,MAAM;AAAA,MACX,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,OAAO,EAAE,OAAO,MAAM,QAAQ,GAAG,YAAY;AAAA;AAAA,EAC/C;AAEJ;;;AC7IQ,SAyBJ,UAzBI,OAAAA,MAyBJ,YAzBI;AAxDR,IAAM,kBAAkB;AAGxB,SAAS,eAAe,WAA4B;AAClD,SAAO,YAAY,GAAG,eAAe,IAAI,SAAS,KAAK;AACzD;AAYA,IAAM,gBACJ;AAmBK,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,cAAc;AAChB,GAAa;AACX,QAAM,cAAc,eAAe,SAAS;AAC5C,MAAI,WAAW;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,cAAY;AAAA,QACZ,MAAK;AAAA,QACL,MAAK;AAAA,QAEL,0BAAAA,KAAC,UAAK,GAAG,eAAe;AAAA;AAAA,IAC1B;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,eAAY;AAAA,MACZ,MAAK;AAAA,MACL,MAAK;AAAA,MAEL,0BAAAA,KAAC,UAAK,GAAG,eAAe;AAAA;AAAA,EAC1B;AAEJ;AAKA,SAAS,gBAAgB;AACvB,SACE,iCAEE;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAEJ;AAAA,IAEA,gBAAAA,KAAC,UAAK,GAAE,UAAS,GAAE,SAAQ,OAAM,SAAQ,QAAO,SAAQ;AAAA,IACxD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAIJ;AAAA,IAEA,gBAAAA,KAAC,UAAK,GAAE,oGAAmG;AAAA,IAE3G,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAGJ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAGJ;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAEJ;AAAA,IACA,gBAAAA,KAAC,UAAK,GAAE,iFAAgF;AAAA,IAExF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAEJ;AAAA,IAEA,gBAAAA,KAAC,UAAK,GAAE,2EAA0E;AAAA,IAClF,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IAGJ;AAAA,KACF;AAEJ;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAChB,GAAa;AACX,QAAM,iBAAiB,UAAU,KAAK,MAAO,QAAQ,SAAU,MAAM;AACrE,QAAM,cAAc,eAAe,SAAS;AAC5C,MAAI,WAAW;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAY;AAAA,QACZ,MAAK;AAAA,QACL,MAAK;AAAA,QAEL,0BAAAA,KAAC,iBAAc;AAAA;AAAA,IACjB;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAY;AAAA,MACZ,MAAK;AAAA,MACL,MAAK;AAAA,MAEL,0BAAAA,KAAC,iBAAc;AAAA;AAAA,EACjB;AAEJ;AAUA,SAAS,aAAa,OAAe,KAAa;AAChD,QAAM,iBAAiB,SAAS;AAChC,QAAM,iBAAiB,SAAS;AAChC,QAAM,IAAI,KAAK,MAAM,SAAS,iBAAiB,MAAM,QAAQ,eAAe;AAC5E,QAAM,YAAY,KAAK,MAAM,IAAI,cAAc;AAC/C,QAAM,YAAY,KAAK,MAAM,IAAI,cAAc;AAC/C,QAAM,SAAS,YAAY,MAAM;AACjC,SAAO,EAAE,GAAG,WAAW,WAAW,OAAO;AAC3C;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAChB,GAAmB;AACjB,QAAM,EAAE,GAAG,WAAW,WAAW,OAAO,IAAI,aAAa,OAAO,GAAG;AACnE,QAAM,cAAc,eAAe,SAAS;AAE5C,QAAM,WACJ,iCACE;AAAA,oBAAAA,KAAC,OAAE,WAAW,SAAS,YAAY,MAAM,KAAK,IAAI,GAAG,KAAK,MAAK,gBAC7D,0BAAAA,KAAC,UAAK,GAAG,eAAe,GAC1B;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,aAAa,YAAY,GAAG,cAAc,YAAY,MAAM,KAAK,IAAI,MAAM;AAAA,QACtF,MAAK;AAAA,QAEL,0BAAAA,KAAC,iBAAc;AAAA;AAAA,IACjB;AAAA,KACF;AAGF,MAAI,WAAW;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,OAAO,MAAM,IAAI,CAAC;AAAA,QAC3B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,cAAY;AAAA,QACZ,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAS,OAAO,MAAM,IAAI,CAAC;AAAA,MAC3B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAY;AAAA,MACZ,MAAK;AAAA,MAEJ;AAAA;AAAA,EACH;AAEJ;AAIA,IAAI,mBAAmB;AAMhB,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAChB,GAAmB;AACjB,QAAM,EAAE,GAAG,WAAW,WAAW,OAAO,IAAI,aAAa,OAAO,GAAG;AACnE,sBAAoB;AACpB,QAAM,SAAS,8BAA8B,gBAAgB;AAK7D,QAAM,WACJ,iCACE;AAAA,oBAAAA,KAAC,UACC,+BAAC,oBAAe,IAAI,QAAQ,eAAc,qBAAoB,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,KACpF;AAAA,sBAAAA,KAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,MACrC,gBAAAA,KAAC,UAAK,QAAO,OAAM,WAAU,WAAU;AAAA,MACvC,gBAAAA,KAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA,OACvC,GACF;AAAA,IACA,gBAAAA,KAAC,OAAE,WAAW,SAAS,YAAY,MAAM,KAAK,IAAI,GAAG,KACnD,0BAAAA,KAAC,UAAK,GAAG,eAAe,MAAM,QAAQ,MAAM,KAAK,GACnD;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,aAAa,YAAY,GAAG,cAAc,YAAY,MAAM,KAAK,IAAI,MAAM;AAAA,QACtF,MAAK;AAAA,QAEL,0BAAAA,KAAC,iBAAc;AAAA;AAAA,IACjB;AAAA,KACF;AAGF,MAAI,WAAW;AACb,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,OAAO,MAAM,IAAI,CAAC;AAAA,QAC3B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA,cAAY;AAAA,QACZ,MAAK;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAS,OAAO,MAAM,IAAI,CAAC;AAAA,MAC3B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,eAAY;AAAA,MACZ,MAAK;AAAA,MAEJ;AAAA;AAAA,EACH;AAEJ;;;ACzUO,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAGR,KAAK;AAAA,EACL,KAAK,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI;AAAA,EAC3B,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG;AAAA;AAAA,EAG7B,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA;AAAA,EAGlC,SAAS;AAAA;AAAA,EAGT,OAAO,CAAC,kCAAS,4BAAQ,gCAAY,4BAAQ,0BAAM;AACrD;AAQO,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAGR,KAAK;AAAA,EACL,KAAK,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EAC7B,KAAK,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA;AAAA,EAG5B,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE;AAAA;AAAA,EAGjC,SAAS;AAAA;AAAA,EAGT,OAAO,CAAC,kCAAS,kCAAS,4BAAQ,4BAAQ,gCAAO;AACnD;AAQO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,SAAS;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,MAChC,EAAE,OAAO,WAAW,UAAU,IAAI,MAAM,iBAAiB;AAAA,MACzD,EAAE,OAAO,WAAW,UAAU,IAAI;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,MAChC,EAAE,OAAO,WAAW,UAAU,IAAI,MAAM,iBAAiB;AAAA,MACzD,EAAE,OAAO,WAAW,UAAU,IAAI;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,MAChC,EAAE,OAAO,WAAW,UAAU,IAAI,MAAM,iBAAiB;AAAA,MACzD,EAAE,OAAO,WAAW,UAAU,IAAI;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,MACL,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,MAChC,EAAE,OAAO,WAAW,UAAU,IAAI,MAAM,iBAAiB;AAAA,MACzD,EAAE,OAAO,WAAW,UAAU,IAAI;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAKO,IAAM,gBAAgB;AAAA,EAC3B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IACxB,OAAO;AAAA,EACT;AACF;AAOO,IAAM,sBAAsB;AAAA,EACjC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AAKO,IAAM,2BAA2B;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,YAAY,cAAc,QAAQ;AAAA,IAClC,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AACF;AASO,IAAM,mBAAmB,OAAO;AAOhC,IAAM,mBAAmB,OAAO;AAQhC,IAAM,sBAAsB;AAAA,EACjC,IAAI,OAAO,QAAQ,EAAE;AAAA,EACrB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AAAA,EACvB,KAAK,OAAO,QAAQ,GAAG;AACzB;AAOO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,SAAS;AAAA,IACP,OAAO;AAAA,MACL,SAAS,oBAAoB,EAAE;AAAA,MAC/B,QAAQ,oBAAoB,GAAG;AAAA,MAC/B,OAAO,oBAAoB,GAAG;AAAA,IAChC;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,oBAAoB,GAAG;AAAA,MAChC,QAAQ,oBAAoB,GAAG;AAAA,MAC/B,OAAO,oBAAoB,GAAG;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,SAAS,oBAAoB,GAAG;AAAA,MAChC,WAAW,oBAAoB,GAAG;AAAA,MAClC,OAAO,oBAAoB,GAAG;AAAA,MAC9B,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,oBAAoB,EAAE;AAAA,MAC/B,WAAW,oBAAoB,GAAG;AAAA,MAClC,OAAO,oBAAoB,GAAG;AAAA,MAC9B,SAAS,oBAAoB,GAAG;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,SAAS,oBAAoB,GAAG;AAAA,MAChC,QAAQ,oBAAoB,GAAG;AAAA,MAC/B,QAAQ,oBAAoB,GAAG;AAAA,IACjC;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,oBAAoB,GAAG;AAAA,MAChC,QAAQ,oBAAoB,GAAG;AAAA,MAC/B,QAAQ,oBAAoB,GAAG;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,SAAS,iBAAiB,GAAG;AAAA,IAC7B,cAAc,iBAAiB,GAAG;AAAA,IAClC,eAAe,iBAAiB,GAAG;AAAA,IACnC,QAAQ,iBAAiB,GAAG;AAAA,IAC5B,aAAa,iBAAiB,GAAG;AAAA,IACjC,cAAc,iBAAiB,GAAG;AAAA,EACpC;AACF;AAKO,IAAM,qBAAqB,CAAC,YAAoB;AAErD,MAAI,YAAY,UAAW,QAAO;AAClC,MAAI,YAAY,UAAW,QAAO;AAGlC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF;;;ACpTO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,OAAO;AAAA;AAAA;AAAA,EAGP,WAAW,CAAC,gBAAwB;AAAA,IAClC,QAAQ,KAAK,KAAK,aAAa,IAAI;AAAA,IACnC,YAAY,KAAK,KAAK,aAAa,aAAa,GAAG;AAAA;AAAA,IACnD,aAAa,KAAK,KAAK,aAAa,aAAa,GAAG;AAAA,EACtD;AACF;AAKO,IAAM,cAAc;AAAA;AAAA,EAEzB,OAAO;AAAA,IACL,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AACF;AAKO,IAAM,eAAe;AAAA;AAAA,EAE1B,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,EACX;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EACR;AACF;AAaO,IAAM,wBAAwB;AAAA,EACnC,yBAAyB;AAAA,EACzB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOO,IAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU,CAAC,mBAAS,gBAAM,4BAAQ,4BAAQ,0BAAM;AAAA,IAChD,WAAW;AAAA,EACb;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU,CAAC,4BAAQ,4BAAQ,4BAAQ,4BAAQ,2BAAO;AAAA,IAClD,WAAW;AAAA,EACb;AACF;AAKO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,WAAW;AAAA;AAAA,EAGX,SAAS,CAAC,WAAW,MAAM;AAAA;AAAA,EAG3B,OAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AACF;AAOO,IAAM,qBAAqB;AAAA,EAChC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAOO,IAAM,WAAW;AAAA;AAAA,EAEtB,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA;AAAA,EAGA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAKO,IAAM,sBAAsB;AAAA;AAAA,EAEjC,YAAY;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;;;ACvNO,IAAM,kBAAkB;AAAA;AAAA,EAE7B,MAAM;AAAA,IACJ,YAAY;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,aAAa,EAAE;AAAA,MACxB,SAAS,EAAE,aAAa,GAAG;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,IACA,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS,CAAC,WAAW,UAAU,YAAY,MAAM;AAAA,EACnD;AACF;;;AC9EA;AAAA,EACE;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,WAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,WAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,WAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,OAAS;AAAA,IACT,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,WAAa;AAAA,EACf;AACF;;;AC0JO,IAAM,sBAAqD;AAAA,EAChE;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,qEAAc;AAAA,MAClC,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACjD;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,6FAAkB;AAAA,MACtC,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC1D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,2EAAe;AAAA,MACnC,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC3D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,+DAAa;AAAA,MACjC,SAAS,EAAE,SAAS,sCAAsC;AAAA,IAC5D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,yDAAY;AAAA,MAChC,SAAS,EAAE,SAAS,wCAAwC;AAAA,IAC9D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,6FAAkB;AAAA,MACtC,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,+DAAa;AAAA,MACjC,SAAS,EAAE,SAAS,+BAA+B;AAAA,IACrD;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,+DAAa;AAAA,MACjC,SAAS,EAAE,SAAS,wCAAwC;AAAA,IAC9D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,qEAAc;AAAA,MAClC,SAAS,EAAE,SAAS,4CAA4C;AAAA,IAClE;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,+DAAa;AAAA,MACjC,SAAS,EAAE,SAAS,sCAAsC;AAAA,IAC5D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,mBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA;AAAA;AAAA,IAGJ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,6FAAkB;AAAA,MACtC,SAAS,EAAE,SAAS,wCAAwC;AAAA,IAC9D;AAAA,IACA,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,2EAAe;AAAA,MACnC,SAAS,EAAE,SAAS,uCAAuC;AAAA,IAC7D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,2EAAe;AAAA,MACnC,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC1D;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,SAAS,EAAE,SAAS,mGAAmB;AAAA,MACvC,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,EACb;AACF;AAiBO,SAAS,iBACd,IACA,QACuD;AACvD,QAAM,QAAQ,oBAAoB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACzD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,0CAA0C,EAAE,GAAG;AAAA,EACjE;AACA,QAAM,aAAa,MAAM,KAAK,MAAM;AACpC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,6BAA6B,MAAM,8BAA8B,EAAE,GAAG;AAAA,EACxF;AACA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,GAAI,WAAW,cAAc,SAAY,EAAE,WAAW,WAAW,UAAU,IAAI,CAAC;AAAA,IAChF,GAAI,WAAW,QAAQ,SAAY,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC;AAAA,EAChE;AACF;AAyCO,IAAM,sBACX;;;ACzdK,IAAM,cAAc;AAAA;AAAA,EAEzB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;AAAA;AAAA,EAEvB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;AAAA;AAAA,EAEvB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;AAAA;AAAA,EAEtB,QAAQ,CAAC,MAAM,MAAM,MAAM,CAAC;AAC9B;AAWO,IAAM,oBAAoB;AAAA;AAAA,EAE/B,OAAO;AAAA;AAAA,EAEP,MAAM;AAAA;AAAA,EAEN,QAAQ;AAAA;AAAA,EAER,WAAW;AACb;AAMO,IAAM,cAAc;AAAA;AAAA,EAEzB,SAAS,EAAE,MAAM,UAAmB,WAAW,KAAK,SAAS,IAAI,MAAM,EAAE;AAAA;AAAA,EAEzE,QAAQ,EAAE,MAAM,UAAmB,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI;AAAA;AAAA,EAE1E,OAAO,EAAE,MAAM,UAAmB,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI;AAAA;AAAA,EAEzE,QAAQ,EAAE,MAAM,UAAmB,WAAW,IAAI,SAAS,IAAI,MAAM,EAAE;AACzE;AAOO,IAAM,SAAS;AAAA,EACpB,SAAS,EAAE,SAAS,GAAG,WAAW,oBAAoB,QAAQ,YAAY;AAAA,EAC1E,SAAS,EAAE,SAAS,GAAG,WAAW,mBAAmB,QAAQ,YAAY;AAAA,EACzE,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY,EAAE,UAAU,kBAAkB,MAAM,MAAM,YAAY,KAAK;AAAA,EACzE;AAAA,EACA,YAAY,EAAE,UAAU,kBAAkB,WAAW,MAAM,YAAY,MAAM;AAC/E;AAGO,IAAM,OAAO;AAAA,EAClB,SAAS,EAAE,SAAS,GAAG,WAAW,oBAAoB;AAAA,EACtD,SAAS,EAAE,SAAS,GAAG,WAAW,kBAAkB;AAAA,EACpD,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY,EAAE,UAAU,kBAAkB,MAAM,MAAM,YAAY,KAAK;AAAA,EACzE;AAAA,EACA,YAAY,EAAE,UAAU,kBAAkB,QAAQ,MAAM,YAAY,MAAM;AAC5E;AAGO,IAAM,QAAQ;AAAA,EACnB,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE;AAAA,EACvD,YAAY,EAAE,UAAU,GAAG,QAAQ,UAAU,MAAM,YAAY;AACjE;AAGO,IAAM,QAAQ;AAAA,EACnB,SAAS,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;AAAA,EACzB,YAAY,EAAE,UAAU,GAAG,QAAQ,UAAU,MAAM,YAAY;AACjE;AAOO,IAAM,UAAU,CAAC,gBAAgB,UACrC;AAAA,EACC,SAAS,EAAE,YAAY,EAAE,iBAAiB,cAAc,EAAE;AAC5D;AAGK,IAAM,cAAc;AAAA,EACzB,OAAO;AAAA,IACL,OAAO;AAAA,IACP,YAAY,EAAE,UAAU,kBAAkB,MAAM,MAAM,YAAY,MAAM;AAAA,EAC1E;AAAA,EACA,KAAK,EAAE,OAAO,MAAM,YAAY,EAAE,UAAU,kBAAkB,MAAM,EAAE;AAAA,EACtE,WAAW;AAAA,IACT,GAAG;AAAA,IACH,YAAY,EAAE,UAAU,kBAAkB,MAAM,MAAM,YAAY,MAAM;AAAA,EAC1E;AACF;AAGO,IAAM,WAAW;AAAA,EACtB,MAAM,EAAE,MAAM,MAAM,QAAQ,QAAiB;AAAA,EAC7C,QAAQ,EAAE,MAAM,OAAO,QAAQ,QAAiB;AAClD;AAMO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACpIO,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,aACE;AAAA;AAAA;AAAA;AAAA,EAOF,iBACE;AAAA;AAAA,EAIF,KAAK;AAAA,IACH,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YACE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,CAAC,sBAAsB,0BAA0B,8BAA8B;AAAA,IAC3F;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,CAAC,oBAAoB,oBAAoB,iBAAiB;AAAA,IACtE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,CAAC,eAAe,mBAAmB,kBAAkB,gBAAgB;AAAA,IACjF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,CAAC,YAAY,oBAAoB,mBAAmB;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU,CAAC,mBAAmB,uBAAuB,eAAe;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU;AAAA,IACR;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MAEF,UAAU,CAAC,oBAAoB,oBAAoB,eAAe,wBAAwB;AAAA,MAC1F,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MAEF,UAAU,CAAC,yBAAyB,iBAAiB,oBAAoB;AAAA,MACzE,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE;AAAA,MAEF,UAAU,CAAC,gCAAgC,8BAA8B;AAAA,MACzE,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;","names":["jsx"]}
1
+ {"version":3,"sources":["../src/metadata.ts","../src/metadata-helpers.ts","../src/components/Logo.tsx","../src/guidelines/color.ts","../src/components/LogoSVG.tsx","../src/guidelines/logo.ts","../src/guidelines/index.ts","../src/easter-egg-registry.json","../src/microcopy.ts","../src/motion.ts","../src/positioning.ts"],"sourcesContent":["/**\n * Nebutra Brand Metadata\n * Central source of truth for brand identity\n *\n * AUTO-GENERATED by `pnpm brand:apply` from `scripts/brand-types.ts`\n * (DEFAULT_BRAND) or a sibling `brand.config.ts` if present. Do NOT\n * edit by hand — your edits will be wiped on the next brand:apply.\n *\n * To rebrand, edit DEFAULT_BRAND in scripts/brand-types.ts and run\n * `pnpm brand:apply`. To extend the shape, add a field to BrandConfig,\n * set its value in DEFAULT_BRAND, then read it from this writer.\n *\n * Pipeline guard: tests/architecture/brand-metadata-drift.test.ts\n * asserts `metadata.ts` is byte-identical to what brand:apply emits.\n */\n\nexport const brand = {\n name: \"Nebutra\",\n nameCn: \"云毓智能\",\n nameFull: \"无锡云毓智能科技有限公司\",\n nameFullEn: \"Wuxi Nebutra Intelligence Technology Co., Ltd.\",\n\n tagline: \"Ship AI products, not boilerplate.\",\n taglineCn: \"AI原生·快速出海·即刻交付\",\n description:\n \"Production-ready Next.js monorepo template for AI SaaS products. Auth, billing, multi-tenancy, AI services, design system, and enterprise infrastructure — pre-configured.\",\n descriptionCn:\n \"面向AI创业者的一体化SaaS基础设施模板,覆盖认证、计费、多租户、AI服务与设计系统,开箱即产品\",\n\n story: {\n concept:\n \"Logo以首字母N的基础造型概念为主要设计框架,通过几何正负空间构建隐形'N',形成近似六边形的稳定结构\",\n colorMeaning: \"蓝绿渐变体现未来感与科技锋芒,'云'代表云端平台,'毓'寓意孕育与转化\",\n values: [\"AI Native\", \"Ship Fast\", \"Open by Default\", \"Global-Ready\", \"Enterprise-Grade\"],\n missionStatement:\n \"Help AI founders and SaaS teams go from idea to production 10x faster by providing the infrastructure layer they shouldn't have to build.\",\n },\n\n domains: {\n landing: \"nebutra.com\",\n app: \"app.nebutra.com\",\n api: \"api.nebutra.com\",\n auth: \"auth.nebutra.com\",\n sso: \"sso.nebutra.com\",\n studio: \"studio.nebutra.com\",\n cdn: \"cdn.nebutra.com\",\n router: \"router.nebutra.com\",\n forge: \"forge.nebutra.com\",\n design: \"design.nebutra.com\",\n status: \"status.nebutra.com\",\n open: \"open.nebutra.com\",\n admin: \"admin.nebutra.com\",\n analytics: \"analytics.nebutra.com\",\n pebble: \"pebble.nebutra.com\",\n carina: \"carina.nebutra.com\",\n kuanlan: \"kuanlan.nebutra.com\",\n origin: \"origin.nebutra.com\",\n },\n\n social: {\n twitter: \"https://twitter.com/nebutra\",\n github: \"https://github.com/nebutra\",\n discord: \"https://discord.gg/nebutra\",\n linkedin: \"https://linkedin.com/company/nebutra\",\n },\n} as const;\n\n/**\n * Brand Colors — full VI palette + brand gradients + semantic colors.\n * Aligned with @nebutra/design-tokens DTCG SSOT (tokens/core.json).\n */\nexport const colors = {\n primary: {\n \"50\": \"#f0f4ff\",\n \"100\": \"#dbe4ff\",\n \"200\": \"#bac8ff\",\n \"300\": \"#91a7ff\",\n \"400\": \"#5c7cfa\",\n \"500\": \"#0033FE\",\n \"600\": \"#002ad4\",\n \"700\": \"#0021ab\",\n \"800\": \"#001882\",\n \"900\": \"#000f59\",\n \"950\": \"#000830\",\n },\n accent: {\n \"50\": \"#e6fff8\",\n \"100\": \"#b3ffec\",\n \"200\": \"#80ffe0\",\n \"300\": \"#4dfcd4\",\n \"400\": \"#1af7c8\",\n \"500\": \"#0BF1C3\",\n \"600\": \"#09c9a3\",\n \"700\": \"#07a183\",\n \"800\": \"#057963\",\n \"900\": \"#035143\",\n \"950\": \"#012923\",\n },\n neutral: {\n \"0\": \"#ffffff\",\n \"50\": \"#f9fafb\",\n \"100\": \"#f3f4f6\",\n \"200\": \"#e4e5e8\",\n \"300\": \"#d2d4d8\",\n \"400\": \"#9fa1a5\",\n \"500\": \"#717377\",\n \"600\": \"#515357\",\n \"700\": \"#3f4044\",\n \"800\": \"#26272a\",\n \"900\": \"#18191c\",\n \"950\": \"#0b0c0d\",\n },\n white: \"#FFFFFF\",\n black: \"#000000\",\n gradient: {\n primary: \"linear-gradient(135deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n primaryReverse: \"linear-gradient(135deg, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n primaryVertical: \"linear-gradient(180deg, #0033FE 0%, #00A2E9 50%, #0BF1C3 100%)\",\n primaryRadial: \"radial-gradient(circle, #0BF1C3 0%, #00A2E9 50%, #0033FE 100%)\",\n },\n p3Overrides: {\n primary500: \"color(display-p3 0.03 0.19 0.99)\",\n accent500: \"color(display-p3 0.07 0.94 0.79)\",\n },\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#0033FE\",\n} as const;\n\n/**\n * Typography. fontFamily is read from design-tokens core.json:fontFamily by\n * brand:apply — change faces there, not here.\n */\nexport const typography = {\n fontFamily: {\n en: '\"Geist\", -apple-system, BlinkMacSystemFont, system-ui, sans-serif',\n cn: '\"MiSans\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif',\n sans: '\"Geist\", \"MiSans\", \"PingFang SC\", \"Microsoft YaHei\", -apple-system, BlinkMacSystemFont, system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n display: '\"DM Sans\", \"MiSans\", \"PingFang SC\", sans-serif',\n heading: '\"DM Sans\", \"MiSans\", \"PingFang SC\", sans-serif',\n },\n fontWeight: {\n thin: 100,\n extraLight: 200,\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n extraBold: 800,\n black: 900,\n },\n letterSpacing: {\n display: \"-0.04em\",\n heading: \"-0.03em\",\n subheading: \"-0.02em\",\n body: \"0em\",\n caption: \"0.01em\",\n mono: \"0em\",\n },\n lineHeight: {\n none: 1,\n tight: 1.2,\n snug: 1.4,\n normal: 1.6,\n relaxed: 1.75,\n loose: 2,\n },\n} as const;\n\n/**\n * Logo asset paths (relative to package), dual-edition structure:\n * - classic (v1.0): preferred for UX / product surfaces\n * - compliant (v2.0): required for commercial / legal contexts\n */\nexport const logoAssets = {\n classic: {\n default: \"assets/logo/logo-color.svg\",\n color: \"assets/logo/logo-color.svg\",\n inverse: \"assets/logo/logo-inverse.svg\",\n mono: \"assets/logo/logo-mono.svg\",\n en: \"assets/logo/logo-en.svg\",\n zh: \"assets/logo/logo-zh.svg\",\n zhEn: \"assets/logo/logo-zh-en.svg\",\n horizontalEn: \"assets/logo/logo-horizontal-en.svg\",\n horizontalZh: \"assets/logo/logo-horizontal-zh.svg\",\n verticalEn: \"assets/logo/logo-vertical-en.svg\",\n verticalZh: \"assets/logo/logo-vertical-zh.svg\",\n },\n compliant: {\n default: \"assets/logo-compliant/logo-color.svg\",\n color: \"assets/logo-compliant/logo-color.svg\",\n inverse: \"assets/logo-compliant/logo-inverse.svg\",\n mono: \"assets/logo-compliant/logo-mono.svg\",\n en: \"assets/logo-compliant/logo-en.svg\",\n zh: \"assets/logo-compliant/logo-zh.svg\",\n zhEn: \"assets/logo-compliant/logo-zh-en.svg\",\n horizontalEn: \"assets/logo-compliant/logo-horizontal-en.svg\",\n horizontalZh: \"assets/logo-compliant/logo-horizontal-zh.svg\",\n verticalEn: \"assets/logo-compliant/logo-vertical-en.svg\",\n verticalZh: \"assets/logo-compliant/logo-vertical-zh.svg\",\n horizontalEnMono: \"assets/logo-compliant/logo-horizontal-en-mono.svg\",\n horizontalZhMono: \"assets/logo-compliant/logo-horizontal-zh-mono.svg\",\n verticalEnMono: \"assets/logo-compliant/logo-vertical-en-mono.svg\",\n verticalZhMono: \"assets/logo-compliant/logo-vertical-zh-mono.svg\",\n },\n} as const;\n\n/**\n * Font asset paths (relative to package).\n */\nexport const fontAssets = {\n poppins: {\n thin: \"assets/fonts/poppins/Poppins-Thin.otf\",\n thinItalic: \"assets/fonts/poppins/Poppins-ThinItalic.otf\",\n extraLight: \"assets/fonts/poppins/Poppins-ExtraLight.otf\",\n extraLightItalic: \"assets/fonts/poppins/Poppins-ExtraLightItalic.otf\",\n light: \"assets/fonts/poppins/Poppins-Light.otf\",\n lightItalic: \"assets/fonts/poppins/Poppins-LightItalic.otf\",\n regular: \"assets/fonts/poppins/Poppins-Regular.otf\",\n italic: \"assets/fonts/poppins/Poppins-Italic.otf\",\n medium: \"assets/fonts/poppins/Poppins-Medium.otf\",\n mediumItalic: \"assets/fonts/poppins/Poppins-MediumItalic.otf\",\n semiBold: \"assets/fonts/poppins/Poppins-SemiBold.otf\",\n semiBoldItalic: \"assets/fonts/poppins/Poppins-SemiBoldItalic.otf\",\n bold: \"assets/fonts/poppins/Poppins-Bold.otf\",\n boldItalic: \"assets/fonts/poppins/Poppins-BoldItalic.otf\",\n extraBold: \"assets/fonts/poppins/Poppins-ExtraBold.otf\",\n extraBoldItalic: \"assets/fonts/poppins/Poppins-ExtraBoldItalic.otf\",\n black: \"assets/fonts/poppins/Poppins-Black.otf\",\n blackItalic: \"assets/fonts/poppins/Poppins-BlackItalic.otf\",\n },\n} as const;\n\n/**\n * Favicon assets.\n */\nexport const faviconAssets = {\n ico: \"assets/favicon/favicon.ico\",\n svg: \"assets/favicon/favicon.svg\",\n apple: \"assets/favicon/apple-touch-icon.png\",\n android192: \"assets/favicon/android-chrome-192x192.png\",\n android512: \"assets/favicon/android-chrome-512x512.png\",\n} as const;\n\n/**\n * OG Image dimensions.\n */\nexport const ogImageDimensions = {\n default: {\n width: 1200,\n height: 630,\n },\n twitter: {\n width: 1200,\n height: 600,\n },\n square: {\n width: 1200,\n height: 1200,\n },\n} as const;\n\nexport type BrandColors = typeof colors;\nexport type BrandTypography = typeof typography;\nexport type LogoAssets = typeof logoAssets;\n","/**\n * @nebutra/brand — metadata-helpers\n *\n * Pure functions deriving Next.js Metadata, JSON-LD objects, PWA manifest,\n * and feed channel headers from the single `brand` + `colors` SSOT.\n *\n * Zero hardcoded brand-name literals — every string is derived from `brand`\n * or `colors`. The arch drift guard `tests/architecture/brand-metadata-drift.test.ts`\n * asserts this invariant at CI time.\n *\n * NOTE: `next` is a TYPE-ONLY import here. The package declares `next` as an\n * optional peer dep + devDep (catalog:). skipLibCheck:true is set in tsconfig.json.\n * Adding `import \"server-only\"` is intentionally omitted: this file is consumed\n * by both server and client render paths in tests; the CALLER must enforce\n * server-only boundaries if needed.\n *\n * NOTE: getSiteUrl(service) in this module is DISTINCT from the zero-param\n * getSiteUrl() in apps/landing/src/lib/seo/site-routes.ts — different\n * modules, no collision. The local one remains the landing URL util.\n */\n\nimport type { Metadata, MetadataRoute } from \"next\";\nimport { brand, colors } from \"./metadata\";\n\n/** Services that have a canonical domain in brand.domains */\nexport type BrandService = keyof typeof brand.domains;\n\n/** Absolute origin from brand.domains only (no env hijack). */\nexport function getBrandOrigin(service: BrandService): string {\n const host = brand.domains[service];\n if (!host?.trim()) {\n throw new Error(`brand.domains.${String(service)} is empty — run brand:apply`);\n }\n return `https://${host.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\")}`;\n}\n\n/**\n * Public object on `nebutra-assets` via `cdn.nebutra.com`.\n * R2_PUBLIC_URL / NEXT_PUBLIC_R2_PUBLIC_URL may override the origin for dogfood.\n */\n/**\n * Where a product's documentation lives: a path on that product's own host.\n *\n * There is no `docs` entry in `brand.domains` — deliberately. A single docs\n * subdomain meant a product's own host was never where its documentation\n * lived: pebble's docs sat at docs.<domain>/pebble/* while\n * pebble.<domain>/docs/* redirected to them. One value cannot express \"each\n * product serves its own\", so the key is gone and the path is derived.\n *\n * Defaults to the marketing site, which carries the product docs. Pass a\n * service to get that product's: getDocsUrl(\"pebble\") → https://pebble.…/docs.\n */\nexport function getDocsUrl(service: BrandService = \"landing\", path = \"\"): string {\n const suffix = path.replace(/^\\/+/, \"\");\n return `${getBrandOrigin(service)}/docs${suffix ? `/${suffix}` : \"\"}`;\n}\n\n/**\n * The origin publicAssetUrl() resolves against — for CSP directives. A page\n * that loads public assets (images, the MiSans subsets) must allow exactly\n * this origin, or the browser blocks the request with no error on the page:\n * font-src 'self' blocked every MiSans face on nebutra.com until 2026-09-26.\n */\nexport function publicAssetOrigin(base?: string): string {\n return new URL(publicAssetUrl(\"x\", base)).origin;\n}\n\nexport function publicAssetUrl(key: string, base?: string): string {\n const origin = (\n base ||\n process.env.NEXT_PUBLIC_R2_PUBLIC_URL ||\n process.env.R2_PUBLIC_URL ||\n getBrandOrigin(\"cdn\")\n ).replace(/\\/+$/, \"\");\n const path = key.replace(/^\\/+/, \"\");\n if (!path || path.includes(\"..\") || path.includes(\"\\\\\")) {\n throw new Error(\"invalid_public_asset_key\");\n }\n return `${origin}/${path}`;\n}\n\n/**\n * Bare query flag that keeps a signed-in visitor on the marketing homepage\n * (`?home`, no value). Apex `/` without it is a product launcher.\n */\nexport const MARKETING_HOME_PARAM = \"home\";\n\n/**\n * Marketing homepage path. Always includes the `?home` skip — that is the\n * only signal landing honours. `getBrandOrigin(\"landing\")` is the launcher.\n *\n * `defaultLocale` is the landing path locale that lives on `/` (today `en`).\n * Pass it from `@nebutra/i18n` so brand does not import the i18n package.\n */\nexport function getMarketingHomePath(options?: {\n locale?: string;\n defaultLocale?: string;\n}): string {\n const defaultLocale = options?.defaultLocale?.trim() || \"en\";\n const locale = options?.locale?.trim();\n const path = locale && locale !== defaultLocale ? `/${locale}` : \"/\";\n return path === \"/\" ? `/?${MARKETING_HOME_PARAM}` : `${path}?${MARKETING_HOME_PARAM}`;\n}\n\n/** Absolute marketing homepage. Same contract as `getMarketingHomePath`. */\nexport function getMarketingHomeUrl(options?: { locale?: string; defaultLocale?: string }): string {\n const origin = getBrandOrigin(\"landing\");\n return new URL(getMarketingHomePath(options), `${origin}/`).toString();\n}\n\n/** Cookie parent domain from landing apex (e.g. `.example.com`). */\nexport function getBrandCookieDomain(): string {\n const apex = brand.domains.landing.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n if (!apex) return \"\";\n return apex.startsWith(\".\") ? apex : `.${apex}`;\n}\n\n/**\n * Canonical base URL. NEXT_PUBLIC_SITE_URL only overrides landing.\n */\nexport function getSiteUrl(service: BrandService = \"landing\"): string {\n if (service === \"landing\") {\n const envUrl = process.env[\"NEXT_PUBLIC_SITE_URL\"];\n if (envUrl && envUrl.trim() !== \"\") {\n return envUrl.trim().replace(/\\/+$/, \"\");\n }\n }\n return getBrandOrigin(service);\n}\n\n/** Production multi-app public URL map (dogfood brand.domains). */\nexport function getBrandPublicUrls() {\n return {\n siteUrl: getBrandOrigin(\"landing\"),\n appUrl: getBrandOrigin(\"app\"),\n apiUrl: getBrandOrigin(\"api\"),\n authUrl: getBrandOrigin(\"auth\"),\n ssoUrl: getBrandOrigin(\"sso\"),\n docsUrl: getDocsUrl(),\n routerUrl: getBrandOrigin(\"router\"),\n forgeUrl: getBrandOrigin(\"forge\"),\n designUrl: getBrandOrigin(\"design\"),\n statusUrl: getBrandOrigin(\"status\"),\n openUrl: getBrandOrigin(\"open\"),\n studioUrl: getBrandOrigin(\"studio\"),\n cdnUrl: getBrandOrigin(\"cdn\"),\n analyticsUrl: getBrandOrigin(\"analytics\"),\n pebbleUrl: getBrandOrigin(\"pebble\"),\n carinaUrl: getBrandOrigin(\"carina\"),\n cookieDomain: getBrandCookieDomain(),\n } as const;\n}\n\n/**\n * Product mailbox derived from landing apex — rebrand-safe.\n * e.g. getBrandEmail(\"contact\") → contact@example.com\n */\nexport function getBrandEmail(localPart: string): string {\n const apex = brand.domains.landing\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\")\n .replace(/^www\\./, \"\");\n if (!apex) {\n throw new Error(\"brand.domains.landing is empty — run brand:apply\");\n }\n const local = localPart.trim().replace(/@.*$/, \"\");\n if (!local) {\n throw new Error(\"getBrandEmail requires a non-empty local part\");\n }\n return `${local}@${apex}`;\n}\n\n/** Default transactional From header: `Brand <noreply@apex>`. */\nexport function getBrandMailFrom(): string {\n return `${brand.name} <${getBrandEmail(\"noreply\")}>`;\n}\n\n// ─── Metadata ────────────────────────────────────────────────────────────────\n\nexport interface SiteMetadataOptions {\n readonly service: BrandService;\n readonly title?: string;\n readonly description?: string;\n}\n\n/**\n * Returns a partial Next.js Metadata object suitable for spreading into a\n * layout.tsx export const metadata. Callers may override any field.\n */\nexport function getSiteMetadata(opts: SiteMetadataOptions): Metadata {\n const siteUrl = getSiteUrl(opts.service);\n const title = opts.title ?? brand.name;\n const description = opts.description ?? brand.tagline;\n\n return {\n applicationName: brand.name,\n title: {\n default: title,\n template: `%s — ${brand.name}`,\n },\n description,\n metadataBase: new URL(siteUrl),\n authors: [{ name: brand.name, url: siteUrl }],\n creator: brand.name,\n publisher: brand.name,\n openGraph: {\n type: \"website\",\n siteName: brand.name,\n title,\n description,\n url: siteUrl,\n },\n twitter: {\n card: \"summary_large_image\",\n site: brand.social.twitter.replace(\"https://twitter.com/\", \"@\"),\n title,\n description,\n },\n };\n}\n\n// ─── JSON-LD types ─────────────────────────────────────────────────────────────\n\nexport interface OrganizationJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"Organization\";\n \"@id\": string;\n name: string;\n alternateName: string;\n url: string;\n sameAs: string[];\n [key: string]: unknown;\n}\n\nexport interface WebSiteJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"WebSite\";\n \"@id\": string;\n name: string;\n url: string;\n description: string;\n publisher: { \"@id\": string };\n inLanguage: string[];\n [key: string]: unknown;\n}\n\nexport interface SoftwareApplicationJsonLd {\n \"@context\": \"https://schema.org\";\n \"@type\": \"SoftwareApplication\";\n name: string;\n applicationCategory: string;\n url: string;\n author: { \"@id\": string };\n [key: string]: unknown;\n}\n\nexport interface FeedChannelMeta {\n title: string;\n link: string;\n description: string;\n feedUrl: string;\n language: string;\n}\n\n// ─── JSON-LD builders ────────────────────────────────────────────────────────\n\n/**\n * Base Organization JSON-LD — company-specific fields\n * (foundingDate, address, contactPoint) are intentionally omitted here.\n * Merge them at the call site to avoid hard-coding values here.\n */\nexport function buildOrganizationJsonLd(): OrganizationJsonLd {\n const siteUrl = getSiteUrl(\"landing\");\n const id = `${siteUrl}/#organization`;\n\n const sameAs = [\n brand.social.github,\n brand.social.twitter.replace(\"https://twitter.com/\", \"https://x.com/\"),\n brand.social.linkedin,\n brand.social.discord,\n ].filter((url) => url.trim() !== \"\");\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n \"@id\": id,\n name: brand.name,\n alternateName: brand.nameCn,\n url: siteUrl,\n sameAs,\n };\n}\n\nexport function buildWebSiteJsonLd(): WebSiteJsonLd {\n const siteUrl = getSiteUrl(\"landing\");\n const org = buildOrganizationJsonLd();\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n \"@id\": `${siteUrl}/#website`,\n name: brand.name,\n url: siteUrl,\n description: brand.tagline,\n publisher: { \"@id\": org[\"@id\"] },\n inLanguage: [\"en\", \"zh\"],\n };\n}\n\nexport function buildSoftwareApplicationJsonLd(): SoftwareApplicationJsonLd {\n const org = buildOrganizationJsonLd();\n const githubPath = brand.social.github.replace(\"https://github.com/\", \"\");\n\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"SoftwareApplication\",\n name: `${brand.name} Sailor`,\n applicationCategory: \"DeveloperApplication\",\n url: `https://github.com/${githubPath}`,\n author: { \"@id\": org[\"@id\"] },\n };\n}\n\n// ─── PWA Manifest ────────────────────────────────────────────────────────────\n\n/**\n * Returns a base PWA manifest derived from brand + colors.\n * background_color and theme_color use the palette's canonical hex values\n * (NOT CSS variables — service workers do not resolve var()).\n *\n * CONTRAST CAVEAT: theme_color = colors.primary[\"500\"] assumes a dark\n * background context. If a rebrand sets a light primary, update this value.\n */\nexport function buildPwaManifest(): MetadataRoute.Manifest {\n return {\n name: `${brand.name} — ${brand.tagline}`,\n short_name: brand.name,\n description: brand.description,\n start_url: \"/\",\n display: \"standalone\",\n background_color: colors.neutral[\"950\"],\n theme_color: colors.primary[\"500\"],\n orientation: \"portrait-primary\",\n scope: \"/\",\n lang: \"en\",\n categories: [\"business\", \"productivity\", \"utilities\"],\n icons: [\n {\n src: \"/favicon.ico\",\n sizes: \"any\",\n type: \"image/x-icon\",\n },\n {\n src: \"/android-chrome-192x192.png\",\n sizes: \"192x192\",\n type: \"image/png\",\n purpose: \"maskable\",\n },\n {\n src: \"/android-chrome-512x512.png\",\n sizes: \"512x512\",\n type: \"image/png\",\n purpose: \"maskable\",\n },\n {\n src: \"/android-chrome-192x192.png\",\n sizes: \"192x192\",\n type: \"image/png\",\n purpose: \"any\",\n },\n {\n src: \"/android-chrome-512x512.png\",\n sizes: \"512x512\",\n type: \"image/png\",\n purpose: \"any\",\n },\n ],\n };\n}\n\n// ─── Feed ────────────────────────────────────────────────────────────────────\n\n/**\n * Returns the shared channel-level fields for RSS and Atom feeds.\n * Item-level links are built at the call site using the version string.\n */\nexport function buildFeedChannelMeta(): FeedChannelMeta {\n const siteUrl = getSiteUrl(\"landing\");\n\n return {\n title: `${brand.name} Changelog`,\n link: `${siteUrl}/changelog`,\n description: brand.tagline,\n feedUrl: `${siteUrl}/api/changelog`,\n language: \"en-us\",\n };\n}\n","\"use client\";\n\nimport { brand } from \"../metadata\";\nimport { publicAssetUrl } from \"../metadata-helpers\";\n\nexport type LogoVariant =\n | \"color\"\n | \"inverse\"\n | \"mono\"\n | \"en\"\n | \"zh\"\n | \"zh-en\"\n | \"horizontal-en\"\n | \"horizontal-zh\"\n | \"vertical-en\"\n | \"vertical-zh\"\n | \"horizontal-en-mono\"\n | \"horizontal-zh-mono\"\n | \"vertical-en-mono\"\n | \"vertical-zh-mono\";\n\n/**\n * Logo edition: classic (v1.0) or compliant (v2.0)\n *\n * - classic: 经典版,\"毓\"字更美观,用于用户体验场景 (App/网站/产品)\n * - compliant: 合规版,\"毓\"字符合商标规范,用于商务场景 (法律/商标/正式文件)\n */\nexport type LogoEdition = \"classic\" | \"compliant\";\n\n/** Variants that only exist in the compliant edition */\nconst COMPLIANT_ONLY_VARIANTS: ReadonlySet<LogoVariant> = new Set([\n \"horizontal-en-mono\",\n \"horizontal-zh-mono\",\n \"vertical-en-mono\",\n \"vertical-zh-mono\",\n]);\n\nexport interface LogoProps {\n /**\n * Logo variant\n * @default \"en\" (Nebutra with English wordmark)\n */\n variant?: LogoVariant;\n\n /**\n * Logo edition\n * - \"classic\" (default): v1.0 经典版,更美观\n * - \"compliant\": v2.0 合规版,符合商标规范\n *\n * Mono combination variants automatically use compliant edition.\n * @default \"classic\"\n */\n edition?: LogoEdition;\n\n /**\n * Logo size (width in pixels)\n * @default 120\n */\n size?: number;\n\n /**\n * Custom className\n */\n className?: string;\n\n /**\n * Invert colors for dark backgrounds.\n * When true, black becomes white (useful for dark mode).\n *\n * Note: For pure white logomark, use variant=\"inverse\" instead.\n */\n inverted?: boolean;\n}\n\n/**\n * Resolve the CDN object for a logo variant + edition combination.\n * Mono combination variants always route to the compliant directory.\n * `public/` copies from `pnpm brand:sync` stay as seed, not consumption.\n */\nexport function logoPublicSrc(variant: LogoVariant, edition: LogoEdition): string {\n const dir =\n edition === \"compliant\" || COMPLIANT_ONLY_VARIANTS.has(variant)\n ? \"brand/logo-compliant\"\n : \"brand/logo\";\n return publicAssetUrl(`${dir}/logo-${variant}.svg`);\n}\n\n/**\n * Aspect ratios for different logo variants\n * width:height ratio (e.g. 5.25 means width is 5.25x height)\n */\nconst ASPECT_RATIOS: Record<LogoVariant, number> = {\n color: 1.07, // 535.71 x 500 ≈ 1.07\n inverse: 1.07, // 535.71 x 500 ≈ 1.07\n mono: 1.07, // Same as color/inverse\n en: 5.25, // 544.21 x 103.74 ≈ 5.25 (horizontal text)\n zh: 3.5, // Estimated for Chinese wordmark\n \"zh-en\": 4.0, // Estimated for bilingual\n \"horizontal-en\": 5.25, // Similar to \"en\"\n \"horizontal-zh\": 4.5, // Estimated\n \"vertical-en\": 0.8, // Taller than wide\n \"vertical-zh\": 0.8, // Taller than wide\n \"horizontal-en-mono\": 5.25, // Same as horizontal-en\n \"horizontal-zh-mono\": 4.5, // Same as horizontal-zh\n \"vertical-en-mono\": 0.8, // Same as vertical-en\n \"vertical-zh-mono\": 0.8, // Same as vertical-zh\n};\n\n/**\n * Nebutra Logo Component\n *\n * Renders the official Nebutra brand logo from SVG assets (fixed VI fills).\n * Browser src is `https://cdn.nebutra.com/brand/logo{,-compliant}/…`.\n * `pnpm brand:sync` still copies seed files into each app `public/`.\n *\n * For product chrome that must recolor with Brand Package skins (roles.brand),\n * prefer LogomarkSVG / LogoEnSVG with default `text-brand-mark` instead of\n * raster VI color SVGs or `text-primary` (CTA / roles.action).\n *\n * @example\n * ```tsx\n * // Logomark only (square icon)\n * <Logo variant=\"inverse\" size={40} />\n *\n * // Full logo with English wordmark\n * <Logo variant=\"en\" size={150} />\n *\n * // Chinese wordmark\n * <Logo variant=\"zh\" size={120} />\n * ```\n */\nexport function Logo({\n variant = \"en\",\n edition = \"classic\",\n size = 120,\n className,\n inverted = false,\n}: LogoProps) {\n const aspectRatio = ASPECT_RATIOS[variant];\n const height = Math.round(size / aspectRatio);\n const src = logoPublicSrc(variant, edition);\n\n // For dark backgrounds, invert black to white\n const filterStyle = inverted ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={height}\n className={className}\n style={{ width: size, height, ...filterStyle }}\n />\n );\n}\n\n/**\n * Logomark only (the abstract icon without text)\n *\n * This uses the \"color\" or \"inverse\" variant which is just the icon.\n *\n * @example\n * ```tsx\n * <Logomark variant=\"inverse\" size={32} />\n * ```\n */\nexport function Logomark({\n size = 32,\n className,\n variant = \"color\",\n edition = \"classic\",\n inverted = false,\n}: {\n size?: number;\n className?: string;\n variant?: \"color\" | \"inverse\" | \"mono\";\n edition?: LogoEdition;\n inverted?: boolean;\n}) {\n const src = logoPublicSrc(variant, edition);\n\n // For dark backgrounds, invert black to white (unless using \"inverse\" variant which is already white)\n const filterStyle =\n inverted && variant !== \"inverse\" ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={size}\n className={className}\n style={{ width: size, height: size, ...filterStyle }}\n />\n );\n}\n\n/**\n * Wordmark only (text \"Nebutra\" without the icon)\n *\n * Uses the \"en\" variant which has the full wordmark.\n * For icon + text, use Logo with variant=\"en\".\n */\nexport function Wordmark({\n size = 100,\n className,\n variant = \"en\",\n edition = \"classic\",\n inverted = false,\n}: {\n size?: number;\n className?: string;\n variant?: \"en\" | \"zh\" | \"zh-en\";\n edition?: LogoEdition;\n inverted?: boolean;\n}) {\n const aspectRatio = ASPECT_RATIOS[variant];\n const height = Math.round(size / aspectRatio);\n const src = logoPublicSrc(variant, edition);\n\n const filterStyle = inverted ? { filter: \"brightness(0) invert(1)\" } : {};\n\n return (\n <img\n src={src}\n alt={brand.name}\n width={size}\n height={height}\n className={className}\n style={{ width: size, height, ...filterStyle }}\n />\n );\n}\n\nexport default Logo;\n","/**\n * Color Usage Guidelines - 品牌色彩使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n *\n * SSOT: Color scale values are sourced from `../metadata.ts` (`colors`),\n * which itself mirrors `@nebutra/design-tokens/tokens/core.json`.\n * The scale exports below (`nebutraBlueScale`, `nebutraCyanScale`,\n * `nebutraNeutralScale`) are kept for backwards compatibility and\n * redirect to `colors.primary`, `colors.accent`, and `colors.neutral`.\n */\nimport { colors } from \"../metadata\";\n\n// The VI records below read their colours from `colors` (the brand:apply\n// seed). rgb / hsl / gradient stops are computed from it, not restated: a\n// restated triple silently disagrees with its hex the day the seed changes.\n// CMYK stays literal — it is a print specification with no token.\n\nfunction rgbOf(hex: string) {\n const n = Number.parseInt(hex.replace(\"#\", \"\"), 16);\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\n}\n\nfunction hslOf(hex: string) {\n const { r, g, b } = rgbOf(hex);\n const [rr, gg, bb] = [r / 255, g / 255, b / 255];\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === rr) h = ((gg - bb) / d) % 6;\n else if (max === gg) h = (bb - rr) / d + 2;\n else h = (rr - gg) / d + 4;\n }\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));\n return { h: Math.round((h * 60 + 360) % 360), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\n/** `linear-gradient(135deg, #a 0%, #b 50%, #c 100%)` → its stops; the 50% stop is the OKLab midpoint. */\nfunction stopsOf(css: string) {\n return [...css.matchAll(/(#[0-9a-fA-F]{6})\\s+(\\d+)%/g)].map(([, color, position]) =>\n Number(position) === 50\n ? { color: color as string, position: 50, note: \"OKLab midpoint\" }\n : { color: color as string, position: Number(position) },\n );\n}\n\n/**\n * Brand Primary Color - 云毓蓝 (Nebutra Blue)\n *\n * 云毓蓝是品牌的核心标准色。蓝色象征科技与信任,契合云毓智能在AI-SaaS与云端数据智能领域的专业定位。\n * \"云\"代表云端平台,\"毓\"寓意孕育与转化。\n */\nexport const nebutraBlue = {\n name: \"云毓蓝\",\n nameEn: \"Nebutra Blue\",\n\n /** Color values */\n hex: colors.primary[500],\n rgb: rgbOf(colors.primary[500]),\n hsl: hslOf(colors.primary[500]),\n\n /** Print color values (if needed) */\n cmyk: { c: 100, m: 80, y: 0, k: 0 },\n\n /** Semantic meaning */\n meaning: \"象征科技与信任,体现创新、可靠与无限潜力\",\n\n /** Usage */\n usage: [\"主要品牌色\", \"标志主色\", \"重要按钮/CTA\", \"标题强调\", \"链接颜色\"],\n} as const;\n\n/**\n * Brand Secondary Color - 云毓青 (Nebutra Cyan)\n *\n * 品牌主要辅助色定义为\"云毓青\"。它源于数据流动与智能交互的瞬间,\n * 青色的通透感象征着信息的清晰与算法的灵动。\n */\nexport const nebutraCyan = {\n name: \"云毓青\",\n nameEn: \"Nebutra Cyan\",\n\n /** Color values */\n hex: colors.accent[500],\n rgb: rgbOf(colors.accent[500]),\n hsl: hslOf(colors.accent[500]),\n\n /** Print color values (if needed) */\n cmyk: { c: 55, m: 0, y: 35, k: 0 },\n\n /** Semantic meaning */\n meaning: \"象征信息的清晰与算法的灵动,体现从原始数据到智慧产品的转化路径\",\n\n /** Usage */\n usage: [\"辅助品牌色\", \"渐变终止色\", \"交互反馈\", \"成功状态\", \"数据可视化\"],\n} as const;\n\n/**\n * Brand Gradient - 品牌渐变\n *\n * 色彩上使用清新明快的蓝绿渐变,通过线性渐变与角度渐变的方式填充,\n * 让整体更具未来感与科技的锋芒。\n */\nexport const brandGradient = {\n /** Primary gradient (135°) - Logo标准渐变;中点为 OKLab 感知中点,控中段避免脏灰 */\n primary: {\n css: colors.gradient.primary,\n angle: 135,\n stops: stopsOf(colors.gradient.primary),\n usage: \"Logo、Hero区域、VI 品牌资产(产品 CTA 用 solid primary)\",\n },\n\n /** Reverse gradient */\n reverse: {\n css: colors.gradient.primaryReverse,\n angle: 135,\n stops: stopsOf(colors.gradient.primaryReverse),\n usage: \"次要元素、hover状态\",\n },\n\n /** Vertical gradient */\n vertical: {\n css: colors.gradient.primaryVertical,\n angle: 180,\n stops: stopsOf(colors.gradient.primaryVertical),\n usage: \"垂直布局元素、页面分割\",\n },\n\n /** Radial gradient */\n radial: {\n css: colors.gradient.primaryRadial,\n type: \"radial\",\n stops: stopsOf(colors.gradient.primaryRadial),\n usage: \"背景光晕、焦点效果\",\n },\n} as const;\n\n/**\n * Neutral Colors - 黑白 (VI标准)\n */\nexport const neutralColors = {\n white: {\n name: \"白\",\n nameEn: \"White\",\n hex: \"#FFFFFF\",\n rgb: { r: 255, g: 255, b: 255 },\n usage: \"背景、文字反白\",\n },\n black: {\n name: \"黑\",\n nameEn: \"Black\",\n hex: \"#000000\",\n rgb: { r: 0, g: 0, b: 0 },\n usage: \"正文文字、墨稿标志\",\n },\n} as const;\n\n/**\n * Color Prohibited Uses - 色彩禁用示例\n *\n * 为了使品牌标准色彩在未来的传播中更加科学有效,设置标准色和辅助色的使用规范。\n */\nexport const colorProhibitedUses = [\n {\n id: \"high-saturation-overlay\",\n name: \"高饱和度背景与颜色重叠\",\n description: \"禁用高饱和度背景与颜色重叠,避免颜色过于刺眼,影响品牌形象\",\n example: \"不要在高饱和度的红、橙、黄等背景上使用品牌色\",\n },\n {\n id: \"high-brightness-overlay\",\n name: \"明度过高的重叠颜色\",\n description: \"禁用明度过高的重叠颜色,避免影响内容的识别性\",\n example: \"不要将浅色品牌色放在浅色背景上\",\n },\n {\n id: \"modify-brand-colors\",\n name: \"修改品牌标准色\",\n description: \"禁止调整品牌色的色相、饱和度或明度\",\n example: \"不要将云毓蓝调成紫色或浅蓝\",\n },\n {\n id: \"non-brand-gradient\",\n name: \"非品牌渐变\",\n description: \"禁止使用非品牌标准的渐变组合\",\n example: \"不要将云毓蓝与其他非品牌色进行渐变\",\n },\n] as const;\n\n/**\n * Allowed Color Combinations - 允许使用的色彩组合\n */\nexport const allowedColorCombinations = [\n {\n name: \"品牌渐变背景 + 白色文字\",\n background: brandGradient.primary.css,\n foreground: \"#FFFFFF\",\n contrast: \"AAA\",\n },\n {\n name: \"白色背景 + 云毓蓝文字\",\n background: \"#FFFFFF\",\n foreground: \"#0033FE\",\n contrast: \"AAA\",\n },\n {\n name: \"深色背景 + 云毓青强调\",\n background: \"#000000\",\n foreground: \"#0BF1C3\",\n contrast: \"AAA\",\n },\n {\n name: \"云毓蓝背景 + 白色文字\",\n background: \"#0033FE\",\n foreground: \"#FFFFFF\",\n contrast: \"AAA\",\n },\n] as const;\n\n/**\n * Nebutra Blue Color Scale - 云毓蓝色阶\n *\n * Re-exported from `colors.primary` (metadata.ts SSOT).\n * Direct hex literals were removed to eliminate the multi-source drift documented\n * in docs/design-system/token-drift-audit.md.\n */\nexport const nebutraBlueScale = colors.primary;\n\n/**\n * Nebutra Cyan Color Scale - 云毓青色阶\n *\n * Re-exported from `colors.accent` (metadata.ts SSOT).\n */\nexport const nebutraCyanScale = colors.accent;\n\n/**\n * Extended Neutral Colors - Slate (cool blue-undertone gray scale)\n *\n * Re-exported from `colors.neutral` (metadata.ts SSOT). Slate, not Zinc.\n * The `0` step (white) is omitted to keep the legacy 50–950 scale shape intact.\n */\nexport const nebutraNeutralScale = {\n 50: colors.neutral[50],\n 100: colors.neutral[100],\n 200: colors.neutral[200],\n 300: colors.neutral[300],\n 400: colors.neutral[400],\n 500: colors.neutral[500],\n 600: colors.neutral[600],\n 700: colors.neutral[700],\n 800: colors.neutral[800],\n 900: colors.neutral[900],\n 950: colors.neutral[950],\n} as const;\n\n/**\n * Semantic Color Tokens - 语义化颜色\n *\n * Pre-defined combinations for common UI patterns\n */\nexport const semanticColors = {\n // Surface colors\n surface: {\n light: {\n default: nebutraNeutralScale[50],\n subtle: nebutraNeutralScale[100],\n muted: nebutraNeutralScale[200],\n },\n dark: {\n default: nebutraNeutralScale[950],\n subtle: nebutraNeutralScale[900],\n muted: nebutraNeutralScale[800],\n },\n },\n\n // Text colors\n text: {\n light: {\n primary: nebutraNeutralScale[900],\n secondary: nebutraNeutralScale[600],\n muted: nebutraNeutralScale[400],\n inverse: \"#ffffff\",\n },\n dark: {\n primary: nebutraNeutralScale[50],\n secondary: nebutraNeutralScale[300],\n muted: nebutraNeutralScale[500],\n inverse: nebutraNeutralScale[900],\n },\n },\n\n // Border colors\n border: {\n light: {\n default: nebutraNeutralScale[200],\n subtle: nebutraNeutralScale[100],\n strong: nebutraNeutralScale[300],\n },\n dark: {\n default: nebutraNeutralScale[800],\n subtle: nebutraNeutralScale[900],\n strong: nebutraNeutralScale[700],\n },\n },\n\n // Brand emphasis\n brand: {\n primary: nebutraBlueScale[500],\n primaryHover: nebutraBlueScale[600],\n primaryActive: nebutraBlueScale[700],\n accent: nebutraCyanScale[500],\n accentHover: nebutraCyanScale[600],\n accentActive: nebutraCyanScale[700],\n },\n} as const;\n\n/**\n * Color Scale Generator (legacy - prefer using pre-defined scales)\n */\nexport const generateColorScale = (baseHex: string) => {\n // For runtime generation, return the appropriate pre-defined scale\n if (baseHex === \"#0033FE\") return nebutraBlueScale;\n if (baseHex === \"#0BF1C3\") return nebutraCyanScale;\n\n // Fallback: return base color for all steps\n return {\n 50: baseHex,\n 100: baseHex,\n 200: baseHex,\n 300: baseHex,\n 400: baseHex,\n 500: baseHex,\n 600: baseHex,\n 700: baseHex,\n 800: baseHex,\n 900: baseHex,\n 950: baseHex,\n };\n};\n\n// Type exports\nexport type ColorProhibitedUse = (typeof colorProhibitedUses)[number];\nexport type AllowedColorCombination = (typeof allowedColorCombinations)[number];\n","/**\n * Inline SVG Logo Components\n *\n * These components render SVG paths directly in JSX (no <img> tag, no public folder).\n *\n * ## Asset taxonomy (do not conflate)\n *\n * | Kind | What it is | Use |\n * |------|------------|-----|\n * | **正标 multi-path** | Illustrator export: real facet paths + true gradients (`logo-color.svg`, `logo-horizontal-en.svg`) | Light / print-faithful color |\n * | **Mono path** | Single `LOGOMARK_PATH` + `currentColor` (`LogomarkSVG`, `LogoEnSVG`) | Dark inverse, themed chrome |\n * | **LogoEnColorSVG** | Mono path painted with a fake linearGradient + baked `#060307` wordmark | **Avoid for nav** — not VI 正标 |\n *\n * ## Product chrome: 图形 / 文字 must be decoupled\n *\n * Swapping one baked horizontal SVG (light) for one mono composite (dark) locks\n * mark fills to the wordmark and fails \"文字 logo 解耦\". Preferred pattern:\n *\n * ```tsx\n * // Light: official multi-path color MARK only\n * <Image src={logoColor} className=\"h-6 w-auto dark:hidden\" unoptimized alt=\"\" />\n * // Dark: mono MARK\n * <LogomarkSVG className=\"hidden h-6 w-6 !text-white dark:block\" />\n * // BOTH themes: independent WORDMARK (currentColor)\n * <WordmarkEnSVG className=\"h-4.5 w-auto !text-[var(--neutral-12)] dark:!text-white\" />\n * ```\n *\n * Reference implementation: `apps/sailor-docs/src/app/[lang]/layout.tsx` nav title.\n *\n * **Mono** (`LogoEnSVG` / `LogomarkSVG` / `WordmarkEnSVG`): fill=\"currentColor\".\n * Default class injects `text-brand-mark`; override with `!text-*` when needed.\n *\n * Source assets: packages/design/brand/assets/logo/\n */\n\nimport { brandGradient } from \"../guidelines/color\";\n\n/** Default logo fill = brand-mark (not product CTA primary). */\nconst LOGO_MARK_CLASS = \"text-brand-mark\";\n\n/** className last so callers can override color (e.g. dark:!text-white). */\nfunction mergeLogoClass(className?: string): string {\n return className ? `${LOGO_MARK_CLASS} ${className}` : LOGO_MARK_CLASS;\n}\n\ninterface SVGProps {\n className?: string;\n width?: number;\n height?: number;\n \"aria-label\"?: string;\n}\n\n// ─── Logomark (hexagonal N icon) ──────────────────────────────────────────────\n// Source: assets/logo/logo-inverse.svg viewBox=\"0 0 535.71 500\"\n\nconst LOGOMARK_PATH =\n \"M518.13,184.13c-12.15-21.05-29.76-37.95-50.42-49.37c0.53-23.73-5.29-47.58-17.52-68.75l-0.14-0.25\" +\n \"c-22.88-39.63-65.11-64.6-110.74-65.72C338.93,0.02,338.55,0,338.17,0h-1.77h-0.25H199.87c-46.89,0-90.58,25.23-114.02,65.83\" +\n \"L17.58,184.07c-23.45,40.61-23.45,91.06,0,131.66C29.74,336.78,47.34,353.69,68,365.1c-0.56,23.78,5.28,47.68,17.53,68.91l0.13,0.22\" +\n \"c23.37,40.48,66.92,65.68,113.66,65.77c0.09,0,0.17,0,0.26,0c1.86,0,3.71-0.05,5.56-0.13h130.7c46.89,0,90.58-25.23,114.02-65.83\" +\n \"l68.26-118.24C541.58,275.19,541.58,224.74,518.13,184.13z M279.32,473.01c13.65-10.39,25.34-23.48,34.17-38.76l102.56-177.57\" +\n \"l34.14-59.1c6.16-10.67,10.69-22.03,13.61-33.7c12.53,8.68,23.24,20.09,31.08,33.68c18.66,32.33,18.66,72.49,0,104.81l-68.26,118.24\" +\n \"c-18.66,32.33-53.44,52.41-90.77,52.41H279.32z M108.77,420.56c-7.92-13.72-12.46-28.85-13.65-44.2c-0.24-3.1-0.34-6.22-0.31-9.33\" +\n \"c8.79,8.47,20.26,13.61,32.79,14.47c1.24,0.09,2.5,0.13,3.76,0.13h75.97l60.51-104.81l18.47,31.99l4.01,6.95\" +\n \"c1.21,2.09,2.54,4.08,3.98,5.95c2.87,3.73,6.17,7.01,9.82,9.79c8.89,6.78,19.83,10.58,31.54,10.68l-45.42,78.64\" +\n \"c-14.76,25.56-39.6,43.43-67.81,49.78c-5.54,1.25-11.21,2.05-16.97,2.37c-1.95,0.11-3.91,0.18-5.88,0.18c-0.07,0-0.14,0-0.21,0\" +\n \"c-3.13-0.01-6.24-0.17-9.33-0.45c-33.59-3.1-64.1-22.39-81.14-51.92L108.77,420.56z M199.87,26.85h56.7\" +\n \"c-13.72,10.41-25.48,23.55-34.35,38.9l-67.45,116.78c-0.34,0.54-0.67,1.09-0.99,1.64L85.57,302.33c-0.35,0.61-0.68,1.22-1.01,1.83\" +\n \"c-5.65,10.13-9.85,20.84-12.62,31.85c-12.55-8.68-23.26-20.1-31.11-33.7c-18.66-32.33-18.66-72.49,0-104.81L109.1,79.26\" +\n \"C127.77,46.93,162.55,26.85,199.87,26.85z M426.94,79.44c7.9,13.68,12.44,28.77,13.64,44.06c0.25,3.14,0.36,6.29,0.32,9.44\" +\n \"c-9.22-8.91-21.4-14.14-34.65-14.6c-0.64-0.02-1.29-0.04-1.93-0.04h-0.21h-75.76l-60.51,104.81l-18.46-31.98l-4.02-6.96\" +\n \"c-1.21-2.09-2.54-4.08-3.98-5.95c-2.87-3.73-6.17-7.01-9.82-9.8c-8.87-6.76-19.78-10.57-31.46-10.68l45.38-78.57\" +\n \"c14.75-25.54,39.55-43.4,67.72-49.76c5.54-1.25,11.22-2.06,16.97-2.39c1.98-0.11,3.97-0.18,5.96-0.18c0.07,0,0.13,0,0.2,0\" +\n \"c3.11,0.01,6.19,0.16,9.25,0.44c33.62,3.08,64.16,22.38,81.2,51.9L426.94,79.44z\";\n\nexport function LogomarkSVG({\n className,\n width = 32,\n height = 32,\n \"aria-label\": ariaLabel,\n}: SVGProps) {\n const mergedClass = mergeLogoClass(className);\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 535.71 500\"\n width={width}\n height={height}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n fill=\"currentColor\"\n >\n <path d={LOGOMARK_PATH} />\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 535.71 500\"\n width={width}\n height={height}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n fill=\"currentColor\"\n >\n <path d={LOGOMARK_PATH} />\n </svg>\n );\n}\n\n// ─── English Wordmark (\"Nebutra\" text) ────────────────────────────────────────\n// Source: assets/logo/logo-en.svg viewBox=\"0 0 544.21 103.74\"\n\nfunction WordmarkPaths() {\n return (\n <>\n {/* N */}\n <path\n d=\"M78.69,102.73H67.76c-3.87,0-7.47-1.96-9.56-5.21L18.27,35.5v55.86c0,6.28-5.09,11.37-11.37,11.37H0V0h10.93\n c3.87,0,7.47,1.96,9.56,5.21l39.94,62.01V11.37C60.43,5.09,65.52,0,71.8,0h6.89V102.73z\"\n />\n {/* E */}\n <rect x=\"102.92\" y=\"53.18\" width=\"66.72\" height=\"18.27\" />\n <path\n d=\"M147.44,80.28c-4.3,3.7-10.07,5.73-16.31,5.07c-9.76-1.04-17.69-8.78-18.93-18.52\n c-1.78-14.01,10.06-25.86,24.08-24.06c9.61,1.23,17.29,8.97,18.47,18.58c0.44,3.58-0.02,7-1.16,10.1h18.89\n c0.46-2.41,0.71-4.88,0.71-7.42c0-22.91-19.49-41.34-42.76-39.6C111,25.89,95.33,41.56,93.87,60.98\n c-1.75,23.27,16.69,42.76,39.6,42.76c14.91,0,27.92-8.26,34.71-20.45l-7.81-4.33C156.21,76.65,151.05,77.18,147.44,80.28z\"\n />\n {/* I */}\n <path d=\"M205.06,102.73h-6.89c-6.28,0-11.37-5.09-11.37-11.37V0h6.89c6.28,0,11.37,5.09,11.37,11.37V102.73z\" />\n {/* O */}\n <path\n d=\"M226.5,103.74c-21.9,0-39.71-17.81-39.71-39.71s17.81-39.71,39.71-39.71s39.71,17.81,39.71,39.71\n S248.4,103.74,226.5,103.74z M226.5,42.58c-11.83,0-21.45,9.62-21.45,21.45c0,11.83,9.62,21.45,21.45,21.45\n c11.82,0,21.45-9.62,21.45-21.45C247.95,52.2,238.33,42.58,226.5,42.58z\"\n />\n {/* U */}\n <path\n d=\"M315.89,103.74c-19.34,0.33-35.17-15.84-35.17-35.18V24.32h6.89c6.28,0,11.37,5.09,11.37,11.37v33.08\n c0,8.83,6.85,16.36,15.68,16.7c9.28,0.35,16.94-7.09,16.94-16.29V35.69c0-6.28,5.09-11.37,11.37-11.37h6.89v44.85\n C349.86,88.03,334.67,103.41,315.89,103.74z\"\n />\n {/* L */}\n <path\n d=\"M403.08,102.73c-20.83,0-37.77-16.95-37.77-37.77V11.37C365.3,5.09,370.4,0,376.68,0h6.89v64.96\n c0,8.22,5.11,15.26,12.31,18.13c4.34,1.73,7.2,5.9,7.2,10.57V102.73z\"\n />\n <path d=\"M391.71,44.44h-17.27V26.17h28.64v6.89C403.08,39.35,397.99,44.44,391.71,44.44z\" />\n {/* R */}\n <path\n d=\"M436.06,102.74h-6.89c-6.28,0-11.37-5.09-11.37-11.37V65.35c0-22.63,18.41-41.03,41.03-41.03v8.85\n c0,4.84-3.08,9.11-7.63,10.74c-8.81,3.14-15.13,11.57-15.13,21.45V102.74z\"\n />\n {/* A */}\n <path d=\"M544.21,102.73h-6.89c-6.28,0-11.37-5.09-11.37-11.37V64.03h18.27V102.73z\" />\n <path\n d=\"M504.5,103.74c-21.9,0-39.71-17.81-39.71-39.71s17.81-39.71,39.71-39.71c21.9,0,39.71,17.81,39.71,39.71\n S526.4,103.74,504.5,103.74z M504.5,42.58c-11.83,0-21.45,9.62-21.45,21.45c0,11.83,9.62,21.45,21.45,21.45\n c11.82,0,21.45-9.62,21.45-21.45C525.94,52.2,516.32,42.58,504.5,42.58z\"\n />\n </>\n );\n}\n\nexport function WordmarkEnSVG({\n className,\n width = 150,\n height,\n \"aria-label\": ariaLabel,\n}: SVGProps) {\n const computedHeight = height ?? Math.round((width * 103.74) / 544.21);\n const mergedClass = mergeLogoClass(className);\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 544.21 103.74\"\n width={width}\n height={computedHeight}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 544.21 103.74\"\n width={width}\n height={computedHeight}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </svg>\n );\n}\n\n// ─── Full Logo (logomark + wordmark, horizontal) ───────────────────────────────\n// Composite of logomark + English wordmark side-by-side, matching Logo variant=\"en\"\n\nexport interface LogoEnSVGProps extends SVGProps {\n /** Gap between logomark and wordmark (default 12px) */\n gap?: number;\n}\n\nfunction layoutLogoEn(width: number, gap: number) {\n const logomarkAspect = 535.71 / 500;\n const wordmarkAspect = 544.21 / 103.74;\n const h = Math.round(width / (logomarkAspect + gap / width + wordmarkAspect));\n const logomarkW = Math.round(h * logomarkAspect);\n const wordmarkW = Math.round(h * wordmarkAspect);\n const totalW = logomarkW + gap + wordmarkW;\n return { h, logomarkW, wordmarkW, totalW };\n}\n\nexport function LogoEnSVG({\n className,\n width = 160,\n gap = 12,\n \"aria-label\": ariaLabel,\n}: LogoEnSVGProps) {\n const { h, logomarkW, wordmarkW, totalW } = layoutLogoEn(width, gap);\n const mergedClass = mergeLogoClass(className);\n\n const children = (\n <>\n <g transform={`scale(${logomarkW / 535.71}, ${h / 500})`} fill=\"currentColor\">\n <path d={LOGOMARK_PATH} />\n </g>\n <g\n transform={`translate(${logomarkW + gap}, 0) scale(${wordmarkW / 544.21}, ${h / 103.74})`}\n fill=\"currentColor\"\n >\n <WordmarkPaths />\n </g>\n </>\n );\n\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={mergedClass}\n aria-label={ariaLabel}\n role=\"img\"\n >\n {children}\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={mergedClass}\n aria-hidden=\"true\"\n role=\"img\"\n >\n {children}\n </svg>\n );\n}\n\n// Per-render unique gradient ids (duplicate fixed ids break fill=url(#…) when\n// nav renders twice or a sibling SVG is display:none — mark becomes invisible).\nlet logoColorGradSeq = 0;\n\n/**\n * Full English logo with VI color fills (gradient mark + #060307 wordmark).\n * For light surfaces. Dark inverse: use LogoEnSVG with text-white instead.\n */\nexport function LogoEnColorSVG({\n className,\n width = 160,\n gap = 12,\n \"aria-label\": ariaLabel,\n}: LogoEnSVGProps) {\n const { h, logomarkW, wordmarkW, totalW } = layoutLogoEn(width, gap);\n logoColorGradSeq += 1;\n const gradId = `nebutra-logo-en-color-grad-${logoColorGradSeq}`;\n\n // objectBoundingBox: gradient follows the path's painted bbox after scale().\n // userSpaceOnUse with native 0–535 coords was wrong — root viewBox is ~151×22,\n // so the gradient sat outside the mark and the icon looked empty (wordmark only).\n const children = (\n <>\n <defs>\n <linearGradient id={gradId} gradientUnits=\"objectBoundingBox\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n {brandGradient.primary.stops.map((stop) => (\n <stop key={stop.position} offset={stop.position / 100} stopColor={stop.color} />\n ))}\n </linearGradient>\n </defs>\n <g transform={`scale(${logomarkW / 535.71}, ${h / 500})`}>\n <path d={LOGOMARK_PATH} fill={`url(#${gradId})`} />\n </g>\n <g\n transform={`translate(${logomarkW + gap}, 0) scale(${wordmarkW / 544.21}, ${h / 103.74})`}\n fill=\"#060307\"\n >\n <WordmarkPaths />\n </g>\n </>\n );\n\n if (ariaLabel) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={className}\n aria-label={ariaLabel}\n role=\"img\"\n >\n {children}\n </svg>\n );\n }\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${totalW} ${h}`}\n width={totalW}\n height={h}\n className={className}\n aria-hidden=\"true\"\n role=\"img\"\n >\n {children}\n </svg>\n );\n}\n","/**\n * Logo Usage Guidelines - 品牌标志使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n */\n\n/**\n * Logo Safety Zone (安全空间)\n *\n * 标志应用时必须保留安全空间,最小边距不小于标志高度的 1/4\n * The minimum margin around the logo should be at least 1/4 of the logo height\n */\nexport const logoSafetyZone = {\n /** Safety zone ratio relative to logo height */\n ratio: 0.25, // 1/4 of logo height\n\n /** Calculate safety zone in pixels */\n calculate: (logoHeight: number) => ({\n margin: Math.ceil(logoHeight * 0.25),\n totalWidth: Math.ceil(logoHeight + logoHeight * 0.5), // logo + 2x margin\n totalHeight: Math.ceil(logoHeight + logoHeight * 0.5),\n }),\n} as const;\n\n/**\n * Minimum Logo Sizes (最小化比例限定)\n */\nexport const logoMinSize = {\n /** Print media: height ≥ 6mm */\n print: {\n minHeightMm: 6,\n description: \"印刷媒体上最小使用:高度大于等于 6mm\",\n },\n\n /** Digital media: height ≥ 35px */\n digital: {\n minHeightPx: 35,\n description: \"网络媒体上最小使用:高度大于等于 35px\",\n },\n} as const;\n\n/**\n * Logo Variants (标志组合形式)\n */\nexport const logoVariants = {\n /** 标志左右组合 - Horizontal combination */\n horizontal: {\n zh: \"logo-horizontal-zh\",\n en: \"logo-horizontal-en\",\n useCase: \"适配横向空间(如门店招牌、横幅广告)\",\n },\n\n /** 标志上下组合 - Vertical combination */\n vertical: {\n zh: \"logo-vertical-zh\",\n en: \"logo-vertical-en\",\n useCase: \"适配纵向空间(如名片、工牌)\",\n },\n\n /** 单色组合 - Monochrome combinations (compliant edition only) */\n horizontalMono: {\n zh: \"logo-horizontal-zh-mono\",\n en: \"logo-horizontal-en-mono\",\n useCase: \"适配单色印刷横向场景(传真、黑白打印)\",\n },\n verticalMono: {\n zh: \"logo-vertical-zh-mono\",\n en: \"logo-vertical-en-mono\",\n useCase: \"适配单色印刷纵向场景(名片黑白版、工牌单色版)\",\n },\n\n /** 标志单独使用 */\n logomark: {\n color: \"logo-color\",\n inverse: \"logo-inverse\",\n mono: \"logo-mono\",\n },\n\n /** 品牌名称单独使用 */\n wordmark: {\n zh: \"logo-zh\",\n en: \"logo-en\",\n zhEn: \"logo-zh-en\",\n },\n} as const;\n\n/**\n * Product-chrome dual-theme rule (2026-07 lesson)\n *\n * Nav / shell must **decouple** logomark from wordmark:\n * - Light mark: multi-path VI color asset (`logo-color`), not mono+fake gradient\n * - Dark mark: mono `currentColor` white\n * - Wordmark: independent `currentColor` both themes\n *\n * Do not theme by swapping one baked horizontal file for one mono composite.\n * See packages/design/brand/README.md and apps/sailor-docs nav layout.\n */\nexport const productChromeLogoRule = {\n decoupleMarkAndWordmark: true,\n lightMark: \"logo-color\",\n darkMark: \"LogomarkSVG + text-white\",\n wordmark: \"WordmarkEnSVG + theme text token\",\n avoid: [\n \"LogoEnColorSVG for nav\",\n \"logo-horizontal-en light + LogoEnSVG dark whole-swap\",\n \"CSS filter invert on color SVGs\",\n ],\n} as const;\n\n/**\n * Logo Editions (品牌标志版本)\n *\n * v1.0 经典版与 v2.0 合规版的区别在于中文\"毓\"字的写法。\n */\nexport const logoEditions = {\n classic: {\n version: \"1.0\",\n name: \"经典版\",\n nameEn: \"Classic\",\n description: \"原始设计版本,'毓'字更美观流畅\",\n useCases: [\"App界面\", \"网站\", \"产品内嵌\", \"营销物料\", \"社交媒体\"],\n directory: \"logo\",\n },\n compliant: {\n version: \"2.0\",\n name: \"合规版\",\n nameEn: \"Compliant\",\n description: \"商标合规版本,'毓'字符合标准字形规范\",\n useCases: [\"法律文件\", \"商标注册\", \"正式合同\", \"政府报备\", \"发票/收据\"],\n directory: \"logo-compliant\",\n },\n} as const;\n\n/**\n * Logo Color Usage (标志颜色使用)\n */\nexport const logoColorUsage = {\n /** Preferred: Full color gradient (彩色渐变) */\n preferred: \"color\",\n\n /** Allowed: Single color versions */\n allowed: [\"inverse\", \"mono\"] as const,\n\n /** Rules */\n rules: {\n lightBackground: \"优先使用彩色标识\",\n darkBackground: \"允许使用反白标识\",\n complexBackground: \"禁止在复杂背景中使用反白标识,以防辨识度降低\",\n print: \"单色印刷时使用墨稿版本\",\n special: \"烫金、烫银等特殊工艺使用对应墨稿版本\",\n },\n} as const;\n\n/**\n * Prohibited Logo Uses (使用限定 / 禁用规则)\n *\n * 从\"反向约束\"角度保障品牌标志的完整性、识别性和品牌形象的一致性\n */\nexport const logoProhibitedUses = [\n {\n id: \"stretch\",\n name: \"拉伸变形\",\n description: \"禁止对标志进行任何方向的拉伸或压缩\",\n },\n {\n id: \"rotate\",\n name: \"旋转\",\n description: \"禁止旋转标志角度\",\n },\n {\n id: \"outline\",\n name: \"描边\",\n description: \"禁止给标志添加描边效果\",\n },\n {\n id: \"shadow\",\n name: \"投影\",\n description: \"禁止给标志添加投影效果\",\n },\n {\n id: \"gradient-modify\",\n name: \"修改渐变\",\n description: \"禁止修改标志原有的渐变色彩\",\n },\n {\n id: \"recolor\",\n name: \"随意换色\",\n description: \"禁止使用非品牌标准色替换标志颜色\",\n },\n {\n id: \"partial\",\n name: \"部分使用\",\n description: \"禁止只使用标志的一部分\",\n },\n {\n id: \"modify-elements\",\n name: \"修改元素\",\n description: \"禁止添加、删除或修改标志中的任何元素\",\n },\n {\n id: \"low-contrast\",\n name: \"低对比度\",\n description: \"禁止在对比度过低的背景上使用标志\",\n },\n {\n id: \"complex-bg\",\n name: \"复杂背景\",\n description: \"禁止在浅色或复杂背景中使用反白标识\",\n },\n] as const;\n\n/**\n * Logo Grid System (方格制图)\n *\n * 通过精确的网格比例,规定标志中各元素的尺寸、间距等参数\n */\nexport const logoGrid = {\n /** Logo mark grid unit */\n logomark: {\n gridUnit: \"a\",\n width: \"7.5a\",\n height: \"7.5a\",\n },\n\n /** Chinese wordmark grid */\n wordmarkCn: {\n gridUnit: \"a\",\n width: \"13.5a\",\n height: \"3a\",\n },\n\n /** English wordmark grid */\n wordmarkEn: {\n gridUnit: \"a\",\n width: \"14a\",\n height: \"2a\",\n },\n\n /** Combined logo grid (Chinese + English) */\n combined: {\n gridUnit: \"a\",\n width: \"13.5a\",\n height: \"5.5a\",\n },\n} as const;\n\n/**\n * Logo Special Versions (特殊版本)\n */\nexport const logoSpecialVersions = {\n /** 墨稿版本 - Monochrome versions */\n monochrome: {\n black: \"用于单色印刷、传真等场景\",\n white: \"用于深色背景、反白印刷\",\n },\n\n /** 工艺版本 - Special process versions */\n process: {\n gold: \"烫金工艺\",\n silver: \"烫银工艺\",\n },\n} as const;\n\n// Type exports\nexport type LogoVariant = keyof typeof logoVariants;\nexport type LogoProhibitedUse = (typeof logoProhibitedUses)[number];\n","/**\n * Brand Guidelines - 品牌使用规范\n *\n * Based on: 云毓智能品牌视觉识别手册 (Nebutra Brand Visual Identity Manual)\n *\n * This module provides programmatic access to brand guidelines for:\n * - Design system integration\n * - Automated compliance checking\n * - Documentation generation\n */\n\nimport { colors, typography } from \"../metadata\";\n\nexport type { AllowedColorCombination, ColorProhibitedUse } from \"./color\";\n// Color Guidelines\nexport {\n allowedColorCombinations,\n brandGradient,\n colorProhibitedUses,\n generateColorScale,\n nebutraBlue,\n // Complete color scales\n nebutraBlueScale,\n nebutraCyan,\n nebutraCyanScale,\n nebutraNeutralScale,\n neutralColors,\n semanticColors,\n} from \"./color\";\nexport type { LogoProhibitedUse, LogoVariant } from \"./logo\";\n// Logo Guidelines\nexport {\n logoColorUsage,\n logoEditions,\n logoGrid,\n logoMinSize,\n logoProhibitedUses,\n logoSafetyZone,\n logoSpecialVersions,\n logoVariants,\n productChromeLogoRule,\n} from \"./logo\";\n\nfunction firstFamily(stack: string): string {\n return (stack.split(\",\")[0] ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n}\n\n/**\n * Complete Brand Guidelines Object\n *\n * Unified export for easy consumption\n */\nexport const brandGuidelines = {\n // Logo\n logo: {\n safetyZone: {\n ratio: 0.25,\n description: \"最小边距不小于标志高度的 1/4\",\n },\n minSize: {\n print: { minHeightMm: 6 },\n digital: { minHeightPx: 35 },\n },\n },\n\n // Colors\n colors: {\n primary: {\n name: \"云毓蓝\",\n hex: colors.primary[\"500\"],\n },\n secondary: {\n name: \"云毓青\",\n hex: colors.accent[\"500\"],\n },\n gradient: colors.gradient.primary,\n },\n\n // Typography — the faces the token source chose (metadata.ts reads them\n // from core.json:fontFamily).\n typography: {\n cn: firstFamily(typography.fontFamily.cn),\n en: firstFamily(typography.fontFamily.en),\n heading: firstFamily(typography.fontFamily.heading),\n weights: [\"Regular\", \"Medium\", \"SemiBold\", \"Bold\"],\n },\n} as const;\n\nexport type BrandGuidelines = typeof brandGuidelines;\n","[\n {\n \"id\": \"echo-localhost\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"它终于离开了 localhost。\",\n \"secondaryCopy\": \"It finally left localhost.\",\n \"sourceInspiration\": \"开发者第一次把服务跑出本地机器的那一刻 — the moment a service escapes the developer's own machine\",\n \"usedInSurface\": \"deployment\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-general-magic\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"有些项目不是失败,是把团队练出来了。\",\n \"secondaryCopy\": \"Some projects don't fail. They train the team that comes next.\",\n \"sourceInspiration\": \"General Magic — 伟大的失败孕育了改变世界的一代工程师 (the project failed but its alumni built the next era)\",\n \"usedInSurface\": \"failure_state\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-ramen\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"先活下来,不丢人。\",\n \"secondaryCopy\": \"Staying alive is not shameful. Ramen counts.\",\n \"sourceInspiration\": \"ramen profitability — Paul Graham 提出的生存美学:赚够吃泡面的钱就是真正的盈利起点\",\n \"usedInSurface\": \"revenue\",\n \"riskLevel\": \"low\"\n },\n {\n \"id\": \"echo-first-room\",\n \"layer\": \"echo\",\n \"primaryCopy\": \"第一间房间不必体面,但方向必须真实。\",\n \"secondaryCopy\": \"The first room doesn't have to be impressive. The direction does.\",\n \"sourceInspiration\": \"车库/湖畔花园 — 所有伟大公司的共同起点:非正式空间里诞生的认真事业 (HP garage, Alibaba's Lakeside apartment)\",\n \"usedInSurface\": \"onboarding\",\n \"riskLevel\": \"low\"\n }\n]\n","/**\n * @nebutra/brand — Microcopy SSOT\n *\n * Typed projection of the Nebutra Microcopy System methodology bible\n * (docs/microcopy/nebutra-microcopy-system.md).\n *\n * This module is the machine-readable SSOT for §8.2 (NebutraMicrocopy type),\n * §8.3 (Milestone Copy Pack, 14 entries), and §6.7 (Easter Egg Registry).\n *\n * IMPORTANT: Do NOT hand-edit copy strings here without re-reading the bible.\n * The §8.3 table is the authority. Run `pnpm --filter @nebutra/brand test` to\n * verify invariants after any change.\n *\n * MC-H2: `act` carries only the three-act model ('starting'|'building'|'growing').\n * Failure & Milestone are cross-cutting throughlines, not a 4th act; they are\n * modelled with the optional `throughline` field. 'First Reset' has act:'starting'\n * (it can occur at any phase) + throughline:'failure'.\n *\n * MC-H4: locale is resolved via locale-keyed maps (MILESTONE_COPY_PACK entries\n * carry a `copy` record keyed by locale, not one row per (id, locale)).\n */\n\nimport easterEggRegistryData from \"./easter-egg-registry.json\";\n\n// ---------------------------------------------------------------------------\n// Locale\n// ---------------------------------------------------------------------------\n\nexport type SupportedLocale = \"zh-CN\" | \"en-US\";\n\n// ---------------------------------------------------------------------------\n// NebutraMicrocopy type — verbatim §8.2 + MC-H2/MC-H3 corrections\n// ---------------------------------------------------------------------------\n\n/**\n * Structured microcopy asset as defined in §8.2 of the microcopy system bible.\n *\n * MC-H2 fix: `act` is the three-act model (starting/building/growing).\n * Failure and Milestone are cross-cutting states modelled via `throughline`.\n * MC-H3: all §8.2 fields are present including id, locale, secondaryCopy?,\n * ctaCopy?, and surface includes 'graduation'.\n */\nexport type NebutraMicrocopy = {\n id: string;\n locale: SupportedLocale | string; // scalar: the locale this entry targets\n\n /** Three-act model (user-visible). Failure/Milestone use `throughline`. */\n act: \"starting\" | \"building\" | \"growing\";\n\n /**\n * Cross-cutting states that span all acts (§4.4 纵贯线).\n * Failure and Milestone are not acts; they appear at any act.\n */\n throughline?: \"failure\" | \"milestone\";\n\n /** Nine-stage production taxonomy (§4.3). */\n stage:\n | \"imagining\"\n | \"validating\"\n | \"assembling\"\n | \"building\"\n | \"shipping\"\n | \"operating\"\n | \"growing\"\n | \"scaling\"\n | \"graduating\";\n\n /** Product surface where the copy appears. MC-H3: includes 'graduation'. */\n surface:\n | \"onboarding\"\n | \"empty_state\"\n | \"success_state\"\n | \"failure_state\"\n | \"milestone\"\n | \"team\"\n | \"revenue\"\n | \"growth\"\n | \"deployment\"\n | \"graduation\"\n | \"tool_recommendation\"\n | \"warning\";\n\n /** Five voice registers (§2.4). */\n voiceRegister: \"companion\" | \"mentor\" | \"historian\" | \"operator\" | \"graduation\";\n\n /** User's emotional state at this moment. */\n userEmotion: \"uncertain\" | \"excited\" | \"stuck\" | \"proud\" | \"anxious\" | \"focused\" | \"ready\";\n\n /** Seven cultural motifs (§3.2). */\n culturalMotif:\n | \"small_room\"\n | \"first_believer\"\n | \"the_table\"\n | \"survival_first\"\n | \"ship_it\"\n | \"honest_restart\"\n | \"new_garage\";\n\n /** Three-layer easter egg classification (§6.1). */\n easterEggLayer: \"functional\" | \"metaphor\" | \"echo\";\n\n primaryCopy: string;\n secondaryCopy?: string;\n ctaCopy?: string;\n\n variables?: Array<\n \"{company}\" | \"{project}\" | \"{tool}\" | \"{member}\" | \"{user_count}\" | \"{revenue}\" | \"{stage}\"\n >;\n\n riskLevel: \"low\" | \"medium\" | \"high\";\n\n /**\n * Echo-layer REQUIRED (§8.2): the real-world story / cultural inspiration\n * behind the second layer. Must be non-empty for any entry with\n * easterEggLayer === 'echo'.\n */\n sourceInspiration?: string;\n\n notes?: string;\n};\n\n// ---------------------------------------------------------------------------\n// MilestoneId\n// ---------------------------------------------------------------------------\n\nexport type MilestoneId =\n | \"first_room\"\n | \"first_folder\"\n | \"first_table\"\n | \"first_signal\"\n | \"first_ship\"\n | \"first_believer\"\n | \"first_revenue\"\n | \"first_return\"\n | \"first_team\"\n | \"first_crowd\"\n | \"first_reset\"\n | \"first_public\"\n | \"first_demo\"\n | \"graduation\";\n\n// ---------------------------------------------------------------------------\n// MilestoneCopyEntry — bilingual via locale-keyed map (MC-H4)\n// ---------------------------------------------------------------------------\n\n/**\n * A single Milestone Copy Pack entry keyed by locale.\n *\n * MC-H4: bilingual copy is stored as a locale-keyed map so a single entry\n * covers both zh-CN and en-US without duplicating the metadata fields.\n * getMilestoneCopy(id, locale) slices out the requested locale.\n */\nexport type MilestoneCopyEntry = {\n id: MilestoneId;\n /** Locale-keyed copy strings. Each locale has primary, optional secondary/cta. */\n copy: Readonly<\n Record<\n SupportedLocale,\n {\n primary: string;\n secondary?: string;\n cta?: string;\n }\n >\n >;\n /** Three-act model; 'first_reset' is 'starting' + throughline:'failure'. */\n act: \"starting\" | \"building\" | \"growing\";\n throughline?: \"failure\" | \"milestone\";\n stage: NebutraMicrocopy[\"stage\"];\n surface: NebutraMicrocopy[\"surface\"];\n voiceRegister: NebutraMicrocopy[\"voiceRegister\"];\n culturalMotif: NebutraMicrocopy[\"culturalMotif\"];\n easterEggLayer: NebutraMicrocopy[\"easterEggLayer\"];\n riskLevel: NebutraMicrocopy[\"riskLevel\"];\n sourceInspiration?: string;\n};\n\n// ---------------------------------------------------------------------------\n// MILESTONE_COPY_PACK — 14 §8.3 entries (typed bilingual data)\n// ---------------------------------------------------------------------------\n\n/**\n * The 14-entry Milestone Copy Pack, typed bilingual data directly from §8.3.\n *\n * These are the canonical typed objects; the i18n catalog\n * (packages/platform/i18n/locales/{en,zh}.json under startupOs.milestone.*)\n * mirrors these strings for runtime next-intl delivery.\n *\n * \"First Reset\" has act:'starting' because a pivot can occur at any stage in\n * the first act — not '纵贯' (which is not a valid act value).\n */\nexport const MILESTONE_COPY_PACK: readonly MilestoneCopyEntry[] = [\n {\n id: \"first_room\",\n copy: {\n \"zh-CN\": { primary: \"第一间房间已经准备好。\" },\n \"en-US\": { primary: \"The first room is ready.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"imagining\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_folder\",\n copy: {\n \"zh-CN\": { primary: \"许多公司,最初只是一个文件夹。\" },\n \"en-US\": { primary: \"Many companies begin as a folder.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"imagining\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_table\",\n copy: {\n \"zh-CN\": { primary: \"第一张桌子有了第二个人。\" },\n \"en-US\": { primary: \"The first table has a second seat.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"assembling\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_signal\",\n copy: {\n \"zh-CN\": { primary: \"真实世界开始说话了。\" },\n \"en-US\": { primary: \"The real world has started talking.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"validating\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_ship\",\n copy: {\n \"zh-CN\": { primary: \"世界第一次看见它。\" },\n \"en-US\": { primary: \"The world sees it for the first time.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_believer\",\n copy: {\n \"zh-CN\": { primary: \"从今天起,你不再只为自己开发。\" },\n \"en-US\": {\n primary: \"From today, you are no longer building only for yourself.\",\n },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"first_believer\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_revenue\",\n copy: {\n \"zh-CN\": { primary: \"梦想开始拥有现金流。\" },\n \"en-US\": { primary: \"The dream has cash flow now.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"operating\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"survival_first\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_return\",\n copy: {\n \"zh-CN\": { primary: \"回来,比来过更重要。\" },\n \"en-US\": { primary: \"Returning matters more than visiting.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"growing\",\n surface: \"milestone\",\n voiceRegister: \"operator\",\n culturalMotif: \"first_believer\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_team\",\n copy: {\n \"zh-CN\": { primary: \"三个人,局就开始成形。\" },\n \"en-US\": { primary: \"Three people can begin to form a company.\" },\n },\n act: \"starting\",\n throughline: \"milestone\",\n stage: \"assembling\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_crowd\",\n copy: {\n \"zh-CN\": { primary: \"第一张桌子坐不下了。\" },\n \"en-US\": { primary: \"The first table is getting crowded.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"scaling\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"the_table\",\n easterEggLayer: \"echo\",\n riskLevel: \"low\",\n sourceInspiration:\n \"回响第一张桌子 (first_table) — 从第一个同伴到桌子坐满人,是从二人对话到真正组织的跃迁;the same table that once seated two now cannot hold the team\",\n },\n {\n id: \"first_reset\",\n // MC-H2: First Reset's real act is 'starting' (a pivot sends you back to start).\n // It is NOT act:'纵贯'. throughline:'failure' captures the cross-cutting nature.\n act: \"starting\",\n throughline: \"failure\",\n copy: {\n \"zh-CN\": { primary: \"重启不是失败,是更诚实的开始。\" },\n \"en-US\": { primary: \"A restart is a more honest beginning.\" },\n },\n stage: \"imagining\",\n surface: \"failure_state\",\n voiceRegister: \"mentor\",\n culturalMotif: \"honest_restart\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_public\",\n copy: {\n \"zh-CN\": { primary: \"把一部分未来,交给世界。\" },\n \"en-US\": { primary: \"Put a piece of the future in public.\" },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"growing\",\n surface: \"milestone\",\n voiceRegister: \"historian\",\n culturalMotif: \"new_garage\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"first_demo\",\n copy: {\n \"zh-CN\": { primary: \"这不是展示,是接受检验。\" },\n \"en-US\": { primary: \"This is not a show. It is a test.\" },\n },\n act: \"building\",\n throughline: \"milestone\",\n stage: \"shipping\",\n surface: \"milestone\",\n voiceRegister: \"companion\",\n culturalMotif: \"ship_it\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n {\n id: \"graduation\",\n copy: {\n \"zh-CN\": { primary: \"你出师了。下一程需要更强的装备。\" },\n \"en-US\": {\n primary: \"You've outgrown the basics. The road ahead needs stronger tools.\",\n },\n },\n act: \"growing\",\n throughline: \"milestone\",\n stage: \"graduating\",\n surface: \"graduation\",\n voiceRegister: \"graduation\",\n culturalMotif: \"small_room\",\n easterEggLayer: \"metaphor\",\n riskLevel: \"low\",\n },\n] as const;\n\n// ---------------------------------------------------------------------------\n// getMilestoneCopy — locale lookup helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the copy strings for a given milestone and locale.\n *\n * @param id - The MilestoneId to look up (e.g. 'first_folder')\n * @param locale - The locale to retrieve ('zh-CN' or 'en-US')\n * @returns Object with primary string, optional secondary and cta.\n *\n * @example\n * getMilestoneCopy(\"first_folder\", \"zh-CN\").primary\n * // => \"许多公司,最初只是一个文件夹。\"\n */\nexport function getMilestoneCopy(\n id: MilestoneId,\n locale: SupportedLocale,\n): { primary: string; secondary?: string; cta?: string } {\n const entry = MILESTONE_COPY_PACK.find((e) => e.id === id);\n if (!entry) {\n throw new Error(`getMilestoneCopy: unknown MilestoneId \"${id}\"`);\n }\n const localeCopy = entry.copy[locale];\n if (!localeCopy) {\n throw new Error(`getMilestoneCopy: locale \"${locale}\" not found for milestone \"${id}\"`);\n }\n return {\n primary: localeCopy.primary,\n ...(localeCopy.secondary !== undefined ? { secondary: localeCopy.secondary } : {}),\n ...(localeCopy.cta !== undefined ? { cta: localeCopy.cta } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// EasterEggEntry — §6.7 schema (MC-M1: echo-layer only)\n// ---------------------------------------------------------------------------\n\n/**\n * Easter Egg Registry entry. Per §6.7 and MC-M1, only echo-layer彩蛋 are\n * registered here — functional and metaphor layers do not require防油/防侵权\n * tracking. Echo-layer entries MUST have a non-empty secondaryCopy and\n * sourceInspiration (the \"second layer\" cultural anchor).\n */\nexport type EasterEggEntry = {\n id: string;\n /** MC-M1: only 'echo' entries go in the registry. */\n layer: \"echo\";\n primaryCopy: string;\n /** Required for echo-layer: the second layer (同行 visible). */\n secondaryCopy: string;\n /**\n * Required for echo-layer (§8.2 \"回响层必填\"): the real-world story /\n * cultural inspiration that anchors the second layer.\n * Used by防重防油 check: same sourceInspiration must not appear in\n * adjacent surfaces.\n */\n sourceInspiration: string;\n usedInSurface: NebutraMicrocopy[\"surface\"];\n riskLevel: \"low\" | \"medium\" | \"high\";\n};\n\n// ---------------------------------------------------------------------------\n// EASTER_EGG_REGISTRY — seeded with §6.3 canonical echo examples\n// ---------------------------------------------------------------------------\n\n/**\n * Registry of echo-layer easter eggs as typed data (§6.7).\n * Seeded with the four canonical §6.3 examples.\n *\n * Add new echo-layer entries here when writing new回响层彩蛋.\n * Each entry's sourceInspiration must be unique within the registry (防重).\n */\nexport const EASTER_EGG_REGISTRY: readonly EasterEggEntry[] =\n easterEggRegistryData as EasterEggEntry[];\n","/**\n * Nebutra Brand Motion Language\n *\n * Three core motions derived from the \"云端聚合\" concept:\n * - emerge (涌现): data materializing from the cloud\n * - flow (流动): data streaming through pipelines\n * - pulse (脉动): system breathing / alive indicator\n */\n\n// =============================================================================\n// Easing Curves (Framer Motion compatible)\n// =============================================================================\n\nexport const brandEasing = {\n /** Signature Nebutra ease — smooth deceleration with slight overshoot */\n brand: [0.16, 1, 0.3, 1] as const,\n /** For enter animations */\n enter: [0.16, 1, 0.3, 1] as const,\n /** For exit animations — ease-out, never ease-in */\n exit: [0.16, 1, 0.3, 1] as const,\n /** Spring-like bounce */\n spring: [0.34, 1.56, 0.64, 1] as const,\n} as const;\n\n// =============================================================================\n// Duration Bridge — Framer Motion needs seconds; CSS tokens hold ms.\n//\n// SSOT lives in @nebutra/design-tokens (core.json → duration.*). These\n// constants mirror the four rails for JS callers (Framer transition props).\n// If the SSOT changes, update here AND in @nebutra/tokens/styles.css.\n// =============================================================================\n\n/** Four-rail motion durations in seconds (Framer Motion `transition.duration`). */\nexport const motionDurationSec = {\n /** 100ms — micro-feedback */\n micro: 0.1,\n /** 200ms — state flow (default) */\n flow: 0.2,\n /** 300ms — content unveil */\n reveal: 0.3,\n /** 500ms — hero-grade cinematic */\n cinematic: 0.5,\n} as const;\n\n// =============================================================================\n// Spring Presets (Framer Motion spring config)\n// =============================================================================\n\nexport const brandSpring = {\n /** Default interactive spring */\n default: { type: \"spring\" as const, stiffness: 200, damping: 24, mass: 1 },\n /** Bouncy, playful spring */\n bouncy: { type: \"spring\" as const, stiffness: 300, damping: 15, mass: 0.8 },\n /** Heavy, deliberate spring */\n heavy: { type: \"spring\" as const, stiffness: 120, damping: 28, mass: 1.5 },\n /** Gentle reveal spring */\n gentle: { type: \"spring\" as const, stiffness: 80, damping: 20, mass: 1 },\n} as const;\n\n// =============================================================================\n// Core Motion Signatures\n// =============================================================================\n\n/** 涌现 — data materializing from the cloud. Cinematic entrance rail. */\nexport const emerge = {\n initial: { opacity: 0, transform: \"translateY(16px)\", filter: \"blur(6px)\" },\n animate: { opacity: 1, transform: \"translateY(0px)\", filter: \"blur(0px)\" },\n exit: {\n opacity: 0,\n transform: \"translateY(-8px)\",\n filter: \"blur(4px)\",\n transition: { duration: motionDurationSec.flow, ease: brandEasing.exit },\n },\n transition: { duration: motionDurationSec.cinematic, ease: brandEasing.brand },\n} as const;\n\n/** 流动 — data streaming through pipelines. Reveal rail. */\nexport const flow = {\n initial: { opacity: 0, transform: \"translateX(-20px)\" },\n animate: { opacity: 1, transform: \"translateX(0px)\" },\n exit: {\n opacity: 0,\n transform: \"translateX(20px)\",\n transition: { duration: motionDurationSec.flow, ease: brandEasing.exit },\n },\n transition: { duration: motionDurationSec.reveal, ease: brandEasing.enter },\n} as const;\n\n/** 脉动 — system breathing / alive */\nexport const pulse = {\n animate: { scale: [1, 1.015, 1], opacity: [1, 0.85, 1] },\n transition: { duration: 3, repeat: Infinity, ease: \"easeInOut\" },\n} as const;\n\n/** 漂浮 — gentle vertical drift for floating UI elements */\nexport const float = {\n animate: { y: [0, -8, 0] },\n transition: { duration: 4, repeat: Infinity, ease: \"easeInOut\" },\n} as const;\n\n// =============================================================================\n// Composition Helpers\n// =============================================================================\n\n/** Stagger container for emerge animations */\nexport const stagger = (delayPerChild = 0.08) =>\n ({\n animate: { transition: { staggerChildren: delayPerChild } },\n }) as const;\n\n/** Interactive micro-motions — flow rail for hover, micro rail for tap. */\nexport const interactive = {\n hover: {\n scale: 1.02,\n transition: { duration: motionDurationSec.flow, ease: brandEasing.brand },\n },\n tap: { scale: 0.98, transition: { duration: motionDurationSec.micro } },\n hoverLift: {\n y: -4,\n transition: { duration: motionDurationSec.flow, ease: brandEasing.brand },\n },\n} as const;\n\n/** Viewport trigger defaults */\nexport const viewport = {\n once: { once: true, margin: \"-80px\" as const },\n always: { once: false, margin: \"-40px\" as const },\n} as const;\n\n// =============================================================================\n// Unified Export\n// =============================================================================\n\nexport const brandMotion = {\n emerge,\n flow,\n pulse,\n float,\n stagger,\n interactive,\n viewport,\n brandEasing,\n brandSpring,\n motionDurationSec,\n} as const;\n","/**\n * Nebutra-Sailor — Product Positioning DNA\n *\n * Source of truth for product identity, use-case copy, and ICP definition.\n * Consumed by GitHub README, About pages, and marketing copy.\n *\n * Principle: Every claim here is substantiated by code in this monorepo.\n * Do not add aspirational copy without backing infrastructure.\n */\n\n// ── Core identity ─────────────────────────────────────────────────────────────\n\nexport const positioning = {\n /**\n * One-liner for README, og:description, pitch decks.\n * Audience: AI founders, SaaS engineering teams (1–10 engineers).\n */\n tagline: \"Ship AI products, not boilerplate.\",\n\n /**\n * Two-sentence elevator pitch.\n */\n description:\n \"Nebutra-Sailor is a production-ready Next.js monorepo template for AI SaaS products. \" +\n \"Auth, billing, multi-tenancy, AI services, design system, and enterprise infrastructure — \" +\n \"pre-configured so you ship on day one.\",\n\n /**\n * GitHub repository description (160 chars max).\n */\n repoDescription:\n \"AI-native SaaS monorepo: Next.js 16 + Hono + Python services · Clerk · Stripe · multi-tenancy · K8s · OTel · design system\",\n\n // ── Target audience ──────────────────────────────────────────────────────────\n\n icp: {\n primary: \"AI founders building SaaS products with small engineering teams (1–10 people)\",\n secondary: \"SaaS engineering teams adopting AI features into existing products\",\n antiTarget:\n \"Large enterprise teams with dedicated platform engineering — this template makes opinionated choices they will override\",\n },\n\n // ── What ships out of the box ─────────────────────────────────────────────\n\n /**\n * Capability pillars — each backed by actual packages/apps in this repo.\n * Update when underlying packages change.\n */\n pillars: [\n {\n id: \"ai-native\",\n title: \"AI-Native Architecture\",\n headline: \"AI capabilities built in, not bolted on.\",\n bullets: [\n \"Python FastAPI AI service with OpenAI / Anthropic client patterns\",\n \"Streaming responses and embeddings pipelines\",\n \"RecommendationSystem (recsys) service for personalization\",\n \"Event ingestion pipeline for AI training data collection\",\n ],\n packages: [\"backends/python/ai\", \"backends/python/recsys\", \"backends/python/event-ingest\"],\n },\n {\n id: \"saas-complete\",\n title: \"SaaS-Complete Infrastructure\",\n headline: \"Every SaaS primitive, wired together.\",\n bullets: [\n \"Clerk authentication with multi-tenant org support\",\n \"Stripe subscriptions, usage billing, and credits via @nebutra/billing\",\n \"Entitlement system for feature gating\",\n \"RBAC-ready tenant context propagated through the API gateway\",\n ],\n packages: [\"packages/billing\", \"backends/gateway\", \"packages/preset\"],\n },\n {\n id: \"design-system\",\n title: \"Production Design System\",\n headline: \"Ship polished UI from day one.\",\n bullets: [\n \"541 Geist icons as tree-shakable TSX components\",\n \"Radix UI + Lobe UI component library with brand tokens\",\n \"Design-language swap via Brand Packages (html[data-brand] + applyLanguage)\",\n \"Storybook 8 with auto-generated docs and visual regression via Chromatic\",\n ],\n packages: [\"packages/ui\", \"packages/tokens\", \"packages/icons\", \"apps/storybook\"],\n },\n {\n id: \"polyglot-monorepo\",\n title: \"Polyglot Monorepo\",\n headline: \"Right tool for each service, one unified repo.\",\n bullets: [\n \"Next.js 16 apps (web dashboard, landing page, design docs)\",\n \"Hono API gateway with OpenAPI spec and type-safe routes\",\n \"Python FastAPI microservices for AI, billing, content, e-commerce, web3\",\n \"Turborepo with affected-only builds and remote caching\",\n ],\n packages: [\"apps/web\", \"backends/gateway\", \"backends/python/*\"],\n },\n {\n id: \"enterprise-infra\",\n title: \"Enterprise-Grade Infrastructure\",\n headline: \"Production patterns, not prototyping shortcuts.\",\n bullets: [\n \"OpenTelemetry distributed tracing via @nebutra/logger (Pino + OTLP)\",\n \"Kubernetes with NetworkPolicy, PDB, HPA, and hardened security contexts\",\n \"Supply chain security: SHA-pinned Docker images and GitHub Actions\",\n \"CSP nonce-based headers, rate limiting, and structured error handling\",\n ],\n packages: [\"packages/logger\", \"packages/rate-limit\", \"infra/iac/k8s\"],\n },\n ],\n\n // ── Use cases ─────────────────────────────────────────────────────────────\n\n /**\n * Three genuine use cases with corresponding apps/packages in this repo.\n * These are templates for what you build ON TOP of Nebutra-Sailor,\n * not features of the template itself.\n */\n useCases: [\n {\n id: \"ai-saas\",\n title: \"AI SaaS Product\",\n description:\n \"Build a multi-tenant AI SaaS product from MVP to production. \" +\n \"Auth, billing, AI services, and dashboard are pre-wired.\",\n examples: [\"AI writing tools\", \"AI data analysis\", \"AI copilots\", \"AI workflow automation\"],\n starterCommand: \"pnpm dev\",\n },\n {\n id: \"marketing-landing\",\n title: \"SaaS Marketing & Landing Pages\",\n description:\n \"Launch performance-optimized marketing sites with built-in SEO, \" +\n \"Lighthouse CI gates, and analytics.\",\n examples: [\"Product landing pages\", \"Pricing pages\", \"Blog + SEO content\"],\n starterCommand: \"pnpm dev:landing\",\n },\n {\n id: \"design-system-standalone\",\n title: \"AI Product Design System\",\n description:\n \"Use @nebutra/ui and @nebutra/tokens as the design system foundation \" +\n \"for your AI product team.\",\n examples: [\"Internal component libraries\", \"Multi-product design systems\"],\n starterCommand: \"pnpm dev:design\",\n },\n ],\n\n // ── Benchmark positioning ─────────────────────────────────────────────────\n\n /**\n * Honest competitive context. Not claims, just positioning anchors.\n */\n benchmarks: {\n template: \"t3-app, create-t3-turbo — adds AI services, Python backend, design system\",\n infra: \"Vercel templates — adds Kubernetes, multi-service, enterprise security\",\n aiFramework: \"LangChain templates — adds full SaaS commercialization layer\",\n },\n} as const;\n\nexport type Positioning = typeof positioning;\nexport type ProductPillar = (typeof positioning.pillars)[number];\nexport type UseCase = (typeof positioning.useCases)[number];\n"],"mappings":"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","names":["jsx"]}