Commit graph

184 commits

Author SHA1 Message Date
96f040a91b add CheckboxGroup component for multiselect fields 2025-12-02 05:25:35 -08:00
2771e202cb add CopyableText component for raw data tab 2025-12-02 01:25:14 -08:00
da26645df0 add DatePicker component with type='date' support 2025-12-02 01:24:36 -08:00
64e50e1b50 add batch import button to database index pages 2025-12-02 00:08:47 -08:00
1ea0eee86c add suggestion props to all database section components 2025-12-01 23:52:06 -08:00
bba78d5781 feat: add suggestion UI components for batch import
- SuggestionBadge: sparkle icon with tooltip for accept/dismiss actions
- SuggestionDetailItem: detail item wrapper with suggestion badge support
- TabbedEntitySelector: entity image grid for batch selection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 23:43:56 -08:00
be75fcbcbd database detail pages: add Info/Images/Raw tabs 2025-12-01 09:54:35 -08:00
395a5c166f SegmentedControl: add size prop (default/small) 2025-12-01 09:54:06 -08:00
20705cc3b2 SegmentedControl: only fire onValueChange on actual changes
Prevents onValueChange from firing during initialization, which
caused pushState errors before router was ready.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 05:02:56 -08:00
83b18645c8 fix: guard pushState until router is initialized 2025-12-01 04:59:16 -08:00
4fda863339 fix: use pushState + popstate for instant tab switching 2025-12-01 04:57:22 -08:00
21bda28910 fix: always use explicit tab path in URL 2025-12-01 04:36:17 -08:00
5063e8e73c fix: use goto() instead of pushState for tab URL sync 2025-12-01 04:33:28 -08:00
af27f0fbbc add URL-based tab routing with pushState sync 2025-12-01 04:29:21 -08:00
5b0d41a020 move teams/[id] route into [[tab=tab]] optional segment 2025-12-01 04:27:42 -08:00
a9dcbd18f8 DetailItem: adjust padding and remove hover styles 2025-12-01 04:11:22 -08:00
c2b2de9e96 TagInput: add contained prop with max-width 2025-12-01 04:10:36 -08:00
7a86790670 weapons: add recruits character search field
Add CharacterTypeahead component for async character search using Svelecte.
The component debounces input and queries the search API for matching
characters. Added recruits field to weapon creation page.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 03:17:17 -08:00
fbe43490d7 ui: add TagInput component for nicknames
- Chip/tag style input for string arrays
- Add/remove tags with Enter or comma
- Backspace removes last tag when input empty
- Supports label, error, maxTags, disabled

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 02:43:44 -08:00
39b1ed9f64 nav: context-aware New button for database routes
- Show "New character/weapon/summon" pill button on database pages
- Keep existing circular + button for team creation elsewhere

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 02:27:47 -08:00
43c291327c components: use centralized image URL helpers 2025-12-01 02:26:29 -08:00
28ad2fb37e DetailItem: add sublabel, width, onchange props; Input: add validation state 2025-12-01 02:25:41 -08:00
1024e155c3 fix button: no translate on circular, fix elemental hover colors 2025-12-01 00:22:52 -08:00
d412e760ab nav: show register/login when logged out, move guides/collection to menu 2025-11-30 23:16:04 -08:00
7e02884941 input: add no1password prop, tweak counter styling 2025-11-30 23:16:00 -08:00
a1bcb0e523 update Navigation login link to /auth/login 2025-11-30 22:29:08 -08:00
06dd832ada add AuthCard component for auth pages 2025-11-30 22:26:25 -08:00
33fa9f9c9c reset fieldset border/padding/margin in Input component 2025-11-30 22:26:25 -08:00
af659b9760 components: update party and character components 2025-11-30 20:06:44 -08:00
db5bfe9f7f sidebar: remove unused modification components 2025-11-30 20:06:36 -08:00
a858877545 sidebar: refactor details components 2025-11-30 20:06:31 -08:00
8ac9dea2d3 sidebar: add EditCharacterSidebar and EditWeaponSidebar 2025-11-30 20:06:21 -08:00
4f132f9947 sidebar: add edit form components for character/weapon modifications 2025-11-30 20:06:15 -08:00
393bbdbcb0 sidebar: add MasteryRow component for rings/earring selects 2025-11-30 20:06:04 -08:00
5784b9638d sidebar: add DetailRow and DetailsSection components 2025-11-30 20:05:59 -08:00
f815ca4f30 ui: update Input, Select, Button, Sidebar components 2025-11-30 20:05:42 -08:00
5df563198b fix: render related characters 2025-11-30 14:57:43 -08:00
d5a22baa0a use Checkbox component in database edit pages with element theming 2025-11-30 13:59:45 -08:00
b8ad70229d fix database dropdown item rendering 2025-11-30 13:59:40 -08:00
7406f80edd use contained selects in settings modal 2025-11-30 06:02:56 -08:00
92e93309bf add typeahead component 2025-11-30 06:02:56 -08:00
66b03c9108 fix dropdown trigger props, add onClose alias to sidebar 2025-11-30 06:02:50 -08:00
fcc0a884f5 fix icon color inheritance, tweak select chevron 2025-11-30 06:02:50 -08:00
bc67d22c4b checkbox and switch theming with hover states 2025-11-30 06:02:50 -08:00
8b078cdfd8 feat: add conflict dialog for duplicate characters/weapons 2025-11-30 02:32:03 -08:00
ff7199fbbb fix: add is-active state to weapon and summon units 2025-11-30 02:31:58 -08:00
d51fe03905 fix: character slot selection glow and empty protagonist
- character grid starts at position 1 (skip protagonist)
- add isEmptySelected state for glow on empty slots
- empty protagonist shows relief.png background only
2025-11-30 02:31:48 -08:00
18328e2d38 fix: party mutation parameter types
- favorite/unfavorite take shortcode string directly
- delete takes {id, shortcode} since API expects UUID
- remix takes shortcode string directly
- update spreads updates at top level
2025-11-30 02:31:42 -08:00
2275daec61 fix: PartySegmentedControl rep components now update reactively
The WeaponRep (and other rep components) weren't visually updating when
new items were added to the party. The issue was that Svelte's reactivity
wasn't properly propagating through the {#each} blocks.

