{"id":47529836,"url":"https://github.com/domternal/domternal","last_synced_at":"2026-03-29T18:00:54.472Z","repository":{"id":346587540,"uuid":"1136485156","full_name":"domternal/domternal","owner":"domternal","description":"Lightweight, extensible rich text editor toolkit built on ProseMirror. Headless core, Angular components, full TypeScript support.","archived":false,"fork":false,"pushed_at":"2026-03-25T11:05:46.000Z","size":991,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-25T17:53:27.500Z","etag":null,"topics":["angular","angular-editor","editor","headless","headless-editor","javascript","mit-license","open-source","prosemirror","rich-text","rich-text-editor","tiptap-alternative","typescript","vanila-javascript","wysiwyg"],"latest_commit_sha":null,"homepage":"https://domternal.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/domternal.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-17T19:20:29.000Z","updated_at":"2026-03-25T16:21:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/domternal/domternal","commit_stats":null,"previous_names":["domternal/domternal"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/domternal/domternal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domternal%2Fdomternal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domternal%2Fdomternal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domternal%2Fdomternal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domternal%2Fdomternal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/domternal","download_url":"https://codeload.github.com/domternal/domternal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domternal%2Fdomternal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31156650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-29T17:31:56.304Z","status":"ssl_error","status_checked_at":"2026-03-29T17:31:41.973Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","angular-editor","editor","headless","headless-editor","javascript","mit-license","open-source","prosemirror","rich-text","rich-text-editor","tiptap-alternative","typescript","vanila-javascript","wysiwyg"],"created_at":"2026-03-27T22:00:28.418Z","updated_at":"2026-03-29T18:00:54.457Z","avatar_url":"https://github.com/domternal.png","language":"TypeScript","readme":"# Domternal\n\n[![Domternal Editor](https://domternal.dev/readme/readme-banner.png)](https://domternal.dev)\n\nA lightweight, extensible rich text editor toolkit built on [ProseMirror](https://prosemirror.net/). Framework-agnostic headless core with first-class **Angular** support. Use it headless with vanilla JS/TS, add the built-in toolbar and theme, or drop in ready-made Angular components. Fully tree-shakeable, import only what you use, unused extensions are stripped from your bundle.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![CI](https://github.com/domternal/domternal/actions/workflows/ci.yml/badge.svg)](https://github.com/domternal/domternal/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@domternal/core.svg?label=%40domternal%2Fcore)](https://www.npmjs.com/package/@domternal/core)\n\n**[Website](https://domternal.dev)** · **[Getting Started](https://domternal.dev/v1/getting-started)** · **[Packages \u0026 Bundle Size](https://domternal.dev/v1/packages)** · **[StackBlitz (Angular)](https://stackblitz.com/edit/domternal-angular-full-example)** · **[StackBlitz (Vanilla TS)](https://stackblitz.com/edit/domternal-vanilla-full-example)**\n\n## Features\n\n- **Headless core** - use with any framework or vanilla JS/TS\n- **Angular components** - editor, toolbar, bubble menu, floating menu, emoji picker (signals, OnPush, zoneless-ready)\n- **57 extensions across 10 packages** - 23 nodes, 9 marks, and 25 behavior extensions\n- **140+ chainable commands** - `editor.chain().focus().toggleBold().run()`\n- **Full table support** - cell merging, column resize, row/column controls, cell toolbar, all free and MIT licensed\n- **Tree-shakeable** - import only what you use, your bundler strips the rest\n- **~38 KB gzipped** (own code), [~108 KB total](https://domternal.dev/v1/packages) with ProseMirror\n- **TypeScript first** - 100% typed, zero `any`\n- **4,200+ tests** - 2,675 unit tests and 1,550 E2E tests across 34 Playwright specs\n- **Light and dark theme** - 70+ CSS custom properties for full visual control\n- **Inline styles export** - `getHTML({ styled: true })` produces inline CSS ready for email clients, CMS, and Google Docs\n- **SSR helpers** - `generateHTML`, `generateJSON`, `generateText` for server-side rendering\n\n## Quick Start\n\n### Headless (Vanilla JS/TS)\n\n```bash\npnpm add @domternal/core\n```\n\n```ts\nimport { Editor, Document, Text, Paragraph, Bold, Italic, Underline } from '@domternal/core';\n\nconst editor = new Editor({\n  element: document.getElementById('editor')!,\n  extensions: [Document, Text, Paragraph, Bold, Italic, Underline],\n  content: '\u003cp\u003eHello \u003cstrong\u003eWorld\u003c/strong\u003e!\u003c/p\u003e',\n});\n```\n\nImport only what you need for full control and zero bloat. Use `StarterKit` for a batteries-included setup with headings, lists, code blocks, history, and more.\n\n\u003e **[Getting Started Guide](https://domternal.dev/v1/getting-started)** - headless core, themed UI with toolbar, and Angular component setup\n\u003e\n\u003e **[StackBlitz (Angular)](https://stackblitz.com/edit/domternal-angular-full-example)** - full Angular example with all extensions, toolbar, and bubble menu\n\u003e\n\u003e **[StackBlitz (Vanilla TS)](https://stackblitz.com/edit/domternal-vanilla-full-example)** - full vanilla example with toolbar, bubble menu, and all extensions\n\n## Packages\n\n| Package | Description |\n|---|---|\n| [`@domternal/core`](https://www.npmjs.com/package/@domternal/core) | Editor engine with 13 nodes, 9 marks, 25 extensions, toolbar controller, and 45 built-in icons |\n| [`@domternal/theme`](https://www.npmjs.com/package/@domternal/theme) | Light and dark themes with 70+ CSS custom properties |\n| [`@domternal/angular`](https://www.npmjs.com/package/@domternal/angular) | 5 Angular components: editor, toolbar, bubble menu, floating menu, emoji picker |\n| [`@domternal/pm`](https://www.npmjs.com/package/@domternal/pm) | ProseMirror re-exports (state, view, model, transform, commands, keymap, history, tables, and more) |\n| [`@domternal/extension-table`](https://www.npmjs.com/package/@domternal/extension-table) | Tables with 18 commands: merge, split, resize, cell styling, row/column controls |\n| [`@domternal/extension-image`](https://www.npmjs.com/package/@domternal/extension-image) | Image with paste/drop upload, URL input, XSS protection, bubble menu |\n| [`@domternal/extension-emoji`](https://www.npmjs.com/package/@domternal/extension-emoji) | Emoji picker panel and `:shortcode:` autocomplete |\n| [`@domternal/extension-mention`](https://www.npmjs.com/package/@domternal/extension-mention) | `@mention` autocomplete with multi-trigger and async support |\n| [`@domternal/extension-details`](https://www.npmjs.com/package/@domternal/extension-details) | Collapsible details/accordion blocks |\n| [`@domternal/extension-code-block-lowlight`](https://www.npmjs.com/package/@domternal/extension-code-block-lowlight) | Syntax-highlighted code blocks powered by lowlight |\n\nSee [Packages \u0026 Bundle Size](https://domternal.dev/v1/packages) for a full breakdown of what each package includes and how tree-shaking works.\n\n## Documentation\n\nFull documentation, live playgrounds, and API reference at **[domternal.dev](https://domternal.dev)**.\n\n- [Getting Started](https://domternal.dev/v1/getting-started) - install and create your first editor\n- [Introduction](https://domternal.dev/v1/introduction) - core concepts, architecture, and design decisions\n- [Packages \u0026 Bundle Size](https://domternal.dev/v1/packages) - what each package includes and bundle size breakdown\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for commit conventions, PR guidelines, and development setup.\n\n```bash\npnpm install    # Install dependencies\npnpm build      # Build all packages\npnpm test       # Run tests\npnpm lint       # Run linter\npnpm typecheck  # Type check\n```\n\nRequires Node.js \u003e= 20 and pnpm \u003e= 10.\n\n## License\n\n[MIT](LICENSE)\n","funding_links":[],"categories":["Third Party Components"],"sub_categories":["Editors"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdomternal%2Fdomternal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdomternal%2Fdomternal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdomternal%2Fdomternal/lists"}