@nebutra/ui 0.2.2 → 2.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.
Files changed (43) hide show
  1. package/dist/animate-in-BlvjVh2S.d.ts +250 -0
  2. package/dist/{canonical-CrO71UPO.d.ts → canonical-Bf4czR2u.d.ts} +225 -211
  3. package/dist/chat/index.d.ts +1 -0
  4. package/dist/chat/index.js +3 -0
  5. package/dist/chat/index.js.map +1 -0
  6. package/dist/components/index.d.ts +58 -123
  7. package/dist/components/index.js +504 -203
  8. package/dist/components/index.js.map +1 -1
  9. package/dist/editorial/index.d.ts +404 -0
  10. package/dist/editorial/index.js +868 -0
  11. package/dist/editorial/index.js.map +1 -0
  12. package/dist/icons/index.d.ts +1 -0
  13. package/dist/layout/index.d.ts +2 -2
  14. package/dist/layout/index.js +116 -26
  15. package/dist/layout/index.js.map +1 -1
  16. package/dist/layouts/index.d.ts +80 -2
  17. package/dist/layouts/index.js +13 -11
  18. package/dist/layouts/index.js.map +1 -1
  19. package/dist/patterns/index.d.ts +4 -5
  20. package/dist/patterns/index.js +221 -106
  21. package/dist/patterns/index.js.map +1 -1
  22. package/dist/primitives/canonical.d.ts +4 -3
  23. package/dist/primitives/canonical.js +609 -197
  24. package/dist/primitives/canonical.js.map +1 -1
  25. package/dist/primitives/index.d.ts +213 -21
  26. package/dist/primitives/index.js +2209 -1317
  27. package/dist/primitives/index.js.map +1 -1
  28. package/dist/tailwind.preset.d.ts +2 -2
  29. package/dist/tailwind.preset.js +1 -1
  30. package/dist/tailwind.preset.js.map +1 -1
  31. package/dist/typography/fonts.css +21 -26
  32. package/dist/typography/index.d.ts +4 -4
  33. package/dist/typography/index.js +1 -1
  34. package/dist/typography/index.js.map +1 -1
  35. package/dist/utils/auth-surfaces.d.ts +33 -0
  36. package/dist/utils/auth-surfaces.js +9 -0
  37. package/dist/utils/auth-surfaces.js.map +1 -0
  38. package/dist/utils/index.d.ts +33 -5
  39. package/dist/utils/index.js +15 -3
  40. package/dist/utils/index.js.map +1 -1
  41. package/package.json +43 -9
  42. package/src/styles/sources.css +10 -0
  43. package/src/typography/fonts.css +21 -26
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/cn.ts","../../src/editorial/editorial-surface.ts","../../src/editorial/editorial-author-bio.tsx","../../src/editorial/editorial-callout.tsx","../../src/editorial/editorial-chart.tsx","../../src/editorial/editorial-comparison-table.tsx","../../src/editorial/editorial-data-table.tsx","../../src/editorial/editorial-divider.tsx","../../src/editorial/editorial-embed-card.tsx","../../src/editorial/editorial-entity-chip.tsx","../../src/editorial/editorial-faq.tsx","../../src/editorial/editorial-figure.tsx","../../src/editorial/editorial-key-takeaways.tsx","../../src/editorial/editorial-margin-note.tsx","../../src/editorial/editorial-pull-quote.tsx","../../src/editorial/editorial-source-index.tsx","../../src/editorial/editorial-stat-grid.tsx","../../src/editorial/editorial-step-ladder.tsx","../../src/editorial/editorial-timeline.tsx"],"names":["jsxs","jsx","ArrowUpRight","hostname"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cva } from \"class-variance-authority\";\nimport type { CSSProperties } from \"react\";\n\n/**\n * Shared visual grammar for long-form editorial blocks.\n *\n * Every block in this directory composes these recipes instead of hand-picking\n * borders, radii and shadows, so a change to the editorial voice is one edit\n * here rather than fifteen edits across the renderer.\n *\n * The grammar is hairline-first: separation comes from a 1px border plus the\n * ambient elevation ramp, never from a filled colour panel. Tone is carried by\n * a 2px rail and an icon, so a page of stacked blocks still reads as one\n * document rather than a row of coloured cards.\n */\n\n/** Uppercase micro-label that opens a block. Not part of the registered type scale. */\nexport const EDITORIAL_EYEBROW =\n \"text-[0.6875rem] font-semibold uppercase leading-none tracking-[0.14em] text-muted-foreground\";\n\n/** Caption / footnote text under a figure, table or chart. */\nexport const EDITORIAL_CAPTION = \"text-sm leading-6 text-muted-foreground\";\n\n/** Body copy inside a block. One step tighter than article prose. */\nexport const EDITORIAL_BODY = \"text-[0.9375rem] leading-7 text-muted-foreground\";\n\n/** Block title. Sits below an article h3 so it never competes with the outline. */\nexport const EDITORIAL_TITLE = \"text-base font-semibold leading-6 text-foreground\";\n\n/**\n * Figures are numeric, so they take tabular lining figures — otherwise a column\n * of stats visually ragged-rights itself as digit widths change.\n */\nexport const EDITORIAL_FIGURE = \"font-mono font-semibold tabular-nums text-foreground\";\n\n/**\n * Article body is a ~3xl reading column. Blocks that carry a grid, a table or a\n * chart earn width by breaking out of it; prose-adjacent blocks stay inline so\n * the measure is preserved.\n */\nexport const editorialBlock = cva(\"\", {\n variants: {\n width: {\n column: \"\",\n breakout: \"lg:-mx-12\",\n full: \"lg:-mx-20\",\n },\n spacing: {\n none: \"\",\n tight: \"my-8\",\n normal: \"my-10\",\n loose: \"my-14\",\n },\n },\n defaultVariants: { width: \"column\", spacing: \"normal\" },\n});\n\n/**\n * Surface recipe. `resting` is the default for a card in flow; `raised` is for\n * the one block in a set that should read as emphasised, not for every card.\n */\nexport const editorialFrame = cva(\"border border-border bg-background\", {\n variants: {\n radius: {\n card: \"rounded-[var(--radius-xl)]\",\n panel: \"rounded-[var(--radius-2xl)]\",\n inner: \"rounded-[var(--radius-md)]\",\n },\n elevation: {\n flat: \"\",\n resting: \"shadow-ambient-sm\",\n raised: \"shadow-ambient-md\",\n },\n },\n defaultVariants: { radius: \"card\", elevation: \"resting\" },\n});\n\nexport const EDITORIAL_TONES = [\"note\", \"insight\", \"success\", \"warning\", \"danger\"] as const;\n\nexport type EditorialTone = (typeof EDITORIAL_TONES)[number];\n\n/**\n * Every entry resolves to a complete colour, never to bare HSL channels: the\n * accent is consumed by `color-mix()` and by a `background-color`, both of\n * which discard the whole declaration if handed `222 47% 11%`. That is why\n * `insight` wraps `--primary` in `hsl()` rather than reaching for\n * `--brand-primary`, which is the VI identity lock and not a surface colour.\n */\nconst TONE_ACCENT: Record<EditorialTone, string> = {\n note: \"var(--neutral-8)\",\n insight: \"hsl(var(--primary))\",\n success: \"var(--status-success)\",\n warning: \"var(--status-warning)\",\n danger: \"var(--status-danger)\",\n};\n\nexport function editorialToneAccent(tone: EditorialTone): string {\n return TONE_ACCENT[tone];\n}\n\nexport function isEditorialTone(value: unknown): value is EditorialTone {\n return typeof value === \"string\" && (EDITORIAL_TONES as readonly string[]).includes(value);\n}\n\n/**\n * Inline custom property consumed by the tone-aware utility classes below.\n * `--editorial-tone` is a private name: shadowing a core token such as\n * `--primary` on an element would leak into the whole subtree.\n */\nexport function editorialToneStyle(tone: EditorialTone): CSSProperties {\n // `CSSProperties` has no index signature for custom properties, so the cast\n // is unavoidable. Keeping it here means no component repeats it.\n return { \"--editorial-tone\": editorialToneAccent(tone) } as CSSProperties;\n}\n\n/** Foreground for icons and rails. */\nexport const EDITORIAL_TONE_FG = \"text-[color:var(--editorial-tone)]\";\n\n/** 5% wash — enough to register as tinted, not enough to read as a coloured block. */\nexport const EDITORIAL_TONE_WASH = \"bg-[color-mix(in_srgb,var(--editorial-tone)_5%,transparent)]\";\n\n/** 12% plate behind an icon. */\nexport const EDITORIAL_TONE_PLATE = \"bg-[color-mix(in_srgb,var(--editorial-tone)_12%,transparent)]\";\n","import { ArrowUpRight } from \"@nebutra/icons\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport {\n EDITORIAL_BODY,\n EDITORIAL_EYEBROW,\n editorialBlock,\n editorialFrame,\n} from \"./editorial-surface\";\n\nexport type EditorialAuthorLink = {\n href: string;\n key?: string;\n label: string;\n};\n\nexport type EditorialAuthorBioProps = {\n /** Avatar slot. Apps pass their own image component so this stays framework-free. */\n avatar?: ReactNode;\n bio?: string | null;\n className?: string;\n label?: string;\n links?: EditorialAuthorLink[];\n name: string;\n role?: string | null;\n};\n\n/** Byline card closing an article. */\nexport function EditorialAuthorBio({\n avatar,\n bio,\n className,\n label = \"Written by\",\n links = [],\n name,\n role,\n}: EditorialAuthorBioProps) {\n if (!name.trim()) return null;\n\n const visibleLinks = links.filter((link) => link.href && link.label);\n\n return (\n <aside\n className={cn(\n editorialBlock({ spacing: \"loose\", width: \"breakout\" }),\n editorialFrame({ elevation: \"resting\", radius: \"panel\" }),\n \"flex flex-col gap-4 px-6 py-6 sm:flex-row sm:gap-5\",\n className,\n )}\n >\n {avatar && (\n <span className=\"size-12 shrink-0 overflow-hidden rounded-full bg-muted\">{avatar}</span>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className={EDITORIAL_EYEBROW}>{label}</div>\n <p className=\"mt-2 text-base font-semibold leading-6 text-foreground\">{name}</p>\n {role && <p className=\"mt-0.5 text-sm text-muted-foreground\">{role}</p>}\n {bio && <p className={cn(\"mt-3\", EDITORIAL_BODY)}>{bio}</p>}\n {visibleLinks.length > 0 && (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {visibleLinks.map((link) => (\n <a\n key={link.key ?? link.href}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border px-3 py-1.5 text-sm font-medium text-foreground transition-colors hover:bg-muted\"\n href={link.href}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {link.label}\n <ArrowUpRight aria-hidden className=\"size-3.5 text-muted-foreground\" />\n </a>\n ))}\n </div>\n )}\n </div>\n </aside>\n );\n}\n","import { CheckCircle, Information, Sparkles, Warning, WarningFill } from \"@nebutra/icons\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport {\n EDITORIAL_BODY,\n EDITORIAL_EYEBROW,\n EDITORIAL_TONE_FG,\n EDITORIAL_TONE_PLATE,\n EDITORIAL_TONE_WASH,\n type EditorialTone,\n editorialBlock,\n editorialFrame,\n editorialToneStyle,\n} from \"./editorial-surface\";\n\nconst TONE_ICON: Record<EditorialTone, ComponentType<{ className?: string }>> = {\n note: Information,\n insight: Sparkles,\n success: CheckCircle,\n warning: Warning,\n danger: WarningFill,\n};\n\nexport type EditorialCalloutProps = {\n /** Body copy. A string is wrapped in a paragraph; nodes are rendered as given. */\n children?: ReactNode;\n className?: string;\n /** Shown in the eyebrow slot when there is no title — pass a localized word. */\n label?: string;\n title?: string | null;\n tone?: EditorialTone;\n};\n\n/**\n * Aside for a note, insight, caution or correction.\n *\n * Tone is a 2px rail plus a tinted icon plate, not a filled panel: a reader\n * scrolling past four callouts should see four asides, not four highlighter\n * swipes.\n */\nexport function EditorialCallout({\n children,\n className,\n label,\n title,\n tone = \"note\",\n}: EditorialCalloutProps) {\n if (!title && !children) return null;\n\n const Icon = TONE_ICON[tone];\n const eyebrow = title ?? label ?? tone;\n\n return (\n <aside\n className={cn(\n editorialBlock({ spacing: \"normal\" }),\n editorialFrame({ elevation: \"resting\" }),\n EDITORIAL_TONE_WASH,\n \"relative overflow-hidden pl-6 pr-5 py-5\",\n className,\n )}\n style={editorialToneStyle(tone)}\n >\n <span aria-hidden className=\"absolute inset-y-0 left-0 w-0.5 bg-[var(--editorial-tone)]\" />\n <div className=\"flex gap-3.5\">\n <span\n aria-hidden\n className={cn(\n \"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-full\",\n EDITORIAL_TONE_PLATE,\n EDITORIAL_TONE_FG,\n )}\n >\n <Icon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className={EDITORIAL_EYEBROW}>{eyebrow}</div>\n {typeof children === \"string\" ? (\n <p className={cn(\"mt-2.5\", EDITORIAL_BODY)}>{children}</p>\n ) : (\n children && <div className={cn(\"mt-2.5\", EDITORIAL_BODY)}>{children}</div>\n )}\n </div>\n </div>\n </aside>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport {\n EDITORIAL_CAPTION,\n EDITORIAL_EYEBROW,\n editorialBlock,\n editorialFrame,\n} from \"./editorial-surface\";\n\nexport type EditorialChartPoint = {\n /** Optional per-point display string. Falls back to the raw value. */\n display?: string | null;\n key?: string;\n label: string;\n value: number;\n};\n\nexport type EditorialChartProps = {\n caption?: string | null;\n className?: string;\n label?: string;\n points: EditorialChartPoint[];\n title?: string | null;\n variant?: \"bar\" | \"line\";\n};\n\nconst VIEWBOX_WIDTH = 640;\nconst VIEWBOX_HEIGHT = 200;\n\nfunction formatPoint(point: EditorialChartPoint): string {\n return point.display ?? String(point.value);\n}\n\n/**\n * Horizontal bars.\n *\n * Laid out with grid and percentage widths rather than SVG: an article column\n * is narrow and reflows, and a CSS bar keeps its labels selectable, wrappable\n * and readable by assistive tech without a parallel text description.\n */\nfunction BarChart({ points, max }: { max: number; points: EditorialChartPoint[] }) {\n return (\n <div className=\"grid gap-3\">\n {points.map((point, index) => {\n // A bar with a real zero width is invisible, so the floor keeps the\n // smallest value legible as a value rather than as an empty track.\n const share = max > 0 ? Math.max((point.value / max) * 100, 1.5) : 0;\n\n return (\n <div\n key={point.key ?? `${index}-${point.label}`}\n className=\"grid grid-cols-[minmax(5rem,9rem)_1fr_auto] items-center gap-3\"\n >\n <span className=\"truncate text-sm text-muted-foreground\" title={point.label}>\n {point.label}\n </span>\n <span aria-hidden className=\"h-2.5 overflow-hidden rounded-full bg-muted\">\n {/* The measured width travels as a custom property so the class,\n not the element, still owns the `width` declaration. */}\n <span\n className=\"block h-full w-[var(--editorial-bar)] rounded-full bg-primary\"\n style={{ \"--editorial-bar\": `${share}%` } as CSSProperties}\n />\n </span>\n <span className=\"font-mono text-sm font-semibold tabular-nums text-foreground\">\n {formatPoint(point)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Trend line.\n *\n * SVG is the right tool once the shape between points carries the meaning. The\n * `viewBox` scales to the container, so no measurement pass and no client\n * JavaScript is required.\n */\nfunction LineChart({ max, points }: { max: number; points: EditorialChartPoint[] }) {\n const step = points.length > 1 ? VIEWBOX_WIDTH / (points.length - 1) : 0;\n const coords = points.map((point, index) => {\n const x = points.length > 1 ? index * step : VIEWBOX_WIDTH / 2;\n const y = VIEWBOX_HEIGHT - (max > 0 ? (point.value / max) * (VIEWBOX_HEIGHT - 16) : 0) - 8;\n return { x, y };\n });\n const path = coords\n .map((coord, index) => `${index === 0 ? \"M\" : \"L\"}${coord.x.toFixed(1)} ${coord.y.toFixed(1)}`)\n .join(\" \");\n\n return (\n <div>\n <svg\n aria-hidden\n className=\"h-40 w-full\"\n preserveAspectRatio=\"none\"\n viewBox={`0 0 ${VIEWBOX_WIDTH} ${VIEWBOX_HEIGHT}`}\n >\n <title>Trend</title>\n <path\n d={`${path} L${VIEWBOX_WIDTH} ${VIEWBOX_HEIGHT} L0 ${VIEWBOX_HEIGHT} Z`}\n // `--primary` is bare HSL channels; an SVG paint slot needs a colour.\n fill=\"color-mix(in srgb, hsl(var(--primary)) 10%, transparent)\"\n />\n <path\n d={path}\n fill=\"none\"\n stroke=\"hsl(var(--primary))\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n <div className=\"mt-3 flex justify-between gap-2\">\n {points.map((point, index) => (\n <div key={point.key ?? `${index}-${point.label}`} className=\"min-w-0 text-center\">\n <div className=\"font-mono text-sm font-semibold tabular-nums text-foreground\">\n {formatPoint(point)}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">{point.label}</div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Small inline data figure.\n *\n * Values are also emitted as a visually hidden table, so the chart is readable\n * without sight of the bars and copyable as data rather than as an image.\n */\nexport function EditorialChart({\n caption,\n className,\n label,\n points,\n title,\n variant = \"bar\",\n}: EditorialChartProps) {\n const visible = points.filter((point) => point.label.trim() && Number.isFinite(point.value));\n if (!visible.length) return null;\n\n const max = Math.max(...visible.map((point) => point.value), 0);\n\n return (\n <figure className={cn(editorialBlock({ spacing: \"loose\", width: \"breakout\" }), className)}>\n <div className={cn(editorialFrame({ elevation: \"resting\" }), \"px-5 py-5 sm:px-6\")}>\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-base font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n {variant === \"line\" ? (\n <LineChart max={max} points={visible} />\n ) : (\n <BarChart max={max} points={visible} />\n )}\n <table className=\"sr-only\">\n <caption>{title ?? label ?? \"Chart data\"}</caption>\n <tbody>\n {visible.map((point, index) => (\n <tr key={point.key ?? `${index}-${point.label}`}>\n <th scope=\"row\">{point.label}</th>\n <td>{formatPoint(point)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {caption && <figcaption className={cn(\"mt-3\", EDITORIAL_CAPTION)}>{caption}</figcaption>}\n </figure>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport { EDITORIAL_EYEBROW, editorialBlock, editorialFrame } from \"./editorial-surface\";\n\nexport type EditorialComparisonRow = {\n cells: string[];\n key?: string;\n label: string;\n};\n\nexport type EditorialComparisonTableProps = {\n className?: string;\n columns: string[];\n /**\n * Header for the row-label column. Localize it — leaving this to a hardcoded\n * English default is how \"Dimension\" ended up in Chinese articles.\n */\n dimensionLabel?: string;\n label?: string;\n rows: EditorialComparisonRow[];\n title?: string | null;\n};\n\n/**\n * Matrix comparing options across dimensions.\n *\n * Below `md` the table restacks into one block per row and each cell carries\n * its own column label, so the reader never has to drag a table sideways on a\n * phone to find out which column a value belonged to.\n */\nexport function EditorialComparisonTable({\n className,\n columns,\n dimensionLabel = \"Dimension\",\n label,\n rows,\n title,\n}: EditorialComparisonTableProps) {\n const visibleColumns = columns.filter(Boolean);\n const visibleRows = rows.filter((row) => row.label || row.cells.some(Boolean));\n if (visibleColumns.length < 2 || !visibleRows.length) return null;\n\n return (\n <section\n className={cn(editorialBlock({ spacing: \"loose\", width: \"breakout\" }), className)}\n aria-label={title ?? label ?? undefined}\n >\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <div className={cn(editorialFrame({ elevation: \"resting\" }), \"overflow-hidden\")}>\n <table className=\"w-full border-collapse text-left text-sm\">\n <thead className=\"hidden md:table-header-group\">\n <tr className=\"bg-muted\">\n <th\n className=\"w-[22%] border-b border-border px-4 py-3 font-semibold text-foreground\"\n scope=\"col\"\n >\n {dimensionLabel}\n </th>\n {visibleColumns.map((column) => (\n <th\n key={column}\n className=\"border-b border-border px-4 py-3 font-semibold text-foreground\"\n scope=\"col\"\n >\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"block md:table-row-group\">\n {visibleRows.map((row, rowIndex) => (\n <tr\n key={row.key ?? `${rowIndex}-${row.label}`}\n className=\"block border-b border-border last:border-b-0 md:table-row\"\n >\n <th\n className=\"block bg-muted px-4 pb-2 pt-3 text-left align-top font-semibold text-foreground md:table-cell md:bg-transparent md:py-3\"\n scope=\"row\"\n >\n {row.label}\n </th>\n {visibleColumns.map((column, cellIndex) => (\n <td\n key={`${row.key ?? rowIndex}-${column}`}\n className=\"block px-4 py-2 align-top leading-6 text-muted-foreground last:pb-3 md:table-cell md:py-3 md:last:pb-3\"\n >\n <span className={cn(\"mb-1 block md:hidden\", EDITORIAL_EYEBROW)}>{column}</span>\n {row.cells[cellIndex]}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { EDITORIAL_CAPTION, editorialBlock, editorialFrame } from \"./editorial-surface\";\n\nexport type EditorialDataTableRow = {\n cells: ReactNode[];\n key: string;\n};\n\nexport type EditorialDataTableProps = {\n caption?: ReactNode;\n className?: string;\n head: ReactNode[];\n rows: EditorialDataTableRow[];\n};\n\n/**\n * Table rendered from author-written markup, where cells carry links, code and\n * inline math rather than plain strings.\n *\n * Cells are `ReactNode`, so unlike `EditorialComparisonTable` this cannot\n * restack into labelled blocks on small screens — it scrolls instead, inside a\n * framed container that makes the clipped edge obvious.\n */\nexport function EditorialDataTable({ caption, className, head, rows }: EditorialDataTableProps) {\n if (!head.length || !rows.length) return null;\n\n return (\n <figure className={cn(editorialBlock({ spacing: \"normal\", width: \"breakout\" }), className)}>\n <div className={cn(editorialFrame({ elevation: \"resting\" }), \"overflow-x-auto\")}>\n <table className=\"w-full min-w-[36rem] border-collapse text-left text-sm text-muted-foreground\">\n <thead className=\"bg-muted\">\n <tr>\n {head.map((cell, index) => (\n <th\n // Header cells are rendered nodes with no stable identity of\n // their own; column position is the identity.\n key={`head-${index}`}\n className=\"border-b border-border px-4 py-3 font-semibold text-foreground\"\n scope=\"col\"\n >\n {cell}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.key} className=\"border-b border-border last:border-b-0\">\n {row.cells.map((cell, cellIndex) => (\n <td key={`${row.key}-${cellIndex}`} className=\"px-4 py-3 align-top leading-6\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {caption && <figcaption className={cn(\"mt-3\", EDITORIAL_CAPTION)}>{caption}</figcaption>}\n </figure>\n );\n}\n","import { cn } from \"../utils/cn\";\n\nexport type EditorialDividerProps = {\n className?: string;\n};\n\n/**\n * Section break inside an article.\n *\n * Marks a change of movement, not a new heading — an `<hr>` with a centred\n * marker rather than a rule that would read as the end of the piece.\n */\nexport function EditorialDivider({ className }: EditorialDividerProps) {\n return (\n <div className={cn(\"my-14 flex items-center gap-4\", className)}>\n <hr className=\"h-px flex-1 border-0 bg-border\" />\n <span aria-hidden className=\"size-1.5 rounded-full bg-[hsl(var(--primary))]\" />\n <hr className=\"h-px flex-1 border-0 bg-border\" />\n </div>\n );\n}\n","import { SiGithub, SiX, SiYoutube } from \"@icons-pack/react-simple-icons\";\nimport { ArrowUpRight, Globe } from \"@nebutra/icons\";\nimport type { ComponentType } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { EDITORIAL_CAPTION, editorialBlock, editorialFrame } from \"./editorial-surface\";\n\nexport const EDITORIAL_EMBED_PROVIDERS = [\"youtube\", \"x\", \"github\", \"website\"] as const;\n\nexport type EditorialEmbedProvider = (typeof EDITORIAL_EMBED_PROVIDERS)[number];\n\nconst PROVIDER_ICON: Record<EditorialEmbedProvider, ComponentType<{ className?: string }>> = {\n github: SiGithub,\n website: Globe,\n x: SiX,\n youtube: SiYoutube,\n};\n\nconst PROVIDER_NAME: Record<EditorialEmbedProvider, string> = {\n github: \"GitHub\",\n website: \"Website\",\n x: \"X\",\n youtube: \"YouTube\",\n};\n\nexport type EditorialEmbedCardProps = {\n caption?: string | null;\n className?: string;\n provider?: EditorialEmbedProvider;\n title: string;\n url: string;\n};\n\nfunction hostname(url: string): string | null {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return null;\n }\n}\n\nexport function isEditorialEmbedProvider(value: unknown): value is EditorialEmbedProvider {\n return (\n typeof value === \"string\" && (EDITORIAL_EMBED_PROVIDERS as readonly string[]).includes(value)\n );\n}\n\n/**\n * Link-out card for third-party media.\n *\n * Deliberately not an iframe: an embedded player ships the provider's scripts\n * and cookies into the article and moves the layout around while it loads. The\n * card states the provider, keeps the destination visible, and leaves the\n * decision to the reader.\n */\nexport function EditorialEmbedCard({\n caption,\n className,\n provider = \"website\",\n title,\n url,\n}: EditorialEmbedCardProps) {\n if (!title.trim() || !url.trim()) return null;\n\n const Icon = PROVIDER_ICON[provider];\n const host = hostname(url);\n\n return (\n <figure className={cn(editorialBlock({ spacing: \"normal\" }), className)}>\n <a\n className={cn(\n editorialFrame({ elevation: \"resting\" }),\n \"group flex items-center gap-4 p-4 transition-shadow hover:shadow-ambient-md\",\n )}\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span\n aria-hidden\n className=\"flex size-10 shrink-0 items-center justify-center rounded-[var(--radius-md)] border border-border bg-muted text-foreground\"\n >\n <Icon className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-[0.9375rem] font-semibold leading-6 text-foreground\">\n {title}\n </span>\n <span className=\"mt-0.5 block truncate text-sm text-muted-foreground\">\n {[PROVIDER_NAME[provider], host].filter(Boolean).join(\" · \")}\n </span>\n </span>\n <ArrowUpRight\n aria-hidden\n className=\"size-4 shrink-0 text-muted-foreground transition-colors group-hover:text-[hsl(var(--primary))]\"\n />\n </a>\n {caption && <figcaption className={cn(\"mt-2.5\", EDITORIAL_CAPTION)}>{caption}</figcaption>}\n </figure>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport type EditorialEntityChipProps = {\n className?: string;\n href?: string | null;\n /** Logo slot. Apps pass their own image component so this stays framework-free. */\n logo?: ReactNode;\n name: string;\n};\n\n/**\n * Inline reference to a company, product or project.\n *\n * Sized to sit inside a sentence without changing its line height, which is\n * why the logo plate is `1em` rather than a fixed pixel size.\n */\nexport function EditorialEntityChip({ className, href, logo, name }: EditorialEntityChipProps) {\n if (!name.trim()) return null;\n\n const content = (\n <>\n {logo && (\n <span\n aria-hidden\n className=\"inline-flex size-[1.1em] shrink-0 items-center justify-center overflow-hidden rounded-[0.25em] bg-muted\"\n >\n {logo}\n </span>\n )}\n <span>{name}</span>\n </>\n );\n\n const shared = cn(\n \"mx-0.5 inline-flex items-baseline gap-1 align-baseline font-medium text-foreground\",\n className,\n );\n\n if (!href) {\n return <span className={shared}>{content}</span>;\n }\n\n return (\n <a\n className={cn(\n shared,\n \"underline decoration-border decoration-dotted underline-offset-4 transition-colors hover:decoration-[hsl(var(--primary))] hover:decoration-solid\",\n )}\n href={href}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {content}\n </a>\n );\n}\n","import { Plus } from \"@nebutra/icons\";\nimport { cn } from \"../utils/cn\";\nimport { EDITORIAL_BODY, EDITORIAL_EYEBROW, editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialFaqItem = {\n answer: string;\n key?: string;\n question: string;\n};\n\nexport type EditorialFaqProps = {\n className?: string;\n /** Open the first entry on load, for a short list where the answer is the point. */\n defaultOpenFirst?: boolean;\n items: EditorialFaqItem[];\n label?: string;\n title?: string | null;\n};\n\n/**\n * Collapsible question list.\n *\n * Built on native `<details>` rather than a JS disclosure: it costs no client\n * bundle, works before hydration, is keyboard-operable for free, and lets\n * in-page find surface answers inside collapsed entries.\n */\nexport function EditorialFaq({\n className,\n defaultOpenFirst = false,\n items,\n label,\n title,\n}: EditorialFaqProps) {\n const visible = items.filter((item) => item.question.trim() && item.answer.trim());\n if (!visible.length) return null;\n\n return (\n <section\n aria-label={title ?? label ?? undefined}\n className={cn(editorialBlock({ spacing: \"loose\" }), className)}\n >\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <div className=\"divide-y divide-border border-y border-border\">\n {visible.map((item, index) => (\n <details\n key={item.key ?? `${index}-${item.question.slice(0, 24)}`}\n className=\"group\"\n open={defaultOpenFirst && index === 0}\n >\n <summary className=\"flex cursor-pointer list-none items-start justify-between gap-4 py-4 text-[0.9375rem] font-semibold leading-6 text-foreground marker:hidden [&::-webkit-details-marker]:hidden\">\n {item.question}\n <Plus\n aria-hidden\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground transition-transform duration-micro group-open:rotate-45\"\n />\n </summary>\n <p className={cn(\"pb-4 pr-8\", EDITORIAL_BODY)}>{item.answer}</p>\n </details>\n ))}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { EDITORIAL_CAPTION, EDITORIAL_EYEBROW, editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialFigureProps = {\n caption?: ReactNode;\n className?: string;\n /**\n * Image slot. Apps pass their own image component — keeping `next/image` out\n * of this package is what lets it render in Storybook and non-Next surfaces.\n */\n media: ReactNode;\n width?: \"column\" | \"breakout\" | \"full\";\n};\n\n/** Single image with an optional caption. */\nexport function EditorialFigure({\n caption,\n className,\n media,\n width = \"column\",\n}: EditorialFigureProps) {\n return (\n <figure className={cn(editorialBlock({ spacing: \"normal\", width }), className)}>\n <div className=\"relative overflow-hidden rounded-[var(--radius-xl)] border border-border bg-muted shadow-ambient-sm\">\n {media}\n </div>\n {caption && (\n <figcaption className={cn(\"mt-3 text-center\", EDITORIAL_CAPTION)}>{caption}</figcaption>\n )}\n </figure>\n );\n}\n\nexport type EditorialFigureGroupProps = {\n className?: string;\n /** Rendered figures. Two or three read best; more should become a gallery. */\n children: ReactNode;\n label?: string;\n title?: string | null;\n variant?: \"grid\" | \"comparison\" | \"sequence\";\n};\n\nconst GROUP_LAYOUT: Record<NonNullable<EditorialFigureGroupProps[\"variant\"]>, string> = {\n comparison: \"grid gap-4 sm:grid-cols-2\",\n grid: \"grid gap-4 sm:grid-cols-2\",\n sequence: \"grid gap-4\",\n};\n\n/** Set of related figures shown together. */\nexport function EditorialFigureGroup({\n children,\n className,\n label,\n title,\n variant = \"grid\",\n}: EditorialFigureGroupProps) {\n return (\n <section\n aria-label={title ?? label ?? undefined}\n className={cn(editorialBlock({ spacing: \"loose\", width: \"breakout\" }), className)}\n >\n {(label || title) && (\n <div className=\"mb-4\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <div className={GROUP_LAYOUT[variant]}>{children}</div>\n </section>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport { EDITORIAL_EYEBROW, editorialBlock, editorialFrame } from \"./editorial-surface\";\n\nexport type EditorialKeyTakeawayItem = {\n key?: string;\n text: string;\n};\n\nexport type EditorialKeyTakeawaysProps = {\n className?: string;\n items: EditorialKeyTakeawayItem[];\n /** Eyebrow copy. Pass a localized string; the default is English. */\n label?: string;\n title?: string | null;\n};\n\n/**\n * The summary panel that opens a long piece.\n *\n * Numbering is a hairline-separated ordered list rather than bullets or cards —\n * the point is that a reader can take four lines and leave, so nothing should\n * compete with the lines themselves.\n */\nexport function EditorialKeyTakeaways({\n className,\n items,\n label = \"Key takeaways\",\n title,\n}: EditorialKeyTakeawaysProps) {\n const visible = items.filter((item) => item.text.trim());\n if (!visible.length) return null;\n\n return (\n <aside\n aria-label={title ?? label}\n className={cn(\n editorialBlock({ spacing: \"loose\", width: \"breakout\" }),\n editorialFrame({ elevation: \"resting\", radius: \"panel\" }),\n \"px-6 py-6 sm:px-8 sm:py-7\",\n className,\n )}\n >\n <div className={EDITORIAL_EYEBROW}>{label}</div>\n {title && <h2 className=\"mt-3 text-xl font-semibold leading-7 text-foreground\">{title}</h2>}\n <ol className=\"mt-5 divide-y divide-border border-t border-border\">\n {visible.map((item, index) => (\n <li\n key={item.key ?? `${index}-${item.text.slice(0, 24)}`}\n className=\"flex gap-4 py-3.5 first:pt-4\"\n >\n <span\n aria-hidden\n className=\"mt-0.5 shrink-0 font-mono text-xs font-semibold tabular-nums text-muted-foreground\"\n >\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <p className=\"text-[0.9375rem] leading-7 text-foreground\">{item.text}</p>\n </li>\n ))}\n </ol>\n </aside>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport { EDITORIAL_EYEBROW } from \"./editorial-surface\";\n\nexport type EditorialMarginNoteProps = {\n children?: string | null;\n className?: string;\n label?: string;\n title?: string | null;\n};\n\n/**\n * Short aside that steps out into the right margin on wide screens.\n *\n * Below `xl` there is no margin to step into, so it degrades to an indented\n * inline note rather than a floated box that would strand a two-word orphan\n * beside it.\n */\nexport function EditorialMarginNote({\n children,\n className,\n label,\n title,\n}: EditorialMarginNoteProps) {\n if (!title && !children) return null;\n\n return (\n <aside\n className={cn(\n \"my-6 border-l-2 border-border py-1 pl-4 text-sm leading-6 text-muted-foreground\",\n \"xl:float-right xl:-mr-56 xl:my-2 xl:ml-8 xl:w-48 xl:border-l xl:pl-4\",\n className,\n )}\n >\n {label && <div className={cn(\"mb-1.5\", EDITORIAL_EYEBROW)}>{label}</div>}\n {title && <p className=\"font-semibold text-foreground\">{title}</p>}\n {children && <p className={cn(title && \"mt-1\")}>{children}</p>}\n </aside>\n );\n}\n","import { External } from \"@nebutra/icons\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialPullQuoteProps = {\n /** Name of the speaker or the work being quoted. */\n attribution?: string | null;\n className?: string;\n /** Portrait slot. Apps pass their own image component so this stays framework-free. */\n portrait?: ReactNode;\n quote: string;\n /** Title, company or context under the attribution. */\n role?: string | null;\n sourceHref?: string | null;\n};\n\n/**\n * Display quote lifted out of the reading column.\n *\n * There is no oversized quotation glyph: at this size the type itself already\n * reads as a quote, and the glyph only competes with the first word. Hairlines\n * above and below do the separating.\n */\nexport function EditorialPullQuote({\n attribution,\n className,\n portrait,\n quote,\n role,\n sourceHref,\n}: EditorialPullQuoteProps) {\n if (!quote.trim()) return null;\n\n const name = attribution ? (\n sourceHref ? (\n <a\n className=\"inline-flex items-center gap-1.5 text-foreground underline decoration-border underline-offset-4 transition-colors hover:decoration-[hsl(var(--primary))]\"\n href={sourceHref}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {attribution}\n <External aria-hidden className=\"size-3.5 text-muted-foreground\" />\n </a>\n ) : (\n attribution\n )\n ) : null;\n\n return (\n <figure\n className={cn(\n editorialBlock({ spacing: \"loose\", width: \"breakout\" }),\n \"border-y border-border py-8 sm:py-10\",\n className,\n )}\n >\n <blockquote className=\"text-pretty text-xl font-medium leading-9 text-foreground sm:text-[1.6rem] sm:leading-[2.6rem]\">\n {quote}\n </blockquote>\n {(name || role || portrait) && (\n <figcaption className=\"mt-6 flex items-center gap-3\">\n {portrait && (\n <span className=\"size-9 shrink-0 overflow-hidden rounded-full bg-muted\">\n {portrait}\n </span>\n )}\n <span className=\"min-w-0\">\n {name && <span className=\"block text-sm font-semibold text-foreground\">{name}</span>}\n {role && <span className=\"mt-0.5 block text-sm text-muted-foreground\">{role}</span>}\n </span>\n </figcaption>\n )}\n </figure>\n );\n}\n","import { ArrowUpRight } from \"@nebutra/icons\";\nimport { cn } from \"../utils/cn\";\nimport { EDITORIAL_BODY, EDITORIAL_EYEBROW, editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialSourceItem = {\n accessedAt?: string | null;\n author?: string | null;\n key?: string;\n publisher?: string | null;\n summary?: string | null;\n title: string;\n url: string;\n};\n\nexport type EditorialSourceIndexProps = {\n className?: string;\n /** Eyebrow copy, e.g. \"Source index\" / \"资料索引\". */\n label?: string;\n sources: EditorialSourceItem[];\n /** Sentence under the eyebrow. Apps build this so pluralization stays localized. */\n summary?: string | null;\n};\n\nfunction hostname(url: string): string | null {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return null;\n }\n}\n\n/**\n * Numbered reference list closing a researched piece.\n *\n * A numbered hairline list rather than a card grid: references are read in\n * order and cited by number from the body, and boxing each one hides that\n * ordering behind a wall of equal-weight rectangles.\n */\nexport function EditorialSourceIndex({\n className,\n label = \"Source index\",\n sources,\n summary,\n}: EditorialSourceIndexProps) {\n const visible = sources.filter((source) => source.title && source.url);\n if (!visible.length) return null;\n\n return (\n <section\n aria-label={label}\n className={cn(editorialBlock({ spacing: \"loose\", width: \"breakout\" }), className)}\n >\n <div className=\"border-b border-border pb-3\">\n <div className={EDITORIAL_EYEBROW}>{label}</div>\n {summary && <p className={cn(\"mt-2\", EDITORIAL_BODY)}>{summary}</p>}\n </div>\n <ol className=\"divide-y divide-border\">\n {visible.map((source, index) => {\n const meta = [source.publisher, source.author, source.accessedAt].filter(Boolean);\n const host = hostname(source.url);\n\n return (\n <li key={source.key ?? source.url}>\n <a\n className=\"group flex gap-4 py-4 transition-colors hover:bg-muted/60\"\n href={source.url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span\n aria-hidden\n className=\"mt-0.5 shrink-0 font-mono text-xs font-semibold tabular-nums text-muted-foreground\"\n >\n {String(index + 1).padStart(2, \"0\")}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start justify-between gap-3\">\n <span className=\"text-[0.9375rem] font-semibold leading-6 text-foreground\">\n {source.title}\n </span>\n <ArrowUpRight\n aria-hidden\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground transition-colors group-hover:text-[hsl(var(--primary))]\"\n />\n </span>\n {(meta.length > 0 || host) && (\n <span className=\"mt-1 block text-sm text-muted-foreground\">\n {(meta.length ? meta : [host]).join(\" · \")}\n </span>\n )}\n {source.summary && (\n <span className=\"mt-1.5 block text-sm leading-6 text-muted-foreground\">\n {source.summary}\n </span>\n )}\n </span>\n </a>\n </li>\n );\n })}\n </ol>\n </section>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport {\n EDITORIAL_CAPTION,\n EDITORIAL_EYEBROW,\n EDITORIAL_FIGURE,\n editorialBlock,\n} from \"./editorial-surface\";\n\nexport type EditorialStatItem = {\n caption?: string | null;\n key?: string;\n label: string;\n value: string;\n};\n\nexport type EditorialStatGridProps = {\n className?: string;\n items: EditorialStatItem[];\n label?: string;\n title?: string | null;\n};\n\nconst COLUMNS: Record<number, string> = {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-2 lg:grid-cols-4\",\n};\n\n/**\n * Row of headline figures.\n *\n * Cells are separated by shared hairlines rather than being individual cards:\n * boxing each number makes the set read as four unrelated facts, where the\n * point of a stat row is that they are one measurement taken four ways.\n */\nexport function EditorialStatGrid({ className, items, label, title }: EditorialStatGridProps) {\n const visible = items.filter((item) => item.value.trim() && item.label.trim());\n if (!visible.length) return null;\n\n const columns = COLUMNS[Math.min(visible.length, 4)] ?? COLUMNS[4];\n\n return (\n <section\n className={cn(editorialBlock({ spacing: \"loose\", width: \"breakout\" }), className)}\n aria-label={title ?? label ?? undefined}\n >\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <dl\n className={cn(\n \"grid divide-y divide-border border-y border-border\",\n columns,\n \"sm:divide-x sm:divide-y-0\",\n )}\n >\n {visible.map((item, index) => (\n <div\n key={item.key ?? `${index}-${item.label}`}\n className=\"px-0 py-5 sm:px-6 sm:first:pl-0 sm:last:pr-0\"\n >\n <dt className=\"sr-only\">{item.label}</dt>\n <dd>\n <span className={cn(\"block text-3xl leading-none sm:text-4xl\", EDITORIAL_FIGURE)}>\n {item.value}\n </span>\n <span className=\"mt-3 block text-sm font-medium text-foreground\">{item.label}</span>\n {item.caption && (\n <span className={cn(\"mt-1.5 block\", EDITORIAL_CAPTION)}>{item.caption}</span>\n )}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport { EDITORIAL_BODY, EDITORIAL_EYEBROW, editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialStep = {\n body?: string | null;\n key?: string;\n title: string;\n};\n\nexport type EditorialStepLadderProps = {\n className?: string;\n label?: string;\n steps: EditorialStep[];\n title?: string | null;\n};\n\n/**\n * Ordered procedure.\n *\n * Distinct from `EditorialTimeline`: a timeline reports what happened and is\n * marked with dates, a ladder instructs and is marked with positions the reader\n * is meant to follow in order.\n */\nexport function EditorialStepLadder({ className, label, steps, title }: EditorialStepLadderProps) {\n const visible = steps.filter((step) => step.title.trim());\n if (!visible.length) return null;\n\n return (\n <section\n aria-label={title ?? label ?? undefined}\n className={cn(editorialBlock({ spacing: \"loose\" }), className)}\n >\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <ol className=\"grid gap-0\">\n {visible.map((step, index) => (\n <li\n key={step.key ?? `${index}-${step.title}`}\n className=\"relative grid grid-cols-[2rem_1fr] gap-4 pb-6 last:pb-0\"\n >\n {index < visible.length - 1 && (\n <span\n aria-hidden\n className=\"absolute bottom-2 left-4 top-9 w-px -translate-x-1/2 bg-border\"\n />\n )}\n <span\n aria-hidden\n className=\"z-10 flex size-8 items-center justify-center rounded-full border border-border bg-background font-mono text-xs font-semibold tabular-nums text-foreground\"\n >\n {index + 1}\n </span>\n <div className=\"min-w-0 pt-1.5\">\n <h4 className=\"text-[0.9375rem] font-semibold leading-6 text-foreground\">\n {step.title}\n </h4>\n {step.body && <p className={cn(\"mt-1.5\", EDITORIAL_BODY)}>{step.body}</p>}\n </div>\n </li>\n ))}\n </ol>\n </section>\n );\n}\n","import { cn } from \"../utils/cn\";\nimport { EDITORIAL_BODY, EDITORIAL_EYEBROW, editorialBlock } from \"./editorial-surface\";\n\nexport type EditorialTimelineItem = {\n body?: string | null;\n /** Short marker: a year, a quarter, a version. Rendered in tabular figures. */\n marker: string;\n key?: string;\n title: string;\n};\n\nexport type EditorialTimelineProps = {\n className?: string;\n items: EditorialTimelineItem[];\n label?: string;\n title?: string | null;\n};\n\n/**\n * Chronology of events along a single rail.\n *\n * The rail is a 1px border on the list rather than a drawn line per item, so\n * it stays continuous between entries and collapses cleanly when an entry has\n * no body.\n */\nexport function EditorialTimeline({ className, items, label, title }: EditorialTimelineProps) {\n const visible = items.filter((item) => item.marker.trim() && item.title.trim());\n if (!visible.length) return null;\n\n return (\n <section\n aria-label={title ?? label ?? undefined}\n className={cn(editorialBlock({ spacing: \"loose\" }), className)}\n >\n {(label || title) && (\n <div className=\"mb-5\">\n {label && <div className={EDITORIAL_EYEBROW}>{label}</div>}\n {title && (\n <h3 className=\"mt-2 text-lg font-semibold leading-6 text-foreground\">{title}</h3>\n )}\n </div>\n )}\n <ol className=\"ml-[3.25rem] border-l border-border sm:ml-24\">\n {visible.map((item, index) => (\n <li key={item.key ?? `${index}-${item.marker}`} className=\"relative pb-7 pl-6 last:pb-0\">\n <span\n aria-hidden\n className=\"absolute -left-[0.3125rem] top-1.5 size-2.5 rounded-full border-2 border-background bg-[hsl(var(--primary))]\"\n />\n <span\n className=\"absolute right-[calc(100%+1.5rem)] top-0 whitespace-nowrap font-mono text-xs font-semibold tabular-nums leading-6 text-muted-foreground\"\n aria-hidden\n >\n {item.marker}\n </span>\n <h4 className=\"text-[0.9375rem] font-semibold leading-6 text-foreground\">\n <span className=\"sr-only\">{item.marker} — </span>\n {item.title}\n </h4>\n {item.body && <p className={cn(\"mt-1.5\", EDITORIAL_BODY)}>{item.body}</p>}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n"]}
@@ -1,3 +1,4 @@
1
1
  export { SiClerk as ClerkIcon, SiNextdotjs as NextjsIcon, SiPrisma as PrismaIcon, SiStripe as StripeIcon, SiSupabase as SupabaseIcon, SiTailwindcss as TailwindIcon } from '@icons-pack/react-simple-icons';
