[PIE-6] Add first (non-final) (temporary-ish) stylings #5

Merged
breadone merged 12 commits from PIE-6 into main 2025-08-12 23:39:33 +12:00
21 changed files with 507 additions and 22 deletions

View File

@ -1,4 +1,4 @@
PB_ADMIN_EMAIL=admin@example.com PB_ADMIN_EMAIL=admin@example.com
PB_ADMIN_PASSWORD=secret-password PB_ADMIN_PASSWORD=secret-password
PUBLIC_PB_URL=http://pb:8080 PUBLIC_URL=http://your.domain.tld/
PB_DATA_DIR=/pb/pb_data PB_DATA_DIR=/pb/pb_data

2
.gitignore vendored
View File

@ -9,7 +9,7 @@ node_modules
/dist /dist
/build /build
/data /data
/api/pb_data
# OS # OS
.DS_Store .DS_Store
Thumbs.db Thumbs.db

View File

@ -4,8 +4,10 @@ COPY package*.json ./
RUN npm i RUN npm i
COPY . . COPY . .
ENV PUBLIC_PB_URL=http://pb:8080 ENV PUBLIC_PB_URL=http://pb:8080
ENV PUBLIC_URL=http://localhost:4321
RUN npm run build RUN npm run build
EXPOSE 4321 EXPOSE 4321
CMD ["npm", "run", "preview", "--", "--host"] CMD ["npm", "run", "dev", "--", "--host"]
# CMD [ "node", "dist/sever/entry.mjs"]

View File

@ -12,6 +12,7 @@ set -e
# if there are no users yet, create the superuser # if there are no users yet, create the superuser
# we check the sqlite file for any existing record in the users table # we check the sqlite file for any existing record in the users table
/pb/pocketbase superuser create "${PB_ADMIN_EMAIL}" "${PB_ADMIN_PASSWORD}"
if [ ! -f "${PB_DATA_DIR}/pb_data.db" ] \ if [ ! -f "${PB_DATA_DIR}/pb_data.db" ] \
! sqlite3 "${PB_DATA_DIR}/data.db" \ ! sqlite3 "${PB_DATA_DIR}/data.db" \
"SELECT id FROM _superusers WHERE email='${PB_ADMIN_EMAIL}' LIMIT 1;" \ "SELECT id FROM _superusers WHERE email='${PB_ADMIN_EMAIL}' LIMIT 1;" \

View File

@ -0,0 +1,71 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = new Collection({
"createRule": null,
"deleteRule": null,
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"hidden": false,
"id": "file3309110367",
"maxSelect": 1,
"maxSize": 0,
"mimeTypes": [],
"name": "image",
"presentable": false,
"protected": false,
"required": false,
"system": false,
"thumbs": [],
"type": "file"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"id": "pbc_3607937828",
"indexes": [],
"listRule": null,
"name": "images",
"system": false,
"type": "base",
"updateRule": null,
"viewRule": null
});
return app.save(collection);
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_3607937828");
return app.delete(collection);
})

View File

@ -0,0 +1,122 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = new Collection({
"createRule": null,
"deleteRule": null,
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "text1579384326",
"max": 0,
"min": 0,
"name": "name",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "text1843675174",
"max": 0,
"min": 0,
"name": "description",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "number1239158968",
"max": null,
"min": null,
"name": "servings",
"onlyInt": false,
"presentable": false,
"required": false,
"system": false,
"type": "number"
},
{
"hidden": false,
"id": "number3632866850",
"max": null,
"min": null,
"name": "rating",
"onlyInt": false,
"presentable": false,
"required": false,
"system": false,
"type": "number"
},
{
"cascadeDelete": false,
"collectionId": "pbc_3607937828",
"hidden": false,
"id": "relation3760176746",
"maxSelect": 1,
"minSelect": 0,
"name": "images",
"presentable": false,
"required": false,
"system": false,
"type": "relation"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"id": "pbc_842702175",
"indexes": [],
"listRule": null,
"name": "recipes",
"system": false,
"type": "base",
"updateRule": null,
"viewRule": null
});
return app.save(collection);
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175");
return app.delete(collection);
})

View File

