diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fcd9738..56c6955 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,23 +24,16 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: '22' - - - name: Cache pnpm modules - uses: actions/cache@v2 + - uses: pnpm/action-setup@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- + version: 10 + run_install: true - - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - version: 9 - run_install: true + node-version: '22' + cache: 'pnpm' - name: Build client working-directory: packages/client/ @@ -52,7 +45,7 @@ jobs: # install app again to respect shamefully hoisted dependencies - name: Build app - working-directory: packages/app/ + working-directory: packages/web/ run: | pnpm install pnpm build @@ -92,24 +85,17 @@ jobs: git config --global user.name "$(git --no-pager log --format=format:'%an' -n 1)" git config --global user.email "$(git --no-pager log --format=format:'%ae' -n 1)" + - uses: pnpm/action-setup@v4 + with: + version: 10 + run_install: true + - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '22' registry-url: 'https://registry.npmjs.org' - - - name: Cache pnpm modules - uses: actions/cache@v2 - with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- - - - uses: pnpm/action-setup@v2 - with: - version: 9 - run_install: true + cache: 'pnpm' - name: Build working-directory: packages/client/ diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dd2f71d..934f06b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,23 +17,16 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Cache pnpm modules - uses: actions/cache@v2 + - uses: pnpm/action-setup@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- + version: 10 + run_install: true - - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - version: 9 - run_install: true + node-version: '22' + cache: 'pnpm' - name: Unit test run: pnpm run -r test @@ -47,23 +40,16 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Cache pnpm modules - uses: actions/cache@v2 + - uses: pnpm/action-setup@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- + version: 10 + run_install: true - - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - version: 9 - run_install: true + node-version: '22' + cache: 'pnpm' - name: Build client working-directory: packages/client/ @@ -71,7 +57,7 @@ jobs: # install app again to respect shamefully hoisted dependencies - name: Install app - working-directory: packages/app/ + working-directory: packages/web/ run: pnpm install - name: Typecheck @@ -86,23 +72,16 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Cache pnpm modules - uses: actions/cache@v2 + - uses: pnpm/action-setup@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- + version: 10 + run_install: true - - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - version: 9 - run_install: true + node-version: '22' + cache: 'pnpm' # needed to prepare the auto-generated files for the client package - name: Build client @@ -121,23 +100,16 @@ jobs: with: fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: '22' - - - name: Cache pnpm modules - uses: actions/cache@v2 + - uses: pnpm/action-setup@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}- + version: 10 + run_install: true - - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - version: 9 - run_install: true + node-version: '22' + cache: 'pnpm' - name: Check format run: pnpm run format:check diff --git a/Dockerfile b/Dockerfile index e433ae7..eb15880 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM node:18-alpine as overmind +FROM node:22.17.1-alpine AS overmind WORKDIR /app RUN apk add --update curl gzip RUN curl https://github.com/DarthSim/overmind/releases/download/v2.4.0/overmind-v2.4.0-linux-amd64.gz -L -o overmind.gz RUN gunzip overmind.gz RUN chmod +x overmind -FROM node:18-alpine +FROM node:22.17.1-alpine ENV NODE_ENV=production ENV DATA_PATH=/app/data RUN apk --no-cache add ca-certificates tmux @@ -27,4 +27,4 @@ RUN mkdir -p /static ENV NUXT_PUBLIC_API_CLIENT_BASE_URL=/api COPY ./packages/app/.output .output -RUN chown -R node:node /app \ No newline at end of file +RUN chown -R node:node /app diff --git a/README.md b/README.md index 82b90cc..5969490 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,5 @@ pnpm i cp .env.example .env # start the server -pnpm start +pnpm run dev ``` diff --git a/docker-compose.yml b/docker-compose.yml index 3bf0ecd..f9cd214 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3' - services: # app: # build: . diff --git a/package.json b/package.json index f296564..01f5bed 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,23 @@ "scripts": { "format:check": "prettier --check .", "format:fix": "prettier --write .", - "start": "pnpm --parallel start" + "dev": "pnpm --parallel dev" }, "devDependencies": { "prettier": "^2.5.1" }, "engines": { - "node": ">=16", - "pnpm": "9" + "node": ">=22", + "pnpm": "10" }, "pnpm": { - "overrides": { - "ufo": "^1.3.1", - "nuxt": "3.7.4" - } + "overrides": {}, + "ignoredBuiltDependencies": [ + "@parcel/watcher", + "@tailwindcss/oxide", + "esbuild", + "ngrok", + "vue-demi" + ] } } diff --git a/packages/app/app.config.ts b/packages/app/app.config.ts deleted file mode 100644 index 970e617..0000000 --- a/packages/app/app.config.ts +++ /dev/null @@ -1,73 +0,0 @@ -export default defineAppConfig({ - ui: { - primary: 'zinc', - input: { - default: { - size: 'lg', - }, - }, - select: { - default: { - size: 'lg', - }, - }, - selectMenu: { - default: { - size: 'lg', - }, - }, - button: { - default: { - size: 'lg', - }, - }, - card: { - background: 'bg-white dark:bg-zinc-900', - ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', - divide: 'divide-y divide-zinc-200 dark:divide-zinc-800', - }, - popover: { - background: 'bg-white dark:bg-zinc-900', - ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', - }, - table: { - divide: 'divide-y divide-zinc-300 dark:divide-zinc-700', - tbody: 'divide-y divide-zinc-200 dark:divide-zinc-800', - tr: { - selected: 'bg-zinc-50 dark:bg-zinc-800/50', - active: 'hover:bg-zinc-50 dark:hover:bg-zinc-800/50 cursor-pointer', - }, - th: { - color: 'text-zinc-900 dark:text-white', - }, - td: { - color: 'text-zinc-500 dark:text-zinc-400', - }, - loadingState: { - label: 'text-sm text-center text-zinc-900 dark:text-white', - icon: 'w-6 h-6 mx-auto text-zinc-400 dark:text-zinc-500 mb-4 animate-spin', - }, - emptyState: { - label: 'text-sm text-center text-zinc-900 dark:text-white', - icon: 'w-6 h-6 mx-auto text-zinc-400 dark:text-zinc-500 mb-4', - }, - }, - dropdown: { - background: 'bg-white dark:bg-zinc-800', - ring: 'ring-1 ring-zinc-200 dark:ring-zinc-700', - divide: 'divide-y divide-zinc-200 dark:divide-zinc-700', - item: { - active: 'bg-zinc-100 dark:bg-zinc-900 text-zinc-900 dark:text-white', - inactive: 'text-zinc-700 dark:text-zinc-200', - icon: { - active: 'text-zinc-500 dark:text-zinc-400', - inactive: 'text-zinc-400 dark:text-zinc-500', - }, - }, - }, - notification: { - background: 'bg-white dark:bg-zinc-900', - ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', - }, - }, -}); diff --git a/packages/app/package.json b/packages/app/package.json deleted file mode 100644 index 722a717..0000000 --- a/packages/app/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@geprog/gringotts-app", - "private": true, - "scripts": { - "build": "nuxt build", - "start": "nuxt dev", - "generate": "nuxt generate", - "preview": "nuxt preview", - "postinstall": "nuxt prepare", - "typecheck": "vue-tsc --noEmit" - }, - "devDependencies": { - "@iconify/json": "^2.2.130", - "@nuxt/devtools": "latest", - "@nuxt/ui": "^2.9.0", - "@nuxtjs/tailwindcss": "^6.8.0", - "@types/node": "^18.16.19", - "nuxt": "^3.7.4", - "nuxt-icon": "^0.5.0", - "typescript": "^5.1.6", - "vue-tsc": "^1.8.21" - }, - "dependencies": { - "@geprog/gringotts-client": "workspace:*", - "@pinia/nuxt": "^0.5.1", - "@popperjs/core": "^2.11.8", - "cross-fetch": "^4.0.0", - "dayjs": "^1.11.10", - "pinia": "^2.1.7", - "v-calendar": "^3.1.2" - } -} diff --git a/packages/app/pages/customers/index.vue b/packages/app/pages/customers/index.vue deleted file mode 100644 index c266a65..0000000 --- a/packages/app/pages/customers/index.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/packages/app/pages/invoices/index.vue b/packages/app/pages/invoices/index.vue deleted file mode 100644 index 02984c7..0000000 --- a/packages/app/pages/invoices/index.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/packages/app/pages/payments/index.vue b/packages/app/pages/payments/index.vue deleted file mode 100644 index fec755d..0000000 --- a/packages/app/pages/payments/index.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/packages/app/pages/subscriptions/index.vue b/packages/app/pages/subscriptions/index.vue deleted file mode 100644 index c91aeb6..0000000 --- a/packages/app/pages/subscriptions/index.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/packages/app/server/tsconfig.json b/packages/app/server/tsconfig.json deleted file mode 100644 index b9ed69c..0000000 --- a/packages/app/server/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../.nuxt/tsconfig.server.json" -} diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json deleted file mode 100644 index a746f2a..0000000 --- a/packages/app/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - // https://nuxt.com/docs/guide/concepts/typescript - "extends": "./.nuxt/tsconfig.json" -} diff --git a/packages/client/package.json b/packages/client/package.json index 20c85d9..4893649 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -5,7 +5,8 @@ "exports": { ".": { "import": "./dist/index.mjs", - "require": "./dist/index.js" + "require": "./dist/index.js", + "types": "./dist/index.d.ts" } }, "main": "./dist/index.js", @@ -15,7 +16,7 @@ "/dist" ], "scripts": { - "generate:api": "pnpm --filter ../server generate-swagger-spec && swagger-typescript-api -p ../server/swagger.json -o ./src -n api.ts", + "generate:api": "pnpm --filter ../server generate-swagger-spec && swagger-typescript-api generate -p ../server/swagger.json -o ./src -n api.ts", "generate:docs": "typedoc ./src/index.ts", "build": "pnpm generate:api && tsup src/index.ts --dts --format cjs,esm", "clean": "rm -rf dist/ node_modules/", @@ -24,12 +25,12 @@ }, "devDependencies": { "@types/jsonwebtoken": "^8.5.8", - "@types/node": "^18.6.0", + "@types/node": "^22.17.0", "c8": "^7.12.0", "eslint": "^8.20.0", - "swagger-typescript-api": "^9.3.1", + "swagger-typescript-api": "^13.2.9", "tsup": "^6.1.3", - "typedoc": "^0.23.8", - "typescript": "^4.7.4" + "typedoc": "^0.28.12", + "typescript": "^5.9.2" } } diff --git a/packages/server/package.json b/packages/server/package.json index c7a5432..28e4e5c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -4,7 +4,7 @@ "description": "Server of the Gringotts system", "main": "./dist/index.js", "scripts": { - "start": "tsx watch src/index.ts", + "dev": "tsx watch src/index.ts", "build": "tsx cli/build.ts", "clean": "rm -rf dist/ node_modules/", "lint": "eslint --max-warnings 0 .", @@ -14,12 +14,12 @@ "generate-swagger-spec": "tsx cli/generate-swagger-spec.ts" }, "dependencies": { - "@fastify/cors": "^8.3.0", - "@fastify/formbody": "^7.0.1", - "@fastify/reply-from": "^9.4.0", - "@fastify/static": "^6.11.2", - "@fastify/swagger": "^7.4.1", - "@fastify/view": "^7.1.0", + "@fastify/cors": "^11.1.0", + "@fastify/formbody": "^8.0.2", + "@fastify/reply-from": "^12.3.1", + "@fastify/static": "^8.2.0", + "@fastify/swagger": "^9.5.1", + "@fastify/view": "^11.1.1", "@mikro-orm/core": "^5.6.11", "@mikro-orm/migrations": "^5.6.11", "@mikro-orm/postgresql": "^5.6.11", @@ -28,7 +28,7 @@ "cross-fetch": "^3.1.5", "dayjs": "^1.11.4", "dotenv": "^16.0.1", - "fastify": "^4.3.0", + "fastify": "^5.6.0", "form-data": "^4.0.0", "got": "^12.2.0", "handlebars": "^4.7.7", @@ -38,14 +38,14 @@ "nodemailer": "^6.9.7", "pg": "^8.7.3", "pg-hstore": "^2.3.4", - "pino": "^8.11.0", + "pino": "^9.9.5", "prettier": "^2.5.1", "uuid": "^8.3.2" }, "devDependencies": { "@geprog/eslint-config": "^1.1.0", "@types/jsonwebtoken": "^8.5.8", - "@types/node": "^18.6.0", + "@types/node": "^22.17.0", "@types/nodemailer": "^6.4.14", "@types/uuid": "^8.3.4", "@vitest/coverage-c8": "^0.29.7", @@ -53,8 +53,8 @@ "esbuild": "^0.14.49", "eslint": "^8.20.0", "pino-pretty": "^9.0.0", - "tsx": "^4.7.0", - "typescript": "^4.7.4", + "tsx": "^4.20.5", + "typescript": "^5.9.2", "vite": "^4.2.0", "vitest": "^0.29.3" } diff --git a/packages/server/src/api/endpoints/customer.ts b/packages/server/src/api/endpoints/customer.ts index 08b207e..3d8a36b 100644 --- a/packages/server/src/api/endpoints/customer.ts +++ b/packages/server/src/api/endpoints/customer.ts @@ -198,6 +198,9 @@ export async function customerEndpoints(server: FastifyInstance): Promise 404: { $ref: 'ErrorResponse', }, + 500: { + $ref: 'ErrorResponse', + }, }, }, handler: async (request, reply) => { @@ -269,6 +272,9 @@ export async function customerEndpoints(server: FastifyInstance): Promise 404: { $ref: 'ErrorResponse', }, + 500: { + $ref: 'ErrorResponse', + }, }, }, handler: async (request, reply) => { diff --git a/packages/server/src/api/endpoints/index.ts b/packages/server/src/api/endpoints/index.ts index f94f245..b66b1c1 100644 --- a/packages/server/src/api/endpoints/index.ts +++ b/packages/server/src/api/endpoints/index.ts @@ -18,15 +18,15 @@ export async function apiEndpoints(server: FastifyInstance): Promise { return; } - if (request.routerPath === '/api/invoice/download') { + if (request.routeOptions.url === '/api/invoice/download') { return; } - if (request.routerPath === '/api/payment/webhook/:projectId') { + if (request.routeOptions.url === '/api/payment/webhook/:projectId') { return; } - if (request.routerPath === '/api/mocked/checkout/:paymentId') { + if (request.routeOptions.url === '/api/mocked/checkout/:paymentId') { return; } @@ -37,7 +37,7 @@ export async function apiEndpoints(server: FastifyInstance): Promise { return reply; } - if (request.routerPath?.startsWith('/api/project') && request.url !== '/api/project/token-project') { + if (request.routeOptions.url?.startsWith('/api/project') && request.url !== '/api/project/token-project') { if (apiToken === config.adminToken) { request.admin = true; return; diff --git a/packages/server/src/api/endpoints/invoice.ts b/packages/server/src/api/endpoints/invoice.ts index ad1c235..e75ce23 100644 --- a/packages/server/src/api/endpoints/invoice.ts +++ b/packages/server/src/api/endpoints/invoice.ts @@ -50,6 +50,9 @@ export async function invoiceEndpoints(server: FastifyInstance): Promise { 200: { $ref: 'Invoice', }, + 400: { + $ref: 'ErrorResponse', + }, 404: { $ref: 'ErrorResponse', }, diff --git a/packages/server/src/api/endpoints/mocked_checkout.ts b/packages/server/src/api/endpoints/mocked_checkout.ts index 69a0596..5446f82 100644 --- a/packages/server/src/api/endpoints/mocked_checkout.ts +++ b/packages/server/src/api/endpoints/mocked_checkout.ts @@ -75,6 +75,9 @@ export async function mockedCheckoutEndpoints(server: FastifyInstance): Promise< 400: { $ref: 'ErrorResponse', }, + 404: { + $ref: 'ErrorResponse', + }, 500: { $ref: 'ErrorResponse', }, diff --git a/packages/server/src/api/endpoints/payment.ts b/packages/server/src/api/endpoints/payment.ts index c0336a1..09e85b4 100644 --- a/packages/server/src/api/endpoints/payment.ts +++ b/packages/server/src/api/endpoints/payment.ts @@ -47,6 +47,9 @@ export async function paymentEndpoints(server: FastifyInstance): Promise { 200: { $ref: 'Payment', }, + 400: { + $ref: 'ErrorResponse', + }, 404: { $ref: 'ErrorResponse', }, diff --git a/packages/server/src/api/endpoints/payment_method.ts b/packages/server/src/api/endpoints/payment_method.ts index e167d03..321a2d2 100644 --- a/packages/server/src/api/endpoints/payment_method.ts +++ b/packages/server/src/api/endpoints/payment_method.ts @@ -196,6 +196,9 @@ export async function paymentMethodEndpoints(server: FastifyInstance): Promise static files -> nuxt -> 404 export async function init(): Promise { - const logger = - process.env.NODE_ENV === 'test' - ? pino( - {}, - { - // eslint-disable-next-line no-console - write: (data: string) => console.log(data), - }, - ) - : log; - const server = fastify({ - logger, + logger: { + level: process.env.LOG_LEVEL || 'info', + transport: + process.env.NODE_ENV === 'production' + ? undefined + : { + target: 'pino-pretty', + options: { + translateTime: 'HH:MM:ss Z', + ignore: 'pid,hostname', + }, + }, + }, // disableRequestLogging: process.env.NODE_ENV === 'production', disableRequestLogging: true, }); @@ -93,7 +93,6 @@ export async function init(): Promise { ); await server.register(fastifySwagger, { - routePrefix: '/docs', swagger: { info: { title: 'Gringotts api', @@ -122,7 +121,6 @@ export async function init(): Promise { return json.$id as string; }, }, - exposeRoute: true, }); addSchemas(server); diff --git a/packages/server/src/log.ts b/packages/server/src/log.ts deleted file mode 100644 index 7cb9459..0000000 --- a/packages/server/src/log.ts +++ /dev/null @@ -1,15 +0,0 @@ -import pino from 'pino'; - -export const log = pino({ - level: process.env.LOG_LEVEL || 'info', - transport: - process.env.NODE_ENV === 'production' - ? undefined - : { - target: 'pino-pretty', - options: { - translateTime: 'HH:MM:ss Z', - ignore: 'pid,hostname', - }, - }, -}); diff --git a/packages/server/src/loop.ts b/packages/server/src/loop.ts index 9e5ea9d..5f4f94e 100644 --- a/packages/server/src/loop.ts +++ b/packages/server/src/loop.ts @@ -165,7 +165,7 @@ export async function chargeSubscriptions(): Promise { 'Subscription charged & invoiced', ); } catch (e) { - log.error('Error while subscription charging:', e); + log.error(e, 'Error while subscription charging:'); subscription.status = 'error'; subscription.error = (e as Error)?.message || (e as string); await database.em.persistAndFlush([subscription]); @@ -202,7 +202,7 @@ export async function chargePendingInvoices(): Promise { try { await chargeCustomerInvoice(invoice); } catch (e) { - log.error('Error while invoice charging:', e); + log.error(e, 'Error while invoice charging:'); invoice.status = 'failed'; if (invoice.subscription) { diff --git a/packages/server/src/mail/index.ts b/packages/server/src/mail/index.ts index 0c27b3a..2a38060 100644 --- a/packages/server/src/mail/index.ts +++ b/packages/server/src/mail/index.ts @@ -36,7 +36,7 @@ export async function sendInvoiceMail(invoice: Invoice, customer: Customer): Pro } if (invoice.totalAmount === 0) { - log.debug('Skipping sending mail for 0 amount invoice', { invoiceId: invoice._id }); + log.debug({ invoiceId: invoice._id }, 'Skipping sending mail for 0 amount invoice'); return; } diff --git a/packages/app/.gitignore b/packages/web/.gitignore similarity index 100% rename from packages/app/.gitignore rename to packages/web/.gitignore diff --git a/packages/app/.npmrc b/packages/web/.npmrc similarity index 58% rename from packages/app/.npmrc rename to packages/web/.npmrc index cf04042..319e41e 100644 --- a/packages/app/.npmrc +++ b/packages/web/.npmrc @@ -1,2 +1 @@ -shamefully-hoist=true strict-peer-dependencies=false diff --git a/packages/web/app/app.config.ts b/packages/web/app/app.config.ts new file mode 100644 index 0000000..549a583 --- /dev/null +++ b/packages/web/app/app.config.ts @@ -0,0 +1,73 @@ +export default defineAppConfig({ + ui: { + primary: 'zinc', + input: { + defaultVariants: { + size: 'lg', + }, + }, + select: { + defaultVariants: { + size: 'lg', + }, + }, + selectMenu: { + defaultVariants: { + size: 'lg', + }, + }, + button: { + defaultVariants: { + size: 'lg', + }, + }, + card: { + // background: 'bg-white dark:bg-zinc-900', + // ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', + // divide: 'divide-y divide-zinc-200 dark:divide-zinc-800', + }, + popover: { + // background: 'bg-white dark:bg-zinc-900', + // ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', + }, + table: { + // divide: 'divide-y divide-zinc-300 dark:divide-zinc-700', + // tbody: 'divide-y divide-zinc-200 dark:divide-zinc-800', + // tr: { + // selected: 'bg-zinc-50 dark:bg-zinc-800/50', + // active: 'hover:bg-zinc-50 dark:hover:bg-zinc-800/50 cursor-pointer', + // }, + // th: { + // color: 'text-zinc-900 dark:text-white', + // }, + // td: { + // color: 'text-zinc-500 dark:text-zinc-400', + // }, + // loadingState: { + // label: 'text-sm text-center text-zinc-900 dark:text-white', + // icon: 'w-6 h-6 mx-auto text-zinc-400 dark:text-zinc-500 mb-4 animate-spin', + // }, + // emptyState: { + // label: 'text-sm text-center text-zinc-900 dark:text-white', + // icon: 'w-6 h-6 mx-auto text-zinc-400 dark:text-zinc-500 mb-4', + // }, + }, + // dropdown: { + // background: 'bg-white dark:bg-zinc-800', + // ring: 'ring-1 ring-zinc-200 dark:ring-zinc-700', + // divide: 'divide-y divide-zinc-200 dark:divide-zinc-700', + // item: { + // active: 'bg-zinc-100 dark:bg-zinc-900 text-zinc-900 dark:text-white', + // inactive: 'text-zinc-700 dark:text-zinc-200', + // icon: { + // active: 'text-zinc-500 dark:text-zinc-400', + // inactive: 'text-zinc-400 dark:text-zinc-500', + // }, + // }, + // }, + // notification: { + // background: 'bg-white dark:bg-zinc-900', + // ring: 'ring-1 ring-zinc-200 dark:ring-zinc-800', + // }, + }, +}); diff --git a/packages/web/app/app.vue b/packages/web/app/app.vue new file mode 100644 index 0000000..5acf3c1 --- /dev/null +++ b/packages/web/app/app.vue @@ -0,0 +1,7 @@ + diff --git a/packages/web/app/assets/css/main.css b/packages/web/app/assets/css/main.css new file mode 100644 index 0000000..477bfa7 --- /dev/null +++ b/packages/web/app/assets/css/main.css @@ -0,0 +1,2 @@ +@import 'tailwindcss'; +@import '@nuxt/ui'; diff --git a/packages/app/components/DatePicker.vue b/packages/web/app/components/DatePicker.vue similarity index 88% rename from packages/app/components/DatePicker.vue rename to packages/web/app/components/DatePicker.vue index b53d991..f62ee9b 100644 --- a/packages/app/components/DatePicker.vue +++ b/packages/web/app/components/DatePicker.vue @@ -1,5 +1,5 @@