darkroom-monochrome

byrawezh

================================================================================ AURA STUDIO — MONOCHROME DARKROOM (تاریکخانەی مۆنۆکرۆم) کۆی گشتی تایبەتمەندییەکان ================================================================================ ١. ڕووکاری سەرەکی و کانڤاسی کارلێککار (Hero Canvas & Workspace) -------------------------------------------------------------------------------- • دابەشکردنی شاشەی مۆبایل بە ڕێژەی ٤٥٪ بۆ وێنەکە بە جێگیری، بەبێ ونبوون یان داپۆشرانی لە کاتی کردنەوەی هەر بەشێکدا. • گۆڕینی دۆخی نیشاندان لە نێوان "دۆخی کارکردن (٤٥٪ وێنە + ٥٥٪ کۆنترۆڵ)" و "دۆخی تەواوی وێنە (Fullscreen Photo)". • مۆتۆڕی پێشکەوتووی کاتی ڕاستەقینەی خێراکراو لە ڕێگەی Canvas 2D / Pixel Processing. • پشتگیری تەواوی تاچ (Touch Gestures): پەنجەنان بە دوو پەنجە بۆ زووم (Pinch-to-Zoom) و ڕاکێشانی وێنە بە یەک پەنجە (Pan). • کلیلەکانی زوومی خێرا و گەڕاندنەوە بۆ پێوانەی بنەڕەتی ([-], [+], [Fit]). • نیشاندەری زیرەکی زۆنەکان (Zone System HUD): پیشاندانی زۆنی هەر خاڵێک (Z0 تا Z10) لەگەڵ ژمارەی ڕووناکی (Luminance 0-255). • دۆخی ڕەنگاوڕەنگی زۆنەکان (Zone Heatmap): ڕەنگکردنی ڕووبەرەکانی وێنە بەپێی پلەی ڕووناکی. • ئاگادارکردنەوەی سووتانی ڕووناکی و سێبەر (Zebra Clipping Overlay). • بەراوردکاری خێرا (Before / After Compare): بینینی وێنەی ئەسڵی پێش دەستکاری بە داگرتنی دوگمەی بەراورد. • مێژووی دەستکاری (Undo / Redo History Stack) بۆ گەڕانەوە بۆ هەنگاوەکانی پێشوو. ٢. پەڕەی پێشوەختەکان (TAB 1: PRESETS) -------------------------------------------------------------------------------- • پێشوەختە ئەسڵییەکان (Factory Presets): - Original (ئەسڵی بێ دەستکاری) - Fine Art (هونەری ناسک بە کۆنتراستی نەرم) - Tri-X 400 (کۆنتراستی کلاسیکی فیلمی بەناوبانگی کۆداک) - HP5 Plus (تۆنی دەوڵەمەندی ئیلفۆرد بۆ سێبەرەکان) - Noir (ڕەش و سپیی سینەمایی تاریک و کۆنتراستی بەرز) - Editorial (مۆدێرن و ڕوون بۆ گۆڤار و پۆرترێت) - High Key (ڕووناک و کراوە بە پاشبنەمای سپی) - Low Key (تاریک و دراماتیک بە تیشکی کەم) - Vintage (کۆنکراو بە کاغەزی زەردباو و گەرم) • ئاڕاستە دیدارییەکان (Visual Intents): - Documentary (دۆکیۆمێنتاری) - Classic Portrait (پۆرترێتی کلاسیک) - High-Key / Low-Key (ڕووناکی بەرز و نزم) - Silver Gelatin (سیلڤەر جێلاتینی ئەنالۆگ) • شێوازی ماستەرەکانی فۆتۆگرافی (Master Recipes): - Ansel Adams (ئانسڵ ئادەمز — شاکاری زۆن سیستم) - Sebastião Salgado (سێباستیان سەلگادۆ — ڕەشی مەخمەڵی و کۆنتراستی قووڵ) - Peter Lindbergh (پیتەر لیندبێرگ — پۆرترێتی سینەمایی و ڕووناکی بڵاو) - Henri Cartier-Bresson (کارتێ برێسۆن — چرکەساتی یەکلاکەرەوە و دۆکیۆمێنتاری) - Vivian Maier (ڤیڤیان مایەر — گەرمیی وێنەی سەر شەقام) • پێشوەختە تایبەتەکانی بەکارهێنەر (Custom User Presets): - پاشەکەوتکردنی هەموو ڕێکخستنەکان بە ناوی دڵخواز لە ناوخۆی وێبگەڕدا (LocalStorage). - دووبارە جێبەجێکردنەوە یان سڕینەوەی پێشوەختەکان بە یەک کلیک. ٣. پەڕەی ڕێکخستنە سەرەکییەکان (TAB 2: ADJUST) -------------------------------------------------------------------------------- • ڕووناکی و کۆنتراست: - Exposure (بڕی بەرکەوتنی ڕووناکی) - Brightness (ڕووناککردنەوەی گشتی) - Contrast (کۆنتراست و جیاوازی نێوان ڕووناکی و تاریکی) - Micro-Contrast (کۆنتراستی وردی تێکستوور) - Clarity (ڕوونی و شەفافییەت) • کۆنترۆڵی تۆنەکان بە جیا (Tonal Separation): - Shadows (ڕووناککردنەوە یان تاریککردنی سێبەرەکان) - Deep Shadows (سێبەرە زۆر قووڵەکان) - Highlights (ڕاگرتنی ڕووناکییە بەرزەکان) - Air Lights (تیشکە هەوایی و زۆر سپییەکان) - Blacks (پلەی ڕەشی بنەڕەتی) - Whites (پلەی سپی بنەڕەتی) - Dynamic Range & Tone Rolloff (هاوسەنگی بازنەی دینامیکی) ٤. پەڕەی چەماوەی تۆنەکان و زۆن سیستم (TAB 3: CURVES & ZONES) -------------------------------------------------------------------------------- • چەماوەی تۆنی کارلێککار (Interactive Spline Tone Curve): - دەستکاریکردنی تۆنەکان لە ڕێگەی ٥ خاڵی ڕاکێشان: Blacks, Shadows, Midtones, Highlights, Whites. - دوگمەی گەڕاندنەوەی چەماوە بۆ باری سەرەتایی (Linear Reset). • سیستم پشکنەری زۆنەکان (Ansel Adams 11-Zone System): - بەشکردنی وێنە بۆ ١١ زۆن: * Zone 0: ڕەشی تەواو (Pure Black) * Zone I: نزیک لە ڕەشی بێ تێکستوور (Near Black) * Zone II: دەستپێکی تێکستووری سێبەر (First Textured Shadow) * Zone III: سێبەری دەوڵەمەند (Full Textured Shadow) * Zone IV: تۆنی مامناوەندی تاریک (Dark Neutral Skin) * Zone V: خاکستری ١٨٪ (18% Middle Gray) * Zone VI: تۆنی پێستی ڕووناک (Light Skin / Concrete) * Zone VII: ڕووناکیی ڕوون بە تێکستوور (Textured Highlight) * Zone VIII: ڕووناکیی تەنک (Delicate Highlight) * Zone IX: سپی نزیک لە سووتاو (Near White) * Zone X: سپیی پەتی و پەڕاوێز (Pure White / Paper Base) - دەستکاریکردنی بەهای هەر زۆنێک بە جیا بە دوگمەکانی [-] و [+]. ٥. پەڕەی فلتەری ڕەنگ و تۆنکردن (TAB 4: COLOR & FILTER) -------------------------------------------------------------------------------- • فلتەرە کلاسیکییەکانی هاوێنە (Lens Color Filters): - None, Yellow (زەرد بۆ ئاسمانی سروشتی), Orange (پرتەقاڵی بۆ کۆنتراستی بەهێز), Red (سوور بۆ ئاسمانی تاریک و هەوری تۆخ), Green (سەوز بۆ ڕووەک و پێست), Blue (شین). • تێکەڵکەری کەناڵەکانی ڕەنگ (RGB Channel Mixer): - کۆنترۆڵکردنی بڕی سوور (Red Channel)، سەوز (Green Channel)، و شین (Blue Channel) لە دروستکردنی هاوکێشەی ڕەش و سپی. • تۆنکردنی تاریکخانە (Darkroom Chemical Toning): - None (ڕەش و سپیی بێگەرد) - Sepia (سێپیای کلاسیکی قاوەیی) - Selenium (سلینۆمی کۆنتراست بەرز) - Cyanotype (شینی سیانۆتایپی مێژوویی) - Platinum (پلاتینیۆمی دەوڵەمەند) - Titanium (تایتانیۆمی کانزایی) - کۆنترۆڵی چڕیی تۆنکردن (Toning Intensity 0% - 100%). ٦. پەڕەی ماددەی فیلم و تاریکخانە (TAB 5: DARKROOM & FILM) -------------------------------------------------------------------------------- • جۆرەکانی فیلمی ڕەش و سپی (Film Stocks): - Kodak Tri-X 400 - Ilford HP5 Plus - Kodak T-Max 100 - Fuji Neopan 100 - Agfa APX 400 - Rollei Retro 80S • جۆری کاغەزی تاریکخانە (Darkroom Paper Base): - Matte Cotton Rag (پەتۆیی بێ بریقە) - Glossy Baryta (باریتای بریقەدار) - Silver Gelatin (سیلڤەر جێلاتینی ئەنالۆگ) - Vintage Fiber (فیبەری کۆنی مۆزەخانەیی) • کیمیای دەرکەوتن (Film Developer Simulation): - D-76, Rodinal, Xtol, HC-110 - پلەی گەرمیی دەرکەوتن (Development Temp °C) - کاتی دەرکەوتن (Development Time) ٧. پەڕەی وردەکاری و دەنکۆڵەی فیلم (TAB 6: DETAIL & TEXTURE) -------------------------------------------------------------------------------- • دەنکۆڵەی ئەنالۆگ (Silver Halide Grain): - بڕی دەنکۆڵە (Grain Amount) - زبری و قەبارە (Grain Roughness & Grain Size) - پیشاندەری ڕاستەوخۆ (Live Grain Visualizer Canvas). • تیژکردنەوە (Sharpening): - هێزی تیژی (Sharpness Amount) - نیوەتیرەی تیژکردن (Radius). • درەوشانەوەی فیلم و نەرمکردن (Halation & Glow): - Halation (بڵاوبوونەوەی سوورباو/سپی لە دەوری ڕووناکییە تیژەکان) - Diffusion / Orton Effect (نەرمکردنی سینەمایی پۆرترێت). • سێبەری دەوری وێنە (Vignette): - چڕیی ڤینێت (Vignette Amount) - خڕیی بازنە (Roundness) - نەرمیی پەڕەکان (Feather). ٨. پەڕەی چوارچێوە و لێواری فیلم (TAB 7: CANVAS & BORDERS) -------------------------------------------------------------------------------- • لێوارە کلاسیکییەکانی فیلم (Film Borders): - None (بێ لێوار) - Thin (لێواری ڕەشی باریک) - Rebate (لێواری ڕەسەنی کەناری فیلم) - Sprocket (کونی فیلمی ٣٥ ملم) - Kodak 400 (نووسین و کۆدی کۆداک لەسەر لێوار) - Ilford HP5 (کۆدی فیلمی ئیلفۆرد) - Light Leak (دزەکردنی تیشکی ڕووناکی بۆ ناو فیلم). • چوارچێوەی پێشانگایی (Matte / Passe-Partout): - هەڵبژاردنی ڕەنگی کارتۆن (ڕەش، سپی، کرێمی، خاکستری) - کۆنترۆڵی ئەستووری چوارچێوە (Mat Size). ٩. پەڕەی بڕین و ئاڕاستەکردن (TAB 8: CROP & GEOMETRY) -------------------------------------------------------------------------------- • بڕین بەپێی ڕێژەی ستاندارد (Aspect Ratio Presets): - Original (ئەسڵی) - 1:1 (چوارگۆشەی ئینستاگرام و هاسڵبلاد) - 4:5 (پۆرترێتی ستاندارد) - 16:9 (سینەمایی پانۆراما) - 3:2 (فۆرماتی کلاسیکی کامێرای ٣٥ ملم) - 2:3 و 9:16 (ستۆری و ڤێرتیکاڵ). • خولاندنەوە (Rotate): سوڕاندنەوە بە ٩٠ پلە بە ئاڕاستەی میلی کاتژمێر. • هەڵگەڕاندنەوە (Flip): هەڵگەڕاندنەوەی ئاسۆیی (Horizontal) و ستوونی (Vertical). ١٠. پەنجەرە و بەشە یارمەتیدەرەکان (MODALS & SYSTEM UTILITIES) -------------------------------------------------------------------------------- • پەنجەرەی پشکنینی پڕۆفیشناڵ (Diagnostics Hub): - تێکڕای ڕووناکی وێنە (Average Luminance). - بازنەی دینامیکی دۆزراوە (Dynamic Range). - ڕێژەی سووتانی سێبەر (Shadow Clip %). - ڕێژەی سووتانی ڕووناکی (Highlight Clip %). - هێڵکاری ستوونی تۆنەکان (Zone Histogram). • پەنجەرەی هەناردەکردن (Export Hub): - هەڵبژاردنی جۆری پەڕگە: JPEG, PNG, WEBP. - هەڵبژاردنی کوالیتی (Quality: 10% تا 100%). - هەڵبژاردنی قەبارەی هەناردە (Scale): 1x (قەبارەی ئەسڵی)، 2x (Ultra-HD بۆ چاپ). - ناونانی فایلی داگیراو بەپێی بەروار و کات. • زمانی سیستەم (Dual Language Support): - پشتگیری تەواوی زمانی کوردی (سۆرانی بە ئاڕاستەی ڕاست بۆ چەپ RTL). - زمانی ئینگلیزی (English بە ئاڕاستەی LTR). - گۆڕینی زمان بە یەک کلیک لە سەرەوەی ئەپەکە. • خێرایی و پاراستنی زانیاری: - هەموو پرۆسێسکردنێک لە ناوخۆی وێبگەڕی بەکارهێنەر ئەنجام دەدرێت (Client-Side). - هیچ وێنەیەک بار ناکرێتە سەر هیچ سێرڤەرێک و ئەپەکە بە تەواوی ئۆفلاین کار دەکات. ================================================================================

