diff --git a/backend/app/categorization/service.py b/backend/app/categorization/service.py index ed16078..e16030a 100644 --- a/backend/app/categorization/service.py +++ b/backend/app/categorization/service.py @@ -125,6 +125,25 @@ def ensure_mcc_dictionary(db: Session) -> None: db.flush() +def ensure_others_category(db: Session, *, space_id: uuid.UUID) -> Category: + """The system «Остальное» fallback category, created on first use.""" + others = ( + db.query(Category) + .filter_by(space_id=space_id, system_key=mcc.OTHERS_SYSTEM_KEY) + .one_or_none() + ) + if others is None: + others = Category( + space_id=space_id, + kind="monthly", + system_key=mcc.OTHERS_SYSTEM_KEY, + custom_name=mcc.OTHERS_CATEGORY_NAME, + ) + db.add(others) + db.flush() + return others + + def ensure_default_categories(db: Session, *, space_id: uuid.UUID) -> dict[str, Category]: """Idempotently pre-create the 20 popular categories plus «Остальное». @@ -162,17 +181,7 @@ def ensure_default_categories(db: Session, *, space_id: uuid.UUID) -> dict[str, db.add(CategoryMcc(space_id=space_id, category_id=category.id, mcc_code=code)) claimed.add(code) result[definition.system_key] = category - others = existing.get(mcc.OTHERS_SYSTEM_KEY) - if others is None: - others = Category( - space_id=space_id, - kind="monthly", - system_key=mcc.OTHERS_SYSTEM_KEY, - custom_name=mcc.OTHERS_CATEGORY_NAME, - ) - db.add(others) - db.flush() - result[mcc.OTHERS_SYSTEM_KEY] = others + result[mcc.OTHERS_SYSTEM_KEY] = ensure_others_category(db, space_id=space_id) db.flush() return result diff --git a/backend/app/ledger/router.py b/backend/app/ledger/router.py index 1b8ef3e..ab72a38 100644 --- a/backend/app/ledger/router.py +++ b/backend/app/ledger/router.py @@ -52,6 +52,19 @@ class OperationPatchBody(BaseModel): category_id: uuid.UUID | None = Field(default=None, alias="categoryId") +class CategorizeBatchItemBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + operation_id: uuid.UUID = Field(alias="operationId") + category_id: uuid.UUID | None = Field(default=None, alias="categoryId") + + +class CategorizeBatchBody(BaseModel): + model_config = ConfigDict(populate_by_name=True) + + items: Annotated[list[CategorizeBatchItemBody], Field(min_length=1, max_length=200)] + + class AdjustBalanceBody(BaseModel): model_config = ConfigDict(populate_by_name=True) @@ -289,6 +302,18 @@ def patch_operation( return operation_json(db, operation) +@router.post("/operations/categorize-batch") +def categorize_operations_batch( + body: CategorizeBatchBody, db: Db, context: Context, _csrf: Csrf +) -> dict: + return service.categorize_batch( + db, + space_id=context.space.id, + user=context.user, + items=[(item.operation_id, item.category_id) for item in body.items], + ) + + @router.post("/accounts/{account_id}/adjust-balance") def adjust_balance( account_id: uuid.UUID, body: AdjustBalanceBody, db: Db, context: Context, _csrf: Csrf diff --git a/backend/app/ledger/service.py b/backend/app/ledger/service.py index e47288e..ffe95b1 100644 --- a/backend/app/ledger/service.py +++ b/backend/app/ledger/service.py @@ -480,6 +480,45 @@ def update_operation( return operation +def categorize_batch( + db: Session, + *, + space_id: uuid.UUID, + user: User, + items: list[tuple[uuid.UUID, uuid.UUID | None]], +) -> dict[str, list[str]]: + """Assign categories to uncategorized operations in one transaction. + + Items without an explicit category fall back to the system «Остальное» + category, so nothing stays uncategorized after a review-queue save. + Operations that already carry a category (user work done elsewhere) or + that were voided in the meantime are skipped, never overwritten. + """ + from app.categorization.service import ensure_others_category + + fallback = ensure_others_category(db, space_id=space_id) + updated: list[str] = [] + skipped: list[str] = [] + for operation_id, category_id in items: + operation = get_operation(db, space_id=space_id, operation_id=operation_id) + if operation.status == "voided" or operation.category_id is not None: + skipped.append(str(operation.id)) + continue + ensure_period_open_for_date(db, space_id=space_id, day=operation.occurred_on) + target = category_id if category_id is not None else fallback.id + _validate_category(db, space_id=space_id, category_id=target) + operation.category_id = target + updated.append(str(operation.id)) + audit.record( + db, + event_type="operations.batch_categorized", + space_id=space_id, + user_id=user.id, + detail={"updated": updated, "skipped": skipped}, + ) + return {"updated": updated, "skipped": skipped} + + def archive_account( db: Session, *, space_id: uuid.UUID, user: User, account_id: uuid.UUID ) -> Account: diff --git a/backend/tests/test_review_queue_batch.py b/backend/tests/test_review_queue_batch.py new file mode 100644 index 0000000..c6792b1 --- /dev/null +++ b/backend/tests/test_review_queue_batch.py @@ -0,0 +1,177 @@ +from fastapi.testclient import TestClient + + +def bootstrap(client: TestClient) -> str: + invite = client.post( + "/api/v1/admin/invitations", + headers={"X-Admin-Token": "test-admin-token"}, + json={"email": "Queue@Example.com"}, + ) + assert invite.status_code == 201, invite.text + accepted = client.post( + "/api/v1/auth/invitations/accept", + json={ + "token": invite.json()["token"], + "password": "a-long-password-for-tests", + "fullName": "Test Person", + "locale": "en", + }, + ) + assert accepted.status_code == 201, accepted.text + return client.cookies["csrf_token"] + + +def create_account(client: TestClient, csrf: str) -> str: + response = client.post( + "/api/v1/accounts", + headers={"X-CSRF-Token": csrf}, + json={ + "name": "Wallet", + "type": "cash", + "openedOn": "2026-02-01", + "openingBalanceKopecks": 100_000, + }, + ) + assert response.status_code == 201, response.text + return response.json()["id"] + + +def create_expense(client: TestClient, csrf: str, account_id: str, description: str) -> str: + response = client.post( + "/api/v1/operations", + headers={"X-CSRF-Token": csrf}, + json={ + "kind": "expense", + "accountId": account_id, + "amountKopecks": 1_500, + "occurredOn": "2026-02-10", + "description": description, + }, + ) + assert response.status_code == 201, response.text + return response.json()["id"] + + +def category_ids(client: TestClient) -> dict[str, str]: + response = client.get( + "/api/v1/budget/category-definitions", params={"includeArchived": "false"} + ) + assert response.status_code == 200, response.text + return { + item["systemKey"]: item["id"] + for item in response.json() + if item["systemKey"] is not None + } + + +def operations_by_id(client: TestClient) -> dict[str, dict]: + response = client.get("/api/v1/operations", params={"kind": "expense", "limit": 200}) + assert response.status_code == 200, response.text + return {item["id"]: item for item in response.json()["items"]} + + +def test_batch_assigns_picked_categories_and_moves_leftovers_to_others( + client: TestClient, +) -> None: + csrf = bootstrap(client) + account_id = create_account(client, csrf) + categories = category_ids(client) + first = create_expense(client, csrf, account_id, "Coffee") + second = create_expense(client, csrf, account_id, "Groceries") + + response = client.post( + "/api/v1/operations/categorize-batch", + headers={"X-CSRF-Token": csrf}, + json={ + "items": [ + {"operationId": first, "categoryId": categories["groceries"]}, + {"operationId": second}, + ] + }, + ) + assert response.status_code == 200, response.text + assert response.json() == {"updated": [first, second], "skipped": []} + + operations = operations_by_id(client) + assert operations[first]["categoryKey"] == "groceries" + assert operations[second]["categoryKey"] == "others" + assert operations[second]["categoryName"] == "Остальное" + + left = client.get("/api/v1/operations", params={"uncategorized": "true"}) + assert left.json()["items"] == [] + + +def test_batch_never_overwrites_existing_categories_or_voided_operations( + client: TestClient, +) -> None: + csrf = bootstrap(client) + account_id = create_account(client, csrf) + categories = category_ids(client) + categorized = create_expense(client, csrf, account_id, "Already done") + voided = create_expense(client, csrf, account_id, "Voided") + pending = create_expense(client, csrf, account_id, "Pending") + + patch = client.patch( + f"/api/v1/operations/{categorized}", + headers={"X-CSRF-Token": csrf}, + json={"categoryId": categories["groceries"]}, + ) + assert patch.status_code == 200, patch.text + void = client.post( + f"/api/v1/operations/{voided}/void", + headers={"X-CSRF-Token": csrf}, + json={"reason": "duplicate"}, + ) + assert void.status_code == 200, void.text + + response = client.post( + "/api/v1/operations/categorize-batch", + headers={"X-CSRF-Token": csrf}, + json={ + "items": [ + {"operationId": categorized, "categoryId": categories["cafes"]}, + {"operationId": voided, "categoryId": categories["cafes"]}, + {"operationId": pending, "categoryId": categories["cafes"]}, + ] + }, + ) + assert response.status_code == 200, response.text + assert response.json() == {"updated": [pending], "skipped": [categorized, voided]} + + operations = operations_by_id(client) + assert operations[categorized]["categoryKey"] == "groceries" + assert operations[pending]["categoryKey"] == "cafes" + + +def test_batch_is_atomic_when_one_category_is_unknown(client: TestClient) -> None: + csrf = bootstrap(client) + account_id = create_account(client, csrf) + first = create_expense(client, csrf, account_id, "First") + second = create_expense(client, csrf, account_id, "Second") + + response = client.post( + "/api/v1/operations/categorize-batch", + headers={"X-CSRF-Token": csrf}, + json={ + "items": [ + {"operationId": first, "categoryId": "00000000-0000-0000-0000-000000000000"}, + {"operationId": second}, + ] + }, + ) + assert response.status_code == 404, response.text + assert response.json()["error"]["code"] == "BUDGET_CATEGORY_NOT_FOUND" + + operations = operations_by_id(client) + assert operations[first]["categoryId"] is None + assert operations[second]["categoryId"] is None + + +def test_batch_rejects_empty_payload(client: TestClient) -> None: + csrf = bootstrap(client) + response = client.post( + "/api/v1/operations/categorize-batch", + headers={"X-CSRF-Token": csrf}, + json={"items": []}, + ) + assert response.status_code == 422, response.text diff --git a/design.pen b/design.pen index 76e4a17..716eed1 100644 --- a/design.pen +++ b/design.pen @@ -3316,6 +3316,50 @@ } ] }, + { + "type": "frame", + "id": "pVVYl", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "VNvmN", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "e20Gm", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "Bq3iS", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "Lriem", @@ -3383,6 +3427,50 @@ } ] }, + { + "type": "frame", + "id": "EtqWV", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "g1hdX", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "k8hUJZ", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "sHbNU", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "wYREV", @@ -5164,6 +5252,50 @@ } ] }, + { + "type": "frame", + "id": "A792p", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "M8wuD7", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "bGSKm", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "GXM51", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "JqUV3", @@ -5231,6 +5363,50 @@ } ] }, + { + "type": "frame", + "id": "jVKrf", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Z449x", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "Zxrn8", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "mO2sn", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "d7nWH", @@ -5583,7 +5759,7 @@ "id": "B1pbe", "name": "Ledger Filters", "width": "fill_container", - "height": 50, + "height": 54, "fill": "$white", "stroke": "$line", "strokeWidth": 1, @@ -5624,52 +5800,6 @@ } ] }, - { - "type": "frame", - "id": "N8x6x4", - "name": "Ledger Filter · TYPE", - "stroke": "$line", - "strokeWidth": 1, - "gap": 8, - "padding": [ - 9, - 10 - ], - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "FhojK", - "name": "Ledger Filter Label · TYPE", - "fill": "$muted", - "content": "TYPE", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.6 - }, - { - "type": "text", - "id": "x5dDpk", - "name": "Ledger Filter Value · TYPE", - "fill": "$ink", - "content": "All", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - }, - { - "type": "icon", - "id": "P7Wj6Z", - "name": "Ledger Filter Chevron · TYPE", - "width": 13, - "height": 13, - "icon": "chevron-down", - "library": "lucide", - "fill": "$muted" - } - ] - }, { "type": "frame", "id": "Z2i7OO", @@ -5718,8 +5848,8 @@ }, { "type": "frame", - "id": "FdktT", - "name": "Ledger Filter · CATEGORY", + "id": "N8x6x4", + "name": "Ledger Filter · TYPE", "stroke": "$line", "strokeWidth": 1, "gap": 8, @@ -5731,10 +5861,10 @@ "children": [ { "type": "text", - "id": "m0NSZ9", - "name": "Ledger Filter Label · CATEGORY", + "id": "FhojK", + "name": "Ledger Filter Label · TYPE", "fill": "$muted", - "content": "CATEGORY", + "content": "TYPE", "fontFamily": "$font-data", "fontSize": 8, "fontWeight": "700", @@ -5742,8 +5872,8 @@ }, { "type": "text", - "id": "yco4t", - "name": "Ledger Filter Value · CATEGORY", + "id": "x5dDpk", + "name": "Ledger Filter Value · TYPE", "fill": "$ink", "content": "All", "fontFamily": "$font-ui", @@ -5752,8 +5882,8 @@ }, { "type": "icon", - "id": "W0uGl", - "name": "Ledger Filter Chevron · CATEGORY", + "id": "P7Wj6Z", + "name": "Ledger Filter Chevron · TYPE", "width": 13, "height": 13, "icon": "chevron-down", @@ -5807,6 +5937,134 @@ "fill": "$muted" } ] + }, + { + "type": "frame", + "id": "FoaBn", + "name": "Ledger Filter · FROM", + "width": 132, + "height": 32, + "stroke": "$line", + "strokeWidth": 1, + "gap": 5, + "padding": [ + 0, + 8 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "vJvso", + "name": "Ledger Filter Label · FROM", + "fill": "$muted", + "content": "FROM", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "text", + "id": "jjBIo", + "name": "Ledger Filter Value · FROM", + "fill": "$ink", + "content": "01 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "A3NN7", + "name": "Ledger Filter Calendar · FROM", + "width": 12, + "height": 12, + "icon": "calendar-days", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "znzzZ", + "name": "Ledger Filter · TO", + "width": 132, + "height": 32, + "stroke": "$line", + "strokeWidth": 1, + "gap": 5, + "padding": [ + 0, + 8 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "RgdJA", + "name": "Ledger Filter Label · TO", + "fill": "$muted", + "content": "TO", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "text", + "id": "H9sBj", + "name": "Ledger Filter Value · TO", + "fill": "$ink", + "content": "30 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "FgLo9", + "name": "Ledger Filter Calendar · TO", + "width": 12, + "height": 12, + "icon": "calendar-days", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "FNx1k", + "name": "Ledger Filter · UNCATEGORIZED", + "height": 32, + "gap": 6, + "padding": [ + 0, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "id": "mw2NB", + "name": "Uncategorized checkbox", + "fill": "$white", + "width": 13, + "height": 13, + "stroke": "$line", + "strokeWidth": 1 + }, + { + "type": "text", + "id": "LomK5", + "name": "Uncategorized only label", + "fill": "$muted", + "content": "UNCATEGORIZED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + } + ] } ] }, @@ -6748,451 +7006,471 @@ ] } ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "H3UdAc", + "layoutPosition": "absolute", + "x": 0, + "y": 0, + "name": "Composer backdrop", + "fill": "#16161688", + "width": 1440, + "height": 1024 + }, + { + "type": "frame", + "id": "sxmTd", + "layoutPosition": "absolute", + "x": 1010, + "y": 0, + "name": "Operation Composer", + "width": 430, + "height": 1024, + "fill": "$ink", + "layout": "vertical", + "gap": 16, + "padding": [ + 32, + 28 + ], + "children": [ + { + "type": "frame", + "id": "R0W4ji", + "name": "Composer Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KXSAe", + "name": "Composer Title", + "fill": "$white", + "content": "New operation", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "dqpaV", + "name": "Composer Close", + "width": 18, + "height": 18, + "icon": "x", + "library": "lucide", + "fill": "#8D8D89" + } + ] + }, + { + "type": "frame", + "id": "UXp5M", + "name": "Composer Kind Tabs", + "width": "fill_container", + "height": 40, + "stroke": "#FFFFFF55", + "strokeWidth": 1, + "gap": 2, + "children": [ + { + "type": "frame", + "id": "WxWzq", + "name": "Composer Tab · EXPENSE", + "width": "fill_container", + "height": "fill_container", + "fill": "#FFFFFF", + "stroke": "#3874ED", + "strokeWidth": 2, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "k6YAr", + "name": "Composer Tab Label · EXPENSE", + "fill": "#2758BA", + "content": "EXPENSE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] }, { "type": "frame", - "id": "sxmTd", - "name": "Operation Composer", - "width": 360, + "id": "TqloN", + "name": "Composer Tab · INCOME", + "width": "fill_container", "height": "fill_container", - "fill": "$ink", - "layout": "vertical", - "gap": 16, - "padding": 20, + "fill": "#FFFFFF", + "justifyContent": "center", + "alignItems": "center", "children": [ { - "type": "frame", - "id": "R0W4ji", - "name": "Composer Header", - "width": "fill_container", - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "KXSAe", - "name": "Composer Title", - "fill": "$white", - "content": "New operation", - "fontFamily": "$font-ui", - "fontSize": 20, - "fontWeight": "600" - }, - { - "type": "icon", - "id": "dqpaV", - "name": "Composer Close", - "width": 18, - "height": 18, - "icon": "x", - "library": "lucide", - "fill": "#8D8D89" - } - ] - }, - { - "type": "frame", - "id": "UXp5M", - "name": "Composer Kind Tabs", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF33", - "strokeWidth": 1, - "children": [ - { - "type": "frame", - "id": "WxWzq", - "name": "Composer Tab · EXPENSE", - "width": "fill_container", - "height": "fill_container", - "fill": "$blue", - "justifyContent": "center", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "k6YAr", - "name": "Composer Tab Label · EXPENSE", - "fill": "$white", - "content": "EXPENSE", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.5 - } - ] - }, - { - "type": "frame", - "id": "TqloN", - "name": "Composer Tab · INCOME", - "width": "fill_container", - "height": "fill_container", - "fill": "#00000000", - "justifyContent": "center", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "S3CoH", - "name": "Composer Tab Label · INCOME", - "fill": "#8D8D89", - "content": "INCOME", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.5 - } - ] - }, - { - "type": "frame", - "id": "V988iQ", - "name": "Composer Tab · TRANSFER", - "width": "fill_container", - "height": "fill_container", - "fill": "#00000000", - "justifyContent": "center", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "TYs8j", - "name": "Composer Tab Label · TRANSFER", - "fill": "#8D8D89", - "content": "TRANSFER", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.5 - } - ] - }, - { - "type": "frame", - "id": "YdO9L", - "name": "Composer Tab · REFUND", - "width": "fill_container", - "height": "fill_container", - "fill": "#00000000", - "justifyContent": "center", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "o4IeeP", - "name": "Composer Tab Label · REFUND", - "fill": "#8D8D89", - "content": "REFUND", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.5 - } - ] - } - ] - }, - { - "type": "frame", - "id": "MmMpJ", - "name": "Composer Amount", - "width": "fill_container", - "stroke": "#FFFFFF2C", - "strokeWidth": { - "bottom": 1 - }, - "layout": "vertical", - "gap": 6, - "padding": [ - 16, - 0 - ], - "children": [ - { - "type": "text", - "id": "lXBwi", - "name": "Composer Amount Label", - "fill": "#8D8D89", - "content": "AMOUNT · RUB", - "fontFamily": "$font-data", - "fontSize": 9, - "fontWeight": "700", - "letterSpacing": 0.8 - }, - { - "type": "text", - "id": "J8zfW", - "name": "Composer Amount Value", - "fill": "$white", - "content": "₽ 3 840,00", - "fontFamily": "$font-data", - "fontSize": 30, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "ihq42", - "name": "Composer Field · ACCOUNT", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF22", - "strokeWidth": { - "bottom": 1 - }, - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "r5qLze", - "name": "Composer Field Label · ACCOUNT", - "fill": "#777773", - "content": "ACCOUNT", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "YxjhM", - "name": "Composer Field Value · ACCOUNT", - "fill": "$white", - "content": "Alfa debit · •4821", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "vc3ff", - "name": "Composer Field · CATEGORY", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF22", - "strokeWidth": { - "bottom": 1 - }, - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "o0xNFJ", - "name": "Composer Field Label · CATEGORY", - "fill": "#777773", - "content": "CATEGORY", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "t6oCx", - "name": "Composer Field Value · CATEGORY", - "fill": "$white", - "content": "Groceries", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "xbsYI", - "name": "Composer Field · PAYEE", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF22", - "strokeWidth": { - "bottom": 1 - }, - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "hm6RM", - "name": "Composer Field Label · PAYEE", - "fill": "#777773", - "content": "PAYEE", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "kZqdb", - "name": "Composer Field Value · PAYEE", - "fill": "$white", - "content": "Magnit", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "E7jyy", - "name": "Composer Field · OCCURRED", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF22", - "strokeWidth": { - "bottom": 1 - }, - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "M39oEG", - "name": "Composer Field Label · OCCURRED", - "fill": "#777773", - "content": "OCCURRED", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "Ejmvg", - "name": "Composer Field Value · OCCURRED", - "fill": "$white", - "content": "21 Sep 2026", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "oJD10", - "name": "Composer Field · POSTED", - "width": "fill_container", - "height": 38, - "stroke": "#FFFFFF22", - "strokeWidth": { - "bottom": 1 - }, - "justifyContent": "space_between", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "UT10x", - "name": "Composer Field Label · POSTED", - "fill": "#777773", - "content": "POSTED", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "KPsdQ", - "name": "Composer Field Value · POSTED", - "fill": "$white", - "content": "21 Sep 2026", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "600" - } - ] - }, - { - "type": "frame", - "id": "K4dd8b", - "name": "Composer Description", - "width": "fill_container", - "height": 74, - "stroke": "#FFFFFF33", - "strokeWidth": 1, - "layout": "vertical", - "gap": 8, - "padding": 12, - "children": [ - { - "type": "text", - "id": "b6Lgc", - "name": "Composer Description Label", - "fill": "#777773", - "content": "DESCRIPTION", - "fontFamily": "$font-data", - "fontSize": 8, - "fontWeight": "700", - "letterSpacing": 0.7 - }, - { - "type": "text", - "id": "wQQYm", - "name": "Composer Description Value", - "fill": "$white", - "content": "Weekly groceries", - "fontFamily": "$font-ui", - "fontSize": 12, - "fontWeight": "normal" - } - ] - }, - { - "type": "frame", - "id": "o6Pvf", - "name": "Composer Footer", - "width": "fill_container", - "layout": "vertical", - "gap": 8, - "children": [ - { - "type": "frame", - "id": "iJWvd", - "name": "Composer Save", - "width": "fill_container", - "height": 46, - "fill": "$blue", - "justifyContent": "center", - "alignItems": "center", - "children": [ - { - "type": "text", - "id": "nmpYn", - "name": "Composer Save Label", - "fill": "$white", - "content": "Save expense", - "fontFamily": "$font-ui", - "fontSize": 13, - "fontWeight": "600" - } - ] - }, - { - "type": "text", - "id": "rWm1o", - "name": "Composer Period Hint", - "fill": "#777773", - "textGrowth": "fixed-width", - "width": "fill_container", - "content": "September is open · operation can be edited or voided", - "textAlign": "center", - "fontFamily": "$font-ui", - "fontSize": 9, - "fontWeight": "normal" - } - ] + "type": "text", + "id": "S3CoH", + "name": "Composer Tab Label · INCOME", + "fill": "#272725", + "content": "INCOME", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.5 } ] + }, + { + "type": "frame", + "id": "V988iQ", + "name": "Composer Tab · TRANSFER", + "width": "fill_container", + "height": "fill_container", + "fill": "#FFFFFF", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "TYs8j", + "name": "Composer Tab Label · TRANSFER", + "fill": "#272725", + "content": "TRANSFER", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + }, + { + "type": "frame", + "id": "YdO9L", + "name": "Composer Tab · REFUND", + "width": "fill_container", + "height": "fill_container", + "fill": "#FFFFFF", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "o4IeeP", + "name": "Composer Tab Label · REFUND", + "fill": "#272725", + "content": "REFUND", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "MmMpJ", + "name": "Composer Amount", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 6, + "padding": [ + 16, + 0 + ], + "children": [ + { + "type": "text", + "id": "lXBwi", + "name": "Composer Amount Label", + "fill": "#8D8D89", + "content": "AMOUNT · RUB", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "J8zfW", + "name": "Composer Amount Value", + "fill": "$white", + "content": "₽ 3 840,00", + "fontFamily": "$font-data", + "fontSize": 30, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "ihq42", + "name": "Composer Field · ACCOUNT", + "width": "fill_container", + "height": 38, + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "r5qLze", + "name": "Composer Field Label · ACCOUNT", + "fill": "#777773", + "content": "ACCOUNT", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "YxjhM", + "name": "Composer Field Value · ACCOUNT", + "fill": "$white", + "content": "Alfa debit · •4821", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "vc3ff", + "name": "Composer Field · CATEGORY", + "width": "fill_container", + "height": 38, + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "o0xNFJ", + "name": "Composer Field Label · CATEGORY", + "fill": "#777773", + "content": "CATEGORY", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "t6oCx", + "name": "Composer Field Value · CATEGORY", + "fill": "$white", + "content": "Groceries", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "xbsYI", + "name": "Composer Field · PAYEE", + "width": "fill_container", + "height": 38, + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hm6RM", + "name": "Composer Field Label · PAYEE", + "fill": "#777773", + "content": "PAYEE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "kZqdb", + "name": "Composer Field Value · PAYEE", + "fill": "$white", + "content": "Magnit", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "E7jyy", + "name": "Composer Field · OCCURRED", + "width": "fill_container", + "height": 38, + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "M39oEG", + "name": "Composer Field Label · OCCURRED", + "fill": "#777773", + "content": "OCCURRED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "Ejmvg", + "name": "Composer Field Value · OCCURRED", + "fill": "$white", + "content": "21 Sep 2026", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "oJD10", + "name": "Composer Field · POSTED", + "width": "fill_container", + "height": 38, + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "UT10x", + "name": "Composer Field Label · POSTED", + "fill": "#777773", + "content": "POSTED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "KPsdQ", + "name": "Composer Field Value · POSTED", + "fill": "$white", + "content": "21 Sep 2026", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "K4dd8b", + "name": "Composer Description", + "width": "fill_container", + "height": 74, + "stroke": "#FFFFFF33", + "strokeWidth": 1, + "layout": "vertical", + "gap": 8, + "padding": 12, + "children": [ + { + "type": "text", + "id": "b6Lgc", + "name": "Composer Description Label", + "fill": "#777773", + "content": "DESCRIPTION", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "wQQYm", + "name": "Composer Description Value", + "fill": "$white", + "content": "Weekly groceries", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "o6Pvf", + "name": "Composer Footer", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "iJWvd", + "name": "Composer Save", + "width": "fill_container", + "height": 46, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nmpYn", + "name": "Composer Save Label", + "fill": "$white", + "content": "Save expense", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "text", + "id": "rWm1o", + "name": "Composer Period Hint", + "fill": "#777773", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "September is open · operation can be edited or voided", + "textAlign": "center", + "fontFamily": "$font-ui", + "fontSize": 9, + "fontWeight": "normal" } ] } @@ -7426,6 +7704,50 @@ } ] }, + { + "type": "frame", + "id": "BNYdc", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "saeuC", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "LQ8kG", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "v9RgaI", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "wsK4F", @@ -7493,6 +7815,50 @@ } ] }, + { + "type": "frame", + "id": "jTkV6", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "i8Bw6", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "NuElf", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "GYw3n", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "WIRcm", @@ -9766,6 +10132,50 @@ } ] }, + { + "type": "frame", + "id": "f2qvS", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "YJpsd", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "lvFzI", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "iINeM", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "TdvA3", @@ -9834,6 +10244,50 @@ } ] }, + { + "type": "frame", + "id": "k5yqz", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "h1Xvh", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "aRZlh", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "SrW16", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "NrHj2", @@ -11912,6 +12366,50 @@ } ] }, + { + "type": "frame", + "id": "w7nN3", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "vnxeF", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "GQ8dn", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "F20Jb1", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "ZaErn", @@ -11979,6 +12477,50 @@ } ] }, + { + "type": "frame", + "id": "g9ESW", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "G9CTgc", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "pSIWm", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "C6bEBf", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "lVYwG", @@ -13973,6 +14515,50 @@ } ] }, + { + "type": "frame", + "id": "GdTQt", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "qduiK", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "X3HUY", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "ewoI9", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "l53vu", @@ -14040,6 +14626,50 @@ } ] }, + { + "type": "frame", + "id": "vYj4b", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "cHrL4", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "picfW", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "r4OZa", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, { "type": "frame", "id": "sC4PK", @@ -17741,6 +18371,9368 @@ ] } ] + }, + { + "type": "frame", + "id": "n5xkK", + "x": 6080, + "y": 1104, + "name": "11 · Budget / Category Manager", + "clip": true, + "width": 1440, + "height": 1024, + "fill": "$paper", + "layout": "none", + "children": [ + { + "type": "frame", + "id": "PcH1t", + "layoutPosition": "absolute", + "x": 0, + "y": 0, + "name": "Overview Sidebar", + "width": 238, + "height": 974, + "fill": "$ink", + "layout": "vertical", + "padding": [ + 32, + 24 + ], + "justifyContent": "space_between", + "children": [ + { + "type": "frame", + "id": "Bocrt", + "name": "Overview Sidebar Top", + "width": "fill_container", + "layout": "vertical", + "gap": 34, + "children": [ + { + "type": "frame", + "id": "WQBXk", + "name": "Overview Brand", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "K55Rcr", + "name": "Overview Brand Mark", + "width": 34, + "height": 34, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "D31aM4", + "name": "Overview Brand Mark Text", + "fill": "$white", + "content": "FS", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "ZM29P", + "name": "Overview Brand Text", + "fill": "$white", + "content": "FINSPACE", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "700", + "letterSpacing": 1.3 + } + ] + }, + { + "type": "frame", + "id": "l2ZCh", + "name": "Overview Space", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": [ + 0, + 0, + 18, + 0 + ], + "children": [ + { + "type": "text", + "id": "UOeUp", + "name": "Overview Space Label", + "fill": "#777773", + "content": "FINANCIAL SPACE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 1 + }, + { + "type": "text", + "id": "h48Qyl", + "name": "Overview Space Name", + "fill": "$white", + "content": "Morozov household", + "fontFamily": "$font-ui", + "fontSize": 15, + "fontWeight": "600" + }, + { + "type": "text", + "id": "TKSuB", + "name": "Overview Space Role", + "fill": "#8FAEFF", + "content": "OWNER · ACTIVE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "DdEMj", + "name": "Overview Navigation", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "frame", + "id": "QxFlB", + "name": "Nav · This month", + "width": "fill_container", + "height": 42, + "fill": "$blue", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "zoV8c", + "name": "Nav Lead · This month", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "xfkuk", + "name": "Nav Icon · This month", + "width": 17, + "height": 17, + "icon": "calendar-range", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "OBEKg", + "name": "Nav Label · This month", + "fill": "$white", + "content": "This month", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "vljzI", + "name": "Nav · Ledger", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "cv3Fy", + "name": "Nav Lead · Ledger", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "G1Xns", + "name": "Nav Icon · Ledger", + "width": 17, + "height": 17, + "icon": "rows-3", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "FeY0Z", + "name": "Nav Label · Ledger", + "fill": "#C0C0BC", + "content": "Ledger", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "NH6fD", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "YmmIn", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "V7mrm", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "qXfcM", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "nBpi9", + "name": "Nav · Statements", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Sop57", + "name": "Nav Lead · Statements", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "NM0Km", + "name": "Nav Icon · Statements", + "width": 17, + "height": 17, + "icon": "inbox", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "uIMch", + "name": "Nav Label · Statements", + "fill": "#C0C0BC", + "content": "Statements", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + }, + { + "type": "frame", + "id": "V0cD5", + "name": "Nav Count · Statements", + "width": 22, + "height": 22, + "fill": "$amber-soft", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "B2XTx", + "name": "Nav Count Text · Statements", + "fill": "$amber", + "content": "3", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "hv36Y", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "p6eRU6", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "bPtq4", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "p8Pe90", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Br0mu", + "name": "Nav · Analytics", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "hKEtl", + "name": "Nav Lead · Analytics", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "JLYXs", + "name": "Nav Icon · Analytics", + "width": 17, + "height": 17, + "icon": "chart-no-axes-combined", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "EnW8T", + "name": "Nav Label · Analytics", + "fill": "#C0C0BC", + "content": "Analytics", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "Y0odgb", + "name": "Nav · Accounts", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "urc1Y", + "name": "Nav Lead · Accounts", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "J8ucDN", + "name": "Nav Icon · Accounts", + "width": 17, + "height": 17, + "icon": "wallet-cards", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "E2Wcrh", + "name": "Nav Label · Accounts", + "fill": "#C0C0BC", + "content": "Accounts", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "czlVK", + "name": "Nav · Space & data", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "pXd6y", + "name": "Nav Lead · Space & data", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "C7Co6", + "name": "Nav Icon · Space & data", + "width": 17, + "height": 17, + "icon": "settings-2", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "mkczz", + "name": "Nav Label · Space & data", + "fill": "#C0C0BC", + "content": "Space & data", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "wgoPN", + "name": "Overview Sidebar Bottom", + "width": "fill_container", + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "IftUd", + "name": "Overview Sync State", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "v7msI", + "name": "Overview Sync Dot", + "fill": "$green", + "width": 7, + "height": 7 + }, + { + "type": "text", + "id": "OfwrB", + "name": "Overview Sync Text", + "fill": "#8D8D89", + "content": "All data synced", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "EQGpc", + "name": "Overview Profile", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "top": 1 + }, + "gap": 10, + "padding": [ + 14, + 0, + 0, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "flnOA", + "name": "Overview Avatar", + "width": 34, + "height": 34, + "fill": "#30302E", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "y1BlK", + "name": "Overview Avatar Text", + "fill": "$white", + "content": "AM", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "JKOrp", + "name": "Overview Profile Copy", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "ZWxMh", + "name": "Overview Profile Name", + "fill": "$white", + "content": "Alexey Morozov", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "UPMf6", + "name": "Overview Profile Meta", + "fill": "#777773", + "content": "RU · Europe/Moscow", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "icon", + "id": "frRxi", + "name": "Logout Action", + "width": 15, + "height": 15, + "icon": "log-out", + "library": "lucide", + "fill": "#777773" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "Ro9sf", + "layoutPosition": "absolute", + "x": 238, + "y": 0, + "name": "Budget Main", + "width": 1202, + "height": 974, + "layout": "vertical", + "gap": 20, + "padding": [ + 34, + 42 + ], + "children": [ + { + "type": "frame", + "id": "c8OcO5", + "name": "Budget Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "js1aD", + "name": "Budget Header Copy", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "frame", + "id": "FmiT0", + "name": "Budget Title Line", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "bIco5", + "name": "Budget Title", + "fill": "$ink", + "content": "September budget", + "fontFamily": "$font-ui", + "fontSize": 34, + "fontWeight": "600", + "letterSpacing": -0.7 + }, + { + "type": "frame", + "id": "ImEMA", + "name": "Budget Open Status", + "fill": "$green-soft", + "padding": [ + 6, + 9 + ], + "children": [ + { + "type": "text", + "id": "rjES5", + "name": "Budget Open Status Label", + "fill": "$green", + "content": "OPEN", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + } + ] + } + ] + }, + { + "type": "text", + "id": "TBpSE", + "name": "Budget Subtitle", + "fill": "$muted", + "content": "Plan is intention. Funding is money actually reserved.", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "T5W0Au", + "name": "Budget Header Actions", + "gap": 9, + "children": [ + { + "type": "frame", + "id": "e1OwdW", + "name": "Budget Action · Copy previous", + "fill": "#00000000", + "stroke": "$ink", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 11, + 13 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "vXMf2", + "name": "Budget Action Icon · Copy previous", + "width": 15, + "height": 15, + "icon": "copy", + "library": "lucide", + "fill": "$ink" + }, + { + "type": "text", + "id": "X2IY9X", + "name": "Budget Action Label · Copy previous", + "fill": "$ink", + "content": "Copy previous", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "YRBpg", + "name": "Budget Action · Add category", + "fill": "#00000000", + "stroke": "$ink", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 11, + 13 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "yQrqu", + "name": "Budget Action Icon · Add category", + "width": 15, + "height": 15, + "icon": "plus", + "library": "lucide", + "fill": "$ink" + }, + { + "type": "text", + "id": "u5gRs", + "name": "Budget Action Label · Add category", + "fill": "$ink", + "content": "Add category", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "R7jUA", + "name": "Budget Action · Close month", + "fill": "$ink", + "stroke": "#00000000", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 11, + 13 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "j7z4q", + "name": "Budget Action Icon · Close month", + "width": 15, + "height": 15, + "icon": "lock-keyhole", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "qPD7L", + "name": "Budget Action Label · Close month", + "fill": "$white", + "content": "Close month", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "pGZcX", + "name": "Budget Summary", + "width": "fill_container", + "height": 140, + "fill": "$blue", + "children": [ + { + "type": "frame", + "id": "VGyd7", + "name": "Budget Summary · GENERAL POOL", + "width": "fill_container", + "height": "fill_container", + "stroke": "#FFFFFF4D", + "strokeWidth": { + "right": 1 + }, + "layout": "vertical", + "padding": 18, + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "ziZUM", + "name": "Budget Summary Label · GENERAL POOL", + "fill": "#CADBFF", + "content": "GENERAL POOL", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "qQyAC", + "name": "Budget Summary Value · GENERAL POOL", + "fill": "$white", + "content": "₽61 420", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + }, + { + "type": "text", + "id": "N9PH8G", + "name": "Budget Summary Detail · GENERAL POOL", + "fill": "#C8D9FF", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "actual cash not funded", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "yvGNC", + "name": "Budget Summary · PLANNED", + "width": "fill_container", + "height": "fill_container", + "stroke": "#FFFFFF4D", + "strokeWidth": { + "right": 1 + }, + "layout": "vertical", + "padding": 18, + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "ccDfU", + "name": "Budget Summary Label · PLANNED", + "fill": "#CADBFF", + "content": "PLANNED", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "Rd7C5", + "name": "Budget Summary Value · PLANNED", + "fill": "$white", + "content": "₽112 000", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + }, + { + "type": "text", + "id": "rJGo2", + "name": "Budget Summary Detail · PLANNED", + "fill": "#C8D9FF", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "assignments for this month", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "jlAgI", + "name": "Budget Summary · EXPECTED INCOME", + "width": "fill_container", + "height": "fill_container", + "stroke": "#FFFFFF4D", + "strokeWidth": { + "right": 1 + }, + "layout": "vertical", + "padding": 18, + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "LlKMg", + "name": "Budget Summary Label · EXPECTED INCOME", + "fill": "#CADBFF", + "content": "EXPECTED INCOME", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "p8ZHS", + "name": "Budget Summary Value · EXPECTED INCOME", + "fill": "$white", + "content": "₽30 000", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + }, + { + "type": "text", + "id": "u1DqfL", + "name": "Budget Summary Detail · EXPECTED INCOME", + "fill": "#C8D9FF", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "₽15 000 already matched", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "K8Yo74", + "name": "Budget Summary · PROJECTED POOL", + "width": "fill_container", + "height": "fill_container", + "stroke": "#FFFFFF4D", + "strokeWidth": { + "right": 1 + }, + "layout": "vertical", + "padding": 18, + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "LvSgG", + "name": "Budget Summary Label · PROJECTED POOL", + "fill": "#CADBFF", + "content": "PROJECTED POOL", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "JPVTk", + "name": "Budget Summary Value · PROJECTED POOL", + "fill": "$white", + "content": "₽18 250", + "fontFamily": "$font-data", + "fontSize": 23, + "fontWeight": "600" + }, + { + "type": "text", + "id": "B1NU29", + "name": "Budget Summary Detail · PROJECTED POOL", + "fill": "#C8D9FF", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "carry + expected − planned", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "eHhEC", + "name": "Budget Body", + "width": "fill_container", + "height": "fill_container", + "gap": 20, + "children": [ + { + "type": "frame", + "id": "MQn9K", + "name": "Budget Categories", + "width": "fill_container", + "height": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "mdQEY", + "name": "Budget Categories Header", + "width": "fill_container", + "height": 48, + "fill": "#EFEEE9", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "sW2Nd", + "name": "Budget Column · CATEGORY", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "CATEGORY", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "ZNMm6", + "name": "Budget Column · PLAN", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "PLAN", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "so1nA", + "name": "Budget Column · FUNDED", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "FUNDED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "oSyRY", + "name": "Budget Column · SPENT", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "SPENT", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "CPuol", + "name": "Budget Column · AVAILABLE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "AVAILABLE", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "uCB7m", + "name": "Budget Column · ACTION", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 64, + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "cNwhT", + "name": "Budget Category · Groceries", + "width": "fill_container", + "height": 78, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "kZI15", + "name": "Budget Category Info · Groceries", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "ZCAND", + "name": "Budget Category Name · Groceries", + "fill": "$ink", + "content": "Groceries", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "vlyqU", + "name": "Budget Category Kind · Groceries", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "wBuv1", + "name": "Budget Category Kind Label · Groceries", + "fill": "$muted", + "content": "MONTHLY", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "FISxu", + "name": "Budget Category Track · Groceries", + "width": 82, + "height": 3, + "fill": "#E4E1D9", + "children": [ + { + "type": "rectangle", + "id": "RZOet", + "name": "Budget Category Bar · Groceries", + "fill": "$blue", + "width": 48.379999999999995, + "height": 3 + } + ] + } + ] + } + ] + }, + { + "type": "text", + "id": "FlGLo", + "name": "Budget PLAN · Groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽14 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "L59R1", + "name": "Budget FUNDED · Groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽14 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "ByT6b", + "name": "Budget SPENT · Groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽8 240", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "oLFC2", + "name": "Budget AVAILABLE · Groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "₽5 760", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "k1D0dv", + "name": "Budget Fund Action · Groceries", + "width": 64, + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Y10rSf", + "name": "Budget Fund Action Label · Groceries", + "fill": "$blue", + "content": "FUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "dlamS", + "name": "Budget Category · Transport", + "width": "fill_container", + "height": 78, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "oeEyD", + "name": "Budget Category Info · Transport", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "VzqLb", + "name": "Budget Category Name · Transport", + "fill": "$ink", + "content": "Transport", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "BDhDc", + "name": "Budget Category Kind · Transport", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "MOsRY", + "name": "Budget Category Kind Label · Transport", + "fill": "$muted", + "content": "MONTHLY", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "r4dkvw", + "name": "Budget Category Track · Transport", + "width": 82, + "height": 3, + "fill": "#E4E1D9", + "children": [ + { + "type": "rectangle", + "id": "KDeix", + "name": "Budget Category Bar · Transport", + "fill": "$blue", + "width": 66.42, + "height": 3 + } + ] + } + ] + } + ] + }, + { + "type": "text", + "id": "zmhvJ", + "name": "Budget PLAN · Transport", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽6 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "DDAs7", + "name": "Budget FUNDED · Transport", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽6 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "CZFai", + "name": "Budget SPENT · Transport", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽4 870", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "m6ax5K", + "name": "Budget AVAILABLE · Transport", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "₽1 130", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "f0HJpw", + "name": "Budget Fund Action · Transport", + "width": 64, + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "wI26H", + "name": "Budget Fund Action Label · Transport", + "fill": "$blue", + "content": "FUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "kj8MX", + "name": "Budget Category · Home", + "width": "fill_container", + "height": 78, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "G8cJa", + "name": "Budget Category Info · Home", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "tFhPT", + "name": "Budget Category Name · Home", + "fill": "$ink", + "content": "Home", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "QCsN4", + "name": "Budget Category Kind · Home", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hi4lY", + "name": "Budget Category Kind Label · Home", + "fill": "$muted", + "content": "MONTHLY", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "xb0k2", + "name": "Budget Category Track · Home", + "width": 82, + "height": 3, + "fill": "#E4E1D9", + "children": [ + { + "type": "rectangle", + "id": "e7Fc3", + "name": "Budget Category Bar · Home", + "fill": "$amber", + "width": 74.61999999999999, + "height": 3 + } + ] + } + ] + } + ] + }, + { + "type": "text", + "id": "izu3R", + "name": "Budget PLAN · Home", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽32 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Zk6S3", + "name": "Budget FUNDED · Home", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽32 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "ewuR8", + "name": "Budget SPENT · Home", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽29 100", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Zxv79", + "name": "Budget AVAILABLE · Home", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "₽2 900", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "PfrIh", + "name": "Budget Fund Action · Home", + "width": 64, + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hF3n8", + "name": "Budget Fund Action Label · Home", + "fill": "$blue", + "content": "FUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "Zr81i", + "name": "Budget Category · Travel", + "width": "fill_container", + "height": 78, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "qwebi", + "name": "Budget Category Info · Travel", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "UZdhS", + "name": "Budget Category Name · Travel", + "fill": "$ink", + "content": "Travel", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "Tphr7", + "name": "Budget Category Kind · Travel", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "B1EBxj", + "name": "Budget Category Kind Label · Travel", + "fill": "$muted", + "content": "ENVELOPE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "w2qEw", + "name": "Budget Category Track · Travel", + "width": 82, + "height": 3, + "fill": "#E4E1D9", + "children": [ + { + "type": "rectangle", + "id": "Ki4mP", + "name": "Budget Category Bar · Travel", + "fill": "$blue", + "width": 3, + "height": 3 + } + ] + } + ] + } + ] + }, + { + "type": "text", + "id": "q8JHtJ", + "name": "Budget PLAN · Travel", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽20 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "iBp9J", + "name": "Budget FUNDED · Travel", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽12 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "lKD85", + "name": "Budget SPENT · Travel", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽0", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "p5CS3L", + "name": "Budget AVAILABLE · Travel", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "₽21 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "T8EkfK", + "name": "Budget Fund Action · Travel", + "width": 64, + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KBxhL", + "name": "Budget Fund Action Label · Travel", + "fill": "$blue", + "content": "FUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "qX1rQ", + "name": "Budget Category · Credit reserve", + "width": "fill_container", + "height": 78, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "xtmNF", + "name": "Budget Category Info · Credit reserve", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "DKHkY", + "name": "Budget Category Name · Credit reserve", + "fill": "$ink", + "content": "Credit reserve", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "HRwW0", + "name": "Budget Category Kind · Credit reserve", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nXYPB", + "name": "Budget Category Kind Label · Credit reserve", + "fill": "$muted", + "content": "SYSTEM · CREDIT", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "f61s1", + "name": "Budget Category Track · Credit reserve", + "width": 82, + "height": 3, + "fill": "#E4E1D9", + "children": [ + { + "type": "rectangle", + "id": "B6FC3E", + "name": "Budget Category Bar · Credit reserve", + "fill": "$blue", + "width": 25.419999999999998, + "height": 3 + } + ] + } + ] + } + ] + }, + { + "type": "text", + "id": "T3FITj", + "name": "Budget PLAN · Credit reserve", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "—", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Utgfv", + "name": "Budget FUNDED · Credit reserve", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽18 100", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Li4bb", + "name": "Budget SPENT · Credit reserve", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 100, + "content": "₽5 620", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "i3NaFs", + "name": "Budget AVAILABLE · Credit reserve", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "₽112 480", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "rCDVI", + "name": "Budget Fund Action · Credit reserve", + "width": 64, + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "wDYG8", + "name": "Budget Fund Action Label · Credit reserve", + "fill": "$blue", + "content": "FUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + } + ] + }, + { + "type": "frame", + "id": "jfxxx", + "name": "Budget Add Category", + "width": "fill_container", + "height": "fill_container", + "gap": 8, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "GXMYY", + "name": "Budget Add Category Icon", + "width": 15, + "height": 15, + "icon": "plus", + "library": "lucide", + "fill": "$blue" + }, + { + "type": "text", + "id": "toKtJ", + "name": "Budget Add Category Label", + "fill": "$blue", + "content": "Create monthly category or savings envelope", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "z8mJs", + "name": "Budget Aside", + "width": 350, + "height": "fill_container", + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "AKnFt", + "name": "Expected Incomes", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "yMlrX", + "name": "Expected Incomes Header", + "width": "fill_container", + "fill": "#EFEEE9", + "padding": 14, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "tCe2O", + "name": "Expected Incomes Title", + "fill": "$ink", + "content": "Expected income", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "eZPcB", + "name": "Expected Incomes Add", + "width": 16, + "height": 16, + "icon": "plus", + "library": "lucide", + "fill": "$blue" + } + ] + }, + { + "type": "frame", + "id": "I4Vdc", + "name": "Expected Income · Salary · Acme", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": 14, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "O21Vl", + "name": "Expected Income Copy · Salary · Acme", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "btA2x", + "name": "Expected Income Source · Salary · Acme", + "fill": "$ink", + "content": "Salary · Acme", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "r3Pxi", + "name": "Expected Income Meta · Salary · Acme", + "fill": "$green", + "content": "05 SEP · MATCHED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + }, + { + "type": "text", + "id": "sVPmX", + "name": "Expected Income Amount · Salary · Acme", + "fill": "$ink", + "content": "₽95 000", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "WPpIE", + "name": "Expected Income · Freelance", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": 14, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "h0CBw", + "name": "Expected Income Copy · Freelance", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "IxReK", + "name": "Expected Income Source · Freelance", + "fill": "$ink", + "content": "Freelance", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "PQsl8", + "name": "Expected Income Meta · Freelance", + "fill": "$amber", + "content": "25 SEP · PARTIAL", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + }, + { + "type": "text", + "id": "znyMT", + "name": "Expected Income Amount · Freelance", + "fill": "$ink", + "content": "₽15 000", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "tGb9K", + "name": "Expected Income · Tax return", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": 14, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Mx1O6", + "name": "Expected Income Copy · Tax return", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "iPeyl", + "name": "Expected Income Source · Tax return", + "fill": "$ink", + "content": "Tax return", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "xIjL8", + "name": "Expected Income Meta · Tax return", + "fill": "$muted", + "content": "28 SEP · EXPECTED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.5 + } + ] + }, + { + "type": "text", + "id": "GfLj7", + "name": "Expected Income Amount · Tax return", + "fill": "$ink", + "content": "₽15 000", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "JuUTt", + "name": "Budget Lifecycle", + "width": "fill_container", + "height": "fill_container", + "fill": "$ink", + "layout": "vertical", + "gap": 14, + "padding": 18, + "children": [ + { + "type": "text", + "id": "k1kz3", + "name": "Budget Lifecycle Kicker", + "fill": "#8FAEFF", + "content": "MONTH LIFECYCLE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "text", + "id": "GebJh", + "name": "Budget Lifecycle Title", + "fill": "$white", + "content": "Close with confidence", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "600" + }, + { + "type": "text", + "id": "O1qlIm", + "name": "Budget Lifecycle Description", + "fill": "#A5A5A1", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Closing freezes operations and writes an immutable snapshot. Reopening also opens every later closed month.", + "lineHeight": 1.4, + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "gG5yl", + "name": "Budget Blocker · Unresolved imports · 1", + "width": "fill_container", + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "gap": 10, + "padding": [ + 9, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "w4XeR", + "name": "Budget Blocker Icon · Unresolved imports · 1", + "width": 15, + "height": 15, + "icon": "circle-alert", + "library": "lucide", + "fill": "$amber" + }, + { + "type": "text", + "id": "K6aUb", + "name": "Budget Blocker Text · Unresolved imports · 1", + "fill": "$white", + "content": "Unresolved imports · 1", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "zGQNY", + "name": "Budget Blocker · Unresolved holds · 2", + "width": "fill_container", + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "gap": 10, + "padding": [ + 9, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "SvhJg", + "name": "Budget Blocker Icon · Unresolved holds · 2", + "width": 15, + "height": 15, + "icon": "clock-3", + "library": "lucide", + "fill": "$amber" + }, + { + "type": "text", + "id": "M75jfN", + "name": "Budget Blocker Text · Unresolved holds · 2", + "fill": "$white", + "content": "Unresolved holds · 2", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "mW7Hw", + "name": "Budget Blocker · Uncategorized expenses · 3", + "width": "fill_container", + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "gap": 10, + "padding": [ + 9, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "GlYlA", + "name": "Budget Blocker Icon · Uncategorized expenses · 3", + "width": 15, + "height": 15, + "icon": "tag", + "library": "lucide", + "fill": "$amber" + }, + { + "type": "text", + "id": "CF6GT", + "name": "Budget Blocker Text · Uncategorized expenses · 3", + "fill": "$white", + "content": "Uncategorized expenses · 3", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "mGZ8X", + "name": "Budget Blocker · Negative envelopes · 0", + "width": "fill_container", + "stroke": "#FFFFFF22", + "strokeWidth": { + "bottom": 1 + }, + "gap": 10, + "padding": [ + 9, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "NlbX7", + "name": "Budget Blocker Icon · Negative envelopes · 0", + "width": 15, + "height": 15, + "icon": "triangle-alert", + "library": "lucide", + "fill": "$green" + }, + { + "type": "text", + "id": "AZffx", + "name": "Budget Blocker Text · Negative envelopes · 0", + "fill": "$white", + "content": "Negative envelopes · 0", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "g1hR4v", + "name": "Budget Reopen Note", + "width": "fill_container", + "fill": "#252524", + "gap": 10, + "padding": 12, + "children": [ + { + "type": "icon", + "id": "fHnxE", + "name": "Budget Reopen Note Icon", + "width": 15, + "height": 15, + "icon": "history", + "library": "lucide", + "fill": "#8FAEFF" + }, + { + "type": "text", + "id": "ui8RS", + "name": "Budget Reopen Note Text", + "fill": "#A5A5A1", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Closed month? Reopen from its status menu. Later periods reopen in cascade.", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "JD5sH", + "layoutPosition": "absolute", + "x": 238, + "y": -50, + "name": "Category Drawer Scrim", + "fill": "#16161633", + "width": 682, + "height": 974 + }, + { + "type": "frame", + "id": "WnDLj", + "layoutPosition": "absolute", + "x": 920, + "y": -50, + "name": "Category Manager Drawer", + "width": 520, + "height": 974, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "left": 1 + }, + "effect": { + "type": "shadow", + "shadowType": "outer", + "color": "#16161622", + "offset": { + "x": -8, + "y": 0 + }, + "blur": 24 + }, + "layout": "vertical", + "gap": 18, + "padding": [ + 26, + 24 + ], + "children": [ + { + "type": "frame", + "id": "PvQXn", + "name": "Category Drawer Header", + "width": "fill_container", + "justifyContent": "space_between", + "children": [ + { + "type": "frame", + "id": "Qt1Dj", + "name": "Category Drawer Header Copy", + "width": 400, + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "FvOdO", + "name": "Category Drawer Title", + "fill": "$ink", + "content": "Управление категориями", + "fontFamily": "$font-ui", + "fontSize": 24, + "fontWeight": "700" + }, + { + "type": "text", + "id": "A2zji", + "name": "Category Drawer Subtitle", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Создавайте категории и управляйте доступностью, не теряя историю бюджета.", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "oxUx6", + "name": "Close Category Drawer", + "width": 34, + "height": 34, + "stroke": "$line", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "a4HZF", + "name": "Close Category Drawer Label", + "fill": "$ink", + "content": "×", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "B1RyF", + "name": "Create Category Form", + "width": "fill_container", + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 10, + "padding": 14, + "children": [ + { + "type": "text", + "id": "e9H7G", + "name": "Create Category Label", + "fill": "$muted", + "content": "НОВАЯ КАТЕГОРИЯ", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700", + "letterSpacing": 0.8 + }, + { + "type": "frame", + "id": "fagu2", + "name": "Create Category Fields", + "width": "fill_container", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ft0LN", + "name": "Category Name Field", + "width": 210, + "height": 40, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "YirAu", + "name": "Category Name Placeholder", + "fill": "$muted", + "content": "Например, Здоровье", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "PXcQQ", + "name": "Category Kind Field", + "width": 125, + "height": 40, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "k8UUOw", + "name": "Category Kind Value", + "fill": "$ink", + "content": "Ежемесячная", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "dxAY4", + "name": "Category Kind Chevron", + "fill": "$muted", + "content": "⌄", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Pmikk", + "name": "Create Category Button", + "width": 100, + "height": 40, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nnQX6", + "name": "Create Category Button Label", + "fill": "$white", + "content": "Создать", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "iTWRN", + "name": "Category Manager Tabs", + "width": "fill_container", + "height": 39, + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "children": [ + { + "type": "frame", + "id": "n3MrM", + "name": "Active Categories Tab", + "width": 145, + "height": 39, + "stroke": "$blue", + "strokeWidth": { + "bottom": 2 + }, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "u6AMhr", + "name": "Active Categories Tab Label", + "fill": "$blue", + "content": "Активные · 5", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "RBEPu", + "name": "Archived Categories Tab", + "width": 145, + "height": 39, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "JlhOV", + "name": "Archived Categories Tab Label", + "fill": "$muted", + "content": "Архив · 1", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "TGcLs", + "name": "Active Category Definitions", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "vEIjl", + "name": "Category Definition · Продукты", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 13, + 14 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "tWjCs", + "name": "Category Definition Copy · Продукты", + "width": 250, + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "rNVLR", + "name": "Category Definition Name · Продукты", + "fill": "$ink", + "content": "Продукты", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "J0DS1g", + "name": "Category Definition Meta · Продукты", + "fill": "$muted", + "content": "Ежемесячная", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "normal", + "letterSpacing": 0.3 + } + ] + }, + { + "type": "text", + "id": "PqwWX", + "name": "Category Definition Action · Продукты", + "fill": "$blue", + "textGrowth": "fixed-width", + "width": 165, + "content": "Переименовать · Архивировать", + "lineHeight": 1.35, + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "uYh24", + "name": "Category Definition · Накопления", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 13, + 14 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "UcBaV", + "name": "Category Definition Copy · Накопления", + "width": 250, + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "fSY0G", + "name": "Category Definition Name · Накопления", + "fill": "$ink", + "content": "Накопления", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "h9xvnS", + "name": "Category Definition Meta · Накопления", + "fill": "$blue", + "content": "Накопительная · Системная", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "normal", + "letterSpacing": 0.3 + } + ] + }, + { + "type": "text", + "id": "Y7thn", + "name": "Category Definition Action · Накопления", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 165, + "content": "Защищена: связана со счётом", + "lineHeight": 1.35, + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "si15V", + "name": "Category Definition · Резерв · Alfa credit", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 13, + 14 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "jyMq6", + "name": "Category Definition Copy · Резерв · Alfa credit", + "width": 250, + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "R1VQ2b", + "name": "Category Definition Name · Резерв · Alfa credit", + "fill": "$ink", + "content": "Резерв · Alfa credit", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "jpMLc", + "name": "Category Definition Meta · Резерв · Alfa credit", + "fill": "$blue", + "content": "Резерв · Системная", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "normal", + "letterSpacing": 0.3 + } + ] + }, + { + "type": "text", + "id": "EoOJz", + "name": "Category Definition Action · Резерв · Alfa credit", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 165, + "content": "Защищена: связана с кредиткой", + "lineHeight": 1.35, + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "E77GOx", + "name": "Archived Category Preview", + "width": "fill_container", + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 8, + "padding": 12, + "children": [ + { + "type": "text", + "id": "Q3HPG", + "name": "Archived Category Preview Label", + "fill": "$muted", + "content": "СОСТОЯНИЕ · АРХИВ", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "frame", + "id": "ALjzo", + "name": "Archived Category · Путешествия", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Kjag2", + "name": "Archived Category Copy", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "gcwym", + "name": "Archived Category Name", + "fill": "$muted", + "content": "Путешествия", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + }, + { + "type": "text", + "id": "BmoEs", + "name": "Archived Category History Note", + "fill": "$muted", + "content": "История и суммы сохранены", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "NQhCs", + "name": "Restore Category Button", + "height": 32, + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "DuFV2", + "name": "Restore Category Button Label", + "fill": "$blue", + "content": "Восстановить", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "duWTj", + "name": "Category Manager State Checklist", + "width": "fill_container", + "gap": 7, + "children": [ + { + "type": "frame", + "id": "bLprz", + "name": "Category State · Пусто", + "height": 27, + "fill": "$paper", + "stroke": "$muted", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "p1yAsB", + "name": "Category State Label · Пусто", + "fill": "$muted", + "content": "Пусто", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "mCFL8", + "name": "Category State · Сохранение…", + "height": 27, + "fill": "#E8F0FF", + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "l62vqE", + "name": "Category State Label · Сохранение…", + "fill": "$blue", + "content": "Сохранение…", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "XhbVd", + "name": "Category State · Ошибка", + "height": 27, + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "BM49r", + "name": "Category State Label · Ошибка", + "fill": "$red", + "content": "Ошибка", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "l9kA3", + "name": "Category State · Системная", + "height": 27, + "fill": "#E8F0FF", + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "TRhpz", + "name": "Category State Label · Системная", + "fill": "$blue", + "content": "Системная", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "B1pE0", + "x": 12160, + "y": 0, + "name": "12 · Savings & Resolution States", + "clip": true, + "width": 1440, + "height": 1024, + "fill": "$paper", + "layout": "vertical", + "gap": 22, + "padding": [ + 38, + 48 + ], + "children": [ + { + "type": "frame", + "id": "gVOA8", + "name": "Savings Flows Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "end", + "children": [ + { + "type": "frame", + "id": "f94Wbp", + "name": "Savings Flows Header Copy", + "width": 850, + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "ExNkW", + "name": "Savings Flows Title", + "fill": "$ink", + "content": "Накопления и устранение блокировок", + "fontFamily": "$font-ui", + "fontSize": 28, + "fontWeight": "700" + }, + { + "type": "text", + "id": "IfL7d", + "name": "Savings Flows Subtitle", + "fill": "$muted", + "content": "Выбранный drawer-first flow · контекст таблицы сохраняется, финансовые последствия видны до подтверждения", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "VhXpu", + "name": "Selected Flow Badge", + "height": 32, + "fill": "#E8F0FF", + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "MjaqF", + "name": "Selected Flow Badge Label", + "fill": "$blue", + "content": "DESIGN IT TWICE · SELECTED", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700", + "letterSpacing": 0.6 + } + ] + } + ] + }, + { + "type": "frame", + "id": "taOif", + "name": "Savings Flows Grid", + "width": "fill_container", + "height": "fill_container", + "gap": 22, + "children": [ + { + "type": "frame", + "id": "FeyK2", + "name": "Savings Flows Left Column", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "hfxuq", + "name": "Balance Adjustment Drawer State", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 12, + "padding": 18, + "children": [ + { + "type": "frame", + "id": "l9WTYR", + "name": "Adjustment Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mOQLa", + "name": "Adjustment Title", + "fill": "$ink", + "content": "Скорректировать накопления", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "rX6dp", + "name": "System Account Badge", + "height": 25, + "fill": "#E8F0FF", + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "c175I", + "name": "System Account Badge Label", + "fill": "$blue", + "content": "СИСТЕМНЫЙ СЧЁТ", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "zVpKy", + "name": "Savings Account Summary", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "end", + "children": [ + { + "type": "frame", + "id": "InOkI", + "name": "Savings Account Copy", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "LKEOJ", + "name": "Savings Account Name", + "fill": "$ink", + "content": "Накопления", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "O6eA2", + "name": "Savings Account Protection", + "fill": "$muted", + "content": "Нельзя переименовать или архивировать", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "v9tYr", + "name": "Savings Balance Copy", + "layout": "vertical", + "gap": 3, + "alignItems": "end", + "children": [ + { + "type": "text", + "id": "D7EBpN", + "name": "Current Balance Label", + "fill": "$muted", + "content": "ТЕКУЩИЙ ОСТАТОК", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "d1bWU", + "name": "Current Balance Value", + "fill": "$green", + "content": "128 500,00 ₽", + "fontFamily": "$font-data", + "fontSize": 20, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "riPBe", + "name": "Adjustment Fields", + "width": "fill_container", + "gap": 10, + "children": [ + { + "type": "frame", + "id": "rMUeI", + "name": "Target Balance", + "width": 290, + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "aQS5T", + "name": "Target Balance Label", + "fill": "$muted", + "content": "НОВЫЙ ОСТАТОК", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "L07zG", + "name": "Target Balance Input", + "width": "fill_container", + "height": 40, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "HGLHG", + "name": "Target Balance Value", + "fill": "$ink", + "content": "130 000,00 ₽", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "UIPuL", + "name": "Adjustment Date", + "width": 290, + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "OHtyf", + "name": "Adjustment Date Label", + "fill": "$muted", + "content": "ДАТА", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "d0ISOT", + "name": "Adjustment Date Input", + "width": "fill_container", + "height": 40, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VCNo9", + "name": "Adjustment Date Value", + "fill": "$ink", + "content": "22.09.2026", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "B4Fd22", + "name": "Adjustment Reason", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "xmV4K", + "name": "Adjustment Reason Label", + "fill": "$muted", + "content": "ПРИЧИНА · ОБЯЗАТЕЛЬНО", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "kU5gW", + "name": "Adjustment Reason Input", + "width": "fill_container", + "height": 44, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "UQpQy", + "name": "Adjustment Reason Value", + "fill": "$ink", + "content": "Сверка с банковским приложением", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "DUjpj", + "name": "Adjustment Consequence", + "width": "fill_container", + "fill": "$green-soft", + "stroke": "$green", + "strokeWidth": { + "left": 3 + }, + "layout": "vertical", + "gap": 5, + "padding": 12, + "children": [ + { + "type": "text", + "id": "tFhWw", + "name": "Adjustment Delta", + "fill": "$green", + "content": "Изменение: +1 500,00 ₽", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "zXqhl", + "name": "Adjustment Explanation", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Создаётся корректировка остатка. Это не доход и не расход; общий пул и cash flow не меняются.", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "v6pFql", + "name": "Adjustment Actions", + "width": "fill_container", + "gap": 8, + "justifyContent": "end", + "children": [ + { + "type": "frame", + "id": "ksxqW", + "name": "Cancel Adjustment", + "height": 36, + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 14 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "C6199", + "name": "Cancel Adjustment Label", + "fill": "$ink", + "content": "Отмена", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "jd8ml", + "name": "Save Adjustment", + "height": 36, + "fill": "$blue", + "padding": [ + 0, + 16 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "OgrEi", + "name": "Save Adjustment Label", + "fill": "$white", + "content": "Сохранить корректировку", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "uPbcg", + "name": "Expense To Savings Confirmation", + "width": "fill_container", + "fill": "$ink", + "layout": "vertical", + "gap": 12, + "padding": 18, + "children": [ + { + "type": "frame", + "id": "I9TCV9", + "name": "Savings Conversion Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "S1p2w", + "name": "Savings Conversion Title", + "fill": "$white", + "content": "Перевести расход в накопления?", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "H6A4S1", + "name": "Reversible Badge", + "height": 24, + "fill": "$amber-soft", + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "I5GRN", + "name": "Reversible Badge Label", + "fill": "$amber", + "content": "ОБРАТИМО", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Q3dPn5", + "name": "Conversion Operation Summary", + "width": "fill_container", + "stroke": "#FFFFFF33", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "end", + "children": [ + { + "type": "frame", + "id": "CfoRD", + "name": "Conversion Operation Copy", + "width": 390, + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "hCgmf", + "name": "Conversion Operation Payee", + "fill": "$white", + "content": "Перечисление средств · 21 сентября", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "GxHiR", + "name": "Conversion Account Route", + "fill": "#9DBEFF", + "content": "Alfa debit → Накопления", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "Najgw", + "name": "Conversion Amount", + "fill": "$white", + "content": "−1 250,00 ₽", + "fontFamily": "$font-data", + "fontSize": 18, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "Zbfne", + "name": "Conversion Financial Consequence", + "width": "fill_container", + "fill": "#FFFFFF0D", + "stroke": "$amber", + "strokeWidth": { + "left": 3 + }, + "layout": "vertical", + "gap": 5, + "padding": 12, + "children": [ + { + "type": "text", + "id": "P9pWGu", + "name": "Conversion Category Change", + "fill": "$amber-soft", + "content": "Категория: Без категории → Накопления", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "700" + }, + { + "type": "text", + "id": "ApPdD", + "name": "Conversion Consequence Copy", + "fill": "$white", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Расход станет переводом, уйдёт из расходов месяца и уменьшит общий бюджетный пул. Исходная категория сохранится для возврата.", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "h4O3L", + "name": "Conversion Actions", + "width": "fill_container", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "IhnCA", + "name": "Confirm Savings Conversion", + "width": "fill_container", + "height": 38, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "rHZ6x", + "name": "Confirm Savings Conversion Label", + "fill": "$white", + "content": "В накопления", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "ystXW", + "name": "Cancel Savings Conversion", + "width": 120, + "height": 38, + "stroke": "#FFFFFF55", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qKfos", + "name": "Cancel Savings Conversion Label", + "fill": "$white", + "content": "Отмена", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "hY7xz", + "name": "Converted Transfer Revert State", + "width": "fill_container", + "fill": "#0E492D", + "stroke": "$green", + "strokeWidth": 1, + "padding": [ + 9, + 11 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "tTsNP", + "name": "Converted Transfer State Copy", + "fill": "$green-soft", + "content": "После сохранения: перевод · Накопления", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "J0XpwG", + "name": "Revert Expense Action", + "fill": "$white", + "content": "Вернуть в расходы", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "veNfC", + "name": "Savings Flows Right Column", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "YLWvo", + "name": "Actionable Budget Blockers", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 10, + "padding": 18, + "children": [ + { + "type": "frame", + "id": "K4v9D", + "name": "Budget Blockers Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "yQuL8", + "name": "Budget Blockers Title", + "fill": "$ink", + "content": "Что мешает закрыть сентябрь", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "text", + "id": "S0uPxu", + "name": "Budget Blockers Count", + "fill": "$red", + "content": "4 ПРИЧИНЫ", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "VArNW", + "name": "Budget Blocker · Не завершены импорты выписок", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "lCuYc", + "name": "Budget Blocker Lead · Не завершены импорты выписок", + "width": 420, + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "u3Dcj", + "name": "Budget Blocker Count · Не завершены импорты выписок", + "width": 28, + "height": 28, + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VUda5", + "name": "Budget Blocker Count Label · Не завершены импорты выписок", + "fill": "$red", + "content": "2", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "I8AOlt", + "name": "Budget Blocker Text · Не завершены импорты выписок", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 370, + "content": "Не завершены импорты выписок", + "fontFamily": "$font-ui", + "fontSize": 11.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "qyGBg", + "name": "Budget Blocker Action · Не завершены импорты выписок", + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "g2JbVa", + "name": "Budget Blocker Action Label · Не завершены импорты выписок", + "fill": "$blue", + "content": "Открыть очередь", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "IuHV3", + "name": "Budget Blocker · Неподтверждённые HOLD-операции", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "xFkh9", + "name": "Budget Blocker Lead · Неподтверждённые HOLD-операции", + "width": 420, + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "i2Qkk", + "name": "Budget Blocker Count · Неподтверждённые HOLD-операции", + "width": 28, + "height": 28, + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "RThSB", + "name": "Budget Blocker Count Label · Неподтверждённые HOLD-операции", + "fill": "$red", + "content": "3", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "s6ssa", + "name": "Budget Blocker Text · Неподтверждённые HOLD-операции", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 370, + "content": "Неподтверждённые HOLD-операции", + "fontFamily": "$font-ui", + "fontSize": 11.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "O8AGh", + "name": "Budget Blocker Action · Неподтверждённые HOLD-операции", + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Lhc4D", + "name": "Budget Blocker Action Label · Неподтверждённые HOLD-операции", + "fill": "$blue", + "content": "К импортам", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "hMVSX", + "name": "Budget Blocker · Расходы без категории", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Ph6ZW", + "name": "Budget Blocker Lead · Расходы без категории", + "width": 420, + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ntFGt", + "name": "Budget Blocker Count · Расходы без категории", + "width": 28, + "height": 28, + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VSSLg", + "name": "Budget Blocker Count Label · Расходы без категории", + "fill": "$red", + "content": "7", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "AGmpW", + "name": "Budget Blocker Text · Расходы без категории", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 370, + "content": "Расходы без категории", + "fontFamily": "$font-ui", + "fontSize": 11.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "iGSd7", + "name": "Budget Blocker Action · Расходы без категории", + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "IHv8v", + "name": "Budget Blocker Action Label · Расходы без категории", + "fill": "$blue", + "content": "Разобрать сентябрь", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "T69ke6", + "name": "Budget Blocker · Отрицательные конверты: Дом, Транспорт", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 10, + 0 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "V4Z0GX", + "name": "Budget Blocker Lead · Отрицательные конверты: Дом, Транспорт", + "width": 420, + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "cOTEB", + "name": "Budget Blocker Count · Отрицательные конверты: Дом, Транспорт", + "width": 28, + "height": 28, + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "joB7s", + "name": "Budget Blocker Count Label · Отрицательные конверты: Дом, Транспорт", + "fill": "$red", + "content": "2", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "jAvS5", + "name": "Budget Blocker Text · Отрицательные конверты: Дом, Транспорт", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 370, + "content": "Отрицательные конверты: Дом, Транспорт", + "fontFamily": "$font-ui", + "fontSize": 11.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Z9RtvO", + "name": "Budget Blocker Action · Отрицательные конверты: Дом, Транспорт", + "height": 30, + "stroke": "$blue", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hhSgc", + "name": "Budget Blocker Action Label · Отрицательные конверты: Дом, Транспорт", + "fill": "$blue", + "content": "К категориям", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Ryxry", + "name": "Unknown Blocker Fallback", + "width": "fill_container", + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "padding": 10, + "children": [ + { + "type": "text", + "id": "gbWF4", + "name": "Unknown Blocker Fallback Copy", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Неизвестная причина показывается нейтральным текстом; машинный код остаётся только в диагностике.", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "iJ811", + "name": "Confirmed Import Hold Resolution", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 10, + "padding": 18, + "children": [ + { + "type": "frame", + "id": "bLtwk", + "name": "Hold Resolution Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "q1jxs", + "name": "Hold Resolution Title", + "fill": "$ink", + "content": "HOLD без решения", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "i7TiuS", + "name": "Unresolved Hold Badge", + "height": 25, + "fill": "$amber-soft", + "stroke": "$amber", + "strokeWidth": 1, + "padding": [ + 0, + 9 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "HC4N7", + "name": "Unresolved Hold Badge Label", + "fill": "$amber", + "content": "CONFIRMED IMPORT · 1", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "jkw9Z", + "name": "Hold Operation Summary", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 9, + 0 + ], + "justifyContent": "space_between", + "alignItems": "end", + "children": [ + { + "type": "frame", + "id": "iYEyN", + "name": "Hold Operation Copy", + "width": 410, + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "vC4p4", + "name": "Hold Operation Merchant", + "fill": "$ink", + "content": "Railway authorization · Alfa debit", + "fontFamily": "$font-ui", + "fontSize": 12.5, + "fontWeight": "700" + }, + { + "type": "text", + "id": "WJlrf", + "name": "Hold Operation Date", + "fill": "$muted", + "content": "21 сентября · mapped account", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "KaMyJ", + "name": "Hold Operation Amount", + "fill": "$red", + "content": "−1 250,00 ₽", + "fontFamily": "$font-data", + "fontSize": 17, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "LOUgn", + "name": "Hold Resolution Reason", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "nADoN", + "name": "Hold Resolution Reason Label", + "fill": "$muted", + "content": "ПРИЧИНА · ОБЯЗАТЕЛЬНО", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "aID2g", + "name": "Hold Resolution Reason Input", + "width": "fill_container", + "height": 42, + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "LQ5Gb", + "name": "Hold Resolution Reason Placeholder", + "fill": "$muted", + "content": "Что подтверждает выбранное решение?", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Hez86", + "name": "Hold Resolution Actions", + "width": "fill_container", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "GXlWN", + "name": "Confirm Hold As Posted", + "width": "fill_container", + "height": 38, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "uTV7d", + "name": "Confirm Hold As Posted Label", + "fill": "$white", + "content": "Операция списалась", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "fzogD", + "name": "Discard Hold As Cancelled", + "width": "fill_container", + "height": 38, + "stroke": "$line", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nxWXP", + "name": "Discard Hold As Cancelled Label", + "fill": "$ink", + "content": "Операция отменена", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "l5JCx", + "name": "Closed Month Hold Error", + "width": "fill_container", + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": { + "left": 3 + }, + "gap": 8, + "padding": [ + 9, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kaNvP", + "name": "Closed Month Hold Error Text", + "fill": "$red", + "content": "Месяц закрыт — сначала откройте его", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + }, + { + "type": "text", + "id": "y0mIj", + "name": "Closed Month Hold Error Action", + "fill": "$blue", + "content": "Открыть месяц →", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "C3uCoK", + "name": "Required Flow States", + "width": "fill_container", + "fill": "$ink", + "layout": "vertical", + "gap": 8, + "padding": 14, + "children": [ + { + "type": "text", + "id": "jmLUK", + "name": "Required Flow States Title", + "fill": "$white", + "content": "ПРОВЕРКА СОСТОЯНИЙ · DESKTOP + MOBILE", + "fontFamily": "$font-data", + "fontSize": 9.5, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "frame", + "id": "bDZdF", + "name": "Required Flow State Chips", + "width": "fill_container", + "gap": 7, + "children": [ + { + "type": "frame", + "id": "fJoeR", + "name": "Required State · Данные", + "height": 25, + "stroke": "$green-soft", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "ZnQiT", + "name": "Required State Label · Данные", + "fill": "$green-soft", + "content": "Данные", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "rQX9w", + "name": "Required State · Пусто", + "height": 25, + "stroke": "$white", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "cqm4H", + "name": "Required State Label · Пусто", + "fill": "$white", + "content": "Пусто", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "f8LpO", + "name": "Required State · Pending", + "height": 25, + "stroke": "#9DBEFF", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "YmoLK", + "name": "Required State Label · Pending", + "fill": "#9DBEFF", + "content": "Pending", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "z0ELY", + "name": "Required State · Ошибка", + "height": 25, + "stroke": "$red-soft", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "I3qyqm", + "name": "Required State Label · Ошибка", + "fill": "$red-soft", + "content": "Ошибка", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "XwET7", + "name": "Required State · System", + "height": 25, + "stroke": "#9DBEFF", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Dqzgy", + "name": "Required State Label · System", + "fill": "#9DBEFF", + "content": "System", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "qlMk6", + "name": "Required State · Archive", + "height": 25, + "stroke": "$amber-soft", + "strokeWidth": 1, + "padding": [ + 0, + 8 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "z6GBN", + "name": "Required State Label · Archive", + "fill": "$amber-soft", + "content": "Archive", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "bWcks", + "x": 4354, + "y": 1104, + "name": "13 · Mobile / Category Manager", + "clip": true, + "width": 390, + "height": 844, + "fill": "$paper", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "kL2Vl", + "name": "Mobile Category Content", + "width": 390, + "height": 794, + "layout": "vertical", + "gap": 14, + "padding": [ + 18, + 16 + ], + "children": [ + { + "type": "frame", + "id": "i4eTRm", + "name": "Mobile Category Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "HpGEV", + "name": "Mobile Category Header Copy", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "Jzdpt", + "name": "Mobile Category Eyebrow", + "fill": "$muted", + "content": "БЮДЖЕТ · СЕНТЯБРЬ", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "IVOOS", + "name": "Mobile Category Title", + "fill": "$ink", + "content": "Категории", + "fontFamily": "$font-ui", + "fontSize": 22, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "y5zSOf", + "name": "Mobile Category Close", + "width": 36, + "height": 36, + "stroke": "$line", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "uhsx9", + "name": "Mobile Category Close Label", + "fill": "$ink", + "content": "×", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "WFwIN", + "name": "Mobile Create Category", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "gap": 8, + "padding": 12, + "children": [ + { + "type": "text", + "id": "zGEdK", + "name": "Mobile Create Category Label", + "fill": "$muted", + "content": "СОЗДАТЬ КАТЕГОРИЮ", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "f33Z13", + "name": "Mobile Category Name Input", + "width": "fill_container", + "height": 42, + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "m24NE", + "name": "Mobile Category Name Input Value", + "fill": "$muted", + "content": "Название", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "jXpu7", + "name": "Mobile Category Kind Input", + "width": "fill_container", + "height": 42, + "fill": "$paper", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 11 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "uY4Gm", + "name": "Mobile Category Kind Input Value", + "fill": "$muted", + "content": "Ежемесячная ⌄", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "oDU1E", + "name": "Mobile Create Category Button", + "width": "fill_container", + "height": 42, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "k9b8M", + "name": "Mobile Create Category Button Label", + "fill": "$white", + "content": "Создать", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "JVP9Y", + "name": "Mobile Category Tabs", + "width": "fill_container", + "height": 40, + "stroke": "$line", + "strokeWidth": 1, + "children": [ + { + "type": "frame", + "id": "M7j5D", + "name": "Mobile Category Tab · Активные · 5", + "width": "fill_container", + "height": 40, + "fill": "#E8F0FF", + "stroke": "$blue", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Hi6WP", + "name": "Mobile Category Tab Label · Активные · 5", + "fill": "$blue", + "content": "Активные · 5", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "WbR4W", + "name": "Mobile Category Tab · Архив · 1", + "width": "fill_container", + "height": 40, + "fill": "$white", + "stroke": "$line", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "CcyRt", + "name": "Mobile Category Tab Label · Архив · 1", + "fill": "$muted", + "content": "Архив · 1", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "frame", + "id": "DRoY8", + "name": "Mobile Category List", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "WvbJo", + "name": "Mobile Category · Продукты", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": 12, + "children": [ + { + "type": "text", + "id": "RJDNf", + "name": "Mobile Category Name · Продукты", + "fill": "$ink", + "content": "Продукты", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "G7JPl", + "name": "Mobile Category Meta · Продукты", + "fill": "$muted", + "content": "Ежемесячная", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "rAQRI", + "name": "Mobile Category Action · Продукты", + "fill": "$blue", + "content": "Переименовать · Архивировать", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "BT9FS", + "name": "Mobile Category · Накопления", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": 12, + "children": [ + { + "type": "text", + "id": "hQGu0", + "name": "Mobile Category Name · Накопления", + "fill": "$ink", + "content": "Накопления", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "R75etH", + "name": "Mobile Category Meta · Накопления", + "fill": "$muted", + "content": "Накопительная · Системная", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ptslB", + "name": "Mobile Category Action · Накопления", + "fill": "$muted", + "content": "Защищена системным правилом", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "HjJb7", + "name": "Mobile Category · Резерв · Alfa credit", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": 12, + "children": [ + { + "type": "text", + "id": "JfF7v", + "name": "Mobile Category Name · Резерв · Alfa credit", + "fill": "$ink", + "content": "Резерв · Alfa credit", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "Xk1MY", + "name": "Mobile Category Meta · Резерв · Alfa credit", + "fill": "$muted", + "content": "Резерв · Системная", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "psbhT", + "name": "Mobile Category Action · Резерв · Alfa credit", + "fill": "$muted", + "content": "Защищена системным правилом", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "mvKbp", + "name": "Mobile Archived Category Hint", + "width": "fill_container", + "fill": "$amber-soft", + "stroke": "$amber", + "strokeWidth": { + "left": 3 + }, + "padding": 11, + "children": [ + { + "type": "text", + "id": "gN7ow", + "name": "Mobile Archived Category Hint Copy", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "В архиве: Путешествия · история сохранена · Восстановить", + "lineHeight": 1.35, + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "QZZ3p", + "x": 4792, + "y": 1104, + "name": "14 · Mobile / Savings Adjustment", + "clip": true, + "width": 390, + "height": 844, + "fill": "$paper", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "Riplr", + "name": "Mobile Adjustment Content", + "width": 390, + "height": 794, + "layout": "vertical", + "gap": 15, + "padding": [ + 18, + 16 + ], + "children": [ + { + "type": "frame", + "id": "b9NYNt", + "name": "Mobile Adjustment Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "x6t5M6", + "name": "Mobile Adjustment Header Copy", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "Hx9xG", + "name": "Mobile Adjustment Eyebrow", + "fill": "$blue", + "content": "СЧЕТА · СИСТЕМНЫЙ", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "X1sgG", + "name": "Mobile Adjustment Title", + "fill": "$ink", + "content": "Накопления", + "fontFamily": "$font-ui", + "fontSize": 22, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "tMbxP", + "name": "Mobile Adjustment Close", + "width": 36, + "height": 36, + "stroke": "$line", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "t0ZTM", + "name": "Mobile Adjustment Close Label", + "fill": "$ink", + "content": "×", + "fontFamily": "$font-ui", + "fontSize": 20, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "bUJP8", + "name": "Mobile Current Savings Balance", + "width": "fill_container", + "fill": "$ink", + "layout": "vertical", + "gap": 4, + "padding": 16, + "children": [ + { + "type": "text", + "id": "WVFi2", + "name": "Mobile Current Balance Label", + "fill": "#FFFFFF99", + "content": "ТЕКУЩИЙ ОСТАТОК", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "text", + "id": "Q6Y8w", + "name": "Mobile Current Balance Value", + "fill": "$white", + "content": "128 500,00 ₽", + "fontFamily": "$font-data", + "fontSize": 28, + "fontWeight": "700" + }, + { + "type": "text", + "id": "A9XgK", + "name": "Mobile Savings Envelope Note", + "fill": "#FFFFFFAA", + "content": "Доступно в конверте «Накопления»", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "z4JDq", + "name": "Mobile Target Balance", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "jO3gE", + "name": "Mobile Target Balance Label", + "fill": "$muted", + "content": "НОВЫЙ ОСТАТОК", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "Ill7U", + "name": "Mobile Target Balance Input", + "width": "fill_container", + "height": 44, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "y9MWh", + "name": "Mobile Target Balance Value", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "130 000,00 ₽", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "NzOZD", + "name": "Mobile Adjustment Date", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "kOlg9", + "name": "Mobile Adjustment Date Label", + "fill": "$muted", + "content": "ДАТА", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "xO7LX", + "name": "Mobile Adjustment Date Input", + "width": "fill_container", + "height": 44, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mr8fa", + "name": "Mobile Adjustment Date Value", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "22.09.2026", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "I2nDGd", + "name": "Mobile Adjustment Reason", + "width": "fill_container", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "To5Pq", + "name": "Mobile Adjustment Reason Label", + "fill": "$muted", + "content": "ПРИЧИНА · ОБЯЗАТЕЛЬНО", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "z1jAw", + "name": "Mobile Adjustment Reason Input", + "width": "fill_container", + "height": 52, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "K77kr", + "name": "Mobile Adjustment Reason Value", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Сверка с банковским приложением", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "vNWVo", + "name": "Mobile Adjustment Delta", + "width": "fill_container", + "fill": "$green-soft", + "stroke": "$green", + "strokeWidth": { + "left": 3 + }, + "layout": "vertical", + "gap": 5, + "padding": 13, + "children": [ + { + "type": "text", + "id": "BfvFX", + "name": "Mobile Adjustment Delta Value", + "fill": "$green", + "content": "Изменение: +1 500,00 ₽", + "fontFamily": "$font-data", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "XmjJC", + "name": "Mobile Adjustment Delta Copy", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Не доход и не расход. Общий пул и cash flow не изменятся.", + "lineHeight": 1.4, + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "SLBUv", + "name": "Mobile Adjustment Error State", + "width": "fill_container", + "fill": "$red-soft", + "stroke": "$red", + "strokeWidth": { + "left": 3 + }, + "padding": 11, + "children": [ + { + "type": "text", + "id": "Lgce0", + "name": "Mobile Adjustment Error Copy", + "fill": "$red", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Пример ошибки: изменение равно нулю / месяц закрыт", + "fontFamily": "$font-ui", + "fontSize": 10.5, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "z6mVw", + "name": "Mobile Save Adjustment", + "width": "fill_container", + "height": 48, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "XcHyd", + "name": "Mobile Save Adjustment Label", + "fill": "$white", + "content": "Сохранить корректировку", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "Tw5oE", + "name": "Mobile Adjustment Keyboard Note", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Submit возвращает фокус к строке счёта · pending блокирует только форму", + "lineHeight": 1.35, + "textAlign": "center", + "fontFamily": "$font-data", + "fontSize": 8.5, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "aZild", + "x": 13680, + "y": 0, + "name": "03a · Ledger / Default", + "clip": true, + "width": 1440, + "height": 1024, + "fill": "$paper", + "children": [ + { + "type": "frame", + "id": "OH9EU", + "name": "Overview Sidebar", + "width": 238, + "height": 974, + "fill": "$ink", + "layout": "vertical", + "padding": [ + 32, + 24 + ], + "justifyContent": "space_between", + "children": [ + { + "type": "frame", + "id": "ItWqQ", + "name": "Overview Sidebar Top", + "width": "fill_container", + "layout": "vertical", + "gap": 34, + "children": [ + { + "type": "frame", + "id": "fo3qw", + "name": "Overview Brand", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "OEi0Q", + "name": "Overview Brand Mark", + "width": 34, + "height": 34, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "G5Z4ph", + "name": "Overview Brand Mark Text", + "fill": "$white", + "content": "FS", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "zC448", + "name": "Overview Brand Text", + "fill": "$white", + "content": "FINSPACE", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "700", + "letterSpacing": 1.3 + } + ] + }, + { + "type": "frame", + "id": "YweJ3", + "name": "Overview Space", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": [ + 0, + 0, + 18, + 0 + ], + "children": [ + { + "type": "text", + "id": "Z42ovv", + "name": "Overview Space Label", + "fill": "#777773", + "content": "FINANCIAL SPACE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 1 + }, + { + "type": "text", + "id": "UrC0a", + "name": "Overview Space Name", + "fill": "$white", + "content": "Morozov household", + "fontFamily": "$font-ui", + "fontSize": 15, + "fontWeight": "600" + }, + { + "type": "text", + "id": "dnrB2", + "name": "Overview Space Role", + "fill": "#8FAEFF", + "content": "OWNER · ACTIVE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "qYByt", + "name": "Overview Navigation", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "frame", + "id": "nnIVx", + "name": "Nav · This month", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "IBlf6", + "name": "Nav Lead · This month", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "G1F9r9", + "name": "Nav Icon · This month", + "width": 17, + "height": 17, + "icon": "calendar-range", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "ey9eQ", + "name": "Nav Label · This month", + "fill": "#C0C0BC", + "content": "This month", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "EJ0vc", + "name": "Nav · Ledger", + "width": "fill_container", + "height": 42, + "fill": "$blue", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "lSE60", + "name": "Nav Lead · Ledger", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "GmLFJ", + "name": "Nav Icon · Ledger", + "width": 17, + "height": 17, + "icon": "rows-3", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "oqNOW", + "name": "Nav Label · Ledger", + "fill": "$white", + "content": "Ledger", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "GyHu7", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "edufE", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "R7btz7", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "G5JcJ", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "rpCVL", + "name": "Nav · Statements", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "kqy5V", + "name": "Nav Lead · Statements", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "pDtTj", + "name": "Nav Icon · Statements", + "width": 17, + "height": 17, + "icon": "inbox", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "Z8h4jI", + "name": "Nav Label · Statements", + "fill": "#C0C0BC", + "content": "Statements", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + }, + { + "type": "frame", + "id": "dcn2q", + "name": "Nav Count · Statements", + "width": 22, + "height": 22, + "fill": "$amber-soft", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nyMSu", + "name": "Nav Count Text · Statements", + "fill": "$amber", + "content": "3", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "RNz9t", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "oZ3Ju", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "knq1t", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "z99NiR", + "name": "Nav Label · Review Queue", + "fill": "#C0C0BC", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "jiOht", + "name": "Nav · Analytics", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "VKOPn", + "name": "Nav Lead · Analytics", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "zVCJv", + "name": "Nav Icon · Analytics", + "width": 17, + "height": 17, + "icon": "chart-no-axes-combined", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "N5mJQ5", + "name": "Nav Label · Analytics", + "fill": "#C0C0BC", + "content": "Analytics", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "hvKEJ", + "name": "Nav · Accounts", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "uz0Md", + "name": "Nav Lead · Accounts", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "f2kVed", + "name": "Nav Icon · Accounts", + "width": 17, + "height": 17, + "icon": "wallet-cards", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "AviHu", + "name": "Nav Label · Accounts", + "fill": "#C0C0BC", + "content": "Accounts", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "djv9A", + "name": "Nav · Space & data", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "aB4MX", + "name": "Nav Lead · Space & data", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "qqbI1", + "name": "Nav Icon · Space & data", + "width": 17, + "height": 17, + "icon": "settings-2", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "xbs9G", + "name": "Nav Label · Space & data", + "fill": "#C0C0BC", + "content": "Space & data", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "cmSaW", + "name": "Overview Sidebar Bottom", + "width": "fill_container", + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "OpFTM", + "name": "Overview Sync State", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "vQ2t9", + "name": "Overview Sync Dot", + "fill": "$green", + "width": 7, + "height": 7 + }, + { + "type": "text", + "id": "o3Xak", + "name": "Overview Sync Text", + "fill": "#8D8D89", + "content": "All data synced", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "IMdAH", + "name": "Overview Profile", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "top": 1 + }, + "gap": 10, + "padding": [ + 14, + 0, + 0, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "E7KGs", + "name": "Overview Avatar", + "width": 34, + "height": 34, + "fill": "#30302E", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "u1TMW", + "name": "Overview Avatar Text", + "fill": "$white", + "content": "AM", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "DmzlO", + "name": "Overview Profile Copy", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "Xgs1W", + "name": "Overview Profile Name", + "fill": "$white", + "content": "Alexey Morozov", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "vDFrt", + "name": "Overview Profile Meta", + "fill": "#777773", + "content": "RU · Europe/Moscow", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "icon", + "id": "Q2Qpu", + "name": "Logout Action", + "width": 15, + "height": 15, + "icon": "log-out", + "library": "lucide", + "fill": "#777773" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "UmZNv", + "name": "Ledger Main", + "width": "fill_container", + "height": 974, + "layout": "vertical", + "gap": 20, + "padding": [ + 34, + 42 + ], + "children": [ + { + "type": "frame", + "id": "J3N9r", + "name": "Ledger Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "COHBy", + "name": "Ledger Header Copy", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "wZhKW", + "name": "Ledger Title", + "fill": "$ink", + "content": "Ledger", + "fontFamily": "$font-ui", + "fontSize": 34, + "fontWeight": "600", + "letterSpacing": -0.7 + }, + { + "type": "text", + "id": "W13yf", + "name": "Ledger Meta", + "fill": "$muted", + "content": "426 OPERATIONS · SEPTEMBER 2026", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "normal", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "nv3yM", + "name": "Ledger New Operation", + "fill": "$blue", + "gap": 8, + "padding": [ + 11, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "iIgyV", + "name": "Ledger New Operation Icon", + "width": 15, + "height": 15, + "icon": "plus", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "BdUEQ", + "name": "Ledger New Operation Label", + "fill": "$white", + "content": "New operation", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "O0oJjq", + "name": "Ledger Filters", + "width": "fill_container", + "height": 54, + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "J3yLfw", + "name": "Ledger Search", + "width": "fill_container", + "gap": 9, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "PZJGF", + "name": "Ledger Search Icon", + "width": 16, + "height": 16, + "icon": "search", + "library": "lucide", + "fill": "$muted" + }, + { + "type": "text", + "id": "JWcE0", + "name": "Ledger Search Placeholder", + "fill": "$muted", + "content": "Search description…", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "XdeCH", + "name": "Ledger Filter · ACCOUNT", + "stroke": "$line", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 9, + 10 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "XIbxf", + "name": "Ledger Filter Label · ACCOUNT", + "fill": "$muted", + "content": "ACCOUNT", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "qTb6Q", + "name": "Ledger Filter Value · ACCOUNT", + "fill": "$ink", + "content": "All", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "JenG5", + "name": "Ledger Filter Chevron · ACCOUNT", + "width": 13, + "height": 13, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "X6XaVq", + "name": "Ledger Filter · TYPE", + "stroke": "$line", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 9, + 10 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KDJwm", + "name": "Ledger Filter Label · TYPE", + "fill": "$muted", + "content": "TYPE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "T34zY", + "name": "Ledger Filter Value · TYPE", + "fill": "$ink", + "content": "All", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "S8Wunj", + "name": "Ledger Filter Chevron · TYPE", + "width": 13, + "height": 13, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "VFvZt", + "name": "Ledger Filter · STATUS", + "stroke": "$line", + "strokeWidth": 1, + "gap": 8, + "padding": [ + 9, + 10 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Dt9PS", + "name": "Ledger Filter Label · STATUS", + "fill": "$muted", + "content": "STATUS", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700", + "letterSpacing": 0.6 + }, + { + "type": "text", + "id": "avCJY", + "name": "Ledger Filter Value · STATUS", + "fill": "$ink", + "content": "Confirmed", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "AIJFe", + "name": "Ledger Filter Chevron · STATUS", + "width": 13, + "height": 13, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "kED6y", + "name": "Ledger Filter · FROM", + "width": 132, + "height": 32, + "stroke": "$line", + "strokeWidth": 1, + "gap": 5, + "padding": [ + 0, + 8 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "wwPj3", + "name": "Ledger Filter Label · FROM", + "fill": "$muted", + "content": "FROM", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "text", + "id": "batPh", + "name": "Ledger Filter Value · FROM", + "fill": "$ink", + "content": "01 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "w3Clc3", + "name": "Ledger Filter Calendar · FROM", + "width": 12, + "height": 12, + "icon": "calendar-days", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "u6Fco", + "name": "Ledger Filter · TO", + "width": 132, + "height": 32, + "stroke": "$line", + "strokeWidth": 1, + "gap": 5, + "padding": [ + 0, + 8 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "cqWlL", + "name": "Ledger Filter Label · TO", + "fill": "$muted", + "content": "TO", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "text", + "id": "TO4PP", + "name": "Ledger Filter Value · TO", + "fill": "$ink", + "content": "30 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "icon", + "id": "sf3pF", + "name": "Ledger Filter Calendar · TO", + "width": 12, + "height": 12, + "icon": "calendar-days", + "library": "lucide", + "fill": "$muted" + } + ] + }, + { + "type": "frame", + "id": "t8UlyE", + "name": "Ledger Filter · UNCATEGORIZED", + "height": 32, + "gap": 6, + "padding": [ + 0, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "id": "HDEtb", + "name": "Uncategorized checkbox", + "fill": "$white", + "width": 13, + "height": 13, + "stroke": "$line", + "strokeWidth": 1 + }, + { + "type": "text", + "id": "BRLlM", + "name": "Uncategorized only label", + "fill": "$muted", + "content": "UNCATEGORIZED", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "w0qAl", + "name": "Ledger Content", + "width": "fill_container", + "height": "fill_container", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "IY7op", + "name": "Operations Table", + "width": "fill_container", + "height": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "W8bkO3", + "name": "Operations Table Header", + "width": "fill_container", + "height": 42, + "fill": "#EFEEE9", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "XBIQk", + "name": "Operations Header · DATE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "DATE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "WHNTq", + "name": "Operations Header · DESCRIPTION", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "DESCRIPTION", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "XhSHW", + "name": "Operations Header · CATEGORY", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 130, + "content": "CATEGORY", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "V0ytj8", + "name": "Operations Header · ACCOUNT", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "ACCOUNT", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "p6FQug", + "name": "Operations Header · AMOUNT", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "AMOUNT", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "qT79q", + "name": "Operations Header · STATE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "STATE", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + }, + { + "type": "text", + "id": "kXs60", + "name": "Operations Header · ACTIONS", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 168, + "content": "ACTIONS", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "UjvLr", + "name": "Operation Row · Magnit · weekly groceries", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "HrFXX", + "name": "Operation Date · Magnit · weekly groceries", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "21 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "oUUQS", + "name": "Operation Description Cell · Magnit · weekly groceries", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "PVYm1", + "name": "Operation Description · Magnit · weekly groceries", + "fill": "$ink", + "content": "Magnit · weekly groceries", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "CvQqL", + "name": "Operation Kind · Magnit · weekly groceries", + "fill": "$muted", + "content": "EXPENSE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "Pcjb2", + "name": "Operation Category · Magnit · weekly groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Groceries", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "xFl6j", + "name": "Operation Account · Magnit · weekly groceries", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Alfa debit", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "pcuah", + "name": "Operation Amount · Magnit · weekly groceries", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "−₽3 840", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Ej7KB", + "name": "Operation State · Magnit · weekly groceries", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "CONFIRMED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "r83iJK", + "name": "Actions · UjvLr", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "tlJ5A", + "name": "Void action · UjvLr", + "width": 51, + "height": 27, + "fill": "#FFF5F2", + "stroke": "#EDC7C1", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "aD2Mm", + "name": "Void label · UjvLr", + "fill": "#A64B46", + "content": "Void", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "mlZfQ", + "name": "To savings action · UjvLr", + "width": 91, + "height": 27, + "fill": "#F1F5FF", + "stroke": "#C9D8F6", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "WLvh3", + "name": "To savings label · UjvLr", + "fill": "#2758BA", + "content": "To savings", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "tY4Xm", + "name": "Operation Row · Salary · Acme Studio", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qmPm7", + "name": "Operation Date · Salary · Acme Studio", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "20 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "DmRqS", + "name": "Operation Description Cell · Salary · Acme Studio", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "U4ksJ", + "name": "Operation Description · Salary · Acme Studio", + "fill": "$ink", + "content": "Salary · Acme Studio", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "kemJV", + "name": "Operation Kind · Salary · Acme Studio", + "fill": "$muted", + "content": "INCOME", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "m22hQn", + "name": "Operation Category · Salary · Acme Studio", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Income", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "XvoGa", + "name": "Operation Account · Salary · Acme Studio", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Alfa debit", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "siiJc", + "name": "Operation Amount · Salary · Acme Studio", + "fill": "$green", + "textGrowth": "fixed-width", + "width": 110, + "content": "+₽95 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "kci30", + "name": "Operation State · Salary · Acme Studio", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "CONFIRMED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "Rq96G", + "name": "Actions · tY4Xm", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center" + } + ] + }, + { + "type": "frame", + "id": "vFumh", + "name": "Operation Row · Card payment", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Sxqjr", + "name": "Operation Date · Card payment", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "19 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "T96Aw", + "name": "Operation Description Cell · Card payment", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "w3IXtB", + "name": "Operation Description · Card payment", + "fill": "$ink", + "content": "Card payment", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "jkxt9", + "name": "Operation Kind · Card payment", + "fill": "$muted", + "content": "TRANSFER", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "aLZGD", + "name": "Operation Category · Card payment", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Transfer", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "NXVrT", + "name": "Operation Account · Card payment", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Alfa → Credit", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "O7eBaN", + "name": "Operation Amount · Card payment", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "−₽18 000", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "q81fgi", + "name": "Operation State · Card payment", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "CONFIRMED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "l2W8HY", + "name": "Actions · vFumh", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center" + } + ] + }, + { + "type": "frame", + "id": "SARpw", + "name": "Operation Row · Ozon marketplace", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "A9u5O", + "name": "Operation Date · Ozon marketplace", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "18 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "b75Dhc", + "name": "Operation Description Cell · Ozon marketplace", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "ahqhb", + "name": "Operation Description · Ozon marketplace", + "fill": "$ink", + "content": "Ozon marketplace", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "i7W7N0", + "name": "Operation Kind · Ozon marketplace", + "fill": "$muted", + "content": "EXPENSE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "Fsr1A", + "name": "Operation Category · Ozon marketplace", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Shopping", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "az4mB", + "name": "Operation Account · Ozon marketplace", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Ozon debit", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ALXZF", + "name": "Operation Amount · Ozon marketplace", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "−₽2 490", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "pf1Yz", + "name": "Operation State · Ozon marketplace", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "IMPORTED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "Y7v3kp", + "name": "Actions · SARpw", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "W22ufM", + "name": "Void action · SARpw", + "width": 51, + "height": 27, + "fill": "#FFF5F2", + "stroke": "#EDC7C1", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "faJty", + "name": "Void label · SARpw", + "fill": "#A64B46", + "content": "Void", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "w0EVx", + "name": "To savings action · SARpw", + "width": 91, + "height": 27, + "fill": "#F1F5FF", + "stroke": "#C9D8F6", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "q2hgEh", + "name": "To savings label · SARpw", + "fill": "#2758BA", + "content": "To savings", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "pXWd8", + "name": "Operation Row · Coffee Point", + "width": "fill_container", + "height": 68, + "fill": "#FFF8E7", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "e0tt4F", + "name": "Operation Date · Coffee Point", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "17 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "i3Jagf", + "name": "Operation Description Cell · Coffee Point", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "n9jff", + "name": "Operation Description · Coffee Point", + "fill": "$ink", + "content": "Coffee Point", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "OCHn3", + "name": "Operation Kind · Coffee Point", + "fill": "$muted", + "content": "EXPENSE", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "HKWK3", + "name": "Operation Category · Coffee Point", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 130, + "content": "Uncategorized", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "VvSgk", + "name": "Operation Account · Coffee Point", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Cash", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "K3FTi", + "name": "Operation Amount · Coffee Point", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 110, + "content": "−₽450", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "YKsyk", + "name": "Operation State · Coffee Point", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 74, + "content": "ATTENTION", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "wQP2O", + "name": "Actions · pXWd8", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "kCM7O", + "name": "Void action · pXWd8", + "width": 51, + "height": 27, + "fill": "#FFF5F2", + "stroke": "#EDC7C1", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "ID2Di", + "name": "Void label · pXWd8", + "fill": "#A64B46", + "content": "Void", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "rLRlE", + "name": "To savings action · pXWd8", + "width": 91, + "height": 27, + "fill": "#F1F5FF", + "stroke": "#C9D8F6", + "strokeWidth": 1, + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "sfa8C", + "name": "To savings label · pXWd8", + "fill": "#2758BA", + "content": "To savings", + "fontFamily": "$font-ui", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "KUVku", + "name": "Operation Row · Refund · Railway tickets", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "rkGqS", + "name": "Operation Date · Refund · Railway tickets", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "16 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "zOk7r", + "name": "Operation Description Cell · Refund · Railway tickets", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "Su2qL", + "name": "Operation Description · Refund · Railway tickets", + "fill": "$ink", + "content": "Refund · Railway tickets", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "ZvVYC", + "name": "Operation Kind · Refund · Railway tickets", + "fill": "$muted", + "content": "REFUND", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "MWQID", + "name": "Operation Category · Refund · Railway tickets", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Travel", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "P0p6Q", + "name": "Operation Account · Refund · Railway tickets", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Alfa debit", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ew3zq", + "name": "Operation Amount · Refund · Railway tickets", + "fill": "$green", + "textGrowth": "fixed-width", + "width": 110, + "content": "+₽1 280", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "D2HNvR", + "name": "Operation State · Refund · Railway tickets", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 74, + "content": "REFUND", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "KhPor", + "name": "Actions · KUVku", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center" + } + ] + }, + { + "type": "frame", + "id": "NjBVC", + "name": "Operation Row · Restaurant · voided", + "width": "fill_container", + "height": 68, + "fill": "$white", + "stroke": "$line", + "strokeWidth": { + "bottom": 1 + }, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "NUn7h", + "name": "Operation Date · Restaurant · voided", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 70, + "content": "14 SEP", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "Y04zKi", + "name": "Operation Description Cell · Restaurant · voided", + "width": "fill_container", + "layout": "vertical", + "gap": 3, + "children": [ + { + "type": "text", + "id": "X4BBsO", + "name": "Operation Description · Restaurant · voided", + "fill": "#999792", + "content": "Restaurant · voided", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "WFuh8", + "name": "Operation Kind · Restaurant · voided", + "fill": "$muted", + "content": "VOIDED · duplicate charge", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "normal", + "letterSpacing": 0.6 + } + ] + }, + { + "type": "text", + "id": "qtgne", + "name": "Operation Category · Restaurant · voided", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 130, + "content": "Dining", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "vsZR2", + "name": "Operation Account · Restaurant · voided", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 110, + "content": "Credit card", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "SVRh5", + "name": "Operation Amount · Restaurant · voided", + "fill": "#999792", + "textGrowth": "fixed-width", + "width": 110, + "content": "−₽2 700", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "glES8", + "name": "Operation State · Restaurant · voided", + "fill": "$red", + "textGrowth": "fixed-width", + "width": 74, + "content": "VOIDED", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 8, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "Mgs34", + "name": "Actions · NjBVC", + "width": 168, + "height": 28, + "gap": 6, + "justifyContent": "end", + "alignItems": "center" + } + ] + }, + { + "type": "frame", + "id": "J273Na", + "name": "Operations Table Footer", + "width": "fill_container", + "height": "fill_container", + "padding": [ + 0, + 14 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "s5Wt1", + "name": "Operations Cursor", + "fill": "$muted", + "content": "Showing 1–7 of 426", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "WXdHR", + "name": "Operations Next", + "fill": "$blue", + "content": "NEXT 200 →", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "zYL6A", + "x": 15200, + "y": 0, + "name": "05a · Review Queue", + "clip": true, + "width": 1440, + "height": 1024, + "fill": "$paper", + "children": [ + { + "type": "frame", + "id": "b1Ebl6", + "name": "Overview Sidebar", + "width": 238, + "height": 974, + "fill": "$ink", + "layout": "vertical", + "padding": [ + 32, + 24 + ], + "justifyContent": "space_between", + "children": [ + { + "type": "frame", + "id": "QWCan", + "name": "Overview Sidebar Top", + "width": "fill_container", + "layout": "vertical", + "gap": 34, + "children": [ + { + "type": "frame", + "id": "S35pi", + "name": "Overview Brand", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "aMhJX", + "name": "Overview Brand Mark", + "width": 34, + "height": 34, + "fill": "$blue", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "RbLOj", + "name": "Overview Brand Mark Text", + "fill": "$white", + "content": "FS", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "text", + "id": "VzrxN", + "name": "Overview Brand Text", + "fill": "$white", + "content": "FINSPACE", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "700", + "letterSpacing": 1.3 + } + ] + }, + { + "type": "frame", + "id": "rK77j", + "name": "Overview Space", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "bottom": 1 + }, + "layout": "vertical", + "gap": 5, + "padding": [ + 0, + 0, + 18, + 0 + ], + "children": [ + { + "type": "text", + "id": "e5sMq", + "name": "Overview Space Label", + "fill": "#777773", + "content": "FINANCIAL SPACE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700", + "letterSpacing": 1 + }, + { + "type": "text", + "id": "eTuhi", + "name": "Overview Space Name", + "fill": "$white", + "content": "Morozov household", + "fontFamily": "$font-ui", + "fontSize": 15, + "fontWeight": "600" + }, + { + "type": "text", + "id": "e0R3HL", + "name": "Overview Space Role", + "fill": "#8FAEFF", + "content": "OWNER · ACTIVE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "600", + "letterSpacing": 0.7 + } + ] + }, + { + "type": "frame", + "id": "A1pET3", + "name": "Overview Navigation", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "frame", + "id": "p6RVog", + "name": "Nav · This month", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "XxBtz", + "name": "Nav Lead · This month", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "s6TY4", + "name": "Nav Icon · This month", + "width": 17, + "height": 17, + "icon": "calendar-range", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "DXd2m", + "name": "Nav Label · This month", + "fill": "#C0C0BC", + "content": "This month", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "w3dJt", + "name": "Nav · Ledger", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "d9ImH", + "name": "Nav Lead · Ledger", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "nriLK", + "name": "Nav Icon · Ledger", + "width": 17, + "height": 17, + "icon": "rows-3", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "RW6fr", + "name": "Nav Label · Ledger", + "fill": "#C0C0BC", + "content": "Ledger", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dkFSd", + "name": "Nav · Budget", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "nlzux", + "name": "Nav Lead · Budget", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "bDXaG", + "name": "Nav Icon · Budget", + "width": 17, + "height": 17, + "icon": "chart-pie", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "m8fvl5", + "name": "Nav Label · Budget", + "fill": "#C0C0BC", + "content": "Budget", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "ajIGh", + "name": "Nav · Statements", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "VBZhx", + "name": "Nav Lead · Statements", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "eFUSr", + "name": "Nav Icon · Statements", + "width": 17, + "height": 17, + "icon": "inbox", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "LYeLA", + "name": "Nav Label · Statements", + "fill": "#C0C0BC", + "content": "Statements", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + }, + { + "type": "frame", + "id": "XkpQY", + "name": "Nav Count · Statements", + "width": 22, + "height": 22, + "fill": "$amber-soft", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "q78KN2", + "name": "Nav Count Text · Statements", + "fill": "$amber", + "content": "3", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + } + ] + }, + { + "type": "frame", + "id": "xrrZf", + "name": "Nav · Review Queue", + "width": "fill_container", + "height": 42, + "fill": "$blue", + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "T1nHS", + "name": "Nav Lead · Review Queue", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "qDdE6", + "name": "Nav Icon · Review Queue", + "width": 17, + "height": 17, + "icon": "list-checks", + "library": "lucide", + "fill": "$white" + }, + { + "type": "text", + "id": "sjTlq", + "name": "Nav Label · Review Queue", + "fill": "$white", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 14, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "KItPx", + "name": "Nav · Analytics", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "c0onL", + "name": "Nav Lead · Analytics", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "X4jbrW", + "name": "Nav Icon · Analytics", + "width": 17, + "height": 17, + "icon": "chart-no-axes-combined", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "Xpw2Q", + "name": "Nav Label · Analytics", + "fill": "#C0C0BC", + "content": "Analytics", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "JIFhY", + "name": "Nav · Accounts", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ZC8VU", + "name": "Nav Lead · Accounts", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "xUEvI", + "name": "Nav Icon · Accounts", + "width": 17, + "height": 17, + "icon": "wallet-cards", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "QMCDd", + "name": "Nav Label · Accounts", + "fill": "#C0C0BC", + "content": "Accounts", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + }, + { + "type": "frame", + "id": "c9Gr2", + "name": "Nav · Space & data", + "width": "fill_container", + "height": 42, + "fill": "#00000000", + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "v2ZE5i", + "name": "Nav Lead · Space & data", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon", + "id": "uCoBQ", + "name": "Nav Icon · Space & data", + "width": 17, + "height": 17, + "icon": "settings-2", + "library": "lucide", + "fill": "#8D8D89" + }, + { + "type": "text", + "id": "GgX2a", + "name": "Nav Label · Space & data", + "fill": "#C0C0BC", + "content": "Space & data", + "fontFamily": "$font-ui", + "fontSize": 14 + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "qaKfo", + "name": "Overview Sidebar Bottom", + "width": "fill_container", + "layout": "vertical", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "ZYYMd", + "name": "Overview Sync State", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "da6w4", + "name": "Overview Sync Dot", + "fill": "$green", + "width": 7, + "height": 7 + }, + { + "type": "text", + "id": "dSFkm", + "name": "Overview Sync Text", + "fill": "#8D8D89", + "content": "All data synced", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "TL51a", + "name": "Overview Profile", + "width": "fill_container", + "stroke": "#FFFFFF2C", + "strokeWidth": { + "top": 1 + }, + "gap": 10, + "padding": [ + 14, + 0, + 0, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "qBPJA", + "name": "Overview Avatar", + "width": 34, + "height": 34, + "fill": "#30302E", + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "TrBRu", + "name": "Overview Avatar Text", + "fill": "$white", + "content": "AM", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "rFVC1", + "name": "Overview Profile Copy", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "vkhfb", + "name": "Overview Profile Name", + "fill": "$white", + "content": "Alexey Morozov", + "fontFamily": "$font-ui", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "text", + "id": "OPCOR", + "name": "Overview Profile Meta", + "fill": "#777773", + "content": "RU · Europe/Moscow", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "normal" + } + ] + }, + { + "type": "icon", + "id": "BrEBL", + "name": "Logout Action", + "width": 15, + "height": 15, + "icon": "log-out", + "library": "lucide", + "fill": "#777773" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "V6E04e", + "name": "Review Queue Main", + "width": "fill_container", + "height": 974, + "layout": "vertical", + "gap": 24, + "padding": [ + 34, + 42 + ], + "children": [ + { + "type": "frame", + "id": "QRffz", + "name": "Review Queue Header", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "FQJCd", + "name": "Review Queue Heading", + "layout": "vertical", + "gap": 5, + "children": [ + { + "type": "text", + "id": "pFzT3", + "name": "Review Queue Title", + "fill": "$ink", + "content": "Review Queue", + "fontFamily": "$font-ui", + "fontSize": 28, + "fontWeight": "700" + }, + { + "type": "text", + "id": "fBu5r", + "name": "Review Queue Subtitle", + "fill": "$muted", + "content": "Resolve imports and categorize spending before month close.", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "GtSet", + "name": "Review Queue Month Switcher", + "stroke": "$line", + "strokeWidth": 1, + "gap": 14, + "padding": [ + 9, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "tREde", + "name": "Month switch · ‹", + "fill": "$ink", + "content": "‹", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "a3z9G", + "name": "Month switch · SEPTEMBER 2026", + "fill": "$ink", + "content": "SEPTEMBER 2026", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "mSM9D", + "name": "Month switch · ›", + "fill": "$ink", + "content": "›", + "fontFamily": "$font-data", + "fontSize": 11, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "RmjmC", + "name": "Imports needing attention", + "width": "fill_container", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "text", + "id": "Hx4Vq", + "name": "Imports heading", + "fill": "$ink", + "content": "Imports needing attention", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "Lg8UL", + "name": "Pending imports table", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "ti1Cz", + "name": "Pending imports columns", + "width": "fill_container", + "height": 38, + "fill": "#EFEEE9", + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "F48Wne", + "name": "Imports column FILE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "FILE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "TVt6S", + "name": "Imports column BANK", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 150, + "content": "BANK", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "kwKim", + "name": "Imports column STATUS", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 140, + "content": "STATUS", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "p3geJ", + "name": "Imports column UNRESOLVED", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 130, + "content": "UNRESOLVED", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "l76WkU", + "name": "Imports column CREATED", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "CREATED", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "R2dci", + "name": "Imports column ACTION", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 130, + "content": "ACTION", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "n8cun", + "name": "Import · alfa-september.csv", + "width": "fill_container", + "height": 52, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KYU1y", + "name": "alfa-september.csv · alfa-september.csv", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "alfa-september.csv", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "mgD3i", + "name": "alfa-september.csv · Alfa Bank", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 150, + "content": "Alfa Bank", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "rfS12", + "name": "alfa-september.csv · REVIEW", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 140, + "content": "REVIEW", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "n0n430", + "name": "alfa-september.csv · 12", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 130, + "content": "12", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "uOs7Y", + "name": "alfa-september.csv · 21 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "21 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "mgIr2", + "name": "alfa-september.csv · Open import ↗", + "fill": "$blue", + "textGrowth": "fixed-width", + "width": 130, + "content": "Open import ↗", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "qodNo", + "name": "Import · tinkoff-card.csv", + "width": "fill_container", + "height": 52, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Xy7qf", + "name": "tinkoff-card.csv · tinkoff-card.csv", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "tinkoff-card.csv", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "YcPWH", + "name": "tinkoff-card.csv · T-Bank", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 150, + "content": "T-Bank", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "qB6Yf", + "name": "tinkoff-card.csv · REVIEW", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 140, + "content": "REVIEW", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ufJgc", + "name": "tinkoff-card.csv · 4", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 130, + "content": "4", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "YhsIO", + "name": "tinkoff-card.csv · 19 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "19 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "QRNma", + "name": "tinkoff-card.csv · Open import ↗", + "fill": "$blue", + "textGrowth": "fixed-width", + "width": 130, + "content": "Open import ↗", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "FauvH", + "name": "Import · salary-august.csv", + "width": "fill_container", + "height": 52, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "TFuqM", + "name": "salary-august.csv · salary-august.csv", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "salary-august.csv", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "600" + }, + { + "type": "text", + "id": "ofuhU", + "name": "salary-august.csv · Sberbank", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 150, + "content": "Sberbank", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "MKzhj", + "name": "salary-august.csv · MATCHING", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 140, + "content": "MATCHING", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "JK5wy", + "name": "salary-august.csv · 2", + "fill": "$amber", + "textGrowth": "fixed-width", + "width": 130, + "content": "2", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "XIZ0Y", + "name": "salary-august.csv · 18 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "18 SEP", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ADb5i", + "name": "salary-august.csv · Open import ↗", + "fill": "$blue", + "textGrowth": "fixed-width", + "width": 130, + "content": "Open import ↗", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "aoL9L", + "name": "Uncategorized expenses", + "width": "fill_container", + "layout": "vertical", + "gap": 12, + "children": [ + { + "type": "frame", + "id": "YJ1Oz", + "name": "Uncategorized section heading", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "eUqgW", + "name": "Uncategorized heading", + "fill": "$ink", + "content": "Uncategorized expenses", + "fontFamily": "$font-ui", + "fontSize": 18, + "fontWeight": "700" + }, + { + "type": "text", + "id": "R6LxYX", + "name": "Uncategorized count", + "fill": "$amber", + "content": "3 TO REVIEW", + "fontFamily": "$font-data", + "fontSize": 10, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "HhTkz", + "name": "Uncategorized transactions table", + "width": "fill_container", + "fill": "$white", + "stroke": "$line", + "strokeWidth": 1, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "FLSOk", + "name": "Uncategorized columns", + "width": "fill_container", + "height": 38, + "fill": "#EFEEE9", + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qj94M", + "name": "Queue column · DATE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "DATE", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "J2ksfc", + "name": "Queue column · DESCRIPTION", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "DESCRIPTION", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "OfigB", + "name": "Queue column · AMOUNT", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 150, + "content": "AMOUNT", + "textAlign": "right", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + }, + { + "type": "text", + "id": "IuFvr", + "name": "Queue column · CATEGORY", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 250, + "content": "CATEGORY", + "fontFamily": "$font-data", + "fontSize": 9, + "fontWeight": "700" + } + ] + }, + { + "type": "frame", + "id": "XP3wP", + "name": "Review transaction · Coffee Point · morning", + "width": "fill_container", + "height": 62, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mx6dJ", + "name": "Coffee Point · morning · 21 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "21 SEP", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "o1t0D4", + "name": "Coffee Point · morning · Coffee Point · morning", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Coffee Point · morning", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "saHa9", + "name": "Coffee Point · morning · −₽340", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 150, + "content": "−₽340", + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "Quc4L", + "name": "Category select · Coffee Point · morning", + "width": 250, + "height": 34, + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "MGzA1", + "name": "Category value · Coffee Point · morning", + "fill": "$ink", + "content": "Food & drink", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon", + "id": "avtai", + "name": "Category arrow · Coffee Point · morning", + "width": 14, + "height": 14, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + } + ] + }, + { + "type": "frame", + "id": "voHuc", + "name": "Review transaction · Ozon · household order", + "width": "fill_container", + "height": 62, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "njNG0", + "name": "Ozon · household order · 20 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "20 SEP", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "K6Zs6x", + "name": "Ozon · household order · Ozon · household order", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Ozon · household order", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Gk2vj", + "name": "Ozon · household order · −₽2 180", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 150, + "content": "−₽2 180", + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "nUpDa", + "name": "Category select · Ozon · household order", + "width": 250, + "height": 34, + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "B71Op", + "name": "Category value · Ozon · household order", + "fill": "$ink", + "content": "Choose category", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon", + "id": "arH0L", + "name": "Category arrow · Ozon · household order", + "width": 14, + "height": 14, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + } + ] + }, + { + "type": "frame", + "id": "l3lHih", + "name": "Review transaction · Taxi · city ride", + "width": "fill_container", + "height": 62, + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "duTaj", + "name": "Taxi · city ride · 19 SEP", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 100, + "content": "19 SEP", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "YZob1", + "name": "Taxi · city ride · Taxi · city ride", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Taxi · city ride", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Ijry5", + "name": "Taxi · city ride · −₽615", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 150, + "content": "−₽615", + "textAlign": "right", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "uYKGz", + "name": "Category select · Taxi · city ride", + "width": 250, + "height": 34, + "stroke": "$line", + "strokeWidth": 1, + "padding": [ + 0, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "TV92y", + "name": "Category value · Taxi · city ride", + "fill": "$muted", + "content": "Uncategorized", + "fontFamily": "$font-ui", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon", + "id": "bPypc", + "name": "Category arrow · Taxi · city ride", + "width": 14, + "height": 14, + "icon": "chevron-down", + "library": "lucide", + "fill": "$muted" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "yXXAp", + "name": "Review Queue Save Bar", + "width": "fill_container", + "stroke": "$line", + "strokeWidth": { + "top": 1 + }, + "layout": "vertical", + "gap": 12, + "padding": [ + 16, + 0 + ], + "children": [ + { + "type": "text", + "id": "b47ByJ", + "name": "Other fallback explanation", + "fill": "$muted", + "content": "Uncategorized transactions will be saved as Other.", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "fYUEa", + "name": "Save categories button", + "fill": "$blue", + "padding": [ + 12, + 22 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hE1eC", + "name": "Save categories label", + "fill": "$white", + "content": "Save categories", + "fontFamily": "$font-ui", + "fontSize": 12, + "fontWeight": "700" + } + ] + } + ] + } + ] + } + ] } ], "variables": { diff --git a/docs/tasks/0001-fixes.md b/docs/tasks/0001-fixes.md new file mode 100644 index 0000000..1c221cf --- /dev/null +++ b/docs/tasks/0001-fixes.md @@ -0,0 +1,10 @@ +Используй скиллы pen-dev и design-interface для работы с дизайном в @design.pen +Используй скиллы pen-dev, frontend-design и impeccable для верстки фронта + +0. Меню Review Queue вообще не отрисовано в дизайне. Надо исправить. +1. В очереди разбора кнопка сохранить должна быть в конце распределения категорий, а не на каждую транзакцию +2. В Очереди разбора: если где-то остается транзакция "Без категории" в конце концов оно должно уехать в "остальное" +3. На Ledger страницы фронт фактически не совпадает с дизайном @design.pen. В создании новой операции Выбор типа фон у вариантов белый а не черный, размер отличается. Выпадающее окно справа (как сейчас сделано на фронте мне нравится больше, чем вариант нарисованный на дизайне, где эта менюшка посреди интерфейса). Перерисуй интерфейс без менюшки и с вызванным меню создания операции с выпавшим справа меню. Также пусть на фронте меню выпадает с плавной анимацией, а не просто появляется. +4. На Ledger есть кнопки Void и To savings, они новый на дизайне вообще их нет, надо дорисовать. И мне вообще не нравится как они сейчас выглядят на фронте, нарисуй на дизайне их красиво и аккуратно, кнопки не должны разбиваться по размеру и раздувать каждую строку транзакции. Идеально, чтобы они были рядом в одной строке, а не в две. +5. Отсутсвуют иконки в левом меню навигации для каждого пункта, в навигации не совпадает порядок с дизайном +6. Фильтры в Ledger сверстаны нелогично. Во-первых, надо обновить дизайн и добавить туда фильтры по дате (FROM и TO), нарисовать их надо так, чтобы они были одинаковые. Сейчас, фактически, на вёрстке почему-то поле FROM DATE вдвое шире чем TO DATE, что крайне странно. + На дизайне было интересное решение сделать фильтры более узкими по вертикали по сравнению со строкой поиска - это хорошо выглядит. Но на фронте это не реализовано. Актуализируй дизайн в соответствии с функционалом. \ No newline at end of file diff --git a/frontend/src/api/endpoints.ts b/frontend/src/api/endpoints.ts index f6d33d6..67c1ae6 100644 --- a/frontend/src/api/endpoints.ts +++ b/frontend/src/api/endpoints.ts @@ -8,6 +8,8 @@ import type { BudgetCategory, BudgetSummary, CashFlowMonth, + CategorizeBatchPayload, + CategorizeBatchResult, CategoryDefinition, CategorySpendItem, ConfirmImportPayload, @@ -60,6 +62,8 @@ export const api = { apiClient.post(`/operations/${id}/void`, { json: { reason } }), categorize: (id: string, categoryId: string) => apiClient.patch(`/operations/${id}`, { json: { categoryId } }), + categorizeBatch: (payload: CategorizeBatchPayload) => + apiClient.post('/operations/categorize-batch', { json: payload }), savingsTransfer: (id: string) => apiClient.post(`/operations/${id}/savings-transfer`), savingsTransferRevert: (id: string) => diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts index e2c13f4..d64376c 100644 --- a/frontend/src/api/types.ts +++ b/frontend/src/api/types.ts @@ -73,6 +73,21 @@ export interface AdjustBalanceResult extends Operation { newBalanceKopecks: number } +export interface CategorizeBatchItem { + operationId: string + categoryId?: string | null +} + +export interface CategorizeBatchPayload { + items: CategorizeBatchItem[] +} + +export interface CategorizeBatchResult { + updated: string[] + skipped: string[] +} + + export type CreateOperationPayload = | { kind: 'expense' diff --git a/frontend/src/components/layout/AppLayout.tsx b/frontend/src/components/layout/AppLayout.tsx index b833317..9de8e0c 100644 --- a/frontend/src/components/layout/AppLayout.tsx +++ b/frontend/src/components/layout/AppLayout.tsx @@ -1,23 +1,114 @@ import { Link, NavLink, Outlet, useLocation, useNavigate } from 'react-router-dom' import { useTranslation } from 'react-i18next' +import type { ReactElement } from 'react' import { Button } from '@/components/ui/Button' import { LangSwitcher } from '@/components/layout/LangSwitcher' import { useLogout, useMe } from '@/hooks/useAuth' +type NavIconName = + | 'month' + | 'operations' + | 'budget' + | 'imports' + | 'review' + | 'analytics' + | 'accounts' + | 'settings' + +const NAV_ICONS: Record = { + month: ( + <> + + + + + + + ), + operations: ( + <> + + + + + ), + budget: ( + <> + + + + ), + imports: ( + <> + + + + ), + review: ( + <> + + + + + + + ), + analytics: ( + <> + + + + + + + ), + accounts: ( + <> + + + + ), + settings: ( + <> + + + + + + ), +} + +function NavIcon({ name }: { name: NavIconName }) { + return ( + + ) +} + const NAV_ITEMS = [ - { to: '/', key: 'nav.month', end: true }, - { to: '/budget', key: 'nav.budget', end: false }, - { to: '/operations', key: 'nav.operations', end: false }, - { to: '/imports', key: 'nav.imports', end: false }, - { to: '/review', key: 'nav.review', end: false }, - { to: '/analytics', key: 'nav.analytics', end: false }, - { to: '/settings', key: 'nav.settings', end: false }, - { to: '/accounts', key: 'nav.accounts', end: false }, + { to: '/', key: 'nav.month', end: true, icon: 'month' }, + { to: '/operations', key: 'nav.operations', end: false, icon: 'operations' }, + { to: '/budget', key: 'nav.budget', end: false, icon: 'budget' }, + { to: '/imports', key: 'nav.imports', end: false, icon: 'imports' }, + { to: '/review', key: 'nav.review', end: false, icon: 'review' }, + { to: '/analytics', key: 'nav.analytics', end: false, icon: 'analytics' }, + { to: '/accounts', key: 'nav.accounts', end: false, icon: 'accounts' }, + { to: '/settings', key: 'nav.settings', end: false, icon: 'settings' }, ] as const -const MOBILE_NAV_ITEMS = NAV_ITEMS.filter((item) => - ['/', '/budget', '/operations', '/imports', '/review', '/accounts'].includes(item.to), -) +const MOBILE_NAV_ROUTES: readonly string[] = ['/', '/operations', '/budget', '/imports', '/review', '/accounts'] +const MOBILE_NAV_ITEMS = NAV_ITEMS.filter((item) => MOBILE_NAV_ROUTES.includes(item.to)) export function AppLayout() { const { t } = useTranslation() @@ -52,6 +143,7 @@ export function AppLayout() {