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

@docx-editor.dev/pro

v2.17.0

Published

Commercial capabilities for @docx-editor.dev: the review module (comments, tracked changes, markup rendering), custom inline nodes, and realtime collaboration.

Readme

@docx-editor.dev/pro

Four capabilities for the docx-editor.dev React and Vue editors:

  • Tracked changes: Suggesting mode, markup rendering, accept, and reject.
  • Comments: Threads anchored to a range, with replies.
  • Collaboration: Provider-neutral sessions with WebRTC and Hocuspocus helpers.
  • Custom nodes: Inline node types stored as Word content controls.
npm install @docx-editor.dev/react @docx-editor.dev/pro

The framework-neutral entry is @docx-editor.dev/pro. Framework chrome lives at @docx-editor.dev/pro/react and @docx-editor.dev/pro/vue.

Register a module

Capabilities are modules passed to the editor root. Registration happens at construction, so the array identity must be stable. Build it outside render, or the editor rebuilds every time.

import { DocxEditor } from '@docx-editor.dev/react';
import { reviewModule, DocxEditorReview } from '@docx-editor.dev/pro/react';

const MODULES = [reviewModule()];

export function Reviewer({ bytes }: { bytes: Uint8Array }) {
  return (
    <DocxEditor.Root document={bytes} modules={MODULES} author="Jess Lin">
      <DocxEditor.Toolbar />
      <DocxEditor.Viewport>
        <DocxEditor.Content />
        {/* Tracked changes and comments as cards beside the page. */}
        <DocxEditorReview />
      </DocxEditor.Viewport>
    </DocxEditor.Root>
  );
}

author is what lands in w:author. OOXML requires it, so the engine refuses a comment or reply with no author rather than writing an empty attribute.

Without a review module the editor still opens a document containing revisions and comments and still saves them back untouched. It renders revisions in their final state and offers no review UI; the module is what makes them visible and actionable.

Collaboration

Use collaborationModule with a Yjs 13 provider. The package includes WebRTC and Hocuspocus helpers for React and Vue.

Install the peer package for your transport:

npm install @docx-editor.dev/pro yjs y-webrtc
npm install @docx-editor.dev/pro yjs @hocuspocus/provider

Start with the real-time collaboration quickstart. Use the collaboration reference for room lifecycles, presence, recovery, and limits.

Chrome or hooks

Everything the packaged sidebar renders is reachable from useReview(). Use the sidebar for Word-like cards out of the box, or the hook to render your own markup.

import { useReview } from '@docx-editor.dev/pro/react';

function ChangeList() {
  const { items, accept, reject, resolve, reopen, ready } = useReview();
  if (!ready) return null;

  return (
    <ul>
      {items.map((item) => (
        <li key={item.key}>
          {/* File-derived. Render as text, never as markup. */}
          {item.text} — {item.author}
          {item.kind === 'revision' && !item.readOnly && (
            <>
              <button onClick={() => accept(item)}>Accept</button>
              <button onClick={() => reject(item)}>Reject</button>
            </>
          )}
          {item.kind === 'comment' && (
            <button onClick={() => (item.resolved ? reopen(item) : resolve(item))}>
              {item.resolved ? 'Reopen' : 'Resolve'}
            </button>
          )}
        </li>
      ))}
    </ul>
  );
}

Items come from the document tree rather than from what is currently painted, and each anchor comes from layout records rather than measured DOM, so a sidebar built on this does not lag a repaint behind the page or break during pagination.

Custom nodes

An inline node type you define (a citation, a mention, a merge field) stored as a Word content control whose w:tag carries your identity and attributes. Word opens the document, shows the node's text, and gives it back unchanged.

import { defineCustomNode, customNodesModule } from '@docx-editor.dev/pro';

const Citation = defineCustomNode({
  name: 'citation',
  tagPrefix: 'docx',
  label: 'Citation',
  chrome: { color: '#7c3aed' },
  fromDocx: ({ attrs, text }) => ({ ...attrs, label: text }),
});

const MODULES = [customNodesModule({ nodes: [Citation] })];

Every value reaching fromDocx came out of a .docx, so treat attrs and text as untrusted.

insertCustomNode, updateCustomNode, and removeCustomNode author them from code, and customNodeXml builds the same content control on a server with no editor and no DOM.

Licensing

This package is licensed under the EigenPal Pro License, and you can compare and buy license and support levels on the pricing page.

Both module factories accept an optional licenseKey. Construction never validates it and never touches the network.

Documentation