NUCLO / 12

Язык

Практические примеры. Живые демонстрации.

Выберите пример, чтобы открыть его на весь экран с предпросмотром и исходным кодом рядом.

Компоненты

4

Обычные функции со статическими и динамическими параметрами, дочерними узлами, списками с сопоставлением по идентичности объектов и вложенными данными. Каждый предпросмотр считает монтирования.

05

Статические и динамические параметры

Параметр-значение читается один раз при создании компонента. Параметр-функция читается при каждом update(). Сам компонент в обоих случаях выполняется один раз, что подтверждает счётчик монтирований.

Компоненты
06

Дочерние узлы и модификаторы

Компонент передаёт дочерние элементы через spread: построители, текст, объекты атрибутов и модификаторы. Условные части помещены в when(), поэтому окружающий их компонент не пересоздаётся.

Компоненты
07

Идентичность в списке

list() сохраняет строку, пока её объект находится в массиве: меняйте порядок, вставляйте и переименовывайте без потери ввода и фокуса. Переключатель клонирует объекты при каждом обновлении, показывая цену потери идентичности.

Компоненты
08

Вложенные данные

Команда с участниками и задачами: один компонент на уровень, вложенные вызовы list(), производные счётчики как функции тех же объектов. Глубокое изменение затрагивает только соответствующие узлы.

Компоненты

API

13

Небольшая демонстрация каждого строительного блока — та же, что встроена в документацию.

09

Функции построения элементов

Построитель принимает атрибуты, статические дочерние узлы и динамический текст. Rename меняет состояние, затем вызывает update().

API
10

Компоненты

Компонент — обычная функция. Каждый вызов Counter() хранит собственный счётчик.

API
11

Атрибуты

Значения атрибутов могут быть функциями. Вторая кнопка переключает busy и вызывает update(); атрибуты disabled и aria-busy кнопки Save следуют за этим значением.

API
12

События

onInput и onKeyDown — обычные атрибуты. Введите текст, затем нажмите Escape, чтобы очистить поле.

API
13

Жизненный цикл

onMount запускает интервал и возвращает функцию очистки. При размонтировании она выполняется, поэтому счётчик останавливается до следующего монтирования таймера.

API
14

Явные обновления

count++ меняет только переменную. Текст обновится при следующем update(), вызванном этой кнопкой или другим действием на странице.

API
15

Динамические значения

Измените имя. Статический текст зафиксирован при создании элемента; динамический вычисляется при каждом update(). forceUpdate() заново строит дерево, поэтому обновляется и статический текст.

API
16

update()

Каждый update() вычисляет все динамические значения, даже если их данные не изменились. Другие демонстрации на странице тоже увеличивают счётчик.

API
17

scope()

Обе кнопки добавляют элемент и переименовывают пользователя. update('cart') обновляет только панель в указанной области.

API
18

when()

Выбирается первое истинное условие; иначе выводится .else(). Новая ветвь создаётся с нуля.

API
19

list()

Строки сопоставляются по идентичности объектов. Отметьте строку и нажмите Reverse: тот же <li> переместится вместе с флажком.

API
20

region() и into()

Макет с основным регионом со стеком представлений и боковым регионом заполняется снаружи. Введите текст в Home, откройте и закройте диалог: текст сохранится. Article заполняет оба региона одним into().

API
21

forceUpdate()

update() обновляет только динамическую строку lang. forceUpdate() повторно вызывает App и изменяет тот же <h1>. Явная форма перестраивает только это дерево, а не всю страницу.

API

SVG

27

Графики, анимации, инструменты и игры из построителей SVG, управляемые обычными данными, событиями указателя и update().

28

Столбчатая диаграмма

Прямоугольники строятся из массива. Их y и height вычисляются из данных, поэтому update() перемещает столбцы.

SVG
29

Линейный график

Путь, d которого построен из точек, с областью градиента и одним кругом на точку.

SVG
30

Кольцевая диаграмма

Каждому сектору соответствует окружность. stroke-dasharray задает его долю кольца, а stroke-dashoffset — начальную позицию.

SVG
31

SVG-анимация

SMIL через функции построения элементов: animateSvg заставляет солнце пульсировать, а animateTransformSvg вращает планету по орбите. Динамический dur задает скорость.

SVG
32

Стрелочный индикатор

