Commit Graph

3399 Commits

Author SHA1 Message Date
Matthew Raymer
cbd768ad7a fix: Replace 'any' type with proper TypeScript typing in AccountViewView
- Replace 'as any' with 'InstanceType<typeof UserNameDialog>' for proper typing
- Update callback parameter to match component interface (name?: string)
- Eliminates TypeScript warning while maintaining type safety
2025-07-06 02:32:04 +00:00
Matthew Raymer
847b01d146 fix: Replace 'any' type with proper TypeScript typing in AccountViewView
- Replace 'as any' with 'InstanceType<typeof UserNameDialog>' for proper typing
- Update callback parameter to match component interface (name?: string)
- Eliminates TypeScript warning while maintaining type safety
2025-07-06 02:32:04 +00:00
Matthew Raymer
9b1b0e828e fix(mixin): access platformService as property, not function, in PlatformServiceMixin
- Fix all computed properties to use platformService as a property
- Add descriptive @ts-expect-error comments for dynamic property access
- Resolves 'this.platformService is not a function' runtime error
- Lint clean
2025-07-05 13:37:28 +00:00
Matthew Raymer
b65ac693be fix(mixin): access platformService as property, not function, in PlatformServiceMixin
- Fix all computed properties to use platformService as a property
- Add descriptive @ts-expect-error comments for dynamic property access
- Resolves 'this.platformService is not a function' runtime error
- Lint clean
2025-07-05 13:37:28 +00:00
Matthew Raymer
d8b078d372 refactor: migrate DataExportSection to PlatformServiceMixin
- Use PlatformServiceMixin for platform and database access
- Replace manual PlatformService instantiation with mixin methods/properties
- Use $contacts() for contact export
- Use capabilities for platform checks in template and logic
- Remove unused imports and redundant code
- Lint clean
2025-07-05 13:25:37 +00:00
Matthew Raymer
8cdcd9bbdb refactor: migrate DataExportSection to PlatformServiceMixin
- Use PlatformServiceMixin for platform and database access
- Replace manual PlatformService instantiation with mixin methods/properties
- Use $contacts() for contact export
- Use capabilities for platform checks in template and logic
- Remove unused imports and redundant code
- Lint clean
2025-07-05 13:25:37 +00:00
Matthew Raymer
1391cfd6bf Extract UsageLimitsSection as vue-facing-decorator component and integrate into AccountViewView
- Created UsageLimitsSection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved 'Usage Limits' UI and logic (status, spinner, message, recheck button) into the new component.
- Replaced original usage limits section markup in AccountViewView.vue with <UsageLimitsSection />.
- Passed loadingLimits and limitsMessage props, and wired up @recheck-limits event to call checkLimits().
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:11:31 +00:00
Matthew Raymer
8a776d58d9 Extract UsageLimitsSection as vue-facing-decorator component and integrate into AccountViewView
- Created UsageLimitsSection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved 'Usage Limits' UI and logic (status, spinner, message, recheck button) into the new component.
- Replaced original usage limits section markup in AccountViewView.vue with <UsageLimitsSection />.
- Passed loadingLimits and limitsMessage props, and wired up @recheck-limits event to call checkLimits().
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:11:31 +00:00
Matthew Raymer
cc86fe374f Extract LocationSearchSection as vue-facing-decorator component and integrate into AccountViewView
- Created LocationSearchSection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved 'Location for Searches' UI and logic into the new component.
- Replaced original location section markup in AccountViewView.vue with <LocationSearchSection />.
- Passed isRegistered and searchAreaLabel props, and wired up @set-search-area event to a new placeholder openSearchAreaDialog() method.
- Added placeholder openSearchAreaDialog() with a TODO for future implementation.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:07:13 +00:00
Matthew Raymer
7f1f8fc16c Extract LocationSearchSection as vue-facing-decorator component and integrate into AccountViewView
- Created LocationSearchSection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved 'Location for Searches' UI and logic into the new component.
- Replaced original location section markup in AccountViewView.vue with <LocationSearchSection />.
- Passed isRegistered and searchAreaLabel props, and wired up @set-search-area event to a new placeholder openSearchAreaDialog() method.
- Added placeholder openSearchAreaDialog() with a TODO for future implementation.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:07:13 +00:00
Matthew Raymer
e0b97261a8 Extract RegistrationNotice as vue-facing-decorator component and integrate into AccountViewView
- Created RegistrationNotice.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved registration prompt (yellow box) and "Share Your Info" button into the new component.
- Replaced original registration notice markup in AccountViewView.vue with <RegistrationNotice />.
- Passed isRegistered and show props, and wired up @share-info event to a new placeholder openShareDialog() method.
- Added placeholder openShareDialog() with a TODO for future implementation.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:03:48 +00:00
Matthew Raymer
3941f0a84d Extract RegistrationNotice as vue-facing-decorator component and integrate into AccountViewView
- Created RegistrationNotice.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved registration prompt (yellow box) and "Share Your Info" button into the new component.
- Replaced original registration notice markup in AccountViewView.vue with <RegistrationNotice />.
- Passed isRegistered and show props, and wired up @share-info event to a new placeholder openShareDialog() method.
- Added placeholder openShareDialog() with a TODO for future implementation.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 13:03:48 +00:00
Matthew Raymer
e792b542dc Extract IdentitySection as vue-facing-decorator component and integrate into AccountViewView
- Created IdentitySection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved all identity-related UI and logic (name, QR code, profile image, DID) into the new component.
- Replaced original identity section markup in AccountViewView.vue with <IdentitySection />.
- Passed all necessary props and implemented event handlers in AccountViewView.vue to maintain existing behavior.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 12:57:55 +00:00
Matthew Raymer
aa5aeb388c Extract IdentitySection as vue-facing-decorator component and integrate into AccountViewView
- Created IdentitySection.vue using vue-facing-decorator (class-based, TypeScript, @Component, @Prop, @Emit).
- Moved all identity-related UI and logic (name, QR code, profile image, DID) into the new component.
- Replaced original identity section markup in AccountViewView.vue with <IdentitySection />.
- Passed all necessary props and implemented event handlers in AccountViewView.vue to maintain existing behavior.
- Ensured all linter errors are resolved and code is consistent with project conventions.
2025-07-05 12:57:55 +00:00
Matthew Raymer
0200db8f84 Refactor AccountViewView.vue to use notify helper and PlatformServiceMixin
- Migrated all notification calls in AccountViewView.vue to use a notify helper initialized in mounted(), ensuring this.$notify is available and preventing runtime errors.
- Removed NotificationMixin and $notifyHelper usage; restored and standardized notify helper pattern.
- Migrated all database and platform service operations to use PlatformServiceMixin ultra-concise methods ($accountSettings, $saveSettings, $saveUserSettings, etc.).
- Cleaned up unused imports and code related to previous notification and database patterns.
- Ensured all linter errors and warnings are resolved in both AccountViewView.vue and notification utility files.
2025-07-05 12:42:31 +00:00
Matthew Raymer
d3042ec955 Refactor AccountViewView.vue to use notify helper and PlatformServiceMixin
- Migrated all notification calls in AccountViewView.vue to use a notify helper initialized in mounted(), ensuring this.$notify is available and preventing runtime errors.
- Removed NotificationMixin and $notifyHelper usage; restored and standardized notify helper pattern.
- Migrated all database and platform service operations to use PlatformServiceMixin ultra-concise methods ($accountSettings, $saveSettings, $saveUserSettings, etc.).
- Cleaned up unused imports and code related to previous notification and database patterns.
- Ensured all linter errors and warnings are resolved in both AccountViewView.vue and notification utility files.
2025-07-05 12:42:31 +00:00
Matthew Raymer
2eea44a6de Refactor notification usage and apply TypeScript/lint improvements
- Replaced direct $notify calls with notification helper utilities for consistency and reduced duplication.
- Updated AccountViewView.vue, PlatformServiceMixin.ts, and ShareMyContactInfoView.vue to use notification helpers.
- Added explicit TypeScript types and constants for notification patterns.
- Suppressed ESLint 'any' warning in notification mixin helper.
- Ensured all affected files pass linting.
2025-07-05 12:13:46 +00:00
Matthew Raymer
f901b6b751 Refactor notification usage and apply TypeScript/lint improvements
- Replaced direct $notify calls with notification helper utilities for consistency and reduced duplication.
- Updated AccountViewView.vue, PlatformServiceMixin.ts, and ShareMyContactInfoView.vue to use notification helpers.
- Added explicit TypeScript types and constants for notification patterns.
- Suppressed ESLint 'any' warning in notification mixin helper.
- Ensured all affected files pass linting.
2025-07-05 12:13:46 +00:00
Matthew Raymer
b2a2387f1a Add notification utility helpers and update PlatformServiceMixin
Created notification utility approaches to consolidate verbose $notify calls:
- Simple function utility (src/utils/notify.ts) - recommended approach
- Vue 3 composable (src/composables/useNotifications.ts)
- Utility class with mixin (src/utils/notificationUtils.ts)

