Skip to content

feat(web): dForms rebrand of the admin; published forms keep their look - #208

Merged
josue-commits merged 8 commits into
developfrom
feat/dforms-reskin
Oct 2, 2026
Merged

josue-commits merged 8 commits into
developfrom
feat/dforms-reskin

Conversation

@josue-commits

Copy link
Copy Markdown
Contributor

What

The dForms rebrand of the admin, done screen by screen against the dForms design system and only with features the app really has. Forms that are already published keep the look they were designed on.

Screens restyled

  • Forms list: a table with each form's publish state (new hasDraft field on GET /v1/forms).
  • Editor: one top bar with Build, Logic, Design and Connect as tabs, compact question rows, flat settings panel, a larger Design preview.
  • Submissions: shared form header, sheet-style table with a Select mode, response panel as a flat list, and search in the responses (db filter, API ?search=, web page and the full-screen sheet).
  • Summary: contact questions now preview their latest answers like the other text cards, and the panel a card opens has the Delete button.
  • Analytics: figures in one band, Trends above the drop-off list, both in Signal Green.
  • Home: the shortcuts that repeated the rail are gone; the two that remain form a band under the list.
  • Account settings: Workspaces, Brand kit, Notifications, Public page and Preferences as rows instead of nested cards. The brand kit preview shows how a new form would look.
  • Email preview: an expand button opens a mock of an inbox, with the answers as the table the real HTML email carries.
  • First-run wizard wears the dForms colours.

Existing forms do not change

A form published before this stored no colours, and an absent colour keeps its old meaning (dark ground, Program Lime). So DEFAULT_ACCENT and DEFAULT_CANVAS keep their old values, an unbranded public form is still pinned dark, and public-form.css owns that dark palette instead of following the app's new tokens. The legacy-markup snapshots confirm it: the only differences in the rendered markup are the attribution text ("Made with dForms") and the full stop that used to follow a logo-less form's name.

New forms are born with the dForms look

withNewFormBranding (@quill/engine) writes white, ink and Signal Green into the config of a form created from nothing (dashboard and POST /v1/forms, and the onboarding wizard), filling only what the caller left out. Duplicating a form does not call it, so a copy keeps its original's look.

Other changes

  • The admin no longer loads or uses a monospaced face.
  • The product reads dForms in invitation emails, the webhook note, the onboarding logo, the page title and the HubSpot mirror form suffix. IS_DAPTA_BRAND accepts dForms and the old Dapta Forms, so a build is Dapta's own either way and shows dForms.
  • The Members and Invitations tables no longer make the page scroll sideways on a narrow screen (an sr-only cell sat outside its scroll container).
  • Icons come from a generated icons.css instead of primeicons.

Needs attention

  • Deploy repo (not touched here): NEXT_PUBLIC_PRODUCT_NAME and MAIL_FROM_NAME are set there. The code accepts both spellings of the name, so merging first is safe.
  • HubSpot: existing mirror forms are renamed to "(dForms)" in place (PATCH by guid, no duplicates) the next time each form's mirror syncs.
  • Summary delete: a server action with revalidatePath launched from the Summary page leaves the router transition hung. The cause is not found; the Summary deletes through a non-revalidating action and refreshes by hand. Verified 8 of 8 in Chromium and WebKit.
  • Docs: the response search is not yet documented in the docs repo.

Test plan

  • pnpm test: web 1160, api 683, db 343, engine 435, shared 68, notifications 57, destinations 120, types 59
  • pnpm typecheck, pnpm lint (no new warnings), bash scripts/dash-check.sh origin/develop
  • Playwright against the local build, light and dark, at 375, 820, 1280 and 1440: no overflow and no console errors on the restyled screens
  • A legacy form renders dark with its lime button; a new form is born white and green with the dForms preset selected; duplicating a legacy form keeps it unstyled
  • qa/ e2e suite (not run locally; the specs' data-testids and headings were kept)
  • Postgres parity job (not run locally; the search filter adds a LIKE over joined answer text)

DCO sign-off on every commit; changeset in .changeset/dforms-reskin.md.

🤖 Generated with Claude Code

josue-commits and others added 7 commits October 1, 2026 16:41
listForms now returns hasDraft, true while a form holds unpublished
changes. It is computed in SQL from draft_config IS NOT NULL, so the
list never reads the draft itself. GET /v1/forms documents the field.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
…ms brand

Tokens are rewritten around paper, ink and Signal Green, with purple
for score and amber for work that is not live yet. The icon font is
replaced by a generated icons.css built from lucide-static.

The forms list becomes one table with a publish state chip and the
submissions and completion figures as links. The editor gets a single
top bar with Build, Logic, Design and Connect as tabs, compact question
rows, a flat settings panel, a narrow Design panel beside a larger
preview, and Connect in two columns. No control was removed.

QR codes carry the dForms mark in their centre on the Dapta brand, and
the fallback wordmark on a public form no longer appends a period.

Known red: 13 tests in legacy-markup.spec.tsx and og-card.spec.ts still
pin the dark default canvas, pending the decision on that default.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
SubmissionFilter takes search, a case-insensitive substring matched against
the form's text, contact and URL answers. The API reads it as ?search= on the
submissions, export and summary routes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
…e search

One header for a form's screens, a sheet-like submissions table with a Select
mode, a search box on the page and in the full-screen sheet, Summary cards
that preview contact answers and whose panel can delete, and Analytics with
Trends above the drop-off list in Signal Green. The attribution badge reads
Made with dForms.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
withNewFormBranding writes a white ground, ink text and Signal Green into the
config of a form made from nothing, filling only what the caller left out.
POST /v1/forms (after the brand kit) and the onboarding wizard call it;
duplicating a form does not, so a copy keeps its original's look.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
An absent colour keeps its old meaning (dark ground, Program Lime), so forms
published before the rebrand render unchanged: the default accent and canvas
return to their old values, an unbranded public form is pinned dark again, and
public-form.css owns the dark palette instead of following the app's tokens.
The form's name no longer gets a trailing full stop, for every form.

Remove font-mono and the JetBrains Mono face. Say dForms in invitation emails,
the webhook note, the onboarding logo and the HubSpot mirror suffix; a build is
Dapta's own when NEXT_PUBLIC_PRODUCT_NAME is dForms or the old Dapta Forms.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
…n inbox

Home: drop the two shortcuts that repeat the rail and set the two that lead
somewhere new as a band under the list.

Account settings: a two-line statement header, settings as rows instead of
nested cards, a workspace page with its tile, id and flat tables, a brand kit
whose preview shows how a new form would look, notifications with the email
preview beside the fields. The member and invitation tables no longer make the
page scroll sideways on a narrow screen.

The email preview gets an expand button that opens a mock of an inbox with the
message drawn as the HTML email draws it, answers table included.

The first-run wizard wears the dForms colours inline, since a public form now
owns the dark palette it had before the rebrand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
- Applying a brand kit that sets only a background (or only a foreground)
  now drops the form's stored other half, so the renderer derives readable
  text instead of keeping the dForms ink against a dark kit ground. Matches
  the brand kit preview.
- Forms on a light ground get the light-palette error and hint colours
  (#c2261c, #586470), which clear 4.5:1 on white; the legacy dark values
  stay for dark and unbranded forms.
- Deleting a response from the Summary panel shows an error toast when the
  delete fails instead of silently re-enabling the button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
@josue-commits
josue-commits merged commit 5383e25 into develop Oct 2, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant