---
title: "Public exports"
description: "Every explicit subpath of @skaile/forge-editor and the names it exports."
canonical_url: "https://skaile-ai.github.io/forge-editor/reference/exports"
---
# Public exports

> Every explicit subpath of @skaile/forge-editor and the names it exports.

Every entry is an explicit subpath of `package.json#exports`; there is no wildcard into internal folders and no runtime umbrella barrel. Importing an entry registers nothing globally.

<table>
<thead>
  <tr>
    <th>
      Import
    </th>
    
    <th>
      Contents
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        @skaile/forge-editor
      </code>
    </td>
    
    <td>
      Type-only: <code>
        EditorSettings
      </code>
      
      , <code>
        EditorFeature
      </code>
      
      , <code>
        EditorPreset
      </code>
      
      , <code>
        FeatureContext
      </code>
      
      , <code>
        AnchorResolver
      </code>
      
      , <code>
        CommandDef
      </code>
      
      , <code>
        ToolbarGroupDef
      </code>
      
      , <code>
        BlockAction
      </code>
      
      , <code>
        AbilitiesOptions
      </code>
      
      , <code>
        EditorMetadata
      </code>
      
      , <code>
        MetadataItem
      </code>
      
      , <code>
        AuthorIdentity
      </code>
      
      , …
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/vue
      </code>
    </td>
    
    <td>
      The Vue layer (Nuxt UI chrome): <code>
        createEditor
      </code>
      
       (Vue plugin around <code>
        createEditorContext
      </code>
      
      ), <code>
        EDITOR_CONTEXT
      </code>
      
      , <code>
        useEditorContext
      </code>
      
      , <code>
        useEditorSettings
      </code>
      
      , <code>
        useNotifier
      </code>
      
      , <code>
        trackedStore
      </code>
      
      , <code>
        useStoreRef
      </code>
      
      , <code>
        useWritableStoreRef
      </code>
      
      , <code>
        storeFromRef
      </code>
      
      , <code>
        EDITOR_UI
      </code>
      
      , <code>
        useEditorUi
      </code>
      
       (<code>
        openSettings
      </code>
      
      , <code>
        toggleSidebar
      </code>
      
      , <code>
        toggleComments
      </code>
      
      , <code>
        commentsOpen
      </code>
      
      , <code>
        togglePalette
      </code>
      
      , <code>
        paletteOpen
      </code>
      
      ), <code>
        vueSuggestionRenderer
      </code>
      
      , the components <code>
        EditorSurface
      </code>
      
      , <code>
        EditorToolbar
      </code>
      
      , <code>
        EditorSettingsPanel
      </code>
      
      , <code>
        EditorSettingsModal
      </code>
      
      , <code>
        EditorCommandPalette
      </code>
      
       (the ⌘K palette, the <code>
        core-ui
      </code>
      
       overlay: <code>
        coreUiFeature<Component>({ palette: EditorCommandPalette })
      </code>
      
      ), <code>
        SettingsSection
      </code>
      
      , <code>
        SuggestionList
      </code>
      
      , and the types <code>
        VueFeature
      </code>
      
      , <code>
        VuePreset
      </code>
      
       (the preset components are the two entries below)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/vue/simple
      </code>
    </td>
    
    <td>
      <code>
        SimpleEditor
      </code>
      
       component (<code>
        core-content
      </code>
      
       + <code>
        core-ui
      </code>
      
       plus the host features in <code>
        add
      </code>
      
      , e.g. <code>
        aiFeature()
      </code>
      
      ; no <code>
        composeEditor
      </code>
      
      , so the bundle holds no catalog feature; exposes <code>
        editor
      </code>
      
       and the <code>
        preset
      </code>
      
       it mounts)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/vue/advanced
      </code>
    </td>
    
    <td>
      <code>
        AdvancedEditor
      </code>
      
       component (same props, defaults <code>
        'rich'
      </code>
      
      , <code>
        'full'
      </code>
      
      , <code>
        true
      </code>
      
      ; optional collaboration session) and <code>
        advancedEditor(options): VuePreset
      </code>
      
       (the preset for an <code>
        EditorSurface
      </code>
      
       you mount yourself, and the base for own feature lists); <code>
        EditorToolbar
      </code>
      
      /<code>
        EditorSettingsPanel
      </code>
      
      /<code>
        EditorSettingsModal
      </code>
      
       beside it take the <code>
        editor
      </code>
      
       and find the preset through it
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/react
      </code>
    </td>
    
    <td>
      The React layer (shadcn/ui chrome; Vue-free): <code>
        EditorContextProvider
      </code>
      
      , <code>
        useEditorContext
      </code>
      
      , the components <code>
        EditorSurface
      </code>
      
       (ref handle <code>
        EditorSurfaceHandle
      </code>
      
      : <code>
        editor
      </code>
      
      , <code>
        openSettings
      </code>
      
      ), <code>
        EditorToolbar
      </code>
      
      , <code>
        EditorSettingsPanel
      </code>
      
      , <code>
        EditorSettingsModal
      </code>
      
      , <code>
        EditorCommandPalette
      </code>
      
       (the ⌘K palette, the <code>
        core-ui
      </code>
      
       overlay: <code>
        coreUiFeature({ palette: EditorCommandPalette })
      </code>
      
      ), <code>
        SettingsSection
      </code>
      
      , <code>
        SuggestionList
      </code>
      
      , <code>
        Icon
      </code>
      
      , the hooks <code>
        useEditorSettings
      </code>
      
       (<code>
        settings
      </code>
      
      , <code>
        update
      </code>
      
      , <code>
        set
      </code>
      
      , <code>
        ready
      </code>
      
      , <code>
        synced
      </code>
      
      ), <code>
        useEditorUi
      </code>
      
      , <code>
        useNotifier
      </code>
      
      , <code>
        useStore
      </code>
      
      , <code>
        EditorUiContext
      </code>
      
      , <code>
        reactSuggestionRenderer
      </code>
      
      , the notice seam <code>
        reactNotifier
      </code>
      
       and sonner's <code>
        Toaster
      </code>
      
       (mount it once per page), the <code>
        cn
      </code>
      
       class helper, and the types <code>
        ReactFeature
      </code>
      
      , <code>
        ReactPreset
      </code>
      
      , <code>
        EditorSurfaceProps
      </code>
      
      , <code>
        EditorSurfaceHandle
      </code>
      
      , <code>
        SuggestionListHandle
      </code>
      
      . Presets are <code>
        defineEditor({ features })
      </code>
      
       from <code>
        /core
      </code>
      
       over the <code>
        /<feature>/react
      </code>
      
       bindings and framework-free features, or <code>
        advancedEditor()
      </code>
      
       from <code>
        /react/advanced
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/react/simple
      </code>
    </td>
    
    <td>
      <code>
        SimpleEditor
      </code>
      
       component (props: the surface's except <code>
        preset
      </code>
      
      , plus <code>
        add
      </code>
      
      ; ref handle <code>
        SimpleEditorHandle
      </code>
      
      : <code>
        editor
      </code>
      
      , <code>
        openSettings
      </code>
      
      , <code>
        preset
      </code>
      
      ), <code>
        SimpleEditorProps
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/react/advanced
      </code>
    </td>
    
    <td>
      <code>
        AdvancedEditor
      </code>
      
       component (every feature and integration with its React binding, optional collaboration session; props <code>
        AdvancedEditorProps
      </code>
      
       = <code>
        EditorSurface
      </code>
      
      's except <code>
        preset
      </code>
      
      , plus <code>
        content
      </code>
      
      , <code>
        interaction
      </code>
      
      , <code>
        ai
      </code>
      
      , <code>
        add
      </code>
      
      , <code>
        remove
      </code>
      
      , <code>
        backend
      </code>
      
      , <code>
        blockTypes
      </code>
      
      , <code>
        blockUi
      </code>
      
      , <code>
        coreContent
      </code>
      
      ; ref handle <code>
        AdvancedEditorHandle
      </code>
      
      ) and <code>
        advancedEditor(options): ReactPreset
      </code>
      
      ; mount <code>
        Toaster
      </code>
      
       from <code>
        /react
      </code>
      
       beside it
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/react/styles/ui-vars.css
      </code>
    </td>
    
    <td>
      Maps the shadcn tokens (<code>
        --primary
      </code>
      
      , <code>
        --background
      </code>
      
      , …) to the <code>
        --ui-*
      </code>
      
       variables the feature sheets read; import it before <code>
        core.css
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/react/styles/advanced.css
      </code>
    </td>
    
    <td>
      One import for React hosts of the advanced editor: <code>
        ui-vars.css
      </code>
      
      , <code>
        core.css
      </code>
      
      , every feature sheet and <code>
        themes.css
      </code>
      
       (with the shadcn bridge for Obsidian themes), in the order the Nuxt module registers them
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/presets/compose
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        composeEditor(ui, { content, interaction, ai, backend?, add?, remove?, blockTypes?, comments?, blockUi?, coreContent? })
      </code>
      
       builds a preset from three dimensions (<code>
        content
      </code>
      
      : <code>
        'basic'
      </code>
      
      /<code>
        'rich'
      </code>
      
      ; <code>
        interaction
      </code>
      
      : <code>
        'minimal'
      </code>
      
      /<code>
        'full'
      </code>
      
      /<code>
        []
      </code>
      
      ; <code>
        ai
      </code>
      
      : boolean) and prunes by the backend's capabilities (<code>
        omitted
      </code>
      
      ), with <code>
        CONTENT
      </code>
      
      , <code>
        INTERACTION
      </code>
      
      , <code>
        AI
      </code>
      
       (feature ids in canonical order), <code>
        UiBindings<C>
      </code>
      
       (the layer binds only the UI-bound features), <code>
        ComposeOptions<C>
      </code>
      
      , <code>
        ComposedEditor<C>
      </code>
      
      , and <code>
        simpleEditor(): ComposedEditor<never>
      </code>
      
       (<code>
        core-content
      </code>
      
       + <code>
        core-ui
      </code>
      
      , no ⌘K palette). The ready compositions with the palette are <code>
        composeEditor
      </code>
      
       and <code>
        advancedEditor
      </code>
      
       of <code>
        /vue/advanced
      </code>
      
       and <code>
        /react/advanced
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/core
      </code>
    </td>
    
    <td>
      Framework-free (Tiptap/ProseMirror only; imports no <code>
        vue
      </code>
      
      , <code>
        @tiptap/vue-3
      </code>
      
      , <code>
        @nuxt/ui
      </code>
      
       or React): <code>
        defineEditor
      </code>
      
      , <code>
        coreContentFeature
      </code>
      
      , <code>
        coreUiFeature
      </code>
      
      , <code>
        createEditorContext
      </code>
      
       (settings context and the translator <code>
        ctx.t
      </code>
      
      , options <code>
        locale: 'de' | 'en'
      </code>
      
       and partial <code>
        messages
      </code>
      
      ; with <code>
        createStore
      </code>
      
       <code>
        createStore
      </code>
      
      , <code>
        derived
      </code>
      
      , <code>
        Store
      </code>
      
      , <code>
        ReadonlyStore
      </code>
      
      ), the notice seam (<code>
        Notice
      </code>
      
      , <code>
        Notifier
      </code>
      
      , <code>
        silentNotifier
      </code>
      
      ), the suggestion renderer seam (<code>
        SuggestionPopup
      </code>
      
      , <code>
        suggestionPopupOf
      </code>
      
      , <code>
        SuggestionListProps
      </code>
      
      , <code>
        SuggestionPopupHandle
      </code>
      
      , <code>
        SuggestionPopupRenderer
      </code>
      
      ), <code>
        registerEditor
      </code>
      
      , <code>
        Abilities
      </code>
      
       and ability helpers, <code>
        BlockFlash
      </code>
      
      , <code>
        SlashCommand
      </code>
      
      , <code>
        Metadata
      </code>
      
      , <code>
        parseBlocks
      </code>
      
       / <code>
        DEFAULT_BLOCK_PIPELINE
      </code>
      
      , generic helpers <code>
        downloadText
      </code>
      
       and <code>
        fetchErrorMessage
      </code>
      
      , the feature/toolbar/extension-point types (<code>
        EditorFeature<C>
      </code>
      
      , <code>
        FeatureContext
      </code>
      
      , <code>
        CommandDef
      </code>
      
      , <code>
        MenuItem
      </code>
      
      , …), <code>
        command
      </code>
      
       / <code>
        commandState
      </code>
      
       / <code>
        toolbarOf
      </code>
      
      , and the block-conversion engine for own features (<code>
        ConversionProvider
      </code>
      
      , <code>
        ConvertTarget
      </code>
      
       with its <code>
        custom
      </code>
      
       member for host blocks, <code>
        createConverter
      </code>
      
      , <code>
        convertCoreBlocks
      </code>
      
      , <code>
        finishConversion
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/core
      </code>
      
       (Typed block)
    </td>
    
    <td>
      Framework-free; the one definition of the Typed block (<code>
        core/typed-block.ts
      </code>
      
      ): the persisted names <code>
        TYPED_BLOCK
      </code>
      
      , <code>
        TYPED_BLOCK_TITLE
      </code>
      
      , <code>
        TYPED_BLOCK_DESCRIPTION
      </code>
      
      , <code>
        TYPED_BLOCK_TAGS
      </code>
      
      , <code>
        BLOCK_TYPE_ATTR
      </code>
      
      , <code>
        BIB_KEY
      </code>
      
       (the <code>
        meta
      </code>
      
       key of the bibliographic record); <code>
        newTypedBlockJSON(blockType, body?, meta?, title?)
      </code>
      
       (the JSON of a fresh Typed block); <code>
        isTypedBlock(node | json)
      </code>
      
      , <code>
        typedBlockAt(doc, pos)
      </code>
      
       (<code>
        null
      </code>
      
       for an invalid or non-Typed-block position), <code>
        typeIdOf(block)
      </code>
      
      , <code>
        findBlockType(blockTypes, block)
      </code>
      
      , <code>
        metaOf
      </code>
      
       / <code>
        withMeta
      </code>
      
       / <code>
        withoutMeta
      </code>
      
       (copies, the block is never changed). The Derivation record (<code>
        Derivation
      </code>
      
      , <code>
        DERIVATION_KEY
      </code>
      
      , <code>
        derivationOf
      </code>
      
      ) is part of it. <code>
        /core/schema
      </code>
      
       does not export the names
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/core
      </code>
      
       (derivation and derive methods)
    </td>
    
    <td>
      Framework-free. <code>
        Derivation
      </code>
      
      , <code>
        DerivationSource
      </code>
      
      , <code>
        DerivationMethod
      </code>
      
      , <code>
        DERIVATION_KEY
      </code>
      
      , <code>
        derivationOf
      </code>
      
      , <code>
        derivedChildrenOf
      </code>
      
      , <code>
        derivationIndexOf
      </code>
      
       (original → Derived blocks, computed from block IDs and memoised per document node), <code>
        derivedOf(doc, pos)
      </code>
      
      , <code>
        derivationOriginOf
      </code>
      
      , <code>
        derivedStateLabel(state, t)
      </code>
      
       (the reason label of a Derived block's state), <code>
        derivationState
      </code>
      
       (<code>
        source: 'found' | 'missing' | 'foreign'
      </code>
      
      ); the derive method registry: <code>
        EditorFeature.deriveMethods
      </code>
      
      , <code>
        DeriveMethod
      </code>
      
       (<code>
        id
      </code>
      
      , <code>
        label
      </code>
      
      , <code>
        icon
      </code>
      
      , <code>
        requires
      </code>
      
      , <code>
        available
      </code>
      
      , <code>
        run
      </code>
      
       or <code>
        menu
      </code>
      
      ), <code>
        DeriveContext
      </code>
      
      , <code>
        DeriveRegistry
      </code>
      
      , <code>
        createDeriveRegistry
      </code>
      
      , <code>
        deriveMethodsAt(editor, ctx, pos)
      </code>
      
      , <code>
        deriveActionsOf(preset, ctx)
      </code>
      
      ; <code>
        preset.deriveMethods
      </code>
      
       is the merged registry
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/core/schema
      </code>
    </td>
    
    <td>
      Vue-free base schema: <code>
        coreSchemaExtensions()
      </code>
      
      , <code>
        coreContentSchemaExtensions(options?)
      </code>
      
       with <code>
        CoreContentOptions
      </code>
      
       (drop headings, lists, blockquote, code block, rule) and <code>
        starterKitOf
      </code>
      
      , <code>
        EMPTY_EDITOR_CONTENT
      </code>
      
      , <code>
        StrikeX
      </code>
      
      , <code>
        BlockId
      </code>
      
       helpers (<code>
        BLOCK_ID_TYPES
      </code>
      
      , <code>
        blockIdOf
      </code>
      
      , <code>
        findBlockById
      </code>
      
      , <code>
        assignBlockIds
      </code>
      
      ), <code>
        NodeFlags
      </code>
      
       (copies the node flags <code>
        editorBlockContainer
      </code>
      
      , <code>
        editorChrome
      </code>
      
       and <code>
        editorBlock
      </code>
      
       onto the node spec; <code>
        editorBlock: true
      </code>
      
       gives an own node block IDs), <code>
        isEditorBlock
      </code>
      
      , <code>
        isBlockContainer
      </code>
      
      , <code>
        isChromeNode
      </code>
      
      , the ability vocabulary (<code>
        ABILITY
      </code>
      
      , <code>
        ROOT_ABILITIES
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/schema/simple
      </code>
    </td>
    
    <td>
      Vue-free <code>
        simpleSchemaExtensions()
      </code>
      
       for servers and validators
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/settings
      </code>
    </td>
    
    <td>
      <code>
        EditorSettings
      </code>
      
      , <code>
        EDITOR_SETTINGS_VERSION
      </code>
      
      , <code>
        EDITOR_SETTINGS_DEFAULTS
      </code>
      
      , <code>
        editorSettingsSchema
      </code>
      
      , <code>
        parseEditorSettings
      </code>
      
      , <code>
        ModelRole
      </code>
      
      , inert value constants (<code>
        MODEL_ROLES
      </code>
      
      , the Model roles; <code>
        STRUCTURE_MODES
      </code>
      
      , <code>
        TREE_ROOTS
      </code>
      
      , <code>
        BLOCK_TYPE_ICON_VISIBILITIES
      </code>
      
      , <code>
        DRAG_HANDLE_VISIBILITIES
      </code>
      
      , <code>
        AI_LANGUAGES
      </code>
      
      , <code>
        AUTHOR_COLOR_STYLES
      </code>
      
      , <code>
        COMMENTS_LAYOUTS
      </code>
      
      , …)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/outline
      </code>
      
      , <code>
        /outline/vue
      </code>
      
      , <code>
        /outline/react
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        EditorOutline
      </code>
      
       (the Block outline); framework-free: <code>
        headingOutline
      </code>
      
      , <code>
        revealBlockInEditor
      </code>
      
      , <code>
        HeadingOutlineNode
      </code>
      
       (imports no tree and no Typed block code)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/search
      </code>
      
      , <code>
        /search/vue
      </code>
      
      , <code>
        /search/react
      </code>
    </td>
    
    <td>
      Workspace search over the Block index (backend capability <code>
        index
      </code>
      
      ). <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        SearchPanel
      </code>
      
       (props <code>
        open(hit)
      </code>
      
       and optional <code>
        documentTitle(id)
      </code>
      
      ; React also <code>
        className
      </code>
      
      ; renders nothing without the <code>
        index
      </code>
      
       capability), <code>
        useSearchModel
      </code>
      
      ; framework-free: <code>
        createSearchModel
      </code>
      
      , <code>
        hitLabel
      </code>
      
      , <code>
        SearchModel
      </code>
      
      , <code>
        SearchModelOptions
      </code>
      
      , <code>
        SearchState
      </code>
      
      , <code>
        SearchStatus
      </code>
      
       (imports no tree, no feature)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/change-sets
      </code>
      
      , <code>
        /change-sets/vue
      </code>
      
      , <code>
        /change-sets/react
      </code>
    </td>
    
    <td>
      What the document chat proposed for other Documents than the open one, reviewed per Document (backend capability <code>
        changeSets
      </code>
      
      ). <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        ChangeSetPanel
      </code>
      
       (props <code>
        model
      </code>
      
      , optional <code>
        documentTitle(id)
      </code>
      
       and <code>
        open(id)
      </code>
      
      ; React also <code>
        className
      </code>
      
      ; renders nothing while there is nothing to show), <code>
        useChangeSetModel({ backend })
      </code>
      
       (one model per app, shared with the chat through <code>
        AiSidebar
      </code>
      
      's <code>
        changeSets
      </code>
      
      ); framework-free: <code>
        createChangeSetModel
      </code>
      
      , <code>
        groupChangeSets
      </code>
      
      , <code>
        hunkLabel
      </code>
      
      , <code>
        HUNK_STATUS_KEYS
      </code>
      
      , <code>
        ChangeSetModel
      </code>
      
      , <code>
        ChangeSetModelOptions
      </code>
      
      , <code>
        ChangeSetState
      </code>
      
      , <code>
        ChangeSetGroup
      </code>
      
      , <code>
        ChangeSetEntry
      </code>
      
      , <code>
        ChangeSetFailure
      </code>
      
       and the types <code>
        ChangeSet
      </code>
      
      , <code>
        ChangeSetHunk
      </code>
      
      , <code>
        ChangeSetHunkStatus
      </code>
      
      , <code>
        ChangeSetOp
      </code>
      
      , <code>
        ChangeSetFeed
      </code>
      
       (imports no tree, no feature)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/tree
      </code>
      
      , <code>
        /tree/vue
      </code>
      
      , <code>
        /tree/react
      </code>
      
      , <code>
        /tree/types
      </code>
    </td>
    
    <td>
      Document tree. <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        DocumentTree
      </code>
      
       (Vue: props <code>
        store
      </code>
      
      , <code>
        editor
      </code>
      
      , <code>
        v-model:selectedFolder
      </code>
      
      , slot <code>
        document-actions
      </code>
      
      ; React: props <code>
        store
      </code>
      
      , <code>
        editor
      </code>
      
      , <code>
        selectedFolder
      </code>
      
      /<code>
        onSelectedFolderChange
      </code>
      
       (uncontrolled when omitted), <code>
        documentActions
      </code>
      
      , <code>
        className
      </code>
      
      ; needs <code>
        EditorContextProvider
      </code>
      
       and a mounted <code>
        Toaster
      </code>
      
      ), <code>
        useTreeView
      </code>
      
       (Vue: <code>
        nodeFilters
      </code>
      
      /<code>
        expanded
      </code>
      
       as refs; React: as values); framework-free: <code>
        DocumentStore
      </code>
      
       (the tree's store interface; store-based: <code>
        tree
      </code>
      
      , <code>
        documents
      </code>
      
      , <code>
        activeId
      </code>
      
       are <code>
        ReadonlyStore
      </code>
      
      s plus the host's operations), <code>
        createTreeView
      </code>
      
      , <code>
        treeView(context)
      </code>
      
       (the per-app view state: node filters, expanded folders), <code>
        TreeViewModel
      </code>
      
      , <code>
        NodeFilters
      </code>
      
      , <code>
        TreeFolder
      </code>
      
      , <code>
        DocumentSummary
      </code>
      
      ; <code>
        /vue
      </code>
      
       also <code>
        useStoreRef
      </code>
      
       and <code>
        storeFromRef
      </code>
      
       (adapters from Vue refs to the store shape). Depends on core, outline, composites and media; see the <a href="https://skaile-ai.github.io/forge-editor/guides/document-tree">
        integration guide
      </a>
      
      . <code>
        /tree/types
      </code>
      
       has the <code>
        TreeFolder
      </code>
      
      /<code>
        DocumentSummary
      </code>
      
       types alone, for servers whose typecheck has no DOM. Content tree: <code>
        TreeViewModel.basketFilter
      </code>
      
       (<code>
        Store<string[]>
      </code>
      
      , persisted under <code>
        tip-tree:basket-filter
      </code>
      
      ), <code>
        setBasketShown(id, shown)
      </code>
      
      , <code>
        clearBasketFilter()
      </code>
      
      ; <code>
        TreeState.basketFilter
      </code>
      
      , <code>
        focusKey
      </code>
      
      , <code>
        focusPath
      </code>
      
      ; the model's <code>
        focus(key)
      </code>
      
       and <code>
        defocus()
      </code>
      
      ; <code>
        TreeRowState.dimmed
      </code>
      
      ; the <code>
        TreeCommand
      </code>
      
       members <code>
        transferBlock
      </code>
      
       and <code>
        focusBlock
      </code>
      
      ; <code>
        DragPayload
      </code>
      
       <code>
        foreign-block
      </code>
      
       with <code>
        TreeModel.foreignDragOver(item)
      </code>
      
       and <code>
        dropForeign(item, payload, menu, x, y)
      </code>
      
      . See <a href="https://skaile-ai.github.io/forge-editor/guides/document-tree#baskets-focus-and-foreign-drops">
        Document tree
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/media
      </code>
      
      , <code>
        /media/vue
      </code>
      
      , <code>
        /media/react
      </code>
      
      , <code>
        /media/schema
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        mediaFeature
      </code>
      
      , <code>
        useFileImport
      </code>
      
      , <code>
        AudioRecorderModal
      </code>
      
      , <code>
        useAudioRecorder
      </code>
      
      ; framework-free: <code>
        mediaFeatureCore
      </code>
      
      , <code>
        fileImport
      </code>
      
      , <code>
        createAudioRecorder
      </code>
      
      , <code>
        pickFiles
      </code>
      
      , <code>
        openAudioRecorder
      </code>
      
      , <code>
        mediaSchemaExtensions()
      </code>
      
      , <code>
        MEDIA_TYPES
      </code>
      
      , <code>
        MAX_MEDIA_BYTES
      </code>
      
      , asset helpers
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/image-studio
      </code>
      
      , <code>
        /image-studio/vue
      </code>
      
      , <code>
        /image-studio/react
      </code>
      
      , <code>
        /image-studio/schema
      </code>
    </td>
    
    <td>
      The Bild-Studio block (<a href="https://skaile-ai.github.io/forge-editor/guides/image-studio">
        guide
      </a>
      
      ). <code>
        /vue
      </code>
      
      : <code>
        imageStudioFeature()
      </code>
      
      , <code>
        ImageStudioDialog
      </code>
      
       (props <code>
        open
      </code>
      
       / <code>
        v-model:open
      </code>
      
      , <code>
        store
      </code>
      
      , <code>
        title?
      </code>
      
      ), <code>
        createImageStudioNodeStore({ editor, getPos, backend, documentId })
      </code>
      
       (with <code>
        ImageStudioNodeStore
      </code>
      
      , <code>
        ImageStudioNodeStoreOptions
      </code>
      
      ; <code>
        dispose()
      </code>
      
       detaches it), <code>
        ImageStudioStore
      </code>
      
       (the contract the dialog drives: <code>
        state
      </code>
      
      , <code>
        promptBlocks
      </code>
      
      , <code>
        update
      </code>
      
      , <code>
        generate
      </code>
      
      , <code>
        upload
      </code>
      
      , <code>
        problem
      </code>
      
      , all as refs) and everything from the framework-free entry. <code>
        /react
      </code>
      
      : <code>
        imageStudioFeature()
      </code>
      
      , <code>
        ImageStudioDialog
      </code>
      
       (props <code>
        open
      </code>
      
      , <code>
        onOpenChange
      </code>
      
      , <code>
        store
      </code>
      
      , <code>
        title?
      </code>
      
      ), <code>
        ImageStudioReactStore
      </code>
      
       (the same contract with plain values instead of refs; the host re-renders the dialog with the new <code>
        state
      </code>
      
       after <code>
        update
      </code>
      
      , and keeps <code>
        update
      </code>
      
       stable per image: its identity is the store's), <code>
        useImageStudioNodeStore({ editor, getPos, backend, documentId })
      </code>
      
       (the store of one node, <code>
        undefined
      </code>
      
       on the first render), <code>
        createImageStudioNodeCore
      </code>
      
      , <code>
        ImageStudioNodeCore
      </code>
      
      , <code>
        ImageStudioNodeCoreOptions
      </code>
      
      , <code>
        ImageStudioNodeSnapshot
      </code>
      
       and the state and reducers. Framework-free: <code>
        imageStudioFeatureCore(ui?)
      </code>
      
      , <code>
        ImageStudioUi
      </code>
      
      , <code>
        IMAGE_STUDIO_OPEN
      </code>
      
      , <code>
        ImageStudioNode
      </code>
      
      , <code>
        imageStudioSchemaExtensions()
      </code>
      
       (<code>
        /schema
      </code>
      
       is Vue-free, for servers), <code>
        ImageStudioAttrs
      </code>
      
      , the types <code>
        ImageStudioState
      </code>
      
      , <code>
        ImageStudioImage
      </code>
      
      , <code>
        ImageStudioTurn
      </code>
      
      , <code>
        ImageStudioPromptBlock
      </code>
      
      , the gallery types <code>
        ImageStudioLibrary
      </code>
      
      , <code>
        ImageStudioLibraryFacet
      </code>
      
      , <code>
        ImageStudioLibraryQuery
      </code>
      
      , <code>
        ImageStudioLibraryItem
      </code>
      
      , <code>
        EMPTY_IMAGE_STUDIO_STATE
      </code>
      
      , the pure reducers <code>
        setDescription
      </code>
      
      , <code>
        togglePromptBlock
      </code>
      
      , <code>
        toggleImage
      </code>
      
      , <code>
        select
      </code>
      
      , <code>
        removeImage
      </code>
      
      , <code>
        addReference
      </code>
      
      , <code>
        adoptImage
      </code>
      
      , <code>
        addGeneration
      </code>
      
      , and <code>
        selectedImage
      </code>
      
      , <code>
        isEmptyImageStudioState
      </code>
      
      , <code>
        normalizeImageStudioState
      </code>
      
      . The backend side is <code>
        EditorBackend.images
      </code>
      
       (capability <code>
        images
      </code>
      
      ), <code>
        EditorPorts.images
      </code>
      
       (<code>
        ImageProvider
      </code>
      
      ) and the routes under <code>
        /api/editor/images/
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/mentions
      </code>
      
      , <code>
        /mentions/schema
      </code>
    </td>
    
    <td>
      <code>
        mentionsFeature
      </code>
      
      , <code>
        mentionSuggestion
      </code>
      
      , <code>
        tagSuggestion
      </code>
      
      ; Vue-free: <code>
        mentionsSchemaExtensions()
      </code>
      
      , <code>
        MentionNode
      </code>
      
      , <code>
        TagNode
      </code>
      
      , <code>
        mentionsFromText
      </code>
      
      , <code>
        tagsFromText
      </code>
      
      , <code>
        normalizeTagName
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/tables
      </code>
      
      , <code>
        /tables/schema
      </code>
    </td>
    
    <td>
      <code>
        tablesFeature()
      </code>
      
       (GFM tables and task lists: the nodes, toolbar group <code>
        table
      </code>
      
       with insert 3×3, add/delete row, add/delete column, delete table, slash entries <code>
        table.insert
      </code>
      
       and <code>
        task.insert
      </code>
      
      ; no components, so it fits both framework layers); Vue-free: <code>
        tablesSchemaExtensions()
      </code>
      
       (also part of <code>
        /schema/simple
      </code>
      
       and <code>
        /schema/advanced
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/markdown
      </code>
      
      , <code>
        /markdown/vue
      </code>
      
      , <code>
        /markdown/react
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        splitFrontmatter(text)
      </code>
      
       / <code>
        joinFrontmatter(frontmatter, body)
      </code>
      
       (YAML block at offset 0 only, kept verbatim), <code>
        markdownToContent(editor, body, { policy? }): { content, diagnostics }
      </code>
      
       (policy <code>
        { allowHtml?, allowDataUrls? }
      </code>
      
      : raw HTML, links and media with unsafe URLs are dropped and reported as <code>
        MarkdownDiagnostic
      </code>
      
      s — <code>
        raw-html
      </code>
      
      , <code>
        unsafe-url
      </code>
      
      , <code>
        unknown-fence
      </code>
      
       (info), <code>
        unclosed-fence
      </code>
      
       and <code>
        invalid-fence-meta
      </code>
      
       (errors); <code>
        hasFatalDiagnostics
      </code>
      
      ), <code>
        contentToMarkdown(editor)
      </code>
      
      , <code>
        MarkdownClipboard.configure({ policy })
      </code>
      
       (an extension: pastes <code>
        text/markdown
      </code>
      
       and plain text with block syntax as blocks, sanitizes pasted HTML, copies and cuts as <code>
        text/markdown
      </code>
      
       next to <code>
        text/html
      </code>
      
       and <code>
        text/plain
      </code>
      
      ), <code>
        createSourceMode({ getEditor, toMarkdown?, fromMarkdown?, policy? }): SourceMode
      </code>
      
       (<code>
        state
      </code>
      
       store <code>
        { mode: 'visual' | 'source', source, diagnostics }
      </code>
      
      , <code>
        enter()
      </code>
      
      , <code>
        edit(text)
      </code>
      
      , <code>
        commit(): boolean
      </code>
      
       — false with the editor untouched on a fatal diagnostic or a document the schema rejects —, <code>
        cancel()
      </code>
      
      ). Unknown <code>
        ::: kind
      </code>
      
       fences are <code>
        OpaqueFence
      </code>
      
       nodes (in <code>
        coreSchemaExtensions()
      </code>
      
      ) that are written back byte for byte; the Block types a Typed block feature registers parse first. Vue: <code>
        MarkdownSurface
      </code>
      
       (<code>
        v-model
      </code>
      
       is the Markdown string, frontmatter included; props, emits and slots of <code>
        EditorSurface
      </code>
      
       forwarded; an incoming value equal to the last emitted one is ignored; prop <code>
        policy
      </code>
      
       (also configures the <code>
        MarkdownClipboard
      </code>
      
       it installs), prop <code>
        sourceMode
      </code>
      
       (a <code>
        SourceMode
      </code>
      
      : while its state is <code>
        source
      </code>
      
       the surface shows the draft in a text area with the diagnostics of a rejected commit and Apply/Cancel, <code>
        sourceLabels
      </code>
      
       for their texts), event <code>
        diagnostics
      </code>
      
      ). React: <code>
        MarkdownSurface
      </code>
      
       (<code>
        value
      </code>
      
       / <code>
        onChange
      </code>
      
       / <code>
        onFrontmatterChange
      </code>
      
       / <code>
        onDiagnostics
      </code>
      
      , prop <code>
        policy
      </code>
      
       (also configures the installed <code>
        MarkdownClipboard
      </code>
      
      ), the <code>
        EditorSurface
      </code>
      
       props forwarded, same semantics; no source view). Neither imports CodeMirror
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/code
      </code>
      
      , <code>
        /code/vue
      </code>
      
      , <code>
        /code/react
      </code>
    </td>
    
    <td>
      CodeMirror 6 on a string, themed by the shared <code>
        --sk-*
      </code>
      
       tokens (<code>
        styles/tokens.css
      </code>
      
      ; fallbacks are the token defaults). Framework-free: <code>
        createCodeEditor({ parent, doc?, readOnly?, wordWrap?, language?, onSaveShortcut?, onChange? })
      </code>
      
      , <code>
        setReadOnly
      </code>
      
      , <code>
        setWordWrap
      </code>
      
      , <code>
        setLanguage(view, support)
      </code>
      
      , <code>
        loadLanguage(view, id)
      </code>
      
      , <code>
        setDocument(view, text)
      </code>
      
       (a host text, not an edit), <code>
        registerLanguage(id, loader, { core? })
      </code>
      
       / <code>
        resolveLanguage(id)
      </code>
      
       / <code>
        isCoreLang(id)
      </code>
      
       (language packs are the host's: register the <code>
        @codemirror/lang-*
      </code>
      
       packs you depend on; <code>
        jsonl
      </code>
      
       is built in), <code>
        formatJsonInEditor(view)
      </code>
      
      , <code>
        formatJsonText
      </code>
      
      , <code>
        jsonlLanguage
      </code>
      
      , <code>
        kindOf(path, mime?)
      </code>
      
       (<code>
        'markdown' | 'code' | 'binary'
      </code>
      
      ), <code>
        languageOf(path)
      </code>
      
      . <code>
        /code/vue
      </code>
      
      : <code>
        CodeSurface
      </code>
      
       (<code>
        v-model
      </code>
      
       string, <code>
        editable
      </code>
      
      , <code>
        language
      </code>
      
      , <code>
        wordWrap
      </code>
      
      ; emits <code>
        update:modelValue
      </code>
      
      , <code>
        save
      </code>
      
       on Mod-S, <code>
        ready(view)
      </code>
      
      ). <code>
        /code/react
      </code>
      
      : <code>
        CodeSurface
      </code>
      
       (<code>
        value
      </code>
      
      , <code>
        onChange
      </code>
      
      , <code>
        onSave
      </code>
      
      , <code>
        onReady
      </code>
      
      , same flags). No ProseMirror or TipTap is reachable from these entries
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/document/vue
      </code>
      
      , <code>
        /document/react
      </code>
    </td>
    
    <td>
      <code>
        DocumentSurface
      </code>
      
      : <code>
        MarkdownSurface
      </code>
      
       for <code>
        kindOf(path, mime) === 'markdown'
      </code>
      
       (props <code>
        markdown
      </code>
      
      : the Markdown surface's own props, <code>
        preset
      </code>
      
       at least), <code>
        CodeSurface
      </code>
      
       for text (language from <code>
        languageOf(path)
      </code>
      
       unless <code>
        language
      </code>
      
       is given), a <code>
        binary
      </code>
      
       slot (Vue) / <code>
        binary(path)
      </code>
      
       render prop (React) otherwise. <code>
        ready
      </code>
      
       carries <code>
        { kind: 'markdown', editor }
      </code>
      
       or <code>
        { kind: 'code', view }
      </code>
      
      . These entries reach both editors; use <code>
        /markdown/*
      </code>
      
       or <code>
        /code/*
      </code>
      
       alone to keep one out of a bundle
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/transcript
      </code>
      
      , <code>
        /transcript/vue
      </code>
      
      , <code>
        /transcript/react
      </code>
      
      , <code>
        /transcript/schema
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        transcriptFeature
      </code>
      
      , <code>
        TranscriptSegmentView
      </code>
      
      ; framework-free: <code>
        transcriptFeatureCore
      </code>
      
      , <code>
        transcriptSegment
      </code>
      
      , <code>
        speakerConversions
      </code>
      
      , <code>
        segmentSpeakerLines
      </code>
      
      , <code>
        transcriptSchemaExtensions()
      </code>
      
      , <code>
        speakerParagraphsToSegments
      </code>
      
      , <code>
        lastSpeaker
      </code>
      
      , <code>
        speakersIn
      </code>
      
      , and the subtitle export <code>
        vttOf(cues)
      </code>
      
      , <code>
        srtOf(cues)
      </code>
      
      , <code>
        transcriptCuesOf(node)
      </code>
      
      , <code>
        TranscriptCue
      </code>
      
       (block action <code>
        transcript-export
      </code>
      
      ; see <a href="https://skaile-ai.github.io/forge-editor/guides/speech">
        Speech
      </a>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/authors
      </code>
      
      , <code>
        /authors/vue
      </code>
      
      , <code>
        /authors/react
      </code>
      
      , <code>
        /authors/schema
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        authorsFeature
      </code>
      
      , <code>
        AuthorColorsPanel
      </code>
      
      , <code>
        AuthorColorsButton
      </code>
      
      , <code>
        SettingsAuthorsTab
      </code>
      
      ; framework-free: <code>
        authorsFeatureCore
      </code>
      
      , <code>
        currentAuthor
      </code>
      
      , <code>
        AuthorAttribution
      </code>
      
      , <code>
        authorsSchemaExtensions()
      </code>
      
      , <code>
        AuthorMark
      </code>
      
      , <code>
        documentAuthors
      </code>
      
      , <code>
        AuthorIdentity
      </code>
      
      , <code>
        AUTHOR_COLOR_STYLES
      </code>
      
      , <code>
        AuthorColorStyle
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/themes
      </code>
      
      , <code>
        /themes/vue
      </code>
      
      , <code>
        /themes/react
      </code>
      
      , <code>
        /themes/schema
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        themesFeature()
      </code>
      
       (site-wide Obsidian themes: its <code>
        setup
      </code>
      
       hook starts the theme runtime and returns its teardown, its <code>
        appearance
      </code>
      
       settings tab picks the theme), <code>
        SettingsAppearanceTab
      </code>
      
      ; framework-free: <code>
        themesFeatureCore
      </code>
      
      , <code>
        startObsidianTheme(ctx)
      </code>
      
       (reference-counted per app, returns the release), <code>
        pinObsidianTheme(ctx, id)
      </code>
      
       (shows a theme over the setting until released, nothing persisted), <code>
        ThemeHost
      </code>
      
      , <code>
        scopeThemeCss
      </code>
      
      , <code>
        THEME_SCOPE_CLASS
      </code>
      
      ; Vue-free schema: <code>
        ThemeRecord
      </code>
      
      , <code>
        ThemeManifest
      </code>
      
      , <code>
        themeManifestSchema
      </code>
      
      , <code>
        THEME_ID
      </code>
      
      , <code>
        MAX_THEME_BYTES
      </code>
      
      . Needs an adapter with <code>
        listThemes
      </code>
      
      /<code>
        loadTheme
      </code>
      
      ; see the <a href="https://skaile-ai.github.io/forge-editor/guides/themes">
        usage guide
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/comments
      </code>
      
      , <code>
        /comments/vue
      </code>
      
      , <code>
        /comments/react
      </code>
      
      , <code>
        /comments/schema
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        commentsFeature
      </code>
      
       (requires <code>
        collab
      </code>
      
      ), <code>
        useComments
      </code>
      
      , <code>
        CommentsMargin
      </code>
      
      , <code>
        CommentsPopover
      </code>
      
      , <code>
        CommentsListMenu
      </code>
      
      , <code>
        CommentThreadView
      </code>
      
      , <code>
        CommentComposer
      </code>
      
      , <code>
        CommentBubble
      </code>
      
      , <code>
        SettingsCommentsTab
      </code>
      
       (<code>
        /vue
      </code>
      
       also the type <code>
        CommentsStore
      </code>
      
      ); framework-free: <code>
        commentsFeatureCore
      </code>
      
      , <code>
        createCommentsModel
      </code>
      
      , <code>
        Comments
      </code>
      
       plugin helpers, <code>
        commentsSchemaExtensions()
      </code>
      
      , <code>
        CommentMark
      </code>
      
      , <code>
        CommentThread
      </code>
      
      , <code>
        CommentReply
      </code>
      
      , <code>
        COMMENT_LIMITS
      </code>
      
      , <code>
        COMMENTS_LAYOUTS
      </code>
      
      , <code>
        CommentsLayout
      </code>
      
      , and the margin's layout (the active thread pinned to its text's line, the others one-line cards out of its way): <code>
        layoutMargin(entries, activeId, { gap, minTop })
      </code>
      
       (with <code>
        MarginEntry
      </code>
      
      , <code>
        MarginLayout
      </code>
      
      , <code>
        MARGIN_GAP
      </code>
      
      ), <code>
        marginCards
      </code>
      
       (with <code>
        MarginCard
      </code>
      
      , <code>
        DRAFT_CARD
      </code>
      
      ; an orphaned thread sits at its deletion point, <code>
        CommentsSnapshot.orphanAt
      </code>
      
      , which host models may omit), <code>
        createMarginController
      </code>
      
       (with <code>
        MarginController
      </code>
      
      , <code>
        MarginSource
      </code>
      
      , <code>
        MarginState
      </code>
      
      : measuring and scheduling for both <code>
        CommentsMargin
      </code>
      
      s)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/composites/vue
      </code>
      
      , <code>
        /composites/react
      </code>
    </td>
    
    <td>
      <code>
        compositeFeature()
      </code>
      
       (Vue: Nuxt UI, React: shadcn), the host-placed <code>
        CompositeTable
      </code>
      
       and <code>
        CompositeInspector
      </code>
      
      , <code>
        SettingsEditingTab
      </code>
      
      , <code>
        CompositeChrome
      </code>
      
      , <code>
        CompositeDetails
      </code>
      
      , <code>
        CompositeView
      </code>
      
       and editors, <code>
        useCompositeRows
      </code>
      
      , <code>
        useCompositeAnchors
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/composites
      </code>
      
      , <code>
        /composites/schema
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        compositeFeatureCore
      </code>
      
      , <code>
        Composite
      </code>
      
      , <code>
        BlockType
      </code>
      
      , <code>
        BlockTypeAi
      </code>
      
      , <code>
        defaultBlockTypes
      </code>
      
      , <code>
        blockTypeOf
      </code>
      
      , <code>
        acceptsChild
      </code>
      
       (the Block types' Accepted children, <code>
        BlockType.accepts
      </code>
      
      ), <code>
        AcceptedChildren
      </code>
      
       (the editor extension that enforces them; registered by <code>
        compositeFeatureCore
      </code>
      
      ). Also <code>
        compositeOutline
      </code>
      
      , <code>
        documentOutline(doc, untitled, capabilitiesOf?, documentId?)
      </code>
      
       (the Block outline: headings and Typed blocks as one tree; <code>
        DocumentOutlineEntry
      </code>
      
      , <code>
        DocumentOutlineBlock
      </code>
      
      , <code>
        DocumentOutlineHeading
      </code>
      
      ), <code>
        moveBlockInto
      </code>
      
       (returns whether the document changed), <code>
        moveIntoVerdict(editor, id, targetId, t)
      </code>
      
       (with <code>
        MoveVerdict
      </code>
      
      : <code>
        { ok: true }
      </code>
      
       or <code>
        { ok: false, reason }
      </code>
      
       in the language of <code>
        t
      </code>
      
      ), <code>
        canMoveBlockInto
      </code>
      
       (<code>
        moveIntoVerdict(...).ok
      </code>
      
      ), <code>
        headingsMarkdown
      </code>
      
      , <code>
        documentCompositeMarkdown
      </code>
      
      , <code>
        Structure
      </code>
      
      , <code>
        createCompositeRows
      </code>
      
      , <code>
        createCompositeInspector
      </code>
      
      , <code>
        compositeFieldText
      </code>
      
      , <code>
        observeCompositeAnchors
      </code>
      
      , <code>
        compositeRows
      </code>
      
      , <code>
        setBlockProperty
      </code>
      
      , <code>
        setCompositeTags
      </code>
      
      , <code>
        setCompositeDescription
      </code>
      
      , <code>
        compositeDescriptionText
      </code>
      
      , <code>
        compositeSchemaExtensions()
      </code>
      
      , <code>
        blocksFromMarkdown
      </code>
      
      , <code>
        compositeFence
      </code>
      
      , conversions and heading↔Typed block transforms. Source-holding Typed blocks: <code>
        SOURCE_MEDIA_TYPES
      </code>
      
      , <code>
        sourceOf
      </code>
      
      , <code>
        derivedChildrenOf
      </code>
      
       (the Derived blocks of a Typed block), <code>
        Derivation
      </code>
      
       with <code>
        DERIVATION_KEY
      </code>
      
      , <code>
        derivationOf
      </code>
      
      , <code>
        derivationState
      </code>
      
      , <code>
        bodyMarkdown
      </code>
      
      ; bibliography: <code>
        CslItem
      </code>
      
      , <code>
        CSL_TYPES
      </code>
      
      , <code>
        bibOf
      </code>
      
      , <code>
        cslOf
      </code>
      
      , <code>
        citeShort
      </code>
      
      , <code>
        citeFull
      </code>
      
      , <code>
        bibtexOf
      </code>
      
      , <code>
        yearOf
      </code>
      
      , <code>
        cslTypeOptions
      </code>
      
      ; references: <code>
        ReferenceNode
      </code>
      
      , <code>
        referencesFromText
      </code>
      
      , <code>
        normalizeReferences
      </code>
      
      , <code>
        referenceMarkdown
      </code>
      
      ; <code>
        /composites
      </code>
      
       also <code>
        referenceSuggestion
      </code>
      
      , <code>
        referenceLabel
      </code>
      
      , <code>
        compositeBacklinks
      </code>
      
       (with <code>
        CompositeBacklink
      </code>
      
      , <code>
        CompositeReference
      </code>
      
      ) and <code>
        revealSource
      </code>
      
      , <code>
        seekSource
      </code>
      
      , <code>
        parseLocator
      </code>
      
      , <code>
        SourceReveal
      </code>
      
       (show a Typed block's source at a time or page); <code>
        /composites/schema
      </code>
      
       also <code>
        compositeIdsOf
      </code>
      
      . Baskets: <code>
        Basket
      </code>
      
       (<code>
        { id, label, color }
      </code>
      
      ), <code>
        BASKET_IDS
      </code>
      
      , <code>
        defaultBaskets(t)
      </code>
      
      , `basketOf(node
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/ai
      </code>
      
      , <code>
        /ai/protocol
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        aiFeatureCore
      </code>
      
      , <code>
        modelProfiles(app)
      </code>
      
      , <code>
        createAiAssistant
      </code>
      
      , <code>
        createDocumentChat
      </code>
      
      , <code>
        createAiSelectionFlow
      </code>
      
       (with <code>
        AI_SELECTION_MENU_KEY
      </code>
      
      ), <code>
        createAiReviewBar({ notify, t, editor })
      </code>
      
       (model of the review bar), <code>
        createAgentOpReview({ notify, t })
      </code>
      
       (host-driven agent edit review), <code>
        notifyAiRateLimited(notify, t)
      </code>
      
      , review/apply helpers (<code>
        startAiReview
      </code>
      
      , <code>
        applyAiResult
      </code>
      
      , …) and the protocol (<code>
        AI_TASKS
      </code>
      
      , <code>
        ModelRef
      </code>
      
      , <code>
        AGENT_OP_TYPES
      </code>
      
      , <code>
        AGENT_OP_OUTCOMES
      </code>
      
      , <code>
        CHAT_LIMITS
      </code>
      
      , …), importable alone from <code>
        /ai/protocol
      </code>
      
      ; the model-facing agent texts (<code>
        checkAgentOps
      </code>
      
      , <code>
        agentShownMessage
      </code>
      
      , <code>
        agentFeedbackText
      </code>
      
      , <code>
        agentRetryMessage
      </code>
      
      ) take a <code>
        locale: 'de' | 'en'
      </code>
      
       option (default <code>
        de
      </code>
      
      ), and <code>
        agentRetryMessage(problems, scoped, { locale, tool })
      </code>
      
       names the <code>
        tool
      </code>
      
       the model must call again (default <code>
        edit_document
      </code>
      
      ). The <code>
        [id]
      </code>
      
       line format of the chat's document text has one owner there, <code>
        block-lines
      </code>
      
      : writer helpers (<code>
        blockLine
      </code>
      
      , <code>
        singleBlockLine
      </code>
      
      , <code>
        nestedLinePrefix
      </code>
      
      , <code>
        quoteLinePrefix
      </code>
      
      , <code>
        listLinePrefix
      </code>
      
      , <code>
        continuedLinePrefix
      </code>
      
      , <code>
        compositeChromePart
      </code>
      
      , <code>
        compositeLineHeader
      </code>
      
      , <code>
        compositeLineClose
      </code>
      
      , <code>
        TRUNCATED_LINE
      </code>
      
      ), the reader <code>
        readBlockLines
      </code>
      
       (the block ids and which blocks lie inside which; lines in fenced code are not block lines; type <code>
        BlockLines
      </code>
      
      ), the echo strippers <code>
        stripBlockLineEcho
      </code>
      
       and <code>
        stripListMarkerEcho
      </code>
      
      , and the (German, model-facing) prompt texts <code>
        BLOCK_LINES_LABEL
      </code>
      
      , <code>
        BLOCK_LINE_INTRO
      </code>
      
      , <code>
        BLOCK_LINE_MARKERS
      </code>
      
      , <code>
        BLOCK_LINE_LIST_TEXT
      </code>
      
      , <code>
        BLOCK_LINE_HOST_TEXT
      </code>
      
      , <code>
        BLOCK_LINE_COMPOSITE_TEXT
      </code>
      
      , <code>
        BLOCK_LINE_ECHO_TEXT
      </code>
      
      , <code>
        BLOCK_LINE_IDS_HINT
      </code>
      
       with the example (<code>
        BLOCK_LINE_EXAMPLE
      </code>
      
      , <code>
        BLOCK_LINE_EXAMPLE_ID
      </code>
      
      , <code>
        BLOCK_LINE_EXAMPLE_TEXT
      </code>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/ai/actions
      </code>
    </td>
    
    <td>
      <code>
        documentActions({ editor, review, scope?, targets? })
      </code>
      
       (<code>
        DocumentActionsOptions
      </code>
      
      ): the forge actions <code>
        doc.read
      </code>
      
       and <code>
        doc.propose_ops
      </code>
      
       for a host chat with client tools (optional peer <code>
        @skaile/forge-app-actions
      </code>
      
      ; see <a href="https://skaile-ai.github.io/forge-editor/guides/ai#chat-agent-operations">
        Chat agent operations
      </a>
      
      )
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/ai/vue
      </code>
      
      , <code>
        /ai/react
      </code>
    </td>
    
    <td>
      <code>
        aiFeature()
      </code>
      
      , <code>
        AiSidebar
      </code>
      
       (React only; the Vue one is <code>
        /ai/vue/chat
      </code>
      
      ), <code>
        ModelQuickSwitch
      </code>
      
      , <code>
        AiReviewBar
      </code>
      
      , <code>
        AiSelectionMenu
      </code>
      
      , <code>
        SettingsAiTab
      </code>
      
      , <code>
        SettingsModelProfiles
      </code>
      
      ; <code>
        /ai/vue
      </code>
      
       also <code>
        useAiAssistant
      </code>
      
      , <code>
        useDocumentChat
      </code>
      
      , <code>
        useModelProfiles
      </code>
      
       (thin hooks over the models); <code>
        /ai/vue
      </code>
      
       is free of <code>
        @skaile/forge-chat
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/ai/vue/chat
      </code>
    </td>
    
    <td>
      The Vue <code>
        AiSidebar
      </code>
      
      . Renders on the optional peer <code>
        @skaile/forge-chat
      </code>
      
       (<code>
        ChatPanel
      </code>
      
      ): importing the entry without it throws an error naming the peer. The host imports <code>
        @skaile/forge-chat/styles/chat.css
      </code>
      
       and adds Tailwind <code>
        @source
      </code>
      
       for the package
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/adapters/direct-ai
      </code>
    </td>
    
    <td>
      <code>
        createDirectAi({ presets, roles?, users?, fetch? })
      </code>
      
       (<code>
        DirectAiOptions
      </code>
      
      , <code>
        DirectAiPreset
      </code>
      
      ): an <code>
        EditorBackend['ai']
      </code>
      
       that calls OpenAI-compatible chat-completion endpoints from the browser (<code>
        models
      </code>
      
      , <code>
        complete
      </code>
      
      , <code>
        generate
      </code>
      
      , <code>
        transcriptCleanup
      </code>
      
      ; <code>
        chat
      </code>
      
       and <code>
        extract
      </code>
      
       answer 501). The preset keys are readable by the page and no server rate limit applies; see <a href="https://skaile-ai.github.io/forge-editor/guides/storage-adapters#browser-direct-ai">
        Browser-direct AI
      </a>
      
       and the <a href="https://skaile-ai.github.io/forge-editor/guides/editor-ports#capability-locality">
        capability locality
      </a>
      
       table
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/adapters/render
      </code>
    </td>
    
    <td>
      <code>
        createRenderer(targets)
      </code>
      
       (a <code>
        Renderer
      </code>
      
       over <code>
        RenderTarget
      </code>
      
      s, the port <code>
        EditorPorts.render
      </code>
      
      ), <code>
        markdownTarget(options?)
      </code>
      
       (the built-in <code>
        markdown
      </code>
      
       target), <code>
        RenderTarget
      </code>
      
      , <code>
        RenderOutput
      </code>
      
      , <code>
        MarkdownTargetOptions
      </code>
      
      ; Node program, no Vue, React, Nitro or drizzle. See <a href="https://skaile-ai.github.io/forge-editor/guides/render">
        Render
      </a>
      
       and the <a href="https://skaile-ai.github.io/forge-editor/reference/renderer-port">
        Renderer port
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/adapters/speech
      </code>
    </td>
    
    <td>
      <code>
        createOpenAiSpeech(options)
      </code>
      
       (a <code>
        SpeechProvider
      </code>
      
       over an OpenAI-compatible <code>
        /audio/speech
      </code>
      
       endpoint, the port <code>
        EditorPorts.speech
      </code>
      
      ), <code>
        OPENAI_VOICES
      </code>
      
      , <code>
        createMemorySpeech(options?)
      </code>
      
       (one second of silent WAV, for tests and demos), <code>
        silentWav(seconds?)
      </code>
      
      ; Node program, no Vue, React, Nitro or drizzle. The daily budget <code>
        createSpeechBudget
      </code>
      
       and <code>
        SPEECH_CHARS_PER_DAY
      </code>
      
       are in <code>
        @skaile/forge-editor/server
      </code>
      
      . See <a href="https://skaile-ai.github.io/forge-editor/guides/speech">
        Speech
      </a>
      
       and the <a href="https://skaile-ai.github.io/forge-editor/reference/speech-port">
        Speech port
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/adapters/embeddings
      </code>
    </td>
    
    <td>
      <code>
        createOpenAiEmbedder(options)
      </code>
      
       (an <code>
        Embedder
      </code>
      
       over an OpenAI-compatible <code>
        /embeddings
      </code>
      
       endpoint, the port <code>
        EditorPorts.embeddings
      </code>
      
      ), <code>
        OPENAI_EMBEDDING_DIMENSIONS
      </code>
      
      ; Node program, no Vue, React, Nitro or drizzle. See <a href="https://skaile-ai.github.io/forge-editor/guides/index-pg">
        Index on Postgres
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/adapters/knowledge
      </code>
    </td>
    
    <td>
      <code>
        createMemoryKnowledgeGraph(nodes, edges)
      </code>
      
       (a <code>
        KnowledgeGraph
      </code>
      
       over fixed nodes and edges, searched by the words of the labels, the port <code>
        EditorPorts.knowledge
      </code>
      
      , for tests and demos), <code>
        MEMORY_KNOWLEDGE_LIMIT
      </code>
      
      ; Node program, no Vue, React, Nitro or drizzle. A real graph is the host's: <code>
        @skaile/forge-editor-kgs
      </code>
      
       wraps the KGS SDK. See <a href="https://skaile-ai.github.io/forge-editor/guides/knowledge-graph">
        Knowledge graph
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/integrations/composite-ai
      </code>
    </td>
    
    <td>
      Framework-free (labels quoted in their English catalog form): <code>
        compositeAiFeature
      </code>
      
       (requires <code>
        composites
      </code>
      
      , <code>
        ai
      </code>
      
      , <code>
        media
      </code>
      
      ), <code>
        fillComposite
      </code>
      
      , <code>
        generateCompositeBody
      </code>
      
       (with <code>
        CompositeBodyResult
      </code>
      
      ), <code>
        summarizeComposite
      </code>
      
      , <code>
        createRendition
      </code>
      
      , <code>
        regenerateRendition
      </code>
      
      , <code>
        canCreateRendition
      </code>
      
      , <code>
        canRegenerateRendition
      </code>
      
      , <code>
        RenditionOptions
      </code>
      
       (“Create readable rendition”, “Regenerate (replace)”), <code>
        deriveComposite
      </code>
      
      , <code>
        canDeriveAfter
      </code>
      
      , <code>
        derivableBlockTypesOf
      </code>
      
      , <code>
        isDerivableSource
      </code>
      
       (“Derive (AI)”), <code>
        fetchBibliography
      </code>
      
      , <code>
        canFetchBibliography
      </code>
      
      , <code>
        doiOf
      </code>
      
       (“Fetch bibliography”), <code>
        compositeSourceText
      </code>
      
      , <code>
        COMPOSITE_BODY_START
      </code>
      
      . Splitting and outline: <code>
        splitCompositeWithAi
      </code>
      
      , <code>
        bodyUnchanged
      </code>
      
      , <code>
        splitByInsertedHeadings
      </code>
      
       (“Split into sub-blocks with AI” / “Split into blocks with AI”); <code>
        sanitizeOutline
      </code>
      
      , <code>
        collectHeadings
      </code>
      
      , <code>
        parseOutlineResponse
      </code>
      
      , <code>
        applyOutline
      </code>
      
      , <code>
        OutlineHeading
      </code>
      
      , <code>
        OutlineEntry
      </code>
      
       (“Clean up outline (AI)”); <code>
        writeDerivedBody
      </code>
      
      , <code>
        discardDerived
      </code>
      
       (the write-back of “Derive (AI)”). Transfer: <code>
        summaryTransform
      </code>
      
      , <code>
        bulletsTransform
      </code>
      
       (<code>
        BlockTransform
      </code>
      
      s for the transfer menu: “Insert summary”, “Insert bullet points”), <code>
        transferRequest
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/integrations/composite-media
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        compositeMediaFeature
      </code>
      
       (requires <code>
        composites
      </code>
      
      , <code>
        media
      </code>
      
      ): imported files become Typed blocks of the Block type whose <code>
        import
      </code>
      
       capability takes their media (built in: <code>
        recording
      </code>
      
       for audio/video, <code>
        figure
      </code>
      
       for images, <code>
        document
      </code>
      
       otherwise); block action “Replace source” (English label)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/integrations/transcript-ai
      </code>
      
      , <code>
        /transcript-ai/protocol
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        transcriptAiFeature
      </code>
      
       (requires <code>
        transcript
      </code>
      
      , <code>
        ai
      </code>
      
      ), <code>
        createTranscriptCleanup
      </code>
      
      , <code>
        hasTranscriptSegments
      </code>
      
      ; server contract: <code>
        TRANSCRIPT_CLEANUP_LIMITS
      </code>
      
      , <code>
        transcriptCleanupRequestSchema
      </code>
      
      , <code>
        transcriptCleanupMessages
      </code>
      
      , <code>
        transcriptCleanupChunks
      </code>
      
      , <code>
        parseTranscriptCleanup
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/collab
      </code>
      
      , <code>
        /collab/vue
      </code>
      
      , <code>
        /collab/react
      </code>
    </td>
    
    <td>
      Framework-free: <code>
        collabFeatureCore(ui?)
      </code>
      
       (Yjs <code>
        Collaboration
      </code>
      
      /<code>
        CollaborationCaret
      </code>
      
      , active only with a <code>
        collaboration
      </code>
      
       session on the surface), <code>
        yjsAnchorResolver
      </code>
      
      ; <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        collabFeature()
      </code>
      
       (the Vue one adds the <code>
        @tiptap/vue-3
      </code>
      
       state-sync workaround, the React one needs none)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/block-ui
      </code>
      
      , <code>
        /block-ui/vue
      </code>
      
      , <code>
        /block-ui/react
      </code>
    </td>
    
    <td>
      <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        blockUiFeature(options?)
      </code>
      
       (<code>
        BlockUiOptions.actions
      </code>
      
      : <code>
        'hover'
      </code>
      
       default, <code>
        'toolbar'
      </code>
      
      , <code>
        'both'
      </code>
      
      , <code>
        'none'
      </code>
      
      ), <code>
        BlockUi
      </code>
      
      , <code>
        BlockActionsOverlay
      </code>
      
      ; framework-free: <code>
        blockUiFeatureCore(ui, options?)
      </code>
      
      , <code>
        blockActionsFor(editor, target, actions, surface)
      </code>
      
      , <code>
        selectedBlockOf
      </code>
      
      , <code>
        sameBlock
      </code>
      
      , <code>
        actionSurfacesOf
      </code>
      
      , <code>
        effectiveTarget
      </code>
      
      , <code>
        BLOCK_CORNER_ATTR
      </code>
      
       and <code>
        blockCornerOf
      </code>
      
       (a node view marks its own top-right icons with <code>
        data-block-corner
      </code>
      
      ; the bar docks left of them): drag handle, hover targeting and block actions (opt-in; the simple editor never includes it)
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/transfer
      </code>
      
      , <code>
        /transfer/vue
      </code>
      
      , <code>
        /transfer/react
      </code>
    </td>
    
    <td>
      Block transfer between editor surfaces and trees. Framework-free: <code>
        transferFeatureCore(ui, options?)
      </code>
      
      , <code>
        TransferFeatureOptions
      </code>
      
       (<code>
        { transforms?, defaultTransform? }
      </code>
      
      ), <code>
        TransferUi
      </code>
      
      , <code>
        BlockTransform
      </code>
      
      , <code>
        TransformContext
      </code>
      
      , <code>
        TransferEnv
      </code>
      
      , <code>
        copyTransform
      </code>
      
      , <code>
        DEFAULT_TRANSFORMS
      </code>
      
       (the copy), <code>
        runTransform
      </code>
      
      , <code>
        availableTransforms
      </code>
      
      , <code>
        transformContextOf
      </code>
      
      , <code>
        transferKindOf
      </code>
      
      , <code>
        transferSourceHash
      </code>
      
      , <code>
        createsOf
      </code>
      
      , <code>
        withFreshBlockIds
      </code>
      
      , <code>
        isSelfDrop
      </code>
      
      , <code>
        BlockDropTargetStorage
      </code>
      
      , <code>
        TransferDrop
      </code>
      
      , <code>
        PendingDrop
      </code>
      
      ; the AI transforms <code>
        summaryTransform
      </code>
      
      , <code>
        bulletsTransform
      </code>
      
       and <code>
        transferRequest
      </code>
      
       are in <code>
        @skaile/forge-editor/integrations/composite-ai
      </code>
      
      ; <code>
        /vue
      </code>
      
       and <code>
        /react
      </code>
      
      : <code>
        transferFeature(options?)
      </code>
      
      , <code>
        TransferMenu
      </code>
      
      . The payload side (<code>
        BLOCK_MIME
      </code>
      
      , <code>
        BlockTransfer
      </code>
      
      , <code>
        readBlockTransfer
      </code>
      
      , <code>
        writeBlockTransfer
      </code>
      
      , <code>
        blockTransferOf
      </code>
      
      , <code>
        BlockTransferStorage
      </code>
      
      ) is in <code>
        @skaile/forge-editor/core
      </code>
      
      . See <a href="https://skaile-ai.github.io/forge-editor/guides/content-tree#block-transfer">
        Content tree mechanics
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/schema/advanced
      </code>
    </td>
    
    <td>
      Vue-free <code>
        advancedSchemaExtensions()
      </code>
      
      : the advanced schema for servers, validators and migrations
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/server
      </code>
      
      , <code>
        /server/handlers
      </code>
      
      , <code>
        /server/node
      </code>
      
      , <code>
        /nuxt
      </code>
    </td>
    
    <td>
      Server side without a web framework: <code>
        createCollabServer
      </code>
      
      , <code>
        createAiModels
      </code>
      
      , <code>
        createRateLimiter
      </code>
      
      , <code>
        loadCurrentContent
      </code>
      
      , <code>
        listCurrentContents
      </code>
      
      , <code>
        currentContent
      </code>
      
       (stored content in the current shape), <code>
        EditorPorts
      </code>
      
       with its port interfaces (<code>
        AccessControl
      </code>
      
      , <code>
        DocumentContentStore
      </code>
      
      , <code>
        CollabStateStore
      </code>
      
      , <code>
        Directory
      </code>
      
      , <code>
        AssetStore
      </code>
      
      , <code>
        SettingsStore
      </code>
      
      , <code>
        ThemeStore
      </code>
      
      , <code>
        ModelProvider
      </code>
      
      ), <code>
        serverCapabilities
      </code>
      
      , one request handler per route (<code>
        /server/handlers
      </code>
      
      ), <code>
        listenCollab
      </code>
      
       for a plain Node script (<code>
        /server/node
      </code>
      
      ); the Nitro installers <code>
        installEditorServer
      </code>
      
      , <code>
        provideEditorServer
      </code>
      
       and <code>
        useEditorServer
      </code>
      
       (<code>
        /server/nitro
      </code>
      
      ), whose <code>
        EditorServer
      </code>
      
       handle offers <code>
        forgetDocument
      </code>
      
      , <code>
        liveContent
      </code>
      
      , <code>
        enforceRateLimit
      </code>
      
      , <code>
        resolveModel
      </code>
      
      ; the Nuxt module (config key <code>
        tiptapEditor
      </code>
      
      ) wraps the same core. See the <a href="https://skaile-ai.github.io/forge-editor/guides/editor-ports">
        integration guide
      </a>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        @skaile/forge-editor/styles/core.css
      </code>
      
       (required), <code>
        /composites.css
      </code>
      
      , <code>
        /media.css
      </code>
      
      , <code>
        /mentions.css
      </code>
      
      , <code>
        /tables.css
      </code>
      
      , <code>
        /authors.css
      </code>
      
      , <code>
        /comments.css
      </code>
      
      , <code>
        /transcript.css
      </code>
      
      , <code>
        /ai.css
      </code>
      
      , <code>
        /collab.css
      </code>
      
      , <code>
        /block-ui.css
      </code>
      
      , <code>
        /themes.css
      </code>
    </td>
    
    <td>
      Feature CSS (import after Tailwind, Nuxt UI (Vue) or <code>
        ui-vars.css
      </code>
      
       (React) and <code>
        core.css
      </code>
      
      ; <code>
        themes.css
      </code>
      
       after the feature sheets). The Nuxt module adds all of them itself
    </td>
  </tr>
</tbody>
</table>


## Sitemap

See the full [sitemap](https://skaile-ai.github.io/forge-editor/sitemap.md) for all pages.
