npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@trevixal/editor-kit

v1.0.5

Published

Every Trevixal package, assembled: one call mounts the menubar, toolbar, panels, panes and all twenty extensions.

Readme

@trevixal/editor-kit

CI npm types license

Documentation · Live editor · Changelog · Issues

The Trevixal editor

Features

  • One call mounts the finished editor: mountFullEditor({ element })
  • Every extension wired to every other: tables, images, math, diagrams, track changes
  • Autosave, themes, a document workspace and a command palette included
  • A CDN build that runs from one <script> tag with no bundler
  • 14.1 kB minified and gzipped, with TypeScript types in the package

Every package the Trevixal workspace ships, assembled into one call. Where @trevixal/core is the engine and @trevixal/ui is the chrome, this is the finished editor. The thing the demo page was, with the page taken out of it.

npm install @trevixal/editor-kit @trevixal/core @trevixal/ui
import { mountFullEditor } from '@trevixal/editor-kit'
import '@trevixal/ui/styles.css'
import '@trevixal/editor-kit/styles.css'

const editor = mountFullEditor({ element: document.querySelector('#app') })

That is the whole integration. Everything below is optional.

What you get

One call builds the page and wires every part of it to every other:

| | | | --- | --- | | Chrome | Menubar, toolbar with draggable groups, status bar, dialogs, command palette (Ctrl+K) | | Blocks | Headings, lists, task lists, quotes, code, tables, images, callouts, toggles, tabs, accordions, columns, cards, timelines, badges, buttons, anchors, footnotes, citations | | Media | Image upload with resize and crop, attachments, video, audio, YouTube, Vimeo, link cards | | Maths and diagrams | LaTeX equations, Mermaid diagrams fetched on first use | | Writing | Grammar, passive voice, repeated words and long sentences, each switchable; readability, keyword density, word goals | | Review | Track changes with a suggestion bar, edit history | | Files | Open and save HTML, Markdown, text, JSON, Word; print and print preview | | Storage | Autosave to localStorage with rolling backups and draft recovery, a document workspace with tabs and folders | | Security | AES-256-GCM password protection over everything it saves, .tvx encrypted files with expiry, copy/cut/paste/print/download restrictions | | Presentation | Six themes plus a custom one, custom CSS, web fonts, page view, focus mode, typewriter mode, fullscreen, side-by-side preview, a second live editing surface | | Input | Slash commands, :emoji: shortcodes, rebindable shortcuts, find and replace |

Configuration

Only what a host actually decides. Which extensions, which menus, which panels. Those are not options, because a build with half of them is not what this package is for.

mountFullEditor({
  element,                         // required; it is emptied first
  content: myDocument,             // default: a tour of every block type
  placeholder: 'Write something…',
  author: 'Ada',                   // whose name goes on a tracked change
  namespace: 'my-app',             // the localStorage prefix for everything it saves
  uploadEndpoint: '/api/uploads',  // or null to skip the request and use a data URL
  maxImageBytes: 5 * 1024 * 1024,
  heading: 'My editor',            // or null for none
  paragraphs: ['<b>Some</b> copy.'],
  showSerializedHTML: false,
  aboutRows: [{ term: 'Build', description: 'v2.1' }],
  onChange: (editor) => save(editor.getJSON()),
})

The returned handle carries the editor, the layout it built, the ui it mounted, and a destroy() that takes all three back.

Where it can run

It reaches for window and document in its first statement, so it has to be called from wherever your framework runs browser-only code (a useEffect, an onMounted, an afterNextRender, an onMount) and never during a server render. The examples do exactly that in eight frameworks; each one is a few lines long.

Call it once per page. Several of the parts it assembles are singletons by nature (the autosave draft, the workspace store, the command palette on document.body) so a second mount sharing a namespace would have two editors writing over one another's saves.

On a server

mountFullEditor is browser-only. The package is not: importing it runs no DOM code, so a Node process can take the schema out of it and render a stored document to HTML with no browser anywhere.

import { createEditor, serializeToHTML } from '@trevixal/core'
import { createFullSchema } from '@trevixal/editor-kit'

const editor = createEditor({ schema: createFullSchema(), content: stored }) // no element
const html = serializeToHTML(editor.state.doc)
editor.destroy()

createFullSchema() is the schema mountFullEditor builds on, tables, images, blocks, embeds, equations and the track-changes marks. defaultNodes() alone cannot read a document this editor produced. examples/ssr is the runnable version.

From a script tag, with no bundler

There is a second build for pages that have none: one file that defines window.TrevixalKit, with the core, the chrome and every extension inlined because such a page cannot fetch them separately.

<link rel="stylesheet" href="https://unpkg.com/@trevixal/ui/styles.css" />
<link rel="stylesheet" href="https://unpkg.com/@trevixal/editor-kit/styles.css" />
<script src="https://unpkg.com/@trevixal/editor-kit"></script>

<div id="app"></div>
<script>
  TrevixalKit.mountFullEditor({ element: document.querySelector('#app') })
</script>

It is the largest artefact this workspace publishes, 180 kB gzipped against 36 kB for the core alone, and that is the trade it exists to make. If you have a bundler, import the package instead and let it tree-shake; if you need an editor in a page you cannot build, this is the whole integration. examples/vanilla-cdn runs it, and is four tags and a div long.

Styles

Two stylesheets, in this order:

import '@trevixal/ui/styles.css'          // the editor and its chrome
import '@trevixal/editor-kit/styles.css' // the shell around them

The second is scoped to .trevixal-full-editor, the class the mount puts on your element, so it does not reach into the rest of your page. The one deliberate exception is the syntax-colour palette: collectDocumentCSS copies those rules into exported and previewed documents, which have none of the shell around them, so they cannot be scoped to it.

The SCSS sources ship too, at @trevixal/editor-kit/scss/*, if you would rather build the palette from your own tokens.

Building it yourself instead

Nothing here is privileged. mountFullEditor is a few hundred lines that import the same public API you have, and src/mount.ts is worth reading if you want most of this editor but not all of it: copy it, delete what you do not want, and you have your own build with no fork of anything.

License

Apache-2.0