Commit graph

91 commits

Author SHA1 Message Date
b234b8483f refactor(peer-support): update remaining UI references (Phase 2)
Dashboard: replace "Peer Support" card and "Book a peer session"
quick action with community ecology links.

Welcome: replace "Peer Support" resource card with "Community
Ecology" heading and link to /ecology.

Members index: rename active filter tag from "Offering Peer
Support" to "Offering Support". The underlying filter still works
correctly (queries communityEcology.offerPeerSupport).
2026-04-09 09:16:40 +01:00
0b3896d984 refactor(community): rename Community Connections → Community Ecology
Some checks failed
Test / vitest (push) Successful in 11m42s
Test / playwright (push) Failing after 9m27s
Test / visual (push) Failing after 9m53s
Test / Notify on failure (push) Successful in 2s
Simplify the feature to pure discovery (filter by topic, see matching
members, copy Slack handle). Drop the connection request/confirm flow
entirely — Connection model, 7 API endpoints, useConnections composable,
and TagInput component deleted.

- Rename communityConnections → communityEcology in schema, API, pages
- Delete legacy fields: offering, lookingFor, peerSupport
- New /ecology page, /api/ecology/suggestions, community-ecology.patch
- Nav: "Connections" → "Ecology", remove pending-count badge
- Fix auth/member.get.js missing craftTags + communityEcology
- Add community_ecology_updated activity log type
- Expose slackHandle conditionally when offerPeerSupport is true
- Add migration script at scripts/migrate-to-ecology.js (run before deploy)
2026-04-09 09:07:15 +01:00
9577929e0d refactor(peer-support): delete provably dead code (Phase 1)
The Skills Exchange + Peer Support feature was replaced by Community
Connections on 2026-04-05, but several files and code paths were left
in place as backward-compat. None are reachable from the live UI:

- usePeerSupport.js composable: not imported anywhere
- PeerSupportBadge.vue: not imported anywhere
- peer-support.vue: stub redirect with no incoming links
- /api/peer-support.get.js: only consumed by usePeerSupport
- /api/members/me/peer-support.patch.js: same
- profile.patch.js offering/lookingFor write branches: profile form
  no longer sends these fields (only writes communityConnections.*)
- PEER_SUPPORT_ENABLED/DISABLED activity types and renderers: only
  written by the deleted peer-support.patch endpoint. The activityText
  formatter has a fallback for unknown types so existing records
  still display ("peer support enabled" with a generic icon).

Tests updated to drop peerSupportUpdateSchema coverage and the
offering/lookingFor passthrough assertion.

schemas.js cleanup deferred — concurrent communityConnections →
communityEcology rename is in flight in the working tree.
2026-04-08 22:28:35 +01:00
3b5b0d831d refactor: phase 4 cleanup — delete SidebarLayout, drop dashboard-body
Now that all member-area pages have migrated to PageShell +
ColumnsLayout, SidebarLayout has no consumers and can be deleted.
PageShell owns the flex chain, so the .dashboard-body wrapper on
member/dashboard.vue (flex: 1; display: flex; flex-direction: column;
min-height: 0) is redundant. Update stale SidebarLayout comments on
members/[id].vue to reference ColumnsLayout.
2026-04-08 17:58:01 +01:00
4a5b129eeb fix(profile,account): wrap auth-conditional UI in ClientOnly
Vue hydration silently drops class attribute updates when SSR and client
render different branches of a v-if chain — per the project's Auth SSR
Pattern, useAuth is client-only and server always renders unauthenticated,
so PageHeader (v-else branch) was rendering inside a leftover .loading /
.loading-state div from the v-else-if branch. On mobile that div was
being masked by the visual-test commonMasks (.loading-state), producing
a large fuchsia block in the snapshot.

Wrapping the v-if/v-else-if/v-else chain in <ClientOnly> ensures the
server renders nothing for the auth-gated content and the client performs
a clean first render, matching the pattern already used in dashboard.vue.