Changes:
- PartySegmentedControl: Add derived values for party sub-properties to
  ensure reactivity propagates through snippet boundaries
- WeaponRep: Pre-compute rows as explicit $derived value and use keyed
  {#each} blocks for proper change detection

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 00:23:44 -08:00
f457343e26
Complete TanStack Query v6 migration (#445)
## Overview

Complete migration from service layer to TanStack Query v6 with
mutations, queries, and automatic cache management.

## What Was Completed

### Phase 1: Entity Queries & Database Pages 
- Created `entity.queries.ts` with query options for weapons,
characters, and summons
- Migrated all database detail pages to use TanStack Query with
`withInitialData()` pattern
- SSR with client-side hydration working correctly

### Phase 2: Server Load Cleanup 
- Removed PartyService dependency from teams detail server load
- Server loads now use adapters directly instead of service layer
- Cleaner separation of concerns

### Phase 3: Party.svelte Refactoring 
- Removed all PartyService, GridService, and ConflictService
dependencies
- Migrated to TanStack Query mutations for all operations:
  - Grid operations: create, update, delete, swap, move
  - Party operations: update, delete, remix, favorite, unfavorite
- Added swap/move mutations for drag-and-drop operations
- Automatic cache invalidation and query refetching

### Phase 4: Service Layer Removal 
- Deleted all service layer files (~1,345 lines removed):
  - `party.service.ts` (620 lines)
  - `grid.service.ts` (450 lines)
  - `conflict.service.ts` (120 lines)
  - `gridOperations.ts` (unused utility)
- Deleted empty `services/` directory
- Created utility functions for cross-cutting concerns:
  - `localId.ts`: Anonymous user local ID management
  - `editKeys.ts`: Edit key management for anonymous editing
  - `party-context.ts`: Extracted PartyContext type

### Phase 5: /teams/new Migration 
- Migrated party creation wizard to use TanStack Query mutations
- Replaced all direct adapter calls with mutations (7 locations)
- Maintains existing behavior and flow
- Automatic cache invalidation for newly created parties

## Benefits

### Performance
- Automatic request deduplication
- Better cache utilization across pages
- Background refetching for fresh data
- Optimistic updates for instant UI feedback

### Developer Experience
- Single source of truth for data fetching
- Consistent patterns across entire app
- Query devtools for debugging
- Less boilerplate code

### Code Quality
- ~1,088 net lines removed
- Simpler mental model (no service layer)
- Better TypeScript inference
- Easier to test

### Architecture
- **100% TanStack Query coverage** - no service layer, no direct adapter
calls
- Clear separation: UI ← Queries/Mutations ← Adapters ← API
- Automatic cache management
- Consistent mutation patterns everywhere

## Testing

All features verified:
- Party creation (anonymous & authenticated)
- Grid operations (add, remove, update, swap, move)
- Party operations (update, delete, remix, favorite)
- Cache invalidation across tabs
- Error handling and rollback
- SSR with hydration

## Files Modified

### Created (3)
- `src/lib/types/party-context.ts`
- `src/lib/utils/editKeys.ts`
- `src/lib/utils/localId.ts`

### Deleted (4)
- `src/lib/services/party.service.ts`
- `src/lib/services/grid.service.ts`
- `src/lib/services/conflict.service.ts`
- `src/lib/utils/gridOperations.ts`

### Modified (13)
- `src/lib/api/mutations/grid.mutations.ts`
- `src/lib/components/grids/CharacterGrid.svelte`
- `src/lib/components/grids/SummonGrid.svelte`
- `src/lib/components/grids/WeaponGrid.svelte`
- `src/lib/components/party/Party.svelte`
- `src/routes/teams/new/+page.svelte`
- Database entity pages (characters, weapons, summons)
- Other supporting files

## Migration Complete

This PR completes the TanStack Query migration. The entire application
now uses TanStack Query v6 for all data fetching and mutations, with
zero remaining service layer code.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-29 22:32:15 -08:00