Дуга заполняется с помощью stroke-dashoffset, а стрелка поворачивается через CSS transform. Оба значения зависят от одного числа.

SVG
33

Радарная диаграмма

Пять значений по пяти осям. Форма представляет собой один путь, d которого вычисляется на основе данных, поэтому update() преобразует его.

SVG
34

Тепловая карта

Сетка прямоугольников, у которых fill-opacity зависит от уровня. Нажмите на ячейку, чтобы повысить его. Дочерний titleSvg задает всплывающую подсказку.

SVG
35

Подсказка при наведении

События указателя на элементах SVG. onPointerEnter выбирает активную точку, и к ней перемещается группа подсказок.

SVG
36

Редактор кривых

Перетаскивайте контрольные точки кубической кривой Безье. onPointerDown выбирает точку, onPointerMove на svg перемещает ее, и кривая меняется вместе с ней.

SVG
37

Часы

Стрелки — линии, у которых transform вычисляется из времени. onMount запускает таймер и возвращает функцию очистки.

SVG
38

Переключение значков

Значок меню, который превращается в крест с переходами CSS, и сердце, которое пульсирует с помощью SMIL-анимации по щелчку.

SVG
39

Данные в реальном времени

Два ряда данных сдвигаются влево по таймеру. CSS-переход длительностью в один такт делает движение плавным, а наведение показывает значение любой точки.

SVG
40

Свечной график

Сорок ячеек читают данные своих свечей. Меняйте таймфрейм, включайте среднюю линию, смотрите значения при наведении или наблюдайте за обновлением текущей свечи.

SVG
41

Гонка гистограмм

Десять полос никогда не покидают DOM. Их ранг устанавливает translateY, поэтому переход перемещает каждый из них в свою строку при изменении значений.

SVG
42

Диаграмма с областями с накоплением

Четыре полосы переключаются между составной, потоковой и процентной раскладкой. Скрытие серии дает только нулевую толщину ее полосы, поэтому структура команд каждого пути остается прежней.

SVG
43

Древовидная карта

Древовидная карта с прямоугольниками близких пропорций и переходом к деталям. При смене показателя ячейки перемещаются в новые прямоугольники, а нажатие на группу показывает ее дочерние элементы.

SVG
44

Гистограмма в реальном времени

Данные поступают из четырех распределений. Число значений в интервалах пересчитывается при каждом изменении, аппроксимирующая колоколообразная кривая следует за средним, а ползунок задает количество интервалов.

SVG
45

Поле для рисования

События указателя рисуют ломаные линии. list() выводит по одной линии на штрих, а текущий штрих удлиняется при каждом update().

SVG
46

Поворотный регулятор

Собственный ползунок: угол указателя задает значение, клавиши со стрелками меняют его пошагово, а pathLength="100" позволяет представить значение длиной штриха.

SVG
47

Цветовое колесо

Выберите оттенок по углу и насыщенность по расстоянию. Колесо состоит из девяноста клиньев, радиального градиента и темного диска.

SVG
48

Спирограф

Колесо катится внутри кольца, а перо рисует его траекторию. Каждый кадр удлиняет один штрих и обновляет только свой scope().

SVG
49

Прыгающие мячи

Гравитация, стены и столкновения в цикле requestAnimationFrame. Оттяните и отпустите, чтобы запустить мяч.

SVG
50

Сливающиеся капли

Размытие и фильтр цветовой матрицы заставляют капли сливаться. След из окружностей движется за указателем.

SVG
51

Граф с силовой раскладкой

Узлы отталкиваются, связи притягивают, а движение постепенно затухает. Перетащите узел или нажмите на него, чтобы добавить дочерний.

SVG
52

Выделение и масштабирование

Выделите диапазон на обзорном графике, чтобы увеличить соответствующий участок графика выше. clipPath следует за выделением и задает его цвет.

SVG
53

Крестики-нолики

Играйте против компьютера. when() добавляет каждый знак, а CSS-анимация штриха постепенно прорисовывает его.

SVG
54

Текст по кругу

Введите текст эмблемы. textPath располагает его по окружности, а textLength растягивает ровно на один оборот.

SVG

Маршрутизация

6

Таблицы маршрутов, сопоставление, активный маршрут, слои и загрузчики. nuclo-router — отдельный пакет: npm install nuclo nuclo-router.

55

Приложение с маршрутизацией