Also update admin-dashboard-desktop for minor anti-aliasing drift.
2026-04-08 17:41:01 +01:00
8365feb970 refactor(profile): migrate member/profile to PageShell vocabulary
- Replace .profile-page wrapper + nested form with <PageShell as=form @submit.prevent>
- Replace .profile-columns grid with <ColumnsLayout cols=2> + named slots
- Replace all 5 .profile-col-inset wrappers with <PageSection> components
- Replace <hr class=section-divider> separators with <PageSection divider=top>
- Add type=button to Sign In CTA (prevent accidental form submit)
- Delete .profile-page, .profile-authenticated, .page-content, .profile-main, .profile-columns, .profile-col-left/right, .profile-col-inset asymmetric padding, and collapse rules
2026-04-08 17:10:21 +01:00
37fceac3fd refactor(account): migrate member/account to PageShell vocabulary
- Replace .member-account-page + .account-authenticated flex chains with <PageShell>
- Replace <SidebarLayout> with <ColumnsLayout cols=events-sidebar>
- Replace .account-columns grid with nested <ColumnsLayout cols=2> + named slots
- Replace all 5 .account-col-inset wrappers with <PageSection> components
- Rename .account-section--danger → .danger-section
- Delete ~75 lines of layout CSS (flex chains, grid, asymmetric paddings, collapse rules)
2026-04-08 17:07:30 +01:00
f267b35214 refactor(admin): migrate admin/index to PageShell + ColumnsLayout
- Replace .admin-dash wrapper + bespoke .page-header with <PageShell title/subtitle>
- Replace two .content-row grids with <ColumnsLayout cols=2 collapse=768> + named slots
- Rename .content-block to .admin-block (no border-right; ColumnsLayout provides divider)
- Drop .content-row, .content-block, .page-header scoped CSS
2026-04-08 17:04:38 +01:00
884cee7951 refactor(member-profile): migrate members/[id] to PageShell + ColumnsLayout
- Replace .profile-page wrapper with <PageShell>
- Replace <SidebarLayout> with <ColumnsLayout cols=events-sidebar>
- Drop .profile-page flex-chain CSS
- Leave bespoke .profile-hero alone (intentional two-col hero)
2026-04-08 17:02:07 +01:00
0d10c43af6 refactor(about): migrate about page to PageShell + ColumnsLayout
- Replace .about-page wrapper with <PageShell>
- Replace <SidebarLayout> with <ColumnsLayout cols=events-sidebar :limit=3>
- Drop .about-page flex-chain CSS
- Leave bespoke .about-hero alone (intentional two-column hero)
2026-04-08 17:00:46 +01:00
b93c8c7b2f refactor(dashboard): migrate member/dashboard to PageShell + ColumnsLayout
- Replace outer .dashboard wrapper with <PageShell>
- Replace <SidebarLayout> with <ColumnsLayout cols=events-sidebar :limit=5>
- Replace bespoke <div class=welcome> with <PageHeader> containing slotted meta
- Drop .dashboard and .welcome scoped CSS (flex chain + bespoke header)
- Update visual snapshots (welcome header now uses canonical PageHeader padding)
2026-04-08 16:59:26 +01:00
eb2544a42d refactor(activity): migrate to PageShell + ColumnsLayout
Replace .activity-page wrapper + SidebarLayout with PageShell +
ColumnsLayout cols="events-sidebar". Delete the now-redundant
flex-chain CSS that PageShell owns. Adds .loading-state to the
visual mask list to handle the connections-mobile race between
the loading and loaded states.
2026-04-08 16:45:12 +01:00
89c9a5e4a2 refactor(members): migrate members/index to PageShell
Wrap members directory page in PageShell. Also expand visual mask
selectors to cover .filter-bar, .skills-bar, and .connections-section
because filter content varies based on dynamic tag/topic state and
async fetch ordering. Rebaselines several existing snapshots that now
mask wider regions but capture the same structural layout.
2026-04-08 16:38:34 +01:00
657bc23404 refactor(connections): migrate to PageShell
Replace outer div.connections-page wrapper and explicit PageHeader with
PageShell component. Update connections-mobile-auth snapshot to match
the stable full-suite render state (filter bar absent when test admin
has no cooperative topics configured).
2026-04-08 16:29:52 +01:00
127d2974c8 feat(layout): add PageShell, ColumnsLayout, PageSection primitives
Introduces three new layout primitives (no consumers yet). Adds
--page-pad-x/y/collapse CSS tokens to :root and .dark. Updates
PageHeader to read padding from tokens. Removes ignored size="large"
props from welcome and series pages. Fixes stray markdown in SidebarLayout.
2026-04-08 15:51:38 +01:00
92e7dae74c feat(admin): add restore dismissed alerts flow
Some checks failed
Test / vitest (push) Successful in 11m48s
Test / playwright (push) Failing after 9m50s
Test / visual (push) Failing after 9m19s
Test / Notify on failure (push) Successful in 2s
Admins can now surface dismissed alert types without waiting for the
underlying data to change. Adds a collapsible "Restore dismissed"
section below the active alerts with per-type checkboxes.

