diff --git a/apps/web/bun.lock b/apps/web/bun.lock index 9114f9f..106fc0e 100644 --- a/apps/web/bun.lock +++ b/apps/web/bun.lock @@ -7,8 +7,15 @@ "dependencies": { "@hraness/design-kit": "github:hraness/design-kit#v0.2.1", "@hraness/site-footer": "github:hraness/site-footer#v0.3.1", + "@hraness/ui": "github:hraness/ui#v0.4.10", "@resvg/resvg-js": "2.6.2", "posthog-js": "1.413.2", + "react": "19.2.3", + "react-dom": "19.2.3", + }, + "devDependencies": { + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", }, }, }, @@ -17,8 +24,12 @@ "@hraness/site-footer": ["@hraness/site-footer@github:hraness/site-footer#3c7bf22", { "peerDependencies": { "react": ">=18 <20" }, "optionalPeers": ["react"] }, "hraness-site-footer-3c7bf22", "sha512-/dCF0Oo+Glmj1VGXwi8R/4fSWYXZE83PLbCo2XbCQK9e4/uFN5Xhir3L07CYWsQGbPEP0iv1EbqXI4kD0ZYOsw=="], + "@hraness/ui": ["@hraness/ui@github:hraness/ui#2d1a5e1", { "dependencies": { "@hugeicons/core-free-icons": "^4.2.2", "@hugeicons/react": "^1.1.9", "@stylexjs/stylex": "0.19.0", "clsx": "^2.1.1", "react-aria": "3.50.0", "react-aria-components": "1.19.0", "tailwind-merge": "^3.6.0" }, "peerDependencies": { "react": ">=18 <20", "react-dom": ">=18 <20" } }, "hraness-ui-2d1a5e1", "sha512-nWNEPPPYJNz6Uq11f9Y8D8XQKhdulgLw8mdCmNB4Zc8rbnwQurqJcQcr+h9Q3ZTtJwp7ifRFtVMWfy5BRuRUTA=="], + "@hugeicons/core-free-icons": ["@hugeicons/core-free-icons@4.3.0", "", {}, "sha512-5DC5gq2psNDKBQThOjpuFCtMco8nl2FkrBzZgG15cFGM0kSwUoych/pw0DmjBygF9qRDITdBPtmzJqLsOeImMg=="], + "@hugeicons/react": ["@hugeicons/react@1.1.10", "", { "peerDependencies": { "react": ">=16.0.0" } }, "sha512-9tAsd92yMVVGP+E+d8cM+wc0VnXuYZHNbWQi7TOe8k2neawmhiaFmVFbzyruejhOMa197/LbgvSED32ayUo3ZA=="], + "@internationalized/date": ["@internationalized/date@3.12.3", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q=="], "@internationalized/number": ["@internationalized/number@3.6.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg=="], @@ -27,9 +38,9 @@ "@posthog/browser-common": ["@posthog/browser-common@0.4.0", "", { "dependencies": { "@posthog/core": "^1.46.8", "@posthog/types": "^1.402.0" } }, "sha512-W9DCGVks15docUMPvJ2nd8NS16Gn74bsGWuaeg31beEKFSjdW8wvnQ1ETY6WSql5pYxZb3GdJmEUZVVstKSrBQ=="], - "@posthog/core": ["@posthog/core@1.48.5", "", { "dependencies": { "@posthog/types": "^1.405.0" } }, "sha512-ZE27PmVyPmw9wZOVVyn64uaTdqhopuwQfX7PzBpyCvsezuvNmrUHAMpJKkqOvaHxu7HeJt1jTQtjtTuwy+S7Og=="], + "@posthog/core": ["@posthog/core@1.49.2", "", { "dependencies": { "@posthog/types": "^1.407.1" } }, "sha512-AXHDo/4nisUg7OPG1TQNgREK7n+chBQXLQyttp7bDTDsDg2k9lV06TmnpvuNbwJs53q9mP9hjezKEZu4fYadfg=="], - "@posthog/types": ["@posthog/types@1.405.0", "", {}, "sha512-4rZ/taVXKQxs9Jrf7ZjlCRgrOSL69oKAgIWJQa5kRNJ6wll1UANbrJTSY+Su1e88LIG4zZVjKKKjyQHCkHdHcw=="], + "@posthog/types": ["@posthog/types@1.407.1", "", {}, "sha512-WhbkXPC2rgylXqmxHqv70ffI3k+KxyR6s7DBIfr5NvIqHkxp6v0pk31D/jbz0DNVbzwkLjyll2pxr4FNbJiYzg=="], "@react-types/shared": ["@react-types/shared@3.36.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag=="], @@ -81,12 +92,16 @@ "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], - "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + "@types/d3-shape": ["@types/d3-shape@3.2.0", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw=="], "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], @@ -101,6 +116,8 @@ "css-mediaquery": ["css-mediaquery@0.1.2", "", {}, "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], @@ -127,7 +144,7 @@ "dompurify": ["dompurify@3.4.14", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg=="], - "es-toolkit": ["es-toolkit@1.51.0", "", {}, "sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw=="], + "es-toolkit": ["es-toolkit@1.52.0", "", {}, "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA=="], "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], @@ -159,13 +176,13 @@ "query-selector-shadow-dom": ["query-selector-shadow-dom@1.0.1", "", {}, "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw=="], - "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], "react-aria": ["react-aria@3.50.0", "", { "dependencies": { "@internationalized/date": "^3.12.2", "@internationalized/number": "^3.6.7", "@internationalized/string": "^3.2.9", "@react-types/shared": "^3.36.0", "@swc/helpers": "^0.5.0", "aria-hidden": "^1.2.3", "clsx": "^2.0.0", "react-stately": "3.48.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-S0Os6QZk33fzUAKu1QLT9afoUaCBt1ZNdoiq0n2YMVgKIdNIQS8zxiZ8O9hYE6QyDkHKjD6q39LQZ+qaSAIgjw=="], "react-aria-components": ["react-aria-components@1.19.0", "", { "dependencies": { "@internationalized/date": "^3.12.2", "@react-types/shared": "^3.36.0", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", "react-aria": "3.50.0", "react-stately": "3.48.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2smSS5nqJ8cGYMQezuUXveZm7eMyHCqTN6mDpylQBYLYbdF5dxCCuW1DHn1VKLe1DybSfPvX/cZtJlDmvFfn8A=="], - "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], + "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="], "react-is": ["react-is@19.2.8", "", {}, "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ=="], @@ -187,6 +204,8 @@ "sugar-high": ["sugar-high@1.3.0", "", {}, "sha512-/harylV2L7swuV8319SXHiXj8yJOCGNcVcKJXk9WpWNXoHfqD9uAZ1KAUDGcZXSNNeGMT0rnDYAwEk6zXte1sw=="], + "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], diff --git a/apps/web/package.json b/apps/web/package.json index 4629d9a..1d70aa8 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,8 +8,15 @@ "dependencies": { "@hraness/design-kit": "github:hraness/design-kit#v0.2.1", "@hraness/site-footer": "github:hraness/site-footer#v0.3.1", + "@hraness/ui": "github:hraness/ui#v0.4.10", "@resvg/resvg-js": "2.6.2", - "posthog-js": "1.413.2" + "posthog-js": "1.413.2", + "react": "19.2.3", + "react-dom": "19.2.3" + }, + "devDependencies": { + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3" }, "scripts": { "build": "bun run ./scripts/build.ts", diff --git a/apps/web/scripts/build.ts b/apps/web/scripts/build.ts index e427792..dbc2eb2 100644 --- a/apps/web/scripts/build.ts +++ b/apps/web/scripts/build.ts @@ -4,6 +4,9 @@ import { basename, dirname, join } from "node:path" import { fileURLToPath } from "node:url" import { renderHranessSiteFooter } from "@hraness/site-footer" +import { AskAiAboutThis } from "@hraness/ui" +import { createElement } from "react" +import { renderToStaticMarkup } from "react-dom/server" import { renderAtetSocialImage } from "./generate-og" import { @@ -21,6 +24,7 @@ const appDirectory = dirname(dirname(fileURLToPath(import.meta.url))) const sourceDirectory = join(appDirectory, "src") const defaultOutputDirectory = join(appDirectory, "dist") const posthogIngestOrigin = "https://us.i.posthog.com" +const siteOrigin = "https://atet.sh" const posthogPackageDirectory = dirname(fileURLToPath(import.meta.resolve("posthog-js/package.json"))) const appearanceMenuStylesPath = fileURLToPath( import.meta.resolve("@hraness/design-kit/appearance-menu.css"), @@ -101,6 +105,13 @@ function renderAppearanceMenu(): string { ` } +export function renderAskAiAboutThis(canonicalUrl: string): string { + return renderToStaticMarkup(createElement(AskAiAboutThis, { + className: "atet-ask-ai", + url: canonicalUrl, + })) +} + type CopyCommandOptions = Readonly<{ alternateCommand: string command: string @@ -258,10 +269,14 @@ export async function buildWebsite(options: BuildOptions = {}): Promise ({ + ...commonAssets, + "{{ASK_AI_ABOUT_THIS}}": renderAskAiAboutThis(`${siteOrigin}${canonicalPath}`), + }) as const const analytics = analyticsConfig === null ? null : await bundleAnalytics(analyticsConfig) const analyticsPath = analytics === null ? null : assetPath("analytics.js", analytics) const indexAssets = { - ...commonAssets, + ...publicPageAssets("/"), "{{ANALYTICS_SCRIPT}}": analyticsPath === null ? "" : ``, @@ -292,19 +307,25 @@ export async function buildWebsite(options: BuildOptions = {}): Promise { } describe("static Atet site", () => { + test("renders one crawlable Ask AI row on each public page with exact provider prompts", async () => { + const subjectUrl = "https://atet.sh/reading/feynobg" + const prompt = `Tell me about ${subjectUrl}` + const row = renderAskAiAboutThis(subjectUrl) + const providers = [ + ["chatgpt", "https://chatgpt.com/", "q"], + ["claude", "https://claude.ai/new", "q"], + ["perplexity", "https://perplexity.ai/", "q"], + ["grok", "https://x.com/i/grok", "text"], + ] as const + + expect(row.match(/ { const readme = await readFile(join(repositoryDirectory, "README.md"), "utf8") const searchableReadme = readme @@ -527,7 +569,10 @@ describe("static Atet site", () => { const build = await readFile(join(appDirectory, "scripts/build.ts"), "utf8") const manifest = JSON.parse( await readFile(join(appDirectory, "package.json"), "utf8"), - ) as { dependencies?: Record; devDependencies?: unknown } + ) as { + dependencies?: Record + devDependencies?: Record + } const rootManifest = JSON.parse( await readFile(join(repositoryDirectory, "package.json"), "utf8"), ) as { workspaces?: { catalog?: Record } } @@ -536,21 +581,28 @@ describe("static Atet site", () => { expect(manifest.dependencies).toEqual({ "@hraness/design-kit": "github:hraness/design-kit#v0.2.1", "@hraness/site-footer": "github:hraness/site-footer#v0.3.1", + "@hraness/ui": "github:hraness/ui#v0.4.10", "@resvg/resvg-js": "2.6.2", "posthog-js": "1.413.2", + "react": "19.2.3", + "react-dom": "19.2.3", + }) + expect(manifest.devDependencies).toEqual({ + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", }) - expect(manifest.devDependencies).toBeUndefined() expect(rootManifest.workspaces?.catalog?.["posthog-js"]).toBeUndefined() expect(rootManifest.workspaces?.catalog?.["@hraness/design-kit"]).toBeUndefined() expect(localLockfile).toContain('"@hraness/design-kit": "github:hraness/design-kit#v0.2.1"') expect(localLockfile).toContain( '"@hraness/site-footer": "github:hraness/site-footer#v0.3.1"', ) + expect(localLockfile).toContain('"@hraness/ui": "github:hraness/ui#v0.4.10"') expect(localLockfile).toContain('"@resvg/resvg-js": "2.6.2"') expect(localLockfile).toContain('"posthog-js": "1.413.2"') expect(localLockfile).not.toContain("catalog:") expect(new TextEncoder().encode(html).byteLength).toBeLessThan(20_000) - expect(new TextEncoder().encode(css).byteLength).toBeLessThan(28_000) + expect(new TextEncoder().encode(css).byteLength).toBeLessThan(30_000) expect(new TextEncoder().encode(theme).byteLength).toBeLessThan(3_000) expect(new TextEncoder().encode(copyCommand).byteLength).toBeLessThan(4_000) expect(html).not.toMatch(/https:\/\/[^"']+\.(?:css|js)/) diff --git a/apps/web/src/index.html b/apps/web/src/index.html index a38cd74..900a8b3 100644 --- a/apps/web/src/index.html +++ b/apps/web/src/index.html @@ -320,6 +320,7 @@

The name Atet

+ {{ASK_AI_ABOUT_THIS}} {{HRANESS_SITE_FOOTER}} diff --git a/apps/web/src/reading/draw-faces-with-javascript.html b/apps/web/src/reading/draw-faces-with-javascript.html index 8844d28..368f13d 100644 --- a/apps/web/src/reading/draw-faces-with-javascript.html +++ b/apps/web/src/reading/draw-faces-with-javascript.html @@ -172,6 +172,7 @@

Related pages

+ {{ASK_AI_ABOUT_THIS}} {{HRANESS_SITE_FOOTER}} diff --git a/apps/web/src/reading/feynobg.html b/apps/web/src/reading/feynobg.html index b765e8d..56b579f 100644 --- a/apps/web/src/reading/feynobg.html +++ b/apps/web/src/reading/feynobg.html @@ -192,6 +192,7 @@

Related pages

+ {{ASK_AI_ABOUT_THIS}} {{HRANESS_SITE_FOOTER}} diff --git a/apps/web/src/reading/gemini-omni.html b/apps/web/src/reading/gemini-omni.html index facc4f4..e12a15b 100644 --- a/apps/web/src/reading/gemini-omni.html +++ b/apps/web/src/reading/gemini-omni.html @@ -189,6 +189,7 @@

Related pages

+ {{ASK_AI_ABOUT_THIS}} {{HRANESS_SITE_FOOTER}} diff --git a/apps/web/src/reading/painting-with-gaussians.html b/apps/web/src/reading/painting-with-gaussians.html index 1ab85ae..0e4c018 100644 --- a/apps/web/src/reading/painting-with-gaussians.html +++ b/apps/web/src/reading/painting-with-gaussians.html @@ -198,6 +198,7 @@

Related pages

+ {{ASK_AI_ABOUT_THIS}} {{HRANESS_SITE_FOOTER}} diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index db63c34..ef28751 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -1534,3 +1534,68 @@ blockquote { break-inside: avoid; } } +/* Server-rendered public discovery links from @hraness/ui. */ +.atet-ask-ai { + display: flex; + width: min(calc(100% - 2rem), 72rem); + align-items: center; + margin: 2.5rem auto 0; + padding: 1.25rem 0; + border-top: 1px solid var(--line); + color: var(--muted); + flex-wrap: wrap; + gap: 0.5rem; +} + +.atet-ask-ai [data-slot="ask-ai-about-this-label"] { + font-family: var(--font-mono); + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.atet-ask-ai [data-slot="ask-ai-about-this-links"] { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; +} + +.atet-ask-ai [data-slot="ask-ai-about-this-link"] { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 1.875rem; + padding: 0 0.625rem; + border: 1px solid var(--line); + border-radius: var(--radius-control); + color: inherit; + gap: 0.25rem; + font-family: var(--font-mono); + font-size: 0.72rem; + font-weight: 700; + line-height: 1; + text-decoration: none; +} + +.atet-ask-ai [data-slot="ask-ai-about-this-link"]:hover { + border-color: currentColor; + color: var(--ink); +} + +.atet-ask-ai [data-slot="ask-ai-about-this-link"]:focus-visible { + outline: 2px solid currentColor; + outline-offset: 2px; +} + +.atet-ask-ai [data-slot="ask-ai-about-this-icon"] { + display: block; + flex: 0 0 auto; +} + +@media (pointer: coarse) { + .atet-ask-ai [data-slot="ask-ai-about-this-link"] { + min-height: 3rem; + } +} diff --git a/bun.lock b/bun.lock index 327e741..bd96fe5 100644 --- a/bun.lock +++ b/bun.lock @@ -51,8 +51,15 @@ "dependencies": { "@hraness/design-kit": "github:hraness/design-kit#v0.2.1", "@hraness/site-footer": "github:hraness/site-footer#v0.3.1", + "@hraness/ui": "github:hraness/ui#v0.4.10", "@resvg/resvg-js": "2.6.2", "posthog-js": "1.413.2", + "react": "19.2.3", + "react-dom": "19.2.3", + }, + "devDependencies": { + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", }, }, "packages/scene": { @@ -137,8 +144,12 @@ "@hraness/site-footer": ["@hraness/site-footer@github:hraness/site-footer#3c7bf22", { "peerDependencies": { "react": ">=18 <20" }, "optionalPeers": ["react"] }, "hraness-site-footer-3c7bf22", "sha512-/dCF0Oo+Glmj1VGXwi8R/4fSWYXZE83PLbCo2XbCQK9e4/uFN5Xhir3L07CYWsQGbPEP0iv1EbqXI4kD0ZYOsw=="], + "@hraness/ui": ["@hraness/ui@github:hraness/ui#2d1a5e1", { "dependencies": { "@hugeicons/core-free-icons": "^4.2.2", "@hugeicons/react": "^1.1.9", "@stylexjs/stylex": "0.19.0", "clsx": "^2.1.1", "react-aria": "3.50.0", "react-aria-components": "1.19.0", "tailwind-merge": "^3.6.0" }, "peerDependencies": { "react": ">=18 <20", "react-dom": ">=18 <20" } }, "hraness-ui-2d1a5e1", "sha512-nWNEPPPYJNz6Uq11f9Y8D8XQKhdulgLw8mdCmNB4Zc8rbnwQurqJcQcr+h9Q3ZTtJwp7ifRFtVMWfy5BRuRUTA=="], + "@hugeicons/core-free-icons": ["@hugeicons/core-free-icons@4.3.0", "", {}, "sha512-5DC5gq2psNDKBQThOjpuFCtMco8nl2FkrBzZgG15cFGM0kSwUoych/pw0DmjBygF9qRDITdBPtmzJqLsOeImMg=="], + "@hugeicons/react": ["@hugeicons/react@1.1.10", "", { "peerDependencies": { "react": ">=16.0.0" } }, "sha512-9tAsd92yMVVGP+E+d8cM+wc0VnXuYZHNbWQi7TOe8k2neawmhiaFmVFbzyruejhOMa197/LbgvSED32ayUo3ZA=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], @@ -929,6 +940,8 @@ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], + "three": ["three@0.183.2", "", {}, "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ=="], "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], @@ -983,6 +996,10 @@ "@eslint/eslintrc/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + "@hraness/atet-web/@hraness/design-kit": ["@hraness/design-kit@github:hraness/design-kit#151c726", { "dependencies": { "@hugeicons/core-free-icons": "^4.2.2", "@stylexjs/stylex": "0.19.0", "motion": "12.42.0", "next-themes": "0.4.6", "react-aria-components": "1.19.0", "recharts": "3.8.0", "sugar-high": "^1.2.1", "web-haptics": "0.0.6" }, "peerDependencies": { "@hraness/ui": ">=0.4.7 <0.5.0", "react": ">=18 <20", "react-dom": ">=18 <20" }, "optionalPeers": ["@hraness/ui"] }, "hraness-design-kit-151c726", "sha512-JSBx+9Usxrlh6RzEVw/ENwOj4jZ5vHZTQfkAwkeCLUTurclcB0La559llRA1DXFlchwBhy8MEZiZDu45RPu/ZA=="], + + "@hraness/atet-web/@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + "@reduxjs/toolkit/immer": ["immer@11.1.18", "", {}, "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ=="], "@tldraw/editor/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],