The PrimeVue side of the parallel-mode app renders icons via @iconify/vue's <Icon> component (src/components/Icon.vue). At runtime @iconify/vue resolves an icon name like "tabler-eye" by looking up its data in the in-memory icon registry; on a miss it falls back to fetching https://api.iconify.design/tabler/eye.json. The CSP blocks that origin, so every Tabler icon used in AppShell, SidebarHeader, SidebarUserCard, and the migrated login form rendered as an empty <svg viewBox="0 0 16 16"></svg>. New plugins/iconify.ts loads the full Tabler set (@iconify-json/tabler/icons.json, already in package.json as 1.2.23) and registers it via addCollection() at module-load time. main.ts side-effect-imports it before any other import so the registry is warm before the first Icon mounts. This is a NEW concern, separate from the existing plugins/iconify/ (index.ts + icons.css) which generates Vuexy-style i-tabler-* CSS classes for Vuetify's VIcon adapter. The two systems must coexist during F3–F6 parallel mode; the legacy directory can be deleted alongside Vuetify when F6 lands. Bundle cost: ~1.9 MB uncompressed JSON, ~400 KB gzipped in the main chunk. Per-icon imports are a future optimisation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Crewli — Organizer SPA
Main product UI for organisation and event staff (Vue 3 + Vuexy + Vuetify). Lives in this repo; only re-copy from Vuexy when upgrading the template.
Setup
- Install dependencies:
pnpm install
- Create
.env.local:
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Organizer"
- Dev server uses port 5174 (see
vite.config.tsor run from repo root:make app).
pnpm dev --port 5174
Port
Runs on http://localhost:5174
Production: e.g. VITE_API_URL=https://api.crewli.app/api/v1 and host the SPA at https://crewli.app (see api/.env.example for FRONTEND_APP_URL and SANCTUM_STATEFUL_DOMAINS).