diff --git a/.gitignore b/.gitignore index 69ada61..11c76ad 100644 --- a/.gitignore +++ b/.gitignore @@ -125,3 +125,6 @@ devtools_options.yaml test/features/*_test.dart **/app_localizations*.dart .env +docs/wireframe.assets/*.excalidraw.svg +docs/wireframe.assets/*.svg +node_modules/ \ No newline at end of file diff --git a/README.md b/README.md index 11acfd6..d1362a7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pdf_signature -A GUI app to create a signature on PDF page interactively. +A GUI app to create signatures on PDF pages interactively. ## Features @@ -15,6 +15,7 @@ flutter pub get # generate gherkin test flutter pub run build_runner build --delete-conflicting-outputs # dart run tool/prune_unused_steps.dart --delete +# dart run tool/gen_view_wireframe_md.dart # run the app flutter run diff --git a/docs/wireframe.assets/first_screen.excalidraw b/docs/wireframe.assets/first_screen.excalidraw new file mode 100644 index 0000000..7db0436 --- /dev/null +++ b/docs/wireframe.assets/first_screen.excalidraw @@ -0,0 +1,1049 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "topbar-rect", + "type": "rectangle", + "x": 100, + "y": 60, + "width": 1000, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 102938475, + "version": 13, + "versionNonce": 1046349494, + "isDeleted": false, + "boundElements": [], + "updated": 1756623169996, + "link": null, + "locked": true + }, + { + "id": "app-title", + "type": "text", + "x": 120, + "y": 78, + "width": 157.46356201171875, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 29384756, + "version": 12, + "versionNonce": 1936113066, + "isDeleted": false, + "boundElements": [], + "updated": 1756626539328, + "link": null, + "locked": false, + "text": "PDF Signature", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PDF Signature", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "gear-label", + "type": "text", + "x": 963.8866170247396, + "y": 77.8426585727268, + "width": 22.298202514648448, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 657483920, + "version": 65, + "versionNonce": 1772931574, + "isDeleted": false, + "boundElements": [], + "updated": 1756626539329, + "link": null, + "locked": false, + "text": "⚙", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "⚙", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "dropzone", + "type": "rectangle", + "x": 333.73695373535156, + "y": 200, + "width": 646.2630462646484, + "height": 380, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 1203948576, + "version": 60, + "versionNonce": 101404074, + "isDeleted": false, + "boundElements": [], + "updated": 1756623242751, + "link": null, + "locked": false + }, + { + "id": "dropzone-text", + "type": "text", + "x": 472.91015625, + "y": 360.8137512207031, + "width": 330.1771240234375, + "height": 29.700000000000003, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 349857102, + "version": 49, + "versionNonce": 1627287722, + "isDeleted": false, + "boundElements": [], + "updated": 1756626554169, + "link": null, + "locked": false, + "text": "Drag a PDF here or click to select", + "fontSize": 22, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Drag a PDF here or click to select", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "HDUAA1jeBtvEIyOKXpfoZ", + "type": "rectangle", + "x": 104.79165649414051, + "y": 132.72271728515625, + "width": 992.4998779296876, + "height": 609.8372192382812, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 1062493290, + "version": 216, + "versionNonce": 1679498294, + "isDeleted": false, + "boundElements": [], + "updated": 1756623165302, + "link": null, + "locked": true + }, + { + "id": "seNguakcMVpYxvk1_bUwl", + "type": "rectangle", + "x": 117.97808983212423, + "y": 138.36198671280425, + "width": 186.65359497070312, + "height": 588.3137512207032, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 1121938218, + "version": 100, + "versionNonce": 68985642, + "isDeleted": false, + "boundElements": [], + "updated": 1756623709368, + "link": null, + "locked": true + }, + { + "id": "MAi6lDHjaNHJBo71nAl6k", + "type": "rectangle", + "x": 954.10010250031, + "y": 71.06057985245275, + "width": 131.2138027615017, + "height": 39.35548782348633, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": null, + "seed": 419392886, + "version": 176, + "versionNonce": 1613190058, + "isDeleted": false, + "boundElements": [], + "updated": 1756623486247, + "link": null, + "locked": false + }, + { + "id": "a9ckadf3R8Gt1Lj0hYIJ6", + "type": "text", + "x": 988.4383325728156, + "y": 79.27564977464226, + "width": 87.77992248535156, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 1939498154, + "version": 54, + "versionNonce": 1142872874, + "isDeleted": false, + "boundElements": [], + "updated": 1756626539329, + "link": null, + "locked": false, + "text": "Configure", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Configure", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "lvzip0DZjK1BX1vU0mU3a", + "type": "text", + "x": 127.02633848644416, + "y": 156.23160104146086, + "width": 125.17988586425781, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 1730640234, + "version": 70, + "versionNonce": 909067382, + "isDeleted": false, + "boundElements": [], + "updated": 1756626539329, + "link": null, + "locked": false, + "text": "Recents PDFs", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Recents PDFs", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "b6pbxZgWhjrgDKm1tXO6q", + "type": "rectangle", + "x": 139.80121370345802, + "y": 245.11180767937321, + "width": 144.32293701171875, + "height": 61.95306396484372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 2064534762, + "version": 151, + "versionNonce": 356135274, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "PLmT2cpc8WPbVPqMhp1mj" + } + ], + "updated": 1756623721330, + "link": null, + "locked": true + }, + { + "id": "PLmT2cpc8WPbVPqMhp1mj", + "type": "text", + "x": 151.24275728255958, + "y": 262.5883396617951, + "width": 121.43984985351562, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aEV", + "roundness": null, + "seed": 1997975402, + "version": 62, + "versionNonce": 2072704554, + "isDeleted": false, + "boundElements": [], + "updated": 1756626545173, + "link": null, + "locked": true, + "text": "Contracts.pdf", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "b6pbxZgWhjrgDKm1tXO6q", + "originalText": "Contracts.pdf", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "ZwTarBKCbh_6-ai2BBxbd", + "type": "rectangle", + "x": 136.77459559364905, + "y": 332.55539084994604, + "width": 144.32293701171875, + "height": 61.95306396484372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": null, + "seed": 1887190326, + "version": 183, + "versionNonce": 452484842, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_6b2tHbyJ3kyxAsbpcuOQ" + } + ], + "updated": 1756623723927, + "link": null, + "locked": true + }, + { + "id": "_6b2tHbyJ3kyxAsbpcuOQ", + "type": "text", + "x": 167.46612391396155, + "y": 350.0319228323679, + "width": 82.93988037109375, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF8", + "roundness": null, + "seed": 55789302, + "version": 45, + "versionNonce": 258667510, + "isDeleted": false, + "boundElements": [], + "updated": 1756626547688, + "link": null, + "locked": true, + "text": "letter.pdf", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZwTarBKCbh_6-ai2BBxbd", + "originalText": "letter.pdf", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "LZKe-Y7H7Hv_X4SY3R0Ps", + "type": "rectangle", + "x": 140.0471514747254, + "y": 426.35747418327946, + "width": 144.32293701171875, + "height": 64, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 519878826, + "version": 199, + "versionNonce": 1387376566, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Cdjuphn_F45RGdoixJtbw" + } + ], + "updated": 1756626549455, + "link": null, + "locked": true + }, + { + "id": "Cdjuphn_F45RGdoixJtbw", + "type": "text", + "x": 146.3086947486512, + "y": 431.35747418327946, + "width": 131.7998504638672, + "height": 54, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aGV", + "roundness": null, + "seed": 512425590, + "version": 22, + "versionNonce": 776654506, + "isDeleted": false, + "boundElements": [], + "updated": 1756626549455, + "link": null, + "locked": true, + "text": "agrrements.pd\nf", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "LZKe-Y7H7Hv_X4SY3R0Ps", + "originalText": "agrrements.pdf", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "clU9wDIu9F56jVex_8rtB", + "type": "rectangle", + "x": 128.37470003158302, + "y": 190.46775792893916, + "width": 160.67418077256946, + "height": 37, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": null, + "seed": 1511287414, + "version": 99, + "versionNonce": 2058216938, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "9PgedBB-dCbCj6yATTvA7" + } + ], + "updated": 1756626539329, + "link": null, + "locked": false + }, + { + "id": "9PgedBB-dCbCj6yATTvA7", + "type": "text", + "x": 179.26182398720368, + "y": 195.46775792893916, + "width": 58.899932861328125, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 199568682, + "version": 59, + "versionNonce": 1006323126, + "isDeleted": false, + "boundElements": [], + "updated": 1756626539329, + "link": null, + "locked": false, + "text": "search", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "clU9wDIu9F56jVex_8rtB", + "originalText": "search", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "xdjwEB-znvBqkgNWqei0e", + "type": "rectangle", + "x": 829.345613801518, + "y": 73.27856093258742, + "width": 109.23454710748254, + "height": 36.33306860750372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "a_nIXU9JKF6NQxqDn6778" + ], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 1079291190, + "version": 165, + "versionNonce": 1774775286, + "isDeleted": false, + "boundElements": [], + "updated": 1756646729695, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 769, + "versionNonce": 754187574, + "isDeleted": false, + "id": "7kiaSLfvSEdtaNYQBYwzh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 841.4747836141609, + "y": 84.61996518660985, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 22.637490885793227, + "height": 13.582494531475936, + "seed": 1458935414, + "groupIds": [ + "s9zt_E4Q8I28ITXmLtTku", + "a_nIXU9JKF6NQxqDn6778" + ], + "boundElements": [], + "updated": 1756646729695, + "link": null, + "locked": false, + "index": "aL", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 786, + "versionNonce": 321578614, + "isDeleted": false, + "id": "CbsiEXCcAqMJ4HF8vzcR3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 855.0572781456366, + "y": 84.61996518660985, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 13.582494531475936, + "height": 4.5274981771586456, + "seed": 1411864502, + "groupIds": [ + "s9zt_E4Q8I28ITXmLtTku", + "a_nIXU9JKF6NQxqDn6778" + ], + "boundElements": [], + "updated": 1756646729695, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.5274981771586456, + -4.5274981771586456 + ], + [ + -13.582494531475934, + -4.527498177158644 + ], + [ + -13.582494531475936, + -8.881784197001252e-16 + ], + [ + 0, + 0 + ] + ], + "index": "aM", + "frameId": null, + "roundness": null, + "polygon": false + }, + { + "id": "qiIJiYioLPMG7pTYwhrg5", + "type": "text", + "x": 877.3865259161674, + "y": 77.10300187674156, + "width": 49.27995300292969, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "a_nIXU9JKF6NQxqDn6778" + ], + "frameId": null, + "index": "aN", + "roundness": null, + "seed": 1611591926, + "version": 76, + "versionNonce": 2100471734, + "isDeleted": false, + "boundElements": [], + "updated": 1756646729695, + "link": null, + "locked": false, + "text": "Open", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Open", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "type": "rectangle", + "version": 447, + "versionNonce": 1428930594, + "isDeleted": false, + "id": "CvUvdJBdFi_9gk7DmBP3h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1276.5699538308854, + "y": -105.41567571464518, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 41.296072889060916, + "height": 9.620822332911771, + "seed": 324223266, + "groupIds": [ + "FhaLGab-lElwTXWsop0jD", + "ALJlvV1mOFRZHOCbgoRYA" + ], + "index": "aO", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1756647328403, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 467, + "versionNonce": 734227426, + "isDeleted": false, + "id": "JST3yuxNBZUHRvRS5svAi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1276.5699538308854, + "y": -120.86895124654592, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 41.0018486675741, + "height": 9.620822332911771, + "seed": 458411234, + "groupIds": [ + "FhaLGab-lElwTXWsop0jD", + "ALJlvV1mOFRZHOCbgoRYA" + ], + "index": "aP", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1756647328404, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 546, + "versionNonce": 1911529378, + "isDeleted": false, + "id": "BdE7Lsbj5rN-2Fbc_g8TY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1276.3519181972783, + "y": -136.32222677844666, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 40.89858173493463, + "height": 8.789494679651982, + "seed": 1525342370, + "groupIds": [ + "FhaLGab-lElwTXWsop0jD", + "ALJlvV1mOFRZHOCbgoRYA" + ], + "index": "aQ", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1756647328404, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 306, + "versionNonce": 1407146850, + "isDeleted": false, + "id": "aMLLNSOvXTWAD4qesWqN6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1285.8386804713773, + "y": -86.87954484494927, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 24.33822760138865, + "height": 12.945865745419493, + "seed": 1573551202, + "groupIds": [ + "ALJlvV1mOFRZHOCbgoRYA" + ], + "fontSize": 10.356692596335595, + "fontFamily": 1, + "text": "Menu", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "index": "aR", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "Zq3EuupF1HmOWACV2oefy", + "type": "arrow" + } + ], + "updated": 1756647328404, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Menu", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lOTebkqDHtT4BBQALESig", + "type": "rectangle", + "x": 790.384031749907, + "y": 36.693096342540855, + "width": 335.5208042689734, + "height": 109.54448154994424, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": { + "type": 3 + }, + "seed": 1783740578, + "version": 55, + "versionNonce": 1405945982, + "isDeleted": false, + "boundElements": [ + { + "id": "Zq3EuupF1HmOWACV2oefy", + "type": "arrow" + } + ], + "updated": 1756647293005, + "link": null, + "locked": false + }, + { + "id": "Zq3EuupF1HmOWACV2oefy", + "type": "arrow", + "x": 1128.0299808310733, + "y": 66.13666497128354, + "width": 153.447595240714, + "height": 132.2939715962288, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": { + "type": 2 + }, + "seed": 581324706, + "version": 170, + "versionNonce": 410803618, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "f9MY_jyhZB6ng-Fp--Exn" + } + ], + "updated": 1756647332367, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 153.447595240714, + -132.2939715962288 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lOTebkqDHtT4BBQALESig", + "focus": 0.6098248915581349, + "gap": 2.241472516741169 + }, + "endBinding": { + "elementId": "aMLLNSOvXTWAD4qesWqN6", + "focus": 0, + "gap": 12.733143243255915 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "f9MY_jyhZB6ng-Fp--Exn", + "type": "text", + "x": 1107.8638629851216, + "y": -25.010320826830863, + "width": 193.7798309326172, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": null, + "seed": 1827590818, + "version": 61, + "versionNonce": 1563426338, + "isDeleted": false, + "boundElements": null, + "updated": 1756647330897, + "link": null, + "locked": false, + "text": "group to 1 symbol if\nscreen is thin", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Zq3EuupF1HmOWACV2oefy", + "originalText": "group to 1 symbol if screen is thin", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/wireframe.assets/with_configure_screen.excalidraw b/docs/wireframe.assets/with_configure_screen.excalidraw new file mode 100644 index 0000000..ca412ea --- /dev/null +++ b/docs/wireframe.assets/with_configure_screen.excalidraw @@ -0,0 +1,981 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "RJI8QD55RACPAUCo2GKoo", + "type": "rectangle", + "x": -140.36046055385032, + "y": 11.486575452108639, + "width": 186.65359497070312, + "height": 588.3137512207032, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zR9PoqVUXJn-p5Me-QWmK" + ], + "frameId": null, + "index": "Zy", + "roundness": null, + "seed": 230239768, + "version": 198, + "versionNonce": 1765613558, + "isDeleted": false, + "boundElements": [], + "updated": 1756647250652, + "link": null, + "locked": false + }, + { + "id": "VWdv1VE8pzad1EwZuyYgo", + "type": "text", + "x": -131.31221189953033, + "y": 29.35618978076525, + "width": 125.17988586425781, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zR9PoqVUXJn-p5Me-QWmK" + ], + "frameId": null, + "index": "Zz", + "roundness": null, + "seed": 530295576, + "version": 153, + "versionNonce": 748520042, + "isDeleted": false, + "boundElements": [], + "updated": 1756647250652, + "link": null, + "locked": false, + "text": "Recents PDFs", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Recents PDFs", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "WKRHjAMR0he0xqbtoR-bH", + "type": "rectangle", + "x": 0.024998256138360375, + "y": 98.93073527018237, + "width": 741.8097795758928, + "height": 474.05282317979203, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a0", + "roundness": null, + "seed": 1506495512, + "version": 111, + "versionNonce": 657893430, + "isDeleted": false, + "boundElements": [], + "updated": 1756647231508, + "link": null, + "locked": false + }, + { + "id": "gtEzgCZGX1lFA4HjD_xY_", + "type": "text", + "x": 87.19040296469939, + "y": 121.50467923112484, + "width": 84.4264505231206, + "height": 30.474824347272346, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 532285720, + "version": 103, + "versionNonce": 1545526134, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Settings", + "fontSize": 22.57394396094248, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Settings", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "pGsYJy75OHZYTrkjzSwnf", + "type": "text", + "x": 707.9738618906175, + "y": 115.86119324088922, + "width": 12.189847070657128, + "height": 27.42734191254511, + "angle": 0, + "strokeColor": "#111827", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 315172376, + "version": 103, + "versionNonce": 510082794, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "×", + "fontSize": 20.31654956484823, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "×", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "blOqLsCAyD5v2UW23ped-", + "type": "text", + "x": 87.19040296469939, + "y": 166.65256715300978, + "width": 72.38740412180704, + "height": 27.42734191254511, + "angle": 0, + "strokeColor": "#111827", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1877779224, + "version": 103, + "versionNonce": 1306524854, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "General", + "fontSize": 20.31654956484823, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "General", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "de3wHTnwHHk_Sj716L0AD", + "type": "text", + "x": 109.76434692564192, + "y": 200.51348309442352, + "width": 84.84209960420075, + "height": 24.379859477817877, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 899186712, + "version": 103, + "versionNonce": 2108936618, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Language:", + "fontSize": 18.059155168753982, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Language:", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "u274PAAExIXPOY5MjR_Sl", + "type": "rectangle", + "x": 233.92103871082554, + "y": 191.48390551004653, + "width": 338.60915941413714, + "height": 36.118310337507964, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1942011160, + "version": 101, + "versionNonce": 1164637686, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false + }, + { + "id": "d97Kf0eOcwYJybE20fjfu", + "type": "text", + "x": 86.99933596770336, + "y": 269.5432989464112, + "width": 69.07583451216198, + "height": 27.42734191254511, + "angle": 0, + "strokeColor": "#111827", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 467229208, + "version": 112, + "versionNonce": 1398803562, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Display", + "fontSize": 20.31654956484823, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Display", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "M1joCnME850ZafH3FL-E_", + "type": "text", + "x": 109.57327992864577, + "y": 303.40421488782493, + "width": 60.91367078245484, + "height": 24.379859477817877, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 1356224280, + "version": 112, + "versionNonce": 465880886, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Theme:", + "fontSize": 18.059155168753982, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Theme:", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "8Mp1jT3NSsibB3kogMubl", + "type": "rectangle", + "x": 233.9110668529509, + "y": 279.88530391848326, + "width": 338.60915941413714, + "height": 36.118310337507964, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 925611032, + "version": 114, + "versionNonce": 87486250, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false + }, + { + "id": "P2kfltnFMgp1Hpns5eRsk", + "type": "text", + "x": 109.57327992864577, + "y": 337.2651308292386, + "width": 88.30944720085046, + "height": 24.379859477817877, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "a9", + "roundness": null, + "seed": 1154314520, + "version": 112, + "versionNonce": 1095921782, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Page view:", + "fontSize": 18.059155168753982, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Page view:", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "vmM82c6vkYHi9E8_orBEx", + "type": "rectangle", + "x": 233.72997171382946, + "y": 328.23555324486165, + "width": 338.60915941413714, + "height": 36.118310337507964, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 288329240, + "version": 110, + "versionNonce": 128154090, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false + }, + { + "id": "Q0v5ejctIV2msui0iDFEg", + "type": "rectangle", + "x": 414.5125903983653, + "y": 505.261726567147, + "width": 124.15669178518363, + "height": 40.63309912969646, + "angle": 0, + "strokeColor": "#1f2937", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "aB", + "roundness": null, + "seed": 625347352, + "version": 101, + "versionNonce": 1373172150, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false + }, + { + "id": "QSD6mQUNvCKRLZtin0AHX", + "type": "text", + "x": 442.73002034954345, + "y": 514.291304151524, + "width": 55.13471219456543, + "height": 24.379859477817877, + "angle": 0, + "strokeColor": "#1f2937", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 1267001368, + "version": 103, + "versionNonce": 162573482, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Cancel", + "fontSize": 18.059155168753982, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cancel", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "fmP0hKBOaNa5Ge12TEwyD", + "type": "rectangle", + "x": 561.2432261444915, + "y": 505.261726567147, + "width": 146.7306357461261, + "height": 40.63309912969646, + "angle": 0, + "strokeColor": "#1f2937", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 1608525080, + "version": 101, + "versionNonce": 679299830, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false + }, + { + "id": "iXKBOvEPDEax0jv78PxKB", + "type": "text", + "x": 601.8763252741879, + "y": 514.291304151524, + "width": 39.54961113185798, + "height": 24.379859477817877, + "angle": 0, + "strokeColor": "#1f2937", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nQmqS53zA9IffPy8AAZwV" + ], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 533447192, + "version": 103, + "versionNonce": 554272618, + "isDeleted": false, + "boundElements": [], + "updated": 1756647235527, + "link": null, + "locked": false, + "text": "Save", + "fontSize": 18.059155168753982, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Save", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "NjGNkNhtOARJpj03cEb51", + "type": "rectangle", + "x": -158.10173397972483, + "y": 0.8265845889135903, + "width": 992.4998779296876, + "height": 609.8372192382812, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": null, + "seed": 668606488, + "version": 100, + "versionNonce": 1234867048, + "isDeleted": false, + "boundElements": [], + "updated": 1756647200609, + "link": null, + "locked": false + }, + { + "id": "bb7EhwFW0ROfjqxlOkqmm", + "type": "rectangle", + "x": -155.50977434430797, + "y": -69.53801908947162, + "width": 1000, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lHEbf-Drffn9NvXktYUuc" + ], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 1825463576, + "version": 115, + "versionNonce": 1176442904, + "isDeleted": false, + "boundElements": [], + "updated": 1756647163877, + "link": null, + "locked": false + }, + { + "id": "D19DG1HUQ57QlAvyGFl0V", + "type": "text", + "x": -135.50977434430797, + "y": -51.53801908947162, + "width": 157.46356201171875, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "lHEbf-Drffn9NvXktYUuc" + ], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 1647507992, + "version": 132, + "versionNonce": 1739871512, + "isDeleted": false, + "boundElements": [], + "updated": 1756647163877, + "link": null, + "locked": false, + "text": "PDF Signature", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PDF Signature", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "PdeNL3GtypJzGH5vBfCOZ", + "type": "rectangle", + "x": 698.590328156002, + "y": -58.47743923701887, + "width": 131.2138027615017, + "height": 39.35548782348633, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "WavtKMDY86ikKkLfh5Q4r", + "lHEbf-Drffn9NvXktYUuc" + ], + "frameId": null, + "index": "aI", + "roundness": null, + "seed": 1526462232, + "version": 123, + "versionNonce": 2107240984, + "isDeleted": false, + "boundElements": [], + "updated": 1756647163877, + "link": null, + "locked": false + }, + { + "id": "RzeDdJRNeKB2rEjlgqsfH", + "type": "text", + "x": 708.3768426804317, + "y": -51.69536051674481, + "width": 22.298202514648448, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "WavtKMDY86ikKkLfh5Q4r", + "lHEbf-Drffn9NvXktYUuc" + ], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 731730968, + "version": 125, + "versionNonce": 1589899032, + "isDeleted": false, + "boundElements": [], + "updated": 1756647163877, + "link": null, + "locked": false, + "text": "⚙", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "⚙", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "hdqpl5nHgrXR_nhbDZDQ-", + "type": "text", + "x": 732.9285582285077, + "y": -50.26236931482936, + "width": 87.77992248535156, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "WavtKMDY86ikKkLfh5Q4r", + "lHEbf-Drffn9NvXktYUuc" + ], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 2047545624, + "version": 125, + "versionNonce": 1671842840, + "isDeleted": false, + "boundElements": [], + "updated": 1756647163877, + "link": null, + "locked": false, + "text": "Configure", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Configure", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "iIDobnzWCl-gygCOsA73n", + "type": "rectangle", + "x": 576.109131998714, + "y": -56.43111661983278, + "width": 109.23454710748254, + "height": 36.33306860750372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2xO--DSh2411Pyp1YG0B4" + ], + "frameId": null, + "index": "ac", + "roundness": null, + "seed": 1897278824, + "version": 221, + "versionNonce": 536065304, + "isDeleted": false, + "boundElements": [], + "updated": 1756647186276, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 825, + "versionNonce": 921522712, + "isDeleted": false, + "id": "rumws8Xb5KM1-COUn-SjA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 588.2383018113569, + "y": -45.08971236581036, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 22.637490885793227, + "height": 13.582494531475936, + "seed": 331104360, + "groupIds": [ + "1FZGUtYp_0lg0mZX7lxmQ", + "2xO--DSh2411Pyp1YG0B4" + ], + "boundElements": [], + "updated": 1756647186276, + "link": null, + "locked": false, + "index": "ad", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 842, + "versionNonce": 1454067480, + "isDeleted": false, + "id": "l8Hqi6JegDC-MxE036F3N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 601.8207963428326, + "y": -45.08971236581036, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 13.582494531475936, + "height": 4.5274981771586456, + "seed": 1042805608, + "groupIds": [ + "1FZGUtYp_0lg0mZX7lxmQ", + "2xO--DSh2411Pyp1YG0B4" + ], + "boundElements": [], + "updated": 1756647186276, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.5274981771586456, + -4.5274981771586456 + ], + [ + -13.582494531475934, + -4.527498177158644 + ], + [ + -13.582494531475936, + -8.881784197001252e-16 + ], + [ + 0, + 0 + ] + ], + "index": "ae", + "frameId": null, + "roundness": null, + "polygon": false + }, + { + "id": "C8V0VrPmqft0_wEEXIh2G", + "type": "text", + "x": 624.1500441133635, + "y": -52.606675675678645, + "width": 49.27995300292969, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2xO--DSh2411Pyp1YG0B4" + ], + "frameId": null, + "index": "af", + "roundness": null, + "seed": 648365672, + "version": 132, + "versionNonce": 664906776, + "isDeleted": false, + "boundElements": [], + "updated": 1756647186276, + "link": null, + "locked": false, + "text": "Open", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Open", + "autoResize": true, + "lineHeight": 1.35 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/wireframe.assets/with_pdf_opened.excalidraw b/docs/wireframe.assets/with_pdf_opened.excalidraw new file mode 100644 index 0000000..3c2347e --- /dev/null +++ b/docs/wireframe.assets/with_pdf_opened.excalidraw @@ -0,0 +1,1708 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "id": "topbar", + "type": "rectangle", + "x": 80, + "y": 50, + "width": 1040, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 1001, + "version": 3, + "versionNonce": 1, + "isDeleted": false, + "boundElements": [], + "updated": 1756622420000, + "link": null, + "locked": false + }, + { + "id": "thumbs", + "type": "rectangle", + "x": 102.48263041178382, + "y": 134.76353963216147, + "width": 158.04682413736987, + "height": 589.4899749755859, + "angle": 0, + "strokeColor": "#1f2937", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1003, + "version": 112, + "versionNonce": 1259126921, + "isDeleted": false, + "boundElements": [], + "updated": 1756625049829, + "link": null, + "locked": false + }, + { + "id": "thumb-1", + "type": "rectangle", + "x": 128.46135457356775, + "y": 188.01002502441398, + "width": 102.91015625, + "height": 109.43796793619796, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 1004, + "version": 119, + "versionNonce": 644302503, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "gdOJNBW3RXbb3XqrV8m_j" + } + ], + "updated": 1756624923267, + "link": null, + "locked": false + }, + { + "id": "gdOJNBW3RXbb3XqrV8m_j", + "type": "text", + "x": 151.47646077473962, + "y": 229.22900899251295, + "width": 56.87994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4V", + "roundness": null, + "seed": 552652073, + "version": 95, + "versionNonce": 1487376327, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "page1", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "thumb-1", + "originalText": "page1", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "thumb-2", + "type": "rectangle", + "x": 139.97398376464844, + "y": 335.77476501464844, + "width": 97.08328247070314, + "height": 134.98046874999997, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1005, + "version": 90, + "versionNonce": 387456489, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Gs_DUiE5dIevh4J_3VybF" + } + ], + "updated": 1756624676182, + "link": null, + "locked": false + }, + { + "id": "Gs_DUiE5dIevh4J_3VybF", + "type": "text", + "x": 160.07565307617188, + "y": 389.76499938964844, + "width": 56.87994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5V", + "roundness": null, + "seed": 1852090887, + "version": 9, + "versionNonce": 321877033, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "page2", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "thumb-2", + "originalText": "page2", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "thumb-3", + "type": "rectangle", + "x": 129.98046875, + "y": 504.5247650146483, + "width": 107.07679748535156, + "height": 132.89710998535156, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 1006, + "version": 90, + "versionNonce": 835394887, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WSm5BOXyIB4U9Lz1ZTU2N" + } + ], + "updated": 1756624680001, + "link": null, + "locked": false + }, + { + "id": "WSm5BOXyIB4U9Lz1ZTU2N", + "type": "text", + "x": 155.07889556884766, + "y": 557.4733200073241, + "width": 56.87994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6V", + "roundness": null, + "seed": 1004691401, + "version": 9, + "versionNonce": 282066663, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "page3", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "thumb-3", + "originalText": "page3", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "Zlbcb7O7cESel573iGnyd", + "type": "rectangle", + "x": 93.09250386555988, + "y": 117.30168427361446, + "width": 1010.826599121094, + "height": 609.8372192382812, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 859336935, + "version": 285, + "versionNonce": 1814445129, + "isDeleted": false, + "boundElements": [], + "updated": 1756624429747, + "link": null, + "locked": true + }, + { + "id": "XHSy4WnDUOfyyUdwGMREJ", + "type": "rectangle", + "x": 965.1736416286892, + "y": 62.08833991156746, + "width": 131.2138027615017, + "height": 39.35548782348633, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "g6xgRLYEAH0Xk-8ERAiVA" + ], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 1555386313, + "version": 46, + "versionNonce": 1543058407, + "isDeleted": false, + "boundElements": [], + "updated": 1756624508350, + "link": null, + "locked": false + }, + { + "id": "kCK1TTUNXbqCC1thrRd4t", + "type": "text", + "x": 974.9601561531192, + "y": 68.87041863184152, + "width": 22.298202514648448, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "g6xgRLYEAH0Xk-8ERAiVA" + ], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 1659530921, + "version": 48, + "versionNonce": 593561353, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "⚙", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "⚙", + "autoResize": false, + "lineHeight": 1.35 + }, + { + "id": "aWLGJezZtFIopTKKVUS21", + "type": "text", + "x": 999.5118717011953, + "y": 70.30340983375697, + "width": 87.77992248535156, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "g6xgRLYEAH0Xk-8ERAiVA" + ], + "frameId": null, + "index": "aM", + "roundness": null, + "seed": 1725477257, + "version": 78, + "versionNonce": 73239047, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "Configure", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Configure", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "pN31vdQgEQsQTd9LqAtrp", + "type": "rectangle", + "x": 325.4520228944226, + "y": 301.960259180221, + "width": 454.3893487186844, + "height": 416.07849121093744, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": null, + "seed": 2064848937, + "version": 229, + "versionNonce": 1250237447, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ak6J4tfiegak_JzKTyTTD" + } + ], + "updated": 1756626597844, + "link": null, + "locked": true + }, + { + "id": "ak6J4tfiegak_JzKTyTTD", + "type": "text", + "x": 524.2067253299367, + "y": 496.49950478568974, + "width": 56.87994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": null, + "seed": 389032713, + "version": 145, + "versionNonce": 1626328041, + "isDeleted": false, + "boundElements": [], + "updated": 1756626597844, + "link": null, + "locked": true, + "text": "page2", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pN31vdQgEQsQTd9LqAtrp", + "originalText": "page2", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "F76Wd6a2fFww1_NDaaNfZ", + "type": "rectangle", + "x": 319.08125724239096, + "y": 131.0944627731572, + "width": 461.6878174864417, + "height": 113.18134307861322, + "angle": 0, + "strokeColor": "#6b7280", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 1346945097, + "version": 281, + "versionNonce": 1657875881, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "LxT7_4HRWLyFxSrv7OIKh" + } + ], + "updated": 1756625686353, + "link": null, + "locked": false + }, + { + "id": "LxT7_4HRWLyFxSrv7OIKh", + "type": "text", + "x": 521.4851940617837, + "y": 174.18513431246382, + "width": 56.87994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": null, + "seed": 1673252649, + "version": 202, + "versionNonce": 1078767911, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "page1", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "F76Wd6a2fFww1_NDaaNfZ", + "originalText": "page1", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "nfrsieMiuqFplgD4IGhD9", + "type": "rectangle", + "x": 108.59586079915357, + "y": 131.71744791666669, + "width": 691.0762911945586, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": null, + "seed": 396258633, + "version": 178, + "versionNonce": 1022335177, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false + }, + { + "id": "zoom-", + "type": "text", + "x": 630.0716857910156, + "y": 141.29579994895244, + "width": 8.18438720703125, + "height": 18.430332599986684, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "r8UQCQ2BudsD9_j2c_B2W" + ], + "frameId": null, + "index": "aZ", + "roundness": null, + "seed": 1016, + "version": 83, + "versionNonce": 921933737, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "−", + "fontSize": 13.652098222212357, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "−", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "zoom-value", + "type": "text", + "x": 645.240683815696, + "y": 141.29579994895244, + "width": 37.279876708984375, + "height": 18.430332599986684, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "r8UQCQ2BudsD9_j2c_B2W" + ], + "frameId": null, + "index": "aa", + "roundness": null, + "seed": 1017, + "version": 83, + "versionNonce": 359781223, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "100%", + "fontSize": 13.652098222212357, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "100%", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "zoom+", + "type": "text", + "x": 681.646279074929, + "y": 141.29579994895244, + "width": 8.18438720703125, + "height": 18.430332599986684, + "angle": 0, + "strokeColor": "#374151", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "r8UQCQ2BudsD9_j2c_B2W" + ], + "frameId": null, + "index": "ab", + "roundness": null, + "seed": 1018, + "version": 83, + "versionNonce": 299154057, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498564, + "link": null, + "locked": false, + "text": "+", + "fontSize": 13.652098222212357, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "+", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "-9UWBd4AturQx2OL5HZ4u", + "type": "text", + "x": 345.0416303362167, + "y": 138.75596346552493, + "width": 165.37982177734375, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ac", + "roundness": null, + "seed": 1254868007, + "version": 60, + "versionNonce": 129406249, + "isDeleted": false, + "boundElements": [], + "updated": 1756646374710, + "link": null, + "locked": false, + "text": "file:agreement.pdf", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "file:agreement.pdf", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "nav-prev", + "type": "text", + "x": 131.8096923828125, + "y": 141.26295471191406, + "width": 13.8427734375, + "height": 24.3, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "4h3rvJ5DuPOaXNi2cTIGn" + ], + "frameId": null, + "index": "ad", + "roundness": null, + "seed": 1013, + "version": 147, + "versionNonce": 2119074153, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "◀", + "fontSize": 18, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "◀", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "nav-page", + "type": "text", + "x": 161.8096923828125, + "y": 139.26295471191406, + "width": 92.57337951660156, + "height": 24.3, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "4h3rvJ5DuPOaXNi2cTIGn" + ], + "frameId": null, + "index": "ae", + "roundness": null, + "seed": 1014, + "version": 150, + "versionNonce": 887317927, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "Page 2 / 10", + "fontSize": 18, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Page 2 / 10", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "nav-next", + "type": "text", + "x": 271.35278875177556, + "y": 140.0437497225675, + "width": 13.8427734375, + "height": 24.3, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "4h3rvJ5DuPOaXNi2cTIGn" + ], + "frameId": null, + "index": "af", + "roundness": null, + "seed": 1015, + "version": 179, + "versionNonce": 162294857, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "▶", + "fontSize": 18, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "▶", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "iBaRmcgeuIwk3OfI02kuL", + "type": "rectangle", + "x": 810.3571470338211, + "y": 141.27303387929163, + "width": 253.3040877100313, + "height": 554.9518986672008, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ag", + "roundness": null, + "seed": 1975872585, + "version": 182, + "versionNonce": 1498742761, + "isDeleted": false, + "boundElements": [], + "updated": 1756625664404, + "link": null, + "locked": false + }, + { + "id": "bQhWHcHOeQEQswogh0A7o", + "type": "text", + "x": 116.47877014888672, + "y": 65.5262467821016, + "width": 157.46356201171875, + "height": 32.400000000000006, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ah", + "roundness": null, + "seed": 1794586217, + "version": 50, + "versionNonce": 114694343, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "PDF Signature", + "fontSize": 24, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PDF Signature", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "XixBzXhYxxZLeqjg8z0ZO", + "type": "rectangle", + "x": 827.0336106324435, + "y": 162.60581025133592, + "width": 211.53344390600182, + "height": 87.10747268498352, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ai", + "roundness": null, + "seed": 891929161, + "version": 71, + "versionNonce": 306274281, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "whP9P0oU10wxfki5Tzc62" + }, + { + "id": "IcoXGklBcxgzbrgxgcIkQ", + "type": "arrow" + } + ], + "updated": 1756626270315, + "link": null, + "locked": false + }, + { + "id": "whP9P0oU10wxfki5Tzc62", + "type": "text", + "x": 843.3004241381788, + "y": 192.65954659382768, + "width": 178.99981689453125, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aiV", + "roundness": null, + "seed": 455291975, + "version": 32, + "versionNonce": 197786409, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "signature 1 preview", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "XixBzXhYxxZLeqjg8z0ZO", + "originalText": "signature 1 preview", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "Z55O9bqO71SGHYMaUBPhR", + "type": "rectangle", + "x": 830.9167767144809, + "y": 371.74081562846106, + "width": 211.53344390600182, + "height": 106.79561266731257, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "amG", + "roundness": null, + "seed": 1049648681, + "version": 161, + "versionNonce": 1622262311, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "XeRDzIu_O7UfMwzj2jVSr" + } + ], + "updated": 1756626080687, + "link": null, + "locked": false + }, + { + "id": "XeRDzIu_O7UfMwzj2jVSr", + "type": "text", + "x": 869.7335627543958, + "y": 376.74081562846106, + "width": 133.89987182617188, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "amV", + "roundness": null, + "seed": 931906631, + "version": 71, + "versionNonce": 1027461895, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": " new signature", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "top", + "containerId": "Z55O9bqO71SGHYMaUBPhR", + "originalText": " new signature", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "IyLBn_6s8mdEe3m4j4aVa", + "type": "rectangle", + "x": 847.9390554128533, + "y": 403.00447723591344, + "width": 78.54616510032311, + "height": 64, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "aml", + "roundness": null, + "seed": 92751719, + "version": 149, + "versionNonce": 478282985, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "DF_YBy8mO-3zg5Qml1Ob8" + }, + { + "id": "oBLDDEiNeM4ftDjo0B4oS", + "type": "arrow" + } + ], + "updated": 1756626498565, + "link": null, + "locked": false + }, + { + "id": "DF_YBy8mO-3zg5Qml1Ob8", + "type": "text", + "x": 866.0221584097923, + "y": 408.00447723591344, + "width": 42.37995910644531, + "height": 54, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 446978921, + "version": 84, + "versionNonce": 1748752935, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "from\nfile", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IyLBn_6s8mdEe3m4j4aVa", + "originalText": "from file", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "jv-o_lsyoFbRU2v247F0e", + "type": "rectangle", + "x": 953.5213155306128, + "y": 407.1068678489766, + "width": 59.8151745391508, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "anV", + "roundness": null, + "seed": 1577206471, + "version": 87, + "versionNonce": 1169684135, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "S7pHJH_ya1LUkqOu0N0EC" + } + ], + "updated": 1756626080687, + "link": null, + "locked": false + }, + { + "id": "S7pHJH_ya1LUkqOu0N0EC", + "type": "text", + "x": 960.2389308763601, + "y": 423.6068678489766, + "width": 46.37994384765625, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IODWxMS4XOK97EEJ9giJd" + ], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 509366759, + "version": 74, + "versionNonce": 765689801, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "draw", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "jv-o_lsyoFbRU2v247F0e", + "originalText": "draw", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "pLSlN_M61Uiudwuy70z_h", + "type": "rectangle", + "x": 852.0588495823167, + "y": 621.478834804223, + "width": 164.7117303241327, + "height": 54.0073862032541, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": { + "type": 3 + }, + "seed": 1346415783, + "version": 132, + "versionNonce": 1472685033, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "NyLAd21ZYYngMMBcBhfZ_" + } + ], + "updated": 1756626091145, + "link": null, + "locked": false + }, + { + "id": "NyLAd21ZYYngMMBcBhfZ_", + "type": "text", + "x": 904.844745567137, + "y": 634.98252790585, + "width": 59.13993835449219, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": null, + "seed": 1815080073, + "version": 23, + "versionNonce": 271318343, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "export", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pLSlN_M61Uiudwuy70z_h", + "originalText": "export", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "8Mrx4xKoYQb9pYl6Nz7lJ", + "type": "rectangle", + "x": 829.6765765874698, + "y": 267.092786204764, + "width": 211.53344390600182, + "height": 87.10747268498352, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 233656615, + "version": 95, + "versionNonce": 1352197063, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "g5CeVohCoK1BBB9N-B-V8" + }, + { + "id": "oBLDDEiNeM4ftDjo0B4oS", + "type": "arrow" + } + ], + "updated": 1756626122191, + "link": null, + "locked": false + }, + { + "id": "g5CeVohCoK1BBB9N-B-V8", + "type": "text", + "x": 845.943390093205, + "y": 297.1465225472558, + "width": 178.99981689453125, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "au", + "roundness": null, + "seed": 244749383, + "version": 60, + "versionNonce": 1452449449, + "isDeleted": false, + "boundElements": [], + "updated": 1756626498565, + "link": null, + "locked": false, + "text": "signature 2 preview", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8Mrx4xKoYQb9pYl6Nz7lJ", + "originalText": "signature 2 preview", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "oBLDDEiNeM4ftDjo0B4oS", + "type": "arrow", + "x": 824.0531494801987, + "y": 315.7097111409047, + "width": 125.23480537103046, + "height": 263.9451586265342, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": { + "type": 2 + }, + "seed": 1498168745, + "version": 153, + "versionNonce": 113571591, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "4xE9aa2ywOSlZgWwTQhwK" + } + ], + "updated": 1756626625057, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -101.6065507296687, + 140.74088224558102 + ], + [ + -125.23480537103046, + 263.9451586265342 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8Mrx4xKoYQb9pYl6Nz7lJ", + "focus": 0.785182438526405, + "gap": 5.623427107271027 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4xE9aa2ywOSlZgWwTQhwK", + "type": "text", + "x": 658.6866576494558, + "y": 442.9505933864857, + "width": 127.51988220214844, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "avV", + "roundness": null, + "seed": 1357516649, + "version": 15, + "versionNonce": 34477865, + "isDeleted": false, + "boundElements": [], + "updated": 1756626623767, + "link": null, + "locked": false, + "text": "drag and drop", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oBLDDEiNeM4ftDjo0B4oS", + "originalText": "drag and drop", + "autoResize": true, + "lineHeight": 1.35 + }, + { + "id": "IcoXGklBcxgzbrgxgcIkQ", + "type": "arrow", + "x": 1041.1110308632972, + "y": 200.65400390285498, + "width": 224.12520759073232, + "height": 38.158499568758714, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": { + "type": 2 + }, + "seed": 1142794121, + "version": 41, + "versionNonce": 18952775, + "isDeleted": false, + "boundElements": [], + "updated": 1756626271478, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 224.12520759073232, + -38.158499568758714 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "XixBzXhYxxZLeqjg8z0ZO", + "focus": 0.21011531284522128, + "gap": 2.543976324851883 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "g4Uh6FAsGkMRFYRgcKkcM", + "type": "text", + "x": 1267.801901396605, + "y": 91.83448600449418, + "width": 340.91685327733757, + "height": 126.06201358869963, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 815013001, + "version": 320, + "versionNonce": 2131041543, + "isDeleted": false, + "boundElements": [], + "updated": 1756626484398, + "link": null, + "locked": false, + "text": "long press or right\nclick will show menu\nwith delete option", + "fontSize": 33.616536956986565, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "long press or right click will show menu with delete option", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "ZypttJv8wXC3_nnNOBniI", + "type": "rectangle", + "x": 829.2352501918391, + "y": 61.91924305998282, + "width": 109.23454710748254, + "height": 36.33306860750372, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Lc9ztVjgkY1vXWy5Zdgbj" + ], + "frameId": null, + "index": "b07", + "roundness": null, + "seed": 2121158023, + "version": 147, + "versionNonce": 1637664743, + "isDeleted": false, + "boundElements": [], + "updated": 1756646695346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 751, + "versionNonce": 694242825, + "isDeleted": false, + "id": "ioXx3rr4MNsaBB7PmtfQN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 841.3644200044819, + "y": 73.26064731400524, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 22.637490885793227, + "height": 13.582494531475936, + "seed": 1886922409, + "groupIds": [ + "c9Kai9BBPEMYx9XHbYqXj", + "Lc9ztVjgkY1vXWy5Zdgbj" + ], + "boundElements": [], + "updated": 1756646695346, + "link": null, + "locked": false, + "index": "b08", + "frameId": null, + "roundness": null + }, + { + "type": "line", + "version": 768, + "versionNonce": 313078535, + "isDeleted": false, + "id": "FHZJ-3xFc01aevwPFV0eo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 854.9469145359578, + "y": 73.26064731400524, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 13.582494531475936, + "height": 4.5274981771586456, + "seed": 1777297801, + "groupIds": [ + "c9Kai9BBPEMYx9XHbYqXj", + "Lc9ztVjgkY1vXWy5Zdgbj" + ], + "boundElements": [], + "updated": 1756646695346, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.5274981771586456, + -4.5274981771586456 + ], + [ + -13.582494531475934, + -4.527498177158644 + ], + [ + -13.582494531475936, + -8.881784197001252e-16 + ], + [ + 0, + 0 + ] + ], + "index": "b09", + "frameId": null, + "roundness": null, + "polygon": false + }, + { + "id": "oyNLDcnSYZa440t9nKF1f", + "type": "text", + "x": 877.2761623064885, + "y": 65.74368400413695, + "width": 49.27995300292969, + "height": 27, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Lc9ztVjgkY1vXWy5Zdgbj" + ], + "frameId": null, + "index": "b0A", + "roundness": null, + "seed": 2083025639, + "version": 58, + "versionNonce": 771532009, + "isDeleted": false, + "boundElements": [], + "updated": 1756646695346, + "link": null, + "locked": false, + "text": "Open", + "fontSize": 20, + "fontFamily": 6, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Open", + "autoResize": true, + "lineHeight": 1.35 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/wireframe.md b/docs/wireframe.md new file mode 100644 index 0000000..0ac871c --- /dev/null +++ b/docs/wireframe.md @@ -0,0 +1,69 @@ +# Wireframes + +This document contains the product wireframes drawn in Excalidraw. The editable sources live under `docs/wireframe.assets/*.excalidraw`. For easy viewing, we generate an SVG-based copy at `docs/.wireframe.md`. + + + +## 1 Welcome / First screen + +Purpose: let the user open a PDF quickly via drag & drop or file picker. +Route: root + +Design notes: +- Central drop zone with hint text: “Drag a PDF here or click to select”. +- Minimal top bar with app name and a gear icon for settings. +- Clean layout encouraging first action. + +Illustration: + +![](wireframe.assets/first_screen.excalidraw) + +## 1-Settings dialog + +Purpose: provide basic configuration before/after opening a PDF. +Route: root --> settings + +Design notes: +- Opened via gear icon in the top bar. +- Modal with simple sections (e.g., General, Display). +- Primary action to save, secondary to cancel. + +Illustration: + +![](wireframe.assets/with_configure_screen.excalidraw) + +## PDF opened + +Purpose: view and navigate the PDF; prepare for signature placement. +Route: root --> opened + +Design notes: +- Main canvas shows the current page. +- Navigation: previous/next page, zoom controls near the canvas. +- Space reserved for a future “Sign” tool in the toolbar. +- drag signature onto page + +Illustration: + +![](wireframe.assets/with_pdf_opened.excalidraw) + +--- + +## How to view and export + +We keep links in this file pointing to `.excalidraw`. To preview the SVGs and generate `docs/.wireframe.md` with `.svg` links, run from repo root: + + dart run tool/gen_view_wireframe_md.dart + +This will: +- Copy `docs/wireframe.md` to `docs/.wireframe.md` and rewrite image links to `.svg`. +- Export any `*.excalidraw` under `docs/` to `*.svg` if they are new or modified. + +## Next wireframes (optional) + +- Save/Export result dialog and success state. diff --git a/tool/gen_view_wireframe_md.dart b/tool/gen_view_wireframe_md.dart new file mode 100644 index 0000000..760da6f --- /dev/null +++ b/tool/gen_view_wireframe_md.dart @@ -0,0 +1,115 @@ +// The script will +// 1. Copy `docs/wireframe.md` to `docs/.wireframe.md`. +// 2. In `docs/.wireframe.md`, replace all `*.excalidraw` paths (excluding `*.excalidraw.svg`) +// to use the `.svg` extension. +// 3. Export `*.excalidraw` files to svg `*.svg` by +// `npx --no-install excalidraw-to-svg {file_path}.excalidraw`. + +import 'dart:io'; + +void main(List args) async { + final cwd = Directory.current; + final docsDir = Directory('${cwd.path}/docs'); + final sourceMd = File('${docsDir.path}/wireframe.md'); + final targetMd = File('${docsDir.path}/.wireframe.md'); + + if (!await docsDir.exists()) { + stderr.writeln('docs directory not found at: ${docsDir.path}'); + exitCode = 1; + return; + } + if (!await sourceMd.exists()) { + stderr.writeln('Source markdown not found: ${sourceMd.path}'); + exitCode = 1; + return; + } + + // 1) Copy wireframe.md to .wireframe.md (overwrite to keep it up-to-date) + stdout.writeln('Copying ${sourceMd.path} -> ${targetMd.path}'); + await targetMd.writeAsBytes(await sourceMd.readAsBytes(), flush: true); + + // 2) Replace *.excalidraw (not already followed by .svg) with *.svg in the copied markdown + final content = await targetMd.readAsString(); + final replaced = content.replaceAll(RegExp(r"\.excalidraw(?!\.svg)"), '.svg'); + if (replaced != content) { + stdout.writeln('Updating links in ${targetMd.path} to use .svg'); + await targetMd.writeAsString(replaced); + } else { + stdout.writeln('No link updates needed in ${targetMd.path}'); + } + + // 3) Find all *.excalidraw files under docs and export to *.svg using excalidraw-to-svg + stdout.writeln('Scanning for .excalidraw assets under ${docsDir.path}'); + final excalidrawFiles = []; + await for (final entity in docsDir.list( + recursive: true, + followLinks: false, + )) { + if (entity is File && entity.path.endsWith('.excalidraw')) { + excalidrawFiles.add(entity); + } + } + + if (excalidrawFiles.isEmpty) { + stdout.writeln('No .excalidraw files found. Done.'); + return; + } + + // Verify npx availability; if missing, skip export with a clear message. + bool hasNpx = false; + try { + final npxCheck = await Process.run( + 'npx', + ['--version'], + runInShell: true, + workingDirectory: cwd.path, + ); + hasNpx = npxCheck.exitCode == 0; + } catch (_) { + hasNpx = false; + } + if (!hasNpx) { + stderr.writeln( + 'npx not found. Skipping SVG export. Install Node.js (npx) and ensure excalidraw-to-svg is available locally.', + ); + return; + } + + int exported = 0; + for (final src in excalidrawFiles) { + final destPath = src.path.replaceFirst(RegExp(r'\.excalidraw$'), '.svg'); + final dest = File(destPath); + + // Skip if up-to-date + if (await dest.exists()) { + try { + final srcStat = await src.stat(); + final destStat = await dest.stat(); + if (!srcStat.modified.isAfter(destStat.modified)) { + stdout.writeln('Skip (up-to-date): ${dest.path}'); + continue; + } + } catch (_) { + // If stats fail, proceed to export + } + } + + stdout.writeln('Exporting to SVG via excalidraw-to-svg: ${src.path}'); + final result = await Process.run( + 'npx', + ['--no-install', 'excalidraw-to-svg', src.path], + runInShell: true, + workingDirectory: cwd.path, + ); + if (result.exitCode == 0) { + stdout.writeln('Exported: ${dest.path}'); + exported++; + } else { + stderr.writeln( + 'Failed to export ${src.path} -> ${dest.path}\n${result.stderr}\n${result.stdout}', + ); + } + } + + stdout.writeln('Completed. ${exported} file(s) exported.'); +}