From 968a6c37246aa0ae7341dc7596f46abe79e67b4c Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Mon, 26 Oct 2026 13:44:27 -0700 Subject: [PATCH] Remove components that no other project uses flakehub and docs.determinate.systems are the only consumers of this package, and between them they import BusyIcon, CodeInline, ColorProvider, ColorSchemeToggle, CopyButton, LabeledRadioInput, LabeledTextInput, and PageLayout. This keeps those and everything they depend on, and removes the rest: Button, CodeBlock, CodeFile, DownloadButton, GitHubButton, Highlight, InstallCTA, Link, MacInstaller, and the useHighlight and useObjectURL hooks. The Shiki packages and @radix-ui/react-icons were only used by those, so they're gone too. Co-Authored-By: Claude Opus 5.5 (1M context) --- package-lock.json | 503 +----------------- package.json | 14 +- src/Button/Button.stories.tsx | 267 ---------- src/Button/index.scss | 51 -- src/Button/index.tsx | 78 --- src/CodeBlock/CodeBlock.stories.tsx | 57 -- src/CodeBlock/index.scss | 8 - src/CodeBlock/index.tsx | 33 -- src/CodeFile/CodeFile.stories.tsx | 75 --- src/CodeFile/index.scss | 12 - src/CodeFile/index.tsx | 56 -- src/DownloadButton/DownloadButton.stories.tsx | 22 - src/DownloadButton/index.scss | 5 - src/DownloadButton/index.tsx | 35 -- src/GitHubButton/GithubButton.stories.tsx | 22 - src/GitHubButton/index.scss | 5 - src/GitHubButton/index.tsx | 30 -- src/Highlight/Highlight.stories.tsx | 88 --- src/Highlight/index.scss | 32 -- src/Highlight/index.tsx | 44 -- src/InstallCTA/InstallCTA.stories.tsx | 36 -- src/InstallCTA/InstallFromCurl.tsx | 19 - src/InstallCTA/NavTab.tsx | 33 -- src/InstallCTA/TabSelector.tsx | 43 -- src/InstallCTA/index.scss | 47 -- src/InstallCTA/index.tsx | 78 --- src/InstallCTA/types.ts | 28 - src/Link/Link.stories.ts | 31 -- src/Link/index.scss | 17 - src/Link/index.tsx | 37 -- src/MacInstaller/MacInstaller.stories.tsx | 16 - src/MacInstaller/index.scss | 38 -- src/MacInstaller/index.tsx | 24 - src/MacInstaller/macPackageData.ts | 1 - src/hooks/useHighlight.ts | 55 -- src/hooks/useObjectURL.ts | 24 - src/index.ts | 34 -- 37 files changed, 5 insertions(+), 1993 deletions(-) delete mode 100644 src/Button/Button.stories.tsx delete mode 100644 src/Button/index.scss delete mode 100644 src/Button/index.tsx delete mode 100644 src/CodeBlock/CodeBlock.stories.tsx delete mode 100644 src/CodeBlock/index.scss delete mode 100644 src/CodeBlock/index.tsx delete mode 100644 src/CodeFile/CodeFile.stories.tsx delete mode 100644 src/CodeFile/index.scss delete mode 100644 src/CodeFile/index.tsx delete mode 100644 src/DownloadButton/DownloadButton.stories.tsx delete mode 100644 src/DownloadButton/index.scss delete mode 100644 src/DownloadButton/index.tsx delete mode 100644 src/GitHubButton/GithubButton.stories.tsx delete mode 100644 src/GitHubButton/index.scss delete mode 100644 src/GitHubButton/index.tsx delete mode 100644 src/Highlight/Highlight.stories.tsx delete mode 100644 src/Highlight/index.scss delete mode 100644 src/Highlight/index.tsx delete mode 100644 src/InstallCTA/InstallCTA.stories.tsx delete mode 100644 src/InstallCTA/InstallFromCurl.tsx delete mode 100644 src/InstallCTA/NavTab.tsx delete mode 100644 src/InstallCTA/TabSelector.tsx delete mode 100644 src/InstallCTA/index.scss delete mode 100644 src/InstallCTA/index.tsx delete mode 100644 src/InstallCTA/types.ts delete mode 100644 src/Link/Link.stories.ts delete mode 100644 src/Link/index.scss delete mode 100644 src/Link/index.tsx delete mode 100644 src/MacInstaller/MacInstaller.stories.tsx delete mode 100644 src/MacInstaller/index.scss delete mode 100644 src/MacInstaller/index.tsx delete mode 100644 src/MacInstaller/macPackageData.ts delete mode 100644 src/hooks/useHighlight.ts delete mode 100644 src/hooks/useObjectURL.ts diff --git a/package-lock.json b/package-lock.json index d063ac1..0b55aac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,6 @@ "license": "MIT", "dependencies": { "@heroicons/react": "^2.2.0", - "@radix-ui/react-icons": "^1.0.3", - "@shikijs/core": "^3.5.0", - "@shikijs/engine-javascript": "^3.5.0", - "@shikijs/langs": "^3.5.0", - "@shikijs/themes": "^3.5.0", - "@shikijs/types": "^3.5.0", "clsx": "^2.1.1", "react-icons": "^5.5.0" }, @@ -1955,15 +1949,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", - "license": "MIT", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" - } - }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", @@ -2721,63 +2706,6 @@ "win32" ] }, - "node_modules/@shikijs/core": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", - "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", - "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - } - }, - "node_modules/@shikijs/langs": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", - "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", - "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "3.23.0" - } - }, - "node_modules/@shikijs/types": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", - "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -3247,24 +3175,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", @@ -3289,18 +3199,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, "node_modules/@vitest/browser": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.10.tgz", @@ -3866,16 +3764,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chai": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", @@ -3893,26 +3781,6 @@ "node": ">=18" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/check-error": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", @@ -3972,16 +3840,6 @@ "node": ">=6" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4095,6 +3953,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4110,19 +3969,6 @@ "node": ">=8" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4355,42 +4201,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4398,16 +4208,6 @@ "dev": true, "license": "MIT" }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/immutable": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", @@ -4945,116 +4745,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -5166,23 +4856,6 @@ ], "license": "MIT" }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, "node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -5435,16 +5108,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -5574,30 +5237,6 @@ "node": ">=8" } }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -5835,16 +5474,6 @@ "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5906,20 +5535,6 @@ } } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6040,16 +5655,6 @@ "node": ">=6" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -6096,74 +5701,6 @@ "node": ">=14.17" } }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unplugin": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", @@ -6221,34 +5758,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { "version": "8.0.16", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", @@ -6576,16 +6085,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/package.json b/package.json index 6351c68..ca94143 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,11 @@ "@storybook/addon-vitest": "^10.2.0", "@storybook/react-vite": "^10.4.6", "@types/react": "^19.1.4", + "@vitest/browser": "^4.1.10", + "@vitest/coverage-v8": "^4.1.8", "chromatic": "^12.2.0", "esbuild": "^0.28.1", + "playwright": "^1.56.1", "prettier": "^3.5.3", "rollup": "^4.41.0", "rollup-plugin-sass": "^1.15.2", @@ -44,22 +47,13 @@ "sass": "^1.89.0", "storybook": "^10.4.6", "typescript": "^5.8.3", - "vitest": "^4.1.8", - "@vitest/browser": "^4.1.10", - "playwright": "^1.56.1", - "@vitest/coverage-v8": "^4.1.8" + "vitest": "^4.1.8" }, "peerDependencies": { "react": "^19.1.0" }, "dependencies": { "@heroicons/react": "^2.2.0", - "@radix-ui/react-icons": "^1.0.3", - "@shikijs/core": "^3.5.0", - "@shikijs/engine-javascript": "^3.5.0", - "@shikijs/langs": "^3.5.0", - "@shikijs/themes": "^3.5.0", - "@shikijs/types": "^3.5.0", "clsx": "^2.1.1", "react-icons": "^5.5.0" } diff --git a/src/Button/Button.stories.tsx b/src/Button/Button.stories.tsx deleted file mode 100644 index 17793b6..0000000 --- a/src/Button/Button.stories.tsx +++ /dev/null @@ -1,267 +0,0 @@ -import { action } from "storybook/actions"; -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import Button, { buttonColors, buttonSizes } from "./"; -import type { FC, PropsWithChildren } from "react"; - -const meta = { - title: "Atoms/Button", - component: Button, - argTypes: { - id: { - description: "An optional HTML identifier for the button", - control: "text", - }, - color: { - description: "The button's color scheme", - control: "select", - options: [...buttonColors], - }, - size: { - description: "The button's size", - control: "select", - options: [...buttonSizes], - }, - outlined: { - description: "Whether the button is outlined", - control: "boolean", - }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -// Make clicks visible in the inspector -const onClick = action("click"); - -const Wrapper: FC = ({ children }) => ( -
- {children} -
-); - -export const All = () => ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export const BasePrimary: Story = { - args: { - children: "Base primary", - size: "base", - color: "primary", - onClick, - }, -}; - -export const BaseSecondary: Story = { - args: { - children: "Base secondary", - size: "base", - color: "secondary", - onClick, - }, -}; - -export const Success: Story = { - args: { - children: "Success", - size: "base", - color: "success", - onClick, - }, -}; - -export const Info: Story = { - args: { - children: "Info", - size: "base", - color: "info", - onClick, - }, -}; - -export const Warning: Story = { - args: { - children: "Warning", - size: "base", - color: "warning", - onClick, - }, -}; - -export const Danger: Story = { - args: { - children: "Danger", - size: "base", - color: "danger", - onClick, - }, -}; - -export const PrimaryBaseOutlined: Story = { - args: { - children: "Primary outlined", - size: "base", - color: "primary", - outlined: true, - onClick, - }, -}; - -export const SecondarySmallOutlined: Story = { - args: { - children: "Secondary small outlined", - size: "sm", - color: "secondary", - outlined: true, - onClick, - }, -}; - -export const SmallSecondary: Story = { - args: { - children: "Small secondary", - size: "sm", - color: "secondary", - onClick, - }, -}; - -export const LargePrimary: Story = { - args: { - children: "Large primary", - size: "lg", - color: "primary", - onClick, - }, -}; diff --git a/src/Button/index.scss b/src/Button/index.scss deleted file mode 100644 index 1c49e77..0000000 --- a/src/Button/index.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use "sass:map"; - -@use "../sass/functions"; -@use "../sass/mixins"; -@use "../sass/tokens"; - -.button { - align-self: self-start; // Prevents the button from occupying all available space inside a div - display: inline-flex; - flex-direction: row; - - margin: 0; - border: 0; - border-radius: 0.5rem; - - font-family: map.get(tokens.$fonts, sans); - - @include mixins.transition(background-color, short); - - @each $size in tokens.$sizes { - &.button--#{$size} { - @include mixins.pad($size); - font-size: map.get(tokens.$font-size, $size); - border-radius: map.get(tokens.$border-radius, $size); - } - } - - @each $name, $color in tokens.$colors { - &.button--#{$name} { - &:not(.button--outlined) { - background-color: $color; - color: map.get(tokens.$brand, white); - - &:hover { - background-color: functions.darken($color, 15%); - } - } - - &.button--outlined { - border: 2px solid $color; - background-color: map.get(tokens.$brand, white); - color: $color; - - &:hover { - background-color: $color; - color: map.get(tokens.$brand, white); - } - } - } - } -} diff --git a/src/Button/index.tsx b/src/Button/index.tsx deleted file mode 100644 index 36c0a3e..0000000 --- a/src/Button/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import type { FC, PropsWithChildren } from "react"; - -import "./index.scss"; -import clsx from "clsx"; - -export const buttonSizes = ["sm", "base", "lg"] as const; -export type ButtonSize = (typeof buttonSizes)[number]; - -export const buttonColors = [ - "primary", - "secondary", - "success", - "info", - "warning", - "danger", -] as const; -export type ButtonColor = (typeof buttonColors)[number]; - -export interface ButtonProps { - /** - * An optional HTML identifier for the button. - */ - id?: string; - - /** - * The button's size. - */ - size?: ButtonSize; - - /** - * The button's color scheme. - */ - color?: ButtonColor; - - /** - * Whether the button is outlined. - */ - outlined?: boolean; - - /** - * Handler to fire when the button is clicked. - */ - onClick: (event: React.MouseEvent) => void; -} - -/** - * A ` -); - -export default Button; diff --git a/src/CodeBlock/CodeBlock.stories.tsx b/src/CodeBlock/CodeBlock.stories.tsx deleted file mode 100644 index d7ffe5b..0000000 --- a/src/CodeBlock/CodeBlock.stories.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import CodeBlock from "./"; -import { highlightLanguages } from "../hooks/useHighlight"; - -const meta = { - title: "Molecules/CodeBlock", - component: CodeBlock, - argTypes: { - language: { - control: "select", - options: [...highlightLanguages], - }, - code: { control: "text" }, - allowCopy: { control: "boolean" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const InstallDeterminate: Story = { - args: { - language: "shell", - code: "curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate", - title: "Install Determinate", - allowCopy: true, - }, -}; - -export const UseActions: Story = { - args: { - language: "yaml", - code: `on: - pull_request: - workflow_dispatch: - push: - branches: - - main - -jobs: - nix-ci: - runs-on: ubuntu-latest - # Include this block to log in to FlakeHub and access private flakes - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/determinate-nix-action@v3 - - uses: DeterminateSystems/flakehub-cache-action@main - - uses: DeterminateSystems/nix-flake-checker-action@main - - run: nix flake check`, - title: "Use in GitHub Actions", - allowCopy: true, - }, -}; diff --git a/src/CodeBlock/index.scss b/src/CodeBlock/index.scss deleted file mode 100644 index 3a49997..0000000 --- a/src/CodeBlock/index.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "sass:map"; - -@use "../sass/mixins"; -@use "../sass/tokens"; - -.code-block__heading { - @include mixins.pad-bottom(lg); -} diff --git a/src/CodeBlock/index.tsx b/src/CodeBlock/index.tsx deleted file mode 100644 index 5cd7635..0000000 --- a/src/CodeBlock/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { FC } from "react"; - -import type { HighlightLanguage } from "../hooks/useHighlight"; -import Highlight from "../Highlight"; -import CopyButton from "../CopyButton"; - -import "./index.scss"; - -export interface CodeBlockProps { - language: HighlightLanguage; - code: string; - title: string; - allowCopy?: boolean; -} - -/** - * A `` represents a highlighted chunk of code. It is the most generic representation of code - */ -const CodeBlock: FC = ({ - language, - code, - title, - allowCopy = true, -}) => ( -
-
- {title} {allowCopy && } -
- -
-); - -export default CodeBlock; diff --git a/src/CodeFile/CodeFile.stories.tsx b/src/CodeFile/CodeFile.stories.tsx deleted file mode 100644 index a788384..0000000 --- a/src/CodeFile/CodeFile.stories.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import CodeFile from "./"; -import { highlightLanguages } from "../hooks/useHighlight"; - -const meta = { - title: "Molecules/CodeFile", - component: CodeFile, - argTypes: { - language: { - control: "select", - options: [...highlightLanguages], - }, - code: { control: "text" }, - filename: { control: "text" }, - allowCopy: { control: "boolean" }, - allowDownload: { control: "boolean" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const GithubCI: Story = { - args: { - language: "yaml", - code: `on: - pull_request: - workflow_dispatch: - push: - branches: - - main - -jobs: - nix-ci: - runs-on: ubuntu-latest - # Include this block to log in to FlakeHub and access private flakes - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/determinate-nix-action@v3 - - uses: DeterminateSystems/flakehub-cache-action@main - - uses: DeterminateSystems/nix-flake-checker-action@main - - run: nix flake check`, - filename: ".github/workflows/nix-ci.yaml", - download: "github-nix-ci.yaml", - allowCopy: true, - allowDownload: true, - }, -}; - -export const AWS: Story = { - args: { - language: "terraform", - code: `data "aws_ami" "detsys_nixos" { - owners = ["535002876703"] - most_recent = true - - filter { - name = "name" - values = ["determinate/nixos/epoch-1/*"] - } - - filter { - name = "architecture" - values = ["x86_64"] # or "ARM64" for Graviton - } -}`, - filename: "aws_ami.tf", - allowCopy: true, - allowDownload: true, - }, -}; diff --git a/src/CodeFile/index.scss b/src/CodeFile/index.scss deleted file mode 100644 index 26a9387..0000000 --- a/src/CodeFile/index.scss +++ /dev/null @@ -1,12 +0,0 @@ -@use "sass:map"; - -@use "../sass/tokens"; -@use "../sass/mixins"; - -.code-file__heading code { - font-family: map.get(tokens.$fonts, mono); - color: map.get(tokens.$brand, white); - @include mixins.light-mode { - color: map.get(tokens.$brand, black); - } -} diff --git a/src/CodeFile/index.tsx b/src/CodeFile/index.tsx deleted file mode 100644 index 6caae06..0000000 --- a/src/CodeFile/index.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { type FC } from "react"; - -import type { HighlightLanguage } from "../hooks/useHighlight"; -import CopyButton from "../CopyButton"; -import DownloadButton from "../DownloadButton"; -import Highlight from "../Highlight"; - -import "./index.scss"; - -export interface CodeFileProps { - language: HighlightLanguage; - code: string; - - /** - * The filename to use for displaying. - */ - filename: string; - - /** - * If an alternative download filename is required (for example, a user might - * download a dot-prefixed filename that is hidden by default on macOS and - * Linux). - * - * Defaults to the value of `filename` - */ - download?: string; - - /** - * Whether or not to allow copying. Defaults to true. - */ - allowCopy?: boolean; - - /** - * Whether or not to allow downloading. Defaults to true. - */ - allowDownload?: boolean; -} - -const CodeFile: FC = ({ - language, - code, - filename, - download = filename, - allowCopy, - allowDownload, -}) => ( -
-
- {filename} {allowCopy && }{" "} - {allowDownload && } -
- -
-); - -export default CodeFile; diff --git a/src/DownloadButton/DownloadButton.stories.tsx b/src/DownloadButton/DownloadButton.stories.tsx deleted file mode 100644 index 2a7955a..0000000 --- a/src/DownloadButton/DownloadButton.stories.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import DownloadButton from "./"; - -const meta = { - title: "Atoms/DownloadButton", - component: DownloadButton, - argTypes: { - filename: { control: "text" }, - data: { control: "text" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - filename: "hello.txt", - data: "Hello, world", - }, -}; diff --git a/src/DownloadButton/index.scss b/src/DownloadButton/index.scss deleted file mode 100644 index e1068bc..0000000 --- a/src/DownloadButton/index.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use "../sass/mixins"; - -.download-button { - @include mixins.svg-button; -} diff --git a/src/DownloadButton/index.tsx b/src/DownloadButton/index.tsx deleted file mode 100644 index 7a832b6..0000000 --- a/src/DownloadButton/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { type FC } from "react"; -import { ArrowDownTrayIcon } from "@heroicons/react/24/outline"; - -import useObjectURL from "../hooks/useObjectURL"; - -import "./index.scss"; - -export interface DownloadButtonProps { - /** - * Raw filename. Should not include slashes. - */ - filename: string; - - /** - * Content to download. - */ - data: string; -} - -const DownloadButton: FC = ({ filename, data }) => { - const url = useObjectURL(data); - - return ( - - - - ); -}; - -export default DownloadButton; diff --git a/src/GitHubButton/GithubButton.stories.tsx b/src/GitHubButton/GithubButton.stories.tsx deleted file mode 100644 index 6c84797..0000000 --- a/src/GitHubButton/GithubButton.stories.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import GitHubButton from "."; - -const meta = { - title: "Atoms/GitHubButton", - component: GitHubButton, - argTypes: { - owner: { control: "text" }, - repo: { control: "text" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: { - owner: "DeterminateSystems", - repo: "ui", - }, -}; diff --git a/src/GitHubButton/index.scss b/src/GitHubButton/index.scss deleted file mode 100644 index f8d99f3..0000000 --- a/src/GitHubButton/index.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use "../sass/mixins"; - -.github-button { - @include mixins.svg-button; -} diff --git a/src/GitHubButton/index.tsx b/src/GitHubButton/index.tsx deleted file mode 100644 index 59177ae..0000000 --- a/src/GitHubButton/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { type FC } from "react"; -import { GitHubLogoIcon } from "@radix-ui/react-icons"; - -import "./index.scss"; - -export interface GitHubButtonProps { - /** - * GitHub owner. Organization / user. - */ - owner: string; - - /** - * Repository name. - */ - repo: string; -} - -const GitHubButton: FC = ({ owner, repo }) => { - return ( - - - - ); -}; - -export default GitHubButton; diff --git a/src/Highlight/Highlight.stories.tsx b/src/Highlight/Highlight.stories.tsx deleted file mode 100644 index eec6164..0000000 --- a/src/Highlight/Highlight.stories.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import Highlight from "./"; -import { highlightLanguages } from "../hooks/useHighlight"; - -const meta = { - title: "Atoms/Highlight", - component: Highlight, - argTypes: { - language: { - control: "select", - options: [...highlightLanguages], - }, - code: { control: "text" }, - inline: { control: "boolean" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Shell: Story = { - args: { - language: "shell", - code: "curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate", - }, -}; - -export const ShellInline: Story = { - args: { - language: "shell", - code: "curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate", - inline: true, - }, -}; - -export const Yaml: Story = { - args: { - language: "yaml", - code: `on: - pull_request: - workflow_dispatch: - push: - branches: - - main - -jobs: - nix-ci: - runs-on: ubuntu-latest - # Include this block to log in to FlakeHub and access private flakes - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/determinate-nix-action@v3 - - uses: DeterminateSystems/flakehub-cache-action@main - - uses: DeterminateSystems/nix-flake-checker-action@main - - run: nix flake check`, - }, -}; - -export const YamlInline: Story = { - args: { - language: "yaml", - code: `on: - pull_request: - workflow_dispatch: - push: - branches: - - main - -jobs: - nix-ci: - runs-on: ubuntu-latest - # Include this block to log in to FlakeHub and access private flakes - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/determinate-nix-action@v3 - - uses: DeterminateSystems/flakehub-cache-action@main - - uses: DeterminateSystems/nix-flake-checker-action@main - - run: nix flake check`, - inline: true, - }, -}; diff --git a/src/Highlight/index.scss b/src/Highlight/index.scss deleted file mode 100644 index f639e31..0000000 --- a/src/Highlight/index.scss +++ /dev/null @@ -1,32 +0,0 @@ -@use "sass:map"; - -@use "../sass/tokens"; -@use "../sass/mixins"; - -// Default values taken from Shiki's 'classic' output type -$shiki-dark-bg: #24292e; -$shiki-light-bg: #fff; - -.highlight { - text-wrap-mode: wrap; - line-break: anywhere; - background-color: var(--shiki-dark-bg, map.get(tokens.$code, bg-dark)); - - @include mixins.light-mode { - background-color: var(--shiki-light-bg, map.get(tokens.$code, bg-light)); - } - - &.highlight--inline { - display: inline-block; - } - - span { - color: var(--shiki-dark); - - font-family: map.get(tokens.$fonts, mono); - - @include mixins.light-mode { - color: var(--shiki-light); - } - } -} diff --git a/src/Highlight/index.tsx b/src/Highlight/index.tsx deleted file mode 100644 index cc4f6b6..0000000 --- a/src/Highlight/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { type FC } from "react"; - -import "./index.scss"; - -import useHighlight, { type HighlightLanguage } from "../hooks/useHighlight"; -import clsx from "clsx"; - -export interface HighlightProps { - /** - * The language of this code snippet. Using `language="text"` will turn highlighting off. - */ - language: HighlightLanguage; - - /** - * The code to be highlighted and rendered. - */ - code: string; - - /** - * Whether or not to display the code as a block or inline element. - */ - inline?: boolean; -} - -/** - * A `` component renders a highlighted - * `
...
` snippet. This is useful for composing in other - * composite components, but it's more likely you want the `` - * component, which handles (optional) copying to clipboard and downloading. - */ -const Highlight: FC = ({ language, code, inline = false }) => { - const html = useHighlight(language, code); - - return ( -
-      
-    
- ); -}; - -export default Highlight; diff --git a/src/InstallCTA/InstallCTA.stories.tsx b/src/InstallCTA/InstallCTA.stories.tsx deleted file mode 100644 index 92e0c82..0000000 --- a/src/InstallCTA/InstallCTA.stories.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import InstallCTA from "./"; -import { InstallTarget } from "./types"; - -const meta = { - title: "Composite/InstallCTA", - component: InstallCTA, - argTypes: {}, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: {}, -}; - -export const MacOS: Story = { - name: "macOS", - args: { - initialTab: InstallTarget.MacOS, - }, -}; - -export const WSL: Story = { - args: { - initialTab: InstallTarget.WSL, - }, -}; - -export const Linux: Story = { - args: { - initialTab: InstallTarget.Linux, - }, -}; diff --git a/src/InstallCTA/InstallFromCurl.tsx b/src/InstallCTA/InstallFromCurl.tsx deleted file mode 100644 index 7a00817..0000000 --- a/src/InstallCTA/InstallFromCurl.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { type FC } from "react"; - -import CodeBlock from "../CodeBlock"; - -const installScript = - "curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate"; - -const InstallFromCurl: FC = () => ( - <> -

Use the Determinate Nix Installer CLI

- - -); - -export default InstallFromCurl; diff --git a/src/InstallCTA/NavTab.tsx b/src/InstallCTA/NavTab.tsx deleted file mode 100644 index af46bd0..0000000 --- a/src/InstallCTA/NavTab.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { FC } from "react"; - -import type { InstallTarget } from "./types"; - -import { ArrowTopRightOnSquareIcon } from "@heroicons/react/16/solid"; - -export interface NavTabProps { - name: InstallTarget; - icon: FC; - href: string; - external?: boolean; -} - -const NavTab: FC = ({ - name, - icon: Icon, - href, - external = false, -}) => ( -
  • - - {name} - - -
  • -); - -export default NavTab; diff --git a/src/InstallCTA/TabSelector.tsx b/src/InstallCTA/TabSelector.tsx deleted file mode 100644 index 4998f43..0000000 --- a/src/InstallCTA/TabSelector.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { useCallback, type FC, type MouseEvent } from "react"; - -import type { InstallTarget } from "./types"; - -export interface TabSelectorProps { - name: InstallTarget; - icon: FC; - active: boolean; - onClick: () => void; -} - -const TabSelector: FC = ({ - name, - icon: Icon, - active, - onClick, -}) => { - const handleClick = useCallback( - (event: MouseEvent) => { - event.preventDefault(); - onClick(); - }, - [onClick], - ); - - return ( -
  • - - {name} - -
  • - ); -}; - -export default TabSelector; diff --git a/src/InstallCTA/index.scss b/src/InstallCTA/index.scss deleted file mode 100644 index 6aff8bd..0000000 --- a/src/InstallCTA/index.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use "sass:map"; - -@use "../sass/tokens"; -@use "../sass/mixins"; - -.install-cta { - strong, - p { - color: map.get(tokens.$brand, white); - @include mixins.light-mode { - color: map.get(tokens.$brand, black); - } - } -} - -.install-cta__links { - display: flex; - flex-direction: row; - - list-style-type: none; - margin: 0; - padding: 0; -} - -.install-cta__tab { - padding: map.get(tokens.$spacing, xs) map.get(tokens.$spacing, xs); - - display: inline-flex; -} - -.install-cta__link { - @include mixins.transition(border-top-color, shortish); - border-top: 2px solid rgba($color: blue, $alpha: 0); - - &.install-cta__link--active { - border-top-color: blue; - } - - &:hover, - &:focus { - border-top-color: red; - } -} - -.install-cta__external { - @include mixins.svg-icon; -} diff --git a/src/InstallCTA/index.tsx b/src/InstallCTA/index.tsx deleted file mode 100644 index 186f3b2..0000000 --- a/src/InstallCTA/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { useState, type FC } from "react"; - -import TabSelector from "./TabSelector"; -import { InstallTarget, detectInstallTarget } from "./types"; -import InstallFromCurl from "./InstallFromCurl"; - -import MacInstaller from "../MacInstaller"; - -import "./index.scss"; -import NavTab from "./NavTab"; - -export { InstallTarget as CTAType } from "./types"; - -export interface InstallCTAProps { - /** - * If, for some reason, you want to bypass the detected OS, pass this prop. - * This is only applicable for the initial render. - */ - initialTab?: InstallTarget; -} - -/** - * A call-to-action component for downloading Determinate Nix. - * - * Due to the numerous options available, - */ -const InstallCTA: FC = ({ initialTab }) => { - const [activeTab, setActiveTab] = useState(() => { - if (initialTab) { - return initialTab; - } - - return detectInstallTarget(); - }); - - const wantsCurlInstall = - activeTab === InstallTarget.WSL || activeTab === InstallTarget.Linux; - - return ( -
    -

    - Get Determinate for {activeTab} -

    -
    - {activeTab === InstallTarget.MacOS && } - {wantsCurlInstall && } -
    -
      - null} - active={activeTab === InstallTarget.MacOS} - onClick={() => setActiveTab(InstallTarget.MacOS)} - /> - null} - active={activeTab === InstallTarget.WSL} - onClick={() => setActiveTab(InstallTarget.WSL)} - /> - null} - active={activeTab === InstallTarget.Linux} - onClick={() => setActiveTab(InstallTarget.Linux)} - /> - null} - href="https://docs.determinate.systems/guides/advanced-installation/#nixos" - external={true} - /> -
    -
    - ); -}; - -export default InstallCTA; diff --git a/src/InstallCTA/types.ts b/src/InstallCTA/types.ts deleted file mode 100644 index 6099ed8..0000000 --- a/src/InstallCTA/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Possible OSes on which Determinate Nix can be installed. - */ -export enum InstallTarget { - MacOS = "macOS", - WSL = "Windows Subsystem for Linux (WSL)", - Linux = "Linux", - NixOS = "NixOS", -} - -/** - * Auto-detect the appropriate install target for a given browser user agent. - * - * @param userAgent The user agent. Defaults to the browser's `navigator.userAgent`. - */ -export function detectInstallTarget( - userAgent = navigator.userAgent, -): InstallTarget { - if (userAgent.includes("Windows")) { - return InstallTarget.WSL; - } - - if (userAgent.includes("Linux")) { - return InstallTarget.Linux; - } - - return InstallTarget.MacOS; -} diff --git a/src/Link/Link.stories.ts b/src/Link/Link.stories.ts deleted file mode 100644 index 8194c05..0000000 --- a/src/Link/Link.stories.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import Link from "./"; - -const meta = { - title: "Atoms/Link", - component: Link, - argTypes: { - href: { type: "string" }, - external: { type: "boolean" }, - children: { type: "string" }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Internal: Story = { - args: { - href: "#", - children: "Internal Link", - }, -}; - -export const External: Story = { - args: { - href: "#", - external: true, - children: "External Link", - }, -}; diff --git a/src/Link/index.scss b/src/Link/index.scss deleted file mode 100644 index b57d28e..0000000 --- a/src/Link/index.scss +++ /dev/null @@ -1,17 +0,0 @@ -@use "sass:map"; - -@use "../sass/mixins"; -@use "../sass/tokens"; - -.link { - color: map.get(tokens.$brand, orange); - @include mixins.transition(color, short); - - &:hover { - color: map.get(tokens.$brand, red); - } - - &.link--external::after { - content: " ↗"; - } -} diff --git a/src/Link/index.tsx b/src/Link/index.tsx deleted file mode 100644 index dd28d78..0000000 --- a/src/Link/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, { type PropsWithChildren } from "react"; - -import "./index.scss"; - -export interface LinkProps { - /** - * The link destination. - */ - href: string; - - /** - * Whether or not this link is external. External links have a small symbol indicating the user will be leaving the current property. - */ - external?: boolean; - - /** - * Optional handler to fire when the link is clicked. - */ - onClick?(event: React.MouseEvent): void; -} - -const Link: React.FC> = ({ - href, - external, - children, - onClick, -}) => ( - - {children} - -); - -export default Link; diff --git a/src/MacInstaller/MacInstaller.stories.tsx b/src/MacInstaller/MacInstaller.stories.tsx deleted file mode 100644 index 776c125..0000000 --- a/src/MacInstaller/MacInstaller.stories.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; - -import MacInstaller from "./"; - -const meta = { - title: "Molecules/MacInstaller", - component: MacInstaller, - argTypes: {}, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: {}, -}; diff --git a/src/MacInstaller/index.scss b/src/MacInstaller/index.scss deleted file mode 100644 index ae3693b..0000000 --- a/src/MacInstaller/index.scss +++ /dev/null @@ -1,38 +0,0 @@ -@use "sass:color"; -@use "sass:map"; - -@use "../sass/tokens"; -@use "../sass/mixins"; - -.mac-installer { - display: flex; - width: 100%; - min-width: 15em; - - align-items: center; - - background-color: map.get(tokens.$brand, black); - border: 1px solid map.get(tokens.$brand, magenta); - color: map.get(tokens.$brand, white); - text-decoration: none; - - font-family: map.get(tokens.$fonts, sans); - - padding: 1rem; - border-radius: 0.5rem; - - @include mixins.transition(background-color, shortish); - - &:hover, - &:focus { - background-color: color.scale( - map.get(tokens.$brand, magenta), - $blackness: 50% - ); - } -} - -.mac-installer__pkg { - flex: 3.5rem 3.5rem auto; - margin-right: 1rem; -} diff --git a/src/MacInstaller/index.tsx b/src/MacInstaller/index.tsx deleted file mode 100644 index 2ecc7cc..0000000 --- a/src/MacInstaller/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { type FC } from "react"; - -import url from "./macPackageData"; - -import "./index.scss"; - -/** - * A call to action for downloading the Determinate Nix universal Mac installer. - */ -const MacInstaller: FC = () => ( - - Package icon representing the graphical installer - Download Determinate Nix - -); - -export default MacInstaller; diff --git a/src/MacInstaller/macPackageData.ts b/src/MacInstaller/macPackageData.ts deleted file mode 100644 index 16b1e63..0000000 --- a/src/MacInstaller/macPackageData.ts +++ /dev/null @@ -1 +0,0 @@ -export default "data:image/png;base64,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"; diff --git a/src/hooks/useHighlight.ts b/src/hooks/useHighlight.ts deleted file mode 100644 index 3830e90..0000000 --- a/src/hooks/useHighlight.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { createHighlighterCoreSync } from "@shikijs/core"; -import { createJavaScriptRegexEngine } from "@shikijs/engine-javascript"; -import langShell from "@shikijs/langs/shellscript"; -import langTerraform from "@shikijs/langs/terraform"; -import langYaml from "@shikijs/langs/yaml"; -import themeGitHubDark from "@shikijs/themes/github-dark"; -import themeGitHubLight from "@shikijs/themes/github-light"; -import { useMemo } from "react"; - -/** - * Languages understood by the UI system's highlighter. The `text` option prevents highlighting. - */ -export const highlightLanguages = [ - "shell", - "yaml", - "terraform", - "text", -] as const; -export type HighlightLanguage = (typeof highlightLanguages)[number]; - -// Lazily instantiate the Shiki renderer to avoid paying (some) startp costs -let shiki: ReturnType; -function getShiki() { - return (shiki ??= createHighlighterCoreSync({ - themes: [themeGitHubLight, themeGitHubDark], - langs: [langShell, langTerraform, langYaml], - engine: createJavaScriptRegexEngine(), - })); -} - -/** - * Hook to highlight code. The rendered HTML is memoized to avoid excessive re-computing of the syntax highlighting for various documents. - * - * @param language The language to highlight. `'text'` turns highlighting off. - * @param code The code to highlight. - * - * @returns Safe-to-inject HTML representing highlighting. - */ -function useHighlight(language: HighlightLanguage, code: string): string { - return useMemo(() => { - const html = getShiki().codeToHtml(code, { - lang: language, - themes: { - light: "github-light", - dark: "github-dark", - }, - defaultColor: false, - structure: "inline", - }); - - return html; - }, [language, code]); -} - -export default useHighlight; diff --git a/src/hooks/useObjectURL.ts b/src/hooks/useObjectURL.ts deleted file mode 100644 index 890c322..0000000 --- a/src/hooks/useObjectURL.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useEffect, useMemo } from "react"; - -/** - * Hook to create an [object - * URL](https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL_static) - * from a string. This hook takes care of cleaning up the generated object URL - * during React's lifecycle operations. - * - * @param data The data to convert into a blob - * @returns An object URL suitable for downloading (using `` markup). - */ -function useObjectURL(data: string): string { - const url = useMemo(() => { - const blob = new Blob([data]); - return URL.createObjectURL(blob); - }, [data]); - - useEffect(() => URL.revokeObjectURL(url), [url]); - - return url; -} - -export default useObjectURL; diff --git a/src/index.ts b/src/index.ts index 0385827..c983bb3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,13 +4,6 @@ import "./sass/reset.scss"; export { applyTheme, themeForScheme } from "./theme"; -// Hooks -export { - type HighlightLanguage, - default as useHighlight, -} from "./hooks/useHighlight"; -export { default as useObjectURL } from "./hooks/useObjectURL"; - // Components export { type BusyIconProps, @@ -18,12 +11,6 @@ export { default as BusyIcon, } from "./BusyIcon"; -export { type ButtonProps, default as Button } from "./Button"; - -export { type CodeBlockProps, default as CodeBlock } from "./CodeBlock"; - -export { type CodeFileProps, default as CodeFile } from "./CodeFile"; - export { type CodeInlineProps, default as CodeInline } from "./CodeInline"; export { @@ -46,27 +33,6 @@ export { type CopyButtonProps, default as CopyButton } from "./CopyButton"; export { type DetSysIconProps, default as DetSysIcon } from "./DetSysIcon"; -export { - type DownloadButtonProps, - default as DownloadButton, -} from "./DownloadButton"; -export { type HighlightProps, default as Highlight } from "./Highlight"; - -export { - type CTAType, - type InstallCTAProps, - default as InstallCTA, -} from "./InstallCTA"; - -export { type LinkProps, default as Link } from "./Link"; - -export { default as MacInstaller } from "./MacInstaller"; - -export { - type GitHubButtonProps, - default as GitHubButton, -} from "./GitHubButton"; - export { type HeaderProps, default as Header } from "./Header"; export {