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 (
<>
-
- Edit
-
-
-
Get started
- src/App.tsx and save to test HMR
-
V3*hSzZ0pRy$=bU#B%CZ9#Qip}y=!rxz^eWIuoB
zdgOL?hgHSIct+ONP0Z0@g-5vFStVzRZi^GL{3`n-cBkQ8cOi-9bt&h{Cb4MUU9=#e
zY27QWFJcd02u@)L5;~WclU@5kOEBnu^P-)htZU_VyPqvsyuUL=Q)6De#qG+7T{paU
z2x<%dUc7W`3hNE~HN4Tc<82GSOzHLhF2VxxK!x2!)1=nowUa8@CW$84>)oB?*=+5-
z{ms%Mb!&g-Dk}|*d12wDAG{v8g?IlE+I*?Fw Cc|%D2s&-j~;bz{c~!a*o2}@4lzDL%g!9&QxfD&e|boNqvc)?
zsCM7|Ec@WjEi!%g%QR=l7{=;pul%E+_G$^Yb;BHi{~Io_zg6J}sqIcUmb^o%-%^JC
z>(|~p`z8gYGOEu$$GaAkSw1xU+1u2=@jsh-ve4QWOoALO_c|<lKKjn9O!uYgRP-
z2AyxIPfX3-^`B1CUUvFv>eTw<%|RMb>_4j5jxEakrunH1l<0U~yi?!w{f>6B&9xgB
z&Unu8*l_28({H&IVmsnPtd{+LFl&~`s(q6VSbV$xJ;^^$n^#jsfMf4MVQq^bH8HQ+
ziTmq*-=COL_&9EjPto7$Isri+57x`Q=uGZ3d()uz%Zn)~@7eu%KH~ij3LgYjzn`|h
z_gGZu=^>+Q%I!(9|3CjXH{ZIVEYwA_KjtQT(UUIesQu*^!u6h<{WzKJSQ2~qosBB1
zzingRauJk=nx`Bw37*1e<65^;ym e>51E4%XA*IR>|1!-jt{RCq;hK8>jn%{AM>_ZQG+Kw|j1|
zyAZ=f?TOkC`2`
a!@dmfi@#|5SN
zgnc|U&*Z{f!`<8&JW~!Fx_;@vqq$W#EPv{(`FBR#=2>cEMi^i8yYNlS>mRLRD$_r*
zwBGPdWE6kiXYPZA$8x_ty&-;Wb@J)|VipPk8zu*G&Er0GVD8?f-`1z*iyqdRprgUk
z-#Yz3X&hUQq%^Pe{+^VZ9}_oRwc(u
r-mHqAm5Wg8s84p-?f+{{%taAC4=!M#j4`lH*NRtC_Q^$ZL?B@@(sJgt(
P`SpHnvu!XFWBV%ZQrAcK5;?x
Connect with us
-Join the Vite community
---
-
-
- GitHub
-
-
- -
-
-
- Discord
-
-
- -
-
-
- X.com
-
-
- -
-
-
- Bluesky
-
-
-
-