Domain — index
The project's business source of truth. Every idea, rule or business decision is recorded here and kept up to date.
Vision
Four tools built on the same editor library, from geometry to business use:
| Tool | User | Does | Does not |
|---|---|---|---|
| Symbol Editor | symbol designer | draws the shapes of a symbol with strict, numeric tools; places ports; declares the animatable parts | business meaning, business rules |
| Configurator | business configurator | builds configuration trees: interfaces, property groups, default values, rules driving the symbol's animations; defines business types and business symbol libraries | change a symbol's geometry |
| View Editor | business user (synoptic view designer) | places business symbols (quarter turns), overrides default values with a live preview, chooses which configured properties show in pop-ups, draws pipes | add a property that the configuration does not define; change a symbol's geometry |
| Drawing tools (in the View Editor) | business user | draws static drawings with more freedom; saves them into a drawing library shared between projects | parameters, animations |
From one project to another, the same symbols can be used by different business libraries: the library gives the symbol its business meaning for that project.
Purpose
- A product, not a demo: a library and editors that teams drawing synoptic views can adopt with confidence, doing better for this work than general vector editors.
- Trust through quality: every behavior specified, sourced, tested and documented; summary documents let a reader understand the project without reading everything.
- Portable mathematics: the library computes its own geometry (never through the SVG or DOM APIs), runs in any JavaScript engine — browser or server — and can be transcribed into another language if speed requires it (ADR-0025).
- A finished free V1, then a paid pro edition (ADR-0030): new features after V1 go to the pro edition, kept in editions.
- Built by an agent: Claude Code writes every change, the Product Owner reviews; outside input comes through issues (ADR-0026).
Principles
- Schematic: a synoptic view must stay readable.
- Logical: every symbol shape is described by numbers (corners, sizes, radii, angles), not by a hand gesture.
- Orthogonal: pipes are horizontal and vertical.
- Integer: every input value is an integer; derived geometry and animation values may not be.
- Configured, not hand-made: a view only uses what the configuration defines.
Files
| File | Content |
|---|---|
| shapes.md | shape model, rotation, corner radius, shape tools, booleans, strokes, text, static drawings |
| symbols-and-views.md | symbols, ports, animations, views, pipes |
| configuration.md | configurator, configuration trees, interfaces, property groups, business types, libraries |
| interaction.md | tools, selection, node editing, snapping, alignment, colors, tree |
| editions.md | free V1 and pro edition: where the project stops, pro ideas kept out of V1 (ADR-0030) |
Glossary
The French term is kept: it is the working vocabulary of the target users.
| Term | French | Definition |
|---|---|---|
| Shape | Forme | closed contour of vertices with a radius per vertex, rendered as a <path> |
| Vertex / Node | Sommet / Nœud | point of the contour: integer when typed, fractional when derived (ADR-0003) or kept by a free shape from a converted polygon (ADR-0033) |
| Free shape | Forme libre | a contour stored as its corners (a point and its radius) in a box of their own, with a width and a height that stretch it without loss; the rectangle tool makes one (ADR-0032); a regular polygon becomes one by a button, unmoved (ADR-0033) |
| Corner radius | Rayon de coin, arrondi | radius of the arc rounding a vertex, one per vertex (ADR-0029) |
| Fillet | Congé | arc tangent to both edges of a vertex |
| Setback | Recul | distance from the vertex to the fillet's tangent point, r / tan(θ/2) |
| Tangent point | Point de tangence | point where a fillet touches an edge, at the setback from the vertex |
| Effective radius | Rayon effectif | radius actually drawn after clamping (ADR-0007); derived at every evaluation, never stored (Q8) |
| Requested radius | Rayon demandé | radius typed by the user and stored in the model; the effective radius derives from it (Q8) |
| Spike | Pointe | vertex where the contour turns back on itself (turning angle ±π); its fillet consumes it (Q16) |
| Stroke | Contour | band of fixed width along the outline |
| Stroke alignment | Alignement du contour | inner, center, outer |
| Boolean operation | Opération booléenne | union, difference, intersection, exclusion, division, cut path |
| Shape builder | Shape builder | tool building regions from the edges and intersections of selected shapes |
| Symbol | Symbole | group (<g>) of shapes + ports + animatable parts, without business meaning |
| Animation | Animation | change of a symbol part driven by a property value: color, blinking, opacity, visibility, partial fill, rotation |
| Port | Point de connexion | point of a symbol where a pipe connects |
| Configuration tree | Arbre de configuration | tree of configuration nodes carrying interfaces and property groups |
| Interface | Interface | named set of properties with rules driving a symbol's animations (e.g. isRunning → a zone changes color) |
| Property | Propriété | typed value with a default value, member of an interface or a property group |
| Property group | Groupe de propriétés | named list of properties used together (e.g. the pop-up group) |
| Business type | Type métier | node of a configuration tree, e.g. Pump → Positive displacement pump → Gear pump |
| Business symbol | Symbole métier | symbol + selected configuration sub-trees + business name, e.g. "gear pump" |
| Business library | Bibliothèque métier | set of business symbols used by a project |
| Instance | Instance | occurrence of a business symbol in a view |
| View | Vue synoptique | assembly of instances, pipes and static drawings |
| Pipe | Tuyau | orthogonal connector between two ports |
| Waypoint | Point de passage | bend of a pipe |
| Static drawing | Dessin | static, non-parameterized drawing made in the View Editor, reusable through the drawing library |
| Drawing library | Bibliothèque de dessins | drawings shared between projects |
| Snapping | Magnétisme | automatic attachment to a remarkable position |
| Bounding box | Boîte englobante | smallest axis-aligned rectangle containing an object |
| Position | Position | top-left of a shape's box before it turns, stored with its angle; shown and typed as the top-left of its straight box (F04, ADR-0035) |
| Straight box | Boîte droite | bounding box of a drawn shape, rounded corners included, as a browser's getBBox; its top-left is shown and typed as the shape's position (F04) |
| Turned box | Boîte tournée | a shape's box turned with it by its angle, shown as its selection (F04) |
| Stretched polygon | Polygone étiré | a regular polygon with its "stretched" option on: it touches the four sides of its box, its sides as even as possible (F06, research request 0011) |
| Anchor | Ancre | place of a shape in its box, one of 9: a horizontal (left, center, right) and a vertical (top, center, bottom) alignment, min / mid / max in the model (F07); not the stroke alignment, the text anchor (start, middle, end), the Align command nor the snapping alignment guides |
Settled questions
| # | Question | Decision | Trace |
|---|---|---|---|
| Q1 | Regular polygon inside w×h | uniform, stays regular, flat base | DERIV-regular-polygon-fit |
| Q2 | Booleans | non-destructive | ADR-0006 |
| Q3 | Radius conflict | local proportional reduction | ADR-0007 |
| Q5 | Storage and exchange | local only in the free V1: the user opens a working folder on their computer and saves files one by one; no server, not even a local one, and no online service — servers belong to the pro edition (Product Owner, 2026-10-11, replacing the local server of 2026-10-08; ADR-0030) | configuration.md §6, editions.md §1 |
| Q6 | Instance rotation | quarter turns, pivot = origin | ADR-0008 |
| Q8 | Radius entered too large | requested value stored, effective value derived | shapes.md §2 |
| Q10 | Output precision and tolerance | SVG_DECIMALS = 5; EPSILON = 1e-9 | shapes.md §1 |
| Q11 | Contour orientation and starting vertex | clockwise on screen (SVG frame, y down), starting at the top-left vertex (a regular polygon at the right end of its base, Q18); a contour is cyclic: the last vertex joins the first, and every per-vertex computation wraps around | shapes.md §1 |
| Q12 | Pen of the drawing tools | Figma-like pen with Bézier handles, in static drawings only | ADR-0018 |
| Q13 | Rotation animation | property range remapped to the animation range (e.g. 0–100 → 0–90°, 0–180°, 0–360°) | symbols-and-views.md §3 |
| Q14 | Configuration tree scope | a selected node brings its own and its ancestors' options; sub-trees of other trees can be added | configuration.md §2 |
| Q15 | Shape of size 0 or negative | negative forbidden; 0 allowed (degenerate shape, useful in animations); asked for the rectangle, applied to the regular polygon in the F02 refinement | shapes.md §3 |
| Q16 | Rounding of a spike (a vertex where the contour turns back on itself, turning angle ±π) | the fillet consumes the spike, as today: rounding is allowed to eat length (Product Owner, 2026-10-09; Figma's behavior assumed alike, not verified) | shapes.md §2 |
| Q17 | Effective radius where no corner can be rounded (size 0, aligned vertex) | keep it as is: the requested radius is kept on the vertex and shown "as requested"; it applies as soon as the shape grows (Product Owner, 2026-10-09) | shapes.md §2 |
| Q18 | Starting vertex of a contour without a single top-left vertex (a triangle pointing up) | no strict rule at creation: the topmost vertex, the leftmost on a tie (the top-left of a rectangle, Q11), clockwise (Product Owner, 2026-10-09); a regular polygon starts at the right end of its flat base, then its left end, so that the base keeps its numbers when the number of corners changes (Product Owner, 2026-10-11, F08) | shapes.md §1 |
| Q19 | Largest number of corners of a regular polygon | 12 (Product Owner, 2026-10-09): symbols use up to 8 sides (research 0004), and beyond 12 a polygon is hardly told from a circle; 12 is also unchanged by a quarter turn (ADR-0008); raising it later invalidates nothing | shapes.md §3 |
| Q20 | Largest size of a shape | no upper limit in the model nor the calculations, only 0 below; EPSILON stays absolute (errors about 1e-16 × the size: under it up to a few million units); good practice: one user unit is one screen pixel, views drawn at the screen's size and the SVG scaled for a far screen; the interface caps sizes at 100 000 (Product Owner, 2026-10-09) | shapes.md §1 |
| Q21 | Layout box | yes: a rectangular box placing its children by a 3 × 3 anchor or stacking them; full rules in shapes.md §3; its own epic E13, before booleans; name still to choose (Product Owner, 2026-10-10) | shapes.md §3 |
| Q22 | Epics of the free V1 | every epic of the backlog table (Product Owner, 2026-10-11): E11 keeps saving and reloading files in the working folder, without any server; E07 publishes libraries locally, never online; an epic for a design system may be added later, once the Product Owner can describe it | editions.md §1 |
| Q27 | Points of a free shape after F09 | fractions allowed until edited: a converted polygon keeps its exact points and size and does not move; a point typed lands on integers (on a turned shape, in the drawing: ADR-0035); the x and y typed are the coordinates of the shape in its SVG, neither the screen's nor those of its inner box; each point is kept with its radius, a corner (Product Owner, 2026-10-11) | shapes.md §3, F08 |
| Q28 | Free shapes after editing (F08) | a coordinate typed is an integer (on a turned shape, in the drawing: ADR-0035), the other keeps its value; points and size keep their fractions through a stretch, a point added or a deletion, nothing rounded, so that editing is never destructive; a deleted point's neighbours are joined by a straight edge (Product Owner, VAL-005, 2026-10-11, ADR-0034) | interaction.md §3, F08 |
| Q29 | Degenerate free shapes (F08) | not refused, never changed on their own: points on one slanted line allowed; two points at the same place flagged in the list of points, asking whether to delete one; edges crossing allowed and flagged — the flags come with the editor applications; typed coordinates not capped, the area of a symbol being its own question (Q30) (Product Owner, VAL-005, 2026-10-11) | interaction.md §3 |
Open questions
| # | Question | File |
|---|---|---|
| Q4 | Ellipses and curves with handles: needed in symbols, yes (Product Owner, 2026-10-12: a round shape in a long box is an ellipse, a propeller symbol needs Bézier curves with two handles); how they are drawn, stroked and combined, outside the ADR-0001 scope, is decided at E14's first spike | shapes.md |
| Q7 | Undo / redo: command-based history, confirmed? | interaction.md |
| Q9 | Corner radius on vertices created by a boolean | shapes.md |
| Q23 | Application shell of V1: a web view in a desktop app (Electron, or a Rust-based one), with all computation in the web view and native code only to save files? | editions.md §1 |
| Q24 | A foreignObject tool (e.g. an iframe) inside a given frame: in the free V1 or pro? The Product Owner inclines to V1, the tool being basic rather than advanced. It contradicts ADR-0002 and the allowed SVG primitives; a new ADR either way | symbols-and-views.md |
| Q25 | Corner radii of a layout box (E13): one radius for the whole box, or one per corner as any rectangle since F03 (ADR-0029)? | shapes.md §3 |
| Q26 | Memory of the radii of removed corners: a polygon of 12 corners with different radii becomes a triangle, then 12 again — do the 9 corners get their radii back (a wish of the Product Owner at VAL-004)? Today they come back sharp, as decided at the refinement of F03 (F03.AC3). In which feature, and is it kept when the file is saved? | shapes.md §2 |
| Q30 | When a symbol is saved, are its shapes moved so that the top-left of their bounding box is at (0, 0), giving positive coordinates, or its center at (0, 0), or left where they are? (Product Owner, VAL-005 of F08: no preference among the three; to settle with saving, E11) | symbols-and-views.md §1 |
| Q31 | Text (E15): native SVG <text> and its own features, or HTML text in a foreignObject (related to Q24), and the drawbacks of each; which fonts and how a missing one is handled; how the size of a text is measured without the DOM (ADR-0025) | shapes.md |