No preview

Comments (0)

No comments yet. Be the first!

System Requirements

Page 1 of 22

System Requirements Document for darkroom-monochrome

1. Introduction

Aura Studio — Monochrome Darkroom (تاریکخانەی مۆنۆکرۆم) is a client-side, offline-capable black-and-white photo editing web application. It is built as a precision instrument for light: a darkroom console that treats every slider as a calibrated control and every readout as an instrument face. The product serves photographers who think in stops, zones, and film stocks — Ansel Adams devotees, darkroom romantics, Kurdish/Sorani-speaking enthusiasts, and working professionals editing on phones.

The product intent is to give a single active user a complete monochrome darkroom in the browser: load a photograph, judge it against an 11-zone luminance system, shape it through presets, tonal adjustments, curves, color filters, chemical toning, film and developer simulation, grain and texture, borders and framing, and crop and geometry, then export a finished file — all without any image ever leaving the device.

The audience is the working monochrome photographer and darkroom editor, the custom preset author who builds a reusable personal look library, and the print/output preparer who cares about paper base, borders, matting, crop ratio, and print-resolution export.

Page 2 of 22

2. System Overview

Aura Studio is a browser-delivered application. All image processing runs client-side through Canvas 2D / pixel processing. No image is uploaded to any server, and the application works fully offline. Custom user presets persist in browser LocalStorage.

The interface is a two-pane instrument console. On mobile the viewport splits 45/55: a fixed, non-scrolling viewfinder pane at the top holds the canvas, the Zone System HUD, and the zoom cluster; the lower 55% is a scrolling control deck whose tab rail is pinned directly under the photo. The photograph is never lost or covered when any section is opened — every modal, sheet, and settings panel opens as an in-deck panel inside the lower 55%. On wider viewports the same proportions rotate to photo-left / deck-right, and at desktop width the console widens to a three-column instrument bench with a live Diagnostics rail.

The application supports two languages: Kurdish (Sorani, right-to-left) and English (left-to-right), switchable with one click at the top of the app. In RTL the entire grid mirrors — the viewfinder stays on top, the tab rail and value columns flip to the right edge, and numeric readouts keep LTR digit order inside an RTL row.

Page 3 of 22

2a. Product Interpretation and Delivery Boundary

Delivery ownership. Aura Studio is a first-party, browser-delivered application with custom UI. There is no server-side processing, no account system, and no provider-owned editing surface. Every editing capability is owned by the application's own pages. The only external capabilities the product depends on are browser-native: local file access to load a photograph, LocalStorage for custom preset persistence, Canvas 2D for pixel processing, and browser download for exported files. These are runtime prerequisites, not product surfaces.

Access ownership. All pages are openly reachable; the source establishes no sign-in, account, or permission boundary. The Landing page is an anonymous first impression that introduces Aura Studio and its offline monochrome editing workspace. Editing destinations require only that a photograph be available locally in the browser — a runtime prerequisite, not an identity gate. No differentiated permissions, roles, or visibility controls exist over shared product state.

Current vs. future boundary. Everything specified in this document is current. No future-horizon features are defined by the source.

Exclusions. The product does not upload images to any server. It does not require or provide user accounts. It does not perform cloud sync or multi-device state. It does not offer color (non-monochrome) editing as a product outcome — color inputs are consumed only to produce black-and-white results through filters, channel mixing, and toning.

2c. Page Content and Component Coverage

Page 4 of 22

Landing

  • Information / state: Anonymous first impression of Aura Studio — the product name, the "Monochrome Darkroom" descriptor, and a statement of the offline, client-side, no-upload promise. No photograph is loaded yet.
  • Primary action: Enter the editing workspace (proceed to the console).
  • Supporting actions: One-click language switch between Kurdish (Sorani, RTL) and English (LTR).
  • Domain entities: Application identity, language preference.
  • Component responsibilities: Engraved wordmark plate (Saira Condensed 500, clamp(48px, 11vw, 128px), left-aligned, not centred); "MONOCHROME DARKROOM" micro-label in 11px Barlow uppercase +0.16em tracking; a topographically-ruled placeholder plate with a centred "Load a negative" affordance (no stock photography of people, no illustration, no 3D blobs); language switch control at the top.
  • States: Loading — wordmark and placeholder plate render immediately; no network fetch is required. Empty — the ruled placeholder plate with the "Load a negative" affordance. Success — the user proceeds into the console. Error — if the browser cannot provide local file access or Canvas 2D, a plain in-page notice states that the workspace cannot run in this browser. Recovery — the notice offers a retry of the capability check; the language switch remains usable.

