mirror of
https://github.com/logos-co/logos-web.git
synced 2026-08-27 12:11:14 +00:00
develop
10
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
bc30c4cede |
refactor(civi-crm/web): drop CiviCRM integration
* refactor(civi-crm): remove case management pages and API The Circle Case UI, its API routes and the CiviCRM query layer they used are gone. Keeps the app shell out entirely: no pages remain, so the layout, styles and UI dependencies go with them. * refactor(civi-crm): drop CiviCRM write from the intake endpoint Submissions now go to Notion and, for the steward form, n8n. The legacy afformCircleContactForm name was CiviCRM-only and is no longer accepted; the fields[] payload is ignored. * chore(web): remove CiviCRM afform generator scripts They fetched form definitions from the CiviCRM API, which is gone. The generated files under lib/civicrm are hand-maintained from now on. * refactor(web): trim funnel form definitions and move to lib/funnel-forms Fields keep only what renders the form: formKey, label, inputType, required, repeatable. The CiviCRM entity/join/fieldName plumbing and the fields[] POST payload are gone, along with the unused circle contact form. country was marked required but exempt from validation through its CiviCRM Address join, so it is now enforced like every other required select. * docs: rewrite civi-crm and funnel docs for the intake-only app Drops the CiviCRM API guide and the case management architecture, and updates the funnel reference to the Notion + n8n flow. |
||
|
|
8f023f99d3 | fix: restore Basecamp platform downloads | ||
|
|
a7b0850954 |
docs: add responsive image frame fitting guide
Six reusable techniques (fill, aspect-ratio, object-fit, derived heights, sibling sync, sizes) with a decision tree and a worked example tied to the homepage Basecamp card. Registered in root and web AGENTS.md. |
||
|
|
ede23c2cc2 |
Refactor: centralize content width with ContentWidth component + align layouts to Figma (#24)
* fix(builders-hub): align ideas page details to Figma Match exact Figma specs for the Builder Ideas page (desktop 121:11657, mobile 121:11581): - idea-row: desktop index weight Regular (was medium); mobile title width 179px; mobile Apply CTA square corners (drop rounded-[4px]) and left-aligned at x=298 (right-[22px]) - bottom CTA: heading H3 (36px desktop / 30px mobile) instead of H2 (56px); restore text-h3-serif line-height 1 / -0.03em; gap 24px * fix(builders-hub): align RFP page details to Figma Match exact Figma specs for the Builder RFPs page (desktop 121:11577, mobile 121:11489): - rfp-card: title letter-spacing -0.01em (H4 Sans) instead of tracking-tight (-0.025em) - rfp-list-row: apply the same Row-entry corrections as the ideas row — desktop index weight Regular (was medium), mobile title width 179px, Learn More CTA square corners (drop rounded-[4px]) and left-aligned at x=298 (right-[22px]) - listing grid (RFP branch only): desktop top margin 138px so the first card lands at Figma y=374 (was 160px -> 396px, 22px too low); ideas and list-view branches untouched Text copy verified against Figma (titles/taglines match, British spelling kept where Figma used American). Grid layout, card geometry (345x317 desktop / 369x317 mobile), colours, borders, 96px images and CTA positions confirmed matching. * fix(get-started): align spacing, colours, and copy with Figma - Correct 04 heading copy to "What you can build today" - Swap community row alternating backgrounds (row 0 = grey-01) - Restyle community row labels to 14px (sans-medium number + serif name) - Underline community row "Learn more" CTA (border-b) - Build card body: Public Sans 14px instead of mono 10px - Fix install/docs section top padding (install pt-24, docs pt-40 on desktop) - Add 6px gap between install card image and text panel * fix(basecamp): align spacing, padding, and text gaps with Figma design - Fixed HowItWorksSection: md:py-3 → md:py-10 (was reducing padding on desktop) - Fixed LocalFirstSection: py-3 → py-10 for proper vertical spacing - Increased gap spacing from 3 to 4 across card components and sections - Added uppercase styling to LocalFirstSection eyebrow - Added opacity-0 to footerLabel for layout consistency - Adjusted ModularSection vertical padding: py-10 → py-12 mobile, py-10 desktop - Added flex flex-col gap-4 to ModularSection body text - CapabilitiesSection: py-6 → py-10 mobile for consistent spacing - ResourcesSection: py-10 → py-12 mobile for alignment with other sections - Improved internal spacing in ResourceCard (gap-3 → gap-4, mt-3 → mt-4) All changes verified against Figma desktop design at node-id=146-15527 * refine(basecamp): fine-tune section spacing and padding alignment - HeroSection: pb-12 mobile, pb-10 desktop (better spacing at section break) - HowItWorks title gap: mb-6 → mb-8 (increased spacing to content) - ModularSection: removed inconsistent py-12, standardized to py-10 - CapabilitiesSection heading: mb-10 → mb-12 (better visual hierarchy) - ResourcesSection: removed inconsistent py-12, standardized to py-10 All sections now maintain consistent padding pattern: py-10 with device-specific overrides where needed * fix(lambda-prize): align spacing, padding, and gap with design - HowItWorks: gap-3 → gap-4 mobile, gap-6 desktop, added md:px-3 md:py-10 - HowItWorks titles: mb-6 → mb-8 for both sections - FeaturedPrizes: mt-6 → mt-10 mobile, mt-12 desktop, gap-3 → gap-4, moved px-3 to section level - AboutProgramme: gap-3 → gap-4 mobile, gap-6 desktop, added md:px-3 md:py-10 - Support: pt-10 → py-10 mobile, py-12 desktop, added px-3, removed redundant px-3 from grid All sections now have consistent spacing patterns aligned with Figma design specifications * fix(lambda-prize): precision spacing refinements - standardize padding and margins - DataRows: increase py-1.5 → py-3 for better vertical spacing - FeaturedPrizes: reduce excessive padding pt-[100px] → pt-10, md:pt-[200px] → md:pt-12 - Hero: standardize margins mb-[60px] → mb-12, mt-[60px] → mt-12 - Support: standardize margin-top mt-[35px] → mt-6, md:mt-[91px] → md:mt-8 * fix(research): align section heights with Figma design - Change hero section from min-h-[447px] to h-[447px] (fixed height) - Change overview section from min-h-[670px] to h-[670px] (desktop) - Change resource rows from min-h-[50px] to h-[50px] (fixed height) - Change contribute section from min-h-[262px] to h-[262px] (desktop) These fixed heights match the Figma design specifications for precise layout control across all breakpoints. * fix(research): revert to min-h for responsive design Responsive design requires minimum heights (min-h) instead of fixed heights (h) to accommodate content overflow on various screen sizes. Maintains Figma design intent while ensuring proper mobile/tablet layout behavior. * fix(press): align PressHero padding with Figma design Change PressHero section padding from pt-6 (24px) to pt-10 (40px) to match Figma design specifications where section starts at y=40. All other spacing, margins, colors, and image ratios already aligned with Figma design. Press page now 100% design-compliant. * fix(podcast): add wrapper padding for consistent page layout spacing * fix(podcast): align top padding with Figma design (pt-20/80px) * fix(broadcast-network): align padding with Figma design specs * fix(technology-stack): align hero padding with design specifications * fix(technology-stack): center hero section on desktop to fix left alignment * fix(technology-stack): make architecture image responsive and prevent clipping * fix(technology-stack): constrain all sections to 1440px max-width on desktop * refactor: centralize max-width layout at page level to eliminate duplication - Add SectionLayout wrapper to all technology-stack pages (main, blockchain, networking, storage, messaging) - Move 1440px max-width constraint from individual section components to page-level layout - Remove mx-auto max-w-360/max-w-[1440px] from tech-stack sections and shared components - Reduces code duplication and centralizes layout management * refactor: simplify layout by inlining max-width constraint - Remove SectionLayout function definitions from each page - Use simple div wrapper at page return level - Reduces code duplication and improves maintainability * refactor: revert page-level layout constraint, keep section-level management - Remove max-width wrapper from page returns - Each section maintains full-width background - Section components manage internal 1440px constraint - Preserves visual hierarchy from Figma design * refactor: centralize content width constraints with ContentWidth component - Create ContentWidth component for 1440px max-width constraint - Remove layout-level max-width from main element to allow full-width sections - Apply ContentWidth to all home page sections for consistent layout - Convert absolute positioning to flex/grid layouts in: * Parallel Society (gallery display) * Tech Stack (title and metadata centering) * Feature Cards (3-column grid) * Circles CTA (vertical layout) * Press Section (flex grid) * Social Proof (4-column grid) * Start Building (2-column layout) * About Section (centered closing text) - Implement responsive sizing with Tailwind classes - Update technology-stack page section for proper centering This enables full-width background colors while constraining content to 1440px max-width, improving design system consistency across all pages. * refactor: make social proof section full-width without 1440px constraint Remove ContentWidth wrapper from the stat cards section to allow it to span full screen width while maintaining proper padding. * fix: add line break in 'The Logos Technology Stack' title Match Figma design by breaking 'The Logos' and 'Technology Stack' onto separate lines. * fix: add line break in Basecamp title Match Figma design by breaking 'Basecamp is our' and 'Exit Guide.' onto separate lines. * fix: add line break to tech stack title on mobile view Use <br /> instead of literal newline for proper HTML rendering of 'The ... Technology Stack' title. * fix: add width constraints to AppInstall paragraph text Match container width (260px mobile, 464px desktop) to ensure text wrapping aligns with Figma design. * Revert "fix: add width constraints to AppInstall paragraph text" This reverts commit 184efed9421b0b8c006d5121f26da72b7d015491. * fix(tech-stack): constrain desktop title to 464px to match Figma Desktop h2 used w-full, so 'The Logos Technology Stack' stayed on one line at wide/4K viewports. Figma node 121:6875 sets it to 464px, which wraps it to two lines. Parent is items-center so the fixed width centers. * refacor: refactor layout components to use ContentWidth for consistent styling - Updated various sections across the application to wrap content in the ContentWidth component for improved layout consistency. - Adjusted padding and margin values in several sections to enhance visual alignment. - Modified text content in the About section to reflect updated messaging. - Improved accessibility and responsiveness by ensuring all sections utilize the ContentWidth component. * feat: integrate ContentWidth component for layout consistency across various sections * feat: update StorageAccess component with new card data and CTA buttons for improved user interaction * feat: update MessagingIntro and related tests for improved layout and responsiveness based on Figma specifications * Refactor code structure for improved readability and maintainability * Refactor code structure for improved readability and maintainability * Refactor technology stack detail layout and hero components - Introduced `TechStackDetailPage` and `TechStackDetailSection` components for consistent layout across technology stack pages. - Updated individual technology stack pages (blockchain, messaging, networking, storage) to utilize the new layout components. - Refactored hero components (BlockchainHero, MessagingHero, NetworkingHero, StorageHero) to use `TechStackDetailHero` for improved structure and reusability. - Adjusted spacing and margin classes to align with design specifications, removing redundant margin classes. - Added `imageFit` property to builders hub settings schema to control image display behavior. - Updated tests to ensure layout consistency and adherence to design specifications. * feat: enhance layout and responsiveness of articles and podcasts sections based on Figma specifications * fix: prevent messaging delivery image clipping * feat: update article and podcast layouts for improved responsiveness and alignment with Figma designs * test: remove ui implementation contracts |
||
|
|
1a37cf1f22 | fix: use British English for public copy and paths (#5) | ||
|
|
15aea96184 |
feat(civi-crm): implement query layer and activity logger
* feat(civi-crm-cms): add project architecture documentation
* chore(civi-crm-cms): register app in mono-repo
Add civi-crm-cms env vars to turbo.json build.env. Update root AGENTS.md
with app entry (port 3002, arch doc link) and dev command. Update lockfile.
* chore(civi-crm-cms): scaffold app config and tooling
Next.js 16, Tailwind v4, Vitest, ESLint, PostCSS — matching apps/web
conventions. Path alias @/* → ./src/*. Port 3002. AGENTS.md links to
the architecture doc and documents doc-update rules and code conventions.
* feat(civi-crm-cms): add lib layer, view config, and domain type stubs
- views.ts: full ViewConfig types + circles_onboarding config + getActiveView()
- auth.ts: getCurrentUserEmail() — DEV_USER_EMAIL_MOCK override + Keycloak header
- civicrm/client.ts: CiviCRMClient skeleton with typed interface
- civicrm/scorecard.ts: computeScorecard() pure function (tested, 4 passing)
- civicrm/{cases,contacts,activities,relationships,coordinators}.ts: stubs
- activity-logger.ts: logActivity() stub
- constants/pagination.ts: PAGE_SIZE = 20
- types/{case,contact}.ts: placeholder stubs
* feat(civi-crm-cms): add app router skeleton
Root layout + redirect to /cases. Page stubs for list and detail views.
Server Actions stub (updateCase, updateContact, swapCoordinator).
API route stubs returning 501 for all planned endpoints:
GET /api/cases, GET+PATCH /api/cases/[id], GET /api/cases/[id]/activities,
PATCH /api/cases/[id]/coordinator, PATCH /api/contacts/[contactId],
GET /api/coordinators.
* feat(civi-crm-cms): add component stubs
AppNav, CasesTable, CasesFilters, CaseDetailShell, CaseFields,
ContactFields, Scorecard, ActivityLog — each returns null with a
TODO comment describing its role per the architecture doc.
* fix(civi-crm-cms): add assignedTo FieldDef backed by Relationship entity
Adds a missing FieldDef for the `assignedTo` listColumn so that
`getFieldDef()` no longer throws when rendering or building select[] for
that column. The field is `readonly` with a dedicated `Relationship`
UpdateTarget, reflecting that coordinator assignment goes through
CiviCRM's Relationship entity rather than a direct Case/Contact PATCH.
* chore(civi-crm-cms): update architecture docs
Remove mention of repo pending node & pnpm upgrade.
* docs(civi-crm-cms): align ActivityLog Server/Client boundary description
The table incorrectly said ActivityLog had no client-side fetching, but
the stub and the dedicated GET /api/cases/[id]/activities?page= route
both indicate it fetches on page change. Corrected to reflect that
ActivityLog is a client-fetching component, with a note that the Server
Component shell can pre-fetch page 1 to avoid a first-render waterfall.
* docs(civi-crm-cms): fix globals.css snippet to use Tailwind v4 import syntax
The snippet used `@tailwind utilities;` which is a v3 directive. Updated
to match the actual app file and apps/web pattern: `@import 'tailwindcss'`
plus the `@source` directive for the shared UI package. Added a note
clarifying that the v3 directives must not be used.
* fix(civi-crm-cms): guard DEV_USER_EMAIL_MOCK against production
* fix(civi-crm-cms): strengthen views and client stubs
- Add skipSelect flag to FieldDef; mark assignedTo so select[] builders
have a typed signal to exclude it rather than relying on comments
- Add assertViewIntegrity() called from getActiveView() to catch
scorecardFieldKeys referencing unknown or non-scorecard field keys at startup
- Add constructor to CiviCRMClient wiring CIVICRM_BASE_URL / CIVICRM_API_KEY
- Remove spurious blank lines in update() params
- Document null as a valid CiviWhere value for IS NULL / IS NOT NULL operators
* docs(civi-crm-cms): sync architecture doc with code fixes
- Fix /case/[id] → /cases/[id] route path in §1
- Add Relationship to UpdateTarget union in §5.2
- Add skipSelect to FieldDef snippet in §5.2
- Update auth.ts snippet in §8 to show NODE_ENV guard with explanation
- Add null to CiviWhere type in §6.1 with IS NULL / IS NOT NULL note
* refactor(civi-crm-cms): rename circles_onboarding view to movement_view
Renames the view ID, variable, label, and caseTypeName throughout:
- src/lib/views.ts: const + registry key + ACTIVE_VIEW default
- .env.local.example: ACTIVE_VIEW default value
- docs/civi-crm-cms-architecture.md: §5.1, §5.3, §13 snippets
* feat(civi-crm-cms): implement types and CiviCRM HTTP client
Define raw CiviCRM APIv4 response types, domain types for Case/Contact,
and implement the four CiviCRMClient methods (get, create, update, delete)
with X-Civi-Auth header and CiviCRMError on non-2xx responses.
* test(civi-crm-cms): add CiviCRMClient unit tests
* feat(civi-crm-cms): extend CiviCRM client with IN support, orderBy, and count()
- Widen CiviWhere third element to accept (string | number)[] for IN / NOT IN
- Add optional orderBy to CiviParams, passed through in get() body
- Add count() method that returns data.count without fetching full rows
* feat(civi-crm-cms): implement query layer
Implement all CiviCRM entity query functions:
- cases: listCases (2-round with assignee pre-filter), getCaseById (3+2 parallel rounds), updateCase
- contacts: getContactById, updateContact, updateEmail, resolveOrCreateContactByEmail
- activities: listActivities (paginated, date-desc), createActivity
- relationships: getCoordinatorRelationship, deleteRelationship, createCoordinatorRelationship
- coordinators: listCoordinators (deduplicated by contact)
* feat(civi-crm-cms): implement activity logger
- buildSubject: single change includes from/to if under 128 chars, strips
values if too long; multiple changes list field names only
- buildDetails: full context -- editor name + email, date, entity, per-field
before/after values; always written regardless of subject truncation
- logActivity: resolves contact by email, uses display_name as actor,
writes both subject and details fields; swallows errors to never fail mutations
* refactor(civi-crm-cms): move unit tests to __tests__ directories
* test(civi-crm-cms): add query layer and activity logger tests
- cases: buildCaseSelect exclusions, listCases WHERE/filter/pagination/merge
behaviour, getCaseById round structure and field mapping, updateCase safety
- activity-logger: buildSubject truncation logic, buildDetails completeness,
logActivity integration (display_name fallback, details vs subject invariant)
* chore(civi-crm-cms): add check-all convenience scripts
* chore(civi-crm): update directory name
* chore: update lock file
* chore(civi-crm): update directory name
* refactor(civi-crm): tighten CiviCRMClient and expand tests
- Extract repeated auth headers into a private getter
- Simplify get() body to JSON.stringify(params) -- new CiviParams fields no longer need manual wiring
- Guard create() against empty values response; throws CiviCRMError(200) instead of returning undefined
- Assert request body in create and update tests
- Add test for empty-values guard in create
* docs: rename civi-crm-cms to civi-crm in architecture doc
* chore: update lock file
* refactor(civi-crm): tidy count() and add tests
Deduplicate auth headers by reusing this.authHeaders and add an
explanatory comment for the limit:0 / select:['id'] counting pattern.
Add four tests covering URL, body shape, return value and error propagation.
* fix(civi-crm): guard missing lead contact in getCaseById
Throw CiviCRMError(404) when CaseContact is absent rather than silently
querying with contact_id=0. Also documents why Circle_Case.Scorecard is
stripped in updateCase, and removes an unused variable from the test.
* refactor(civi-crm): centralise instance-specific IDs in civiConfig
Extract three numeric IDs and the coordinator relationship type name into
a single config.ts. Update all consumers to reference civiConfig rather
than scattered local constants, making environment differences a one-file
change. Also caps listCoordinators at 2500 rows to bound the unbounded fetch.
* chore(civi-crm): remove outdated doc file
* fix(civi-crm): drop invalid CaseContact.role field
civicrm_case_contact has only id/case_id/contact_id columns; role is not
a valid API field and was never consumed by the list-building logic.
* perf(civi-crm): replace count() with row_count aggregate
The previous implementation fetched every matching row (select id, limit 0)
to derive a count from data.count. Using select: ['row_count'] returns a
single aggregate record without transferring entity rows, which is both
correct per the APIv4 spec and avoids full-table scans on large datasets.
* fix(civi-crm): normalize is_primary to boolean in Email where clause
* docs: add CiviCRM API v4 usage guide
* chore: move civi-crm docs into docs/civi-crm/ and update references
* docs(civi-crm): update client interface in architecture doc and link to api.md
|
||
|
|
a162388bfa |
feat(civi-crm-cms): architecture doc and project skeleton
* feat(civi-crm-cms): add project architecture documentation
* chore(civi-crm-cms): register app in mono-repo
Add civi-crm-cms env vars to turbo.json build.env. Update root AGENTS.md
with app entry (port 3002, arch doc link) and dev command. Update lockfile.
* chore(civi-crm-cms): scaffold app config and tooling
Next.js 16, Tailwind v4, Vitest, ESLint, PostCSS — matching apps/web
conventions. Path alias @/* → ./src/*. Port 3002. AGENTS.md links to
the architecture doc and documents doc-update rules and code conventions.
* feat(civi-crm-cms): add lib layer, view config, and domain type stubs
- views.ts: full ViewConfig types + circles_onboarding config + getActiveView()
- auth.ts: getCurrentUserEmail() — DEV_USER_EMAIL_MOCK override + Keycloak header
- civicrm/client.ts: CiviCRMClient skeleton with typed interface
- civicrm/scorecard.ts: computeScorecard() pure function (tested, 4 passing)
- civicrm/{cases,contacts,activities,relationships,coordinators}.ts: stubs
- activity-logger.ts: logActivity() stub
- constants/pagination.ts: PAGE_SIZE = 20
- types/{case,contact}.ts: placeholder stubs
* feat(civi-crm-cms): add app router skeleton
Root layout + redirect to /cases. Page stubs for list and detail views.
Server Actions stub (updateCase, updateContact, swapCoordinator).
API route stubs returning 501 for all planned endpoints:
GET /api/cases, GET+PATCH /api/cases/[id], GET /api/cases/[id]/activities,
PATCH /api/cases/[id]/coordinator, PATCH /api/contacts/[contactId],
GET /api/coordinators.
* feat(civi-crm-cms): add component stubs
AppNav, CasesTable, CasesFilters, CaseDetailShell, CaseFields,
ContactFields, Scorecard, ActivityLog — each returns null with a
TODO comment describing its role per the architecture doc.
* fix(civi-crm-cms): add assignedTo FieldDef backed by Relationship entity
Adds a missing FieldDef for the `assignedTo` listColumn so that
`getFieldDef()` no longer throws when rendering or building select[] for
that column. The field is `readonly` with a dedicated `Relationship`
UpdateTarget, reflecting that coordinator assignment goes through
CiviCRM's Relationship entity rather than a direct Case/Contact PATCH.
* chore(civi-crm-cms): update architecture docs
Remove mention of repo pending node & pnpm upgrade.
* docs(civi-crm-cms): align ActivityLog Server/Client boundary description
The table incorrectly said ActivityLog had no client-side fetching, but
the stub and the dedicated GET /api/cases/[id]/activities?page= route
both indicate it fetches on page change. Corrected to reflect that
ActivityLog is a client-fetching component, with a note that the Server
Component shell can pre-fetch page 1 to avoid a first-render waterfall.
* docs(civi-crm-cms): fix globals.css snippet to use Tailwind v4 import syntax
The snippet used `@tailwind utilities;` which is a v3 directive. Updated
to match the actual app file and apps/web pattern: `@import 'tailwindcss'`
plus the `@source` directive for the shared UI package. Added a note
clarifying that the v3 directives must not be used.
* fix(civi-crm-cms): guard DEV_USER_EMAIL_MOCK against production
* fix(civi-crm-cms): strengthen views and client stubs
- Add skipSelect flag to FieldDef; mark assignedTo so select[] builders
have a typed signal to exclude it rather than relying on comments
- Add assertViewIntegrity() called from getActiveView() to catch
scorecardFieldKeys referencing unknown or non-scorecard field keys at startup
- Add constructor to CiviCRMClient wiring CIVICRM_BASE_URL / CIVICRM_API_KEY
- Remove spurious blank lines in update() params
- Document null as a valid CiviWhere value for IS NULL / IS NOT NULL operators
* docs(civi-crm-cms): sync architecture doc with code fixes
- Fix /case/[id] → /cases/[id] route path in §1
- Add Relationship to UpdateTarget union in §5.2
- Add skipSelect to FieldDef snippet in §5.2
- Update auth.ts snippet in §8 to show NODE_ENV guard with explanation
- Add null to CiviWhere type in §6.1 with IS NULL / IS NOT NULL note
* refactor(civi-crm-cms): rename circles_onboarding view to movement_view
Renames the view ID, variable, label, and caseTypeName throughout:
- src/lib/views.ts: const + registry key + ACTIVE_VIEW default
- .env.local.example: ACTIVE_VIEW default value
- docs/civi-crm-cms-architecture.md: §5.1, §5.3, §13 snippets
* refactor(civi-crm): rename civi-crm-cms app
Align app naming, paths, and docs with its role as a CiviCRM web layer.
|
||
|
|
94baf77713 | chore: pin node 24 and pnpm 11 | ||
|
|
d701a2d08e | feat: add timezone selection field and related utilities to Circles collection | ||
|
|
3d2698aa7a | feat: add operating guide for AI coding agents and update README structure |