From 7bee41847fed729a7abdb92ed9f8cc5aa1597be4 Mon Sep 17 00:00:00 2001 From: lucaronin Date: Sat, 21 Feb 2026 16:50:39 +0100 Subject: [PATCH 1/8] design: trash notes wireframes Added 4 frames to design/trash-notes.pen: - Sidebar filter showing Trash with count badge and destructive color - Note list view with TRASHED badge and 30-day warning state - Relationship indicator with trash icon prefix for trashed refs - 30-day auto-delete warning banner Co-Authored-By: Claude Opus 4.6 --- design/trash-notes.pen | 6084 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 6084 insertions(+) create mode 100644 design/trash-notes.pen diff --git a/design/trash-notes.pen b/design/trash-notes.pen new file mode 100644 index 00000000..fab9b7d7 --- /dev/null +++ b/design/trash-notes.pen @@ -0,0 +1,6084 @@ +{ + "version": "2.8", + "children": [ + { + "type": "frame", + "id": "qHhaj", + "x": 68, + "y": 3385, + "name": "Laputa App — Full Layout (Light)", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 1440, + "height": 900, + "fill": "$--background", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "yVQFF", + "name": "macOS Title Bar", + "width": "fill_container", + "height": 38, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "0MCME", + "name": "trafficLights", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "c2AU6", + "name": "closeBtn", + "fill": "#FF5F57", + "width": 12, + "height": 12 + }, + { + "type": "ellipse", + "id": "h0zbh", + "name": "minimizeBtn", + "fill": "#FEBC2E", + "width": 12, + "height": 12 + }, + { + "type": "ellipse", + "id": "tcqbu", + "name": "maximizeBtn", + "fill": "#28C840", + "width": 12, + "height": 12 + } + ] + } + ] + }, + { + "type": "frame", + "id": "oHDfa", + "name": "Content", + "width": "fill_container", + "height": "fill_container", + "children": [ + { + "type": "frame", + "id": "ZTOSJ", + "name": "Panel: Sidebar", + "clip": true, + "width": 250, + "height": "fill_container", + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": 0, + "fill": "$--sidebar-border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "4wMva", + "name": "Filters", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 1, + "padding": [ + 8, + 8, + 16, + 8 + ], + "children": [ + { + "type": "frame", + "id": "Q78hg", + "name": "filterAll", + "width": "fill_container", + "fill": "#4a9eff18", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "5ip58", + "name": "leftAll", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "PXpWi", + "name": "iconAll", + "width": 18, + "height": 18, + "iconFontName": "tray-fill", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--primary" + }, + { + "type": "text", + "id": "NWprl", + "name": "fAllTxt", + "fill": "$--primary", + "content": "Untagged", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "NZ9Dv", + "name": "countAll", + "height": 20, + "fill": "$--primary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mPlUV", + "name": "badgeAllTxt", + "fill": "$--primary-foreground", + "content": "24", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "YLWsY", + "name": "filterUntagged", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "k7LIr", + "name": "leftUntagged", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "FMVlh", + "name": "untaggedIcon", + "width": 18, + "height": 18, + "iconFontName": "cardholder", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "5XllD", + "name": "untaggedTxt", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "aSpGv", + "name": "countUntagged", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qZUFt", + "name": "untaggedBadgeTxt", + "fill": "$--muted-foreground", + "content": "6", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Jahon", + "name": "filterTrash", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "IOiBI", + "name": "leftTrash", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "X6F74", + "name": "trashIcon", + "width": 18, + "height": 18, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "vRMH9", + "name": "trashTxt", + "fill": "$--foreground", + "content": "Archive", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "JMpkq", + "name": "countTrash", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "0cKm4", + "name": "trashBadgeTxt", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "6RMbq", + "name": "filterChanges", + "width": "fill_container", + "cornerRadius": 6, + "gap": 6, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "DpdBu", + "name": "leftChanges", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "VTusA", + "name": "iconChanges", + "width": 18, + "height": 18, + "iconFontName": "git-branch", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "qvq5O", + "name": "fChangesTxt", + "fill": "$--foreground", + "content": "Changes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "qAMES", + "name": "countChanges", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nkzVk", + "name": "badgeChangesTxt", + "fill": "$--muted-foreground", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "SSEUP", + "name": "Sections", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "padding": [ + 8, + 0 + ], + "children": [ + { + "type": "frame", + "id": "nM2Cn", + "name": "projGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6, + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "ouIl9", + "name": "projHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Rx1Cp", + "name": "leftProj", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "t5WJJ", + "name": "projIcon", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "S3sGC", + "name": "projLabel", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "FKwSS", + "name": "projChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "IHzFh", + "name": "projItem1", + "width": "fill_container", + "fill": "$--accent-red-light", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "iiFcl", + "name": "proj1Txt", + "fill": "$--accent-red", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "LdaU9", + "name": "projItem2", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "XRll4", + "name": "proj2Txt", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Vmykd", + "name": "projItem3", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "0PqQQ", + "name": "proj3Txt", + "fill": "$--muted-foreground", + "content": "AI Habit Tracker", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "WAQtn", + "name": "respGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "aSi3l", + "name": "respHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "lov6B", + "name": "leftResp", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Em4ns", + "name": "respIcon", + "width": 18, + "height": 18, + "iconFontName": "medal", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "WPRCo", + "name": "respLabel", + "fill": "$--foreground", + "content": "Responsibilities", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "6hDdQ", + "name": "respChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "FmUu0", + "name": "procGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "Dat6o", + "name": "respHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "iJlgx", + "name": "leftResp", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "I2J1R", + "name": "respIcon", + "width": 18, + "height": 18, + "iconFontName": "arrows-clockwise", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "AToF0", + "name": "Procedures", + "fill": "$--foreground", + "content": "Procedures", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "meEIL", + "name": "procChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "T4NG2", + "name": "peopleGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "Q01iL", + "name": "peopleHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "eE6Ca", + "name": "leftPeople", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "jOmVa", + "name": "peopleIcon", + "width": 18, + "height": 18, + "iconFontName": "users", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "caelD", + "name": "peopleLbl", + "fill": "$--foreground", + "content": "People", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "TkuS1", + "name": "peopleChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "BY1Qx", + "name": "eventsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "v28d8", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "TPyOc", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "ELRMi", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "calendar-blank", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "OlI6Q", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Events", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "TZwK8", + "name": "eventsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trKNW", + "name": "topicsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "qdbZ3", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "JP83M", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Q57kF", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "DeVxP", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Topics", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "nzAcm", + "name": "topicsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "ZWXuk", + "name": "topicsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "CQaLg", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "2SMcN", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "0N8UH", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "6XB2H", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "NmBSB", + "name": "topicsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "2cQBp", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "0f10v", + "name": "leftEvents", + "gap": 8, + "padding": [ + 8, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "xBv1X", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "viWPL", + "name": "eventsLbl", + "fill": "$--muted-foreground", + "content": "Create new type", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "8lLHp", + "name": "Commit Area", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "top": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "padding": 12, + "children": [ + { + "type": "frame", + "id": "YYjuy", + "name": "commitBtn", + "width": "fill_container", + "fill": "$--primary", + "cornerRadius": 6, + "gap": 6, + "padding": [ + 8, + 16 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "YF44G", + "name": "commitIcon", + "width": 14, + "height": 14, + "iconFontName": "git-commit-horizontal", + "iconFontFamily": "lucide", + "fill": "$--primary-foreground" + }, + { + "type": "text", + "id": "vpzJm", + "name": "commitTxt", + "fill": "$--primary-foreground", + "content": "Commit & Push", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "vhU5z", + "name": "commitBadge", + "height": 18, + "fill": "#ffffff40", + "cornerRadius": 9, + "padding": [ + 0, + 5 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "sdvYT", + "name": "commitBadgeTxt", + "fill": "$--white", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "IIvWr", + "name": "Resize Handle", + "fill": "$--border", + "width": 1, + "height": "fill_container" + }, + { + "type": "frame", + "id": "zFIJv", + "name": "Panel: NoteList", + "clip": true, + "width": 300, + "height": "fill_container", + "fill": "$--card", + "stroke": { + "align": "inside", + "thickness": 0, + "fill": "$--border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "uZJVN", + "name": "NoteList Header", + "width": "fill_container", + "height": 45, + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "padding": [ + 14, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hmbdb", + "name": "nlTitle", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "m6AeW", + "name": "nlActions", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "8gMXE", + "name": "searchIcon", + "width": 16, + "height": 16, + "iconFontName": "magnifying-glass", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "YqvSN", + "name": "plusIcon", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "0aJUm", + "name": "Note Items", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "y9y05", + "name": "Backlinks Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "tMsM4", + "name": "Note Item Selected", + "width": "fill_container", + "fill": "$--accent-red-light", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "#E9E9E7" + }, + "children": [ + { + "type": "rectangle", + "id": "npYuc", + "name": "leftAccent", + "fill": "$--accent-red", + "width": 3, + "height": "fill_container" + }, + { + "type": "frame", + "id": "a33Wx", + "name": "noteSelContent", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "AZkyx", + "name": "noteSelRow", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "j7GDJ", + "name": "titleGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "j7o2Q", + "name": "noteSelTitle", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "icon_font", + "id": "BnkTG", + "name": "ico", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "lucide", + "fill": "$--accent-red" + } + ] + } + ] + }, + { + "type": "text", + "id": "Ac5Ds", + "name": "noteSelSnip", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Personal knowledge and life management desktop app...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "9ASsT", + "name": "noteSelTime", + "fill": "$--accent-red", + "content": "2m ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "7G8pN", + "name": "Related Notes Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "fDxtF", + "name": "Related Notes Header", + "width": "fill_container", + "height": 32, + "fill": "$--muted", + "padding": [ + 0, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "UBRdO", + "name": "rnLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "8Z4Wq", + "name": "rnLabel", + "fill": "$--muted-foreground", + "content": "RELATED NOTES", + "fontFamily": "IBM Plex Mono", + "fontSize": 11 + }, + { + "type": "text", + "id": "vpnZr", + "name": "rnCount", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "X9LIR", + "name": "rnRight", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "fzVWu", + "name": "rnFilter", + "width": 12, + "height": 12, + "iconFontName": "funnel", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "wuqsO", + "name": "rnPlus", + "width": 12, + "height": 12, + "iconFontName": "plus", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "SbjLq", + "name": "rnChev", + "width": 12, + "height": 12, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "AsAKG", + "name": "Note Item", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "QX5A1", + "name": "note2Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "rYdta", + "name": "leafGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "PC9XN", + "name": "note2Title", + "fill": "$--foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "oI64Y", + "name": "leafIco", + "width": 14, + "height": 14, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + } + ] + }, + { + "type": "text", + "id": "S9JPj", + "name": "note2Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Redesigning portfolio site with modern stack and updated visual language...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "lU75x", + "name": "note2Time", + "fill": "$--muted-foreground", + "content": "1h ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "u6E6Z", + "name": "Note Item", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "ZjCz3", + "name": "note2Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "mxCzu", + "name": "leafGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "INenY", + "name": "note2Title", + "fill": "$--foreground", + "content": "Sample note 2", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "gz6qS", + "name": "leafIco", + "width": 14, + "height": 14, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + } + ] + }, + { + "type": "text", + "id": "s141z", + "name": "note2Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Lorem ipsum dolor sit amet consequetur with modern stack and updated language...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "SvGnt", + "name": "note2Time", + "fill": "$--muted-foreground", + "content": "1h ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "1GwHB", + "name": "Events Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "fp4xI", + "name": "Events Header", + "width": "fill_container", + "height": 32, + "fill": "$--muted", + "padding": [ + 0, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "MNNuU", + "name": "evLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "BNxZp", + "name": "evLabel", + "fill": "$--muted-foreground", + "content": "EVENTS", + "fontFamily": "IBM Plex Mono", + "fontSize": 11 + }, + { + "type": "text", + "id": "qcEvw", + "name": "evCount", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "IBM Plex Sans", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "WCyfc", + "name": "evRight", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "SpCoO", + "name": "evFilter", + "width": 12, + "height": 12, + "iconFontName": "funnel", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "G1DCl", + "name": "evPlus", + "width": 12, + "height": 12, + "iconFontName": "plus", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "sAalN", + "name": "evChev", + "width": 12, + "height": 12, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "k7CjA", + "name": "Note Item 2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "og5Gz", + "name": "note3Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ttBdk", + "name": "calGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KI8Bf", + "name": "note3Title", + "fill": "$--foreground", + "content": "Meeting with Grant", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "LdRjU", + "name": "calIco", + "width": 14, + "height": 14, + "iconFontName": "calendar", + "iconFontFamily": "lucide", + "fill": "$--accent-yellow" + } + ] + } + ] + }, + { + "type": "text", + "id": "FfPXa", + "name": "note3Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Discussed Q1 goals and hiring priorities with the engineering team leads...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "BHh4Z", + "name": "note3Time", + "fill": "$--muted-foreground", + "content": "Yesterday", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "AQ51u", + "name": "Note Item 2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "SHgK3", + "name": "note3Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "3rIet", + "name": "calGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dCwzu", + "name": "note3Title", + "fill": "$--foreground", + "content": "Meeting with Matteo", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "l8O2I", + "name": "calIco", + "width": 14, + "height": 14, + "iconFontName": "calendar", + "iconFontFamily": "lucide", + "fill": "$--accent-yellow" + } + ] + } + ] + }, + { + "type": "text", + "id": "1L4oo", + "name": "note3Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Discussed Q1 goals and hiring priorities with the engineering team leads...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "3oBam", + "name": "note3Time", + "fill": "$--muted-foreground", + "content": "Yesterday", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "MeqjO", + "name": "Resize Handle 2", + "fill": "$--border", + "width": 1, + "height": "fill_container" + }, + { + "type": "frame", + "id": "zAbPt", + "name": "Panel: Editor", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "fill": "$--background", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "NdYcO", + "name": "Tab Bar", + "width": "fill_container", + "height": 45, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "nVUGr", + "name": "Tab Active", + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "right": 1 + }, + "fill": "$--border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kBpGX", + "name": "tab1Txt", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "Bb2AE", + "name": "tab1Close", + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "GYeyL", + "name": "Tab Inactive", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kZ1bn", + "name": "tab2Txt", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "RwyYI", + "name": "tab2Close", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "sbpmq", + "name": "tabSpacer", + "width": "fill_container", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + } + }, + { + "type": "frame", + "id": "WF97k", + "name": "tabControls", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1, + "left": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_around", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "rfSoS", + "name": "iconPlus", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "t0u6z", + "name": "iconSplit", + "width": 16, + "height": 16, + "iconFontName": "columns", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "kbe1P", + "name": "iconExpand", + "width": 16, + "height": 16, + "iconFontName": "arrows-out-simple", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "rTdKS", + "name": "Editor Body", + "width": "fill_container", + "height": "fill_container", + "children": [ + { + "type": "frame", + "id": "NfyTF", + "name": "Editor Left", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "hvoFh", + "name": "Info Bar", + "width": "fill_container", + "height": 45, + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "bTP0I", + "name": "infoLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Msj7v", + "name": "breadcrumbType", + "fill": "$--muted-foreground", + "content": "Project", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "wqdMG", + "name": "breadcrumbSep", + "fill": "$--muted-foreground", + "content": "›", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "FzENd", + "name": "breadcrumbName", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "pvTmc", + "name": "dotSep", + "fill": "$--muted-foreground", + "content": "·", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "9ga1R", + "name": "modifiedTxt", + "fill": "$--accent-yellow", + "content": "M", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "3bzDp", + "name": "infoRight", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "9Ctb0", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "magnifying-glass", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "csHzz", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "git-branch", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "2s6Of", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "cursor-text", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "JVSlj", + "name": "iconAI", + "width": 16, + "height": 16, + "iconFontName": "sparkle", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "k3AiV", + "name": "iconMore", + "width": 16, + "height": 16, + "iconFontName": "dots-three", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "vvETz", + "name": "Editor Content", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 16, + "padding": [ + 32, + 64 + ], + "children": [ + { + "type": "text", + "id": "b6up3", + "name": "editorP1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Personal knowledge and life management desktop app, built with Tauri v2 + React + TypeScript + CodeMirror 6. It reads a vault of markdown files with YAML frontmatter and presents them in a four-panel UI inspired by Bear Notes.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "a2S43", + "name": "editorH2", + "fill": "$--foreground", + "content": "Architecture", + "lineHeight": 1.3, + "fontFamily": "Inter", + "fontSize": 24, + "fontWeight": "600" + }, + { + "type": "text", + "id": "wgvQa", + "name": "editorP2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "The app uses a four-panel layout: Sidebar for navigation, NoteList for browsing, Editor for content, and Inspector for metadata. All data lives in markdown files with YAML frontmatter, git-versioned.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "GGP97", + "name": "Inspector", + "clip": true, + "width": 260, + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "left": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "FbHy7", + "name": "Inspector Header", + "width": "fill_container", + "height": 45, + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "gap": 8, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "sA7Dx", + "name": "leftGroup", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "0ccF1", + "name": "propIcon", + "width": 16, + "height": 16, + "iconFontName": "sliders-horizontal", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "T2vTZ", + "name": "inspTitle", + "fill": "$--muted-foreground", + "content": "Properties", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "icon_font", + "id": "NQOhZ", + "name": "sidebarIcon", + "width": 16, + "height": 16, + "iconFontName": "x", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "LYFki", + "name": "Inspector Body", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 16, + "padding": 12, + "children": [ + { + "type": "frame", + "id": "8g61y", + "name": "Properties Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "VhH4P", + "name": "addPropBtn", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 12 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Q9z8F", + "name": "addPropTxt", + "fill": "$--muted-foreground", + "content": "+ Add property", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "6PwTH", + "name": "propType", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Vt2BC", + "name": "propTypeLbl", + "fill": "$--muted-foreground", + "content": "TYPE", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "uvBiY", + "name": "propTypeVal", + "fill": "$--foreground", + "content": "Project", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "FDbay", + "name": "propStatus", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "e426F", + "name": "propStatusLbl", + "fill": "$--muted-foreground", + "content": "STATUS", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "o2rZM", + "name": "propStatusBadge", + "fill": "$--accent-green-light", + "cornerRadius": 16, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "transparent" + }, + "gap": 8, + "padding": [ + 1, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "QM7L3", + "name": "Badge Text", + "fill": "$--accent-green", + "content": "ACTIVE", + "lineHeight": 1.33, + "textAlign": "center", + "textAlignVertical": "middle", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 1.2 + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "NmRLv", + "name": "Relationships Section", + "width": "fill_container", + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "WFVAr", + "name": "relGroup1", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "0N729", + "name": "relGrp1Title", + "fill": "$--muted-foreground", + "content": "BELONGS TO", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "zLl8F", + "name": "relLaputaBtn", + "width": "fill_container", + "fill": "$--accent-green-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kw9vC", + "name": "laputaTxt", + "fill": "$--accent-green", + "content": "Laputa", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "RFvoz", + "name": "topicIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + }, + { + "type": "frame", + "id": "ybi8Q", + "name": "relLaputaBtn", + "width": "fill_container", + "fill": "$--accent-green-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VNcmt", + "name": "laputaTxt", + "fill": "$--accent-green", + "content": "Building", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "UVPwc", + "name": "topicIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + }, + { + "type": "frame", + "id": "L6knW", + "name": "linkExisting", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "jwU3Z", + "name": "laputaTxt", + "fill": "$--muted-foreground", + "content": "+ Link existing", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "laPFL", + "name": "relGroup2", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "LOXUL", + "name": "relGrp2Title", + "fill": "$--muted-foreground", + "content": "RELATED TO", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "qLTYD", + "name": "relMigrationBtn", + "width": "fill_container", + "fill": "$--accent-red-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "GBk2u", + "name": "migrationTxt", + "fill": "$--accent-red", + "content": "Shadcn Migration", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "Sy14T", + "name": "expIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "flask", + "iconFontFamily": "phosphor", + "fill": "$--accent-red" + } + ] + }, + { + "type": "frame", + "id": "u8ijV", + "name": "linkExisting", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "PUXx5", + "name": "laputaTxt", + "fill": "$--muted-foreground", + "content": "+ Link existing", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "6PUnO", + "name": "Backlinks Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "PllIu", + "name": "blTitle", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "ZbgbI", + "name": "blTitleTxt", + "rotation": -0.5285936385085725, + "fill": "$--muted-foreground", + "content": "BACKLINKS", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + } + ] + }, + { + "type": "text", + "id": "eRoDO", + "name": "blItem1", + "fill": "$--primary", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "u1olR", + "name": "blItem2", + "fill": "$--primary", + "content": "Meeting with Grant", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "oUd9s", + "name": "blItem3", + "fill": "$--primary", + "content": "Q1 Planning", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "yf0wj", + "name": "History Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "dG7rj", + "name": "histTitle", + "fill": "$--muted-foreground", + "content": "HISTORY", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "z2Mdy", + "name": "histItem1", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "left": 2 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 0, + 0, + 0, + 10 + ], + "children": [ + { + "type": "text", + "id": "AsiWz", + "name": "histItem1Hash", + "fill": "$--accent-blue", + "content": "a089f44 · feat: migrate to shadcn/ui", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "BdVhi", + "name": "histItem1Date", + "fill": "$--muted-foreground", + "content": "Feb 16, 2026", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "piJNC", + "name": "histItem2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "left": 2 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 0, + 0, + 0, + 10 + ], + "children": [ + { + "type": "text", + "id": "0PWoX", + "name": "histItem2Hash", + "fill": "$--accent-blue", + "content": "5a4b4ac · feat: emoji favicon", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "xySNW", + "name": "histItem2Date", + "fill": "$--muted-foreground", + "content": "Feb 15, 2026", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "x1AHT", + "name": "lightStatusBar", + "width": "fill_container", + "height": 30, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "top": 1 + }, + "fill": "$--border" + }, + "padding": [ + 0, + 8 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "e2UzJ", + "name": "Status Left", + "height": "fill_container", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "mlD58", + "name": "versionIcon", + "width": 14, + "height": 14, + "iconFontName": "box", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "hRBRa", + "name": "versionText", + "fill": "$--muted-foreground", + "content": "v0.4.2", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "bFwrw", + "name": "sep1", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "ey3Gr", + "name": "branchIcon", + "width": 14, + "height": 14, + "iconFontName": "git-branch", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "Kz0sS", + "name": "branchText", + "fill": "$--muted-foreground", + "content": "main", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "6IY1E", + "name": "sep2", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "IjEG1", + "name": "syncIcon", + "width": 13, + "height": 13, + "iconFontName": "refresh-cw", + "iconFontFamily": "lucide", + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "srxkr", + "name": "syncText", + "fill": "$--muted-foreground", + "content": "Synced 2m ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "4jgQF", + "name": "Status Right", + "height": "fill_container", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "3RPmA", + "name": "aiIcon", + "width": 13, + "height": 13, + "iconFontName": "sparkles", + "iconFontFamily": "lucide", + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "t0NOA", + "name": "aiText", + "fill": "$--muted-foreground", + "content": "Claude Sonnet 4", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "16V7i", + "name": "sep3", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "PXVrd", + "name": "notesCount", + "width": 13, + "height": 13, + "iconFontName": "file-text", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "2FxCi", + "name": "notesText", + "fill": "$--muted-foreground", + "content": "1,247 notes", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "pB6ds", + "name": "sep4", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "fRHKs", + "name": "bellIcon", + "width": 13, + "height": 13, + "iconFontName": "bell", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "2sEBS", + "name": "settingsIcon", + "width": 13, + "height": 13, + "iconFontName": "settings", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "mOf4J", + "x": 0, + "y": 4457, + "name": "Color Palette — shadcn/ui Theme (Light)", + "theme": { + "Mode": "Light" + }, + "width": 1440, + "fill": "$--background", + "layout": "vertical", + "gap": 32, + "padding": 40, + "children": [ + { + "type": "text", + "id": "rmJdn", + "name": "cTitle", + "fill": "$--foreground", + "content": "Color Palette — shadcn/ui Theme Variables (Light)", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "text", + "id": "V79Zu", + "name": "cSub", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "All colors from src/index.css. Variables support light/dark mode via .dark class.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Xbdzq", + "name": "primLbl", + "fill": "$--foreground", + "content": "Primary Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "NyoC7", + "name": "primRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "Inb1x", + "name": "sw1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "HRsVC", + "name": "sw1b", + "fill": "$--background", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "jV89s", + "name": "sw1n", + "fill": "$--foreground", + "content": "--background", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "qOUUY", + "name": "sw1v", + "fill": "$--muted-foreground", + "content": "L: #FFFFFF / D: #0f0f1a", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "QytAQ", + "name": "sw2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "TMuHH", + "name": "sw2b", + "fill": "$--foreground", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "k9qK4", + "name": "sw2n", + "fill": "$--foreground", + "content": "--foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "BfEn7", + "name": "sw2v", + "fill": "$--muted-foreground", + "content": "L: #37352F / D: #e0e0e0", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "gJZtB", + "name": "sw3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "RRsQg", + "name": "sw3b", + "fill": "$--primary", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "CtJe4", + "name": "sw3n", + "fill": "$--foreground", + "content": "--primary", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "1iFr6", + "name": "sw3v", + "fill": "$--muted-foreground", + "content": "#155DFF", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "mbvua", + "name": "sw4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "fajNZ", + "name": "sw4b", + "fill": "$--primary-foreground", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "wVJ7z", + "name": "sw4n", + "fill": "$--foreground", + "content": "--primary-foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Oum5Q", + "name": "sw4v", + "fill": "$--muted-foreground", + "content": "L: #FFFFFF / D: #ffffff", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "text", + "id": "UvI4d", + "name": "accLbl", + "fill": "$--foreground", + "content": "Accent & Semantic Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "jOmo7", + "name": "accRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "uFXJ3", + "name": "a1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "NRr0w", + "name": "a1b", + "fill": "$--accent-blue", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "ECVqk", + "name": "a1n", + "fill": "$--foreground", + "content": "--accent-blue", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "csKEt", + "name": "a2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "5IiT2", + "name": "a2b", + "fill": "$--accent-green", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "aCPba", + "name": "a2n", + "fill": "$--foreground", + "content": "--accent-green", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "XbY7C", + "name": "a3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "I9qCz", + "name": "a3b", + "fill": "$--accent-yellow", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "DfZVh", + "name": "a3n", + "fill": "$--foreground", + "content": "--accent-yellow", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "nROw3", + "name": "a4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "IcIoP", + "name": "a4b", + "fill": "$--accent-red", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "eGgz6", + "name": "a4n", + "fill": "$--foreground", + "content": "--destructive", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "J95fv", + "name": "a5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "o03fQ", + "name": "a5b", + "fill": "$--accent-purple", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "H9VWy", + "name": "a5n", + "fill": "$--foreground", + "content": "--accent-purple", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "GcYle", + "name": "lightLightLbl", + "fill": "$--foreground", + "content": "Accent Light Backgrounds", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "Ju2xp", + "name": "accLightRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "5dnn5", + "name": "al1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "7kcqW", + "name": "ll1b", + "fill": "$--accent-blue-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "dBCbF", + "name": "ll1n", + "fill": "$--foreground", + "content": "--accent-blue-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "W0t0j", + "name": "al2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "1vepp", + "name": "ll2b", + "fill": "$--accent-green-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "6kUyf", + "name": "ll2n", + "fill": "$--foreground", + "content": "--accent-green-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "zyV1j", + "name": "al3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "yUDBN", + "name": "ll3b", + "fill": "$--accent-yellow-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "dmfZ4", + "name": "ll3n", + "fill": "$--foreground", + "content": "--accent-yellow-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "yGmmo", + "name": "al4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "eLu8o", + "name": "ll4b", + "fill": "$--accent-red-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "PVLwR", + "name": "ll4n", + "fill": "$--foreground", + "content": "--accent-red-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "0BO2b", + "name": "al5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "6FBws", + "name": "ll5b", + "fill": "$--accent-purple-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "i2DfV", + "name": "ll5n", + "fill": "$--foreground", + "content": "--accent-purple-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "JFocf", + "name": "surfLbl", + "fill": "$--foreground", + "content": "Surface & Border Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "YAJLW", + "name": "surfRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "JHS3j", + "name": "s1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "9Bj41", + "name": "s1b", + "fill": "$--card", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "wn4ua", + "name": "s1n", + "fill": "$--foreground", + "content": "--card", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Fyvfd", + "name": "s2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "UFLw5", + "name": "s2b", + "fill": "$--sidebar", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--sidebar-border" + } + }, + { + "type": "text", + "id": "gngfL", + "name": "s2n", + "fill": "$--foreground", + "content": "--sidebar", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "zbyEJ", + "name": "s3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "WnmQD", + "name": "s3b", + "fill": "$--secondary", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "wnkxR", + "name": "s3n", + "fill": "$--foreground", + "content": "--secondary", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Z2FuK", + "name": "s4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "lNPnc", + "name": "s4b", + "fill": "$--border", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "x9aeh", + "name": "s4n", + "fill": "$--foreground", + "content": "--border / --input", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "TDDQ0", + "name": "s5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "MwHOe", + "name": "s5b", + "fill": "$--muted-foreground", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "dHZj5", + "name": "s5n", + "fill": "$--foreground", + "content": "--muted-foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "HZonq", + "x": 0, + "y": 5252, + "name": "Typography & Spacing Specs (Light)", + "theme": { + "Mode": "Light" + }, + "width": 1440, + "fill": "$--background", + "layout": "vertical", + "gap": 32, + "padding": 40, + "children": [ + { + "type": "text", + "id": "nGLlU", + "name": "tTitle", + "fill": "$--foreground", + "content": "Typography Scale (Light)", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "text", + "id": "gkQqO", + "name": "tSub", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Fonts: Inter, IBM Plex Mono. Base: 14px. System fallback: -apple-system, BlinkMacSystemFont, sans-serif.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "QL9fK", + "name": "t1", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "px1l7", + "name": "t1s", + "fill": "$--foreground", + "content": "Heading 1", + "lineHeight": 1.2, + "fontFamily": "Inter", + "fontSize": 32, + "fontWeight": "700" + }, + { + "type": "text", + "id": "3UWKu", + "name": "t1d", + "fill": "$--muted-foreground", + "content": "32px / Bold / lh 1.2 — Editor H1", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Yjhit", + "name": "t2", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "iFzl0", + "name": "t2s", + "fill": "$--foreground", + "content": "Heading 2", + "lineHeight": 1.3, + "fontFamily": "Inter", + "fontSize": 24, + "fontWeight": "600" + }, + { + "type": "text", + "id": "cF55I", + "name": "t2d", + "fill": "$--muted-foreground", + "content": "24px / Semibold / lh 1.3 — Editor H2", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "bBHMa", + "name": "t3", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kpSyr", + "name": "t3s", + "fill": "$--foreground", + "content": "App Title", + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "700", + "letterSpacing": -0.3 + }, + { + "type": "text", + "id": "xUuNz", + "name": "t3d", + "fill": "$--muted-foreground", + "content": "17px / Bold / ls -0.3 — Sidebar header", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Lsh7F", + "name": "t4", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "vTRSs", + "name": "t4s", + "fill": "$--foreground", + "content": "Body Text", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "fKa3p", + "name": "t4d", + "fill": "$--muted-foreground", + "content": "16px / Regular / lh 1.6 — Editor paragraphs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "rpOTz", + "name": "t5", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VXY3Z", + "name": "t5s", + "fill": "$--foreground", + "content": "UI Label / Button", + "lineHeight": 1.43, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500" + }, + { + "type": "text", + "id": "F6GQz", + "name": "t5d", + "fill": "$--muted-foreground", + "content": "14px / Medium / lh 1.43 — Buttons, NoteList header, Inspector labels", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "H6Rgt", + "name": "t6", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "xWvbj", + "name": "t6s", + "fill": "$--foreground", + "content": "Sidebar Item", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "text", + "id": "bvBBm", + "name": "t6d", + "fill": "$--muted-foreground", + "content": "13px / Medium — Sidebar nav items, filter items, search", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "GrFAq", + "name": "t7", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "vY8j4", + "name": "t7s", + "fill": "$--muted-foreground", + "content": "SECTION HEADER", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "600", + "letterSpacing": 0.5 + }, + { + "type": "text", + "id": "okws6", + "name": "t7d", + "fill": "$--muted-foreground", + "content": "11px / Semibold / ls 0.5 — Sidebar sections, type pills", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "awxls", + "name": "t8", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mD3f5", + "name": "t8s", + "fill": "$--foreground", + "content": "ALL-CAPS LABEL", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "600", + "letterSpacing": 1.2 + }, + { + "type": "text", + "id": "jFpLw", + "name": "t8d", + "fill": "$--muted-foreground", + "content": "11px / Semibold / ls 1.2 / IBM Plex Mono — Section labels, metadata tags", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "ToLzL", + "name": "t9", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "LEsxW", + "name": "t9s", + "fill": "$--muted-foreground", + "content": "OVERLINE TEXT", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "500", + "letterSpacing": 1.5 + }, + { + "type": "text", + "id": "HQ3Df", + "name": "t9d", + "fill": "$--muted-foreground", + "content": "10px / Medium / ls 1.5 / IBM Plex Mono — Overlines, category labels, timestamps", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "rectangle", + "id": "3tiJ7", + "name": "div1", + "fill": "$--border", + "width": "fill_container", + "height": 1 + }, + { + "type": "text", + "id": "b2Mt9", + "name": "spTitle", + "fill": "$--foreground", + "content": "Spacing & Layout Reference", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "frame", + "id": "o6ETJ", + "name": "pnlRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "HhbOn", + "name": "p1", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "YBekR", + "name": "p1t", + "fill": "$--foreground", + "content": "Sidebar: 250px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "dT8Xe", + "name": "p1d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --sidebar | padding: 8px container, 12px 16px header, 6px 16px items", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "aYkMZ", + "name": "p2", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "Eycne", + "name": "p2t", + "fill": "$--foreground", + "content": "NoteList: 300px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "lyTZN", + "name": "p2d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --card | padding: 14px 16px header, 8px 12px search/pills, 10px 16px items", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "E6G3g", + "name": "p3", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "Xy5Gl", + "name": "p3t", + "fill": "$--foreground", + "content": "Editor: flexible", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "y4svr", + "name": "p3d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --background | padding: 32px 64px content, 7px 14px tabs, gap: 16px", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "RBPav", + "name": "p4", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "xKUWC", + "name": "p4t", + "fill": "$--foreground", + "content": "Inspector: 280px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "u81W5", + "name": "p4d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --sidebar | padding: 14px 12px header, 12px body, 16px section gap, 8px prop gap", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "text", + "id": "VvZyF", + "name": "radLbl", + "fill": "$--foreground", + "content": "Border Radius", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "OwJH7", + "name": "radRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "DHrzV", + "name": "r1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 4, + "id": "V35oi", + "name": "r1b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "HVQpq", + "name": "r1n", + "fill": "$--foreground", + "content": "4px (sm) — chips", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "wp350", + "name": "r2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 6, + "id": "E031z", + "name": "r2b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "rDLff", + "name": "r2n", + "fill": "$--foreground", + "content": "6px (md) — buttons, inputs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "d6tJt", + "name": "r3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "PNkS4", + "name": "r3b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "rZGXb", + "name": "r3n", + "fill": "$--foreground", + "content": "8px (lg) — cards, dialogs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "UAZ8u", + "name": "r4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 16, + "id": "wgMVG", + "name": "r4b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "zw3RY", + "name": "r4n", + "fill": "$--foreground", + "content": "16px — badges", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "kIrXE", + "name": "div2", + "fill": "$--border", + "width": "fill_container", + "height": 1 + }, + { + "type": "text", + "id": "FYw8k", + "name": "compTitle", + "fill": "$--foreground", + "content": "shadcn/ui Component Inventory", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "frame", + "id": "7Q1Fi", + "name": "compRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "XfUwj", + "name": "cg1", + "width": "fill_container", + "fill": "$--card", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 12, + "padding": 16, + "children": [ + { + "type": "text", + "id": "ly7m0", + "name": "cg1t", + "fill": "$--accent-green", + "content": "In Use", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Re89a", + "name": "cg1r1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Button — 5 variants (Default, Secondary, Outline, Ghost, Destructive)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ILbjW", + "name": "cg1r2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Input — Default text input with label group", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "eurqS", + "name": "cg1r3", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Dialog — Modal overlay (CreateNote, Commit)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "AZyZP", + "name": "cg1r4", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Badge — 4 variants (Default, Secondary, Outline, Destructive)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "WtehQ", + "name": "cg2", + "width": "fill_container", + "fill": "$--card", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 12, + "padding": 16, + "children": [ + { + "type": "text", + "id": "KaMZ9", + "name": "cg2t", + "fill": "$--accent-yellow", + "content": "Available (Not Yet Used)", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "F8wam", + "name": "cg2r1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "DropdownMenu — Context / dropdown menus", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Nl1aV", + "name": "cg2r2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Tabs — Tab navigation component", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "0sBwH", + "name": "cg2r3", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Tooltip, Select, Card, Separator, ScrollArea", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "trSB1", + "x": 1600, + "y": 3385, + "name": "Trash — Sidebar Filter", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 260, + "height": 400, + "fill": "$--sidebar", + "layout": "vertical", + "gap": 0, + "padding": [ + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "trFAll", + "name": "filterAll", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIAll", + "name": "iconAll", + "width": 16, + "height": 16, + "iconFontName": "file-text", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTAll", + "name": "txtAll", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "trFFav", + "name": "filterFav", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIFav", + "name": "iconFav", + "width": 16, + "height": 16, + "iconFontName": "star", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTFav", + "name": "txtFav", + "fill": "$--foreground", + "content": "Favorites", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "trFArc", + "name": "filterArchive", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIArc", + "name": "iconArchive", + "width": 16, + "height": 16, + "iconFontName": "archive", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTArc", + "name": "txtArchive", + "fill": "$--foreground", + "content": "Archive", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trBArc", + "name": "badgeArc", + "height": 20, + "fill": "$--muted", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trBTArc", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trFTr", + "name": "filterTrash", + "width": "fill_container", + "fill": "#ef444418", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trITr", + "name": "iconTrash", + "width": 16, + "height": 16, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--destructive" + }, + { + "type": "text", + "id": "trTTr", + "name": "txtTrash", + "fill": "$--destructive", + "content": "Trash", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "trBTr", + "name": "badgeTrash", + "height": 20, + "fill": "$--destructive", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trBTTr", + "fill": "#ffffff", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "trNL1", + "x": 1600, + "y": 3815, + "name": "Trash — Note List View", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 340, + "height": 360, + "fill": "$--card", + "layout": "vertical", + "gap": 0, + "children": [ + { + "type": "frame", + "id": "trNLH", + "name": "header", + "width": "fill_container", + "height": 45, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "justifyContent": "space_between", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "text", + "id": "trNLT", + "fill": "$--foreground", + "content": "Trash", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "trN1", + "name": "trashedNote1", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 14, + 16 + ], + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "frame", + "id": "trN1H", + "name": "titleRow", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN1T", + "fill": "$--foreground", + "content": "Old Draft Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trN1B", + "name": "trashedBadge", + "height": 16, + "fill": "#ef444418", + "cornerRadius": 4, + "padding": [ + 1, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN1BT", + "fill": "$--destructive", + "content": "TRASHED", + "fontFamily": "Inter", + "fontSize": 9, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "trN1S", + "fill": "$--muted-foreground", + "content": "Some draft content that is no longer needed...", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400" + }, + { + "type": "text", + "id": "trN1D", + "fill": "$--muted-foreground", + "content": "5d ago", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "frame", + "id": "trN2", + "name": "trashedNote2Warning", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 14, + 16 + ], + "fill": "#ef44440a", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "frame", + "id": "trN2H", + "name": "titleRow", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN2T", + "fill": "$--foreground", + "content": "Deprecated API Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trN2B", + "name": "warningBadge", + "height": 16, + "fill": "$--destructive", + "cornerRadius": 4, + "padding": [ + 1, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN2BT", + "fill": "#ffffff", + "content": "30+ DAYS", + "fontFamily": "Inter", + "fontSize": 9, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "text", + "id": "trN2S", + "fill": "$--muted-foreground", + "content": "Old API documentation that was replaced...", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400" + }, + { + "type": "text", + "id": "trN2D", + "fill": "$--destructive", + "content": "Trashed 35d ago — will be permanently deleted", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trRI1", + "x": 1970, + "y": 3385, + "name": "Trash — Relationship Indicator", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 300, + "height": 200, + "fill": "$--background", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 16 + ], + "children": [ + { + "type": "text", + "id": "trRIL", + "fill": "$--muted-foreground", + "content": "BELONGS TO", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "trRN", + "name": "normalRef", + "width": "fill_container", + "fill": "$--accent-blue-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "trRNT", + "fill": "$--accent-blue", + "content": "Build Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "trRNI", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-blue" + } + ] + }, + { + "type": "frame", + "id": "trRT", + "name": "trashedRef", + "width": "fill_container", + "fill": "$--muted", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "opacity": 0.7, + "children": [ + { + "type": "frame", + "id": "trRTL", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trRTTI", + "width": 12, + "height": 12, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "trRTT", + "fill": "$--muted-foreground", + "content": "Old Draft Notes", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "trRTTX", + "fill": "$--muted-foreground", + "content": "(trashed)", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "icon_font", + "id": "trRTI", + "width": 14, + "height": 14, + "iconFontName": "file-text", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "trRA", + "name": "archivedRef", + "width": "fill_container", + "fill": "$--muted", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "opacity": 0.7, + "children": [ + { + "type": "frame", + "id": "trRAL", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trRAT", + "fill": "$--muted-foreground", + "content": "Website Redesign", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "trRATX", + "fill": "$--muted-foreground", + "content": "(archived)", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "icon_font", + "id": "trRAI", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trW30", + "x": 1970, + "y": 3615, + "name": "Trash — 30-Day Auto-Delete Warning", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 340, + "height": 120, + "fill": "$--background", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 16 + ], + "children": [ + { + "type": "text", + "id": "trW3L", + "fill": "$--muted-foreground", + "content": "Warning banner shown at top of trash view:", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trW3B", + "name": "warningBanner", + "width": "fill_container", + "fill": "#ef44440f", + "cornerRadius": 8, + "padding": [ + 10, + 12 + ], + "gap": 8, + "alignItems": "center", + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#ef444430" + }, + "children": [ + { + "type": "icon_font", + "id": "trW3I", + "width": 16, + "height": 16, + "iconFontName": "warning", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--destructive" + }, + { + "type": "frame", + "id": "trW3T", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "trW3T1", + "fill": "$--destructive", + "content": "Notes in trash for 30+ days will be permanently deleted", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "trW3T2", + "fill": "$--muted-foreground", + "content": "1 note is past the 30-day retention period", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "400" + } + ] + } + ] + } + ] + } + ], + "themes": { + "Mode": [ + "Dark" + ] + }, + "variables": { + "--accent": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#252545", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-blue": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-green": { + "type": "color", + "value": [ + { + "value": "#0F7B6C" + }, + { + "value": "#4caf50", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#00B38B" + }, + { + "value": "#00B38B", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-orange": { + "type": "color", + "value": [ + { + "value": "#D9730D" + }, + { + "value": "#ff9800", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-purple": { + "type": "color", + "value": [ + { + "value": "#9065B0" + }, + { + "value": "#9c72ff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#A932FF" + }, + { + "value": "#A932FF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-red": { + "type": "color", + "value": [ + { + "value": "#E03E3E" + }, + { + "value": "#f44336", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--background": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#0f0f1a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--black": { + "type": "color", + "value": "#000000" + }, + "--border": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--card": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#16162a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--card-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--destructive": { + "type": "color", + "value": [ + { + "value": "#E03E3E" + }, + { + "value": "#f44336", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--destructive-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--font-primary": { + "type": "string", + "value": [ + { + "value": "Inter" + }, + { + "value": "-apple-system, BlinkMacSystemFont, Inter, sans-serif" + }, + { + "value": "Inter" + } + ] + }, + "--font-system": { + "type": "string", + "value": "-apple-system, BlinkMacSystemFont, sans-serif" + }, + "--foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--input": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--muted": { + "type": "color", + "value": [ + { + "value": "#F0F0EF" + }, + { + "value": "#1e1e3a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--muted-foreground": { + "type": "color", + "value": [ + { + "value": "#787774" + }, + { + "value": "#888888", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--popover": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#1e1e3a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--popover-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--primary": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--primary-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--radius-lg": { + "type": "number", + "value": 8 + }, + "--radius-md": { + "type": "number", + "value": 6 + }, + "--radius-sm": { + "type": "number", + "value": 4 + }, + "--ring": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--secondary": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--secondary-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar": { + "type": "color", + "value": [ + { + "value": "#F7F6F3" + }, + { + "value": "#1a1a2e", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-accent": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#252545", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-accent-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-border": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-primary": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-primary-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-ring": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--white": { + "type": "color", + "value": "#ffffff" + }, + "--accent-yellow": { + "type": "color", + "value": [ + { + "value": "#F0B100" + }, + { + "value": "#F0B100", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-blue-light": { + "type": "color", + "value": [ + { + "value": "#155DFF14" + }, + { + "value": "#155DFF20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-green-light": { + "type": "color", + "value": [ + { + "value": "#00B38B14" + }, + { + "value": "#00B38B20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-purple-light": { + "type": "color", + "value": [ + { + "value": "#A932FF14" + }, + { + "value": "#A932FF20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-red-light": { + "type": "color", + "value": [ + { + "value": "#E03E3E14" + }, + { + "value": "#f4433620", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-yellow-light": { + "type": "color", + "value": [ + { + "value": "#F0B10014" + }, + { + "value": "#F0B10020", + "theme": { + "Mode": "Dark" + } + } + ] + } + }, + "fonts": [ + { + "name": "GT Pressura Trial", + "url": "GT-Pressura-Regular-Trial.otf" + } + ] +} \ No newline at end of file From 66a15e4ddb7cc459a51fb5f53acb60efcc08e67d Mon Sep 17 00:00:00 2001 From: lucaronin Date: Sat, 21 Feb 2026 16:52:28 +0100 Subject: [PATCH 2/8] feat: add trashed/trashedAt fields to VaultEntry - Added trashed (boolean) and trashedAt (timestamp) to TypeScript VaultEntry - Added 'trash' filter to SidebarSelection union type - Added trashed/trashed_at fields to Rust VaultEntry struct and Frontmatter parser - Added 3 trashed mock entries for visual testing (recently trashed, 30+ days old, and dropped experiment) Co-Authored-By: Claude Opus 4.6 --- src-tauri/src/vault.rs | 13 ++- src/mock-tauri.ts | 174 +++++++++++++++++++++++++++++++++++++++++ src/types.ts | 4 +- 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/vault.rs b/src-tauri/src/vault.rs index 4d571bbd..faa54dd1 100644 --- a/src-tauri/src/vault.rs +++ b/src-tauri/src/vault.rs @@ -25,6 +25,9 @@ pub struct VaultEntry { pub owner: Option, pub cadence: Option, pub archived: bool, + pub trashed: bool, + #[serde(rename = "trashedAt")] + pub trashed_at: Option, #[serde(rename = "modifiedAt")] pub modified_at: Option, #[serde(rename = "createdAt")] @@ -60,6 +63,10 @@ struct Frontmatter { cadence: Option, #[serde(rename = "Archived")] archived: Option, + #[serde(rename = "Trashed")] + trashed: Option, + #[serde(rename = "Trashed at")] + trashed_at: Option, #[serde(rename = "Created at")] created_at: Option, #[serde(rename = "Created time")] @@ -213,8 +220,8 @@ fn parse_frontmatter(data: &HashMap) -> Frontmatter { /// Known non-relationship frontmatter keys to skip (case-insensitive comparison). /// Only skip keys that can never contain wikilinks. const SKIP_KEYS: &[&str] = &[ - "is a", "aliases", "status", "cadence", "archived", "created at", "created time", - "icon", "color", + "is a", "aliases", "status", "cadence", "archived", "trashed", "trashed at", + "created at", "created time", "icon", "color", ]; /// Check if a string contains a wikilink pattern `[[...]]`. @@ -364,6 +371,8 @@ pub fn parse_md_file(path: &Path) -> Result { owner: frontmatter.owner, cadence: frontmatter.cadence, archived: frontmatter.archived.unwrap_or(false), + trashed: frontmatter.trashed.unwrap_or(false), + trashed_at: frontmatter.trashed_at.as_deref().and_then(parse_iso_date), modified_at, created_at, file_size, icon: frontmatter.icon, color: frontmatter.color, diff --git a/src/mock-tauri.ts b/src/mock-tauri.ts index 82ca683d..4f0fe632 100644 --- a/src/mock-tauri.ts +++ b/src/mock-tauri.ts @@ -583,6 +583,45 @@ A **book** you're reading or have read. Track reading progress, notes, and key t - **Author**: The book's author - **Status**: Reading, Finished, Abandoned - **Rating**: 1-5 stars +`, + // --- Trashed entries --- + '/Users/luca/Laputa/note/old-draft-notes.md': `--- +title: Old Draft Notes +is_a: Note +trashed: true +trashed_at: ${new Date(Date.now() - 86400000 * 5).toISOString().slice(0, 10)} +belongs_to: + - "[[project/26q1-laputa-app]]" +--- + +# Old Draft Notes + +Some rough draft content that is no longer relevant. Moving to trash. +`, + '/Users/luca/Laputa/note/deprecated-api-notes.md': `--- +title: Deprecated API Notes +is_a: Note +trashed: true +trashed_at: ${new Date(Date.now() - 86400000 * 35).toISOString().slice(0, 10)} +--- + +# Deprecated API Notes + +Old API documentation for the v1 endpoint. Replaced by v2 docs. +`, + '/Users/luca/Laputa/experiment/failed-seo-experiment.md': `--- +title: Failed SEO Experiment +is_a: Experiment +status: Dropped +trashed: true +trashed_at: ${new Date(Date.now() - 86400000 * 10).toISOString().slice(0, 10)} +related_to: + - "[[responsibility/grow-newsletter]]" +--- + +# Failed SEO Experiment + +Tried programmatic SEO pages. Results were negligible — trashing this. `, // --- Archived entries --- '/Users/luca/Laputa/project/25q3-website-redesign.md': `--- @@ -672,6 +711,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000, createdAt: null, fileSize: 2048, @@ -696,6 +737,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 3600, createdAt: null, fileSize: 1024, @@ -725,6 +768,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Matteo Cellini', cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 7200, createdAt: null, fileSize: 890, @@ -748,6 +793,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: 'Weekly', archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 512, @@ -771,6 +818,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Matteo Cellini', cadence: 'Weekly', archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 2, createdAt: null, fileSize: 640, @@ -794,6 +843,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 3200, @@ -818,6 +869,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 3600 * 5, createdAt: null, fileSize: 847, @@ -842,6 +895,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 560, @@ -865,6 +920,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 7, createdAt: null, fileSize: 320, @@ -887,6 +944,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 3600 * 2, createdAt: null, fileSize: 1200, @@ -910,6 +969,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 256, @@ -933,6 +994,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 14, createdAt: null, fileSize: 180, @@ -956,6 +1019,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 3, createdAt: null, fileSize: 4200, @@ -979,6 +1044,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 7, createdAt: null, fileSize: 3800, @@ -1003,6 +1070,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 10, createdAt: null, fileSize: 5100, @@ -1027,6 +1096,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 320, @@ -1047,6 +1118,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 280, @@ -1067,6 +1140,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 310, @@ -1087,6 +1162,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 290, @@ -1107,6 +1184,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 200, @@ -1127,6 +1206,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 180, @@ -1147,6 +1228,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 170, @@ -1167,6 +1250,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 200, @@ -1187,6 +1272,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 190, @@ -1208,6 +1295,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 250, @@ -1228,6 +1317,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 220, @@ -1249,6 +1340,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 5, createdAt: null, fileSize: 420, @@ -1271,6 +1364,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: null, cadence: null, archived: false, + trashed: false, + trashedAt: null, modifiedAt: Date.now() / 1000 - 86400 * 14, createdAt: null, fileSize: 380, @@ -1281,6 +1376,81 @@ const MOCK_ENTRIES: VaultEntry[] = [ icon: null, color: null, }, + // --- Trashed entries --- + { + path: '/Users/luca/Laputa/note/old-draft-notes.md', + filename: 'old-draft-notes.md', + title: 'Old Draft Notes', + isA: 'Note', + aliases: [], + belongsTo: ['[[project/26q1-laputa-app]]'], + relatedTo: [], + status: null, + owner: null, + cadence: null, + archived: false, + trashed: true, + trashedAt: Date.now() / 1000 - 86400 * 5, + modifiedAt: Date.now() / 1000 - 86400 * 10, + createdAt: null, + fileSize: 280, + snippet: 'Some rough draft content that is no longer relevant. Moving to trash.', + relationships: { + 'Belongs to': ['[[project/26q1-laputa-app]]'], + 'Type': ['[[type/note]]'], + }, + icon: null, + color: null, + }, + { + path: '/Users/luca/Laputa/note/deprecated-api-notes.md', + filename: 'deprecated-api-notes.md', + title: 'Deprecated API Notes', + isA: 'Note', + aliases: [], + belongsTo: [], + relatedTo: [], + status: null, + owner: null, + cadence: null, + archived: false, + trashed: true, + trashedAt: Date.now() / 1000 - 86400 * 35, + modifiedAt: Date.now() / 1000 - 86400 * 40, + createdAt: null, + fileSize: 190, + snippet: 'Old API documentation for the v1 endpoint. Replaced by v2 docs.', + relationships: { + 'Type': ['[[type/note]]'], + }, + icon: null, + color: null, + }, + { + path: '/Users/luca/Laputa/experiment/failed-seo-experiment.md', + filename: 'failed-seo-experiment.md', + title: 'Failed SEO Experiment', + isA: 'Experiment', + aliases: [], + belongsTo: [], + relatedTo: ['[[responsibility/grow-newsletter]]'], + status: 'Dropped', + owner: 'Luca Rossi', + cadence: null, + archived: false, + trashed: true, + trashedAt: Date.now() / 1000 - 86400 * 10, + modifiedAt: Date.now() / 1000 - 86400 * 15, + createdAt: null, + fileSize: 340, + snippet: 'Tried programmatic SEO pages. Results were negligible — trashing this.', + relationships: { + 'Related to': ['[[responsibility/grow-newsletter]]'], + 'Type': ['[[type/experiment]]'], + }, + icon: null, + color: null, + }, // --- Archived entries --- { path: '/Users/luca/Laputa/project/25q3-website-redesign.md', @@ -1294,6 +1464,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: null, archived: true, + trashed: false, + trashedAt: null, icon: null, color: null, modifiedAt: Date.now() / 1000 - 86400 * 120, @@ -1317,6 +1489,8 @@ const MOCK_ENTRIES: VaultEntry[] = [ owner: 'Luca Rossi', cadence: null, archived: true, + trashed: false, + trashedAt: null, icon: null, color: null, modifiedAt: Date.now() / 1000 - 86400 * 90, diff --git a/src/types.ts b/src/types.ts index 3bf8ec29..c43019a7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,6 +10,8 @@ export interface VaultEntry { owner: string | null cadence: string | null archived: boolean + trashed: boolean + trashedAt: number | null modifiedAt: number | null createdAt: number | null fileSize: number @@ -37,7 +39,7 @@ export interface ModifiedFile { } export type SidebarSelection = - | { kind: 'filter'; filter: 'all' | 'favorites' | 'archived' } + | { kind: 'filter'; filter: 'all' | 'favorites' | 'archived' | 'trash' } | { kind: 'sectionGroup'; type: string } | { kind: 'entity'; entry: VaultEntry } | { kind: 'topic'; entry: VaultEntry } From 2a01f443740a595d3be9efefcf65ff7d3671c83d Mon Sep 17 00:00:00 2001 From: lucaronin Date: Sat, 21 Feb 2026 16:54:59 +0100 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20trash=20notes=20=E2=80=94=20sidebar?= =?UTF-8?q?=20filter,=20list=20view,=20relationship=20indicators?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sidebar: replaced disabled Trash placeholder with active filter showing count badge and destructive color when selected - Sidebar: trashed notes excluded from section groups and All Notes count - NoteList: trash filter shows only trashed entries with TRASHED badge - NoteList: 30-day warning banner when expired trash notes exist - NoteList: per-note warning text for notes past 30-day retention - Inspector: trash icon shown before name in relationship pills for trashed entries, with (trashed) label and dimmed styling - Inspector: backlinks show trash icon for trashed entries Co-Authored-By: Claude Opus 4.6 --- src/components/Inspector.tsx | 33 +++++++++++++-------- src/components/NoteList.tsx | 57 +++++++++++++++++++++++++++++++----- src/components/Sidebar.tsx | 25 ++++++++++++---- 3 files changed, 89 insertions(+), 26 deletions(-) diff --git a/src/components/Inspector.tsx b/src/components/Inspector.tsx index 6dca232a..95a03645 100644 --- a/src/components/Inspector.tsx +++ b/src/components/Inspector.tsx @@ -4,7 +4,7 @@ import type { VaultEntry, GitCommit } from '../types' import { cn } from '@/lib/utils' import { SlidersHorizontal, X, Wrench, Flask, Target, ArrowsClockwise, - Users, CalendarBlank, Tag, FileText, StackSimple, + Users, CalendarBlank, Tag, FileText, StackSimple, Trash, } from '@phosphor-icons/react' import { parseFrontmatter, type ParsedFrontmatter } from '../utils/frontmatter' import { DynamicPropertiesPanel, RELATIONSHIP_KEYS, containsWikilinks } from './DynamicPropertiesPanel' @@ -84,6 +84,8 @@ function RelationshipGroup({ label, refs, entries, onNavigate }: { label: string const resolved = resolveRef(ref, entries) const refType = resolved?.isA ?? undefined const isArchived = resolved?.archived ?? false + const isTrashed = resolved?.trashed ?? false + const isDimmed = isArchived || isTrashed const color = refType ? getTypeColor(refType) : 'var(--accent-blue)' const bgColor = refType ? getTypeLightColor(refType) : 'var(--accent-blue-light)' const TypeIcon = getTypeIcon(refType) @@ -92,19 +94,21 @@ function RelationshipGroup({ label, refs, entries, onNavigate }: { label: string key={`${ref}-${idx}`} className="flex items-center justify-between gap-2 border-none text-left cursor-pointer hover:opacity-80" style={{ - background: isArchived ? 'var(--muted)' : bgColor, - color: isArchived ? 'var(--muted-foreground)' : color, + background: isDimmed ? 'var(--muted)' : bgColor, + color: isDimmed ? 'var(--muted-foreground)' : color, borderRadius: 6, padding: '6px 10px', fontSize: 12, fontWeight: 500, - opacity: isArchived ? 0.7 : 1, + opacity: isDimmed ? 0.7 : 1, }} onClick={() => onNavigate(wikilinkTarget(ref))} - title={isArchived ? 'Archived' : undefined} + title={isTrashed ? 'Trashed' : isArchived ? 'Archived' : undefined} > - + + {isTrashed && } {wikilinkDisplay(ref)} - {isArchived && (archived)} + {isTrashed && (trashed)} + {isArchived && !isTrashed && (archived)} - + ) })} @@ -182,19 +186,22 @@ function BacklinksPanel({ backlinks, onNavigate }: { backlinks: VaultEntry[]; on {backlinks.map((e) => { const color = e.isA ? getTypeColor(e.isA) : 'var(--accent-blue)' const TypeIcon = getTypeIcon(e.isA ?? undefined) + const isDimmed = e.archived || e.trashed return ( ) })} diff --git a/src/components/NoteList.tsx b/src/components/NoteList.tsx index 3ef91fcd..a54ea81d 100644 --- a/src/components/NoteList.tsx +++ b/src/components/NoteList.tsx @@ -6,6 +6,7 @@ import { Input } from '@/components/ui/input' import { MagnifyingGlass, Plus, Wrench, Flask, Target, ArrowsClockwise, Users, CalendarBlank, Tag, FileText, CaretDown, CaretRight, StackSimple, + Trash, Warning, } from '@phosphor-icons/react' import type { ComponentType, SVGAttributes } from 'react' import { getTypeColor, getTypeLightColor } from '../utils/typeColors' @@ -203,20 +204,22 @@ export function filterEntries(entries: VaultEntry[], selection: SidebarSelection case 'filter': switch (selection.filter) { case 'all': - return entries.filter((e) => !e.archived) + return entries.filter((e) => !e.archived && !e.trashed) case 'favorites': return [] case 'archived': - return entries.filter((e) => e.archived) + return entries.filter((e) => e.archived && !e.trashed) + case 'trash': + return entries.filter((e) => e.trashed) } break case 'sectionGroup': - return entries.filter((e) => e.isA === selection.type && !e.archived) + return entries.filter((e) => e.isA === selection.type && !e.archived && !e.trashed) case 'entity': return [] case 'topic': { const topic = selection.entry - return entries.filter((e) => refsMatch(e.relatedTo, topic) && !e.archived) + return entries.filter((e) => refsMatch(e.relatedTo, topic) && !e.archived && !e.trashed) } } } @@ -228,6 +231,7 @@ function NoteListInner({ entries, selection, selectedNote, allContent, modifiedF const isEntityView = selection.kind === 'entity' const isSectionGroup = selection.kind === 'sectionGroup' + const isTrashView = selection.kind === 'filter' && selection.filter === 'trash' const toggleGroup = useCallback((label: string) => { setCollapsedGroups((prev) => { @@ -289,6 +293,12 @@ function NoteListInner({ entries, selection, selectedNote, allContent, modifiedF ) + const expiredTrashCount = useMemo(() => { + if (!isTrashView) return 0 + const now = Date.now() / 1000 + return searched.filter((e) => e.trashedAt && (now - e.trashedAt) >= 86400 * 30).length + }, [isTrashView, searched]) + const renderItem = useCallback((entry: VaultEntry, isPinned = false) => { const isSelected = selectedNote?.path === entry.path && !isPinned const te = typeEntryMap[entry.isA ?? ''] @@ -334,13 +344,23 @@ function NoteListInner({ entries, selection, selectedNote, allContent, modifiedF ARCHIVED )} + {entry.trashed && ( + + TRASHED + + )}
{entry.snippet}
-
- {relativeDate(getDisplayDate(entry))} +
= 86400 * 30 ? { color: 'var(--destructive)', fontWeight: 500 } : undefined}> + {entry.trashed && entry.trashedAt + ? `Trashed ${relativeDate(entry.trashedAt)}${(Date.now() / 1000 - entry.trashedAt) >= 86400 * 30 ? ' — will be permanently deleted' : ''}` + : relativeDate(getDisplayDate(entry))}
) @@ -423,7 +443,9 @@ function NoteListInner({ entries, selection, selectedNote, allContent, modifiedF ? typeDocument.title : selection.kind === 'filter' && (selection as { filter: string }).filter === 'archived' ? 'Archive' - : 'Notes'} + : selection.kind === 'filter' && (selection as { filter: string }).filter === 'trash' + ? 'Trash' + : 'Notes'}
diff --git a/src/components/BreadcrumbBar.tsx b/src/components/BreadcrumbBar.tsx index 89f128c6..c05b2418 100644 --- a/src/components/BreadcrumbBar.tsx +++ b/src/components/BreadcrumbBar.tsx @@ -8,6 +8,8 @@ import { Sparkle, SlidersHorizontal, DotsThree, + Trash, + ArrowCounterClockwise, } from '@phosphor-icons/react' interface BreadcrumbBarProps { @@ -22,6 +24,8 @@ interface BreadcrumbBarProps { onToggleAIChat?: () => void inspectorCollapsed?: boolean onToggleInspector?: () => void + onTrash?: () => void + onRestore?: () => void } const DISABLED_ICON_STYLE = { opacity: 0.4, cursor: 'not-allowed' } as const @@ -29,6 +33,7 @@ const DISABLED_ICON_STYLE = { opacity: 0.4, cursor: 'not-allowed' } as const export const BreadcrumbBar = memo(function BreadcrumbBar({ entry, wordCount, isModified, showDiffToggle, diffMode, diffLoading, onToggleDiff, showAIChat, onToggleAIChat, inspectorCollapsed, onToggleInspector, + onTrash, onRestore, }: BreadcrumbBarProps) { return (
+ {entry.trashed ? ( + + ) : ( + + )} {inspectorCollapsed && (