├── backend
├── .gitignore
├── devices_backend
│ ├── devices
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── api.py
│ │ ├── apps.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── schemas.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── devices_backend
│ │ ├── __init__.py
│ │ ├── asgi.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ └── manage.py
├── requests.http
└── requirements.txt
└── devices-frontend
├── .gitignore
├── README.md
├── jsconfig.json
├── next.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
├── next.svg
└── vercel.svg
├── src
└── app
│ ├── components
│ ├── CreateDeviceForm.js
│ └── LocationModal.js
│ ├── devices
│ ├── [slug]
│ │ └── page.js
│ ├── create
│ │ └── page.js
│ └── page.js
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.js
│ └── page.js
└── tailwind.config.js
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | venv-devices
2 | db.sqlite3
3 | __pycache__
4 | *.pyc
5 | .env
--------------------------------------------------------------------------------
/backend/devices_backend/devices/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bugbytes-io/django-ninja-nextjs-video/ac76a45432bef6d4bba4bd26ce31d8c20b26068c/backend/devices_backend/devices/__init__.py
--------------------------------------------------------------------------------
/backend/devices_backend/devices/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from devices.models import Device, Location
3 |
4 | # Register your models here.
5 | admin.site.register(Device)
6 | admin.site.register(Location)
--------------------------------------------------------------------------------
/backend/devices_backend/devices/api.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import get_object_or_404
2 | from ninja_extra import NinjaExtraAPI, api_controller, route, permissions, throttle
3 | from devices.models import Device, Location
4 | from devices.schemas import (
5 | DeviceSchema,
6 | LocationSchema,
7 | DeviceCreateSchema,
8 | Error,
9 | DeviceLocationPatch,
10 | )
11 |
12 |
13 | app = NinjaExtraAPI()
14 |
15 | @api_controller('/devices', tags=['Devices'], permissions=[permissions.IsAuthenticatedOrReadOnly])
16 | class DeviceController:
17 |
18 | @route.get("/", response=list[DeviceSchema], permissions=[])
19 | @throttle
20 | def get_devices(self):
21 | return Device.objects.all()
22 |
23 | @route.post("/", response={200: DeviceSchema, 404: Error})
24 | def create_device(self, device: DeviceCreateSchema):
25 | if device.location_id:
26 | # we have a location ID in the body
27 | location_exists = Location.objects.filter(id=device.location_id).exists()
28 | if not location_exists:
29 | return 404, {"message": "Location not found"}
30 |
31 | device_data = device.model_dump()
32 | device_model = Device.objects.create(**device_data)
33 | return device_model
34 |
35 | @route.get("/{slug}/", response=DeviceSchema)
36 | def get_device(self, slug: str):
37 | device = get_object_or_404(Device, slug=slug)
38 | return device
39 |
40 |
41 | @route.post('/{device_slug}/set-location/', response=DeviceSchema)
42 | def update_device_location(self, device_slug, location: DeviceLocationPatch):
43 | device = get_object_or_404(Device, slug=device_slug)
44 | if location.location_id:
45 | location = get_object_or_404(Location, id=location.location_id)
46 | device.location = location
47 | else:
48 | device.location = None
49 |
50 | device.save()
51 | return device
52 |
53 |
54 | @api_controller('/locations', tags=['Locations'], permissions=[])
55 | class LocationController:
56 | @route.get("/", response=list[LocationSchema])
57 | def get_locations(self):
58 | return Location.objects.all()
59 |
60 |
61 | app.register_controllers(
62 | DeviceController,
63 | LocationController
64 | )
--------------------------------------------------------------------------------
/backend/devices_backend/devices/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class DevicesConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'devices'
7 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.0 on 2023-12-29 18:21
2 |
3 | import django.db.models.deletion
4 | import django_extensions.db.fields
5 | import uuid
6 | from django.db import migrations, models
7 |
8 |
9 | class Migration(migrations.Migration):
10 |
11 | initial = True
12 |
13 | dependencies = [
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='Location',
19 | fields=[
20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('name', models.CharField(max_length=200)),
22 | ],
23 | ),
24 | migrations.CreateModel(
25 | name='Device',
26 | fields=[
27 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
28 | ('name', models.CharField(max_length=200)),
29 | ('slug', django_extensions.db.fields.AutoSlugField(blank=True, editable=False, populate_from='name')),
30 | ('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devices.location')),
31 | ],
32 | ),
33 | ]
34 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bugbytes-io/django-ninja-nextjs-video/ac76a45432bef6d4bba4bd26ce31d8c20b26068c/backend/devices_backend/devices/migrations/__init__.py
--------------------------------------------------------------------------------
/backend/devices_backend/devices/models.py:
--------------------------------------------------------------------------------
1 | import uuid
2 | from django.db import models
3 | from django_extensions.db.fields import AutoSlugField
4 |
5 | # Create your models here.
6 | class Location(models.Model):
7 | name = models.CharField(max_length=200)
8 |
9 | def __str__(self):
10 | return self.name
11 |
12 | class Device(models.Model):
13 | id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
14 | name = models.CharField(max_length=200)
15 | slug = AutoSlugField(populate_from='name') # CO2 Sensor -> co2-sensor
16 | location = models.ForeignKey(
17 | Location,
18 | on_delete=models.SET_NULL,
19 | null=True,
20 | blank=True
21 | )
22 |
23 | def __str__(self):
24 | return f"{self.name} - {self.id}"
--------------------------------------------------------------------------------
/backend/devices_backend/devices/schemas.py:
--------------------------------------------------------------------------------
1 | from ninja import ModelSchema, Schema
2 | from devices.models import Device, Location
3 |
4 | class LocationSchema(ModelSchema):
5 | class Meta:
6 | model = Location
7 | fields = ('id', 'name')
8 |
9 |
10 | class DeviceSchema(ModelSchema):
11 | location: LocationSchema | None = None
12 |
13 | class Meta:
14 | model = Device
15 | fields = ('id', 'name', 'slug', 'location')
16 |
17 |
18 | class DeviceCreateSchema(Schema):
19 | name: str
20 | location_id: int | None = None
21 |
22 |
23 | class Error(Schema):
24 | message: str
25 |
26 | class DeviceLocationPatch(Schema):
27 | location_id: int | None = None
--------------------------------------------------------------------------------
/backend/devices_backend/devices/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices/views.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import render
2 |
3 | # Create your views here.
4 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices_backend/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bugbytes-io/django-ninja-nextjs-video/ac76a45432bef6d4bba4bd26ce31d8c20b26068c/backend/devices_backend/devices_backend/__init__.py
--------------------------------------------------------------------------------
/backend/devices_backend/devices_backend/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for devices_backend project.
3 |
4 | It exposes the ASGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.asgi import get_asgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devices_backend.settings')
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices_backend/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for devices_backend project.
3 |
4 | Generated by 'django-admin startproject' using Django 5.0.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/5.0/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/5.0/ref/settings/
11 | """
12 |
13 | from pathlib import Path
14 |
15 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
16 | BASE_DIR = Path(__file__).resolve().parent.parent
17 |
18 |
19 | # Quick-start development settings - unsuitable for production
20 | # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
21 |
22 | # SECURITY WARNING: keep the secret key used in production secret!
23 | SECRET_KEY = 'django-insecure-kyfw_6e9cx)n@=dyz)cnr^5tq(b!dyd568!yivr+sjema@yu1s'
24 |
25 | # SECURITY WARNING: don't run with debug turned on in production!
26 | DEBUG = True
27 |
28 | ALLOWED_HOSTS = []
29 |
30 |
31 | # Application definition
32 |
33 | INSTALLED_APPS = [
34 | 'django.contrib.admin',
35 | 'django.contrib.auth',
36 | 'django.contrib.contenttypes',
37 | 'django.contrib.sessions',
38 | 'django.contrib.messages',
39 | 'django.contrib.staticfiles',
40 | 'devices',
41 | 'django_extensions',
42 | 'corsheaders',
43 | 'ninja_extra',
44 | ]
45 |
46 | MIDDLEWARE = [
47 | 'django.middleware.security.SecurityMiddleware',
48 | 'django.contrib.sessions.middleware.SessionMiddleware',
49 | "corsheaders.middleware.CorsMiddleware",
50 | 'django.middleware.common.CommonMiddleware',
51 | 'django.middleware.csrf.CsrfViewMiddleware',
52 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
53 | 'django.contrib.messages.middleware.MessageMiddleware',
54 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
55 | ]
56 |
57 | ROOT_URLCONF = 'devices_backend.urls'
58 |
59 | TEMPLATES = [
60 | {
61 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
62 | 'DIRS': [],
63 | 'APP_DIRS': True,
64 | 'OPTIONS': {
65 | 'context_processors': [
66 | 'django.template.context_processors.debug',
67 | 'django.template.context_processors.request',
68 | 'django.contrib.auth.context_processors.auth',
69 | 'django.contrib.messages.context_processors.messages',
70 | ],
71 | },
72 | },
73 | ]
74 |
75 | WSGI_APPLICATION = 'devices_backend.wsgi.application'
76 |
77 |
78 | # Database
79 | # https://docs.djangoproject.com/en/5.0/ref/settings/#databases
80 |
81 | DATABASES = {
82 | 'default': {
83 | 'ENGINE': 'django.db.backends.sqlite3',
84 | 'NAME': BASE_DIR / 'db.sqlite3',
85 | }
86 | }
87 |
88 |
89 | # Password validation
90 | # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
91 |
92 | AUTH_PASSWORD_VALIDATORS = [
93 | {
94 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
95 | },
96 | {
97 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
98 | },
99 | {
100 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
101 | },
102 | {
103 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
104 | },
105 | ]
106 |
107 |
108 | # Internationalization
109 | # https://docs.djangoproject.com/en/5.0/topics/i18n/
110 |
111 | LANGUAGE_CODE = 'en-us'
112 |
113 | TIME_ZONE = 'UTC'
114 |
115 | USE_I18N = True
116 |
117 | USE_TZ = True
118 |
119 |
120 | # Static files (CSS, JavaScript, Images)
121 | # https://docs.djangoproject.com/en/5.0/howto/static-files/
122 |
123 | STATIC_URL = 'static/'
124 |
125 | # Default primary key field type
126 | # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
127 |
128 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
129 |
130 | CORS_ALLOWED_ORIGINS = [
131 | "http://localhost:3000"
132 | ]
133 |
134 | NINJA_EXTRA = {
135 | 'THROTTLE_CLASSES': [
136 | "ninja_extra.throttling.AnonRateThrottle",
137 | "ninja_extra.throttling.UserRateThrottle",
138 | ],
139 | 'THROTTLE_RATES': {
140 | 'user': '1000/day',
141 | 'anon': '2/day',
142 | },
143 | 'NUM_PROXIES': None
144 | }
--------------------------------------------------------------------------------
/backend/devices_backend/devices_backend/urls.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.urls import path
3 | from devices.api import app
4 |
5 | urlpatterns = [
6 | path('admin/', admin.site.urls),
7 | path('api/', app.urls)
8 | ]
9 |
--------------------------------------------------------------------------------
/backend/devices_backend/devices_backend/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for devices_backend project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devices_backend.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/backend/devices_backend/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devices_backend.settings')
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == '__main__':
22 | main()
23 |
--------------------------------------------------------------------------------
/backend/requests.http:
--------------------------------------------------------------------------------
1 | POST http://localhost:8000/api/devices/
2 | Content-Type: application/json
3 |
4 | {
5 | "name": "New Sensor",
6 | "location_id": 2
7 | }
8 |
9 | ###
10 | POST http://localhost:8000/api/devices/co2-sensor/set-location/
11 | Content-Type: application/json
12 |
13 | {
14 | "location_id": 1
15 | }
--------------------------------------------------------------------------------
/backend/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bugbytes-io/django-ninja-nextjs-video/ac76a45432bef6d4bba4bd26ce31d8c20b26068c/backend/requirements.txt
--------------------------------------------------------------------------------
/devices-frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/devices-frontend/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
37 |
--------------------------------------------------------------------------------
/devices-frontend/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./src/*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/devices-frontend/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {}
3 |
4 | module.exports = nextConfig
5 |
--------------------------------------------------------------------------------
/devices-frontend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "devices-frontend",
3 | "version": "0.1.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "devices-frontend",
9 | "version": "0.1.0",
10 | "dependencies": {
11 | "next": "14.0.4",
12 | "react": "^18",
13 | "react-dom": "^18"
14 | },
15 | "devDependencies": {
16 | "autoprefixer": "^10.0.1",
17 | "daisyui": "^4.6.0",
18 | "postcss": "^8",
19 | "tailwindcss": "^3.3.0"
20 | }
21 | },
22 | "node_modules/@alloc/quick-lru": {
23 | "version": "5.2.0",
24 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
25 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
26 | "dev": true,
27 | "engines": {
28 | "node": ">=10"
29 | },
30 | "funding": {
31 | "url": "https://github.com/sponsors/sindresorhus"
32 | }
33 | },
34 | "node_modules/@isaacs/cliui": {
35 | "version": "8.0.2",
36 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
37 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
38 | "dev": true,
39 | "dependencies": {
40 | "string-width": "^5.1.2",
41 | "string-width-cjs": "npm:string-width@^4.2.0",
42 | "strip-ansi": "^7.0.1",
43 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
44 | "wrap-ansi": "^8.1.0",
45 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
46 | },
47 | "engines": {
48 | "node": ">=12"
49 | }
50 | },
51 | "node_modules/@jridgewell/gen-mapping": {
52 | "version": "0.3.3",
53 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
54 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
55 | "dev": true,
56 | "dependencies": {
57 | "@jridgewell/set-array": "^1.0.1",
58 | "@jridgewell/sourcemap-codec": "^1.4.10",
59 | "@jridgewell/trace-mapping": "^0.3.9"
60 | },
61 | "engines": {
62 | "node": ">=6.0.0"
63 | }
64 | },
65 | "node_modules/@jridgewell/resolve-uri": {
66 | "version": "3.1.1",
67 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
68 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
69 | "dev": true,
70 | "engines": {
71 | "node": ">=6.0.0"
72 | }
73 | },
74 | "node_modules/@jridgewell/set-array": {
75 | "version": "1.1.2",
76 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
77 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
78 | "dev": true,
79 | "engines": {
80 | "node": ">=6.0.0"
81 | }
82 | },
83 | "node_modules/@jridgewell/sourcemap-codec": {
84 | "version": "1.4.15",
85 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
86 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
87 | "dev": true
88 | },
89 | "node_modules/@jridgewell/trace-mapping": {
90 | "version": "0.3.20",
91 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
92 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
93 | "dev": true,
94 | "dependencies": {
95 | "@jridgewell/resolve-uri": "^3.1.0",
96 | "@jridgewell/sourcemap-codec": "^1.4.14"
97 | }
98 | },
99 | "node_modules/@next/env": {
100 | "version": "14.0.4",
101 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz",
102 | "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ=="
103 | },
104 | "node_modules/@next/swc-darwin-arm64": {
105 | "version": "14.0.4",
106 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz",
107 | "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==",
108 | "cpu": [
109 | "arm64"
110 | ],
111 | "optional": true,
112 | "os": [
113 | "darwin"
114 | ],
115 | "engines": {
116 | "node": ">= 10"
117 | }
118 | },
119 | "node_modules/@next/swc-darwin-x64": {
120 | "version": "14.0.4",
121 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz",
122 | "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==",
123 | "cpu": [
124 | "x64"
125 | ],
126 | "optional": true,
127 | "os": [
128 | "darwin"
129 | ],
130 | "engines": {
131 | "node": ">= 10"
132 | }
133 | },
134 | "node_modules/@next/swc-linux-arm64-gnu": {
135 | "version": "14.0.4",
136 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz",
137 | "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==",
138 | "cpu": [
139 | "arm64"
140 | ],
141 | "optional": true,
142 | "os": [
143 | "linux"
144 | ],
145 | "engines": {
146 | "node": ">= 10"
147 | }
148 | },
149 | "node_modules/@next/swc-linux-arm64-musl": {
150 | "version": "14.0.4",
151 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz",
152 | "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==",
153 | "cpu": [
154 | "arm64"
155 | ],
156 | "optional": true,
157 | "os": [
158 | "linux"
159 | ],
160 | "engines": {
161 | "node": ">= 10"
162 | }
163 | },
164 | "node_modules/@next/swc-linux-x64-gnu": {
165 | "version": "14.0.4",
166 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz",
167 | "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==",
168 | "cpu": [
169 | "x64"
170 | ],
171 | "optional": true,
172 | "os": [
173 | "linux"
174 | ],
175 | "engines": {
176 | "node": ">= 10"
177 | }
178 | },
179 | "node_modules/@next/swc-linux-x64-musl": {
180 | "version": "14.0.4",
181 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz",
182 | "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==",
183 | "cpu": [
184 | "x64"
185 | ],
186 | "optional": true,
187 | "os": [
188 | "linux"
189 | ],
190 | "engines": {
191 | "node": ">= 10"
192 | }
193 | },
194 | "node_modules/@next/swc-win32-arm64-msvc": {
195 | "version": "14.0.4",
196 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz",
197 | "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==",
198 | "cpu": [
199 | "arm64"
200 | ],
201 | "optional": true,
202 | "os": [
203 | "win32"
204 | ],
205 | "engines": {
206 | "node": ">= 10"
207 | }
208 | },
209 | "node_modules/@next/swc-win32-ia32-msvc": {
210 | "version": "14.0.4",
211 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz",
212 | "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==",
213 | "cpu": [
214 | "ia32"
215 | ],
216 | "optional": true,
217 | "os": [
218 | "win32"
219 | ],
220 | "engines": {
221 | "node": ">= 10"
222 | }
223 | },
224 | "node_modules/@next/swc-win32-x64-msvc": {
225 | "version": "14.0.4",
226 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz",
227 | "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==",
228 | "cpu": [
229 | "x64"
230 | ],
231 | "optional": true,
232 | "os": [
233 | "win32"
234 | ],
235 | "engines": {
236 | "node": ">= 10"
237 | }
238 | },
239 | "node_modules/@nodelib/fs.scandir": {
240 | "version": "2.1.5",
241 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
242 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
243 | "dev": true,
244 | "dependencies": {
245 | "@nodelib/fs.stat": "2.0.5",
246 | "run-parallel": "^1.1.9"
247 | },
248 | "engines": {
249 | "node": ">= 8"
250 | }
251 | },
252 | "node_modules/@nodelib/fs.stat": {
253 | "version": "2.0.5",
254 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
255 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
256 | "dev": true,
257 | "engines": {
258 | "node": ">= 8"
259 | }
260 | },
261 | "node_modules/@nodelib/fs.walk": {
262 | "version": "1.2.8",
263 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
264 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
265 | "dev": true,
266 | "dependencies": {
267 | "@nodelib/fs.scandir": "2.1.5",
268 | "fastq": "^1.6.0"
269 | },
270 | "engines": {
271 | "node": ">= 8"
272 | }
273 | },
274 | "node_modules/@pkgjs/parseargs": {
275 | "version": "0.11.0",
276 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
277 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
278 | "dev": true,
279 | "optional": true,
280 | "engines": {
281 | "node": ">=14"
282 | }
283 | },
284 | "node_modules/@swc/helpers": {
285 | "version": "0.5.2",
286 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
287 | "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
288 | "dependencies": {
289 | "tslib": "^2.4.0"
290 | }
291 | },
292 | "node_modules/ansi-regex": {
293 | "version": "6.0.1",
294 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
295 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
296 | "dev": true,
297 | "engines": {
298 | "node": ">=12"
299 | },
300 | "funding": {
301 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
302 | }
303 | },
304 | "node_modules/ansi-styles": {
305 | "version": "6.2.1",
306 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
307 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
308 | "dev": true,
309 | "engines": {
310 | "node": ">=12"
311 | },
312 | "funding": {
313 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
314 | }
315 | },
316 | "node_modules/any-promise": {
317 | "version": "1.3.0",
318 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
319 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
320 | "dev": true
321 | },
322 | "node_modules/anymatch": {
323 | "version": "3.1.3",
324 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
325 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
326 | "dev": true,
327 | "dependencies": {
328 | "normalize-path": "^3.0.0",
329 | "picomatch": "^2.0.4"
330 | },
331 | "engines": {
332 | "node": ">= 8"
333 | }
334 | },
335 | "node_modules/arg": {
336 | "version": "5.0.2",
337 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
338 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
339 | "dev": true
340 | },
341 | "node_modules/autoprefixer": {
342 | "version": "10.4.16",
343 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
344 | "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
345 | "dev": true,
346 | "funding": [
347 | {
348 | "type": "opencollective",
349 | "url": "https://opencollective.com/postcss/"
350 | },
351 | {
352 | "type": "tidelift",
353 | "url": "https://tidelift.com/funding/github/npm/autoprefixer"
354 | },
355 | {
356 | "type": "github",
357 | "url": "https://github.com/sponsors/ai"
358 | }
359 | ],
360 | "dependencies": {
361 | "browserslist": "^4.21.10",
362 | "caniuse-lite": "^1.0.30001538",
363 | "fraction.js": "^4.3.6",
364 | "normalize-range": "^0.1.2",
365 | "picocolors": "^1.0.0",
366 | "postcss-value-parser": "^4.2.0"
367 | },
368 | "bin": {
369 | "autoprefixer": "bin/autoprefixer"
370 | },
371 | "engines": {
372 | "node": "^10 || ^12 || >=14"
373 | },
374 | "peerDependencies": {
375 | "postcss": "^8.1.0"
376 | }
377 | },
378 | "node_modules/balanced-match": {
379 | "version": "1.0.2",
380 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
381 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
382 | "dev": true
383 | },
384 | "node_modules/binary-extensions": {
385 | "version": "2.2.0",
386 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
387 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
388 | "dev": true,
389 | "engines": {
390 | "node": ">=8"
391 | }
392 | },
393 | "node_modules/brace-expansion": {
394 | "version": "2.0.1",
395 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
396 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
397 | "dev": true,
398 | "dependencies": {
399 | "balanced-match": "^1.0.0"
400 | }
401 | },
402 | "node_modules/braces": {
403 | "version": "3.0.2",
404 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
405 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
406 | "dev": true,
407 | "dependencies": {
408 | "fill-range": "^7.0.1"
409 | },
410 | "engines": {
411 | "node": ">=8"
412 | }
413 | },
414 | "node_modules/browserslist": {
415 | "version": "4.22.2",
416 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
417 | "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
418 | "dev": true,
419 | "funding": [
420 | {
421 | "type": "opencollective",
422 | "url": "https://opencollective.com/browserslist"
423 | },
424 | {
425 | "type": "tidelift",
426 | "url": "https://tidelift.com/funding/github/npm/browserslist"
427 | },
428 | {
429 | "type": "github",
430 | "url": "https://github.com/sponsors/ai"
431 | }
432 | ],
433 | "dependencies": {
434 | "caniuse-lite": "^1.0.30001565",
435 | "electron-to-chromium": "^1.4.601",
436 | "node-releases": "^2.0.14",
437 | "update-browserslist-db": "^1.0.13"
438 | },
439 | "bin": {
440 | "browserslist": "cli.js"
441 | },
442 | "engines": {
443 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
444 | }
445 | },
446 | "node_modules/busboy": {
447 | "version": "1.6.0",
448 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
449 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
450 | "dependencies": {
451 | "streamsearch": "^1.1.0"
452 | },
453 | "engines": {
454 | "node": ">=10.16.0"
455 | }
456 | },
457 | "node_modules/camelcase-css": {
458 | "version": "2.0.1",
459 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
460 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
461 | "dev": true,
462 | "engines": {
463 | "node": ">= 6"
464 | }
465 | },
466 | "node_modules/caniuse-lite": {
467 | "version": "1.0.30001574",
468 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz",
469 | "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==",
470 | "funding": [
471 | {
472 | "type": "opencollective",
473 | "url": "https://opencollective.com/browserslist"
474 | },
475 | {
476 | "type": "tidelift",
477 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
478 | },
479 | {
480 | "type": "github",
481 | "url": "https://github.com/sponsors/ai"
482 | }
483 | ]
484 | },
485 | "node_modules/chokidar": {
486 | "version": "3.5.3",
487 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
488 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
489 | "dev": true,
490 | "funding": [
491 | {
492 | "type": "individual",
493 | "url": "https://paulmillr.com/funding/"
494 | }
495 | ],
496 | "dependencies": {
497 | "anymatch": "~3.1.2",
498 | "braces": "~3.0.2",
499 | "glob-parent": "~5.1.2",
500 | "is-binary-path": "~2.1.0",
501 | "is-glob": "~4.0.1",
502 | "normalize-path": "~3.0.0",
503 | "readdirp": "~3.6.0"
504 | },
505 | "engines": {
506 | "node": ">= 8.10.0"
507 | },
508 | "optionalDependencies": {
509 | "fsevents": "~2.3.2"
510 | }
511 | },
512 | "node_modules/chokidar/node_modules/glob-parent": {
513 | "version": "5.1.2",
514 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
515 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
516 | "dev": true,
517 | "dependencies": {
518 | "is-glob": "^4.0.1"
519 | },
520 | "engines": {
521 | "node": ">= 6"
522 | }
523 | },
524 | "node_modules/client-only": {
525 | "version": "0.0.1",
526 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
527 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
528 | },
529 | "node_modules/color-convert": {
530 | "version": "2.0.1",
531 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
532 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
533 | "dev": true,
534 | "dependencies": {
535 | "color-name": "~1.1.4"
536 | },
537 | "engines": {
538 | "node": ">=7.0.0"
539 | }
540 | },
541 | "node_modules/color-name": {
542 | "version": "1.1.4",
543 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
544 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
545 | "dev": true
546 | },
547 | "node_modules/commander": {
548 | "version": "4.1.1",
549 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
550 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
551 | "dev": true,
552 | "engines": {
553 | "node": ">= 6"
554 | }
555 | },
556 | "node_modules/cross-spawn": {
557 | "version": "7.0.3",
558 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
559 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
560 | "dev": true,
561 | "dependencies": {
562 | "path-key": "^3.1.0",
563 | "shebang-command": "^2.0.0",
564 | "which": "^2.0.1"
565 | },
566 | "engines": {
567 | "node": ">= 8"
568 | }
569 | },
570 | "node_modules/css-selector-tokenizer": {
571 | "version": "0.8.0",
572 | "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
573 | "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
574 | "dev": true,
575 | "dependencies": {
576 | "cssesc": "^3.0.0",
577 | "fastparse": "^1.1.2"
578 | }
579 | },
580 | "node_modules/cssesc": {
581 | "version": "3.0.0",
582 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
583 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
584 | "dev": true,
585 | "bin": {
586 | "cssesc": "bin/cssesc"
587 | },
588 | "engines": {
589 | "node": ">=4"
590 | }
591 | },
592 | "node_modules/culori": {
593 | "version": "3.3.0",
594 | "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
595 | "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
596 | "dev": true,
597 | "engines": {
598 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
599 | }
600 | },
601 | "node_modules/daisyui": {
602 | "version": "4.6.0",
603 | "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.6.0.tgz",
604 | "integrity": "sha512-B5ZB/sczXpp4LMdo/SZrtYY/U2hq+Vr9I15QawuWZ0VwgtSAbuZpAZUftKVryEsPuv3BM0yVlBED0nAmtis/dw==",
605 | "dev": true,
606 | "dependencies": {
607 | "css-selector-tokenizer": "^0.8",
608 | "culori": "^3",
609 | "picocolors": "^1",
610 | "postcss-js": "^4"
611 | },
612 | "engines": {
613 | "node": ">=16.9.0"
614 | },
615 | "funding": {
616 | "type": "opencollective",
617 | "url": "https://opencollective.com/daisyui"
618 | }
619 | },
620 | "node_modules/didyoumean": {
621 | "version": "1.2.2",
622 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
623 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
624 | "dev": true
625 | },
626 | "node_modules/dlv": {
627 | "version": "1.1.3",
628 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
629 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
630 | "dev": true
631 | },
632 | "node_modules/eastasianwidth": {
633 | "version": "0.2.0",
634 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
635 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
636 | "dev": true
637 | },
638 | "node_modules/electron-to-chromium": {
639 | "version": "1.4.623",
640 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz",
641 | "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==",
642 | "dev": true
643 | },
644 | "node_modules/emoji-regex": {
645 | "version": "9.2.2",
646 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
647 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
648 | "dev": true
649 | },
650 | "node_modules/escalade": {
651 | "version": "3.1.1",
652 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
653 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
654 | "dev": true,
655 | "engines": {
656 | "node": ">=6"
657 | }
658 | },
659 | "node_modules/fast-glob": {
660 | "version": "3.3.2",
661 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
662 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
663 | "dev": true,
664 | "dependencies": {
665 | "@nodelib/fs.stat": "^2.0.2",
666 | "@nodelib/fs.walk": "^1.2.3",
667 | "glob-parent": "^5.1.2",
668 | "merge2": "^1.3.0",
669 | "micromatch": "^4.0.4"
670 | },
671 | "engines": {
672 | "node": ">=8.6.0"
673 | }
674 | },
675 | "node_modules/fast-glob/node_modules/glob-parent": {
676 | "version": "5.1.2",
677 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
678 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
679 | "dev": true,
680 | "dependencies": {
681 | "is-glob": "^4.0.1"
682 | },
683 | "engines": {
684 | "node": ">= 6"
685 | }
686 | },
687 | "node_modules/fastparse": {
688 | "version": "1.1.2",
689 | "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
690 | "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
691 | "dev": true
692 | },
693 | "node_modules/fastq": {
694 | "version": "1.16.0",
695 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
696 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
697 | "dev": true,
698 | "dependencies": {
699 | "reusify": "^1.0.4"
700 | }
701 | },
702 | "node_modules/fill-range": {
703 | "version": "7.0.1",
704 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
705 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
706 | "dev": true,
707 | "dependencies": {
708 | "to-regex-range": "^5.0.1"
709 | },
710 | "engines": {
711 | "node": ">=8"
712 | }
713 | },
714 | "node_modules/foreground-child": {
715 | "version": "3.1.1",
716 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
717 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
718 | "dev": true,
719 | "dependencies": {
720 | "cross-spawn": "^7.0.0",
721 | "signal-exit": "^4.0.1"
722 | },
723 | "engines": {
724 | "node": ">=14"
725 | },
726 | "funding": {
727 | "url": "https://github.com/sponsors/isaacs"
728 | }
729 | },
730 | "node_modules/fraction.js": {
731 | "version": "4.3.7",
732 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
733 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
734 | "dev": true,
735 | "engines": {
736 | "node": "*"
737 | },
738 | "funding": {
739 | "type": "patreon",
740 | "url": "https://github.com/sponsors/rawify"
741 | }
742 | },
743 | "node_modules/fsevents": {
744 | "version": "2.3.3",
745 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
746 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
747 | "dev": true,
748 | "hasInstallScript": true,
749 | "optional": true,
750 | "os": [
751 | "darwin"
752 | ],
753 | "engines": {
754 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
755 | }
756 | },
757 | "node_modules/function-bind": {
758 | "version": "1.1.2",
759 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
760 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
761 | "dev": true,
762 | "funding": {
763 | "url": "https://github.com/sponsors/ljharb"
764 | }
765 | },
766 | "node_modules/glob": {
767 | "version": "10.3.10",
768 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
769 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
770 | "dev": true,
771 | "dependencies": {
772 | "foreground-child": "^3.1.0",
773 | "jackspeak": "^2.3.5",
774 | "minimatch": "^9.0.1",
775 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
776 | "path-scurry": "^1.10.1"
777 | },
778 | "bin": {
779 | "glob": "dist/esm/bin.mjs"
780 | },
781 | "engines": {
782 | "node": ">=16 || 14 >=14.17"
783 | },
784 | "funding": {
785 | "url": "https://github.com/sponsors/isaacs"
786 | }
787 | },
788 | "node_modules/glob-parent": {
789 | "version": "6.0.2",
790 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
791 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
792 | "dev": true,
793 | "dependencies": {
794 | "is-glob": "^4.0.3"
795 | },
796 | "engines": {
797 | "node": ">=10.13.0"
798 | }
799 | },
800 | "node_modules/glob-to-regexp": {
801 | "version": "0.4.1",
802 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
803 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
804 | },
805 | "node_modules/graceful-fs": {
806 | "version": "4.2.11",
807 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
808 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
809 | },
810 | "node_modules/hasown": {
811 | "version": "2.0.0",
812 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
813 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
814 | "dev": true,
815 | "dependencies": {
816 | "function-bind": "^1.1.2"
817 | },
818 | "engines": {
819 | "node": ">= 0.4"
820 | }
821 | },
822 | "node_modules/is-binary-path": {
823 | "version": "2.1.0",
824 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
825 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
826 | "dev": true,
827 | "dependencies": {
828 | "binary-extensions": "^2.0.0"
829 | },
830 | "engines": {
831 | "node": ">=8"
832 | }
833 | },
834 | "node_modules/is-core-module": {
835 | "version": "2.13.1",
836 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
837 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
838 | "dev": true,
839 | "dependencies": {
840 | "hasown": "^2.0.0"
841 | },
842 | "funding": {
843 | "url": "https://github.com/sponsors/ljharb"
844 | }
845 | },
846 | "node_modules/is-extglob": {
847 | "version": "2.1.1",
848 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
849 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
850 | "dev": true,
851 | "engines": {
852 | "node": ">=0.10.0"
853 | }
854 | },
855 | "node_modules/is-fullwidth-code-point": {
856 | "version": "3.0.0",
857 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
858 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
859 | "dev": true,
860 | "engines": {
861 | "node": ">=8"
862 | }
863 | },
864 | "node_modules/is-glob": {
865 | "version": "4.0.3",
866 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
867 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
868 | "dev": true,
869 | "dependencies": {
870 | "is-extglob": "^2.1.1"
871 | },
872 | "engines": {
873 | "node": ">=0.10.0"
874 | }
875 | },
876 | "node_modules/is-number": {
877 | "version": "7.0.0",
878 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
879 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
880 | "dev": true,
881 | "engines": {
882 | "node": ">=0.12.0"
883 | }
884 | },
885 | "node_modules/isexe": {
886 | "version": "2.0.0",
887 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
888 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
889 | "dev": true
890 | },
891 | "node_modules/jackspeak": {
892 | "version": "2.3.6",
893 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
894 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
895 | "dev": true,
896 | "dependencies": {
897 | "@isaacs/cliui": "^8.0.2"
898 | },
899 | "engines": {
900 | "node": ">=14"
901 | },
902 | "funding": {
903 | "url": "https://github.com/sponsors/isaacs"
904 | },
905 | "optionalDependencies": {
906 | "@pkgjs/parseargs": "^0.11.0"
907 | }
908 | },
909 | "node_modules/jiti": {
910 | "version": "1.21.0",
911 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
912 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
913 | "dev": true,
914 | "bin": {
915 | "jiti": "bin/jiti.js"
916 | }
917 | },
918 | "node_modules/js-tokens": {
919 | "version": "4.0.0",
920 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
921 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
922 | },
923 | "node_modules/lilconfig": {
924 | "version": "2.1.0",
925 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
926 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
927 | "dev": true,
928 | "engines": {
929 | "node": ">=10"
930 | }
931 | },
932 | "node_modules/lines-and-columns": {
933 | "version": "1.2.4",
934 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
935 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
936 | "dev": true
937 | },
938 | "node_modules/loose-envify": {
939 | "version": "1.4.0",
940 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
941 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
942 | "dependencies": {
943 | "js-tokens": "^3.0.0 || ^4.0.0"
944 | },
945 | "bin": {
946 | "loose-envify": "cli.js"
947 | }
948 | },
949 | "node_modules/lru-cache": {
950 | "version": "10.1.0",
951 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
952 | "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
953 | "dev": true,
954 | "engines": {
955 | "node": "14 || >=16.14"
956 | }
957 | },
958 | "node_modules/merge2": {
959 | "version": "1.4.1",
960 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
961 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
962 | "dev": true,
963 | "engines": {
964 | "node": ">= 8"
965 | }
966 | },
967 | "node_modules/micromatch": {
968 | "version": "4.0.5",
969 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
970 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
971 | "dev": true,
972 | "dependencies": {
973 | "braces": "^3.0.2",
974 | "picomatch": "^2.3.1"
975 | },
976 | "engines": {
977 | "node": ">=8.6"
978 | }
979 | },
980 | "node_modules/minimatch": {
981 | "version": "9.0.3",
982 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
983 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
984 | "dev": true,
985 | "dependencies": {
986 | "brace-expansion": "^2.0.1"
987 | },
988 | "engines": {
989 | "node": ">=16 || 14 >=14.17"
990 | },
991 | "funding": {
992 | "url": "https://github.com/sponsors/isaacs"
993 | }
994 | },
995 | "node_modules/minipass": {
996 | "version": "7.0.4",
997 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
998 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
999 | "dev": true,
1000 | "engines": {
1001 | "node": ">=16 || 14 >=14.17"
1002 | }
1003 | },
1004 | "node_modules/mz": {
1005 | "version": "2.7.0",
1006 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1007 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1008 | "dev": true,
1009 | "dependencies": {
1010 | "any-promise": "^1.0.0",
1011 | "object-assign": "^4.0.1",
1012 | "thenify-all": "^1.0.0"
1013 | }
1014 | },
1015 | "node_modules/nanoid": {
1016 | "version": "3.3.7",
1017 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1018 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1019 | "funding": [
1020 | {
1021 | "type": "github",
1022 | "url": "https://github.com/sponsors/ai"
1023 | }
1024 | ],
1025 | "bin": {
1026 | "nanoid": "bin/nanoid.cjs"
1027 | },
1028 | "engines": {
1029 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1030 | }
1031 | },
1032 | "node_modules/next": {
1033 | "version": "14.0.4",
1034 | "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz",
1035 | "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==",
1036 | "dependencies": {
1037 | "@next/env": "14.0.4",
1038 | "@swc/helpers": "0.5.2",
1039 | "busboy": "1.6.0",
1040 | "caniuse-lite": "^1.0.30001406",
1041 | "graceful-fs": "^4.2.11",
1042 | "postcss": "8.4.31",
1043 | "styled-jsx": "5.1.1",
1044 | "watchpack": "2.4.0"
1045 | },
1046 | "bin": {
1047 | "next": "dist/bin/next"
1048 | },
1049 | "engines": {
1050 | "node": ">=18.17.0"
1051 | },
1052 | "optionalDependencies": {
1053 | "@next/swc-darwin-arm64": "14.0.4",
1054 | "@next/swc-darwin-x64": "14.0.4",
1055 | "@next/swc-linux-arm64-gnu": "14.0.4",
1056 | "@next/swc-linux-arm64-musl": "14.0.4",
1057 | "@next/swc-linux-x64-gnu": "14.0.4",
1058 | "@next/swc-linux-x64-musl": "14.0.4",
1059 | "@next/swc-win32-arm64-msvc": "14.0.4",
1060 | "@next/swc-win32-ia32-msvc": "14.0.4",
1061 | "@next/swc-win32-x64-msvc": "14.0.4"
1062 | },
1063 | "peerDependencies": {
1064 | "@opentelemetry/api": "^1.1.0",
1065 | "react": "^18.2.0",
1066 | "react-dom": "^18.2.0",
1067 | "sass": "^1.3.0"
1068 | },
1069 | "peerDependenciesMeta": {
1070 | "@opentelemetry/api": {
1071 | "optional": true
1072 | },
1073 | "sass": {
1074 | "optional": true
1075 | }
1076 | }
1077 | },
1078 | "node_modules/next/node_modules/postcss": {
1079 | "version": "8.4.31",
1080 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
1081 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
1082 | "funding": [
1083 | {
1084 | "type": "opencollective",
1085 | "url": "https://opencollective.com/postcss/"
1086 | },
1087 | {
1088 | "type": "tidelift",
1089 | "url": "https://tidelift.com/funding/github/npm/postcss"
1090 | },
1091 | {
1092 | "type": "github",
1093 | "url": "https://github.com/sponsors/ai"
1094 | }
1095 | ],
1096 | "dependencies": {
1097 | "nanoid": "^3.3.6",
1098 | "picocolors": "^1.0.0",
1099 | "source-map-js": "^1.0.2"
1100 | },
1101 | "engines": {
1102 | "node": "^10 || ^12 || >=14"
1103 | }
1104 | },
1105 | "node_modules/node-releases": {
1106 | "version": "2.0.14",
1107 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
1108 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
1109 | "dev": true
1110 | },
1111 | "node_modules/normalize-path": {
1112 | "version": "3.0.0",
1113 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1114 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1115 | "dev": true,
1116 | "engines": {
1117 | "node": ">=0.10.0"
1118 | }
1119 | },
1120 | "node_modules/normalize-range": {
1121 | "version": "0.1.2",
1122 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
1123 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
1124 | "dev": true,
1125 | "engines": {
1126 | "node": ">=0.10.0"
1127 | }
1128 | },
1129 | "node_modules/object-assign": {
1130 | "version": "4.1.1",
1131 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1132 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1133 | "dev": true,
1134 | "engines": {
1135 | "node": ">=0.10.0"
1136 | }
1137 | },
1138 | "node_modules/object-hash": {
1139 | "version": "3.0.0",
1140 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1141 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1142 | "dev": true,
1143 | "engines": {
1144 | "node": ">= 6"
1145 | }
1146 | },
1147 | "node_modules/path-key": {
1148 | "version": "3.1.1",
1149 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1150 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1151 | "dev": true,
1152 | "engines": {
1153 | "node": ">=8"
1154 | }
1155 | },
1156 | "node_modules/path-parse": {
1157 | "version": "1.0.7",
1158 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1159 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1160 | "dev": true
1161 | },
1162 | "node_modules/path-scurry": {
1163 | "version": "1.10.1",
1164 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
1165 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
1166 | "dev": true,
1167 | "dependencies": {
1168 | "lru-cache": "^9.1.1 || ^10.0.0",
1169 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1170 | },
1171 | "engines": {
1172 | "node": ">=16 || 14 >=14.17"
1173 | },
1174 | "funding": {
1175 | "url": "https://github.com/sponsors/isaacs"
1176 | }
1177 | },
1178 | "node_modules/picocolors": {
1179 | "version": "1.0.0",
1180 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1181 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1182 | },
1183 | "node_modules/picomatch": {
1184 | "version": "2.3.1",
1185 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1186 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1187 | "dev": true,
1188 | "engines": {
1189 | "node": ">=8.6"
1190 | },
1191 | "funding": {
1192 | "url": "https://github.com/sponsors/jonschlinkert"
1193 | }
1194 | },
1195 | "node_modules/pify": {
1196 | "version": "2.3.0",
1197 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1198 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1199 | "dev": true,
1200 | "engines": {
1201 | "node": ">=0.10.0"
1202 | }
1203 | },
1204 | "node_modules/pirates": {
1205 | "version": "4.0.6",
1206 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
1207 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
1208 | "dev": true,
1209 | "engines": {
1210 | "node": ">= 6"
1211 | }
1212 | },
1213 | "node_modules/postcss": {
1214 | "version": "8.4.33",
1215 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
1216 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
1217 | "dev": true,
1218 | "funding": [
1219 | {
1220 | "type": "opencollective",
1221 | "url": "https://opencollective.com/postcss/"
1222 | },
1223 | {
1224 | "type": "tidelift",
1225 | "url": "https://tidelift.com/funding/github/npm/postcss"
1226 | },
1227 | {
1228 | "type": "github",
1229 | "url": "https://github.com/sponsors/ai"
1230 | }
1231 | ],
1232 | "dependencies": {
1233 | "nanoid": "^3.3.7",
1234 | "picocolors": "^1.0.0",
1235 | "source-map-js": "^1.0.2"
1236 | },
1237 | "engines": {
1238 | "node": "^10 || ^12 || >=14"
1239 | }
1240 | },
1241 | "node_modules/postcss-import": {
1242 | "version": "15.1.0",
1243 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
1244 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
1245 | "dev": true,
1246 | "dependencies": {
1247 | "postcss-value-parser": "^4.0.0",
1248 | "read-cache": "^1.0.0",
1249 | "resolve": "^1.1.7"
1250 | },
1251 | "engines": {
1252 | "node": ">=14.0.0"
1253 | },
1254 | "peerDependencies": {
1255 | "postcss": "^8.0.0"
1256 | }
1257 | },
1258 | "node_modules/postcss-js": {
1259 | "version": "4.0.1",
1260 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
1261 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
1262 | "dev": true,
1263 | "dependencies": {
1264 | "camelcase-css": "^2.0.1"
1265 | },
1266 | "engines": {
1267 | "node": "^12 || ^14 || >= 16"
1268 | },
1269 | "funding": {
1270 | "type": "opencollective",
1271 | "url": "https://opencollective.com/postcss/"
1272 | },
1273 | "peerDependencies": {
1274 | "postcss": "^8.4.21"
1275 | }
1276 | },
1277 | "node_modules/postcss-load-config": {
1278 | "version": "4.0.2",
1279 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
1280 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
1281 | "dev": true,
1282 | "funding": [
1283 | {
1284 | "type": "opencollective",
1285 | "url": "https://opencollective.com/postcss/"
1286 | },
1287 | {
1288 | "type": "github",
1289 | "url": "https://github.com/sponsors/ai"
1290 | }
1291 | ],
1292 | "dependencies": {
1293 | "lilconfig": "^3.0.0",
1294 | "yaml": "^2.3.4"
1295 | },
1296 | "engines": {
1297 | "node": ">= 14"
1298 | },
1299 | "peerDependencies": {
1300 | "postcss": ">=8.0.9",
1301 | "ts-node": ">=9.0.0"
1302 | },
1303 | "peerDependenciesMeta": {
1304 | "postcss": {
1305 | "optional": true
1306 | },
1307 | "ts-node": {
1308 | "optional": true
1309 | }
1310 | }
1311 | },
1312 | "node_modules/postcss-load-config/node_modules/lilconfig": {
1313 | "version": "3.0.0",
1314 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
1315 | "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
1316 | "dev": true,
1317 | "engines": {
1318 | "node": ">=14"
1319 | }
1320 | },
1321 | "node_modules/postcss-nested": {
1322 | "version": "6.0.1",
1323 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
1324 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
1325 | "dev": true,
1326 | "dependencies": {
1327 | "postcss-selector-parser": "^6.0.11"
1328 | },
1329 | "engines": {
1330 | "node": ">=12.0"
1331 | },
1332 | "funding": {
1333 | "type": "opencollective",
1334 | "url": "https://opencollective.com/postcss/"
1335 | },
1336 | "peerDependencies": {
1337 | "postcss": "^8.2.14"
1338 | }
1339 | },
1340 | "node_modules/postcss-selector-parser": {
1341 | "version": "6.0.15",
1342 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
1343 | "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
1344 | "dev": true,
1345 | "dependencies": {
1346 | "cssesc": "^3.0.0",
1347 | "util-deprecate": "^1.0.2"
1348 | },
1349 | "engines": {
1350 | "node": ">=4"
1351 | }
1352 | },
1353 | "node_modules/postcss-value-parser": {
1354 | "version": "4.2.0",
1355 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1356 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1357 | "dev": true
1358 | },
1359 | "node_modules/queue-microtask": {
1360 | "version": "1.2.3",
1361 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1362 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1363 | "dev": true,
1364 | "funding": [
1365 | {
1366 | "type": "github",
1367 | "url": "https://github.com/sponsors/feross"
1368 | },
1369 | {
1370 | "type": "patreon",
1371 | "url": "https://www.patreon.com/feross"
1372 | },
1373 | {
1374 | "type": "consulting",
1375 | "url": "https://feross.org/support"
1376 | }
1377 | ]
1378 | },
1379 | "node_modules/react": {
1380 | "version": "18.2.0",
1381 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
1382 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
1383 | "dependencies": {
1384 | "loose-envify": "^1.1.0"
1385 | },
1386 | "engines": {
1387 | "node": ">=0.10.0"
1388 | }
1389 | },
1390 | "node_modules/react-dom": {
1391 | "version": "18.2.0",
1392 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
1393 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
1394 | "dependencies": {
1395 | "loose-envify": "^1.1.0",
1396 | "scheduler": "^0.23.0"
1397 | },
1398 | "peerDependencies": {
1399 | "react": "^18.2.0"
1400 | }
1401 | },
1402 | "node_modules/read-cache": {
1403 | "version": "1.0.0",
1404 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
1405 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
1406 | "dev": true,
1407 | "dependencies": {
1408 | "pify": "^2.3.0"
1409 | }
1410 | },
1411 | "node_modules/readdirp": {
1412 | "version": "3.6.0",
1413 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1414 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1415 | "dev": true,
1416 | "dependencies": {
1417 | "picomatch": "^2.2.1"
1418 | },
1419 | "engines": {
1420 | "node": ">=8.10.0"
1421 | }
1422 | },
1423 | "node_modules/resolve": {
1424 | "version": "1.22.8",
1425 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
1426 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
1427 | "dev": true,
1428 | "dependencies": {
1429 | "is-core-module": "^2.13.0",
1430 | "path-parse": "^1.0.7",
1431 | "supports-preserve-symlinks-flag": "^1.0.0"
1432 | },
1433 | "bin": {
1434 | "resolve": "bin/resolve"
1435 | },
1436 | "funding": {
1437 | "url": "https://github.com/sponsors/ljharb"
1438 | }
1439 | },
1440 | "node_modules/reusify": {
1441 | "version": "1.0.4",
1442 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1443 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1444 | "dev": true,
1445 | "engines": {
1446 | "iojs": ">=1.0.0",
1447 | "node": ">=0.10.0"
1448 | }
1449 | },
1450 | "node_modules/run-parallel": {
1451 | "version": "1.2.0",
1452 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1453 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1454 | "dev": true,
1455 | "funding": [
1456 | {
1457 | "type": "github",
1458 | "url": "https://github.com/sponsors/feross"
1459 | },
1460 | {
1461 | "type": "patreon",
1462 | "url": "https://www.patreon.com/feross"
1463 | },
1464 | {
1465 | "type": "consulting",
1466 | "url": "https://feross.org/support"
1467 | }
1468 | ],
1469 | "dependencies": {
1470 | "queue-microtask": "^1.2.2"
1471 | }
1472 | },
1473 | "node_modules/scheduler": {
1474 | "version": "0.23.0",
1475 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
1476 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
1477 | "dependencies": {
1478 | "loose-envify": "^1.1.0"
1479 | }
1480 | },
1481 | "node_modules/shebang-command": {
1482 | "version": "2.0.0",
1483 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1484 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1485 | "dev": true,
1486 | "dependencies": {
1487 | "shebang-regex": "^3.0.0"
1488 | },
1489 | "engines": {
1490 | "node": ">=8"
1491 | }
1492 | },
1493 | "node_modules/shebang-regex": {
1494 | "version": "3.0.0",
1495 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1496 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1497 | "dev": true,
1498 | "engines": {
1499 | "node": ">=8"
1500 | }
1501 | },
1502 | "node_modules/signal-exit": {
1503 | "version": "4.1.0",
1504 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1505 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1506 | "dev": true,
1507 | "engines": {
1508 | "node": ">=14"
1509 | },
1510 | "funding": {
1511 | "url": "https://github.com/sponsors/isaacs"
1512 | }
1513 | },
1514 | "node_modules/source-map-js": {
1515 | "version": "1.0.2",
1516 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1517 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1518 | "engines": {
1519 | "node": ">=0.10.0"
1520 | }
1521 | },
1522 | "node_modules/streamsearch": {
1523 | "version": "1.1.0",
1524 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1525 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1526 | "engines": {
1527 | "node": ">=10.0.0"
1528 | }
1529 | },
1530 | "node_modules/string-width": {
1531 | "version": "5.1.2",
1532 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1533 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1534 | "dev": true,
1535 | "dependencies": {
1536 | "eastasianwidth": "^0.2.0",
1537 | "emoji-regex": "^9.2.2",
1538 | "strip-ansi": "^7.0.1"
1539 | },
1540 | "engines": {
1541 | "node": ">=12"
1542 | },
1543 | "funding": {
1544 | "url": "https://github.com/sponsors/sindresorhus"
1545 | }
1546 | },
1547 | "node_modules/string-width-cjs": {
1548 | "name": "string-width",
1549 | "version": "4.2.3",
1550 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1551 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1552 | "dev": true,
1553 | "dependencies": {
1554 | "emoji-regex": "^8.0.0",
1555 | "is-fullwidth-code-point": "^3.0.0",
1556 | "strip-ansi": "^6.0.1"
1557 | },
1558 | "engines": {
1559 | "node": ">=8"
1560 | }
1561 | },
1562 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
1563 | "version": "5.0.1",
1564 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1565 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1566 | "dev": true,
1567 | "engines": {
1568 | "node": ">=8"
1569 | }
1570 | },
1571 | "node_modules/string-width-cjs/node_modules/emoji-regex": {
1572 | "version": "8.0.0",
1573 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1574 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1575 | "dev": true
1576 | },
1577 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
1578 | "version": "6.0.1",
1579 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1580 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1581 | "dev": true,
1582 | "dependencies": {
1583 | "ansi-regex": "^5.0.1"
1584 | },
1585 | "engines": {
1586 | "node": ">=8"
1587 | }
1588 | },
1589 | "node_modules/strip-ansi": {
1590 | "version": "7.1.0",
1591 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
1592 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
1593 | "dev": true,
1594 | "dependencies": {
1595 | "ansi-regex": "^6.0.1"
1596 | },
1597 | "engines": {
1598 | "node": ">=12"
1599 | },
1600 | "funding": {
1601 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1602 | }
1603 | },
1604 | "node_modules/strip-ansi-cjs": {
1605 | "name": "strip-ansi",
1606 | "version": "6.0.1",
1607 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1608 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1609 | "dev": true,
1610 | "dependencies": {
1611 | "ansi-regex": "^5.0.1"
1612 | },
1613 | "engines": {
1614 | "node": ">=8"
1615 | }
1616 | },
1617 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
1618 | "version": "5.0.1",
1619 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1620 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1621 | "dev": true,
1622 | "engines": {
1623 | "node": ">=8"
1624 | }
1625 | },
1626 | "node_modules/styled-jsx": {
1627 | "version": "5.1.1",
1628 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
1629 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
1630 | "dependencies": {
1631 | "client-only": "0.0.1"
1632 | },
1633 | "engines": {
1634 | "node": ">= 12.0.0"
1635 | },
1636 | "peerDependencies": {
1637 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
1638 | },
1639 | "peerDependenciesMeta": {
1640 | "@babel/core": {
1641 | "optional": true
1642 | },
1643 | "babel-plugin-macros": {
1644 | "optional": true
1645 | }
1646 | }
1647 | },
1648 | "node_modules/sucrase": {
1649 | "version": "3.35.0",
1650 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
1651 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
1652 | "dev": true,
1653 | "dependencies": {
1654 | "@jridgewell/gen-mapping": "^0.3.2",
1655 | "commander": "^4.0.0",
1656 | "glob": "^10.3.10",
1657 | "lines-and-columns": "^1.1.6",
1658 | "mz": "^2.7.0",
1659 | "pirates": "^4.0.1",
1660 | "ts-interface-checker": "^0.1.9"
1661 | },
1662 | "bin": {
1663 | "sucrase": "bin/sucrase",
1664 | "sucrase-node": "bin/sucrase-node"
1665 | },
1666 | "engines": {
1667 | "node": ">=16 || 14 >=14.17"
1668 | }
1669 | },
1670 | "node_modules/supports-preserve-symlinks-flag": {
1671 | "version": "1.0.0",
1672 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1673 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1674 | "dev": true,
1675 | "engines": {
1676 | "node": ">= 0.4"
1677 | },
1678 | "funding": {
1679 | "url": "https://github.com/sponsors/ljharb"
1680 | }
1681 | },
1682 | "node_modules/tailwindcss": {
1683 | "version": "3.4.1",
1684 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
1685 | "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
1686 | "dev": true,
1687 | "dependencies": {
1688 | "@alloc/quick-lru": "^5.2.0",
1689 | "arg": "^5.0.2",
1690 | "chokidar": "^3.5.3",
1691 | "didyoumean": "^1.2.2",
1692 | "dlv": "^1.1.3",
1693 | "fast-glob": "^3.3.0",
1694 | "glob-parent": "^6.0.2",
1695 | "is-glob": "^4.0.3",
1696 | "jiti": "^1.19.1",
1697 | "lilconfig": "^2.1.0",
1698 | "micromatch": "^4.0.5",
1699 | "normalize-path": "^3.0.0",
1700 | "object-hash": "^3.0.0",
1701 | "picocolors": "^1.0.0",
1702 | "postcss": "^8.4.23",
1703 | "postcss-import": "^15.1.0",
1704 | "postcss-js": "^4.0.1",
1705 | "postcss-load-config": "^4.0.1",
1706 | "postcss-nested": "^6.0.1",
1707 | "postcss-selector-parser": "^6.0.11",
1708 | "resolve": "^1.22.2",
1709 | "sucrase": "^3.32.0"
1710 | },
1711 | "bin": {
1712 | "tailwind": "lib/cli.js",
1713 | "tailwindcss": "lib/cli.js"
1714 | },
1715 | "engines": {
1716 | "node": ">=14.0.0"
1717 | }
1718 | },
1719 | "node_modules/thenify": {
1720 | "version": "3.3.1",
1721 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
1722 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
1723 | "dev": true,
1724 | "dependencies": {
1725 | "any-promise": "^1.0.0"
1726 | }
1727 | },
1728 | "node_modules/thenify-all": {
1729 | "version": "1.6.0",
1730 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
1731 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
1732 | "dev": true,
1733 | "dependencies": {
1734 | "thenify": ">= 3.1.0 < 4"
1735 | },
1736 | "engines": {
1737 | "node": ">=0.8"
1738 | }
1739 | },
1740 | "node_modules/to-regex-range": {
1741 | "version": "5.0.1",
1742 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1743 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1744 | "dev": true,
1745 | "dependencies": {
1746 | "is-number": "^7.0.0"
1747 | },
1748 | "engines": {
1749 | "node": ">=8.0"
1750 | }
1751 | },
1752 | "node_modules/ts-interface-checker": {
1753 | "version": "0.1.13",
1754 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
1755 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
1756 | "dev": true
1757 | },
1758 | "node_modules/tslib": {
1759 | "version": "2.6.2",
1760 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1761 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
1762 | },
1763 | "node_modules/update-browserslist-db": {
1764 | "version": "1.0.13",
1765 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
1766 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
1767 | "dev": true,
1768 | "funding": [
1769 | {
1770 | "type": "opencollective",
1771 | "url": "https://opencollective.com/browserslist"
1772 | },
1773 | {
1774 | "type": "tidelift",
1775 | "url": "https://tidelift.com/funding/github/npm/browserslist"
1776 | },
1777 | {
1778 | "type": "github",
1779 | "url": "https://github.com/sponsors/ai"
1780 | }
1781 | ],
1782 | "dependencies": {
1783 | "escalade": "^3.1.1",
1784 | "picocolors": "^1.0.0"
1785 | },
1786 | "bin": {
1787 | "update-browserslist-db": "cli.js"
1788 | },
1789 | "peerDependencies": {
1790 | "browserslist": ">= 4.21.0"
1791 | }
1792 | },
1793 | "node_modules/util-deprecate": {
1794 | "version": "1.0.2",
1795 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1796 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1797 | "dev": true
1798 | },
1799 | "node_modules/watchpack": {
1800 | "version": "2.4.0",
1801 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
1802 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
1803 | "dependencies": {
1804 | "glob-to-regexp": "^0.4.1",
1805 | "graceful-fs": "^4.1.2"
1806 | },
1807 | "engines": {
1808 | "node": ">=10.13.0"
1809 | }
1810 | },
1811 | "node_modules/which": {
1812 | "version": "2.0.2",
1813 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1814 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1815 | "dev": true,
1816 | "dependencies": {
1817 | "isexe": "^2.0.0"
1818 | },
1819 | "bin": {
1820 | "node-which": "bin/node-which"
1821 | },
1822 | "engines": {
1823 | "node": ">= 8"
1824 | }
1825 | },
1826 | "node_modules/wrap-ansi": {
1827 | "version": "8.1.0",
1828 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
1829 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1830 | "dev": true,
1831 | "dependencies": {
1832 | "ansi-styles": "^6.1.0",
1833 | "string-width": "^5.0.1",
1834 | "strip-ansi": "^7.0.1"
1835 | },
1836 | "engines": {
1837 | "node": ">=12"
1838 | },
1839 | "funding": {
1840 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1841 | }
1842 | },
1843 | "node_modules/wrap-ansi-cjs": {
1844 | "name": "wrap-ansi",
1845 | "version": "7.0.0",
1846 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1847 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1848 | "dev": true,
1849 | "dependencies": {
1850 | "ansi-styles": "^4.0.0",
1851 | "string-width": "^4.1.0",
1852 | "strip-ansi": "^6.0.0"
1853 | },
1854 | "engines": {
1855 | "node": ">=10"
1856 | },
1857 | "funding": {
1858 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1859 | }
1860 | },
1861 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
1862 | "version": "5.0.1",
1863 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1864 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1865 | "dev": true,
1866 | "engines": {
1867 | "node": ">=8"
1868 | }
1869 | },
1870 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
1871 | "version": "4.3.0",
1872 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1873 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1874 | "dev": true,
1875 | "dependencies": {
1876 | "color-convert": "^2.0.1"
1877 | },
1878 | "engines": {
1879 | "node": ">=8"
1880 | },
1881 | "funding": {
1882 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1883 | }
1884 | },
1885 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
1886 | "version": "8.0.0",
1887 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1888 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1889 | "dev": true
1890 | },
1891 | "node_modules/wrap-ansi-cjs/node_modules/string-width": {
1892 | "version": "4.2.3",
1893 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1894 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1895 | "dev": true,
1896 | "dependencies": {
1897 | "emoji-regex": "^8.0.0",
1898 | "is-fullwidth-code-point": "^3.0.0",
1899 | "strip-ansi": "^6.0.1"
1900 | },
1901 | "engines": {
1902 | "node": ">=8"
1903 | }
1904 | },
1905 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
1906 | "version": "6.0.1",
1907 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1908 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1909 | "dev": true,
1910 | "dependencies": {
1911 | "ansi-regex": "^5.0.1"
1912 | },
1913 | "engines": {
1914 | "node": ">=8"
1915 | }
1916 | },
1917 | "node_modules/yaml": {
1918 | "version": "2.3.4",
1919 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
1920 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
1921 | "dev": true,
1922 | "engines": {
1923 | "node": ">= 14"
1924 | }
1925 | }
1926 | }
1927 | }
1928 |
--------------------------------------------------------------------------------
/devices-frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "devices-frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "next": "14.0.4",
13 | "react": "^18",
14 | "react-dom": "^18"
15 | },
16 | "devDependencies": {
17 | "autoprefixer": "^10.0.1",
18 | "daisyui": "^4.6.0",
19 | "postcss": "^8",
20 | "tailwindcss": "^3.3.0"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/devices-frontend/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/devices-frontend/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/devices-frontend/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/devices-frontend/src/app/components/CreateDeviceForm.js:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import {useState} from 'react'
3 | import { useRouter } from 'next/navigation';
4 |
5 | export default function CreateDeviceForm(props) {
6 | const {locations} = props
7 | const [selectedLocation, setSelectedLocation] = useState('')
8 | const [deviceName, setDeviceName] = useState('')
9 | const router = useRouter()
10 |
11 | const handleSubmit = (e) => {
12 | e.preventDefault()
13 | const endpoint = "http://localhost:8000/api/devices/"
14 | const body = {
15 | name: deviceName,
16 | location_id: selectedLocation || null
17 | }
18 | fetch(endpoint, {method: 'POST', body: JSON.stringify(body)})
19 | .then(response => response.json())
20 | .then(data => {
21 | router.push('/devices')
22 | router.refresh()
23 | })
24 | }
25 |
26 | return (
27 |
54 | )
55 | }
--------------------------------------------------------------------------------
/devices-frontend/src/app/components/LocationModal.js:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import {useState} from 'react'
3 | import { useRouter } from 'next/navigation';
4 |
5 | export default function LocationModal(props) {
6 | const {device, locations} = props // props.device
7 | const [selectedLocation, setSelectedLocation] = useState('')
8 | const router = useRouter()
9 |
10 | const closeModal = (e) => {
11 | e.preventDefault();
12 | document.getElementById('my_modal_1').close()
13 | }
14 |
15 | const handleSubmit = (e) => {
16 | e.preventDefault()
17 | if (!selectedLocation) { return }
18 |
19 | const endpoint = `http://localhost:8000/api/devices/${device.slug}/set-location/`
20 | fetch(endpoint, {
21 | method: 'POST',
22 | body: JSON.stringify({location_id: selectedLocation})
23 | }).then(response => response.json()).then(data => {
24 | router.refresh();
25 | document.getElementById('my_modal_1').close();
26 | })
27 | }
28 |
29 | return (
30 |
31 |
35 |
36 |
62 |
63 |
64 | )
65 | }
--------------------------------------------------------------------------------
/devices-frontend/src/app/devices/[slug]/page.js:
--------------------------------------------------------------------------------
1 | import LocationModal from "@/app/components/LocationModal"
2 |
3 | async function getDevice(slug) {
4 | const endpoint = `http://127.0.0.1:8000/api/devices/${slug}`
5 | const res = await fetch(endpoint, {cache: 'no-store'})
6 |
7 | if (!res.ok) {
8 | // This will activate the closest `error.js` Error Boundary
9 | throw new Error('Failed to fetch data')
10 | }
11 |
12 | return res.json()
13 | }
14 |
15 | async function getLocations() {
16 | const endpoint = "http://127.0.0.1:8000/api/locations"
17 | const res = await fetch(endpoint)
18 |
19 | if (!res.ok) {
20 | // This will activate the closest `error.js` Error Boundary
21 | throw new Error('Failed to fetch data')
22 | }
23 |
24 | return res.json()
25 | }
26 |
27 | export default async function Device({params}) {
28 | const [device, locations] = await Promise.all([getDevice(params.slug), getLocations()])
29 |
30 | return (
31 |
32 |
33 |
Device: {params.slug}
34 |
35 |
36 |
{device.id} - {device.name}
37 |
38 |
39 | { device.location ?
40 |
Current Location: {device.location.name}
41 | :
42 |
Device has no location!
43 | }
44 |
45 |
46 |
47 |
48 |
49 |
50 | )
51 | }
--------------------------------------------------------------------------------
/devices-frontend/src/app/devices/create/page.js:
--------------------------------------------------------------------------------
1 | import CreateDeviceForm from "@/app/components/CreateDeviceForm"
2 |
3 | async function getLocations() {
4 | const endpoint = "http://127.0.0.1:8000/api/locations"
5 | const res = await fetch(endpoint)
6 |
7 | if (!res.ok) {
8 | // This will activate the closest `error.js` Error Boundary
9 | throw new Error('Failed to fetch data')
10 | }
11 |
12 | return res.json()
13 | }
14 |
15 | export default async function DeviceCreate() {
16 | const locations = await getLocations()
17 |
18 | return (
19 |
20 |
Add new device
21 |
22 |
23 |
24 | )
25 |
26 | }
--------------------------------------------------------------------------------
/devices-frontend/src/app/devices/page.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 |
3 | async function getDevices() {
4 | const endpoint = 'http://127.0.0.1:8000/api/devices/'
5 | const res = await fetch(endpoint)
6 |
7 | if (!res.ok) {
8 | // This will activate the closest `error.js` Error Boundary
9 | throw new Error('Failed to fetch data')
10 | }
11 |
12 | return res.json()
13 | }
14 |
15 | export default async function Devices() {
16 | const devices = await getDevices()
17 |
18 | return (
19 |
20 |
My Devices
21 |
22 |
23 | { devices.map(device =>
24 |
25 |
26 | { device.name }
27 |
28 |
29 | ) }
30 |
31 |
32 |
33 |
34 |
35 |
36 | )
37 | }
--------------------------------------------------------------------------------
/devices-frontend/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bugbytes-io/django-ninja-nextjs-video/ac76a45432bef6d4bba4bd26ce31d8c20b26068c/devices-frontend/src/app/favicon.ico
--------------------------------------------------------------------------------
/devices-frontend/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --foreground-rgb: 0, 0, 0;
7 | --background-start-rgb: 214, 219, 220;
8 | --background-end-rgb: 255, 255, 255;
9 | }
10 |
11 | @media (prefers-color-scheme: dark) {
12 | :root {
13 | --foreground-rgb: 255, 255, 255;
14 | --background-start-rgb: 0, 0, 0;
15 | --background-end-rgb: 0, 0, 0;
16 | }
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/devices-frontend/src/app/layout.js:
--------------------------------------------------------------------------------
1 | import { Inter } from 'next/font/google'
2 | import './globals.css'
3 |
4 | const inter = Inter({ subsets: ['latin'] })
5 |
6 | export const metadata = {
7 | title: 'Create Next App',
8 | description: 'Generated by create next app',
9 | }
10 |
11 | export default function RootLayout({ children }) {
12 | return (
13 |
14 | {children}
15 |
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/devices-frontend/src/app/page.js:
--------------------------------------------------------------------------------
1 | import Image from 'next/image'
2 |
3 | export default function Home() {
4 | return (
5 |
6 |
7 |
8 | Get started by editing
9 | src/app/page.js
10 |
11 |
29 |
30 |
31 |
32 |
40 |
41 |
42 |
111 |
112 | )
113 | }
114 |
--------------------------------------------------------------------------------
/devices-frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
5 | './src/components/**/*.{js,ts,jsx,tsx,mdx}',
6 | './src/app/**/*.{js,ts,jsx,tsx,mdx}',
7 | ],
8 | theme: {
9 | extend: {
10 | backgroundImage: {
11 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
12 | 'gradient-conic':
13 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
14 | },
15 | },
16 | },
17 | plugins: [require("daisyui")],
18 | }
19 |
--------------------------------------------------------------------------------