Giter VIP home page Giter VIP logo

mam_mol's Introduction

$mol

Reactive micro-modular UI framework. Very simple, but very powerful!

Contents

Features

Reviews

Quick start

Video of this process

Create MAM project

The easiest way is to checkout this preconfigured MAM repository and start a dev server:

git clone https://github.com/hyoo-ru/mam.git ./mam && cd mam
npm install && npm start

Or simply use Gitpod Online Dev Workspace.

Setup your editor

Create your application component

The following example uses the namespace "my" and the application name "hello", but you can use your own namespace and application name.

Let's create a component that allows you to enter your name and display greeting text: "Hello, " + your name.

You need to create next files:

  • ./my/hello/index.html - Web entry point
  • ./my/hello/hello.view.tree - Declarative component description
  • ./my/hello/hello.view.ts - Behaviour/User interface logic
  • ./my/hello/hello.test.ts - Tests
  • ./my/hello/hello.view.css - Styles

Add web entry point at ./my/hello/index.html:

<!doctype html> <!-- Disable quirks mode -->
<html mol_view_root> <!-- Reset root styles -->
	<head>
		<meta charset="utf-8" /> <!-- Force utf-8 encoding -->
		<meta
			name="viewport"
			content="width=device-width, height=device-height, initial-scale=1"
		/> <!-- Disable mobile browser auto zoom, $mol is adaptive -->
		<meta name="mobile-web-app-capable" content="yes"> <!-- Fullscreen support -->
		<meta name="apple-mobile-web-app-capable" content="yes">
	</head>
	<body mol_view_root> <!-- Reset root styles -->
		<div mol_view_root="$my_hello"></div> <!-- Autobind component to element on load -->
		<script src="web.js"></script> <!-- Load autogenerated js bundle -->
	</body>
</html>

Your application will be served at http://localhost:9080/my/hello/. Open it. You should refresh page to view your changes.

Add declarative component description at ./my/hello/hello.view.tree with string input field and greeting message:

$my_hello $mol_view
	sub /
		<= Name $mol_string
			hint \Name
			value? <=> name? \
		<= message \

Add your behaviour at ./my/hello/hello.view.ts by extending generated class:

namespace $.$$ {
	export class $my_hello extends $.$my_hello {
		
		message() {
			let name = this.name()
			return name && `Hello, ${name}!`
		}
		
	}
}

Add tests for your behaviour at ./my/hello/hello.test.ts

namespace $.$$ {

	$mol_test({

		'Generating greeting message'() {

			const app = new $my_hello
			$mol_assert_equal( app.message() , '' )
			
			app.name( 'Jin' )
			$mol_assert_equal( app.message() , 'Hello, Jin!' )

		}

	})

}

Add styles at ./my/hello/hello.view.css:

/* Styling BEM-block by autogenerated attribute */
[my_hello] {
	display: flex;
	flex-direction: column;
	align-items: center;
	font: 1.5rem/1 sans-serif;
	box-shadow: 0 0 0 1px var(--mol_theme_line);
	flex: 1 1 auto;
	align-self: stretch;
	margin: 0;
}

/* Styling BEM-element by autogenerated attribute */
[my_hello_name] {
	flex-grow: 0;
	margin: 1rem;
	width: 14rem;
}

That is all!

Tutorials

Rationale

Zero configuration

Instead of ensuring configurability by any means, $mol concentrates on everything working good directly out of the box and does not bother $mol's developer by a typical configuration process. (Nevertheless, this doesn't exclude setup for your needs if required)

For example if you download base MAM-project you'll get this:

Building of JS and CSS bundles for different platforms. A bundle can be built for any module. This bundle would contain sources of that module and sources of all other modules on which that module depends on. There also would not be any redundant modules in the bundle.

Here is a full set of supported bundles:

  • -/web.js - JS for browser
  • -/web.d.ts - TypeScript definitions
  • -/web.test.js - JS with tests for a browser
  • -/web.deps.json - map of dependencies modules for browser
  • -/web.locale=en.json - strings pulled from *.view.tree and *.locale=en.json sources
  • -/node.js - JS for NodeJS
  • -/node.test.js - JS with tests for NodeJS
  • -/node.deps.json - a map of dependencies modules for NodeJS

