NABI NOTE
নথি
ডানা
ডিফল্ট ফন্টউচ্চতা


NABI NOTE

একটি মুক্ত-উৎস WYSIWYG সম্পাদক


NABI NOTE একটি মুক্ত-উৎস WYSIWYG সম্পাদক, যেখানে বিন্যাস, সারিবদ্ধতা, সারণি ও আপলোডের মতো সুবিধাগুলো মূল অংশ থেকে আলাদা করে «wing» নামের স্বাধীন মডিউলে রাখা হয়েছে। প্রয়োজনীয় উইং বেছে সম্পাদক তৈরি করতে পারেন এবং নিজের তৈরি উইংও যুক্ত করতে পারেন। এটি বিশুদ্ধ JavaScript-এ লেখা, তাই React বা Vue-এর মতো ফ্রেমওয়ার্কেও ব্যবহার করা যায়। বিল্ডের ব্যবস্থা নেই এমন পৃষ্ঠায় CDN লাইব্রেরি দিয়ে সরাসরি শুরু করা যায়। এর নিজস্ব নথির বিন্যাস NABI TREE ব্রাউজারের DOM ছাড়াও Node.js-এ HTML-এ রূপান্তর করা যায়। ইনপুট নথি নিবন্ধিত নিয়ম অনুযায়ী স্বাভাবিক করা হয়; HTML তৈরির সময় লেখা ও বৈশিষ্ট্যের বিশেষ অক্ষর এস্কেপ করা হয় এবং লিঙ্কের ঠিকানা পরীক্ষা করা হয়। তবে নিজের তৈরি উইং ও সার্ভার থেকে পাওয়া তথ্য অ্যাপ্লিকেশনের নিরাপত্তানীতি অনুযায়ী আলাদা করে পর্যালোচনা করতে হবে। CSS ভেরিয়েবল ও rem-ভিত্তিক বিন্যাস দিয়ে থিম ও আকার বদলানো যায়; ডার্ক মোড ও বিভিন্ন ভাষার জন্য টাইপফেসের সেটিংও রয়েছে। সারণি সাজানো, স্থানীয় ইতিহাস এবং AI-এর সাহায্যে নথির কাজও একই নথি মডেলের ওপর চলে।


হরফ

স্যান্স সেরিফ (ডিফল্ট), সেরিফ, মনোস্পেস ও হস্তলিপির জন্য ভাষা অনুযায়ী বিকল্প ফন্ট রয়েছে। বেছে নেওয়া ধরনের উপযুক্ত ফন্ট না থাকলে ব্রাউজারের ডিফল্ট ফন্ট দেখানো হয়। সম্পাদকের ডিফল্ট ফন্ট হোস্ট পৃষ্ঠা নির্ধারণ করে।


নিচে প্রতিটি পরিবার নানা ভাষায় দেখানো হলো।


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


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


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


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



লেখার মাপ

খুব ছোট

ছোট

বড়

খুব বড়



শিরোনাম

খালি লাইনে # লিখে স্পেস চাপুন — সঙ্গে সঙ্গে শিরোনাম হয়ে যায়।

H1

H2

H3

H4

H5
H6



মোটা · হেলানো · নিম্নরেখ · কাটা

মোটা হেলানো নিম্নরেখ কাটা একই অক্ষরে একসঙ্গে প্রয়োগ করা যায়।

একটার উপর আরেকটাও দেওয়া যায়।

উপরের ও নিচের অঙ্ক

ক্ষেত্রফল ৩.৫ মি2, আর পাদটীকা এভাবে বসে।1

জল হলো H2O।



লেখার রং · হাইলাইটার

রংগুলো এমনভাবে বাছা, যাতে উজ্জ্বল আর অন্ধকার দুইয়েই পড়তে আরাম লাগে।

লেখার রং সবুজ · প্রবাল · বেগুনি · অ্যাম্বার · নীল

হাইলাইটার হলুদ · সবুজ · আকাশি · গোলাপি · বেগুনি · কমলা



সংযোগ

ঠিকানা বসালেই তা সংযোগ হয়ে যায়।

http:// ও https:// ঠিকানার পাশাপাশি . বা / দিয়ে শুরু হওয়া একই সাইটের পথও ব্যবহার করা যায়। javascript:-এর মতো ঠিকানা অনুমোদিত নয়।