@ -0,0 +1,28 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// update collection data
unmarshal({
"createRule": "",
"deleteRule": "",
"listRule": "",
"updateRule": "",
"viewRule": ""
}, collection)
return app.save(collection)
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// update collection data
unmarshal({
"createRule": null,
"deleteRule": null,
"listRule": null,
"updateRule": null,
"viewRule": null
}, collection)
return app.save(collection)
})

View File

@ -0,0 +1,28 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = app.findCollectionByNameOrId("pbc_3607937828")
// update collection data
unmarshal({
"createRule": "",
"deleteRule": "",
"listRule": "",
"updateRule": "",
"viewRule": ""
}, collection)
return app.save(collection)
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_3607937828")
// update collection data
unmarshal({
"createRule": null,
"deleteRule": null,
"listRule": null,
"updateRule": null,
"viewRule": null
}, collection)
return app.save(collection)
})

View File

@ -0,0 +1,40 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// update field
collection.fields.addAt(5, new Field({
"cascadeDelete": false,
"collectionId": "pbc_3607937828",
"hidden": false,
"id": "relation3760176746",
"maxSelect": 999,
"minSelect": 0,
"name": "images",
"presentable": false,
"required": false,
"system": false,
"type": "relation"
}))
return app.save(collection)
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// update field
collection.fields.addAt(5, new Field({
"cascadeDelete": false,
"collectionId": "pbc_3607937828",
"hidden": false,
"id": "relation3760176746",
"maxSelect": 1,
"minSelect": 0,
"name": "images",
"presentable": false,
"required": false,
"system": false,
"type": "relation"
}))
return app.save(collection)
})

View File

@ -0,0 +1,71 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = new Collection({
"createRule": null,
"deleteRule": null,
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "text1579384326",
"max": 0,
"min": 0,
"name": "name",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "autodate3332085495",
"name": "updated",
"onCreate": true,
"onUpdate": true,
"presentable": false,
"system": false,
"type": "autodate"
}
],
"id": "pbc_1219621782",
"indexes": [],
"listRule": null,
"name": "tags",
"system": false,
"type": "base",
"updateRule": null,
"viewRule": null
});
return app.save(collection);
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_1219621782");
return app.delete(collection);
})

View File

@ -0,0 +1,28 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// add field
collection.fields.addAt(6, new Field({
"cascadeDelete": false,
"collectionId": "pbc_1219621782",
"hidden": false,
"id": "relation1874629670",
"maxSelect": 999,
"minSelect": 0,
"name": "tags",
"presentable": false,
"required": false,
"system": false,
"type": "relation"
}))
return app.save(collection)
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_842702175")
// remove field
collection.fields.removeById("relation1874629670")
return app.save(collection)
})

View File

@ -0,0 +1,28 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((app) => {
const collection = app.findCollectionByNameOrId("pbc_1219621782")
// update collection data
unmarshal({
"createRule": "",
"deleteRule": "",
"listRule": "",
"updateRule": "",
"viewRule": ""
}, collection)
return app.save(collection)
}, (app) => {
const collection = app.findCollectionByNameOrId("pbc_1219621782")
// update collection data
unmarshal({
"createRule": null,
"deleteRule": null,
"listRule": null,
"updateRule": null,
"viewRule": null
}, collection)
return app.save(collection)
})

View File

@ -5,6 +5,10 @@ import node from '@astrojs/node';
import tailwindcss from '@tailwindcss/vite'; import tailwindcss from '@tailwindcss/vite';
import { loadEnv } from "vite";
const { PUBLIC_PB_URL } = loadEnv(process.env.NODE_ENV, process.cwd(), "");
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
output: 'server', output: 'server',
@ -14,6 +18,17 @@ export default defineConfig({
}), }),
vite: { vite: {
plugins: [tailwindcss()] plugins: [tailwindcss()],
server: {
proxy: {
// The idea is to proxy the Pocketbase connection to the current domain so the user doesn't have to open two ports
// Currently works in dev (npm run dev -- --host) with the correct PUBLIC_URL var set but not through docker
'/api': {
target: PUBLIC_PB_URL,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/api'),
},
}
}
} }
}); });

View File

