@pollinations/ui 0.1.0-alpha.1 → 0.1.0-alpha.10
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/README.md +148 -36
- package/dist/Button-BGqClaBr.d.cts +29 -0
- package/dist/Button-BGqClaBr.d.ts +29 -0
- package/dist/Chip-v-ADv6cz.d.cts +18 -0
- package/dist/Chip-v-ADv6cz.d.ts +18 -0
- package/dist/Dialog-D3Nqt8cE.d.cts +66 -0
- package/dist/Dialog-D3Nqt8cE.d.ts +66 -0
- package/dist/app-user-menu/sdk.cjs +684 -243
- package/dist/app-user-menu/sdk.cjs.map +1 -1
- package/dist/app-user-menu/sdk.d.cts +18 -7
- package/dist/app-user-menu/sdk.d.ts +18 -7
- package/dist/app-user-menu/sdk.js +689 -241
- package/dist/app-user-menu/sdk.js.map +1 -1
- package/dist/app.css +19 -122
- package/dist/auth/index.cjs +1372 -86
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +91 -6
- package/dist/auth/index.d.ts +91 -6
- package/dist/auth/index.js +1369 -85
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/sdk.cjs +250 -0
- package/dist/auth/sdk.cjs.map +1 -0
- package/dist/auth/sdk.d.cts +40 -0
- package/dist/auth/sdk.d.ts +40 -0
- package/dist/auth/sdk.js +219 -0
- package/dist/auth/sdk.js.map +1 -0
- package/dist/brand/badge-made-with.svg +1 -0
- package/dist/brand/lockup-horizontal-black.png +0 -0
- package/dist/brand/lockup-horizontal-black.svg +4 -0
- package/dist/brand/lockup-horizontal-white.png +0 -0
- package/dist/brand/lockup-horizontal-white.svg +4 -0
- package/dist/brand/lockup-horizontal.svg +4 -0
- package/dist/brand/lockup-stacked-black.png +0 -0
- package/dist/brand/lockup-stacked-black.svg +4 -0
- package/dist/brand/lockup-stacked-white.png +0 -0
- package/dist/brand/lockup-stacked-white.svg +4 -0
- package/dist/brand/lockup-stacked.svg +4 -0
- package/dist/brand/mark-black.png +0 -0
- package/dist/brand/mark-black.svg +1 -0
- package/dist/brand/mark-white.png +0 -0
- package/dist/brand/mark-white.svg +1 -0
- package/dist/brand/mark.svg +1 -0
- package/dist/brand/polli/polli-lockup-horizontal-black.png +0 -0
- package/dist/brand/polli/polli-lockup-horizontal-white.png +0 -0
- package/dist/brand/polli/polli-lockup-stacked-black.png +0 -0
- package/dist/brand/polli/polli-lockup-stacked-white.png +0 -0
- package/dist/brand/polli/polli.png +0 -0
- package/dist/brand/wordmark-black.png +0 -0
- package/dist/brand/wordmark-black.svg +1 -0
- package/dist/brand/wordmark-white.png +0 -0
- package/dist/brand/wordmark-white.svg +1 -0
- package/dist/brand/wordmark.svg +1 -0
- package/dist/fonts/geist-pixel-square.woff2 +0 -0
- package/dist/gen/index.cjs +459 -218
- package/dist/gen/index.cjs.map +1 -1
- package/dist/gen/index.d.cts +75 -19
- package/dist/gen/index.d.ts +75 -19
- package/dist/gen/index.js +453 -216
- package/dist/gen/index.js.map +1 -1
- package/dist/index.browser.min.js +2 -0
- package/dist/index.browser.min.js.map +1 -0
- package/dist/index.cjs +3907 -1626
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +682 -199
- package/dist/index.d.ts +682 -199
- package/dist/index.js +3671 -1457
- package/dist/index.js.map +1 -1
- package/dist/licenses/Geist-OFL.txt +93 -0
- package/dist/markdown.cjs +836 -0
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.d.cts +16 -0
- package/dist/markdown.d.ts +16 -0
- package/dist/markdown.js +807 -0
- package/dist/markdown.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/theme.css +94 -0
- package/dist/types-CCy9JNu9.d.cts +6 -0
- package/dist/types-CCy9JNu9.d.ts +6 -0
- package/dist/wallet/index.cjs +295 -65
- package/dist/wallet/index.cjs.map +1 -1
- package/dist/wallet/index.d.cts +30 -7
- package/dist/wallet/index.d.ts +30 -7
- package/dist/wallet/index.js +294 -65
- package/dist/wallet/index.js.map +1 -1
- package/package.json +106 -89
- package/dist/Chip-CQCq34kS.d.cts +0 -20
- package/dist/Chip-Cj4xG7Te.d.ts +0 -20
- package/dist/assets/logo-wordmark.svg +0 -1
- package/dist/assets/logo.svg +0 -4
- package/dist/theme-jRPPBmld.d.cts +0 -20
- package/dist/theme-jRPPBmld.d.ts +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/markdown.ts","../src/compositions/Markdown.tsx","../src/lib/cn.ts","../src/lib/link.ts","../src/primitives/icons/index.tsx","../src/primitives/InlineLink.tsx","../src/compositions/CopyButton.tsx","../src/primitives/Button.tsx","../src/primitives/Tooltip.tsx","../src/compositions/CodeBlock.tsx","../src/compositions/Prose.tsx","../src/primitives/Typography.tsx"],"sourcesContent":["/**\n * Markdown renderers, deliberately off the main barrel.\n *\n * Both pull react-markdown and its unified/remark tree (~170 KB). A tsup entry\n * is bundled as a single module, so anything re-exported from `index.ts` is a\n * static dependency of every page that imports anything at all from the\n * package — the bundler cannot split one module across chunks. Behind their\n * own entry, only the routes that render documents pay for them.\n */\nexport { Markdown, type MarkdownProps } from \"./compositions/Markdown.tsx\";\nexport { Prose, type ProseProps } from \"./compositions/Prose.tsx\";\n","import { isValidElement, type ReactNode } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"../lib/cn.ts\";\nimport { InlineLink } from \"../primitives/InlineLink.tsx\";\nimport { CodeBlock } from \"./CodeBlock.tsx\";\n\nexport type MarkdownProps = {\n children: string;\n className?: string;\n};\n\nfunction textContent(value: ReactNode): string {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return String(value);\n }\n if (Array.isArray(value)) return value.map(textContent).join(\"\");\n if (isValidElement<{ children?: ReactNode }>(value)) {\n return textContent(value.props.children);\n }\n return \"\";\n}\n\nconst VIDEO_EXTENSIONS = new Set([\"m4v\", \"mov\", \"mp4\", \"webm\"]);\nconst AUDIO_EXTENSIONS = new Set([\n \"aac\",\n \"flac\",\n \"m4a\",\n \"mp3\",\n \"ogg\",\n \"opus\",\n \"wav\",\n]);\n\nfunction urlExtension(src: string): string {\n // Only the path names a file; the base resolves relative links.\n try {\n const { pathname } = new URL(src, \"http://localhost\");\n return pathname.split(\".\").pop()?.toLowerCase() ?? \"\";\n } catch {\n return \"\";\n }\n}\n\nfunction inlineMedia(src: string | undefined, label: string | undefined) {\n if (!src) return null;\n const extension = urlExtension(src);\n // Agent tool results use these labels for stored URLs without extensions.\n const video =\n VIDEO_EXTENSIONS.has(extension) || label === \"Generated video\";\n const audio =\n AUDIO_EXTENSIONS.has(extension) || label === \"Generated audio\";\n if (!video && !audio) return null;\n const Element = video ? \"video\" : \"audio\";\n return (\n <Element\n src={src}\n aria-label={label}\n controls\n playsInline={video || undefined}\n preload=\"metadata\"\n className=\"polli:max-w-full polli:rounded-lg\"\n />\n );\n}\n\nfunction MarkdownCodeBlock({ children }: { children?: ReactNode }) {\n const child = isValidElement<{\n children?: ReactNode;\n className?: string;\n }>(children)\n ? children\n : null;\n const language = child?.props.className?.match(/language-([^\\s]+)/)?.[1];\n const code = textContent(child?.props.children ?? children).replace(\n /\\n$/,\n \"\",\n );\n\n return <CodeBlock code={code} language={language} className=\"polli:my-3\" />;\n}\n\nconst components: Components = {\n ul: ({ node, ...props }) => (\n <ul\n className=\"polli:flex polli:min-w-0 polli:list-disc polli:flex-col polli:gap-1 polli:pl-5 polli:marker:text-theme-text-muted\"\n {...props}\n />\n ),\n ol: ({ node, ...props }) => (\n <ol\n className=\"polli:flex polli:min-w-0 polli:list-decimal polli:flex-col polli:gap-1 polli:pl-5 polli:marker:text-theme-text-muted\"\n {...props}\n />\n ),\n p: ({ node, ...props }) => (\n <p className=\"polli:mb-2 polli:last:mb-0\" {...props} />\n ),\n strong: ({ node, ...props }) => (\n <strong\n className=\"polli:font-semibold polli:text-theme-text-strong\"\n {...props}\n />\n ),\n code: ({ node, ...props }) => (\n <code\n className=\"polli:break-words polli:rounded polli:bg-theme-bg-subtle polli:px-1 polli:py-0.5 polli:font-mono polli:text-xs\"\n {...props}\n />\n ),\n pre: ({ children }) => <MarkdownCodeBlock>{children}</MarkdownCodeBlock>,\n img: ({ node, src, alt, ...props }) => {\n const media = inlineMedia(\n typeof src === \"string\" ? src : undefined,\n alt,\n );\n if (media) return media;\n return (\n <img\n src={src}\n alt={alt}\n loading=\"lazy\"\n className=\"polli:max-w-full polli:rounded-lg\"\n {...props}\n />\n );\n },\n a: ({ node, href, ...props }) => {\n const media = inlineMedia(href, textContent(props.children));\n if (media) return media;\n return <InlineLink href={href} {...props} />;\n },\n};\n\n/** Compact markdown for cards and snippets. Use Prose for document-style content. */\nexport function Markdown({ children, className }: MarkdownProps) {\n return (\n <div\n className={cn(\n \"polli:min-w-0 polli:font-body polli:leading-relaxed\",\n className,\n )}\n >\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {children}\n </ReactMarkdown>\n </div>\n );\n}\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n// `text-micro` is a font size (theme.css), not a colour; without this,\n// tailwind-merge drops it next to a `text-theme-*` colour class.\nconst twMerge = extendTailwindMerge({\n prefix: \"polli\",\n extend: { theme: { text: [\"micro\"] } },\n});\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","/** Relative URLs and same-origin absolute URLs stay in the current app. */\nexport function isExternalHref(\n href: unknown,\n origin = globalThis.location?.origin,\n): boolean {\n if (typeof href !== \"string\" || !/^(https?:)?\\/\\//i.test(href))\n return false;\n if (!origin) return true;\n try {\n return new URL(href, origin).origin !== origin;\n } catch {\n return false;\n }\n}\n","import type { IconProps } from \"./types.ts\";\n\nconst strokeProps = {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n} as const;\n\nexport function AppIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 20h20\" />\n </svg>\n );\n}\n\nexport function AccountIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </svg>\n );\n}\n\nexport function ArrowRightIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function BeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 3h6\" />\n <path d=\"M10 3v6.5L4.5 18a2 2 0 0 0 1.7 3h11.6a2 2 0 0 0 1.7-3L14 9.5V3\" />\n <path d=\"M7 14h10\" />\n </svg>\n );\n}\n\nexport function BotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 8V4H8\" />\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <path d=\"M2 14h2M20 14h2\" />\n <path d=\"M9 13v2M15 13v2\" />\n </svg>\n );\n}\n\nexport function BookIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 4h5a3 3 0 0 1 3 3v13a2 2 0 0 0-2-2H4z\" />\n <path d=\"M20 4h-5a3 3 0 0 0-3 3v13a2 2 0 0 1 2-2h6z\" />\n </svg>\n );\n}\n\nexport function BugIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 2 1.9 1.9M14.1 3.9 16 2\" />\n <path d=\"M9 7V6a3 3 0 0 1 6 0v1\" />\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a6 6 0 0 1 12 0v3c0 3.3-2.7 6-6 6Z\" />\n <path d=\"M12 20v-9M6.5 9C4.6 8.8 3 7.1 3 5M6 13H2M3 21c0-2.1 1.7-3.9 3.8-4M17.5 9C19.4 8.8 21 7.1 21 5M18 13h4M21 21c0-2.1-1.7-3.9-3.8-4\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: IconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n strokeWidth={2.5}\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function ClipboardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nexport function ClockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\nexport function DiscordIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.32 4.37A19.8 19.8 0 0 0 15.36 2.83a.07.07 0 0 0-.08.04c-.21.38-.45.88-.62 1.27a18.27 18.27 0 0 0-5.52 0 12.84 12.84 0 0 0-.63-1.27.08.08 0 0 0-.08-.04A19.74 19.74 0 0 0 3.47 4.37a.07.07 0 0 0-.03.03C.31 9.07-.55 13.61-.13 18.1a.08.08 0 0 0 .03.06 19.9 19.9 0 0 0 6.08 3.07.08.08 0 0 0 .09-.03c.47-.64.88-1.31 1.24-2.02a.08.08 0 0 0-.04-.1 13.08 13.08 0 0 1-1.9-.91.08.08 0 0 1-.01-.13c.13-.1.25-.2.37-.29a.07.07 0 0 1 .08-.01 14.24 14.24 0 0 0 12.38 0 .07.07 0 0 1 .08.01c.12.1.25.2.38.3a.08.08 0 0 1-.01.12 12.22 12.22 0 0 1-1.9.9.08.08 0 0 0-.04.11c.36.7.77 1.38 1.23 2.02a.08.08 0 0 0 .1.03 19.84 19.84 0 0 0 6.08-3.07.08.08 0 0 0 .03-.05c.5-5.2-.84-9.7-3.77-13.71a.06.06 0 0 0-.03-.03ZM8.02 15.37c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.96 2.4-2.16 2.4Zm7.96 0c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.95 2.4-2.16 2.4Z\"\n />\n </svg>\n );\n}\n\nexport function InstagramIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <circle\n cx=\"17.5\"\n cy=\"6.5\"\n r=\"1\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\nexport function XSocialIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M18.24 2.25h3.31l-7.23 8.26 8.51 11.24h-6.66l-5.21-6.82-5.97 6.82H1.68l7.73-8.84L1.25 2.25h6.83l4.71 6.23 5.45-6.23Zm-1.16 17.52h1.83L7.08 4.13H5.12l11.96 15.64Z\"\n />\n </svg>\n );\n}\n\nexport function LinkedInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.45 20.45h-3.56v-5.57c0-1.33-.03-3.04-1.85-3.04-1.86 0-2.14 1.45-2.14 2.94v5.67H9.34V9h3.42v1.56h.05c.47-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.32 7.43a2.07 2.07 0 1 1 0-4.13 2.07 2.07 0 0 1 0 4.13ZM7.1 20.45H3.54V9H7.1v11.45Z\"\n />\n </svg>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function ExpandIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M8 3H3v5M16 3h5v5M21 16v5h-5M3 16v5h5\" />\n </svg>\n );\n}\n\nexport function PlayIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M7 4.5v15l12-7.5z\" />\n </svg>\n );\n}\n\nexport function PauseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M6 4h4v16H6zM14 4h4v16h-4z\" />\n </svg>\n );\n}\n\nexport function CloudUploadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M17.5 19H19a4 4 0 0 0 .4-8A7.5 7.5 0 0 0 5 9.5 5 5 0 0 0 6 19h1.5\" />\n <path d=\"m8.5 15.5 3.5-3.5 3.5 3.5M12 12v9\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 17 17 7M9 7h8v8\" />\n </svg>\n );\n}\n\nexport function GenApiIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 3 4 1.5L16 3v18l-4-1.5L8 21z\" />\n <path d=\"M8 3v18M16 3v18\" />\n </svg>\n );\n}\n\nexport function GitBranchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M18 9a9 9 0 0 1-9 9\" />\n </svg>\n );\n}\n\nexport function GitPullRequestIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"6\" cy=\"6\" r=\"3\" />\n <circle cx=\"18\" cy=\"18\" r=\"3\" />\n <path d=\"M6 9v12M13 6h3a2 2 0 0 1 2 2v7\" />\n </svg>\n );\n}\n\nexport function GraduationCapIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21.42 10.92a1 1 0 0 0-.02-1.84L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.83l8.57 3.91a2 2 0 0 0 1.66 0z\" />\n <path d=\"M22 10v6\" />\n <path d=\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\" />\n </svg>\n );\n}\n\nexport function SparklesIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 3l1.9 5.8a2 2 0 0 0 1.3 1.3L21 12l-5.8 1.9a2 2 0 0 0-1.3 1.3L12 21l-1.9-5.8a2 2 0 0 0-1.3-1.3L3 12l5.8-1.9a2 2 0 0 0 1.3-1.3z\" />\n </svg>\n );\n}\n\nexport function GitHubIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M12 .5A11.5 11.5 0 0 0 8.36 22.9c.58.11.79-.25.79-.56v-2.16c-3.21.7-3.89-1.38-3.89-1.38-.53-1.34-1.29-1.7-1.29-1.7-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.04 1.76 2.71 1.25 3.37.96.11-.75.4-1.25.74-1.54-2.56-.29-5.26-1.28-5.26-5.7 0-1.26.45-2.29 1.19-3.1-.12-.29-.52-1.46.11-3.06 0 0 .97-.31 3.16 1.18a10.88 10.88 0 0 1 5.76 0c2.19-1.49 3.15-1.18 3.15-1.18.63 1.6.23 2.77.11 3.06.74.81 1.19 1.84 1.19 3.1 0 4.43-2.7 5.4-5.27 5.69.41.36.78 1.06.78 2.14v3.19c0 .31.21.68.8.56A11.5 11.5 0 0 0 12 .5Z\"\n />\n </svg>\n );\n}\n\nexport function ImageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-5-5L5 21\" />\n </svg>\n );\n}\n\nexport function CubeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m21 16-9 5-9-5V8l9-5 9 5z\" />\n <path d=\"m3 8 9 5 9-5\" />\n <path d=\"M12 13v8\" />\n </svg>\n );\n}\n\nexport function AudioIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n );\n}\n\nexport function LockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function LogInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10 17l5-5-5-5\" />\n <path d=\"M15 12H3\" />\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n </svg>\n );\n}\n\nexport function LogOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function MailIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"m3 7 9 7 9-7\" />\n </svg>\n );\n}\n\nexport function McpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <rect x=\"14\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\nexport function MenuIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 7h16M4 12h16M4 17h16\" />\n </svg>\n );\n}\n\nexport function NewspaperIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 4h12a1 1 0 0 1 1 1v14a1 1 0 0 0 1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1z\" />\n <path d=\"M18 8h2a1 1 0 0 1 1 1v9a2 2 0 0 1-2 2\" />\n <path d=\"M7 8h7M7 12h7M7 16h4\" />\n </svg>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nexport function TerminalIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"4 8 8 12 4 16\" />\n <line x1=\"12\" y1=\"20\" x2=\"20\" y2=\"20\" />\n </svg>\n );\n}\n\nexport function ToolIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l2.1 2.1a1 1 0 0 0 1.4 0l4-4a6 6 0 0 1-8 8l-8 8a2.8 2.8 0 0 1-4-4l8-8a6 6 0 0 1 8-8l-4 4Z\" />\n </svg>\n );\n}\n\nexport function TargetIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function TokensIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 9h16M4 15h16M10 3 8 21M16 3l-2 18\" />\n </svg>\n );\n}\n\nexport function UsageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 18a8 8 0 1 1 16 0\" />\n <path d=\"M12 18l3.5-5\" />\n <path d=\"M7 18h10\" />\n <path d=\"M7.5 12.5 6 11\" />\n <path d=\"M16.5 12.5 18 11\" />\n </svg>\n );\n}\n\nexport function WarningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10.3 3.1 1.8 17a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.1a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n );\n}\n\nexport function TrendUpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"3 17 9 11 13 15 21 7\" />\n <polyline points=\"15 7 21 7 21 13\" />\n </svg>\n );\n}\n\nexport function EarningsIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"10\" cy=\"6\" rx=\"6\" ry=\"3\" />\n <path d=\"M4 6v8c0 1.7 2.7 3 6 3 1.2 0 2.4-.2 3.3-.5\" />\n <path d=\"M16 6v4\" />\n <path d=\"M4 10c0 1.7 2.7 3 6 3 1.1 0 2.1-.1 3-.4\" />\n <path d=\"M18 14v6\" />\n <path d=\"M15 17h6\" />\n </svg>\n );\n}\n\nexport function WalletIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 7a2 2 0 0 1 2-2h13a2 2 0 0 1 2 2v2H5a2 2 0 0 0-2 2V7Z\" />\n <path d=\"M3 11a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6Z\" />\n <circle cx=\"17\" cy=\"14\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/** A paper receipt: what a price includes. */\nexport function ReceiptIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5L6 21Z\" />\n <path d=\"M9 8h6M9 12h6M9 16h3\" />\n </svg>\n );\n}\n\nexport function MoonIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z\" />\n </svg>\n );\n}\n\nexport function SunIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n );\n}\n\nexport function XIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function TrashIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4h8v2\" />\n <path d=\"m19 6-1 15H6L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n </svg>\n );\n}\n\n// --- Model modality / capability / price glyphs (single-ink, replace emoji) ---\n\nexport function ChatIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nexport function RobotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"6\" width=\"18\" height=\"15\" rx=\"3\" />\n <path d=\"M12 2v4M3 11H1v5h2M21 11h2v5h-2M8 17h8\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\nexport function EyeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function EyeOffIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M3 3l18 18\" />\n </svg>\n );\n}\n\nexport function VideoIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m22 8-6 4 6 4V8z\" />\n <rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\" />\n </svg>\n );\n}\n\nexport function MicIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <path d=\"M12 19v3\" />\n </svg>\n );\n}\n\nexport function SpeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M11 5 6 9H2v6h4l5 4z\" />\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\n </svg>\n );\n}\n\nexport function MegaphoneIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m3 11 18-5v12L3 14v-3z\" />\n <path d=\"m7 15 1.5 6H14l-2-7\" />\n </svg>\n );\n}\n\nexport function ReasoningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18h6M10 22h4M15.1 14c.2-1 .6-1.7 1.4-2.5A4.6 4.6 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.8.8 1.2 1.5 1.4 2.5\" />\n </svg>\n );\n}\n\nexport function RocketIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n\nexport function SearchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n\nexport function SignOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function PowerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2v10\" />\n <path d=\"M18.4 6.6a9 9 0 1 1-12.77.04\" />\n </svg>\n );\n}\n\nexport function SparkleIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9.94 15.5A2 2 0 0 0 8.5 14.06l-6.14-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0L14.06 8.5A2 2 0 0 0 15.5 9.94l6.14 1.58a.5.5 0 0 1 0 .96L15.5 14.06a2 2 0 0 0-1.44 1.44l-1.58 6.14a.5.5 0 0 1-.96 0z\" />\n <path d=\"M20 3v4\" />\n <path d=\"M22 5h-4\" />\n <path d=\"M4 17v2\" />\n <path d=\"M5 18H3\" />\n </svg>\n );\n}\n\nexport function StarIcon({\n filled = false,\n ...props\n}: IconProps & { filled?: boolean }) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n fill={filled ? \"currentColor\" : \"none\"}\n {...props}\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function CodeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function DatabaseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14a9 3 0 0 0 18 0V5\" />\n <path d=\"M3 12a9 3 0 0 0 18 0\" />\n </svg>\n );\n}\n\nexport function CardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 10h20\" />\n </svg>\n );\n}\n\nexport function SproutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 20h10\" />\n <path d=\"M10 20c5.5-2.5.8-6.4 3-10\" />\n <path d=\"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z\" />\n <path d=\"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n );\n}\n\nexport function KeyIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n <path d=\"m21 2-9.6 9.6\" />\n <path d=\"m15.5 7.5 3 3L22 7l-3-3\" />\n </svg>\n );\n}\n\nexport function GlobeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\nexport function ArrowLeftIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12a9 9 0 1 1-2.64-6.36\" />\n <path d=\"M21 3v6h-6\" />\n </svg>\n );\n}\n\nexport type { IconProps } from \"./types.ts\";\n","import type { PropsWithChildren } from \"react\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\ntype BaseInlineLinkProps = {\n /** Set explicitly for non-http external links, or false for custom routing components. */\n external?: boolean;\n showIcon?: boolean;\n /** Inline text inherits its size; footers use 13px and standalone links 14px. */\n size?: \"inherit\" | \"footer\" | \"sm\";\n /** Accent for prominent links; quiet for secondary navigation. */\n tone?: \"accent\" | \"quiet\";\n className?: string;\n};\n\nexport type InlineLinkProps<T extends React.ElementType = \"a\"> =\n PropsWithChildren<BaseInlineLinkProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseInlineLinkProps | \"as\"\n >;\n\n/** Shared text-link rule: surrounding font, selectable ink, persistent underline,\n * visible keyboard focus, and an external arrow only when leaving the app.\n * Navigation and button-shaped actions use their own primitives.\n */\nexport function InlineLink<T extends React.ElementType = \"a\">({\n as,\n external,\n showIcon = true,\n size = \"inherit\",\n tone = \"accent\",\n className,\n children,\n ...linkProps\n}: InlineLinkProps<T>) {\n const Component: React.ElementType = as || \"a\";\n const isExternal =\n external ?? isExternalHref((linkProps as { href?: unknown }).href);\n\n return (\n <Component\n target={isExternal && as !== \"button\" ? \"_blank\" : undefined}\n rel={\n isExternal && as !== \"button\"\n ? \"noopener noreferrer\"\n : undefined\n }\n className={[\"polli-link\", className].filter(Boolean).join(\" \")}\n data-size={size}\n data-tone={tone}\n {...linkProps}\n >\n {children}\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli-link-external-icon\"\n />\n )}\n </Component>\n );\n}\n","import {\n type ButtonHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Button, type ButtonProps } from \"../primitives/Button.tsx\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\ntype CopyValue = string | (() => string | Promise<string>);\n\nexport type CopyButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"className\" | \"onClick\" | \"type\" | \"value\"\n> & {\n value: CopyValue;\n children: ReactNode | ((copied: boolean) => ReactNode);\n copiedTimeoutMs?: number;\n tooltip?: ReactNode;\n tooltipAlign?: \"start\" | \"center\";\n tooltipClampToViewport?: boolean;\n tooltipMaxWidth?: number;\n copiedTooltip?: ReactNode;\n tooltipClassName?: string;\n className?: string | ((copied: boolean) => string);\n variant?: \"plain\" | \"button\";\n /** Button intent, used with `variant=\"button\"`. */\n intent?: ButtonProps<\"button\">[\"intent\"];\n onCopied?: () => void;\n onCopyError?: (error: unknown) => void;\n};\n\nexport function CopyButton({\n value,\n children,\n copiedTimeoutMs = 2000,\n tooltip = \"📋 Click to copy\",\n tooltipAlign,\n tooltipClampToViewport,\n tooltipMaxWidth,\n copiedTooltip = \"✅ Copied!\",\n tooltipClassName,\n className,\n variant = \"plain\",\n intent,\n onCopied,\n onCopyError,\n ...buttonProps\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n async function handleCopy(event: MouseEvent<HTMLButtonElement>) {\n event.stopPropagation();\n try {\n const text = typeof value === \"function\" ? await value() : value;\n await navigator.clipboard.writeText(text);\n setCopied(true);\n onCopied?.();\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => setCopied(false),\n copiedTimeoutMs,\n );\n } catch (error) {\n onCopyError?.(error);\n }\n }\n\n const Control = variant === \"button\" ? Button : \"button\";\n const button = (\n <Control\n {...buttonProps}\n {...(variant === \"button\" && intent ? { intent } : {})}\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"polli-control\",\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n typeof className === \"function\" ? className(copied) : className,\n )}\n >\n {typeof children === \"function\" ? children(copied) : children}\n </Control>\n );\n\n // A copy button with its own visible label doesn't need a hover tooltip —\n // pass tooltip={null} to opt out of the wrapper entirely.\n if (tooltip === null) {\n return button;\n }\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={copied ? copiedTooltip : tooltip}\n align={tooltipAlign}\n clampToViewport={tooltipClampToViewport}\n maxWidth={tooltipMaxWidth}\n displayContents\n tapEnabled={false}\n className={cn(\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n tooltipClassName,\n )}\n >\n {button}\n </Tooltip>\n );\n}\n","import type {\n PropsWithChildren,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** Semantic action roles. Label recipes live on Chip. */\ntype ButtonIntent =\n | \"danger\"\n | \"info\"\n | \"neutral\"\n | \"brand\"\n | \"commit\"\n | \"surface\";\nexport type ButtonAppearance = \"pill\" | \"raised\";\n\nconst pillSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:h-5 polli:px-1.5 polli:py-0 polli:text-[11px] polli:leading-none\",\n sm: \"polli:min-h-7 polli:px-2 polli:pt-0.5 polli:pb-1\",\n md: \"polli:min-h-9 polli:px-4 polli:pt-1.5 polli:pb-2\",\n lg: \"polli:min-h-12 polli:px-6 polli:py-3 polli:text-base\",\n} as const;\n\nconst raisedSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:px-2 polli:py-1 polli:text-xs\",\n sm: \"polli:px-4 polli:py-2 polli:text-sm\",\n md: \"polli:px-7 polli:py-3.5 polli:text-base\",\n lg: \"polli:px-8 polli:py-4 polli:text-lg\",\n} as const;\n\nconst appearanceClasses: Record<ButtonAppearance, string> = {\n pill: \"polli:rounded-full\",\n raised:\n \"polli:rounded-xl polli:border-r-[3px] polli:border-b-[3px] polli:border-solid \" +\n \"polli:border-theme-text-strong/20 polli:hover:border-theme-text-strong/45\",\n};\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-strong \" +\n \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:transition-colors\";\n\n// Primary actions have a soft accent fill in light mode and an outline in dark.\n// `brand` keeps a calm hover; `commit` strengthens the fill on hover and focus.\nconst outlined =\n \"polli:border polli:border-theme-text-soft polli:bg-theme-bg-active/30 polli:text-theme-text-strong \" +\n \"polli:transition-colors polli:[.dark_&]:bg-transparent\";\nconst intentClasses: Record<ButtonIntent, string> = {\n brand: `${outlined} polli:hover:bg-theme-bg-active/50 polli:[.dark_&]:hover:bg-theme-text-soft/10`,\n commit:\n `${outlined} polli:hover:border-theme-bg-active polli:hover:bg-theme-bg-active ` +\n \"polli:focus-visible:border-theme-bg-active polli:focus-visible:bg-theme-bg-active \" +\n \"polli:[.dark_&]:hover:bg-theme-bg-active polli:[.dark_&]:focus-visible:bg-theme-bg-active\",\n danger:\n \"polli:border polli:border-intent-danger-text polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-intent-danger-bg-hover polli:focus-visible:bg-intent-danger-bg-hover polli:transition-colors \" +\n \"polli:[.dark_&]:bg-transparent polli:[.dark_&]:hover:bg-intent-danger-bg-hover polli:[.dark_&]:focus-visible:bg-intent-danger-bg-hover\",\n info:\n \"polli:bg-intent-info-bg-light polli:text-intent-info-text \" +\n \"polli:hover:bg-intent-info-bg-hover polli:transition-colors\",\n // A quiet white pill on the desk, like the colour toggle; hover previews\n // the accent as the ambient button does.\n surface:\n \"polli:bg-surface-opaque polli:text-theme-text-strong \" +\n \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:transition-colors\",\n // Secondary actions never take the accent: one step stronger grey on hover.\n neutral:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-text-muted/25 polli:hover:text-theme-text-strong polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n icon?: ReactNode;\n /** Optional semantic recipe; omit for the ambient theme button. */\n intent?: ButtonIntent;\n /** `raised` is the stronger website CTA treatment. */\n appearance?: ButtonAppearance;\n size?: keyof typeof pillSizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n intent,\n appearance = \"pill\",\n size,\n className,\n disabled,\n busy,\n}: BaseButtonProps & { disabled?: boolean; busy?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n const sizeClasses = appearance === \"raised\" ? raisedSizes : pillSizes;\n return cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:self-center polli:font-body polli:text-sm polli:font-medium polli:leading-normal polli:box-border polli:border polli:border-transparent\",\n // A busy button is working, not unavailable: it keeps its strength.\n busy\n ? \"polli:cursor-progress\"\n : disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n appearanceClasses[appearance],\n sizeClasses[size || \"md\"],\n className,\n );\n};\n\nexport type ButtonProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseButtonProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseButtonProps | \"as\">;\n\nexport function Button<T extends React.ElementType = \"button\">({\n as,\n children,\n icon,\n intent,\n appearance,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n const isButton = Component === \"button\";\n const isAnchor = Component === \"a\";\n const buttonType = (\n buttonProps as {\n type?: \"button\" | \"submit\" | \"reset\";\n }\n ).type;\n const onClick = (\n buttonProps as {\n onClick?: (event: ReactMouseEvent) => void;\n }\n ).onClick;\n const ariaBusy = (\n buttonProps as { \"aria-busy\"?: boolean | \"true\" | \"false\" }\n )[\"aria-busy\"];\n const busy = ariaBusy === true || ariaBusy === \"true\";\n const handleClick = disabled\n ? (event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n\n return (\n <Component\n {...buttonProps}\n data-intent={intent}\n {...(isButton ? { type: buttonType ?? \"button\", disabled } : {})}\n {...(!isButton && disabled\n ? { \"aria-disabled\": true, tabIndex: -1 }\n : {})}\n {...(isAnchor && disabled ? { href: undefined } : {})}\n onClick={handleClick}\n className={buttonClasses({\n intent,\n appearance,\n size,\n className,\n disabled,\n busy,\n })}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n className=\"polli:mr-2 polli:flex polli:size-4 polli:shrink-0 polli:[&>svg]:size-full\"\n >\n {busy ? (\n <span className=\"polli:block polli:size-full polli:animate-spin polli:rounded-full polli:border-2 polli:border-current polli:border-r-transparent polli:motion-reduce:animate-none\" />\n ) : (\n icon\n )}\n </span>\n )}\n {children}\n </Component>\n );\n}\n","import {\n type CSSProperties,\n type FC,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst TOOLTIP_MAX_WIDTH = 288;\nconst TOOLTIP_VIEWPORT_MARGIN = 12;\n\ntype TooltipProps = {\n children: ReactNode;\n content: ReactNode;\n align?: \"start\" | \"center\";\n ariaLabel?: string;\n clampToViewport?: boolean;\n className?: string;\n maxWidth?: number;\n onClick?: () => void;\n stopClickPropagation?: boolean;\n style?: CSSProperties;\n tapEnabled?: boolean;\n triggerAs?: \"button\" | \"span\";\n /**\n * When true, the inner cursor wrapper uses display:contents so the\n * trigger's flex/grid layout applies directly to the caller's children\n * without an inline wrapper in the way.\n */\n displayContents?: boolean;\n};\n\nexport const Tooltip: FC<TooltipProps> = ({\n children,\n content,\n align = \"start\",\n ariaLabel,\n clampToViewport = true,\n className,\n maxWidth = TOOLTIP_MAX_WIDTH,\n onClick,\n stopClickPropagation = true,\n style,\n tapEnabled = false,\n triggerAs = \"button\",\n displayContents = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{\n top: number;\n left: number;\n maxWidth: number;\n transform?: CSSProperties[\"transform\"];\n }>({\n top: 0,\n left: 0,\n maxWidth,\n });\n const triggerRef = useRef<HTMLElement | null>(null);\n const tapPinnedRef = useRef(false);\n const tooltipId = useId();\n\n const closeTooltip = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n useEffect(() => {\n if (!showTooltip) return;\n\n const dismissOnOutsideTap = (event: PointerEvent) => {\n if (triggerRef.current?.contains(event.target as Node)) return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnViewportChange = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n document.addEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", dismissOnViewportChange, {\n capture: true,\n passive: true,\n });\n window.addEventListener(\"resize\", dismissOnViewportChange);\n return () => {\n document.removeEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", dismissOnViewportChange, true);\n window.removeEventListener(\"resize\", dismissOnViewportChange);\n };\n }, [showTooltip]);\n\n const updateTooltipPosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const availableMaxWidth = Math.min(\n maxWidth,\n window.innerWidth - TOOLTIP_VIEWPORT_MARGIN * 2,\n );\n let left =\n align === \"center\" ? rect.left + rect.width / 2 : rect.left;\n let transform: CSSProperties[\"transform\"] =\n align === \"center\" ? \"translateX(-50%)\" : undefined;\n if (clampToViewport) {\n left = Math.min(\n Math.max(rect.left, TOOLTIP_VIEWPORT_MARGIN),\n Math.max(\n TOOLTIP_VIEWPORT_MARGIN,\n window.innerWidth -\n availableMaxWidth -\n TOOLTIP_VIEWPORT_MARGIN,\n ),\n );\n transform = undefined;\n }\n setTooltipPosition({\n top: rect.bottom + 4,\n left,\n maxWidth: availableMaxWidth,\n transform,\n });\n }\n };\n\n // Informational triggers use help; action wrappers can override the cursor.\n const triggerClassName = cn(\n \"polli-control polli:relative polli:cursor-help polli:text-left polli:inline-flex polli:items-center\",\n className,\n );\n\n const cursorClass = displayContents\n ? \"polli:contents\"\n : \"polli:cursor-inherit\";\n\n // Portal past the trigger's layout; stay inside modal dialogs so the popup\n // shares their stacking and accessible subtree.\n const popupClasses =\n \"polli:fixed polli:w-max polli:px-2 polli:py-1 polli:bg-surface-menu polli:text-theme-text-base polli:font-normal polli:leading-snug polli:tracking-normal polli:normal-case polli:not-italic polli:text-xs polli:rounded-md polli:shadow-md polli:z-[130] polli:pointer-events-none polli:transition-opacity polli:whitespace-pre-line polli:break-words\";\n\n const popupNode = content ? (\n <span\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden={!showTooltip}\n style={{\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n maxWidth: tooltipPosition.maxWidth,\n transform: tooltipPosition.transform,\n }}\n className={`${\n showTooltip\n ? \"polli:visible polli:opacity-100\"\n : \"polli:invisible polli:opacity-0\"\n } ${popupClasses}`}\n >\n {content}\n </span>\n ) : null;\n const tooltipPopup =\n popupNode && typeof document !== \"undefined\"\n ? createPortal(\n popupNode,\n triggerRef.current?.closest('[role=\"dialog\"]') ??\n document.body,\n )\n : popupNode;\n const contentNode = (\n <>\n <span className={cursorClass}>{children}</span>\n {tooltipPopup}\n </>\n );\n\n const sharedProps = {\n \"aria-label\": ariaLabel,\n \"aria-describedby\": content && showTooltip ? tooltipId : undefined,\n className: triggerClassName,\n onMouseEnter: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onMouseLeave: () => {\n if (!tapPinnedRef.current) setShowTooltip(false);\n },\n onClick: (e: MouseEvent) => {\n if (stopClickPropagation) e.stopPropagation();\n if (onClick) {\n onClick();\n }\n if (!tapEnabled || !content) return;\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n },\n onFocus: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onBlur: closeTooltip,\n style,\n };\n\n if (triggerAs === \"span\") {\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (!tapEnabled || !content) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n };\n const spanInteractionProps = {\n ...sharedProps,\n role: tapEnabled && content ? \"button\" : undefined,\n tabIndex: tapEnabled && content ? 0 : undefined,\n onKeyDown: tapEnabled && content ? handleKeyDown : undefined,\n };\n\n return (\n <span\n ref={(node) => {\n triggerRef.current = node;\n }}\n {...spanInteractionProps}\n >\n {contentNode}\n </span>\n );\n }\n\n return (\n <button\n ref={(node) => {\n triggerRef.current = node;\n }}\n type=\"button\"\n aria-label={ariaLabel}\n aria-describedby={content && showTooltip ? tooltipId : undefined}\n className={triggerClassName}\n onMouseEnter={sharedProps.onMouseEnter}\n onMouseLeave={sharedProps.onMouseLeave}\n onClick={sharedProps.onClick}\n onFocus={sharedProps.onFocus}\n onBlur={sharedProps.onBlur}\n style={style}\n >\n {contentNode}\n </button>\n );\n};\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton } from \"./CopyButton.tsx\";\n\ntype CodeBlockOwnProps = {\n code: string;\n codeClassName?: string;\n language?: string;\n};\n\nexport type CodeBlockProps = CodeBlockOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof CodeBlockOwnProps | \"children\">;\n\nexport const CodeBlock: FC<CodeBlockProps> = ({\n code,\n codeClassName,\n language,\n className,\n ...rest\n}) => {\n const label = language || \"Code\";\n\n return (\n <div\n {...rest}\n className={cn(\n \"polli:min-w-0 polli:max-w-full polli:overflow-hidden polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale\",\n className,\n )}\n >\n <div className=\"polli:flex polli:min-h-9 polli:items-center polli:justify-between polli:gap-3 polli:bg-theme-bg-subtle polli:px-3 polli:py-1.5\">\n <span className=\"polli:truncate polli:font-mono polli:text-[11px] polli:font-medium polli:uppercase polli:tracking-wide polli:text-theme-text-muted\">\n {label}\n </span>\n <CopyButton\n value={code}\n tooltip={null}\n aria-label=\"Copy code\"\n className=\"polli:flex polli:items-center polli:gap-1.5 polli:rounded-md polli:px-2 polli:py-1 polli:text-xs polli:font-medium polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\"\n >\n {(copied) => (\n <>\n {copied ? (\n <CheckIcon className=\"polli:size-3.5\" />\n ) : (\n <ClipboardIcon className=\"polli:size-3.5\" />\n )}\n <span>{copied ? \"Copied\" : \"Copy\"}</span>\n </>\n )}\n </CopyButton>\n </div>\n <pre\n className={cn(\n \"polli:m-0 polli:min-w-0 polli:whitespace-pre-wrap polli:break-words polli:[overflow-wrap:anywhere] polli:[tab-size:4] polli:p-3 polli:font-mono polli:text-xs polli:leading-6 polli:text-theme-text-strong\",\n codeClassName,\n )}\n >\n <code>{code}</code>\n </pre>\n </div>\n );\n};\n","import Markdown, { type Components } from \"react-markdown\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"../lib/cn.ts\";\nimport { InlineLink } from \"../primitives/InlineLink.tsx\";\nimport { headingClassName } from \"../primitives/Typography.tsx\";\n\nexport type ProseProps = {\n children: string;\n className?: string;\n};\n\nconst components: Components = {\n h1: ({ node, ...props }) => (\n <h1\n className={headingClassName(\"title\", \"polli:mt-0 polli:mb-5\")}\n {...props}\n />\n ),\n h2: ({ node, ...props }) => (\n <h2\n className={headingClassName(\"section\", \"polli:mt-8 polli:mb-3\")}\n {...props}\n />\n ),\n h3: ({ node, ...props }) => (\n <h3\n className={headingClassName(\"subsection\", \"polli:mt-6 polli:mb-2\")}\n {...props}\n />\n ),\n p: ({ node, ...props }) => (\n <p className=\"polli:my-4 polli:leading-relaxed\" {...props} />\n ),\n a: ({ node, ...props }) => <InlineLink {...props} />,\n ul: ({ node, ...props }) => (\n <ul\n className=\"polli:my-4 polli:list-disc polli:pl-6 polli:leading-relaxed\"\n {...props}\n />\n ),\n ol: ({ node, ...props }) => (\n <ol\n className=\"polli:my-4 polli:list-decimal polli:pl-6 polli:leading-relaxed\"\n {...props}\n />\n ),\n blockquote: ({ node, ...props }) => (\n <blockquote\n className=\"polli:my-4 polli:border-l-4 polli:border-theme-border polli:pl-4 polli:text-theme-text-soft\"\n {...props}\n />\n ),\n code: ({ node, ...props }) => (\n <code\n className=\"polli:rounded polli:bg-theme-bg-active polli:px-1 polli:py-0.5 polli:font-pixel polli:text-sm\"\n {...props}\n />\n ),\n pre: ({ node, ...props }) => (\n <pre\n className=\"polli:my-4 polli:overflow-x-auto polli:rounded-lg polli:bg-theme-bg-active polli:p-4\"\n {...props}\n />\n ),\n table: ({ node, ...props }) => (\n <table\n className=\"polli:my-4 polli:w-full polli:border-collapse polli:text-sm\"\n {...props}\n />\n ),\n th: ({ node, ...props }) => (\n <th\n className=\"polli:border polli:border-theme-border polli:px-3 polli:py-2 polli:text-left polli:font-semibold\"\n {...props}\n />\n ),\n td: ({ node, ...props }) => (\n <td\n className=\"polli:border polli:border-theme-border polli:px-3 polli:py-2\"\n {...props}\n />\n ),\n hr: ({ node, ...props }) => (\n <hr className=\"polli:my-6 polli:border-theme-border\" {...props} />\n ),\n};\n\nexport function Prose({ children, className }: ProseProps) {\n return (\n <div\n className={cn(\n \"polli:font-body polli:text-theme-text-base polli:leading-relaxed\",\n className,\n )}\n >\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSlug]}\n components={components}\n >\n {children}\n </Markdown>\n </div>\n );\n}\n","import type {\n ComponentPropsWithoutRef,\n ElementType,\n PropsWithChildren,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype HeadingSize = \"display\" | \"title\" | \"section\" | \"subsection\" | \"card\";\n\ntype TextSize = \"body\" | \"sm\" | \"xs\" | \"micro\";\ntype TextTone = \"base\" | \"strong\" | \"soft\" | \"muted\";\ntype TextWeight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nconst headingSizeClasses: Record<HeadingSize, string> = {\n display: \"polli:font-heading polli:text-5xl polli:leading-none\",\n title: \"polli:font-heading polli:text-4xl polli:leading-none\",\n section: \"polli:font-subheading polli:text-2xl polli:leading-tight\",\n subsection: \"polli:font-subheading polli:text-xl polli:leading-tight\",\n card: \"polli:font-subheading polli:text-lg polli:leading-tight\",\n};\n\nconst textSizeClasses: Record<TextSize, string> = {\n body: \"polli:text-base polli:leading-relaxed\",\n sm: \"polli:text-sm polli:leading-6\",\n xs: \"polli:text-xs polli:leading-normal\",\n micro: \"polli:text-micro polli:leading-normal\",\n};\n\nconst textToneClasses: Record<TextTone, string> = {\n base: \"polli:text-theme-text-base\",\n strong: \"polli:text-theme-text-strong\",\n soft: \"polli:text-theme-text-soft\",\n muted: \"polli:text-theme-text-muted\",\n};\n\nconst textWeightClasses: Record<TextWeight, string> = {\n normal: \"polli:font-normal\",\n medium: \"polli:font-medium\",\n semibold: \"polli:font-semibold\",\n bold: \"polli:font-bold\",\n};\n\nexport function headingClassName(size: HeadingSize, className?: string) {\n return cn(\n \"polli:break-words polli:text-theme-text-strong\",\n headingSizeClasses[size],\n className,\n );\n}\n\nfunction textClassName({\n size,\n tone,\n weight,\n className,\n}: {\n size: TextSize;\n tone: TextTone;\n weight: TextWeight;\n className?: string;\n}) {\n return cn(\n \"polli:break-words polli:font-body\",\n textSizeClasses[size],\n textToneClasses[tone],\n textWeightClasses[weight],\n className,\n );\n}\n\ntype HeadingOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: HeadingSize;\n className?: string;\n}>;\n\nexport type HeadingProps<T extends ElementType = \"h2\"> = HeadingOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof HeadingOwnProps<T>>;\n\nexport function Heading<T extends ElementType = \"h2\">({\n as,\n size = \"section\",\n className,\n children,\n ...rest\n}: HeadingProps<T>) {\n const Component = as || \"h2\";\n return (\n <Component {...rest} className={headingClassName(size, className)}>\n {children}\n </Component>\n );\n}\n\ntype TextOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: TextSize;\n tone?: TextTone;\n weight?: TextWeight;\n className?: string;\n}>;\n\nexport type TextProps<T extends ElementType = \"p\"> = TextOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof TextOwnProps<T>>;\n\nexport function Text<T extends ElementType = \"p\">({\n as,\n size = \"body\",\n tone = \"base\",\n weight = \"normal\",\n className,\n children,\n ...rest\n}: TextProps<T>) {\n const Component = as || \"p\";\n return (\n <Component\n {...rest}\n className={textClassName({ size, tone, weight, className })}\n >\n {children}\n </Component>\n );\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","ReactMarkdown","remarkGfm","import_react_markdown","import_remark_gfm","import_jsx_runtime","import_jsx_runtime","components","Markdown","remarkGfm","rehypeSlug"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type MarkdownProps = {
|
|
4
|
+
children: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
/** Compact markdown for cards and snippets. Use Prose for document-style content. */
|
|
8
|
+
declare function Markdown({ children, className }: MarkdownProps): react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
type ProseProps = {
|
|
11
|
+
children: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
declare function Prose({ children, className }: ProseProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { Markdown, type MarkdownProps, Prose, type ProseProps };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
type MarkdownProps = {
|
|
4
|
+
children: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
/** Compact markdown for cards and snippets. Use Prose for document-style content. */
|
|
8
|
+
declare function Markdown({ children, className }: MarkdownProps): react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
type ProseProps = {
|
|
11
|
+
children: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
declare function Prose({ children, className }: ProseProps): react_jsx_runtime.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { Markdown, type MarkdownProps, Prose, type ProseProps };
|