যেমন https://nabi.saro.me লিখে স্পেস বা এন্টার চাপুন — নিজে থেকেই বদলে যায়, যেমনটা এখানে দেখা যাচ্ছে।

লিঙ্ক খোলা

নথিতে শুধু লিঙ্কের ঠিকানা সংরক্ষিত হয়; লিঙ্ক কীভাবে খুলবে, তা নথি দেখানো পৃষ্ঠা নির্ধারণ করে।

সংযুক্তির সংযোগ

ছবি ছাড়া অন্য ফাইলগুলো নিচের মতো সংযুক্তির লিংক হিসেবে থাকে।

সংযুক্তি-এর লিংক নথিতে সংরক্ষিত হয়।



সারিবদ্ধতা

বাঁয়ে

মাঝে

ডানে

শিরোনামে সারিবদ্ধকরণ প্রয়োগ করা যায় না।



তালিকা

বিন্দু-তালিকা

খালি লাইনে - লিখে স্পেস চাপুন — সঙ্গে সঙ্গে বিন্দু-তালিকা হয়ে যায়।

  • এটি একটি বিন্দু

    • Tab / Shift+Tab দিয়ে ভিতরে আর বাইরে নেওয়া যায়।

সংখ্যা-তালিকা

খালি লাইনে 1. লিখে স্পেস চাপুন — সংখ্যা-তালিকা হয়ে যায়।

  1. প্রথম

  2. দ্বিতীয়

  3. তৃতীয়

চেক-তালিকা

খালি লাইনে [ ] বা [x] লিখে স্পেস চাপুন — চেক-তালিকা হয়ে যায়।

  • এই কাজটি হয়ে গেছে।

  • এটি এখনো বাকি।



সারণি

ঘরে একাধিক অনুচ্ছেদ ও ব্লক রাখা যায়, আর পটভূমির রঙ দিয়ে বিষয়বস্তু আলাদা করা যায়। নিচের সারণির লেখা ও ছবি সরাসরি সম্পাদনা করে দেখুন।

উপকরণ

কাজের নোট

একই ঘরে ছবি ও তার বিবরণ রয়েছে।

স্বাধীনভাবে অনুচ্ছেদ সাজান

নতুন অনুচ্ছেদের জন্য Enter, আর একই অনুচ্ছেদে নতুন লাইনের জন্য Shift+Enter চাপুন।

  • ঘরের পটভূমির রঙ বদলানো

  • তালিকায় Tab দিয়ে ইন্ডেন্ট করা

  • একাধিক ঘর বেছে একই রঙ প্রয়োগ করা

সম্পাদনার পরামর্শ দেখতে ক্লিক করুন

ঘরের মধ্যে ভাঁজযোগ্য ব্লক, উদ্ধৃতি, কোড ও ভিডিওও রাখা যায়।

ঘর একত্র করলে প্রতিটি ঘরের বিষয়বস্তু ক্রমানুসারে থাকে।

ঘরের ভিতরে ক্লিক করলে পটভূমির রঙ এবং সারি ও কলামের সরঞ্জাম দেখা যায়। একাধিক ঘর বেছে রঙ ও সারিবিন্যাস একসঙ্গে বদলাতে পারেন। পুরো সারণির অবস্থান বদলাতে “পুরো সারণি নির্বাচন করুন” বেছে সারিবিন্যাসের সরঞ্জাম ব্যবহার করুন।

রঙ বা একাধিক ব্লকসহ সারণি Markdown-এ সংরক্ষণ করলেও HTML হিসেবে রাখা হয়।

ঘরের পটভূমির রঙ

সমর্থিত সব পটভূমির রঙ এখানে রয়েছে। রঙ বদলাতে ঘরে ক্লিক করুন, অথবা বৈশিষ্ট্যের সরঞ্জামে “ডিফল্ট” বেছে পটভূমি মুছুন।

হলুদ

yellow

সবুজ

green

আকাশি

cyan

গোলাপি

pink

বেগুনি

purple

কমলা

orange

স্তম্ভ সাজানো

ঝলক চাপুন, তারপর মজুত আর দাম-এর শিরোনামে একে একে ক্লিক করুন।

মডেল

মজুত

দাম

ওজন

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

ঠিক হয়নি

12,999

2.4 kg

দাম কলামের সব মান সংখ্যা, তাই এটি সংখ্যার মান অনুযায়ী সাজানো হয়।

