feat: implement shared-album multi-user photo album
Backend (Go/Gin/pgx): env config, pgx pool with retries, Garage S3 client (path-style, region garage), embedded golang-migrate migrations, JWT auth with refresh rotation, albums CRUD, members/roles/invites with no-escalation matrix, photo upload + async imaging/goexif WebP variants, cursor pagination, presigned URLs, likes/comments, SSE hub (album + personal), notifications, share links. Frontend (SvelteKit 2 + Svelte 5 + Tailwind v4): API wrapper with 401 refresh, auth store, all screens, Uploader/PhotoGrid/Lightbox/Comments, SSE client with reconnect + REST catch-up, three themes + system via data-theme. Deploy without Docker: Makefile builds the frontend into backend/static and embeds it (go:embed) into a single statically linked binary; systemd unit and nginx SSE example included. Use gen2brain/webp (-tags nodynamic) instead of cgo kolesa-team/go-webp to keep CGO_ENABLED=0 static builds; design.md/proposal.md updated accordingly.
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
@import 'tailwindcss';
|
||||
@config '../tailwind.config.ts';
|
||||
|
||||
/* Светлая */
|
||||
:root,
|
||||
[data-theme='light'] {
|
||||
--bg: 0 0% 100%;
|
||||
--bg-elevated: 0 0% 98%;
|
||||
--bg-muted: 0 0% 95%;
|
||||
--border: 0 0% 88%;
|
||||
--text: 0 0% 9%;
|
||||
--text-muted: 0 0% 45%;
|
||||
--text-subtle: 0 0% 60%;
|
||||
--primary: 221 83% 53%;
|
||||
--primary-fg: 0 0% 100%;
|
||||
--danger: 0 84% 60%;
|
||||
--success: 142 71% 45%;
|
||||
--shadow: 0 0% 0% / 0.08;
|
||||
}
|
||||
|
||||
/* Тёмная */
|
||||
[data-theme='dark'] {
|
||||
--bg: 0 0% 7%;
|
||||
--bg-elevated: 0 0% 11%;
|
||||
--bg-muted: 0 0% 16%;
|
||||
--border: 0 0% 22%;
|
||||
--text: 0 0% 96%;
|
||||
--text-muted: 0 0% 65%;
|
||||
--text-subtle: 0 0% 45%;
|
||||
--primary: 217 91% 60%;
|
||||
--primary-fg: 0 0% 100%;
|
||||
--danger: 0 84% 65%;
|
||||
--success: 142 65% 50%;
|
||||
--shadow: 0 0% 0% / 0.4;
|
||||
}
|
||||
|
||||
/* Нейтральная (тёплая серо-бежевая) */
|
||||
[data-theme='neutral'] {
|
||||
--bg: 40 20% 96%;
|
||||
--bg-elevated: 40 22% 92%;
|
||||
--bg-muted: 40 18% 87%;
|
||||
--border: 40 14% 78%;
|
||||
--text: 30 10% 15%;
|
||||
--text-muted: 30 8% 40%;
|
||||
--text-subtle: 30 6% 55%;
|
||||
--primary: 25 90% 50%;
|
||||
--primary-fg: 0 0% 100%;
|
||||
--danger: 0 72% 55%;
|
||||
--success: 142 55% 42%;
|
||||
--shadow: 30 20% 20% / 0.12;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
background: hsl(var(--bg));
|
||||
color: hsl(var(--text));
|
||||
transition:
|
||||
background-color 200ms ease,
|
||||
color 200ms ease;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html,
|
||||
body {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user