TAB 1: PRESETS

  • Information / state: The current look applied to the loaded photograph; the active preset name; the list of factory presets, visual intents, master recipes, and the user's own saved presets.
  • Primary action: Apply a preset, visual intent, or master recipe to the photograph.
  • Supporting actions: Save the current full set of adjustments as a custom preset under a chosen name (LocalStorage); re-apply a custom preset with one click; delete a custom preset with one click.
  • Domain entities: Factory preset, visual intent, master recipe, custom user preset (name + full adjustment set), active preset.
  • Component responsibilities: Ruled preset rows with hairline separators; factory preset list — Original (unedited), Fine Art (delicate art with soft contrast), Tri-X 400 (classic contrast of the famous Kodak film), HP5 Plus (Ilford's rich tonal shadows), Noir (dark cinematic black-and-white with high contrast), Editorial (modern and clean for magazines and portraits), High Key (bright and open with a white background), Low Key (dark and dramatic with low light), Vintage (aged with a yellowed, warm paper); visual intents — Documentary, Classic Portrait, High-Key / Low-Key, Silver Gelatin; master recipes — Ansel Adams (master of the Zone System), Sebastião Salgado (velvety blacks and deep contrast), Peter Lindbergh (cinematic portrait and diffused light), Henri Cartier-Bresson (the decisive moment and documentary), Vivian Maier (the warmth of street photography); custom preset section with name entry, one-click re-apply, and one-click delete.
  • States: Loading — preset rows render from local definitions; custom presets read from LocalStorage. Empty — no custom presets saved yet; the custom section shows an empty ruled row with a save affordance. Success — the selected preset applies and the canvas updates; the active preset is marked by a 2px amber underline. Error — LocalStorage unavailable or full: a plain in-page notice states that custom presets cannot be saved in this browser; factory presets remain fully usable. Recovery — the user may retry the save after freeing storage; the current adjustment set remains intact in the session.

TAB 2: ADJUST

  • Information / state: Current values of every adjustment control, each with an engraved label above it and a live tabular value to its right.
  • Primary action: Adjust a control and see the canvas update on the next animation frame.
  • Supporting actions: Return a control to its zero detent (marked by a 1px amber hairline).
  • Domain entities: Light and contrast controls, tonal separation controls.
  • Component responsibilities: Light and contrast group — Exposure (amount of light exposure), Brightness (overall lightening), Contrast (difference between light and dark), Micro-Contrast (fine texture contrast), Clarity (crispness and transparency); tonal separation group — Shadows (lighten or darken the shadows), Deep Shadows (the very deep shadows), Highlights (hold back the bright highlights), Air Lights (the airy, very white lights), Blacks (the base black level), Whites (the base white level), Dynamic Range & Tone Rolloff (dynamic-range balance). Sliders are 2px rails with a square 14px thumb and a 1px amber zero-detent mark.
  • States: Loading — controls render at their current values. Empty — no photograph loaded: controls are present but inert, with a prompt to load a negative. Success — the canvas tracks the thumb exactly with a 0ms lerp. Error — a control value outside its valid range is clamped to the nearest valid value and the readout shows the clamped value. Recovery — the user may reset the control to its zero detent.
Page 5 of 22

TAB 3: CURVES & ZONES

  • Information / state: The current tone curve shape and the current value of each of the 11 zones.
  • Primary action: Drag one of the five curve points (Blacks, Shadows, Midtones, Highlights, Whites) to reshape the tone curve.
  • Supporting actions: Reset the curve to its linear initial state; adjust any individual zone value with its [-] and [+] buttons.
  • Domain entities: Tone curve with five draggable points; the Ansel Adams 11-zone system.
  • Component responsibilities: Interactive spline tone curve drawn as a 1px ruled graph on a 4×4 minor grid with five square draggable handles labelled Blacks, Shadows, Midtones, Highlights, Whites; Linear Reset button; the 11-zone ruled luminance scale as both control and legend — a horizontal strip of 11 coded swatches from #000000 to #FFFFFF with printed zone numerals and names, each with [-] and [+] machined buttons: Zone 0 Pure Black, Zone I Near Black (near black without texture), Zone II First Textured Shadow, Zone III Full Textured Shadow (rich shadow), Zone IV Dark Neutral Skin (dark midtone), Zone V 18% Middle Gray, Zone VI Light Skin / Concrete (light skin tone), Zone VII Textured Highlight (clear highlight with texture), Zone VIII Delicate Highlight (thin highlight), Zone IX Near White (white near blown), Zone X Pure White / Paper Base. The same strip doubles as the Zone Heatmap legend.
  • States: Loading — the curve renders in its current shape; the zone strip renders its coded ramp. Empty — no photograph loaded: the curve and zone strip are present but inert. Success — the curve reshapes and the canvas updates; the zone-dial needle sweeps 240ms cubic-bezier(0.2, 0.8, 0.2, 1) when a zone is selected. Error — a drag that would produce a non-monotonic curve is constrained to the nearest valid shape and the handles snap to it. Recovery — Linear Reset restores the initial curve; each zone's [-] and [+] return it toward its default.

TAB 4: COLOR & FILTER

  • Information / state: The active lens filter, the current RGB channel mix amounts, the active chemical toning, and the toning intensity.
  • Primary action: Select a lens color filter, set channel mix amounts, or select a chemical toning.
  • Supporting actions: Set toning intensity from 0% to 100%.
  • Domain entities: Lens color filter, RGB channel mixer, darkroom chemical toning.
  • Component responsibilities: Lens color filters — None, Yellow (yellow for natural sky), Orange (orange for strong contrast), Red (red for dark sky and heavy cloud), Green (green for foliage and skin), Blue (blue); RGB channel mixer — control of the Red Channel, Green Channel, and Blue Channel amounts in building the black-and-white equation; darkroom chemical toning — None (pure black-and-white), Sepia (classic brown sepia), Selenium (high-contrast selenium), Cyanotype (historic cyanotype blue), Platinum (rich platinum), Titanium (metallic titanium); Toning Intensity control 0%–100%.
  • States: Loading — the current filter, mix, and toning render as selected. Empty — no photograph loaded: controls are present but inert. Success — the canvas updates to reflect the filter, mix, and toning. Error — a channel mix that would produce an out-of-range equation is clamped and the readout shows the clamped value. Recovery — selecting None for filter and toning, and returning channel amounts to their defaults, restores the neutral conversion.

TAB 5: DARKROOM & FILM

  • Information / state: The active film stock, paper base, developer, development temperature, and development time.
  • Primary action: Select a film stock, a darkroom paper base, or a film developer.
  • Supporting actions: Set the development temperature (°C) and the development time.
  • Domain entities: Film stock, darkroom paper base, film developer, development temperature, development time.
  • Component responsibilities: Film stocks — Kodak Tri-X 400, Ilford HP5 Plus, Kodak T-Max 100, Fuji Neopan 100, Agfa APX 400, Rollei Retro 80S; darkroom paper bases — Matte Cotton Rag (matte, no sheen), Glossy Baryta (glossy baryta), Silver Gelatin (analog silver gelatin), Vintage Fiber (museum-grade vintage fiber); film developer simulation — D-76, Rodinal, Xtol, HC-110, with Development Temp °C and Development Time. Each film stock, paper base, and developer is a ruled data row with a swatch, its engraved name in condensed caps, and tabular temperature/time values — the tab reads like the back of a watch case.
  • States: Loading — the current selections render as active. Empty — no photograph loaded: the plates are present but inert. Success — the canvas updates to reflect the selected stock, paper, developer, temperature, and time. Error — a temperature or time outside the valid range is clamped and the tabular readout shows the clamped value. Recovery — the user may return temperature and time to their defaults.
Page 6 of 22

TAB 6: DETAIL & TEXTURE

  • Information / state: Current grain, sharpening, halation/glow, and vignette values, plus the live grain visualizer.
  • Primary action: Adjust grain, sharpening, halation/diffusion, or vignette.
  • Supporting actions: Observe the live grain visualizer canvas.
  • Domain entities: Silver halide grain, sharpening, halation, diffusion/Orton effect, vignette.
  • Component responsibilities: Silver halide grain — Grain Amount, Grain Roughness, Grain Size, with a Live Grain Visualizer Canvas; sharpening — Sharpness Amount, Radius; halation and glow — Halation (reddish/white spread around sharp highlights), Diffusion / Orton Effect (cinematic portrait softening); vignette — Vignette Amount, Roundness, Feather. The vignette/roundness control is a true circle with a 1px champagne bezel ring and tick marks at the 12 positions.
  • States: Loading — controls render at their current values; the live grain visualizer draws. Empty — no photograph loaded: controls are present but inert and the visualizer shows the ruled placeholder plate. Success — the canvas and the live grain visualizer update as the user drags. Error — a radius or amount outside the valid range is clamped and the readout shows the clamped value. Recovery — the user may return each control to its zero detent.

TAB 7: CANVAS & BORDERS

  • Information / state: The active film border, the mat board color, and the mat size.
  • Primary action: Select a film border or a mat board color.
  • Supporting actions: Set the mat size.
  • Domain entities: Film border, matte/passe-partout, mat board color, mat size.
  • Component responsibilities: Film borders — None (no border), Thin (thin black border), Rebate (the film's original edge rebate), Sprocket (35mm film sprocket holes), Kodak 400 (Kodak writing and code on the border), Ilford HP5 (Ilford film code), Light Leak (light leaking into the film); matte/passe-partout — mat board color selection (black, white, cream, gray) and Mat Size control.
  • States: Loading — the current border and mat settings render as active. Empty — no photograph loaded: the controls are present but inert. Success — the canvas updates to show the border and mat framing. Error — a mat size outside the valid range is clamped and the readout shows the clamped value. Recovery — selecting None for the border and returning mat size to its default restores the unframed image.

TAB 8: CROP & GEOMETRY

  • Information / state: The active aspect ratio, the current rotation, and the current flip state.
  • Primary action: Select an aspect ratio preset, rotate, or flip.
  • Supporting actions: Return to the original aspect ratio.
  • Domain entities: Aspect ratio preset, rotation, flip.
  • Component responsibilities: Aspect ratio presets — Original, 1:1 (Instagram and Hasselblad square), 4:5 (standard portrait), 16:9 (cinematic panorama), 3:2 (classic 35mm camera format), 2:3 and 9:16 (story and vertical); Rotate — 90-degree clockwise rotation; Flip — horizontal and vertical flip.
  • States: Loading — the current ratio, rotation, and flip render as active. Empty — no photograph loaded: the controls are present but inert. Success — the canvas updates to the cropped, rotated, or flipped image. Error — a crop that would produce a zero-area region is rejected and the previous crop is retained. Recovery — selecting Original and returning rotation and flip to their defaults restores the uncropped, unrotated image.
Page 7 of 22

Diagnostics Hub

  • Information / state: Live measurements of the current image — Average Luminance, detected Dynamic Range, Shadow Clip %, Highlight Clip %, and the Zone Histogram.
  • Primary action: Open the Diagnostics Hub as an in-deck panel inside the lower 55% (never a full-height overlay covering the viewfinder).
  • Supporting actions: Read the histogram's Zone V reference line; close the panel.
  • Domain entities: Average luminance, dynamic range, shadow clip percentage, highlight clip percentage, zone histogram.
  • Component responsibilities: Ruled data rows with hairline separators for each metric; the histogram drawn as a bar field with the Zone V reference line; histogram bars settle with a 220ms ease-out. On desktop 1280px these metrics live in the always-visible Diagnostics rail (22% right) instead of a modal.
  • States: Loading — metrics compute from the current canvas. Empty — no photograph loaded: the panel shows the ruled placeholder with no values. Success — metrics and histogram display and update as the image changes. Error — if the canvas cannot be sampled, the panel states that diagnostics are unavailable and the rest of the app remains usable. Recovery — the panel recomputes on the next canvas change.

Export Hub

  • Information / state: The selected file type, quality, export scale, and the resulting file name.
  • Primary action: Export the finished image.
  • Supporting actions: Choose file type (JPEG, PNG, WEBP); choose quality (10% to 100%); choose export scale (1x original size, 2x Ultra-HD for print); observe the date-and-time-based file name.
  • Domain entities: Export file type, export quality, export scale, generated file name.
  • Component responsibilities: Ruled option rows for file type, quality, and scale; a tabular readout of the generated file name based on date and time; the export action marked by the champagne-amber primary accent. Opens as an in-deck panel inside the lower 55%.
  • States: Loading — options render with their defaults. Empty — no photograph loaded: the export action is disabled with a prompt to load a negative. Success — the browser downloads the file with the date-and-time name. Error — if the browser blocks the download or the canvas cannot be encoded, a plain in-page notice states the failure and the settings remain intact. Recovery — the user may change format, quality, or scale and retry the export.
Page 8 of 22

3. Functional Requirements

FR-1 — Fixed 45% photo pane. As a Black-and-White Photographer / Darkroom Editor, I should see the photograph fixed at 45% of the mobile screen without it being lost or covered when any section is opened, so that I always judge edits against the image. (explicit)

  • Trigger/input: the workspace is open at mobile width.
  • Observable result: the photo pane occupies 45% of the viewport and remains visible while any tab, panel, or modal is opened.
  • Access state: no identity required.
  • Failure/recovery: if the viewport is too small to honor the split, the photo pane retains its 45% share and the deck scrolls.
  • Continuation: the user continues editing in the lower 55% deck.

FR-2 — Display mode toggle. As a Black-and-White Photographer / Darkroom Editor, I should toggle between working mode (45% photo + 55% controls) and fullscreen photo mode, so that I can inspect the image at full size and return to editing. (explicit)

  • Trigger/input: the user activates the display-mode toggle.
  • Observable result: the layout switches between the 45/55 working split and a fullscreen photo view.
  • Access state: no identity required.
  • Failure/recovery: toggling back always restores the 45/55 working split with the previously active tab.
  • Continuation: the user resumes editing in working mode.

FR-3 — Accelerated real-time processing engine. As a Black-and-White Photographer / Darkroom Editor, I should have an accelerated real-time processing engine via Canvas 2D / pixel processing, so that edits appear immediately as I make them. (explicit)

  • Trigger/input: any adjustment, preset, filter, toning, film, texture, border, or geometry change.
  • Observable result: the canvas re-renders on the next animation frame with a 0ms lerp so the image tracks the control exactly.
  • Access state: no identity required.
  • Failure/recovery: if Canvas 2D is unavailable, the app states the workspace cannot run in this browser.
  • Continuation: the user continues adjusting once rendering succeeds.

FR-4 — Touch gestures. As a Black-and-White Photographer / Darkroom Editor, I should pinch with two fingers to zoom and pan the image with one finger, so that I can inspect fine detail on a phone. (explicit)

  • Trigger/input: a two-finger pinch or a one-finger drag on the photo pane.
  • Observable result: the image zooms or pans accordingly.
  • Access state: no identity required.
  • Failure/recovery: a gesture that would push the image fully out of view is constrained so part of the image remains visible.
  • Continuation: the user continues inspecting or editing.

FR-5 — Quick zoom keys. As a Black-and-White Photographer / Darkroom Editor, I should use [-] to zoom out, [+] to zoom in, and [Fit] to return to the base scale, so that I can quickly change magnification. (explicit)

  • Trigger/input: activation of the [-] , [+], or [Fit] control in the zoom cluster.
  • Observable result: the image zooms out, zooms in, or returns to the base scale.
  • Access state: no identity required.
  • Failure/recovery: zoom is bounded at its limits; [Fit] always returns to the base scale.
  • Continuation: the user continues inspecting or editing.

FR-6 — Zone System HUD. As a Black-and-White Photographer / Darkroom Editor, I should see the zone (Z0 to Z10) of any point with its luminance value (0–255), so that I can measure the image against the Zone System. (explicit)

  • Trigger/input: the user points at or touches a location on the canvas.
  • Observable result: a floating capsule shows the zone and luminance, with a 3px amber tick pointing at the sampled pixel and crosshair hairlines across the viewfinder; digits count to their new value in 180ms with tabular figures.
  • Access state: no identity required.
  • Failure/recovery: if the point cannot be sampled, the HUD shows no reading rather than a false value.
  • Continuation: the user continues measuring or editing.

FR-7 — Zone Heatmap mode. As a Black-and-White Photographer / Darkroom Editor, I should color image areas by luminance level, so that I can see tonal distribution at a glance. (explicit)

  • Trigger/input: activation of Zone Heatmap mode.
  • Observable result: image areas are colored by luminance level, keyed by the same 11-zone ruled luminance scale used as the legend.
  • Access state: no identity required.
  • Failure/recovery: deactivating the mode restores the normal rendering.
  • Continuation: the user continues editing.

FR-8 — Zebra clipping overlay. As a Black-and-White Photographer / Darkroom Editor, I should be warned of highlight and shadow clipping, so that I can avoid blown highlights and crushed shadows. (explicit)

  • Trigger/input: activation of the zebra clipping overlay.
  • Observable result: clipped highlight and shadow areas are marked.
  • Access state: no identity required.
  • Failure/recovery: deactivating the overlay restores the normal rendering.
  • Continuation: the user adjusts tonal controls to recover clipped areas.

FR-9 — Before/After compare. As a Black-and-White Photographer / Darkroom Editor, I should hold the compare button to view the original unedited image, so that I can judge the effect of my edits. (explicit)

  • Trigger/input: holding the compare button.
  • Observable result: the original unedited image is shown as a hard cut on hold, with a 90ms amber flash on the hairline.
  • Access state: no identity required.
  • Failure/recovery: releasing the button restores the edited image.
  • Continuation: the user continues editing.

FR-10 — Undo/Redo history stack. As a Black-and-White Photographer / Darkroom Editor, I should return to previous steps, so that I can recover from an unwanted edit. (explicit)

  • Trigger/input: activation of Undo or Redo.
  • Observable result: the image and control values return to the previous or next step.
  • Access state: no identity required.
  • Failure/recovery: Undo at the earliest step and Redo at the latest step are no-ops.
  • Continuation: the user continues editing from the restored step.

FR-11 — Factory presets. As a Black-and-White Photographer / Darkroom Editor, I should apply factory presets Original, Fine Art, Tri-X 400, HP5 Plus, Noir, Editorial, High Key, Low Key, and Vintage, so that I can start from a known look. (explicit)

  • Trigger/input: selection of a factory preset.
  • Observable result: the preset's look is applied to the photograph and the active preset is marked by a 2px amber underline.
  • Access state: no identity required.
  • Failure/recovery: selecting Original restores the unedited look.
  • Continuation: the user refines the look in other tabs.

FR-12 — Visual intents. As a Black-and-White Photographer / Darkroom Editor, I should apply visual intents Documentary, Classic Portrait, High-Key / Low-Key, and Silver Gelatin, so that I can steer the image toward an intent. (explicit)

  • Trigger/input: selection of a visual intent.
  • Observable result: the intent's look is applied to the photograph.
  • Access state: no identity required.
  • Failure/recovery: selecting another intent or Original replaces it.
  • Continuation: the user refines the look in other tabs.

FR-13 — Master recipes. As a Black-and-White Photographer / Darkroom Editor, I should apply master recipes Ansel Adams, Sebastião Salgado, Peter Lindbergh, Henri Cartier-Bresson, and Vivian Maier, so that I can work from a master's characteristic treatment. (explicit)

  • Trigger/input: selection of a master recipe.
  • Observable result: the recipe's look is applied to the photograph.
  • Access state: no identity required.
  • Failure/recovery: selecting another recipe or Original replaces it.
  • Continuation: the user refines the look in other tabs.

FR-14 — Custom user presets. As a Custom Preset Author, I should save all settings under a chosen name in browser LocalStorage and re-apply or delete them with one click, so that I can reuse a personal look without redoing manual adjustments. (explicit)

  • Trigger/input: entering a name and saving; or one-click re-apply or delete on a saved preset.
  • Observable result: the full adjustment set is stored under the chosen name in LocalStorage, re-applied to the photograph on one click, or removed on one click.
  • Access state: no identity required; persistence is per-browser.
  • Failure/recovery: if LocalStorage is unavailable or full, a plain in-page notice states that custom presets cannot be saved; factory presets remain usable.
  • Continuation: the user continues editing or applies another preset.

FR-15 — Light and contrast adjustments. As a Black-and-White Photographer / Darkroom Editor, I should adjust Exposure, Brightness, Contrast, Micro-Contrast, and Clarity, so that I can control the overall light and contrast of the image. (explicit)

  • Trigger/input: dragging any of these controls.
  • Observable result: the canvas updates on the next animation frame with a 0ms lerp; each control shows a live tabular value.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues adjusting.

FR-16 — Tonal separation adjustments. As a Black-and-White Photographer / Darkroom Editor, I should adjust Shadows, Deep Shadows, Highlights, Air Lights, Blacks, Whites, and Dynamic Range & Tone Rolloff, so that I can control each tonal region separately. (explicit)

  • Trigger/input: dragging any of these controls.
  • Observable result: the canvas updates on the next animation frame; each control shows a live tabular value.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues adjusting.

FR-17 — Interactive spline tone curve. As a Black-and-White Photographer / Darkroom Editor, I should edit the tone curve through five draggable points — Blacks, Shadows, Midtones, Highlights, Whites — and reset it to linear, so that I can shape the tonal response precisely. (explicit)

  • Trigger/input: dragging one of the five square handles, or activating Linear Reset.
  • Observable result: the curve reshapes and the canvas updates; Linear Reset restores the initial curve.
  • Access state: no identity required.
  • Failure/recovery: a drag that would produce a non-monotonic curve is constrained to the nearest valid shape.
  • Continuation: the user continues shaping the curve.

FR-18 — Ansel Adams 11-zone system. As a Black-and-White Photographer / Darkroom Editor, I should work with the 11 zones — Zone 0 Pure Black, Zone I Near Black, Zone II First Textured Shadow, Zone III Full Textured Shadow, Zone IV Dark Neutral Skin, Zone V 18% Middle Gray, Zone VI Light Skin / Concrete, Zone VII Textured Highlight, Zone VIII Delicate Highlight, Zone IX Near White, Zone X Pure White / Paper Base — and adjust each zone's value individually with [-] and [+], so that I can place tones deliberately. (explicit)

  • Trigger/input: activation of a zone's [-] or [+] button.
  • Observable result: that zone's value changes and the canvas updates; the zone-dial needle sweeps 240ms cubic-bezier(0.2, 0.8, 0.2, 1) when a zone is selected.
  • Access state: no identity required.
  • Failure/recovery: a zone value at its limit is a no-op.
  • Continuation: the user continues adjusting zones.

FR-19 — Lens color filters. As a Black-and-White Photographer / Darkroom Editor, I should apply lens color filters None, Yellow, Orange, Red, Green, and Blue, so that I can control how colors translate into monochrome. (explicit)

  • Trigger/input: selection of a lens color filter.
  • Observable result: the black-and-white conversion reflects the selected filter.
  • Access state: no identity required.
  • Failure/recovery: selecting None restores the neutral conversion.
  • Continuation: the user continues editing.

FR-20 — RGB channel mixer. As a Black-and-White Photographer / Darkroom Editor, I should control the Red Channel, Green Channel, and Blue Channel amounts in building the black-and-white equation, so that I can tune the conversion precisely. (explicit)

  • Trigger/input: adjusting the red, green, or blue channel amount.
  • Observable result: the black-and-white conversion reflects the channel mix.
  • Access state: no identity required.
  • Failure/recovery: a mix that would produce an out-of-range equation is clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-21 — Darkroom chemical toning. As a Black-and-White Photographer / Darkroom Editor, I should apply toning None, Sepia, Selenium, Cyanotype, Platinum, and Titanium with a Toning Intensity from 0% to 100%, so that I can finish the image with a darkroom tone. (explicit)

  • Trigger/input: selection of a toning and adjustment of Toning Intensity.
  • Observable result: the image takes on the selected tone at the chosen intensity.
  • Access state: no identity required.
  • Failure/recovery: selecting None restores pure black-and-white.
  • Continuation: the user continues editing.

FR-22 — Film stocks. As a Black-and-White Photographer / Darkroom Editor, I should select film stocks Kodak Tri-X 400, Ilford HP5 Plus, Kodak T-Max 100, Fuji Neopan 100, Agfa APX 400, and Rollei Retro 80S, so that I can emulate a specific film's response. (explicit)

  • Trigger/input: selection of a film stock.
  • Observable result: the image reflects the selected film stock's response.
  • Access state: no identity required.
  • Failure/recovery: selecting another stock replaces it.
  • Continuation: the user continues editing.

FR-23 — Darkroom paper base. As a Print / Output Preparer, I should select paper bases Matte Cotton Rag, Glossy Baryta, Silver Gelatin, and Vintage Fiber, so that the image matches the intended paper. (explicit)

  • Trigger/input: selection of a paper base.
  • Observable result: the image reflects the selected paper base.
  • Access state: no identity required.
  • Failure/recovery: selecting another base replaces it.
  • Continuation: the user continues preparing the output.

FR-24 — Film developer simulation. As a Black-and-White Photographer / Darkroom Editor, I should select developers D-76, Rodinal, Xtol, and HC-110 and set Development Temp °C and Development Time, so that I can emulate the development process. (explicit)

  • Trigger/input: selection of a developer and adjustment of temperature and time.
  • Observable result: the image reflects the selected developer, temperature, and time; values are shown as tabular readouts.
  • Access state: no identity required.
  • Failure/recovery: a temperature or time outside the valid range is clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-25 — Silver halide grain. As a Black-and-White Photographer / Darkroom Editor, I should control Grain Amount, Grain Roughness, and Grain Size with a live grain visualizer canvas, so that I can judge grain before committing. (explicit)

  • Trigger/input: adjusting grain amount, roughness, or size.
  • Observable result: the canvas updates and the live grain visualizer canvas reflects the grain.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-26 — Sharpening. As a Black-and-White Photographer / Darkroom Editor, I should control Sharpness Amount and Radius, so that I can control edge definition. (explicit)

  • Trigger/input: adjusting sharpness amount or radius.
  • Observable result: the canvas updates to reflect the sharpening.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-27 — Halation and diffusion/Orton effect. As a Black-and-White Photographer / Darkroom Editor, I should apply Halation (reddish/white spread around sharp highlights) and Diffusion / Orton Effect (cinematic portrait softening), so that I can add film glow or portrait softness. (explicit)

  • Trigger/input: adjusting halation or diffusion/Orton.
  • Observable result: the canvas updates to reflect the glow or softening.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-28 — Vignette. As a Black-and-White Photographer / Darkroom Editor, I should control Vignette Amount, Roundness, and Feather, so that I can shape the edge falloff. (explicit)

  • Trigger/input: adjusting vignette amount, roundness, or feather.
  • Observable result: the canvas updates to reflect the vignette.
  • Access state: no identity required.
  • Failure/recovery: out-of-range values are clamped and the readout shows the clamped value.
  • Continuation: the user continues editing.

FR-29 — Film borders. As a Print / Output Preparer, I should select film borders None, Thin, Rebate, Sprocket, Kodak 400, Ilford HP5, and Light Leak, so that the image carries the intended film edge. (explicit)

  • Trigger/input: selection of a film border.
  • Observable result: the canvas shows the selected border.
  • Access state: no identity required.
  • Failure/recovery: selecting None removes the border.
  • Continuation: the user continues preparing the output.

FR-30 — Matte / passe-partout framing. As a Print / Output Preparer, I should select a mat board color (black, white, cream, gray) and control Mat Size, so that the image is framed for presentation. (explicit)

  • Trigger/input: selection of a mat board color and adjustment of Mat Size.
  • Observable result: the canvas shows the mat framing at the chosen color and size.
  • Access state: no identity required.
  • Failure/recovery: an out-of-range mat size is clamped and the readout shows the clamped value.
  • Continuation: the user continues preparing the output.

FR-31 — Aspect ratio presets. As a Print / Output Preparer, I should crop to Original, 1:1, 4:5, 16:9, 3:2, 2:3, and 9:16, so that the image matches the intended format. (explicit)

  • Trigger/input: selection of an aspect ratio preset.
  • Observable result: the canvas shows the image cropped to the selected ratio.
  • Access state: no identity required.
  • Failure/recovery: a crop that would produce a zero-area region is rejected and the previous crop is retained.
  • Continuation: the user continues preparing the output.

FR-32 — Rotate and flip. As a Print / Output Preparer, I should rotate 90 degrees clockwise and flip horizontally or vertically, so that I can correct orientation. (explicit)

  • Trigger/input: activation of rotate, horizontal flip, or vertical flip.
  • Observable result: the canvas shows the rotated or flipped image.
  • Access state: no identity required.
  • Failure/recovery: returning rotation and flip to their defaults restores the original orientation.
  • Continuation: the user continues preparing the output.

FR-33 — Diagnostics Hub. As a Black-and-White Photographer / Darkroom Editor, I should see Average Luminance, detected Dynamic Range, Shadow Clip %, Highlight Clip %, and a Zone Histogram, so that I can judge the image's tonal health. (explicit)

  • Trigger/input: opening the Diagnostics Hub.
  • Observable result: the metrics and the zone histogram display, with the histogram's Zone V reference line; bars settle with a 220ms ease-out. The panel opens inside the lower 55% deck and never covers the viewfinder.
  • Access state: no identity required.
  • Failure/recovery: if the canvas cannot be sampled, the panel states that diagnostics are unavailable and the rest of the app remains usable.
  • Continuation: the user returns to editing with the measurements in mind.

FR-34 — Export Hub. As a Print / Output Preparer, I should choose file type JPEG, PNG, or WEBP, quality from 10% to 100%, and export scale 1x (original size) or 2x (Ultra-HD for print), with the exported file named by date and time, so that I get a file suited to its destination. (explicit)

  • Trigger/input: selecting file type, quality, and scale, then exporting.
  • Observable result: the browser downloads the finished image with a date-and-time file name. The panel opens inside the lower 55% deck and never covers the viewfinder.
  • Access state: no identity required.
  • Failure/recovery: if the browser blocks the download or the canvas cannot be encoded, a plain in-page notice states the failure and the settings remain intact.
  • Continuation: the user may change format, quality, or scale and retry.

FR-35 — Dual language support. As a Black-and-White Photographer / Darkroom Editor, I should use the app fully in Kurdish (Sorani, RTL) or English (LTR) and switch language with one click at the top of the app, so that I can work in my own language. (explicit)

  • Trigger/input: activation of the one-click language switch at the top of the app.
  • Observable result: the interface switches language; in RTL the grid mirrors — the viewfinder stays on top, the tab rail and value columns flip to the right edge, and numeric readouts keep LTR digit order inside an RTL row.
  • Access state: no identity required.
  • Failure/recovery: if a preference cannot be stored, the language still switches for the session.
  • Continuation: the user continues editing in the chosen language.

FR-36 — Client-side processing and offline operation. As a Black-and-White Photographer / Darkroom Editor, I should have all processing performed inside my browser with no image uploaded to any server and the app working fully offline, so that my photographs never leave my device. (explicit)

  • Trigger/input: any editing or export action.
  • Observable result: all processing occurs client-side; no image is transmitted; the app functions without a network connection.
  • Access state: no identity required.
  • Failure/recovery: if a required browser capability is missing, the app states the limitation rather than attempting a server fallback.
  • Continuation: the user continues editing offline.

FR-37 — Local photo availability. As a Black-and-White Photographer / Darkroom Editor, I should have a photo available locally in the browser before editing, so that the workspace has an image to process. (required_inference)

  • Trigger/input: the user provides a local photograph to the workspace.
  • Observable result: the photograph appears in the 45% viewfinder pane and becomes the subject of all edits.
  • Access state: no identity required.
  • Failure/recovery: if the file cannot be decoded, a plain in-page notice states the failure and the workspace remains ready for another file.
  • Continuation: the user proceeds to edit.

FR-38 — Custom preset persistence in LocalStorage. As a Custom Preset Author, I should have my custom presets persisted in browser LocalStorage, so that they survive a reload of the app. (required_inference)

  • Trigger/input: saving a custom preset.
  • Observable result: the preset is written to LocalStorage and is available on the next visit in the same browser.
  • Access state: no identity required; persistence is per-browser.
  • Failure/recovery: if LocalStorage is unavailable or full, the save fails with a plain in-page notice.
  • Continuation: the user continues editing with the current session's settings intact.

FR-39 — Canvas 2D / pixel processing for offline editing. As a Black-and-White Photographer / Darkroom Editor, I should have client-side Canvas 2D / pixel processing perform the editing, so that the app works offline without a server. (required_inference)

  • Trigger/input: any edit.
  • Observable result: the canvas is processed locally and re-rendered.
  • Access state: no identity required.
  • Failure/recovery: if Canvas 2D is unavailable, the app states the workspace cannot run in this browser.
  • Continuation: the user continues editing once processing succeeds.

FR-40 — Browser download for exported files. As a Print / Output Preparer, I should have the browser download my exported file, so that I receive the finished image on my device. (required_inference)

  • Trigger/input: activating export in the Export Hub.
  • Observable result: the browser saves the file locally with a date-and-time name.
  • Access state: no identity required.
  • Failure/recovery: if the download is blocked, a plain in-page notice states the failure and the settings remain intact.
  • Continuation: the user may retry or change export settings.
Page 9 of 22

4. User Personas

Page 10 of 22

Black-and-White Photographer / Darkroom Editor

Product context. This is the primary active user. They load a photograph into the interactive canvas and edit it toward a finished monochrome image. They think in stops, zones, and film stocks, and they judge the image continuously against the Zone System.

Primary goal. Produce a completed black-and-white image that matches their intent, and export it as JPEG, PNG, or WEBP at a chosen quality and scale.

Distinct accepted responsibilities. They work through the tabbed controls — presets, adjustments, curves and the 11-zone system, color filters and toning, film stock and darkroom simulation, detail and texture, canvas and borders, crop and geometry. They use zoom, pan, before/after compare, the Zone HUD, the heatmap, the zebra clipping overlay, and undo/redo to judge and refine results. They read the Diagnostics Hub to assess average luminance, dynamic range, clipping, and the zone histogram.

Relevant inputs or decisions. Which preset, intent, or master recipe to start from; how far to push exposure, contrast, and each tonal region; where to place each of the 11 zones; which lens filter and channel mix to use; which toning and at what intensity; which film stock, paper base, developer, temperature, and time; how much grain, sharpening, halation, diffusion, and vignette; and when the image is finished.

Interactions with other accepted participants. They share the workspace with the Custom Preset Author, who may save the settings they have tuned, and with the Print / Output Preparer, who takes the finished image into framing and export. The same person may act in all three roles, but the work each role does is distinct.

Observable success. The canvas reflects every edit immediately, the Zone HUD and diagnostics confirm the tonal placement, and the finished image exports at the chosen format, quality, and scale.

Page 11 of 22

Custom Preset Author

Product context. This user works after tuning settings, treating the current full adjustment set as a reusable asset rather than a one-off edit.

Primary goal. Build a reusable personal preset library that reproduces a look without redoing the manual adjustments.

Distinct accepted responsibilities. They save the full set of adjustments under a chosen name to browser LocalStorage, and later re-apply or delete those custom presets with one click. Their work is about capturing and recalling a complete state, not about shaping a single image.

Relevant inputs or decisions. The name to give the preset; which saved preset to re-apply; which saved preset to delete.

Interactions with other accepted participants. They depend on the Black-and-White Photographer / Darkroom Editor having tuned a look worth saving, and they hand reusable looks back to that same editor. Their library is per-browser and requires no account.

Observable success. The saved preset appears in the custom preset list, re-applies the full adjustment set in one click, and deletes in one click; it survives a reload of the app in the same browser.

Page 12 of 22

Print / Output Preparer

Product context. This user focuses on the final physical or high-resolution output rather than on the tonal shaping itself.

Primary goal. Produce a print-ready or presentation-ready file whose framing, borders, and resolution match the intended medium.

Distinct accepted responsibilities. They choose the darkroom paper base, the film border, and the matte/passe-partout framing (mat board color and mat size); they set the crop aspect ratio and apply rotation and flipping; and they choose the export scale — 1x original size or 2x Ultra-HD for print — with date-and-time file naming.

Relevant inputs or decisions. Which paper base suits the print; which border and mat treatment to apply; which aspect ratio the destination requires; whether the output needs 1x or 2x scale; which file type and quality to use.

Interactions with other accepted participants. They receive the finished image from the Black-and-White Photographer / Darkroom Editor and may also draw on the Custom Preset Author's saved looks. They own the framing and export decisions.

Observable success. The exported file carries the intended border, mat, crop, and resolution, and downloads with a date-and-time name.

5. Core User Flows

Page 13 of 22

Flow 1 — Load a photograph and begin editing (Black-and-White Photographer / Darkroom Editor)

  1. The user opens Aura Studio and lands on Landing, an anonymous first impression showing the engraved AURA STUDIO wordmark plate and the "MONOCHROME DARKROOM" micro-label.
  2. The user optionally switches language with one click at the top of the app; the interface switches between Kurdish (Sorani, RTL) and English (LTR), and in RTL the grid mirrors while numeric readouts keep LTR digit order.
  3. The user activates the "Load a negative" affordance on the ruled placeholder plate and provides a photograph available locally in the browser.
  4. The photograph appears in the fixed 45% viewfinder pane, framed by a 1px champagne bezel with corner tick marks. The lower 55% control deck shows the tab rail pinned directly under the photo.
  5. The user pinches with two fingers to zoom, pans with one finger, and uses [-] , [+], and [Fit] to change magnification.
  6. The user points at a location on the canvas; the Zone System HUD shows that point's zone (Z0–Z10) and its luminance (0–255) in a floating capsule with a 3px amber tick and crosshair hairlines, counting to the new value in 180ms with tabular figures.
  7. The user continues into the editing flows below. Failure/recovery: if the file cannot be decoded, a plain in-page notice states the failure and the workspace remains ready for another file.

Flow 2 — Apply a preset and refine the look (Black-and-White Photographer / Darkroom Editor)

  1. From the workspace, the user opens TAB 1: PRESETS in the control deck.
  2. The user selects a factory preset — Original, Fine Art, Tri-X 400, HP5 Plus, Noir, Editorial, High Key, Low Key, or Vintage — or a visual intent (Documentary, Classic Portrait, High-Key / Low-Key, Silver Gelatin) or a master recipe (Ansel Adams, Sebastião Salgado, Peter Lindbergh, Henri Cartier-Bresson, Vivian Maier).
  3. The look applies to the photograph and the active preset is marked by a 2px amber underline.
  4. The user moves to TAB 2: ADJUST and drags Exposure, Brightness, Contrast, Micro-Contrast, and Clarity, then Shadows, Deep Shadows, Highlights, Air Lights, Blacks, Whites, and Dynamic Range & Tone Rolloff. The canvas tracks each thumb exactly on the next animation frame with a 0ms lerp, and each control shows a live tabular value.
  5. The user opens TAB 3: CURVES & ZONES, drags the five square handles (Blacks, Shadows, Midtones, Highlights, Whites) on the 1px ruled graph, and adjusts individual zones with their [-] and [+] buttons. The zone-dial needle sweeps 240ms when a zone is selected.
  6. The user holds the compare button to see the original unedited image as a hard cut, with a 90ms amber flash on the hairline, then releases to return to the edited image.
  7. The user uses Undo/Redo to step back and forward through previous edits. Failure/recovery: a curve drag that would produce a non-monotonic shape is constrained to the nearest valid shape; Linear Reset restores the initial curve.

Flow 3 — Judge the image with diagnostics and overlays (Black-and-White Photographer / Darkroom Editor)

  1. From the workspace, the user activates Zone Heatmap mode; image areas are colored by luminance level, keyed by the same 11-zone ruled luminance scale used as the legend.
  2. The user activates the zebra clipping overlay and sees highlight and shadow clipping marked.
  3. The user opens the Diagnostics Hub as an in-deck panel inside the lower 55% — the viewfinder is never covered. The panel shows Average Luminance, detected Dynamic Range, Shadow Clip %, Highlight Clip %, and the Zone Histogram with its Zone V reference line; bars settle with a 220ms ease-out.
  4. On desktop 1280px the same metrics are already visible in the always-visible Diagnostics rail on the right.
  5. The user returns to TAB 2: ADJUST or TAB 3: CURVES & ZONES to recover clipped areas, watching the metrics update. Failure/recovery: if the canvas cannot be sampled, the panel states that diagnostics are unavailable and the rest of the app remains usable.
Page 14 of 22

Flow 4 — Apply color filters, channel mixing, and chemical toning (Black-and-White Photographer / Darkroom Editor)

  1. The user opens TAB 4: COLOR & FILTER.
  2. The user selects a lens color filter — None, Yellow (for natural sky), Orange (for strong contrast), Red (for dark sky and heavy cloud), Green (for foliage and skin), or Blue.
  3. The user adjusts the RGB channel mixer's Red Channel, Green Channel, and Blue Channel amounts to build the black-and-white equation.
  4. The user selects a darkroom chemical toning — None (pure black-and-white), Sepia, Selenium, Cyanotype, Platinum, or Titanium — and sets Toning Intensity from 0% to 100%.
  5. The canvas updates to reflect the filter, mix, and toning. Failure/recovery: a channel mix that would produce an out-of-range equation is clamped and the readout shows the clamped value; selecting None for filter and toning restores the neutral conversion.

Flow 5 — Emulate film, paper, and development (Black-and-White Photographer / Darkroom Editor)

  1. The user opens TAB 5: DARKROOM & FILM, which reads like the back of a watch case: ruled data rows with swatches, engraved names in condensed caps, and tabular values.
  2. The user selects a film stock — Kodak Tri-X 400, Ilford HP5 Plus, Kodak T-Max 100, Fuji Neopan 100, Agfa APX 400, or Rollei Retro 80S.
  3. The user selects a film developer — D-76, Rodinal, Xtol, or HC-110 — and sets Development Temp °C and Development Time.
  4. The user opens TAB 6: DETAIL & TEXTURE and sets Grain Amount, Grain Roughness, and Grain Size, watching the live grain visualizer canvas; then sets Sharpness Amount and Radius; then Halation and Diffusion / Orton Effect; then Vignette Amount, Roundness, and Feather.
  5. The canvas updates throughout. Failure/recovery: a temperature or time outside the valid range is clamped and the tabular readout shows the clamped value; each texture control can be returned to its zero detent.

Flow 6 — Save, re-apply, and delete a custom preset (Custom Preset Author)

  1. After tuning a look, the user opens TAB 1: PRESETS and enters a chosen name in the custom preset section.
  2. The user saves; the full set of adjustments is written to browser LocalStorage under that name.
  3. Later, in the same browser, the user opens TAB 1: PRESETS and sees the saved preset in the custom list.
  4. The user re-applies it with one click; the full adjustment set is restored to the photograph.
  5. The user deletes a preset with one click when it is no longer wanted. Failure/recovery: if LocalStorage is unavailable or full, a plain in-page notice states that custom presets cannot be saved; factory presets remain fully usable and the current session's settings remain intact.

Flow 7 — Frame the image for print (Print / Output Preparer)

  1. The user opens TAB 7: CANVAS & BORDERS and selects a film border — None, Thin, Rebate, Sprocket, Kodak 400, Ilford HP5, or Light Leak.
  2. The user selects a mat board color (black, white, cream, or gray) and sets Mat Size; the canvas shows the mat framing.
  3. The user opens TAB 5: DARKROOM & FILM and selects a darkroom paper base — Matte Cotton Rag, Glossy Baryta, Silver Gelatin, or Vintage Fiber — so the image matches the intended paper.
  4. The user opens TAB 8: CROP & GEOMETRY, selects an aspect ratio — Original, 1:1, 4:5, 16:9, 3:2, 2:3, or 9:16 — and rotates 90 degrees clockwise or flips horizontally or vertically as needed.
  5. The canvas updates to the framed, cropped, and oriented image. Failure/recovery: a crop that would produce a zero-area region is rejected and the previous crop is retained; selecting Original and returning rotation and flip to their defaults restores the uncropped, unrotated image.
Page 15 of 22

Flow 8 — Export the finished image (Print / Output Preparer)

  1. The user opens the Export Hub as an in-deck panel inside the lower 55% — the viewfinder is never covered.
  2. The user selects the file type — JPEG, PNG, or WEBP.
  3. The user sets quality from 10% to 100%.
  4. The user selects the export scale — 1x (original size) or 2x (Ultra-HD for print).
  5. The user observes the generated file name based on date and time.
  6. The user activates export; the browser downloads the finished image with the date-and-time name. Failure/recovery: if the browser blocks the download or the canvas cannot be encoded, a plain in-page notice states the failure and the settings remain intact; the user may change format, quality, or scale and retry.

Flow 9 — Inspect the image at full size and return (Black-and-White Photographer / Darkroom Editor)

  1. From the workspace, the user toggles the display mode from working mode (45% photo + 55% controls) to fullscreen photo mode.
  2. The user inspects the image at full size.
  3. The user toggles back; the 45/55 working split is restored with the previously active tab. Failure/recovery: toggling back always restores the working split, so the user cannot lose the editing context.
Page 16 of 22

6. Visuals Colors and Theme

Muse and headline. MARQ by Garmin — a luxury instrument aesthetic. The register is instrument reverence: the user should feel they are holding a calibrated measuring device for light, not a filter toy. Emotional target: control, craft, quiet authority, and the tactile pleasure of a well-machined tool.

Mode. Dark mode only. No panel may be light except the photograph itself and the Z X swatch.

Palette (dark mode).

RoleHexUse
Background#0E1013Titanium-black ground
Surface#181B1FBrushed graphite panels
Hairline#2A2E331px separators between panels and ruled rows
Text#EDE9E1Bone body text at 15–16px
Primary#C8923FChampagne-amber instrument accent
Accent#E2A83CActive control, current zone marker, primary action
Muted#8B857AMicro-labels and units only, never body copy

Warm champagne-amber is the single instrument accent — used only for the active control, the current zone marker, the histogram's Zone V reference line, and the primary action, never as a fill wash. No blue anywhere. Contrast: #EDE9E1 on #0E1013 ≈ 15:1; #8B857A on #181B1F ≈ 4.9:1 (labels only).

Zone ramp. The zone scale is a real coded ramp from #000000 (Z0) through #808080 (Z V, 18% grey) to #FFFFFF (Z X), so the palette itself becomes the data.

Typography. Headings: Saira Condensed 600–700, uppercase, tracking +0.08em for section headers and tab labels; Saira Condensed 500 at 78–128px for the wordmark and hero numerals with tracking -0.01em. Body: Barlow 400/500 for all body and control labels, 12–13px uppercase with +0.12em tracking for units (EV, °C, MM, %). Numeric readouts use Barlow with tabular figures so luminance values never reflow while dragging. Scale: 1.25 modular on a 4px baseline — 128/78/48/30/22/17/15/13/11. Hero wordmark clamp(48px, 11vw, 128px). Section headers 13px uppercase. Control labels 15px. Micro-units 11px. Tabular numerals everywhere a value changes.

Shape language. Machined, not soft. 2px radii on panels and 1px on controls — the opposite of pill-and-blob. Circular gauge motifs: the zone dial, the histogram frame, and the vignette/roundness control are all true circles with a 1px champagne bezel ring and tick marks at the 12 positions. Ruled data rows with hairline separators, exactly like a watch spec sheet. Sliders are 2px rails with a square 14px thumb and a 1px amber hairline at the zero detent. Every control has an engraved-looking label above it and a live tabular value to its right.

Spacing rhythm. 4px baseline grid; ruled rows separated by 1px #2A2E33 hairlines; panel padding on the 4px rhythm.

Imagery style. The product's own canvas is the only hero image — a user-loaded photograph rendered in monochrome, framed by a 1px amber bezel ring like a dial. Supporting imagery is diagrammatic and engineered: the 11-zone luminance ramp as a ruled strip with tick marks and printed zone numerals (0, I, II … X) plus their descriptions; the tone curve drawn as a 1px ruled graph on a 4×4 minor grid; the histogram as a bar field with the Zone V reference line; film-stock chips rendered as small square swatches with engraved type names (Kodak Tri-X 400, Ilford HP5 Plus, Rollei Retro 80S). The default empty state shows a topographically-ruled placeholder plate with a centred "Load a negative" affordance — no stock photo of a person, no illustration, no 3D blobs.

Avoid. Any blue or indigo accent, especially #0057FF / #2563EB / #4F46E5; white or near-white page ground; Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, system-ui; pill buttons, 16px+ radii, soft offset shadows, hover-lift cards; full-height overlays, bottom sheets, or modals that cover the 45% viewfinder pane at any viewport; gradient blobs, glow blooms, neon cyan/violet, particle fields, glassmorphism; springy, bouncy, or elastic easing; any animation longer than 240ms or any decorative loop; stock photography of people, cartoon illustration, or 3D blob props in the empty state.

Page 17 of 22

7. Signature Design Concept

The instrument face, not a marketing hero.

The first screen is a dark instrument face. On mobile, the top 45% of the viewport is a full-bleed titanium-black viewfinder: the user's photograph sits inside a 1px champagne bezel with corner tick marks, an amber hairline crosshair at the cursor/touch point, and a floating tabular HUD capsule reading ZONE VI · 168 in Saira Condensed 600 over Barlow tabular digits. Bottom-left of the viewfinder is a stacked zoom cluster — a vertical ruled column of [-] / [+] / [Fit] square buttons with hairline separators.

The bottom 55% is the control deck. The AURA STUDIO wordmark, set in Saira Condensed 500 at clamp(48px, 11vw, 128px), is not centred and not in the deck — it is cut into the viewfinder's lower bezel as an engraved plate, left-aligned, with MONOCHROME DARKROOM in 11px Barlow uppercase +0.16em tracking beneath it. Under that, the 8-slot tab rail runs as a ruled horizontal index with the active slot marked by a 2px amber underline. The first control row (Exposure) is visible above the fold with its live tabular value right-aligned in amber.

There is no centred headline, no subhead, no blue button, no gradient. On desktop 1280px the same composition becomes a wide bench: the wordmark plate spans the left column at 128px, the viewfinder sits beside it, and the Diagnostics rail on the right already draws a live histogram.

Signature moves.

  • The 45/55 instrument split. A fixed, never-covered viewfinder pane above a scrolling control deck, where every modal, sheet, and settings panel opens as an in-deck panel inside the lower 55% so the photograph is physically incapable of being obscured. On desktop the same split rotates to photo-left / deck-right.
  • The 11-zone ruled luminance scale as both control and legend. A horizontal strip of 11 coded swatches from #000000 to #FFFFFF with printed zone numerals and names (Z0 Pure Black … Z X Paper Base), each with [-] and [+] machined buttons, doubling as the Zone Heatmap legend so the color-coded overlay and its key are literally the same object.
  • The Zone HUD as an engraved readout. A floating capsule over the canvas showing ZONE VI · 168 with a 3px amber tick pointing at the exact sampled pixel, crosshair hairlines across the full viewfinder, and digits that count to their new value in 180ms with tabular figures.
  • A champagne-amber needle-and-hairline system instead of filled controls. Sliders are 2px rails with a square thumb and a 1px amber zero-detent mark; the tone curve is a 1px ruled graph with five square draggable handles labelled Blacks/Shadows/Midtones/Highlights/Whites; the active tab is marked only by a 2px amber underline — no filled buttons, no pills, no card shadows.
  • Film-stock and developer plates as engraved spec cards. Each film stock, paper base, and developer (D-76, Rodinal, Xtol, HC-110) is a ruled data row with a swatch, its engraved name in condensed caps, and tabular temperature/time values — the Darkroom & Film tab reads like the back of a watch case rather than a settings list.
Page 18 of 22

8. Interaction Model & Motion Direction

Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat

Landing Hero Motion Brief.

  • Focal subject. The user's own photograph rendered in monochrome inside the 1px champagne bezel viewfinder, with the engraved AURA STUDIO wordmark plate cut into the lower bezel and the floating Zone HUD capsule over the canvas.
  • Input → transformation → outcome thesis. The user points at or touches a location on the canvas → the Zone HUD samples that pixel and its digits count to the new luminance value in 180ms with tabular figures while the 3px amber tick moves to the sampled pixel → the user reads the zone and luminance and decides the next edit. The transformation is measurement, not decoration: the instrument reports, the photographer decides.
  • Motion vocabulary. Instrument motion only, at MARQ's cinematic ceiling but never decorative. Slider drags update the canvas on the next animation frame with a 0ms lerp — the image tracks the thumb exactly. Zone HUD readout counts to its new luminance value in 180ms with tabular digits. Histogram bars settle with a 220ms ease-out. Zone-dial needle sweeps 240ms cubic-bezier(0.2, 0.8, 0.2, 1) when a zone is selected. Tab changes do a 160ms horizontal wipe of the amber hairline, not a fade of content. Before/After compare is a hard cut on hold, with a 90ms amber flash on the hairline. No bounce, no spring, no particles, no gradient drift.
  • Composed first frame. A dark instrument face: the titanium-black viewfinder occupying the top 45% with the photograph inside the champagne bezel and corner tick marks, the amber hairline crosshair at the touch point, the tabular HUD capsule reading ZONE VI · 168, the stacked [-] / [+] / [Fit] zoom cluster bottom-left, and the engraved wordmark plate cut into the lower bezel. The lower 55% deck shows the ruled 8-slot tab rail with the active slot marked by a 2px amber underline and the first Exposure row visible above the fold with its live tabular value right-aligned in amber.
  • Reduced-motion state. With prefers-reduced-motion, all sweeps and counts resolve instantly to their final value and the tab wipe becomes an instant state change. The composed first frame is unchanged; only the transitions are removed.
Page 19 of 22

9. Non-Functional Requirements

NFR-1 — Client-side processing. All processing is performed client-side inside the user's browser. (explicit) Rationale: the source states this as a hard constraint and it is the basis of the privacy promise.

NFR-2 — No server upload and full offline operation. No image is uploaded to any server, and the app works fully offline. (explicit) Rationale: the source states this as a hard constraint; it is the product's central trust guarantee.

NFR-3 — Fixed 45% photo pane. The photo must remain fixed at 45% of the mobile screen without being lost or covered when any section is opened. (explicit) Rationale: the source states this as a hard constraint and it governs the entire layout, including the rule that modals open inside the lower 55% deck.

NFR-4 — LocalStorage persistence. Custom user presets are stored in browser LocalStorage. (explicit) Rationale: the source names LocalStorage as the persistence mechanism for custom presets.

NFR-5 — Real-time responsiveness. The canvas must update on the next animation frame with a 0ms lerp so the image tracks the slider thumb exactly. (explicit) Rationale: the source requires an accelerated real-time processing engine and the creative direction fixes the 0ms lerp behavior.

NFR-6 — Motion ceiling. No animation may exceed 240ms, and no decorative loop is permitted. (explicit) Rationale: the creative direction sets this ceiling; it keeps the interface instrument-like rather than decorative.

NFR-7 — Reduced motion. With prefers-reduced-motion, all sweeps and counts resolve instantly to their final value and the tab wipe becomes an instant state change. (explicit) Rationale: the creative direction requires an accessible reduced-motion state.

NFR-8 — Readable text and controls stay whole. Headlines, wordmarks, labels, numbers, cards' text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, and no other element covers any part of them. (explicit) Rationale: the creative direction states this rule takes precedence for readable text and controls.

NFR-9 — Bilingual layout integrity. The interface must render fully in Kurdish (Sorani, RTL) and English (LTR); in RTL the grid mirrors — the viewfinder stays on top, the tab rail and value columns flip to the right edge, and numeric readouts keep LTR digit order inside an RTL row. (explicit) Rationale: the source requires full dual-language support with one-click switching.

NFR-10 — Tabular numerals. Numeric readouts use tabular figures so luminance values never reflow while dragging. (explicit) Rationale: the creative direction requires stable numeric readouts during live adjustment.

NFR-11 — Dark-mode-only contrast. The application is dark-mode only; no panel may be light except the photograph itself and the Z X swatch. Body text contrast must meet #EDE9E1 on #0E1013 ≈ 15:1, and #8B857A is restricted to labels, never body copy. (explicit) Rationale: the creative direction fixes the palette and its contrast roles.

NFR-12 — No blue accent. No blue or indigo accent may appear anywhere in the interface. (explicit) Rationale: the creative direction forbids it and the generic indigo/blue-on-white SaaS template is forbidden for this project.

Page 20 of 22

10. Tech Stack

  • Frontend: React (web), delivered in the browser. (required_inference — the source specifies a client-side web app with custom UI and Canvas 2D processing; React is the default web framework choice.)
  • Rendering and processing: Canvas 2D / pixel processing for the accelerated real-time engine, the live grain visualizer canvas, the zone heatmap, the zebra clipping overlay, and export encoding. (explicit)
  • Persistence: Browser LocalStorage for custom user presets. (explicit)
  • File access: Browser-native local file access to load a photograph. (required_inference)
  • Export delivery: Browser-native download for exported files. (required_inference)
  • Typography: Saira Condensed (headings, wordmark, hero numerals) and Barlow (body, control labels, tabular numerals), loaded as web fonts. (explicit)
  • No backend, no database, no container orchestration. The source requires all processing client-side, no server upload, and full offline operation; no server, storage service, Docker, or Kubernetes component is required or permitted by the accepted scope. (explicit)
Page 21 of 22

11. Assumptions and Constraints

Assumptions.

  • A-1. The user has a photograph available locally in the browser before editing; the source does not specify the loading mechanism, so the workspace provides a local file affordance. (required_inference)
  • A-2. Custom preset persistence is per-browser and per-device, because the source names LocalStorage and establishes no account or sync mechanism. (required_inference)
  • A-3. The browser provides Canvas 2D, LocalStorage, local file access, and download; if any is missing, the app states the limitation rather than falling back to a server. (required_inference)
  • A-4. The three accepted personas may be the same physical person acting in different roles; the roles remain distinct in their responsibilities and outcomes. (required_inference)

Constraints.

  • C-1. All processing is performed client-side inside the user's browser. (explicit)
  • C-2. No image is uploaded to any server, and the app works fully offline. (explicit)
  • C-3. The photo must remain fixed at 45% of the mobile screen without being lost or covered when any section is opened; every modal, sheet, and settings panel opens as an in-deck panel inside the lower 55%. (explicit)
  • C-4. Custom user presets are stored in browser LocalStorage. (explicit)
  • C-5. The application is dark-mode only, with no blue or indigo accent anywhere. (explicit)
  • C-6. The interface supports Kurdish (Sorani, RTL) and English (LTR) with one-click switching at the top of the app. (explicit)
  • C-7. No animation exceeds 240ms and no decorative loop is permitted. (explicit)
  • C-8. Readable text and controls stay whole at 375px, 768px, and 1280px; no element covers any part of them. (explicit)

Future requirements. None are defined by the authoritative source. No future-horizon capability is included in current pages or acceptance.

Page 22 of 22

12. Glossary

  • Aura Studio — Monochrome Darkroom (تاریکخانەی مۆنۆکرۆم): The product; a client-side, offline black-and-white photo editing web application.
  • Zone System: Ansel Adams' 11-zone luminance scale from Zone 0 (Pure Black) to Zone X (Pure White / Paper Base), used to place and judge tones.
  • Zone HUD: The floating readout over the canvas showing the zone (Z0–Z10) and luminance (0–255) of a sampled point.
  • Zone Heatmap: A mode that colors image areas by luminance level, keyed by the 11-zone ruled luminance scale.
  • Zebra Clipping Overlay: A warning overlay marking clipped highlights and shadows.
  • Luminance: The measured brightness of a pixel, expressed 0–255.
  • Tone Curve: The interactive spline curve edited through five draggable points — Blacks, Shadows, Midtones, Highlights, Whites.
  • Linear Reset: The control that returns the tone curve to its initial linear state.
  • Lens Color Filter: A simulated camera filter (None, Yellow, Orange, Red, Green, Blue) that shapes how colors translate into monochrome.
  • RGB Channel Mixer: The control over Red, Green, and Blue channel amounts in building the black-and-white equation.
  • Darkroom Chemical Toning: A simulated darkroom tone (None, Sepia, Selenium, Cyanotype, Platinum, Titanium) applied at a Toning Intensity from 0% to 100%.
  • Film Stock: A simulated black-and-white film (Kodak Tri-X 400, Ilford HP5 Plus, Kodak T-Max 100, Fuji Neopan 100, Agfa APX 400, Rollei Retro 80S).
  • Darkroom Paper Base: A simulated printing paper (Matte Cotton Rag, Glossy Baryta, Silver Gelatin, Vintage Fiber).
  • Film Developer: A simulated developer (D-76, Rodinal, Xtol, HC-110) with Development Temp °C and Development Time.
  • Silver Halide Grain: The simulated analog grain, controlled by Grain Amount, Grain Roughness, and Grain Size, with a live grain visualizer canvas.
  • Halation: The reddish/white spread around sharp highlights in film.
  • Diffusion / Orton Effect: A cinematic portrait softening effect.
  • Vignette: The edge falloff, controlled by Vignette Amount, Roundness, and Feather.
  • Film Border: A simulated film edge (None, Thin, Rebate, Sprocket, Kodak 400, Ilford HP5, Light Leak).
  • Matte / Passe-Partout: The presentation framing, with a mat board color (black, white, cream, gray) and a Mat Size control.
  • Diagnostics Hub: The panel showing Average Luminance, detected Dynamic Range, Shadow Clip %, Highlight Clip %, and the Zone Histogram.
  • Zone Histogram: The tonal histogram drawn as a bar field with the Zone V reference line.
  • Export Hub: The panel for choosing file type (JPEG, PNG, WEBP), quality (10%–100%), export scale (1x original, 2x Ultra-HD for print), and date-and-time file naming.
  • Custom User Preset: A full set of adjustments saved under a chosen name in browser LocalStorage, re-appliable or deletable with one click.
  • Working Mode: The 45% photo + 55% controls layout.
  • Fullscreen Photo Mode: The display mode showing the photograph at full size.
  • RTL / LTR: Right-to-left layout for Kurdish (Sorani) and left-to-right layout for English.

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Landing: Switch language
Landing: 1. Load a negative
Landing: 2. Read browser capability notice
Landing: 3. Retry capability check
TAB 1: PRESETS: Select factory preset
TAB 1: PRESETS: Apply visual intent
TAB 1: PRESETS: Apply master recipe
TAB 1: PRESETS: Save full settings as preset
TAB 1: PRESETS: Re-apply custom preset
TAB 1: PRESETS: Delete custom preset
TAB 1: PRESETS: Read storage unavailable notice
TAB 2: ADJUST: 1. Adjust light and contrast
TAB 2: ADJUST: 2. Adjust tonal separation
TAB 2: ADJUST: 3. Reset control to zero detent
TAB 3: CURVES & ZONES: 4. Drag curve handles
TAB 3: CURVES & ZONES: 5. Adjust individual zone value
TAB 3: CURVES & ZONES: 6. Reset curve to linear
TAB 4: COLOR & FILTER: 7. Select lens color filter
TAB 4: COLOR & FILTER: 8. Set RGB channel amounts
TAB 4: COLOR & FILTER: 9. Select chemical toning
TAB 4: COLOR & FILTER: 10. Set toning intensity
TAB 5: DARKROOM & FILM: 11. Select film stock
TAB 5: DARKROOM & FILM: 12. Select film developer
TAB 5: DARKROOM & FILM: 13. Set development temp and time
TAB 6: DETAIL & TEXTURE: 14. Set grain amount and size
TAB 6: DETAIL & TEXTURE: 15. Observe live grain visualizer
TAB 6: DETAIL & TEXTURE: 16. Set sharpness and radius
TAB 6: DETAIL & TEXTURE: 17. Set halation and Orton
TAB 6: DETAIL & TEXTURE: 18. Set vignette amount and feather
TAB 7: CANVAS & BORDERS: 19. Select film border
TAB 8: CROP & GEOMETRY: 20. Select aspect ratio
TAB 8: CROP & GEOMETRY: 21. Rotate or flip image
TAB 8: CROP & GEOMETRY: 22. Return to original ratio
Diagnostics Hub: 23. Open diagnostics panel
Diagnostics Hub: 24. Read luminance and clipping
Diagnostics Hub: 25. Read Zone V histogram
Diagnostics Hub: Read diagnostics unavailable notice
Export Hub: Open export panel
Export Hub: 1. Choose file type and quality
Export Hub: 2. Choose export scale
Export Hub: 3. Activate export
Export Hub: 4. Read export failure notice
Export Hub: 5. Retry export

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Landing: Switch language
Landing: 1. Load a negative
Landing: 2. Read browser capability notice
Landing: 3. Retry capability check
TAB 1: PRESETS: Select factory preset
TAB 1: PRESETS: Apply visual intent
TAB 1: PRESETS: Apply master recipe
TAB 1: PRESETS: Save full settings as preset
TAB 1: PRESETS: Re-apply custom preset
TAB 1: PRESETS: Delete custom preset
TAB 1: PRESETS: Read storage unavailable notice
TAB 2: ADJUST: 1. Adjust light and contrast
TAB 2: ADJUST: 2. Adjust tonal separation
TAB 2: ADJUST: 3. Reset control to zero detent
TAB 3: CURVES & ZONES: 4. Drag curve handles
TAB 3: CURVES & ZONES: 5. Adjust individual zone value
TAB 3: CURVES & ZONES: 6. Reset curve to linear
TAB 4: COLOR & FILTER: 7. Select lens color filter
TAB 4: COLOR & FILTER: 8. Set RGB channel amounts
TAB 4: COLOR & FILTER: 9. Select chemical toning
TAB 4: COLOR & FILTER: 10. Set toning intensity
TAB 5: DARKROOM & FILM: 11. Select film stock
TAB 5: DARKROOM & FILM: 12. Select film developer
TAB 5: DARKROOM & FILM: 13. Set development temp and time
TAB 6: DETAIL & TEXTURE: 14. Set grain amount and size
TAB 6: DETAIL & TEXTURE: 15. Observe live grain visualizer
TAB 6: DETAIL & TEXTURE: 16. Set sharpness and radius
TAB 6: DETAIL & TEXTURE: 17. Set halation and Orton
TAB 6: DETAIL & TEXTURE: 18. Set vignette amount and feather
TAB 7: CANVAS & BORDERS: 19. Select film border
TAB 8: CROP & GEOMETRY: 20. Select aspect ratio
TAB 8: CROP & GEOMETRY: 21. Rotate or flip image
TAB 8: CROP & GEOMETRY: 22. Return to original ratio
Diagnostics Hub: 23. Open diagnostics panel
Diagnostics Hub: 24. Read luminance and clipping
Diagnostics Hub: 25. Read Zone V histogram
Diagnostics Hub: Read diagnostics unavailable notice
Export Hub: Open export panel
Export Hub: 1. Choose file type and quality
Export Hub: 2. Choose export scale
Export Hub: 3. Activate export
Export Hub: 4. Read export failure notice
Export Hub: 5. Retry export