@ -2,6 +2,7 @@ services:
web: web:
build: . build: .
env_file: .env env_file: .env
network_mode: host
ports: ports:
- "4321:4321" - "4321:4321"
@ -9,8 +10,8 @@ services:
build: api build: api
env_file: .env env_file: .env
volumes: volumes:
- ./data/data:/pb/pb_data - ./api/pb_data:/pb/pb_data
- ./data/migrations:/pb/pb_migrations - ./api/pb_migrations:/pb/pb_migrations
- ./data/hooks:/pb/pb_hooks - ./api/pb_hooks:/pb/pb_hooks
ports: ports:
- "8080:8080" - "8080:8080"

View File

@ -3,7 +3,7 @@
"type": "module", "type": "module",
"version": "0.0.1", "version": "0.0.1",
"scripts": { "scripts": {
"dev": "astro dev", "dev": "docker compose up pb -d; astro dev --host",
"build": "astro build", "build": "astro build",
"preview": "astro preview", "preview": "astro preview",
"astro": "astro" "astro": "astro"

View File

@ -0,0 +1,27 @@
---
import client from "@/data/pocketbase"
const { recipe } = Astro.props;
const headerImage = await client.collection("images").getOne(recipe.images[0])
const image = await client.files.getURL(headerImage, headerImage.image)
---
<div class="relative z-0 flex h-60">
<img
class="w-full h-full object-cover rounded-xl"
src={ image }
/>
<div class="absolute bottom-0 left-0 w-full p-2 h-25 backdrop-filter backdrop-blur-lg rounded-b-xl">
<p class="text-[14pt] text-white opacity-90 font-bold" >{recipe.name}</p>
<p class="text-white text-[10pt]"> {recipe.description} </p>
<div class="flex flex-row">
{recipe.tags.map(async tag => (
<p class="text-white bg-white/20 px-2 mr-2 mt-2 rounded-md">{
(await client.collection("tags").getOne(tag)).name
}</p>
))}
</div>
</div>
</div>

View File

@ -0,0 +1,13 @@
<div class="flex w-full items-center bg-yellow-100 p-5">
<a class="flex" href="/">
<p class=" text-3xl">Reci</p>
<p class=" text-3xl text-amber-500">pie</p>
🥧
</a>
<div class="flex ml-10 space-x-5">
<!-- <span>new</span>
<span>sf</span> -->
</div>
</div>

View File

@ -1,4 +1,5 @@
import Pocketbase from "pocketbase" import Pocketbase from "pocketbase"
export const client = new Pocketbase(import.meta.env.PUBLIC_PB_URL) const client = new Pocketbase(import.meta.env.PUBLIC_URL)
// export const client = new Pocketbase("http://localhost:8080") client.autoCancellation(false)
export default client;

View File

@ -1,5 +1,6 @@
--- ---
import BaseHead from "../components/BaseHead.astro"; import BaseHead from "../components/BaseHead.astro";
import Header from "@/components/Header";
--- ---
<html lang=en> <html lang=en>
@ -8,6 +9,7 @@ import BaseHead from "../components/BaseHead.astro";
</head> </head>
<body> <body>
<main id="main" class="flex-1"> <main id="main" class="flex-1">
<Header/>
<slot /> <slot />
</main> </main>
</body> </body>

View File

@ -1,16 +1,22 @@
--- ---
import PageLayout from "@/layouts/base" import PageLayout from "@/layouts/base"
import { client } from "@/data/pocketbase" import client from "@/data/pocketbase"
import OverviewCard from "@/components/Card/OverviewCard"
const reccies = await client.collection("recipes").getFullList() const recipies = await client.collection("recipes").getFullList()
--- ---
<PageLayout> <PageLayout>
<p class="text-3xl font-medium">Recipie</p> <div id="content" class="p-5 pt-2">
<!-- <p class="pb-2">What would you like today?</p> -->
{
reccies.map(rec => ( <div class="grid gap-2 grid-cols-1 md:grid-cols-2 lg:grid-cols-4">
<p>{rec.name}</p> {
)) recipies.map(r => (
} <OverviewCard recipe={r} />
))
}
</div>
</div>
</PageLayout> </PageLayout>

View File

@ -1,6 +1,7 @@
@import "tailwindcss"; @import "tailwindcss";
html { html {
@apply bg-[#fefefe]; /* @apply bg-[#1d1f21]; */
@apply p-5; @apply bg-[#fafafa];
@apply font-stretch-condensed;
} }