Commit Graph
73 Commits
Author SHA1 Message Date
ik 1fabf21935 refactor: introduce semantic brand tokens 2026-09-12 09:54:26 +07:00
ik b0dd703f72 feat: establish brand identity hierarchy 2026-09-12 09:49:19 +07:00
ik 987d9ea109 perf: establish frontend performance baseline 2026-09-12 09:46:52 +07:00
ik e7f3de1ddc fix: tighten narrow viewport behavior
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:42:17 +07:00
ik 4fef0e8b74 feat: add accessible queue loading states
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 08:08:52 +07:00
ik 8f76f70409 feat: add activity level legend to spot view 2026-09-11 07:54:16 +07:00
ik 8c94d40766 feat: add one-click coordinate copying 2026-09-11 07:52:07 +07:00
ik 2ad2bdcdff fix: mark catalog outage pages as SEO errors
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:49:58 +07:00
ik 67d81f81ff fix: keep advanced filters accessible on mobile 2026-09-11 07:45:45 +07:00
ik 486e4c4673 fix: wire report idempotency and bootstrap scheduler check 2026-09-11 07:41:55 +07:00
ik f29ec706fd R09: Add PaginatedOfficialRecordOut schema and paginated /api/v1/records endpoint 2026-09-10 20:27:45 +07:00
ik e996c6da41 A08: Pass errorPage on all pages with potential errors
Bug: Only index.astro passed errorPage={filterError}, missing:
- index.astro unavailable (503) — Dataset оставался на error page
- spots/[id].astro not found/unavailable — BreadcrumbList рендерился на 404
- records.astro unavailable (503) — no structuredData but should be explicit

Fix:
- index.astro: errorPage={filterError || unavailable}
- spots/[id].astro: errorPage={!spot || unavailable}
- records.astro: errorPage={unavailable}
- report.astro: не нужен (structuredData не передаётся)

Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 19:12:15 +07:00
ik 2a0c7b2fa5 A04: Fix pagination 'load more' condition for server-side pages
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
Bug: Condition 'items.length < totalItems' always true for partial last
page (e.g., 5 < 45 on offset=40), showing 'load more' link to empty page.

Fix: Use 'offset + items.length < totalItems' to correctly detect when
all items have been shown. Also update displayed counter to show
'offset + items.length из totalItems' for accurate progress.

Verification:
- Astro build: 0 errors
- 45 items, page 0: shows '20 из 45', next link to offset=20
- 45 items, page 20: shows '40 из 45', next link to offset=40
- 45 items, page 40: shows '45 из 45', NO next link (45 < 45 = false)
- Empty results: no next link (0 < 0 = false)
2026-09-10 18:41:35 +07:00
ik 0e592ea404 A08: Add explicit errorPage prop to skip structuredData on error pages
Bug: Layout used 'noindex && path !== ""' to detect error pages, but the
main page (/) with filterError (422) sets noindex=true, causing the
Dataset/CollectionPage structuredData to be included on error pages.

Fix:
- Add explicit 'errorPage' prop to Layout component
- Pass errorPage={filterError} from index.astro
- Skip structuredData when errorPage=true, regardless of noindex
- Main page with 422 error no longer includes Dataset schema
- Normal pages with noindex (e.g., /admin) still work correctly

Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 18:17:13 +07:00
ik 1d403883a0 A05: Add sessionStorage error handling for unavailable storage
Bug: sessionStorage operations (getItem, setItem, removeItem) could fail
if storage is unavailable (private mode, quota exceeded, etc.), causing
form draft recovery to break.

Fix: Wrap all sessionStorage operations in try/catch via safeStorage helper.
- safeStorage.getItem() - returns null on error
- safeStorage.setItem() - silently ignores errors
- safeStorage.removeItem() - silently ignores errors

This ensures:
- Draft recovery works even if storage is partially unavailable
- Form submission doesn't crash if storage is full
- Cleanup on success doesn't crash
- File input values are not saved (already handled by FormData filter)

Verification:
- Astro build: 0 errors
- All existing A05 behavior preserved
- Error handling added for read, write, and cleanup
2026-09-10 18:10:57 +07:00
ik 6183fb3417 A04: Fix filter-advanced-field CSS to preserve label/select relationship
Bug: display:contents on label breaks the implicit label-for association
with the select inside it. This causes accessibility issues and breaks
keyboard navigation on mobile.

Fix: Replace display:contents with display:flex;align-items:center;gap:6px
on desktop. This preserves the inline layout while maintaining the label
relationship with the select element.

Mobile behavior unchanged: filter-advanced-field is hidden via display:none
on screens <=720px, replaced by filter-advanced-fallback details element.

Verification:
- Astro build: 0 errors
- Label/select relationship preserved for keyboard navigation
- Desktop layout: flex row with gap
- Mobile: fallback details element shown
2026-09-10 18:10:13 +07:00
ik 5de8ea939a A04: Fix pagination offset calculation for server-side pages
Bug: load-more link used items.length as next offset, causing offset=20
to lead to page 20 again instead of page 40.

Fix: Use offset + items.length for correct next page calculation.
With 20 items per page: offset=0→20→40→...

Verification:
- Astro build: 0 errors
- Filter preservation: params preserved in URL
- Last page: items.length < totalItems check works
- Invalid offset: Number.isInteger check on line 16
2026-09-10 17:56:45 +07:00
ik b7c00dca8a A04: Fix duplicate offset parameter in pagination link
Remove existing offset parameter before adding new one to prevent
duplicate query parameters like ?offset=20&offset=40.

