@puredesktop/puredesktop-ui-bridge 1.0.0-beta.1
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/package.json +96 -0
- package/src/agents/runtime/agentLiveReducer.test.ts +72 -0
- package/src/agents/runtime/agentLiveReducer.ts +139 -0
- package/src/agents/runtime/agentRunEventTypes.ts +115 -0
- package/src/agents/runtime/contextWindowUsage.test.ts +38 -0
- package/src/agents/runtime/contextWindowUsage.ts +25 -0
- package/src/agents/runtime/index.ts +24 -0
- package/src/agents/runtime/mapAgentMessages.ts +54 -0
- package/src/agents/runtime/mapAgentSnapshot.ts +71 -0
- package/src/agents/runtime/mergeUsageTurn.ts +23 -0
- package/src/agents/runtime/pendingToolCalls.test.ts +85 -0
- package/src/agents/runtime/pendingToolCalls.ts +14 -0
- package/src/agents/runtime/toolRequiresApproval.ts +20 -0
- package/src/agents/runtime/unresolvedToolCalls.ts +42 -0
- package/src/bridge/agentModelTiers.ts +50 -0
- package/src/bridge/agentToolHandlers.ts +23 -0
- package/src/bridge/agentToolHelpers.test.ts +27 -0
- package/src/bridge/agentToolHelpers.ts +20 -0
- package/src/bridge/agentTypes.ts +294 -0
- package/src/bridge/agents.d.mts +113 -0
- package/src/bridge/agents.mjs +233 -0
- package/src/bridge/agents.ts +62 -0
- package/src/bridge/appSettings.d.mts +9 -0
- package/src/bridge/appSettings.mjs +18 -0
- package/src/bridge/appSettings.ts +4 -0
- package/src/bridge/applyThemeFromHost.d.mts +7 -0
- package/src/bridge/applyThemeFromHost.mjs +33 -0
- package/src/bridge/assets.d.mts +66 -0
- package/src/bridge/assets.mjs +121 -0
- package/src/bridge/catalog.d.mts +5 -0
- package/src/bridge/catalog.mjs +24 -0
- package/src/bridge/catalog.ts +1 -0
- package/src/bridge/client.d.mts +19 -0
- package/src/bridge/client.mjs +147 -0
- package/src/bridge/collectionAssetAdapter.ts +63 -0
- package/src/bridge/collectionAssets.d.mts +1 -0
- package/src/bridge/collectionAssets.mjs +2 -0
- package/src/bridge/collectionAssets.ts +1 -0
- package/src/bridge/collectionDocumentHtml.test.ts +71 -0
- package/src/bridge/collectionDocumentHtml.ts +118 -0
- package/src/bridge/collectionImagePaste.test.ts +32 -0
- package/src/bridge/collectionImagePaste.ts +130 -0
- package/src/bridge/context.mjs +12 -0
- package/src/bridge/credentials.mjs +22 -0
- package/src/bridge/dialog.d.mts +5 -0
- package/src/bridge/dialog.mjs +13 -0
- package/src/bridge/events.d.mts +14 -0
- package/src/bridge/events.mjs +12 -0
- package/src/bridge/filePreviewKind.test.ts +43 -0
- package/src/bridge/filePreviewKind.ts +76 -0
- package/src/bridge/fs.d.mts +41 -0
- package/src/bridge/fs.mjs +82 -0
- package/src/bridge/fs.test.ts +16 -0
- package/src/bridge/fs.ts +10 -0
- package/src/bridge/index.ts +12 -0
- package/src/bridge/inlinePreview.d.mts +35 -0
- package/src/bridge/inlinePreview.mjs +99 -0
- package/src/bridge/inlinePreview.test.ts +56 -0
- package/src/bridge/inlinePreview.ts +13 -0
- package/src/bridge/methods.d.mts +115 -0
- package/src/bridge/methods.mjs +132 -0
- package/src/bridge/os.d.mts +11 -0
- package/src/bridge/os.mjs +26 -0
- package/src/bridge/plugins.d.mts +9 -0
- package/src/bridge/plugins.mjs +31 -0
- package/src/bridge/plugins.ts +5 -0
- package/src/bridge/preferences.d.mts +7 -0
- package/src/bridge/preferences.mjs +17 -0
- package/src/bridge/preferences.ts +13 -0
- package/src/bridge/printDocument.test.ts +47 -0
- package/src/bridge/printDocument.ts +75 -0
- package/src/bridge/pureRender/adapters.test.ts +144 -0
- package/src/bridge/pureRender/adapters.ts +175 -0
- package/src/bridge/pureRender/assets.test.ts +44 -0
- package/src/bridge/pureRender/base.css +76 -0
- package/src/bridge/pureRender/compiler.test.ts +279 -0
- package/src/bridge/pureRender/compiler.ts +660 -0
- package/src/bridge/pureRender/document.test.ts +283 -0
- package/src/bridge/pureRender/document.ts +35 -0
- package/src/bridge/pureRender/extraction.test.ts +432 -0
- package/src/bridge/pureRender/extraction.ts +1023 -0
- package/src/bridge/pureRender/flow.css +3 -0
- package/src/bridge/pureRender/index.ts +66 -0
- package/src/bridge/pureRender/normalize.test.ts +442 -0
- package/src/bridge/pureRender/normalize.ts +682 -0
- package/src/bridge/pureRender/presets.ts +365 -0
- package/src/bridge/pureRender/profiles/book.css +19 -0
- package/src/bridge/pureRender/profiles/manuscript.css +11 -0
- package/src/bridge/pureRender/profiles/writer.css +10 -0
- package/src/bridge/pureRender/reset.css +5 -0
- package/src/bridge/pureRender/samples.ts +94 -0
- package/src/bridge/pureRender/styles.ts +164 -0
- package/src/bridge/pureRender/theme.test.ts +53 -0
- package/src/bridge/pureRender/theme.ts +258 -0
- package/src/bridge/pureRender/tokens/default.css +36 -0
- package/src/bridge/pureRender/tokens/default.json +32 -0
- package/src/bridge/pureRender/types.ts +264 -0
- package/src/bridge/pureRender/visualLayoutInspection.test.ts +57 -0
- package/src/bridge/pureRender/visualLayoutInspection.ts +161 -0
- package/src/bridge/react/useDebouncedEffect.ts +21 -0
- package/src/bridge/react/useIpc.tsx +75 -0
- package/src/bridge/react/usePlatformAgentRunLiveState.tsx +78 -0
- package/src/bridge/react/usePlatformAgentSessionDrive.tsx +729 -0
- package/src/bridge/react/usePlatformAgentSessions.tsx +60 -0
- package/src/bridge/react/usePlatformAgentTools.tsx +82 -0
- package/src/bridge/react/usePlatformAppManifest.tsx +32 -0
- package/src/bridge/react/usePlatformBridge.tsx +56 -0
- package/src/bridge/react/usePlatformDeepLink.tsx +57 -0
- package/src/bridge/react/usePlatformFileBinaryDataUrl.tsx +54 -0
- package/src/bridge/react/usePlatformFilePreview.tsx +92 -0
- package/src/bridge/react/usePlatformPreferences.tsx +77 -0
- package/src/bridge/react/usePlatformThemeDocumentAttrs.ts +35 -0
- package/src/bridge/react/usePlatformThemeFromBridge.tsx +16 -0
- package/src/bridge/react/usePlatformViewportResource.test.tsx +106 -0
- package/src/bridge/react/usePlatformViewportResource.tsx +72 -0
- package/src/bridge/react/useScheduledTask.tsx +59 -0
- package/src/bridge/render.d.mts +31 -0
- package/src/bridge/render.mjs +62 -0
- package/src/bridge/render.ts +8 -0
- package/src/bridge/screenAnnotation.test.ts +103 -0
- package/src/bridge/screenAnnotation.ts +269 -0
- package/src/bridge/theme.d.mts +3 -0
- package/src/bridge/theme.mjs +9 -0
- package/src/bridge/types.ts +439 -0
- package/src/bridge/watch.d.mts +9 -0
- package/src/bridge/watch.mjs +34 -0
- package/src/bridge/watch.ts +1 -0
- package/src/bridge/window.d.mts +44 -0
- package/src/bridge/window.mjs +33 -0
- package/src/chrome/index.ts +1 -0
- package/src/components/accessibility/AccessibilityReviewDialog.test.tsx +104 -0
- package/src/components/accessibility/AccessibilityReviewDialog.tsx +350 -0
- package/src/components/accessibility/accessibilityReview.test.ts +101 -0
- package/src/components/accessibility/accessibilityReview.ts +639 -0
- package/src/components/accessibility/index.ts +16 -0
- package/src/components/agent-feedback/ScreenAnnotationAgentDialog.tsx +509 -0
- package/src/components/agent-feedback/index.ts +5 -0
- package/src/components/agents/AgentComposer.tsx +34 -0
- package/src/components/agents/AgentContextUsageBar.tsx +127 -0
- package/src/components/agents/AgentDrawerPanel.tsx +82 -0
- package/src/components/agents/AgentMarkdown.tsx +12 -0
- package/src/components/agents/AgentMessageBubble.tsx +82 -0
- package/src/components/agents/AgentMessageList.tsx +47 -0
- package/src/components/agents/AgentModelMenu.tsx +55 -0
- package/src/components/agents/AgentThinkingBlock.tsx +66 -0
- package/src/components/agents/AgentToolApprovalActions.tsx +65 -0
- package/src/components/agents/AgentToolCallCard.tsx +26 -0
- package/src/components/agents/AgentToolPendingList.tsx +39 -0
- package/src/components/agents/AgentToolPendingReview.tsx +118 -0
- package/src/components/agents/agentPanelStyles.ts +79 -0
- package/src/components/agents/agentTypes.ts +96 -0
- package/src/components/agents/formatToolCallArguments.test.ts +16 -0
- package/src/components/agents/formatToolCallArguments.ts +9 -0
- package/src/components/agents/index.ts +40 -0
- package/src/components/assets/AssetLibraryDialog.tsx +5 -0
- package/src/components/assets/asset-library/AssetLibraryDialog.tsx +43 -0
- package/src/components/assets/asset-library/AssetLibraryWorkspace.tsx +54 -0
- package/src/components/assets/asset-library/detail/AssetLibraryDetailActions.tsx +68 -0
- package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.tsx +56 -0
- package/src/components/assets/asset-library/detail/AssetLibraryDetailPane.tsx +90 -0
- package/src/components/assets/asset-library/detail/AssetLibraryDetailPreview.tsx +67 -0
- package/src/components/assets/asset-library/detail/AssetLibraryInlinePreview.tsx +87 -0
- package/src/components/assets/asset-library/detail/AssetLibraryInlineSourceField.tsx +29 -0
- package/src/components/assets/asset-library/detail/AssetLibraryMetadataFields.tsx +34 -0
- package/src/components/assets/asset-library/detail/AssetLibraryUsagePanel.tsx +46 -0
- package/src/components/assets/asset-library/detail/AssetLibraryVersionsPanel.tsx +145 -0
- package/src/components/assets/asset-library/helpers/assetKind.ts +74 -0
- package/src/components/assets/asset-library/helpers.ts +41 -0
- package/src/components/assets/asset-library/hooks/useAssetDetailDraft.ts +81 -0
- package/src/components/assets/asset-library/hooks/useAssetLibraryDialog.ts +233 -0
- package/src/components/assets/asset-library/hooks/useAssetLibraryMutations.ts +266 -0
- package/src/components/assets/asset-library/hooks/useAssetLibrarySelectionSync.ts +24 -0
- package/src/components/assets/asset-library/hooks/useAssetLibraryVersions.ts +145 -0
- package/src/components/assets/asset-library/hooks/useInlineAssetPreview.ts +44 -0
- package/src/components/assets/asset-library/index.ts +19 -0
- package/src/components/assets/asset-library/layout/assetLibraryLayout.ts +201 -0
- package/src/components/assets/asset-library/shared/fieldStyles.ts +62 -0
- package/src/components/assets/asset-library/sidebar/AssetLibraryFilterPills.tsx +89 -0
- package/src/components/assets/asset-library/sidebar/AssetLibraryList.tsx +91 -0
- package/src/components/assets/asset-library/sidebar/AssetLibraryListRow.tsx +99 -0
- package/src/components/assets/asset-library/sidebar/AssetLibraryListStatus.tsx +24 -0
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebar.tsx +48 -0
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarActions.tsx +38 -0
- package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarToolbar.tsx +78 -0
- package/src/components/assets/asset-library/sidebar/AssetListThumbnail.tsx +86 -0
- package/src/components/assets/asset-library/types.ts +128 -0
- package/src/components/assets/asset-library/utils/assetLibraryUtils.ts +181 -0
- package/src/components/assets/asset-library/utils/pathBasename.ts +5 -0
- package/src/components/assets/asset-library/utils/sanitizeUploadFileName.ts +7 -0
- package/src/components/assets/asset-library/utils/uploadCollectionAsset.ts +52 -0
- package/src/components/chrome/OverlayActionCapsule.test.tsx +82 -0
- package/src/components/chrome/OverlayActionCapsule.tsx +90 -0
- package/src/components/chrome/PanelTabStrip.tsx +113 -0
- package/src/components/chrome/PlatformIcon.tsx +27 -0
- package/src/components/chrome/PureAppWordmark.tsx +89 -0
- package/src/components/chrome/ShellWindowControls.tsx +51 -0
- package/src/components/chrome/ThemeModeButton.tsx +16 -0
- package/src/components/chrome/Titlebar.tsx +79 -0
- package/src/components/chrome/WorkspaceTabStrip.tsx +300 -0
- package/src/components/chrome/index.ts +31 -0
- package/src/components/chrome/workspaceTabTypes.ts +29 -0
- package/src/components/common/buttons/Button.tsx +241 -0
- package/src/components/common/buttons/ChoiceChip.tsx +73 -0
- package/src/components/common/buttons/CleanButton.tsx +34 -0
- package/src/components/common/buttons/IconButton.tsx +89 -0
- package/src/components/common/buttons/QuietAction.tsx +29 -0
- package/src/components/common/buttons/SegmentedControl.tsx +67 -0
- package/src/components/common/buttons/TextActionButton.tsx +55 -0
- package/src/components/common/buttons/TextLink.tsx +38 -0
- package/src/components/common/canvas/CanvasElementFrame.test.tsx +79 -0
- package/src/components/common/canvas/CanvasElementFrame.tsx +182 -0
- package/src/components/common/canvas/canvasGeometry.test.ts +66 -0
- package/src/components/common/canvas/canvasGeometry.ts +133 -0
- package/src/components/common/canvas/index.ts +27 -0
- package/src/components/common/canvas/useCanvasDragResize.test.tsx +152 -0
- package/src/components/common/canvas/useCanvasDragResize.ts +161 -0
- package/src/components/common/chat/ChatAssistantMessage.tsx +81 -0
- package/src/components/common/chat/ChatBox.tsx +189 -0
- package/src/components/common/chat/ChatMarkdown.tsx +109 -0
- package/src/components/common/chat/ChatModelMenu.tsx +258 -0
- package/src/components/common/chat/ChatStatusRow.tsx +24 -0
- package/src/components/common/chat/ChatThinkingIndicator.tsx +54 -0
- package/src/components/common/chat/ChatThread.tsx +59 -0
- package/src/components/common/chat/ChatToolRow.tsx +141 -0
- package/src/components/common/chat/ChatUserBubble.tsx +45 -0
- package/src/components/common/chat/chatUtils.ts +7 -0
- package/src/components/common/chat/index.ts +24 -0
- package/src/components/common/connections/ConnectionSetup.tsx +529 -0
- package/src/components/common/connections/index.ts +26 -0
- package/src/components/common/containers/AppFrame.test.tsx +47 -0
- package/src/components/common/containers/AppFrame.tsx +65 -0
- package/src/components/common/containers/AppHeader.tsx +60 -0
- package/src/components/common/containers/AutoFillGrid.tsx +37 -0
- package/src/components/common/containers/Collapsible.tsx +43 -0
- package/src/components/common/containers/CollapsibleGrid.tsx +174 -0
- package/src/components/common/containers/MotionScope.tsx +32 -0
- package/src/components/common/containers/PageHeader.tsx +35 -0
- package/src/components/common/containers/PanelToolbarHeader.tsx +113 -0
- package/src/components/common/containers/QuietDisclosure.tsx +91 -0
- package/src/components/common/containers/QuietSurface.tsx +41 -0
- package/src/components/common/containers/ScrollPanel.tsx +33 -0
- package/src/components/common/containers/StatusBar.tsx +42 -0
- package/src/components/common/containers/SurfacePanel.tsx +66 -0
- package/src/components/common/containers/ToolbarStrip.tsx +80 -0
- package/src/components/common/containers/flex.ts +117 -0
- package/src/components/common/containers/useOpenTransition.ts +33 -0
- package/src/components/common/context/ContextSelector.tsx +269 -0
- package/src/components/common/context/index.ts +7 -0
- package/src/components/common/desk/ActionReader.tsx +270 -0
- package/src/components/common/desk/ActivityLedger.tsx +143 -0
- package/src/components/common/desk/CreationDesk.tsx +139 -0
- package/src/components/common/desk/DailyBrief.tsx +160 -0
- package/src/components/common/desk/DeskCard.tsx +157 -0
- package/src/components/common/desk/index.ts +30 -0
- package/src/components/common/dropdown/ContextMenu.tsx +87 -0
- package/src/components/common/dropdown/MenuButtonDropdown.tsx +121 -0
- package/src/components/common/dropdown/MenuDropdown.tsx +63 -0
- package/src/components/common/dropdown/MenuDropdownEntry.tsx +51 -0
- package/src/components/common/dropdown/MenuDropdownItem.tsx +82 -0
- package/src/components/common/dropdown/MenuDropdownSubmenu.tsx +145 -0
- package/src/components/common/dropdown/MenuPanel.tsx +69 -0
- package/src/components/common/dropdown/MenuPortal.tsx +162 -0
- package/src/components/common/dropdown/MenuPortalLayer.tsx +6 -0
- package/src/components/common/dropdown/SelectMenu.tsx +243 -0
- package/src/components/common/dropdown/SelectMenuControl.tsx +23 -0
- package/src/components/common/dropdown/SelectMenuOptions.tsx +38 -0
- package/src/components/common/dropdown/menuPortalConstants.ts +11 -0
- package/src/components/common/dropdown/menuTypes.ts +71 -0
- package/src/components/common/dropdown/menuViewportPosition.test.ts +139 -0
- package/src/components/common/dropdown/menuViewportPosition.ts +122 -0
- package/src/components/common/dropdown/selectMenuLayout.test.ts +42 -0
- package/src/components/common/dropdown/selectMenuLayout.ts +123 -0
- package/src/components/common/dropdown/useMenuAnchorPosition.ts +109 -0
- package/src/components/common/dropdown/useSelectMenuAnchor.ts +30 -0
- package/src/components/common/evidence/StructuredEvidenceView.test.tsx +77 -0
- package/src/components/common/evidence/StructuredEvidenceView.tsx +312 -0
- package/src/components/common/evidence/index.ts +13 -0
- package/src/components/common/feedback/Badge.tsx +33 -0
- package/src/components/common/feedback/CapabilityPills.tsx +36 -0
- package/src/components/common/feedback/EmptyState.tsx +132 -0
- package/src/components/common/feedback/InfoHint.tsx +67 -0
- package/src/components/common/feedback/InlineBanner.tsx +82 -0
- package/src/components/common/feedback/PlatformChip.tsx +104 -0
- package/src/components/common/feedback/QuietPill.tsx +75 -0
- package/src/components/common/feedback/WorkProgressPanel.tsx +156 -0
- package/src/components/common/feedback/index.ts +33 -0
- package/src/components/common/inputs/BareInput.tsx +31 -0
- package/src/components/common/inputs/BareTextarea.tsx +10 -0
- package/src/components/common/inputs/Checkbox.tsx +13 -0
- package/src/components/common/inputs/FieldControlShell.tsx +49 -0
- package/src/components/common/inputs/FormField.tsx +40 -0
- package/src/components/common/inputs/HybridSearchField.tsx +280 -0
- package/src/components/common/inputs/InlineComposer.tsx +197 -0
- package/src/components/common/inputs/PaletteCirclePicker.tsx +26 -0
- package/src/components/common/inputs/PaletteDropdown.tsx +413 -0
- package/src/components/common/inputs/Radio.tsx +19 -0
- package/src/components/common/inputs/SearchField.tsx +128 -0
- package/src/components/common/inputs/SelectField.tsx +169 -0
- package/src/components/common/inputs/SurfacePalettePicker.tsx +54 -0
- package/src/components/common/inputs/TextAreaField.tsx +22 -0
- package/src/components/common/inputs/TextField.tsx +51 -0
- package/src/components/common/inputs/ToggleSwitch.tsx +110 -0
- package/src/components/common/inputs/WorkspacePicker.tsx +349 -0
- package/src/components/common/inputs/fieldStyles.ts +137 -0
- package/src/components/common/layout/PanelGroup.tsx +479 -0
- package/src/components/common/layout/index.ts +31 -0
- package/src/components/common/layout/panelLayoutConstants.ts +7 -0
- package/src/components/common/layout/panelLayoutPersistence.ts +35 -0
- package/src/components/common/layout/panelLayoutState.test.ts +38 -0
- package/src/components/common/layout/panelLayoutState.ts +174 -0
- package/src/components/common/layout/panelLayoutTypes.ts +19 -0
- package/src/components/common/layout/tabs/Tabs.tsx +136 -0
- package/src/components/common/lists/listRowStyles.ts +32 -0
- package/src/components/common/lists/quiet-ledger/QuietActivityList.tsx +64 -0
- package/src/components/common/lists/quiet-ledger/QuietLedgerRow.tsx +119 -0
- package/src/components/common/lists/quiet-ledger/index.ts +9 -0
- package/src/components/common/lists/reorderable/DragHandle.tsx +65 -0
- package/src/components/common/lists/reorderable/ReorderableList.tsx +280 -0
- package/src/components/common/lists/reorderable/ReorderableListRow.tsx +102 -0
- package/src/components/common/lists/reorderable/ReorderableSections.tsx +344 -0
- package/src/components/common/lists/reorderable/ReorderableSectionsDemo.tsx +94 -0
- package/src/components/common/lists/reorderable/index.ts +15 -0
- package/src/components/common/lists/reorderable/reorderableUtils.test.ts +28 -0
- package/src/components/common/lists/reorderable/reorderableUtils.ts +23 -0
- package/src/components/common/lists/reorderable/types.ts +40 -0
- package/src/components/common/lists/reorderable/useReorderableDragState.ts +49 -0
- package/src/components/common/media/ImageReferencePicker.tsx +242 -0
- package/src/components/common/menubar/MenuBar.tsx +78 -0
- package/src/components/common/menubar/MenuBarTrigger.tsx +70 -0
- package/src/components/common/narrative/NarrativeMention.tsx +74 -0
- package/src/components/common/navigation/PathBreadcrumbs.tsx +78 -0
- package/src/components/common/navigation/UnderlineTabs.tsx +83 -0
- package/src/components/common/overlays/InstallAppPromptDialog.tsx +59 -0
- package/src/components/common/overlays/Modal.tsx +285 -0
- package/src/components/common/overlays/ModalChromeHeader.tsx +105 -0
- package/src/components/common/overlays/ObjectActionStrip.tsx +80 -0
- package/src/components/common/people/AutoUpdateReviewList.tsx +182 -0
- package/src/components/common/people/EntityList.tsx +122 -0
- package/src/components/common/people/EntityPortrait.tsx +64 -0
- package/src/components/common/people/LinkedDossierList.tsx +99 -0
- package/src/components/common/people/OpportunityList.tsx +94 -0
- package/src/components/common/people/PeopleSourceList.tsx +145 -0
- package/src/components/common/people/RelationshipDossier.tsx +168 -0
- package/src/components/common/people/RelationshipMap.tsx +362 -0
- package/src/components/common/people/index.ts +40 -0
- package/src/components/common/preview/FileAudioPreview.tsx +89 -0
- package/src/components/common/preview/FileImagePreview.tsx +88 -0
- package/src/components/common/preview/FilePdfPreview.tsx +87 -0
- package/src/components/common/preview/FileTextPreview.tsx +96 -0
- package/src/components/common/preview/FileVideoPreview.tsx +87 -0
- package/src/components/common/preview/PlatformFilePreview.tsx +166 -0
- package/src/components/common/preview/previewLayout.ts +27 -0
- package/src/components/common/render/Each.tsx +42 -0
- package/src/components/common/research/EvidenceDossier.tsx +894 -0
- package/src/components/common/research/index.ts +7 -0
- package/src/components/common/tiles/CatalogCard.tsx +116 -0
- package/src/components/common/tiles/Tile.tsx +45 -0
- package/src/components/common/tiles/TileGrid.tsx +13 -0
- package/src/components/common/typography/Heading.tsx +27 -0
- package/src/components/common/typography/Kicker.tsx +30 -0
- package/src/components/common/typography/Text.tsx +80 -0
- package/src/components/credentials/CredentialsPanel.tsx +169 -0
- package/src/components/credentials/credentialsTypes.ts +14 -0
- package/src/components/data/DataChart.tsx +913 -0
- package/src/components/data/dataTable.ts +99 -0
- package/src/components/editor/EditorCommentPromptDialog.tsx +124 -0
- package/src/components/editor/EditorLinkPromptDialog.tsx +65 -0
- package/src/components/print-design/PrintDesignPanel.test.tsx +1446 -0
- package/src/components/print-design/PrintDesignPanel.tsx +3043 -0
- package/src/components/print-design/index.ts +9 -0
- package/src/components/proofing/PagedProofDialog.tsx +453 -0
- package/src/components/proofing/index.ts +4 -0
- package/src/editor/DocumentEditor.tsx +28 -0
- package/src/editor/EditorViewModeToggle.tsx +35 -0
- package/src/editor/index.ts +97 -0
- package/src/editor/toolbarOverlays.ts +8 -0
- package/src/index.ts +209 -0
- package/src/theme/ThemeProvider.tsx +113 -0
- package/src/theme/appAccents.ts +87 -0
- package/src/theme/buildThemeBridgePayload.ts +23 -0
- package/src/theme/composePlatformTheme.test.ts +30 -0
- package/src/theme/composePlatformTheme.ts +23 -0
- package/src/theme/platformFont.d.mts +7 -0
- package/src/theme/platformFont.mjs +20 -0
- package/src/theme/platformFont.ts +6 -0
- package/src/theme/reportsShellChromeSelectors.ts +136 -0
- package/src/theme/styled.d.ts +5 -0
- package/src/theme/surfacePalettes.ts +178 -0
- package/src/theme/surfaceRoleSelectors.ts +113 -0
- package/src/theme/themeVars.ts +13 -0
- package/src/theme/themes/dark.ts +59 -0
- package/src/theme/themes/light.ts +60 -0
- package/src/theme/themes/palette.ts +44 -0
- package/src/theme/themes/shared.ts +68 -0
- package/src/theme/tokens.ts +114 -0
- package/src/theme/utils/GlobalStyles.ts +88 -0
- package/src/theme/utils/appFrameDocumentStyles.d.mts +5 -0
- package/src/theme/utils/appFrameDocumentStyles.mjs +89 -0
- package/src/theme/utils/appFrameDocumentStyles.ts +5 -0
- package/src/theme/utils/applyTheme.ts +50 -0
- package/src/theme/utils/cssVariables.ts +49 -0
- package/src/theme/utils/useInjectThemeIntoIframe.ts +40 -0
- package/src/utils/extensionIconMap.ts +123 -0
- package/src/utils/generalUtils.ts +157 -0
- package/src/writing/DraftAssistantDialog.tsx +279 -0
- package/src/writing/WritingStyleManager.tsx +416 -0
- package/src/writing/condenseWritingStyle.ts +103 -0
- package/src/writing/draftTextWithAgent.ts +134 -0
- package/src/writing/index.ts +39 -0
- package/src/writing/styleStore.ts +32 -0
- package/src/writing/writingStyle.test.ts +122 -0
- package/src/writing/writingStyle.ts +217 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { DEFAULT_PURE_RENDER_THEME } from './theme.js'
|
|
2
|
+
import type { PureRenderTheme } from './types.js'
|
|
3
|
+
|
|
4
|
+
export interface PureRenderThemePreset {
|
|
5
|
+
id: string
|
|
6
|
+
label: string
|
|
7
|
+
theme: PureRenderTheme
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function theme(
|
|
11
|
+
id: string,
|
|
12
|
+
label: string,
|
|
13
|
+
patch: Partial<PureRenderTheme>,
|
|
14
|
+
): PureRenderThemePreset {
|
|
15
|
+
return {
|
|
16
|
+
id,
|
|
17
|
+
label,
|
|
18
|
+
theme: {
|
|
19
|
+
...DEFAULT_PURE_RENDER_THEME,
|
|
20
|
+
...patch,
|
|
21
|
+
color: { ...DEFAULT_PURE_RENDER_THEME.color, ...patch.color },
|
|
22
|
+
type: {
|
|
23
|
+
...DEFAULT_PURE_RENDER_THEME.type,
|
|
24
|
+
...patch.type,
|
|
25
|
+
fonts: {
|
|
26
|
+
...DEFAULT_PURE_RENDER_THEME.type.fonts,
|
|
27
|
+
...patch.type?.fonts,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
setting: { ...DEFAULT_PURE_RENDER_THEME.setting, ...patch.setting },
|
|
31
|
+
page: { ...DEFAULT_PURE_RENDER_THEME.page, ...patch.page },
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const PURE_RENDER_THEME_PRESETS: readonly PureRenderThemePreset[] = [
|
|
37
|
+
theme('default-manuscript', 'Clean', {
|
|
38
|
+
name: 'Clean Manuscript',
|
|
39
|
+
profile_rules: {
|
|
40
|
+
table: {
|
|
41
|
+
rule_weight: 'light',
|
|
42
|
+
header_treatment: 'ruled',
|
|
43
|
+
density: 'balanced',
|
|
44
|
+
},
|
|
45
|
+
caption: {
|
|
46
|
+
label_style: 'bold',
|
|
47
|
+
alignment: 'left',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
theme('journal-article', 'Journal Article', {
|
|
52
|
+
name: 'Journal Article',
|
|
53
|
+
color: {
|
|
54
|
+
ink: '#14171C',
|
|
55
|
+
'ink-soft': '#3D424A',
|
|
56
|
+
muted: '#6D737C',
|
|
57
|
+
surface: '#FFFFFF',
|
|
58
|
+
paper: '#FFFFFF',
|
|
59
|
+
rule: '#BFC4CC',
|
|
60
|
+
'rule-soft': '#E6E9EE',
|
|
61
|
+
accent: '#7A2634',
|
|
62
|
+
'accent-ink': '#651D2A',
|
|
63
|
+
},
|
|
64
|
+
type: {
|
|
65
|
+
body: '10.2pt',
|
|
66
|
+
lead: 1.45,
|
|
67
|
+
measure: '30rem',
|
|
68
|
+
scaleRatio: 1.25,
|
|
69
|
+
fonts: {
|
|
70
|
+
display: '"Source Serif 4", Georgia, serif',
|
|
71
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
72
|
+
sans: '"Archivo", system-ui, sans-serif',
|
|
73
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
rhythm: '14.8pt',
|
|
77
|
+
page: { trim: 'A4', columns: 1, recto_verso: false },
|
|
78
|
+
setting: { align: 'justified', hyphenate: true },
|
|
79
|
+
profile_rules: {
|
|
80
|
+
running_heads: {
|
|
81
|
+
presence: 'present',
|
|
82
|
+
transform: 'uppercase',
|
|
83
|
+
rule: 'hairline',
|
|
84
|
+
},
|
|
85
|
+
table: {
|
|
86
|
+
rule_weight: 'hairline',
|
|
87
|
+
header_treatment: 'ruled',
|
|
88
|
+
density: 'compact',
|
|
89
|
+
},
|
|
90
|
+
caption: {
|
|
91
|
+
label_style: 'small-caps',
|
|
92
|
+
alignment: 'left',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
enforced_rules: [
|
|
96
|
+
'Keep manuscript paper white unless the user explicitly chooses another surface.',
|
|
97
|
+
'Use compact tables and small-caps labels for journal-like manuscripts.',
|
|
98
|
+
],
|
|
99
|
+
}),
|
|
100
|
+
theme('quiet-book', 'Quiet Book', {
|
|
101
|
+
name: 'Quiet Book',
|
|
102
|
+
color: {
|
|
103
|
+
ink: '#171A1F',
|
|
104
|
+
'ink-soft': '#3B3F45',
|
|
105
|
+
muted: '#6F756E',
|
|
106
|
+
surface: '#FFFFFF',
|
|
107
|
+
paper: '#FFFFFF',
|
|
108
|
+
rule: '#D7D9D3',
|
|
109
|
+
'rule-soft': '#ECEDE9',
|
|
110
|
+
accent: '#5F7F6C',
|
|
111
|
+
'accent-ink': '#4F6F5D',
|
|
112
|
+
},
|
|
113
|
+
type: {
|
|
114
|
+
body: '10.8pt',
|
|
115
|
+
lead: 1.6,
|
|
116
|
+
measure: '31rem',
|
|
117
|
+
scaleRatio: 1.333,
|
|
118
|
+
fonts: {
|
|
119
|
+
display: '"Newsreader", Georgia, serif',
|
|
120
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
121
|
+
sans: '"Archivo", system-ui, sans-serif',
|
|
122
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
rhythm: '17.3pt',
|
|
126
|
+
page: { trim: '6x9', columns: 1, recto_verso: true },
|
|
127
|
+
setting: { align: 'justified', hyphenate: true },
|
|
128
|
+
profile_rules: {
|
|
129
|
+
table: {
|
|
130
|
+
rule_weight: 'hairline',
|
|
131
|
+
header_treatment: 'plain',
|
|
132
|
+
density: 'airy',
|
|
133
|
+
},
|
|
134
|
+
caption: {
|
|
135
|
+
label_style: 'plain',
|
|
136
|
+
alignment: 'left',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
enforced_rules: [
|
|
140
|
+
'Keep the printed page white, not gray.',
|
|
141
|
+
'Use table rules sparingly and keep them hairline-light.',
|
|
142
|
+
],
|
|
143
|
+
}),
|
|
144
|
+
theme('classic-essay', 'Classic Essay', {
|
|
145
|
+
name: 'Classic Essay',
|
|
146
|
+
color: {
|
|
147
|
+
ink: '#1B1815',
|
|
148
|
+
'ink-soft': '#4B4640',
|
|
149
|
+
muted: '#7A736A',
|
|
150
|
+
surface: '#FFFFFF',
|
|
151
|
+
paper: '#FFFFFF',
|
|
152
|
+
rule: '#D6D0C7',
|
|
153
|
+
'rule-soft': '#EEEAE4',
|
|
154
|
+
accent: '#6F4E37',
|
|
155
|
+
'accent-ink': '#5A3D2B',
|
|
156
|
+
},
|
|
157
|
+
type: {
|
|
158
|
+
body: '11.2pt',
|
|
159
|
+
lead: 1.62,
|
|
160
|
+
measure: '32rem',
|
|
161
|
+
scaleRatio: 1.333,
|
|
162
|
+
fonts: {
|
|
163
|
+
display: '"Newsreader", Georgia, serif',
|
|
164
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
165
|
+
sans: '"Source Sans 3", system-ui, sans-serif',
|
|
166
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
rhythm: '18.1pt',
|
|
170
|
+
page: { trim: '6x9', columns: 1, recto_verso: true },
|
|
171
|
+
setting: { align: 'justified', hyphenate: true },
|
|
172
|
+
profile_rules: {
|
|
173
|
+
table: {
|
|
174
|
+
rule_weight: 'light',
|
|
175
|
+
header_treatment: 'plain',
|
|
176
|
+
density: 'airy',
|
|
177
|
+
},
|
|
178
|
+
caption: {
|
|
179
|
+
label_style: 'plain',
|
|
180
|
+
alignment: 'left',
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
enforced_rules: [
|
|
184
|
+
'Use a calm literary rhythm with generous leading.',
|
|
185
|
+
'Keep decoration restrained and tied to headings or running matter.',
|
|
186
|
+
],
|
|
187
|
+
}),
|
|
188
|
+
theme('modern-report', 'Modern Report', {
|
|
189
|
+
name: 'Modern Report',
|
|
190
|
+
color: {
|
|
191
|
+
ink: '#172026',
|
|
192
|
+
'ink-soft': '#41505A',
|
|
193
|
+
muted: '#6F7C83',
|
|
194
|
+
surface: '#FFFFFF',
|
|
195
|
+
paper: '#FFFFFF',
|
|
196
|
+
rule: '#CBD5DB',
|
|
197
|
+
'rule-soft': '#E8EEF1',
|
|
198
|
+
accent: '#006D77',
|
|
199
|
+
'accent-ink': '#005B64',
|
|
200
|
+
},
|
|
201
|
+
type: {
|
|
202
|
+
body: '10.5pt',
|
|
203
|
+
lead: 1.5,
|
|
204
|
+
measure: '34rem',
|
|
205
|
+
scaleRatio: 1.25,
|
|
206
|
+
fonts: {
|
|
207
|
+
display: '"Source Sans 3", system-ui, sans-serif',
|
|
208
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
209
|
+
sans: '"Source Sans 3", system-ui, sans-serif',
|
|
210
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
rhythm: '15.8pt',
|
|
214
|
+
page: { trim: 'A4', columns: 1, recto_verso: false },
|
|
215
|
+
setting: { align: 'flush-left', hyphenate: false },
|
|
216
|
+
profile_rules: {
|
|
217
|
+
table: {
|
|
218
|
+
rule_weight: 'medium',
|
|
219
|
+
header_treatment: 'shaded',
|
|
220
|
+
density: 'balanced',
|
|
221
|
+
},
|
|
222
|
+
caption: {
|
|
223
|
+
label_style: 'plain',
|
|
224
|
+
alignment: 'left',
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
enforced_rules: [
|
|
228
|
+
'Favor scan-friendly headings and quiet tables.',
|
|
229
|
+
'Use color as an accent, not a page background.',
|
|
230
|
+
],
|
|
231
|
+
}),
|
|
232
|
+
theme('scholarly-book', 'Scholarly Book', {
|
|
233
|
+
name: 'Scholarly Book',
|
|
234
|
+
color: {
|
|
235
|
+
ink: '#151515',
|
|
236
|
+
'ink-soft': '#45413B',
|
|
237
|
+
muted: '#756F66',
|
|
238
|
+
surface: '#FFFFFF',
|
|
239
|
+
paper: '#FFFFFF',
|
|
240
|
+
rule: '#CEC7BC',
|
|
241
|
+
'rule-soft': '#EBE7E1',
|
|
242
|
+
accent: '#596E5A',
|
|
243
|
+
'accent-ink': '#485C49',
|
|
244
|
+
},
|
|
245
|
+
type: {
|
|
246
|
+
body: '10.6pt',
|
|
247
|
+
lead: 1.58,
|
|
248
|
+
measure: '30rem',
|
|
249
|
+
scaleRatio: 1.414,
|
|
250
|
+
fonts: {
|
|
251
|
+
display: '"Source Serif 4", Georgia, serif',
|
|
252
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
253
|
+
sans: '"Archivo", system-ui, sans-serif',
|
|
254
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
rhythm: '16.7pt',
|
|
258
|
+
page: { trim: '6x9', columns: 1, recto_verso: true },
|
|
259
|
+
setting: { align: 'justified', hyphenate: true },
|
|
260
|
+
profile_rules: {
|
|
261
|
+
running_heads: {
|
|
262
|
+
presence: 'present',
|
|
263
|
+
transform: 'title-case',
|
|
264
|
+
rule: 'none',
|
|
265
|
+
},
|
|
266
|
+
caption: {
|
|
267
|
+
label_style: 'small-caps',
|
|
268
|
+
alignment: 'left',
|
|
269
|
+
},
|
|
270
|
+
table: {
|
|
271
|
+
rule_weight: 'hairline',
|
|
272
|
+
header_treatment: 'plain',
|
|
273
|
+
density: 'airy',
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
enforced_rules: [
|
|
277
|
+
'Prioritize long-form reading rhythm and stable running heads.',
|
|
278
|
+
'Keep figures and tables attached to their captions where possible.',
|
|
279
|
+
],
|
|
280
|
+
}),
|
|
281
|
+
theme('conference-paper', 'Conference Paper', {
|
|
282
|
+
name: 'Conference Paper',
|
|
283
|
+
color: {
|
|
284
|
+
ink: '#17191D',
|
|
285
|
+
'ink-soft': '#3F454F',
|
|
286
|
+
muted: '#737985',
|
|
287
|
+
surface: '#FFFFFF',
|
|
288
|
+
paper: '#FFFFFF',
|
|
289
|
+
rule: '#C6CBD4',
|
|
290
|
+
'rule-soft': '#E7EAF0',
|
|
291
|
+
accent: '#274C77',
|
|
292
|
+
'accent-ink': '#1F3D61',
|
|
293
|
+
},
|
|
294
|
+
type: {
|
|
295
|
+
body: '9.8pt',
|
|
296
|
+
lead: 1.38,
|
|
297
|
+
measure: '25rem',
|
|
298
|
+
scaleRatio: 1.2,
|
|
299
|
+
fonts: {
|
|
300
|
+
display: '"Source Sans 3", system-ui, sans-serif',
|
|
301
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
302
|
+
sans: '"Source Sans 3", system-ui, sans-serif',
|
|
303
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
rhythm: '13.5pt',
|
|
307
|
+
page: { trim: 'A4', columns: 2, recto_verso: false },
|
|
308
|
+
setting: { align: 'justified', hyphenate: true },
|
|
309
|
+
profile_rules: {
|
|
310
|
+
table: {
|
|
311
|
+
rule_weight: 'hairline',
|
|
312
|
+
header_treatment: 'shaded',
|
|
313
|
+
density: 'compact',
|
|
314
|
+
},
|
|
315
|
+
caption: {
|
|
316
|
+
label_style: 'small-caps',
|
|
317
|
+
alignment: 'left',
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
enforced_rules: [
|
|
321
|
+
'Use a compact two-column conference rhythm when the profile allows it.',
|
|
322
|
+
'Avoid heavy table grids in dense manuscripts.',
|
|
323
|
+
],
|
|
324
|
+
}),
|
|
325
|
+
theme('draft-writer', 'Draft Writer', {
|
|
326
|
+
name: 'Draft Writer',
|
|
327
|
+
color: {
|
|
328
|
+
ink: '#1D1F23',
|
|
329
|
+
'ink-soft': '#4B5058',
|
|
330
|
+
muted: '#777D86',
|
|
331
|
+
surface: '#FFFFFF',
|
|
332
|
+
paper: '#FFFFFF',
|
|
333
|
+
rule: '#DADDE3',
|
|
334
|
+
'rule-soft': '#EEF0F3',
|
|
335
|
+
accent: '#3E5C9A',
|
|
336
|
+
'accent-ink': '#304A82',
|
|
337
|
+
},
|
|
338
|
+
type: {
|
|
339
|
+
body: '11pt',
|
|
340
|
+
lead: 1.55,
|
|
341
|
+
measure: '33rem',
|
|
342
|
+
scaleRatio: 1.2,
|
|
343
|
+
fonts: {
|
|
344
|
+
display: '"Source Sans 3", system-ui, sans-serif',
|
|
345
|
+
serif: '"Source Serif 4", Georgia, serif',
|
|
346
|
+
sans: '"Source Sans 3", system-ui, sans-serif',
|
|
347
|
+
mono: '"JetBrains Mono", ui-monospace, monospace',
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
rhythm: '17.1pt',
|
|
351
|
+
page: { trim: 'A5', columns: 1, recto_verso: false },
|
|
352
|
+
setting: { align: 'flush-left', hyphenate: false },
|
|
353
|
+
profile_rules: {
|
|
354
|
+
table: {
|
|
355
|
+
rule_weight: 'light',
|
|
356
|
+
header_treatment: 'shaded',
|
|
357
|
+
density: 'balanced',
|
|
358
|
+
},
|
|
359
|
+
caption: {
|
|
360
|
+
label_style: 'plain',
|
|
361
|
+
alignment: 'left',
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
}),
|
|
365
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@page{ size:152mm 229mm; margin:18mm 16mm 22mm 20mm; @bottom-center{ content:counter(page); font:500 8pt var(--mono); color:var(--muted); } }
|
|
2
|
+
@page:right{ margin-left:20mm; margin-right:16mm; @top-right{ content:string(chaptitle); font:600 7.5pt var(--sans); letter-spacing:.1em; text-transform:uppercase; color:var(--muted); } @bottom-right{ content:counter(page); } @bottom-center{ content:none } }
|
|
3
|
+
@page:left{ margin-left:16mm; margin-right:20mm; @top-left{ content:string(doctitle); font:600 7.5pt var(--sans); letter-spacing:.1em; text-transform:uppercase; color:var(--muted); } @bottom-left{ content:counter(page); } @bottom-center{ content:none } }
|
|
4
|
+
.pure-render-book > article > .doc-title{ break-after:page; max-width:none; padding-top:35%; text-align:center; font-size:30pt; line-height:1.05; margin:0; }
|
|
5
|
+
.pure-render-book > article > .authors{ max-width:none; text-align:center; margin-top:1rem; }
|
|
6
|
+
section[data-type="toc"]{ break-before:right; break-after:page; max-width:none; }
|
|
7
|
+
section[data-type="toc"] > h2{ font-size:20pt; margin:0 0 calc(var(--rhythm)*1.2); }
|
|
8
|
+
section[data-type="toc"] > h2::before{ content:none; }
|
|
9
|
+
section[data-type="toc"] ol{ list-style:none; padding:0; margin:0; max-width:none; }
|
|
10
|
+
section[data-type="toc"] li{ margin:.35rem 0; }
|
|
11
|
+
section[data-type="toc"] a{ display:flex; gap:.35rem; color:var(--ink); }
|
|
12
|
+
section[data-type="toc"] a::after{ content:leader('.') target-counter(attr(href), page); flex:1; text-align:right; color:var(--muted); }
|
|
13
|
+
section[data-type="part"]{ break-before:right; text-align:center; padding-top:40%; }
|
|
14
|
+
section[data-type="chapter"]{ break-before:right; counter-increment:sec; counter-reset:sub; }
|
|
15
|
+
section[data-type="chapter"] > h2{ string-set:chaptitle content(text); font-size:26pt; margin:0 0 calc(var(--rhythm)*2); }
|
|
16
|
+
section[data-type="chapter"]::before{ content:"Chapter " counter(sec); display:block; font:600 10pt var(--sans); letter-spacing:.1em; text-transform:uppercase; color:var(--accent); margin-bottom:.6rem; }
|
|
17
|
+
section[data-type="chapter"] > h2{ counter-increment:none; }
|
|
18
|
+
section[data-type="chapter"] > h2::before{ content:none; }
|
|
19
|
+
figcaption::before{ content:"Figure " attr(data-label) ".\00a0"; }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
@page{ size:A4; margin:28mm 24mm 26mm 24mm; @bottom-center{ content:counter(page); font:500 8.4pt var(--mono); color:var(--muted); letter-spacing:.04em; } }
|
|
2
|
+
@page:right{ margin-left:26mm; margin-right:22mm; @top-right{ content:string(sectitle); font:600 8pt var(--sans); letter-spacing:.08em; text-transform:uppercase; color:var(--muted); } }
|
|
3
|
+
@page:left{ margin-left:22mm; margin-right:26mm; @top-left{ content:string(doctitle); font:600 8pt var(--sans); letter-spacing:.08em; text-transform:uppercase; color:var(--muted); } }
|
|
4
|
+
@page:first{ margin-top:24mm; @top-left{ content:none } @top-right{ content:none } }
|
|
5
|
+
[data-variant="two-column"]{ column-count:2; column-gap:7mm; column-fill:auto; }
|
|
6
|
+
[data-variant="two-column"] > .doc-title,
|
|
7
|
+
[data-variant="two-column"] > .authors,
|
|
8
|
+
[data-variant="two-column"] > .affil,
|
|
9
|
+
[data-variant="two-column"] > .keywords,
|
|
10
|
+
[data-variant="two-column"] > section[data-type="abstract"]{ column-span:all; }
|
|
11
|
+
[data-variant="two-column"] figure[data-span="page"],[data-variant="two-column"] .table-wrap[data-span="page"]{ column-span:all; }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
@page{ size:A4; margin:25mm; @bottom-center{ content:counter(page); font:500 8.4pt var(--mono); color:var(--muted); } }
|
|
2
|
+
@page:first{ @top-left{content:none} @top-right{content:none} }
|
|
3
|
+
.pure-render-writer{ --text-align:var(--theme-text-align,left); --hyphenate:var(--theme-hyphenate,manual); }
|
|
4
|
+
.pure-render-writer p + p{ text-indent:0; margin-top:calc(var(--rhythm)*.55); }
|
|
5
|
+
section > h2{ counter-increment:none; }
|
|
6
|
+
h2::before,h3::before{ content:none; }
|
|
7
|
+
section[data-type="abstract"]{ border:0; padding:0; }
|
|
8
|
+
.pure-render-writer section[data-type="references"] ol{ list-style:decimal; padding-left:1.4rem; }
|
|
9
|
+
.pure-render-writer section[data-type="references"] li{ counter-increment:none; padding-left:0; text-indent:0; }
|
|
10
|
+
.pure-render-writer section[data-type="references"] li::before{ content:none; }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const WRITER_FIGURE_SVG = `<svg viewBox="0 0 720 260" role="img" aria-label="Layered editorial planning diagram"><rect width="720" height="260" fill="#fbfbf8"/><path d="M62 188 C126 82 211 200 282 116 S433 64 492 134 610 185 660 80" fill="none" stroke="#2f5d7c" stroke-width="10"/><circle cx="282" cy="116" r="18" fill="#6f8f72"/><circle cx="492" cy="134" r="18" fill="#b47a5a"/><path d="M80 210 H650" stroke="#d7d5cf" stroke-width="3"/><path d="M110 58 H270 M110 84 H332 M110 110 H236" stroke="#242424" stroke-width="7" stroke-linecap="round"/></svg>`
|
|
2
|
+
|
|
3
|
+
const MANUSCRIPT_PLOT_SVG = `<svg viewBox="0 0 760 360" role="img" aria-label="Multiseries manuscript plot"><rect width="760" height="360" fill="#ffffff"/><path d="M86 290 H700 M86 48 V290" stroke="#9a9a9a" stroke-width="3"/><path d="M110 250 L220 198 L330 214 L440 132 L550 118 L660 74" fill="none" stroke="#1639c5" stroke-width="9"/><path d="M110 270 L220 236 L330 224 L440 188 L550 170 L660 148" fill="none" stroke="#6f7f73" stroke-width="7"/><g fill="#1639c5"><circle cx="110" cy="250" r="8"/><circle cx="220" cy="198" r="8"/><circle cx="330" cy="214" r="8"/><circle cx="440" cy="132" r="8"/><circle cx="550" cy="118" r="8"/><circle cx="660" cy="74" r="8"/></g><g fill="#6f7f73"><circle cx="110" cy="270" r="7"/><circle cx="220" cy="236" r="7"/><circle cx="330" cy="224" r="7"/><circle cx="440" cy="188" r="7"/><circle cx="550" cy="170" r="7"/><circle cx="660" cy="148" r="7"/></g></svg>`
|
|
4
|
+
|
|
5
|
+
const BOOK_ILLUSTRATION_SVG = `<svg viewBox="0 0 740 360" role="img" aria-label="Quiet atlas landscape illustration"><rect width="740" height="360" fill="#fbfaf7"/><path d="M80 260 C172 154 248 292 342 188 S514 112 650 236" fill="none" stroke="#202020" stroke-width="8"/><path d="M96 218 C150 132 240 124 312 202 C236 244 162 248 96 218Z" fill="#c7d0bf"/><path d="M420 92 C520 62 610 88 676 150 C570 156 494 148 420 92Z" fill="#d6c4a9"/><line x1="508" y1="72" x2="508" y2="292" stroke="#2a2a2a" stroke-width="4"/><path d="M96 302 H650" stroke="#d7d0c4" stroke-width="4"/></svg>`
|
|
6
|
+
|
|
7
|
+
export const PURE_RENDER_WRITER_SAMPLE_HTML = `<h1 class="doc-title">Field Notes for a Quiet Export</h1>
|
|
8
|
+
<p>This Writer sample is deliberately larger than a smoke test. It reads like a real working document: a title, short and long paragraphs, lists, a callout, figures, tables, equations, footnotes, and enough prose to make page flow visible under different Pure Render themes.</p>
|
|
9
|
+
<p>The first page should feel like a clean draft rather than a journal article. The typography should stay calm, the page should remain white, and object labels should be readable without turning the document into a production manuscript.</p>
|
|
10
|
+
<h2>Planning Context</h2>
|
|
11
|
+
<p>Teams often begin in Writer with material that is not ready for a formal profile. A useful proof keeps the author's intent visible: emphasized phrases, inline code such as <code>renderProfile</code>, review marks like <mark>confirm this claim</mark>, and compact notes that remain anchored to the surrounding sentence.</p>
|
|
12
|
+
<p>A longer paragraph follows so pagination can be reviewed with realistic line breaks. The design system should preserve a comfortable measure even when the source editor contains mixed elements, cross references, and repeated objects. The goal is not to make Writer look like Manuscript or Book, but to prove that the same semantic HTML can move through the same token system without losing its working-document character.</p>
|
|
13
|
+
<p>Draft prose can include a note<sup id="fnref-writer-sample-1"><a href="#fn-writer-sample-1">1</a></sup>, another longer note<sup id="fnref-writer-sample-2"><a href="#fn-writer-sample-2">2</a></sup>, and still export cleanly without duplicate markers.</p>
|
|
14
|
+
<ul><li>Keep the document-first rhythm.</li><li>Preserve object labels and xrefs.</li><li>Make image placement problems visible.</li><li>Keep tables quiet enough for working review.</li></ul>
|
|
15
|
+
<blockquote><p>A good Writer PDF feels like a clean working proof: direct, quiet, and still obviously editable.</p></blockquote>
|
|
16
|
+
<figure data-asset-id="asset_fig_writer_sample">${WRITER_FIGURE_SVG}<figcaption>Editorial planning diagram used as a reference object in the Writer proof.</figcaption></figure>
|
|
17
|
+
<p>See <a data-xref-target="asset_fig_writer_sample">Figure 1</a>, <a data-xref-target="asset_table_writer_sample">Table 1</a>, and <a data-xref-target="asset_blockMath_writer_sample">Equation 1</a>. The paragraph after the figure is intentionally long enough to test whether the figure creates an awkward blank page or whether ordinary prose continues in a balanced way after the object.</p>
|
|
18
|
+
<table data-asset-id="asset_table_writer_sample"><caption>Writer sample review matrix.</caption><thead><tr><th>Area</th><th>Expected behavior</th><th>Risk caught</th></tr></thead><tbody><tr><td>Flow</td><td>Quiet working pages</td><td>Oversized spacing</td></tr><tr><td>Objects</td><td>Labels and xrefs visible</td><td>Detached captions</td></tr><tr><td>Tables</td><td>Subtle rules</td><td>Bulky grids</td></tr><tr><td>Notes</td><td>Footnotes normalize</td><td>Repeated markers</td></tr></tbody></table>
|
|
19
|
+
<div data-type="block-math" data-asset-id="asset_blockMath_writer_sample">draft + review + tokens = export</div>
|
|
20
|
+
<h2>Later Notes</h2>
|
|
21
|
+
<p>This section exists to force a more realistic page break. It includes a short paragraph.</p>
|
|
22
|
+
<p>It also includes a longer paragraph that should wrap several times and expose whether the renderer maintains a steady baseline rhythm after mixed content. A working document often alternates between compact bullets, explanatory prose, diagrams, and a table that was pasted from elsewhere. The sample should make those transitions visible without requiring the user to risk their own document.</p>
|
|
23
|
+
<section class="footnotes"><ol><li id="fn-writer-sample-1">A compact Writer footnote proves notes normalize before pagination.</li><li id="fn-writer-sample-2">This longer Writer footnote is intentionally wordier so the proof can show how multiline notes behave at the bottom of a page without crowding the main text or repeating the footnote marker in the sentence.</li></ol></section>`
|
|
24
|
+
|
|
25
|
+
export const PURE_RENDER_MANUSCRIPT_SAMPLE_HTML = `<section>
|
|
26
|
+
<h2>Introduction</h2>
|
|
27
|
+
<p>This complete article sample exercises manuscript structure: sections, citations, footnotes, figures, tables, equations, declarations, references, and enough body text to make two-column and single-column pagination issues visible. It is deliberately larger than a smoke test so visual typesetting can inspect real page turns, object clusters, and footnote pressure.</p>
|
|
28
|
+
<p>The sample cites shared renderer work <cite class="ps-citation" data-ref-ids="ref-render">[1]</cite>, a layout study <cite class="ps-citation" data-ref-ids="ref-layout">[2]</cite>, a dataset report <cite class="ps-citation" data-ref-ids="ref-dataset">[3]</cite>, and a software reference <cite class="ps-citation" data-ref-ids="ref-software">[4]</cite>. It includes a short page footnote<sup id="fnref-ms-sample-1"><a href="#fn-ms-sample-1">1</a></sup>, a longer explanatory note<sup id="fnref-ms-sample-2"><a href="#fn-ms-sample-2">2</a></sup>, and repeated citations so numbering and note markers can be checked after pagination.</p>
|
|
29
|
+
<p>Manuscripts are a high-value target because small layout failures are easy to spot. A figure can strand a section heading, a table can leave a half-page hole, a footnote can collide with running text, and a two-column page can accidentally become a set of full-width section bands. This sample intentionally includes those pressure points in a realistic article.</p>
|
|
30
|
+
<p>We also include mixed inline content: <strong>important claims</strong>, <em>emphasized terms</em>, <code>renderProfile</code>, and linked cross references. These should remain quiet in the PDF and should not disturb line height or column balance.</p>
|
|
31
|
+
</section>
|
|
32
|
+
<section>
|
|
33
|
+
<h2>Methods</h2>
|
|
34
|
+
<p>Methods prose is intentionally longer than a smoke test. It should show section numbering, scholarly spacing, table density, citation labels, and footnote handling across page turns. The source remains semantic: the editor supplies sections, objects, citations, and references; the print system owns presentation.</p>
|
|
35
|
+
<ol><li>Normalize shared editor HTML into a canonical article.</li><li>Compile design tokens from a preset, description, or reference image.</li><li>Materialize figure, table, equation, and reference labels before pagination.</li><li>Render with Paged.js and inspect page images for layout hazards.</li></ol>
|
|
36
|
+
<p>We add another paragraph here so a two-column profile has to flow down the first column before continuing in the next column. Section headings should not create artificial full-width bands unless a profile explicitly asks for a full-span break.</p>
|
|
37
|
+
<p>The manuscript includes a procedure table near prose rather than isolated at the end. That placement helps reveal whether a table is pushed too aggressively or whether the renderer can preserve nearby explanatory text.</p>
|
|
38
|
+
<table data-asset-id="asset_table_ms_methods"><caption>Methods checklist with dense but readable cells.</caption><thead><tr><th>Step</th><th>Input</th><th>Expected output</th><th>Risk caught</th></tr></thead><tbody><tr><td>Normalize</td><td>Shared editor HTML</td><td>Canonical article</td><td>Forbidden attributes</td></tr><tr><td>Compile</td><td>Preset or reference</td><td>Safe tokens</td><td>Poor contrast</td></tr><tr><td>Paginate</td><td>Print HTML</td><td>Page boxes</td><td>Blank regions</td></tr><tr><td>Inspect</td><td>Page snapshot</td><td>Report entries</td><td>Object drift</td></tr></tbody></table>
|
|
39
|
+
<p>Equation <a data-xref-target="asset_blockMath_ms_method">1</a> describes a simple inspection score. It is not meant as a statistical model; it is a compact object used to test equation labels, xrefs, and inline spacing.</p>
|
|
40
|
+
<div data-type="block-math" data-asset-id="asset_blockMath_ms_method">inspection = flow + objects + notes + contrast</div>
|
|
41
|
+
</section>
|
|
42
|
+
<section>
|
|
43
|
+
<h2>Results</h2>
|
|
44
|
+
<p>The first result object is a wide figure placed after enough prose to make its page-break behavior visible. It should avoid stranding the heading above it and should keep its caption attached.</p>
|
|
45
|
+
<figure data-asset-id="asset_fig_ms_sample">${MANUSCRIPT_PLOT_SVG}<figcaption>Reference-driven manuscript plot with two series and enough width to expose figure placement decisions.</figcaption></figure>
|
|
46
|
+
<p>Figure placement should avoid stranding headings or detaching captions. See <a data-xref-target="asset_fig_ms_sample">Figure 1</a>, <a data-xref-target="asset_table_ms_sample">Table 2</a>, and <a data-xref-target="asset_blockMath_ms_sample">Equation 2</a>. The surrounding prose should continue naturally after the object cluster rather than leaving a large blank page before the next section.</p>
|
|
47
|
+
<table data-asset-id="asset_table_ms_sample"><caption>Sample manuscript table with several rows.</caption><thead><tr><th>Condition</th><th>Observed behavior</th><th>Interpretation</th></tr></thead><tbody><tr><td>Baseline</td><td>Labels render</td><td>Contract intact</td></tr><tr><td>Candidate</td><td>Rules quiet down</td><td>Theme applied</td></tr><tr><td>Long object</td><td>Caption stays attached</td><td>Placement acceptable</td></tr><tr><td>Two-column</td><td>Text flows downward</td><td>No section banding</td></tr><tr><td>Footnotes</td><td>Markers remain singular</td><td>No repeated numbers</td></tr><tr><td>References</td><td>Citations resolve</td><td>Back matter stable</td></tr></tbody></table>
|
|
48
|
+
<div data-type="block-math" data-asset-id="asset_blockMath_ms_sample">signal = evidence + semantic layout + review</div>
|
|
49
|
+
<p>The result paragraphs continue after the equation to reveal how much vertical space remains on the page. This is where a vision-assisted correction loop can become useful: the renderer can identify suspicious blank regions, capture page snapshots, and ask a layout agent to decide whether an object should move, resize, span, or stay anchored.</p>
|
|
50
|
+
<p>A second figure follows after additional prose so the PDF includes more than one object placement decision. The two figures should not collapse into a decorative block, and the captions should remain close to their objects.</p>
|
|
51
|
+
<figure data-asset-id="asset_fig_ms_secondary">${WRITER_FIGURE_SVG}<figcaption>Secondary manuscript figure used to test repeated object numbering and downstream page balance.</figcaption></figure>
|
|
52
|
+
<p>The secondary figure is referenced later as <a data-xref-target="asset_fig_ms_secondary">Figure 2</a>. Repeated xrefs should use stable materialized labels in the final PDF rather than relying on live CSS counters.</p>
|
|
53
|
+
</section>
|
|
54
|
+
<section>
|
|
55
|
+
<h2>Extended analysis</h2>
|
|
56
|
+
<p>This section exists mostly to force realistic page breaks. It begins with a short paragraph.</p>
|
|
57
|
+
<p>Then it continues with longer prose. In a real manuscript, the analysis section often contains several paragraphs between objects, references to previous tables, and footnotes that explain limitations without interrupting the main argument. This paragraph intentionally wraps many times so a visual snapshot can reveal whether the line length, justification, and leading remain comfortable in both one-column and two-column layouts.</p>
|
|
58
|
+
<p>Another long paragraph follows, citing the layout study again <cite class="ps-citation" data-ref-ids="ref-layout">[2]</cite>. The renderer should keep citation numbering stable, avoid duplicated footnote markers, and maintain a white page background unless a reference image very strongly indicates otherwise. This paragraph also gives the vision tab something useful to inspect if the rendered page has a large blank region before or after an object.</p>
|
|
59
|
+
<blockquote><p>Semantic content should remain stable while profiles change the print shape.</p></blockquote>
|
|
60
|
+
<p>A final analysis paragraph adds more flow after the block quote. The quote should not create an oversized boxed treatment, and the text following it should resume with normal scholarly rhythm.</p>
|
|
61
|
+
</section>
|
|
62
|
+
<section>
|
|
63
|
+
<h2>Discussion</h2>
|
|
64
|
+
<p>The discussion includes both short and long paragraphs. Short paragraphs reveal heading spacing. Longer paragraphs reveal column rhythm, footnote pressure, and the interaction between table placement and subsequent text.</p>
|
|
65
|
+
<p>The manuscript profile should remain conservative: white background unless the reference image strongly proves otherwise, clear scholarly hierarchy, quiet table rules, and no decorative color fields unless they belong to marks or object labels. If the beta vision typesetter inspects a PDF page with no detected issues, the event stream should say so and keep a snapshot available for review.</p>
|
|
66
|
+
<p>A final discussion paragraph forces more page flow and gives the proof a realistic back matter transition. It cites the layout study again <cite class="ps-citation" data-ref-ids="ref-layout">[2]</cite> and makes sure repeated citations do not reset numbering. It also includes a final long footnote<sup id="fnref-ms-sample-3"><a href="#fn-ms-sample-3">3</a></sup> to stress bottom-of-page note layout.</p>
|
|
67
|
+
</section>
|
|
68
|
+
<section data-type="acknowledgments"><h2>Acknowledgments</h2><p>The authors thank the shared editor and renderer maintainers for turning print export into a system rather than a one-off stylesheet. This paragraph is intentionally normal prose so the acknowledgments section can be checked as unnumbered back matter.</p></section>
|
|
69
|
+
<section data-type="data-availability"><h2>Data availability</h2><p>All generated sample data are embedded in this fixture. The sample cites a dataset record <cite class="ps-citation" data-ref-ids="ref-dataset">[3]</cite> so data availability and references can be reviewed together.</p></section>
|
|
70
|
+
<section data-type="funding"><h2>Funding</h2><p>This sample received no external funding. The funding statement is included to check declaration spacing near the end of a manuscript.</p></section>
|
|
71
|
+
<section data-type="competing-interests"><h2>Competing interests</h2><p>The authors declare no competing interests.</p></section>
|
|
72
|
+
<section data-type="author-contributions"><h2>Author contributions</h2><p>A.H. designed the shared render contract. M.S. reviewed manuscript profile requirements. J.E. reviewed export structure and acceptance tests.</p></section>
|
|
73
|
+
<section data-type="references"><h2>References</h2><ol><li id="ref-render">Pure Render working group. Shared semantic print contracts. 2026.</li><li id="ref-layout">Atlas Layout Lab. Page object placement and pagination review. 2026.</li><li id="ref-dataset">Open Fixture Archive. Complex manuscript pagination dataset. 2026.</li><li id="ref-software">PureScience contributors. Pure Render beta typesetter. 2026.</li></ol></section>
|
|
74
|
+
<section class="footnotes"><ol><li id="fn-ms-sample-1">A manuscript sample footnote proves inline notes normalize into page footnotes.</li><li id="fn-ms-sample-2">This longer manuscript footnote is intentionally expansive. It should wrap cleanly, remain visually subordinate to the main text, and avoid repeated inline footnote numbers when the marker is transformed for paged output. It also gives the vision inspection pass a realistic bottom-of-page region to evaluate.</li><li id="fn-ms-sample-3">This final note is deliberately long enough to occupy several lines. It should remain attached to the page where the note is called, avoid crowding the running text, and preserve a readable separation from the body copy even when a two-column manuscript profile is selected.</li></ol></section>`
|
|
75
|
+
|
|
76
|
+
export const PURE_RENDER_BOOK_CHAPTER_SAMPLE_HTML = `<h2>Opening Movement</h2>
|
|
77
|
+
<p>This book chapter sample is meant for trying the Book profile with content that looks like an actual chapter. It has an opener, long-form prose, a full illustration, a table, an equation, cross references, short paragraphs, long paragraphs, and enough continuation text to make running heads and folios worth checking.</p>
|
|
78
|
+
<p>The chapter should keep a literary rhythm: calm paragraphs, generous but not wasteful margins, running heads, folios, and chapter-scoped object labels. Unlike a manuscript, the chapter should not feel like a journal article with numbered sections stacked on top of each other.</p>
|
|
79
|
+
<p>Books often need images to land gracefully. A picture that is forced to a new page can leave unsightly white space before it; a caption that follows too late can feel detached. This sample keeps the figure near real prose so placement choices are obvious.</p>
|
|
80
|
+
<figure data-asset-id="asset_fig_book_sample">${BOOK_ILLUSTRATION_SVG}<figcaption>Quiet atlas illustration used to test chapter object placement and caption treatment.</figcaption></figure>
|
|
81
|
+
<p>See <a data-xref-target="asset_fig_book_sample">Figure 1.1</a>, <a data-xref-target="asset_table_book_sample">Table 1.1</a>, and <a data-xref-target="asset_blockMath_book_sample">Equation 1.1</a>. These labels should be materialized by the renderer rather than relying on counters that disappear in the final PDF.</p>
|
|
82
|
+
<table data-asset-id="asset_table_book_sample"><caption>Book sample table.</caption><thead><tr><th>Element</th><th>Treatment</th><th>Reason</th></tr></thead><tbody><tr><td>Opening</td><td>Quiet</td><td>Chapter rhythm</td></tr><tr><td>Figures</td><td>Caption attached</td><td>Reader continuity</td></tr><tr><td>Tables</td><td>Subtle rules</td><td>No grid noise</td></tr><tr><td>Running heads</td><td>Later pages only</td><td>Clean openers</td></tr></tbody></table>
|
|
83
|
+
<div data-type="block-math" data-asset-id="asset_blockMath_book_sample">chapter = prose + image + sequence</div>
|
|
84
|
+
<h2>After the Object Cluster</h2>
|
|
85
|
+
<p>This section continues after the figure, table, and equation so pagination can be reviewed across a real page turn. The paragraph is intentionally long, with a measured cadence that resembles narrative nonfiction or a research monograph. It should not be squeezed into a cramped column, and it should not inherit manuscript-style blue numbering unless the selected theme explicitly asks for that accent behavior.</p>
|
|
86
|
+
<p>A shorter paragraph follows to show local spacing.</p>
|
|
87
|
+
<p>Another long paragraph keeps the proof moving. The sample should make it easy to compare Clean, Journal Article, Quiet Book, and Draft Writer themes without the content itself changing. If a reference image suggests ornaments, running heads, or display typography, those decisions should compile into tokens and profile rules, not arbitrary CSS pasted into the chapter.</p>`
|
|
88
|
+
|
|
89
|
+
export const PURE_RENDER_BOOK_SECOND_CHAPTER_SAMPLE_HTML = `<h2>A Second Chapter for Flow</h2>
|
|
90
|
+
<p>This second sample chapter proves that the sample opens as a complete book, not a single overwritten chapter. It gives the Book profile another opener, another running head context, and more body text for testing chapter starts.</p>
|
|
91
|
+
<p>The second chapter is quieter and mostly prose. It exists to test continuity: chapter-scoped numbering should reset, running heads should update, and page breaks should avoid carrying awkward leftover space from the previous chapter.</p>
|
|
92
|
+
<figure data-asset-id="asset_fig_book_second_sample">${WRITER_FIGURE_SVG}<figcaption>Second chapter reference figure with a different visual rhythm.</figcaption></figure>
|
|
93
|
+
<p>See <a data-xref-target="asset_fig_book_second_sample">Figure 2.1</a>. The proof should show whether object labels remain chapter-scoped once the book has more than one chapter.</p>
|
|
94
|
+
<p>A final long paragraph closes the sample with enough text to force normal continuation pages. The reader should see a usable book proof with realistic transitions, not a decorative demo. That makes it much easier to judge whether a reference image has been emulated well enough in fonts, hierarchy, ornaments, running heads, and object treatment.</p>`
|