All Projects → writewithocto → ink

writewithocto / ink

Licence: MIT license
The flexible TypeScript Markdown editor that powers https://octo.app

Programming Languages

typescript
32286 projects
CSS
56736 projects
HTML
75241 projects
Vue
7211 projects

Projects that are alternatives of or similar to ink

Alfred Pwgen
Generate passwords with Alfred
Stars: ✭ 201 (+145.12%)
Mutual labels:  plugins, extensible
vue-showdowns-editor
A markdown editor using codemirror and previewer using @jhuix/showdowns for Vue.js.
Stars: ✭ 27 (-67.07%)
Mutual labels:  codemirror, mde
ck
Portable automation meta-framework to manage, describe, connect and reuse any artifacts, scripts, tools and workflows on any platform with any software and hardware in a non-intrusive way and with minimal effort. Try it using this tutorial to modularize and automate ML Systems benchmarking from the Student Cluster Competition at SC'22:
Stars: ✭ 501 (+510.98%)
Mutual labels:  plugins
ugo
An extensible and composable cli
Stars: ✭ 12 (-85.37%)
Mutual labels:  extensible
dm2
DM2 | cool Windows app - unique windows manager, open dialog enhancer and much more!
Stars: ✭ 93 (+13.41%)
Mutual labels:  plugins
fabric-history
Fabric.js history plugin
Stars: ✭ 91 (+10.98%)
Mutual labels:  plugins
light-jpf
Lightweight Java Plugin Framework
Stars: ✭ 19 (-76.83%)
Mutual labels:  plugins
Flow.Launcher.PluginsManifest
Community-made plugins and submissions
Stars: ✭ 13 (-84.15%)
Mutual labels:  plugins
canorus
Canorus is a free cross-platform music score editor
Stars: ✭ 25 (-69.51%)
Mutual labels:  plugins
wp-github-gos
利用 github api 实现的一个存储图片/附件的 wordpress 插件
Stars: ✭ 42 (-48.78%)
Mutual labels:  plugins
FieldsLinker
Designed for matching files headers to database fields during the process importing. Allows drawing links between elements of 2 lists
Stars: ✭ 18 (-78.05%)
Mutual labels:  plugins
awesome-medusajs
A curated list of awesome resources related to MedusaJS 😎
Stars: ✭ 113 (+37.8%)
Mutual labels:  plugins
ndslvim
专用于C-family和web前端开发的vim配置(其实通用性也还不错啦)
Stars: ✭ 14 (-82.93%)
Mutual labels:  plugins
beubo
Beubo is a free, simple, and minimal CMS with unlimited extensibility using plugins
Stars: ✭ 23 (-71.95%)
Mutual labels:  plugins
clappr-plugins
Main plugins for the Clappr project
Stars: ✭ 22 (-73.17%)
Mutual labels:  plugins
entrepot
A list of free GitHub.com hosted WordPress plugins, themes & blocks
Stars: ✭ 29 (-64.63%)
Mutual labels:  plugins
audit-log-plugin
Audit logging plugin for Jenkins based on Apache Log4j Audit
Stars: ✭ 19 (-76.83%)
Mutual labels:  plugins
react-code-preview
Code edit preview for React.
Stars: ✭ 52 (-36.59%)
Mutual labels:  codemirror
instant-apps
Your search box is now an app store! 🎉
Stars: ✭ 93 (+13.41%)
Mutual labels:  plugins
eventcatalog
Discover, Explore and Document your Event Driven Architectures powered by Markdown.
Stars: ✭ 392 (+378.05%)
Mutual labels:  plugins

NPM Package License Chat on Discord

ink-mde

The flexible TypeScript Markdown editor that powers https://octo.app.

