Page 1 of 15
System Requirements Document for nova-project
1. Introduction
nova-project is a website dedicated to learning photography (موقع إلكتروني خاص بتعلم التصوير الفوتوغرافي). Its product intent is singular and explicit: to be an online destination where people acquire photographic knowledge and skill, and where the instructional material that makes that learning possible is prepared and published.
The audience is two-fold and closed:
- Learners (متعلم التصوير الفوتوغرافي) — people who want to learn photography. They arrive to study lessons and tutorials, progress through material at their own pace, and succeed when they have gained and can apply photographic understanding.
- Content Authors / Instructors (مُعدّ المحتوى التعليمي) — the people who supply the instructional material. They prepare and organize photography lessons and tutorials so they are available to learners, and succeed when that learning content is published and usable on the site.
The site's subject matter and content domain is photography education. Nothing outside that domain is in scope.
2. System Overview
nova-project is a custom-UI, application-owned web product with a backend integration. It delivers:
- A public entry surface that explains that the site provides photography education and directs visitors to learning content.
- A browseable body of photography lessons and tutorials that learners read.
- Self-service enrollment so a learner can establish continuity for their own learning.
- Returning verification so protected work is available again to the correct person.
- A protected authoring workspace where the content author or instructor prepares and organizes photography education material for publication.
Page 2 of 15
2a. Product Interpretation and Delivery Boundary
Delivery ownership. The product is delivered as a first-party application with its own custom interface and its own backend. All five destinations — Landing, Login, Sign Up, Lessons, and Content Editor — are application-owned custom pages. There is no provider-owned or external-only surface in the current scope, and no headless-only delivery.
Access ownership. The site is public at its entry. A visitor can reach the Landing page and can browse the Lessons content without establishing identity. Identity is application-owned and is required only where durable, person-bound continuity exists: a learner who wants their own enrollment continuity, and the content author or instructor whose authoring control over published material must remain bound to the correct person. Login and Sign Up are themselves anonymously reachable — the interaction that establishes access cannot sit behind the access it establishes. The Content Editor is role-restricted to the content author or instructor.
Current boundary. Current scope is exactly: the public Landing entry, anonymous browsing of photography lessons, self-service learner enrollment, returning verification, and protected preparation and organization of photography education material for publication by the content author or instructor.
Future boundary. No future-horizon requirements were stated in the authoritative thread. Nothing beyond the current scope is committed, and no adjacent capability — social features, critique, commerce, certification, portfolios, gear retail, or community — is part of this product.
2c. Page Content and Component Coverage
Page 3 of 15
Landing
- Information / state: Anonymous public entry. States that nova-project is a school of photography and that its purpose is learning photography. Presents the site identity label
NOVA — مدرسة التصوير and the hero headline تعلّم أن ترى الضوء (Learn to see the light). No identity is required and no protected state is shown.
- Primary action: Enter the learning content — the hero call to action
ابدأ الدرس الأول leads to Lessons.
- Supporting actions: Navigate to Login for returning users; navigate to Sign Up for a visitor who wants their own learning continuity.
- Domain entities: Site identity, hero photograph set, entry call to action, navigation to learning content and to identity surfaces.
- Component responsibilities: Full-bleed hero photograph occupying the left 8 of 12 columns and bleeding off the left edge; Playfair Display headline overlapping the image's right edge and breaking across three lines; a 1px safelight-red hairline beneath the headline; a rectangular bordered CTA pinned bottom-left of the image; a small all-caps amber label top-right; the recurring 8px vertical red bar beside section labels.
- States: Loading — hero photograph resolves; headline reveals line-by-line. Empty — not applicable; the entry always carries its identity statement and CTA. Success — visitor understands the site teaches photography and can proceed to Lessons or to Sign Up. Error / recovery — if a hero photograph fails to load, the headline, hairline, label and CTA remain fully readable and the entry remains usable; the crossfade degrades to a single still frame.
Login
- Information / state: Anonymous access surface for returning verification. Narrow form column on the near-black ground; no card, no centering. Reached by a returning learner or by the content author or instructor.
- Primary action: Verify returning identity and continue to the protected work that identity owns.
- Supporting actions: Move to Sign Up if the visitor has no enrollment yet; return to Landing.
- Domain entities: Returning identity credential, verification outcome, post-verification destination.
- Component responsibilities: Split-screen composition — one full-bleed photograph on the left half with a slow Ken Burns scale, a narrow form column on the right half with a 48px Playfair Display headline; rectangular inputs and a rectangular bordered submit control; inline verification feedback.
- States: Loading — verification in progress, submit control reflects pending state. Empty — pristine form with no entered values. Success — identity verified; the person continues to the protected work their identity owns. Error / recovery — verification fails; a clear inline message is shown, entered values are preserved where safe, and the person may retry or move to Sign Up. At 375px the split screen stacks with the photograph as a 30vh banner above the form.
Sign Up
- Information / state: Anonymous self-service enrollment surface for a learner who independently begins using the photography-learning site. Narrow form column on the near-black ground; no card, no centering.
- Primary action: Establish the learner's own identity so their learning continuity is theirs.
- Supporting actions: Move to Login if the visitor already has an identity; return to Landing.
- Domain entities: New learner identity, enrollment outcome, post-enrollment destination.
- Component responsibilities: Split-screen composition matching Login — full-bleed photograph left with slow Ken Burns scale, narrow form column right with a 48px Playfair Display headline; rectangular inputs and a rectangular bordered submit control; inline enrollment feedback.
- States: Loading — enrollment in progress, submit control reflects pending state. Empty — pristine form with no entered values. Success — learner identity established; the learner continues into the learning content with their own continuity. Error / recovery — enrollment fails (for example, an identity already exists for the supplied details); a clear inline message is shown and the person may correct the input or move to Login. At 375px the split screen stacks with the photograph as a 30vh banner above the form.
Page 4 of 15
Lessons
- Information / state: The browseable body of photography lessons and tutorials — the site's educational content. Anonymous visitors may browse without identity establishment. Presented as a magazine table of contents: lesson number, lesson title, instructor byline, and duration, separated by hairline rules. No card grid.
- Primary action: Read a lesson or tutorial.
- Supporting actions: Move through the index; open a lesson's full content; for a learner with an established identity, continue through material with their own continuity; reach Login or Sign Up from the index.
- Domain entities: Lesson, lesson number, lesson title, instructor byline, duration, lesson body content, lesson imagery, publication state.
- Component responsibilities: Table-of-contents rows with amber lesson numbers in tabular figures, Playfair Display titles, muted Archivo metadata, hairline separators; a small square high-contrast thumbnail anchored to the right of a row that appears only on hover; a single-column lesson reading view at 68ch with images pulled out to full-bleed; the recurring 8px vertical red bar beside section labels.
- States: Loading — index rows and lesson content resolve; rows reveal on scroll with a 200ms opacity fade. Empty — no published lessons are available yet; the index states this plainly and offers no fabricated content. Success — the learner reads a lesson and can continue to the next. Error / recovery — a lesson fails to load; the index remains usable, the failure is stated, and the learner can retry or choose another lesson. At 375px the index and reading view collapse to a single column.
Content Editor
- Information / state: Role-restricted workspace for the content author or instructor to prepare and organize photography education material for publication. Two-pane: a dark document column and a light preview column separated by a hairline divider, both on the surface tone.
- Primary action: Prepare and organize photography lesson or tutorial material and publish it so it is available to learners.
- Supporting actions: Move between the document column and the preview column; revise existing material; review the preview before publication.
- Domain entities: Lesson or tutorial draft, title, lesson number, body content, imagery, instructor byline, duration, publication state.
- Component responsibilities: Dark document column for authoring; light preview column rendering the material as a learner would read it; hairline divider between panes; rectangular controls with 2px solid borders; publication control; the recurring 8px vertical red bar beside section labels.
- States: Loading — the workspace and any existing material resolve. Empty — no material prepared yet; the workspace presents an empty authoring state without fabricated content. Success — material is prepared, organized, and published; it becomes available to learners in Lessons. Error / recovery — saving or publishing fails; the failure is stated clearly, the author's in-progress material is not silently discarded, and the author may retry. At 375px the two panes stack into a single column.
Page 5 of 15
3. Functional Requirements
FR-1 — Photography education website
As a visitor, I should arrive at a website dedicated to learning photography, so that I can find photography education in one place.
- Provenance: explicit.
- Trigger/input: the visitor opens the site.
- Observable result: the site presents itself as a school of photography whose purpose is learning photography.
- Access state: anonymous; no identity required.
- Failure/recovery: if the entry cannot render, the site identity statement and the route into learning content remain available.
- Continuation: the visitor proceeds to the learning content or to enrollment.
- Owner: Landing.
FR-2 — Photography as the content domain
As a learner, I should find that the site's subject matter is photography education, so that everything I read is about photography.
- Provenance: explicit.
- Trigger/input: the learner browses the site's content.
- Observable result: lessons and tutorials are photography instruction.
- Access state: anonymous.
- Failure/recovery: if a lesson cannot be retrieved, the domain remains photography education and the learner can choose another lesson.
- Continuation: the learner continues reading photography material.
- Owner: Lessons.
FR-3 — Browse public lessons without identity establishment
As a learner, I should browse public lessons without establishing identity, so that I can begin learning photography immediately.
- Provenance: required_inference.
- Trigger/input: the learner opens the Lessons index from the Landing entry or directly.
- Observable result: the lesson index and lesson content are readable with no identity established.
- Access state: anonymous; no protected state is exposed.
- Failure/recovery: if the index or a lesson fails to load, the learner is told and may retry or select another lesson.
- Continuation: the learner reads further lessons, or enrolls if they want their own continuity.
- Owner: Lessons.
FR-4 — Read a lesson or tutorial
As a learner, I should read a photography lesson or tutorial, so that I gain and can apply photographic understanding.
- Provenance: required_inference.
- Trigger/input: the learner selects a lesson from the index.
- Observable result: the lesson's instructional content is presented in a single readable column with its imagery.
- Access state: anonymous.
- Failure/recovery: if the lesson body fails to load, the failure is stated and the learner can retry or return to the index.
- Continuation: the learner moves to another lesson or returns to the index.
- Owner: Lessons.
FR-5 — Self-service learner enrollment
As a learner, I should enroll myself, so that my learning continuity is mine.
- Provenance: required_inference.
- Trigger/input: the learner chooses to enroll from the Landing entry, the Lessons index, or Login.
- Observable result: the learner's own identity is established and their continuity is bound to them.
- Access state: anonymous entry; the enrollment interaction is reachable without identity.
- Failure/recovery: if enrollment fails, a clear message is shown, the learner may correct the input or move to Login.
- Continuation: the learner continues into the learning content with their own continuity.
- Owner: Sign Up.
FR-6 — Returning verification
As a returning learner or instructor, I should verify my identity, so that protected work is available to me again.
- Provenance: required_inference.
- Trigger/input: the returning person supplies their identity details on Login.
- Observable result: identity is verified and the protected work that identity owns becomes available.
- Access state: anonymous entry; the verification interaction is reachable without identity.
- Failure/recovery: if verification fails, a clear inline message is shown and the person may retry or move to Sign Up.
- Continuation: the person continues to the protected work their identity owns.
- Owner: Login.
FR-7 — Provisioned or invited instructor access
As a content author or instructor, I should be provisioned or invited, so that I can reach the protected Content Editor.
- Provenance: required_inference.
- Trigger/input: the content author or instructor receives provisioning or an invitation and verifies through Login.
- Observable result: the instructor reaches the role-restricted Content Editor.
- Access state: role-restricted; the Content Editor is not reachable without the instructor's verified identity.
- Failure/recovery: if verification fails, the instructor may retry; if access is not granted, the workspace remains unavailable and no authoring state is exposed.
- Continuation: the instructor prepares material in the Content Editor.
- Owner: Login, then Content Editor.
FR-8 — Prepare and organize photography education material
As a content author or instructor, I should prepare and organize photography lessons or tutorials, so that instructional material exists for learners.
- Provenance: required_inference.
- Trigger/input: the verified instructor opens the Content Editor and authors material in the document column.
- Observable result: lesson or tutorial material — title, lesson number, body content, imagery, byline, duration — is prepared and organized in the workspace.
- Access state: role-restricted to the content author or instructor.
- Failure/recovery: if saving fails, the failure is stated and the instructor's in-progress material is not silently discarded; the instructor may retry.
- Continuation: the instructor reviews the material in the preview column.
- Owner: Content Editor.
FR-9 — Publish material so it is available to learners
As a content author or instructor, I should publish prepared material, so that it is available and usable to learners.
- Provenance: required_inference.
- Trigger/input: the instructor publishes prepared material from the Content Editor.
- Observable result: the material becomes available in Lessons and is readable by learners.
- Access state: role-restricted to the content author or instructor for the publishing action; the published result is publicly readable.
- Failure/recovery: if publication fails, the failure is stated, the material remains in the instructor's workspace, and the instructor may retry.
- Continuation: the instructor returns to preparing further material; learners encounter the published lesson in Lessons.
- Owner: Content Editor, with the published result observable in Lessons.
Page 6 of 15
4. User Personas
Page 7 of 15
Learner (متعلم التصوير الفوتوغرافي)
Product context. The learner is the reason the site exists. They come to nova-project to acquire photography knowledge and skills, and the site's whole surface — the entry, the lesson index, the reading view — is built for them. They are not administrators of anything; their work is reading, looking, and understanding.
Primary goal. To gain and be able to apply photographic understanding, progressing through material at their own pace.
Distinct accepted responsibilities. The learner browses the public lesson index without establishing identity, reads individual lessons and tutorials, and — when they want their own continuity — enrolls themselves. Their responsibility is comprehension and progression, not content production.
Relevant inputs or decisions. Which lesson to open next; whether to keep browsing anonymously or enroll so their learning continuity is theirs; whether to verify on return.
Interactions with other accepted participants. The learner is the recipient of the content author or instructor's published material. The instructor's work becomes the learner's reading material; the learner's side of that handoff is encountering and reading the published lesson in Lessons.
Observable success. The learner has read photography lessons and can apply what they learned. Their continuity, once enrolled, remains theirs on return.
What makes this role different. The learner consumes and progresses. They never author, organize, or publish instructional material, and they never hold the role-restricted authoring workspace.
Page 8 of 15
Content Author / Instructor (مُعدّ المحتوى التعليمي)
Product context. A photography-learning website needs someone who supplies the instructional material learners consume. The instructor works in a protected, role-restricted workspace that is not part of the public reading experience.
Primary goal. To prepare and organize photography lessons or tutorials so they are published and usable on the site.
Distinct accepted responsibilities. The instructor is provisioned or invited, verifies through Login, prepares and organizes material in the Content Editor's document column, reviews it in the preview column, and publishes it so it becomes available to learners.
Relevant inputs or decisions. What to teach and in what order; the lesson title, lesson number, body content, imagery, byline, and duration; whether the previewed material is ready to publish; whether to revise existing material.
Interactions with other accepted participants. The instructor's published material is what the learner reads. The instructor's side of that handoff is publishing; the learner's side is encountering the lesson in Lessons.
Observable success. The learning content is published and usable on the site — it appears in Lessons and learners can read it.
What makes this role different. The instructor produces and organizes. They hold the role-restricted authoring workspace, and their control over published material must remain bound to the correct person across sessions. They do not consume the site as a learner does.
5. Core User Flows
Page 9 of 15
Flow A — A visitor discovers the school and begins learning (Learner)
- The visitor opens nova-project and lands on Landing without establishing identity.
- Landing states that this is a school of photography and that its purpose is learning photography, under the headline
تعلّم أن ترى الضوء and the identity label NOVA — مدرسة التصوير.
- The visitor reads the entry and chooses the hero call to action
ابدأ الدرس الأول.
- The visitor arrives at Lessons and sees the magazine table of contents: amber lesson numbers, Playfair Display titles, instructor bylines and durations in muted Archivo, separated by hairline rules.
- The visitor opens a lesson and reads it in a single column at 68ch, with images pulled out to full-bleed.
- Observable result: the visitor has read photography instruction without ever establishing identity.
- Continuation: the visitor returns to the index and opens another lesson, or decides they want their own continuity and moves to Flow B.
Flow B — A learner enrolls so their continuity is theirs (Learner)
- From Landing or the Lessons index, the learner chooses to enroll and arrives at Sign Up.
- Sign Up presents the split screen: a full-bleed photograph on the left with its slow Ken Burns scale, and a narrow form column on the near-black ground on the right under a 48px Playfair Display headline.
- The learner supplies their details in the rectangular inputs and submits.
- Observable result: the learner's own identity is established and their learning continuity is bound to them.
- Failure/recovery: if enrollment fails — for example, an identity already exists for the supplied details — a clear inline message is shown, the learner corrects the input or moves to Login, and no partial identity is left behind.
- Continuation: the learner continues into Lessons with their own continuity.
Flow C — A returning person verifies and resumes protected work (Learner or Instructor)
- The returning person opens Login without establishing identity.
- Login presents the split screen with the full-bleed photograph and the narrow form column under a 48px Playfair Display headline.
- The person supplies their identity details and submits.
- Observable result: identity is verified and the protected work that identity owns becomes available.
- Failure/recovery: if verification fails, a clear inline message is shown, the person may retry, or move to Sign Up if they have no enrollment yet.
- Continuation: a learner resumes their learning continuity in Lessons; an instructor proceeds to Flow D.
Page 10 of 15
Flow D — An instructor prepares and publishes photography education material (Content Author / Instructor)
- The content author or instructor is provisioned or invited, then verifies through Login (Flow C).
- The instructor reaches the role-restricted Content Editor; the workspace is not reachable without their verified identity.
- The instructor authors material in the dark document column — lesson title, lesson number, body content, imagery, byline, duration.
- The instructor reviews the material in the light preview column, rendered as a learner would read it, across the hairline divider.
- Failure/recovery: if saving fails, the failure is stated clearly and the instructor's in-progress material is not silently discarded; the instructor retries.
- The instructor publishes the prepared material.
- Observable result: the material becomes available in Lessons and is readable by learners.
- Failure/recovery: if publication fails, the failure is stated, the material remains in the instructor's workspace, and the instructor may retry.
- Continuation: the instructor returns to preparing further material; the learner's side of this handoff is encountering and reading the published lesson in Lessons (Flow A, step 5).
Page 11 of 15
6. Visuals Colors and Theme
Muse and headline. Tobias van Schneider — light is the subject, the frame is the teacher. The register is editorial confidence: a photography magazine crossed with a darkroom. Authoritative, aspirational, craft-driven. It must not read as a generic course platform or a blue-button SaaS dashboard.
Mode. Dark mode.
Colour tokens by role.
| Role | Hex | Use |
|---|
| Background (ground) | #0E0E0F | Near-black ground; reads as darkroom paper, not cold tech |
| Surface | #1A1A1C | One step above the ground: lesson cards, forms, editor panes |
| Text | #F4F1EC | Warm off-white body and headline text |
| Primary | #E8382B | Safelight red: logo mark, active nav underline, focus rings, one hero rule, primary CTA fill |
| Accent | #F2B705 | Amber: progress meters, lesson-number numerals, hover underlines on lesson titles — never a large fill |
| Muted | #8A8781 | Metadata, timestamps, instructor bylines |
| Hairline rule | #2A2A2D | 1px separators; 2px solid red for emphasis |
Proportion. ~80% ground/surface, ~12% text, ~5% red, ~3% amber. No blue anywhere; no gradients.
Typography.
- Headings: Playfair Display, weights 700–900, leading 0.95–1.02, tracking −0.02em. Sentence case for editorial headlines; all-caps for section labels at 11–12px with 0.18em tracking. Headlines may run very large and break across lines mid-phrase — the line break is part of the composition.
- Body: Archivo, weights 400/500, 17–18px, line-height 1.6, max measure 68ch.
- Numerals: lesson numbers set in Archivo 600 with tabular figures.
- Scale: 1.333 modular — 128 / 96 / 64 / 48 / 32 / 24 / 18 / 16 / 14 / 12.
- Display sizes use
clamp: hero 56px mobile → 128px desktop; section headlines 40px → 72px; lesson titles 28px → 40px; body 16px → 18px; labels 12px fixed.
Shape language. Sharp corners everywhere — 0px radius on cards, images, buttons, inputs. The only curves are in the photography itself. Rules are 1px hairlines (#2A2A2D) or 2px solid red for emphasis. Images are hard-cropped rectangles, frequently bleeding off one edge of the grid. A recurring 8px-wide vertical red bar sits to the left of section labels like a printer's mark. Buttons are rectangles with a 2px solid border and no shadow.
Spacing rhythm. Asymmetric 12-column editorial grid with a wide left margin (one empty column) on desktop. Generous vertical breathing room between editorial blocks; hairlines rather than boxes to separate content.
Imagery style. Large-scale editorial photography — portraits, hands on cameras, light falling across surfaces, darkroom trays, a single window's shadow. Monochrome or near-monochrome treatment, with one image per section allowed to keep its colour as the accent. Generous cropping: faces cut at the frame edge, a lens filling half the screen. No stock-photo smiling students, no flat illustration, no 3D blobs. Lesson thumbnails are small, square, high-contrast crops that appear on hover.
Readability guarantee. Headlines, wordmarks, labels, numbers, and card 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, with no other element covering any part of them. Imagery and decoration may be cropped, bled off an edge, overlapped or cut as the direction asks, as long as they cover no readable text or control.
Page 12 of 15
7. Signature Design Concept
The darkroom spread. The public entry is composed as a single magazine spread rather than a hero banner.
A full-bleed near-monochrome photograph — a photographer's hands adjusting a lens, lit from one side — occupies the full viewport width and the left 8 of 12 columns, bleeding off the left edge of the screen. Overlapping the image's right edge, set in Playfair Display at clamp(56px, 9vw, 128px) with tight leading, the headline تعلّم أن ترى الضوء breaks across three lines in #F4F1EC. Beneath it, a 1px safelight-red hairline runs the width of columns 2–9. In the bottom-left corner of the image, a rectangle CTA with a 2px #E8382B border and off-white text reads ابدأ الدرس الأول. Top-right of the viewport, a small all-caps amber label reads NOVA — مدرسة التصوير.
There is no centered headline, no subtext paragraph, no blue button, no gradient. The composition is asymmetric, the type is enormous, and the chrome is nearly absent — because the eye is being trained on the image, which is the whole point of a photography school. The image crossfades between three photographs on a slow loop.
The same gesture repeats down the site: the 8px vertical red bar beside every section label, the magazine table of contents on Lessons, and the split-screen auth pages — one visual system, applied editorially.
Page 13 of 15
8. Interaction Model & Motion Direction
Interaction Model: Animated
Motion Tempo: restrained
Hero Dimensionality: flat
Landing Hero Motion Brief.
- Focal subject. A single large near-monochrome photograph — a photographer's hands adjusting a lens, lit from one side — occupying the full viewport width and the left 8 of 12 columns, bleeding off the left edge.
- Input → transformation → outcome thesis. As the entry loads, the hero photograph crossfades between three photographs on a 6s loop while the headline reveals line-by-line via a 40ms stagger with a 12px upward translate. The visitor's eye is led from the image to the headline to the red hairline to the CTA; the outcome is that the visitor understands this is a school of photography and can enter the first lesson.
- Motion vocabulary. Slow, editorial. A 1.2s crossfade between three photographs on a 6s loop. Headline line-by-line reveal with a 40ms stagger and a 12px upward translate. Lesson list rows reveal on scroll with a 200ms opacity fade and no translate. Hover on a lesson title swaps the amber underline in from left over 300ms and shifts the row's hover thumbnail with a 400ms ease-out. Auth pages run a very slow 20s Ken Burns scale from 1.0 to 1.04. No bounce, no spring, no particles.
- Composed first frame. The first photograph fully resolved, bleeding off the left edge; the headline's first line already set in
#F4F1EC; the 1px red hairline drawn beneath it; the bordered CTA legible bottom-left; the amber label top-right. Nothing centered, nothing covered.
- Reduced-motion state. With
prefers-reduced-motion, crossfades become instant swaps, staggers collapse to a single fade, and the Ken Burns scale stops. The composed first frame is the resting state, and all text and controls remain whole and readable.
9. Non-Functional Requirements
- NFR-1 — Public readability without identity. Lessons content must be readable with no identity established, so that a learner can begin learning photography immediately. Provenance: required_inference from the accepted public-browsing requirement. Rationale: the accepted journey requires anonymous reading to be genuinely usable, not gated.
- NFR-2 — Protected authoring isolation. The Content Editor must not expose authoring state to anyone without the instructor's verified identity. Provenance: required_inference from the role-restricted access contract. Rationale: the instructor's control over published material must remain bound to the correct person.
- NFR-3 — Identity continuity. A learner's enrollment continuity and an instructor's authoring control must persist across sessions and remain bound to the correct person. Provenance: required_inference. Rationale: durable, person-bound continuity is the only reason identity exists in this product.
- NFR-4 — Readable text and controls at every viewport. Headlines, wordmarks, labels, numbers, and card text and controls must stay entirely inside the viewport and their container at 375px, 768px and 1280px, wrapping or scaling to fit, with no other element covering any part of them. Provenance: explicit user design constraint. Rationale: legibility is a hard constraint that outranks decorative cropping.
- NFR-5 — Reduced-motion compliance. All motion must respect
prefers-reduced-motion: crossfades become instant swaps, staggers collapse to a single fade, and Ken Burns stops. Provenance: explicit creative direction. Rationale: accessibility and the direction's own stated behaviour.
- NFR-6 — No blue, no gradients, no rounded corners. The palette must contain no blue or indigo, no gradients may be used, and border-radius must be 0px across the system. Provenance: explicit creative direction. Rationale: the darkroom register depends on it.
- NFR-7 — Backend integration. The product requires backend integration to serve lessons, hold enrollment and verification, and persist authored material and its publication state. Provenance: explicit planning scope (
requires_backend_integration: true).
Page 14 of 15
10. Tech Stack
- Frontend: React, custom UI, dark-mode editorial layout as specified in sections 6–8.
- Backend: Python / FastAPI, serving lessons, enrollment, verification, and authored material with its publication state.
- Storage: a persistent store appropriate to lessons, learner identities, and authored material with publication state.
- Containerization: Docker and docker-compose for local and deployment packaging.
- Kubernetes: not required by any stated constraint; omit unless deployment demands it.
11. Assumptions and Constraints
- A-1. The site's subject matter and content domain is photography education; no adjacent domain is in scope. (explicit)
- A-2. The active human roles are exactly two: the Learner and the Content Author / Instructor. No other human role is introduced. (from the closed persona catalog)
- A-3. The page inventory is exactly five destinations — Landing, Login, Sign Up, Lessons, Content Editor — with the access stated in section 2a. (from the versioned page contract)
- A-4. Identity is application-owned and is required only for durable, person-bound continuity: learner enrollment continuity and instructor authoring control. (required_inference)
- A-5. Login and Sign Up are anonymously reachable; the interaction that establishes access cannot sit behind the access it establishes. (required_inference)
- A-6. The content author or instructor is provisioned or invited rather than self-enrolling into the authoring role. (required_inference)
- A-7. No future-horizon requirements were stated; nothing beyond the current scope is committed. (explicit absence)
- A-8. No social, critique, commerce, certification, portfolio, gear-retail, or community capability is part of this product. (explicit exclusion by absence of any such requirement)
- A-9. The creative direction is authoritative for palette, typography, shape, layout, imagery and motion; the user's own design constraints outrank catalogue defaults. (explicit)
Page 15 of 15
12. Glossary
- nova-project — the website dedicated to learning photography (موقع إلكتروني خاص بتعلم التصوير الفوتوغرافي).
- Learner (متعلم التصوير الفوتوغرافي) — the active human role that browses and reads photography lessons and tutorials and may enroll for their own continuity.
- Content Author / Instructor (مُعدّ المحتوى التعليمي) — the active human role that prepares, organizes, and publishes photography education material.
- Lesson / Tutorial — a unit of photography instruction with a lesson number, title, body content, imagery, instructor byline, and duration.
- Lesson index — the magazine table-of-contents presentation of published lessons on the Lessons page.
- Content Editor — the role-restricted two-pane workspace where the instructor authors material in a dark document column and reviews it in a light preview column.
- Publication state — whether a prepared lesson is available to learners in Lessons.
- Enrollment — the learner's self-service establishment of their own identity so their learning continuity is theirs.
- Returning verification — the Login interaction by which a returning learner or instructor proves identity so protected work becomes available again.
- Safelight red —
#E8382B, the primary accent, used for the logo mark, active nav underline, focus rings, one hero rule, and the primary CTA fill.
- Amber —
#F2B705, the secondary accent, used sparingly for progress meters, lesson-number numerals, and hover underlines on lesson titles.
- Printer's mark — the recurring 8px-wide vertical red bar placed to the left of every section label.
No comments yet. Be the first!