- ALERT_METADATA map in adminAlerts.js as the single source of truth
  for slug → title/severity; detectors refactored to reference it
- GET /api/admin/alerts/dismissed returns this admin's dismissals
  joined with metadata (title, severity, dismissedAt)
- POST /api/admin/alerts/restore deletes dismissals by alertType[],
  returns the deleted count
- AdminAlertsPanel fetches both active + dismissed; stays visible
  when either is non-empty; checkboxes + "Restore selected" button
- adminAlertRestoreSchema validates the POST body against the enum
- Auth guards test covers both new routes
2026-04-08 12:22:35 +01:00
a2af4e31ff fix(admin): drop ClientOnly wrapper around alerts panel
Top-level `await useFetch` inside a ClientOnly boundary prevented the
component from mounting at all — the slot stayed an empty span and no
alerts ever rendered. Nuxt forwards request cookies on same-origin
server calls, so `requireAdmin` is satisfied during SSR and the panel
can render normally.
2026-04-08 12:22:25 +01:00
653bf78973 feat(admin): show alerts panel on dashboard 2026-04-08 11:24:00 +01:00
ba74bfd929 feat(admin): add AdminAlertsPanel component 2026-04-08 11:22:56 +01:00
4271ed0c6f fix: add auth middleware to profile page and update visual snapshots
- Add `middleware: 'auth'` to member/profile.vue (was missing)
- Harden loginAsAdmin helper to wait for networkidle after redirect so
  auth-init plugin and admin middleware finish before tests navigate
