diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d9498a63e4..3ac7261103 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -361,6 +361,14 @@ jobs:
- name: UI/MCP version audit
if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' || needs.changes.outputs.mcp == 'true' }}
run: npm run ui:version-audit
+ # gittensory-ui and gittensory-miner-ui both import compiled output from this shared package
+ # (packages/gittensory-ui-kit/dist), which is gitignored like every other workspace package's
+ # dist -- so it does not exist on a fresh checkout until something builds it. Same class of gap
+ # as "Build engine package" above; runs before UI lint/typecheck/tests/build all in this same
+ # job, so building it here once covers all four.
+ - name: Build UI-kit package
+ if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' }}
+ run: npm run ui:kit:build
- name: UI lint
if: ${{ github.event_name == 'push' || needs.changes.outputs.ui == 'true' }}
run: npm run ui:lint
diff --git a/apps/gittensory-miner-ui/eslint.config.js b/apps/gittensory-miner-ui/eslint.config.js
index 7a2dc4ca7d..131f9e562a 100644
--- a/apps/gittensory-miner-ui/eslint.config.js
+++ b/apps/gittensory-miner-ui/eslint.config.js
@@ -25,4 +25,24 @@ export default tseslint.config(
},
},
eslintPluginPrettier,
+ {
+ files: ["src/routes/**/*.{ts,tsx}"],
+ rules: {
+ "no-restricted-syntax": [
+ "error",
+ {
+ selector:
+ "Literal[value=/(^|\\s)(text-(2xs|xs|sm|base|md|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)|text-\\[\\d|leading-(none|tight|snug|normal|relaxed|loose|3|4|5|6|7|8|9|10)|leading-\\[|rounded-(sm|md|lg|xl|2xl|3xl)|divide-y(\\s|$)|border-(t|b|l|r)(\\s|$))(\\s|$)/]",
+ message:
+ "Use design tokens instead: text-token-*, leading-token-*, rounded-token, border-hairline / divide-hairline. See @jsonbored/gittensory-ui-kit/theme.css.",
+ },
+ {
+ selector:
+ "TemplateElement[value.raw=/(^|\\s)(text-(2xs|xs|sm|base|md|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)|leading-(none|tight|snug|normal|relaxed|loose)|rounded-(sm|md|lg|xl|2xl|3xl))(\\s|$)/]",
+ message:
+ "Use design tokens (text-token-*, leading-token-*, rounded-token, border-hairline) in template strings too.",
+ },
+ ],
+ },
+ },
);
diff --git a/apps/gittensory-miner-ui/index.html b/apps/gittensory-miner-ui/index.html
index c7003e7dbd..dea6e659a0 100644
--- a/apps/gittensory-miner-ui/index.html
+++ b/apps/gittensory-miner-ui/index.html
@@ -1,5 +1,5 @@
-
+
diff --git a/apps/gittensory-miner-ui/package.json b/apps/gittensory-miner-ui/package.json
index 1bb2984569..c13777a746 100644
--- a/apps/gittensory-miner-ui/package.json
+++ b/apps/gittensory-miner-ui/package.json
@@ -15,11 +15,13 @@
"format": "prettier --write ."
},
"dependencies": {
+ "@jsonbored/gittensory-ui-kit": "^0.1.0",
"@tailwindcss/vite": "^4.3.2",
"@tanstack/react-router": "^1.170.17",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"tailwindcss": "^4.3.2",
+ "tw-animate-css": "^1.4.0",
"vite-tsconfig-paths": "^6.1.1"
},
"devDependencies": {
@@ -39,7 +41,7 @@
"prettier": "^3.8.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.1",
- "vite": "^7.3.1",
+ "vite": "^8.1.3",
"vitest": "^4.1.9"
}
}
diff --git a/apps/gittensory-miner-ui/src/routes/__root.tsx b/apps/gittensory-miner-ui/src/routes/__root.tsx
index b7bfcfc925..07dc49f3c1 100644
--- a/apps/gittensory-miner-ui/src/routes/__root.tsx
+++ b/apps/gittensory-miner-ui/src/routes/__root.tsx
@@ -6,21 +6,21 @@ export const Route = createRootRoute({
function RootLayout() {
return (
-
-
+
+
-
Gittensory Miner
-
Local dashboard shell
+
Gittensory Miner
+
Local dashboard
-