2
2
  export { Anthropic, Bilibili, Claude, ClaudeCode, Cursor, DeepSeek, Flux, Gemini, Github, Google, Grok, HuggingFace, LangChain, LangGraph, MCP, Meta, Midjourney, Mistral, N8n, Ollama, OpenAI, OpenClaw, Qwen, Railway, SiliconCloud, Smithery, Vercel } from '@lobehub/icons';
3
3
  export { Robot as Bot, Check, LoaderCircle as Loader2, Menu, Moon, Plus, MagnifyingGlass as Search, SettingsGear as Settings, Sparkles, Sun, Cross as X } from '@nebutra/icons';
4
+ import '@lobehub/ui/chat';
@@ -40,8 +40,8 @@ interface AppShellProps {
40
40
  * fixed-width rail on `md+` viewports and collapses into a `Sheet` overlay on
41
41
  * mobile (triggered by the hamburger button shown in the header).
42
42
  *
43
- * The sidebar width animates smoothly (200ms ease-out) when toggling between
44
- * the expanded and collapsed states so it can host an icon-only rail.
43
+ * The sidebar width animates smoothly (duration-flow, ease-out) when toggling
44
+ * between the expanded and collapsed states so it can host an icon-only rail.
45
45
  *
46
46
  * @status stable
47
47
  *
@@ -98,11 +98,11 @@ var primitiveTransition = {
98
98
  // hover, focus, small state changes
99
99
  flow: 200},
100
100
  easing: {
101
- default: "ease-out"}
101
+ default: "var(--ease-brand)"}
102
102
  };
