From 6ee1e6b5aacc380ed6a0b708b95fa22cb0ae1b0c Mon Sep 17 00:00:00 2001 From: Sundaram Sharma <98935619+sundaram-sharma@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:56:31 +0530 Subject: [PATCH] Feature Request: Add Support for Hindi Language (#1055) * Fixed typos in the README * feat(feature-requests): Add support for Hindi language This commit adds a feature request for supporting the Hindi language, which would enhance accessibility for Hindi-speaking users. It includes translation, language selection options, and testing for a seamless user experience. Closes #1054 * fix(docs): Correct grammar errors in README.md Addressed grammar mistakes that were identified in the previous pull request. This commit ensures the README.md is free from errors and provides clear and accurate information. Closes #1053 --- README-in_HN.md | 1017 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 37 +- 2 files changed, 1035 insertions(+), 19 deletions(-) create mode 100644 README-in_HN.md diff --git a/README-in_HN.md b/README-in_HN.md new file mode 100644 index 0000000..557359b --- /dev/null +++ b/README-in_HN.md @@ -0,0 +1,1017 @@ + +Snabbdom + +सरलता, प्रतिरूपकता, शक्तिशाली सुविधाओं और प्रदर्शन पर ध्यान देने वाली एक वर्चुअल DOM लाइब्रेरी। + +--- + +[![License: MIT](https://img.shields.io/badge/License-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT) +[![Build Status](https://github.com/snabbdom/snabbdom/actions/workflows/steps.yml/badge.svg)](https://github.com/snabbdom/snabbdom/actions/workflows/steps.yml) +[![npm version](https://badge.fury.io/js/snabbdom.svg)](https://badge.fury.io/js/snabbdom) +[![npm downloads](https://img.shields.io/npm/dm/snabbdom.svg)](https://www.npmjs.com/package/snabbdom) +[![Join the chat at https://gitter.im/snabbdom/snabbdom](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snabbdom/snabbdom?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +[![हमारे सामूहिक को दान करें](https://opencollective.com/snabbdom/donate/button@2x.png?color=blue)](https://opencollective.com/snabbdom#section-contribute) + +पहुंच प्रदान करने के लिए [Browserstack](https://www.browserstack.com/) को धन्यवाद +उनके महान क्रॉस-ब्राउज़र परीक्षण उपकरण। + +--- + +Hindi | [简体中文](./README-zh_CN.md) | [English](./README.md) + +## परिचय + +वर्चुअल डोम अद्भुत है. यह हमें अपने एप्लिकेशन के दृष्टिकोण को व्यक्त करने की अनुमति देता है +अपने राज्य के एक कार्य के रूप में। लेकिन मौजूदा समाधान भी बहुत अच्छे थे +फूला हुआ, बहुत धीमा, सुविधाओं का अभाव, एपीआई OOP के प्रति पक्षपाती था +और/या मेरे लिए आवश्यक सुविधाओं का अभाव है। + +स्नैबडोम में अत्यंत सरल, निष्पादन योग्य और एक्स्टेंसिबल शामिल है +कोर जो केवल ≈ 200 SLOC है। यह एक मॉड्यूलर आर्किटेक्चर प्रदान करता है +कस्टम मॉड्यूल के माध्यम से एक्सटेंशन के लिए समृद्ध कार्यक्षमता। रखने के लिए +मूल सरल, सभी गैर-आवश्यक कार्यक्षमता मॉड्यूल को सौंपी गई है। + +आप स्नैबडोम को अपनी इच्छानुसार ढाल सकते हैं! चुनें, चुनें और +अपनी इच्छित कार्यक्षमता को अनुकूलित करें। वैकल्पिक रूप से आप बस उपयोग कर सकते हैं +डिफ़ॉल्ट एक्सटेंशन और उच्च के साथ एक वर्चुअल DOM लाइब्रेरी प्राप्त करें +प्रदर्शन, छोटा आकार और नीचे सूचीबद्ध सभी सुविधाएँ। + +## विशेषताएँ + +- सब से महत्वपूर्ण विशेषता + - लगभग 200 एसएलओसी - आप आसानी से संपूर्ण कोर और पूरी तरह से पढ़ सकते हैं + समझें कि यह कैसे काम करता है. + - मॉड्यूल के माध्यम से विस्तार योग्य। + - मॉड्यूल के लिए प्रति वीनोड और विश्व स्तर पर हुक का एक समृद्ध सेट उपलब्ध है, + अंतर और पैच प्रक्रिया के किसी भी भाग में शामिल होने के लिए। + - शानदार प्रदर्शन. स्नैबडॉम सबसे तेज़ वर्चुअल DOM लाइब्रेरीज़ में से एक है। + - रिड्यूस/स्कैन के समतुल्य फ़ंक्शन हस्ताक्षर के साथ पैच फ़ंक्शन + समारोह। एफआरपी लाइब्रेरी के साथ आसान एकीकरण की अनुमति देता है। +- मॉड्यूल में सुविधाएँ + - आसानी से वर्चुअल DOM नोड बनाने के लिए `h` फ़ंक्शन। + - [SVG _just works_ with the `h` helper](#svg)। + - जटिल सीएसएस एनिमेशन करने की सुविधाएँ। + - शक्तिशाली घटना श्रोता कार्यक्षमता। + - [Thunks](#thunks) अंतर और पैच प्रक्रिया को और भी अधिक अनुकूलित करने के लिए। + - [JSX support, including TypeScript types](#jsx) +- तृतीय पक्ष सुविधाएँ + - सर्वर-साइड HTML आउटपुट [snabbdom-to-html](https://github.com/acstll/snabbdom-to-html) द्वारा प्रदान किया जाता है। + - [snabbdom-helpers](https://github.com/krainboltgreene/snabbdom-helpers) के साथ कॉम्पैक्ट वर्चुअल DOM निर्माण। + - [snabby](https://github.com/jamen/snabby) का उपयोग करके टेम्पलेट स्ट्रिंग समर्थन। + - [snabbdom-looks-like](https://github.com/jvanbruegge/snabbdom-looks-लाइक) के साथ वर्चुअल डोम अभिकथन +## उदाहरण + +```mjs +import { + init, + classModule, + propsModule, + styleModule, + eventListenersModule, + h, +} from "snabbdom"; + +const patch = init([ + // Init patch function with chosen modules + classModule, // makes it easy to toggle classes + propsModule, // for setting properties on DOM elements + styleModule, // handles styling on elements with support for animations + eventListenersModule, // attaches event listeners +]); + +const container = document.getElementById("container"); + +const vnode = h("div#container.two.classes", { on: { click: () => console.log("div clicked") } }, [ + h("span", { style: { fontWeight: "bold" } }, "This is bold"), + " and this is just normal text", + h("a", { props: { href: "/foo" } }, "I'll take you places!"), +]); +// Patch into empty DOM element – this modifies the DOM as a side effect +patch(container, vnode); + +const newVnode = h( + "div#container.two.classes", + { on: { click: () => console.log("updated div clicked") } }, + [ + h( + "span", + { style: { fontWeight: "normal", fontStyle: "italic" } }, + "This is now italic type" + ), + " and this is still just normal text", + h("a", { props: { href: "/bar" } }, "I'll take you places!"), + ] +); +// Second `patch` invocation +patch(vnode, newVnode); // Snabbdom efficiently updates the old view to the new state +``` + +## अधिक उदाहरण + +- [Animated reordering of elements](http://snabbdom.github.io/snabbdom/examples/reorder-animation/) +- [Hero transitions](http://snabbdom.github.io/snabbdom/examples/hero/) +- [SVG Carousel](http://snabbdom.github.io/snabbdom/examples/carousel-svg/) + +--- + +## विषयसूची + +- [Core documentation](#core-documentation) + - [`init`](#init) + - [`patch`](#patch) + - [Unmounting](#unmounting) + - [`h`](#h) + - [`fragment`](#fragment-experimental) (experimental) + - [`tovnode`](#tovnode) + - [Hooks](#hooks) + - [Overview](#overview) + - [Usage](#usage) + - [The `init` hook](#the-init-hook) + - [The `insert` hook](#the-insert-hook) + - [The `remove` hook](#the-remove-hook) + - [The `destroy` hook](#the-destroy-hook) + - [Creating modules](#creating-modules) +- [Modules documentation](#modules-documentation) + - [The class module](#the-class-module) + - [The props module](#the-props-module) + - [The attributes module](#the-attributes-module) + - [The dataset module](#the-dataset-module) + - [The style module](#the-style-module) + - [Custom properties (CSS variables)](#custom-properties-css-variables) + - [Delayed properties](#delayed-properties) + - [Set properties on `remove`](#set-properties-on-remove) + - [Set properties on `destroy`](#set-properties-on-destroy) + - [The eventlisteners module](#the-eventlisteners-module) +- [SVG](#svg) + - [Classes in SVG Elements](#classes-in-svg-elements) +- [Thunks](#thunks) +- [JSX](#jsx) + - [TypeScript](#typescript) + - [Babel](#babel) +- [Virtual Node](#virtual-node) + - [sel : String](#sel--string) + - [data : Object](#data--object) + - [children : Array](#children--arrayvnode) + - [text : string](#text--string) + - [elm : Element](#elm--element) + - [key : string | number](#key--string--number) +- [Structuring applications](#structuring-applications) +- [Common errors](#common-errors) +- [Opportunity for community feedback](#opportunity-for-community-feedback) + +## मूल दस्तावेज़ीकरण + +स्नैबडॉम का मूल केवल सबसे आवश्यक कार्यक्षमता प्रदान करता है। +इसे तेज़ होने के साथ-साथ यथासंभव सरल बनाने के लिए डिज़ाइन किया गया है +विस्तार योग्य. + +### `init` + +कोर केवल एक एकल फ़ंक्शन `init` को उजागर करता है। यह `init` +मॉड्यूल की एक सूची लेता है और एक `patch` फ़ंक्शन लौटाता है जो इसका उपयोग करता है +मॉड्यूल का निर्दिष्ट सेट। + +```mjs +import { classModule, styleModule } from "snabbdom"; + +const patch = init([classModule, styleModule]); +``` + +### `patch` + +`init` द्वारा लौटाया गया `patch` फ़ंक्शन दो तर्क लेता है। पहला +एक DOM तत्व या एक vnode है जो वर्तमान दृश्य का प्रतिनिधित्व करता है। दूसरा +एक vnode नए, अद्यतन दृश्य का प्रतिनिधित्व करता है। + +यदि पैरेंट वाला DOM तत्व पास हो जाता है, तो `newVnode` चालू हो जाएगा +एक DOM नोड में, और पारित तत्व को प्रतिस्थापित कर दिया जाएगा +DOM नोड बनाया गया. यदि कोई पुराना vnode पारित किया जाता है, तो Snabbdom कुशलतापूर्वक पारित हो जाएगा +नए vnode में विवरण से मेल खाने के लिए इसे संशोधित करें। + +पास किया गया कोई भी पुराना वीनोड पिछली कॉल का परिणामी वीनोड होना चाहिए +`patch` करने के लिए. यह आवश्यक है क्योंकि स्नैबडॉम जानकारी संग्रहीत करता है +vnode. इससे सरल और अधिक कार्यान्वित करना संभव हो जाता है +निष्पादक वास्तुकला. इससे नये पुराने के निर्माण से भी बचा जा सकता है +व्नोड वृक्ष. + +```mjs +patch(oldVnode, newVnode); +``` + +#### `अनमाउंट` + +हालाँकि इसके माउंट पॉइंट तत्व से VNode ट्री को हटाने के लिए विशेष रूप से कोई API नहीं है, इसे लगभग प्राप्त करने का एक तरीका `patch` के दूसरे तर्क के रूप में एक टिप्पणी VNode प्रदान करना है, जैसे: + +```mjs +patch( + oldVnode, + h("!", { + hooks: { + post: () => { + /* patch complete */ + }, + }, + }) +); +``` + +निःसंदेह, माउंट बिंदु पर अभी भी एक टिप्पणी नोड है। + +### `h` + +यह अनुशंसा की जाती है कि आप vnodes बनाने के लिए `h` का उपयोग करें। यह एक स्वीकार करता है +एक स्ट्रिंग के रूप में टैग/चयनकर्ता, एक वैकल्पिक डेटा ऑब्जेक्ट और एक वैकल्पिक स्ट्रिंग या बच्चों की सरणी। + +```mjs +import { h } from "snabbdom"; + +const vnode = h("div", { style: { color: "#000" } }, [ + h("h1", "Headline"), + h("p", "A paragraph"), +]); +``` + +### `fragment` (प्रयोगात्मक) + +सावधानी: यह सुविधा अभी प्रायोगिक है और इसे शामिल किया जाना चाहिए। +इसके एपीआई को बिना किसी बड़े संस्करण के बदलाव के बदला जा सकता है। + +```mjs +const patch = init(modules, undefined, { + experimental: { + fragments: true, + }, +}); +``` + +एक वर्चुअल नोड बनाता है जिसे दिए गए बच्चों वाले दस्तावेज़ खंड में परिवर्तित किया जाएगा। + +```mjs +import { fragment, h } from "snabbdom"; + +const vnode = fragment(["I am", h("span", [" a", " fragment"])]); +``` + +### `tovnode` + +DOM नोड को वर्चुअल नोड में परिवर्तित करता है। पहले से मौजूद, सर्वर-साइड जेनरेट की गई सामग्री पर पैचिंग के लिए विशेष रूप से अच्छा है। + +```mjs +import { + init, + classModule, + propsModule, + styleModule, + eventListenersModule, + h, + toVNode, +} from "snabbdom"; + +const patch = init([ + // Init patch function with chosen modules + classModule, // makes it easy to toggle classes + propsModule, // for setting properties on DOM elements + styleModule, // handles styling on elements with support for animations + eventListenersModule, // attaches event listeners +]); + +const newVNode = h("div", { style: { color: "#000" } }, [ + h("h1", "Headline"), + h("p", "A paragraph"), +]); + +patch(toVNode(document.querySelector(".container")), newVNode); +``` + +### Hooks (हुक्स) + +हुक DOM नोड्स के जीवनचक्र से जुड़ने का एक तरीका है। छीना-झपटी +हुक का एक समृद्ध चयन प्रदान करता है। हुक का उपयोग मॉड्यूल द्वारा दोनों के लिए किया जाता है +Snabbdom का विस्तार करें, और सामान्य कोड में मनमाना कोड निष्पादित करने के लिए +वर्चुअल नोड के जीवन में वांछित बिंदु। + +#### Overview + +| Name | Triggered when | Arguments to callback | +| ----------- | -------------------------------------------------- | ----------------------- | +| `pre` | पैच प्रक्रिया शुरू होती है | none | +| `init` | एक vnode जोड़ा गया है | `vnode` | +| `create` | Vnode के आधार पर एक DOM तत्व(element) बनाया गया है | `emptyVnode, vnode` | +| `insert` | DOM में एक तत्व डाला गया है | `vnode` | +| `prepatch` | एक तत्व पैच होने वाला है | `oldVnode, vnode` | +| `update` | एक तत्व अद्यतन किया जा रहा है | `oldVnode, vnode` | +| `postpatch` |एक तत्व को पैच कर दिया गया है | `oldVnode, vnode` | +| `destroy` | किसी तत्व को प्रत्यक्ष या अप्रत्यक्ष रूप से हटाया जा रहा है | `vnode` | +| `remove` | एक तत्व को सीधे DOM से हटाया जा रहा है| `vnode, removeCallback` | +| `post` | पैच प्रक्रिया पूरी हो गई है | none | + +मॉड्यूल के लिए निम्नलिखित हुक उपलब्ध हैं: `pre`, `create`, +`update`, `destroy`, `remove`, `post`। + +निम्नलिखित हुक व्यक्ति की `hook` संपत्ति में उपलब्ध हैं +तत्व: `init`, `create`, `insert`, `prepatch`, `update`, +`postpatch`, `destroy`, `remove`। +#### Usage (प्रयोग) + +हुक का उपयोग करने के लिए, उन्हें डेटा के `hook` फ़ील्ड में एक ऑब्जेक्ट के रूप में पास करें +वस्तु तर्क. + +```mjs +h("div.row", { + key: movie.rank, + hook: { + insert: (vnode) => { + movie.elmHeight = vnode.elm.offsetHeight; + }, + }, +}); +``` + +#### The `init` hook (`init` हुक) + +यह हुक पैच प्रक्रिया के दौरान लागू किया जाता है जब एक नया वर्चुअल नोड होता है +मिल गया है। Snabbdom द्वारा नोड को किसी भी तरह से संसाधित करने से पहले हुक को कॉल किया जाता है। यानी, इससे पहले इसने vnode के आधार पर एक DOM नोड बनाया है। +#### The `insert` hook (`insert` हुक) + +एक बार vnode के लिए DOM तत्व हो जाने के बाद यह हुक लागू हो जाता है +दस्तावेज़ में डाला गया _और_ शेष पैच चक्र पूरा हो गया है। +इसका मतलब है कि आप DOM मापन (जैसे उपयोग करना) कर सकते हैं +[getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) +इस हुक में सुरक्षित रूप से, यह जानते हुए कि कोई भी तत्व नहीं बदला जाएगा +बाद में यह सम्मिलित तत्वों की स्थिति को प्रभावित कर सकता है। + +#### The `remove` hook (`remove` हुक) + +आपको किसी तत्व को हटाने में शामिल होने की अनुमति देता है। हुक कहा जाता है +एक बार एक vnode को DOM से हटाया जाना है। हैंडलिंग फ़ंक्शन +vnode और कॉलबैक दोनों प्राप्त करता है। आप इसे नियंत्रित और विलंबित कर सकते हैं +कॉलबैक के साथ हटाना. कॉलबैक एक बार लागू किया जाना चाहिए +हुक ने अपना काम पूरा कर लिया है, और तत्व केवल हटा दिया जाएगा +एक बार सभी `remove` हुक ने अपना कॉलबैक लागू कर दिया। + +हुक केवल तभी चालू होता है जब किसी तत्व को उससे हटाया जाना हो +अभिभावक - यदि यह हटाए गए तत्व का बच्चा है तो नहीं। के लिए +वह, `destroy` हुक देखें। + +#### The `destroy` hook (`destroy` हुक) + +यह हुक वर्चुअल नोड पर तब लागू होता है जब इसका DOM तत्व हटा दिया जाता है +DOM से या यदि उसके पैरेंट को DOM से हटाया जा रहा है। + +इस हुक और `remove` हुक के बीच अंतर देखने के लिए, +एक उदाहरण पर विचार करें. + +```mjs +const vnode1 = h("div", [h("div", [h("span", "Hello")])]); +const vnode2 = h("div", []); +patch(container, vnode1); +patch(vnode1, vnode2); +``` + +यहां `नष्ट` को आंतरिक `div` तत्व _और_ दोनों के लिए ट्रिगर किया गया है +इसमें `span` तत्व शामिल है। दूसरी ओर, 'हटाएं' ही है +`div` तत्व पर ट्रिगर किया गया क्योंकि यह एकमात्र तत्व है +अपने माता-पिता से अलग हो गया। + +उदाहरण के लिए, आप किसी एनीमेशन को ट्रिगर करने के लिए `remove` का उपयोग कर सकते हैं +तत्व को हटाया जा रहा है और अतिरिक्त रूप से `destroy` हुक का उपयोग करें +हटाए गए तत्व के बच्चों के गायब होने को चेतन करें। + +### Creating modules (मॉड्यूल बनाना) + +मॉड्यूल [hooks](#hooks) के लिए वैश्विक श्रोताओं को पंजीकृत करके काम करता है। एक मॉड्यूल बस एक शब्दकोश है जो कार्यों के लिए हुक नामों को मैप करता है। + +```mjs +const myModule = { + create: function (oldVnode, vnode) { + // invoked whenever a new virtual node is created + }, + update: function (oldVnode, vnode) { + // invoked whenever a virtual node is updated + }, +}; +``` + +इस तंत्र से आप आसानी से स्नैबडॉम के व्यवहार को बढ़ा सकते हैं। +प्रदर्शन के लिए, डिफ़ॉल्ट के कार्यान्वयन पर एक नज़र डालें +मॉड्यूल. + +## Modules documentation (मॉड्यूल दस्तावेज़ीकरण) + +यह मुख्य मॉड्यूल का वर्णन करता है। सभी मॉड्यूल वैकल्पिक हैं. JSX उदाहरण मानते हैं कि आप इस लाइब्रेरी द्वारा प्रदान किए गए [`jsx` pragma](#jsx) का उपयोग कर रहे हैं। + +### The class module (क्लास मॉड्यूल) + +क्लास मॉड्यूल तत्वों पर कक्षाओं को गतिशील रूप से टॉगल करने का एक आसान तरीका प्रदान करता है। यह `class` डेटा प्रॉपर्टी में एक ऑब्जेक्ट की अपेक्षा करता है। + +ऑब्जेक्ट को क्लास नामों को बूलियन में मैप करना चाहिए जो इंगित करता है कि या +क्लास को वीनोड पर रुकना या जाना नहीं चाहिए। + +```mjs +h("a", { class: { active: true, selected: false } }, "Toggle"); +``` + +In JSX, you can use `class` like this: + +```jsx +
+// Renders as:
+``` + +### The props module (प्रॉप्स मॉड्यूल) + +Allows you to set properties on DOM elements. + +```mjs +h("a", { props: { href: "/foo" } }, "Go to Foo"); +``` + +In JSX, you can use `props` like this: + +```jsx + +// Renders as: with input.name === "foo" +``` + +गुण केवल सेट किए जा सकते हैं, हटाए नहीं जा सकते. भले ही ब्राउज़र कस्टम गुणों को जोड़ने और हटाने की अनुमति देते हैं, यह मॉड्यूल हटाने का प्रयास नहीं करेगा। +यह समझ में आता है क्योंकि मूल DOM गुणों को हटाया नहीं जा सकता। और यदि आप DOM पर मूल्यों को संग्रहीत करने या ऑब्जेक्ट को संदर्भित करने के लिए कस्टम गुणों का उपयोग कर रहे हैं, तो कृपया उपयोग करने पर विचार करें +[data-\* attributes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes) +बजाय। शायद [the dataset module](#the-dataset-module) के माध्यम से। + +### The attributes module (गुण मॉड्यूल) + +प्रॉप्स के समान, लेकिन DOM तत्वों पर गुणों के बजाय विशेषताएँ सेट करें। + +```mjs +h("a", { attrs: { href: "/foo" } }, "Go to Foo"); +``` + +In JSX, you can use `attrs` like this: + +```jsx +
+// Renders as:
+``` + +विशेषताएँ `setAttribute` का उपयोग करके जोड़ी और अद्यतन की जाती हैं। एक के मामले में +वह विशेषता जो पहले जोड़ी/सेट की गई थी और अब मौजूद नहीं है +`attrs` ऑब्जेक्ट में, इसे DOM तत्व की विशेषता से हटा दिया जाता है +`removeAttribute` का उपयोग करके सूची बनाएं। + +बूलियन विशेषताओं के मामले में (उदाहरण के लिए `disabled`, `hidden`, +`selected` ...), अर्थ विशेषता मान पर निर्भर नहीं करता है +('सही' या 'गलत') लेकिन इसके बजाय की उपस्थिति/अनुपस्थिति पर निर्भर करता है +DOM तत्व में स्वयं को विशेषता दें। उन विशेषताओं को संभाला जाता है +मॉड्यूल द्वारा अलग-अलग: यदि एक बूलियन विशेषता को सेट किया गया है +[falsy value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean) +('0', '-0', 'शून्य', 'गलत', 'NaN', 'अपरिभाषित', या खाली स्ट्रिंग +(`````)), तो विशेषता को विशेषता सूची से हटा दिया जाएगा +DOM तत्व. + +### The dataset module (डेटासेट मॉड्यूल) + +आपको DOM तत्वों पर कस्टम डेटा विशेषताएँ (`data-*`) सेट करने की अनुमति देता है। फिर इन्हें [HTMLElement.dataset](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset) प्रॉपर्टी से एक्सेस किया जा सकता है। + +```mjs +h("button", { dataset: { action: "reset" } }, "Reset"); +``` + +In JSX, you can use `dataset` like this: + +```jsx +
+// Renders as:
+``` + +### The style module (स्टाइल मॉड्यूल) + +स्टाइल मॉड्यूल आपके HTML को आकर्षक और सुचारू रूप से जीवंत बनाने के लिए है। पर +इसका मूल यह आपको तत्वों पर सीएसएस गुण सेट करने की अनुमति देता है। + +```mjs +h( + "span", + { + style: { + border: "1px solid #bada55", + color: "#c0ffee", + fontWeight: "bold", + }, + }, + "Say my name, and every colour illuminates" +); +``` + +In JSX, you can use `style` like this: + +```jsx +
+// Renders as:
+``` + +#### Custom properties (कस्टम गुण) (CSS variables) + +सीएसएस कस्टम गुण (उर्फ सीएसएस चर) समर्थित हैं, उन्हें उपसर्ग किया जाना चाहिए +`--` के साथ + +```mjs +h( + "div", + { + style: { "--warnColor": "yellow" }, + }, + "Warning" +); +``` + +#### Delayed properties (विलंबित गुण) + +आप संपत्तियों को विलंबित होने के रूप में निर्दिष्ट कर सकते हैं। जब भी ये गुण बदलते हैं, तो परिवर्तन अगले फ़्रेम के बाद तक लागू नहीं होता है। + +```mjs +h( + "span", + { + style: { + opacity: "0", + transition: "opacity 1s", + delayed: { opacity: "1" }, + }, + }, + "Imma fade right in!" +); +``` + +इससे तत्वों की प्रविष्टि को घोषणात्मक रूप से एनिमेट करना आसान हो जाता है। + +`transition-property` का `all` मान समर्थित नहीं है। + +#### गुणों को `remove` पर सेट करें + +`remove` गुण में सेट की गई शैलियाँ तत्व के समाप्त होते ही प्रभावी हो जाएंगी +DOM से हटाया जाने वाला है. लागू शैलियाँ होनी चाहिए +सीएसएस बदलावों के साथ एनिमेटेड। केवल एक बार सभी शैलियाँ पूरी हो जाती हैं +एनिमेट करने पर तत्व DOM से हटा दिया जाएगा। + +```mjs +h( + "span", + { + style: { + opacity: "1", + transition: "opacity 1s", + remove: { opacity: "0" }, + }, + }, + "It's better to fade out than to burn away" +); +``` + +This makes it easy to declaratively animate the removal of elements. +इससे तत्वों को हटाने को घोषणात्मक रूप से एनिमेट करना आसान हो जाता है। + +`transition-property` का `all` मान समर्थित नहीं है। + +#### गुणों को `destroy` पर सेट करें + +```mjs +h( + "span", + { + style: { + opacity: "1", + transition: "opacity 1s", + destroy: { opacity: "0" }, + }, + }, + "It's better to fade out than to burn away" +); +``` + +`transition-property` का `all` मान समर्थित नहीं है। + +### इवेंटलिस्टर्स मॉड्यूल + +इवेंट श्रोता मॉड्यूल संलग्न करने के लिए शक्तिशाली क्षमताएं देता है +घटना श्रोता. + +आप एक आपूर्ति करके vnode पर किसी ईवेंट में एक फ़ंक्शन संलग्न कर सकते हैं +इवेंट के नाम के अनुरूप गुण के साथ `on` पर ऑब्जेक्ट +आप सुनना चाहते हैं. इवेंट होने पर फ़ंक्शन बुलाया जाएगा +होता है और उस ईवेंट ऑब्जेक्ट को पास कर दिया जाएगा जो उससे संबंधित है। + +```mjs +function clickHandler(ev) { + console.log("got clicked"); +} +h("div", { on: { click: clickHandler } }); +``` + +In JSX, you can use `on` like this: + +```js +
+``` + +Snabbdom रेंडरर्स के बीच ईवेंट हैंडलर की अदला-बदली की अनुमति देता है। ऐसा बिना होता है +वास्तव में DOM से जुड़े इवेंट हैंडलर को छूना। + +हालाँकि, ध्यान दें कि **ईवेंट साझा करते समय आपको सावधान रहना चाहिए +इस मॉड्यूल द्वारा उपयोग की जाने वाली तकनीक के कारण, vnodes** के बीच हैंडलर +ईवेंट हैंडलर को DOM से पुनः बाइंडिंग से बचने के लिए। (और सामान्य तौर पर, +Vnodes के बीच डेटा साझा करना काम करने की गारंटी नहीं है, क्योंकि मॉड्यूल +दिए गए डेटा को बदलने की अनुमति है)। + +In particular, you should **not** do something like this: + +```mjs +// Does not work +const sharedHandler = { + change: function (e) { + console.log("you chose: " + e.target.value); + }, +}; +h("div", [ + h("input", { + props: { type: "radio", name: "test", value: "0" }, + on: sharedHandler, + }), + h("input", { + props: { type: "radio", name: "test", value: "1" }, + on: sharedHandler, + }), + h("input", { + props: { type: "radio", name: "test", value: "2" }, + on: sharedHandler, + }), +]); +``` + +ऐसे कई मामलों के लिए, आप इसके बजाय सरणी-आधारित हैंडलर का उपयोग कर सकते हैं (ऊपर वर्णित)। +वैकल्पिक रूप से, बस यह सुनिश्चित करें कि प्रत्येक नोड को अद्वितीय `on` मान पारित किया गया है: + +```mjs +// Works +const sharedHandler = function (e) { + console.log("you chose: " + e.target.value); +}; +h("div", [ + h("input", { + props: { type: "radio", name: "test", value: "0" }, + on: { change: sharedHandler }, + }), + h("input", { + props: { type: "radio", name: "test", value: "1" }, + on: { change: sharedHandler }, + }), + h("input", { + props: { type: "radio", name: "test", value: "2" }, + on: { change: sharedHandler }, + }), +]); +``` + +## SVG + +वर्चुअल बनाने के लिए `h` फ़ंक्शन का उपयोग करते समय एसवीजी बस काम करता है +नोड्स एसवीजी तत्व स्वचालित रूप से उपयुक्त के साथ बनाए जाते हैं +नामस्थान. + +```mjs +const vnode = h("div", [ + h("svg", { attrs: { width: 100, height: 100 } }, [ + h("circle", { + attrs: { + cx: 50, + cy: 50, + r: 40, + stroke: "green", + "stroke-width": 4, + fill: "yellow", + }, + }), + ]), +]); +``` + +[SVG example](./examples/svg) और [SVG Carousel example](./examples/carousel-svg/) भी देखें। + +### SVG तत्वों में Classes + +कुछ ब्राउज़र (जैसे IE <=11) [SVG तत्वों में `classList` प्रॉपर्टी का समर्थन नहीं करते](http://caniuse.com/#feat=classlist)। +क्योंकि _class_ मॉड्यूल आंतरिक रूप से `classList` का उपयोग करता है, यह इस मामले में तब तक काम नहीं करेगा जब तक कि आप [classList polyfill](https://www.npmjs.com/package/classlist-polyfill) का उपयोग नहीं करते। +(यदि आप पॉलीफ़िल का उपयोग नहीं करना चाहते हैं, तो आप _attributes_ मॉड्यूल के साथ `क्लास' विशेषता का उपयोग कर सकते हैं)। + +## Thunks + +`thunk` फ़ंक्शन एक चयनकर्ता लेता है, एक थंक की पहचान करने के लिए एक कुंजी, +एक फ़ंक्शन जो एक vnode और स्थिति की एक परिवर्तनीय मात्रा लौटाता है +पैरामीटर. यदि लागू किया जाता है, तो रेंडर फ़ंक्शन राज्य प्राप्त करेगा +तर्क. + +`thunk(selector, key, renderFn, [stateArguments])` + +`renderFn` को केवल तभी लागू किया जाता है जब `renderFn` को बदल दिया जाता है या `[stateArguments]` सरणी की लंबाई या उसके तत्वों को बदल दिया जाता है। + +`key` वैकल्पिक है. इसकी आपूर्ति तब की जानी चाहिए जब `selector` हो +थंक्स भाई-बहनों के बीच अद्वितीय नहीं। यह सुनिश्चित करता है कि थंक है +अंतर करते समय हमेशा सही ढंग से मेल खाता है। + +थंक्स एक अनुकूलन रणनीति है जिसका उपयोग तब किया जा सकता है जब कोई हो +अपरिवर्तनीय डेटा से निपटना। + +किसी संख्या के आधार पर वर्चुअल नोड बनाने के लिए एक सरल फ़ंक्शन पर विचार करें। + +```mjs +function numberView(n) { + return h("div", "Number is: " + n); +} +``` + +दृश्य केवल `n` पर निर्भर करता है। इसका मतलब यह है कि यदि `n` अपरिवर्तित है, +फिर वर्चुअल DOM नोड बनाना और उसे पुराने के विरुद्ध पैच करना +vnode बेकार है. ओवरहेड से बचने के लिए हम `thunk` सहायक का उपयोग कर सकते हैं +समारोह। + +```mjs +function render(state) { + return thunk("num", numberView, [state.number]); +} +``` + +वास्तव में `numberView` फ़ंक्शन को लागू करने के बजाय यह केवल होगा +वर्चुअल ट्री में एक डमी वीनोड रखें। जब स्नैबडॉम इसे पैच करता है +पिछले vnode के विरुद्ध डमी vnode, यह के मूल्य की तुलना करेगा +`n`. यदि `n` अपरिवर्तित है तो यह पुराने vnode का पुन: उपयोग करेगा। यह +संख्या दृश्य और भिन्न प्रक्रिया को पूरी तरह से दोबारा बनाने से बचा जाता है। + +यहां व्यू फ़ंक्शन केवल एक उदाहरण है। व्यवहार में थंक्स ही होते हैं +यदि आप एक जटिल दृश्य प्रस्तुत कर रहे हैं तो यह प्रासंगिक है +उत्पन्न करने के लिए महत्वपूर्ण कम्प्यूटेशनल समय। + + +## JSX + +ध्यान दें कि JSX टुकड़े अभी भी प्रयोगात्मक हैं और इन्हें चुना जाना चाहिए। +विवरण के लिए [`fragment`](#fragment-experimental) अनुभाग देखें। + +### TypeScript + +अपने `tsconfig.json` में निम्नलिखित विकल्प जोड़ें: + +```json +{ + "compilerOptions": { + "jsx": "react", + "jsxFactory": "jsx", + "jsxFragmentFactory": "Fragment" + } +} +``` + +फिर सुनिश्चित करें कि आप `.tsx` फ़ाइल एक्सटेंशन का उपयोग करें और फ़ाइल के शीर्ष पर `jsx` फ़ंक्शन और `Fragment` फ़ंक्शन आयात करें: + +```tsx +import { Fragment, jsx, VNode } from "snabbdom"; + +const node: VNode = ( +
+ I was created with JSX +
+); + +const fragment: VNode = ( + <> + JSX fragments + are experimentally supported + +); +``` + +### Babel + +अपने बेबल कॉन्फ़िगरेशन में निम्नलिखित विकल्प जोड़ें: + +```json +{ + "plugins": [ + [ + "@babel/plugin-transform-react-jsx", + { + "pragma": "jsx", + "pragmaFrag": "Fragment" + } + ] + ] +} +``` + +फिर फ़ाइल के शीर्ष पर `jsx` फ़ंक्शन और `Fragment` फ़ंक्शन आयात करें: + +```jsx +import { Fragment, jsx } from "snabbdom"; + +const node = ( +
+ I was created with JSX +
+); + +const fragment = ( + <> + JSX fragments + are experimentally supported + +); +``` + +## Virtual Node + +**गुण** + +- [sel](#sel--string) +- [data](#data--object) +- [children](#children--array) +- [text](#text--string) +- [elm](#elm--element) +- [key](#key--string--number) + +### sel : String + +वर्चुअल नोड की `.sel` संपत्ति सीएसएस चयनकर्ता को दी जाती है +[`h()`](#snabbdomh) निर्माण के दौरान। उदाहरण के लिए: `h('div#container', {}, [...])` एक वर्चुअल नोड बनाएगा जिसमें `div#container` होगा +इसकी `.sel` संपत्ति। + +### data : Object + +वर्चुअल नोड की `.data` प्रॉपर्टी जानकारी जोड़ने का स्थान है +[modules](#modules-documentation) तक पहुंचने और हेरफेर करने के लिए +वास्तविक DOM तत्व जब इसे बनाया जाता है; शैलियाँ, सीएसएस कक्षाएं जोड़ें, +गुण, आदि + +डेटा ऑब्जेक्ट [`h()`](#snabbdomh) का (वैकल्पिक) दूसरा पैरामीटर है + +उदाहरण के लिए `h('div', {props: {className: 'container'}}, [...])` एक वर्चुअल नोड तैयार करेगा + + +```mjs +({ + props: { + className: "container", + }, +}); +``` + +as its `.data` object. + +### children : Array + +वर्चुअल नोड की `.children` संपत्ति तीसरी (वैकल्पिक) है +निर्माण के दौरान [`h()`](#snabbdomh) का पैरामीटर। `.children` है +बस आभासी नोड्स की एक सरणी जिसे बच्चों के रूप में जोड़ा जाना चाहिए +निर्माण पर मूल DOM नोड। + +उदाहरण के लिए `h('div', {}, [ h('h1', {}, 'Hello, World') ])` होगा +के साथ एक वर्चुअल नोड बनाएं + + +```mjs +[ + { + sel: "h1", + data: {}, + children: undefined, + text: "Hello, World", + elm: Element, + key: undefined, + }, +]; +``` + +as its `.children` property. + +### text : string + +`.text` प्रॉपर्टी तब बनाई जाती है जब एक वर्चुअल नोड बनाया जाता है +केवल एक ही बच्चा जिसके पास पाठ है और केवल उसकी आवश्यकता है +`document.createTextNode()` का उपयोग किया जाना है। + +उदाहरण के लिए: `h('h1', {}, 'Hello')` एक वर्चुअल नोड बनाएगा +`हैलो` इसकी `.text` संपत्ति के रूप में। + + +### elm : Element + +वर्चुअल नोड की `.elm` संपत्ति वास्तविक DOM का सूचक है +स्नैबडोम द्वारा बनाया गया नोड। यह संपत्ति करने में बहुत उपयोगी है +[hooks](#hooks) में गणना के साथ-साथ +[modules](#modules-documentation).। + +### key : string | number + +`.key` प्रॉपर्टी तब बनती है जब आपके अंदर एक कुंजी प्रदान की जाती है +[`.data`](#data--object) ऑब्जेक्ट। `.key` प्रॉपर्टी का उपयोग रखने के लिए किया जाता है +DOM नोड्स की ओर संकेत जो पहले से मौजूद थे ताकि उन्हें दोबारा बनाने से बचा जा सके +यदि यह अनावश्यक है. यह सूची जैसी चीजों के लिए बहुत उपयोगी है +पुन: व्यवस्थित करना। अनुमति देने के लिए कुंजी या तो एक स्ट्रिंग या एक संख्या होनी चाहिए +उचित लुकअप क्योंकि इसे आंतरिक रूप से कुंजी/मूल्य जोड़ी के रूप में संग्रहीत किया जाता है +एक ऑब्जेक्ट, जहां `.key` कुंजी है और मान है +[`.elm`](#elm--element) संपत्ति बनाई गई। + +यदि प्रदान किया गया है, तो `.key` संपत्ति सहोदर तत्वों के बीच अद्वितीय होनी चाहिए। + +उदाहरण के लिए: `h('div', {key: 1}, [])` एक वर्चुअल नोड बनाएगा +`.key` गुण वाली वस्तु जिसका मान `1` है। + + +## अनुप्रयोगों की संरचना करना + +स्नैबडॉम एक निम्न-स्तरीय वर्चुअल DOM लाइब्रेरी है। इसके साथ कोई राय नहीं है आपको अपने आवेदन की संरचना किस प्रकार करनी चाहिए इसके संबंध में। + +यहां स्नैबडॉम के साथ एप्लिकेशन बनाने के कुछ दृष्टिकोण दिए गए हैं। + +- [functional-frontend-architecture](https://github.com/paldepind/functional-frontend-architecture) – + एक भंडार जिसमें कई उदाहरण अनुप्रयोग शामिल हैं + एक ऐसी वास्तुकला को प्रदर्शित करता है जो स्नैबडॉम का उपयोग करती है। +- [Cycle.js](https://cycle.js.org/) – + "क्लीनर कोड के लिए एक कार्यात्मक और प्रतिक्रियाशील जावास्क्रिप्ट ढांचा" + स्नैबडोम का उपयोग करता है +- [Vue.js](http://vuejs.org/) use a fork of snabbdom. +- [scheme-todomvc](https://github.com/amirouche/scheme-todomvc/) स्नैबडॉम बाइंडिंग के शीर्ष पर रिडक्स-जैसी वास्तुकला का निर्माण करें। +- [kaiju](https://github.com/AlexGalays/kaiju) - + स्नैबडॉम के शीर्ष पर स्टेटफुल घटक और अवलोकन +- [Tweed](https://tweedjs.github.io) – + प्रतिक्रियाशील इंटरफेस के लिए एक ऑब्जेक्ट ओरिएंटेड दृष्टिकोण। +- [Cyclow](http://cyclow.js.org) - + "जावास्क्रिप्ट के लिए एक प्रतिक्रियाशील फ्रंटएंड ढांचा" + स्नैबडोम का उपयोग करता है +- [Tung](https://github.com/Reon90/tung) – + HTML प्रस्तुत करने के लिए एक जावास्क्रिप्ट लाइब्रेरी। तुंग एचटीएमएल और जावास्क्रिप्ट विकास को विभाजित करने में मदद करता है। +- [sprotty](https://github.com/theia-ide/sprotty) - "एक वेब-आधारित आरेखण ढाँचा" स्नैबडॉम का उपयोग करता है। +- [Mark Text](https://github.com/marktext/marktext) - "रियलटाइम प्रीव्यू मार्कडाउन एडिटर" स्नैबडॉम पर निर्मित है। +- [puddles](https://github.com/flintinatux/puddles) - "छोटा वीडोम ऐप फ्रेमवर्क। शुद्ध रिडक्स। कोई बॉयलरप्लेट नहीं।" - दिल से निर्मित: स्नैबडॉम पर। +- [Backbone.VDOMView](https://github.com/jcbrand/backbone.vdomview) - A [Backbone](http://backbonejs.org/) स्नैबडॉम के माध्यम से वर्चुअलडोम क्षमता के साथ देखें। +- [Rosmaro Snabbdom starter](https://github.com/lukaszmakuch/rosmaro-snabbdom-starter) - राज्य मशीनों और स्नैबडोम के साथ यूजर इंटरफेस का निर्माण। +- [Pureact](https://github.com/irony/pureact) - "रिएक्ट का 65 लाइनों का कार्यान्वयन जिसमें केवल एक निर्भरता के साथ Redux और हुक शामिल हैं - Snabbdom" +- [Snabberb](https://github.com/tobymao/snabberb) - प्रतिक्रियाशील विचारों के निर्माण के लिए [Opal](https://github.com/opal/opal) और स्नैबडोम का उपयोग करते हुए एक न्यूनतम रूबी ढांचा। +- [WebCell](https://github.com/EasyWebApp/WebCell) - JSX और TypeScript पर आधारित वेब कंपोनेंट इंजन + +यदि आप किसी अन्य तरीके से एप्लिकेशन बना रहे हैं तो इसे साझा करना सुनिश्चित करें +स्नैबडोम का उपयोग करना। + +## आम त्रुटियों + +```text +Uncaught NotFoundError: Failed to execute 'insertBefore' on 'Node': + The node before which the new node is to be inserted is not a child of this node. +``` + +इस त्रुटि का कारण पैच के बीच वीनोड्स का पुन: उपयोग करना है (कोड उदाहरण देखें), स्नैबडॉम प्रदर्शन में सुधार के रूप में पास किए गए वर्चुअल डोम नोड्स के अंदर वास्तविक डोम नोड्स को संग्रहीत करता है, इसलिए पैच के बीच नोड्स का पुन: उपयोग समर्थित नहीं है। + +```mjs +const sharedNode = h("div", {}, "Selected"); +const vnode1 = h("div", [ + h("div", {}, ["One"]), + h("div", {}, ["Two"]), + h("div", {}, [sharedNode]), +]); +const vnode2 = h("div", [ + h("div", {}, ["One"]), + h("div", {}, [sharedNode]), + h("div", {}, ["Three"]), +]); +patch(container, vnode1); +patch(vnode1, vnode2); +``` + +आप ऑब्जेक्ट की एक उथली प्रतिलिपि बनाकर इस समस्या को ठीक कर सकते हैं (यहां ऑब्जेक्ट स्प्रेड सिंटैक्स के साथ): + +```mjs +const vnode2 = h("div", [ + h("div", {}, ["One"]), + h("div", {}, [{ ...sharedNode }]), + h("div", {}, ["Three"]), +]); +``` + +एक अन्य समाधान फ़ैक्टरी फ़ंक्शन में साझा vnodes को लपेटना होगा: + +```mjs +const sharedNode = () => h("div", {}, "Selected"); +const vnode1 = h("div", [ + h("div", {}, ["One"]), + h("div", {}, ["Two"]), + h("div", {}, [sharedNode()]), +]); +``` + +## सामुदायिक प्रतिक्रिया का अवसर + +पुल अनुरोध, जिन पर समुदाय प्रतिक्रिया देने में रुचि रखता है, उन्हें कुछ दिनों का अवसर प्रदान किए जाने के बाद विलय कर दिया जाना चाहिए। \ No newline at end of file diff --git a/README.md b/README.md index daaec19..c911b30 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ Snabbdom -A virtual DOM library with focus on simplicity, modularity, powerful features +A virtual DOM library with a focus on simplicity, modularity, powerful features and performance. --- @@ -18,24 +18,23 @@ their great cross-browser testing tools. --- -English | [简体中文](./README-zh_CN.md) - +English | [简体中文](./README-zh_CN.md) ## Introduction Virtual DOM is awesome. It allows us to express our application's view -as a function of its state. But existing solutions were way way too +as a function of its state. But existing solutions were way too bloated, too slow, lacked features, had an API biased towards OOP -and/or lacked features I needed. +, and/or lacked features I needed. -Snabbdom consists of an extremely simple, performant and extensible +Snabbdom consists of an extremely simple, performant, and extensible core that is only ≈ 200 SLOC. It offers a modular architecture with rich functionality for extensions through custom modules. To keep the core simple, all non-essential functionality is delegated to modules. -You can mold Snabbdom into whatever you desire! Pick, choose and +You can mold Snabbdom into whatever you desire! Pick, choose, and customize the functionality you want. Alternatively you can just use the default extensions and get a virtual DOM library with high -performance, small size and all the features listed below. +performance, small size, and all the features listed below. ## Features @@ -222,8 +221,8 @@ Of course, then there is still a single comment node at the mount point. ### `h` It is recommended that you use `h` to create vnodes. It accepts a -tag/selector as a string, an optional data object and an optional string or -array of children. +tag/selector as a string, an optional data object, and an optional string or +an array of children. ```mjs import { h } from "snabbdom"; @@ -387,7 +386,7 @@ animate the disappearance of the removed element's children. ### Creating modules -Modules works by registering global listeners for [hooks](#hooks). A module is simply a dictionary mapping hook names to functions. +Modules work by registering global listeners for [hooks](#hooks). A module is simply a dictionary mapping hook names to functions. ```mjs const myModule = { @@ -412,7 +411,7 @@ This describes the core modules. All modules are optional. JSX examples assume y The class module provides an easy way to dynamically toggle classes on elements. It expects an object in the `class` data property. The -object should map class names to booleans that indicates whether or +object should map class names to booleans that indicate whether or not the class should stay or go on the vnode. ```mjs @@ -615,7 +614,7 @@ event listeners. You can attach a function to an event on a vnode by supplying an object at `on` with a property corresponding to the name of the event you want to listen to. The function will be called when the event -happens and will be passed the event object that belongs to it. +happens and will be passed to the event object that belongs to it. ```mjs function clickHandler(ev) { @@ -728,7 +727,7 @@ arguments. `thunk(selector, key, renderFn, [stateArguments])` -The `renderFn` is invoked only if the `renderFn` is changed or `[stateArguments]` array length or it's elements are changed. +The `renderFn` is invoked only if the `renderFn` is changed or `[stateArguments]` array length or its elements are changed. The `key` is optional. It should be supplied when the `selector` is not unique among the thunks siblings. This ensures that the thunk is @@ -855,7 +854,7 @@ const fragment = ( ### sel : String The `.sel` property of a virtual node is the CSS selector passed to -[`h()`](#snabbdomh) during creation. For example: `h('div#container', {}, [...])` will create a a virtual node which has `div#container` as +[`h()`](#snabbdomh) during creation. For example: `h('div#container', {}, [...])` will create a virtual node that has `div#container` as its `.sel` property. ### data : Object @@ -945,7 +944,7 @@ Here are some approaches to building applications with Snabbdom. - [functional-frontend-architecture](https://github.com/paldepind/functional-frontend-architecture) – a repository containing several example applications that - demonstrates an architecture that uses Snabbdom. + demonstrate an architecture that uses Snabbdom. - [Cycle.js](https://cycle.js.org/) – "A functional and reactive JavaScript framework for cleaner code" uses Snabbdom @@ -960,7 +959,7 @@ Here are some approaches to building applications with Snabbdom. "A reactive frontend framework for JavaScript" uses Snabbdom - [Tung](https://github.com/Reon90/tung) – - A JavaScript library for rendering html. Tung helps to divide html and JavaScript development. + A JavaScript library for rendering HTML. Tung helps to divide HTML and JavaScript development. - [sprotty](https://github.com/theia-ide/sprotty) - "A web-based diagramming framework" uses Snabbdom. - [Mark Text](https://github.com/marktext/marktext) - "Realtime preview Markdown Editor" build on Snabbdom. - [puddles](https://github.com/flintinatux/puddles) - @@ -981,7 +980,7 @@ Uncaught NotFoundError: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node. ``` -The reason for this error is reusing of vnodes between patches (see code example), snabbdom stores actual dom nodes inside the virtual dom nodes passed to it as performance improvement, so reusing nodes between patches is not supported. +The reason for this error is the reusing of vnodes between patches (see code example), snabbdom stores actual dom nodes inside the virtual dom nodes passed to it as performance improvement, so reusing nodes between patches is not supported. ```mjs const sharedNode = h("div", {}, "Selected"); @@ -1023,4 +1022,4 @@ const vnode1 = h("div", [ ## Opportunity for community feedback Pull requests that the community may care to provide feedback on should be -merged after such opportunity of a few days was provided. +merged after such an opportunity of a few days was provided.