Ali
Carattere di baseAltezza


NABI NOTE

Un editor WYSIWYG open source


NABI NOTE è un editor WYSIWYG open source: formattazione, allineamento, tabelle, caricamento e altre funzioni sono moduli indipendenti chiamati wing. Scegli solo le wing necessarie per assemblare un editor e collega anche quelle create da te. È scritto in JavaScript semplice e può essere usato con framework come React o Vue. Nelle pagine senza build puoi iniziare subito con la libreria CDN. Il suo formato di documento, NABI TREE, può diventare HTML anche in Node.js senza DOM del browser. I documenti di input vengono corretti dalle regole registrate; durante la creazione dell'HTML testo e attributi sono sottoposti a escape e gli indirizzi dei collegamenti sono verificati. Le wing personalizzate e i dati ricevuti dal server vanno comunque valutati secondo la politica di sicurezza dell'applicazione. Le variabili CSS e il layout basato su rem permettono di regolare tema e dimensioni; sono disponibili anche modalità scura e caratteri per più lingue.


Carattere

Senza grazie (predefinito), con grazie, monospaziato e corsivo: ogni famiglia dispone i font per sistema di scrittura. L'host decide il carattere predefinito.


Ogni famiglia è mostrata in molte lingue.


Senza grazie · 산세리프 · ゴシック体 · 无衬线 · Serifenlos · Sans empattement · Sin serifa · Sem serifa · Без засечек · بلا زخارف · सैन्स सेरिफ़ · স্যান্স সেরিফ · سانس سیرف · Tanpa serif · بدون سریف · सॅन्स सेरिफ · Không chân · శాన్స్ సెరిఫ్ · Mara seref · Bila serif · சான்ஸ் செரிஃப் · ไร้เชิง · Senza grazie


Con grazie · 세리프 · 明朝体 · 衬线 · Avec empattement · Con serifa · Com serifa · С засечками · بزخارف · सेरिफ़ · সেরিফ · سیرف · Berserif · سریف · सेरिफ · Có chân · సెరిఫ్ · Mai seref · Yenye serif · செரிஃப் · มีเชิง · Con grazie


Monospaziato · 고정폭 · 等幅 · 等宽 · Dicktengleich · Chasse fixe · Monoespaciada · Monoespaçada · Моноширинный · ثابت العرض · मोनोस्पेस · মনোস্পেস · یکساں چوڑائی · Lebar tetap · تک‌فاصله · Đơn cách · మోనోస్పేస్ · Tazara ɗaya · Eş aralıklı · Nafasi moja · ஒற்றையகலம் · ความกว้างคงที่ · Monospaziato


Corsivo · 필기체 · 筆記体 · 手写体 · Schreibschrift · Cursiva · Рукописный · خط اليد · हस्तलिपि · হস্তলিপি · رواں خط · Tulisan tangan · دست‌نویس · हस्ताक्षर · Chữ viết tay · చేతిరాత · Rubutun hannu · El yazısı · Mwandiko · கையெழுத்து · ลายมือ · Corsivo



Dimensione del testo

Molto piccolo

Piccolo

Grande

Molto grande



Intestazione

Su una riga vuota, digita # e poi uno spazio per trasformarla in un titolo.

H1

H2

H3

H4

H5
H6



Grassetto · Corsivo · Sottolineato · Barrato

Grassetto corsivo sottolineato barrato — un esempio.

Possono anche essere combinati.

Apice e pedice

L'area è 3,5 m2 e una nota si aggiunge così.1

L'acqua è H2O.



Colore del testo · Evidenziatore

La tavolozza rimane leggibile sia in modalità chiara sia in modalità scura.

Colore del testo Verde · Corallo · Viola · Ambra · Blu

Evidenziatore Giallo · Verde · Ciano · Rosa · Viola · Arancione



Collegamento

Inserisci un indirizzo e diventa un collegamento.