103
103
 
104
104
  // src/tokens/components/overlay.ts
105
- var overlayFocusRingClassName = "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2";
105
+ var overlayFocusRingClassName = "outline-none";
106
106
  var overlayZIndex = {
107
107
  backdrop: 1040,
108
108
  modal: 1050};
@@ -114,12 +114,12 @@ var overlayClassNames = {
114
114
  focusRing: overlayFocusRingClassName,
115
115
  sheetBackdrop: [
116
116
  "fixed inset-0 bg-[var(--sheet-overlay-background)] backdrop-blur-[var(--sheet-overlay-blur)]",
117
- "transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
117
+ "transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
118
118
  "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
119
119
  ].join(" "),
120
120
  sheetSurface: [
121
121
  "fixed flex flex-col overflow-hidden border border-border bg-[var(--sheet-background)] text-foreground shadow-[var(--sheet-shadow)]",
122
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
122
+ "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
123
123
  "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
124
124
  ].join(" ")};
125
125
 
@@ -154,6 +154,12 @@ var sheetTokens = {
154
154
  function cn(...inputs) {
155
155
  return twMerge(clsx(inputs));
156
156
  }
157
+
158
+ // src/utils/primitive-props.ts
159
+ function asPlainStyle(style) {
160
+ if (style == null || typeof style === "function") return {};
161
+ return style;
162
+ }
157
163
  function getSheetStyle(style) {
158
164
  return {
159
165
  "--sheet-inset": `${sheetTokens.inset}px`,
@@ -176,7 +182,7 @@ function getSheetStyle(style) {
176
182
  "--sheet-shadow": sheetTokens.surface.shadow,
177
183
  "--sheet-duration": `${overlayTokens.motion.duration}ms`,
178
184
  "--sheet-easing": overlayTokens.motion.easing,
179
- ...style
185
+ ...asPlainStyle(style)
180
186
  };
181
187
  }
182
188
  function Sheet({ modal = "trap-focus", disablePointerDismissal = true, ...props }) {
@@ -329,7 +335,7 @@ function AppShell({
329
335
  "aria-label": "Primary",
330
336
  className: cn(
331
337
  "hidden h-screen overflow-hidden bg-sidebar text-sidebar-foreground md:block",
332
- "transition-[width] duration-200 ease-out",
338
+ "transition-[width] duration-flow ease-out",
333
339
  overlay ? "absolute inset-y-0 left-0 z-40" : "shrink-0",
334
340
  railWidth > 0 && "border-r border-sidebar-border",
335
341
  overlay && railWidth > 0 && "shadow-2xl"
@@ -374,7 +380,7 @@ function AppShell({
374
380
  className: cn(
375
381
  "relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']",
376
382
  "hover:bg-muted hover:text-foreground md:hidden",
377
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1"
383
+ "focus-visible:outline-none"
378
384
  ),
379
385
  children: /* @__PURE__ */ jsx(Menu, { className: "size-4", "aria-hidden": "true" })
380
386
  }
@@ -392,7 +398,7 @@ function AppShell({
392
398
  className: cn(
393
399
  "relative inline-flex size-8 items-center justify-center rounded-[var(--radius-md)] text-foreground/80 after:absolute after:-inset-1.5 after:content-['']",
394
400
  "hover:bg-muted hover:text-foreground",
395
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1"
401
+ "focus-visible:outline-none"
396
402
  ),
397
403
  children: /* @__PURE__ */ jsx(Menu, { className: "size-4", "aria-hidden": "true" })
398
404
  }
@@ -792,8 +798,8 @@ var buttonVariants = cva(
792
798
  "inline-flex items-center justify-center gap-2 whitespace-nowrap",
793
799
  "rounded-[var(--btn-default-radius,var(--radius-md))]",
794
800
  "text-[length:var(--control-font-size-md,0.875rem)] font-[number:var(--font-weight-medium,500)]",
795
- "transition-colors duration-micro ease-out",
796
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
801
+ "transition-[color,background-color,border-color,transform] duration-flow ease-[var(--ease-brand)]",
802
+ "active:scale-[0.97] motion-reduce:active:scale-100 motion-reduce:transition-none",
797
803
  "disabled:pointer-events-none disabled:opacity-50",
798
804
  "aria-busy:cursor-wait"
799
805
  ].join(" "),
@@ -820,8 +826,30 @@ var buttonVariants = cva(
820
826
  },
821
827
  shape: {
822
828
  default: "",
823
- square: "",
824
- circle: ""
829
+ // Radius from --btn-default-radius / --radius-md — brand-switchable.
830
+ // Do not hardcode rounded-md here; a language must be able to retarget
831
+ // the corner treatment of every icon trigger at once.
832
+ square: "rounded-[var(--btn-default-radius,var(--radius-md))]",
833
+ // Pill radius token, not Tailwind rounded-full — same 9999px default,
834
+ // but a brand that ships a softer "circle" can override --radius-pill.
835
+ circle: "rounded-[var(--radius-pill,9999px)]",
836
+ pill: "rounded-[var(--radius-pill,9999px)]"
837
+ },
838
+ // Icon-only box size — orthogonal to `size` (which tunes text-button
839
+ // height/padding/font together) and to `shape` (which picks the
840
+ // corner treatment). Only takes effect combined with shape="square"
841
+ // or shape="circle" (see compoundVariants below); every other
842
+ // combination ignores it. 28/32/36 cover the icon-trigger sizes that
843
+ // actually occur in the app — 24/40/48 are already reachable via
844
+ // shape + size (tiny/default/lg). Heights read --control-height-icon-*
845
+ // so density-aware Brand Packages can scale them with the ladder.
846
+ iconSize: {
847
+ sm: "",
848
+ // 28px default
849
+ md: "",
850
+ // 32px default
851
+ lg: ""
852
+ // 36px default
825
853
  }
826
854
  },
827
855
  compoundVariants: [
@@ -832,22 +860,56 @@ var buttonVariants = cva(
832
860
  {
833
861
  shape: "circle",
834
862
  size: "tiny",
835
- className: "w-[var(--control-height-tiny,1.5rem)] px-0 rounded-full"
863
+ className: "w-[var(--control-height-tiny,1.5rem)] px-0"
836
864
  },
837
865
  {
838
866
  shape: "circle",
839
867
  size: "sm",
840
- className: "w-[var(--control-height-sm,2rem)] px-0 rounded-full"
868
+ className: "w-[var(--control-height-sm,2rem)] px-0"
841
869
  },
842
870
  {
843
871
  shape: "circle",
844
872
  size: "default",
845
- className: "w-[var(--control-height-md,2.5rem)] px-0 rounded-full"
873
+ className: "w-[var(--control-height-md,2.5rem)] px-0"
846
874
  },
847
875
  {
848
876
  shape: "circle",
849
877
  size: "lg",
850
- className: "w-[var(--control-height-lg,3rem)] px-0 rounded-full"
878
+ className: "w-[var(--control-height-lg,3rem)] px-0"
879
+ },
880
+ // iconSize wins over the size-driven box above — matched on shape +
881
+ // iconSize only, so it applies regardless of whatever `size` was
882
+ // passed (or left at its "default" fallback). Corner treatment stays
883
+ // on the shape variant (token-backed); only the box is set here.
884
+ {
885
+ shape: "square",
886
+ iconSize: "sm",
887
+ className: "h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0"
888
+ },
889
+ {
890
+ shape: "square",
891
+ iconSize: "md",
892
+ className: "h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0"
893
+ },
894
+ {
895
+ shape: "square",
896
+ iconSize: "lg",
897
+ className: "h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0"
898
+ },
899
+ {
900
+ shape: "circle",
901
+ iconSize: "sm",
902
+ className: "h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0"
903
+ },
904
+ {
905
+ shape: "circle",
906
+ iconSize: "md",
907
+ className: "h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0"
908
+ },
909
+ {
910
+ shape: "circle",
911
+ iconSize: "lg",
912
+ className: "h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0"
851
913
  }
852
914
  ],
853
915
  defaultVariants: {
@@ -869,7 +931,10 @@ function Spinner({ className }) {
869
931
  }
870
932
  );
871
933
  }
872
- function getIconSizeClass(size) {
934
+ function getIconSizeClass(size, iconSize2) {
935
+ if (iconSize2 === "sm") return "[&>svg]:size-3.5";
936
+ if (iconSize2 === "md") return "[&>svg]:size-3.5";
937
+ if (iconSize2 === "lg") return "[&>svg]:size-4";
873
938
  switch (size) {
874
939
  case "tiny":
875
940
  return "[&>svg]:size-3";
@@ -884,7 +949,10 @@ function getIconSizeClass(size) {
884
949
  return "[&>svg]:size-4";
885
950
  }
886
951
  }
887
- function getSpinnerSizeClass(size) {
952
+ function getSpinnerSizeClass(size, iconSize2) {
953
+ if (iconSize2 === "sm") return "size-3.5";
954
+ if (iconSize2 === "md") return "size-3.5";
955
+ if (iconSize2 === "lg") return "size-4";
888
956
  switch (size) {
889
957
  case "tiny":
890
958
  return "size-3";
@@ -909,10 +977,10 @@ function resolveShadowClass(shadow) {
909
977
  const level = shadow === true ? "md" : shadow;
910
978
  return SHADOW_CLASSES[level];
911
979
  }
912
- function ButtonContent({ loading, prefix, suffix, size, children }) {
913
- const iconSizeClass = getIconSizeClass(size);
980
+ function ButtonContent({ loading, prefix, suffix, size, iconSize: iconSize2, children }) {
981
+ const iconSizeClass = getIconSizeClass(size, iconSize2);
914
982
  return /* @__PURE__ */ jsxs(Fragment, { children: [
915
- loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size) }),
983
+ loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size, iconSize2) }),
916
984
  prefix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: prefix }),
917
985
  children,
918
986
  suffix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: suffix })
@@ -923,6 +991,7 @@ var Button = ({
923
991
  variant,
924
992
  size,
925
993
  shape,
994
+ iconSize: iconSize2,
926
995
  asChild = false,
927
996
  loading = false,
928
997
  disabled,
@@ -940,11 +1009,21 @@ var Button = ({
940
1009
  Comp,
941
1010
  {
942
1011
  ref,
943
- className: cn(buttonVariants({ variant, size, shape }), shadowClass, className),
1012
+ className: cn(buttonVariants({ variant, size, shape, iconSize: iconSize2 }), shadowClass, className),
944
1013
  disabled: isDisabled,
945
1014
  "aria-busy": loading || void 0,
946
1015
  ...props,
947
- children: asChild ? children : /* @__PURE__ */ jsx(ButtonContent, { loading, prefix, suffix, size, children })
1016
+ children: asChild ? children : /* @__PURE__ */ jsx(
1017
+ ButtonContent,
1018
+ {
1019
+ loading,
1020
+ prefix,
1021
+ suffix,
1022
+ size,
1023
+ iconSize: iconSize2,
1024
+ children
1025
+ }
1026
+ )
948
1027
  }
949
1028
  );
950
1029
  };
@@ -954,6 +1033,7 @@ var ButtonLink = ({
954
1033
  variant,
955
1034
  size,
956
1035
  shape,
1036
+ iconSize: iconSize2,
957
1037
  prefix,
958
1038
  suffix,
959
1039
  shadow,
@@ -973,14 +1053,24 @@ var ButtonLink = ({
973
1053
  {
974
1054
  ref,
975
1055
  className: cn(
976
- buttonVariants({ variant, size, shape }),
1056
+ buttonVariants({ variant, size, shape, iconSize: iconSize2 }),
977
1057
  shadowClass,
978
1058
  loading && "pointer-events-none opacity-50",
979
1059
  className
980
1060
  ),
981
1061
  ...loadingProps,
982
1062
  ...props,
983
- children: /* @__PURE__ */ jsx(ButtonContent, { loading, prefix, suffix, size, children })
1063
+ children: /* @__PURE__ */ jsx(
1064
+ ButtonContent,
1065
+ {
1066
+ loading,
1067
+ prefix,
1068
+ suffix,
1069
+ size,
1070
+ iconSize: iconSize2,
1071
+ children
1072
+ }
1073
+ )
984
1074
  }
985
1075
  );
986
1076
  };
@@ -1155,7 +1245,7 @@ var spinnerSize = {
1155
1245
  large: "h-8 w-8 border-4"
1156
1246
  };
1157
1247
  function LoadingState({ message, size = "large" }) {
1158
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-10", children: [
1248
+ return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-center justify-center py-10", children: [
1159
1249
  /* @__PURE__ */ jsx(
1160
1250
  "span",
1161
1251
  {