feat: complete Phase 3 scaffolding (templates, static, Docker, per-app skeletons)
- Per-app skeleton completion: property/client/setting now have services/,
tasks.py, views.py, urls.py, serializers.py, templates/<app>/, tests/
- admin.py added to all 10 apps (per spec §2.108 / §17.3)
- Top-level templates/: base.html, layouts/{app,auth}.html, components/
{topbar,sidebar,pagination,toast,modal,empty-state}.html, errors/
{403,404,500}.html
- static/: css/main.css (Tailwind entry), js/main.js (HTMX toast +
CSRF wiring per §7.4), vendor/.gitkeep
- tailwind.config.js: Primary teal + neutral slate + semantic colors,
Inter font stack, z-60/z-70, shadow-xs, slide-in-right animation per
UI_SYSTEM §2.7/§10.1
- package.json: tailwindcss-only build/watch
- Dockerfile + docker-compose.yml (6 services: web/db/redis/celery/
celery-beat/tailwind) + docker-compose.prod.yml + Makefile
- tests/ root: conftest.py with TenantClient fixture per §720,
integration/{property,client,release}/, e2e/, schemathesis skeleton
- Removed empty apps/tenant/models/ (tenant uses models.py per §17.1)
Validated: manage.py check passes; tree matches spec §2 exactly.
This commit is contained in:
61
tailwind.config.js
Normal file
61
tailwind.config.js
Normal file
@@ -0,0 +1,61 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./templates/**/*.html",
|
||||
"./apps/**/templates/**/*.html",
|
||||
"./static/js/**/*.js",
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: {
|
||||
50: "#F0FDFA",
|
||||
100: "#CCFBF1",
|
||||
200: "#99F6E4",
|
||||
300: "#5EEAD4",
|
||||
400: "#2DD4BF",
|
||||
500: "#14B8A6",
|
||||
600: "#0F766E",
|
||||
700: "#115E59",
|
||||
800: "#134E4A",
|
||||
},
|
||||
neutral: {
|
||||
50: "#F8FAFC",
|
||||
100: "#F1F5F9",
|
||||
200: "#E2E8F0",
|
||||
300: "#CBD5E1",
|
||||
400: "#94A3B8",
|
||||
500: "#64748B",
|
||||
600: "#475569",
|
||||
700: "#334155",
|
||||
800: "#1E293B",
|
||||
900: "#0F172A",
|
||||
},
|
||||
success: { 600: "#16A34A" },
|
||||
warning: { 600: "#D97706" },
|
||||
danger: { 600: "#DC2626" },
|
||||
info: { 600: "#2563EB" },
|
||||
},
|
||||
fontFamily: {
|
||||
sans: ["Inter", "PingFang SC", "Microsoft YaHei", "sans-serif"],
|
||||
},
|
||||
zIndex: {
|
||||
60: "60",
|
||||
70: "70",
|
||||
},
|
||||
boxShadow: {
|
||||
xs: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
|
||||
},
|
||||
keyframes: {
|
||||
"slide-in-right": {
|
||||
"0%": { transform: "translateX(100%)", opacity: "0" },
|
||||
"100%": { transform: "translateX(0)", opacity: "1" },
|
||||
},
|
||||
},
|
||||
animation: {
|
||||
"slide-in-right": "slide-in-right 0.2s ease-out",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
};
|
||||
Reference in New Issue
Block a user