From b14607b3bc944cf27e97ce579d57d46c1ec81f1d Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Mon, 31 Aug 2026 12:34:55 +0100 Subject: [PATCH] feat(templates): promote the Luma Studio invoice onto the structured model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The structured invoice model landed with one consumer. The fields added beside it fitted a second published invoice; this is that invoice — `luma-co-studio-invoice`, a studio sheet built around a cream sidebar — brought into the templates module so it ships with the library. It is the first promoted preset that has to paginate. The line-items table repeats its dark header, the totals stack and each closing block stay whole, and the paper tint, the sidebar column and the dark foot band are page backgrounds, so every page carries the same frame and the folio always has a dark ground. The sign-off carries its own strip rather than relying on that background band, which is the one deliberate departure from the sheet being ported: the band is pinned to the paper's edge, so on the last page of a longer invoice the published template sets white words on pale paper. Drawing the strip with the words fixes it wherever they land, at 7,440 of 2,173,720 pixels on the reference sheet and one extra layout node. It is flow content only because footer chrome carries text today; once a footer zone can hold a node the sign-off belongs in one. Amounts take their mark from the data's currency code rather than a second stated field, and the contact channels carry dial, mail and web targets derived from their values, with a parenthesised trunk prefix dropped from the dial target. Guarded by a smoke test, an exact layout snapshot over a one-page and a three-page invoice, and a pixel-parity gate; the examples showcase gains `invoice-luma-studio-v2`. --- CHANGELOG.md | 40 + .../examples/invoice-luma-studio-v2.pdf | Bin 0 -> 48610 bytes .../demcha/examples/GenerateAllExamples.java | 2 + .../support/LumaStudioInvoiceSampleData.java | 108 + .../examples/support/ShowcaseMetadata.java | 1 + .../v2/LumaStudioInvoiceV2Example.java | 54 + .../presets/LumaStudioInvoiceFixtures.java | 130 + .../LumaStudioInvoiceLayoutSnapshotTest.java | 46 + .../presets/LumaStudioInvoiceSmokeTest.java | 251 ++ .../LumaStudioInvoiceVisualParityTest.java | 42 + .../invoice/luma_studio_invoice_layout.json | 3677 +++++++++++++++++ .../luma_studio_invoice_overflow_layout.json | 3677 +++++++++++++++++ .../luma_studio_invoice-page-0.png | Bin 0 -> 88556 bytes .../invoice/presets/LumaStudioClosing.java | 269 ++ .../invoice/presets/LumaStudioIcons.java | 65 + .../invoice/presets/LumaStudioInvoice.java | 223 + .../invoice/presets/LumaStudioLines.java | 182 + .../invoice/presets/LumaStudioMasthead.java | 276 ++ .../invoice/presets/LumaStudioSidebar.java | 170 + .../invoice/presets/LumaStudioStyles.java | 356 ++ .../invoice/presets/LumaStudioWidgets.java | 172 + .../invoice/luma-studio/icons/bank.svg | 1 + .../invoice/luma-studio/icons/email.svg | 1 + .../invoice/luma-studio/icons/heart.svg | 1 + .../invoice/luma-studio/icons/notes.svg | 1 + .../invoice/luma-studio/icons/phone.svg | 1 + .../invoice/luma-studio/icons/sprig.svg | 1 + .../invoice/luma-studio/icons/website.svg | 1 + 28 files changed, 9748 insertions(+) create mode 100644 assets/readme/examples/invoice-luma-studio-v2.pdf create mode 100644 examples/src/main/java/com/demcha/examples/support/LumaStudioInvoiceSampleData.java create mode 100644 examples/src/main/java/com/demcha/examples/templates/invoice/v2/LumaStudioInvoiceV2Example.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceVisualParityTest.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json create mode 100644 qa/src/test/resources/visual-baselines/invoice-v2-layered/luma_studio_invoice-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioIcons.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoice.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioStyles.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/bank.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/email.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/heart.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/notes.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/phone.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/sprig.svg create mode 100644 templates/src/main/resources/templates/invoice/luma-studio/icons/website.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ef738a58..89c1ee8e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,46 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **The first invoice preset that paginates what it ports: `LumaStudioInvoice`.** A + studio invoice built around a cream sidebar — the two-line monogram and the wordmark + on a terracotta block at its head, a tinted quarter-disc, an arch and a sprig running + down the rest of it — beside a billing sheet that reads sender, title and metadata, + the billed-to and shipped-to pair across a rule, the priced service lines with a VAT + column, the totals stack closing on a filled total-due band, and the notes and bank + details above a dark sign-off band. Ships as `invoice.presets.LumaStudioInvoice` on + the structured invoice model, porting the rendered layout of the published standalone + `luma-co-studio-invoice` template. Unlike the CV presets promoted before it this one + flows: the line-items table repeats its dark header on the next page, the totals stack + and each closing block stay whole, and the paper tint, the sidebar column and the dark + foot band are page backgrounds, so every page carries the same frame and the folio + always has a dark ground. **The sign-off carries its own strip, which is where the + preset deliberately departs from the sheet it ports.** On the published template the + words rely on that background band, which is pinned to the paper's edge — right on a + one-page invoice, and white-on-cream in the middle of the last page of a longer one, + where the flow ends well above the paper's foot. Drawing the strip with the words + fixes it wherever they land; the cost is 7 440 of 2 173 720 pixels on the reference + sheet, where the strip starts three points above the background band it sits on, and + one extra layout node. It is flow content only because footer chrome carries text + today — one size, one colour, no glyph, where this band needs two faces and a disc — + so once a footer zone can hold a node the sign-off belongs in one and the strip goes + away. Its geometry is not a set of round numbers: the design was drawn + on a pixel grid, so the preset carries that grid as page ratios and states every + vertical gap as the white the drawing shows, subtracting the blank a line box already + carries — per family, because the three faces it sets fill different line boxes at the + same size. Letter-spaced runs are written letter by letter with an invisible inline + rectangle between the pairs, since a text style carries no tracking; the six spacings + are frozen constants rather than a measurement, because measuring at compose time + would tie the preset to the font artifact's resource layout. Amounts take their mark + from `StructuredInvoiceData.currencyCode()` — the code is the authority, so the sheet + cannot contradict itself — and the contact channels carry `tel:`, `mailto:` and + `https:` targets derived from their values, with a parenthesised trunk prefix dropped + from the dial target the way a caller dialling from abroad drops it. Guarded by a + smoke test (including the empty document, an unknown and a blank currency code, a + supplier with one registration and with none, the link targets, the repeated header + and folio on a continuation page, and the sign-off landing on its own ground), an + exact layout snapshot over both a one-page and a three-page invoice, and a + pixel-parity gate; the examples showcase gains `invoice-luma-studio-v2`. + - **`SerifHeadline` links its titles and lets its bands breathe.** Every title the preset draws — a role, a project, a degree, an achievement — is now a link when its entry carries one. And a band column keeps a gutter at its right edge, so its text diff --git a/assets/readme/examples/invoice-luma-studio-v2.pdf b/assets/readme/examples/invoice-luma-studio-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..35493c7774e2d3f32bd8733a5bb8f34c8f46aae0 GIT binary patch literal 48610 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 K{uGrHgZ&>~TiDP5 literal 0 HcmV?d00001 diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 6452c2d30..55bb1da8a 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -102,6 +102,7 @@ import com.demcha.examples.templates.cv.v2.SerifHeadlineExample; import com.demcha.examples.templates.invoice.ClassicInvoiceV2Example; import com.demcha.examples.templates.invoice.ConsultingInvoiceV2Example; +import com.demcha.examples.templates.invoice.LumaStudioInvoiceV2Example; import com.demcha.examples.templates.invoice.InvoiceCinematicFileExample; import com.demcha.examples.templates.invoice.ModernInvoiceV2Example; import com.demcha.examples.templates.proposal.CinematicProposalFileExample; @@ -176,6 +177,7 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + ModernInvoiceV2Example.generate()); System.out.println("Generated: " + ClassicInvoiceV2Example.generate()); System.out.println("Generated: " + ConsultingInvoiceV2Example.generate()); + System.out.println("Generated: " + LumaStudioInvoiceV2Example.generate()); // Proposals System.out.println("Generated: " + ProposalCinematicFileExample.generate()); diff --git a/examples/src/main/java/com/demcha/examples/support/LumaStudioInvoiceSampleData.java b/examples/src/main/java/com/demcha/examples/support/LumaStudioInvoiceSampleData.java new file mode 100644 index 000000000..175b40c11 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/LumaStudioInvoiceSampleData.java @@ -0,0 +1,108 @@ +package com.demcha.examples.support; + +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Shared sample data for the Luma Studio Invoice example. + * + *

The sample is the preset's reference content: a design studio's + * invoice with a monogram lockup, five labelled masthead metadata rows, + * a billed-to and a shipped-to party, five priced service lines with a VAT + * column, a subtotal / VAT stack closing on the total-due band, five bank + * fields, two closing notes and the sign-off band.

+ * + *

Kept in lockstep with the qa module's + * {@code LumaStudioInvoiceFixtures} — the two modules cannot share a source + * file, so a content change here belongs there too.

