Working paper in two minutes, then a page of your own, wired into your own interaction system
Four stages: press Play in the bundled showroom and see everything working, author a page
of your own, put it on an actor in your level, and wire reading into the interaction
system your project already has. That last stage is the point — Inkwell’s reading pipeline
is built to be driven by your interact verb, and the bundled demo pieces exist only to
show you the calls.If the plugin is not installed and enabled yet, do Installation first —
this page assumes the Page Editor button is in your Level Editor toolbar.
1
Press Play in the showroom
In the Content Browser, open Settings and turn on Show Plugin Content. Then
browse to Plugins → Inkwell Content → Maps and open L_InkwellShowroom.
Press Play.You are standing in a room of readable paper: six podium exhibits, a gallery wall and
a wall poster. Walk up to any of them:
Input
Does
WASD / mouse
Walk and look
E
Pick up the page you are looking at (and put it back)
Left / Right arrow or mouse wheel
Turn pages — a sheet with a written back turns over first, book order
F
Flip the sheet over to its back
Q
Put the page back where it lay
The sample note on its podium in the showroom.
The map works in an empty project because its GameMode Override is the Inkwell
Reader Game Mode (AInkwellReaderGameMode), which spawns the Inkwell Reader
Character — a first-person pawn whose movement and look input is built at runtime in
C++, so no project input assets are involved at all.
Everything that makes the showroom play by itself — the reader game mode, the reader
character, the Ink Page Interactor component, the exhibit component and the read
prompt widget — is a demo and reference implementation, not recommended for production
use. The production components are Ink Page Display, Ink Page Stack, the Ink Page
actor and widget, and the Ink Page Reader — the component your own interaction
system drives in step 4.
2
Create and author an Ink Page Document
In the Content Browser, right-click in the empty space of a folder in your project and
choose Inkwell → Page Document. Name the asset and press Enter.That asset (UInkPageDocument) is the content: every page, every layer, the paper and
the default text style. A new one is seeded from your project settings so it renders
something immediately — a 1024 × 1400 px page, the bundled plain paper texture, and
the project’s default font at Regular weight. It opens straight into the Page Editor.
Other ways to create and open documents
Inkwell's Page Editor button (1) sits at the right end of the Level Editor toolbar.
From the Level Editor toolbar, open the Page Editor dropdown and choose
Create New Page Document… — you get an asset-save dialog, and the new document
opens in the editor when you confirm. The same dropdown holds Edit Document…
(a browser dialog), Recent / All Documents (documents you edited recently plus a
filter-as-you-type list of every one in the project), and a Documentation entry
that opens this site. Right-clicking a placed actor that references a document
offers Inkwell → Edit Pages (DocumentName)… in the viewport too.
The Inkwell menu, from the Page Editor button in the Level Editor toolbar.
The window opens in three resizable panes:
The Page Editor, with the three panes it opens in.
1
1 — Left panel
Everything about the document: Pages, Page Setup, Paper & Ink,
Custom Mesh, Default Text Style, Drawing Tools, and the
Save Document button at the bottom.
2
2 — Toolbar
Styling for the text you have selected: font family, size, B / I / U /
-S-, text color, and the three justify buttons. On the right, Mode
switches the page surface between Text, Image and Draw.
3
3 — The page
The paper itself, at the shape you authored. In Text mode you click into it and
type; each text box is outlined so you can see where it ends.
4
4 — Right panel
3D Preview (game-true ink) on top — the page put through the same bake path
the game uses — and Layers (front to back) underneath.
Click on the paper and type. A new document opens with one Text layer that fills the
page inside the document margins, so you can start writing immediately. Then style it:
select some text, pick a font family (the five bundled families are listed first),
set a size, toggle B / I / U / -S-, or click the color block to
recolor the selection. Watch the 3D Preview on the right as you go — it is the
truth: if a font falls back or a color reads wrong there, it will read wrong in game.When you want more than one block of text, an image, or something drawn by hand, use
the buttons under the Layers list: + Text, + Image, + Drawing. See
Layers, Drawing and
Paper — none of it is needed for this walkthrough.Finish by clicking Save Document at the bottom of the left panel.
Save from that button rather than from the Content Browser. Rich-text markup stores
fonts as string paths, which the cooker cannot see — Save Document is what
refreshes the document’s Font References list so those fonts get cooked. Skip it
and styled runs fall back to the default font in a packaged build.
3
Put the page on an actor in your level
Two routes. Take the first if you want paper in the world; take the second if the note
belongs on a prop, a desk, a clipboard or a corkboard you already have.
Drop in an Ink Page actor
Add a display to an actor you already have
Open the Place Actors panel (Window → Place Actors), search for
Ink Page, and drag it into your level. It is the ready-made single sheet
(AInkPageActor) and lands as a flat piece of paper.With it selected, find the PageDisplay component in the Details panel’s
component list and set its Document to your new asset. The writing appears on
the sheet immediately — the display component previews in the editor viewport, no
Play needed.The sheet then sizes itself: Page Width Cm from the document (21 cm, the width
of A4, unless you changed it) with the height following the page’s shape. Two knobs
adjust this copy without touching the document:
Property
Where
What it does
Page Scale
the PageDisplay component
1 is the document’s own size, 2 twice as big, 0.5 half. Scales both axes together, so the writing never stretches.
Page Yaw
the actor, under Inkwell | Sheet
Spins the sheet about its own normal so the writing reads upright for your scene.
Select the actor in the level (or open its Blueprint), click Add Component, and
add Ink Page Display. Set its Document to your asset.Procedural Paper is on by default, and it is what makes this a one-property
setup: if the actor has no mesh of its own, the component spawns a paper sheet,
attaches it to the actor’s root, and sizes it from the document. Swap in a document
authored at a different size and the sheet resizes, live in the viewport.It never takes a mesh away from you. If the actor already has a mesh component — or
you pick one in Target Mesh — the page is drawn onto that instead and no sheet
is spawned. Turn Procedural Paper off to leave a mesh-less actor drawing
nothing.
Drawing onto your own mesh needs clean 0–1 UVs across the page face. An
atlas-mapped prop mesh will garble the text, because the baked ink is sampled
across the full 0–1 range. If the prop has several material slots, set
Material Slot to the one the paper face uses.
Nothing appeared on the actor
No mesh, and Procedural Paper turned off: the component has nowhere to
draw. Turn it back on, or set Target Mesh.
The page landed on the wrong material slot — Material Slot is 0 by default.
Preview In Editor is off: the page still appears in Play, but not in the
viewport.
Nothing in the level at all: check the Output Log for LogInkwell — the
component logs a warning naming exactly what is misconfigured.
Press Play and walk over to it. The page is real geometry at the size you authored, so
it reads from a normal standing distance — and lean in and the strokes hold, because
the ink is baked at the document’s own pixel resolution rather than stretched from a
small texture.
4
Wire reading into YOUR interaction system
To let the player pick the page up — float it in front of the camera, turn pages, put
it back exactly where it lay — add an Ink Page Reader
(UInkPageReaderComponent) to your pawn or player controller.The reader is the production presentation engine, and it contains no input handling
whatsoever: it is a pure snap-into-view service that your interaction code calls.
Whatever your project’s interact verb is — an Enhanced Input action, a trace in a base
interactable Blueprint, a trigger volume — the wiring is the same four calls:
Begin reading. In your interact handler, take the actor your existing focus
trace hit and call Begin Reading Actor on the reader — it finds the Ink Page
Display on the actor for you. (Call Begin Reading instead if you already have
the display component.) It returns false when the actor has no readable page or
something is already being read, so you can fall through to your other
interactables.
Turn pages. From your UI or input, call Next Page and Previous Page on
the reader. On a sheet with an authored back, Next Page reads in book order —
front, back, then the next page.
Flip the sheet.Flip Page turns the held page over to show its back.
Out of the box the reader also binds F to this (Bind Flip Key, default on,
key editable) — turn that off once you bind your own flip input.
Put it back.End Reading floats the page back to exactly where it lay.
Bind the reader’s events to keep your HUD honest: On Reading Started /
On Reading Ended (hide the crosshair, show a “put back” prompt), and
On Reading Side Changed for a Front / Back label that swaps exactly on the turn.While a page is held, the reader stops the pawn by default — Lock Movement While
Reading and Lock Look While Reading are both on, and release the moment
End Reading is called. The hold distance is computed from the page’s real size
(Fit Page To View, default on), so a sticky note and a poster are both held where
they fill the screen comfortably.
Two reference implementations show this wiring, both demo-only:
The Ink Page Interactor (UInkPageInteractorComponent) is the complete “look
at a page, press a key, read it” component from the showroom — a view trace every
0.1 s out to 300 cm, an On Focus Changed event for a prompt, and default keys
(E / Q / Left / Right, plus the mouse wheel) behind an
Enable Default Input switch. Read it as a worked example; in production, make
the calls above from your own system instead. See
Ink Page Interactor.
The example input assets in /Inkwell/Examples/Input/ — IA_Interact,
IA_NextPage, IA_PreviousPage, IA_PutBack and the mapping context
IMC_InkwellDefault binding them to E / Right / Left / Q and the mouse wheel — are
there for projects that drive their own pawn with Enhanced Input and want
ready-made actions to start from.
The worked example: a base interactable Blueprint, focus prompts, reading, page turns
and flips, all driven by your own system.
Ink Page Reader
Every property and Blueprint node on the component your interaction system drives.
The Page Editor
The toolbar, the three modes, layers, paper and the game-true preview, end to end.
Example content
What ships in the showroom and /Inkwell/Examples/, and how each piece is wired.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Teriyaki Gaming","colors":{"primary":"#3E7C59","light":"#9DC08B","dark":"#2E5C42"},"logo":{"light":"https://mintcdn.com/teriyaki-gaming/Re9zDOvKF1471rVG/logo/light.svg?fit=max\u0026auto=format\u0026n=Re9zDOvKF1471rVG\u0026q=85\u0026s=9a862161962dd66d099129095f3c5f3a","dark":"https://mintcdn.com/teriyaki-gaming/Re9zDOvKF1471rVG/logo/dark.svg?fit=max\u0026auto=format\u0026n=Re9zDOvKF1471rVG\u0026q=85\u0026s=f4855dde947be30313d5c3441a026eea"},"favicon":"https://mintcdn.com/teriyaki-gaming/lWew69cnc3CohWUG/favicon.svg?fit=max\u0026auto=format\u0026n=lWew69cnc3CohWUG\u0026q=85\u0026s=898db809dce8aa888bcceb5be4cda06b","footer":{"socials":{"github":"https://github.com/tyguymedia"}},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"teriyaki-gaming","hasAudioNarration":false,"actualSubdomain":"teriyaki-gaming","customDomains":["docs.teriyakigaming.com"],"gitSource":{"type":"github","owner":"tyguymedia","repo":"teriyakigaming-site","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a8db7a9f751bf22e13d95af","collectionId":"6f0199bb-c8ed-4bdf-ab20-c7697fa048dd","liveDeploymentHistoryId":"6a8db7a9f751bf22e13d95af","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a8db7a9f751bf22e13d95af","clientVersion":"0.0.3939","searchFilterCounts":[{"language":"default","tag":"Inkwell","count":23},{"language":"default","tag":"Authoring","count":6},{"language":"default","tag":"Components","count":6},{"language":"default","tag":"Guides","count":4},{"language":"default","tag":"Reference","count":4},{"language":"default","tag":"Get Started","count":3},{"language":"default","tag":"Overview","count":1},{"language":"default","tag":"Getting started","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"plugins/inkwell/quickstart","slug":"/plugins/inkwell/quickstart","pageMetadata":{"title":"Quickstart","description":"Working paper in two minutes, then a page of your own, wired into your own interaction system","icon":"rocket","href":"/plugins/inkwell/quickstart"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Working paper in two minutes, then a page of your own, wired into your own interaction system\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,Card,CardGroup,Frame,Heading,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Four stages: press Play in the bundled showroom and see everything working, author a page\nof your own, put it on an actor in your level, and wire reading into the interaction\nsystem your project already has. That last stage is the point — Inkwell’s reading pipeline\nis built to be driven by `,_jsx(_components.em,{children:`your`}),` interact verb, and the bundled demo pieces exist only to\nshow you the calls.`]}),`\n`,_jsxs(_components.p,{children:[`If the plugin is not installed and enabled yet, do `,_jsx(_components.a,{href:`/plugins/inkwell/installation`,children:`Installation`}),` first —\nthis page assumes the `,_jsx(_components.strong,{children:`Page Editor`}),` button is in your Level Editor toolbar.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Press Play in the showroom`,children:[_jsxs(_components.p,{children:[`In the Content Browser, open `,_jsx(_components.strong,{children:`Settings`}),` and turn on `,_jsx(_components.strong,{children:`Show Plugin Content`}),`. Then\nbrowse to `,_jsx(_components.strong,{children:`Plugins → Inkwell Content → Maps`}),` and open `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`L_InkwellShowroom`})}),`.\nPress Play.`]}),_jsx(_components.p,{children:`You are standing in a room of readable paper: six podium exhibits, a gallery wall and\na wall poster. Walk up to any of them:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Input`}),_jsx(_components.th,{children:`Does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`WASD`}),` / mouse`]}),_jsx(_components.td,{children:`Walk and look`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`E`})}),_jsx(_components.td,{children:`Pick up the page you are looking at (and put it back)`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Left / Right arrow`}),` or mouse wheel`]}),_jsx(_components.td,{children:`Turn pages — a sheet with a written back turns over first, book order`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`F`})}),_jsx(_components.td,{children:`Flip the sheet over to its back`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Q`})}),_jsx(_components.td,{children:`Put the page back where it lay`})]})]})]}),_jsx(Frame,{caption:`The sample note on its podium in the showroom.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=0b9fc79f3e77ed8d3976a39a7fa9498b`,alt:`An Inkwell note placed in the showroom level`,\"data-og-width\":`980`,width:`980`,\"data-og-height\":`690`,height:`690`,\"data-path\":`images/inkwell/note-in-level.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=280\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=92511427c0f396e684fbfba93605e772 280w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=560\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=2456e26042ea87da2ea47caebf968dfb 560w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=840\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=154e7c53f1ac53d9dde52b80410b69ea 840w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=1100\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=8066c7b1adeef780d78e0932d06f1afb 1100w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=1650\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=f0b8a1e673e91d268f63b92c251a288e 1650w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/note-in-level.png?w=2500\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=588a282342acb38a66bb536e753569ce 2500w`})}),_jsxs(_components.p,{children:[`The map works in an empty project because its GameMode Override is the `,_jsx(_components.strong,{children:`Inkwell\nReader Game Mode`}),` (`,_jsx(_components.code,{children:`AInkwellReaderGameMode`}),`), which spawns the `,_jsx(_components.strong,{children:`Inkwell Reader\nCharacter`}),` — a first-person pawn whose movement and look input is built at runtime in\nC++, so no project input assets are involved at all.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Everything that makes the showroom play by itself — the reader game mode, the reader\ncharacter, the `,_jsx(_components.strong,{children:`Ink Page Interactor`}),` component, the exhibit component and the read\nprompt widget — is a demo and reference implementation, not recommended for production\nuse. The production components are Ink Page Display, Ink Page Stack, the Ink Page\nactor and widget, and the `,_jsx(_components.strong,{children:`Ink Page Reader`}),` — the component your own interaction\nsystem drives in step 4.`]})})]}),_jsxs(Step,{title:`Create and author an Ink Page Document`,children:[_jsxs(_components.p,{children:[`In the Content Browser, right-click in the empty space of a folder in your project and\nchoose `,_jsx(_components.strong,{children:`Inkwell → Page Document`}),`. Name the asset and press Enter.`]}),_jsxs(_components.p,{children:[`That asset (`,_jsx(_components.code,{children:`UInkPageDocument`}),`) is the content: every page, every layer, the paper and\nthe default text style. A new one is seeded from your project settings so it renders\nsomething immediately — a 1024 × 1400 px page, the bundled plain paper texture, and\nthe project’s default font at Regular weight. It opens straight into the Page Editor.`]}),_jsxs(Accordion,{title:`Other ways to create and open documents`,id:`other-ways-to-create-and-open-documents`,children:[_jsx(Frame,{caption:`Inkwell's Page Editor button (1) sits at the right end of the Level Editor toolbar.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=5d0dc18233acaeffa70e3e93b1b3f06c`,alt:`The Level Editor toolbar with the Inkwell Page Editor dropdown button highlighted`,\"data-og-width\":`764`,width:`764`,\"data-og-height\":`102`,height:`102`,\"data-path\":`images/inkwell/toolbar-icon.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=280\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=2270e7572ad07bfca109f53692b755f5 280w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=560\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=cc1dcce9c2d9784972abeb6554c2a573 560w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=840\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=cb899f9cc42a231d6d71af9aae243632 840w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=1100\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=28cb030da88ae16d6c846be929e84ba9 1100w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=1650\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=517a352185e96c68d5aedc18a4fbb58f 1650w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-icon.png?w=2500\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=70f671f786af34294b091fc5db4463b4 2500w`})}),_jsxs(_components.p,{children:[`From the Level Editor toolbar, open the `,_jsx(_components.strong,{children:`Page Editor`}),` dropdown and choose\n`,_jsx(_components.strong,{children:`Create New Page Document…`}),` — you get an asset-save dialog, and the new document\nopens in the editor when you confirm. The same dropdown holds `,_jsx(_components.strong,{children:`Edit Document…`}),`\n(a browser dialog), `,_jsx(_components.strong,{children:`Recent / All Documents`}),` (documents you edited recently plus a\nfilter-as-you-type list of every one in the project), and a `,_jsx(_components.strong,{children:`Documentation`}),` entry\nthat opens this site. Right-clicking a placed actor that references a document\noffers `,_jsxs(_components.strong,{children:[`Inkwell → Edit Pages (`,_jsx(_components.em,{children:`DocumentName`}),`)…`]}),` in the viewport too.`]}),_jsx(Frame,{caption:`The Inkwell menu, from the Page Editor button in the Level Editor toolbar.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=c0828c272105f1d37ef06e601ace956f`,alt:`The Inkwell menu: Edit Document, Recent / All Documents, Create New Page Document, Import Font Family`,\"data-og-width\":`231`,width:`231`,\"data-og-height\":`217`,height:`217`,\"data-path\":`images/inkwell/toolbar-dropdown.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=280\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=a41e616447fe3c09db27733e0c461262 280w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=560\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=ceab2475da712a790494a0b1ec688bfb 560w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=840\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=07ebe6a7921f08797cc4e235d19e5142 840w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=1100\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=903c1a3a71a221b0781f428aa52fc2e1 1100w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=1650\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=64d5fa2afd9c5078786bcc7f33e9bcf7 1650w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/toolbar-dropdown.png?w=2500\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=55f892a325b1dc724d169ba2e6bef41b 2500w`})})]}),_jsx(_components.p,{children:`The window opens in three resizable panes:`}),_jsx(Frame,{caption:`The Page Editor, with the three panes it opens in.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=7caf7f09b5a16c1ec77d70bc77a261ad`,alt:`The Inkwell Page Editor window`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`968`,height:`968`,\"data-path\":`images/inkwell/page-editor-overview.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=280\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=77b3f0739a6e6ff3551b7632387c7637 280w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=560\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=1001ca6ca415775b9b4c1b8f0e1941c9 560w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=840\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=dbd91090a0210d0438a2cf175f032372 840w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=1100\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=6fc953e4639e1bddc7bf8f6738d43b83 1100w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=1650\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=cec4a4685dd986edf7572cd83af9a063 1650w, https://mintcdn.com/teriyaki-gaming/rfYUFiwAdsWmGZKv/images/inkwell/page-editor-overview.png?w=2500\u0026fit=max\u0026auto=format\u0026n=rfYUFiwAdsWmGZKv\u0026q=85\u0026s=39233bc715a740e9ec8a52ecadd1f89b 2500w`})}),_jsxs(Steps,{children:[_jsx(Step,{title:`1 — Left panel`,children:_jsxs(_components.p,{children:[`Everything about the document: `,_jsx(_components.strong,{children:`Pages`}),`, `,_jsx(_components.strong,{children:`Page Setup`}),`, `,_jsx(_components.strong,{children:`Paper \u0026 Ink`}),`,\n`,_jsx(_components.strong,{children:`Custom Mesh`}),`, `,_jsx(_components.strong,{children:`Default Text Style`}),`, `,_jsx(_components.strong,{children:`Drawing Tools`}),`, and the\n`,_jsx(_components.strong,{children:`Save Document`}),` button at the bottom.`]})}),_jsx(Step,{title:`2 — Toolbar`,children:_jsxs(_components.p,{children:[`Styling for the text you have selected: font family, size, `,_jsx(_components.strong,{children:`B`}),` / `,_jsx(_components.strong,{children:`I`}),` / `,_jsx(_components.strong,{children:`U`}),` /\n`,_jsx(_components.strong,{children:`-S-`}),`, text color, and the three justify buttons. On the right, `,_jsx(_components.strong,{children:`Mode`}),`\nswitches the page surface between `,_jsx(_components.strong,{children:`Text`}),`, `,_jsx(_components.strong,{children:`Image`}),` and `,_jsx(_components.strong,{children:`Draw`}),`.`]})}),_jsx(Step,{title:`3 — The page`,children:_jsx(_components.p,{children:`The paper itself, at the shape you authored. In Text mode you click into it and\ntype; each text box is outlined so you can see where it ends.`})}),_jsx(Step,{title:`4 — Right panel`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`3D Preview (game-true ink)`}),` on top — the page put through the same bake path\nthe game uses — and `,_jsx(_components.strong,{children:`Layers (front to back)`}),` underneath.`]})})]}),_jsxs(_components.p,{children:[`Click on the paper and type. A new document opens with one Text layer that fills the\npage inside the document margins, so you can start writing immediately. Then style it:\nselect some text, pick a `,_jsx(_components.strong,{children:`font family`}),` (the five bundled families are listed first),\nset a `,_jsx(_components.strong,{children:`size`}),`, toggle `,_jsx(_components.strong,{children:`B`}),` / `,_jsx(_components.strong,{children:`I`}),` / `,_jsx(_components.strong,{children:`U`}),` / `,_jsx(_components.strong,{children:`-S-`}),`, or click the color block to\nrecolor the selection. Watch the `,_jsx(_components.strong,{children:`3D Preview`}),` on the right as you go — it is the\ntruth: if a font falls back or a color reads wrong there, it will read wrong in game.`]}),_jsxs(_components.p,{children:[`When you want more than one block of text, an image, or something drawn by hand, use\nthe buttons under the Layers list: `,_jsx(_components.strong,{children:`+ Text`}),`, `,_jsx(_components.strong,{children:`+ Image`}),`, `,_jsx(_components.strong,{children:`+ Drawing`}),`. See\n`,_jsx(_components.a,{href:`/plugins/inkwell/authoring/layers`,children:`Layers`}),`, `,_jsx(_components.a,{href:`/plugins/inkwell/authoring/drawing`,children:`Drawing`}),` and\n`,_jsx(_components.a,{href:`/plugins/inkwell/authoring/paper`,children:`Paper`}),` — none of it is needed for this walkthrough.`]}),_jsxs(_components.p,{children:[`Finish by clicking `,_jsx(_components.strong,{children:`Save Document`}),` at the bottom of the left panel.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Save from that button rather than from the Content Browser. Rich-text markup stores\nfonts as string paths, which the cooker cannot see — `,_jsx(_components.strong,{children:`Save Document`}),` is what\nrefreshes the document’s `,_jsx(_components.strong,{children:`Font References`}),` list so those fonts get cooked. Skip it\nand styled runs fall back to the default font in a packaged build.`]})})]}),_jsxs(Step,{title:`Put the page on an actor in your level`,children:[_jsx(_components.p,{children:`Two routes. Take the first if you want paper in the world; take the second if the note\nbelongs on a prop, a desk, a clipboard or a corkboard you already have.`}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Drop in an Ink Page actor`,id:`drop-in-an-ink-page-actor`,children:[_jsxs(_components.p,{children:[`Open the `,_jsx(_components.strong,{children:`Place Actors`}),` panel (`,_jsx(_components.strong,{children:`Window → Place Actors`}),`), search for\n`,_jsx(_components.strong,{children:`Ink Page`}),`, and drag it into your level. It is the ready-made single sheet\n(`,_jsx(_components.code,{children:`AInkPageActor`}),`) and lands as a flat piece of paper.`]}),_jsxs(_components.p,{children:[`With it selected, find the `,_jsx(_components.strong,{children:`PageDisplay`}),` component in the Details panel’s\ncomponent list and set its `,_jsx(_components.strong,{children:`Document`}),` to your new asset. The writing appears on\nthe sheet immediately — the display component previews in the editor viewport, no\nPlay needed.`]}),_jsxs(_components.p,{children:[`The sheet then sizes itself: `,_jsx(_components.strong,{children:`Page Width Cm`}),` from the document (21 cm, the width\nof A4, unless you changed it) with the height following the page’s shape. Two knobs\nadjust this copy without touching the document:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Property`}),_jsx(_components.th,{children:`Where`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Page Scale`})}),_jsx(_components.td,{children:`the PageDisplay component`}),_jsx(_components.td,{children:`1 is the document’s own size, 2 twice as big, 0.5 half. Scales both axes together, so the writing never stretches.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Page Yaw`})}),_jsxs(_components.td,{children:[`the actor, under `,_jsx(_components.em,{children:`Inkwell | Sheet`})]}),_jsx(_components.td,{children:`Spins the sheet about its own normal so the writing reads upright for your scene.`})]})]})]})]}),_jsxs(Tab,{title:`Add a display to an actor you already have`,id:`add-a-display-to-an-actor-you-already-have`,children:[_jsxs(_components.p,{children:[`Select the actor in the level (or open its Blueprint), click `,_jsx(_components.strong,{children:`Add Component`}),`, and\nadd `,_jsx(_components.strong,{children:`Ink Page Display`}),`. Set its `,_jsx(_components.strong,{children:`Document`}),` to your asset.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Procedural Paper`}),` is on by default, and it is what makes this a one-property\nsetup: if the actor has no mesh of its own, the component spawns a paper sheet,\nattaches it to the actor’s root, and sizes it from the document. Swap in a document\nauthored at a different size and the sheet resizes, live in the viewport.`]}),_jsxs(_components.p,{children:[`It never takes a mesh away from you. If the actor already has a mesh component — or\nyou pick one in `,_jsx(_components.strong,{children:`Target Mesh`}),` — the page is drawn onto that instead and no sheet\nis spawned. Turn `,_jsx(_components.strong,{children:`Procedural Paper`}),` off to leave a mesh-less actor drawing\nnothing.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Drawing onto your own mesh needs clean 0–1 UVs across the page face. An\natlas-mapped prop mesh will garble the text, because the baked ink is sampled\nacross the full 0–1 range. If the prop has several material slots, set\n`,_jsx(_components.strong,{children:`Material Slot`}),` to the one the paper face uses.`]})}),_jsx(Accordion,{title:`Nothing appeared on the actor`,id:`nothing-appeared-on-the-actor`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`No mesh, and `,_jsx(_components.strong,{children:`Procedural Paper`}),` turned off: the component has nowhere to\ndraw. Turn it back on, or set `,_jsx(_components.strong,{children:`Target Mesh`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The page landed on the wrong material slot — `,_jsx(_components.strong,{children:`Material Slot`}),` is 0 by default.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Preview In Editor`}),` is off: the page still appears in Play, but not in the\nviewport.`]}),`\n`,_jsxs(_components.li,{children:[`Nothing in the level at all: check the Output Log for `,_jsx(_components.code,{children:`LogInkwell`}),` — the\ncomponent logs a warning naming exactly what is misconfigured.`]}),`\n`]})})]})]}),_jsx(_components.p,{children:`Press Play and walk over to it. The page is real geometry at the size you authored, so\nit reads from a normal standing distance — and lean in and the strokes hold, because\nthe ink is baked at the document’s own pixel resolution rather than stretched from a\nsmall texture.`})]}),_jsxs(Step,{title:`Wire reading into YOUR interaction system`,children:[_jsxs(_components.p,{children:[`To let the player pick the page up — float it in front of the camera, turn pages, put\nit back exactly where it lay — add an `,_jsx(_components.strong,{children:`Ink Page Reader`}),`\n(`,_jsx(_components.code,{children:`UInkPageReaderComponent`}),`) to your pawn or player controller.`]}),_jsx(_components.p,{children:`The reader is the production presentation engine, and it contains no input handling\nwhatsoever: it is a pure snap-into-view service that your interaction code calls.\nWhatever your project’s interact verb is — an Enhanced Input action, a trace in a base\ninteractable Blueprint, a trigger volume — the wiring is the same four calls:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Begin reading.`}),` In your interact handler, take the actor your existing focus\ntrace hit and call `,_jsx(_components.strong,{children:`Begin Reading Actor`}),` on the reader — it finds the Ink Page\nDisplay on the actor for you. (Call `,_jsx(_components.strong,{children:`Begin Reading`}),` instead if you already have\nthe display component.) It returns false when the actor has no readable page or\nsomething is already being read, so you can fall through to your other\ninteractables.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Turn pages.`}),` From your UI or input, call `,_jsx(_components.strong,{children:`Next Page`}),` and `,_jsx(_components.strong,{children:`Previous Page`}),` on\nthe reader. On a sheet with an authored back, `,_jsx(_components.strong,{children:`Next Page`}),` reads in book order —\nfront, back, then the next page.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Flip the sheet.`}),` `,_jsx(_components.strong,{children:`Flip Page`}),` turns the held page over to show its back.\nOut of the box the reader also binds `,_jsx(_components.strong,{children:`F`}),` to this (`,_jsx(_components.strong,{children:`Bind Flip Key`}),`, default on,\nkey editable) — turn that off once you bind your own flip input.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Put it back.`}),` `,_jsx(_components.strong,{children:`End Reading`}),` floats the page back to exactly where it lay.`]}),`\n`]}),_jsxs(_components.p,{children:[`Bind the reader’s events to keep your HUD honest: `,_jsx(_components.strong,{children:`On Reading Started`}),` /\n`,_jsx(_components.strong,{children:`On Reading Ended`}),` (hide the crosshair, show a “put back” prompt), and\n`,_jsx(_components.strong,{children:`On Reading Side Changed`}),` for a Front / Back label that swaps exactly on the turn.`]}),_jsxs(_components.p,{children:[`While a page is held, the reader stops the pawn by default — `,_jsx(_components.strong,{children:`Lock Movement While\nReading`}),` and `,_jsx(_components.strong,{children:`Lock Look While Reading`}),` are both on, and release the moment\n`,_jsx(_components.strong,{children:`End Reading`}),` is called. The hold distance is computed from the page’s real size\n(`,_jsx(_components.strong,{children:`Fit Page To View`}),`, default on), so a sticky note and a poster are both held where\nthey fill the screen comfortably.`]}),_jsxs(Note,{children:[_jsx(_components.p,{children:`Two reference implementations show this wiring, both demo-only:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`Ink Page Interactor`}),` (`,_jsx(_components.code,{children:`UInkPageInteractorComponent`}),`) is the complete “look\nat a page, press a key, read it” component from the showroom — a view trace every\n0.1 s out to 300 cm, an `,_jsx(_components.strong,{children:`On Focus Changed`}),` event for a prompt, and default keys\n(`,_jsx(_components.strong,{children:`E`}),` / `,_jsx(_components.strong,{children:`Q`}),` / `,_jsx(_components.strong,{children:`Left`}),` / `,_jsx(_components.strong,{children:`Right`}),`, plus the mouse wheel) behind an\n`,_jsx(_components.strong,{children:`Enable Default Input`}),` switch. Read it as a worked example; in production, make\nthe calls above from your own system instead. See\n`,_jsx(_components.a,{href:`/plugins/inkwell/components/interactor`,children:`Ink Page Interactor`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The example input assets in `,_jsx(_components.code,{children:`/Inkwell/Examples/Input/`}),` — `,_jsx(_components.code,{children:`IA_Interact`}),`,\n`,_jsx(_components.code,{children:`IA_NextPage`}),`, `,_jsx(_components.code,{children:`IA_PreviousPage`}),`, `,_jsx(_components.code,{children:`IA_PutBack`}),` and the mapping context\n`,_jsx(_components.code,{children:`IMC_InkwellDefault`}),` binding them to E / Right / Left / Q and the mouse wheel — are\nthere for projects that drive their own pawn with Enhanced Input and want\nready-made actions to start from.`]}),`\n`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`The full integration guide`,icon:`plug`,href:`/plugins/inkwell/guides/integration`,children:_jsx(_components.p,{children:`The worked example: a base interactable Blueprint, focus prompts, reading, page turns\nand flips, all driven by your own system.`})}),_jsx(Card,{title:`Ink Page Reader`,icon:`book-open-reader`,href:`/plugins/inkwell/components/reader`,children:_jsx(_components.p,{children:`Every property and Blueprint node on the component your interaction system drives.`})}),_jsx(Card,{title:`The Page Editor`,icon:`pen-nib`,href:`/plugins/inkwell/authoring/page-editor`,children:_jsx(_components.p,{children:`The toolbar, the three modes, layers, paper and the game-true preview, end to end.`})}),_jsx(Card,{title:`Example content`,icon:`box-open`,href:`/plugins/inkwell/guides/examples`,children:_jsx(_components.p,{children:`What ships in the showroom and /Inkwell/Examples/, and how each piece is wired.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Quickstart","description":"Working paper in two minutes, then a page of your own, wired into your own interaction system","icon":"rocket","href":"/plugins/inkwell/quickstart"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"teriyaki-gaming","siteName":"Teriyaki Gaming","title":"Quickstart - Teriyaki Gaming","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-25T14:45:07.697Z","originalFileLocation":"plugins/inkwell/quickstart.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Working paper in two minutes, then a page of your own, wired into your own interaction system\">\u003cmeta data-mint-head name=\"application-name\" content=\"Teriyaki Gaming\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Quickstart - Teriyaki Gaming\">\u003cmeta data-mint-head property=\"og:description\" content=\"Working paper in two minutes, then a page of your own, wired into your own interaction system\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Teriyaki Gaming\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://teriyaki-gaming.mintlify.app/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=Quickstart\u0026amp;description=Working+paper+in+two+minutes%2C+then+a+page+of+your+own%2C+wired+into+your+own+interaction+system\u0026amp;theme=3d38aad9918873891112471e\u0026amp;signature=1b5b79f924b4cdedaffd8f7426a1426389157b5c97fadd2024b2b26b146450b3\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Quickstart - Teriyaki Gaming\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Working paper in two minutes, then a page of your own, wired into your own interaction system\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://teriyaki-gaming.mintlify.app/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=Quickstart\u0026amp;description=Working+paper+in+two+minutes%2C+then+a+page+of+your+own%2C+wired+into+your+own+interaction+system\u0026amp;theme=3d38aad9918873891112471e\u0026amp;signature=1b5b79f924b4cdedaffd8f7426a1426389157b5c97fadd2024b2b26b146450b3\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/teriyaki-gaming/hZJNF1XmYF6dZ6g1/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Teriyaki Gaming\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3E7C59\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/plugins/inkwell/quickstart.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.teriyakigaming.com/#organization\",\"name\":\"Teriyaki Gaming\",\"url\":\"https://docs.teriyakigaming.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/teriyaki-gaming/Re9zDOvKF1471rVG/logo/light.svg?fit=max\u0026auto=format\u0026n=Re9zDOvKF1471rVG\u0026q=85\u0026s=9a862161962dd66d099129095f3c5f3a\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.teriyakigaming.com#website\",\"name\":\"Teriyaki Gaming\",\"url\":\"https://docs.teriyakigaming.com\",\"publisher\":{\"@id\":\"https://docs.teriyakigaming.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart#webpage\",\"url\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart\",\"name\":\"Quickstart\",\"description\":\"Working paper in two minutes, then a page of your own, wired into your own interaction system\",\"dateModified\":\"2026-08-25T14:45:07.697Z\",\"isPartOf\":{\"@id\":\"https://docs.teriyakigaming.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get Started\",\"item\":\"https://docs.teriyakigaming.com/plugins/inkwell/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quickstart\",\"item\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart#article\",\"headline\":\"Quickstart\",\"name\":\"Quickstart\",\"description\":\"Working paper in two minutes, then a page of your own, wired into your own interaction system\",\"url\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart\",\"mainEntityOfPage\":{\"@id\":\"https://docs.teriyakigaming.com/plugins/inkwell/quickstart#webpage\"},\"dateModified\":\"2026-08-25T14:45:07.697Z\",\"publisher\":{\"@id\":\"https://docs.teriyakigaming.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.teriyakigaming.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Teriyaki Gaming\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Teriyaki Gaming","nav":{"global":null,"tabs":[{"tab":"Overview","pages":[{"title":"Overview","href":""}]},{"tab":"Inkwell","groups":[{"group":"Get Started","pages":[{"title":"Introduction","description":"What Inkwell is: authored rich-text pages that render as real ink on real paper, in the world or on screen","icon":"feather","href":"/plugins/inkwell/introduction"},{"title":"Quickstart","icon":"rocket","href":"/plugins/inkwell/quickstart"},{"title":"Installation","description":"Installing Inkwell from Fab, enabling it per project, checking it worked, and the settings that matter on day one","icon":"download","href":"/plugins/inkwell/installation"}]},{"group":"Authoring","pages":[{"title":"Page Documents","icon":"file-lines","href":"/plugins/inkwell/authoring/documents"},{"title":"Page Editor","icon":"pen-nib","href":"/plugins/inkwell/authoring/page-editor"},{"title":"Layers","icon":"clone","href":"/plugins/inkwell/authoring/layers"},{"title":"Drawing","icon":"paintbrush","href":"/plugins/inkwell/authoring/drawing"},{"title":"Paper","icon":"newspaper","href":"/plugins/inkwell/authoring/paper"},{"title":"Fonts","icon":"font","href":"/plugins/inkwell/authoring/fonts"}]},{"group":"Components","pages":[{"title":"Ink Page Display","icon":"note-sticky","href":"/plugins/inkwell/components/page-display"},{"title":"Ink Page Stack","icon":"layer-group","href":"/plugins/inkwell/components/page-stack"},{"title":"Ink Page Actor","icon":"scroll","href":"/plugins/inkwell/components/page-actor"},{"title":"Ink Page Widget","icon":"window-maximize","href":"/plugins/inkwell/components/page-widget"},{"title":"Ink Page Reader","icon":"book-open-reader","href":"/plugins/inkwell/components/reader"},{"title":"Ink Page Interactor","icon":"hand-pointer","href":"/plugins/inkwell/components/interactor"}]},{"group":"Guides","pages":[{"title":"Integrating with your interaction system","icon":"plug","href":"/plugins/inkwell/guides/integration"},{"title":"Authoring meshes for Inkwell","icon":"cube","href":"/plugins/inkwell/guides/mesh-authoring"},{"title":"Example content","icon":"box-open","href":"/plugins/inkwell/guides/examples"},{"title":"Runtime documents","icon":"file-pen","href":"/plugins/inkwell/guides/runtime-documents"}]},{"group":"Reference","pages":[{"title":"Project Settings","icon":"sliders","href":"/plugins/inkwell/reference/settings"},{"title":"Rendering Pipeline","icon":"gears","href":"/plugins/inkwell/reference/rendering"},{"title":"Blueprint API Reference","icon":"code","href":"/plugins/inkwell/reference/blueprint-api"},{"title":"FAQ","icon":"circle-question","href":"/plugins/inkwell/reference/faq"}]}]}]},"title":"Quickstart - Teriyaki Gaming","buildId":"dpl_5UDDZ9hnigTkoV7QtvQ39eUp84nu","deploymentId":"dpl_5UDDZ9hnigTkoV7QtvQ39eUp84nu","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-CUTvSGqu.js","DynamicMarkdown-BGu84FgU.js","zoom-image-lightbox-ChyC7Hte.js","PlusIcon-DXkY3IBj.js","lightbox-handle-r17bVUz3.js"]}