diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3e1b30f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +.next +.git +Dockerfile +.dockerignore +*.log \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a2caf12 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +# ---------- deps ---------- +FROM node:20-alpine AS deps +# helps certain native packages (e.g., sharp) on Alpine +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY package.json package-lock.json* pnpm-lock.yaml* yarn.lock* ./ +# install with your lockfile manager +RUN if [ -f pnpm-lock.yaml ]; then npm i -g pnpm@8 && pnpm i --frozen-lockfile; \ + elif [ -f yarn.lock ]; then yarn install --frozen-lockfile; \ + else npm ci; fi + +# ---------- builder ---------- +FROM node:20-alpine AS builder +WORKDIR /app +ENV NEXT_TELEMETRY_DISABLED=1 +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + +# ---------- runner ---------- +FROM node:20-alpine AS runner +WORKDIR /app +ENV NODE_ENV=production +# non-root user +RUN addgroup -g 1001 nodejs && adduser -u 1001 -G nodejs -s /bin/sh -D nextjs + +# copy the minimal standalone output +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static + +USER nextjs +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 +EXPOSE 3000 +CMD ["node", "server.js"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7906d2a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +services: + next: + build: + context: . + dockerfile: Dockerfile + image: my-next:latest + container_name: nextjs + restart: unless-stopped + environment: + - NODE_ENV=production + - TZ=Europe/Ljubljana + # add any Next.js runtime env vars you need, e.g.: + # - NEXTAUTH_URL=https://example.com + # - NEXT_PUBLIC_API_BASE=https://api.example.com + networks: + - proxy + labels: + - "traefik.enable=true" + # tell Traefik which network to use to reach the container + - "traefik.docker.network=proxy" + + # Router (replace example.com) + - "traefik.http.routers.next.rule=Host(`${DOMAIN}`)" + - "traefik.http.routers.next.entrypoints=websecure" + - "traefik.http.routers.next.tls=true" + # use your existing certresolver name from your Traefik config + - "traefik.http.routers.next.tls.certresolver=letsencrypt" + + # Service (container listens on 3000) + - "traefik.http.services.next.loadbalancer.server.port=3000" + +networks: + proxy: + external: true diff --git a/next.config.ts b/next.config.ts index e9ffa30..50a894c 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,6 +2,8 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { /* config options here */ + output: 'standalone', + telemetry: false, }; -export default nextConfig; +export default nextConfig; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dfc21d6..2f6d43f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,28 @@ { - "name": "petadvisor", + "name": "petadviser", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "petadvisor", + "name": "petadviser", "version": "0.1.0", "dependencies": { + "@chakra-ui/react": "^3.24.0", + "@emotion/react": "^11.14.0", + "@supabase/ssr": "^0.6.1", + "@supabase/supabase-js": "^2.53.0", + "date-fns": "^4.1.0", + "framer-motion": "^12.23.12", + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", "next": "15.4.5", + "next-themes": "^0.4.6", "react": "19.1.0", - "react-dom": "19.1.0" + "react-dom": "19.1.0", + "react-icons": "^5.5.0", + "react-leaflet": "^5.0.0", + "react-leaflet-markercluster": "^5.0.0-rc.0" }, "devDependencies": { "@types/node": "^20", @@ -19,6 +31,237 @@ "typescript": "^5" } }, + "node_modules/@ark-ui/react": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-5.18.2.tgz", + "integrity": "sha512-vM2cuKSIe4mCDfqMc4RggsmiulXbicTjpZLf1IUXSHcUluMVn+z2k1minKI4X+Z7XSoKH0To7asxS0nJ1UPODA==", + "license": "MIT", + "dependencies": { + "@internationalized/date": "3.8.2", + "@zag-js/accordion": "1.21.0", + "@zag-js/anatomy": "1.21.0", + "@zag-js/angle-slider": "1.21.0", + "@zag-js/auto-resize": "1.21.0", + "@zag-js/avatar": "1.21.0", + "@zag-js/carousel": "1.21.0", + "@zag-js/checkbox": "1.21.0", + "@zag-js/clipboard": "1.21.0", + "@zag-js/collapsible": "1.21.0", + "@zag-js/collection": "1.21.0", + "@zag-js/color-picker": "1.21.0", + "@zag-js/color-utils": "1.21.0", + "@zag-js/combobox": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/date-picker": "1.21.0", + "@zag-js/date-utils": "1.21.0", + "@zag-js/dialog": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/editable": "1.21.0", + "@zag-js/file-upload": "1.21.0", + "@zag-js/file-utils": "1.21.0", + "@zag-js/floating-panel": "1.21.0", + "@zag-js/focus-trap": "1.21.0", + "@zag-js/highlight-word": "1.21.0", + "@zag-js/hover-card": "1.21.0", + "@zag-js/i18n-utils": "1.21.0", + "@zag-js/json-tree-utils": "1.21.0", + "@zag-js/listbox": "1.21.0", + "@zag-js/menu": "1.21.0", + "@zag-js/number-input": "1.21.0", + "@zag-js/pagination": "1.21.0", + "@zag-js/password-input": "1.21.0", + "@zag-js/pin-input": "1.21.0", + "@zag-js/popover": "1.21.0", + "@zag-js/presence": "1.21.0", + "@zag-js/progress": "1.21.0", + "@zag-js/qr-code": "1.21.0", + "@zag-js/radio-group": "1.21.0", + "@zag-js/rating-group": "1.21.0", + "@zag-js/react": "1.21.0", + "@zag-js/select": "1.21.0", + "@zag-js/signature-pad": "1.21.0", + "@zag-js/slider": "1.21.0", + "@zag-js/splitter": "1.21.0", + "@zag-js/steps": "1.21.0", + "@zag-js/switch": "1.21.0", + "@zag-js/tabs": "1.21.0", + "@zag-js/tags-input": "1.21.0", + "@zag-js/time-picker": "1.21.0", + "@zag-js/timer": "1.21.0", + "@zag-js/toast": "1.21.0", + "@zag-js/toggle": "1.21.0", + "@zag-js/toggle-group": "1.21.0", + "@zag-js/tooltip": "1.21.0", + "@zag-js/tour": "1.21.0", + "@zag-js/tree-view": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chakra-ui/react": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.24.0.tgz", + "integrity": "sha512-fkKXtPJ2WVwgDAL50W2yHLzGrv8YAY6g09yrIMU8LuUkTa+xSlQJadAtuqARc0TqxTha+RL2rjPZkWvL/f0I6w==", + "license": "MIT", + "dependencies": { + "@ark-ui/react": "5.18.2", + "@emotion/is-prop-valid": "1.3.1", + "@emotion/serialize": "1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "1.2.0", + "@emotion/utils": "1.4.2", + "@pandacss/is-valid-prop": "0.54.0", + "csstype": "3.1.3", + "fast-safe-stringify": "2.1.1" + }, + "peerDependencies": { + "@emotion/react": ">=11", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@emnapi/runtime": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", @@ -29,6 +272,154 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.34.3", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", @@ -447,6 +838,59 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@internationalized/date": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.2.tgz", + "integrity": "sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.3.tgz", + "integrity": "sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@next/env": { "version": "15.4.5", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.5.tgz", @@ -581,6 +1025,109 @@ "node": ">= 10" } }, + "node_modules/@pandacss/is-valid-prop": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.54.0.tgz", + "integrity": "sha512-UhRgg1k9VKRCBAHl+XUK3lvN0k9bYifzYGZOqajDid4L1DyU813A1L0ZwN4iV9WX5TX3PfUugqtgG9LnIeFGBQ==" + }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@supabase/auth-js": { + "version": "2.71.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.71.1.tgz", + "integrity": "sha512-mMIQHBRc+SKpZFRB2qtupuzulaUhFYupNyxqDj5Jp/LyPvcWvjaJzZzObv6URtL/O6lPxkanASnotGtNpS3H2Q==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.5.tgz", + "integrity": "sha512-v5GSqb9zbosquTo6gBwIiq7W9eQ7rE5QazsK/ezNiQXdCbY+bH8D9qEaBIkhVvX4ZRW5rP03gEfw5yw9tiq4EQ==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.19.4.tgz", + "integrity": "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.11.15.tgz", + "integrity": "sha512-HQKRnwAqdVqJW/P9TjKVK+/ETpW4yQ8tyDPPtRMKOH4Uh3vQD74vmj353CYs8+YwVBKubeUOOEpI9CT8mT4obw==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.13", + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "isows": "^1.0.7", + "ws": "^8.18.2" + } + }, + "node_modules/@supabase/ssr": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@supabase/ssr/-/ssr-0.6.1.tgz", + "integrity": "sha512-QtQgEMvaDzr77Mk3vZ3jWg2/y+D8tExYF7vcJT+wQ8ysuvOeGGjYbZlvj5bHYsj/SpC0bihcisnwPrM4Gp5G4g==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.43.4" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.10.4.tgz", + "integrity": "sha512-cvL02GarJVFcNoWe36VBybQqTVRq6wQSOCvTS64C+eyuxOruFIm1utZAY0xi2qKtHJO3EjKaj8iWJKySusDmAQ==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.53.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.53.0.tgz", + "integrity": "sha512-Vg9sl0oFn55cCPaEOsDsRDbxOVccxRrK/cikjL1XbywHEOfyA5SOOEypidMvQLwgoAfnC2S4D9BQwJDcZs7/TQ==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.71.1", + "@supabase/functions-js": "2.4.5", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.19.4", + "@supabase/realtime-js": "2.11.15", + "@supabase/storage-js": "^2.10.4" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -594,12 +1141,23 @@ "version": "20.19.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/phoenix": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", + "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.9", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", @@ -620,6 +1178,879 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@zag-js/accordion": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.21.0.tgz", + "integrity": "sha512-YuuQs72AmA52Hn30l3Q8KyFDb75g9glFV7AZkUq8V52vtUsdz2PfJye1FPD06M2dnnhHjEbdTQch6Qwwe5ApBA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/anatomy": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.21.0.tgz", + "integrity": "sha512-wL5mmewTR8FJd91ZbfwiXpoMJbaQr1F1fFDel5BJgQukScNzd53HS5zhYb15eqJIOR6tlk/itPiJkxPp/+HdcQ==", + "license": "MIT" + }, + "node_modules/@zag-js/angle-slider": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.21.0.tgz", + "integrity": "sha512-1d4VgxYv4LQL8PtjkYqvPlx7DsZpG0CaB1woOhPZSva7jmo0WKvTAUZf2pbk9ajTm+iA4C3xHRbVRM6s2Vy/lg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/rect-utils": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/aria-hidden": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.21.0.tgz", + "integrity": "sha512-x78v+v/rNYoCFHeHK343kapdevywctNUEmPGdiH2BT3BI7uXZtv270WkD9OgdEOuEKuu18vbZ9TGYO9FGG8Ijw==", + "license": "MIT" + }, + "node_modules/@zag-js/auto-resize": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.21.0.tgz", + "integrity": "sha512-bQZUC5tP5SFdVcZ8vTA2tQy4B/YphwJaKCkG0Y6lHscpcPcZK7+kgBJaRj4XQuon7aKmgECLlD/da5PNNAdOJg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/avatar": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.21.0.tgz", + "integrity": "sha512-bRkEaoSbJ8Dae246cc0ShmXLBWDcJIcI1KoncST4ClYwCqyMIj4s/zgr1+XUlyz3imz6n1RhTeT2jKcBqFGC6Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/carousel": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.21.0.tgz", + "integrity": "sha512-MpGLu6xVyPGDk5OupyTFywb85xrqCEs8qR0FpOH5eyNp3lvx/iLVNMcI+KTk5YTlZWQmDCyT86wBLMlf6SfTvw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/scroll-snap": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/checkbox": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.21.0.tgz", + "integrity": "sha512-lY9DYOvz0Cbdi3jxudv/nj9cpaGk784RiookL7QHr1u/Z/sUSNj5gUNpsIkSzZmT054Tu0t0jhtTt8vScq8DmQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-visible": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/clipboard": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.21.0.tgz", + "integrity": "sha512-hJl4o8itwvVW3Wz5Zd/OQjR2OhXKdjHqIUuvPGbKcKEWxk6X9SDISslmCH9FbKVGVDgM6q5UypaYwwJZ1SsONQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/collapsible": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.21.0.tgz", + "integrity": "sha512-6vdZyZauYdiedlh6hcsYDF5Q5eC/vWstbP88PzeCFSxV5hKCJKxENOTd6d4OXJuYeWGkUABdgOl5MLIZVHrYCA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/collection": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.21.0.tgz", + "integrity": "sha512-wJYmazXIFnr4/azWI9yeYrK3rB1d0KoaUMhOkrmGnwfp3c0U6rrUL54RuCMeyZ9WmzIUBhjZ5zc+385nsXwlPA==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/color-picker": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.21.0.tgz", + "integrity": "sha512-vovzxNdINPloc5SCBBwZX1/qQnvpGAs++82GUDBGdrdai/ayBYUMkP6Hd0OiStkEDunECpfDv4Qff3kobUIgpg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/color-utils": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/color-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.21.0.tgz", + "integrity": "sha512-phUCKXeDvgnSUdLtjF6oE7HRmFEqNPkKOH2Nkhlnt9Hi8uxW9xhG3Haix7DaBhCN2DLRZqpsULpCA5eYV+S8IA==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/combobox": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.21.0.tgz", + "integrity": "sha512-aVEbcRk2JilDhGJjAmmO1YI4B8lNOeqgDxsbdWDDcgivHOzo1b5Rt+5kfyodXVOlzQAPkdq04b5/xLR9eurnJw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/aria-hidden": "1.21.0", + "@zag-js/collection": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.21.0.tgz", + "integrity": "sha512-ERQklS65W2wZD7Xvm/w/7u1nL5ZcTwK6Ppwat8EfAidBGGUB6YoZLW9Vu3I04g5SPhRmDmuIXhkTqKgIbXUUYg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/date-picker": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.21.0.tgz", + "integrity": "sha512-pfZXvjuF89NfV6CTc4BayPEAujysJ5vRSVFArsDbz5oKB8j5PCRtvHEHo0WWwgF7Jr40CTmiG68wzuDMCdXq3A==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/date-utils": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/live-region": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + }, + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/date-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.21.0.tgz", + "integrity": "sha512-4H0Z/zQFfpTL45rUZg3tH4lJQmsV6PDTml/ptj9I8/1Mxel5eOwBdmDfQ7owm47H7MjgUvm7CqvYT9987b0KXA==", + "license": "MIT", + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/dialog": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.21.0.tgz", + "integrity": "sha512-nAKoCnpd40UeprYl2JazDZVL3r5uHD1L4dUEeY9GlO4CINYBvt7jntVJn1xLGm1tyc4S+kFUSgI1y1DXlS+8KQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/aria-hidden": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-trap": "1.21.0", + "@zag-js/remove-scroll": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/dismissable": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.21.0.tgz", + "integrity": "sha512-+BewcHUJvNCRWZ4lbUqABW6EwJRM2hxf65OPcN9XCMFCAoHbezdqHXYgtU7LRvYUJyxbvLPNeUrww3D6vcyhmA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0", + "@zag-js/interact-outside": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.21.0.tgz", + "integrity": "sha512-P7Aeb1hfd5GtmTO1u0HkyVUrhFYgm94NxJhqufF2W+xByz/XspDcdy0l5pHFGsK9Urvh69S4tCx5YVh0MhZYgQ==", + "license": "MIT", + "dependencies": { + "@zag-js/types": "1.21.0" + } + }, + "node_modules/@zag-js/editable": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.21.0.tgz", + "integrity": "sha512-28QivG0KU8OCgsldxi6rVLuqr36cNiuy1vTEzcoc61Ue6B1D4rCBAQaAJedl5r1ki+Vzrjl3uP1ApoUwV3S/JA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/interact-outside": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/file-upload": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.21.0.tgz", + "integrity": "sha512-uH55bwFKcftpUYACyHT/8xB2bJdDqe3NM3JNCEYplxvn4scvDEzr2jpyVEmqUeOfrdNnyTuthNnL2hJjm4e+4A==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/file-utils": "1.21.0", + "@zag-js/i18n-utils": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/file-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.21.0.tgz", + "integrity": "sha512-gEWmz2ryuJMyAq3kg13TTmh5wR4Ft7d4Lb81ZeHiPpI/IwW67QrpBN0AKw3FBTmAuYBpK/dEc5iyETNPPrPTvg==", + "license": "MIT", + "dependencies": { + "@zag-js/i18n-utils": "1.21.0" + } + }, + "node_modules/@zag-js/floating-panel": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.21.0.tgz", + "integrity": "sha512-PVszFoJ53Iqmx+JD7WQFydRpp6spZFP1bCuBaHSoI044Z57UJ+rAkSlOGpoRHwpSROO9FPIpeqoTgy/kOCNmOA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/rect-utils": "1.21.0", + "@zag-js/store": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/focus-trap": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.21.0.tgz", + "integrity": "sha512-O00KOYOVPWWv/eATfeZxRTEvUTLv+eHJH6ynqOAvQ7RXmsECst4QlL9UJwStrTKn/r2gxhj+UZMwHMEwTGNeVg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/focus-visible": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.21.0.tgz", + "integrity": "sha512-FNA7H4hyoQRBKpDkJWlBrFeyJpVphATgjvjhNXatCrrfa4F7VZiGnu3RGhEcnaw4b3bNkFnYLdRd+9XX7JHuoA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/highlight-word": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.21.0.tgz", + "integrity": "sha512-bJIwPtcAMfEP6c5R/a3ZQG1V5FvYBP9onMVwKranAWPqOUj1/Y6lQ2gV/K4s7sw3VnpoXmy+5VxwfOPU/QWU5Q==", + "license": "MIT" + }, + "node_modules/@zag-js/hover-card": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.21.0.tgz", + "integrity": "sha512-G4+/lnc4ATU7BVHlnQ77fNC1b2k9dcbIeaBPMcdnc+g+CtqNhNTBM+rMb2OpSE9IOuFwqld5EK1v4tW8+6qOwQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/i18n-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.21.0.tgz", + "integrity": "sha512-5E+vVsL6zcfaLlSGSnB3olXIEzmZ4C5L53+jSnx8LqmIcuTEc8I8mvBhcpTiDVHKrH6jG3jHE+6BvdyJ9SWQiA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/interact-outside": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.21.0.tgz", + "integrity": "sha512-Yo4lojJYJZ4fjavOz+VbdpZlcDFAOlrOX+rKss3BNKfaffmhCklx/8Zej7WFStPCAv8AOzZ+fE4EhH/w+uPXEw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/json-tree-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.21.0.tgz", + "integrity": "sha512-OSyIxdWUVWD44hCvSgR+hP0q9nJOejS1VI9P4dbphQfcLNVvntAfwrb1os0DUR++UKBHyhAYwKVuVdThYbkJYQ==", + "license": "MIT" + }, + "node_modules/@zag-js/listbox": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.21.0.tgz", + "integrity": "sha512-XByByVOj4MA/ELcHgtkiS+jP5b2C2wXHmpCeCUp2jYKx3ZiL8al9y7yYLVBEDHRXsAR44UAQuJPIjDsCgtgkJg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/collection": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-visible": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/live-region": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.21.0.tgz", + "integrity": "sha512-buHwgHkW95c8gYtk53AEmjS8r72AtDFRfD3l3OgMsBE/dnYYgM3bfpiZL3pP0IBK+WPKDJxS8TMj7Q7pBiQebQ==", + "license": "MIT" + }, + "node_modules/@zag-js/menu": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.21.0.tgz", + "integrity": "sha512-usD3MQTobKlzplY3j9IZxiq6cGHUZ/N8qmmi+EKvo0xpsEimhyE+FHr9XHqmFfGsxcH/yvyuFkvEjaUrF3qsqQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/rect-utils": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/number-input": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.21.0.tgz", + "integrity": "sha512-77Z2tTI+PcOCaoxNoteXfLaZA0zxObrOxqAjTgwapM88kn9oGNU4Ln6AYMJqdIDZJtQWdLBGjJwi3R8h8irpNQ==", + "license": "MIT", + "dependencies": { + "@internationalized/number": "3.6.3", + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/pagination": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.21.0.tgz", + "integrity": "sha512-d3zXD17CTSsA3o+5oJB1CujEoYNph58/DHFwVFDRgH5lB5K1vBxgas+JxJ2++uhouI8BH5fz7w7X3Wr6kXEHIw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/password-input": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.21.0.tgz", + "integrity": "sha512-paiZbGEBlkoas08qwrpQVUuZXG8efgti/u464eZR6x7drv6PVc9igWxfqFJXL378I/cEUjj5MvYdk9yMbLJcHg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/pin-input": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.21.0.tgz", + "integrity": "sha512-Ut3tZ4rDhjopTTdMcNm3BIpTlAu3NR1Uw1w+WM5NTh5C7Vn+GZAL5dP1dahB/t29yqhTZY4ssMxZfDofBpfMHw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/popover": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.21.0.tgz", + "integrity": "sha512-crDELtzKZo0hSXA1N8LFrleq/9QlSGRlUNNb0DoUW0/gFFBG3wsrLayn2gWHweeM9HBG60ZnZnBW//pXaS32sg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/aria-hidden": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-trap": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/remove-scroll": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/popper": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.21.0.tgz", + "integrity": "sha512-PWLF6kY4f88CBM+nGebPJMB3DsXcj8NDuiLdljrGL4j1x18t1dhNY1IIdNDBueJCF0VL0uJrGwcxMZg6FGReSA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "1.7.2", + "@zag-js/dom-query": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/presence": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.21.0.tgz", + "integrity": "sha512-Fz7nhaoYbfbV6c8ovCnv75HaCD5yvU7NUxtR20wUYBPPx5nvdOViUsU+4ih/HXUcBHsQUW6teIfkf9Gb7xbCgQ==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0" + } + }, + "node_modules/@zag-js/progress": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.21.0.tgz", + "integrity": "sha512-AMZsoURX2jotI2KrODE4jw7e9FPslKIZCO/guh11D6A9gvSM3ECRe2gKdAcLjP+UKxayS8MkNPhD51bAYCfkbQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/qr-code": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.21.0.tgz", + "integrity": "sha512-mCe8qp+F9ZKS9Py/CkXmfAGMc9h86UM9NkXOWwU880az885Y0Ld8UaHmyWO3AAJDWPYBkTJKq+tEqNTCKx1dyw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0", + "proxy-memoize": "3.0.1", + "uqr": "0.1.2" + } + }, + "node_modules/@zag-js/radio-group": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.21.0.tgz", + "integrity": "sha512-TCb3RjiNhgFWzwHUns9S+z6rNyXng2kexFPmD1ycyEO1efHAb83J5aZv5ShGX/05YCZpwVMf3WsyGEV8p8c/1g==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-visible": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/rating-group": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.21.0.tgz", + "integrity": "sha512-TBjSGfHT06Ehj3lBACVB3pOnxmb+jvJQgBQUZtFYFMae+gtuKItwx9qleH24vuyqKT/DI3amQhbvpi+bUK9CVA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/react": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.21.0.tgz", + "integrity": "sha512-yTqpMJ2c6Sf/KqXmyq3yJg1W/VZhYn1YNBRKWYJYT/kUDnoOpyqIBbmwka0dZi/hnWdhK1pzV0UUa7oV4IWa/A==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.21.0", + "@zag-js/store": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@zag-js/rect-utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.21.0.tgz", + "integrity": "sha512-ulzlyupj7QnM5NdAHSy2uKscVanjApxcC5/FRu+ooUZRaK1A8BMqep6r7lsVB8qTz0l1ssjLqCJPGNzP3PB3ug==", + "license": "MIT" + }, + "node_modules/@zag-js/remove-scroll": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.21.0.tgz", + "integrity": "sha512-wsXEM7rUJnJrTmcCHsahtLfxaas/enHOakAB98n5YZelcoFFbE+iR91brb1yUbccfryvepozOac+EIWuO8/2aw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/scroll-snap": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.21.0.tgz", + "integrity": "sha512-H/8bQql4DjYFVpBG6j/EyUsdboCxyGjRzOg9SN8bA2aXNDBPh+/oLwnCWCqagd4A1VO6JxmuFmbcM2wW9Khmhw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.21.0" + } + }, + "node_modules/@zag-js/select": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.21.0.tgz", + "integrity": "sha512-wVxPzw9lmtCDWTPP0h6P8r7QL93VsyajwV0EPFKoa8HH4XWzl5QBuShXIzmD8dxbHA5HIdAZNYAC5BQCSW37Xw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/collection": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/signature-pad": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.21.0.tgz", + "integrity": "sha512-LUXHsMPXLNSaWBJ4WWY+ZSFpAbbPHfUAGOVh22bOIJWMRchcs4Cch42tFgg/sB8cREfc3G/CS5e2gIBqMigcEQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0", + "perfect-freehand": "^1.2.2" + } + }, + "node_modules/@zag-js/slider": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.21.0.tgz", + "integrity": "sha512-dmH2j8Iu079UZf36TzfPBOYb2jGbvXHcV8x3zYiRWs4ccJDaSNBZieCWCY0/Nm5wI8l+ue/Buc1kcbpIytuWHQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/splitter": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.21.0.tgz", + "integrity": "sha512-blsSe3UrhEYieLF2fuO7UM0t2rQxFTeLYMSjuxFspdYZz47VnEKtVypgQUZnQX5dyttyV49vl1g7+AbBBlk6bA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/steps": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.21.0.tgz", + "integrity": "sha512-w0nzJBgYe/A04pNZN1mv1hRT44MVwwRf9VvlBFIS1CxVpUOGkDoVrzRb/CX1zpOhMdtF8w7+FfgT6Q3/oVJ4+A==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/store": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.21.0.tgz", + "integrity": "sha512-UCAuYWui3+VYfp8KdECXuM+L8tKzQYyNz+7KrRPHyZ37wgHjz4M+QNj/QP5GgDStLJaF3UgbuLYwbXSQ/3WcWw==", + "license": "MIT", + "dependencies": { + "proxy-compare": "3.0.1" + } + }, + "node_modules/@zag-js/switch": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.21.0.tgz", + "integrity": "sha512-erQ05qU9UUTOKkq77X+fTBOnng75ZFugcbcx4HWkACs9aUQmh9JoRF/1+HzFvRf8SyfuEdiSP25Q+ozmiOUmXQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-visible": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/tabs": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.21.0.tgz", + "integrity": "sha512-ecRS8F5M6QCAln4ob8waySRmSPozbOZ5dq1GGmaVExBwbrOA4C3ZbrHU3Dhmmx8vUji+rOSRifyhHwCTY0PTqQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/tags-input": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.21.0.tgz", + "integrity": "sha512-i/3PvNMhUloVi2DO+CRAEHtosu/Xmjcuj7Q3wY1acTORkoyXJrynmKmUcjF2D5ySHuey+Q07ADztlpa9ZHjr8Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/auto-resize": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/interact-outside": "1.21.0", + "@zag-js/live-region": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/time-picker": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/time-picker/-/time-picker-1.21.0.tgz", + "integrity": "sha512-GIBgfHfo2pYnl9MD0fVNaJ6UE63dOs+T0DFPhBf3DazNR9r4qhK0QXQLRQyH57KD+kcjKiJNgMGRKsKbX88aEw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + }, + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/timer": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.21.0.tgz", + "integrity": "sha512-vFohY91xnJVV6iSkT6tESLIrFssZsE02LbnXjHEnEVajC0jXLExvIu70t+5CWmP08e2yfp7E+G9WI1cDyzS/SQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/toast": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.21.0.tgz", + "integrity": "sha512-DMvdLMQFGGwNxRjnzEsszocBWreQ+4spvQTrolra9pp7PuklodnIIuxRNNQ7bQVd1wH/pQPkEwXTbusb4NMBgw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/toggle": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.21.0.tgz", + "integrity": "sha512-+toPS8gviWYDAatyuFOWooHts5LP368UYsubedxZAgyz+qE6Mo8j282k2iGvmzrM22WcplRXVzgZ0JYUFVPtbQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/toggle-group": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.21.0.tgz", + "integrity": "sha512-zUxLj0sXCUixI3C7lMEekQc8jQlFd0Y70a3/MO5xC/sem3pucPS30rulcvp7b3d9TLJk8YVofpvAjdRPDyb9XA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/tooltip": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.21.0.tgz", + "integrity": "sha512-X7t93MPvB0T82HT9QRlfh+Ts8QwAeouSDmaCCrF5/tdIsMTuzEzGqWtaPbXTDfMGrsG2umlIiIVSraWDe6aAIQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-visible": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/store": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/tour": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.21.0.tgz", + "integrity": "sha512-441Az3byK0vP2zL67p4z5m7s/0B7uHicLdvS0rKjoI+2gZ9Qd8yGuzTSfMJY2lWn+407iswN/koY7Kz5K0srFg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dismissable": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/focus-trap": "1.21.0", + "@zag-js/interact-outside": "1.21.0", + "@zag-js/popper": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/tree-view": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.21.0.tgz", + "integrity": "sha512-gMjmy+sdZsLm75pwLH8M5qCOnsXA2KIGt0lKcfL/qAhYqDVaXm6xnx43JhJxSvVvqPqDuP1W8R5vUkBtEXV5Ig==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.21.0", + "@zag-js/collection": "1.21.0", + "@zag-js/core": "1.21.0", + "@zag-js/dom-query": "1.21.0", + "@zag-js/types": "1.21.0", + "@zag-js/utils": "1.21.0" + } + }, + "node_modules/@zag-js/types": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.21.0.tgz", + "integrity": "sha512-ozT8aTeqCKsPYQDqIgkjkJnXBEADvV8nj8ZuXUzm7RhIN9EqeqpQyOdA7GdYrrDY5bgmdzyzmJu+e/2PbWg/ng==", + "license": "MIT", + "dependencies": { + "csstype": "3.1.3" + } + }, + "node_modules/@zag-js/utils": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.21.0.tgz", + "integrity": "sha512-yI/CZizbk387TdkDCy9Uc4l53uaeQuWAIJESrmAwwq6yMNbHZ2dm5+1NHdZr/guES5TgyJa/BYJsNJeCsCfesg==", + "license": "MIT" + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001731", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", @@ -691,13 +2122,70 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -708,6 +2196,118 @@ "node": ">=8" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/framer-motion": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz", + "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.12", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -715,6 +2315,102 @@ "license": "MIT", "optional": true }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, + "node_modules/leaflet.markercluster": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz", + "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==", + "license": "MIT", + "peerDependencies": { + "leaflet": "^1.3.1" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/motion-dom": { + "version": "12.23.12", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz", + "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -785,6 +2481,67 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-freehand": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.2.tgz", + "integrity": "sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -819,6 +2576,21 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/proxy-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", + "license": "MIT" + }, + "node_modules/proxy-memoize": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", + "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", + "license": "MIT", + "dependencies": { + "proxy-compare": "^3.0.0" + } + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -840,6 +2612,82 @@ "react": "^19.1.0" } }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-leaflet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^3.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/react-leaflet-markercluster": { + "version": "5.0.0-rc.0", + "resolved": "https://registry.npmjs.org/react-leaflet-markercluster/-/react-leaflet-markercluster-5.0.0-rc.0.tgz", + "integrity": "sha512-jWa4bPD5LfLV3Lid1RWgl+yKUuQtnqeYtJzzLb/fiRjvX+rtwzY8pMoUFuygqyxNrWxMTQlWKBHxkpI7Sxvu4Q==", + "license": "MIT", + "dependencies": { + "@react-leaflet/core": "^3.0.0", + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", + "react-leaflet": "^5.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", + "react": "^19.0.0", + "react-leaflet": "^5.0.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -912,6 +2760,15 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -944,6 +2801,30 @@ } } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -968,8 +2849,59 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" + }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } } } } diff --git a/package.json b/package.json index 389c72d..2faa4fe 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,34 @@ { - "name": "petadvisor", + "name": "petadviser", "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbopack", + "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { + "@chakra-ui/react": "^3.24.0", + "@emotion/react": "^11.14.0", + "@supabase/ssr": "^0.6.1", + "@supabase/supabase-js": "^2.53.0", + "date-fns": "^4.1.0", + "framer-motion": "^12.23.12", + "leaflet": "^1.9.4", + "leaflet.markercluster": "^1.5.3", + "next": "15.4.5", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0", - "next": "15.4.5" + "react-icons": "^5.5.0", + "react-leaflet": "^5.0.0", + "react-leaflet-markercluster": "^5.0.0-rc.0" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^19", - "@types/react-dom": "^19" + "@types/react-dom": "^19", + "typescript": "^5" } } diff --git a/src/app/globals.css b/src/app/globals.css index e3734be..941581c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,42 +1,46 @@ -:root { - --background: #ffffff; - --foreground: #171717; -} +@import "leaflet/dist/leaflet.css"; +@import "leaflet.markercluster/dist/MarkerCluster.css"; +@import "leaflet.markercluster/dist/MarkerCluster.Default.css"; -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} +/*:root {*/ +/* --background: #ffffff;*/ +/* --foreground: #171717;*/ +/*}*/ -html, -body { - max-width: 100vw; - overflow-x: hidden; -} +/*@media (prefers-color-scheme: dark) {*/ +/* :root {*/ +/* --background: #0a0a0a;*/ +/* --foreground: #ededed;*/ +/* }*/ +/*}*/ -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} +/*html,*/ +/*body {*/ +/* max-width: 100vw;*/ +/* overflow-x: hidden;*/ +/*}*/ -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} +/*body {*/ +/* color: var(--foreground);*/ +/* background: var(--background);*/ +/* font-family: Arial, Helvetica, sans-serif;*/ +/* -webkit-font-smoothing: antialiased;*/ +/* -moz-osx-font-smoothing: grayscale;*/ +/*}*/ -a { - color: inherit; - text-decoration: none; -} +/** {*/ +/* box-sizing: border-box;*/ +/* padding: 0;*/ +/* margin: 0;*/ +/*}*/ -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} +/*a {*/ +/* color: inherit;*/ +/* text-decoration: none;*/ +/*}*/ + +/*@media (prefers-color-scheme: dark) {*/ +/* html {*/ +/* color-scheme: dark;*/ +/* }*/ +/*}*/ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 42fc323..6a23bb1 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,32 +1,33 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; +import type {Metadata} from "next"; +import {Geist, Geist_Mono} from "next/font/google"; import "./globals.css"; +import {Provider} from "@/components/ui/provider" const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], + variable: "--font-geist-sans", + subsets: ["latin"], }); const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], + variable: "--font-geist-mono", + subsets: ["latin"], }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Pet Adviser", + description: "Generated by create next app", }; export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; + children, + }: Readonly<{ + children: React.ReactNode; }>) { - return ( - - - {children} - - - ); + return ( + + + {children} + + + ); } diff --git a/src/app/page.module.css b/src/app/page.module.css index 58c71af..ad3aa16 100644 --- a/src/app/page.module.css +++ b/src/app/page.module.css @@ -1,167 +1,3 @@ -.page { - --gray-rgb: 0, 0, 0; - --gray-alpha-200: rgba(var(--gray-rgb), 0.08); - --gray-alpha-100: rgba(var(--gray-rgb), 0.05); - - --button-primary-hover: #383838; - --button-secondary-hover: #f2f2f2; - - display: grid; - grid-template-rows: 20px 1fr 20px; - align-items: center; - justify-items: center; - min-height: 100svh; - padding: 80px; - gap: 64px; - font-family: var(--font-geist-sans); -} - -@media (prefers-color-scheme: dark) { - .page { - --gray-rgb: 255, 255, 255; - --gray-alpha-200: rgba(var(--gray-rgb), 0.145); - --gray-alpha-100: rgba(var(--gray-rgb), 0.06); - - --button-primary-hover: #ccc; - --button-secondary-hover: #1a1a1a; - } -} - -.main { - display: flex; - flex-direction: column; - gap: 32px; - grid-row-start: 2; -} - -.main ol { - font-family: var(--font-geist-mono); - padding-left: 0; - margin: 0; - font-size: 14px; - line-height: 24px; - letter-spacing: -0.01em; - list-style-position: inside; -} - -.main li:not(:last-of-type) { - margin-bottom: 8px; -} - -.main code { - font-family: inherit; - background: var(--gray-alpha-100); - padding: 2px 4px; - border-radius: 4px; - font-weight: 600; -} - -.ctas { - display: flex; - gap: 16px; -} - -.ctas a { - appearance: none; - border-radius: 128px; - height: 48px; - padding: 0 20px; - border: 1px solid transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - line-height: 20px; - font-weight: 500; -} - -a.primary { - background: var(--foreground); - color: var(--background); - gap: 8px; -} - -a.secondary { - border-color: var(--gray-alpha-200); - min-width: 158px; -} - .footer { - grid-row-start: 3; - display: flex; - gap: 24px; -} - -.footer a { - display: flex; - align-items: center; - gap: 8px; -} - -.footer img { - flex-shrink: 0; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - a.primary:hover { - background: var(--button-primary-hover); - border-color: transparent; - } - - a.secondary:hover { - background: var(--button-secondary-hover); - border-color: transparent; - } - - .footer a:hover { - text-decoration: underline; - text-underline-offset: 4px; - } -} - -@media (max-width: 600px) { - .page { - padding: 32px; - padding-bottom: 80px; - } - - .main { - align-items: center; - } - - .main ol { - text-align: center; - } - - .ctas { - flex-direction: column; - } - - .ctas a { - font-size: 14px; - height: 40px; - padding: 0 16px; - } - - a.secondary { - min-width: auto; - } - - .footer { - flex-wrap: wrap; - align-items: center; - justify-content: center; - } -} - -@media (prefers-color-scheme: dark) { - .logo { - filter: invert(); - } -} + background-color: #f6f6f6; +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 84af2cb..d0a0578 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,95 +1,40 @@ import Image from "next/image"; import styles from "./page.module.css"; +import { Container, Heading } from "@chakra-ui/react" +import Header from "@/components/Header"; +import HeroBanner from "@/components/HeroBanner"; +import CompaniesExplorer from "@/components/Map/CompaniesExplorer.tsx"; +import type { Company } from "@/components/Map/CompanyMap.tsx"; +import Articles from "@/components/Articles"; +import Calendar from "@/components/Calendar"; +import Sponsor from "@/components/Sponsor"; +import Footer from "@/components/Footer"; + +const seed: Company[] = [ + { id: "1", name: "ByteForge", industry: "Tech", lat: 46.0569, lng: 14.5058, address: "Ljubljana" }, + { id: "2", name: "GreenPlate", industry: "Food", lat: 46.2389, lng: 15.2675, address: "Celje" }, + { id: "3", name: "Medicus+", industry: "Healthcare", lat: 46.5547, lng: 15.6459, address: "Maribor" }, + { id: "4", name: "ShopNook", industry: "Retail", lat: 45.5481, lng: 13.7302, address: "Koper" }, + { id: "5", name: "Steelworks d.o.o.", industry: "Manufacturing", lat: 46.2396, lng: 14.3556, address: "Kranj" }, + { id: "6", name: "CloudLynx", industry: "Tech", lat: 46.3607, lng: 14.0888, address: "Škofja Loka" }, +]; export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing src/app/page.tsx. -
  2. -
  3. Save and see your changes instantly.
  4. -