Updated ClaimView.vue to demonstrate usage, reducing notification code by ~70%.
Enhanced PlatformServiceMixin with improved caching and database methods.
Updated ShareMyContactInfoView.vue with mixin improvements.
Provides consistent timeouts, standardized patterns, and type safety.
Ready for migration alongside mixin updates.
2025-07-05 11:37:20 +00:00
Matthew Raymer
08c2113504 Add notification utility helpers and update PlatformServiceMixin
Created notification utility approaches to consolidate verbose $notify calls:
- Simple function utility (src/utils/notify.ts) - recommended approach
- Vue 3 composable (src/composables/useNotifications.ts)
- Utility class with mixin (src/utils/notificationUtils.ts)

Updated ClaimView.vue to demonstrate usage, reducing notification code by ~70%.
Enhanced PlatformServiceMixin with improved caching and database methods.
Updated ShareMyContactInfoView.vue with mixin improvements.
Provides consistent timeouts, standardized patterns, and type safety.
Ready for migration alongside mixin updates.
2025-07-05 11:37:20 +00:00
Matthew Raymer
ddee99cb0b Refactor ClaimView.vue: remove inline template logic, improve types, and centralize logic
- Move all complex template logic to computed properties and methods
- Replace all `as any` usages with proper TypeScript types (OfferClaim, GiveActionClaim)
- Add computed property for claim image, removing inline image access
- Route all logging through PlatformServiceMixin
- Ensure all icon-only buttons have aria-labels for accessibility
- Remove unused imports and direct logger usage
- Lint clean: no warnings or errors remain
2025-07-05 11:11:32 +00:00
Matthew Raymer
bbdb962d4d Refactor ClaimView.vue: remove inline template logic, improve types, and centralize logic
- Move all complex template logic to computed properties and methods
- Replace all `as any` usages with proper TypeScript types (OfferClaim, GiveActionClaim)
- Add computed property for claim image, removing inline image access
- Route all logging through PlatformServiceMixin
- Ensure all icon-only buttons have aria-labels for accessibility
- Remove unused imports and direct logger usage
- Lint clean: no warnings or errors remain
2025-07-05 11:11:32 +00:00
Matthew Raymer
d660339e41 Migrate ClaimView.vue from databaseUtil to PlatformServiceMixin
- Replace databaseUtil.retrieveSettingsForActiveAccount() with this.$settings()
- Replace databaseUtil.mapQueryResultToValues() with this.$mapResults()
- Replace logConsoleAndDb() with logger.toConsoleAndDb()
- Add PlatformServiceMixin to component mixins
- Optimize allContacts assignment to single line: this.$contacts()
- Remove unused PlatformServiceFactory import
- All ClaimView tests passing (30-record-gift.spec.ts, 50-record-offer.spec.ts)
2025-07-05 10:36:26 +00:00
Matthew Raymer
17e8e13b62 Migrate ClaimView.vue from databaseUtil to PlatformServiceMixin
- Replace databaseUtil.retrieveSettingsForActiveAccount() with this.$settings()
- Replace databaseUtil.mapQueryResultToValues() with this.$mapResults()
- Replace logConsoleAndDb() with logger.toConsoleAndDb()
- Add PlatformServiceMixin to component mixins
- Optimize allContacts assignment to single line: this.$contacts()
- Remove unused PlatformServiceFactory import
- All ClaimView tests passing (30-record-gift.spec.ts, 50-record-offer.spec.ts)
2025-07-05 10:36:26 +00:00
Matthew Raymer
c55a486a25 Remove debug logging from generateAndRegisterEthrUser test utility
Clean up verbose console.log statements that were cluttering test output.
The function now performs the same operations without debug noise,
making test runs cleaner and more focused on actual test results.
2025-07-05 08:11:14 +00:00
Matthew Raymer
8feb2e6074 Remove debug logging from generateAndRegisterEthrUser test utility
Clean up verbose console.log statements that were cluttering test output.
The function now performs the same operations without debug noise,
making test runs cleaner and more focused on actual test results.
2025-07-05 08:11:14 +00:00
Matthew Raymer
8bbb8e83b9 refactor: Replace databaseUtil import with PlatformServiceMixin in MembersList
- Remove direct databaseUtil dependency from MembersList.vue
- Use $accountSettings() method from PlatformServiceMixin instead
- Improves code consistency and enables caching benefits
- Maintains identical functionality with enhanced error handling
2025-07-05 06:04:29 +00:00
Matthew Raymer
ec3c603894 refactor: Replace databaseUtil import with PlatformServiceMixin in MembersList
- Remove direct databaseUtil dependency from MembersList.vue
- Use $accountSettings() method from PlatformServiceMixin instead
- Improves code consistency and enables caching benefits
- Maintains identical functionality with enhanced error handling
2025-07-05 06:04:29 +00:00
Matthew Raymer
23789d4ecd Fix JavaScript runtime errors for undefined name property access
- Add null checks to prevent "Cannot read properties of undefined (reading 'name')" errors
- Fix ProjectCard, MembersList, ProjectsView, DiscoverView, ProjectViewView components
- Add null validation in DIDView.claimDescription() and ClaimReportCertificateView.drawCanvas()
- Add missing databaseUtil import in MembersList component
- Use meaningful fallback text for undefined names ("Unnamed Project", "Unnamed Member")
- Resolves template rendering crashes when entities lack name properties
2025-07-05 05:38:20 +00:00
Matthew Raymer
91a1618f40 Fix JavaScript runtime errors for undefined name property access
- Add null checks to prevent "Cannot read properties of undefined (reading 'name')" errors
- Fix ProjectCard, MembersList, ProjectsView, DiscoverView, ProjectViewView components
- Add null validation in DIDView.claimDescription() and ClaimReportCertificateView.drawCanvas()
- Add missing databaseUtil import in MembersList component
- Use meaningful fallback text for undefined names ("Unnamed Project", "Unnamed Member")
- Resolves template rendering crashes when entities lack name properties
2025-07-05 05:38:20 +00:00
Matthew Raymer
2b54354b3f Refactor ContactsView: replace verbose template with semantic CSS
- Remove 91 lines of repeated inline styling and complex conditionals
- Add 15 semantic CSS classes (btn-primary, contact-list, etc.)
- Replace inline logic with computed properties and methods
- Fix invalid Tailwind class: text-md → text-base
- 25% template code reduction with improved maintainability

