[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-description":3,"footer-secondary":5,"footer-primary":33,"header-nav":121,"header-nav-data":260,"@cesarechazu/directus-extension-generate-pdf":262,"github-stars":331,"site-banners":433,"8f849cd0-a47b-4e32-bb19-b478973c90f7":439,"dfd79d2b-7af5-4cdb-aa94-3f73de97ebd8":445,"74634853-196b-4ce3-b256-4534c054838f":451,"1b444c23-b593-4391-9410-4ca5d2c7a7cb":480,"358b0659-1f05-4427-bd1c-4bc03a43c182":486,"9df3f40e-6272-4ec6-a0d7-cc29265e087c":491},{"description":4},"\u003Cp>A composable backend to build your Headless CMS, BaaS, and more.&nbsp;\u003C/p>",{"items":6},[7,14,21,27],{"id":8,"title":9,"url":10,"page":11,"children":13},"8a1b7bfa-429d-4ffc-a650-2a5fdcf356da","Cloud Policies",null,{"permalink":12},"/cloud-policies",[],{"id":15,"title":16,"url":17,"page":18,"children":20},"bea848ef-828f-4306-8017-6b00ec5d4a0c","License","#",{"permalink":19},"/bsl",[],{"id":22,"title":23,"url":17,"page":24,"children":26},"4e914f47-4bee-42b7-b445-3119ee4196ef","Terms",{"permalink":25},"/terms",[],{"id":28,"title":29,"url":17,"page":30,"children":32},"ea69eda6-d317-4981-8421-fcabb1826bfd","Privacy",{"permalink":31},"/privacy",[],{"items":34},[35,58,78,98],{"id":36,"title":37,"url":10,"page":10,"children":38},"522e608a-77b0-4333-820d-d4f44be2ade1","Solutions",[39,44,49,54],{"id":40,"title":41,"url":10,"page":42},"fcafe85a-a798-4710-9e7a-776fe413aae5","Headless CMS",{"permalink":43},"/solutions/headless-cms",{"id":45,"title":46,"url":10,"page":47},"79972923-93cf-4777-9e32-5c9b0315fc10","Backend-as-a-Service",{"permalink":48},"/solutions/backend-as-a-service",{"id":50,"title":51,"url":10,"page":52},"0fa8d0c1-7b64-4f6f-939d-d7fdb99fc407","Product Information",{"permalink":53},"/solutions/product-information-management",{"id":55,"title":56,"url":57,"page":10},"63946d54-6052-4780-8ff4-91f5a9931dcc","100+ Things to Build","https://directus.io/blog/100-tools-apps-and-platforms-you-can-build-with-directus",{"id":59,"title":60,"url":10,"page":10,"children":61},"8ab4f9b1-f3e2-44d6-919b-011d91fe072f","Resources",[62,66,70,74],{"id":63,"title":64,"url":65,"page":10},"f951fb84-8777-4b84-9e91-996fe9d25483","Documentation","https://docs.directus.io",{"id":67,"title":68,"url":69,"page":10},"366febc7-a538-4c08-a326-e6204957f1e3","Guides","https://docs.directus.io/guides/",{"id":71,"title":72,"url":73,"page":10},"aeb9128e-1c5f-417f-863c-2449416433cd","Community","https://directus.chat",{"id":75,"title":76,"url":77,"page":10},"da1c2ed8-0a77-49b0-a903-49c56cb07de5","Release Notes","https://github.com/directus/directus/releases",{"id":79,"title":80,"url":10,"page":10,"children":81},"d61fae8c-7502-494a-822f-19ecff3d0256","Support",[82,86,90,94],{"id":83,"title":84,"url":85,"page":10},"8c43c781-7ebd-475f-a931-747e293c0a88","Issue Tracker","https://github.com/directus/directus/issues",{"id":87,"title":88,"url":89,"page":10},"d77bb78e-cf7b-4e01-932a-514414ba49d3","Feature Requests","https://github.com/directus/directus/discussions?discussions_q=is:open+sort:top",{"id":91,"title":92,"url":93,"page":10},"4346be2b-2c53-476e-b53b-becacec626a6","Community Chat","https://discord.com/channels/725371605378924594/741317677397704757",{"id":95,"title":96,"url":97,"page":10},"26c115d2-49f7-4edc-935e-d37d427fb89d","Cloud Dashboard","https://directus.cloud",{"id":99,"title":100,"url":10,"page":10,"children":101},"49141403-4f20-44ac-8453-25ace1265812","Organization",[102,107,112,116],{"id":103,"title":104,"url":105,"page":106},"1f36ea92-8a5e-47c8-914c-9822a8b9538a","About","/about",{"permalink":105},{"id":108,"title":109,"url":17,"page":110},"b84bf525-5471-4b14-a93c-225f6c386005","Careers",{"permalink":111},"/careers",{"id":113,"title":114,"url":115,"page":10},"86aabc3a-433d-434b-9efa-ad1d34be0a34","Brand Assets","https://drive.google.com/drive/folders/1lBOTba4RaA5ikqOn8Ewo4RYzD0XcymG9?usp=sharing",{"id":117,"title":118,"url":10,"page":119},"8d2fa1e3-198e-4405-81e1-2ceb858bc237","Contact",{"permalink":120},"/contact",{"items":122},[123,185,241,246,253],{"id":124,"title":125,"url":10,"callout":126,"callout_title":127,"children_title":128,"page":10,"children":129},"62c04c6c-5793-4702-8ed1-73dd563fd605","Product","8f849cd0-a47b-4e32-bb19-b478973c90f7","Project Showcase","Use Cases and Features",[130,136,142,149,154,162,170,178],{"id":131,"title":41,"url":132,"description":133,"image":10,"icon":134,"page":135},"e7d7d5ed-89b1-4455-8b4a-8ae92c70e3a0","/solutions/headless-cms/","Manage and deliver content with ease","code_blocks",{"permalink":43},{"id":137,"title":46,"url":138,"description":139,"image":10,"icon":140,"page":141},"60bdefd9-95e6-45a3-9f81-4748d07c59d3","/solutions/backend-as-a-service/","Build and ship applications faster","speed",{"permalink":48},{"id":143,"title":144,"url":145,"description":146,"image":10,"icon":147,"page":148},"5f9aebeb-4f89-445e-9850-5b1261a2743c","Headless Commerce","/solutions/product-information-management/","A single source of truth for products","shopping_cart_checkout",{"permalink":53},{"id":150,"title":151,"url":57,"description":152,"image":10,"icon":153,"page":10},"49e46134-80be-470e-8c73-afb1417fa9b6","100+ More Use Cases","Build anything (or everything)","lightbulb",{"id":155,"title":156,"url":157,"description":158,"image":10,"icon":159,"page":160},"a589ac77-a5ce-45c5-a054-e43111e19158","Instant APIs","/products/connect/","Connect a database, get REST + GraphQL APIs","api",{"permalink":161},"/toolkit/connect",{"id":163,"title":164,"url":165,"description":166,"image":10,"icon":167,"page":168},"4a0f129a-c546-4493-b0a9-306e51692e90","Granular Policy-Based Auth","/products/auth/","Provide secure, autonomous data access","lock_person",{"permalink":169},"/toolkit/auth",{"id":171,"title":172,"url":173,"description":174,"image":10,"icon":175,"page":176},"f9250f2c-93a4-4108-80db-011bbe391ecf","Visual Automation Builder","/products/automate/","Automate content and data workflows with ease","build",{"permalink":177},"/toolkit/automate",{"id":179,"title":180,"url":10,"description":181,"image":10,"icon":182,"page":183},"f1ae4e40-5b05-42a4-9cd3-33dda35cc939","50+ More Features","Get everything you need out-of-the-box","auto_fix",{"permalink":184},"/features",{"id":186,"title":60,"url":10,"callout":187,"callout_title":188,"children_title":189,"page":10,"children":190},"2f6ad0d1-6dd3-4f17-b5c8-9f2abf71409a","dfd79d2b-7af5-4cdb-aa94-3f73de97ebd8","Watch Directus TV","Learn More",[191,198,205,211,218,224,230,235],{"id":192,"title":193,"url":194,"description":195,"image":10,"icon":196,"page":197},"0a3bf9f5-1ef2-43f4-bc09-7ff7488241c5","Blog","/blog","Read our latest articles and guides","library_books",{"permalink":194},{"id":199,"title":200,"url":17,"description":201,"image":10,"icon":202,"page":203},"165e3dc2-e51b-4456-8382-99c5775b0412","Case Studies","Case studies and success stories","magic_button",{"permalink":204},"/case-studies",{"id":206,"title":207,"url":208,"description":209,"image":10,"icon":210,"page":10},"5ae324b6-bf44-4c21-95ad-e6dc0c1c1f40","Community Forum","https://community.directus.io/","Questions and conversations","comment",{"id":212,"title":213,"url":17,"description":214,"image":10,"icon":215,"page":216},"b1db03f0-e537-490e-8c0f-c61c401d1024","Agency Directory","Browse our list of agency partners ","handshake",{"permalink":217},"/agency-directory",{"id":219,"title":220,"url":105,"description":221,"image":10,"icon":222,"page":223},"991731c8-eb40-4eec-85a5-6e977bcd7ec9","About Us","Learn more about Directus and the team","supervised_user_circle",{"permalink":105},{"id":225,"title":226,"url":227,"description":228,"image":10,"icon":229,"page":10},"52aebf38-b3ad-4a27-807d-ce52398cd509","Wall of Love","https://testimonial.to/directus/all","See what others are saying about us","heart_plus",{"id":231,"title":118,"url":17,"description":232,"image":10,"icon":233,"page":234},"a86eca65-d5ae-4263-b7d9-4f1a1c50a0b1","Have a general inquiry or question for us?","mark_email_unread",{"permalink":120},{"id":236,"title":80,"url":10,"description":237,"image":10,"icon":238,"page":239},"28225825-8d41-4809-9032-192fbf5c6e5d","Reach out to Directus support","support",{"permalink":240},"/support",{"id":242,"title":243,"url":244,"callout":10,"callout_title":10,"children_title":10,"page":10,"children":245},"a3f1275d-b088-4b11-99bf-143fcbf39104","Developers","/docs",[],{"id":247,"title":248,"url":249,"callout":10,"callout_title":10,"children_title":10,"page":250,"children":252},"fae8fded-d2e2-468e-a68b-82abec7a7225","Enterprise","/solutions/enterprise/",{"permalink":251},"/solutions/enterprise",[],{"id":254,"title":255,"url":256,"callout":10,"callout_title":10,"children_title":10,"page":257,"children":259},"5c5e2fbc-49fd-4e41-a71e-e4f8db2b00cf","Pricing","/pricing/",{"permalink":258},"/pricing/self-hosted",[],{"header_cta_buttons":261},"74634853-196b-4ce3-b256-4534c054838f",{"name":263,"description":264,"verified":265,"id":266,"readme":267,"type":268,"last_updated":269,"host_version":270,"downloads":271,"total_downloads":272,"sandbox":265,"license":273,"publisher":274,"versions":280,"formatted_name":325,"formatted_readme":326,"formatted_description":264,"featured_image":327,"images":328,"repository_url":285,"recent_downloads_7_days":272,"recent_downloads_30_days":272},"@cesarechazu/directus-extension-generate-pdf","Directus Flow operation to generate generic PDFs from JSON using pdfme",false,"209a3887-ae63-4839-872f-faa63428c915","# Generate PDF\n\nDirectus Flow operation that generates PDF files from JSON templates using [`pdfme`](https://pdfme.com/).\n\n## Flow Operation\n\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/edit_operation.jpg\" alt=\"Generate PDF flow operation\" width=\"472\">\n\n## Features\n\n- Generic [`pdfme`](https://pdfme.com/) template rendering from JSON\n- `template.basePdf` is the source of truth for page size and margins\n- Optional full-page backgrounds through a single `background_image` value\n- Output to Directus Files or raw base64 response\n- Dot notation support in schema names, for example `user.first_name`\n- Built-in local `Roboto-Bold` registration from `fonts/Roboto-Bold.ttf`\n- Built-in plugins for text, images, shapes, dates, form controls, tables, and barcodes\n\n## Installation\n\nLocal extension:\n\n```bash\ncd extensions/directus-extension-generate-pdf\nnpm install\n```\n\nThen restart Directus so it reloads the extension.\n\nTo rebuild the published extension files after changing `src/`:\n\n```bash\nnpm run build\n```\n\n## Operation\n\n- Extension package: `@cesarechazu/directus-extension-generate-pdf`\n- Operation ID: `generate-pdf-operation`\n- Display name: `Generate PDF`\n\n## Inputs\n\n- `template`: [`pdfme`](https://pdfme.com/) template object\n- `inputs`: object or array of objects used by template fields\n- `generate_options`: optional object passed to [`pdfme.generate()`](https://pdfme.com/)\n- `background_image`: optional image source used as full-page background. Accepts `data:image/...`, a same-host `/assets/\u003Cfile_id>` URL, or a Directus file ID\n- `filename`: output filename\n- `title`: Directus file title\n- `storage`: Directus storage adapter\n- `folder`: optional Directus folder\n- `store_file`: store the PDF in Directus Files, defaults to `true`\n- `return_base64`: include PDF base64 in the operation response, defaults to `false`\n\n## Response\n\n- `file_id`: Directus file ID when the PDF is stored\n- `filename`: generated filename\n- `title`: Directus file title used for the stored asset\n- `storage`: Directus storage adapter used for the output\n- `stored`: whether the PDF was uploaded to Directus Files\n- `folder`: Directus folder ID when provided\n- `asset_url`: asset URL when the file was stored and `PUBLIC_URL` is configured\n- `mime_type`: always `application/pdf`\n- `bytes`: generated PDF size in bytes\n- `pages`: number of generated pages (based on `inputs`)\n- `warnings`: non-fatal warnings collected during generation\n- `base64`: optional PDF base64 when `return_base64` is `true`\n\n## Supported Schema Types\n\n- Text: `text`, `multiVariableText`\n- Media: `image`, `svg`\n- Layout and shapes: `table`, `line`, `rectangle`, `ellipse`\n- Date and time: `dateTime`, `date`, `time`\n- Form controls: `select`, `radioGroup`, `checkbox`\n- Barcodes: `qrcode`, `japanpost`, `ean13`, `ean8`, `code39`, `code128`, `nw7`, `itf14`, `upca`, `upce`, `gs1datamatrix`, `pdf417`\n\n\n## Notes\n\n- Page size and margins must be defined in `template.basePdf`.\n- This operation does not override page size or margins with separate fields.\n- `generate_options` is for PDF metadata, color mode, and fonts. It does not control page size, margins, or schema positions.\n- `background_image` accepts `data:image/...`, a URL on the same host as Directus `PUBLIC_URL` under `/assets/`, or a Directus file ID **(recommended)**.\n- URLs on other hosts are rejected. In this version, external background images must be uploaded to Directus first and then referenced by asset URL or file ID.\n- Background images are validated as supported image files (`png`, `jpeg`, `webp`, `gif`) before being embedded.\n- If a background is provided and `basePdf` is blank-object mode, it is inserted as a full-page static background.\n- If a schema name is `user.first_name`, the operation can resolve it from nested input data such as `{ \"user\": { \"first_name\": \"John\" } }`.\n\n## Fonts\n\n- Default fallback font is `Roboto`.\n- `Roboto-Bold` is auto-registered from `fonts/Roboto-Bold.ttf` when the file is present.\n- You can still define custom fonts in `generate_options.font`.\n\n## Hello PDF Example\n\nTemplate:\n\n```json\n{\n  \"basePdf\": {\n    \"width\": 210,\n    \"height\": 297,\n    \"padding\": [10, 10, 10, 10]\n  },\n  \"schemas\": [\n    [\n      {\n        \"name\": \"highlight_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 42 },\n        \"width\": 170,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#0F172A\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"title\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 24 },\n        \"width\": 120,\n        \"height\": 12,\n        \"fontSize\": 24,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"body\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 26, \"y\": 52 },\n        \"width\": 170,\n        \"height\": 24,\n        \"fontSize\": 12\n      },\n      {\n        \"name\": \"separator\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 20, \"y\": 96 },\n        \"width\": 170,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"qr_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 104 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"QR\"\n      },\n      {\n        \"name\": \"qr_code\",\n        \"type\": \"qrcode\",\n        \"position\": { \"x\": 20, \"y\": 112 },\n        \"width\": 30,\n        \"height\": 30,\n        \"content\": \"https://directus.io/docs\",\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\"\n      },\n      {\n        \"name\": \"ean_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 60, \"y\": 104 },\n        \"width\": 90,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"EAN-13\"\n      },\n      {\n        \"name\": \"ean_code\",\n        \"type\": \"ean13\",\n        \"position\": { \"x\": 60, \"y\": 112 },\n        \"width\": 90,\n        \"height\": 18,\n        \"content\": \"2112345678900\",\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\",\n        \"textColor\": \"#111827\",\n        \"includetext\": true\n      },\n      {\n        \"name\": \"footer\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 150 },\n        \"width\": 170,\n        \"height\": 10,\n        \"fontSize\": 10\n      }\n    ]\n  ]\n}\n```\n\nInputs:\n\n```json\n{\n  \"title\": \"Hello PDF\",\n  \"body\": \"This document shows text, a shape, a divider line, a QR code, and an EAN-13 barcode generated from JSON.\",\n  \"qr_code\": \"https://directus.io/docs\",\n  \"ean_code\": \"2112345678900\",\n  \"footer\": \"Useful for receipts, labels, certificates, or simple printable layouts.\"\n}\n```\n\n## Example Result\n\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/demo.jpg\" alt=\"Generate PDF demo\" width=\"370\">\n\nMulti-page inputs:\n\n```json\n[\n  { \"title\": \"Page 1\", \"body\": \"First page\" },\n  { \"title\": \"Page 2\", \"body\": \"Second page\" }\n]\n```\n\n## Invoice Example\n\nTemplate:\n\n\u003Cdetails>\n  \u003Csummary>Show Template JSON\u003C/summary>\n\n```json\n{\n  \"basePdf\": {\n    \"width\": 210,\n    \"height\": 297,\n    \"padding\": [10, 10, 10, 10]\n  },\n  \"schemas\": [\n    [\n      {\n        \"name\": \"header_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 18 },\n        \"width\": 170,\n        \"height\": 28,\n        \"borderWidth\": 0,\n        \"borderColor\": \"#0F172A\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"invoice_title\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 24 },\n        \"width\": 80,\n        \"height\": 12,\n        \"fontSize\": 22,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"INVOICE\"\n      },\n      {\n        \"name\": \"company_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 34 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Example Labs LLC\"\n      },\n      {\n        \"name\": \"invoice_number_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 24 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Number\"\n      },\n      {\n        \"name\": \"invoice_number\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 24 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"issue_date_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 32 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Date\"\n      },\n      {\n        \"name\": \"issue_date\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 32 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"due_date_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 40 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Due\"\n      },\n      {\n        \"name\": \"due_date\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 40 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"customer_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 56 },\n        \"width\": 82,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"seller_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 108, \"y\": 56 },\n        \"width\": 82,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#FFFFFF\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"bill_to_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 60 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"Bill To\"\n      },\n      {\n        \"name\": \"customer_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 68 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 12,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"customer_tax_id\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 78 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"customer_address\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 86 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"from_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 60 },\n        \"width\": 20,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"From\"\n      },\n      {\n        \"name\": \"seller_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 68 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 11,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"seller_tax_id\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 78 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"seller_address\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 86 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"items_header_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 108 },\n        \"width\": 170,\n        \"height\": 10,\n        \"borderWidth\": 0,\n        \"borderColor\": \"#E2E8F0\",\n        \"color\": \"#E2E8F0\",\n        \"radius\": 1\n      },\n      {\n        \"name\": \"items_header_line\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 20, \"y\": 118 },\n        \"width\": 170,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"description_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 111 },\n        \"width\": 78,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Description\"\n      },\n      {\n        \"name\": \"qty_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 110, \"y\": 111 },\n        \"width\": 15,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Qty\"\n      },\n      {\n        \"name\": \"price_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 111 },\n        \"width\": 20,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Price\"\n      },\n      {\n        \"name\": \"discount_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 150, \"y\": 111 },\n        \"width\": 16,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Disc.\"\n      },\n      {\n        \"name\": \"total_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 170, \"y\": 111 },\n        \"width\": 18,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Total\"\n      },\n      {\n        \"name\": \"invoice_items\",\n        \"type\": \"table\",\n        \"position\": { \"x\": 20, \"y\": 120 },\n        \"width\": 170,\n        \"height\": 64,\n        \"content\": \"[]\",\n        \"showHead\": false,\n        \"repeatHead\": false,\n        \"head\": [\"Description\", \"Qty\", \"Price\", \"Disc.\", \"Total\"],\n        \"headWidthPercentages\": [50, 12, 14, 10, 14],\n        \"tableStyles\": {\n          \"borderColor\": \"#CBD5E1\",\n          \"borderWidth\": 0.2\n        },\n        \"headStyles\": {\n          \"fontName\": \"Roboto-Bold\",\n          \"alignment\": \"left\",\n          \"verticalAlignment\": \"middle\",\n          \"fontSize\": 8,\n          \"lineHeight\": 1,\n          \"characterSpacing\": 0,\n          \"fontColor\": \"#0F172A\",\n          \"backgroundColor\": \"#E2E8F0\",\n          \"borderColor\": \"#CBD5E1\",\n          \"borderWidth\": { \"top\": 0, \"right\": 0, \"bottom\": 0, \"left\": 0 },\n          \"padding\": { \"top\": 2, \"right\": 2, \"bottom\": 2, \"left\": 2 }\n        },\n        \"bodyStyles\": {\n          \"fontName\": \"Roboto\",\n          \"alignment\": \"left\",\n          \"verticalAlignment\": \"middle\",\n          \"fontSize\": 8,\n          \"lineHeight\": 1,\n          \"characterSpacing\": 0,\n          \"fontColor\": \"#111827\",\n          \"backgroundColor\": \"#FFFFFF\",\n          \"alternateBackgroundColor\": \"#F8FAFC\",\n          \"borderColor\": \"#E2E8F0\",\n          \"borderWidth\": { \"top\": 0, \"right\": 0, \"bottom\": 0.1, \"left\": 0 },\n          \"padding\": { \"top\": 2, \"right\": 2, \"bottom\": 2, \"left\": 2 }\n        },\n        \"columnStyles\": {\n          \"alignment\": {\n            \"1\": \"center\",\n            \"2\": \"right\",\n            \"3\": \"right\",\n            \"4\": \"right\"\n          }\n        }\n      },\n      {\n        \"name\": \"totals_line\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 120, \"y\": 194 },\n        \"width\": 70,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"subtotal_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 200 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Subtotal\"\n      },\n      {\n        \"name\": \"subtotal\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 200 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"discount_total_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 208 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Discount\"\n      },\n      {\n        \"name\": \"discount_total\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 208 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"tax_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 216 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Tax\"\n      },\n      {\n        \"name\": \"tax\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 216 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"total_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 226 },\n        \"width\": 30,\n        \"height\": 7,\n        \"fontSize\": 10,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"total\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 226 },\n        \"width\": 25,\n        \"height\": 7,\n        \"fontSize\": 10,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"payment_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 244 },\n        \"width\": 170,\n        \"height\": 34,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"payment_note\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 250 },\n        \"width\": 116,\n        \"height\": 12,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"bank_reference\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 264 },\n        \"width\": 116,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"payment_qr\",\n        \"type\": \"qrcode\",\n        \"position\": { \"x\": 150, \"y\": 250 },\n        \"width\": 24,\n        \"height\": 24,\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\"\n      }\n    ]\n  ]\n}\n```\n\n\u003C/details>\n\nInputs:\n\n\u003Cdetails>\n  \u003Csummary>Show Inputs JSON\u003C/summary>\n\n```json\n{\n  \"invoice_number\": \"INV-0001\",\n  \"issue_date\": \"2026-02-28\",\n  \"due_date\": \"2026-03-15\",\n  \"customer_name\": \"Ada Lovelace\",\n  \"customer_tax_id\": \"Tax ID: 20-12345678-9\",\n  \"customer_address\": \"12 Analytical Engine St, London\",\n  \"seller_name\": \"Example Labs LLC\",\n  \"seller_tax_id\": \"VAT ID: GB-99887766\",\n  \"seller_address\": \"42 Computing Ave, Manchester\",\n  \"invoice_items\": [\n    [\"Discovery workshop and architecture review\", \"1\", \"$600.00\", \"$0.00\", \"$600.00\"],\n    [\"Custom flow development\", \"8\", \"$120.00\", \"$80.00\", \"$880.00\"],\n    [\"PDF template implementation\", \"3\", \"$150.00\", \"$0.00\", \"$450.00\"],\n    [\"QA and browser validation\", \"2\", \"$90.00\", \"$0.00\", \"$180.00\"],\n    [\"Deployment and handoff session\", \"1\", \"$220.00\", \"$20.00\", \"$200.00\"]\n  ],\n  \"subtotal\": \"$2,310.00\",\n  \"discount_total\": \"$100.00\",\n  \"tax\": \"$464.10\",\n  \"total_label\": \"Total\",\n  \"total\": \"$2,674.10\",\n  \"payment_note\": \"Please transfer the balance before the due date. Scan the QR to open the payment portal or use the bank reference below.\",\n  \"bank_reference\": \"Reference: INV-0001 | IBAN: GB82 WEST 1234 5698 7654 32\",\n  \"payment_qr\": \"https://pay.example.com/invoices/INV-0001\"\n}\n```\n\n\u003C/details>\n\n## Invoice example result\n\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/invoice_example.jpg\" alt=\"Invoice example result\" width=\"400\">\n\n## Generate Options Example\n\n```json\n{\n  \"title\": \"Invoice INV-0001\",\n  \"subject\": \"Professional services invoice\",\n  \"author\": \"Example Labs LLC\",\n  \"creator\": \"Directus Flow: Generate PDF\",\n  \"producer\": \"pdfme\",\n  \"keywords\": [\"invoice\", \"directus\", \"billing\", \"pdf\"],\n  \"colorType\": \"rgb\",\n  \"lang\": \"en\"\n}\n```\n\n## License\n\nMIT (`MIT`)\n","operation","2026-03-01T12:33:02.689Z","^11.0.0",[],0,"MIT",{"username":275,"verified":265,"id":276,"github_username":275,"github_name":277,"github_blog":278,"github_bio":10,"github_location":10,"github_company":10,"github_avatar_url":279},"cesarechazu","a3f3ea2e-9dbd-4ad5-a92c-b9e673f9b7dd","Cesar Mauricio","","https://avatars.githubusercontent.com/u/22593033?v=4",[281,294,302,309,317],{"version":282,"package":266,"publisher":276,"type":268,"host_version":270,"publish_date":283,"verified":265,"id":284,"url_repository":285,"url_homepage":286,"url_bugs":287,"file_count":288,"unpacked_size":289,"sandbox":265,"sandbox_requested_scopes":10,"license":290,"bundled":291,"maintainers":292},"1.0.3","2026-03-01T02:20:54.675Z","662e1cc5-d185-4d96-9927-b89f8a7831a4","https://github.com/cesarechazu/directus-extension-generate-pdf.git","https://github.com/cesarechazu/directus-extension-generate-pdf#readme","https://github.com/cesarechazu/directus-extension-generate-pdf/issues",7,243546,"GPL-3.0-or-later",[],[293],13834,{"version":295,"package":266,"publisher":276,"type":268,"host_version":270,"publish_date":296,"verified":265,"id":297,"url_repository":285,"url_homepage":286,"url_bugs":287,"file_count":288,"unpacked_size":298,"sandbox":265,"sandbox_requested_scopes":10,"license":290,"bundled":299,"maintainers":300},"1.0.0","2026-03-01T00:49:59.917Z","b763d1d7-13c4-4e81-bfe7-9b6d2605b8ed",242619,[],[301],13833,{"version":303,"package":266,"publisher":276,"type":268,"host_version":270,"publish_date":269,"verified":265,"id":304,"url_repository":285,"url_homepage":286,"url_bugs":287,"file_count":288,"unpacked_size":305,"sandbox":265,"sandbox_requested_scopes":10,"license":273,"bundled":306,"maintainers":307},"1.0.6","bb8b1058-9923-49fa-947e-ce1af80e3c26",9945346,[],[308],13838,{"version":310,"package":266,"publisher":276,"type":268,"host_version":270,"publish_date":311,"verified":265,"id":312,"url_repository":285,"url_homepage":286,"url_bugs":287,"file_count":288,"unpacked_size":313,"sandbox":265,"sandbox_requested_scopes":10,"license":273,"bundled":314,"maintainers":315},"1.0.5","2026-03-01T12:30:29.218Z","c208670b-b0cb-42f2-a6c9-1feae8d9f21e",9945077,[],[316],13837,{"version":318,"package":266,"publisher":276,"type":268,"host_version":270,"publish_date":319,"verified":265,"id":320,"url_repository":285,"url_homepage":286,"url_bugs":287,"file_count":288,"unpacked_size":321,"sandbox":265,"sandbox_requested_scopes":10,"license":273,"bundled":322,"maintainers":323},"1.0.4","2026-03-01T02:43:01.405Z","ccb9bbb4-59d7-4296-b0e3-3a10a6c03dcc",209764,[],[324],13835,"Generate PDF","\u003Ch1>Generate PDF\u003C/h1>\n\u003Cp>Directus Flow operation that generates PDF files from JSON templates using \u003Ca href=\"https://pdfme.com/\">\u003Ccode>pdfme\u003C/code>\u003C/a>.\u003C/p>\n\u003Ch2>Flow Operation\u003C/h2>\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/edit_operation.jpg\" alt=\"Generate PDF flow operation\">\n\u003Ch2>Features\u003C/h2>\n\u003Cul>\n\u003Cli>Generic \u003Ca href=\"https://pdfme.com/\">\u003Ccode>pdfme\u003C/code>\u003C/a> template rendering from JSON\u003C/li>\n\u003Cli>\u003Ccode>template.basePdf\u003C/code> is the source of truth for page size and margins\u003C/li>\n\u003Cli>Optional full-page backgrounds through a single \u003Ccode>background_image\u003C/code> value\u003C/li>\n\u003Cli>Output to Directus Files or raw base64 response\u003C/li>\n\u003Cli>Dot notation support in schema names, for example \u003Ccode>user.first_name\u003C/code>\u003C/li>\n\u003Cli>Built-in local \u003Ccode>Roboto-Bold\u003C/code> registration from \u003Ccode>fonts/Roboto-Bold.ttf\u003C/code>\u003C/li>\n\u003Cli>Built-in plugins for text, images, shapes, dates, form controls, tables, and barcodes\u003C/li>\n\u003C/ul>\n\u003Ch2>Installation\u003C/h2>\n\u003Cp>Local extension:\u003C/p>\n\u003Cpre>\u003Ccode class=\"language-bash\">cd extensions/directus-extension-generate-pdf\nnpm install\n\u003C/code>\u003C/pre>\n\u003Cp>Then restart Directus so it reloads the extension.\u003C/p>\n\u003Cp>To rebuild the published extension files after changing \u003Ccode>src/\u003C/code>:\u003C/p>\n\u003Cpre>\u003Ccode class=\"language-bash\">npm run build\n\u003C/code>\u003C/pre>\n\u003Ch2>Operation\u003C/h2>\n\u003Cul>\n\u003Cli>Extension package: \u003Ccode>@cesarechazu/directus-extension-generate-pdf\u003C/code>\u003C/li>\n\u003Cli>Operation ID: \u003Ccode>generate-pdf-operation\u003C/code>\u003C/li>\n\u003Cli>Display name: \u003Ccode>Generate PDF\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch2>Inputs\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ccode>template\u003C/code>: \u003Ca href=\"https://pdfme.com/\">\u003Ccode>pdfme\u003C/code>\u003C/a> template object\u003C/li>\n\u003Cli>\u003Ccode>inputs\u003C/code>: object or array of objects used by template fields\u003C/li>\n\u003Cli>\u003Ccode>generate_options\u003C/code>: optional object passed to \u003Ca href=\"https://pdfme.com/\">\u003Ccode>pdfme.generate()\u003C/code>\u003C/a>\u003C/li>\n\u003Cli>\u003Ccode>background_image\u003C/code>: optional image source used as full-page background. Accepts \u003Ccode>data:image/...\u003C/code>, a same-host \u003Ccode>/assets/&lt;file_id&gt;\u003C/code> URL, or a Directus file ID\u003C/li>\n\u003Cli>\u003Ccode>filename\u003C/code>: output filename\u003C/li>\n\u003Cli>\u003Ccode>title\u003C/code>: Directus file title\u003C/li>\n\u003Cli>\u003Ccode>storage\u003C/code>: Directus storage adapter\u003C/li>\n\u003Cli>\u003Ccode>folder\u003C/code>: optional Directus folder\u003C/li>\n\u003Cli>\u003Ccode>store_file\u003C/code>: store the PDF in Directus Files, defaults to \u003Ccode>true\u003C/code>\u003C/li>\n\u003Cli>\u003Ccode>return_base64\u003C/code>: include PDF base64 in the operation response, defaults to \u003Ccode>false\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch2>Response\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Ccode>file_id\u003C/code>: Directus file ID when the PDF is stored\u003C/li>\n\u003Cli>\u003Ccode>filename\u003C/code>: generated filename\u003C/li>\n\u003Cli>\u003Ccode>title\u003C/code>: Directus file title used for the stored asset\u003C/li>\n\u003Cli>\u003Ccode>storage\u003C/code>: Directus storage adapter used for the output\u003C/li>\n\u003Cli>\u003Ccode>stored\u003C/code>: whether the PDF was uploaded to Directus Files\u003C/li>\n\u003Cli>\u003Ccode>folder\u003C/code>: Directus folder ID when provided\u003C/li>\n\u003Cli>\u003Ccode>asset_url\u003C/code>: asset URL when the file was stored and \u003Ccode>PUBLIC_URL\u003C/code> is configured\u003C/li>\n\u003Cli>\u003Ccode>mime_type\u003C/code>: always \u003Ccode>application/pdf\u003C/code>\u003C/li>\n\u003Cli>\u003Ccode>bytes\u003C/code>: generated PDF size in bytes\u003C/li>\n\u003Cli>\u003Ccode>pages\u003C/code>: number of generated pages (based on \u003Ccode>inputs\u003C/code>)\u003C/li>\n\u003Cli>\u003Ccode>warnings\u003C/code>: non-fatal warnings collected during generation\u003C/li>\n\u003Cli>\u003Ccode>base64\u003C/code>: optional PDF base64 when \u003Ccode>return_base64\u003C/code> is \u003Ccode>true\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch2>Supported Schema Types\u003C/h2>\n\u003Cul>\n\u003Cli>Text: \u003Ccode>text\u003C/code>, \u003Ccode>multiVariableText\u003C/code>\u003C/li>\n\u003Cli>Media: \u003Ccode>image\u003C/code>, \u003Ccode>svg\u003C/code>\u003C/li>\n\u003Cli>Layout and shapes: \u003Ccode>table\u003C/code>, \u003Ccode>line\u003C/code>, \u003Ccode>rectangle\u003C/code>, \u003Ccode>ellipse\u003C/code>\u003C/li>\n\u003Cli>Date and time: \u003Ccode>dateTime\u003C/code>, \u003Ccode>date\u003C/code>, \u003Ccode>time\u003C/code>\u003C/li>\n\u003Cli>Form controls: \u003Ccode>select\u003C/code>, \u003Ccode>radioGroup\u003C/code>, \u003Ccode>checkbox\u003C/code>\u003C/li>\n\u003Cli>Barcodes: \u003Ccode>qrcode\u003C/code>, \u003Ccode>japanpost\u003C/code>, \u003Ccode>ean13\u003C/code>, \u003Ccode>ean8\u003C/code>, \u003Ccode>code39\u003C/code>, \u003Ccode>code128\u003C/code>, \u003Ccode>nw7\u003C/code>, \u003Ccode>itf14\u003C/code>, \u003Ccode>upca\u003C/code>, \u003Ccode>upce\u003C/code>, \u003Ccode>gs1datamatrix\u003C/code>, \u003Ccode>pdf417\u003C/code>\u003C/li>\n\u003C/ul>\n\u003Ch2>Notes\u003C/h2>\n\u003Cul>\n\u003Cli>Page size and margins must be defined in \u003Ccode>template.basePdf\u003C/code>.\u003C/li>\n\u003Cli>This operation does not override page size or margins with separate fields.\u003C/li>\n\u003Cli>\u003Ccode>generate_options\u003C/code> is for PDF metadata, color mode, and fonts. It does not control page size, margins, or schema positions.\u003C/li>\n\u003Cli>\u003Ccode>background_image\u003C/code> accepts \u003Ccode>data:image/...\u003C/code>, a URL on the same host as Directus \u003Ccode>PUBLIC_URL\u003C/code> under \u003Ccode>/assets/\u003C/code>, or a Directus file ID \u003Cstrong>(recommended)\u003C/strong>.\u003C/li>\n\u003Cli>URLs on other hosts are rejected. In this version, external background images must be uploaded to Directus first and then referenced by asset URL or file ID.\u003C/li>\n\u003Cli>Background images are validated as supported image files (\u003Ccode>png\u003C/code>, \u003Ccode>jpeg\u003C/code>, \u003Ccode>webp\u003C/code>, \u003Ccode>gif\u003C/code>) before being embedded.\u003C/li>\n\u003Cli>If a background is provided and \u003Ccode>basePdf\u003C/code> is blank-object mode, it is inserted as a full-page static background.\u003C/li>\n\u003Cli>If a schema name is \u003Ccode>user.first_name\u003C/code>, the operation can resolve it from nested input data such as \u003Ccode>{ \"user\": { \"first_name\": \"John\" } }\u003C/code>.\u003C/li>\n\u003C/ul>\n\u003Ch2>Fonts\u003C/h2>\n\u003Cul>\n\u003Cli>Default fallback font is \u003Ccode>Roboto\u003C/code>.\u003C/li>\n\u003Cli>\u003Ccode>Roboto-Bold\u003C/code> is auto-registered from \u003Ccode>fonts/Roboto-Bold.ttf\u003C/code> when the file is present.\u003C/li>\n\u003Cli>You can still define custom fonts in \u003Ccode>generate_options.font\u003C/code>.\u003C/li>\n\u003C/ul>\n\u003Ch2>Hello PDF Example\u003C/h2>\n\u003Cp>Template:\u003C/p>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"basePdf\": {\n    \"width\": 210,\n    \"height\": 297,\n    \"padding\": [10, 10, 10, 10]\n  },\n  \"schemas\": [\n    [\n      {\n        \"name\": \"highlight_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 42 },\n        \"width\": 170,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#0F172A\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"title\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 24 },\n        \"width\": 120,\n        \"height\": 12,\n        \"fontSize\": 24,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"body\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 26, \"y\": 52 },\n        \"width\": 170,\n        \"height\": 24,\n        \"fontSize\": 12\n      },\n      {\n        \"name\": \"separator\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 20, \"y\": 96 },\n        \"width\": 170,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"qr_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 104 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"QR\"\n      },\n      {\n        \"name\": \"qr_code\",\n        \"type\": \"qrcode\",\n        \"position\": { \"x\": 20, \"y\": 112 },\n        \"width\": 30,\n        \"height\": 30,\n        \"content\": \"https://directus.io/docs\",\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\"\n      },\n      {\n        \"name\": \"ean_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 60, \"y\": 104 },\n        \"width\": 90,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"EAN-13\"\n      },\n      {\n        \"name\": \"ean_code\",\n        \"type\": \"ean13\",\n        \"position\": { \"x\": 60, \"y\": 112 },\n        \"width\": 90,\n        \"height\": 18,\n        \"content\": \"2112345678900\",\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\",\n        \"textColor\": \"#111827\",\n        \"includetext\": true\n      },\n      {\n        \"name\": \"footer\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 20, \"y\": 150 },\n        \"width\": 170,\n        \"height\": 10,\n        \"fontSize\": 10\n      }\n    ]\n  ]\n}\n\u003C/code>\u003C/pre>\n\u003Cp>Inputs:\u003C/p>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"title\": \"Hello PDF\",\n  \"body\": \"This document shows text, a shape, a divider line, a QR code, and an EAN-13 barcode generated from JSON.\",\n  \"qr_code\": \"https://directus.io/docs\",\n  \"ean_code\": \"2112345678900\",\n  \"footer\": \"Useful for receipts, labels, certificates, or simple printable layouts.\"\n}\n\u003C/code>\u003C/pre>\n\u003Ch2>Example Result\u003C/h2>\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/demo.jpg\" alt=\"Generate PDF demo\">\n\u003Cp>Multi-page inputs:\u003C/p>\n\u003Cpre>\u003Ccode class=\"language-json\">[\n  { \"title\": \"Page 1\", \"body\": \"First page\" },\n  { \"title\": \"Page 2\", \"body\": \"Second page\" }\n]\n\u003C/code>\u003C/pre>\n\u003Ch2>Invoice Example\u003C/h2>\n\u003Cp>Template:\u003C/p>\n\n  Show Template JSON\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"basePdf\": {\n    \"width\": 210,\n    \"height\": 297,\n    \"padding\": [10, 10, 10, 10]\n  },\n  \"schemas\": [\n    [\n      {\n        \"name\": \"header_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 18 },\n        \"width\": 170,\n        \"height\": 28,\n        \"borderWidth\": 0,\n        \"borderColor\": \"#0F172A\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"invoice_title\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 24 },\n        \"width\": 80,\n        \"height\": 12,\n        \"fontSize\": 22,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"INVOICE\"\n      },\n      {\n        \"name\": \"company_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 34 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Example Labs LLC\"\n      },\n      {\n        \"name\": \"invoice_number_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 24 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Number\"\n      },\n      {\n        \"name\": \"invoice_number\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 24 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"issue_date_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 32 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Date\"\n      },\n      {\n        \"name\": \"issue_date\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 32 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"due_date_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 132, \"y\": 40 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Due\"\n      },\n      {\n        \"name\": \"due_date\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 160, \"y\": 40 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"customer_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 56 },\n        \"width\": 82,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"seller_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 108, \"y\": 56 },\n        \"width\": 82,\n        \"height\": 42,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#FFFFFF\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"bill_to_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 60 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"Bill To\"\n      },\n      {\n        \"name\": \"customer_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 68 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 12,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"customer_tax_id\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 78 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"customer_address\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 86 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"from_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 60 },\n        \"width\": 20,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"content\": \"From\"\n      },\n      {\n        \"name\": \"seller_name\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 68 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 11,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"seller_tax_id\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 78 },\n        \"width\": 70,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"seller_address\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 112, \"y\": 86 },\n        \"width\": 70,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"items_header_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 108 },\n        \"width\": 170,\n        \"height\": 10,\n        \"borderWidth\": 0,\n        \"borderColor\": \"#E2E8F0\",\n        \"color\": \"#E2E8F0\",\n        \"radius\": 1\n      },\n      {\n        \"name\": \"items_header_line\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 20, \"y\": 118 },\n        \"width\": 170,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"description_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 111 },\n        \"width\": 78,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Description\"\n      },\n      {\n        \"name\": \"qty_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 110, \"y\": 111 },\n        \"width\": 15,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Qty\"\n      },\n      {\n        \"name\": \"price_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 111 },\n        \"width\": 20,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Price\"\n      },\n      {\n        \"name\": \"discount_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 150, \"y\": 111 },\n        \"width\": 16,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Disc.\"\n      },\n      {\n        \"name\": \"total_header\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 170, \"y\": 111 },\n        \"width\": 18,\n        \"height\": 6,\n        \"fontSize\": 8,\n        \"fontName\": \"Roboto-Bold\",\n        \"content\": \"Total\"\n      },\n      {\n        \"name\": \"invoice_items\",\n        \"type\": \"table\",\n        \"position\": { \"x\": 20, \"y\": 120 },\n        \"width\": 170,\n        \"height\": 64,\n        \"content\": \"[]\",\n        \"showHead\": false,\n        \"repeatHead\": false,\n        \"head\": [\"Description\", \"Qty\", \"Price\", \"Disc.\", \"Total\"],\n        \"headWidthPercentages\": [50, 12, 14, 10, 14],\n        \"tableStyles\": {\n          \"borderColor\": \"#CBD5E1\",\n          \"borderWidth\": 0.2\n        },\n        \"headStyles\": {\n          \"fontName\": \"Roboto-Bold\",\n          \"alignment\": \"left\",\n          \"verticalAlignment\": \"middle\",\n          \"fontSize\": 8,\n          \"lineHeight\": 1,\n          \"characterSpacing\": 0,\n          \"fontColor\": \"#0F172A\",\n          \"backgroundColor\": \"#E2E8F0\",\n          \"borderColor\": \"#CBD5E1\",\n          \"borderWidth\": { \"top\": 0, \"right\": 0, \"bottom\": 0, \"left\": 0 },\n          \"padding\": { \"top\": 2, \"right\": 2, \"bottom\": 2, \"left\": 2 }\n        },\n        \"bodyStyles\": {\n          \"fontName\": \"Roboto\",\n          \"alignment\": \"left\",\n          \"verticalAlignment\": \"middle\",\n          \"fontSize\": 8,\n          \"lineHeight\": 1,\n          \"characterSpacing\": 0,\n          \"fontColor\": \"#111827\",\n          \"backgroundColor\": \"#FFFFFF\",\n          \"alternateBackgroundColor\": \"#F8FAFC\",\n          \"borderColor\": \"#E2E8F0\",\n          \"borderWidth\": { \"top\": 0, \"right\": 0, \"bottom\": 0.1, \"left\": 0 },\n          \"padding\": { \"top\": 2, \"right\": 2, \"bottom\": 2, \"left\": 2 }\n        },\n        \"columnStyles\": {\n          \"alignment\": {\n            \"1\": \"center\",\n            \"2\": \"right\",\n            \"3\": \"right\",\n            \"4\": \"right\"\n          }\n        }\n      },\n      {\n        \"name\": \"totals_line\",\n        \"type\": \"line\",\n        \"position\": { \"x\": 120, \"y\": 194 },\n        \"width\": 70,\n        \"height\": 1,\n        \"color\": \"#CBD5E1\"\n      },\n      {\n        \"name\": \"subtotal_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 200 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Subtotal\"\n      },\n      {\n        \"name\": \"subtotal\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 200 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"discount_total_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 208 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Discount\"\n      },\n      {\n        \"name\": \"discount_total\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 208 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"tax_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 216 },\n        \"width\": 30,\n        \"height\": 6,\n        \"fontSize\": 9,\n        \"content\": \"Tax\"\n      },\n      {\n        \"name\": \"tax\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 216 },\n        \"width\": 25,\n        \"height\": 6,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"total_label\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 130, \"y\": 226 },\n        \"width\": 30,\n        \"height\": 7,\n        \"fontSize\": 10,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"total\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 165, \"y\": 226 },\n        \"width\": 25,\n        \"height\": 7,\n        \"fontSize\": 10,\n        \"fontName\": \"Roboto-Bold\"\n      },\n      {\n        \"name\": \"payment_box\",\n        \"type\": \"rectangle\",\n        \"position\": { \"x\": 20, \"y\": 244 },\n        \"width\": 170,\n        \"height\": 34,\n        \"borderWidth\": 1,\n        \"borderColor\": \"#CBD5E1\",\n        \"color\": \"#F8FAFC\",\n        \"radius\": 2\n      },\n      {\n        \"name\": \"payment_note\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 250 },\n        \"width\": 116,\n        \"height\": 12,\n        \"fontSize\": 9\n      },\n      {\n        \"name\": \"bank_reference\",\n        \"type\": \"text\",\n        \"position\": { \"x\": 24, \"y\": 264 },\n        \"width\": 116,\n        \"height\": 8,\n        \"fontSize\": 8\n      },\n      {\n        \"name\": \"payment_qr\",\n        \"type\": \"qrcode\",\n        \"position\": { \"x\": 150, \"y\": 250 },\n        \"width\": 24,\n        \"height\": 24,\n        \"backgroundColor\": \"#FFFFFF\",\n        \"barColor\": \"#111827\"\n      }\n    ]\n  ]\n}\n\u003C/code>\u003C/pre>\n\n\u003Cp>Inputs:\u003C/p>\n\n  Show Inputs JSON\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"invoice_number\": \"INV-0001\",\n  \"issue_date\": \"2026-02-28\",\n  \"due_date\": \"2026-03-15\",\n  \"customer_name\": \"Ada Lovelace\",\n  \"customer_tax_id\": \"Tax ID: 20-12345678-9\",\n  \"customer_address\": \"12 Analytical Engine St, London\",\n  \"seller_name\": \"Example Labs LLC\",\n  \"seller_tax_id\": \"VAT ID: GB-99887766\",\n  \"seller_address\": \"42 Computing Ave, Manchester\",\n  \"invoice_items\": [\n    [\"Discovery workshop and architecture review\", \"1\", \"$600.00\", \"$0.00\", \"$600.00\"],\n    [\"Custom flow development\", \"8\", \"$120.00\", \"$80.00\", \"$880.00\"],\n    [\"PDF template implementation\", \"3\", \"$150.00\", \"$0.00\", \"$450.00\"],\n    [\"QA and browser validation\", \"2\", \"$90.00\", \"$0.00\", \"$180.00\"],\n    [\"Deployment and handoff session\", \"1\", \"$220.00\", \"$20.00\", \"$200.00\"]\n  ],\n  \"subtotal\": \"$2,310.00\",\n  \"discount_total\": \"$100.00\",\n  \"tax\": \"$464.10\",\n  \"total_label\": \"Total\",\n  \"total\": \"$2,674.10\",\n  \"payment_note\": \"Please transfer the balance before the due date. Scan the QR to open the payment portal or use the bank reference below.\",\n  \"bank_reference\": \"Reference: INV-0001 | IBAN: GB82 WEST 1234 5698 7654 32\",\n  \"payment_qr\": \"https://pay.example.com/invoices/INV-0001\"\n}\n\u003C/code>\u003C/pre>\n\n\u003Ch2>Invoice example result\u003C/h2>\n\u003Cimg src=\"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/invoice_example.jpg\" alt=\"Invoice example result\">\n\u003Ch2>Generate Options Example\u003C/h2>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"title\": \"Invoice INV-0001\",\n  \"subject\": \"Professional services invoice\",\n  \"author\": \"Example Labs LLC\",\n  \"creator\": \"Directus Flow: Generate PDF\",\n  \"producer\": \"pdfme\",\n  \"keywords\": [\"invoice\", \"directus\", \"billing\", \"pdf\"],\n  \"colorType\": \"rgb\",\n  \"lang\": \"en\"\n}\n\u003C/code>\u003C/pre>\n\u003Ch2>License\u003C/h2>\n\u003Cp>MIT (\u003Ccode>MIT\u003C/code>)\u003C/p>\n","https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/edit_operation.jpg",[327,329,330],"https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/demo.jpg","https://raw.githubusercontent.com/cesarechazu/directus-extension-generate-pdf/main/img/invoice_example.jpg",{"id":332,"node_id":333,"name":334,"full_name":335,"private":265,"owner":336,"html_url":352,"description":353,"fork":265,"url":354,"forks_url":355,"keys_url":356,"collaborators_url":357,"teams_url":358,"hooks_url":359,"issue_events_url":360,"events_url":361,"assignees_url":362,"branches_url":363,"tags_url":364,"blobs_url":365,"git_tags_url":366,"git_refs_url":367,"trees_url":368,"statuses_url":369,"languages_url":370,"stargazers_url":371,"contributors_url":372,"subscribers_url":373,"subscription_url":374,"commits_url":375,"git_commits_url":376,"comments_url":377,"issue_comment_url":378,"contents_url":379,"compare_url":380,"merges_url":381,"archive_url":382,"downloads_url":383,"issues_url":384,"pulls_url":385,"milestones_url":386,"notifications_url":387,"labels_url":388,"releases_url":389,"deployments_url":390,"created_at":391,"updated_at":392,"pushed_at":393,"git_url":394,"ssh_url":395,"clone_url":396,"svn_url":352,"homepage":397,"size":398,"stargazers_count":399,"watchers_count":399,"language":400,"has_issues":401,"has_projects":401,"has_downloads":401,"has_wiki":265,"has_pages":265,"has_discussions":401,"forks_count":402,"mirror_url":10,"archived":265,"disabled":265,"open_issues_count":403,"license":404,"allow_forking":401,"is_template":265,"web_commit_signoff_required":265,"has_pull_requests":401,"pull_request_creation_policy":409,"topics":410,"visibility":351,"forks":402,"open_issues":403,"watchers":399,"default_branch":429,"temp_clone_token":10,"custom_properties":430,"organization":431,"network_count":402,"subscribers_count":432},7122594,"MDEwOlJlcG9zaXRvcnk3MTIyNTk0","directus","directus/directus",{"login":334,"id":337,"node_id":338,"avatar_url":339,"gravatar_id":278,"url":340,"html_url":341,"followers_url":342,"following_url":343,"gists_url":344,"starred_url":345,"subscriptions_url":346,"organizations_url":347,"repos_url":348,"events_url":349,"received_events_url":350,"type":100,"user_view_type":351,"site_admin":265},15967950,"MDEyOk9yZ2FuaXphdGlvbjE1OTY3OTUw","https://avatars.githubusercontent.com/u/15967950?v=4","https://api.github.com/users/directus","https://github.com/directus","https://api.github.com/users/directus/followers","https://api.github.com/users/directus/following{/other_user}","https://api.github.com/users/directus/gists{/gist_id}","https://api.github.com/users/directus/starred{/owner}{/repo}","https://api.github.com/users/directus/subscriptions","https://api.github.com/users/directus/orgs","https://api.github.com/users/directus/repos","https://api.github.com/users/directus/events{/privacy}","https://api.github.com/users/directus/received_events","public","https://github.com/directus/directus","The flexible backend for all your projects 🐰 Turn your DB into a headless CMS, admin panels, or apps with a custom UI, instant APIs, auth & more.","https://api.github.com/repos/directus/directus","https://api.github.com/repos/directus/directus/forks","https://api.github.com/repos/directus/directus/keys{/key_id}","https://api.github.com/repos/directus/directus/collaborators{/collaborator}","https://api.github.com/repos/directus/directus/teams","https://api.github.com/repos/directus/directus/hooks","https://api.github.com/repos/directus/directus/issues/events{/number}","https://api.github.com/repos/directus/directus/events","https://api.github.com/repos/directus/directus/assignees{/user}","https://api.github.com/repos/directus/directus/branches{/branch}","https://api.github.com/repos/directus/directus/tags","https://api.github.com/repos/directus/directus/git/blobs{/sha}","https://api.github.com/repos/directus/directus/git/tags{/sha}","https://api.github.com/repos/directus/directus/git/refs{/sha}","https://api.github.com/repos/directus/directus/git/trees{/sha}","https://api.github.com/repos/directus/directus/statuses/{sha}","https://api.github.com/repos/directus/directus/languages","https://api.github.com/repos/directus/directus/stargazers","https://api.github.com/repos/directus/directus/contributors","https://api.github.com/repos/directus/directus/subscribers","https://api.github.com/repos/directus/directus/subscription","https://api.github.com/repos/directus/directus/commits{/sha}","https://api.github.com/repos/directus/directus/git/commits{/sha}","https://api.github.com/repos/directus/directus/comments{/number}","https://api.github.com/repos/directus/directus/issues/comments{/number}","https://api.github.com/repos/directus/directus/contents/{+path}","https://api.github.com/repos/directus/directus/compare/{base}...{head}","https://api.github.com/repos/directus/directus/merges","https://api.github.com/repos/directus/directus/{archive_format}{/ref}","https://api.github.com/repos/directus/directus/downloads","https://api.github.com/repos/directus/directus/issues{/number}","https://api.github.com/repos/directus/directus/pulls{/number}","https://api.github.com/repos/directus/directus/milestones{/number}","https://api.github.com/repos/directus/directus/notifications{?since,all,participating}","https://api.github.com/repos/directus/directus/labels{/name}","https://api.github.com/repos/directus/directus/releases{/id}","https://api.github.com/repos/directus/directus/deployments","2012-12-12T01:35:36Z","2026-04-08T08:37:13Z","2026-04-08T08:46:17Z","git://github.com/directus/directus.git","git@github.com:directus/directus.git","https://github.com/directus/directus.git","https://directus.io",438854,34715,"TypeScript",true,4681,375,{"key":405,"name":406,"spdx_id":407,"url":10,"node_id":408},"other","Other","NOASSERTION","MDc6TGljZW5zZTA=","all",[159,411,412,413,414,415,334,416,417,418,419,420,421,422,423,424,425,426,427,428],"app","cms","composable","data-visualization","database","graphql","headless-cms","javascript","mariadb","mssql","mysql","no-code","node","postgresql","sql","sqlite","typescript","vue","main",{},{"login":334,"id":337,"node_id":338,"avatar_url":339,"gravatar_id":278,"url":340,"html_url":341,"followers_url":342,"following_url":343,"gists_url":344,"starred_url":345,"subscriptions_url":346,"organizations_url":347,"repos_url":348,"events_url":349,"received_events_url":350,"type":100,"user_view_type":351,"site_admin":265},327,[434],{"id":435,"icon":436,"content":437,"link":438,"include_paths":10,"exclude_paths":10},"812bf73d-ebfb-4246-9538-937a09a0c795","connected_tv","Learn more about our native MCP","https://directus.io/mcp",{"id":126,"title":440,"description":441,"image":442,"external_url":10,"icon":10,"badge":10,"page":443,"resource":10},"Built With Directus","See what everyone's been building with Directus","e658de72-fb08-4ed2-8029-215c712c789e",{"permalink":444},"/built-with-directus",{"id":187,"title":446,"description":447,"image":448,"external_url":449,"icon":436,"badge":450,"page":10,"resource":10},"Directus TV","Go down the rabbit hole with hours of original video content from our team. ","ab70faf5-fc28-4608-a7e7-74fd4f020a9d","/tv","Video",{"alignment":452,"style":453,"experiment_enabled":265,"experiment":10,"experiment_variant":454,"buttons":457,"variants":467},"center","default",{"id":455,"key":456,"experiment":10},"8c4951b4-a6f9-4c06-9f71-fd39a3bdad1e","control",[458,461,464],{"id":459,"block_button_id":460},15,"358b0659-1f05-4427-bd1c-4bc03a43c182",{"id":462,"block_button_id":463},16,"9df3f40e-6272-4ec6-a0d7-cc29265e087c",{"id":465,"block_button_id":466},232,"1b444c23-b593-4391-9410-4ca5d2c7a7cb",[468],{"id":469,"alignment":452,"style":453,"buttons":470,"experiment_variant":477},"e1885d45-3119-41a3-8294-3cd796ea6f02",[471,474],{"id":472,"block_button_id":473},203,"ade37731-147d-48c4-864a-cec007576362",{"id":475,"block_button_id":476},202,"1cb4e89f-f7de-4b46-bbb8-080191517a72",{"id":478,"key":479},"66d2be4f-2492-4944-8060-039c15515918","variant",{"id":466,"external_url":97,"label":481,"color":482,"outline":401,"icon":483,"size":484,"target":485,"ph_event":10,"page":10,"resource":10},"Log In","secondary","arrow_forward","medium","_self",{"id":460,"external_url":10,"label":487,"color":488,"outline":265,"icon":10,"size":484,"target":485,"ph_event":10,"page":489,"resource":10},"Book a Demo","primary",{"permalink":490},"/demo",{"id":463,"external_url":492,"label":493,"color":482,"outline":265,"icon":10,"size":484,"target":485,"ph_event":10,"page":10,"resource":10},"https://directus.cloud/account/register","Get Started"]