Fix: Use URLSearchParams.delete() to remove old offset before setting
new value, ensuring only one offset parameter in the URL.

Verified: Astro build succeeds with 0 errors
2026-09-10 06:27:51 +07:00
ik 745a5ff9fd A08: Skip misleading structuredData on error pages
- Dataset/CollectionPage not rendered on noindex error pages (422/503/404)
- WebSite schema always present for navigation
- noindex + nofollow on error/admin pages
- canonical URL consistent with trailingSlash: never policy
- Astro check: 0 errors
2026-09-10 06:12:32 +07:00
ik 9e4d7aefba A05: Restore draft on rate_limited/server_error/timeout states
- Extend draft recovery to create_error, rate_limited, server_error, timeout
- Clear draft only on success (sent/screenshot_sent)
- Focus on form-error after recovery
- Double submit protection already in place (R10)
- Astro check: 0 errors
2026-09-10 06:12:09 +07:00
ik 2ccca7350f A04: Fix selected attributes for all period options
- Add selected={hours === '6/12/72'} to all period options (was only on 24)
- Ensures correct UI state when URL has hours=6/12/72
- CSS for filter-compact-hidden already correct (display:none!important)
- Filter fallback details working for no-JS mobile
- Pagination (R09) already handles offset preservation
2026-09-10 06:11:49 +07:00
ik 3ea08fa706 S03: Consistent site origin — trailingSlash never, canonical URLs
- Add trailingSlash: 'never' to Astro config
- Normalize sitemap paths to never use trailing slash
- Ensures consistent canonical URLs across all pages
- Prevents duplicate content from / vs /path/ variants
2026-09-10 05:53:36 +07:00
ik 6e0077bd4d R10: Fix TimeoutError handling — use DOMException.TimeoutError check
- AbortSignal.timeout() throws DOMException with name='TimeoutError', not TypeError
- Check for DOMException.TimeoutError, TypeError(fetch), or Error(abort)
- Apply same fix to report.ts and report-screenshot.ts
- Timeout redirects to 'timeout' state, other errors to 'create_error'
2026-09-10 05:43:34 +07:00
ik 67681ee039 R09: Fix pagination — preserve filters and use offset from URL
- Read offset from URL search params (default 0)
- Pass offset to /api/v1/activity instead of hardcoded 0
- Append items when offset > 0 (infinite scroll behavior)
- Fix 'load more' link to not duplicate URL params
- Astro check: 0 errors, Python tests: 97 passed
2026-09-10 05:41:53 +07:00
ik 38bb871638 fix: R08 filter-compact-hidden display:none + details fallback for no-JS (#1788956171115) 2026-09-10 05:39:06 +07:00
ik d962ba2f90 fix: R02 activity API contract — PaginatedActivity + all consumers (#1788956171115) 2026-09-09 20:58:42 +07:00
ik 9ae05ef6f0 fix: S01 HTTP/SEO contract — noindex for errors, 422/503 status codes (#1788956171115) 2026-09-09 20:14:10 +07:00
ik b31042337b fix: U03 pagination + U04 form errors with retry (#1788956171115) 2026-09-09 20:08:20 +07:00
ik 63e33e1861 fix: audit P0-P1 — T03-T07, D01-D08, U01-U02 (#1788956171115) 2026-09-09 20:02:52 +07:00
ik 731eade7b3 fix: polish narrow mobile layouts 2026-09-08 16:29:03 +07:00
ik 6e21bb774d perf: optimize public image assets
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-08 16:18:32 +07:00
ik 25114d18c4 build: make web image dependencies reproducible
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-08 13:26:26 +07:00
ik 1f63f71600 Fix review queue pagination and API fallback handling
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-08 13:24:58 +07:00
ik ddb6909c4d sync
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-08 09:31:41 +07:00
ik 24ee01b9c3 feat: show catch freshness on spot details 2026-09-07 18:53:04 +07:00
ik f04dbabb3c fix: avoid duplicate leader panel
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 18:51:22 +07:00
ik 0f9c255596 feat: group duplicate field signals
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 18:45:16 +07:00
ik ef8355904c feat: paginate public field signals 2026-09-07 17:12:41 +07:00
ik 37aa8ec60d feat: add open alpha banner 2026-09-07 17:11:08 +07:00
ik dbe01359de feat: illustrate empty states 2026-09-07 17:09:22 +07:00
ik 6d88ba030f feat: add subtle fish silhouettes
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 17:08:11 +07:00
ik 0a27c55da7 feat: add fishing activity timeline 2026-09-07 17:06:44 +07:00
ik 72057c7b99 feat: add spot coordinate radar 2026-09-07 17:04:59 +07:00
ik ebdeaf3659 feat: publish data source legend 2026-09-07 17:03:54 +07:00
ik f2a97d2b80 feat: add unified data passports
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 17:02:14 +07:00
ik 3529b6a1c8 feat: complete brand icon and static caching
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 16:59:44 +07:00
ik 486016d977 feat: expose safe source health status
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 16:57:14 +07:00
ik 4e037eb7e8 feat: add canonical spot URLs 2026-09-07 16:43:12 +07:00
ik 233c5887eb feat: add searchable fish and waterbody pages 2026-09-07 16:39:28 +07:00
ik 7e60daed6f feat: add branded social preview
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-07 13:31:34 +07:00