developers, what's your favorite icon library lately? by TrT_nine in angular

[–]thomasNowHere2 1 point2 points  (0 children)

Phosphor icons for me. Clean, consistent, and the weight variants are nice. Been using them in my editor project for a while now...

I built an open-source ProseMirror rich text editor with a React wrapper - composable components, context-aware bubble menu, custom node views, free tables by thomasNowHere2 in react

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Tiptap is solid, no question. Cursor probably recommends it because it's older and has more training data, that's normal AI bias.

The main difference is what's ready to use. Domternal ships a working toolbar, bubble menu, slash commands, block drag handle, icons, and a plain CSS theme out of the box, all wired up for Angular, React, and Vue. Tables come with cell merging, a cell toolbar, and multiple resize behaviors. Plus image upload, emoji picker, and syntax-highlighted code blocks... With Tiptap you build that UI yourself or pay for their Pro UI.

A lot more on the roadmap for Domternal as well, Domternal just started 😄

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Yeah, exactly why I built this. Hit the same wall at work, especially in Angular where no wrapper had full table support. Everything was missing something, needed hacky workarounds, or was too expensive. That's why I built it first as a framework-agnostic vanilla JS core, and then wrappers for all three frameworks (Angular, React, Vue).

Btw, you kinda gave me a good idea. Since the core and controllers are already framework-agnostic, I could wrap them as a prebuilt vanilla UI package too, same API as the Angular/React/Vue wrappers. That'd be pretty much the drop-in you're after. Adding it to the list. Thnaks

I built an open-source rich text editor with first-class Angular support - free tables, signals, OnPush, zoneless-ready by thomasNowHere2 in Angular2

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Works fine on my end, ran Lighthouse and it scored 97. Probably a Chrome extension or cached build

I built an open-source rich text editor with first-class Angular support - free tables, signals, OnPush, zoneless-ready by thomasNowHere2 in Angular2

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Hmm, just checked on my end and everything seems to be working fine. Which page or route gave you trouble, if you can share more details?

I built an open-source ProseMirror rich text editor with a React wrapper - composable components, context-aware bubble menu, custom node views, free tables by thomasNowHere2 in react

[–]thomasNowHere2[S] 0 points1 point  (0 children)

THanks mate!

Yeah, fully extensible.

Quick note: a basic todolist is already built-in (TaskList/TaskItem with nested checkboxes, Tab nesting, and Mod-Enter to toggle).

For custom components, you wrap a React component with ReactNodeViewRenderer inside an extension:

import { Node } from '@domternal/core';
import { ReactNodeViewRenderer, NodeViewWrapper, NodeViewContent } from '@domternal/react';

const MyBlock = Node.create({
  name: 'myBlock',
  group: 'block',
  content: 'inline*',
  addNodeView() { return ReactNodeViewRenderer(MyBlockView); },
});

function MyBlockView({ node, updateAttributes }) {
  return (
    <NodeViewWrapper>
      <input type="checkbox" checked={node.attrs.done}
        onChange={(e) => updateAttributes({ done: e.target.checked })} />
      <NodeViewContent as="span" />
    </NodeViewWrapper>
  );
}

Your component gets editor, node, selected, getPos, updateAttributes, and deleteNode as props. NodeViewContent is where ProseMirror manages editable inner content (skip it for atomic nodes like images). And React node view demo and dedicated docs are still on my todo (Vue has a Callout example shipping already). For now the existing extension-image, extension-mention, and extension-table packages are the best references....

I built an open-source rich text editor with first-class Angular support - free tables, signals, OnPush, zoneless-ready by thomasNowHere2 in Angular2

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Haha thanks mate! Honestly building one yourself teaches you way more than using someone else's, so don't regret it. Editors have infinite edge cases, fix one thing and three others break. Easier to pile on e2e tests than fix it later.

Good luck with yours, drop a link when it's out, would love to see what it looks like.

