mirror of
https://github.com/HugeFrog24/nini-artgallery.git
synced 2026-06-29 20:47:12 +00:00
Compare commits
3 Commits
f347a6d40e
...
c07a3c0cc0
| Author | SHA1 | Date | |
|---|---|---|---|
| c07a3c0cc0 | |||
| ea921ba5d5 | |||
| b1f70688cb |
Vendored
-1
@@ -3,6 +3,5 @@
|
||||
"messages",
|
||||
"src/i18n"
|
||||
],
|
||||
"snyk.advanced.organization": "512ef4a1-6034-4537-a391-9692d282122a",
|
||||
"snyk.advanced.autoSelectOrganization": true
|
||||
}
|
||||
+32
-19
@@ -1,43 +1,59 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
# ============================================
|
||||
# Stage 1: Dependencies
|
||||
FROM --platform=$BUILDPLATFORM node:20-alpine AS deps
|
||||
# ============================================
|
||||
FROM --platform=$BUILDPLATFORM node:22-alpine3.22 AS deps
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV COREPACK_DEFAULT_TO_LATEST=0
|
||||
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||||
|
||||
RUN corepack enable \
|
||||
&& corepack prepare pnpm@11.1.2 --activate \
|
||||
&& pnpm install --frozen-lockfile
|
||||
|
||||
# ============================================
|
||||
# Stage 2: Builder
|
||||
FROM --platform=$BUILDPLATFORM node:20-alpine AS builder
|
||||
# ============================================
|
||||
FROM --platform=$BUILDPLATFORM node:22-alpine3.22 AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV COREPACK_DEFAULT_TO_LATEST=0
|
||||
|
||||
RUN corepack enable \
|
||||
&& corepack prepare pnpm@11.1.2 --activate
|
||||
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
|
||||
COPY . .
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
|
||||
RUN pnpm run build
|
||||
RUN pnpm build
|
||||
|
||||
# ============================================
|
||||
# Stage 3: Runner
|
||||
FROM node:20-alpine AS runner
|
||||
# ============================================
|
||||
FROM node:22-alpine3.22 AS runner
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME=0.0.0.0
|
||||
|
||||
RUN addgroup --system --gid 1001 nodejs
|
||||
RUN adduser --system --uid 1001 nextjs
|
||||
RUN addgroup -S nodejs -g 1001 \
|
||||
&& adduser -S nextjs -u 1001
|
||||
|
||||
# Copy only necessary files
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
# Copy tenant data and message files (not included in standalone bundle)
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/data ./data
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/messages ./messages
|
||||
|
||||
@@ -45,7 +61,4 @@ USER nextjs
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME="0.0.0.0"
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
@@ -26,6 +26,35 @@
|
||||
"mediumKey": "digitalPainting",
|
||||
"dimensions": "4000 x 3000 px",
|
||||
"year": 2024
|
||||
},
|
||||
{
|
||||
"id": "p4",
|
||||
"imageUrl": "#8B4513",
|
||||
"category": "paintings",
|
||||
"mediumKey": "watercolorOnPaper",
|
||||
"dimensions": "24\" x 18\"",
|
||||
"year": 2025
|
||||
},
|
||||
{
|
||||
"id": "p5",
|
||||
"imageUrl": "#2E8B57",
|
||||
"category": "paintings",
|
||||
"mediumKey": "digitalPainting",
|
||||
"dimensions": "3500 x 2800 px",
|
||||
"year": 2025
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "crochet",
|
||||
"artworks": [
|
||||
{
|
||||
"id": "c1",
|
||||
"imageUrl": "#D2691E",
|
||||
"category": "crochet",
|
||||
"mediumKey": "cottonYarn",
|
||||
"dimensions": "6\" height",
|
||||
"year": 2025
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "Handgezeichnete Tuscheillustrationen, inspiriert von Märchen",
|
||||
"gallery": "Illustrationen-Galerie",
|
||||
"artwork": "Illustration"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "Häkelfiguren",
|
||||
"description": "Handgefertigte gehäkelte Figuren und Spielzeuge",
|
||||
"gallery": "Häkelfiguren-Galerie",
|
||||
"artwork": "Häkelfigur"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "Pilzskizzen",
|
||||
"description": "Tuschestudien fantastischer Pilze — manche größer als Häuser"
|
||||
},
|
||||
"p4": {
|
||||
"title": "Tee mit dem Biber",
|
||||
"description": "Eine gemütliche Teeszene mit einem Biber — eine märchenhafte Freundschaft am gedeckten Tisch"
|
||||
},
|
||||
"p5": {
|
||||
"title": "Fedoras Kummer",
|
||||
"description": "Der Frosch Samokvak aus Tschukowskis Erzählung — beobachtet gelassen die Flucht des Geschirrs"
|
||||
},
|
||||
"c1": {
|
||||
"title": "Biber",
|
||||
"description": "Eine gehäkelte Biberfigur mit Schwanz — weich und gemütlich"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "Digitale Malerei",
|
||||
"watercolorOnPaper": "Aquarell auf Papier",
|
||||
"inkOnPaper": "Tusche auf Papier"
|
||||
"inkOnPaper": "Tusche auf Papier",
|
||||
"cottonYarn": "Baumwollgarn"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "Hand-drawn and ink illustrations inspired by fairy tales",
|
||||
"gallery": "Illustrations gallery",
|
||||
"artwork": "Illustration"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "Crochet Figurines",
|
||||
"description": "Handcrafted knitted figurines and toys",
|
||||
"gallery": "Crochet Figurines gallery",
|
||||
"artwork": "Crochet figurine"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "Mushroom Sketches",
|
||||
"description": "Ink studies of fantastical mushrooms — some taller than houses"
|
||||
},
|
||||
"p4": {
|
||||
"title": "Tea with the Beaver",
|
||||
"description": "A cozy tea-time scene with a beaver — a fairy-tale friendship at a set table"
|
||||
},
|
||||
"p5": {
|
||||
"title": "Fedora's Grief",
|
||||
"description": "The Samokvak frog from Chukovsky's tale — calmly watching the dishes flee"
|
||||
},
|
||||
"c1": {
|
||||
"title": "Beaver",
|
||||
"description": "A crocheted beaver figurine with a tail — soft and cozy"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "Digital painting",
|
||||
"watercolorOnPaper": "Watercolor on paper",
|
||||
"inkOnPaper": "Ink on paper"
|
||||
"inkOnPaper": "Ink on paper",
|
||||
"cottonYarn": "Cotton yarn"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "Ilustraciones a mano y tinta inspiradas en cuentos de hadas",
|
||||
"gallery": "Galería de ilustraciones",
|
||||
"artwork": "Ilustración"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "Figuras de ganchillo",
|
||||
"description": "Figuras y juguetes tejidos a mano",
|
||||
"gallery": "Galería de figuras de ganchillo",
|
||||
"artwork": "Figura de ganchillo"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "Bocetos de Hongos",
|
||||
"description": "Estudios a tinta de hongos fantásticos — algunos más altos que casas"
|
||||
},
|
||||
"p4": {
|
||||
"title": "Té con el castor",
|
||||
"description": "Una acogedora escena de té con un castor — una amistad de cuento en una mesa servida"
|
||||
},
|
||||
"p5": {
|
||||
"title": "La pena de Fedora",
|
||||
"description": "La rana Samokvak del cuento de Chukovski — observa con calma la huida de la vajilla"
|
||||
},
|
||||
"c1": {
|
||||
"title": "Castor",
|
||||
"description": "Una figura de ganchillo de un castor con cola — suave y acogedor"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "Pintura digital",
|
||||
"watercolorOnPaper": "Acuarela sobre papel",
|
||||
"inkOnPaper": "Tinta sobre papel"
|
||||
"inkOnPaper": "Tinta sobre papel",
|
||||
"cottonYarn": "Hilo de algodón"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "ხელით დახატული და მელნის ილუსტრაციები, ზღაპრებით შთაგონებული",
|
||||
"gallery": "ილუსტრაციების გალერეა",
|
||||
"artwork": "ილუსტრაცია"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "ქსოვილი ფიგურები",
|
||||
"description": "ხელნაკეთი ქსოვილი ფიგურები და სათამაშოები",
|
||||
"gallery": "ქსოვილი ფიგურების გალერეა",
|
||||
"artwork": "ქსოვილი ფიგურა"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "სოკოს ესკიზები",
|
||||
"description": "მელნის ეტიუდები ფანტასტიკური სოკოების — ზოგი სახლებზე მაღალი"
|
||||
},
|
||||
"p4": {
|
||||
"title": "თახვთან ერთად მაგიდასთან",
|
||||
"description": "თახვთან ერთად ჩაის მყუდრო სცენა — ზღაპრული მეგობრობა გაშლილ მაგიდასთან"
|
||||
},
|
||||
"p5": {
|
||||
"title": "ფედორას მწუხარება",
|
||||
"description": "ბაყაყი სამოკვაკი ჩუკოვსკის ზღაპრიდან — მშვიდად უყურებს ჭურჭლის გაქცევას"
|
||||
},
|
||||
"c1": {
|
||||
"title": "თახვი",
|
||||
"description": "ქსოვილი თახვის ფიგურა კუდით — რბილი და მყუდრო"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "ციფრული ნახატი",
|
||||
"watercolorOnPaper": "აკვარელი ქაღალდზე",
|
||||
"inkOnPaper": "მელანი ქაღალდზე"
|
||||
"inkOnPaper": "მელანი ქაღალდზე",
|
||||
"cottonYarn": "ბამბის ძაფი"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "Рисунки тушью и акварелью, вдохновлённые сказками",
|
||||
"gallery": "Галерея иллюстраций",
|
||||
"artwork": "Иллюстрация"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "Вязаные изделия",
|
||||
"description": "Вязаные фигурки и игрушки ручной работы",
|
||||
"gallery": "Галерея вязаных изделий",
|
||||
"artwork": "Вязаное изделие"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "Зарисовки грибов",
|
||||
"description": "Тушевые этюды фантастических грибов — некоторые выше домов"
|
||||
},
|
||||
"p4": {
|
||||
"title": "С бобром за столом",
|
||||
"description": "Уютная сцена чаепития с бобром — сказочная дружба за накрытым столом"
|
||||
},
|
||||
"p5": {
|
||||
"title": "Федорино горе",
|
||||
"description": "Лягушка Самоквак из «Федорина горя» — наблюдает за бегством посуды с невозмутимым видом"
|
||||
},
|
||||
"c1": {
|
||||
"title": "Бобёр",
|
||||
"description": "Вязаная фигурка бобра с хвостом — мягкий и уютный"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "Цифровая живопись",
|
||||
"watercolorOnPaper": "Акварель на бумаге",
|
||||
"inkOnPaper": "Тушь на бумаге"
|
||||
"inkOnPaper": "Тушь на бумаге",
|
||||
"cottonYarn": "Хлопковая пряжа"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
"description": "Peri masallarından ilham alan el çizimi ve mürekkep illüstrasyonları",
|
||||
"gallery": "İllüstrasyon galerisi",
|
||||
"artwork": "İllüstrasyon"
|
||||
},
|
||||
"crochet": {
|
||||
"title": "Tığ İşi Figürler",
|
||||
"description": "El yapımı örgü figürler ve oyuncaklar",
|
||||
"gallery": "Tığ işi figürler galerisi",
|
||||
"artwork": "Tığ işi figür"
|
||||
}
|
||||
},
|
||||
"Artworks": {
|
||||
@@ -33,11 +39,24 @@
|
||||
"o2": {
|
||||
"title": "Mantar Eskizleri",
|
||||
"description": "Fantastik mantarların mürekkep çalışmaları — bazıları evlerden daha uzun"
|
||||
},
|
||||
"p4": {
|
||||
"title": "Kunduzla Çay Saati",
|
||||
"description": "Bir kunduzla keyifli bir çay sahnesi — masabaşında masalsı bir dostluk"
|
||||
},
|
||||
"p5": {
|
||||
"title": "Fedora'nın Kederi",
|
||||
"description": "Çukovski'nin masalından Samokvak kurbağası — bulaşıkların kaçışını sakince izliyor"
|
||||
},
|
||||
"c1": {
|
||||
"title": "Kunduz",
|
||||
"description": "Kuyruklu tığ işi kunduz figürü — yumuşak ve sevimli"
|
||||
}
|
||||
},
|
||||
"Mediums": {
|
||||
"digitalPainting": "Dijital resim",
|
||||
"watercolorOnPaper": "Kağıt üzerine suluboya",
|
||||
"inkOnPaper": "Kağıt üzerine mürekkep"
|
||||
"inkOnPaper": "Kağıt üzerine mürekkep",
|
||||
"cottonYarn": "Pamuk iplik"
|
||||
}
|
||||
}
|
||||
|
||||
+23
-23
@@ -2,7 +2,7 @@
|
||||
"name": "nini-artgallery",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@10.29.3",
|
||||
"packageManager": "pnpm@11.1.2",
|
||||
"scripts": {
|
||||
"dev": "next dev --turbopack",
|
||||
"build": "next build",
|
||||
@@ -11,37 +11,37 @@
|
||||
"lint:fix": "eslint --fix ."
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/react": "^3.0.87",
|
||||
"@ai-sdk/react": "^3.0.186",
|
||||
"@heroicons/react": "^2.2.0",
|
||||
"@openrouter/ai-sdk-provider": "^2.2.3",
|
||||
"@openrouter/ai-sdk-provider": "^2.9.0",
|
||||
"@types/jsonwebtoken": "^9.0.10",
|
||||
"@types/nodemailer": "^7.0.9",
|
||||
"ai": "^6.0.85",
|
||||
"@types/nodemailer": "^8.0.0",
|
||||
"ai": "^6.0.184",
|
||||
"jsonwebtoken": "^9.0.3",
|
||||
"next": "16.1.6",
|
||||
"next-intl": "^4.8.2",
|
||||
"nodemailer": "^8.0.1",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4",
|
||||
"next": "16.2.6",
|
||||
"next-intl": "^4.12.0",
|
||||
"nodemailer": "^8.0.7",
|
||||
"react": "19.2.6",
|
||||
"react-dom": "19.2.6",
|
||||
"server-only": "^0.0.1",
|
||||
"zod": "^4.3.6"
|
||||
"zod": "^4.4.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.3.3",
|
||||
"@eslint/js": "^10.0.1",
|
||||
"@tailwindcss/postcss": "^4.1.18",
|
||||
"@types/node": "^25.2.3",
|
||||
"@eslint/eslintrc": "^3.3.5",
|
||||
"@eslint/js": "^9.39.4",
|
||||
"@tailwindcss/postcss": "^4.3.0",
|
||||
"@types/node": "^25.8.0",
|
||||
"@types/react": "19.2.14",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
||||
"@typescript-eslint/parser": "^8.55.0",
|
||||
"eslint": "^10.0.0",
|
||||
"eslint-config-next": "16.1.6",
|
||||
"globals": "^17.3.0",
|
||||
"postcss": "^8.5.6",
|
||||
"@typescript-eslint/eslint-plugin": "^8.59.3",
|
||||
"@typescript-eslint/parser": "^8.59.3",
|
||||
"eslint": "^9.39.4",
|
||||
"eslint-config-next": "16.2.6",
|
||||
"globals": "^17.6.0",
|
||||
"postcss": "^8.5.14",
|
||||
"postcss-load-config": "^6.0.1",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"typescript": "^5.9.3"
|
||||
"tailwindcss": "^4.3.0",
|
||||
"typescript": "^6.0.3"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
|
||||
Generated
+949
-951
File diff suppressed because it is too large
Load Diff
+8
-1
@@ -1,4 +1,11 @@
|
||||
allowBuilds:
|
||||
'@parcel/watcher': true
|
||||
'@swc/core': true
|
||||
sharp: true
|
||||
unrs-resolver: true
|
||||
onlyBuiltDependencies:
|
||||
- "@tailwindcss/oxide"
|
||||
- "@parcel/watcher"
|
||||
- "@swc/core"
|
||||
- sharp
|
||||
- unrs-resolver
|
||||
- "@tailwindcss/oxide"
|
||||
|
||||
@@ -592,6 +592,14 @@ export default function ChatWidget({
|
||||
<div className="flex items-center justify-between rounded-t-xl border-b border-gray-200 bg-accent-600 px-4 py-3 dark:border-gray-700 dark:bg-accent-700">
|
||||
<h2 className="text-sm font-semibold text-white">{t("Chat.title")}</h2>
|
||||
<div className="flex items-center gap-2">
|
||||
<button
|
||||
onClick={onReset}
|
||||
className="text-white/80 hover:text-white transition-colors focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
aria-label={t("Chat.clearChat")}
|
||||
disabled={isLoading}
|
||||
>
|
||||
<TrashIcon className="h-5 w-5" />
|
||||
</button>
|
||||
<button
|
||||
onClick={() => setSettingsOpen((v) => !v)}
|
||||
className={`transition-colors focus:outline-none ${
|
||||
@@ -603,14 +611,6 @@ export default function ChatWidget({
|
||||
>
|
||||
<Cog6ToothIcon className="h-5 w-5" />
|
||||
</button>
|
||||
<button
|
||||
onClick={onReset}
|
||||
className="text-white/80 hover:text-white transition-colors focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
aria-label={t("Chat.clearChat")}
|
||||
disabled={isLoading}
|
||||
>
|
||||
<TrashIcon className="h-5 w-5" />
|
||||
</button>
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="text-white/80 hover:text-white transition-colors focus:outline-none"
|
||||
|
||||
Reference in New Issue
Block a user