- Regenerate visual baselines to reflect updated profile page UI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 15:00:23 +01:00
fb25e72215 Huge bunch of UI/UX improvements and tweaks!
Some checks failed
Test / vitest (push) Successful in 10m36s
Test / playwright (push) Failing after 9m23s
Test / visual (push) Failing after 9m13s
Test / Notify on failure (push) Successful in 2s
2026-04-06 16:17:12 +01:00
501be10bfe feat: pre-registrant management and invitation system
Admin interface to review, filter, and batch-invite the 95 pre-registrants
from Baby Ghosts. Accept-invitation page pre-fills their data and collects
circle, pronouns, motivation, contribution tier, and agreement before
creating their member record.
2026-04-06 14:46:11 +01:00
bab53cec9e merge: worktree-a11y-fixes into main
Some checks failed
Test / vitest (push) Successful in 12m45s
Test / playwright (push) Failing after 10m5s
Test / visual (push) Failing after 9m16s
Accessibility fixes (aria-labels, color contrast, html lang, inline link
underlines), atomic dev login endpoints, and E2E test hardening.
2026-04-05 22:05:00 +01:00
c40f2c7c63 fix: accessibility improvements and test infrastructure hardening
Add aria-labels to form controls (selects, checkboxes, switches), set
html lang attribute and page title, fix color contrast for --candle-dim
and --text-faint tokens, underline inline links, remove opacity hack.
Harden dev login endpoints with atomic findOneAndUpdate and tokenVersion
in JWT. Update Playwright timeouts and E2E test helpers.
2026-04-05 21:59:02 +01:00
689548e389 Merge feature/community-connections into main
Adds Community Connections system: predefined tags with engagement states,
suggested connections page, and member discovery based on shared interests.
2026-04-05 17:05:58 +01:00
6573e30d31 fix: wire showHidden param through suggestions API, remove dead code 2026-04-05 17:00:06 +01:00
ed33cbb9e7 feat: add connections page, composable, nav badge, and peer-support redirect
- useConnections composable wrapping all /api/connections endpoints
- Connections page with suggestions, filters, and connection management
- Pending connection count badge in sidebar navigation
- peer-support.vue now redirects to /connections
2026-04-05 16:56:40 +01:00
d69d21abd6 fix: restore external Wiki URL in exploreItems navigation 2026-04-05 16:43:41 +01:00
896de2e7fd feat: add craft tags and community connections to directory and profiles
Update member directory and public profile APIs to include craftTags
and communityConnections with privacy-aware filtering. Directory now
uses predefined tags from the Tag model for filter bars and supports
craftTag/connectionTag query filters. Frontend shows craft tag pills
and cooperative topics with state labels, falling back to old
offering/lookingFor fields. Add Connections nav item.
2026-04-05 16:40:10 +01:00
bd07172093 fix: add connectionRequests to notification schema, remove dead notifyPeerRequests 2026-04-05 16:31:49 +01:00
2aa29ba64b feat: restructure profile page for community connections
Replace Skills Exchange section with CraftTagSelector in About You.
Replace Peer Support section with Community Connections using
CooperativeTagSelector. Update form data, load/save logic, and
notifications to use new field names with backward-compatible
fallbacks to old peerSupport data.
2026-04-05 16:28:34 +01:00
3551f19772 fix: correct POST body field name and state enum values in tag components 2026-04-05 16:25:10 +01:00
2c8529aed9 Add CraftTagSelector, CooperativeTagSelector, and TagSuggestModal components
Pill-toggle grid for craft tags, 3-state segmented control for cooperative
tags (matching PrivacyToggle visual pattern), and a minimal modal for
submitting tag suggestions via /api/tags/suggest.
2026-04-05 16:23:22 +01:00
06ee77592f feat: add community connections activity log types
Adds COMMUNITY_CONNECTIONS_UPDATED, CONNECTION_REQUESTED, CONNECTION_CONFIRMED,
and TAG_SUGGESTED to ACTIVITY_TYPES, ACTIVITY_TYPE_DEFAULTS, the Mongoose enum,
and activityText formatters. All four default to member visibility.
2026-04-05 16:17:25 +01:00
88c94aaaf4 Accessibility fixes.
Some checks are pending
Test / vitest (push) Waiting to run
Test / playwright (push) Blocked by required conditions
Test / visual (push) Blocked by required conditions
2026-04-05 16:03:10 +01:00
0ae18f495e Tests, UX improvements. 2026-04-05 14:25:29 +01:00
4e6f5d36b8 UX/UI improvements. 2026-04-05 13:26:51 +01:00
418d3cc402 UI/UX tweaks and improvements. 2026-04-05 12:28:41 +01:00
d31b5b4dac fix: use private helcimApiToken for all server-side Helcim API calls 2026-04-04 13:37:34 +01:00
c64933418b feat: add skip-to-content links and aria-labels for accessibility 2026-04-04 12:42:07 +01:00
ee438f5c60 chore: remove working copies and superseded verify.get.js 2026-04-04 12:41:33 +01:00
fcd6f4cdf4 feat: reskin admin pages to zine design system
Migrate the entire admin section from the dark guild-* Tailwind theme
to the zine design system (dashed borders, CSS custom properties,
Brygada 1918 + Commit Mono, cream/dark mode palette).

- Replace admin top-nav layout with sidebar matching default layout
- Reskin dashboard, members, events, series management pages
- Reskin events/create and series/create form pages
- Add dev-only test login endpoint (GET /api/dev/test-login)
- Redirect duplicate admin/dashboard.vue to /admin
- Update CLAUDE.md design system docs
2026-04-03 10:56:01 +01:00
f16f9ada64 fix: resolve sidebar nav hydration mismatch and admin events 500 error
Wrap auth-dependent sidebar navigation and meta in ClientOnly with
SSR fallback slots to prevent hydration mismatch that caused all
authenticated nav links to point to wrong pages. Fix admin events
page crash by replacing empty string USelect values with 'all'.
2026-04-03 09:24:29 +01:00
27d8f678ad feat: cleanup deprecated components and background texture 2026-04-02 21:38:50 +01:00
2c5986a32e feat: reskin modals to zine direction 2026-04-02 21:37:31 +01:00
1ac21d6a98 feat: reskin member pages to zine direction 2026-04-02 21:35:32 +01:00
88caca94c7 feat: reskin public pages to zine direction 2026-04-02 21:29:52 +01:00
8b3daadadd feat: add zine-direction shared components 2026-04-02 21:16:00 +01:00
dbb3fbbc1b feat: replace layout with fixed left sidebar and top strip 2026-04-02 21:11:47 +01:00
238d68d063 feat: replace design system tokens with zine direction palette and typography 2026-04-02 21:04:25 +01:00