Puoi usare URL http:// e https://, oltre ai percorsi dello stesso sito che iniziano con . o /. Indirizzi come javascript: non sono consentiti.

Per esempio, digita https://nabi.saro.me e premi spazio o Invio: viene convertito automaticamente.

Apertura dei collegamenti

Il documento memorizza solo l'indirizzo; la pagina che lo visualizza decide come aprire i collegamenti.

Collegamento a un allegato

Il caricamento di un file diverso da un'immagine lascia un collegamento con l'aspetto di un file.

Allegato rimane così.



Allineamento

Allineato a sinistra

Allineato al centro

Allineato a destra

Anche i titoli possono essere allineati.



Elenchi

Elenco puntato

Su una riga vuota, digita - e premi spazio: diventa un elenco puntato.

  • Un elemento puntato

    • Tab / Maiusc+Tab aumentano o riducono il rientro.

Elenco numerato

Su una riga vuota, digita 1. e premi spazio per creare un elenco numerato.

  1. Primo

  2. Secondo

  3. Terzo

Elenco attività

Su una riga vuota, digita [ ] o [x] e premi spazio per creare un elenco attività.

  • Questo elemento è selezionato.

  • Questo non è ancora selezionato.



Tabella

Fai clic sul pulsante della tabella nella barra degli strumenti, poi aggiungi, elimina e unisci righe e colonne.

Ordinamento delle colonne

Anteprima: fai clic, quindi seleziona nell’ordine le intestazioni Disponibilità e Prezzo.

Modello

Disponibilità

Prezzo

Peso

NB-7

1,200

349

1.2 kg

NB-9

20,000

99

0.9 kg

NB-12

3,500

1,299

1.4 kg

NB-80

900

8,900

2.1 kg

NB-100

Da definire

12,999

2.4 kg

Prezzo contiene solo numeri, quindi viene ordinato numericamente.

Disponibilità viene ordinata come testo perché l'ultima cella contiene lettere.



Separatore

Digita --- e premi Invio per trasformarlo in un separatore.




Immagine

La larghezza va dal 30% al 100% e l'immagine può essere allineata a sinistra, al centro o a destra.



YouTube



Caricamento

Prova a trascinare un'immagine o un file nell'editor.

Il caricamento usato qui è simulato; un'impostazione lo collega al tuo server.

Se il caricamento non riesce, l'immagine o il file viene rimosso dall'editor.



Citazione

Su una riga vuota, digita > e premi spazio per creare un riquadro di citazione.

Può occupare più righe.



Codice

Su una riga vuota, digita ``` e premi spazio o Invio per creare un blocco di codice.

Scrivi anche il linguaggio, ad esempio ```java, poi premi spazio o Invio per creare un blocco di codice con quel linguaggio.

import { createNabiWith, defaultWings } from 'nabi-note'

const { nabi } = createNabiWith(defaultWings)
const html = nabi.getHtml()



Dettagli

I dettagli sono composti da un riepilogo e da un corpo.

Puoi scegliere se salvarli chiusi o aperti.



Scorciatoie

Premi rapidamente Maiusc due volte per mostrare nella barra degli strumenti la scorciatoia di ogni funzione.



Formattazione automatica

Esempio

Tasto di azione

Risultato

#

Spazio

Intestazione

-

Spazio

Elenco puntato

1.

Spazio

Elenco numerato

[ ] · [x]

Spazio

Elenco attività

>

Spazio

Citazione

``` · ```ts

Spazio · Invio

Blocco di codice

---

Invio

Separatore

https://…

Spazio · Invio

Collegamento



Funzioni di output

Funzione

Risultato

getHtml()

HTML

getJson()

JSON



Funziona senza DOM

La conversione da JSON a HTML non richiede un DOM.

Un server (Node.js) può leggere un NABI TREE salvato e creare HTML con le stesse regole.