+ */ +public final class LumaStudioInvoiceSampleData { + + /** The break the sheet stacks its multi-line notes on. */ + private static final String NEWLINE = String.valueOf((char) 10); + + private LumaStudioInvoiceSampleData() { + } + + /** The single-page reference invoice. */ + public static StructuredInvoiceDocumentSpec sample() { + return StructuredInvoiceDocumentSpec.from(StructuredInvoiceData.builder() + .brand(new InvoiceBrand(null, "LUMA & CO. STUDIO", null, + "Branding. Design. Digital.", "L", "&Co.")) + .supplier(new InvoiceContactBlock("LUMA & CO. STUDIO", + List.of("Studio 3.02, The Loom", "14 Gower Street", + "London WC1E 6BT", "United Kingdom"), + "+44 (0)20 7946 0832", "hello@lumaandco.studio", + "www.lumaandco.studio", + "Company No.", "12578934", "VAT No.", "369 4567 89")) + .masthead(new InvoiceMasthead("INVOICE", List.of( + new InvoiceMasthead.Entry("INVOICE NO.", "INV-2024-0587", false), + new InvoiceMasthead.Entry("ISSUE DATE", "20 May 2024", false), + new InvoiceMasthead.Entry("DUE DATE", "19 June 2024", false), + new InvoiceMasthead.Entry("PAYMENT TERMS", "30 Days", false), + new InvoiceMasthead.Entry("CURRENCY", "GBP", false)))) + .billTo(new InvoiceRecipient("BILL TO", "Northfield Consulting Ltd", + "Attn: Sarah Mitchell", + List.of("21 Jubilee Way", "London SE1 3SS", "United Kingdom"), "", "")) + .shipTo(new InvoiceRecipient("SHIP TO", "Northfield Consulting Ltd", "", + List.of("The Foundry, 2nd Floor", "17-19 Great Suffolk Street", + "London SE1 0NS", "United Kingdom"), "", "")) + .serviceLines(serviceLines()) + .totals(new InvoiceTotalsBlock(List.of( + new InvoiceTotalsBlock.Row("SUBTOTAL", new BigDecimal("8500.00")), + new InvoiceTotalsBlock.Row("VAT (20%)", new BigDecimal("1700.00"))), + "TOTAL DUE", new BigDecimal("10200.00"))) + .notes(new InvoiceNotesBlock("NOTES", List.of( + "Thank you for your business." + NEWLINE + + "If you have any questions regarding" + NEWLINE + + "this invoice, please get in touch.", + "All work remains the intellectual property" + NEWLINE + + "of LUMA & CO. STUDIO until payment" + NEWLINE + + "has been received in full."), "", "")) + .payment(new InvoicePaymentBlock("PAYMENT DETAILS", List.of( + new InvoicePaymentBlock.Field("BANK", "Starling Bank"), + new InvoicePaymentBlock.Field("SORT CODE", "60-83-71"), + new InvoicePaymentBlock.Field("ACCOUNT NO.", "98765432"), + new InvoicePaymentBlock.Field("IBAN", "GB36 SRLG 6083 7198 7654 32"), + new InvoicePaymentBlock.Field("BIC", "SRLGGB2L")), + "Please make payment by bank transfer to:", + "Payment is due by 19 June 2024.", "", + "LUMA & CO. STUDIO LTD", + "Thank you for choosing LUMA & CO. STUDIO.")) + .currencyCode("GBP") + .build()); + } + + private static InvoiceServiceLines serviceLines() { + return new InvoiceServiceLines( + new InvoiceServiceLines.Columns("", "DESCRIPTION", "", "QTY", "UNIT PRICE", + "AMOUNT", "VAT"), + List.of( + line(1, "Brand Strategy Workshop", + "Discovery session, research & brand positioning.", "1200.00"), + line(2, "Visual Identity Design", + "Logo suite, colour palette, typography & guidelines.", "2650.00"), + line(3, "Website Design (Up to 8 pages)", + "UX/UI design for desktop and mobile.", "3200.00"), + line(4, "Copywriting", "Website copy & key messaging.", "850.00"), + line(5, "Project Management", + "Planning, coordination & client liaison.", "600.00"))); + } + + private static InvoiceServiceLines.Line line(int number, String title, String description, + String price) { + return new InvoiceServiceLines.Line(number, title, description, "", BigDecimal.ONE, "", + new BigDecimal(price), new BigDecimal(price), "20%"); + } +} diff --git a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java index f47ae6666..da69b14cf 100644 --- a/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java +++ b/examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java @@ -92,6 +92,7 @@ record Entry(String title, String description, List tags, String codeUrl // ===== Templates / Invoice ===== invoice("invoice-cinematic", "InvoiceCinematicFileExample", "Cinematic Invoice", "Layered ModernInvoice preset with theme-driven layout, advanced tables, and totals.", "invoice", "cinematic"); invoice("invoice-consulting-v2", "v2/ConsultingInvoiceV2Example", "Consulting Invoice", "The ConsultingInvoice preset on the structured invoice model — brand lockup with the caller's logo, labelled masthead metadata, priced service lines with service periods, a totals stack and bank payment fields.", "invoice"); + invoice("invoice-luma-studio-v2", "v2/LumaStudioInvoiceV2Example", "Luma Studio Invoice", "The LumaStudioInvoice preset on the structured invoice model — a cream sidebar carrying the brand lockup and its ornament, a billed-to / shipped-to pair, priced service lines with a VAT column, and the notes and bank details above a sign-off band.", "invoice"); invoice("invoice-modern-v2", "v2/ModernInvoiceV2Example", "Modern Invoice", "The ModernInvoice preset composed straight from an InvoiceDocumentSpec — line items, totals and payment block driven by the BrandTheme rather than per-document styling.", "invoice"); invoice("invoice-classic-v2", "v2/ClassicInvoiceV2Example", "Classic Invoice", "The ClassicInvoice preset — letterhead header band, TOTAL DUE hero strip, BILL TO / FROM columns, and a dedicated Summary table after the line items.", "invoice"); diff --git a/examples/src/main/java/com/demcha/examples/templates/invoice/v2/LumaStudioInvoiceV2Example.java b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/LumaStudioInvoiceV2Example.java new file mode 100644 index 000000000..1b8b84336 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/LumaStudioInvoiceV2Example.java @@ -0,0 +1,54 @@ +package com.demcha.examples.templates.invoice; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; +import com.demcha.compose.document.templates.invoice.presets.LumaStudioInvoice; +import com.demcha.examples.support.ExampleOutputPaths; +import com.demcha.examples.support.LumaStudioInvoiceSampleData; + +import java.nio.file.Path; + +/** + * Renders the layered {@code invoice.v2} Luma Studio Invoice preset against + * the shared structured invoice sample data. + * + *

Output: + * {@code examples/target/generated-pdfs/templates/invoice/invoice-luma-studio-v2.pdf}.

+ * + *

The preset owns its page geometry — size, margins, the paper tint, the + * cream sidebar column and the sign-off band — so the session starts + * unconfigured. The lockup is drawn from the brand's monogram and wordmark, + * and the amounts take their mark from the data's currency code.

+ */ +public final class LumaStudioInvoiceV2Example { + + private LumaStudioInvoiceV2Example() { + } + + /** + * @return absolute path of the rendered PDF + * @throws Exception if rendering fails + */ + public static Path generate() throws Exception { + Path outputFile = ExampleOutputPaths.prepare( + "templates/invoice", "invoice-luma-studio-v2.pdf"); + StructuredInvoiceDocumentSpec spec = LumaStudioInvoiceSampleData.sample(); + DocumentTemplate template = LumaStudioInvoice.create(); + + try (DocumentSession document = GraphCompose.document(outputFile).create()) { + template.compose(document, spec); + document.buildPdf(); + } + return outputFile; + } + + /** + * @param args ignored + * @throws Exception if rendering fails + */ + public static void main(String[] args) throws Exception { + System.out.println("Generated: " + generate()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java new file mode 100644 index 000000000..b0115f9bb --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceFixtures.java @@ -0,0 +1,130 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Shared fixture data for the {@link LumaStudioInvoice} gates — the SAME + * specs feed the pixel parity test and the layout snapshot test, so a + * geometry shift the pixel budget absorbs still trips the exact snapshot, + * and vice versa. + */ +final class LumaStudioInvoiceFixtures { + + /** The break the sheet stacks its multi-line notes on. */ + private static final String NEWLINE = String.valueOf((char) 10); + + private LumaStudioInvoiceFixtures() { + } + + /** + * Canonical studio invoice — five priced service lines on one page, + * exercising the sidebar lockup, both party blocks, the VAT column, the + * total-due band, the notes and payment pair, and the sign-off band. + */ + static StructuredInvoiceDocumentSpec canonicalInvoice() { + return StructuredInvoiceDocumentSpec.from(base().build()); + } + + /** + * Overflow studio invoice — the same sheet billed phase by phase, so the + * table paginates over three pages and the repeated header, the per-page + * chrome, a middle page carrying nothing but table, and the whole-block + * closing all become part of the frozen contract. No manual page breaks. + */ + static StructuredInvoiceDocumentSpec overflowInvoice() { + List lines = new ArrayList<>(); + for (int phase = 1; phase <= 4; phase++) { + for (InvoiceServiceLines.Line line : serviceLines().lines()) { + lines.add(new InvoiceServiceLines.Line(lines.size() + 1, line.title(), + line.description() + " Phase " + phase + ".", line.servicePeriod(), + line.quantity(), line.unit(), line.unitPrice(), line.amount(), + line.vatRate())); + } + } + return StructuredInvoiceDocumentSpec.from(base() + .serviceLines(new InvoiceServiceLines(serviceLines().columns(), lines)) + .build()); + } + + private static StructuredInvoiceData.Builder base() { + return StructuredInvoiceData.builder() + .brand(new InvoiceBrand(null, "LUMA & CO. STUDIO", null, + "Branding. Design. Digital.", "L", "&Co.")) + .supplier(new InvoiceContactBlock("LUMA & CO. STUDIO", + List.of("Studio 3.02, The Loom", "14 Gower Street", + "London WC1E 6BT", "United Kingdom"), + "+44 (0)20 7946 0832", "hello@lumaandco.studio", + "www.lumaandco.studio", + "Company No.", "12578934", "VAT No.", "369 4567 89")) + .masthead(new InvoiceMasthead("INVOICE", List.of( + new InvoiceMasthead.Entry("INVOICE NO.", "INV-2024-0587", false), + new InvoiceMasthead.Entry("ISSUE DATE", "20 May 2024", false), + new InvoiceMasthead.Entry("DUE DATE", "19 June 2024", false), + new InvoiceMasthead.Entry("PAYMENT TERMS", "30 Days", false), + new InvoiceMasthead.Entry("CURRENCY", "GBP", false)))) + .billTo(new InvoiceRecipient("BILL TO", "Northfield Consulting Ltd", + "Attn: Sarah Mitchell", + List.of("21 Jubilee Way", "London SE1 3SS", "United Kingdom"), "", "")) + .shipTo(new InvoiceRecipient("SHIP TO", "Northfield Consulting Ltd", "", + List.of("The Foundry, 2nd Floor", "17-19 Great Suffolk Street", + "London SE1 0NS", "United Kingdom"), "", "")) + .serviceLines(serviceLines()) + .totals(new InvoiceTotalsBlock(List.of( + new InvoiceTotalsBlock.Row("SUBTOTAL", new BigDecimal("8500.00")), + new InvoiceTotalsBlock.Row("VAT (20%)", new BigDecimal("1700.00"))), + "TOTAL DUE", new BigDecimal("10200.00"))) + .notes(new InvoiceNotesBlock("NOTES", List.of( + "Thank you for your business." + NEWLINE + + "If you have any questions regarding" + NEWLINE + + "this invoice, please get in touch.", + "All work remains the intellectual property" + NEWLINE + + "of LUMA & CO. STUDIO until payment" + NEWLINE + + "has been received in full."), "", "")) + .payment(new InvoicePaymentBlock("PAYMENT DETAILS", List.of( + new InvoicePaymentBlock.Field("BANK", "Starling Bank"), + new InvoicePaymentBlock.Field("SORT CODE", "60-83-71"), + new InvoicePaymentBlock.Field("ACCOUNT NO.", "98765432"), + new InvoicePaymentBlock.Field("IBAN", "GB36 SRLG 6083 7198 7654 32"), + new InvoicePaymentBlock.Field("BIC", "SRLGGB2L")), + "Please make payment by bank transfer to:", + "Payment is due by 19 June 2024.", "", + "LUMA & CO. STUDIO LTD", + "Thank you for choosing LUMA & CO. STUDIO.")) + .currencyCode("GBP"); + } + + private static InvoiceServiceLines serviceLines() { + return new InvoiceServiceLines( + new InvoiceServiceLines.Columns("", "DESCRIPTION", "", "QTY", "UNIT PRICE", + "AMOUNT", "VAT"), + List.of( + line(1, "Brand Strategy Workshop", + "Discovery session, research & brand positioning.", "1200.00"), + line(2, "Visual Identity Design", + "Logo suite, colour palette, typography & guidelines.", "2650.00"), + line(3, "Website Design (Up to 8 pages)", + "UX/UI design for desktop and mobile.", "3200.00"), + line(4, "Copywriting", "Website copy & key messaging.", "850.00"), + line(5, "Project Management", + "Planning, coordination & client liaison.", "600.00"))); + } + + private static InvoiceServiceLines.Line line(int number, String title, String description, + String price) { + return new InvoiceServiceLines.Line(number, title, description, "", BigDecimal.ONE, "", + new BigDecimal(price), new BigDecimal(price), "20%"); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceLayoutSnapshotTest.java new file mode 100644 index 000000000..73077112e --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceLayoutSnapshotTest.java @@ -0,0 +1,46 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.TemplateTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Exact layout snapshot gate for {@link LumaStudioInvoice} — freezes the + * resolved geometry the pixel budget cannot see (a small column or spacing + * shift stays under the visual-diff budget but changes the snapshot), and + * the pagination contract of the overflow invoice: the service lines flow + * onto further pages while the totals stack and each closing block stay + * whole. + * + *

Refresh with {@code -Dgraphcompose.updateSnapshots=true} after a + * deliberate layout change, and commit the JSON with the change.

+ */ +class LumaStudioInvoiceLayoutSnapshotTest { + + @Test + void canonicalInvoiceMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + LumaStudioInvoice.create().compose( + session, LumaStudioInvoiceFixtures.canonicalInvoice()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "luma_studio_invoice_layout", "invoice"); + } + } + + @Test + void overflowInvoicePaginatesOverThreePages() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + LumaStudioInvoice.create().compose( + session, LumaStudioInvoiceFixtures.overflowInvoice()); + // Three pages exactly: the table spans the first two, and the + // closing blocks move whole onto the third rather than splitting. + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(3); + TemplateTestSupport.assertCanonicalSnapshot( + session, "luma_studio_invoice_overflow_layout", "invoice"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceSmokeTest.java new file mode 100644 index 000000000..3ca52c7d8 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceSmokeTest.java @@ -0,0 +1,251 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.snapshot.LayoutNodeSnapshot; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Smoke test for {@link LumaStudioInvoice} — proves the preset renders a + * {@link StructuredInvoiceDocumentSpec} end-to-end with its packaged icon + * set, renders an empty document through its guards, writes the currency + * mark its data's code names, puts the priced figures on the text layer + * where the layout snapshot cannot see inside the table, and carries the + * contact channels as link annotations — which move no pixel and no layout + * node, so neither gate would notice them going missing. + */ +class LumaStudioInvoiceSmokeTest { + + private static byte[] render(StructuredInvoiceDocumentSpec spec) throws Exception { + // The preset owns its page geometry, so the session starts unconfigured. + try (DocumentSession session = GraphCompose.document().create()) { + LumaStudioInvoice.create().compose(session, spec); + assertThat(session.roots()).isNotEmpty(); + byte[] pdfBytes = session.toPdfBytes(); + assertThat(pdfBytes).isNotEmpty(); + return pdfBytes; + } + } + + private static String textOf(byte[] pdfBytes) throws Exception { + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + return new PDFTextStripper().getText(document); + } + } + + /** + * The text with its spaces removed. The sheet's headings and labels are + * letter-spaced runs, so the extractor can report a gap between each pair + * of letters; what is being asserted is the wording, not the tracking. + */ + private static String compact(String text) { + return text.replace(" ", ""); + } + + /** The text as one run, so an assertion need not know where a line broke. */ + private static String unwrapped(String text) { + return text.replace(String.valueOf((char) 13), "") + .replace(String.valueOf((char) 10), " "); + } + + private static List linkTargets(byte[] pdfBytes) throws Exception { + List targets = new ArrayList<>(); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + for (PDPage page : document.getPages()) { + for (PDAnnotation annotation : page.getAnnotations()) { + if (annotation instanceof PDAnnotationLink link + && link.getAction() instanceof PDActionURI uri) { + targets.add(uri.getURI()); + } + } + } + } + return targets; + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = LumaStudioInvoice.create(); + assertThat(template.id()).isEqualTo(LumaStudioInvoice.ID); + assertThat(template.displayName()).isEqualTo(LumaStudioInvoice.DISPLAY_NAME); + } + + @Test + void rendersCanonicalInvoiceWithPackagedIcons() throws Exception { + render(LumaStudioInvoiceFixtures.canonicalInvoice()); + } + + @Test + void rendersEmptyInvoice() throws Exception { + // Exercises the empty-collection paths through full layout and render: + // no metadata rows, no service lines, no totals rows, no bank fields, + // no notes, and a brand with neither monogram nor wordmark. + render(StructuredInvoiceDocumentSpec.from(StructuredInvoiceData.builder().build())); + } + + @Test + void canonicalRenderCarriesTheTableTotalsAndBankText() throws Exception { + // The line-items table, the totals bands and the bank rows are leaf + // nodes in the layout snapshot, so their content is asserted here. + String text = textOf(render(LumaStudioInvoiceFixtures.canonicalInvoice())); + assertThat(text) + .contains("Brand Strategy Workshop") + .contains("1,200.00") + .contains("10,200.00") + .contains("GB36 SRLG 6083 7198 7654 32") + .contains("Starling Bank"); + // The description wraps inside its cell, so it is asserted unwrapped. + assertThat(unwrapped(text)) + .contains("Discovery session, research & brand positioning."); + assertThat(compact(text)) + .contains("TOTALDUE") + .contains("INV-2024-0587") + .contains("PAYMENTDETAILS"); + } + + @Test + void amountsCarryTheMarkOfTheStatedCurrency() throws Exception { + String text = textOf(render(LumaStudioInvoiceFixtures.canonicalInvoice())); + assertThat(text).contains("£10,200.00"); + } + + @Test + void anUnknownCurrencyCodePrintsItselfRatherThanNothing() throws Exception { + StructuredInvoiceData data = rebuild( + LumaStudioInvoiceFixtures.canonicalInvoice().invoice()) + .currencyCode("ZZZ") + .build(); + + String text = textOf(render(StructuredInvoiceDocumentSpec.from(data))); + assertThat(text).contains("ZZZ10,200.00"); + } + + @Test + void aDocumentWithoutACurrencyLeavesTheFiguresBare() throws Exception { + StructuredInvoiceData data = rebuild( + LumaStudioInvoiceFixtures.canonicalInvoice().invoice()) + .currencyCode("") + .build(); + + String text = textOf(render(StructuredInvoiceDocumentSpec.from(data))); + assertThat(text).contains("10,200.00").doesNotContain("£10,200.00"); + } + + @Test + void contactChannelsAreClickable() throws Exception { + List targets = linkTargets(render(LumaStudioInvoiceFixtures.canonicalInvoice())); + assertThat(targets) + .contains("tel:+442079460832") + .contains("mailto:hello@lumaandco.studio") + .contains("https://www.lumaandco.studio"); + } + + @Test + void aSupplierWithoutRegistrationsPrintsNoDanglingSeparator() throws Exception { + StructuredInvoiceData canonical = + LumaStudioInvoiceFixtures.canonicalInvoice().invoice(); + InvoiceContactBlock supplier = canonical.supplier(); + StructuredInvoiceData data = rebuild(canonical) + .supplier(new InvoiceContactBlock(supplier.legalName(), supplier.addressLines(), + supplier.phone(), supplier.email(), supplier.website(), + "", "", "", "")) + .build(); + + String text = textOf(render(StructuredInvoiceDocumentSpec.from(data))); + assertThat(text).contains("Studio 3.02, The Loom").doesNotContain("|"); + } + + @Test + void aSupplierWithOneRegistrationPrintsNoSeparator() throws Exception { + StructuredInvoiceData canonical = + LumaStudioInvoiceFixtures.canonicalInvoice().invoice(); + InvoiceContactBlock supplier = canonical.supplier(); + StructuredInvoiceData data = rebuild(canonical) + .supplier(new InvoiceContactBlock(supplier.legalName(), supplier.addressLines(), + supplier.phone(), supplier.email(), supplier.website(), + supplier.registrationLabel(), supplier.registrationNumber(), "", "")) + .build(); + + String text = textOf(render(StructuredInvoiceDocumentSpec.from(data))); + assertThat(text).contains("Company No. 12578934").doesNotContain("|"); + } + + @Test + void overflowInvoiceRepeatsTheTableHeaderAndTheFolioOnTheSecondPage() throws Exception { + byte[] pdfBytes = render(LumaStudioInvoiceFixtures.overflowInvoice()); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + assertThat(document.getNumberOfPages()).isGreaterThan(1); + PDFTextStripper stripper = new PDFTextStripper(); + stripper.setStartPage(2); + stripper.setEndPage(2); + String secondPage = compact(stripper.getText(document)); + assertThat(secondPage).contains("DESCRIPTION").contains("UNITPRICE"); + assertThat(secondPage).contains("Page2of"); + } + } + + @Test + void overflowInvoicePricesEveryLine() throws Exception { + String text = textOf(render(LumaStudioInvoiceFixtures.overflowInvoice())); + int occurrences = text.split("Project Management", -1).length - 1; + assertThat(occurrences).isEqualTo(4); + } + + @Test + void theSignOffLandsOnItsOwnDarkGroundOnTheLastPage() throws Exception { + // The words are white. The dark foot band is a page background pinned + // to the paper's edge, and on a multi-page invoice the flow ends well + // above it — so the sign-off carries its own strip, and this is what + // says the strip is still under the words rather than the page's. + try (DocumentSession session = GraphCompose.document().create()) { + LumaStudioInvoice.create().compose( + session, LumaStudioInvoiceFixtures.overflowInvoice()); + LayoutNodeSnapshot band = node(session, "BannerBand"); + LayoutNodeSnapshot signOff = node(session, "SignOff"); + + assertThat(signOff.startPage()).isEqualTo(band.startPage()); + assertThat(signOff.placementY()).isGreaterThanOrEqualTo(band.placementY()); + assertThat(signOff.placementY() + signOff.placementHeight()) + .isLessThanOrEqualTo(band.placementY() + band.placementHeight()); + } + } + + private static LayoutNodeSnapshot node(DocumentSession session, String entityName) { + return session.layoutSnapshot().nodes().stream() + .filter(candidate -> entityName.equals(candidate.entityName())) + .findFirst() + .orElseThrow(() -> new AssertionError("No node named " + entityName)); + } + + /** Copies every component of a spec so one of them can be replaced. */ + private static StructuredInvoiceData.Builder rebuild(StructuredInvoiceData data) { + return StructuredInvoiceData.builder() + .brand(data.brand()) + .supplier(data.supplier()) + .masthead(data.masthead()) + .billTo(data.billTo()) + .shipTo(data.shipTo()) + .summary(data.summary()) + .serviceLines(data.serviceLines()) + .totals(data.totals()) + .payment(data.payment()) + .notes(data.notes()) + .currencyCode(data.currencyCode()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceVisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceVisualParityTest.java new file mode 100644 index 000000000..5f470eb41 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoiceVisualParityTest.java @@ -0,0 +1,42 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.testing.visual.PdfVisualRegression; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +/** + * Pixel-diff visual parity gate for {@link LumaStudioInvoice}. Budget and + * tolerance mirror the other structured-invoice parity gates. + * + *

Re-blessing baselines — after a deliberate visual + * change, re-run with {@code -Dgraphcompose.visual.approve=true} and + * commit the updated PNGs with the change. Baselines live under + * {@code src/test/resources/visual-baselines/invoice-v2-layered/}.

+ */ +class LumaStudioInvoiceVisualParityTest { + + private static final Path BASELINE_ROOT = Path.of( + "src", "test", "resources", "visual-baselines", "invoice-v2-layered"); + + private static final long PIXEL_DIFF_BUDGET = 50_000L; + private static final int PER_PIXEL_TOLERANCE = 8; + + @Test + void rendersWithinPixelDiffBudget() throws Exception { + byte[] pdfBytes; + try (DocumentSession document = GraphCompose.document().create()) { + LumaStudioInvoice.create().compose( + document, LumaStudioInvoiceFixtures.canonicalInvoice()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("luma_studio_invoice", pdfBytes); + } +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json new file mode 100644 index 000000000..129d7aebb --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_layout.json @@ -0,0 +1,3677 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 402.871, + "innerHeight" : 732.911, + "margin" : { + "top" : 46.3, + "right" : 38.931, + "bottom" : 62.679, + "left" : 153.474 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "LumaStudioInvoice[0]", + "entityName" : "LumaStudioInvoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 153.474, + "computedY" : 65.475, + "placementX" : 153.474, + "placementY" : 65.475, + "placementWidth" : 402.871, + "placementHeight" : 730.115, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 730.115, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]", + "entityName" : "Sidebar", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 0.0, + "computedY" : 841.49, + "placementX" : 0.0, + "placementY" : 841.49, + "placementWidth" : 132.032, + "placementHeight" : 0.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 0.4, + "margin" : { + "top" : -46.3, + "right" : 0.0, + "bottom" : 45.9, + "left" : -153.474 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "entityName" : "SidebarOrnament", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 0.0, + "placementX" : 0.0, + "placementY" : 0.0, + "placementWidth" : 132.032, + "placementHeight" : 634.667, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 634.667, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/OrnamentDisc[0]", + "entityName" : "OrnamentDisc", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 17.489, + "computedY" : 527.868, + "placementX" : 17.489, + "placementY" : 527.868, + "placementWidth" : 205.382, + "placementHeight" : 205.382, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.382, + "contentHeight" : 205.382, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/OrnamentArch[1]", + "entityName" : "OrnamentArch", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 15.799, + "computedY" : 0.0, + "placementX" : 15.799, + "placementY" : 0.0, + "placementWidth" : 116.234, + "placementHeight" : 236.588, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.234, + "contentHeight" : 236.588, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 12.977, + "computedY" : 282.647, + "placementX" : 12.977, + "placementY" : 282.647, + "placementWidth" : 95.244, + "placementHeight" : 95.244, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.244, + "contentHeight" : 95.244, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 12.977, + "computedY" : 282.647, + "placementX" : 12.977, + "placementY" : 282.647, + "placementWidth" : 95.244, + "placementHeight" : 95.244, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.244, + "contentHeight" : 95.244, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandBlock[1]", + "entityName" : "BrandBlock", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 634.667, + "placementX" : 0.0, + "placementY" : 634.667, + "placementWidth" : 132.032, + "placementHeight" : 207.223, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 207.223, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "entityName" : "BrandLockup", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 634.667, + "placementX" : 0.0, + "placementY" : 634.667, + "placementWidth" : 132.032, + "placementHeight" : 207.223, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 207.223, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 715.218, + "placementX" : 33.288, + "placementY" : 715.218, + "placementWidth" : 36.655, + "placementHeight" : 88.273, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 36.655, + "contentHeight" : 88.273, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 705.462, + "placementX" : 33.288, + "placementY" : 705.462, + "placementWidth" : 68.585, + "placementHeight" : 47.212, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 68.585, + "contentHeight" : 47.212, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/LockupRule[2]", + "entityName" : "LockupRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 704.671, + "placementX" : 33.288, + "placementY" : 704.671, + "placementWidth" : 20.311, + "placementHeight" : 1.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.311, + "contentHeight" : 1.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/Wordmark[3]", + "entityName" : "Wordmark", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 675.395, + "placementX" : 33.288, + "placementY" : 675.395, + "placementWidth" : 82.984, + "placementHeight" : 9.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.984, + "contentHeight" : 9.524, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[4]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 661.626, + "placementX" : 33.288, + "placementY" : 661.626, + "placementWidth" : 77.712, + "placementHeight" : 8.047, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.712, + "contentHeight" : 8.047, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 647.091, + "placementX" : 153.474, + "placementY" : 647.091, + "placementWidth" : 402.871, + "placementHeight" : 148.499, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 148.499, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "entityName" : "SupplierHeader", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 655.01, + "placementX" : 153.474, + "placementY" : 655.01, + "placementWidth" : 236.404, + "placementHeight" : 140.58, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 236.404, + "contentHeight" : 140.58, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/SupplierName[0]", + "entityName" : "SupplierName", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 782.164, + "placementX" : 160.808, + "placementY" : 782.164, + "placementWidth" : 94.638, + "placementHeight" : 13.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 94.638, + "contentHeight" : 13.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/SupplierAddress[1]", + "entityName" : "SupplierAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 727.228, + "placementX" : 160.808, + "placementY" : 727.228, + "placementWidth" : 85.39, + "placementHeight" : 48.726, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 85.39, + "contentHeight" : 48.726, + "margin" : { + "top" : 6.21, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "entityName" : "ContactRows", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 674.232, + "placementX" : 160.808, + "placementY" : 674.232, + "placementWidth" : 229.071, + "placementHeight" : 43.184, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 43.184, + "margin" : { + "top" : 9.812, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 703.022, + "placementX" : 160.808, + "placementY" : 703.022, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 705.919, + "placementX" : 160.808, + "placementY" : 705.919, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 705.919, + "placementX" : 160.808, + "placementY" : 705.919, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 704.482, + "placementX" : 181.808, + "placementY" : 704.482, + "placementWidth" : 78.706, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 78.706, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 688.627, + "placementX" : 160.808, + "placementY" : 688.627, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 691.524, + "placementX" : 160.808, + "placementY" : 691.524, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 691.524, + "placementX" : 160.808, + "placementY" : 691.524, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 690.087, + "placementX" : 181.808, + "placementY" : 690.087, + "placementWidth" : 95.852, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.852, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 674.232, + "placementX" : 160.808, + "placementY" : 674.232, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 677.129, + "placementX" : 160.808, + "placementY" : 677.129, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 677.129, + "placementX" : 160.808, + "placementY" : 677.129, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 675.692, + "placementX" : 181.808, + "placementY" : 675.692, + "placementWidth" : 91.105, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 91.105, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/Registration[3]", + "entityName" : "Registration", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 655.01, + "placementX" : 160.808, + "placementY" : 655.01, + "placementWidth" : 148.091, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 148.091, + "contentHeight" : 8.79, + "margin" : { + "top" : 10.433, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "entityName" : "InvoiceHeader", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 389.878, + "computedY" : 647.091, + "placementX" : 389.878, + "placementY" : 647.091, + "placementWidth" : 166.466, + "placementHeight" : 148.499, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 148.499, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "entityName" : "InvoiceTitleBlock", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 749.89, + "placementX" : 389.878, + "placementY" : 749.89, + "placementWidth" : 166.466, + "placementHeight" : 45.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 45.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 15.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]/InvoiceTitle[0]", + "entityName" : "InvoiceTitle", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 736.636, + "placementX" : 389.878, + "placementY" : 736.636, + "placementWidth" : 164.751, + "placementHeight" : 55.553, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 164.751, + "contentHeight" : 55.553, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]/TitleRule[1]", + "entityName" : "TitleRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 749.89, + "placementX" : 389.878, + "placementY" : 749.89, + "placementWidth" : 58.7, + "placementHeight" : 1.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 58.7, + "contentHeight" : 1.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 717.09, + "placementX" : 389.878, + "placementY" : 717.09, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 720.957, + "placementX" : 389.878, + "placementY" : 720.957, + "placementWidth" : 57.062, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.062, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 720.103, + "placementX" : 491.989, + "placementY" : 720.103, + "placementWidth" : 57.65, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.65, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 699.59, + "placementX" : 389.878, + "placementY" : 699.59, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 703.458, + "placementX" : 389.878, + "placementY" : 703.458, + "placementWidth" : 51.552, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.552, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 702.603, + "placementX" : 491.989, + "placementY" : 702.603, + "placementWidth" : 49.641, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.641, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 682.09, + "placementX" : 389.878, + "placementY" : 682.09, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 685.958, + "placementX" : 389.878, + "placementY" : 685.958, + "placementWidth" : 43.963, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 43.963, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 685.103, + "placementX" : 491.989, + "placementY" : 685.103, + "placementWidth" : 50.393, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.393, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 664.591, + "placementX" : 389.878, + "placementY" : 664.591, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 668.458, + "placementX" : 389.878, + "placementY" : 668.458, + "placementWidth" : 75.89, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 75.89, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 667.603, + "placementX" : 491.989, + "placementY" : 667.603, + "placementWidth" : 29.873, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.873, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 647.091, + "placementX" : 389.878, + "placementY" : 647.091, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 650.958, + "placementX" : 389.878, + "placementY" : 650.958, + "placementWidth" : 46.267, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 46.267, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 650.103, + "placementX" : 491.989, + "placementY" : 650.103, + "placementWidth" : 15.905, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.905, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/HeaderRule[2]", + "entityName" : "HeaderRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 160.808, + "computedY" : 633.091, + "placementX" : 160.808, + "placementY" : 633.091, + "placementWidth" : 395.537, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 395.537, + "contentHeight" : 1.0, + "margin" : { + "top" : 13.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]", + "entityName" : "Parties", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 532.149, + "placementX" : 153.474, + "placementY" : 532.149, + "placementWidth" : 402.871, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 88.942, + "margin" : { + "top" : 12.0, + "right" : 0.0, + "bottom" : 12.9, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "entityName" : "BILLTO", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 532.149, + "placementX" : 153.474, + "placementY" : 532.149, + "placementWidth" : 103.12, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 103.12, + "contentHeight" : 88.942, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]/PartyHeading[0]", + "entityName" : "PartyHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 611.326, + "placementX" : 160.808, + "placementY" : 611.326, + "placementWidth" : 33.342, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.342, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]/PartyAddress[1]", + "entityName" : "PartyAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 532.149, + "placementX" : 160.808, + "placementY" : 532.149, + "placementWidth" : 95.786, + "placementHeight" : 70.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.786, + "contentHeight" : 70.235, + "margin" : { + "top" : 8.942, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "entityName" : "SHIPTO", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 344.757, + "computedY" : 532.149, + "placementX" : 344.757, + "placementY" : 532.149, + "placementWidth" : 133.88, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 133.88, + "contentHeight" : 88.942, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 34.4 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]/PartyHeading[0]", + "entityName" : "PartyHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 379.157, + "computedY" : 611.326, + "placementX" : 379.157, + "placementY" : 611.326, + "placementWidth" : 35.173, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 35.173, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]/PartyAddress[1]", + "entityName" : "PartyAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 379.157, + "computedY" : 532.149, + "placementX" : 379.157, + "placementY" : 532.149, + "placementWidth" : 99.48, + "placementHeight" : 70.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 99.48, + "contentHeight" : 70.235, + "margin" : { + "top" : 8.942, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/LineItems[4]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 268.127, + "placementX" : 153.474, + "placementY" : 268.127, + "placementWidth" : 402.871, + "placementHeight" : 251.122, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 251.122, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]", + "entityName" : "Totals", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 306.404, + "computedY" : 197.553, + "placementX" : 306.404, + "placementY" : 197.553, + "placementWidth" : 249.941, + "placementHeight" : 66.174, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 66.174, + "margin" : { + "top" : 4.4, + "right" : 0.0, + "bottom" : 0.0, + "left" : 152.93 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "entityName" : "TotalsRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 245.619, + "placementX" : 306.404, + "placementY" : 245.619, + "placementWidth" : 249.941, + "placementHeight" : 18.108, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 18.108, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 248.821, + "placementX" : 348.204, + "placementY" : 248.821, + "placementWidth" : 46.299, + "placementHeight" : 11.704, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 46.299, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 248.821, + "placementX" : 293.404, + "placementY" : 248.821, + "placementWidth" : 249.941, + "placementHeight" : 11.704, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "entityName" : "TotalsRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 227.51, + "placementX" : 306.404, + "placementY" : 227.51, + "placementWidth" : 249.941, + "placementHeight" : 18.108, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 18.108, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 230.712, + "placementX" : 348.204, + "placementY" : 230.712, + "placementWidth" : 45.982, + "placementHeight" : 11.704, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 45.982, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 230.712, + "placementX" : 293.404, + "placementY" : 230.712, + "placementWidth" : 249.941, + "placementHeight" : 11.704, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "entityName" : "TotalDueBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 197.553, + "placementX" : 306.404, + "placementY" : 197.553, + "placementWidth" : 249.941, + "placementHeight" : 27.1, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 27.1, + "margin" : { + "top" : 2.857, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 204.85, + "placementX" : 348.204, + "placementY" : 204.85, + "placementWidth" : 52.971, + "placementHeight" : 12.507, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 52.971, + "contentHeight" : 12.507, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 199.812, + "placementX" : 293.404, + "placementY" : 199.812, + "placementWidth" : 249.941, + "placementHeight" : 22.582, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.941, + "contentHeight" : 22.582, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/FooterRule[6]", + "entityName" : "FooterRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 194.553, + "placementX" : 153.474, + "placementY" : 194.553, + "placementWidth" : 402.871, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 1.0, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]", + "entityName" : "Closing", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 74.375, + "placementX" : 153.474, + "placementY" : 74.375, + "placementWidth" : 402.871, + "placementHeight" : 108.178, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 108.178, + "margin" : { + "top" : 12.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "entityName" : "Notes", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 86.272, + "placementX" : 153.474, + "placementY" : 86.272, + "placementWidth" : 167.03, + "placementHeight" : 96.281, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 167.03, + "contentHeight" : 96.281, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "entityName" : "SectionHead", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 153.474, + "computedY" : 157.753, + "placementX" : 153.474, + "placementY" : 157.753, + "placementWidth" : 167.03, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 167.03, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "entityName" : "Disc-notes", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 153.474, + "computedY" : 157.753, + "placementX" : 153.474, + "placementY" : 157.753, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 153.474, + "computedY" : 157.753, + "placementX" : 153.474, + "placementY" : 157.753, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 159.874, + "computedY" : 164.153, + "placementX" : 159.874, + "placementY" : 164.153, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 159.874, + "computedY" : 164.153, + "placementX" : 159.874, + "placementY" : 164.153, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/SectionHeading[1]", + "entityName" : "SectionHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 165.271, + "placementX" : 188.974, + "placementY" : 165.271, + "placementWidth" : 28.177, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 28.177, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "entityName" : "NotesBody", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 153.474, + "computedY" : 86.272, + "placementX" : 153.474, + "placementY" : 86.272, + "placementWidth" : 156.503, + "placementHeight" : 69.245, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 156.503, + "contentHeight" : 69.245, + "margin" : { + "top" : 2.236, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 35.5 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 125.552, + "placementX" : 188.974, + "placementY" : 125.552, + "placementWidth" : 103.794, + "placementHeight" : 29.965, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 103.794, + "contentHeight" : 29.965, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 86.272, + "placementX" : 188.974, + "placementY" : 86.272, + "placementWidth" : 121.003, + "placementHeight" : 29.965, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 121.003, + "contentHeight" : 29.965, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "entityName" : "PaymentDetails", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 320.504, + "computedY" : 74.375, + "placementX" : 320.504, + "placementY" : 74.375, + "placementWidth" : 235.84, + "placementHeight" : 108.178, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 235.84, + "contentHeight" : 108.178, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.3 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "entityName" : "SectionHead", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 344.804, + "computedY" : 157.753, + "placementX" : 344.804, + "placementY" : 157.753, + "placementWidth" : 211.54, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 211.54, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "entityName" : "Disc-bank", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 344.804, + "computedY" : 157.753, + "placementX" : 344.804, + "placementY" : 157.753, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 344.804, + "computedY" : 157.753, + "placementX" : 344.804, + "placementY" : 157.753, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 351.204, + "computedY" : 164.153, + "placementX" : 351.204, + "placementY" : 164.153, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 351.204, + "computedY" : 164.153, + "placementX" : 351.204, + "placementY" : 164.153, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/SectionHeading[1]", + "entityName" : "SectionHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 165.271, + "placementX" : 380.304, + "placementY" : 165.271, + "placementWidth" : 82.727, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.727, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "entityName" : "PaymentBody", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 344.804, + "computedY" : 74.375, + "placementX" : 344.804, + "placementY" : 74.375, + "placementWidth" : 211.54, + "placementHeight" : 81.143, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 211.54, + "contentHeight" : 81.143, + "margin" : { + "top" : 2.236, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 35.5 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentInstruction[0]", + "entityName" : "PaymentInstruction", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 147.544, + "placementX" : 380.304, + "placementY" : 147.544, + "placementWidth" : 121.183, + "placementHeight" : 7.974, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 121.183, + "contentHeight" : 7.974, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/AccountHolder[1]", + "entityName" : "AccountHolder", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 132.19, + "placementX" : 380.304, + "placementY" : 132.19, + "placementWidth" : 83.026, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 83.026, + "contentHeight" : 9.765, + "margin" : { + "top" : 5.589, + "right" : 0.0, + "bottom" : 6.831, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 115.162, + "placementX" : 380.304, + "placementY" : 115.162, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 115.866, + "placementX" : 380.304, + "placementY" : 115.866, + "placementWidth" : 17.087, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 17.087, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 116.895, + "placementX" : 433.904, + "placementY" : 116.895, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 115.866, + "placementX" : 444.104, + "placementY" : 115.866, + "placementWidth" : 38.198, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 38.198, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 104.965, + "placementX" : 380.304, + "placementY" : 104.965, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 105.669, + "placementX" : 380.304, + "placementY" : 105.669, + "placementWidth" : 34.245, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.245, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 106.699, + "placementX" : 433.904, + "placementY" : 106.699, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 105.669, + "placementX" : 444.104, + "placementY" : 105.669, + "placementWidth" : 26.31, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 26.31, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 94.768, + "placementX" : 380.304, + "placementY" : 94.768, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 95.472, + "placementX" : 380.304, + "placementY" : 95.472, + "placementWidth" : 43.022, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 43.022, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 96.502, + "placementX" : 433.904, + "placementY" : 96.502, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 95.472, + "placementX" : 444.104, + "placementY" : 95.472, + "placementWidth" : 29.205, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.205, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 84.571, + "placementX" : 380.304, + "placementY" : 84.571, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 85.275, + "placementX" : 380.304, + "placementY" : 85.275, + "placementWidth" : 15.07, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.07, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 86.305, + "placementX" : 433.904, + "placementY" : 86.305, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 85.275, + "placementX" : 444.104, + "placementY" : 85.275, + "placementWidth" : 89.789, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 89.789, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 74.375, + "placementX" : 380.304, + "placementY" : 74.375, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 75.078, + "placementX" : 380.304, + "placementY" : 75.078, + "placementWidth" : 9.771, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.771, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 76.108, + "placementX" : 433.904, + "placementY" : 76.108, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 75.078, + "placementX" : 444.104, + "placementY" : 75.078, + "placementWidth" : 29.918, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.918, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]", + "entityName" : "ClosingBanner", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 8, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 65.475, + "placementX" : 153.474, + "placementY" : 65.475, + "placementWidth" : 402.871, + "placementHeight" : 0.3, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 0.3, + "margin" : { + "top" : 8.6, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "entityName" : "BannerContent", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 3.096, + "placementX" : 0.0, + "placementY" : 3.096, + "placementWidth" : 595.276, + "placementHeight" : 62.679, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.276, + "contentHeight" : 62.679, + "margin" : { + "top" : 0.0, + "right" : -38.931, + "bottom" : -62.379, + "left" : -153.474 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerBand[0]", + "entityName" : "BannerBand", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 0.0, + "computedY" : 3.096, + "placementX" : 0.0, + "placementY" : 3.096, + "placementWidth" : 595.276, + "placementHeight" : 62.679, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 595.276, + "contentHeight" : 62.679, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "entityName" : "Disc-heart", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 32.728, + "computedY" : 17.485, + "placementX" : 32.728, + "placementY" : 17.485, + "placementWidth" : 33.9, + "placementHeight" : 33.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.9, + "contentHeight" : 33.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 32.728, + "computedY" : 17.485, + "placementX" : 32.728, + "placementY" : 17.485, + "placementWidth" : 33.9, + "placementHeight" : 33.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.9, + "contentHeight" : 33.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 41.678, + "computedY" : 26.435, + "placementX" : 41.678, + "placementY" : 26.435, + "placementWidth" : 16.0, + "placementHeight" : 16.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.0, + "contentHeight" : 16.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 41.678, + "computedY" : 26.435, + "placementX" : 41.678, + "placementY" : 26.435, + "placementWidth" : 16.0, + "placementHeight" : 16.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.0, + "contentHeight" : 16.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "entityName" : "BannerLines", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 80.628, + "computedY" : 21.357, + "placementX" : 80.628, + "placementY" : 21.357, + "placementWidth" : 179.909, + "placementHeight" : 26.156, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 179.909, + "contentHeight" : 26.156, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]/SignOff[0]", + "entityName" : "SignOff", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 80.628, + "computedY" : 35.809, + "placementX" : 80.628, + "placementY" : 35.809, + "placementWidth" : 179.909, + "placementHeight" : 11.704, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 179.909, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]/DueNotice[1]", + "entityName" : "DueNotice", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 80.628, + "computedY" : 21.357, + "placementX" : 80.628, + "placementY" : 21.357, + "placementWidth" : 135.165, + "placementHeight" : 11.347, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 135.165, + "contentHeight" : 11.347, + "margin" : { + "top" : 3.105, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json new file mode 100644 index 000000000..7592ce06c --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/luma_studio_invoice_overflow_layout.json @@ -0,0 +1,3677 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 402.871, + "innerHeight" : 732.911, + "margin" : { + "top" : 46.3, + "right" : 38.931, + "bottom" : 62.679, + "left" : 153.474 + } + }, + "totalPages" : 3, + "nodes" : [ { + "path" : "LumaStudioInvoice[0]", + "entityName" : "LumaStudioInvoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 153.474, + "computedY" : -695.368, + "placementX" : 153.474, + "placementY" : -695.368, + "placementWidth" : 402.871, + "placementHeight" : 1490.957, + "startPage" : 0, + "endPage" : 2, + "contentWidth" : 402.871, + "contentHeight" : 1490.957, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]", + "entityName" : "Sidebar", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 0.0, + "computedY" : 841.49, + "placementX" : 0.0, + "placementY" : 841.49, + "placementWidth" : 132.032, + "placementHeight" : 0.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 0.4, + "margin" : { + "top" : -46.3, + "right" : 0.0, + "bottom" : 45.9, + "left" : -153.474 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "entityName" : "SidebarOrnament", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 0.0, + "placementX" : 0.0, + "placementY" : 0.0, + "placementWidth" : 132.032, + "placementHeight" : 634.667, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 634.667, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/OrnamentDisc[0]", + "entityName" : "OrnamentDisc", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 17.489, + "computedY" : 527.868, + "placementX" : 17.489, + "placementY" : 527.868, + "placementWidth" : 205.382, + "placementHeight" : 205.382, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.382, + "contentHeight" : 205.382, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/OrnamentArch[1]", + "entityName" : "OrnamentArch", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 15.799, + "computedY" : 0.0, + "placementX" : 15.799, + "placementY" : 0.0, + "placementWidth" : 116.234, + "placementHeight" : 236.588, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.234, + "contentHeight" : 236.588, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 12.977, + "computedY" : 282.647, + "placementX" : 12.977, + "placementY" : 282.647, + "placementWidth" : 95.244, + "placementHeight" : 95.244, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.244, + "contentHeight" : 95.244, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/SidebarOrnament[0]/SvgIcon[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 12.977, + "computedY" : 282.647, + "placementX" : 12.977, + "placementY" : 282.647, + "placementWidth" : 95.244, + "placementHeight" : 95.244, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.244, + "contentHeight" : 95.244, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandBlock[1]", + "entityName" : "BrandBlock", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 634.667, + "placementX" : 0.0, + "placementY" : 634.667, + "placementWidth" : 132.032, + "placementHeight" : 207.223, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 207.223, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "entityName" : "BrandLockup", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 634.667, + "placementX" : 0.0, + "placementY" : 634.667, + "placementWidth" : 132.032, + "placementHeight" : 207.223, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 132.032, + "contentHeight" : 207.223, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 715.218, + "placementX" : 33.288, + "placementY" : 715.218, + "placementWidth" : 36.655, + "placementHeight" : 88.273, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 36.655, + "contentHeight" : 88.273, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 705.462, + "placementX" : 33.288, + "placementY" : 705.462, + "placementWidth" : 68.585, + "placementHeight" : 47.212, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 68.585, + "contentHeight" : 47.212, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/LockupRule[2]", + "entityName" : "LockupRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 704.671, + "placementX" : 33.288, + "placementY" : 704.671, + "placementWidth" : 20.311, + "placementHeight" : 1.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 20.311, + "contentHeight" : 1.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/Wordmark[3]", + "entityName" : "Wordmark", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 675.395, + "placementX" : 33.288, + "placementY" : 675.395, + "placementWidth" : 82.984, + "placementHeight" : 9.524, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 82.984, + "contentHeight" : 9.524, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]/ParagraphNode[4]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Sidebar[0]/BrandLockup[2]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 33.288, + "computedY" : 661.626, + "placementX" : 33.288, + "placementY" : 661.626, + "placementWidth" : 77.712, + "placementHeight" : 8.047, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.712, + "contentHeight" : 8.047, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 647.091, + "placementX" : 153.474, + "placementY" : 647.091, + "placementWidth" : 402.871, + "placementHeight" : 148.499, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 148.499, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "entityName" : "SupplierHeader", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 655.01, + "placementX" : 153.474, + "placementY" : 655.01, + "placementWidth" : 236.404, + "placementHeight" : 140.58, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 236.404, + "contentHeight" : 140.58, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/SupplierName[0]", + "entityName" : "SupplierName", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 782.164, + "placementX" : 160.808, + "placementY" : 782.164, + "placementWidth" : 94.638, + "placementHeight" : 13.425, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 94.638, + "contentHeight" : 13.425, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/SupplierAddress[1]", + "entityName" : "SupplierAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 727.228, + "placementX" : 160.808, + "placementY" : 727.228, + "placementWidth" : 85.39, + "placementHeight" : 48.726, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 85.39, + "contentHeight" : 48.726, + "margin" : { + "top" : 6.21, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "entityName" : "ContactRows", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 674.232, + "placementX" : 160.808, + "placementY" : 674.232, + "placementWidth" : 229.071, + "placementHeight" : 43.184, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 43.184, + "margin" : { + "top" : 9.812, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 703.022, + "placementX" : 160.808, + "placementY" : 703.022, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 705.919, + "placementX" : 160.808, + "placementY" : 705.919, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 705.919, + "placementX" : 160.808, + "placementY" : 705.919, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 704.482, + "placementX" : 181.808, + "placementY" : 704.482, + "placementWidth" : 78.706, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 78.706, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 688.627, + "placementX" : 160.808, + "placementY" : 688.627, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 691.524, + "placementX" : 160.808, + "placementY" : 691.524, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 691.524, + "placementX" : 160.808, + "placementY" : 691.524, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 690.087, + "placementX" : 181.808, + "placementY" : 690.087, + "placementWidth" : 95.852, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.852, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "entityName" : "ContactRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 160.808, + "computedY" : 674.232, + "placementX" : 160.808, + "placementY" : 674.232, + "placementWidth" : 229.071, + "placementHeight" : 14.395, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 229.071, + "contentHeight" : 14.395, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 160.808, + "computedY" : 677.129, + "placementX" : 160.808, + "placementY" : 677.129, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 160.808, + "computedY" : 677.129, + "placementX" : 160.808, + "placementY" : 677.129, + "placementWidth" : 8.6, + "placementHeight" : 8.6, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 8.6, + "contentHeight" : 8.6, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/ContactRows[2]/ContactRow[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 181.808, + "computedY" : 675.692, + "placementX" : 181.808, + "placementY" : 675.692, + "placementWidth" : 91.105, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 91.105, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]/Registration[3]", + "entityName" : "Registration", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/SupplierHeader[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 655.01, + "placementX" : 160.808, + "placementY" : 655.01, + "placementWidth" : 148.091, + "placementHeight" : 8.79, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 148.091, + "contentHeight" : 8.79, + "margin" : { + "top" : 10.433, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "entityName" : "InvoiceHeader", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 389.878, + "computedY" : 647.091, + "placementX" : 389.878, + "placementY" : 647.091, + "placementWidth" : 166.466, + "placementHeight" : 148.499, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 148.499, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "entityName" : "InvoiceTitleBlock", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 749.89, + "placementX" : 389.878, + "placementY" : 749.89, + "placementWidth" : 166.466, + "placementHeight" : 45.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 45.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 15.3, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]/InvoiceTitle[0]", + "entityName" : "InvoiceTitle", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 736.636, + "placementX" : 389.878, + "placementY" : 736.636, + "placementWidth" : 164.751, + "placementHeight" : 55.553, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 164.751, + "contentHeight" : 55.553, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]/TitleRule[1]", + "entityName" : "TitleRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/InvoiceTitleBlock[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 749.89, + "placementX" : 389.878, + "placementY" : 749.89, + "placementWidth" : 58.7, + "placementHeight" : 1.7, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 58.7, + "contentHeight" : 1.7, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 717.09, + "placementX" : 389.878, + "placementY" : 717.09, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 720.957, + "placementX" : 389.878, + "placementY" : 720.957, + "placementWidth" : 57.062, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.062, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 720.103, + "placementX" : 491.989, + "placementY" : 720.103, + "placementWidth" : 57.65, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.65, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 699.59, + "placementX" : 389.878, + "placementY" : 699.59, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 703.458, + "placementX" : 389.878, + "placementY" : 703.458, + "placementWidth" : 51.552, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.552, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 702.603, + "placementX" : 491.989, + "placementY" : 702.603, + "placementWidth" : 49.641, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 49.641, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 682.09, + "placementX" : 389.878, + "placementY" : 682.09, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 685.958, + "placementX" : 389.878, + "placementY" : 685.958, + "placementWidth" : 43.963, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 43.963, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 685.103, + "placementX" : 491.989, + "placementY" : 685.103, + "placementWidth" : 50.393, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.393, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 664.591, + "placementX" : 389.878, + "placementY" : 664.591, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 668.458, + "placementX" : 389.878, + "placementY" : 668.458, + "placementWidth" : 75.89, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 75.89, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 667.603, + "placementX" : 491.989, + "placementY" : 667.603, + "placementWidth" : 29.873, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 29.873, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "entityName" : "MetadataRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 389.878, + "computedY" : 647.091, + "placementX" : 389.878, + "placementY" : 647.091, + "placementWidth" : 166.466, + "placementHeight" : 17.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 166.466, + "contentHeight" : 17.5, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]/MetaLabel[0]", + "entityName" : "MetaLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 389.878, + "computedY" : 650.958, + "placementX" : 389.878, + "placementY" : 650.958, + "placementWidth" : 46.267, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 46.267, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Masthead[1]/InvoiceHeader[1]/MetadataRow[5]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 491.989, + "computedY" : 650.103, + "placementX" : 491.989, + "placementY" : 650.103, + "placementWidth" : 15.905, + "placementHeight" : 11.475, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.905, + "contentHeight" : 11.475, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/HeaderRule[2]", + "entityName" : "HeaderRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 160.808, + "computedY" : 633.091, + "placementX" : 160.808, + "placementY" : 633.091, + "placementWidth" : 395.537, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 395.537, + "contentHeight" : 1.0, + "margin" : { + "top" : 13.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]", + "entityName" : "Parties", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 532.149, + "placementX" : 153.474, + "placementY" : 532.149, + "placementWidth" : 402.871, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 402.871, + "contentHeight" : 88.942, + "margin" : { + "top" : 12.0, + "right" : 0.0, + "bottom" : 12.9, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "entityName" : "BILLTO", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 532.149, + "placementX" : 153.474, + "placementY" : 532.149, + "placementWidth" : 103.12, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 103.12, + "contentHeight" : 88.942, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 7.334 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]/PartyHeading[0]", + "entityName" : "PartyHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 611.326, + "placementX" : 160.808, + "placementY" : 611.326, + "placementWidth" : 33.342, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.342, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]/PartyAddress[1]", + "entityName" : "PartyAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/BILLTO[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 160.808, + "computedY" : 532.149, + "placementX" : 160.808, + "placementY" : 532.149, + "placementWidth" : 95.786, + "placementHeight" : 70.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.786, + "contentHeight" : 70.235, + "margin" : { + "top" : 8.942, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "entityName" : "SHIPTO", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 344.757, + "computedY" : 532.149, + "placementX" : 344.757, + "placementY" : 532.149, + "placementWidth" : 133.88, + "placementHeight" : 88.942, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 133.88, + "contentHeight" : 88.942, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 34.4 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]/PartyHeading[0]", + "entityName" : "PartyHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 379.157, + "computedY" : 611.326, + "placementX" : 379.157, + "placementY" : 611.326, + "placementWidth" : 35.173, + "placementHeight" : 9.765, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 35.173, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]/PartyAddress[1]", + "entityName" : "PartyAddress", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Parties[3]/SHIPTO[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 379.157, + "computedY" : 532.149, + "placementX" : 379.157, + "placementY" : 532.149, + "placementWidth" : 99.48, + "placementHeight" : 70.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 99.48, + "contentHeight" : 70.235, + "margin" : { + "top" : 8.942, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/LineItems[4]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 99.964, + "placementX" : 153.474, + "placementY" : 99.964, + "placementWidth" : 402.871, + "placementHeight" : 1011.964, + "startPage" : 0, + "endPage" : 1, + "contentWidth" : 402.871, + "contentHeight" : 1011.964, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]", + "entityName" : "Totals", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 306.404, + "computedY" : 108.172, + "placementX" : 306.404, + "placementY" : 108.172, + "placementWidth" : 249.941, + "placementHeight" : 66.174, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 66.174, + "margin" : { + "top" : 4.4, + "right" : 0.0, + "bottom" : 0.0, + "left" : 152.93 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "entityName" : "TotalsRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 156.237, + "placementX" : 306.404, + "placementY" : 156.237, + "placementWidth" : 249.941, + "placementHeight" : 18.108, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 18.108, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 159.439, + "placementX" : 348.204, + "placementY" : 159.439, + "placementWidth" : 46.299, + "placementHeight" : 11.704, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 46.299, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 159.439, + "placementX" : 293.404, + "placementY" : 159.439, + "placementWidth" : 249.941, + "placementHeight" : 11.704, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "entityName" : "TotalsRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 138.129, + "placementX" : 306.404, + "placementY" : 138.129, + "placementWidth" : 249.941, + "placementHeight" : 18.108, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 18.108, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 141.331, + "placementX" : 348.204, + "placementY" : 141.331, + "placementWidth" : 45.982, + "placementHeight" : 11.704, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 45.982, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalsRow[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 141.331, + "placementX" : 293.404, + "placementY" : 141.331, + "placementWidth" : 249.941, + "placementHeight" : 11.704, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "entityName" : "TotalDueBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 306.404, + "computedY" : 108.172, + "placementX" : 306.404, + "placementY" : 108.172, + "placementWidth" : 249.941, + "placementHeight" : 27.1, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 27.1, + "margin" : { + "top" : 2.857, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]/TotalsLabel[0]", + "entityName" : "TotalsLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 348.204, + "computedY" : 115.468, + "placementX" : 348.204, + "placementY" : 115.468, + "placementWidth" : 52.971, + "placementHeight" : 12.507, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 52.971, + "contentHeight" : 12.507, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Totals[5]/TotalDueBand[2]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 293.404, + "computedY" : 110.431, + "placementX" : 293.404, + "placementY" : 110.431, + "placementWidth" : 249.941, + "placementHeight" : 22.582, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 249.941, + "contentHeight" : 22.582, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/FooterRule[6]", + "entityName" : "FooterRule", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 105.172, + "placementX" : 153.474, + "placementY" : 105.172, + "placementWidth" : 402.871, + "placementHeight" : 1.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 402.871, + "contentHeight" : 1.0, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]", + "entityName" : "Closing", + "entityKind" : "RowNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 675.411, + "placementX" : 153.474, + "placementY" : 675.411, + "placementWidth" : 402.871, + "placementHeight" : 108.178, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 402.871, + "contentHeight" : 108.178, + "margin" : { + "top" : 12.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "entityName" : "Notes", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 153.474, + "computedY" : 687.309, + "placementX" : 153.474, + "placementY" : 687.309, + "placementWidth" : 167.03, + "placementHeight" : 96.281, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 167.03, + "contentHeight" : 96.281, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "entityName" : "SectionHead", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 153.474, + "computedY" : 758.79, + "placementX" : 153.474, + "placementY" : 758.79, + "placementWidth" : 167.03, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 167.03, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "entityName" : "Disc-notes", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 153.474, + "computedY" : 758.79, + "placementX" : 153.474, + "placementY" : 758.79, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 153.474, + "computedY" : 758.79, + "placementX" : 153.474, + "placementY" : 758.79, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 159.874, + "computedY" : 765.19, + "placementX" : 159.874, + "placementY" : 765.19, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/Disc-notes[0]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 159.874, + "computedY" : 765.19, + "placementX" : 159.874, + "placementY" : 765.19, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]/SectionHeading[1]", + "entityName" : "SectionHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/SectionHead[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 766.307, + "placementX" : 188.974, + "placementY" : 766.307, + "placementWidth" : 28.177, + "placementHeight" : 9.765, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 28.177, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "entityName" : "NotesBody", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 153.474, + "computedY" : 687.309, + "placementX" : 153.474, + "placementY" : 687.309, + "placementWidth" : 156.503, + "placementHeight" : 69.245, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 156.503, + "contentHeight" : 69.245, + "margin" : { + "top" : 2.236, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 35.5 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 726.589, + "placementX" : 188.974, + "placementY" : 726.589, + "placementWidth" : 103.794, + "placementHeight" : 29.965, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 103.794, + "contentHeight" : 29.965, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/Notes[0]/NotesBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 188.974, + "computedY" : 687.309, + "placementX" : 188.974, + "placementY" : 687.309, + "placementWidth" : 121.003, + "placementHeight" : 29.965, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 121.003, + "contentHeight" : 29.965, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "entityName" : "PaymentDetails", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 320.504, + "computedY" : 675.411, + "placementX" : 320.504, + "placementY" : 675.411, + "placementWidth" : 235.84, + "placementHeight" : 108.178, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 235.84, + "contentHeight" : 108.178, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.3 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "entityName" : "SectionHead", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 344.804, + "computedY" : 758.79, + "placementX" : 344.804, + "placementY" : 758.79, + "placementWidth" : 211.54, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 211.54, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "entityName" : "Disc-bank", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 344.804, + "computedY" : 758.79, + "placementX" : 344.804, + "placementY" : 758.79, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 344.804, + "computedY" : 758.79, + "placementX" : 344.804, + "placementY" : 758.79, + "placementWidth" : 24.8, + "placementHeight" : 24.8, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 24.8, + "contentHeight" : 24.8, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 351.204, + "computedY" : 765.19, + "placementX" : 351.204, + "placementY" : 765.19, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/Disc-bank[0]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 351.204, + "computedY" : 765.19, + "placementX" : 351.204, + "placementY" : 765.19, + "placementWidth" : 12.0, + "placementHeight" : 12.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 12.0, + "contentHeight" : 12.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]/SectionHeading[1]", + "entityName" : "SectionHeading", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/SectionHead[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 766.307, + "placementX" : 380.304, + "placementY" : 766.307, + "placementWidth" : 82.727, + "placementHeight" : 9.765, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 82.727, + "contentHeight" : 9.765, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "entityName" : "PaymentBody", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 344.804, + "computedY" : 675.411, + "placementX" : 344.804, + "placementY" : 675.411, + "placementWidth" : 211.54, + "placementHeight" : 81.143, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 211.54, + "contentHeight" : 81.143, + "margin" : { + "top" : 2.236, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 35.5 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentInstruction[0]", + "entityName" : "PaymentInstruction", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 748.58, + "placementX" : 380.304, + "placementY" : 748.58, + "placementWidth" : 121.183, + "placementHeight" : 7.974, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 121.183, + "contentHeight" : 7.974, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/AccountHolder[1]", + "entityName" : "AccountHolder", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 733.226, + "placementX" : 380.304, + "placementY" : 733.226, + "placementWidth" : 83.026, + "placementHeight" : 9.765, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 83.026, + "contentHeight" : 9.765, + "margin" : { + "top" : 5.589, + "right" : 0.0, + "bottom" : 6.831, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 716.199, + "placementX" : 380.304, + "placementY" : 716.199, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 716.902, + "placementX" : 380.304, + "placementY" : 716.902, + "placementWidth" : 17.087, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 17.087, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 717.932, + "placementX" : 433.904, + "placementY" : 717.932, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[2]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 716.902, + "placementX" : 444.104, + "placementY" : 716.902, + "placementWidth" : 38.198, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 38.198, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 706.002, + "placementX" : 380.304, + "placementY" : 706.002, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 706.705, + "placementX" : 380.304, + "placementY" : 706.705, + "placementWidth" : 34.245, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 34.245, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 707.735, + "placementX" : 433.904, + "placementY" : 707.735, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[3]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 706.705, + "placementX" : 444.104, + "placementY" : 706.705, + "placementWidth" : 26.31, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 26.31, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 695.805, + "placementX" : 380.304, + "placementY" : 695.805, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 696.509, + "placementX" : 380.304, + "placementY" : 696.509, + "placementWidth" : 43.022, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 43.022, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 697.538, + "placementX" : 433.904, + "placementY" : 697.538, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[4]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 696.509, + "placementX" : 444.104, + "placementY" : 696.509, + "placementWidth" : 29.205, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 29.205, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 685.608, + "placementX" : 380.304, + "placementY" : 685.608, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 686.312, + "placementX" : 380.304, + "placementY" : 686.312, + "placementWidth" : 15.07, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 15.07, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 687.342, + "placementX" : 433.904, + "placementY" : 687.342, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[5]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 686.312, + "placementX" : 444.104, + "placementY" : 686.312, + "placementWidth" : 89.789, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 89.789, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "entityName" : "PaymentField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 380.304, + "computedY" : 675.411, + "placementX" : 380.304, + "placementY" : 675.411, + "placementWidth" : 176.04, + "placementHeight" : 10.197, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 176.04, + "contentHeight" : 10.197, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 380.304, + "computedY" : 676.115, + "placementX" : 380.304, + "placementY" : 676.115, + "placementWidth" : 9.771, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 9.771, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/BankPipe[1]", + "entityName" : "BankPipe", + "entityKind" : "LineNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 433.904, + "computedY" : 677.145, + "placementX" : 433.904, + "placementY" : 677.145, + "placementWidth" : 1.0, + "placementHeight" : 6.73, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 1.0, + "contentHeight" : 6.73, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/Closing[7]/PaymentDetails[1]/PaymentBody[1]/PaymentField[6]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 444.104, + "computedY" : 676.115, + "placementX" : 444.104, + "placementY" : 676.115, + "placementWidth" : 29.918, + "placementHeight" : 8.79, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 29.918, + "contentHeight" : 8.79, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]", + "entityName" : "ClosingBanner", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]", + "childIndex" : 8, + "depth" : 2, + "layer" : 2, + "computedX" : 153.474, + "computedY" : 666.511, + "placementX" : 153.474, + "placementY" : 666.511, + "placementWidth" : 402.871, + "placementHeight" : 0.3, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 402.871, + "contentHeight" : 0.3, + "margin" : { + "top" : 8.6, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "entityName" : "BannerContent", + "entityKind" : "ShapeContainerNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 0.0, + "computedY" : 604.133, + "placementX" : 0.0, + "placementY" : 604.133, + "placementWidth" : 595.276, + "placementHeight" : 62.679, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 595.276, + "contentHeight" : 62.679, + "margin" : { + "top" : 0.0, + "right" : -38.931, + "bottom" : -62.379, + "left" : -153.474 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerBand[0]", + "entityName" : "BannerBand", + "entityKind" : "ShapeNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 0.0, + "computedY" : 604.133, + "placementX" : 0.0, + "placementY" : 604.133, + "placementWidth" : 595.276, + "placementHeight" : 62.679, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 595.276, + "contentHeight" : 62.679, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "entityName" : "Disc-heart", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 32.728, + "computedY" : 618.522, + "placementX" : 32.728, + "placementY" : 618.522, + "placementWidth" : 33.9, + "placementHeight" : 33.9, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 33.9, + "contentHeight" : 33.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/DiscFill[0]", + "entityName" : "DiscFill", + "entityKind" : "EllipseNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 32.728, + "computedY" : 618.522, + "placementX" : 32.728, + "placementY" : 618.522, + "placementWidth" : 33.9, + "placementHeight" : 33.9, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 33.9, + "contentHeight" : 33.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 41.678, + "computedY" : 627.472, + "placementX" : 41.678, + "placementY" : 627.472, + "placementWidth" : 16.0, + "placementHeight" : 16.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 16.0, + "contentHeight" : 16.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/Disc-heart[1]/SvgIcon[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 41.678, + "computedY" : 627.472, + "placementX" : 41.678, + "placementY" : 627.472, + "placementWidth" : 16.0, + "placementHeight" : 16.0, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 16.0, + "contentHeight" : 16.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "entityName" : "BannerLines", + "entityKind" : "SectionNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 80.628, + "computedY" : 622.394, + "placementX" : 80.628, + "placementY" : 622.394, + "placementWidth" : 179.909, + "placementHeight" : 26.156, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 179.909, + "contentHeight" : 26.156, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]/SignOff[0]", + "entityName" : "SignOff", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 80.628, + "computedY" : 636.846, + "placementX" : 80.628, + "placementY" : 636.846, + "placementWidth" : 179.909, + "placementHeight" : 11.704, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 179.909, + "contentHeight" : 11.704, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]/DueNotice[1]", + "entityName" : "DueNotice", + "entityKind" : "ParagraphNode", + "parentPath" : "LumaStudioInvoice[0]/ClosingBanner[8]/BannerContent[0]/BannerLines[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 80.628, + "computedY" : 622.394, + "placementX" : 80.628, + "placementY" : 622.394, + "placementWidth" : 135.165, + "placementHeight" : 11.347, + "startPage" : 2, + "endPage" : 2, + "contentWidth" : 135.165, + "contentHeight" : 11.347, + "margin" : { + "top" : 3.105, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/visual-baselines/invoice-v2-layered/luma_studio_invoice-page-0.png b/qa/src/test/resources/visual-baselines/invoice-v2-layered/luma_studio_invoice-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..05eeaea9b19a3daeb1f055e6e8957f8cb967a5da GIT binary patch literal 88556 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

e(nHwu~E83FoG*Y-~r_zF)9t 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 QAApz48%2q7F$4eq06M)Lxc~qF literal 0 HcmV?d00001 diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java new file mode 100644 index 000000000..aed7054c3 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioClosing.java @@ -0,0 +1,269 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.LineBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANK_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANK_PIPE_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANK_ROW_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANK_VALUE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANK_VALUE_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_CONTENT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_DISC_ICON_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_DISC_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_DUE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_FLOW_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_SIGN_OFF; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_TEXT_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CLOSING_DIVIDER_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CLOSING_LEFT_WEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTENT_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.HAIRLINE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.HAIRLINE_QUIET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.INK_SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LINE_PITCH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.NOTE_TEXT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_RIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PANEL_HIGHLIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_THICKNESS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SMALL_BOLD; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TABLE_TO_TOTALS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTALS_AMOUNT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTALS_LABEL_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTALS_ROW_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTALS_TO_RULE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTALS_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTAL_AMOUNT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTAL_DUE_AMOUNT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTAL_DUE_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTAL_DUE_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TOTAL_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_TOTAL_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.leading; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.money; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.disc; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.paragraph; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.sectionHead; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.tracked; + +/** + * What closes the sheet: the totals stack, the notes and payment pair, and + * the sign-off band. + */ +final class LumaStudioClosing { + + private LumaStudioClosing() { + } + + // -- totals ---------------------------------------------------------- + + /** + * The totals stack, right-aligned by its own left margin, closing on the + * filled total-due band. + */ + static void renderTotals(SectionBuilder section, InvoiceTotalsBlock totals, + String currencySymbol) { + section.name("Totals") + .keepTogether() + .spacing(0) + .margin(new DocumentInsets( + TABLE_TO_TOTALS, 0, 0, CONTENT_WIDTH - TOTALS_WIDTH)); + for (InvoiceTotalsBlock.Row row : totals.rows()) { + totalsRow(section, row.label(), money(currencySymbol, row.amount()), false); + } + totalsRow(section, totals.totalLabel(), + money(currencySymbol, totals.totalAmount()), true); + } + + private static void totalsRow(SectionBuilder section, String label, String amount, + boolean emphasised) { + section.addContainer(container -> { + container.name(emphasised ? "TotalDueBand" : "TotalsRow") + .rectangle(TOTALS_WIDTH, emphasised ? TOTAL_DUE_HEIGHT : TOTALS_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(tracked("TotalsLabel", label, + emphasised ? TOTAL_DUE_LABEL : TOTAL_LABEL, + TRACK_TOTAL_LABEL, + emphasised ? PANEL_HIGHLIGHT : PAPER), + TOTALS_LABEL_INSET, 0, LayerAlign.CENTER_LEFT) + .position(paragraph(amount, + emphasised ? TOTAL_DUE_AMOUNT : TOTAL_AMOUNT, + TextAlign.RIGHT), + -TOTALS_AMOUNT_INSET, 0, LayerAlign.CENTER_RIGHT); + if (emphasised) { + container.fillColor(PANEL_HIGHLIGHT) + .margin(new DocumentInsets(LINE_PITCH * 0.23, 0, 0, 0)); + } + }); + } + + /** The hairline that closes the totals and opens the pair below. */ + static void renderFooterRule(LineBuilder line) { + line.name("FooterRule") + .horizontal(CONTENT_WIDTH) + .thickness(RULE_THICKNESS) + .color(HAIRLINE) + .margin(new DocumentInsets(TOTALS_TO_RULE, 0, 0, 0)); + } + + // -- notes and payment ----------------------------------------------- + + /** The notes column: the disc heading, then the paragraphs under it. */ + static void renderNotes(SectionBuilder section, InvoiceNotesBlock notes) { + section.name("Notes").keepTogether().spacing(0); + sectionHead(section, LumaStudioIcons.NOTES, notes.heading(), + CONTENT_WIDTH * CLOSING_LEFT_WEIGHT); + SectionBuilder body = new SectionBuilder() + .name("NotesBody") + .spacing(LINE_PITCH * 0.75) + .padding(new DocumentInsets(0, 0, 0, SECTION_HEADING_OFFSET)) + .margin(new DocumentInsets(LINE_PITCH * 0.18, 0, 0, 0)); + for (String note : notes.paragraphs()) { + body.addParagraph(p -> p + .text(note) + .textStyle(NOTE_TEXT) + .lineSpacing(leading(LINE_PITCH * 0.91, NOTE_TEXT)) + .margin(DocumentInsets.zero())); + } + section.add(body.build()); + } + + /** + * The payment column: the disc heading, the instruction, who is paid, and + * the bank fields as label / pipe / value on one axis. + * + *

The divider between the two columns is this column's own left + * border, so it takes its height from what this column holds.

+ */ + static void renderPayment(SectionBuilder section, InvoicePaymentBlock payment) { + section.name("PaymentDetails") + .keepTogether() + .spacing(0) + .accentLeft(HAIRLINE_QUIET, RULE_THICKNESS) + .padding(new DocumentInsets(0, 0, 0, CLOSING_DIVIDER_INSET)); + double blockWidth = CONTENT_WIDTH * (1.0 - CLOSING_LEFT_WEIGHT) - CLOSING_DIVIDER_INSET; + sectionHead(section, LumaStudioIcons.BANK, payment.heading(), blockWidth); + + SectionBuilder body = new SectionBuilder() + .name("PaymentBody") + .spacing(0) + .padding(new DocumentInsets(0, 0, 0, SECTION_HEADING_OFFSET)) + .margin(new DocumentInsets(LINE_PITCH * 0.18, 0, 0, 0)); + body.addParagraph(p -> p + .name("PaymentInstruction") + .text(payment.instruction()) + .textStyle(NOTE_TEXT) + .lineSpacing(0) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .name("AccountHolder") + .text(payment.accountHolder()) + .textStyle(SMALL_BOLD) + .lineSpacing(0) + .margin(new DocumentInsets( + LINE_PITCH * 0.45, 0, LINE_PITCH * 0.55, 0))); + + double fieldWidth = blockWidth - SECTION_HEADING_OFFSET; + for (InvoicePaymentBlock.Field field : payment.fields()) { + body.addContainer(container -> container + .name("PaymentField") + .rectangle(fieldWidth, BANK_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(paragraph(field.label(), BANK_LABEL, TextAlign.LEFT)) + .position(pipe(), BANK_PIPE_OFFSET, 0, LayerAlign.CENTER_LEFT) + .position(paragraph(field.value(), BANK_VALUE, TextAlign.LEFT), + BANK_VALUE_OFFSET, 0, LayerAlign.CENTER_LEFT)); + } + section.add(body.build()); + } + + private static DocumentNode pipe() { + return new LineBuilder() + .name("BankPipe") + .vertical(BANK_ROW_HEIGHT * 0.66) + .thickness(0.8) + .color(ACCENT) + .margin(DocumentInsets.zero()) + .build(); + } + + // -- the closing band ------------------------------------------------ + + /** + * The sign-off band: the dark strip, the heart on its disc, and the two + * closing lines. + * + *

The strip is drawn by this block rather than left to the page + * background that closes every page. On a one-page invoice the two + * coincide exactly — the flow ends at the foot, so the block lands on the + * background band and nothing about the sheet changes. On a longer one the + * flow ends wherever the closing blocks end, and a block that relied on the + * background would set white words on pale paper. Carrying its own ground + * is what makes the sign-off legible on whatever page it lands.

+ * + *

The strip bleeds to both paper edges through negative side margins, + * and the ground is a layer rather than the container's fill: a container's + * own fill is dropped under a large negative margin. The block's height in + * the flow is almost nothing — it reaches down into the margin the page + * reserves for the band instead of pushing the flow.

+ * + *

It is flow content only because footer chrome carries text today: one + * size and one colour across three slots, and no glyph, where this band + * needs two faces and a disc. Once a footer zone can hold a node, the + * sign-off belongs in one — pinned to the foot of the last page, where the + * design draws it — and this block and its strip go away.

+ */ + static void renderBanner(SectionBuilder section, InvoicePaymentBlock payment) { + section.name("ClosingBanner").keepTogether().spacing(0); + SectionBuilder lines = new SectionBuilder().name("BannerLines").spacing(0); + lines.addParagraph(p -> p + .name("SignOff") + .text(payment.signOff()) + .textStyle(BANNER_SIGN_OFF) + .lineSpacing(0) + .margin(DocumentInsets.zero())) + .addParagraph(p -> p + .name("DueNotice") + .text(payment.dueNotice()) + .textStyle(BANNER_DUE) + .lineSpacing(0) + .margin(new DocumentInsets(LINE_PITCH * 0.25, 0, 0, 0))); + section.addContainer(container -> container + .name("BannerContent") + .rectangle(PAGE.width(), BANNER_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .margin(new DocumentInsets( + 0, -PAGE_MARGIN_RIGHT, BANNER_FLOW_HEIGHT - BANNER_HEIGHT, + -PAGE_MARGIN_LEFT)) + .position(band(), 0, 0, LayerAlign.TOP_LEFT, 0) + .position(disc(BANNER_DISC_SIZE, LumaStudioIcons.HEART, BANNER_DISC_ICON_SIZE), + BANNER_CONTENT_INSET, 0, LayerAlign.CENTER_LEFT, 1) + .position(lines.build(), BANNER_CONTENT_INSET + BANNER_TEXT_OFFSET, 0, + LayerAlign.CENTER_LEFT, 1)); + } + + /** The strip the sign-off is set on, paper edge to paper edge. */ + private static DocumentNode band() { + return new ShapeBuilder() + .name("BannerBand") + .size(PAGE.width(), BANNER_HEIGHT) + .fillColor(INK_SURFACE) + .margin(DocumentInsets.zero()) + .build(); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioIcons.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioIcons.java new file mode 100644 index 000000000..671fbdfc2 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioIcons.java @@ -0,0 +1,65 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.svg.SvgIcon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Classpath loader for the Luma Studio invoice marks: the three contact + * glyphs, the two section discs, the closing heart and the sidebar sprig. + * + *

They ship inside the templates artifact under + * {@code templates/invoice/luma-studio/icons/} as SVG, so they scale with the + * box they are drawn into rather than being resampled. Parsed icons are + * cached per token, so a repeated mark reads its file once per JVM.

+ * + *

Every mark here is chrome rather than data — this sheet draws the same + * ones whatever the invoice says — so the tokens are constants and no + * document names one.

+ */ +final class LumaStudioIcons { + + static final String PHONE = "phone"; + static final String EMAIL = "email"; + static final String WEBSITE = "website"; + static final String NOTES = "notes"; + static final String BANK = "bank"; + static final String HEART = "heart"; + static final String SPRIG = "sprig"; + + private static final String ICON_ROOT = "/templates/invoice/luma-studio/icons/"; + private static final Map CACHE = new ConcurrentHashMap<>(); + + private LumaStudioIcons() { + } + + /** + * Builds one mark at a given width; the height follows its ratio. + * + * @param token one of the constants on this class + * @param width the drawn width + * @return the icon node + */ + static DocumentNode icon(String token, double width) { + return CACHE.computeIfAbsent(token, LumaStudioIcons::read).node(width); + } + + private static SvgIcon read(String token) { + String resourcePath = ICON_ROOT + token + ".svg"; + try (InputStream input = LumaStudioIcons.class.getResourceAsStream(resourcePath)) { + if (input == null) { + throw new IllegalStateException("Missing luma studio invoice icon: " + resourcePath); + } + return SvgIcon.parse(new String(input.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to read luma studio invoice icon: " + resourcePath, e); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoice.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoice.java new file mode 100644 index 000000000..f951ab8c9 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioInvoice.java @@ -0,0 +1,223 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.api.PageBackgroundFill; +import com.demcha.compose.document.output.DocumentHeaderFooter; +import com.demcha.compose.document.output.DocumentHeaderFooterZone; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; + +import java.util.Currency; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BANNER_HEIGHT_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CLOSING_LEFT_WEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CLOSING_TO_BANNER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.FOLIO_ZONE_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.INK_SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MASTHEAD_LEFT_WEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MASTHEAD_RIGHT_WEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MICRO_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ON_DARK; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_RIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_TOP; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PARTIES_LEFT_WEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PARTIES_TO_TABLE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_TO_CLOSING; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_TO_PARTIES; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SIDEBAR_SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SIDEBAR_WIDTH_RATIO; + +/** + * Luma Studio Invoice — a studio invoice built around a cream sidebar: the + * brand lockup sits on a terracotta block at the top of that column, an + * ornament runs down the rest of it, and the billing sheet is set in the + * page beside them. + * + *

The sheet reads top to bottom: the sender over the document title and + * its metadata, the two parties across a rule, the priced service lines, the + * totals stack closing on a filled total-due band, and the notes and payment + * details side by side above the sign-off band at the foot.

+ * + *

Long invoices flow. The line-items table repeats its dark header on the + * next page, the totals stack and each closing block stay whole, and the paper + * tint, the cream sidebar column and the dark foot band are page backgrounds, + * so every page carries the same frame and the folio always has a dark ground. + * Every page reserves the band's height as bottom margin, so no row runs under + * it.

+ * + *

The sign-off carries its own strip rather than relying on that foot band. + * On a one-page invoice the two land together; on a longer one the flow ends + * where the closing blocks end, and a sign-off that relied on the background + * would set white words on pale paper. It is flow content only because footer + * chrome carries text today and this band needs two faces and a disc — once a + * footer zone can hold a node, the sign-off belongs in one.

+ * + *

The preset owns its session geometry — A4, the margins, the page fills + * and the folio zone — so callers leave the session unconfigured; a margin + * set by the caller is overwritten. It consumes the structured invoice model + * ({@link StructuredInvoiceDocumentSpec}): every heading, label and column + * title is content, so the same composition prints an invoice in another + * studio's wording without a fork. Amounts are prefixed with the mark of the + * data's own currency code. The preset draws in Carlito, Spectral and Tinos; + * its marks — the contact icons, the two closing-block badges, the heart on + * the band and the sidebar sprig — are template chrome and ship inside the + * artifact.

+ * + * @since 2.2.3 + */ +public final class LumaStudioInvoice { + + /** + * Stable template identifier. + */ + public static final String ID = "invoice-luma-studio"; + + /** + * Human-readable display name. + */ + public static final String DISPLAY_NAME = "Luma Studio Invoice"; + + private LumaStudioInvoice() { + } + + /** + * Builds the preset. + * + * @return ready-to-use template + */ + public static DocumentTemplate create() { + return new Template(); + } + + private record Template() implements DocumentTemplate { + + @Override + public String id() { + return ID; + } + + @Override + public String displayName() { + return DISPLAY_NAME; + } + + @Override + public void compose(DocumentSession document, StructuredInvoiceDocumentSpec spec) { + Objects.requireNonNull(document, "document"); + StructuredInvoiceData data = Objects.requireNonNull(spec, "spec").invoice(); + String currency = currencyMark(data.currencyCode()); + + renderChrome(document); + + document.pageFlow(page -> { + page.name("LumaStudioInvoice").spacing(0).padding(DocumentInsets.zero()); + + page.add(LumaStudioSidebar.render(data.brand())); + + page.addRow("Masthead", row -> row + .spacing(0) + .gap(0) + .weights(MASTHEAD_LEFT_WEIGHT, MASTHEAD_RIGHT_WEIGHT) + .addSection("SupplierHeader", + section -> LumaStudioMasthead.renderSupplier(section, data.supplier())) + .addSection("InvoiceHeader", + section -> LumaStudioMasthead.renderTitle(section, data.masthead()))); + + page.addLine(LumaStudioMasthead::renderRule); + + // The gap down to the table is this row's bottom margin rather + // than a spacer: a block of its own would take the parties' + // place at a page break and leave the gap stranded. + page.addRow("Parties", row -> row + .spacing(0) + .gap(0) + .weights(PARTIES_LEFT_WEIGHT, 1.0 - PARTIES_LEFT_WEIGHT) + .margin(new DocumentInsets(RULE_TO_PARTIES, 0, PARTIES_TO_TABLE, 0)) + .addSection("BillTo", + section -> LumaStudioMasthead.renderParty(section, data.billTo(), false)) + .addSection("ShipTo", + section -> LumaStudioMasthead.renderParty(section, data.shipTo(), true))); + + LumaStudioLines.render(page, data.serviceLines(), currency); + + page.addSection("Totals", + section -> LumaStudioClosing.renderTotals(section, data.totals(), currency)); + + page.addLine(LumaStudioClosing::renderFooterRule); + + page.addRow("Closing", row -> row + .spacing(0) + .gap(0) + .weights(CLOSING_LEFT_WEIGHT, 1.0 - CLOSING_LEFT_WEIGHT) + .margin(new DocumentInsets(RULE_TO_CLOSING, 0, 0, 0)) + .addSection("Notes", + section -> LumaStudioClosing.renderNotes(section, data.notes())) + .addSection("PaymentDetails", + section -> LumaStudioClosing.renderPayment(section, data.payment()))); + + page.addSection("ClosingBannerBlock", block -> { + block.spacing(0).margin(new DocumentInsets(CLOSING_TO_BANNER, 0, 0, 0)); + LumaStudioClosing.renderBanner(block, data.payment()); + }); + }); + } + + /** + * The page frame: the paper tint, the cream sidebar column and the + * dark foot band are page-ratio background fills, and the folio is + * FOOTER-zone chrome, so all four repeat on every page. + * + *

The bottom margin is the band's height, so the last row on a page + * stops above it rather than running underneath, and the sign-off block + * reaches down into that reserved space by its own negative bottom + * margin rather than pushing the flow onto another page.

+ */ + private static void renderChrome(DocumentSession document) { + document.pageSize(PAGE) + .margin(new DocumentInsets( + PAGE_MARGIN_TOP, PAGE_MARGIN_RIGHT, BANNER_HEIGHT, PAGE_MARGIN_LEFT)) + .pageBackgrounds(List.of( + PageBackgroundFill.fullPage(PAPER), + PageBackgroundFill.leftColumn(SIDEBAR_WIDTH_RATIO, SIDEBAR_SURFACE), + PageBackgroundFill.bottomBand(BANNER_HEIGHT_RATIO, INK_SURFACE))) + .footer(DocumentHeaderFooter.builder() + .zone(DocumentHeaderFooterZone.FOOTER) + .height((float) FOLIO_ZONE_HEIGHT) + .rightText("Page {page} of {pages}") + .fontSize((float) MICRO_SIZE) + .textColor(ON_DARK) + .showSeparator(false) + .build()); + } + + /** + * The mark amounts are written with, for the currency the data states. + * + *

The model carries the ISO code, and this sheet prints a symbol + * against every figure, so the code is the authority and the symbol is + * derived from it — two stated fields could disagree, and then the + * document would contradict itself. A code the platform does not know + * prints as itself rather than as nothing, so an amount is never left + * bare.

+ */ + private static String currencyMark(String currencyCode) { + if (currencyCode.isBlank()) { + return ""; + } + try { + return Currency.getInstance(currencyCode).getSymbol(Locale.ENGLISH); + } catch (IllegalArgumentException unknownCode) { + return currencyCode; + } + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java new file mode 100644 index 000000000..d1a2fc6d3 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioLines.java @@ -0,0 +1,182 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.TableBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.node.TextVerticalAlign; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.table.DocumentTableCell; +import com.demcha.compose.document.table.DocumentTableColumn; +import com.demcha.compose.document.table.DocumentTableStyle; +import com.demcha.compose.document.table.DocumentTableTextAnchor; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BODY; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BODY_BOLD; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTENT_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.HAIRLINE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.INK_SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_DESC; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_INDEX; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ITEM_TITLE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LINE_PITCH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_AMOUNT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_DESCRIPTION; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_HEADER_CENTRE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_HEADER_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_HEADER_RIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_INDEX; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAD_NUMERIC; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TABLE_HEADER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TABLE_RATIOS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TABLE_RULE_THICKNESS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_TABLE_HEADER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.cellStyle; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.headerStyle; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.leading; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.money; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.sans; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.tracked; + +/** + * The line-items table: a dark header band, one row per service line, and a + * hairline row between neighbours. + */ +final class LumaStudioLines { + + private LumaStudioLines() { + } + + static void render(PageFlowBuilder page, InvoiceServiceLines serviceLines, + String currencySymbol) { + page.addTable(table -> { + compose(table, serviceLines, currencySymbol); + // The dark header band is the region a continuation page needs: + // without this a second page carries five unlabelled money columns. + table.repeatHeader(); + }); + } + + private static void compose(TableBuilder table, InvoiceServiceLines serviceLines, + String currencySymbol) { + InvoiceServiceLines.Columns columns = serviceLines.columns(); + DocumentTableStyle centred = headerStyle( + DocumentTableTextAnchor.CENTER, PAD_HEADER_CENTRE); + table.name("LineItems") + .columns(column(0), column(1), column(2), column(3), column(4), column(5)) + .headerCells( + headerCell(columns.description(), TextAlign.LEFT) + .withStyle(headerStyle( + DocumentTableTextAnchor.CENTER_LEFT, PAD_HEADER_LEFT)) + .colSpan(2), + headerCell(columns.quantity(), TextAlign.CENTER), + headerCell(columns.unitPrice(), TextAlign.CENTER), + headerCell(columns.vat(), TextAlign.CENTER), + headerCell(columns.amount(), TextAlign.RIGHT) + .withStyle(headerStyle( + DocumentTableTextAnchor.CENTER_RIGHT, PAD_HEADER_RIGHT))) + .headerStyle(centred) + .padding(DocumentInsets.zero()) + .margin(DocumentInsets.zero()); + + for (InvoiceServiceLines.Line line : serviceLines.lines()) { + table.rowCells( + DocumentTableCell.text(String.format("%02d", line.lineNumber())) + .withStyle(cellStyle(ITEM_INDEX, + DocumentTableTextAnchor.CENTER_LEFT, PAD_INDEX)), + DocumentTableCell.node(description(line)) + .withStyle(cellStyle(BODY, + DocumentTableTextAnchor.CENTER_LEFT, PAD_DESCRIPTION)), + DocumentTableCell.text(quantity(line)) + .withStyle(cellStyle(BODY, + DocumentTableTextAnchor.CENTER, PAD_NUMERIC)), + DocumentTableCell.text(money(currencySymbol, line.unitPrice())) + .withStyle(cellStyle(BODY, + DocumentTableTextAnchor.CENTER, PAD_NUMERIC)), + DocumentTableCell.text(line.vatRate()) + .withStyle(cellStyle(BODY, + DocumentTableTextAnchor.CENTER, PAD_NUMERIC)), + DocumentTableCell.text(money(currencySymbol, line.amount())) + .withStyle(cellStyle(BODY_BOLD, + DocumentTableTextAnchor.CENTER_RIGHT, PAD_AMOUNT))); + itemRule(table); + } + } + + private static DocumentTableColumn column(int index) { + return DocumentTableColumn.fixed(CONTENT_WIDTH * TABLE_RATIOS[index]); + } + + /** + * A tracked header cell, written run by run like every other tracked line + * on the sheet — its gaps painted in the band's own dark, not the paper's. + */ + private static DocumentTableCell headerCell(String text, TextAlign align) { + return DocumentTableCell.node(tracked("HeaderCell", text, TABLE_HEADER, + TRACK_TABLE_HEADER, INK_SURFACE, align, TextVerticalAlign.DEFAULT)); + } + + /** + * A line's title over its description, as one node so the index cell has + * a single thing to centre against. + * + *

They are two paragraphs in a block rather than two runs of one + * paragraph: a single paragraph would need an invisible spacer sized to + * the remaining width to break after the title, and there is no + * compose-time text measurement to size one with. The block puts the + * same leading between them and lands in the same place.

+ */ + private static DocumentNode description(InvoiceServiceLines.Line line) { + double gap = leading(LINE_PITCH * 0.83, ITEM_DESC); + SectionBuilder block = new SectionBuilder(); + block.name("ItemDescription").spacing(0) + .padding(DocumentInsets.zero()) + .margin(DocumentInsets.zero()); + block.addParagraph(p -> p + .name("ItemTitle") + .text(line.title()) + .textStyle(ITEM_TITLE) + .align(TextAlign.LEFT) + .lineSpacing(gap) + .margin(DocumentInsets.zero())); + block.addParagraph(p -> p + .name("ItemBody") + .text(line.description()) + .textStyle(ITEM_DESC) + .align(TextAlign.LEFT) + .lineSpacing(gap) + .margin(new DocumentInsets(gap, 0, 0, 0))); + return block.build(); + } + + /** + * How much was delivered, written plainly: a whole number loses its + * decimals, because a sheet that says "1" should not say "1.00". + */ + private static String quantity(InvoiceServiceLines.Line line) { + return line.quantity().stripTrailingZeros().toPlainString(); + } + + /** The hairline under a row, drawn as a row of its own. */ + private static void itemRule(TableBuilder table) { + DocumentTableStyle rule = DocumentTableStyle.builder() + .padding(DocumentInsets.zero()) + .fillColor(HAIRLINE) + .stroke(DocumentStroke.of(HAIRLINE, 0)) + .textStyle(sans(TABLE_RULE_THICKNESS, DocumentTextDecoration.DEFAULT, HAIRLINE)) + .textAnchor(DocumentTableTextAnchor.CENTER) + .lineSpacing(0) + .build(); + table.rowCells( + DocumentTableCell.text("").withStyle(rule), + DocumentTableCell.text("").withStyle(rule), + DocumentTableCell.text("").withStyle(rule), + DocumentTableCell.text("").withStyle(rule), + DocumentTableCell.text("").withStyle(rule), + DocumentTableCell.text("").withStyle(rule)); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java new file mode 100644 index 000000000..c1dfb32d0 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioMasthead.java @@ -0,0 +1,276 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.LineBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.node.TextVerticalAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.BODY; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTACT_ICON_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTACT_ROW_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.CONTACT_TEXT_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.HAIRLINE_QUIET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.INVOICE_TITLE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LINE_PITCH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.META_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.META_ROW_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.META_VALUE_SPLIT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.META_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MASTHEAD_TO_RULE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MICRO_MUTED; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PARTIES_DIVIDER_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.RULE_THICKNESS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SUPPLIER_NAME; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SUPPLIER_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TEXT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TEXT_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TITLE_BLOCK_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TITLE_CAP_INSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TITLE_RULE_THICKNESS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TITLE_RULE_TO_METADATA; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TITLE_RULE_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_META_LABEL; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_SECTION_HEADING; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_TITLE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.leading; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.linkedParagraph; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.paragraph; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.tracked; + +/** + * The top of the sheet: the sender's block on the left, the title and its + * metadata on the right, and the two party blocks below the rule. + */ +final class LumaStudioMasthead { + + /** The break this sheet stacks address lines on. */ + private static final String NEWLINE = String.valueOf((char) 10); + + /** A parenthesised trunk prefix, which an international dial target drops. */ + private static final Pattern TRUNK_PREFIX = Pattern.compile("\\(0+\\)"); + + private LumaStudioMasthead() { + } + + // -- supplier -------------------------------------------------------- + + /** + * The sender: the legal name, the address, the contact rows behind their + * marks, and the registration line. + * + *

The channels carry {@code tel:} and {@code mailto:} targets built + * from the values, and the website its own {@code https:} — so a reader + * can act on them and the document does not carry each address twice.

+ */ + static void renderSupplier(SectionBuilder section, InvoiceContactBlock supplier) { + section.name("SupplierHeader") + .spacing(0) + .padding(new DocumentInsets(0, 0, 0, TEXT_INSET)); + section.addParagraph(p -> p + .name("SupplierName") + .text(supplier.legalName()) + .textStyle(SUPPLIER_NAME) + .lineSpacing(0) + .margin(DocumentInsets.zero())); + section.addParagraph(p -> p + .name("SupplierAddress") + .text(String.join(NEWLINE, supplier.addressLines())) + .textStyle(BODY) + .lineSpacing(leading(LINE_PITCH, BODY)) + .margin(new DocumentInsets(LINE_PITCH * 0.50, 0, 0, 0))); + + SectionBuilder contacts = new SectionBuilder() + .name("ContactRows") + .spacing(0) + .margin(new DocumentInsets(LINE_PITCH * 0.79, 0, 0, 0)); + contactRow(contacts, LumaStudioIcons.PHONE, supplier.phone(), + telUri(supplier.phone())); + contactRow(contacts, LumaStudioIcons.EMAIL, supplier.email(), + supplier.email().isBlank() ? null : "mailto:" + supplier.email()); + contactRow(contacts, LumaStudioIcons.WEBSITE, supplier.website(), + webUri(supplier.website())); + section.add(contacts.build()); + + section.addParagraph(p -> p + .name("Registration") + .text(registrationLine(supplier)) + .textStyle(MICRO_MUTED) + .lineSpacing(0) + .margin(new DocumentInsets(LINE_PITCH * 0.84, 0, 0, 0))); + } + + private static void contactRow(SectionBuilder section, String iconToken, + String value, String href) { + section.addContainer(container -> container + .name("ContactRow") + .rectangle(SUPPLIER_WIDTH, CONTACT_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(LumaStudioIcons.icon(iconToken, CONTACT_ICON_SIZE)) + .position(linkedParagraph(value, href, BODY), CONTACT_TEXT_OFFSET, 0, + LayerAlign.CENTER_LEFT)); + } + + /** + * The registration line: one labelled number, or both behind a pale pipe + * when the sender carries a tax registration as well. + */ + private static String registrationLine(InvoiceContactBlock supplier) { + String first = pair(supplier.registrationLabel(), supplier.registrationNumber()); + String second = pair(supplier.taxRegistrationLabel(), supplier.taxRegistrationNumber()); + if (first.isBlank()) { + return second; + } + return second.isBlank() ? first : first + " | " + second; + } + + private static String pair(String label, String value) { + if (label.isBlank() && value.isBlank()) { + return ""; + } + return label.isBlank() ? value : label + " " + value; + } + + /** + * The dial target for a phone number: its digits, keeping a leading + * {@code +} so an international number stays international. + * + *

A parenthesised trunk prefix — the {@code (0)} in + * {@code +44 (0)20 7946 0832} — is the digit a caller drops when dialling + * from abroad, so it is dropped here too. A parenthesised area code is + * not, which is why only an all-zero group goes.

+ */ + private static String telUri(String phone) { + String dialled = TRUNK_PREFIX.matcher(phone).replaceAll(""); + String digits = dialled.replaceAll("[^0-9]", ""); + return digits.isEmpty() + ? null + : "tel:" + (phone.trim().startsWith("+") ? "+" : "") + digits; + } + + /** A website target: what the document wrote, given a scheme if it has none. */ + private static String webUri(String website) { + if (website.isBlank()) { + return null; + } + return website.startsWith("http") ? website : "https://" + website; + } + + // -- title and metadata ---------------------------------------------- + + /** + * The document title over its accent rule, and the metadata rows beneath. + * + *

The title and the rule share a band so the rule sits at the block's + * foot whatever the title measures: the title is seated to the top of the + * band and the rule anchored to its bottom.

+ */ + static void renderTitle(SectionBuilder section, InvoiceMasthead masthead) { + section.name("InvoiceHeader").spacing(0); + section.addContainer(container -> container + .name("InvoiceTitleBlock") + .rectangle(META_WIDTH, TITLE_BLOCK_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .position(tracked("InvoiceTitle", masthead.title(), INVOICE_TITLE, + TRACK_TITLE, PAPER, TextVerticalAlign.TOP), + 0, TITLE_CAP_INSET, LayerAlign.TOP_LEFT) + .position(new LineBuilder() + .name("TitleRule") + .horizontal(TITLE_RULE_WIDTH) + .thickness(TITLE_RULE_THICKNESS) + .color(ACCENT) + .margin(DocumentInsets.zero()) + .build(), + 0, 0, LayerAlign.BOTTOM_LEFT) + .margin(new DocumentInsets(0, 0, TITLE_RULE_TO_METADATA, 0))); + for (InvoiceMasthead.Entry entry : masthead.entries()) { + section.addContainer(container -> container + .name("MetadataRow") + .rectangle(META_WIDTH, META_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(tracked("MetaLabel", entry.label(), META_LABEL, + TRACK_META_LABEL, PAPER)) + .position(paragraph(entry.value(), BODY, TextAlign.LEFT), + META_WIDTH * META_VALUE_SPLIT, 0, LayerAlign.CENTER_LEFT)); + } + } + + // -- the rule between the masthead and the parties --------------------- + + /** + * The masthead rule, which stops at the text column rather than running + * to the table's edge — the only rule on the sheet that does. + * + * @param line the rule to draw + */ + static void renderRule(LineBuilder line) { + line.name("HeaderRule") + .horizontal(TEXT_WIDTH) + .thickness(RULE_THICKNESS) + .color(HAIRLINE_QUIET) + .margin(new DocumentInsets(MASTHEAD_TO_RULE, 0, 0, TEXT_INSET)); + } + + // -- parties --------------------------------------------------------- + + /** + * One party block: the tracked heading over its address. + * + * @param section the host column + * @param party the recipient to draw + * @param divided true for the right-hand block, which carries the + * hairline between the two as its own left border + */ + static void renderParty(SectionBuilder section, InvoiceRecipient party, boolean divided) { + // Named after the heading it draws, so the two columns are told apart + // in a layout snapshot; a party that states no heading still needs a + // name, so it falls back to its role. + String heading = party.heading(); + section.name(heading.isBlank() + ? (divided ? "ShipTo" : "BillTo") + : heading.replace(" ", "")).spacing(0); + if (divided) { + section.accentLeft(HAIRLINE_QUIET, RULE_THICKNESS) + .padding(new DocumentInsets(0, 0, 0, PARTIES_DIVIDER_INSET)); + } else { + section.padding(new DocumentInsets(0, 0, 0, TEXT_INSET)); + } + section.add(tracked("PartyHeading", heading, SECTION_HEADING, + TRACK_SECTION_HEADING, PAPER)) + .addParagraph(p -> p + .name("PartyAddress") + .text(String.join(NEWLINE, addressOf(party))) + .textStyle(BODY) + .lineSpacing(leading(LINE_PITCH * 1.183, BODY)) + .margin(new DocumentInsets(LINE_PITCH * 0.72, 0, 0, 0))); + } + + /** + * The lines a party is drawn as: the name, the subline when it carries + * one, then the address. This design sets them as one block, so a + * recipient that names an attention line gets it on the second line. + */ + private static List addressOf(InvoiceRecipient party) { + List lines = new ArrayList<>(); + if (!party.name().isBlank()) { + lines.add(party.name()); + } + if (!party.subline().isBlank()) { + lines.add(party.subline()); + } + lines.addAll(party.addressLines()); + return lines; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java new file mode 100644 index 000000000..4d3d39b2b --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioSidebar.java @@ -0,0 +1,170 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.EllipseBuilder; +import com.demcha.compose.document.dsl.LineBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.ShapeBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.node.TextVerticalAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentCornerRadius; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LOCKUP_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LOCKUP_RULE_THICKNESS; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LOCKUP_RULE_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.LOCKUP_RULE_Y; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MONOGRAM_BOTTOM; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MONOGRAM_BOTTOM_Y; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MONOGRAM_TOP; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.MONOGRAM_TOP_Y; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ON_ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_ARCH_HEIGHT_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_ARCH_LEFT_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_ARCH_WIDTH_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_DISC_LEFT_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_DISC_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_DISC_TOP_FACTOR; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_SPRIG_LEFT_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_SPRIG_TOP_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_SPRIG_WIDTH_RATIO; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ORNAMENT_TINT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAGE_MARGIN_TOP; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SIDEBAR_BRAND_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SIDEBAR_STUB_HEIGHT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SIDEBAR_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TAGLINE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TAGLINE_Y; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_WORDMARK; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.WORDMARK; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.WORDMARK_Y; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioWidgets.tracked; + +/** + * The sidebar: one node with one negative margin. + * + *

The body flow's left margin excludes the column, so the lockup and the + * ornament are composed into a single overflowing stub pulled back over the + * margin — both of its offsets are the page margins themselves. The + * terracotta brand block is content rather than a page background, painted + * above the ornament in the stub's z-order, because the ornament's disc is a + * circle far larger than the column and the block has to cover its top.

+ */ +final class LumaStudioSidebar { + + private LumaStudioSidebar() { + } + + static DocumentNode render(InvoiceBrand brand) { + return new ShapeContainerBuilder() + .name("Sidebar") + .rectangle(SIDEBAR_WIDTH, SIDEBAR_STUB_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .margin(new DocumentInsets( + -PAGE_MARGIN_TOP, 0, PAGE_MARGIN_TOP - SIDEBAR_STUB_HEIGHT, + -PAGE_MARGIN_LEFT)) + .position(ornament(), 0, SIDEBAR_BRAND_HEIGHT, LayerAlign.TOP_LEFT, 0) + .position(brandBlock(), 0, 0, LayerAlign.TOP_LEFT, 1) + .position(lockup(brand), 0, 0, LayerAlign.TOP_LEFT, 2) + .build(); + } + + private static DocumentNode brandBlock() { + return new ShapeBuilder() + .name("BrandBlock") + .size(SIDEBAR_WIDTH, SIDEBAR_BRAND_HEIGHT) + .fillColor(ACCENT) + .margin(DocumentInsets.zero()) + .build(); + } + + /** + * The lockup: the two monogram lines, a short rule, the tracked wordmark + * and the tagline, each seated at its own measured height. + */ + private static DocumentNode lockup(InvoiceBrand brand) { + return new ShapeContainerBuilder() + .name("BrandLockup") + .rectangle(SIDEBAR_WIDTH, SIDEBAR_BRAND_HEIGHT) + .clipPolicy(ClipPolicy.CLIP_PATH) + .position(seated(brand.monogramTop(), MONOGRAM_TOP), + LOCKUP_LEFT, MONOGRAM_TOP_Y, LayerAlign.TOP_LEFT) + .position(seated(brand.monogramBottom(), MONOGRAM_BOTTOM), + LOCKUP_LEFT, MONOGRAM_BOTTOM_Y, LayerAlign.TOP_LEFT) + .position(new LineBuilder() + .name("LockupRule") + .horizontal(LOCKUP_RULE_WIDTH) + .thickness(LOCKUP_RULE_THICKNESS) + .color(ON_ACCENT) + .margin(DocumentInsets.zero()) + .build(), + LOCKUP_LEFT, LOCKUP_RULE_Y, LayerAlign.TOP_LEFT) + .position(tracked("Wordmark", brand.name(), WORDMARK, + TRACK_WORDMARK, ACCENT, TextVerticalAlign.TOP), + LOCKUP_LEFT, WORDMARK_Y, LayerAlign.TOP_LEFT) + .position(seated(brand.tagline(), TAGLINE), + LOCKUP_LEFT, TAGLINE_Y, LayerAlign.TOP_LEFT) + .build(); + } + + private static DocumentNode seated(String text, DocumentTextStyle style) { + return new ParagraphBuilder() + .text(text) + .textStyle(style) + .align(TextAlign.LEFT) + .verticalAlign(TextVerticalAlign.TOP) + .lineSpacing(0) + .margin(DocumentInsets.zero()) + .build(); + } + + /** + * The art below the brand block: a tinted quarter-disc, an arch at the + * foot, and the sprig between them. + * + *

The container clips to its bounds rather than to its path: the disc + * is a circle far wider than the column, and a rectangular container's + * path clip does not cut its positioned layers.

+ */ + private static DocumentNode ornament() { + double columnHeight = PAGE.height() - SIDEBAR_BRAND_HEIGHT; + double discDiameter = PAGE.width() * ORNAMENT_DISC_RATIO; + double archWidth = PAGE.width() * ORNAMENT_ARCH_WIDTH_RATIO; + + DocumentNode disc = new EllipseBuilder() + .name("OrnamentDisc") + .circle(discDiameter) + .fillColor(ORNAMENT_TINT) + .margin(DocumentInsets.zero()) + .build(); + DocumentNode arch = new ShapeBuilder() + .name("OrnamentArch") + .size(archWidth, PAGE.height() * ORNAMENT_ARCH_HEIGHT_RATIO) + .cornerRadius(DocumentCornerRadius.top(archWidth / 2.0)) + .fillColor(ACCENT) + .margin(DocumentInsets.zero()) + .build(); + + return new ShapeContainerBuilder() + .name("SidebarOrnament") + .rectangle(SIDEBAR_WIDTH, columnHeight) + .clipPolicy(ClipPolicy.CLIP_BOUNDS) + .position(disc, PAGE.width() * ORNAMENT_DISC_LEFT_RATIO, + discDiameter * ORNAMENT_DISC_TOP_FACTOR, LayerAlign.TOP_LEFT) + .position(arch, PAGE.width() * ORNAMENT_ARCH_LEFT_RATIO, 0, + LayerAlign.BOTTOM_LEFT) + .position(LumaStudioIcons.icon(LumaStudioIcons.SPRIG, + PAGE.width() * ORNAMENT_SPRIG_WIDTH_RATIO), + PAGE.width() * ORNAMENT_SPRIG_LEFT_RATIO, + PAGE.height() * ORNAMENT_SPRIG_TOP_RATIO, LayerAlign.TOP_LEFT) + .build(); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioStyles.java new file mode 100644 index 000000000..bbc203b99 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioStyles.java @@ -0,0 +1,356 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.table.DocumentTableStyle; +import com.demcha.compose.document.table.DocumentTableTextAnchor; +import com.demcha.compose.document.templates.core.text.TextStyles; +import com.demcha.compose.font.FontName; + +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.util.Locale; + +/** + * The measured geometry, palette and type scale of the Luma Studio invoice. + * + *

Two left edges, and that is deliberate

+ * + *

The body text column starts further in than the line-item table, the two + * rules that bracket the closing block and the notes disc. The table's own + * first-cell padding brings its text back onto the text edge, so the text runs + * straight down the page while the table and its rules sit one cell padding + * wider. {@link #PAGE_MARGIN_LEFT} is therefore the table's edge, and + * every text block carries {@link #TEXT_INSET} as its left padding — one + * property per block rather than an inset restated on every paragraph.

+ * + *

Leading is authored as a pitch

+ * + *

{@link #leading} takes the distance the design draws between line tops + * and subtracts the line box the type already fills. The ratio is per family, + * because the three faces here set different line boxes at the same size — + * one shared constant would be wrong by a line per block on two of them.

+ */ +final class LumaStudioStyles { + + private LumaStudioStyles() { + } + + // -- page ------------------------------------------------------------ + + static final DocumentPageSize PAGE = DocumentPageSize.A4; + + static final double SIDEBAR_WIDTH_RATIO = 0.2218; + static final double SIDEBAR_WIDTH = PAGE.width() * SIDEBAR_WIDTH_RATIO; + static final double SIDEBAR_BRAND_HEIGHT_RATIO = 0.24614; + static final double SIDEBAR_BRAND_HEIGHT = PAGE.height() * SIDEBAR_BRAND_HEIGHT_RATIO; + + static final double PAGE_MARGIN_LEFT = PAGE.width() * 0.25782; + static final double PAGE_MARGIN_RIGHT = PAGE.width() * 0.0654; + static final double PAGE_MARGIN_TOP = 46.3; + static final double CONTENT_WIDTH = PAGE.width() - PAGE_MARGIN_LEFT - PAGE_MARGIN_RIGHT; + static final double TEXT_INSET = PAGE.width() * 0.01232; + static final double TEXT_WIDTH = CONTENT_WIDTH - TEXT_INSET; + + /** The stub the sidebar is drawn from: it carries art, not height. */ + static final double SIDEBAR_STUB_HEIGHT = 0.4; + static final double BANNER_FLOW_HEIGHT = 0.3; + static final double BANNER_HEIGHT_RATIO = 0.07445; + static final double BANNER_HEIGHT = PAGE.height() * BANNER_HEIGHT_RATIO; + static final double FOLIO_ZONE_HEIGHT = 30.5; + + // -- block rhythm ---------------------------------------------------- + + static final double MASTHEAD_TO_RULE = 13.0; + static final double RULE_TO_PARTIES = 12.0; + static final double PARTIES_TO_TABLE = 12.9; + static final double TABLE_TO_TOTALS = 4.4; + static final double TOTALS_TO_RULE = 2.0; + static final double RULE_TO_CLOSING = 12.0; + static final double CLOSING_TO_BANNER = 8.6; + + // -- the column grid ------------------------------------------------- + + static final double MASTHEAD_LEFT_WEIGHT = 0.5868; + static final double MASTHEAD_RIGHT_WEIGHT = 1.0 - MASTHEAD_LEFT_WEIGHT; + static final double SUPPLIER_WIDTH = CONTENT_WIDTH * MASTHEAD_LEFT_WEIGHT - TEXT_INSET; + static final double META_WIDTH = CONTENT_WIDTH * MASTHEAD_RIGHT_WEIGHT; + static final double PARTIES_LEFT_WEIGHT = 0.4748; + static final double CLOSING_LEFT_WEIGHT = 0.4146; + static final double[] TABLE_RATIOS = {0.0630, 0.3124, 0.0980, 0.2395, 0.0742, 0.2129}; + static final double TOTALS_WIDTH = CONTENT_WIDTH * 0.6204; + + // -- type ------------------------------------------------------------ + + static final FontName SANS = FontName.CARLITO; + static final FontName DISPLAY_SERIF = FontName.SPECTRAL; + static final FontName TEXT_SERIF = FontName.TINOS; + + static final double BODY_SIZE = 9.4; + static final double LINE_PITCH = 12.42; + static final double SMALL_SIZE = BODY_SIZE * 0.851; + static final double MICRO_SIZE = BODY_SIZE * 0.766; + static final double SUPPLIER_NAME_SIZE = BODY_SIZE * 1.170; + static final double TITLE_SIZE = BODY_SIZE * 3.883; + static final double TOTAL_DUE_SIZE = BODY_SIZE * 1.968; + static final double MONOGRAM_TOP_SIZE = BODY_SIZE * 6.170; + static final double MONOGRAM_BOTTOM_SIZE = BODY_SIZE * 3.300; + static final double WORDMARK_SIZE = BODY_SIZE * 0.830; + static final double TAGLINE_SIZE = BODY_SIZE * 0.773; + + // -- band heights ---------------------------------------------------- + + static final double CONTACT_ROW_HEIGHT = LINE_PITCH * 1.159; + static final double META_ROW_HEIGHT = LINE_PITCH * 1.409; + static final double TOTALS_ROW_HEIGHT = LINE_PITCH * 1.458; + static final double TOTAL_DUE_HEIGHT = LINE_PITCH * 2.182; + static final double BANK_ROW_HEIGHT = LINE_PITCH * 0.821; + + // -- ornaments and offsets ------------------------------------------- + + static final double CONTACT_ICON_SIZE = 8.6; + static final double CONTACT_TEXT_OFFSET = 21.0; + static final double META_VALUE_SPLIT = 0.6134; + static final double SECTION_DISC_SIZE = 24.8; + static final double SECTION_DISC_ICON_SIZE = 12.0; + static final double SECTION_HEADING_OFFSET = 35.5; + static final double BANK_PIPE_OFFSET = 53.6; + static final double BANK_VALUE_OFFSET = 63.8; + static final double PARTIES_DIVIDER_INSET = 34.4; + static final double CLOSING_DIVIDER_INSET = 24.3; + static final double TITLE_RULE_WIDTH = 58.7; + static final double TITLE_RULE_THICKNESS = 1.7; + static final double TITLE_BLOCK_HEIGHT = 45.7; + static final double TITLE_CAP_INSET = 3.4; + static final double TITLE_RULE_TO_METADATA = 15.3; + static final double TOTALS_LABEL_INSET = 41.8; + static final double TOTALS_AMOUNT_INSET = 13.0; + static final double RULE_THICKNESS = 0.56; + static final double TABLE_RULE_THICKNESS = 0.62; + + static final double LOCKUP_LEFT = PAGE.width() * 0.05592; + static final double LOCKUP_RULE_WIDTH = PAGE.width() * 0.03412; + static final double LOCKUP_RULE_THICKNESS = 1.7; + static final double MONOGRAM_TOP_Y = PAGE.height() * 0.04561; + static final double MONOGRAM_BOTTOM_Y = PAGE.height() * 0.10597; + static final double LOCKUP_RULE_Y = PAGE.height() * 0.16097; + static final double WORDMARK_Y = PAGE.height() * 0.18645; + static final double TAGLINE_Y = PAGE.height() * 0.20456; + + static final double ORNAMENT_DISC_RATIO = 0.34502; + static final double ORNAMENT_DISC_LEFT_RATIO = 0.02938; + static final double ORNAMENT_DISC_TOP_FACTOR = -0.48; + static final double ORNAMENT_ARCH_WIDTH_RATIO = 0.19526; + static final double ORNAMENT_ARCH_HEIGHT_RATIO = 0.28102; + static final double ORNAMENT_ARCH_LEFT_RATIO = 0.02654; + static final double ORNAMENT_SPRIG_WIDTH_RATIO = 0.16000; + static final double ORNAMENT_SPRIG_LEFT_RATIO = 0.02180; + static final double ORNAMENT_SPRIG_TOP_RATIO = 0.30500; + + static final double BANNER_CONTENT_INSET = PAGE.width() * 0.05498; + static final double BANNER_DISC_SIZE = 33.9; + static final double BANNER_DISC_ICON_SIZE = 16.0; + static final double BANNER_TEXT_OFFSET = 47.9; + + // -- table padding --------------------------------------------------- + + static final double TABLE_CELL_PAD_X = 7.33; + static final double TABLE_CELL_PAD_Y = 9.3; + static final double TABLE_HEADER_PAD_Y = 7.2; + static final double TABLE_TIGHT_PAD_X = 2.0; + static final double TABLE_AMOUNT_PAD_RIGHT = 15.2; + + static final DocumentInsets PAD_INDEX = new DocumentInsets( + TABLE_CELL_PAD_Y, TABLE_TIGHT_PAD_X, TABLE_CELL_PAD_Y, TABLE_CELL_PAD_X); + static final DocumentInsets PAD_DESCRIPTION = new DocumentInsets( + TABLE_CELL_PAD_Y, TABLE_TIGHT_PAD_X, TABLE_CELL_PAD_Y, TABLE_CELL_PAD_X * 0.93); + static final DocumentInsets PAD_NUMERIC = DocumentInsets.symmetric( + TABLE_CELL_PAD_Y, TABLE_TIGHT_PAD_X); + static final DocumentInsets PAD_AMOUNT = new DocumentInsets( + TABLE_CELL_PAD_Y, TABLE_AMOUNT_PAD_RIGHT, TABLE_CELL_PAD_Y, TABLE_TIGHT_PAD_X); + static final DocumentInsets PAD_HEADER_LEFT = new DocumentInsets( + TABLE_HEADER_PAD_Y, TABLE_TIGHT_PAD_X, TABLE_HEADER_PAD_Y, TABLE_CELL_PAD_X); + static final DocumentInsets PAD_HEADER_CENTRE = DocumentInsets.symmetric( + TABLE_HEADER_PAD_Y, TABLE_TIGHT_PAD_X); + static final DocumentInsets PAD_HEADER_RIGHT = new DocumentInsets( + TABLE_HEADER_PAD_Y, TABLE_AMOUNT_PAD_RIGHT, TABLE_HEADER_PAD_Y, TABLE_TIGHT_PAD_X); + + // -- palette --------------------------------------------------------- + + static final DocumentColor ACCENT = DocumentColor.rgb(163, 78, 51); + static final DocumentColor INK_SURFACE = DocumentColor.rgb(46, 46, 46); + static final DocumentColor INK = DocumentColor.rgb(51, 51, 51); + static final DocumentColor MUTED = DocumentColor.rgb(90, 87, 80); + static final DocumentColor SIDEBAR_SURFACE = DocumentColor.rgb(243, 236, 224); + static final DocumentColor ORNAMENT_TINT = DocumentColor.rgb(219, 199, 182); + static final DocumentColor PAPER = DocumentColor.rgb(251, 250, 249); + static final DocumentColor PANEL_HIGHLIGHT = DocumentColor.rgb(232, 222, 213); + static final DocumentColor HAIRLINE = DocumentColor.rgb(221, 212, 202); + static final DocumentColor HAIRLINE_QUIET = DocumentColor.rgb(211, 202, 189); + static final DocumentColor ON_DARK = DocumentColor.WHITE; + static final DocumentColor ON_ACCENT = DocumentColor.rgb(247, 240, 231); + + // -- text styles ----------------------------------------------------- + + static final DocumentTextStyle BODY = sans(BODY_SIZE, DocumentTextDecoration.DEFAULT, INK); + static final DocumentTextStyle BODY_BOLD = sans(BODY_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle SMALL_BOLD = + sans(SMALL_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle MICRO_MUTED = + sans(MICRO_SIZE, DocumentTextDecoration.DEFAULT, MUTED); + static final DocumentTextStyle SUPPLIER_NAME = + sans(SUPPLIER_NAME_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle META_LABEL = + sans(SMALL_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle SECTION_HEADING = + sans(SMALL_SIZE, DocumentTextDecoration.BOLD, ACCENT); + static final DocumentTextStyle TABLE_HEADER = + sans(SMALL_SIZE, DocumentTextDecoration.BOLD, ON_DARK); + static final DocumentTextStyle ITEM_INDEX = + sans(BODY_SIZE * 1.15, DocumentTextDecoration.DEFAULT, ACCENT); + static final DocumentTextStyle ITEM_TITLE = + sans(BODY_SIZE * 0.875, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle ITEM_DESC = + serif(BODY_SIZE * 0.780, DocumentTextDecoration.ITALIC, MUTED); + static final DocumentTextStyle TOTAL_LABEL = + sans(BODY_SIZE * 1.02, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle TOTAL_AMOUNT = + sans(BODY_SIZE * 1.02, DocumentTextDecoration.DEFAULT, INK); + static final DocumentTextStyle TOTAL_DUE_LABEL = + sans(BODY_SIZE * 1.09, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle TOTAL_DUE_AMOUNT = + sans(TOTAL_DUE_SIZE, DocumentTextDecoration.BOLD, ACCENT); + static final DocumentTextStyle NOTE_TEXT = + serif(BODY_SIZE * 0.766, DocumentTextDecoration.ITALIC, INK); + static final DocumentTextStyle BANK_LABEL = + sans(MICRO_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle BANK_VALUE = + sans(MICRO_SIZE, DocumentTextDecoration.DEFAULT, MUTED); + static final DocumentTextStyle INVOICE_TITLE = + display(TITLE_SIZE, DocumentTextDecoration.DEFAULT, INK_SURFACE); + static final DocumentTextStyle MONOGRAM_TOP = + display(MONOGRAM_TOP_SIZE, DocumentTextDecoration.DEFAULT, ON_ACCENT); + static final DocumentTextStyle MONOGRAM_BOTTOM = + display(MONOGRAM_BOTTOM_SIZE, DocumentTextDecoration.DEFAULT, ON_ACCENT); + static final DocumentTextStyle WORDMARK = + sans(WORDMARK_SIZE, DocumentTextDecoration.BOLD, ON_ACCENT); + static final DocumentTextStyle TAGLINE = + serif(TAGLINE_SIZE, DocumentTextDecoration.ITALIC, ON_ACCENT); + static final DocumentTextStyle BANNER_SIGN_OFF = + sans(BODY_SIZE * 1.02, DocumentTextDecoration.BOLD, ON_DARK); + static final DocumentTextStyle BANNER_DUE = + serif(BODY_SIZE * 1.09, DocumentTextDecoration.ITALIC, ON_DARK); + + // -- tracking -------------------------------------------------------- + + /** + * The letter-spacing each tracked run is set with, in points. + * + *

A text style carries no tracking, so a tracked run is written letter + * by letter with an invisible inline rectangle between the pairs, and + * these are its widths. They are frozen constants rather than a + * measurement: the design derived each by measuring the face and dividing + * the difference from a target width across the gaps, which would tie the + * preset to the font artifact's own resource layout at compose time. The + * numbers are what that measurement produced, and the pixel-parity gate + * is what proves they are still the right ones.

+ */ + static final double TRACK_TITLE = 0.059021; + static final double TRACK_META_LABEL = 1.462532; + static final double TRACK_SECTION_HEADING = 1.462576; + static final double TRACK_TABLE_HEADER = 1.525822; + static final double TRACK_TOTAL_LABEL = 0.612126; + static final double TRACK_WORDMARK = 0.990497; + + // -- helpers --------------------------------------------------------- + + static DocumentTextStyle sans(double size, DocumentTextDecoration decoration, + DocumentColor color) { + return TextStyles.of(SANS, size, decoration, color); + } + + static DocumentTextStyle display(double size, DocumentTextDecoration decoration, + DocumentColor color) { + return TextStyles.of(DISPLAY_SERIF, size, decoration, color); + } + + static DocumentTextStyle serif(double size, DocumentTextDecoration decoration, + DocumentColor color) { + return TextStyles.of(TEXT_SERIF, size, decoration, color); + } + + /** + * The leading to author so lines land on a given pitch. + * + * @param targetPitch the distance the design draws between line tops + * @param style the style of the lines + * @return the extra leading, never negative + */ + static double leading(double targetPitch, DocumentTextStyle style) { + return Math.max(0, targetPitch - style.size() * lineBoxRatio(style.fontName())); + } + + /** + * How tall a line box is as a share of its type size, per family. The + * three faces differ enough that one shared ratio would be wrong by a + * line per block on two of them. + */ + private static double lineBoxRatio(FontName fontName) { + if (fontName.sameFamily(DISPLAY_SERIF)) { + return 1.522; + } + if (fontName.sameFamily(TEXT_SERIF)) { + return 1.150; + } + return 1.221; + } + + static DocumentTableStyle cellStyle(DocumentTextStyle textStyle, + DocumentTableTextAnchor anchor, + DocumentInsets padding) { + return DocumentTableStyle.builder() + .padding(padding) + .fillColor(PAPER) + .stroke(DocumentStroke.of(PAPER, 0)) + .textStyle(textStyle) + .textAnchor(anchor) + .lineSpacing(0) + .build(); + } + + static DocumentTableStyle headerStyle(DocumentTableTextAnchor anchor, + DocumentInsets padding) { + return DocumentTableStyle.builder() + .padding(padding) + .fillColor(INK_SURFACE) + .stroke(DocumentStroke.of(INK_SURFACE, 0)) + .textStyle(TABLE_HEADER) + .textAnchor(anchor) + .lineSpacing(0) + .build(); + } + + /** + * A figure written the way this sheet writes money: the currency mark, + * then grouped digits to two places. + * + *

The formatter is built per call rather than shared: {@link NumberFormat} + * is not thread-safe, and a document is cheap to format beside a static + * monitor every render on every thread would queue behind.

+ * + * @param currencySymbol the mark to prefix + * @param value the figure + * @return the formatted amount + */ + static String money(String currencySymbol, BigDecimal value) { + NumberFormat format = NumberFormat.getNumberInstance(Locale.ENGLISH); + format.setGroupingUsed(true); + format.setMinimumFractionDigits(2); + format.setMaximumFractionDigits(2); + return currencySymbol + format.format(value); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java new file mode 100644 index 000000000..ce754986a --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/LumaStudioWidgets.java @@ -0,0 +1,172 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.EllipseBuilder; +import com.demcha.compose.document.dsl.LayerStackBuilder; +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.node.DocumentLinkOptions; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.node.TextVerticalAlign; +import com.demcha.compose.document.style.ClipPolicy; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.style.ShapeOutline; + +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.PAPER; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_DISC_ICON_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_DISC_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.SECTION_HEADING_OFFSET; +import static com.demcha.compose.document.templates.invoice.presets.LumaStudioStyles.TRACK_SECTION_HEADING; + +/** + * The idioms this sheet repeats: the tracked run, the mark on its accent + * disc, the plain node-shaped paragraph, and the heading that pairs the two. + */ +final class LumaStudioWidgets { + + private LumaStudioWidgets() { + } + + /** + * A run of letter-spaced text. + * + *

A text style carries no tracking, so the gap between letters is an + * inline rectangle of the ground colour — invisible, and exactly as wide + * as the spacing asks for. The rectangle is 0.05pt tall so it takes no + * part in the line box.

+ * + * @param name the node name + * @param text the text to space out + * @param style the style of the letters + * @param tracking the gap in points; zero or less writes the text plainly + * @param ground the colour behind the run, which the gaps are painted in + * @return the paragraph node + */ + static DocumentNode tracked(String name, String text, DocumentTextStyle style, + double tracking, DocumentColor ground) { + return tracked(name, text, style, tracking, ground, TextVerticalAlign.DEFAULT); + } + + /** + * The same, seated to a given vertical alignment. + * + * @param name the node name + * @param text the text to space out + * @param style the style of the letters + * @param tracking the gap in points + * @param ground the colour the gaps are painted in + * @param verticalAlign where the text sits in its box + * @return the paragraph node + */ + static DocumentNode tracked(String name, String text, DocumentTextStyle style, + double tracking, DocumentColor ground, + TextVerticalAlign verticalAlign) { + return tracked(name, text, style, tracking, ground, TextAlign.LEFT, verticalAlign); + } + + /** + * The same, aligned across the box it is drawn in — which the table + * headers need and the rest of the sheet does not. + * + * @param name the node name + * @param text the text to space out + * @param style the style of the letters + * @param tracking the gap in points + * @param ground the colour the gaps are painted in + * @param align where the run sits across its box + * @param verticalAlign where the text sits in its box + * @return the paragraph node + */ + static DocumentNode tracked(String name, String text, DocumentTextStyle style, + double tracking, DocumentColor ground, TextAlign align, + TextVerticalAlign verticalAlign) { + ParagraphBuilder paragraph = new ParagraphBuilder() + .name(name) + .textStyle(style) + .align(align) + .verticalAlign(verticalAlign) + .lineSpacing(0) + .margin(DocumentInsets.zero()); + if (tracking <= 0) { + return paragraph.text(text).build(); + } + return paragraph.rich(rich -> { + for (int index = 0; index < text.length(); index++) { + if (index > 0) { + rich.shape(new ShapeOutline.Rectangle(tracking, 0.05), ground); + } + rich.style(String.valueOf(text.charAt(index)), style); + } + }).build(); + } + + /** A plain paragraph as a node, for anchoring inside a container. */ + static DocumentNode paragraph(String text, DocumentTextStyle style, TextAlign align) { + return new ParagraphBuilder() + .text(text) + .textStyle(style) + .align(align) + .lineSpacing(0) + .margin(DocumentInsets.zero()) + .build(); + } + + /** The same, carrying a link when one is given. */ + static DocumentNode linkedParagraph(String text, String href, DocumentTextStyle style) { + ParagraphBuilder paragraph = new ParagraphBuilder() + .text(text) + .textStyle(style) + .align(TextAlign.LEFT) + .lineSpacing(0) + .margin(DocumentInsets.zero()); + if (href != null && !href.isBlank()) { + paragraph.link(new DocumentLinkOptions(href)); + } + return paragraph.build(); + } + + /** + * A mark centred on an accent disc. + * + *

A layer stack over an ellipse rather than a filled shape container: + * a container's own fill is dropped when it sits inside a parent carrying + * a large negative margin, which is where the closing banner puts it.

+ */ + static DocumentNode disc(double diameter, String iconToken, double iconSize) { + return new LayerStackBuilder() + .name("Disc-" + iconToken) + .back(new EllipseBuilder() + .name("DiscFill") + .circle(diameter) + .fillColor(ACCENT) + .margin(DocumentInsets.zero()) + .build()) + .layer(LumaStudioIcons.icon(iconToken, iconSize), LayerAlign.CENTER) + .build(); + } + + /** + * A closing-block heading: the disc, and the tracked words on its axis. + * + * @param section the host block + * @param iconToken the mark on the disc + * @param heading the heading text + * @param width the band's width + */ + static void sectionHead(SectionBuilder section, String iconToken, String heading, + double width) { + section.addContainer(container -> container + .name("SectionHead") + .rectangle(width, SECTION_DISC_SIZE) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(disc(SECTION_DISC_SIZE, iconToken, SECTION_DISC_ICON_SIZE)) + .position(tracked("SectionHeading", heading, SECTION_HEADING, + TRACK_SECTION_HEADING, PAPER), + SECTION_HEADING_OFFSET, 0, LayerAlign.CENTER_LEFT)); + } +} diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/bank.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/bank.svg new file mode 100644 index 000000000..ea87a64fb --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/bank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/email.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/email.svg new file mode 100644 index 000000000..13dc2974c --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/heart.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/heart.svg new file mode 100644 index 000000000..24d90b97a --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/notes.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/notes.svg new file mode 100644 index 000000000..a91fe98cf --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/notes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/phone.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/phone.svg new file mode 100644 index 000000000..b2a8bfc1b --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/sprig.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/sprig.svg new file mode 100644 index 000000000..ea5849182 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/sprig.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/luma-studio/icons/website.svg b/templates/src/main/resources/templates/invoice/luma-studio/icons/website.svg new file mode 100644 index 000000000..d2929ac57 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/luma-studio/icons/website.svg @@ -0,0 +1 @@ + \ No newline at end of file