3dtours 92776d2cfc A panel head keeps its label when it folds: the title is a span, not a bare
text node beside the caret

On iOS the LIGHT column's heads come back from a fold with no label — white
rows, the caret still drawn. The one structural difference between the two
things in that button is that the caret is an element (`span.dev-caret`) and
the title is a bare text node, which a flex container renders as an anonymous
item of its own; the anonymous item is what stops being painted when the
column re-lays-out inside the `.chips` scroller the heads live in. The title
is wrapped in `span.dev-panel-label` so the label is a real box, the same
shape as the caret beside it. No CSS, no rule of its own: the span is a flex
item where the text node was an anonymous one, so the reading is unchanged.

Verified: `npx tsc --noEmit` clean, `npm run build` clean
(`dist/assets/index-_Bzj6oMZ.js`, CSS unchanged at `index-CjhObVYI.css`).
Against the built page (393x852 @3x, touch) on `127.0.0.1:8090`, LIGHT tab,
tap PROFILE to open then collapse, with and without the `.chips` scroller at
its foot: the heads read `PROFILE▸ / WB▸ / TONE▸ / PRESENCE▸ / DETAIL &
EFFECTS▸`, each `c=rgb(20,24,29)` `fs=11px` `vis=visible clip=none` at 377x17,
no ancestor in the font-size chain at 0, and every chip beside them unchanged
(`c=rgb(20,24,29) bg=rgb(255,255,255) fs=12px`); `errors: []`. The iOS report
itself is not reproducible on this machine — WebKit 26.5 (MiniBrowser) and
Chromium are clean at 320-430px wide in both themes — so the wrap is the
shape of the fix the symptom points at, not a fault seen and closed here.

Co-authored-by: PenguinHarness <noreply@penguin.local>
2026-09-30 06:15:18 +07:00
…
…
…
…
…
…
…
…
…
…
…
…
…
…

RecipesCam

RecipesCam is a camera and photo-editing app built around recipes — reusable looks that carry a film simulation plus a full set of adjustments. You shoot or open a photo, dial in a look, and keep it as a recipe you can apply again, share as a .recipe file, or save to your account.

It ships twice from one repository: a React Native (Expo) app for iOS and Android, and a self-contained web build under docker/ that runs the same render pipeline in the browser.

What it does

  • Shoot with a recipe applied. Live viewfinder, GPS-tagged captures, and the recipe baked into the saved file.
  • Film simulations. Built-in looks — PROVIPES, VELVIPES, CLASSIC CHRIPES, CLASSIC NEGIPES, ASTIPES, ETERNIPES, ACRIPES, B&W HIGH CONTRAST and the LC STREETLIFE pair — each with its own grain and tone curve.
  • The full adjustment set. Exposure, contrast, highlights and shadows, saturation, colour temperature, clarity, grain, and an HSL mixer with a colour picker that samples straight off the photo.
  • Geometry. Crop to a fixed ratio or free-form, quarter turns, and a straighten ruler, plus printed frames (classic border, retro instant, wall frame portrait/landscape).
  • Finishing. Watermark and GPS stamp, EXIF carried through the export, JPEG written with a proper 300 DPI JFIF header.
  • On-device upscaling. A Real-ESRGAN pass runs locally when an export asks for more pixels than the source has — no server sees the photo.
  • Recipes. Save, favourite, export and import .recipe files; the web build keeps them in your account, the phone build also keeps them on device.

The two builds

Build Where Stack
iOS / Android repo root Expo + React Native, @shopify/react-native-skia for the render pipeline, NativeWind for styling
Web docker/ Vite + React, CanvasKit (canvaskit-wasm) for the same pipeline, Fastify + SQLite API for accounts and recipes

The render engine is shared by design: the web build compiles the app's own src/utils/* and type definitions unchanged, with @shopify/react-native-skia aliased to a CanvasKit shim (docker/frontend/src/engine/skiaShim.ts). A look looks the same on both because it is the same code.

Running the web build

cd docker
cp .env.example .env
docker compose up -d --build
# → http://localhost:8090

Photos never leave the browser: grading, framing, watermarking and JPEG encoding all run in the visitor's tab; the API only stores accounts and recipe JSON. See docker/README.md for the layout and the proxy setup.

Running the app

npm install
npx expo start          # Expo Go / dev client
npx expo run:android    # or run:ios for a native build

Repository layout

App.tsx, src/           the Expo app: screens, tool rail, viewfinder, shaders
docker/                 the web build (frontend + API + compose file)
  frontend/shared/      vendored copies of the app's types and utils
  frontend/src/engine/  CanvasKit shim, export engine, super-resolution
docs/                   privacy policy
THIRD_PARTY_NOTICES.md  licences of the bundled fonts, models and libraries

Licence

See LICENSE and THIRD_PARTY_NOTICES.md.

S
Description
No description provided
Readme 7 GiB
Languages
TypeScript 92.9%
Kotlin 5.7%
JavaScript 1.3%