Support of Source Maps. Sources are compiled and integrated into maps, they are fully self-sufficient.

Development server, which compiles bundles as needed. For example, when http://localhost:9080/hyoo/todomvc/-/web.js is requested, the js bundle is built from hyoo/todomvc for web environment. Rebuilding occurs only if any source files are changed.

Transpilling TypeScript into JS. In TS configuration enabled support decorators and disabled implicit any type, to prevent missing typing by change.

Watching dependencies by fact of using and automatic inclusion of the needed modules on further bundling. You don't need to write include and require. All you need is to refer instance by full name like $mol_state_arg and $mol.state.arg (depending on its definition) in *.ts, *.view.ts, *.view.tree and *.jam.js files. Dependencies in CSS files are looked for by entries like [mol_check_checked] , [mol_check_checked= and .mol_check_checked.

Lego components

$mol uses the component approach to building interfaces, however every component is self-sufficient and can be used as a self-sufficient application. Small components are aggregated inside larger components etc.

Unlike another frameworks, $mol does not isolate the internals of its components. Vice versa, a comfortable mechanism is provided for developers to configure them, the creator of the component doesn't have to do any additional actions.

For example, to set the list of sub components you need to redefine sub property in view.tree

Confirm_delete $mol_row sub /
	<= Yes $mol_button_minor title \Yes
	<= No $mol_button_major title \No

Or the same code in TypeScript would be:

@ $mol_mem
Confirm_delete() {
	return $mol_row.make({
		sub : ()=> [ this.Yes() , this.No() ] ,
	})
}

In both variants the compiler would verify the existence of the property and correspondence of the signature. Normally you don't need to work with fields of the object directly, all definable properties are public and can be safely overloaded.

Details about viewers and view.tree language: $mol_view.

Laziness

$mol_view implements lazy rendering. $mol_scroll watches scroll position and suggests the view height to embedded components. $mol_list knows the view height and minimal sizes of the embedded components, it excludes components definitely outside viewport from rendering. And all other components report their minimal size through minimal_height property.

$my_icon $mol_view
	minimal_height 16

As the result opening of any window occurs instantly. It's independent from output data size. And since data would not be rendered, any requests would not be proceeded. This allows us to download them partly, when they are needed. Such a feature is possible due to reactive architecture, that penetrates through all layers of the application.

Reactivity

Unlike control-flow architectures, $mol implements the data-flow architecture. All applications are defined as a set of classes having properties. Every property is defined as some function from another property (and properties of another classes too). Properties, which were called while processing a function are saved as dependencies of current property. When their values change, all dependent properties would be invalidated cascading. Calling a non relevant property would lead to its pre-actualization.

In this way the whole application at the execution stage represents a huge tree of dependencies, with a special property at the root of the tree, which in case of invalidation would actualize itself automatically. And as any property always knows, whether something depends on it or not, then it is given a simple and reliable mechanism of controlling lifecycle of objects - they are created when dependence appears and are destroyed when nothing depends on them. This solves two fundamental problems: resources leaks and cache invalidation.

Besides, the reactive architecture allows us to abstract code elegantly from asynchronous operations. If the function can't return value at the moment, it can throw Promise and is marked as part of the tree as "waiting of results". When result is retrieved, it can be inserted into property directly and an application would be reconstructed for the new state.

namespace $ {
	export class $my_greeter {
		
		@ $mol_mem
		greeting() {
			const user_name = $mol_fetch.json( 'https://example.org/profile/name' )
			return `Hello, ${ user_name }!`
		}
		
	}
}

Details: $mol_wire.

Debugging

$mol pays special attention to debugging possibilities and research of how its code works.

A human friendly id is automatically formed for every DOM-element, e.g. $hyoo_todomvc.root(0).taskRow(0).titler(), which is a valid javascript code, that could be executed in a console, returning a link to the component, which the DOM-element corresponds to. Unfolding the content of the component you'd see names and values for its fields like:

$hyoo_todomvc
    dom_node() : div#$hyoo_todomvc.root(0)
    task(1474385802391) : Object
    task(1474386443175) : Object
    taskRow(0) : $hyoo_todomvc_task_rowRow
    taskRow(1) : $hyoo_todomvc_task_rowRow
    taskrows() : Array[2]

