nimuli/app/Domains
boban deb5f310a1 fix(bio): plan-aware URL + plan-seeder + ulid→slug fix
- Migration: add bio_pages_limit to plans, make limit cols nullable (agency=unlimited)
- PlanSeeder: 4 plans (free/pro/business/agency) with tier/features/bio_pages_limit
- workspaces:assign-default-plan command: assigns free plan to unassigned workspaces
- BioPage::publicUrl(): free=apex-path, pro+=subdomain, custom=custom-domain
  - Security: str_ends_with check uses '.'.$apex to prevent evilnimu.li bypass
- BioPage::shortPublicUrl(): URL without scheme for display
- PlanLimitsService: use bio_pages_limit column (was features['bio_pages']), null=unlimited
- BioPageController: fix $bio → $page variable (view expects $page)
- Bio index/edit views: use publicUrl()/shortPublicUrl(), not hardcoded ULID URLs
- Bio edit view: publicUrlBase/displayUrlBase from component (plan-aware prefix)
- Create-bio modal: plan-aware URL prefix display
- PlanFactory/WorkspaceFactory: free()/pro() states for tests
- Tests: PublicUrlTest (5 cases), Free404FixTest (3 cases)

Known pre-existing failure (not caused by this change):
- Tests\Feature\Auth\EmailVerificationTest::email can be verified

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:44:54 +02:00
..
Ai fix(ai): language-aware prompt, better insights, larger spinner 2026-05-17 14:44:18 +02:00
Analytics fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
Api/Resources fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
Bio fix(bio): plan-aware URL + plan-seeder + ulid→slug fix 2026-05-17 22:44:54 +02:00
Domain fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
Link fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
QrCode feat: Toaster, button-component, 10 new modals, links-page fix, vite-tuning 2026-05-16 13:55:25 +02:00
Routing/Services fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
Subscription fix(bio): plan-aware URL + plan-seeder + ulid→slug fix 2026-05-17 22:44:54 +02:00
Translation fix(quality): PHPStan level 6 compliance, Pint formatting 2026-05-16 08:28:10 +02:00
Webhook style: apply Pint formatting to modal files and tests 2026-05-16 12:42:16 +02:00
Workspace fix(FIX-10): 6 bugs — route ULID, QR modal, bio unique, nav active, copy btn, analytics context 2026-05-16 17:01:16 +02:00