মজুত কলামে সংখ্যা ও লেখা দুটোই আছে, তাই এটি পাঠ্য স্ট্রিং অনুযায়ী সাজানো হয়।



বিভাজক রেখা

--- লিখে এন্টার চাপুন — বিভাজক রেখা হয়ে যায়।




ছবি

প্রস্থ ৩০% থেকে ১০০% পর্যন্ত বদলানো যায় আর সেটি বাঁয়ে, মাঝে বা ডানে বসে।



ভাসমান অঞ্চল

এক নজরে

লেখা, ছবি ও সারণির জন্য ছোট সহায়ক অঞ্চল।

অবস্থান

ডান

সর্বোচ্চ প্রস্থ

40%

মূল লেখার পাশে বাড়তি ব্যাখ্যা বা ছোট উপকরণ রাখতে ভাসমান অঞ্চল ব্যবহার করুন। চওড়া নথিতে এই লেখা অঞ্চলের পাশ দিয়ে প্রবাহিত হয়। ভিতরে ক্লিক করে একই সম্পাদকে লেখা বদলান এবং ছবি বা সারণি যোগ করুন।

বৈশিষ্ট্যের সরঞ্জাম খুলতে অঞ্চলে কার্সর রাখুন। বাম বা ডান অবস্থান বদলান এবং লেখার সঙ্গে মানানসই সর্বোচ্চ প্রস্থ 20, 30, 40 বা 50% বেছে নিন। পেস্ট করা সারণি ও ছবিও অঞ্চলের মধ্যে থাকে।

নির্বাচিত অনুচ্ছেদগুলোকেও একটি অঞ্চলে মুড়ে রাখতে পারেন। প্রস্থের পাশের অঞ্চল খোলার বোতাম বিষয়বস্তু মূল নথিতে রেখে দেয়। পূর্বরূপে সম্পাদনার বিন্দুযুক্ত রেখা লুকানো থাকে; সরু নথি বা মুদ্রণে সবকিছু এক কলামে চলে।


YouTube



আপলোড

কোনো ছবি বা ফাইল সম্পাদকের উপর টেনে আনুন।

এই ডেমো প্রকৃত সার্ভারে ফাইল পাঠায় না। সার্ভারে সংরক্ষণ করতে আপনার অ্যাপ্লিকেশনে আপলোডার যুক্ত করুন।

ছবি বাছাইয়ের জানালা খোলা বা আপলোড শুরু করার পর শুধু কার্সর সরালে আগের অবস্থানেই সংযোজন হয়। অপেক্ষার সময় নথি সম্পাদনা করলে সংযোজন বাতিল হয় এবং বার্তা দেখায়। ঘরে শুরু করা আপলোডের অগ্রগতি ও ফলাফলও সেই ঘরে থাকে।



উদ্ধৃতি

খালি লাইনে > লিখে স্পেস চাপুন — উদ্ধৃতির বাক্স হয়ে যায়।

এটি কয়েক লাইন জুড়েও চলতে পারে।



কোড

খালি লাইনে ``` লিখে স্পেস বা এন্টার চাপুন — কোডের বাক্স হয়ে যায়।

ভাষাটাও সঙ্গে লিখুন, যেমন ```java, তারপর স্পেস বা এন্টার — বাক্সে সেই ভাষা বসে যায়।

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

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



ভাঁজ

ভাঁজ তৈরি হয় শিরোনাম আর ভিতরের লেখা দিয়ে।

এটি বন্ধ অবস্থায় সংরক্ষিত হবে না খোলা অবস্থায়, তা আপনি ঠিক করতে পারেন।



টুলবার

শিরোনাম, লেখার বিন্যাস, সারিবিন্যাস, তালিকা, সন্নিবেশ ও নথির সরঞ্জাম দলবদ্ধ করা হয়েছে। কম্পিউটারে সরঞ্জামগুলো খোলা থাকে; মোবাইলে দ্রুত সরঞ্জাম ও পূর্ণ প্যালেট পাওয়া যায়। নির্বাচিত সারণি বা ভাসমান অঞ্চলের বৈশিষ্ট্য নিচে দেখা যায়।


শর্টকাট

দ্রুত দুবার Shift চাপুন এবং কীবোর্ড দিয়ে সরঞ্জাম বেছে নিন। কম্পিউটারে খোলা টুলবারে আর মোবাইলে পূর্ণ প্যালেটে ঘুরুন। Tab দিয়ে দল বদলান, তীরচিহ্নের কী দিয়ে সরঞ্জাম বাছুন এবং Enter দিয়ে চালান।