Features

  • Automatic, dark, or light themes (automatic by default)
  • Hybrid plain-text Markdown rendering
  • Supports GitHub Flavored Markdown (an extension of CommonMark)
  • Syntax highlighting for many common languages (in code blocks)
  • Drag-and-drop or paste to upload files
  • Inline Markdown image previews
  • Configurable and stylable
  • An optional formatting toolbar (great for mobile)
  • Optionally enable Vim Mode
  • All frameworks supported with the ink-mde base export
  • Ready-to-use Vue component with the ink-mde/vue subpath export
  • Supports Server-Side Rendering (SSR) via conditional exports
  • Plugin API

Getting Started

With your preferred package manager, add ink-mde to your project.

# npm
npm i ink-mde

# pnpm
pnpm i ink-mde

# yarn
yarn add ink-mde

Next, import ink-mde and customize it to fit your needs.

Examples for ink-mde

Minimal setup

Mount the component and start writing.

// ./examples/minimal.ts
import ink from 'ink-mde'

// The only requirement is an HTML element.
ink(document.getElementById('editor')!)

Track state changes with hooks

To sync the editor with your app's state, you can use the afterUpdate hook.

// ./examples/hooks.ts
import { defineOptions, ink } from 'ink-mde'

// With hooks, you can keep your state in sync with the editor.
const state = { doc: '# Start with some text' }

// Use defineOptions for automatic type hinting.
const options = defineOptions({
  doc: state.doc,
  hooks: {
    afterUpdate: (doc: string) => {
      state.doc = doc
    },
  },
})

const editor = ink(document.getElementById('editor')!, options)

// You can also update the editor directly.
editor.update(state.doc)

Examples for ink-mde/vue

The ink-mde/vue subpath exports a Vue 3 component.

Minimal setup

<template>
  <InkMde v-model="markdown" />
</template>

<script lang="ts" setup>
import InkMde from 'ink-mde/vue'
import { ref } from 'vue'

const markdown = ref('# Hello, World!')
</script>

Custom Options

The Vue component forwards all options that ink-mde supports, and it uses a deep watcher to ensure your options are reactive.

<template>
  <input v-model="options.interface.appearance" type="radio" value="dark"> dark
  <input v-model="options.interface.appearance" type="radio" value="light"> light
  <InkMde v-model="markdown" :options="options" />
</template>

<script lang="ts" setup>
import InkMde from 'ink-mde/vue'
import { reactive, ref } from 'vue'

const markdown = ref('# Hello, World!')
const options = reactive({
  interface: {
    appearance: 'dark',
  },
})
</script>

Further customization

These are the default options, and any of them can be overridden when initializing (or reconfiguring) an instance of ink-mde.

// ./src/store.ts#L10-L49
const options = {
  doc: '',
  files: {
    clipboard: false,
    dragAndDrop: false,
    handler: () => {},
    injectMarkup: true,
    types: ['image/*'],
  },
  hooks: {
    afterUpdate: () => {},
    beforeUpdate: () => {},
  },
  interface: {
    appearance: InkValues.Appearance.Auto,
    attribution: true,
    autocomplete: false,
    images: false,
    readonly: false,
    spellcheck: true,
    toolbar: false,
  },
  plugins: [],
  selections: [],
  toolbar: {
    bold: true,
    code: true,
    codeBlock: true,
    heading: true,
    image: true,
    italic: true,
    link: true,
    list: true,
    orderedList: true,
    quote: true,
    taskList: true,
    upload: false,
  },
  vim: false,
}

Plugins

The editor can be extended with custom grammars, completions, and more through the Plugin API. Examples coming soon.

Appearance

Many aspects of the editor's appearance can be customized with CSS custom properties (aka CSS variables).

General-purpose styles

CSS Custom Property CSS Property Default (Dark) Override (Light)
--ink-border-radius border-radius 0.25rem
--ink-color color #fafafa #171717
--ink-font-family font-family sans-serif
--ink-flex-direction flex-direction column

Block styles

Blocks are used to provide a dynamic user experience. Examples of blocks are images, multiline code blocks, and the toolbar.

