|
1 | | -//! Schema designer view. Phase 3 placeholder; Phase 4 ports the mockup. |
| 1 | +//! Schema designer: a static ER-style canvas of collections and relationships. |
| 2 | +//! Placeholder SVG (no real diagramming library). |
| 3 | +
|
2 | 4 | use dioxus::prelude::*; |
3 | | -use crate::views::ViewPlaceholder; |
4 | 5 |
|
5 | 6 | #[component] |
6 | 7 | pub fn Designer() -> Element { |
7 | | - rsx! { ViewPlaceholder { title: "Designer", note: "Schema designer placeholder — Phase 4." } } |
| 8 | + rsx! { |
| 9 | + div { class: "view active", |
| 10 | + div { style: "height: 100%; display: grid; grid-template-rows: auto 1fr;", |
| 11 | + div { style: "padding: 10px 16px; background: var(--bg-secondary); border-bottom: 0.5px solid var(--border-mid); display: flex; align-items: center; gap: 10px;", |
| 12 | + button { class: "btn small", "+ Collection" } |
| 13 | + button { class: "btn small", "+ Relationship" } |
| 14 | + div { style: "margin-left: auto; display: flex; gap: 6px;", |
| 15 | + button { class: "btn small ghost", "Auto-layout" } |
| 16 | + button { class: "btn small ghost", "Export DDL" } |
| 17 | + button { class: "btn small primary", "Apply changes (3 pending)" } |
| 18 | + } |
| 19 | + } |
| 20 | + div { class: "designer-canvas", |
| 21 | + svg { view_box: "0 0 1000 600", style: "width:100%; height:100%;", |
| 22 | + path { d: "M180,180 L380,180", stroke: "var(--text-tertiary)", stroke_width: "1", fill: "none" } |
| 23 | + path { d: "M280,260 L280,360", stroke: "var(--text-tertiary)", stroke_width: "1", fill: "none" } |
| 24 | + path { d: "M480,260 L660,360", stroke: "var(--text-tertiary)", stroke_width: "1", fill: "none" } |
| 25 | + path { d: "M180,460 L380,460", stroke: "var(--text-tertiary)", stroke_width: "1", fill: "none" } |
| 26 | + |
| 27 | + g { transform: "translate(60, 100)", |
| 28 | + rect { class: "designer-table", width: "220", height: "160", rx: "6" } |
| 29 | + text { x: "14", y: "22", font_family: "var(--font-sans)", font_size: "12", font_weight: "600", fill: "var(--text-primary)", "users" } |
| 30 | + text { x: "200", y: "22", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "end", "DOCUMENT" } |
| 31 | + line { x1: "0", y1: "34", x2: "220", y2: "34", stroke: "var(--border-mid)", stroke_width: "0.5" } |
| 32 | + text { x: "14", y: "54", font_family: "var(--font-mono)", font_size: "11", fill: "var(--text-primary)", "_id" tspan { fill: "var(--text-tertiary)", " string" } } |
| 33 | + text { x: "14", y: "72", font_family: "var(--font-mono)", font_size: "11", fill: "var(--text-primary)", "name" tspan { fill: "var(--text-tertiary)", " string" } } |
| 34 | + text { x: "14", y: "90", font_family: "var(--font-mono)", font_size: "11", fill: "var(--text-primary)", "email" tspan { fill: "var(--text-tertiary)", " string · unique" } } |
| 35 | + text { x: "14", y: "108", font_family: "var(--font-mono)", font_size: "11", fill: "var(--text-primary)", "country" tspan { fill: "var(--text-tertiary)", " char(2)" } } |
| 36 | + text { x: "14", y: "126", font_family: "var(--font-mono)", font_size: "11", fill: "var(--text-primary)", "created_at" tspan { fill: "var(--text-tertiary)", " timestamp" } } |
| 37 | + } |
| 38 | + g { transform: "translate(380, 100)", |
| 39 | + rect { class: "designer-table", width: "220", height: "160", rx: "6" } |
| 40 | + text { x: "14", y: "22", font_family: "var(--font-sans)", font_size: "12", font_weight: "600", fill: "var(--text-primary)", "orders" } |
| 41 | + text { x: "200", y: "22", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "end", "STRICT" } |
| 42 | + line { x1: "0", y1: "34", x2: "220", y2: "34", stroke: "var(--border-mid)", stroke_width: "0.5" } |
| 43 | + text { x: "14", y: "54", font_family: "var(--font-mono)", font_size: "11", "id" tspan { fill: "var(--text-tertiary)", " int8 · pk" } } |
| 44 | + text { x: "14", y: "72", font_family: "var(--font-mono)", font_size: "11", "user_id" tspan { fill: "var(--text-tertiary)", " string · fk" } } |
| 45 | + text { x: "14", y: "90", font_family: "var(--font-mono)", font_size: "11", "total" tspan { fill: "var(--text-tertiary)", " decimal(10,2)" } } |
| 46 | + text { x: "14", y: "108", font_family: "var(--font-mono)", font_size: "11", "status" tspan { fill: "var(--text-tertiary)", " enum" } } |
| 47 | + text { x: "14", y: "126", font_family: "var(--font-mono)", font_size: "11", "placed_at" tspan { fill: "var(--text-tertiary)", " timestamptz" } } |
| 48 | + } |
| 49 | + g { transform: "translate(180, 360)", |
| 50 | + rect { class: "designer-table", width: "200", height: "140", rx: "6" } |
| 51 | + text { x: "14", y: "22", font_family: "var(--font-sans)", font_size: "12", font_weight: "600", "events" } |
| 52 | + text { x: "180", y: "22", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "end", "DOCUMENT" } |
| 53 | + line { x1: "0", y1: "34", x2: "200", y2: "34", stroke: "var(--border-mid)", stroke_width: "0.5" } |
| 54 | + text { x: "14", y: "54", font_family: "var(--font-mono)", font_size: "11", "_id" tspan { fill: "var(--text-tertiary)", " string" } } |
| 55 | + text { x: "14", y: "72", font_family: "var(--font-mono)", font_size: "11", "user_id" tspan { fill: "var(--text-tertiary)", " string" } } |
| 56 | + text { x: "14", y: "90", font_family: "var(--font-mono)", font_size: "11", "type" tspan { fill: "var(--text-tertiary)", " string" } } |
| 57 | + text { x: "14", y: "108", font_family: "var(--font-mono)", font_size: "11", "ts" tspan { fill: "var(--text-tertiary)", " timestamp" } } |
| 58 | + } |
| 59 | + g { transform: "translate(660, 360)", |
| 60 | + rect { class: "designer-table", width: "200", height: "140", rx: "6" } |
| 61 | + text { x: "14", y: "22", font_family: "var(--font-sans)", font_size: "12", font_weight: "600", "products" } |
| 62 | + text { x: "180", y: "22", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "end", "STRICT" } |
| 63 | + line { x1: "0", y1: "34", x2: "200", y2: "34", stroke: "var(--border-mid)", stroke_width: "0.5" } |
| 64 | + text { x: "14", y: "54", font_family: "var(--font-mono)", font_size: "11", "sku" tspan { fill: "var(--text-tertiary)", " string · pk" } } |
| 65 | + text { x: "14", y: "72", font_family: "var(--font-mono)", font_size: "11", "name" tspan { fill: "var(--text-tertiary)", " string" } } |
| 66 | + text { x: "14", y: "90", font_family: "var(--font-mono)", font_size: "11", "price" tspan { fill: "var(--text-tertiary)", " decimal(10,2)" } } |
| 67 | + } |
| 68 | + text { x: "280", y: "172", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "middle", "PLACED · 1:N" } |
| 69 | + text { x: "180", y: "452", font_family: "var(--font-mono)", font_size: "9", fill: "var(--text-tertiary)", text_anchor: "middle", "EMITTED" } |
| 70 | + } |
| 71 | + } |
| 72 | + } |
| 73 | + } |
| 74 | + } |
8 | 75 | } |
0 commit comments