Socket
Book a DemoInstallSign in
Socket

@holochain-syn/text-editor

Package Overview
Dependencies
Maintainers
3
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@holochain-syn/text-editor

A `syn` text editor grammar and editor element, to easily build real-time collaborative text editors in Holochain.

0.500.0-rc.0
latest
npmnpm
Version published
Weekly downloads
59
Maintainers
3
Weekly downloads
 
Created
Source

@holochain-syn/text-editor

A syn text editor grammar and editor element, to easily build real-time collaborative text editors in Holochain.

You can use the text-editor and its grammar as the only state in your syn application, or use it as a subcomponent of a larger state in your application.

Using the Grammar

As the Standalone grammar in your Syn app

import { textEditorGrammar } from '@holochain-syn/text-editor';
import { SynStore } from '@holochain-syn/store';

// ... instantiate the client

const store = new SynStore(client, textEditorGrammar);

Including the Grammar into your own Grammar

import { SynGrammar } from '@syn/store';
import { textEditorGrammar, TextEditorState } from '@holochain-syn/text-editor';

interface DocumentState {
  title: string;
  body: TextEditorState;
}

type DocumentState =
  | {
      type: 'SetTitle';
      title: string;
    }
  | {
      type: 'TextEditorDelta';
      textEditorDelta: TextEditorDelta;
    };

type DocumentGrammar = SynGrammar<CounterState, CounterDelta>;

const DocumentGrammar: DocumentGrammar = {
  initialState: {
    title: '',
    body: textEditorGrammar.initialState,
  },
  applyDelta(
    state: CounterState,
    delta: CounterDelta,
    author: AgentPubKeyB64
  ): CounterState {
    if (delta.type === 'SetTitle') {
      return {
        title: delta.title,
        ...state,
      };
    } else {
      return {
        body: textEditorGrammar.applyDelta(
          state.body,
          delta.textEditorDelta,
          author
        ),
        ...state,
      };
    }
  },
};

Using the element.

  • Attach the context as seen in the context section of @holochain-syn/elements.
  • Define the element:
import '@holochain-syn/text-editor/dist/elements/syn-markdown-editor.js';
  • Include it in your html:
<syn-context>
  <syn-markdown-editor id="text-editor"></syn-markdown-editor>
</syn-context>
  • Instantiate and pass it its SynSlice:
import { TextEditorGrammar } from '@holochain-syn/text-editor';
import { derived } from '@holochain-open-dev/stores';

function textEditorSlice(
  store: SynStore<DocumentGrammar>
): SynSlice<TextEditorGrammar> {
  return {
    state: derived(this.sessionStore.state, document => document.body),
    requestChanges(deltas: TextEditorDelta[]) {
      const documentDeltas = deltas.map(d => ({
        type: 'TextEditorDelta',
        textEditorDelta: d,
      }));
      return this.sessionStore.requestChanges(documentDeltas);
    },
  };
}

const slice = textEditorSlice(store);

// Here you can also pass the slice as an input if you're using any JS framework
document.getElementById('text-editor').synSlice = slice;

FAQs

Package last updated on 22 Apr 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.