উদ্ধৃতি, কোড বা ভাঁজযোগ্য ব্লকের শেষে দ্রুত দুবার Enter চাপলে বাইরে আসা যায়। দুবার চাপার ডিফল্ট ব্যবধান 180ms।



স্বয়ংক্রিয় সাজ

উদাহরণ

কী

ফল

#

স্পেস

শিরোনাম

-

স্পেস

বিন্দু-তালিকা

1.

স্পেস

সংখ্যা-তালিকা

[ ] · [x]

স্পেস

চেক-তালিকা

>

স্পেস

উদ্ধৃতি

``` · ```ts

স্পেস · এন্টার

কোডের বাক্স

---

এন্টার

বিভাজক রেখা

https://…

স্পেস · এন্টার

সংযোগ



নির্গম ফাংশন

ফাংশন

ফল

getHtml()

HTML

getJson()

JSON



DOM ছাড়াও চলে

NABI TREE থেকে HTML বানাতে DOM লাগে না।

সার্ভারেও (Node.js) সংরক্ষিত NABI TREE পড়ে একই নিয়মে HTML তৈরি করা যায়।


মোবাইলের বন্ধু

  • মোবাইল UI — স্ক্রিনের প্রস্থ অনুযায়ী সম্পাদনার টুল সাজায়।

  • মোবাইল কীবোর্ড সমন্বয় — কীবোর্ড খুললে সম্পাদনার অংশের উচ্চতা সমন্বয় করে।

  • নমনীয় আকার — বড় ও ছোট করে দেখার সঙ্গে মানিয়ে নিতে মূল লেআউটে rem একক ব্যবহার করে।

  • একাধিক ভাষা — ভাষা এবং লেখার দিক অনুযায়ী লোকেল ও টাইপফেস সেট করা যায়।


নিজের মতো করে

  • নিজের wing — কোনো সুবিধা দরকার হলে নিজে তৈরি করে যুক্ত করতে পারেন।

  • নিজের CSS — প্রধান রঙ, কোণ ও ফাঁক --nabi-* টোকেন দিয়ে হালকা ও গাঢ় মোডের উপযোগী করতে পারেন।

  • মুক্ত উৎস — GitHub-এ সোর্স কোড প্রকাশ করে একসঙ্গে উন্নয়ন করা হয়।


নথিপত্র দেখুন → nabi.saro.me

HTMLসম্পাদক লোড হচ্ছে…
JSONnabi-treeসম্পাদক লোড হচ্ছে…
ইনস্টল
npm install nabi-note
কোড
import {
  createLocale, createNabiWith, mountSurface, mountToolbar,
  mountContextToolbar, mountHints, watchSettle, makeTranslator,
  defaultWings, mountUpload, mountUploadView, browserFileStore,
  mountFile, mountViewTools, browserHistoryStorage, mountLocalHistory,
  openHistoryPanel,
} from 'nabi-note'
import { mountDiffWing } from 'nabi-note/diff'
import { mountOutline } from 'nabi-note/viewer'

// 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 locale = createLocale('bn')
const { nabi, registry } = createNabiWith(selected, { ask, locale })

// 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, locale })
const upload = mountUpload({
  nabi, root: content, locale,
  // 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), locale, name: () => 'note' })
const history = mountLocalHistory({ nabi, storage: browserHistoryStorage(window) })
const diff = mountDiffWing({ nabi, registry, surface: content, locale })

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

const trigger = document.createElement('button')
trigger.type = 'button'
trigger.textContent = makeTranslator(locale).t('outline')
trigger.style.cssText = 'position:fixed;right:1rem;bottom:1rem;z-index:1000'
root.append(trigger)
const outline = mountOutline(content, {
  trigger, locale,
  scrollContainer: () => root.classList.contains('is-fullscreen') ? root : window,
  onChange: ({ items, activeIndex, available, open }) => {
    trigger.hidden = !available
    trigger.setAttribute("aria-expanded", String(open))
  },
})
trigger.onclick = () => outline.toggle()
// Call outline.unmount() when removing the editor

const settle = watchSettle(document, { surface: content })
const shared = { nabi, registry, surface: content, settle, locale }
// 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, 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()))

// Call from your language selector. Content and editing history stay intact.
// locale.setLocale('ko')