Настоящее приложение с собственным маршрутизатором, работающее в фрейме: таблица маршрутов, один outlet(), простые ссылки, состояние ожидания и ошибка 404. Перейдите по ссылкам, затем нажмите «Назад».

Маршрутизация+ nuclo-router
56

Вложенные маршруты

Docs — макет с дочерними маршрутами. Тема отображается в его outlet(), а ссылки ./topic разрешаются относительно маршрута макета. Введите заметки и переключите тему: макет не перестраивается.

Маршрутизация+ nuclo-router
57

Загрузчики данных маршрутов

Страница публикации экспортирует load(), который выполняется до ее построения. Наблюдайте за router.pending во время ожидания и за состоянием ошибки с Retry, когда загрузчик выбрасывает исключение для проблемной публикации.

Маршрутизация+ nuclo-router
58

Слои

Форма заказа открывает страницу клиента отдельным слоем и ждет результата. Форма не перестраивается, поэтому заметки сохраняются. Save завершает push с результатом, а Cancel и «Назад» закрывают слой без результата.

Маршрутизация+ nuclo-router
59

Несколько маршрутизаторов и загрузка

Два маршрутизатора, два индикатора загрузки. У макета магазина и его раздела есть load(): они выполняются параллельно с общим router.pending. У боковой панели — собственный маршрутизатор, созданный, но не запущенный, и собственный флаг загрузки, обновляемый из onNavigate.

Маршрутизация+ nuclo-router
60

Сопоставление с образцом

Статические шаблоны, :param и *rest, а также таблица разделов, смонтированная под двумя родительскими элементами. Введите путь и посмотрите match(), который разрешается без загрузки чего-либо.

Маршрутизация+ nuclo-router

Приложения

15

Большие программы на весь экран с настоящим исходным кодом во вкладках: рабочий стол с окнами, таблица данных, чат, игры, редакторы и библиотеки с собственным состоянием.

61

Конструктор страниц

Пишите прямо на странице, перетаскивайте блоки за маркеры, чтобы менять порядок или перемещать их в макеты. Нажмите / для вставки или правую кнопку мыши для меню действий. Настраивайте grid- и flex-макеты, отменяйте правки, проверяйте вид на телефоне и экспортируйте HTML.

Приложения
62

Пошаговая сортировка

Движок — обычный JavaScript: генераторы изменяют массив и приостанавливаются после каждого шага. Проигрыватель вызывает next() и update(). Столбцы — list() одних и тех же объектов, поэтому перестановка перемещает два элемента.

Приложения
63

Канбан-доска

Доска команды: добавляйте задачи, назначайте их людям, редактируйте их в диалоговом окне, фильтруйте по человеку или осуществляйте поиск, перетаскивайте их между столбцами и отменяйте удаление. Столбцы и карточки представляют собой простые массивы одних и тех же объектов; каждое перемещение — это splice(). Строки сопоставляются по идентичности объектов, поэтому при перетаскивании, сортировке, назначении или редактировании карточки повторно используется ее элемент. Количество монтирований на экране доказывает это.

Приложения
64

Инспектор three.js

Библиотека, владеющая собственным состоянием. Панель считывает позиции, цвета и флаги прямо из объектов three.js и записывает в них изменения. Цикл рендеринга вызывает update() один раз для каждого кадра; состояние нигде не дублируется.

Приложения
65

Бесконечная прокрутка

Бесконечная лента: быстрая имитация fetch() генерирует страницы на лету в один обычный массив. В DOM находятся только строки рядом с видимой областью: list() выводит posts.slice(start, end) между двумя распорками, поэтому страница остается легкой даже при ста тысячах публикаций. Элемент-маркер в конце ленты запрашивает следующую страницу еще до появления в поле зрения.

Приложения
66

Рабочий стол

Рабочий стол с файлами, заметками, терминалом, калькулятором, таймером, канбан-доской, финансами и календарем. Создавайте папки, редактируйте заметки и выполняйте команды оболочки на общем виртуальном диске, сохраненном в браузере. Вводите числа в калькулятор с клавиатуры, нажимайте в любом месте терминала для фокуса на строке ввода, перетаскивайте карточки между столбцами или ведите учет в таблице «Финансы» с обновляемыми графиками — данные хранятся в IndexedDB. Окна сохраняют состояние при перемещении, изменении размера и переключении приложений. Работающий таймер выводит содержимое в область уведомлений панели задач через into().