CSS Custom Property CSS Property Default (Dark) Override (Light)
--ink-block-background-color background-color #121212 #f5f5f5
--ink-block-background-color-on-hover background-color #0f0f0f #e0e0e0
--ink-block-max-height max-height 20rem
--ink-block-padding padding 0.5rem

Code styles

These styles are for code blocks and inline code.

CSS Custom Property CSS Property Default (Dark) Override (Light)
--ink-code-background-color background-color var(--ink-block-background-color)
--ink-code-color color inherit
--ink-code-font-family font-family 'Monaco', Courier, monospace

Syntax highlighting

You can customize the entire syntax theme too.

CSS Custom Property CSS Property Default (Dark) Override (Light)
--ink-syntax-atom-color color #d19a66
--ink-syntax-comment-color color #abb2bf
--ink-syntax-emphasis-color color inherit
--ink-syntax-emphasis-font-style font-style italic
--ink-syntax-heading-color color #e06c75
--ink-syntax-heading-font-size font-size 1em
--ink-syntax-heading-font-weight font-weight 600
--ink-syntax-heading1-color color #e06c75
--ink-syntax-heading1-font-size font-size 1.6em
--ink-syntax-heading1-font-weight font-weight 600
--ink-syntax-heading2-color color #e06c75
--ink-syntax-heading2-font-size font-size 1.5em
--ink-syntax-heading2-font-weight font-weight 600
--ink-syntax-heading3-color color #e06c75
--ink-syntax-heading3-font-size font-size 1.4em
--ink-syntax-heading3-font-weight font-weight 600
--ink-syntax-heading4-color color #e06c75
--ink-syntax-heading4-font-size font-size 1.3em
--ink-syntax-heading4-font-weight font-weight 600
--ink-syntax-heading5-color color #e06c75
--ink-syntax-heading5-font-size font-size 1.2em
--ink-syntax-heading5-font-weight font-weight 600
--ink-syntax-heading6-color color #e06c75
--ink-syntax-heading6-font-size font-size 1.1em
--ink-syntax-heading6-font-weight font-weight 600
--ink-syntax-keyword-color color #c678dd
--ink-syntax-link-color color #96c0d8
--ink-syntax-meta-color color #abb2bf
--ink-syntax-name-color color #d19a66
--ink-syntax-name-label-color color #abb2bf
--ink-syntax-name-property-color color #96c0d8
--ink-syntax-name-property-definition-color color #e06c75
--ink-syntax-name-variable-color color #e06c75
--ink-syntax-name-variable-definition-color color #e5c07b
--ink-syntax-name-variable-local-color color #d19a66
--ink-syntax-name-variable-special-color color inherit
--ink-syntax-number-color color #d19a66
--ink-syntax-operator-color color #96c0d8
--ink-syntax-processing-instruction-color color #444444 #bbbbbb
--ink-syntax-punctuation-color color #abb2bf
--ink-syntax-strikethrough-color color inherit
--ink-syntax-strikethrough-text-decoration text-decoration line-through
--ink-syntax-string-color color #98c379
--ink-syntax-string-special-color color inherit
--ink-syntax-strong-color color inherit
--ink-syntax-strong-font-weight font-weight 600
--ink-syntax-url-color color #aaaaaa #666666

Support

Your support is appreciated. Here are some ways you can help. ♥️

Leave the Attribution enabled

There is a small powered by ink-mde attribution in the bottom-right corner of all editor instances by default. Being a free, MIT-licensed library under independent development, that attribution helps to increase awareness of this project and my work in general.

Tell us what you think

Your feedback is immensely important for building ink-mde into a library that we all love. Consider starting a discussion under Octo if you have a question or just want to chat about ideas!

Open a Pull Request

If you feel comfortable with an existing issue, please consider opening a Pull Request. I would love to work with you to get it merged!

Become a financial backer

A note about v0 releases

Since ink-mde is a v0 project, you should consider minor version increments to be breaking changes. Semantic Versioning considers all v0 releases to be breaking, but I do my best to make patch releases non-breaking.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].