docs: update wireframe, introduce signature cards abstraction

This commit is contained in:
insleker 2025-09-02 12:36:30 +08:00
parent df1bf27553
commit d3df15d695
5 changed files with 1108 additions and 1056 deletions

View File

@ -6,7 +6,8 @@
"dart-code.flutter", "dart-code.flutter",
"lsaudon.l10nization", // quick translation gen "lsaudon.l10nization", // quick translation gen
"oke331.flutter-l10n-helper", // show arb string "oke331.flutter-l10n-helper", // show arb string
"gabbygreat.flutter-l10n-checker", // detect hard-coded strings "gabbygreat.flutter-l10n-checker",
"pomdtr.excalidraw-editor", // detect hard-coded strings
// "joaopinacio.translate-me" // "joaopinacio.translate-me"
] ]
} }

View File

@ -607,436 +607,6 @@
"originalText": "search", "originalText": "search",
"autoResize": true, "autoResize": true,
"lineHeight": 1.35 "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": { "appState": {

View File

@ -810,165 +810,6 @@
"originalText": "Configure", "originalText": "Configure",
"autoResize": true, "autoResize": true,
"lineHeight": 1.35 "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": { "appState": {

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,7 @@ Route: root
Design notes: Design notes:
- Central drop zone with hint text: “Drag a PDF here or click to select”. - 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. - Minimal top bar with app name and a "Configure" button with a gear icon for settings.
- Clean layout encouraging first action. - Clean layout encouraging first action.
Illustration: Illustration:
@ -29,7 +29,7 @@ Purpose: provide basic configuration before/after opening a PDF.
Route: root --> settings Route: root --> settings
Design notes: Design notes:
- Opened via gear icon in the top bar. - Opened via "Configure" button in the top bar.
- Modal with simple sections (e.g., General, Display). - Modal with simple sections (e.g., General, Display).
- Primary action to save, secondary to cancel. - Primary action to save, secondary to cancel.
@ -39,13 +39,32 @@ Illustration:
## PDF opened ## PDF opened
Purpose: view and navigate the PDF; prepare for signature placement. Purpose: view and navigate the PDF; for signature placement.
Route: root --> opened Route: root --> opened
Design notes: Design notes:
- Main canvas shows the current page. - Top: A small toolbar sits at the top edge with file name text, open pdf file button, previous/next page widgets and zoom controls.
- Navigation: previous/next page, zoom controls are placed in toolbar which is at top of main PDF canvas. - Navigation: Previous page, Next page, and a page number input (e.g., “2 / 10”) with jump-on-Enter.
- Drag signature onto page. - Zoom: Zoom out, Zoom level dropdown (percent), Zoom in, Fit width, Fit page, Reset zoom.
- Optional: Find/search within PDF (if supported by engine).
- Left pane: vertical strip of page thumbnails (e.g., page1, page2, page3). Clicking a thumbnail navigates to that page; the current page is visually indicated.
- Center: main PDF viewer shows the active page.
- Ctrl/Cmd + wheel to zoom.
- Right pane: signatures drawer displaying saved signatures as cards.
- able to drag and drop signature cards onto the PDF as placed signatures.
- Each signature card shows a preview.
- long tap/right-click will show menu with options to delete, adjust graphic of image.
- "adjust graphic" opens a simple image editor, which can remove backgrounds.
- There is an empty card with "new signature" prompt and 2 buttons: "from file" and "draw".
- "from file" opens a file picker to select an image as a signature card.
- "draw" opens a simple drawing interface (draw canvas) to create a signature card.
- Interaction: drag a signature card from the right drawer onto the currently visible page to place it.
Signature controls (after placing on page):
- Select to show bounding box with resize handles and a small inline action bar.
- Actions: Move (drag), Resize (corner/side handles), Rotate (rotation handle), Duplicate, Delete (trash icon or Delete key).
- Lock: Lock/Unlock position.
- Keyboard: Arrow keys to nudge (Shift for 10px); Shift-resize to keep aspect; Esc to cancel; Ctrl/Cmd+D to duplicate; Del/Backspace to delete.
Illustration: Illustration: