@blockslides/ai-context 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +36 -0
- package/README.md +268 -0
- package/dist/index.cjs +806 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +704 -0
- package/dist/index.d.ts +704 -0
- package/dist/index.js +781 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
- package/src/bundles/v1/all.ts +26 -0
- package/src/bundles/v1/allContexts.ts +32 -0
- package/src/bundles/v1/allSchemas.ts +20 -0
- package/src/bundles/v1/imageEditing.ts +5 -0
- package/src/bundles/v1/index.ts +6 -0
- package/src/bundles/v1/minimalCreate.ts +5 -0
- package/src/contexts/v1/blockquote.ts +14 -0
- package/src/contexts/v1/bulletList.ts +15 -0
- package/src/contexts/v1/codeBlock.ts +15 -0
- package/src/contexts/v1/column.ts +15 -0
- package/src/contexts/v1/core.ts +17 -0
- package/src/contexts/v1/editingRules.ts +9 -0
- package/src/contexts/v1/hardBreak.ts +14 -0
- package/src/contexts/v1/heading.ts +15 -0
- package/src/contexts/v1/horizontalRule.ts +14 -0
- package/src/contexts/v1/image.ts +17 -0
- package/src/contexts/v1/imageBlock.ts +27 -0
- package/src/contexts/v1/index.ts +19 -0
- package/src/contexts/v1/output.fullDocument.ts +8 -0
- package/src/contexts/v1/paragraph.ts +14 -0
- package/src/contexts/v1/row.ts +17 -0
- package/src/contexts/v1/sizing.ts +8 -0
- package/src/contexts/v1/slide.ts +16 -0
- package/src/contexts/v1/style.ts +8 -0
- package/src/contexts/v1/youtube.ts +18 -0
- package/src/examples/v1/flyers.ts +30 -0
- package/src/examples/v1/index.ts +4 -0
- package/src/examples/v1/slides.ts +31 -0
- package/src/index.ts +7 -0
- package/src/recipes/v1/addTwoColumns.ts +13 -0
- package/src/recipes/v1/createSlide.ts +29 -0
- package/src/recipes/v1/editImageToCover.ts +13 -0
- package/src/recipes/v1/index.ts +5 -0
- package/src/schemas/v1/blockquote.schema.json +16 -0
- package/src/schemas/v1/bulletList.schema.json +16 -0
- package/src/schemas/v1/codeBlock.schema.json +19 -0
- package/src/schemas/v1/column.schema.json +23 -0
- package/src/schemas/v1/hardBreak.schema.json +16 -0
- package/src/schemas/v1/heading.schema.json +23 -0
- package/src/schemas/v1/horizontalRule.schema.json +16 -0
- package/src/schemas/v1/image.schema.json +23 -0
- package/src/schemas/v1/imageBlock.schema.json +31 -0
- package/src/schemas/v1/index.ts +14 -0
- package/src/schemas/v1/paragraph.schema.json +16 -0
- package/src/schemas/v1/row.schema.json +22 -0
- package/src/schemas/v1/slide.schema.json +32 -0
- package/src/schemas/v1/youtube.schema.json +22 -0
- package/src/types/v1.ts +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/v1/index.ts","../src/contexts/v1/core.ts","../src/contexts/v1/output.fullDocument.ts","../src/contexts/v1/imageBlock.ts","../src/contexts/v1/row.ts","../src/contexts/v1/column.ts","../src/contexts/v1/slide.ts","../src/contexts/v1/style.ts","../src/contexts/v1/editingRules.ts","../src/contexts/v1/sizing.ts","../src/contexts/v1/blockquote.ts","../src/contexts/v1/bulletList.ts","../src/contexts/v1/codeBlock.ts","../src/contexts/v1/hardBreak.ts","../src/contexts/v1/horizontalRule.ts","../src/contexts/v1/image.ts","../src/contexts/v1/heading.ts","../src/contexts/v1/paragraph.ts","../src/contexts/v1/youtube.ts","../src/examples/v1/index.ts","../src/examples/v1/slides.ts","../src/examples/v1/flyers.ts","../src/bundles/v1/index.ts","../src/bundles/v1/minimalCreate.ts","../src/bundles/v1/imageEditing.ts","../src/bundles/v1/all.ts","../src/schemas/v1/index.ts","../src/schemas/v1/imageBlock.schema.json","../src/schemas/v1/row.schema.json","../src/schemas/v1/column.schema.json","../src/schemas/v1/slide.schema.json","../src/schemas/v1/blockquote.schema.json","../src/schemas/v1/bulletList.schema.json","../src/schemas/v1/codeBlock.schema.json","../src/schemas/v1/hardBreak.schema.json","../src/schemas/v1/horizontalRule.schema.json","../src/schemas/v1/image.schema.json","../src/schemas/v1/heading.schema.json","../src/schemas/v1/paragraph.schema.json","../src/schemas/v1/youtube.schema.json","../src/bundles/v1/allSchemas.ts","../src/bundles/v1/allContexts.ts","../src/recipes/v1/index.ts","../src/recipes/v1/createSlide.ts","../src/recipes/v1/addTwoColumns.ts","../src/recipes/v1/editImageToCover.ts"],"sourcesContent":["export { core } from \"./core\";\nexport { fullDocument } from \"./output.fullDocument\";\nexport { imageBlock } from \"./imageBlock\";\nexport { row } from \"./row\";\nexport { column } from \"./column\";\nexport { slide } from \"./slide\";\nexport { style } from \"./style\";\nexport { editingRules } from \"./editingRules\";\nexport { sizing } from \"./sizing\";\nexport { blockquote } from \"./blockquote\";\nexport { bulletList } from \"./bulletList\";\nexport { codeBlock } from \"./codeBlock\";\nexport { hardBreak } from \"./hardBreak\";\nexport { horizontalRule } from \"./horizontalRule\";\nexport { image } from \"./image\";\nexport { heading } from \"./heading\";\nexport { paragraph } from \"./paragraph\";\nexport { youtube } from \"./youtube\";\n\n","export const core = `\nYou are given a BlockSlides document to CREATE or EDIT.\n\nDocument shape:\n- doc: { type: \"doc\", content: slide[] }\n- slide: { type: \"slide\", attrs?, content: row[] }\n- row: { type: \"row\", attrs?, content: column[] | block[] }\n- column: { type: \"column\", attrs?, content: (block | row)[] }\n- block: includes nodes like paragraph, heading, imageBlock, etc.\n\nRules:\n- Use only known node types and valid attrs. Do not invent attributes.\n- Prefer stable references: preserve slide.attrs.id if present.\n- Slides and flyers share the same JSON; flyers are slides sized via attrs and theme.\n`.trim();\n\n\n","export const fullDocument = `\nOutput contract:\n- Return exactly one JSON object representing the ENTIRE document.\n- No prose, no markdown, no code fences, no comments. JSON only.\n- Include all required attrs. Use allowed enum values only.\n`.trim();\n\n\n","export const imageBlock = `\nNode: imageBlock\nAttrs:\n- src (required): string (URL)\n- alt (optional): string\n- caption (optional): string\n- credit (optional): string\n- layout (optional): \"cover\" | \"contain\" | \"fill\" | \"focus\" | \"pattern\"\n- align (optional): \"left\" | \"center\" | \"right\" | \"stretch\" (default \"center\")\n- width (optional): number (px) or string (\"%\"/\"px\")\n- height (optional): number (px) or string (\"%\"/\"px\")\n- fullBleed (optional): boolean (removes radius; stretches width)\n- assetId (optional): string\n- focalX, focalY (optional): 0–100; spotlight position (when relevant)\n\nBehavior:\n- Numbers for width/height are interpreted as pixels.\n- layout:\n - cover: Fill container; crop edges as needed.\n - contain: Fit entirely; may letterbox.\n - fill: Stretch to container (may distort).\n - focus: Cover + radial spotlight at focalX/focalY.\n - pattern: Hide <img>; use tiled background (from src).\n- Do not set unknown attributes. Preserve existing valid attrs.\n`.trim();\n\n\n","export const row = `\nNode: row\nAttrs:\n- layout (optional): \"\", \"1\", \"1-1\", \"2-1\", \"1-2\", \"1-1-1\", \"2-1-1\", \"1-2-1\", \"1-1-2\", \"1-1-1-1\"\n- className (optional): string (CSS classes)\n\nSemantics:\n- Fractions determine relative column flex:\n - 1-1: two equal columns\n - 2-1: first column is double width\n - 1-2: second column is double width\n - 1-1-1: three equal columns\n - 1-1-1-1: four equal columns\n- Empty layout (\"\", \"1\") acts as a single full-width column.\n`.trim();\n\n\n","export const column = `\nNode: column\nAttrs:\n- className (optional): string\n- contentMode (optional): \"default\" (future-friendly)\n- verticalAlign (optional): \"top\" | \"center\" | \"bottom\" (default \"top\")\n- horizontalAlign (optional): \"left\" | \"center\" | \"right\" | \"stretch\" (default \"left\")\n- padding (optional): \"none\" (future-friendly)\n\nNotes:\n- Use className for spacing, colors, typography (e.g., Tailwind).\n- Keep nesting shallow; columns can contain rows or blocks as needed.\n`.trim();\n\n\n","export const slide = `\nNode: slide\nAttrs:\n- id (optional): string (stable identifier; preserve if present)\n- className (optional): string (styling)\n- size (optional): \"16x9\" | \"4x3\" | \"a4-portrait\" | \"a4-landscape\" | \"letter-portrait\" | \"letter-landscape\" | \"linkedin-banner\"\n\nContent:\n- slide contains one or more rows.\n\nNotes:\n- Flyers are slides sized for paper (e.g., size: \"a4-portrait\").\n- Set size to control canvas dimensions; theme applies the exact width/height.\n`.trim();\n\n\n","export const style = `\nStyling\n- Prefer using attrs.className for styling (e.g., Tailwind classes).\n- Use enums for canonical behaviors (e.g., imageBlock.layout).\n- When enums are insufficient (spacing, backgrounds), use className.\n`.trim();\n\n\n","export const editingRules = `\nEditing rules\n- Preserve existing ids and valid attributes. Do not remove or rename known attrs.\n- Use only allowed enum values. Do not invent new enum values.\n- Avoid introducing new attrs. If styling is needed, prefer className.\n- Keep the document valid: slide > row > column > blocks.\n`.trim();\n\n\n","export const sizing = `\nSizing\n- Slides and flyers share the same JSON. Flyers are slides sized via slide.attrs.size and theme rules.\n- Allowed sizes: \"16x9\" | \"4x3\" | \"a4-portrait\" | \"a4-landscape\" | \"letter-portrait\" | \"letter-landscape\" | \"linkedin-banner\".\n- Editors may render with fixed canvases or dynamic mode. The default is fixed; dynamic stretches to container with preserved aspect.\n`.trim();\n\n\n","export const blockquote = `\nNode: blockquote\nAttrs:\n- HTML-only; no required JSON attrs beyond optional styling such as className.\n\nContent:\n- One or more block nodes (typically paragraphs, headings, lists).\n\nSemantics:\n- Use for quoted text or callouts inside a column or row.\n- Styling should be applied via className on the surrounding column/slide, not by inventing new attrs here.\n`.trim();\n\n\n","export const bulletList = `\nNode: bulletList\nAttrs:\n- HTML-only; no required JSON attrs beyond optional styling such as className.\n\nContent:\n- One or more list item nodes (listItem) that contain paragraphs or inline content.\n\nSemantics:\n- Represents an unordered list rendered as <ul>.\n- Use when you need bullet points inside a column or blockquote.\n- Do not use bulletList as a top-level child of doc; it belongs inside a column/row structure.\n`.trim();\n\n\n","export const codeBlock = `\nNode: codeBlock\nAttrs:\n- language (optional): string | null (e.g., \"js\", \"ts\", \"python\").\n\nContent:\n- Plain text only (no child nodes); used for preformatted code samples.\n\nSemantics:\n- Renders as <pre><code>…</code></pre>.\n- language controls a CSS class (e.g., \"language-js\") for syntax highlighting.\n- Use when the user explicitly wants a fenced code block, not inline code in a paragraph.\n`.trim();\n\n\n","export const hardBreak = `\nNode: hardBreak\nAttrs:\n- None (HTML-only); behaves like a manual line break.\n\nContent:\n- Inline-only; used within paragraphs or headings.\n\nSemantics:\n- Renders as <br> and as a newline in plain text exports.\n- Use when the user requests a line break without starting a new paragraph.\n`.trim();\n\n\n","export const horizontalRule = `\nNode: horizontalRule\nAttrs:\n- HTML-only; no JSON attrs beyond optional styling via surrounding layout.\n\nContent:\n- No children; this is a self-contained separator.\n\nSemantics:\n- Renders as <hr>.\n- Use to visually separate sections within a slide (for example, between rows of text).\n`.trim();\n\n\n","export const image = `\nNode: image\nAttrs:\n- src (required): string (URL to the image).\n- alt (optional): string (accessibility text).\n- title (optional): string (tooltip / caption).\n- width, height (optional): numbers (px) used as hints for rendering.\n\nContent:\n- No children; this is an atomic inline or block-level image node depending on editor configuration.\n\nSemantics:\n- Renders as a simple <img>, unlike imageBlock which adds rich framing/caption UI.\n- Prefer imageBlock for designed layouts; use image for simple inline images in paragraphs.\n`.trim();\n\n\n","export const heading = `\nNode: heading\nAttrs:\n- level (required): 1 | 2 | 3 | 4 | 5 | 6.\n\nContent:\n- Inline content (text, marks, inline nodes).\n\nSemantics:\n- Renders as <h1>…<h6> depending on level.\n- Use level 1–2 for main slide titles, 3–4 for section headings, 5–6 for subtle labels.\n- Do not invent other attrs; typography/styling should come from className on columns/slides.\n`.trim();\n\n\n","export const paragraph = `\nNode: paragraph\nAttrs:\n- HTML-only; no structured JSON attrs beyond optional styling such as className.\n\nContent:\n- Inline content (text with marks, inline nodes such as image or hardBreak).\n\nSemantics:\n- Default text block inside columns and rows.\n- Multiple paragraphs can be stacked within the same column to create vertical rhythm.\n`.trim();\n\n\n","export const youtube = `\nNode: youtube\nAttrs:\n- src (required): string (public YouTube URL).\n- start (optional): number (start time in seconds).\n- width (optional): number (frame width in px).\n- height (optional): number (frame height in px).\n\nContent:\n- No children; this is an atomic embed node.\n\nSemantics:\n- Renders as an embedded YouTube iframe wrapped in a container <div>.\n- Use for video embeds inside a column or row; keep other text in separate paragraphs/columns.\n- Do not embed raw <iframe> HTML directly; always use the youtube node with attrs.\n`.trim();\n\n\n","export { slides } from \"./slides\";\nexport { flyers } from \"./flyers\";\n\n\n","export const slides = `\nExamples: Slides (full-document output)\n\n{\n \"type\": \"doc\",\n \"content\": [\n {\n \"type\": \"slide\",\n \"attrs\": { \"id\": \"intro\", \"size\": \"16x9\" },\n \"content\": [\n {\n \"type\": \"row\",\n \"attrs\": { \"layout\": \"1-1\" },\n \"content\": [\n { \"type\": \"column\", \"content\": [\n { \"type\": \"heading\", \"attrs\": { \"level\": 2 }, \"content\": [{ \"type\": \"text\", \"text\": \"Welcome\" }] }\n ]},\n { \"type\": \"column\", \"content\": [\n { \"type\": \"imageBlock\", \"attrs\": { \"src\": \"https://picsum.photos/seed/welcome/1200/800\", \"layout\": \"cover\", \"align\": \"center\" } }\n ]}\n ]\n }\n ]\n }\n ]\n}\n\n/* more-slide-examples to be added here */\n`.trim();\n\n\n","export const flyers = `\nExamples: Flyers (A4 slides; full-document output)\n\n{\n \"type\": \"doc\",\n \"content\": [\n {\n \"type\": \"slide\",\n \"attrs\": { \"id\": \"a4-flyer\", \"size\": \"a4-portrait\", \"className\": \"bg-white text-slate-900\" },\n \"content\": [\n {\n \"type\": \"row\",\n \"attrs\": { \"layout\": \"1\" },\n \"content\": [\n { \"type\": \"column\", \"content\": [\n { \"type\": \"heading\", \"attrs\": { \"level\": 2 }, \"content\": [{ \"type\": \"text\", \"text\": \"Event Title\" }] },\n { \"type\": \"paragraph\", \"content\": [{ \"type\": \"text\", \"text\": \"Date · Location\" }] },\n { \"type\": \"imageBlock\", \"attrs\": { \"src\": \"https://picsum.photos/seed/a4/1600/1000\", \"layout\": \"contain\", \"align\": \"center\", \"height\": 320 } }\n ]}\n ]\n }\n ]\n }\n ]\n}\n\n/* more-flyer-examples to be added here */\n`.trim();\n\n\n","export { minimalCreate } from \"./minimalCreate\";\nexport { imageEditing } from \"./imageEditing\";\nexport { all } from \"./all\";\nexport { allSchemas } from \"./allSchemas\";\nexport { allContexts } from \"./allContexts\";\n\n","import { core, fullDocument, slide, row, column, style } from \"../../contexts/v1\";\n\nexport const minimalCreate = [core, fullDocument, slide, row, column, style].join(\"\\n\\n\");\n\n\n","import { core, fullDocument, imageBlock, editingRules } from \"../../contexts/v1\";\n\nexport const imageEditing = [core, fullDocument, imageBlock, editingRules].join(\"\\n\\n\");\n\n\n","import * as ctx from \"../../contexts/v1\";\n\nexport const all = [\n ctx.core,\n ctx.fullDocument,\n ctx.slide,\n ctx.row,\n ctx.column,\n ctx.style,\n ctx.sizing,\n // Core content blocks and media\n ctx.imageBlock,\n ctx.blockquote,\n ctx.bulletList,\n ctx.heading,\n ctx.paragraph,\n ctx.image,\n ctx.codeBlock,\n ctx.hardBreak,\n ctx.horizontalRule,\n ctx.youtube,\n // Editing behavior\n ctx.editingRules,\n].join(\"\\n\\n\");\n\n\n","export { default as imageBlock } from \"./imageBlock.schema.json\";\nexport { default as row } from \"./row.schema.json\";\nexport { default as column } from \"./column.schema.json\";\nexport { default as slide } from \"./slide.schema.json\";\nexport { default as blockquote } from \"./blockquote.schema.json\";\nexport { default as bulletList } from \"./bulletList.schema.json\";\nexport { default as codeBlock } from \"./codeBlock.schema.json\";\nexport { default as hardBreak } from \"./hardBreak.schema.json\";\nexport { default as horizontalRule } from \"./horizontalRule.schema.json\";\nexport { default as image } from \"./image.schema.json\";\nexport { default as heading } from \"./heading.schema.json\";\nexport { default as paragraph } from \"./paragraph.schema.json\";\nexport { default as youtube } from \"./youtube.schema.json\";\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"imageBlock\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"imageBlock\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"src\": { \"type\": \"string\", \"minLength\": 1 },\n \"alt\": { \"type\": \"string\" },\n \"caption\": { \"type\": \"string\" },\n \"credit\": { \"type\": \"string\" },\n \"layout\": { \"enum\": [\"cover\", \"contain\", \"fill\", \"focus\", \"pattern\", null] },\n \"align\": { \"enum\": [\"left\", \"center\", \"right\", \"stretch\", null] },\n \"width\": { \"type\": [\"number\", \"string\", \"null\"] },\n \"height\": { \"type\": [\"number\", \"string\", \"null\"] },\n \"fullBleed\": { \"type\": \"boolean\" },\n \"assetId\": { \"type\": [\"string\", \"null\"] },\n \"focalX\": { \"type\": [\"number\", \"null\"], \"minimum\": 0, \"maximum\": 100 },\n \"focalY\": { \"type\": [\"number\", \"null\"], \"minimum\": 0, \"maximum\": 100 }\n },\n \"required\": [\"src\"],\n \"additionalProperties\": false\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"row\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"row\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"layout\": {\n \"enum\": [\"\", \"1\", \"1-1\", \"2-1\", \"1-2\", \"1-1-1\", \"2-1-1\", \"1-2-1\", \"1-1-2\", \"1-1-1-1\", null]\n },\n \"className\": { \"type\": [\"string\", \"null\"] }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"column\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"column\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"className\": { \"type\": [\"string\", \"null\"] },\n \"contentMode\": { \"enum\": [\"default\", null] },\n \"verticalAlign\": { \"enum\": [\"top\", \"center\", \"bottom\", null] },\n \"horizontalAlign\": { \"enum\": [\"left\", \"center\", \"right\", \"stretch\", null] },\n \"padding\": { \"enum\": [\"none\", null] }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"slide\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"slide\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": [\"string\", \"null\"] },\n \"className\": { \"type\": [\"string\", \"null\"] },\n \"size\": {\n \"enum\": [\n \"16x9\",\n \"4x3\",\n \"a4-portrait\",\n \"a4-landscape\",\n \"letter-portrait\",\n \"letter-landscape\",\n \"linkedin-banner\",\n null\n ]\n }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"blockquote\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"blockquote\" },\n \"attrs\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"bulletList\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"bulletList\" },\n \"attrs\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"codeBlock\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"codeBlock\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"language\": { \"type\": [\"string\", \"null\"] }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"hardBreak\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"hardBreak\" },\n \"attrs\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"horizontalRule\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"horizontalRule\" },\n \"attrs\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"image\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"image\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"src\": { \"type\": [\"string\", \"null\"] },\n \"alt\": { \"type\": [\"string\", \"null\"] },\n \"title\": { \"type\": [\"string\", \"null\"] },\n \"width\": { \"type\": [\"number\", \"null\"] },\n \"height\": { \"type\": [\"number\", \"null\"] }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"heading\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"heading\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 6\n }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"paragraph\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"paragraph\" },\n \"attrs\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"youtube\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"const\": \"youtube\" },\n \"attrs\": {\n \"type\": \"object\",\n \"properties\": {\n \"src\": { \"type\": [\"string\", \"null\"] },\n \"start\": { \"type\": \"number\" },\n \"width\": { \"type\": \"number\" },\n \"height\": { \"type\": \"number\" }\n },\n \"additionalProperties\": true\n }\n },\n \"required\": [\"type\"],\n \"additionalProperties\": false\n}\n\n\n","import * as schemas from \"../../schemas/v1\";\n\n/**\n * Human- and AI-readable bundle of all v1 JSON Schemas.\n *\n * This is intended for:\n * - LLMs that want to see the exact JSON Schema contracts\n * - Tools that want a single text blob containing every schema\n *\n * Each schema is pretty-printed and prefixed with its key name.\n */\nexport const allSchemas = Object.entries(schemas)\n .map(\n ([name, schema]) =>\n `Schema \"${name}\":\\n` + JSON.stringify(schema as unknown, null, 2)\n )\n .join(\"\\n\\n\");\n\n\n\n","import * as ctx from \"../../contexts/v1\";\n\n/**\n * All v1 context atoms concatenated into a single string.\n *\n * Intended for:\n * - LLMs that should know about every supported node type and layout primitive\n * - Power users who want a “maximal” context (structure + nodes + editing rules + sizing)\n */\nexport const allContexts = [\n ctx.core,\n ctx.fullDocument,\n ctx.slide,\n ctx.row,\n ctx.column,\n ctx.style,\n ctx.sizing,\n ctx.imageBlock,\n ctx.blockquote,\n ctx.bulletList,\n ctx.heading,\n ctx.paragraph,\n ctx.image,\n ctx.codeBlock,\n ctx.hardBreak,\n ctx.horizontalRule,\n ctx.youtube,\n ctx.editingRules,\n].join(\"\\n\\n\");\n\n\n\n","export { createSlide } from \"./createSlide\";\nexport { addTwoColumns } from \"./addTwoColumns\";\nexport { editImageToCover } from \"./editImageToCover\";\n\n\n","import { core, fullDocument, slide, row, column } from \"../../contexts/v1\";\n\nexport const createSlide = [\n core,\n fullDocument,\n slide,\n row,\n column,\n `\nReturn a single JSON document that creates one 16x9 slide with a 1-1 row:\n{\n \"type\": \"doc\",\n \"content\": [\n {\n \"type\": \"slide\",\n \"attrs\": { \"size\": \"16x9\" },\n \"content\": [\n { \"type\": \"row\", \"attrs\": { \"layout\": \"1-1\" }, \"content\": [\n { \"type\": \"column\", \"content\": [{ \"type\": \"paragraph\", \"content\": [{ \"type\": \"text\", \"text\": \"Left\" }] }] },\n { \"type\": \"column\", \"content\": [{ \"type\": \"paragraph\", \"content\": [{ \"type\": \"text\", \"text\": \"Right\" }] }] }\n ] }\n ]\n }\n ]\n}\n`.trim(),\n].join(\"\\n\\n\");\n\n\n","import { core, fullDocument, row, column } from \"../../contexts/v1\";\n\nexport const addTwoColumns = [\n core,\n fullDocument,\n row,\n column,\n `\nReturn a full document where the first slide contains a row with layout \"1-1\" and two columns with simple text paragraphs.\n`.trim(),\n].join(\"\\n\\n\");\n\n\n","import { core, fullDocument, imageBlock, editingRules } from \"../../contexts/v1\";\n\nexport const editImageToCover = [\n core,\n fullDocument,\n imageBlock,\n editingRules,\n `\nUpdate an existing imageBlock on the first slide so it uses layout \"cover\" and align \"center\". Preserve all other attributes.\n`.trim(),\n].join(\"\\n\\n\");\n\n\n"],"mappings":"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","names":["v1_exports","v1_exports","v1_exports","v1_exports","v1_exports"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@blockslides/ai-context",
|
|
3
|
+
"description": "AI context snippets for BlockSlides (v1 atoms, examples, schemas, types)",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"blockslides",
|
|
7
|
+
"ai",
|
|
8
|
+
"context",
|
|
9
|
+
"slides"
|
|
10
|
+
],
|
|
11
|
+
"author": "keivanmojmali",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": {
|
|
17
|
+
"import": "./dist/index.d.ts",
|
|
18
|
+
"require": "./dist/index.d.cts"
|
|
19
|
+
},
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"require": "./dist/index.cjs"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"main": "dist/index.cjs",
|
|
25
|
+
"module": "dist/index.js",
|
|
26
|
+
"types": "dist/index.d.ts",
|
|
27
|
+
"files": [
|
|
28
|
+
"src",
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/keivanmojmali/blockslides",
|
|
34
|
+
"directory": "packages/ai-context"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.0.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsup",
|
|
42
|
+
"dev": "tsup --watch"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as ctx from "../../contexts/v1";
|
|
2
|
+
|
|
3
|
+
export const all = [
|
|
4
|
+
ctx.core,
|
|
5
|
+
ctx.fullDocument,
|
|
6
|
+
ctx.slide,
|
|
7
|
+
ctx.row,
|
|
8
|
+
ctx.column,
|
|
9
|
+
ctx.style,
|
|
10
|
+
ctx.sizing,
|
|
11
|
+
// Core content blocks and media
|
|
12
|
+
ctx.imageBlock,
|
|
13
|
+
ctx.blockquote,
|
|
14
|
+
ctx.bulletList,
|
|
15
|
+
ctx.heading,
|
|
16
|
+
ctx.paragraph,
|
|
17
|
+
ctx.image,
|
|
18
|
+
ctx.codeBlock,
|
|
19
|
+
ctx.hardBreak,
|
|
20
|
+
ctx.horizontalRule,
|
|
21
|
+
ctx.youtube,
|
|
22
|
+
// Editing behavior
|
|
23
|
+
ctx.editingRules,
|
|
24
|
+
].join("\n\n");
|
|
25
|
+
|
|
26
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as ctx from "../../contexts/v1";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* All v1 context atoms concatenated into a single string.
|
|
5
|
+
*
|
|
6
|
+
* Intended for:
|
|
7
|
+
* - LLMs that should know about every supported node type and layout primitive
|
|
8
|
+
* - Power users who want a “maximal” context (structure + nodes + editing rules + sizing)
|
|
9
|
+
*/
|
|
10
|
+
export const allContexts = [
|
|
11
|
+
ctx.core,
|
|
12
|
+
ctx.fullDocument,
|
|
13
|
+
ctx.slide,
|
|
14
|
+
ctx.row,
|
|
15
|
+
ctx.column,
|
|
16
|
+
ctx.style,
|
|
17
|
+
ctx.sizing,
|
|
18
|
+
ctx.imageBlock,
|
|
19
|
+
ctx.blockquote,
|
|
20
|
+
ctx.bulletList,
|
|
21
|
+
ctx.heading,
|
|
22
|
+
ctx.paragraph,
|
|
23
|
+
ctx.image,
|
|
24
|
+
ctx.codeBlock,
|
|
25
|
+
ctx.hardBreak,
|
|
26
|
+
ctx.horizontalRule,
|
|
27
|
+
ctx.youtube,
|
|
28
|
+
ctx.editingRules,
|
|
29
|
+
].join("\n\n");
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as schemas from "../../schemas/v1";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Human- and AI-readable bundle of all v1 JSON Schemas.
|
|
5
|
+
*
|
|
6
|
+
* This is intended for:
|
|
7
|
+
* - LLMs that want to see the exact JSON Schema contracts
|
|
8
|
+
* - Tools that want a single text blob containing every schema
|
|
9
|
+
*
|
|
10
|
+
* Each schema is pretty-printed and prefixed with its key name.
|
|
11
|
+
*/
|
|
12
|
+
export const allSchemas = Object.entries(schemas)
|
|
13
|
+
.map(
|
|
14
|
+
([name, schema]) =>
|
|
15
|
+
`Schema "${name}":\n` + JSON.stringify(schema as unknown, null, 2)
|
|
16
|
+
)
|
|
17
|
+
.join("\n\n");
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const blockquote = `
|
|
2
|
+
Node: blockquote
|
|
3
|
+
Attrs:
|
|
4
|
+
- HTML-only; no required JSON attrs beyond optional styling such as className.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- One or more block nodes (typically paragraphs, headings, lists).
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Use for quoted text or callouts inside a column or row.
|
|
11
|
+
- Styling should be applied via className on the surrounding column/slide, not by inventing new attrs here.
|
|
12
|
+
`.trim();
|
|
13
|
+
|
|
14
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const bulletList = `
|
|
2
|
+
Node: bulletList
|
|
3
|
+
Attrs:
|
|
4
|
+
- HTML-only; no required JSON attrs beyond optional styling such as className.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- One or more list item nodes (listItem) that contain paragraphs or inline content.
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Represents an unordered list rendered as <ul>.
|
|
11
|
+
- Use when you need bullet points inside a column or blockquote.
|
|
12
|
+
- Do not use bulletList as a top-level child of doc; it belongs inside a column/row structure.
|
|
13
|
+
`.trim();
|
|
14
|
+
|
|
15
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const codeBlock = `
|
|
2
|
+
Node: codeBlock
|
|
3
|
+
Attrs:
|
|
4
|
+
- language (optional): string | null (e.g., "js", "ts", "python").
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- Plain text only (no child nodes); used for preformatted code samples.
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Renders as <pre><code>…</code></pre>.
|
|
11
|
+
- language controls a CSS class (e.g., "language-js") for syntax highlighting.
|
|
12
|
+
- Use when the user explicitly wants a fenced code block, not inline code in a paragraph.
|
|
13
|
+
`.trim();
|
|
14
|
+
|
|
15
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const column = `
|
|
2
|
+
Node: column
|
|
3
|
+
Attrs:
|
|
4
|
+
- className (optional): string
|
|
5
|
+
- contentMode (optional): "default" (future-friendly)
|
|
6
|
+
- verticalAlign (optional): "top" | "center" | "bottom" (default "top")
|
|
7
|
+
- horizontalAlign (optional): "left" | "center" | "right" | "stretch" (default "left")
|
|
8
|
+
- padding (optional): "none" (future-friendly)
|
|
9
|
+
|
|
10
|
+
Notes:
|
|
11
|
+
- Use className for spacing, colors, typography (e.g., Tailwind).
|
|
12
|
+
- Keep nesting shallow; columns can contain rows or blocks as needed.
|
|
13
|
+
`.trim();
|
|
14
|
+
|
|
15
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const core = `
|
|
2
|
+
You are given a BlockSlides document to CREATE or EDIT.
|
|
3
|
+
|
|
4
|
+
Document shape:
|
|
5
|
+
- doc: { type: "doc", content: slide[] }
|
|
6
|
+
- slide: { type: "slide", attrs?, content: row[] }
|
|
7
|
+
- row: { type: "row", attrs?, content: column[] | block[] }
|
|
8
|
+
- column: { type: "column", attrs?, content: (block | row)[] }
|
|
9
|
+
- block: includes nodes like paragraph, heading, imageBlock, etc.
|
|
10
|
+
|
|
11
|
+
Rules:
|
|
12
|
+
- Use only known node types and valid attrs. Do not invent attributes.
|
|
13
|
+
- Prefer stable references: preserve slide.attrs.id if present.
|
|
14
|
+
- Slides and flyers share the same JSON; flyers are slides sized via attrs and theme.
|
|
15
|
+
`.trim();
|
|
16
|
+
|
|
17
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const editingRules = `
|
|
2
|
+
Editing rules
|
|
3
|
+
- Preserve existing ids and valid attributes. Do not remove or rename known attrs.
|
|
4
|
+
- Use only allowed enum values. Do not invent new enum values.
|
|
5
|
+
- Avoid introducing new attrs. If styling is needed, prefer className.
|
|
6
|
+
- Keep the document valid: slide > row > column > blocks.
|
|
7
|
+
`.trim();
|
|
8
|
+
|
|
9
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const hardBreak = `
|
|
2
|
+
Node: hardBreak
|
|
3
|
+
Attrs:
|
|
4
|
+
- None (HTML-only); behaves like a manual line break.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- Inline-only; used within paragraphs or headings.
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Renders as <br> and as a newline in plain text exports.
|
|
11
|
+
- Use when the user requests a line break without starting a new paragraph.
|
|
12
|
+
`.trim();
|
|
13
|
+
|
|
14
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const heading = `
|
|
2
|
+
Node: heading
|
|
3
|
+
Attrs:
|
|
4
|
+
- level (required): 1 | 2 | 3 | 4 | 5 | 6.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- Inline content (text, marks, inline nodes).
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Renders as <h1>…<h6> depending on level.
|
|
11
|
+
- Use level 1–2 for main slide titles, 3–4 for section headings, 5–6 for subtle labels.
|
|
12
|
+
- Do not invent other attrs; typography/styling should come from className on columns/slides.
|
|
13
|
+
`.trim();
|
|
14
|
+
|
|
15
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const horizontalRule = `
|
|
2
|
+
Node: horizontalRule
|
|
3
|
+
Attrs:
|
|
4
|
+
- HTML-only; no JSON attrs beyond optional styling via surrounding layout.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- No children; this is a self-contained separator.
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Renders as <hr>.
|
|
11
|
+
- Use to visually separate sections within a slide (for example, between rows of text).
|
|
12
|
+
`.trim();
|
|
13
|
+
|
|
14
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const image = `
|
|
2
|
+
Node: image
|
|
3
|
+
Attrs:
|
|
4
|
+
- src (required): string (URL to the image).
|
|
5
|
+
- alt (optional): string (accessibility text).
|
|
6
|
+
- title (optional): string (tooltip / caption).
|
|
7
|
+
- width, height (optional): numbers (px) used as hints for rendering.
|
|
8
|
+
|
|
9
|
+
Content:
|
|
10
|
+
- No children; this is an atomic inline or block-level image node depending on editor configuration.
|
|
11
|
+
|
|
12
|
+
Semantics:
|
|
13
|
+
- Renders as a simple <img>, unlike imageBlock which adds rich framing/caption UI.
|
|
14
|
+
- Prefer imageBlock for designed layouts; use image for simple inline images in paragraphs.
|
|
15
|
+
`.trim();
|
|
16
|
+
|
|
17
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const imageBlock = `
|
|
2
|
+
Node: imageBlock
|
|
3
|
+
Attrs:
|
|
4
|
+
- src (required): string (URL)
|
|
5
|
+
- alt (optional): string
|
|
6
|
+
- caption (optional): string
|
|
7
|
+
- credit (optional): string
|
|
8
|
+
- layout (optional): "cover" | "contain" | "fill" | "focus" | "pattern"
|
|
9
|
+
- align (optional): "left" | "center" | "right" | "stretch" (default "center")
|
|
10
|
+
- width (optional): number (px) or string ("%"/"px")
|
|
11
|
+
- height (optional): number (px) or string ("%"/"px")
|
|
12
|
+
- fullBleed (optional): boolean (removes radius; stretches width)
|
|
13
|
+
- assetId (optional): string
|
|
14
|
+
- focalX, focalY (optional): 0–100; spotlight position (when relevant)
|
|
15
|
+
|
|
16
|
+
Behavior:
|
|
17
|
+
- Numbers for width/height are interpreted as pixels.
|
|
18
|
+
- layout:
|
|
19
|
+
- cover: Fill container; crop edges as needed.
|
|
20
|
+
- contain: Fit entirely; may letterbox.
|
|
21
|
+
- fill: Stretch to container (may distort).
|
|
22
|
+
- focus: Cover + radial spotlight at focalX/focalY.
|
|
23
|
+
- pattern: Hide <img>; use tiled background (from src).
|
|
24
|
+
- Do not set unknown attributes. Preserve existing valid attrs.
|
|
25
|
+
`.trim();
|
|
26
|
+
|
|
27
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { core } from "./core";
|
|
2
|
+
export { fullDocument } from "./output.fullDocument";
|
|
3
|
+
export { imageBlock } from "./imageBlock";
|
|
4
|
+
export { row } from "./row";
|
|
5
|
+
export { column } from "./column";
|
|
6
|
+
export { slide } from "./slide";
|
|
7
|
+
export { style } from "./style";
|
|
8
|
+
export { editingRules } from "./editingRules";
|
|
9
|
+
export { sizing } from "./sizing";
|
|
10
|
+
export { blockquote } from "./blockquote";
|
|
11
|
+
export { bulletList } from "./bulletList";
|
|
12
|
+
export { codeBlock } from "./codeBlock";
|
|
13
|
+
export { hardBreak } from "./hardBreak";
|
|
14
|
+
export { horizontalRule } from "./horizontalRule";
|
|
15
|
+
export { image } from "./image";
|
|
16
|
+
export { heading } from "./heading";
|
|
17
|
+
export { paragraph } from "./paragraph";
|
|
18
|
+
export { youtube } from "./youtube";
|
|
19
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const paragraph = `
|
|
2
|
+
Node: paragraph
|
|
3
|
+
Attrs:
|
|
4
|
+
- HTML-only; no structured JSON attrs beyond optional styling such as className.
|
|
5
|
+
|
|
6
|
+
Content:
|
|
7
|
+
- Inline content (text with marks, inline nodes such as image or hardBreak).
|
|
8
|
+
|
|
9
|
+
Semantics:
|
|
10
|
+
- Default text block inside columns and rows.
|
|
11
|
+
- Multiple paragraphs can be stacked within the same column to create vertical rhythm.
|
|
12
|
+
`.trim();
|
|
13
|
+
|
|
14
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const row = `
|
|
2
|
+
Node: row
|
|
3
|
+
Attrs:
|
|
4
|
+
- layout (optional): "", "1", "1-1", "2-1", "1-2", "1-1-1", "2-1-1", "1-2-1", "1-1-2", "1-1-1-1"
|
|
5
|
+
- className (optional): string (CSS classes)
|
|
6
|
+
|
|
7
|
+
Semantics:
|
|
8
|
+
- Fractions determine relative column flex:
|
|
9
|
+
- 1-1: two equal columns
|
|
10
|
+
- 2-1: first column is double width
|
|
11
|
+
- 1-2: second column is double width
|
|
12
|
+
- 1-1-1: three equal columns
|
|
13
|
+
- 1-1-1-1: four equal columns
|
|
14
|
+
- Empty layout ("", "1") acts as a single full-width column.
|
|
15
|
+
`.trim();
|
|
16
|
+
|
|
17
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const sizing = `
|
|
2
|
+
Sizing
|
|
3
|
+
- Slides and flyers share the same JSON. Flyers are slides sized via slide.attrs.size and theme rules.
|
|
4
|
+
- Allowed sizes: "16x9" | "4x3" | "a4-portrait" | "a4-landscape" | "letter-portrait" | "letter-landscape" | "linkedin-banner".
|
|
5
|
+
- Editors may render with fixed canvases or dynamic mode. The default is fixed; dynamic stretches to container with preserved aspect.
|
|
6
|
+
`.trim();
|
|
7
|
+
|
|
8
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const slide = `
|
|
2
|
+
Node: slide
|
|
3
|
+
Attrs:
|
|
4
|
+
- id (optional): string (stable identifier; preserve if present)
|
|
5
|
+
- className (optional): string (styling)
|
|
6
|
+
- size (optional): "16x9" | "4x3" | "a4-portrait" | "a4-landscape" | "letter-portrait" | "letter-landscape" | "linkedin-banner"
|
|
7
|
+
|
|
8
|
+
Content:
|
|
9
|
+
- slide contains one or more rows.
|
|
10
|
+
|
|
11
|
+
Notes:
|
|
12
|
+
- Flyers are slides sized for paper (e.g., size: "a4-portrait").
|
|
13
|
+
- Set size to control canvas dimensions; theme applies the exact width/height.
|
|
14
|
+
`.trim();
|
|
15
|
+
|
|
16
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const youtube = `
|
|
2
|
+
Node: youtube
|
|
3
|
+
Attrs:
|
|
4
|
+
- src (required): string (public YouTube URL).
|
|
5
|
+
- start (optional): number (start time in seconds).
|
|
6
|
+
- width (optional): number (frame width in px).
|
|
7
|
+
- height (optional): number (frame height in px).
|
|
8
|
+
|
|
9
|
+
Content:
|
|
10
|
+
- No children; this is an atomic embed node.
|
|
11
|
+
|
|
12
|
+
Semantics:
|
|
13
|
+
- Renders as an embedded YouTube iframe wrapped in a container <div>.
|
|
14
|
+
- Use for video embeds inside a column or row; keep other text in separate paragraphs/columns.
|
|
15
|
+
- Do not embed raw <iframe> HTML directly; always use the youtube node with attrs.
|
|
16
|
+
`.trim();
|
|
17
|
+
|
|
18
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const flyers = `
|
|
2
|
+
Examples: Flyers (A4 slides; full-document output)
|
|
3
|
+
|
|
4
|
+
{
|
|
5
|
+
"type": "doc",
|
|
6
|
+
"content": [
|
|
7
|
+
{
|
|
8
|
+
"type": "slide",
|
|
9
|
+
"attrs": { "id": "a4-flyer", "size": "a4-portrait", "className": "bg-white text-slate-900" },
|
|
10
|
+
"content": [
|
|
11
|
+
{
|
|
12
|
+
"type": "row",
|
|
13
|
+
"attrs": { "layout": "1" },
|
|
14
|
+
"content": [
|
|
15
|
+
{ "type": "column", "content": [
|
|
16
|
+
{ "type": "heading", "attrs": { "level": 2 }, "content": [{ "type": "text", "text": "Event Title" }] },
|
|
17
|
+
{ "type": "paragraph", "content": [{ "type": "text", "text": "Date · Location" }] },
|
|
18
|
+
{ "type": "imageBlock", "attrs": { "src": "https://picsum.photos/seed/a4/1600/1000", "layout": "contain", "align": "center", "height": 320 } }
|
|
19
|
+
]}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* more-flyer-examples to be added here */
|
|
28
|
+
`.trim();
|
|
29
|
+
|
|
30
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const slides = `
|
|
2
|
+
Examples: Slides (full-document output)
|
|
3
|
+
|
|
4
|
+
{
|
|
5
|
+
"type": "doc",
|
|
6
|
+
"content": [
|
|
7
|
+
{
|
|
8
|
+
"type": "slide",
|
|
9
|
+
"attrs": { "id": "intro", "size": "16x9" },
|
|
10
|
+
"content": [
|
|
11
|
+
{
|
|
12
|
+
"type": "row",
|
|
13
|
+
"attrs": { "layout": "1-1" },
|
|
14
|
+
"content": [
|
|
15
|
+
{ "type": "column", "content": [
|
|
16
|
+
{ "type": "heading", "attrs": { "level": 2 }, "content": [{ "type": "text", "text": "Welcome" }] }
|
|
17
|
+
]},
|
|
18
|
+
{ "type": "column", "content": [
|
|
19
|
+
{ "type": "imageBlock", "attrs": { "src": "https://picsum.photos/seed/welcome/1200/800", "layout": "cover", "align": "center" } }
|
|
20
|
+
]}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* more-slide-examples to be added here */
|
|
29
|
+
`.trim();
|
|
30
|
+
|
|
31
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { core, fullDocument, row, column } from "../../contexts/v1";
|
|
2
|
+
|
|
3
|
+
export const addTwoColumns = [
|
|
4
|
+
core,
|
|
5
|
+
fullDocument,
|
|
6
|
+
row,
|
|
7
|
+
column,
|
|
8
|
+
`
|
|
9
|
+
Return a full document where the first slide contains a row with layout "1-1" and two columns with simple text paragraphs.
|
|
10
|
+
`.trim(),
|
|
11
|
+
].join("\n\n");
|
|
12
|
+
|
|
13
|
+
|