Adatto ai dispositivi mobili

  • Interfaccia mobile — un layout reattivo gestisce l'interfaccia mobile.

  • Spazio della tastiera mobile — quando la tastiera si apre, la sua altezza viene considerata.

  • Dimensionamento fluido — ogni dimensione è espressa in rem.

  • Molte lingue — supporta più lingue.


Personalizzazione

  • La tua wing — se ti serve una funzione, creala e registrala.

  • Il tuo CSS — colori, angoli e spaziatura sono tutti definiti come --nabi-*, quindi puoi impostare modalità scura, chiara e altro.

  • Open source — è open source su GitHub.


Leggi la documentazione → nabi.saro.me

HTMLCaricamento dell’editor…
JSONnabi-treeCaricamento dell’editor…
Installazione
npm install nabi-note
Codice
import {
  createNabiWith, mountSurface, mountToolbar, mountContextToolbar,
  mountHints, watchSettle, defaultWings, mountUpload, mountUploadView,
  browserFileStore, mountFile, parseNodes, mountViewTools,
  browserHistoryStorage, mountLocalHistory, openHistoryPanel,
} from 'nabi-note'
import { mountDiffWing } from 'nabi-note/diff'

// The box that asks — without it the core answers "no" to everything (plug in your own)
const ask = { message: (t: string) => alert(t), confirm: (t: string) => confirm(t) }

const selected = [
  ...defaultWings,
]
const { nabi, registry } = createNabiWith(selected, { ask })

// Bring your own highlighter (Prism, highlight.js, Shiki, …) — the wing stays as it is
// and only the attach is swapped (`makeCodeAttach` ships from the same door)
// { ...codeWing, attach: makeCodeAttach({ highlight: (source, lang) => [{ text: source }] }) }

const root = document.querySelector('.nabi')!
const content = document.querySelector('.nabi-content')!

const view = mountUploadView({ nabi, surface: content })
const upload = mountUpload({
  nabi, root: content,
  // your upload goes here — report progress with task.onProgress(0–100)
  uploader: async (task) => ({ uri: 'https://cdn.example/uploaded' }),
  extensions: ['png', 'jpg', 'pdf'], maxFileSize: 10 * 1024 * 1024,
  onStart: (tasks) => view.start(tasks),
  onProgress: (id, percent) => view.progress(id, percent),
  onSettle: () => view.settle(),
  onDone: () => view.done(),
})
const file = mountFile({ nabi, registry, store: browserFileStore(document), parse: parseNodes, locale: 'it', name: () => 'note' })
const history = mountLocalHistory({ nabi, storage: browserHistoryStorage(window) })
const diff = mountDiffWing({ nabi, registry, surface: content, locale: 'it' })

// The locale also sets the direction — Arabic and Urdu run right to left
mountSurface({ nabi, registry, root: content, locale: 'it', fileSink: upload.take })

const settle = watchSettle(document, { surface: content })
const shared = { nabi, registry, surface: content, settle, locale: 'it' }
// A tool that needs a panel comes back to the host — without this the button is dead
const toolbar = mountToolbar({
  ...shared, root: document.querySelector('#toolbar')!,
  file,
  onFiles: upload.take,
  onHost: (w) => {
    if (w === 'diff') { diff.open(); return }
    if (w !== 'localHistory') return
    openHistoryPanel({
      history, surface: content, locale: 'it', sessionId: history.sessionId,
      render: (record) => createNabiWith(selected, { doc: JSON.parse(record.body) }).nabi.getHtml(),
    })
  },
})
const context = mountContextToolbar({ ...shared, root: document.querySelector('#context')! })
mountHints({ toolbar, context, root, surface: content })
// The preview and fullscreen buttons — they stand their own box at the end of the row
mountViewTools({ ...shared, root, container: document.querySelector('#toolbar')! })

// on every change — hook up your own code here
// nabi.onChange(() => user_callback(nabi.getHtml()))