Template: 349 → 258 lines, +149 lines reusable CSS
2025-07-05 04:36:27 +00:00
Matthew Raymer
1db420a066 Refactor ContactsView: replace verbose template with semantic CSS
- Remove 91 lines of repeated inline styling and complex conditionals
- Add 15 semantic CSS classes (btn-primary, contact-list, etc.)
- Replace inline logic with computed properties and methods
- Fix invalid Tailwind class: text-md → text-base
- 25% template code reduction with improved maintainability

Template: 349 → 258 lines, +149 lines reusable CSS
2025-07-05 04:36:27 +00:00
Matthew Raymer
a2a43f1719 Fix database undefined values causing SQL.js binding errors
Convert undefined values to null in database operations to prevent
"tried to bind a value of an unknown type" errors in SQL.js worker.

- Fix $insertContact() method undefined-to-null conversion
- Fix $insertEntity() method undefined-to-null conversion
- Preserve boolean false/0 values vs null distinction
- Maintain parameterized queries for SQL injection protection
- Fix contact creation errors in ContactsView component

Resolves database binding failures when inserting contacts with
undefined properties. All linting errors resolved.
2025-07-05 04:10:12 +00:00
Matthew Raymer
f92d81800b Fix database undefined values causing SQL.js binding errors
Convert undefined values to null in database operations to prevent
"tried to bind a value of an unknown type" errors in SQL.js worker.