- -
- - Vercel logomark - Deploy now - - - Read our docs - + return ( +
+
+
+
+
+ + + + + +
+
+
+
-
- -
- ); + ); } diff --git a/src/components/Articles.js b/src/components/Articles.js new file mode 100644 index 0000000..037e354 --- /dev/null +++ b/src/components/Articles.js @@ -0,0 +1,35 @@ +import { createClient } from '@/utils/supabase/server'; +import { Container, Button, Card, Heading, Image, Text, SimpleGrid, GridItem } from "@chakra-ui/react" + +export default async function Articles() { + const supabase = await createClient(); + const { data: articles } = await supabase.from("articles").select().order("published_at", {ascending: false}).limit(8); + + return ( + + Zadnje novice iz sveta malih živali + {articles.length === 0 ? Ni vsebin : + {articles.map((article) => ( + + Green double couch with wooden legs + + {article.title} + + {article.name} + + + {new Date(article.published_at).toLocaleString("sl-SI", {weekday: "long", year: "numeric", month: "long", day: "numeric"})} + + + + + + + ))} + } + + ) +} \ No newline at end of file diff --git a/src/components/Calendar.js b/src/components/Calendar.js new file mode 100644 index 0000000..c718fc4 --- /dev/null +++ b/src/components/Calendar.js @@ -0,0 +1,381 @@ +'use client'; + +import React, { useMemo, useState } from "react"; +import { + addMonths, + subMonths, + startOfMonth, + endOfMonth, + startOfWeek, + endOfWeek, + addDays, + isSameMonth, + isSameDay, + format, + parseISO, + isAfter, +} from "date-fns"; +import { FaChevronLeft, FaChevronRight, FaCalendarPlus, FaClock, FaMapMarkerAlt, FaRegCalendarAlt } from "react-icons/fa"; +import { motion, AnimatePresence } from "framer-motion"; +import { + Container, + Box, + Flex, + Grid, + GridItem, + Heading, + Text, + Button, + IconButton, + Badge, + VStack, + HStack, + Input, +} from "@chakra-ui/react"; + +// --- Demo Data --- +const demoEvents = [ + { id: "1", title: "Dogodek 1", start: new Date().toISOString(), color: "blue.500" }, + { id: "2", title: "Dogodek 2", start: addDays(new Date(), 2).toISOString(), color: "pink.500" }, + { id: "3", title: "Dogodek 3", start: addDays(new Date(), 6).toISOString(), color: "green.500" }, + { id: "4", title: "Dogodek 4", start: addDays(new Date(), 12).toISOString(), color: "orange.500" }, +]; + +// --- Helpers --- +const getMonthMatrix = (current) => { + const monthStart = startOfMonth(current); + const monthEnd = endOfMonth(current); + const startDate = startOfWeek(monthStart, { weekStartsOn: 1 }); // Monday + const endDate = endOfWeek(monthEnd, { weekStartsOn: 1 }); + + const rows = []; + let day = startDate; + let row = []; + + while (day <= endDate) { + for (let i = 0; i < 7; i++) { + row.push(day); + day = addDays(day, 1); + } + rows.push(row); + row = []; + } + + return rows; +}; + +const DayBadge = ({ count }) => + count > 0 ? ( + + {count} + + ) : null; + +const EventPill = ({ ev }) => ( + + + {ev.title} + + +); + +// --- Main Component (Plain JS, Chakra v1/v2 compatible) --- +export default function Calendar({ initialDate, initialEvents = demoEvents }) { + // Static tokens (works without Chakra hooks) + const mutedColor = "gray.600"; + const tileBg = "white"; + const tileBgMuted = "gray.50"; + const selectedRing = "purple.400"; + + const [currentDate, setCurrentDate] = useState( + initialDate ? (typeof initialDate === "string" ? parseISO(initialDate) : initialDate) : new Date() + ); + const [selectedDate, setSelectedDate] = useState(new Date()); + const [events, setEvents] = useState(initialEvents); + + const monthMatrix = useMemo(() => getMonthMatrix(currentDate), [currentDate]); + + const eventsByDay = useMemo(() => { + const map = new Map(); + events.forEach((ev) => { + const d = format(parseISO(ev.start), "yyyy-MM-dd"); + if (!map.has(d)) map.set(d, []); + map.get(d).push(ev); + }); + return map; + }, [events]); + + const todayKey = format(new Date(), "yyyy-MM-dd"); + + const upcomingEvents = useMemo(() => { + const now = new Date(); + return [...events] + .filter((e) => isAfter(parseISO(e.start), addDays(now, -1))) + .sort((a, b) => parseISO(a.start).getTime() - parseISO(b.start).getTime()); + }, [events]); + + // Quick add form state + const [newTitle, setNewTitle] = useState(""); + const [newDate, setNewDate] = useState(format(new Date(), "yyyy-MM-dd")); + const [newTime, setNewTime] = useState("09:00"); + const [newLocation, setNewLocation] = useState(""); + + const addEvent = () => { + if (!newTitle.trim()) return; + const dt = new Date(`${newDate}T${newTime}:00`); + setEvents((prev) => [ + ...prev, + { + id: typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : String(Date.now()), + title: newTitle.trim(), + start: dt.toISOString(), + location: newLocation.trim() || undefined, + color: "purple.500", + }, + ]); + setNewTitle(""); + setNewLocation(""); + }; + + return ( + + + + + + Prihajajoči dogodki + + + + + + + setCurrentDate((d) => subMonths(d, 1))}> + + + + {format(currentDate, "MMMM yyyy")} + + setCurrentDate((d) => addMonths(d, 1))}> + + + + + + + + {/* Calendar Grid */} + + + + {["Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"].map((d) => ( + + {d} + + ))} + + + + + {monthMatrix.flat().map((day, idx) => { + const inMonth = isSameMonth(day, currentDate); + const key = format(day, "yyyy-MM-dd"); + const isToday = key === todayKey; + const isSelected = selectedDate && isSameDay(day, selectedDate); + const dayEvents = eventsByDay.get(key) || []; + + return ( + setSelectedDate(day)} + h="96px" + p={2} + borderRadius="2xl" + bg={inMonth ? tileBg : tileBgMuted} + color={inMonth ? undefined : mutedColor} + borderWidth={isSelected ? "2px" : "0px"} + borderColor={isSelected ? selectedRing : "transparent"} + > + + + + {format(day, "d")} + + + + + + + + {dayEvents.slice(0, 3).map((ev) => ( + + + + ))} + + {dayEvents.length > 3 && ( + + +{dayEvents.length - 3} more + + )} + + + ); + })} + + + {/* Selected Day Drawer */} + + {selectedDate && ( + + + + Na izbran dan + + + {format(selectedDate, "EEEE, MMM d")} + + + {(eventsByDay.get(format(selectedDate, "yyyy-MM-dd")) || []).length === 0 ? ( + + No events for this day. + + ) : ( + (eventsByDay.get(format(selectedDate, "yyyy-MM-dd")) || []).map((ev) => ( + + + + + {ev.title} + + + + + {format(parseISO(ev.start), "EEE, MMM d HH:mm")} + + {ev.location && ( + + + {ev.location} + + )} + + + + )) + )} + + + + )} + + + + + {/* Sidebar */} + + {/* Quick add + + + + Quick add event + + + + + + Title + setNewTitle(e.target.value)} /> + + + + Date + setNewDate(e.target.value)} /> + + + Time + setNewTime(e.target.value)} /> + + + + Location + setNewLocation(e.target.value)} /> + + + + + */} + + {/* Upcoming */} + + + + Prihajajoči dogodki + + + + + {upcomingEvents.length === 0 ? ( + + Trenutno prihodnjih dogodkov. + + ) : ( + upcomingEvents.map((ev) => ( + + + + + {ev.title} + + + + + {format(parseISO(ev.start), "EEE, MMM d HH:mm")} + + {ev.location && ( + + + {ev.location} + + )} + + + + )) + )} + + + + + + + + ); +} diff --git a/src/components/Footer.js b/src/components/Footer.js new file mode 100644 index 0000000..9d70ba4 --- /dev/null +++ b/src/components/Footer.js @@ -0,0 +1,43 @@ +import {Container, Grid, List, Heading, Image, IconButton, Stack} from "@chakra-ui/react"; +import { LuPhone, LuMail } from "react-icons/lu" + +export default function Footer() { + return ( + + +
+ Uporabne povezave + + Povezava 1 + Povezava 2 + Povezava 3 + Povezava 4 + +
+
+ PetAdviser + + O nas 1 + O nas 2 + O nas 3 + O nas 4 + +
+
+ Vizitka + Pet Adviser Logo + + + + info@petadviser.si + + + + 000 000 000 + + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Header.js b/src/components/Header.js new file mode 100644 index 0000000..0b669c1 --- /dev/null +++ b/src/components/Header.js @@ -0,0 +1,77 @@ +"use client"; +import NextLink from "next/link"; +import { + Flex, + Box, + HStack, + Link, + Image, + Spacer, + IconButton, + ClientOnly, + Skeleton +} from "@chakra-ui/react"; +import { FaCircleUser } from "react-icons/fa6"; +import { useColorMode } from "@/components/ui/color-mode" +import { LuMoon, LuSun } from "react-icons/lu" +import styles from "./Header.module.css"; +import {MENU_ITEMS} from "../lib/constants"; + +export default function Header() { + const { toggleColorMode, colorMode } = useColorMode() + return ( + + {/* First row: Logo + User menu */} + + {/* Logo */} + + Logo + + + + + {/* User Menu */} + + + + }> + + {colorMode === "light" ? : } + + + + + {/* Second row: Navigation menu */} + + + {MENU_ITEMS.map((item) => ( + + {item.label} + + ))} + + + + ); +} \ No newline at end of file diff --git a/src/components/Header.module.css b/src/components/Header.module.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/HeroBanner.js b/src/components/HeroBanner.js new file mode 100644 index 0000000..1a2cace --- /dev/null +++ b/src/components/HeroBanner.js @@ -0,0 +1,62 @@ +import {Box, Flex, Button, HStack, Wrap, Link, Text, Heading} from "@chakra-ui/react"; +import NextLink from "next/link"; +import {RiArrowRightLine, RiMailLine} from "react-icons/ri" +import {MENU_ITEMS} from "../lib/constants"; + +export default function Banner() { + return ( + + {/* Background Video */} + + + + + {/* Overlay */} + + {/* Navigation menu on top of banner */} + Vse za vase male in malo vecje zivali + + {MENU_ITEMS.map((item) => ( + + ))} + + + {/* Example headline in the center */} + {/* + Welcome to Our Website + */} + + + ); +} \ No newline at end of file diff --git a/src/components/Map.js b/src/components/Map.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Map/CompaniesExplorer.tsx b/src/components/Map/CompaniesExplorer.tsx new file mode 100644 index 0000000..07e75cc --- /dev/null +++ b/src/components/Map/CompaniesExplorer.tsx @@ -0,0 +1,147 @@ +"use client"; + +import { Box, Flex, Heading, HStack, Input, Stack, Text, Badge } from "@chakra-ui/react"; +import { useMemo, useState } from "react"; +import dynamic from "next/dynamic"; +import type { Company } from "./CompanyMap"; + +// dynamic import to avoid SSR issues +const CompanyMap = dynamic(() => import("./CompanyMap"), { ssr: false }); + +export type CompaniesExplorerProps = { + companies: Company[]; + industries?: Array; + initialIndustry?: Company["industry"] | "All"; + showAutoFit?: boolean; +}; + +const defaultIndustries: Array = [ + "Tech", + "Retail", + "Manufacturing", + "Food", + "Healthcare", +]; + +export default function CompaniesExplorer({ + companies, + industries = defaultIndustries, + initialIndustry = "All", + showAutoFit = true, + }: CompaniesExplorerProps) { + const [query, setQuery] = useState(""); + const [industry, setIndustry] = useState(initialIndustry); + const [selectedId, setSelectedId] = useState(null); + + const filtered = useMemo(() => { + const q = query.trim().toLowerCase(); + return companies.filter((c) => { + const matchesQ = + !q || + c.name.toLowerCase().includes(q) || + (c.address?.toLowerCase().includes(q) ?? false); + const matchesInd = industry === "All" || c.industry === industry; + return matchesQ && matchesInd; + }); + }, [companies, query, industry]); + + const selected = useMemo( + () => filtered.find((c) => c.id === selectedId), + [filtered, selectedId] + ); + + return ( + + {/* Left panel */} + + + Companies + + + + setQuery(e.target.value)} + /> + setIndustry(e.target.value)} + maxW="44" + borderWidth="1px" + borderRadius="md" + px={3} + py={2} + > + + {industries.map((i) => ( + + ))} + + + + + + {filtered.map((c) => { + const active = c.id === selectedId; + return ( + setSelectedId(c.id)} + _hover={{ borderColor: "blue.300" }} + > + + + {c.name} + {c.address && ( + + {c.address} + + )} + + {c.industry} + + + ); + })} + {filtered.length === 0 && ( + + No companies match your filters. + + )} + + + + + {/* Right panel */} + + setSelectedId(id)} + autoFit={showAutoFit} + /> + + + ); +} diff --git a/src/components/Map/CompanyMap.tsx b/src/components/Map/CompanyMap.tsx new file mode 100644 index 0000000..245fff5 --- /dev/null +++ b/src/components/Map/CompanyMap.tsx @@ -0,0 +1,151 @@ +"use client"; + +import { Box, Badge, Flex, Text } from "@chakra-ui/react"; +import { MapContainer, TileLayer, Marker, Popup, useMap } from "react-leaflet"; +import L, { DivIcon, LatLngBoundsLiteral } from "leaflet"; +import "leaflet/dist/leaflet.css"; +import "leaflet.markercluster/dist/MarkerCluster.css"; +import "leaflet.markercluster/dist/MarkerCluster.Default.css"; +import MarkerClusterGroup from "react-leaflet-markercluster"; +import { useEffect, useMemo } from "react"; + +export type Company = { + id: string; + name: string; + industry: "Tech" | "Retail" | "Manufacturing" | "Food" | "Healthcare"; + lat: number; + lng: number; + address?: string; +}; + +type Props = { + companies: Company[]; + selectedId?: string | null; + onSelect?: (id: string) => void; + autoFit?: boolean; +}; + +const industryEmoji: Record = { + Tech: "💻", + Retail: "🛒", + Manufacturing: "🏭", + Food: "🍽️", + Healthcare: "🏥", +}; + +const industryColor: Record = { + Tech: "#3b82f6", + Retail: "#f59e0b", + Manufacturing: "#6b7280", + Food: "#10b981", + Healthcare: "#ef4444", +}; + +function makeIcon(industry: Company["industry"], highlighted: boolean): DivIcon { + const size = highlighted ? 40 : 32; + const color = industryColor[industry]; + const emoji = industryEmoji[industry]; + const border = highlighted ? `3px solid ${color}` : `2px solid ${color}`; + return L.divIcon({ + className: "company-div-icon", + html: ` +
${emoji}
+ `, + iconSize: [size, size], + iconAnchor: [size / 2, size / 2], + popupAnchor: [0, -size / 2], + }); +} + +function FlyTo({ lat, lng }: { lat: number; lng: number }) { + const map = useMap(); + useEffect(() => { + map.flyTo([lat, lng], Math.max(map.getZoom(), 13), { duration: 0.7 }); + }, [lat, lng, map]); + return null; +} + +function FitBoundsOnData({ points }: { points: { lat: number; lng: number }[] }) { + const map = useMap(); + useEffect(() => { + if (!points?.length) return; + let bounds: LatLngBoundsLiteral = [ + [points[0].lat, points[0].lng], + [points[0].lat, points[0].lng], + ]; + for (const p of points) { + bounds = L.latLngBounds(bounds).extend([p.lat, p.lng]) as any; + } + map.fitBounds(bounds, { padding: [30, 30] }); + }, [points, map]); + return null; +} + +export default function CompanyMap({ companies, selectedId, onSelect, autoFit = true }: Props) { + const selected = useMemo( + () => companies.find((c) => c.id === selectedId), + [companies, selectedId] + ); + + const center = useMemo<[number, number]>(() => { + if (!companies.length) return [46.0569, 14.5058]; // Ljubljana fallback + const lat = companies.reduce((a, c) => a + c.lat, 0) / companies.length; + const lng = companies.reduce((a, c) => a + c.lng, 0) / companies.length; + return [lat, lng]; + }, [companies]); + + return ( + + + + + + {companies.map((c) => ( + onSelect?.(c.id), + mouseover: (e) => e.target.openPopup(), + }} + > + + + {c.name} + + {c.industry} + + {c.address && {c.address}} + + + + ))} + + + {autoFit && companies.length > 0 && !selected && ( + ({ lat, lng }))} /> + )} + {selected && } + + + ); +} diff --git a/src/components/Sponsor.js b/src/components/Sponsor.js new file mode 100644 index 0000000..cf81370 --- /dev/null +++ b/src/components/Sponsor.js @@ -0,0 +1,59 @@ +import { Container, Stack, Badge, Box, Button, Card, HStack, Image, Heading } from "@chakra-ui/react" + +export default function Sponsor() { + return ( + + Sponzorji meseca + + + Kani Medico + + + The perfect latte + + Caffè latte is a coffee beverage of Italian origin made with espresso + and steamed milk. + + + Hot + Caffeine + + + + + + + + + Hepi Fit + + + The perfect latte + + Caffè latte is a coffee beverage of Italian origin made with espresso + and steamed milk. + + + Hot + Caffeine + + + + + + + + + + ); +} \ No newline at end of file diff --git a/src/lib/constants.js b/src/lib/constants.js new file mode 100644 index 0000000..d34cd75 --- /dev/null +++ b/src/lib/constants.js @@ -0,0 +1,42 @@ +export const MENU_ITEMS = [ + { + label: "Veterinarji", + icon: "", + href: "/veterinarji" + }, + { + label: "Trgovine", + icon: "", + href: "/trgovine" + }, + { + label: "Vzgoja", + icon: "", + href: "/vzgoja" + }, + { + label: "Varstvo in sprehajanje", + icon: "", + href: "/varstvo-in-sprehajanje" + },{ + label: "Frizerji", + icon: "", + href: "/frizerji" + },{ + label: "Društva", + icon: "", + href: "/drustva" + },{ + label: "Rejci živali", + icon: "", + href: "/rejci-zivali" + },{ + label: "Zavetišča", + icon: "", + href: "/zavetisca" + },{ + label: "Ostalo", + icon: "", + href: "/ostalo" + }, +] \ No newline at end of file diff --git a/src/utils/supabase/server.ts b/src/utils/supabase/server.ts new file mode 100644 index 0000000..a46cfa6 --- /dev/null +++ b/src/utils/supabase/server.ts @@ -0,0 +1,29 @@ +import { createServerClient } from '@supabase/ssr' +import { cookies } from 'next/headers' + +export async function createClient() { + const cookieStore = await cookies() + + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return cookieStore.getAll() + }, + setAll(cookiesToSet) { + try { + cookiesToSet.forEach(({ name, value, options }) => + cookieStore.set(name, value, options) + ) + } catch { + // The `setAll` method was called from a Server Component. + // This can be ignored if you have middleware refreshing + // user sessions. + } + }, + }, + } + ) +} \ No newline at end of file