Приложения
67

Граф вычислений

Соединяйте числа, текст и переключатели через узлы вычислений, сравнений и If: значения обновляются при вводе. Функции тоже заданы графами: их узлы Input и Output служат портами каждого Call. Вызов может ссылаться на свою функцию, поэтому факториал и сумма используют рекурсию с выходом через If. Движок написан на обычном JavaScript: каждый узел — генератор, который приостанавливается для запроса входных данных, а один цикл управляет ими через собственный стек. Поэтому sum(50000) создает пятьдесят тысяч вложенных вызовов примерно за десятую долю секунды, не затрагивая стек вызовов JavaScript. Рекурсию без выхода останавливает только лимит шагов. Перетаскивание меняет x и y и обновляет лишь область холста. Счетчик запусков показывает, что перемещение не запускает вычисления графа.

Приложения
68

Сетка данных

Рабочая таблица, содержащая более 10 000 простых объектов-строк. Поиск, фильтрация, сортировка и разбиение по страницам — это простые функции для массива, а тело таблицы — это list() для текущей страницы. Строки сопоставляются по идентичности объектов, поэтому при сортировке перемещаются строки, которые остаются на странице, и отредактированная строка везде является одним и тем же объектом. Подсчет построенных строк доказывает это.

Приложения
69

Чат

Чат с тремя каналами. Каждый канал — обычный объект с историей, курсором, состоянием набора текста, черновиком и позицией прокрутки. При переключении все это сохраняется, а update("chat-sidebar") обновляет только счетчики непрочитанных сообщений. История подгружается вверх через unshift(), и scrollTop увеличивается на высоту добавленного содержимого. Сообщение видно до получения сервером, send() обновляет тот же объект, а повторная отправка, редактирование, удаление и реакции не перестраивают строку. В сообщениях поддерживаются код, полужирный текст, ссылки и @упоминания.

Приложения
70

Панель данных в реальном времени

Карточки обновляются с разной частотой: от двадцати до одного раза в секунду. Каждая карточка — scope(), а ее таймер вызывает update() с ее идентификатором, поэтому один такт пересчитывает только эту карточку. Счетчики показывают число вычислений динамических значений: переключитесь на обычный update(), и часы будут пересчитываться около ста раз в секунду ради одного изменения.

Приложения
71

Пиксельный редактор

Изображение — обычный массив из 1024 строк с цветами. Каждая ячейка читает из него свой цвет. Штрих меняет массив и вызывает update(), а при завершении редактор сохраняет копию через slice(). Отмена, повтор и любой шаг истории в list() возвращают прежний массив: без хранилища и неизменяемых данных.

Приложения
72

Змейка

Игровой цикл — таймер: он вызывает step() для обычных объектов и затем update() один раз за такт. Змейка — list() объектов клеток. На каждом такте объект хвоста становится новой головой, поэтому один элемент перемещается, а новые не создаются. Счетчик созданных сегментов растет только после еды. Еда появляется с анимацией keyframes().

Приложения
73

Шаговый секвенсор

Библиотека с собственным отсчетом времени. Web Audio заранее планирует каждую ноту на своей временной шкале. Паттерн — обычный двумерный массив логических значений: сетка переключает их, а планировщик читает, поэтому изменение слышно на следующем проходе. Указатель воспроизведения обновляет только свой scope() при смене звучащего шага. Звук запускается при первом Play, а функция очистки onMount закрывает аудиоконтекст: при выходе из примера звук останавливается.

Приложения
74

Переключатель языка

Каждая надпись — статическое значение, как в одноязычном приложении, поэтому update() не читает ее повторно: действия в корзине обновляют только количество и итоговую сумму. Переключение языка вызывает forceUpdate() для этого дерева: компонент выполняется снова и обновляет те же элементы, включая lang и dir. Валюты, формы множественного числа, даты и списки форматируются через Intl. Корзина и введенный промокод сохраняются.

Приложения
75

Редактор темы

Небольшая библиотека компонентов: createCss() задает имена токенам, а variants() создает на их основе кнопки, значки, карточки, поля ввода, уведомления и переключатели. Токены — переменные CSS, поэтому каждый класс компилируется один раз. Элементы управления меняют обычный объект темы и вызывают update(), который перезаписывает текст одного элемента style.

Приложения