- Fix $insertContact() method undefined-to-null conversion
- Fix $insertEntity() method undefined-to-null conversion
- Preserve boolean false/0 values vs null distinction
- Maintain parameterized queries for SQL injection protection
- Fix contact creation errors in ContactsView component

Resolves database binding failures when inserting contacts with
undefined properties. All linting errors resolved.
2025-07-05 04:10:12 +00:00
Matthew Raymer
1ceea19fb5 Fix TypeScript any type warnings in Vue components
Replace generic 'any' types with specific type definitions:
- EntitySummaryButton: Define edit-requested event payload type
- GiftDetailsStep: Add proper types for edit-entity and submit events
- HomeView: Use GiftedDialog type for customDialog ref

Resolves 7 TypeScript linting warnings, improves type safety
2025-07-05 03:08:12 +00:00
Matthew Raymer
3585290872 Fix TypeScript any type warnings in Vue components
Replace generic 'any' types with specific type definitions:
- EntitySummaryButton: Define edit-requested event payload type
- GiftDetailsStep: Add proper types for edit-entity and submit events
- HomeView: Use GiftedDialog type for customDialog ref

Resolves 7 TypeScript linting warnings, improves type safety
2025-07-05 03:08:12 +00:00
a96cc8155c fix incorrect checks for success 2025-07-04 16:58:18 -06:00
aeaac1b323 fix incorrect checks for success 2025-07-04 16:58:18 -06:00
Jose Olarte III
b57f7e4dd7 Feature: notify on click why entity is disabled 2025-07-04 19:12:56 +08:00
Jose Olarte III
993aa005fa Feature: notify on click why entity is disabled 2025-07-04 19:12:56 +08:00
Jose Olarte III
c002c9e245 Fix: remove duplicates from merge conflict 2025-07-04 17:19:04 +08:00
Jose Olarte III
17721ea448 Fix: remove duplicates from merge conflict 2025-07-04 17:19:04 +08:00
Matthew Raymer
c3851371c0 Fix TypeScript any types, console statements, and clean up duplicates
- Replace console.log with structured logger.debug() calls in AmountInput,
  GiftDetailsStep, and GiftedDialog components
