Skip to content

feat/peptide calculator - #246

Merged
Snouzy merged 36 commits into
mainfrom
feat/peptide-calculator
Jul 30, 2026
Merged

Snouzy merged 36 commits into
mainfrom
feat/peptide-calculator

Conversation

@Snouzy

@Snouzy Snouzy commented Jul 30, 2026

Copy link
Copy Markdown
Owner
  • docs(tools): add peptide calculator spec, plan and syringe assets
  • feat(tools): add peptide dose calculation engine with vitest
  • feat(tools): add peptide vial size presets
  • feat(i18n): add peptide calculator ui strings for 6 locales
  • feat(tools): add peptide calculator option chips and syringe selector
  • feat(tools): add peptide syringe ruler and result card
  • fix(tools): keep syringe ruler cursor label inside its container at edge positions
  • feat(tools): add peptide calculator client with url state and reverse mode
  • refactor(tools): collapse duplicated calculator steps and unify client directives
  • feat(tools): add peptide calculator seo metadata for 6 locales
  • feat(tools): add peptide calculator seo content structure and english copy
  • fix(tools): render faq lead, make chart lead self-contained, normalise mL
  • feat(tools): add peptide calculator page with faq and howto schema
  • fix(tools): drop dead structuredData block and stop widening shared seo modules
  • feat(tools): link peptide calculator from hub and sibling calculators
  • feat(tools): add peptide calculator long-form content for pt
  • fix(tools): correct portuguese calques and the mcg/mg error magnitude in en and pt
  • feat(tools): add peptide calculator long-form content for fr
  • fix(tools): correct french agreement, calques and impersonal constructions
  • feat(tools): add peptide calculator long-form content for es
  • fix(tools): correct spanish unit definition, clause coordination and restore hedges
  • feat(tools): add peptide calculator long-form content for ru
  • fix(tools): correct russian collocations, homonym collisions and vial terminology
  • feat(tools): add peptide calculator long-form content for zh-CN and close the locale type
  • fix(tools): correct chinese collocations, garden paths and punctuation rules
  • feat(tools): localise the decimal separator in the peptide calculator widget
  • fix(tools): add sitemap entry, second disclaimer, localised table separators and attribution-safe url
  • feat(tools): add peptide vial diagram, visible syringe graduations and spring motion
  • fix(tools): connect vial leader lines to their parts and fade the cake callout with the cake
  • refactor(tools): simplify the vial to a labelled illustration and fix its proportions
  • refactor(tools): hold the vial cake static so only the liquid responds to water volume
  • refactor(tools): remove the peptide preset row and its dead data
  • feat(peptide-calculator): rebuild on a single mobile-first layout
  • feat(layout): dock the bottom navigation at every width

📝 Description

📋 Checklist

  • My code follows the project conventions
  • This PR includes breaking changes
  • I have updated documentation if necessary

🗃️ Prisma Migrations (if applicable)

  • I have created a migration
  • I have tested the migration locally

📸 Screenshots (if applicable)

🔗 Related Issues

Snouzy added 30 commits July 29, 2026 20:35
Snouzy added 4 commits July 30, 2026 14:30
Replaces the split desktop/mobile rendering with one layout served at every
width. The settings stack their question above their options, the syringes are
a snap rail, and the result is a docked sheet rather than an inline panel plus
a floating pill.

Every `sm:` override in the widget is gone, so there is one layout to design,
translate and reason about instead of two. ResultPanel and StickyResultBar are
no longer rendered.

Also fixes a horizontal page scroll on narrow viewports. The syringe rail is a
`<fieldset>`, and the UA default `min-inline-size: min-content` kept it 472px
wide inside a 372px parent, so `overflow-x-auto` never engaged and the document
scrolled sideways instead of the rail. `min-w-0` restores the intended
behaviour: 91px of page overflow at 390px becomes 0, with 100px of rail
scrolling inside its own box.
The nav was `relative` above 640px, so on desktop it sat at the end of the
document and only became visible after scrolling all the way down. It is now
fixed to the viewport at every width, as it already was on mobile, with the
content padded to clear it.

It is constrained to the app shell's width rather than stretched with
`left-0 right-0`, which would have spanned the whole desktop viewport, ad
columns included.

This is shared chrome: it changes the desktop layout of every page in the
(app) group, not just the calculators.
@vercel

vercel Bot commented Jul 30, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
workout-cool-opqe Ready Ready Preview Jul 30, 2026 11:57pm

Request Review

Snouzy added 2 commits July 31, 2026 02:54
The `ignores` array lived in a config object that also carried `files`, which in
flat config only excludes paths from that one object — it is not a project-wide
ignore. So ESLint linted its own config file (reporting `import/no-unresolved`
on `typescript-eslint`, which is installed), linted `public/sw.js` with the TS
parser that cannot find it in any tsconfig, and locally walked `.next` until it
never returned. CI never saw the last one because it lints before building.
The ignores now sit in an object of their own.

`react/no-unknown-property` gains an ignore list for `jsx` and `global`: they
are styled-jsx props on its <style> tags, not misspelt DOM attributes.

The two `eslint-disable @next/next/no-img-element` directives named a rule that
does not exist in this config — the plugin is registered as `next`. Renaming
them made ESLint report both as unused, since the rule is not enabled anywhere,
so they are removed. The <img> elements are real but nothing currently checks
them.
Mechanical only, produced by `eslint . --fix` once the config's ignore list was
made global: import order and group spacing, unused `React` imports removed
under the new JSX transform, and two SVG attributes moved from kebab-case to
camelCase.

No behavioural change. 176 files, and none of them under the peptide
calculator, which was already clean.

Takes the repo from 319 errors to 0. The 11 remaining warnings are pre-existing
unused variables and over-long lines in workout-builder; `pnpm lint` does not
fail on warnings.
@Snouzy
Snouzy merged commit b2d2853 into main Jul 30, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
Preview — 625f81de Deployed Jul 30, 2026 by vercel[bot]
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