From 61ee6333a5d2186799edb686d7497a1af6474847 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Sat, 11 Apr 2026 05:53:31 -0700 Subject: [PATCH] chore: add frontend component system package --- MODULE.bazel | 5 + REPO.bazel | 1 + TODO.md | 1 + apps/frontend/BUILD.bazel | 1 + apps/frontend/package.json | 1 + apps/frontend/src/App.css | 184 ------------------------- apps/frontend/src/App.tsx | 114 +-------------- apps/frontend/src/assets/hero.png | Bin 44919 -> 0 bytes apps/frontend/src/assets/react.svg | 1 - apps/frontend/src/assets/vite.svg | 1 - apps/frontend/src/index.css | 111 --------------- apps/frontend/src/main.tsx | 1 - packages/components/BUILD.bazel | 30 ++++ packages/components/package.json | 21 +++ packages/components/pyproject.toml | 5 + packages/components/src/HelloWorld.tsx | 3 + packages/components/src/index.tsx | 1 + packages/components/tsconfig.json | 17 +++ pnpm-lock.yaml | 22 +++ uv.lock | 6 + 20 files changed, 116 insertions(+), 410 deletions(-) create mode 100644 REPO.bazel delete mode 100644 apps/frontend/src/App.css delete mode 100644 apps/frontend/src/assets/hero.png delete mode 100644 apps/frontend/src/assets/react.svg delete mode 100644 apps/frontend/src/assets/vite.svg delete mode 100644 apps/frontend/src/index.css create mode 100644 packages/components/BUILD.bazel create mode 100644 packages/components/package.json create mode 100644 packages/components/pyproject.toml create mode 100644 packages/components/src/HelloWorld.tsx create mode 100644 packages/components/src/index.tsx create mode 100644 packages/components/tsconfig.json diff --git a/MODULE.bazel b/MODULE.bazel index 48e715c..22b16b7 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -72,6 +72,11 @@ uv.override_package( lock = "//:uv.lock", target = "//apps/frontend:build", ) +uv.override_package( + name = "components", + lock = "//:uv.lock", + target = "//packages/components", +) uv.override_package( name = "httptools", lock = "//:uv.lock", diff --git a/REPO.bazel b/REPO.bazel new file mode 100644 index 0000000..d51a46f --- /dev/null +++ b/REPO.bazel @@ -0,0 +1 @@ +ignore_directories(["**/node_modules"]) diff --git a/TODO.md b/TODO.md index d7f92cb..94f24de 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,7 @@ - [ ] Add React + Vite + PNPM FE monorepo infra - [ ] Add Bazel support - [ ] Fix various Bazel hard-coded paths +- [ ] Add Ruff and ESLint support to Bazel - [ ] Add Sentry - [ ] Add Vulture dead code analysis - [ ] Add Autofix CI \ No newline at end of file diff --git a/apps/frontend/BUILD.bazel b/apps/frontend/BUILD.bazel index 70a71ab..fc67e62 100644 --- a/apps/frontend/BUILD.bazel +++ b/apps/frontend/BUILD.bazel @@ -26,6 +26,7 @@ SRCS = glob( BUILD_DEPS = [":node_modules/" + d for d in [ "@vitejs/plugin-react", + "components", "vite", "react", "react-dom", diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 0f8d452..648911f 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "components": "workspace:*", "react": "^19.2.4", "react-dom": "^19.2.4" }, diff --git a/apps/frontend/src/App.css b/apps/frontend/src/App.css deleted file mode 100644 index f90339d..0000000 --- a/apps/frontend/src/App.css +++ /dev/null @@ -1,184 +0,0 @@ -.counter { - font-size: 16px; - padding: 5px 10px; - border-radius: 5px; - color: var(--accent); - background: var(--accent-bg); - border: 2px solid transparent; - transition: border-color 0.3s; - margin-bottom: 24px; - - &:hover { - border-color: var(--accent-border); - } - &:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; - } -} - -.hero { - position: relative; - - .base, - .framework, - .vite { - inset-inline: 0; - margin: 0 auto; - } - - .base { - width: 170px; - position: relative; - z-index: 0; - } - - .framework, - .vite { - position: absolute; - } - - .framework { - z-index: 1; - top: 34px; - height: 28px; - transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) - scale(1.4); - } - - .vite { - z-index: 0; - top: 107px; - height: 26px; - width: auto; - transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) - scale(0.8); - } -} - -#center { - display: flex; - flex-direction: column; - gap: 25px; - place-content: center; - place-items: center; - flex-grow: 1; - - @media (max-width: 1024px) { - padding: 32px 20px 24px; - gap: 18px; - } -} - -#next-steps { - display: flex; - border-top: 1px solid var(--border); - text-align: left; - - & > div { - flex: 1 1 0; - padding: 32px; - @media (max-width: 1024px) { - padding: 24px 20px; - } - } - - .icon { - margin-bottom: 16px; - width: 22px; - height: 22px; - } - - @media (max-width: 1024px) { - flex-direction: column; - text-align: center; - } -} - -#docs { - border-right: 1px solid var(--border); - - @media (max-width: 1024px) { - border-right: none; - border-bottom: 1px solid var(--border); - } -} - -#next-steps ul { - list-style: none; - padding: 0; - display: flex; - gap: 8px; - margin: 32px 0 0; - - .logo { - height: 18px; - } - - a { - color: var(--text-h); - font-size: 16px; - border-radius: 6px; - background: var(--social-bg); - display: flex; - padding: 6px 12px; - align-items: center; - gap: 8px; - text-decoration: none; - transition: box-shadow 0.3s; - - &:hover { - box-shadow: var(--shadow); - } - .button-icon { - height: 18px; - width: 18px; - } - } - - @media (max-width: 1024px) { - margin-top: 20px; - flex-wrap: wrap; - justify-content: center; - - li { - flex: 1 1 calc(50% - 8px); - } - - a { - width: 100%; - justify-content: center; - box-sizing: border-box; - } - } -} - -#spacer { - height: 88px; - border-top: 1px solid var(--border); - @media (max-width: 1024px) { - height: 48px; - } -} - -.ticks { - position: relative; - width: 100%; - - &::before, - &::after { - content: ''; - position: absolute; - top: -4.5px; - border: 5px solid transparent; - } - - &::before { - left: 0; - border-left-color: var(--border); - } - &::after { - right: 0; - border-right-color: var(--border); - } -} diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx index 46a5992..3baf5a8 100644 --- a/apps/frontend/src/App.tsx +++ b/apps/frontend/src/App.tsx @@ -1,119 +1,9 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from './assets/vite.svg' -import heroImg from './assets/hero.png' -import './App.css' +import { HelloWorld } from 'components' function App() { - const [count, setCount] = useState(0) - return ( <> -
-
- - React logo - Vite logo -
-
-

Get started

-

- Edit src/App.tsx and save to test HMR -

-
- -
- -
- -
-
- -

Documentation

-

Your questions, answered

- -
-
- -

Connect with us

-

Join the Vite community

- -
-
- -
-
+ ) } diff --git a/apps/frontend/src/assets/hero.png b/apps/frontend/src/assets/hero.png deleted file mode 100644 index cc51a3d20ad4bc961b596a6adfd686685cd84bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44919 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 KelF{r5}E+d8+Ql* diff --git a/apps/frontend/src/assets/react.svg b/apps/frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/apps/frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/frontend/src/assets/vite.svg b/apps/frontend/src/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/apps/frontend/src/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite diff --git a/apps/frontend/src/index.css b/apps/frontend/src/index.css deleted file mode 100644 index 5fb3313..0000000 --- a/apps/frontend/src/index.css +++ /dev/null @@ -1,111 +0,0 @@ -:root { - --text: #6b6375; - --text-h: #08060d; - --bg: #fff; - --border: #e5e4e7; - --code-bg: #f4f3ec; - --accent: #aa3bff; - --accent-bg: rgba(170, 59, 255, 0.1); - --accent-border: rgba(170, 59, 255, 0.5); - --social-bg: rgba(244, 243, 236, 0.5); - --shadow: - rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - - --sans: system-ui, 'Segoe UI', Roboto, sans-serif; - --heading: system-ui, 'Segoe UI', Roboto, sans-serif; - --mono: ui-monospace, Consolas, monospace; - - font: 18px/145% var(--sans); - letter-spacing: 0.18px; - color-scheme: light dark; - color: var(--text); - background: var(--bg); - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - @media (max-width: 1024px) { - font-size: 16px; - } -} - -@media (prefers-color-scheme: dark) { - :root { - --text: #9ca3af; - --text-h: #f3f4f6; - --bg: #16171d; - --border: #2e303a; - --code-bg: #1f2028; - --accent: #c084fc; - --accent-bg: rgba(192, 132, 252, 0.15); - --accent-border: rgba(192, 132, 252, 0.5); - --social-bg: rgba(47, 48, 58, 0.5); - --shadow: - rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; - } - - #social .button-icon { - filter: invert(1) brightness(2); - } -} - -#root { - width: 1126px; - max-width: 100%; - margin: 0 auto; - text-align: center; - border-inline: 1px solid var(--border); - min-height: 100svh; - display: flex; - flex-direction: column; - box-sizing: border-box; -} - -body { - margin: 0; -} - -h1, -h2 { - font-family: var(--heading); - font-weight: 500; - color: var(--text-h); -} - -h1 { - font-size: 56px; - letter-spacing: -1.68px; - margin: 32px 0; - @media (max-width: 1024px) { - font-size: 36px; - margin: 20px 0; - } -} -h2 { - font-size: 24px; - line-height: 118%; - letter-spacing: -0.24px; - margin: 0 0 8px; - @media (max-width: 1024px) { - font-size: 20px; - } -} -p { - margin: 0; -} - -code, -.counter { - font-family: var(--mono); - display: inline-flex; - border-radius: 4px; - color: var(--text-h); -} - -code { - font-size: 15px; - line-height: 135%; - padding: 4px 8px; - background: var(--code-bg); -} diff --git a/apps/frontend/src/main.tsx b/apps/frontend/src/main.tsx index bef5202..4aff025 100644 --- a/apps/frontend/src/main.tsx +++ b/apps/frontend/src/main.tsx @@ -1,6 +1,5 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import './index.css' import App from './App.tsx' createRoot(document.getElementById('root')!).render( diff --git a/packages/components/BUILD.bazel b/packages/components/BUILD.bazel new file mode 100644 index 0000000..04b47a4 --- /dev/null +++ b/packages/components/BUILD.bazel @@ -0,0 +1,30 @@ +load("@aspect_rules_js//js:defs.bzl", "js_library") +load("@aspect_rules_js//npm:defs.bzl", "npm_package") +load("@npm//:defs.bzl", "npm_link_all_packages") + +npm_link_all_packages(name = "node_modules") + +js_library( + name = "components", + srcs = glob( + [ + "src/**/*.tsx", + "src/**/*.ts", + ], + allow_empty = True, + ) + [ + "package.json", + "tsconfig.json", + ], + visibility = ["//visibility:public"], + deps = [ + ":node_modules/@types/react", + ":node_modules/@types/react-dom", + ], +) + +npm_package( + name = "pkg", + srcs = [":components"], + visibility = ["//visibility:public"], +) diff --git a/packages/components/package.json b/packages/components/package.json new file mode 100644 index 0000000..569f4c3 --- /dev/null +++ b/packages/components/package.json @@ -0,0 +1,21 @@ +{ + "name": "components", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./src/index.tsx", + "default": "./src/index.tsx" + } + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "typescript": "~6.0.2" + } +} diff --git a/packages/components/pyproject.toml b/packages/components/pyproject.toml new file mode 100644 index 0000000..5acddeb --- /dev/null +++ b/packages/components/pyproject.toml @@ -0,0 +1,5 @@ +[project] +name = "components" +version = "0.0.1" +description = "Shared React components for the modern Python enterprise template." +readme = "README.md" diff --git a/packages/components/src/HelloWorld.tsx b/packages/components/src/HelloWorld.tsx new file mode 100644 index 0000000..df152c4 --- /dev/null +++ b/packages/components/src/HelloWorld.tsx @@ -0,0 +1,3 @@ +export function HelloWorld() { + return

Hello world

; +} diff --git a/packages/components/src/index.tsx b/packages/components/src/index.tsx new file mode 100644 index 0000000..3986fb5 --- /dev/null +++ b/packages/components/src/index.tsx @@ -0,0 +1 @@ +export { HelloWorld } from "./HelloWorld.tsx"; diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json new file mode 100644 index 0000000..c3de34a --- /dev/null +++ b/packages/components/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "erasableSyntaxOnly": true + }, + "include": ["src"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a48190..3bc05b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ importers: apps/frontend: dependencies: + components: + specifier: workspace:* + version: link:../../packages/components react: specifier: ^19.2.4 version: 19.2.5 @@ -63,6 +66,25 @@ importers: specifier: ^4.1.4 version: 4.1.4(@types/node@24.12.2)(vite@8.0.8(@types/node@24.12.2)(jiti@2.6.1)(yaml@2.8.3)) + packages/components: + dependencies: + react: + specifier: ^19.0.0 + version: 19.2.5 + react-dom: + specifier: ^19.0.0 + version: 19.2.5(react@19.2.5) + devDependencies: + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + typescript: + specifier: ~6.0.2 + version: 6.0.2 + packages/shared: {} packages: diff --git a/uv.lock b/uv.lock index 84363bc..1b1f85d 100644 --- a/uv.lock +++ b/uv.lock @@ -5,6 +5,7 @@ requires-python = ">=3.14" [manifest] members = [ "backend", + "components", "frontend", "modern-python-enterprise-template", "shared", @@ -123,6 +124,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "components" +version = "0.0.1" +source = { virtual = "packages/components" } + [[package]] name = "dnspython" version = "2.8.0" -- 2.51.2