- Fix duplicate enum values in constants/app.ts for LOCAL_*_API_SERVER
- Replace Record<string, any> with Record<string, string> for query params
- Update error handling from catch(err: any) to catch(err: unknown)
- Add EntityData interface and fix entity prop typing
- Remove USE_DEXIE_DB conditionals and unused database imports
- Fix duplicate imports and class members in GiftedDialog.vue
- Correct createAndSubmitGive function call parameters

Resolves 12 linting errors and 9 TypeScript any type warnings.
Improves type safety, logging practices, and removes deprecated code.
2025-07-04 08:29:43 +00:00
Matthew Raymer
082dc200b3 Fix TypeScript any types, console statements, and clean up duplicates
- Replace console.log with structured logger.debug() calls in AmountInput,
  GiftDetailsStep, and GiftedDialog components
- Fix duplicate enum values in constants/app.ts for LOCAL_*_API_SERVER
- Replace Record<string, any> with Record<string, string> for query params
- Update error handling from catch(err: any) to catch(err: unknown)
- Add EntityData interface and fix entity prop typing
- Remove USE_DEXIE_DB conditionals and unused database imports
- Fix duplicate imports and class members in GiftedDialog.vue
- Correct createAndSubmitGive function call parameters

Resolves 12 linting errors and 9 TypeScript any type warnings.
Improves type safety, logging practices, and removes deprecated code.
2025-07-04 08:29:43 +00:00
Matthew Raymer
b388dc3d8e Merge branch 'gifting-periphery-improvements' into build-improvement 2025-07-04 08:26:03 +00:00
Matthew Raymer
b78d2e7d22 Merge branch 'gifting-periphery-improvements' into build-improvement 2025-07-04 08:26:03 +00:00
Matthew Raymer
966dbc5164 Fix TypeScript any types and remove deprecated Dexie code
- Replace Record<string, any> with Record<string, string> for query params
- Fix error handling from catch(err: any) to catch(err: unknown)
- Add EntityData interface for proper entity typing
- Update EntitySelectionEvent interface with union types
- Remove USE_DEXIE_DB conditionals and unused import
- Clean up database service calls removing Dexie fallbacks

