The PullLog frontend is the client-side implementation of the PullLog web application, designed to record and analyze individual gacha histories.
It is built with Nuxt.js 3 (SSR) and integrates with the backend API through a secure proxy layer, providing a responsive UI/UX and multilingual support.
- Record and manage gacha logs (title, date, number of pulls, highest rarity, spending, tags, etc.)
- Rich UI components based on PrimeVue
- Timezone-aware operations with Luxon
- Statistical visualization with Chart.js (pull counts, spending trends, etc.)
- Type-safe form validation with Zod
- Dark / light theme switching
- Multilingual support (Japanese / English / Chinese)
- Social login with Google (OAuth)
- Authenticated API integration via proxy
- Framework: Nuxt.js v3
- UI: PrimeVue v4, TailwindCSS v4, SCSS
- State Management: Pinia v3
- Language: TypeScript
- Date/Time Handling: Luxon
- Charts: Chart.js
- Validation: Zod
- Other: SortableJS, Marked, ESLint, TypeDoc
- Pinia stores are scoped by responsibility:
useUserStore: user authentication and profileuseAppStore: application metadatauseLogStore: gacha log retrieval and cachinguseStatsStore: statistical data managementuseOptionStore: user preferences and optionsuseCsrfStore: CSRF token handlinguseLoaderStore: global loading stateuseCurrencyStore: currency data managementglobalStore: temporary global values
- Caching is strictly limited. No caching of empty arrays or failed responses.
- All code is written in TypeScript.
anyand non-null assertions (!) are disallowed in principle.- Indentation: 4 spaces
- Semicolons: not required
- Types are centralized in
types/and documented with JSDoc (TypeDoc compatible).
- Dates are handled strictly as ISO8601 strings or
Dateobjects with Luxon. - i18n manages locale files, and UI text is referenced exclusively via
t().
- Chart.js is wrapped in a common component layer.
- Real-time updates are supported during theme switching.
- PrimeVue’s Form component is not used.
- Validation is implemented exclusively with Zod.
- Base styling with TailwindCSS, detailed overrides with SCSS.
- Avoid in-component scoped styles. Styling is centralized or handled via PassThrough API.
- The frontend uses SSR (Server-Side Rendering) and is hosted on Cloudflare Workers.
- All API requests are routed through the Nuxt (Nitro) API proxy, which attaches secrets and forwards to the backend Laravel API.
- Environment-specific API endpoints are configured via
.envandruntimeConfig.