The name of the field corresponds to calling the property, the content of the field would be available through. And thanks to naming classes and functions by underscoring, you always know which class instance you're looking at and can briefly find it in the code by searching the substring.

Modules

Flow

Object model

Lifecycle

Functions

Collections

Simple components

Simple controls

Layout components

Plugin components

Complex components

Charts

Data formats

Math

Resources

Testing

API

Time

Maps

WebAssemply

Web Services

Building

Usage from NPM ecosystem

You can manually build any $mol module as standalone lib:

git clone https://github.com/hyoo-ru/mam.git ./mam
cd mam
npm install
npm start path/to/module
cp path/to/module/-/* your/build/directory

Some libs are already published to NPM:

  • $mol_data - Static typed DTO with strict runtime validation and user friendly error messages.
  • $mol_strict - Makes JS runtime more strict.
  • $mol_time - Proper date/time/duration/interval arithmetic.
  • $mol_type - TypeScript meta types for complex logic.
  • $mol_regexp - Regular Expressions builder.
  • $mol_crypto - Efficient cryptographic algorithms.
  • $mol_db - Static typed IndexedDB wrapper with auto migrations.
  • $hyoo_crowd - Conflict-free Reinterpretable Ordered Washed Data.
  • $mol_plot - Fastest plot lib for vector graphics.

All of them are very small, powerful and fastest. Use it for your pleasure.

Contributors

This project exists thanks to all the people who contribute.

Cool stuff

Donate

mam_mol's People

Contributors

ar2r13 avatar brokolosov avatar darrensem avatar frf-nn avatar gituser3000 avatar jtjag avatar jtjagnfr avatar just-boris avatar kirjs avatar koplenov avatar krulod avatar lega911 avatar lyumih avatar monkeywithacupcake avatar muleronko avatar murkymeow avatar ne4to777 avatar nextstopsun avatar nin--jin avatar nin-jin avatar osv avatar pavelzubkov avatar punclev avatar reatailret avatar shanhaichik avatar slava-viktorov avatar stan-donarise avatar wmakeev avatar yuryscript avatar zerkalica avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mam_mol's Issues

Progress

Показывает процент чего-то от общего числа.

Add versions to generated package.json

  • Версию зависимостей нужно брать текущую установленную.
  • Версию пакета нужно автоматически увеличивать (минорную часть). Мажорную нужно брать из цифрового суффикса.

Defers

Нужно выделить отложенное исполнение кода в том же обработчике событий в отдельный модуль. Заодно им можно заполифилить setImmediate.

Float

  • Смещается вниз по мере скролла.

WebSockets

Двухсторонняя синхронизация через сокеты.

Icons

Как минимум на первое время, нам нужно подыскать набор иконок в SVG формате, которые бы подошли нам по дизайну и имели подходящую лицензию.

Design of basic components

Все контролы должны быть выполнены в 3 состояниях:

  1. Основной.
  2. При наведении/фокусе.
  3. Недоступный к изменению.

Все поля должны поддерживать следующие состояния заполненности:

  1. Не заполненное опциональное. В пустом поле показывается подсказка.
  2. Заполненное необходимое. Показывается введённое значение.

Все поля должны поддерживать следующие состояния проверки:

  1. Пустое, требующее ввода.
  2. Правильно заполненное.
  3. Заполненное неправильно. Рядом должна показываться ошибка.

Контролы:

  • Гиперссылка.
  • Кнопка. Варианты: обычные, основного действия, опасного действия. Внутри кнопки может быть текст, иконка или их комбинация.
  • Чекбокс. Варианты: не выбран, выбран.
  • Радио кнопки. Варианты: выбрана, не выбрана. Возможно стоит совместить с "таббаром", который по сути тоже является группой радиокнопок.
  • Поле ввода строки.
  • Поле ввода числа. Дополнительно должны быть контролы увеличение/уменьшения на единицу.
  • Поле ввода многострочного текста.

Hlighter

Инлайн компонент, который подсвечивает вхождения подстроки.

Параметры:

  • Отображаемый текст
  • Подсвечиваемая подстрока

Visual design concept

Нужно продумать следующие вещи..

Адаптивная раскладка

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

Можно пощупать пример адаптации под размер: http://nin-jin.github.io/form/

Стилизация

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

Можно пощупать пример перекраски интерфейса под базовый цвет: http://nin-jin.github.io/friends/
Через консоль разработчика можно задать другие цвета и даже изображение.

Шрифты

  • Какой набор шрифтов используем.
  • Какие размеры, как изменяем их в зависимости от назначения или размеров родительского блока.

Желательно использовать стандартные шрифты, но они разные в разных системах - это стоит иметь ввиду.

Конкуренты

Builder

Структура кода выглядит следующим образом:

  1. Каждая директория - некоторый модуль.
  2. Корневые модули - пакеты.
  3. В каждом модуле могут быть файлы исходников и вложенные модули.

При сборке, точкой входа задаётся какой-либо модуль. В нём создаётся модуль "-build", в который собираются js- и css-бандлы, включающие в себя исходники указанного модуля и всех рекурсивно вложенных модулей, а также все, каскадно подцепленные, зависимости.

Зависимости ищутся на основе типа файла:

  • *.ts, *.jam.js: ищутся незакомментированные вхождения вида $mol_state_arg.value и интерпретируются как зависимость от модулей: mol, mol/state, 'mol/state/arg,mol/state/arg/value`.
  • *.css: аналогично ищутся вхождения вида: .mol_viewer_error, [mol_viewer_error], [mol_viewer_error="foo"]

Если модуль по пути не находится, то зависимость игнорируется. Зависимость от модуля эквивалентна зависимости от всех его исходников, но не от вложенных модулей.

Если не находится пакет, то он ищется в реестре пакетов (локальный файл с картой соответствия "имя пакета" - "ссылка на репозиторий"). Если находится в реестре, то автоматически чекаутится через гит. Если нет - кидается исключение.

Соглашение: достаточно поставить перед именем модуля дефис и он исключается из сборки.

В "-build" модуле генерируются бандлы следующих типов:

  • index.js - сюда собираются все скрипты. В том числе и сгенерированные из *.ts и *.,view.tree исходников.
  • index.css - сюда собираются все стили.

Рядом копируются все картинки и правятся ссылки на них из css. Также в целях отладки в "-build" собирается "карта зависимостей".

Исходники могут содержать "теги" в имени, например: router.env=web.ts. При билде можно указать env=web и тогда такой исходник будет учитываться, либо env=node и тогда такой исходник будет проигнорирован.

Пример запуска билда:

pms build mol/app/demo stage=release env=web

Чтиво: pms-stub

Ranges

Нужна поддержка "ленивых диапазонов", которые умеют отдавать свой размер и генерировать элементы (создавать объекты, загружать данные и тп) лишь по требованию. Нужна максимальная совместимость с обычными массивами. Должна быть возможность передавать как диапазон, так и массив (автоприведение к диапазону?). Интегрировать диапазоны в рендерер, чтобы сделать его ещё более ленивым.

Documentation

Modal

  • Модальное окно, открываемое из какого-либо компонента.
  • Подумать об ограничении модальности (блокировать не всё приложение, а его часть).
  • Подумать о его необходимости.

Subcomponents throws errors before destruction

Атомы сейчас обновляются по слоям в зависимости от глубины зависимостей.
У дочерней компоненты может быть меньшая глубина, чем у родительской, из-за чего она используя свежие данные валится с ошибкой и только после этого, родительская компонента её удаляет. Это тормоза и куча ошибок в консоли. Нужно обновлять атомы ещё и в зависимости от приоритета целевого атома. Вложенные компоненты должны иметь соответственно меньший приоритет.

Restoring of selection

При реализации подсветки синтаксиса необходимо восстанавливать выделение в правильном положении. Аналогично и при перезагрузке страницы.

Подсветка синтаксиса tree для WebStorm

Нужно с нуля запилить плагин для подсветки синтаксиса tree.

  • Должны показываться как ошибки пробелы в начале строк
  • Должно показываться как ошибка отсутствия перевода строки в конце файла
  • Должна быть поддержка светлых и тёмных тем
  • Пробелы в конце строк должны быть заметны
  • Типы токенов: сырые данные, обычные имена, имена состоящие исключительно из пунктуационных символов, имена начинающиеся на пунктуационные символы, имена заканчивающиеся на пунктуационные символы.

Текущий устаревший плагин: https://github.com/nin-jin/tree-plugin
Дока по написанию плагинов: http://www.jetbrains.org/intellij/sdk/docs/

Text field with hlighting

  • Автоматический размер поля под размер содержимого
  • Ленивый рендеринг содержимого
  • Подсветка синтаксиса по мере ввода

Test system

  • Запуск тестов при сборке
  • Сборка под разные платформы и прогон тестов в них.
  • Нужно подумать над ui тестами.

Checkbox must use icon

Сейчас $mol_checker использует символ галки, вместо этого нужно внедрить иконку. Кроме того, стоит отказаться от :before в пользу явной вставки иконки с возможностью эту иконку перегрузить.

Нужно реализовать:

  • $mol_checker_expander - поворащивающийся шеврон.
  • $mol_checker_ticker - чекбокс.

По умолчанию $mol_checker не должен добавлять особой визуализации, только поведение.

Agreement - demo app for agreement of procurements

Необходимо реализовать полноценное приложение с интеграцией с SAP ERP.

Экраны

  1. Авторизация.
  2. Список заявок на закупку.
  3. Подробности по заявке.

Конфликт значений по умолчанию

Пример:

$my_habhub_gister $mol_carder
    content < sectioner $mol_sectioner
        head < title \
        content < content null

Нужно кидать исключение, если значения по умолчанию не совпадают для одного и того же свойства.

Need to reset of scrollTop when scrollHeight is small

Воспроизводится тут: http://eigenmethod.github.io/mol/perf/render/

  1. Рендерим список
  2. Крутим в конец
  3. Перезагружаем страницу
  4. Рендерим список
  5. Рендерятся все элементы, но скроллинг в самом начале.

Либо рендериться должны лишь видимые элементы, либо скроллинг должен быть в конце.

Suggest

Думаю стоит сделать компонент $mol_suggester, который владеет $mol_stringer и $mol_lister. Последний показывается, если есть хотя бы одна подсказка.

  • По мере ввода предлагает варианты завершения ввода.
  • Ограничить максимальную высоту списка вариантов половиной высоты экрана.
  • В списке подсказок не должен появляться скроллбар и не должен обрезаться последний вариант. С вертикальным флексбоксом такое должно получиться.
  • По умолчанию не активна ни одна подсказка, перемещаться по подсказкам можно стрелками на клавиатуре.
  • Активация подсказки (ентер, пробел, стрелка вправо на клавиатуре или клик мышью) приводит ко вставке соответствующего текста.
  • В подсказках стоит подсвечивать части слов, набранные пользователем.
  • Возможно в самом поле тоже стоит выводить блеклым шрифтом текст, который мы собираемся дописать за пользователя.

Входные параметры:

  • текст, набранный пользователем (двусторонний биндинг)
  • список строк-подсказок.

Forester

Компонент для отображения деревьев.

  • Каждый узел дерева может принимать параметром список вложенных узлов.
  • Если есть вложенные узлы, то должен показываться шеврон для сворачивания/разворачивания.

Switchers

Контролы:

[ ] check box
[ ] radio button

Могут быть с лейблом и без.

В demo приложении выводить содержимое readme.md

  • markdown нужно налету транслировать в html. Для этого нужно запилить #29.
  • Ссылки должны все работать.
  • Ссылки на демо примеры открывать тут же, не уходя со страницы - подумать как лучше реализовать.

Links

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

Grider

Ветка grider.
$mol_gider - компонент для рисования гридов
$mol_app_taxon - демонстрирует гриды в действии на примере приложения

Что нужно поправить:

  • Нужно реализовать чекбоксы через svg иконки
  • Сейчас чекбоксы налезают на шапку - нужно это поправить.
  • Нужно скрывать задисейбленные экспандеры.
  • Нужно выводить в шапке не имена полей, а соответствующие им лейблы, задаваемые конфигом.
  • Нужно добавить колонок разных типов, чтобы было штук 30.
  • Когда будет готов бэкенд - прикрутить его для получения данных.

Combobox

  • Показывает текущее значение
  • Позволяет выбрать значение из списка по клику
  • Позволяет ввести текст для фильтрации списка

Number

Нужно реализовать поле ввода численного значения - $mol_number.
Внутри стоит использовать $mol_stringer для ручного ввода значения, а по бокам окружить его кнопками "+" и "-". Кроме того стоит предусмотреть изменение значения колесом мыши.
Стоит заодно добавить в $mol_stringer возможность отфильтровывать недопустимые символы.

HTTP

Необходима абстракция над http запросами, чтобы можно было передавать данные в различных форматах (Text, JSON, XML, FormData) и получать ответ в виде DOM/JSON/Text.

А сверху нужна абстракция над http ресурсами: задав uri можно принимать и отправлять изменения в том же формате.

Buttons

Состояния кнопок

  • выключена
  • нормальное
  • при наведении/фокусе

Типы кнопок

  • Обычная
  • Привлекающая внимание
  • Опасная

Содержимое

  • Текст
  • Иконка
  • Текст с иконкой

События

  • Нажатия. Если кнопка выключена, то нажатия не должны работать.

Url

  • Текстовое поле с url валидацией

Error about $mol_icon_chevron in travis

Error: 
/home/travis/build/eigenmethod/mol/app/demo/-/view.tree/demo.view.tree.ts:83:13
 Cannot find name '$mol_icon_chevron'.
/home/travis/build/eigenmethod/mol/app/supplies/detailer/-/view.tree/detailer.view.tree.ts:16:13
 Cannot find name '$mol_icon_chevron'.
/home/travis/build/eigenmethod/mol/checker/expander/-/view.tree/expander.view.tree.ts:6:13
 Cannot find name '$mol_icon_chevron'.
    at $mol_build.sourcesJS (/home/travis/build/eigenmethod/mol/build/build.node.ts:236:29)
    at $mol_atom.pull (/home/travis/build/eigenmethod/mol/atom/atom.ts:128:26)
    at $mol_atom.actualize (/home/travis/build/eigenmethod/mol/atom/atom.ts:117:21)
    at $mol_atom.get (/home/travis/build/eigenmethod/mol/atom/atom.ts:71:9)
    at $mol_build.descr.value [as sourcesJS] (/home/travis/build/eigenmethod/mol/mem/mem.ts:82:17)
    at $mol_build.bundleJS (/home/travis/build/eigenmethod/mol/build/build.node.ts:434:23)
    at $mol_atom.pull (/home/travis/build/eigenmethod/mol/atom/atom.ts:128:26)
    at $mol_atom.actualize (/home/travis/build/eigenmethod/mol/atom/atom.ts:117:21)
    at $mol_atom.get (/home/travis/build/eigenmethod/mol/atom/atom.ts:71:9)
    at $mol_build.descr.value [as bundleJS] (/home/travis/build/eigenmethod/mol/mem/mem.ts:82:17)

Ещё и не падает при ошибке.

Локально на винде не воспроизводится.

$mol_notify

  • Единый способ уведомления пользователя.
  • По возможности использовать системные средства.

Architecture design concept

  • Ленивое автоматическое подключение модулей.
  • Поддержка разных окружений (изоморфность).
  • Объявление компонент.
  • Инстанцирование компонент с перегрузкой свойств.
  • Прозрачное расширение автогенерированных компонент.
  • Объявление реактивных свойств.
  • Отслеживание ссылок на объекты.
  • Каскадное обновление зависимостей.
  • Поддержка асихронности.
  • Реакция на исключения без их перехвата.
  • Уничтожение компонент при потере ссылок на них.
  • Автогенерация BEM аттрибутов/классов для элементов.
  • Реакция на циклические завсимости.
  • Реактивный браузерный рендеринг.
  • Серверный рендеринг.
  • Декларативное описание компонент.
  • Написание тестов.
  • Логирование.
  • Автоматическое сохранения состояния между перезагрузками.
  • Иммутабельные структуры данных.

DropDown

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

Panels

Горизонтальный стек панелей. При нехватке места боковые панели должны скрываться и появляться лишь по наведению мыши на край экрана или по свайпу.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.