Resolves 9 TypeScript any type warnings, improves type safety across
entity selection components, and removes deprecated database migration code.
2025-07-04 08:06:08 +00:00
Matthew Raymer
56286e1fea Fix TypeScript any types and remove deprecated Dexie code
- Replace Record<string, any> with Record<string, string> for query params
- Fix error handling from catch(err: any) to catch(err: unknown)
- Add EntityData interface for proper entity typing
- Update EntitySelectionEvent interface with union types
- Remove USE_DEXIE_DB conditionals and unused import
- Clean up database service calls removing Dexie fallbacks

Resolves 9 TypeScript any type warnings, improves type safety across
entity selection components, and removes deprecated database migration code.
2025-07-04 08:06:08 +00:00
Matthew Raymer
ab784dca76 Fix CORS restrictions and development server configuration
Remove CORS headers to enable universal image support and fix local API server settings.

## Changes

**Remove CORS Headers**
- Remove Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers
- Enables images from any domain (Facebook, Medium, arbitrary websites)
- Database falls back to IndexedDB mode (minimal performance impact)

**Fix Local Development Configuration**
- Set LOCAL_ENDORSER_API_SERVER to http://127.0.0.1:3000 (was "/api")
- Create .env.development with local API server config
- Fix ensureCorrectApiServer() method in HomeView.vue
- "Use Local" button now sets proper localhost address

**Fix Settings Cache Issues**
- Add PlatformServiceMixin to AccountViewView.vue
- Disable settings caching to prevent stale data
- Settings changes now apply immediately without browser refresh

## Impact

**Tradeoffs:**
- Lost: ~2x SharedArrayBuffer database performance
- Gained: Universal image support from any domain
- Result: Better user experience, database still fast via IndexedDB

**Files Modified:**
- Configuration: vite.config.*.mts, index.html, .env.development
- Source: constants/app.ts, libs/util.ts, views/*.vue, utils/PlatformServiceMixin.ts

## Rationale

For a community platform, universal image support is more critical than marginal
database performance gains. Users share images from arbitrary websites, making
CORS restrictions incompatible with Time Safari's core mission.
2025-07-04 06:25:25 +00:00
Matthew Raymer
d823d1ad37 Fix CORS restrictions and development server configuration
Remove CORS headers to enable universal image support and fix local API server settings.

## Changes

**Remove CORS Headers**
- Remove Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers
- Enables images from any domain (Facebook, Medium, arbitrary websites)
- Database falls back to IndexedDB mode (minimal performance impact)

**Fix Local Development Configuration**
- Set LOCAL_ENDORSER_API_SERVER to http://127.0.0.1:3000 (was "/api")
- Create .env.development with local API server config
- Fix ensureCorrectApiServer() method in HomeView.vue
- "Use Local" button now sets proper localhost address

**Fix Settings Cache Issues**
- Add PlatformServiceMixin to AccountViewView.vue
- Disable settings caching to prevent stale data
- Settings changes now apply immediately without browser refresh

## Impact

**Tradeoffs:**
- Lost: ~2x SharedArrayBuffer database performance
- Gained: Universal image support from any domain
- Result: Better user experience, database still fast via IndexedDB

**Files Modified:**
- Configuration: vite.config.*.mts, index.html, .env.development
- Source: constants/app.ts, libs/util.ts, views/*.vue, utils/PlatformServiceMixin.ts

## Rationale

For a community platform, universal image support is more critical than marginal
database performance gains. Users share images from arbitrary websites, making
CORS restrictions incompatible with Time Safari's core mission.
2025-07-04 06:25:25 +00:00