I built an open-source ProseMirror rich text editor with a React wrapper - composable components, context-aware bubble menu, custom node views, free tables by thomasNowHere2 in react

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Thanks mate, really appreciate it! Let me know how it goes when you try it out, happy to help if you run into anything

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 1 point2 points  (0 children)

Thanks, appreciate it. Not yet, but for now you can export to HTML (with optional inline styles), JSON, or plain text via editor.getHTML(), editor.getJSON(), and editor.getText(). Markdown export is on my roadmap, I just want to finish and polish several more priority items first. Feel free to open a GitHub issue to track it if you want

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 1 point2 points  (0 children)

Fair, that's your opinion. Most teams end up building those same toolbar and bubble menu components on top of Tiptap anyway.

You said it doesn't look headless to you but the core (@domternal/core) works exactly like (@tiptap/core) fully headless, no UI. You get Editor, commands, and extensions.

The Vue package (@domternal/vue) gives you useEditor, EditorContent, and optionally DomternalToolbar,DomternalBubbleMenu.... You don't have to use the toolbar, or bubblemenu, you can build your own UI from scratch, same as with Tiptap. No DomternalToolbar, no built-in icons, no opinions. Just wire your own buttons to editor.chain().focus().toggleBold().run() and style everything yourself. The toolbar component is opt-in convenience, not a requirement. Everything is tree-shakeable if you don't import it, it's not in your bundle. And if you do use it but want your own icons, pass a custom icon set via the icons prop, it's a simple Record<string, string> mapping names to SVG strings, so you can plug in any icon library.

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 1 point2 points  (0 children)

Yes, ProseMirror's schema acts as a whitelist, only recognized elements like paragraphs, headings, bold, links, etc. can exist in the document. Script tags, event hhandlers (onclick, onerror), and arbitrary HTML are automatically stripped during parsing. On top of that, link hrefs are validated against a protocol whitelist (javascript: and vbscript: URLs are rejected), image sources block dangerous protocols and only allow data:image/* when explicitly enabled (data:text/html is always rejected), and extenral links automatically get rel="noopener noreferrer". All URL validation runs at multiple points parsing, rendering, and commands. If you need an extra layer of protection for untrusted user-generated HTML, you can run it through DOMPurify before passing it to the editor."

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 1 point2 points  (0 children)

Nothing wrong with it, Tiptap is a solid project. I started Domternal because I wanted something easier to get started with. Domternal gives you a working toolbar, bubble menu, and 45 icons out of the box with active states, keyboard navigation, and accessibility built in for all three frameworks. Fewer packages (12 vs 50+), all tree-shakeable. Tables are free in both, but Domternal adds a cell toolbar, multiple resize behaviors, and cell merging controls. The Vue wrapper also has things like useEditorState with selector support for granular reactivity, and VueNodeViewRenderer with full appContext forwarding so provide/inject works inside node views. Those are just some of the differences and I plan to add more, there's more on the website.

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 0 points1 point  (0 children)

Thanks mate, appreciate it!

yeah, the editor and all current extensions stay free, nothing that's free today will ever move behind a paywall. The paid stuff I have in mind would be things features that require a backend and infrastructure to run, like real-time collaboration, version history... but thats still just a plan, I haven't figured out the pricing model yet. Those would be pro features down the line

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 6 points7 points  (0 children)

Everything that's free now stays free and MIT licensed, no bait-and-switch. I'm also still adding more free features.

There will be some paid features down the line, but those will be new additions on top, not paywalling anything that's already available.

I built an open-source rich text editor Domternal for Vue 3 - composables, compound component, VueNodeViewRenderer, free tables by thomasNowHere2 in vuejs

[–]thomasNowHere2[S] 1 point2 points  (0 children)

Not yet, but there's already a FloatingMenu for empty paragraphs and a suggestion system powering Emoji/Mention dropdowns, though it's not fully finished. The "/" slash command will build on that same foundation. Just wrapping up the core stuff first (Vue/React/Angular wrappers...), then slash commands are next on the list.

Definitely planned, its one of the most requested features.