diff --git a/README.md b/README.md index afb6377..3326276 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,23 @@ -# React + TypeScript + Vite +# Attendify logo Attendify -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +Attendify is a modern attendance tracking platform designed for school clubs and organizations. Effortlessly manage attendance, clubs, and members with a clean, intuitive interface. -While this project uses React, Vite supports many popular JS frameworks. [See all the supported frameworks](https://vitejs.dev/guide/#scaffolding-your-first-vite-project). +## Features +- Easy attendance tracking for clubs and events +- Club and member management +- Detailed participation reports +- User-friendly, modern design -## Deploy Your Own +## Getting Started -Deploy your own Vite project with Vercel. +1. Install dependencies: + ```bash + npm install + ``` +2. Start the development server: + ```bash + npm run dev + ``` -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/vercel/vercel/tree/main/examples/vite-react&template=vite-react) - -_Live Example: https://vite-react-example.vercel.app_ - -### Deploying From Your Terminal - -You can deploy your new Vite project with a single command from your terminal using [Vercel CLI](https://vercel.com/download): - -```shell -$ vercel -``` +## License +MIT diff --git a/components.json b/components.json new file mode 100644 index 0000000..1d282e6 --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/database_schema.json b/database_schema.json new file mode 100644 index 0000000..5b20c02 --- /dev/null +++ b/database_schema.json @@ -0,0 +1,1073 @@ +[ + { + "table_name": "attendance", + "index_name": "attendance_event_id_member_id_key", + "column_names": "event_id, member_id", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "attendance", + "index_name": "attendance_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "audit_log_entries", + "index_name": "audit_log_entries_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "audit_log_entries", + "index_name": "audit_logs_instance_id_idx", + "column_names": "instance_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "buckets", + "index_name": "bname", + "column_names": "name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "buckets", + "index_name": "buckets_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "club_owners", + "index_name": "club_owners_pkey", + "column_names": "club_id, user_id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "club_settings", + "index_name": "club_settings_pkey", + "column_names": "club_id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "clubs", + "index_name": "clubs_access_code_key", + "column_names": "access_code", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "clubs", + "index_name": "clubs_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "events", + "index_name": "events_invite_code_key", + "column_names": "invite_code", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "events", + "index_name": "events_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "flow_state", + "index_name": "flow_state_created_at_idx", + "column_names": "created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "flow_state", + "index_name": "flow_state_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "flow_state", + "index_name": "idx_auth_code", + "column_names": "auth_code", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "flow_state", + "index_name": "idx_user_id_auth_method", + "column_names": "user_id, authentication_method", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "identities", + "index_name": "identities_email_idx", + "column_names": "email", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "identities", + "index_name": "identities_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "identities", + "index_name": "identities_provider_id_provider_unique", + "column_names": "provider_id, provider", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "identities", + "index_name": "identities_user_id_idx", + "column_names": "user_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "instances", + "index_name": "instances_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "members", + "index_name": "members_club_id_name_key", + "column_names": "club_id, name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "members", + "index_name": "members_club_id_name_unique", + "column_names": "club_id, name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "members", + "index_name": "members_member_uuid_unique", + "column_names": "member_uuid", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "members", + "index_name": "members_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "messages", + "index_name": "messages_pkey", + "column_names": "id, inserted_at", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "mfa_amr_claims", + "index_name": "amr_id_pk", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "mfa_amr_claims", + "index_name": "mfa_amr_claims_session_id_authentication_method_pkey", + "column_names": "session_id, authentication_method", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "mfa_challenges", + "index_name": "mfa_challenge_created_at_idx", + "column_names": "created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "mfa_challenges", + "index_name": "mfa_challenges_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "mfa_factors", + "index_name": "factor_id_created_at_idx", + "column_names": "user_id, created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "mfa_factors", + "index_name": "mfa_factors_last_challenged_at_key", + "column_names": "last_challenged_at", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "mfa_factors", + "index_name": "mfa_factors_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "mfa_factors", + "index_name": "mfa_factors_user_friendly_name_unique", + "column_names": "friendly_name, user_id", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "mfa_factors", + "index_name": "mfa_factors_user_id_idx", + "column_names": "user_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "mfa_factors", + "index_name": "unique_phone_factor_per_user", + "column_names": "user_id, phone", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "migrations", + "index_name": "migrations_name_key", + "column_names": "name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "migrations", + "index_name": "migrations_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "objects", + "index_name": "bucketid_objname", + "column_names": "bucket_id, name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "objects", + "index_name": "idx_objects_bucket_id_name", + "column_names": "bucket_id, name", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "objects", + "index_name": "name_prefix_search", + "column_names": "name", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "objects", + "index_name": "objects_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "one_time_tokens", + "index_name": "one_time_tokens_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "one_time_tokens", + "index_name": "one_time_tokens_relates_to_hash_idx", + "column_names": "relates_to", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "one_time_tokens", + "index_name": "one_time_tokens_token_hash_hash_idx", + "column_names": "token_hash", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "one_time_tokens", + "index_name": "one_time_tokens_user_id_token_type_key", + "column_names": "user_id, token_type", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "pg_toast_1213", + "index_name": "pg_toast_1213_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1247", + "index_name": "pg_toast_1247_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1255", + "index_name": "pg_toast_1255_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1260", + "index_name": "pg_toast_1260_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1262", + "index_name": "pg_toast_1262_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_13392", + "index_name": "pg_toast_13392_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_13397", + "index_name": "pg_toast_13397_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_13402", + "index_name": "pg_toast_13402_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_13407", + "index_name": "pg_toast_13407_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1417", + "index_name": "pg_toast_1417_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_1418", + "index_name": "pg_toast_1418_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16489", + "index_name": "pg_toast_16489_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16501", + "index_name": "pg_toast_16501_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16512", + "index_name": "pg_toast_16512_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16519", + "index_name": "pg_toast_16519_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16540", + "index_name": "pg_toast_16540_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16555", + "index_name": "pg_toast_16555_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16650", + "index_name": "pg_toast_16650_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16704", + "index_name": "pg_toast_16704_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16734", + "index_name": "pg_toast_16734_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16769", + "index_name": "pg_toast_16769_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16782", + "index_name": "pg_toast_16782_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16794", + "index_name": "pg_toast_16794_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16812", + "index_name": "pg_toast_16812_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16821", + "index_name": "pg_toast_16821_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16836", + "index_name": "pg_toast_16836_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16854", + "index_name": "pg_toast_16854_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16907", + "index_name": "pg_toast_16907_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_16957", + "index_name": "pg_toast_16957_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17014", + "index_name": "pg_toast_17014_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17028", + "index_name": "pg_toast_17028_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17093", + "index_name": "pg_toast_17093_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17266", + "index_name": "pg_toast_17266_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17280", + "index_name": "pg_toast_17280_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17306", + "index_name": "pg_toast_17306_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_17323", + "index_name": "pg_toast_17323_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2328", + "index_name": "pg_toast_2328_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2396", + "index_name": "pg_toast_2396_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2600", + "index_name": "pg_toast_2600_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2604", + "index_name": "pg_toast_2604_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2606", + "index_name": "pg_toast_2606_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2609", + "index_name": "pg_toast_2609_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2612", + "index_name": "pg_toast_2612_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2615", + "index_name": "pg_toast_2615_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2618", + "index_name": "pg_toast_2618_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2619", + "index_name": "pg_toast_2619_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2620", + "index_name": "pg_toast_2620_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_2964", + "index_name": "pg_toast_2964_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3079", + "index_name": "pg_toast_3079_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3118", + "index_name": "pg_toast_3118_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3256", + "index_name": "pg_toast_3256_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3350", + "index_name": "pg_toast_3350_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3381", + "index_name": "pg_toast_3381_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3394", + "index_name": "pg_toast_3394_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3429", + "index_name": "pg_toast_3429_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3456", + "index_name": "pg_toast_3456_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3466", + "index_name": "pg_toast_3466_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3592", + "index_name": "pg_toast_3592_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3596", + "index_name": "pg_toast_3596_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_3600", + "index_name": "pg_toast_3600_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_6000", + "index_name": "pg_toast_6000_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_6100", + "index_name": "pg_toast_6100_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_6106", + "index_name": "pg_toast_6106_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_6243", + "index_name": "pg_toast_6243_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "pg_toast_826", + "index_name": "pg_toast_826_index", + "column_names": "chunk_id, chunk_seq", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "profiles", + "index_name": "profiles_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_instance_id_idx", + "column_names": "instance_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_instance_id_user_id_idx", + "column_names": "instance_id, user_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_parent_idx", + "column_names": "parent", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_session_id_revoked_idx", + "column_names": "session_id, revoked", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_token_unique", + "column_names": "token", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "refresh_tokens", + "index_name": "refresh_tokens_updated_at_idx", + "column_names": "updated_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "s3_multipart_uploads", + "index_name": "idx_multipart_uploads_list", + "column_names": "bucket_id, key, created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "s3_multipart_uploads", + "index_name": "s3_multipart_uploads_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "s3_multipart_uploads_parts", + "index_name": "s3_multipart_uploads_parts_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "saml_providers", + "index_name": "saml_providers_entity_id_key", + "column_names": "entity_id", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "saml_providers", + "index_name": "saml_providers_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "saml_providers", + "index_name": "saml_providers_sso_provider_id_idx", + "column_names": "sso_provider_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "saml_relay_states", + "index_name": "saml_relay_states_created_at_idx", + "column_names": "created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "saml_relay_states", + "index_name": "saml_relay_states_for_email_idx", + "column_names": "for_email", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "saml_relay_states", + "index_name": "saml_relay_states_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "saml_relay_states", + "index_name": "saml_relay_states_sso_provider_id_idx", + "column_names": "sso_provider_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "schema_migrations", + "index_name": "schema_migrations_pkey", + "column_names": "version, version", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "secrets", + "index_name": "secrets_name_idx", + "column_names": "name", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "secrets", + "index_name": "secrets_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "sessions", + "index_name": "sessions_not_after_idx", + "column_names": "not_after", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "sessions", + "index_name": "sessions_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "sessions", + "index_name": "sessions_user_id_idx", + "column_names": "user_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "sessions", + "index_name": "user_id_created_at_idx", + "column_names": "user_id, created_at", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "sso_domains", + "index_name": "sso_domains_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "sso_domains", + "index_name": "sso_domains_sso_provider_id_idx", + "column_names": "sso_provider_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "sso_providers", + "index_name": "sso_providers_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "subscription", + "index_name": "ix_realtime_subscription_entity", + "column_names": "entity", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "subscription", + "index_name": "pk_subscription", + "column_names": "id", + "is_unique": true, + "is_primary": true + }, + { + "table_name": "subscription", + "index_name": "subscription_subscription_id_entity_filters_key", + "column_names": "subscription_id, entity, filters", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "confirmation_token_idx", + "column_names": "confirmation_token", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "email_change_token_current_idx", + "column_names": "email_change_token_current", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "email_change_token_new_idx", + "column_names": "email_change_token_new", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "reauthentication_token_idx", + "column_names": "reauthentication_token", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "recovery_token_idx", + "column_names": "recovery_token", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_email_partial_key", + "column_names": "email", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_instance_id_email_idx", + "column_names": "instance_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_instance_id_idx", + "column_names": "instance_id", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_is_anonymous_idx", + "column_names": "is_anonymous", + "is_unique": false, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_phone_key", + "column_names": "phone", + "is_unique": true, + "is_primary": false + }, + { + "table_name": "users", + "index_name": "users_pkey", + "column_names": "id", + "is_unique": true, + "is_primary": true + } +] \ No newline at end of file diff --git a/db_migration.sql b/db_migration.sql new file mode 100644 index 0000000..252c37a --- /dev/null +++ b/db_migration.sql @@ -0,0 +1,48 @@ +-- Add UUID column to members table if it doesn't exist +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_name = 'members' AND column_name = 'member_uuid' + ) THEN + -- Add the UUID column + ALTER TABLE members ADD COLUMN member_uuid UUID; + + -- Generate UUIDs for existing members + UPDATE members SET member_uuid = gen_random_uuid() WHERE member_uuid IS NULL; + + -- Add a unique constraint to ensure all UUIDs are unique + ALTER TABLE members ADD CONSTRAINT members_member_uuid_unique UNIQUE (member_uuid); + END IF; +END $$; + +-- Add unique constraint combining club_id and name (if desired) +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM pg_constraint + WHERE conname = 'members_club_id_name_unique' + ) THEN + ALTER TABLE members ADD CONSTRAINT members_club_id_name_unique UNIQUE (club_id, name); + END IF; +EXCEPTION + -- Constraint might fail if there are duplicate names - handle gracefully + WHEN unique_violation THEN + RAISE NOTICE 'Could not add unique constraint - duplicate names exist in members table'; +END $$; + +-- Add columns to events table for advanced check-in and recurrence +ALTER TABLE events ADD COLUMN IF NOT EXISTS checkin_location_enabled BOOLEAN DEFAULT FALSE; +ALTER TABLE events ADD COLUMN IF NOT EXISTS checkin_qr_enabled BOOLEAN DEFAULT TRUE; +ALTER TABLE events ADD COLUMN IF NOT EXISTS checkin_code_enabled BOOLEAN DEFAULT FALSE; +ALTER TABLE events ADD COLUMN IF NOT EXISTS checkin_code TEXT; +ALTER TABLE events ADD COLUMN IF NOT EXISTS location_lat DOUBLE PRECISION; +ALTER TABLE events ADD COLUMN IF NOT EXISTS location_lng DOUBLE PRECISION; +ALTER TABLE events ADD COLUMN IF NOT EXISTS location_radius_meters INTEGER; +ALTER TABLE events ADD COLUMN IF NOT EXISTS recurrence TEXT DEFAULT 'none'; -- none, daily, weekly, monthly +ALTER TABLE events ADD COLUMN IF NOT EXISTS recurrence_until DATE; +ALTER TABLE events ADD COLUMN IF NOT EXISTS event_start_time TIMESTAMP; +ALTER TABLE events ADD COLUMN IF NOT EXISTS event_end_time TIMESTAMP; +ALTER TABLE events ADD COLUMN IF NOT EXISTS checkin_only_during_event BOOLEAN DEFAULT TRUE; \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 092408a..c18af1b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -23,6 +23,8 @@ export default tseslint.config( 'warn', { allowConstantExport: true }, ], + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': 'off', }, }, ) diff --git a/index.html b/index.html index e4b78ea..a03681c 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,31 @@ + + + - - - Vite + React + TS + + + Attendify for Clubs & Organizations + + + + + + + + + + + + +
diff --git a/package-lock.json b/package-lock.json index 5819de0..793cccd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,53 @@ { - "name": "vite-react", - "version": "0.0.0", + "name": "attendify", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "vite-react", - "version": "0.0.0", - "dependencies": { - "framer-motion": "^12.7.3", + "name": "attendify", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@heroicons/react": "^2.2.0", + "@hookform/resolvers": "^5.0.1", + "@ionic/react": "^8.5.5", + "@number-flow/react": "^0.5.9", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@supabase/supabase-js": "^2.49.4", + "@types/leaflet": "^1.9.17", + "@types/react-datepicker": "^7.0.0", + "@vercel/analytics": "^1.5.0", + "@vercel/speed-insights": "^1.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "fastest-levenshtein": "^1.0.16", + "framer-motion": "^10.16.4", + "ionicons": "^7.4.0", + "leaflet": "^1.9.4", + "lucide-react": "^0.488.0", + "qrcode.react": "^4.2.0", "react": "^18.3.1", + "react-datepicker": "^8.3.0", + "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", - "react-router-dom": "^7.5.0" + "react-hook-form": "^7.55.0", + "react-leaflet": "^4.2.1", + "react-router-dom": "^7.5.0", + "tailwind-merge": "^3.2.0", + "uuid": "^11.1.0", + "zod": "^3.24.3" }, "devDependencies": { - "@eslint/js": "^9.9.0", + "@eslint/js": "^9.28.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/uuid": "^10.0.0", "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.16", "eslint": "^9.9.0", @@ -25,6 +56,7 @@ "globals": "^15.9.0", "postcss": "^8.4.31", "tailwindcss": "^3.3.5", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", "vite": "^5.4.1" @@ -318,6 +350,21 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -796,12 +843,16 @@ } }, "node_modules/@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -838,6 +889,73 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.7.tgz", + "integrity": "sha512-5V9pwFeiv+95Jlowq/7oiGISSrdXMTs2jfoSy8k+WM6oI/Skm1WWjPdJWeporN2O4UGcsaCJdirKffKayMoPgw==", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.9", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.0.1.tgz", + "integrity": "sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -899,6 +1017,30 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@ionic/core": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.5.tgz", + "integrity": "sha512-CrV93791fMLLmr+U81yTjNuHVFCDTspnB+TBhsWxdAHd5ErBzhlWn4tLjfyL/mRUO1vUy6sxU2oU4X6ooXi4Mg==", + "dependencies": { + "@stencil/core": "4.20.0", + "ionicons": "^7.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/react": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.5.tgz", + "integrity": "sha512-FZQXbWe1vdFQMCP0IbHbCT0BWOwg1IBor7+7RKto5pmU0Ue5OQ6zrK1tHI8DrwWmDwY8GFOx7sOgW8r/N8njFg==", + "dependencies": { + "@ionic/core": "8.5.5", + "ionicons": "^7.0.0", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -999,6 +1141,19 @@ "node": ">= 8" } }, + "node_modules/@number-flow/react": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@number-flow/react/-/react-0.5.9.tgz", + "integrity": "sha512-cletUjLUIV6NoNg36z4CR4khIff3fb4RWzuNx8TOZVw34pUpZlgWpnDpJb4UG8B2QyYAFbptVunW0RiqoHVCDA==", + "dependencies": { + "esm-env": "^1.1.4", + "number-flow": "0.5.7" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1009,6 +1164,577 @@ "node": ">=14" } }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.3.tgz", + "integrity": "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.3.tgz", + "integrity": "sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-slot": "1.2.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.6.tgz", + "integrity": "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.3.tgz", + "integrity": "sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.3.tgz", + "integrity": "sha512-zwSQ1NzSKG95yA0tvBMgv6XPHoqapJCcg9nsUBaQQ66iRBhZNhlpaQG2ERYYX4O4stkYFK5rxj5NsWfO9CS+Hg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.7.tgz", + "integrity": "sha512-I38OYWDmJF2kbO74LX8UsFydSHWOJuQ7LxPnTefjxxvdvPLempvAnmsyX9UsBlywcbSGpRH7oMLfkUf+ij4nrw==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.6", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.3", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.3", + "@radix-ui/react-portal": "1.1.5", + "@radix-ui/react-presence": "1.1.3", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-use-controllable-state": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.3.tgz", + "integrity": "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.5.tgz", + "integrity": "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.3.tgz", + "integrity": "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz", + "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==", + "dependencies": { + "@radix-ui/react-slot": "1.2.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.7.tgz", + "integrity": "sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q==", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.6", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.3", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.3", + "@radix-ui/react-portal": "1.1.5", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.1.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.4.tgz", + "integrity": "sha512-zGP6W8plLeogoeGMiTHJ/uvf+TE1C2chVsEwfP8YlvpQKJHktG+iCkUtCLGPAuDV8/qDSmIRPm4NggaTxFMVBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.0.3", + "@radix-ui/react-use-controllable-state": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.1.tgz", + "integrity": "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.3.tgz", + "integrity": "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + }, + "node_modules/@react-leaflet/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", + "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", @@ -1269,6 +1995,90 @@ "win32" ] }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" + }, + "node_modules/@stencil/core": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.20.0.tgz", + "integrity": "sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + } + }, + "node_modules/@supabase/auth-js": { + "version": "2.69.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.69.1.tgz", + "integrity": "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.4.tgz", + "integrity": "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.19.4.tgz", + "integrity": "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.11.2.tgz", + "integrity": "sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14", + "@types/phoenix": "^1.5.4", + "@types/ws": "^8.5.10", + "ws": "^8.18.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.7.1.tgz", + "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.49.4", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.4.tgz", + "integrity": "sha512-jUF0uRUmS8BKt37t01qaZ88H9yV1mbGYnqLeuFWLcdV+x1P4fl0yP9DGtaEhFPZcwSom7u16GkLEH9QJZOqOkw==", + "dependencies": { + "@supabase/auth-js": "2.69.1", + "@supabase/functions-js": "2.4.4", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.19.4", + "@supabase/realtime-js": "2.11.2", + "@supabase/storage-js": "2.7.1" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1321,37 +2131,86 @@ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/leaflet": { + "version": "1.9.17", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.17.tgz", + "integrity": "sha512-IJ4K6t7I3Fh5qXbQ1uwL3CFVbCi6haW9+53oLWgdKlLP7EaS21byWFJxxqOx9y8I0AP0actXSJLVMbyvxhkUTA==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/phoenix": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", + "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==" + }, "node_modules/@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.3.20", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-datepicker": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-7.0.0.tgz", + "integrity": "sha512-4tWwOUq589tozyQPBVEqGNng5DaZkomx5IVNuur868yYdgjH6RaL373/HKiVt1IDoNNXYiTGspm1F7kjrarM8Q==", + "deprecated": "This is a stub types definition. react-datepicker provides its own type definitions, so you do not need this installed.", + "dependencies": { + "react-datepicker": "*" + } + }, "node_modules/@types/react-dom": { "version": "18.3.6", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", - "dev": true, + "devOptional": true, "peerDependencies": { "@types/react": "^18.0.0" } }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", @@ -1560,6 +2419,77 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vercel/analytics": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz", + "integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/@vercel/speed-insights": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.2.0.tgz", + "integrity": "sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==", + "hasInstallScript": true, + "peerDependencies": { + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.0.tgz", @@ -1674,6 +2604,17 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -1873,6 +2814,25 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1950,7 +2910,16 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } }, "node_modules/debug": { "version": "4.4.0", @@ -1975,6 +2944,11 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2173,6 +3147,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" + }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -2278,6 +3267,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -2376,23 +3374,20 @@ } }, "node_modules/framer-motion": { - "version": "12.7.3", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.7.3.tgz", - "integrity": "sha512-dNT4l5gEnUo2ytXLUBUf6AI21dZ77TMclDKE3ElaIHZ8m90nJ/NCcExW51zdSIaS0RhAS5iXcF7bEIxZe8XG2g==", + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", + "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", "dependencies": { - "motion-dom": "^12.7.3", - "motion-utils": "^12.7.2", "tslib": "^2.4.0" }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, "react": { "optional": true }, @@ -2433,6 +3428,14 @@ "node": ">=6.9.0" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -2562,6 +3565,14 @@ "node": ">=0.8.19" } }, + "node_modules/ionicons": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", + "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", + "dependencies": { + "@stencil/core": "^4.0.3" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2726,6 +3737,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2795,6 +3811,14 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.488.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.488.0.tgz", + "integrity": "sha512-ronlL0MyKut4CEzBY/ai2ZpKPxyWO4jUqdAkm2GNK5Zn3Rj+swDz+3lvyAUXN0PNqPKIX6XM9Xadwz/skLs/pQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2838,19 +3862,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/motion-dom": { - "version": "12.7.3", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.7.3.tgz", - "integrity": "sha512-IjMt1YJHrvyvruFvmpmd6bGXXGCvmygrnvSb3aZ8KhOzF4H3PulU+cMBzH+U8TBJHjC/mnmJFRIA1Cu4vBfcBA==", - "dependencies": { - "motion-utils": "^12.7.2" - } - }, - "node_modules/motion-utils": { - "version": "12.7.2", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.7.2.tgz", - "integrity": "sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2916,6 +3927,14 @@ "node": ">=0.10.0" } }, + "node_modules/number-flow": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/number-flow/-/number-flow-0.5.7.tgz", + "integrity": "sha512-P83Y9rBgN3Xpz5677YDNtuQHZpIldw6WXeWRg0+edrfFthhV7QqRdABas5gtu07QPLvbA8XhfO69rIvbKRzYIg==", + "dependencies": { + "esm-env": "^1.1.4" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3254,6 +4273,14 @@ "node": ">=6" } }, + "node_modules/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3285,6 +4312,42 @@ "node": ">=0.10.0" } }, + "node_modules/react-datepicker": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.3.0.tgz", + "integrity": "sha512-DhfrIJnTPJTUVRtXU7c7zooug40rD6q+Fc8UTCt19dYEotLpDQgTN98MfocY6Rc4S99oOFFEoxyanOM/TKauuw==", + "dependencies": { + "@floating-ui/react": "^0.27.3", + "clsx": "^2.1.1", + "date-fns": "^4.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/react-datepicker/node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -3297,6 +4360,34 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.55.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", + "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-leaflet": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", + "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", + "dependencies": { + "@react-leaflet/core": "^2.1.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -3306,6 +4397,51 @@ "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", @@ -3344,6 +4480,27 @@ "react-dom": ">=18" } }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -3684,6 +4841,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwind-merge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.2.0.tgz", + "integrity": "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", @@ -3721,6 +4892,15 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -3754,6 +4934,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -3829,6 +5014,11 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -3868,12 +5058,65 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/vite": { "version": "5.4.18", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.18.tgz", @@ -3961,6 +5204,20 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4073,6 +5330,26 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -4102,6 +5379,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", + "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 2ffc233..e3bfe2c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,14 @@ { - "name": "vite-react", + "name": "attendify", "private": true, - "version": "0.0.0", + "version": "1.0.0", + "description": "Attendify is a modern attendance tracking platform for school clubs and organizations.", + "author": "", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/anthonyh/attendify.git" + }, "type": "module", "scripts": { "dev": "vite", @@ -10,15 +17,45 @@ "preview": "vite preview" }, "dependencies": { - "framer-motion": "^12.7.3", + "@heroicons/react": "^2.2.0", + "@hookform/resolvers": "^5.0.1", + "@ionic/react": "^8.5.5", + "@number-flow/react": "^0.5.9", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@supabase/supabase-js": "^2.49.4", + "@types/leaflet": "^1.9.17", + "@types/react-datepicker": "^7.0.0", + "@vercel/analytics": "^1.5.0", + "@vercel/speed-insights": "^1.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "fastest-levenshtein": "^1.0.16", + "framer-motion": "^10.16.4", + "ionicons": "^7.4.0", + "leaflet": "^1.9.4", + "lucide-react": "^0.488.0", + "qrcode.react": "^4.2.0", "react": "^18.3.1", + "react-datepicker": "^8.3.0", + "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", - "react-router-dom": "^7.5.0" + "react-hook-form": "^7.55.0", + "react-leaflet": "^4.2.1", + "react-router-dom": "^7.5.0", + "tailwind-merge": "^3.2.0", + "uuid": "^11.1.0", + "zod": "^3.24.3" }, "devDependencies": { - "@eslint/js": "^9.9.0", + "@eslint/js": "^9.28.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@types/uuid": "^10.0.0", "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.16", "eslint": "^9.9.0", @@ -27,6 +64,7 @@ "globals": "^15.9.0", "postcss": "^8.4.31", "tailwindcss": "^3.3.5", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", "vite": "^5.4.1" diff --git a/public/attendify-favicon.png b/public/attendify-favicon.png new file mode 100644 index 0000000..ba83bb6 Binary files /dev/null and b/public/attendify-favicon.png differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..012ffb5 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: /sitemap.xml \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..921fb34 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,63 @@ + + + + https://attendify.app/ + weekly + 1.0 + + + https://attendify.app/join + monthly + 0.8 + + + https://attendify.app/attend + monthly + 0.8 + + + https://attendify.app/login + monthly + 0.8 + + + https://attendify.app/profile + monthly + 0.5 + + + https://attendify.app/dashboard + weekly + 0.5 + + + https://attendify.app/clubs + weekly + 0.5 + + + https://attendify.app/join/EXAMPLE_CLUB_ID + monthly + 0.7 + + + https://attendify.app/clubs/EXAMPLE_CLUB_ID + weekly + 0.6 + + + https://attendify.app/clubs/EXAMPLE_CLUB_ID/join-qr + monthly + 0.4 + + + https://attendify.app/checkin/EXAMPLE_INVITE_CODE + monthly + 0.7 + + + https://attendify.app/events/EXAMPLE_INVITE_CODE/checkin-qr + monthly + 0.4 + + \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 1f90862..2158de3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,17 +1,48 @@ import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; -import Home from './pages/Home'; import Clubs from './pages/Clubs'; +import ClubDetail from './pages/ClubDetail'; +import ClubJoinQR from './pages/ClubJoinQR'; +import Login from './pages/Login'; +import Profile from './pages/Profile'; +import ClubJoinPage from './pages/ClubJoinPage'; +import EventCheckinPage from './pages/EventCheckinPage'; +import EventCheckinQR from './pages/EventCheckinQR'; +import Welcome from './pages/Welcome'; +import Dashboard from './pages/Dashboard'; +import Entry from './pages/Entry'; +import RoleConfirm from './pages/RoleConfirm'; import './index.css'; +import { AuthProvider } from './contexts/AuthContext'; function App() { return ( - - } /> - } /> - {/* Add other routes as they are implemented */} - } /> - + + + {/* Entry point decides where to route */} + } /> + } /> + + {/* Club owner routes */} + } /> + } /> + } /> + } /> + } /> + + {/* Member/Public routes */} + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + {/* Fallback */} + } /> + + ); } diff --git a/src/assets/attendify-logo.png b/src/assets/attendify-logo.png new file mode 100644 index 0000000..936fce7 Binary files /dev/null and b/src/assets/attendify-logo.png differ diff --git a/src/components/CharFadeIn.tsx b/src/components/CharFadeIn.tsx new file mode 100644 index 0000000..89f0753 --- /dev/null +++ b/src/components/CharFadeIn.tsx @@ -0,0 +1,98 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +interface CharFadeInProps { + text: string; + className?: string; + gradient?: boolean; + delay?: number; + speed?: number; + /** + * Delay (in seconds) before the animation starts (added to delayChildren) + */ + startAfter?: number; + /** + * If provided, will automatically delay this animation until after another CharFadeIn finishes. + * Pass: { charCount: number, speed: number, stagger?: number } + * This takes precedence over startAfter. + */ + chainAfter?: { charCount: number; speed: number; stagger?: number }; +} + +const CharFadeIn: React.FC = ({ text, className = '', gradient = true, delay = 0, speed = 1, startAfter = 0, chainAfter }) => { + // Calculate duration and stagger based on speed + const baseDuration = 0.7 / speed; + const staggerDelay = 0.035 / speed; + + // If chaining, compute delay to start after another CharFadeIn + let effectiveDelay = delay + startAfter; + if (chainAfter) { + const { charCount, speed: prevSpeed, stagger: prevStagger } = chainAfter; + const prevStaggerDelay = prevStagger !== undefined ? prevStagger : 0.035 / prevSpeed; + const prevBaseDuration = 0.7 / prevSpeed; + effectiveDelay = (charCount * prevStaggerDelay) + prevBaseDuration; + } + + return ( + + {text.split(/(\s+)/).map((word, wi) => + word.trim() === '' ? ( + {word} + ) : ( + + {word.split('').map((char, ci) => ( + + {char} + + ))} + + ) + )} + + ); +}; + +export default CharFadeIn; \ No newline at end of file diff --git a/src/components/CreateClubModal.tsx b/src/components/CreateClubModal.tsx index baf4932..3166fb1 100644 --- a/src/components/CreateClubModal.tsx +++ b/src/components/CreateClubModal.tsx @@ -24,31 +24,34 @@ const CATEGORIES = [ const overlayVariants = { hidden: { opacity: 0 }, - visible: { opacity: 1 } + visible: { + opacity: 1, + transition: { duration: 0.2 } + } }; const modalVariants = { hidden: { opacity: 0, - y: 50, - scale: 0.95 + y: 20, + scale: 0.98 }, visible: { opacity: 1, y: 0, scale: 1, transition: { - type: "spring", - stiffness: 300, - damping: 30 + type: "tween", + duration: 0.25, + ease: "easeOut" } }, exit: { opacity: 0, - y: 50, - scale: 0.95, + y: 20, + scale: 0.98, transition: { - duration: 0.2 + duration: 0.15 } } }; @@ -68,156 +71,115 @@ const CreateClubModal: React.FC = ({ e.preventDefault(); onSubmit(formData); setFormData({ name: '', description: '', category: '' }); - onClose(); + // Keep modal open logic handled by parent }; return ( {isOpen && ( e.stopPropagation()} // Prevent closing when clicking inside modal > -
- {/* Header */} -
-
- - Create New Club - - - - - - -
+ {/* Header */} +
+

+ Create New Club +

+ +
+ + {/* Form */} +
+
+ + setFormData({ ...formData, name: e.target.value })} + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-black focus:border-black bg-white" + placeholder="e.g., Chess Club" + required + />
- {/* Form */} - - + + setFormData({ ...formData, name: e.target.value })} - className="w-full px-4 py-3 rounded-xl bg-[#f5f5f7] border border-transparent - focus:outline-none focus:border-[#1d1d1f]/30 focus:bg-white - text-[#1d1d1f] placeholder-[#1d1d1f]/40 transition-all duration-200" - placeholder="Enter club name" - required - /> - + + {CATEGORIES.map(category => ( + + ))} + + {/* Add down arrow icon for select */} +
- - - - +
+ +