init
This commit is contained in:
21
playground/.gitignore
vendored
Normal file
21
playground/.gitignore
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# build output
|
||||
dist/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
4
playground/.vscode/extensions.json
vendored
Normal file
4
playground/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"recommendations": ["astro-build.astro-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
||||
11
playground/.vscode/launch.json
vendored
Normal file
11
playground/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "./node_modules/.bin/astro dev",
|
||||
"name": "Development server",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
54
playground/README.md
Normal file
54
playground/README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Astro Starter Kit: Basics
|
||||
|
||||
```sh
|
||||
npm create astro@latest -- --template basics
|
||||
```
|
||||
|
||||
[](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
|
||||
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
|
||||

|
||||
|
||||
## 🚀 Project Structure
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
│ └── favicon.svg
|
||||
├── src/
|
||||
│ ├── components/
|
||||
│ │ └── Card.astro
|
||||
│ ├── layouts/
|
||||
│ │ └── Layout.astro
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
|
||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||
|
||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
|
||||
## 🧞 Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
||||
24
playground/astro.config.mts
Normal file
24
playground/astro.config.mts
Normal file
@@ -0,0 +1,24 @@
|
||||
import tailwind from "@astrojs/tailwind";
|
||||
import { createResolver } from "astro-integration-kit";
|
||||
import { hmrIntegration } from "astro-integration-kit/dev";
|
||||
import { defineConfig, envField } from "astro/config";
|
||||
|
||||
const { default: pocketbase } = await import("astro-pocketbase");
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
integrations: [
|
||||
tailwind(),
|
||||
pocketbase({ ignore: ["users"] }),
|
||||
hmrIntegration({
|
||||
directory: createResolver(import.meta.url).resolve("../package/dist"),
|
||||
}),
|
||||
],
|
||||
env: {
|
||||
schema: {
|
||||
ASTRO_POCKETBASE_ADMIN_EMAIL: envField.string({ context: "server", access: "secret" }),
|
||||
ASTRO_POCKETBASE_ADMIN_PASSWORD: envField.string({ context: "server", access: "secret" }),
|
||||
PUBLIC_ASTRO_POCKETBASE_URL: envField.string({ context: "server", access: "public" }),
|
||||
},
|
||||
},
|
||||
});
|
||||
30
playground/package.json
Normal file
30
playground/package.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "playground",
|
||||
"type": "module",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
"build": "astro check && astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@11ty/eleventy-fetch": "^5.0.1",
|
||||
"@astrojs/tailwind": "^5.1.4",
|
||||
"astro": "5.1.1",
|
||||
"astro-integration-kit": "^0.18.0",
|
||||
"astro-pocketbase": "workspace:*",
|
||||
"daisyui": "^4.12.22",
|
||||
"pocketbase": "<0.22.0",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"vite": "^6.0.5",
|
||||
"zod": "^3.24.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@astrojs/check": "^0.9.4",
|
||||
"@types/node": "^22.10.2",
|
||||
"typescript": "^5.7.2"
|
||||
}
|
||||
}
|
||||
9
playground/public/favicon.svg
Normal file
9
playground/public/favicon.svg
Normal file
@@ -0,0 +1,9 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
|
||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
|
||||
<style>
|
||||
path { fill: #000; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
path { fill: #FFF; }
|
||||
}
|
||||
</style>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 749 B |
25
playground/src/content/config.ts
Normal file
25
playground/src/content/config.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { defineCollection } from "astro:content";
|
||||
import { pocketbaseLoader } from "../lib/pocketbase/loader";
|
||||
import { ConfigRecord, ImagesRecord, KnowledgesRecord, PostsRecord } from "../lib/pocketbase/schemas";
|
||||
|
||||
const config = defineCollection({
|
||||
loader: pocketbaseLoader({ collection: "config" }),
|
||||
schema: ConfigRecord,
|
||||
});
|
||||
|
||||
const images = defineCollection({
|
||||
loader: pocketbaseLoader({ collection: "images" }),
|
||||
schema: ImagesRecord,
|
||||
});
|
||||
|
||||
const knowledges = defineCollection({
|
||||
loader: pocketbaseLoader({ collection: "knowledges" }),
|
||||
schema: KnowledgesRecord,
|
||||
});
|
||||
|
||||
const posts = defineCollection({
|
||||
loader: pocketbaseLoader({ collection: "posts" }),
|
||||
schema: PostsRecord,
|
||||
});
|
||||
|
||||
export const collections = { config, images, knowledges, posts };
|
||||
2
playground/src/env.d.ts
vendored
Normal file
2
playground/src/env.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/// <reference path="../.astro/types.d.ts" />
|
||||
/// <reference types="astro/client" />
|
||||
29
playground/src/layouts/main.astro
Normal file
29
playground/src/layouts/main.astro
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
import { ClientRouter } from "astro:transitions";
|
||||
|
||||
interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="description" content="Astro description" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title}</title>
|
||||
<ClientRouter />
|
||||
</head>
|
||||
<body>
|
||||
<nav>
|
||||
<a href="/">Posts</a>
|
||||
<a href="/knowledges">Knowledges</a>
|
||||
</nav>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
57
playground/src/lib/pocketbase/loader.ts
Normal file
57
playground/src/lib/pocketbase/loader.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
// This file was automatically generated by Astro PocketBase.
|
||||
|
||||
import type { Collection, TypedPocketbase } from "./schemas";
|
||||
import type { LoaderContext } from "astro/loaders";
|
||||
import Pocketbase, { type AdminAuthResponse } from "pocketbase";
|
||||
|
||||
let pocketbase: TypedPocketbase;
|
||||
let auth: Promise<AdminAuthResponse>;
|
||||
let isAuthenticating = false;
|
||||
|
||||
export function pocketbaseLoader({ collection }: PocketbaseLoaderOptions) {
|
||||
return {
|
||||
name: "pocketbase-loader",
|
||||
load: async ({ store, logger, meta, parseData }: LoaderContext) => {
|
||||
const { ASTRO_POCKETBASE_ADMIN_EMAIL, ASTRO_POCKETBASE_ADMIN_PASSWORD, PUBLIC_ASTRO_POCKETBASE_URL } = import.meta.env;
|
||||
if (!ASTRO_POCKETBASE_ADMIN_EMAIL || !ASTRO_POCKETBASE_ADMIN_PASSWORD || !PUBLIC_ASTRO_POCKETBASE_URL)
|
||||
return logger.error("Environment variables not set");
|
||||
|
||||
logger.info(`Loading ${collection}`);
|
||||
|
||||
if (!pocketbase) pocketbase = new Pocketbase(PUBLIC_ASTRO_POCKETBASE_URL);
|
||||
|
||||
try {
|
||||
if (!isAuthenticating && !pocketbase.authStore.isValid) {
|
||||
isAuthenticating = true;
|
||||
auth = pocketbase.admins.authWithPassword(ASTRO_POCKETBASE_ADMIN_EMAIL, ASTRO_POCKETBASE_ADMIN_PASSWORD);
|
||||
}
|
||||
await auth;
|
||||
|
||||
const lastUpdatedItems = await pocketbase
|
||||
.collection(collection)
|
||||
.getList(1, 1, { fields: "updated", skipTotal: true, sort: "updated", order: "desc" });
|
||||
const lastUpdated = lastUpdatedItems.items[0]?.updated;
|
||||
|
||||
if (lastUpdated !== meta.get("last-updated")) {
|
||||
logger.info(`Refreshing ${collection}`);
|
||||
|
||||
meta.set("last-updated", lastUpdated);
|
||||
const items = await pocketbase.collection(collection).getFullList();
|
||||
for (const { id, updated, ...rest } of items) {
|
||||
const data = await parseData({ id, data: { id, updated, ...rest } });
|
||||
store.set({ data, digest: updated, id });
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`Loaded ${collection}`);
|
||||
} catch (error) {
|
||||
logger.error(`Error fetching ${collection}: ${error}`);
|
||||
return;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export type PocketbaseLoaderOptions = {
|
||||
collection: Collection;
|
||||
};
|
||||
17
playground/src/lib/pocketbase/middleware.ts
Normal file
17
playground/src/lib/pocketbase/middleware.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
// This file was automatically generated by Astro PocketBase.
|
||||
|
||||
import { defineMiddleware } from "astro:middleware";
|
||||
import { helpersFrom } from "astro-pocketbase";
|
||||
import PocketBase from "pocketbase";
|
||||
|
||||
const middleware = defineMiddleware((context, next) => {
|
||||
const pocketbase = new PocketBase(import.meta.env.PUBLIC_ASTRO_POCKETBASE_URL);
|
||||
const { getRecord, getRecords } = helpersFrom({ pocketbase });
|
||||
context.locals.pocketbase = pocketbase;
|
||||
context.locals.getRecord = getRecord;
|
||||
context.locals.getRecords = getRecords;
|
||||
return next();
|
||||
});
|
||||
|
||||
// You should NOT change the exported name as it is used by the Astro PocketBase integration.
|
||||
export { middleware as onRequest };
|
||||
200
playground/src/lib/pocketbase/schemas.ts
Normal file
200
playground/src/lib/pocketbase/schemas.ts
Normal file
@@ -0,0 +1,200 @@
|
||||
import type Pocketbase from "pocketbase";
|
||||
import type { RecordService } from "pocketbase";
|
||||
import { z } from "zod";
|
||||
|
||||
/******* ENUMS *******/
|
||||
export const collectionValues = [
|
||||
"config",
|
||||
"events",
|
||||
"images",
|
||||
"knowledges",
|
||||
"pages",
|
||||
"places",
|
||||
"posts",
|
||||
"products",
|
||||
"services",
|
||||
"testimonies",
|
||||
] as const;
|
||||
export const Collection = z.enum(collectionValues);
|
||||
export type Collection = z.infer<typeof Collection>;
|
||||
export const COLLECTION = Collection.enum;
|
||||
|
||||
export const servicesCategoryValues = [
|
||||
"consult",
|
||||
"training",
|
||||
"workshop",
|
||||
] as const;
|
||||
export const ServicesCategory = z.enum(servicesCategoryValues);
|
||||
export type ServicesCategory = z.infer<typeof ServicesCategory>;
|
||||
export const SERVICES_CATEGORY = ServicesCategory.enum;
|
||||
|
||||
/******* BASE *******/
|
||||
export const BaseModel = z.object({
|
||||
created: z.string().pipe(z.coerce.date()),
|
||||
id: z.string(),
|
||||
updated: z.string().pipe(z.coerce.date()),
|
||||
});
|
||||
export type BaseModel = z.infer<typeof BaseModel>;
|
||||
|
||||
export const AdminModel = z.object({
|
||||
...BaseModel.shape,
|
||||
avatar: z.string(),
|
||||
email: z.string().email(),
|
||||
});
|
||||
export type AdminModel = z.infer<typeof AdminModel>;
|
||||
|
||||
export const RecordModel = z.object({
|
||||
...BaseModel.shape,
|
||||
collectionId: z.string(),
|
||||
collectionName: z.string(),
|
||||
expand: z.any().optional(),
|
||||
});
|
||||
export type RecordModel = z.infer<typeof RecordModel>;
|
||||
|
||||
/******* RECORDS *******/
|
||||
export const ConfigRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("config"),
|
||||
city: z.string(),
|
||||
email: z.string().email(),
|
||||
facebook: z.string().url(),
|
||||
instagram: z.string().url(),
|
||||
phone: z.string(),
|
||||
street: z.string(),
|
||||
title: z.string(),
|
||||
website: z.string().url(),
|
||||
zipcode: z.string(),
|
||||
});
|
||||
export type ConfigRecord = z.infer<typeof ConfigRecord>;
|
||||
|
||||
export const EventsRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("events"),
|
||||
excerpt: z.string(),
|
||||
from: z.string().pipe(z.coerce.date()),
|
||||
image: z.string(),
|
||||
name: z.string(),
|
||||
places: z.string().array(),
|
||||
service: z.string(),
|
||||
slug: z.string(),
|
||||
to: z.string().pipe(z.coerce.date()),
|
||||
url: z.string().url(),
|
||||
});
|
||||
export type EventsRecord = z.infer<typeof EventsRecord>;
|
||||
|
||||
export const ImagesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("images"),
|
||||
alt: z.string(),
|
||||
height: z.number().int(),
|
||||
src: z.string(),
|
||||
width: z.number().int(),
|
||||
});
|
||||
export type ImagesRecord = z.infer<typeof ImagesRecord>;
|
||||
|
||||
export const KnowledgesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("knowledges"),
|
||||
image: z.string(),
|
||||
name: z.string(),
|
||||
slug: z.string(),
|
||||
text: z.string(),
|
||||
});
|
||||
export type KnowledgesRecord = z.infer<typeof KnowledgesRecord>;
|
||||
|
||||
export const PagesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("pages"),
|
||||
knowledge: z.string(),
|
||||
post: z.string(),
|
||||
services: z.string().array().optional(),
|
||||
slug: z.string(),
|
||||
testimoniesImage: z.string().transform((id) => id === "" ? undefined : id).optional(),
|
||||
title: z.string(),
|
||||
});
|
||||
export type PagesRecord = z.infer<typeof PagesRecord>;
|
||||
|
||||
export const PlacesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("places"),
|
||||
name: z.string(),
|
||||
slug: z.string(),
|
||||
});
|
||||
export type PlacesRecord = z.infer<typeof PlacesRecord>;
|
||||
|
||||
export const PostsRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("posts"),
|
||||
excerpt: z.string(),
|
||||
image: z.string().transform((id) => id === "" ? undefined : id).optional(),
|
||||
knowledge: z.string(),
|
||||
slug: z.string(),
|
||||
text: z.string(),
|
||||
title: z.string(),
|
||||
});
|
||||
export type PostsRecord = z.infer<typeof PostsRecord>;
|
||||
|
||||
export const ProductsRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("products"),
|
||||
excerpt: z.string(),
|
||||
image: z.string(),
|
||||
name: z.string(),
|
||||
price: z.string(),
|
||||
slug: z.string(),
|
||||
text: z.string(),
|
||||
url: z.string().url(),
|
||||
});
|
||||
export type ProductsRecord = z.infer<typeof ProductsRecord>;
|
||||
|
||||
export const ServicesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("services"),
|
||||
category: ServicesCategory,
|
||||
duration: z.string(),
|
||||
excerpt: z.string(),
|
||||
image: z.string(),
|
||||
knowledge: z.string(),
|
||||
name: z.string(),
|
||||
places: z.string().array(),
|
||||
price: z.string(),
|
||||
slug: z.string(),
|
||||
text: z.string(),
|
||||
});
|
||||
export type ServicesRecord = z.infer<typeof ServicesRecord>;
|
||||
|
||||
export const TestimoniesRecord = z.object({
|
||||
...RecordModel.omit({ expand: true }).shape,
|
||||
collectionName: z.literal("testimonies"),
|
||||
author: z.string(),
|
||||
text: z.string(),
|
||||
title: z.string(),
|
||||
});
|
||||
export type TestimoniesRecord = z.infer<typeof TestimoniesRecord>;
|
||||
|
||||
export const records = new Map<Collection, z.AnyZodObject>([
|
||||
["config", ConfigRecord],
|
||||
["events", EventsRecord],
|
||||
["images", ImagesRecord],
|
||||
["knowledges", KnowledgesRecord],
|
||||
["pages", PagesRecord],
|
||||
["places", PlacesRecord],
|
||||
["posts", PostsRecord],
|
||||
["products", ProductsRecord],
|
||||
["services", ServicesRecord],
|
||||
["testimonies", TestimoniesRecord],
|
||||
]);
|
||||
|
||||
/******* CLIENT *******/
|
||||
export type TypedPocketbase = Pocketbase & {
|
||||
collection(idOrName: "config"): RecordService<z.input<typeof ConfigRecord>>;
|
||||
collection(idOrName: "events"): RecordService<z.input<typeof EventsRecord>>;
|
||||
collection(idOrName: "images"): RecordService<z.input<typeof ImagesRecord>>;
|
||||
collection(idOrName: "knowledges"): RecordService<z.input<typeof KnowledgesRecord>>;
|
||||
collection(idOrName: "pages"): RecordService<z.input<typeof PagesRecord>>;
|
||||
collection(idOrName: "places"): RecordService<z.input<typeof PlacesRecord>>;
|
||||
collection(idOrName: "posts"): RecordService<z.input<typeof PostsRecord>>;
|
||||
collection(idOrName: "products"): RecordService<z.input<typeof ProductsRecord>>;
|
||||
collection(idOrName: "services"): RecordService<z.input<typeof ServicesRecord>>;
|
||||
collection(idOrName: "testimonies"): RecordService<z.input<typeof TestimoniesRecord>>;
|
||||
};
|
||||
10
playground/src/pages/index.astro
Normal file
10
playground/src/pages/index.astro
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
import Layout from "../layouts/main.astro";
|
||||
import { getCollection } from "astro:content";
|
||||
|
||||
const posts = await getCollection("posts");
|
||||
---
|
||||
|
||||
<Layout title="Welcome to Astro.">
|
||||
{posts.map(({ data }) => <p>{data.title}</p>)}
|
||||
</Layout>
|
||||
10
playground/src/pages/knowledges.astro
Normal file
10
playground/src/pages/knowledges.astro
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
import Layout from "../layouts/main.astro";
|
||||
import { getCollection } from "astro:content";
|
||||
|
||||
const knowledges = await getCollection("knowledges");
|
||||
---
|
||||
|
||||
<Layout title="Welcome to Astro.">
|
||||
{knowledges.map(({ data }) => <p>{data.name}</p>)}
|
||||
</Layout>
|
||||
10
playground/tailwind.config.ts
Normal file
10
playground/tailwind.config.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import daisyui from "daisyui";
|
||||
import type { Config } from "tailwindcss";
|
||||
|
||||
export default {
|
||||
content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [daisyui],
|
||||
} satisfies Config;
|
||||
7
playground/tsconfig.json
Normal file
7
playground/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "astro/tsconfigs/strict",
|
||||
"compilerOptions": {
|
||||
"jsx": "preserve"
|
||||
},
|
||||
"exclude": ["dist"]
|
||||
}
|
||||
Reference in New Issue
Block a user