diff --git a/CONTEXT-MAP.md b/CONTEXT-MAP.md index 72998b24f..687fea251 100644 --- a/CONTEXT-MAP.md +++ b/CONTEXT-MAP.md @@ -9,15 +9,17 @@ This is a modular monorepo (`internachi/modular`). Each bounded context lives un ## Contexts -| Context | Path | Description | -| ------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------- | -| Moderation | `app-modules/moderation/` | Content moderation pipeline — classification, routing, enforcement, appeals | -| Bot Discord | `app-modules/bot-discord/` | Discord bot runtime (Laracord websocket, slash commands, event handlers) | -| Integration Discord | `app-modules/integration-discord/` | Discord platform transport (REST API via Saloon), OAuth, ETL | -| Identity | `app-modules/identity/` | Users, tenants, external identities, authentication | -| Panel Admin | `app-modules/panel-admin/` | Filament admin panel — dashboards, resources, moderation UI, marketing | -| Integration Twitch | `app-modules/integration-twitch/` | Twitch platform transport (Helix API via Saloon), OAuth, EventSub webhooks | -| Integration GitHub | `app-modules/integration-github/` | GitHub transport (REST via Saloon), OAuth, community contribution ingestion (backfill + webhooks) + event lake | +| Context | Path | Description | +| ------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| Moderation | `app-modules/moderation/` | Content moderation pipeline — classification, routing, enforcement, appeals | +| Bot Discord | `app-modules/bot-discord/` | Discord bot runtime (Laracord websocket, slash commands, event handlers) | +| Integration Discord | `app-modules/integration-discord/` | Discord platform transport (REST API via Saloon), OAuth, ETL | +| Identity | `app-modules/identity/` | Users, tenants, external identities, authentication | +| Panel Admin | `app-modules/panel-admin/` | Filament admin panel — dashboards, resources, moderation UI, marketing | +| Integration Twitch | `app-modules/integration-twitch/` | Twitch platform transport (Helix API via Saloon), OAuth, EventSub webhooks | +| Integration GitHub | `app-modules/integration-github/` | GitHub transport (REST via Saloon), OAuth, community contribution ingestion (backfill + webhooks) + event lake | +| Onboarding | `app-modules/onboarding/` | Universal, mandatory entry layer — polymorphic onboarding state machines by type; owns the per-type completion gate (APTO) | +| Squads | `app-modules/squads/` | Squad lifecycle, membership and governance (captain/sub-captain, elections, removal, reallocation) | ## Relationships @@ -49,3 +51,5 @@ This is a modular monorepo (`internachi/modular`). Each bounded context lives un - **Integration Twitch** depends on Identity (OAuth user resolution, ExternalIdentity for tenant linking). It never imports from Moderation, Integration Discord, or Bot Discord. - **Integration GitHub** depends on Identity (OAuth user resolution; future `Character` seam via `ExternalIdentity`). It never imports from Activity, Economy, Moderation or any Bot/runtime module — it only emits the `GithubContributionRecorded` domain event. The community presentation (in `portal`) and the allowlist admin UI (in `panel-admin`) depend on it, never the reverse. - **Identity** has no upstream dependencies on other contexts listed here. +- **Onboarding** depends on Identity (User, tenant scoping, GitHub `ExternalIdentity` link) and listens to `integration-github`'s `GithubPullRequestApproved` domain event (reads the `challenge` repos in the allowlist). It never imports from `squads` — `squads` is a consumer of its completion gate, never the reverse. +- **Squads** depends on Onboarding (reads the `Squads`-completion gate, "APTO") and Identity (users/tenants). It never imports from presentation; the panels depend on it. diff --git a/app-modules/onboarding/CONTEXT.md b/app-modules/onboarding/CONTEXT.md new file mode 100644 index 000000000..1b017dc82 --- /dev/null +++ b/app-modules/onboarding/CONTEXT.md @@ -0,0 +1,75 @@ +# Onboarding Context + +The universal, mandatory entry layer of the ecosystem. Owns the polymorphic onboarding state +machines that a person walks through, and the per-type **completion** status that other contexts +consume as an access gate. Today it powers community entry (`Welcome`) and squad entry (`Squads`), +but it is designed so new onboarding types are added without touching consumers. + +## Glossary + +| Term | Definition | Not to be confused with | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| **Onboarding** | One person's journey through one typed flow, scoped to a tenant. One row per `(tenant, user, type)`. Holds lifecycle `status`, not the per-step detail. | The UI wizard (presentation) — the Onboarding is the persisted state machine | +| **OnboardingType** | The discriminator enum (`Welcome`, `Squads`, …). Resolves the polymorphic behaviour via `handler(): OnboardingFlow` — same idiom as `IdentityProvider::getClient`. | A step — a type _has_ steps | +| **OnboardingFlow** | The per-type handler (a class behind the `OnboardingFlow` contract). Declares `steps()`, `prerequisites()`, `advance()`, `isComplete()`. All type-specific rules live here. | The model — the Flow is stateless behaviour; the Onboarding is the state | +| **OnboardingStep** | One auditable stage of a flow, one row in `onboarding_steps`. Carries its own `status` + `data` (jsonb) + `completed_at`. Enables pause/resume and history. | A prerequisite (another _type_ that must be complete first) | +| **Prerequisite** | Another `OnboardingType` that must be **completed** before this one can start (e.g. `Squads` requires `Welcome`). Declared by the flow, enforced on start. | A step (intra-type) — a prerequisite is inter-type | +| **APTO** | Domain shorthand for "completed the `Squads` onboarding". The condition that unlocks squad candidacy and squad creation. It is _not_ a global flag — it is `Squads` completion. | A generic "active member" — APTO is specifically squad-eligible | +| **Challenge** | The Git step of the `Squads` flow: open a PR (with the mandatory template) on a `challenge` repo; a human reviewer approves it on GitHub. Curation happens entirely on GitHub. | A contribution (the gamification record) — challenge repos do **not** award XP | +| **Gate** | A pre-condition checked at a transition without being a step of its own. The `Squads` flow gates `git_challenge` on having a linked GitHub `ExternalIdentity`. | A step — a gate produces no `onboarding_steps` row | + +## State machine (shape) + +`status` is a generic lifecycle: `in_progress` · `paused` · `completed` · `rejected`. The _steps_ are +type-specific and defined by the flow. The `Squads` flow: + +``` +[prereq: Welcome completed?] + │ yes + ▼ + step: form ──(submit, auto-advance, no curation)──► [gate: GitHub linked?] + │ no -> blocked + CTA "link GitHub" + │ yes + ▼ + step: git_challenge ──(PR approved on challenge repo)──► completed = APTO +``` + +Pause/resume is orthogonal: `status = paused` + `paused_at`, resumable from the current step. + +## Structure (proposed) + +``` +src/ +├── Models/ ← Onboarding · OnboardingStep +├── Enums/ ← OnboardingType · OnboardingStatus · OnboardingStepStatus +├── Contracts/ ← OnboardingFlow +├── Flows/ ← WelcomeOnboardingFlow · SquadsOnboardingFlow +├── Actions/ ← StartOnboarding · AdvanceStep · PauseOnboarding · ResumeOnboarding +├── DTOs/ ← per-step payload contracts (validated by the flow) +└── Listeners/ ← GithubPullRequestApproved -> advance the challenge step +``` + +## Module Boundaries + +### This module owns: + +- The onboarding state machines (one polymorphic model + steps) and their lifecycle. +- The per-type **completion** status other modules read as a gate (`Onboarding::isCompleted(user, tenant, type)`). +- The inter-type prerequisite chain. + +### This module does NOT own: + +- Squad lifecycle, membership, governance — belongs to `squads` (a consumer of the gate). +- Any HTTP communication with GitHub or the raw event lake — belongs to `integration-github`. This + module **listens to** `GithubPullRequestApproved` and reads `GithubRepository` (`purpose = challenge`). +- GitHub account linking — belongs to `identity` (`ExternalIdentity`, provider `github`). + +## Dependencies + +- **Identity** — `User`, tenant scoping, and the GitHub `ExternalIdentity` link (the `git_challenge` gate). +- **Integration GitHub** — consumes the `GithubPullRequestApproved` domain event and the `challenge` + repo allowlist. Never the reverse. +- Presentation (`panel-app`) drives the UI and calls the module's Actions. + +See `docs/adr/0001-onboarding-polimorfico-por-tipo.md` and +`docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md`. diff --git a/app-modules/onboarding/composer.json b/app-modules/onboarding/composer.json new file mode 100644 index 000000000..dc3cc0266 --- /dev/null +++ b/app-modules/onboarding/composer.json @@ -0,0 +1,27 @@ +{ + "name": "he4rt/onboarding", + "description": "", + "type": "library", + "version": "1.0.0", + "license": "proprietary", + "autoload": { + "psr-4": { + "He4rt\\Onboarding\\": "src/", + "He4rt\\Onboarding\\Database\\Factories\\": "database/factories/", + "He4rt\\Onboarding\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Onboarding\\Tests\\": "tests/" + } + }, + "minimum-stability": "stable", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Onboarding\\Providers\\OnboardingServiceProvider" + ] + } + } +} diff --git a/app-modules/onboarding/database/factories/.gitkeep b/app-modules/onboarding/database/factories/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/database/migrations/.gitkeep b/app-modules/onboarding/database/migrations/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/database/seeders/.gitkeep b/app-modules/onboarding/database/seeders/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md new file mode 100644 index 000000000..f6f5af3b8 --- /dev/null +++ b/app-modules/onboarding/docs/adr/0001-onboarding-polimorfico-por-tipo.md @@ -0,0 +1,110 @@ +# ADR-0001: Onboarding polimórfico por tipo, com etapas auditáveis + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt + +## Contexto + +Os Squads da He4rt rodam hoje no informal (grupos de WhatsApp, sem liderança formal). A primeira +entrega de software ataca **governança** (capitão/subcapitão, eleição, etc.) e, antes dela, uma +camada de **Entrada** que filtra quem realmente quer integrar a comunidade e contribuir. + +Essa Entrada — chamada no documento da P.O. de "pré-triagem" — é **universal e obrigatória**: +ninguém se candidata a um squad nem propõe um squad novo sem concluí-la. Duas perguntas de fronteira +apareceram: + +1. **Esse onboarding é específico de um squad ou global da comunidade?** A pré-triagem é sobre pertencer à comunidade, não a um squad específico, e reusa + pesado o `identity` (vínculo GitHub via `ExternalIdentity`). Colocá-la dentro de `squads` + amarraria um conceito universal a um consumidor específico. +2. **Quantos formatos?** O time já enxerga **mais de um tipo de entrada** — `Welcome` (entrada na + comunidade) e `Squads` (entrada no programa) — e quer outros no futuro, cada um com seu próprio + contrato de payload e processamento. + +Modelar a pré-triagem como uma máquina de estados fixa (form → desafio) resolveria o `Squads` de +hoje, mas não comportaria novos tipos sem refator. + +## Decisão + +**Criar um módulo de domínio novo, `onboarding`, dono de máquinas de onboarding polimórficas por +tipo.** `squads` (e futuros consumidores) apenas leem o gate de conclusão. + +### Polimorfismo (enum → handler) + +- `OnboardingType` (enum) discrimina o tipo e resolve o comportamento via `handler(): OnboardingFlow` + — mesmo idioma que `IdentityProvider::getClient()` já usa no `identity`. +- `OnboardingFlow` (contrato) declara `steps()`, `prerequisites()`, `advance()`, `isComplete()`. + Toda regra específica do tipo vive no handler; nenhum consumidor conhece os tipos concretos. + +### Persistência (modelo + etapas) + +Modelo único discriminado por `type` + tabela de etapas (opção "C" avaliada): + +`onboardings` — uma linha por `(tenant_id, user_id, type)`: + +| Coluna | Tipo | Notas | +| -------------- | ---------------------------- | --------------------------------------------------------------------- | +| `id` | uuid (PK) | `HasUuids` | +| `tenant_id` | uuid (FK) | tenant-scoped (convenção do repo, multi-tenant-ready) | +| `user_id` | uuid (FK) | | +| `type` | string | `OnboardingType` (`welcome` \| `squads` \| …) | +| `status` | string | ciclo de vida genérico: `in_progress`/`paused`/`completed`/`rejected` | +| `completed_at` | timestamptz? | | +| `paused_at` | timestamptz? | | +| timestamps | tz | | +| UNIQUE | `(tenant_id, user_id, type)` | | + +`onboarding_steps` — uma linha por etapa do fluxo: + +| Coluna | Tipo | Notas | +| --------------- | --------------------------- | ------------------------------------------------- | +| `id` | uuid (PK) | | +| `onboarding_id` | uuid (FK) | | +| `step_key` | string | semântica do handler (`form`, `git_challenge`, …) | +| `status` | string | `pending`/`done`/… | +| `data` | jsonb | payload da etapa, validado pelo DTO do tipo | +| `completed_at` | timestamptz? | | +| timestamps | tz | | +| UNIQUE | `(onboarding_id, step_key)` | | + +A tabela de etapas (em vez de só um `payload` JSON no modelo) foi escolhida por dar **auditoria e +histórico por etapa de graça** — relevante pro desafio Git, que tem reenvio com evolução e +pausa/retoma. + +### Cadeia entre tipos + +`prerequisites()` declara dependências **inter-tipo**: `Squads` exige `Welcome` concluído para poder +iniciar. O gate que o `squads` consome é `Onboarding::isCompleted(user, tenant, Squads)` — apelidado +de **APTO** no domínio. + +## Alternativas consideradas + +- **Pré-triagem dentro de `identity`** (membership): conceitualmente limpo, mas mistura onboarding + evolutivo com o núcleo de autenticação e força `identity` a depender de `integration-github`. +- **Pré-triagem dentro de `squads`**: entrega rápida, mas amarra um conceito universal a um consumidor + e exigiria migração quando outro módulo (eventos, etc.) quiser o mesmo gate. +- **STI / modelo por tipo**: Laravel não tem STI nativo (exige pacote/boilerplate), foge do idioma + `enum→resolve` do repo e incha o schema com colunas nuláveis por tipo. Descartado. +- **Modelo único só com `payload` JSON (sem tabela de etapas)**: mais simples, mas perde auditoria + por etapa. É o passo anterior natural; promovido para a tabela de etapas por causa do desafio Git. + +## Consequências + +### Positivas + +- Somar um tipo novo = +1 case no enum + 1 classe `Flow`. Consumidores intactos. +- Auditoria etapa-a-etapa nativa (início/fim de cada etapa, tentativas de reenvio). +- Pausa/retoma natural (estado vive na etapa + `status=paused`). +- Núcleo do jogo (futuro) pode virar mais um tipo, ou consumir o gate, sem acoplar. + +### Negativas / diferidas + +- `status`/`step_key` são strings genéricas — a disciplina de transição fica no handler, não no banco. +- Dois lugares de verdade (`onboardings` + `onboarding_steps`); o `isComplete()` precisa ser a única + fonte que decide conclusão para não divergirem. +- Validação do payload é só de aplicação (DTO), não de schema. + +## Review trigger + +Revisitar quando (a) o Núcleo do jogo for refinado e a gente decidir se ele é um `OnboardingType` ou +um consumidor do gate; ou (b) surgir um tipo cujo estado de etapa não caiba no par modelo+steps. diff --git a/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md b/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md new file mode 100644 index 000000000..8ab15d34e --- /dev/null +++ b/app-modules/onboarding/docs/adr/0002-sinal-de-pr-aprovado-via-evento-de-dominio.md @@ -0,0 +1,87 @@ +# ADR-0002: Sinal de "PR aprovado" via evento de domínio do integration-github + +**Status:** Accepted +**Date:** 2026-06-15 +**Deciders:** danielhe4rt +**Relates to:** [ADR-0001](0001-onboarding-polimorfico-por-tipo.md); `integration-github` + +## Contexto + +O step `git_challenge` do `SquadsOnboarding` conclui quando um **revisor humano aprova, no GitHub, o +PR do candidato** num repo de desafio. A plataforma precisa reagir a essa aprovação. + +O `integration-github` já é o **único** ponto que fala com o GitHub: `GithubWebhookController` recebe +todos os webhooks, grava no `GithubEventLog` (lake, dedup por `delivery_id`), e o `ProjectGithubEvent` +projeta eventos de repos da allowlist (`GithubRepository`) em `github_contributions`, emitindo +`GithubContributionRecorded`. A regra de fronteira do módulo é: ele **só emite eventos de domínio e +nunca importa de outros módulos**. + +Duas decisões de acoplamento precisavam ser tomadas: + +1. Como o sinal de aprovação chega ao `onboarding` sem duplicar a infra de webhook/HMAC/dedup nem + acoplar os módulos. +2. Como distinguir um "repo de desafio" de um repo de contribuições — sem que o `git_challenge` vire + XP de gamification. + +## Decisão + +### Sinal por evento de domínio + +O `integration-github` passa a emitir um **segundo evento de domínio**, +`GithubPullRequestApproved` (`author_login`, `repo`, `pr_number`, `approved_at`), ao observar +`pull_request_review` com `state = approved`. O `onboarding` registra um **listener** que resolve o +`author_login` para um `User` (via `ExternalIdentity` github) e avança o step `git_challenge`. + +O transporte continua centralizado num lugar só; HMAC e dedup são reusados; nenhum módulo passa a +falar com o GitHub além do `integration-github`. É a mesma costura do `GithubContributionRecorded`. + +### Repo de desafio via `purpose` na allowlist + +`GithubRepository` ganha um campo **`purpose`** (`contributions` | `challenge`): + +- Repos `challenge` **não** geram `GithubContributionRecorded` (fazer o desafio não vira XP). +- O `onboarding` resolve o repo de desafio lendo `GithubRepository::query()->where('purpose', 'challenge')` + (tenant-scoped), e ignora aprovações de repos que não sejam de desafio. + +O `purpose` é uma **categoria de projeção** legítima do próprio `integration-github` (ele já decide o +que projetar). O `integration-github` nunca precisa conhecer a palavra "onboarding". + +### Vínculo do GitHub é gate, não há reconciliação + +O vínculo da conta GitHub (`ExternalIdentity` provider `github`) é **pré-requisito** (gate) para o +step `git_challenge`. Logo o `author_login` do webhook **sempre** casa um `User`, e o cenário +"aprovação de conta não vinculada → retém e reconcilia" **deixa de existir** — sem buffer, sem tabela +de pendências, sem reconciliação. Isso diverge do BDD original da P.O., que previa reconciliação. + +## Alternativas consideradas + +- **Webhook próprio do `onboarding`** só pro repo de desafio: desacoplaria 100%, mas duplicaria + HMAC/dedup e criaria um segundo ponto que fala com o GitHub. Descartado. +- **`onboarding` relendo o lake (`GithubEventLog`)**: inverteria a dependência (`onboarding` → + consulta interna do `integration-github`) e furaria o encapsulamento do lake. Descartado. +- **Config de repo de desafio dentro do `onboarding`** (em vez do `purpose` na allowlist): manteria o + `integration-github` sem nenhuma categoria nova, mas duplicaria o cadastro de repos e perderia o + benefício de excluir o repo de desafio da projeção de contribuições num lugar só. Trade-off aceito + a favor do `purpose`. + +## Consequências + +### Positivas + +- Um único ponto de integração com o GitHub; HMAC/dedup reusados. +- Repos de desafio ficam fora da gamification por construção (`purpose`). +- Sem reconciliação: a máquina de estados fica drasticamente mais simples. + +### Negativas / diferidas + +- `integration-github` ganha um rótulo (`purpose=challenge`) que existe por causa de um consumidor — + acoplamento mínimo e consciente, mitigado por ser categoria de projeção, não lógica de onboarding. +- O repo de desafio precisa ter o webhook do GitHub instalado apontando pro endpoint do + `integration-github` (setup de infra, não de código). +- Diverge do BDD original (reconciliação removida) — o documento da P.O. precisa ser atualizado. + +## Review trigger + +Revisitar se algum dia um onboarding precisar reagir a aprovações de conta ainda não vinculada +(reintroduziria o buffer/reconciliação), ou se mais de um repo de desafio por tenant exigir +roteamento por tipo de desafio. diff --git a/app-modules/onboarding/phpstan.ignore.neon b/app-modules/onboarding/phpstan.ignore.neon new file mode 100644 index 000000000..f51e71c3f --- /dev/null +++ b/app-modules/onboarding/phpstan.ignore.neon @@ -0,0 +1,2 @@ +parameters: + ignoreErrors: [] diff --git a/app-modules/onboarding/phpstan.neon b/app-modules/onboarding/phpstan.neon new file mode 100644 index 000000000..b577d0f29 --- /dev/null +++ b/app-modules/onboarding/phpstan.neon @@ -0,0 +1,6 @@ +includes: + - phpstan.ignore.neon + +parameters: + paths: + - src/ diff --git a/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php b/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php new file mode 100644 index 000000000..1558f42d5 --- /dev/null +++ b/app-modules/onboarding/src/Providers/OnboardingServiceProvider.php @@ -0,0 +1,14 @@ +=1", "he4rt/bot-discord": ">=1.0", "he4rt/community": ">=1", @@ -29,10 +29,12 @@ "he4rt/integration-twitch": ">=1", "he4rt/integration-whatsapp": ">=1", "he4rt/moderation": "^1.0", + "he4rt/onboarding": ">=1", "he4rt/panel-admin": ">=1", "he4rt/panel-app": ">=1", "he4rt/portal": ">=1", "he4rt/profile": ">=1", + "he4rt/squads": ">=1", "internachi/modular": "^3.0.2", "laracord/framework": "dev-next#e7b64d6", "laravel/framework": "^13.17.0", diff --git a/composer.lock b/composer.lock index f4ed50a8b..0d5ccabcf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f6267da13faf388a7153c1777f093a1f", + "content-hash": "d99073592af48a849b8d049d16bddaee", "packages": [ { "name": "blade-ui-kit/blade-heroicons", @@ -2662,16 +2662,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.12.3", + "version": "7.13.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "9aa17bcdd777ee31df9fc83c337ca4ca2340def3" + "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9aa17bcdd777ee31df9fc83c337ca4ca2340def3", - "reference": "9aa17bcdd777ee31df9fc83c337ca4ca2340def3", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/55901a76dfd2006a0cc012b9e3c5b487f796478d", + "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d", "shasum": "" }, "require": { @@ -2690,7 +2690,7 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", - "guzzlehttp/test-server": "^0.5.1", + "guzzlehttp/test-server": "^0.6", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" @@ -2770,7 +2770,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.12.3" + "source": "https://github.com/guzzle/guzzle/tree/7.13.1" }, "funding": [ { @@ -2786,7 +2786,7 @@ "type": "tidelift" } ], - "time": "2026-06-23T15:29:02+00:00" + "time": "2026-06-29T20:14:18+00:00" }, { "name": "guzzlehttp/promises", @@ -3607,6 +3607,42 @@ "relative": true } }, + { + "name": "he4rt/onboarding", + "version": "1.0.0", + "dist": { + "type": "path", + "url": "app-modules/onboarding", + "reference": "3a220d43dbb84baa4f55ad195653e0cf99c92c84" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Onboarding\\Providers\\OnboardingServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Onboarding\\": "src/", + "He4rt\\Onboarding\\Database\\Factories\\": "database/factories/", + "He4rt\\Onboarding\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Onboarding\\Tests\\": "tests/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "he4rt/panel-admin", "version": "1.0", @@ -3757,6 +3793,42 @@ "relative": true } }, + { + "name": "he4rt/squads", + "version": "1.0.0", + "dist": { + "type": "path", + "url": "app-modules/squads", + "reference": "6d710964545ed1c8635e42b11780e181211075e7" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "He4rt\\Squads\\Providers\\SquadsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "He4rt\\Squads\\": "src/", + "He4rt\\Squads\\Database\\Factories\\": "database/factories/", + "He4rt\\Squads\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "He4rt\\Squads\\Tests\\": "tests/" + } + }, + "license": [ + "proprietary" + ], + "transport-options": { + "symlink": true, + "relative": true + } + }, { "name": "internachi/modular", "version": "3.0.2", @@ -7851,16 +7923,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.23", + "version": "v0.12.24", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4" + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", "shasum": "" }, "require": { @@ -7924,9 +7996,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.23" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.24" }, - "time": "2026-05-23T13:41:31+00:00" + "time": "2026-06-29T15:41:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -9861,16 +9933,16 @@ }, { "name": "spatie/image-optimizer", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/spatie/image-optimizer.git", - "reference": "6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab" + "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab", - "reference": "6ad4d364e2fdfdfe7f2640d59e946c7fd7b8f3ab", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/333c03952289dc2df0a91874636a0dffeb5b6aec", + "reference": "333c03952289dc2df0a91874636a0dffeb5b6aec", "shasum": "" }, "require": { @@ -9910,9 +9982,9 @@ ], "support": { "issues": "https://github.com/spatie/image-optimizer/issues", - "source": "https://github.com/spatie/image-optimizer/tree/1.9.0" + "source": "https://github.com/spatie/image-optimizer/tree/1.10.0" }, - "time": "2026-06-25T21:47:29+00:00" + "time": "2026-06-29T08:28:30+00:00" }, { "name": "spatie/invade", diff --git a/package-lock.json b/package-lock.json index fc4830dad..b0efcf12b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,14 +12,14 @@ "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@tailwindcss/typography": "0.5.20", - "@tailwindcss/vite": "4.3.1", + "@tailwindcss/vite": "4.3.2", "concurrently": "10.0.3", "husky": "9.1.7", "laravel-vite-plugin": "3.1.0", "lint-staged": "17.0.8", - "npm-check-updates": "22.2.8", - "prettier": "3.9.1", - "tailwindcss": "4.3.1", + "npm-check-updates": "22.2.9", + "prettier": "3.9.3", + "tailwindcss": "4.3.2", "tw-animate-css": "1.4.0", "vite": "8.1.0" }, @@ -404,9 +404,9 @@ "license": "MIT" }, "node_modules/@tailwindcss/node": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", - "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", "dev": true, "license": "MIT", "dependencies": { @@ -416,37 +416,37 @@ "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.1" + "tailwindcss": "4.3.2" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", - "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-x64": "4.3.1", - "@tailwindcss/oxide-freebsd-x64": "4.3.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-x64-musl": "4.3.1", - "@tailwindcss/oxide-wasm32-wasi": "4.3.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", - "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", "cpu": [ "arm64" ], @@ -461,9 +461,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", - "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", "cpu": [ "arm64" ], @@ -478,9 +478,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", - "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", "cpu": [ "x64" ], @@ -495,9 +495,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", - "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", "cpu": [ "x64" ], @@ -512,9 +512,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", - "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", "cpu": [ "arm" ], @@ -529,9 +529,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", - "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", "cpu": [ "arm64" ], @@ -546,9 +546,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", - "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", "cpu": [ "arm64" ], @@ -563,9 +563,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", - "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", "cpu": [ "x64" ], @@ -580,9 +580,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", - "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", "cpu": [ "x64" ], @@ -597,9 +597,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", - "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -615,9 +615,9 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" @@ -627,9 +627,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", - "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", "cpu": [ "arm64" ], @@ -644,9 +644,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", - "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", "cpu": [ "x64" ], @@ -674,15 +674,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.1", - "@tailwindcss/oxide": "4.3.1", - "tailwindcss": "4.3.1" + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -1488,9 +1488,9 @@ } }, "node_modules/npm-check-updates": { - "version": "22.2.8", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-22.2.8.tgz", - "integrity": "sha512-jL2cs1TSDSj3ieDlMVFf0bZFVqLNtXt+ExvCMF1OYxR7PiVjFcmAP80rJFNOFrrt0KLyPqeRBZtD7xZu9emd8w==", + "version": "22.2.9", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-22.2.9.tgz", + "integrity": "sha512-DVeZ0KirHfliSsHuR2o7cHE+tW439sVHfJjF6cGWeDiY0Wyl3BI/jS4zV0eixtcMOquFbcF1Su/FsxOvk5MoYA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1539,9 +1539,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -1582,9 +1582,9 @@ } }, "node_modules/prettier": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", - "integrity": "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.3.tgz", + "integrity": "sha512-HWmu+K+zvHNpaMfSnYeqdqrDbR16cuIXaPx8WoHaviQkDJh1/0BNtOZmHVQI5jc3wXv0H1yXc9wjvFdXh+n3hQ==", "dev": true, "license": "MIT", "bin": { @@ -1775,9 +1775,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", - "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", "dev": true, "license": "MIT", "peer": true diff --git a/package.json b/package.json index e118cc0e8..443a26ee4 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,14 @@ "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@tailwindcss/typography": "0.5.20", - "@tailwindcss/vite": "4.3.1", + "@tailwindcss/vite": "4.3.2", "concurrently": "10.0.3", "husky": "9.1.7", "laravel-vite-plugin": "3.1.0", "lint-staged": "17.0.8", - "npm-check-updates": "22.2.8", - "prettier": "3.9.1", - "tailwindcss": "4.3.1", + "npm-check-updates": "22.2.9", + "prettier": "3.9.3", + "tailwindcss": "4.3.2", "tw-animate-css": "1.4.0", "vite": "8.1.0" },