├── app ├── favicon.ico ├── components │ ├── solari │ │ ├── index.ts │ │ ├── Presets.ts │ │ ├── SolariBoard.tsx │ │ ├── FlapStack.tsx │ │ ├── FlapDigit.tsx │ │ ├── useDisplayLength.ts │ │ ├── FlapDisplay.tsx │ │ └── Flap.tsx │ ├── layout │ │ └── footer.tsx │ └── icons │ │ └── goose.tsx ├── assets │ └── fonts │ │ └── CashSansMono-Regular.woff2 ├── layout.tsx ├── styles │ └── main.css └── page.tsx ├── next.config.js ├── next.config.ts ├── postcss.config.mjs ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md ├── tailwind.config.ts ├── DISCLAIMER.md ├── .github └── workflows │ └── nextjs.yml └── LICENSE /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/block/bitcoin-treasury/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /app/components/solari/index.ts: -------------------------------------------------------------------------------- 1 | export { FlapDisplay } from './FlapDisplay'; 2 | export { Presets } from './Presets'; -------------------------------------------------------------------------------- /app/assets/fonts/CashSansMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/block/bitcoin-treasury/HEAD/app/assets/fonts/CashSansMono-Regular.woff2 -------------------------------------------------------------------------------- /app/components/solari/Presets.ts: -------------------------------------------------------------------------------- 1 | export const Presets = { 2 | NUM: " 0123456789", 3 | ALPHANUM: " JU↑XSO5QYCENM4↓PIWL$BKZF93,HGA2167D8.VR0T", 4 | }; 5 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | basePath: '', 4 | assetPrefix: '/', 5 | }; 6 | 7 | export default nextConfig; -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | basePath: "", 5 | assetPrefix: "/", 6 | }; 7 | 8 | export default nextConfig; 9 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | 43 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "baseUrl": ".", 22 | "paths": { 23 | "@/*": ["./app/*"] 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 27 | "exclude": ["node_modules"] 28 | } 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitcoin-solari", 3 | "version": "0.1.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "next dev", 8 | "build": "next build", 9 | "start": "next start", 10 | "lint": "next lint" 11 | }, 12 | "dependencies": { 13 | "classnames": "^2.5.1", 14 | "lodash": "^4.17.21", 15 | "next": "^16.0.7", 16 | "next-themes": "^0.4.3", 17 | "prop-types": "^15.8.1", 18 | "react": "^19.2.1", 19 | "react-dom": "^19.2.1" 20 | }, 21 | "devDependencies": { 22 | "@types/lodash": "^4.17.16", 23 | "@types/node": "^20", 24 | "@types/react": "^19.2.7", 25 | "@types/react-dom": "^19.2.3", 26 | "@types/react-window": "^1.8.8", 27 | "postcss": "^8", 28 | "tailwindcss": "^3.4.1", 29 | "typescript": "^5" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { ThemeProvider } from "next-themes"; 3 | import "./styles/main.css"; 4 | import Footer from "./components/layout/footer"; 5 | 6 | export const metadata: Metadata = { 7 | title: "Bitcoin Holdings", 8 | }; 9 | 10 | export default function RootLayout({ 11 | children, 12 | }: Readonly<{ 13 | children: React.ReactNode; 14 | }>) { 15 | return ( 16 | 17 | 20 | 21 |
22 |
{children}
23 |
24 |