bones_ui 3.1.7
bones_ui: ^3.1.7 copied to clipboard
Bones_UI - An intuitive and user-friendly Web User Interface framework for Dart.
3.1.7 #
UIMultiSelection: the options panel is shown attached to the document'sbody, and returns to the component when hidden (also ondispose). Inside the component it was positioned in page coordinates, so under an ancestor that is the containing block of absolute elements (position,transform,filter,backdrop-filter...) it was displaced by that ancestor's offset, and the ancestor'soverflowclipped it: clicking the input showed nothing.- Its default look (white background, left alignment, padding) is no longer inline: it's a
:where(...)rule (no specificity), so an app rule styling.ui-multi-selection-options-menunow applies (inline, the white background always won: on a dark theme, light text over white). - In the
bodyit keeps the component's inheritedcolor,font-family,font-size,font-style,font-weight,line-height,letter-spacinganddirection, passed as--ui-multi-selection-*properties to that same rule: an app rule still takes precedence, as over inheritance. CSS rules selecting the panel through the component's ancestors no longer match it while shown. - Its position is corrected by where it lands (a positioned
body). - A new render keeps it shown (as before), with the new options, re-positioned.
- While shown, it's hidden if the input stops being displayed (an ancestor with
display: none, e.g. a hidden dialog), notifying the selection as on any hide; or if the input leaves the document (a removed component), without notifying it, also later (its pending selection is cancelled). Nomouseleavewould hide it there. It isn't shown for an input out of the document. - Single selection: each instance has its own radio group (in the
body, the radios of an instance in a<form>and of one out of it shared a group, unchecking each other's).
- Its default look (white background, left alignment, padding) is no longer inline: it's a
- Tests:
bones_ui_components_b_test.dart("options panel placement"): under abackdrop-filter+overflowancestor the panel is shown right under the input, in thebody, with the component's font and color, and its options work; back after the input when hidden; the app's CSS overrides its defaults. Also on a scrolled page, a positionedbody, above the input near the bottom of the viewport, and after a window resize. A new render keeps it shown; a removed component and a hidden ancestor hide it (a removed one notifying nothing);disposedoesn't leave it in thebody; single selections in and out of a<form>keep theirs.
3.1.6 #
UIRoot: newregisterComponentsparameter, the components that markup can create by tag (<ui-button>,<ui-document>,<ui-dialog>...) to register when the first root is constructed. Without it all of them are registered, as before (the new staticUIRoot.registerAllComponents). Whatever is registered is compiled in, so an app that writes none of those tags can pass() {}, or register only those it uses (UIDialog.register):<ui-document>alone brings in themarkdownpackage. EveryUIRootof the app must pass it. In a real app (a game whose only component, a dialog, is created in code) the dart2js output went from 474 KiB gzipped to 389 KiB, 18% smaller.- Tests:
bones_ui_root_register_components_test.dart: a root registering onlyUIDialoghas<ui-dialog>and none of the others; the registration runs once, before the first render; a registered tag becomes its component, an unregistered one (<ui-document>) stays a plain element, and a component created in code needs none.bones_ui_root_register_all_components_test.dart: withoutregisterComponentsevery tag component is registered, and<ui-document>renders its markdown.register_components_tree_shaking_test.dart(VM): compiles minimal apps (test/register_components/) withdart compile js -O2. Registering none leaves every component and themarkdownpackage out (about 30% smaller), registeringUIDialogalone keeps only it, and one root withoutregisterComponentskeeps them all.
3.1.5 #
bones_ui test(BonesUITestCLI): runs the tests throughtest_core'smain, which also works withtest_core0.6.21. That release removed therunTests/completeShutdownpair, sodart pub global activate bones_uifailed to build the CLI (Method not found: 'runTests').- CI:
actions/checkout@v6andcodecov/codecov-action@v5(Node 24, no Node 20 deprecation warning); a new push cancels the branch's running jobs; read-onlypermissions; job timeouts.
3.1.4 #
intl_messages: ^3.0.2:IntlLocale.onDefineDefaultLocaleno longer throws aTypeErroron access, so an app can listen to locale definitions through it.
3.1.3 #
UIRoot.setDocumentLangis an instance method (was static), so aUIRootcan override it to customize how<html lang>is set (another tag, another element, or not at all). Its first call can come during theUIRootconstruction, before a subclass's constructor body runs.
3.1.2 #
UIRoot:<html lang>follows the locale. It is set on every locale definition, at start-up and on a change without a reload (setPreferredLocale, a language selector), as a BCP 47 tag (pt-BR, notpt_BR), so fonts (the right CJK glyphs), screen readers and hyphenation follow the language of the texts. New staticUIRoot.setDocumentLang.
3.1.1 #
-
dom_builder: ^3.2.0: a false boolean attribute (selected="false",hidden="false"...) no longer turns it on; everyselected="false"option was selected, so a<select>(as an app's language menu) showed its last option. Alsoresource_portable: ^3.1.4andbuild_web_compilers: ^4.8.11. -
Component boolean attributes are read as HTML does (
DOMAttribute.parseBooleanValue): a bare one, an empty one or one set to its own name is on.<ui-dialog show>is shown, and<bui hide-from-menu>hidden (both were off). Explicit"true"/"false"values are unchanged. NewparseAttributeBoolreads one, or its default if absent:show,show-close-button,remove-on-hideandon-click-listen-only-for-dialog-button-classof<ui-dialog>,with-progressof<ui-button-loader>. -
InputConfig: a checked checkbox and a selected option also get the attribute (defaultChecked,defaultSelected), not only the property, so a form reset keeps them (it unchecked the box and selected the first option). -
Tests: boolean attributes in rendered components,
<ui-dialog>,<bui>andInputConfigattributes (bones_ui_boolean_attributes_test.dart). -
Tests: a
<ui-dialog remove-on-hide="false">with a locale<select>in a<ui-template>(as an app's language menu), opened by anaction="#id.show()": the option of the current locale is selected, also after the locale changes and the component (or the root) renders again; no copy of an earlier render is left in the page; a language picked withUIRoot.setPreferredLocalebecomes the current locale, and a regional one (a browser'spt-BR) resolves to the language with messages (pt).
3.1.0 #
-
sdk: ^3.13.0
-
Now based on
dom_builder3.1.0,dom_tools3.1.0,web_utils1.1.0 andjs_interop_utils1.1.1 (Dart 3.13 versions, with many bug fixes; see their changelogs). Notably,UIColorPickerInputcolors are now opaque (they were parsed with alpha 0) andrgba(...)colors keep their alpha (viaColor.parse). -
Adopted Dart 3.8–3.12 features (flagged by
lints6): private named parameters (this._x, same named arguments), null-aware elements, explicit types;Object?.isA<T>()instead ofasJSAny.isA<T>(). -
Performance (render time and memory; see
doc/benchmarks.md):- Rendering no longer walks the whole rendered tree through JS interop several times per render: the elements
with parsed attributes (
navigate,action,onEventClick,uiLayout...),bg-bluranddiv-centered-*classes and sub-components are selected with nativequerySelector(All). - Placing the rendered children no longer calls
childNodes.indexOfper element (O(n²) per render). UIComponentsTreereplacesDOMTreeReferenceMapas the tree of components of aUIRootComponent: withdart2wasmJS objects have a constant DarthashCode, making each registration and lookup O(n); nodes are now hashed by JS identity (up to 10x faster renders of many components withdart2wasm).- Purged components (no longer in the tree) are held weakly (still resolvable while referenced elsewhere, up to
the same 1 minute), and the purge after rendering is time-sliced (it yielded ~4ms per component): discarded
renders are released promptly (-16% heap in a real app after navigating and re-rendering). The slice length is
UIComponent.purgeSliceTime(8ms by default). - New
benchmark/render_benchmark.dart(synthetic render scenarios,dart2jsanddart2wasm),benchmark/compare.dart, andchrome-bench/chrome-proftest platforms.
- Rendering no longer walks the whole rendered tree through JS interop several times per render: the elements
with parsed attributes (
-
UIComponent:- Fix (
dart2wasm):getContentUIComponent(and soelement.uiComponent) missed components when the content element was re-read from the DOM: the association was anExpandokeyed by the Dart wrapper; it's now a JSWeakMap(JS identity). parentis recorded when the content is already a child of the parent (it stayednull, e.g. afteraddExternalElementToElement/replaceChildElement).getFieldsreturns the value ofUIFieldcomponents (it resolved their container:'').setAttribute('style' | 'class', '')no longer fails a null check.- A
render()returning aMapwithout renderable entries is rendered as JSON (as documented).
- Fix (
-
UIComponentGenerator.clearAttribute: uses the attribute handler'scleaner(it always setnull). -
UIConsole: formatting aListmessage no longer recurses until a stack overflow;tail(n)no longer throws aRangeErrorwith fewer thannlogs (tail()threw with fewer than 100). -
CSSProvider.cssFromElement: returns the computed CSS of elements in the DOM (Chromium's computedcssTextis empty). -
TextProviderwithout a source throws aStateError(it overflowed the stack).UIDeviceOrientationno longer throws on eachdeviceorientationevent wherewindow.orientationis undefined (desktop). -
UIDocument: text documents are HTML-escaped (<tag>in a.txtbecame an element). -
Navigation:
parameterAsNumList/parameterAsBoolListno longer throw aTypeError;UINavigableContentfiresonChangeRoute. -
Components:
$uiDialogcreates aui-dialog(it created aui-button-loader). Constructing aUIDialogno longer firesonShow(or hides theUIRootwithhideUIRoot) before it's shown.UIButtonLoader: the button is hidden while loading and restored on stop;loadedTextStyleno longer shows the loaded message before loading ends.UICalendar:- Week mode (
CalendarMode.week, the default mode) is implemented: it rendered nothing. The days of the week ofcurrentDate(fromfirstDayOfWeek) × time slots, withnextWeek/previousWeeknavigation,onDayClick(day headers),onHourClick,onEventClick, and ↑/↓ to the month/day modes (perallowedModes). NewcurrentWeekDays. - Events longer than a time slot (or spanning days in the month view) are shown in every slot/day they overlap
(only events entirely inside a slot were shown).
selectEventsreturns overlapping events; newCalendarEvent.overlapsTimeRange(isInTimeRangeis unchanged). Continuation slots are rendered with theui-calendar-event-continuationclass (CalendarEvent.render(continued:)). - The month view no longer drops the last day of some months; clicking the title date shows the date input and updates the title.
- Week mode (
UILoadingConfig/$uiLoading:inline: falseis applied.UIDataSource: its content is hidden (display: 'node'typo).UIJsonRender: HTML inside JSON values is shown as text.htmlAsSvgContent: appliesrootClass, uses the title's text, no debugprint.UISVG:renderedElement/isRenderedAsSVGare set forsvgContent.BUIRender: fixed aTypeErroron construction;BUIViewProvider.routes/menuRoutesno longer throw;BUIRenderSource.sourceAsDOMElementworks with anElementsource ondart2wasm;renderThumbnailincludes the document styles (they were dropped) and appendsstylesinstead of replacing them.UIMasonry:Elementitems render; fixedTypeErrors in the size calculation and withDOMElementitems.UIMultiSelection: filtering re-renders the options panel; the inlineoptionsattribute (a: A ; b: B) works.UIInputTable: extra rows keep their text; extra rows of non-table elements no longer crash; thepathinput's value-provider button works.ui-template:variablesare applied, including JSON variables.UICapture.selectedFileDataAsBase64: fixed for data URL data.
-
UILayout:#id[n]expressions work ondart2wasm; negative values get their unit (-5px). -
UIExplorer:queryexplorers render (aTypeErrorin the controllers' properties);YAMLConfig/JSONConfigtoString()closing}.isGeneratedElement: removed debugprints. -
Test tools:
testUISleepappliesmaxMsand the 1 ms minimum;testUISleepUntilappliesminMs;selectUntilTypedrejects elements of the wrong type (JS interop types erase at runtime); theselectWhereUntil/selectWhereUntilTypedfuture extensions no longer throw aTypeError. -
Test CLI: an empty
--log-diris no longer the current directory; a missing<title>is inserted in reports;compile()awaits the compile directory creation. -
Dependencies:
- dom_builder: ^3.1.0
- dom_tools: ^3.1.0
- web_utils: ^1.1.0
- js_interop_utils: ^1.1.1
- statistics: ^1.2.2
- yaml: ^3.1.4
- archive: ^4.3.0
- test: ^1.32.0
- test_api: ^0.7.14
- test_core: ^0.6.20
- stack_trace: ^1.12.2
- build_web_compilers: ^4.8.10
- build_runner: ^2.16.1
- lints: ^6.1.0
- dependency_validator: ^5.1.0
-
Tests: new browser integration tests (
bones_ui_core_integration_test.dart,bones_ui_components_a_test.dart,bones_ui_components_b_test.dart,bones_ui_generator_explorer_test.dart,bones_ui_regression_test.dart) and VM tests for the test CLI (bones_ui_cli_test.dart).
3.0.20 #
- Test tools: a failing step in a test chain no longer hangs the test.
_chainCaptureran each step inChain.capturewith anonError, which makes it an error zone. An error can't leave an error zone, so a failingexpectinsidethenChain(e.g.selectFirstWhereUntilnot finding its element) was reported as an uncaught error — the test showed as failed — while the future the test body awaited never completed. The body then hung until the test's own timeout, holding up every suite after it.- Now
Chain.capture(errorZone: false): the chain is still tracked, and the error completes the awaited future. - New
bones_ui_test_chain_test.dartcovers it.
3.0.19 #
-
UIComponent:onChildRendered: fixed the notification passing the parent component instead of the rendered child (_callOnChildRenderedcalledonChildRendered(this))._parseOnEventKeyPress: anonEventKeyPressattribute without akey:actiondelimiter threw aRangeErrorthat aborted the whole render (toContentElementsreturned an empty list). The value is now handled as an action triggered by any key.focusField: was looking for the text input in the component itself instead of in the resolved field component.getFieldsComponentsMap: for a repeated field name it now keeps theUIFieldcomponent instead of letting a plain element overwrite it.getFieldsExtendedhad a sort with the same intent, but it comparedMapEntry is UIComponent(alwaysfalse) over an already deduplicated map.appendStyle: ensures the previous declarations are terminated before appending.
-
UIAsyncContent:_ensureElementForDOM: an HTML content with multiple root nodes returned the rawStringinstead of the built element (missingreturnin the branch).
-
UILayout:_getElementIndexByID: an element without anidbuilt the invalid CSS selector#, throwing aSyntaxError. This broke any evaluateduiLayoutcommand (e.g.x(10px)) on elements without anid._parseValuePx: crashed with aFormatExceptionon fractional values (e.g.4.5px); now parsed as anumand ignored when not a plainpxvalue (e.g.calc(...))._valueXY: returned the invalid CSS value'0 px'(with a space) when the parent had no dimensions.- The window
resizelistener is now registered once perWindow(it was registered by everyUILayoutinstance, since_registeredWindowwas notstatic). _configure: removed a no-opsplit()over a regex passed as a literalString._getElementIndex/_getElementIndexByID: null-safe for detached elements.
-
UINavigator:navigateOnClick: anull/empty route threw a null-check error; it now clears a previously registered route and returnsnull._navigateTo: the "navigable not found" retry dropped thefromURLflag, pushing a duplicated entry in the browser history for URL-driven navigations.
-
UIElementExtension.resolveUIComponent: no longer throws when there is noUIRoot. -
$uiButtonLoader:button-stylewas only emitted whenbuttonClasseswas provided (and was emitted empty when onlybuttonClasseswas given).loaded-text-classeswas built frombuttonClassesinstead ofloadedTextClass.UIButtonLoader.generatornow also accepts theloaded-text-classesattribute (the one generated by$uiButtonLoader).
-
UIEventHandler.trackAllRegisteredEventListeners: fixed an empty-check usingisElement. -
getUILoadingType: thedualRingcase was unreachable, since the value is lower-cased before theswitch.UILoadingType.dualRingcould never be parsed from aStringand silently fell back toUILoadingType.ring. Also acceptsdual-ringanddual_ring. -
UILoadingConfig:toInlinePropertiesemittedtextZoom, butfromMaponly readtext-zoom, andwithProgresswas not emitted at all. Both were silently lost on atoInlineProperties→parseround-trip (used by theui-button-loadertag).
-
UIDialog.getAllDialogs/removeAllDialogs: resolved the dialogs by mapping the.ui-dialogelements back to their components through anExpando. AnExpandois keyed by identity, and ondart2wasman element re-read from the DOM is a new Dart wrapper, so the lookup always missed and both methods were no-ops. They now resolve the instances throughUIRootComponent.getInstances. -
Lints (
dart analyze --fatal-infos --fatal-warnings):BUIViewProvider.fromManifestContent: thereturnof theasyncfromManifestTreewas inside atryblock, so its errors were never caught by thecatch(unawaited_return_in_try_block). Moved out of thetry, which keeps the behavior and makes the guarded scope explicit.- Converted the forwarded constructor parameters to super parameters in
UIDocument,BUIRender,UIButtonCapture,UIDialogInput,UIDialogAlertandUIDialogLoading(use_super_parameters).
-
Tests:
- Added
test/bones_ui_component_test.dart,test/bones_ui_async_content_test.dart,test/bones_ui_layout_test.dart,test/bones_ui_navigator_test.dartandtest/bones_ui_button_test.dart. - Coverage: added
test/bones_ui_extension_test.dart,test/bones_ui_component_async_test.dart,test/bones_ui_fields_test.dart,test/bones_ui_navigable_test.dart,test/bones_ui_utils_test.dartandtest/bones_ui_dialog_test.dart. - Line coverage: 47.8% → 60.8%.
- Added
3.0.18 #
UIDocument:- Constructor: added initialization of
_markdownExtensionSetfield.
- Constructor: added initialization of
3.0.17 #
UIDocument:- Added support for custom Markdown extension sets via new
markdownExtensionSetfield. - Updated
renderAsyncto passmarkdownExtensionSettomarkdownToDivwhen rendering Markdown content.
- Added support for custom Markdown extension sets via new
- Dependencies:
- Added
markdownpackage dependency (^7.3.1). - Updated
dom_toolsto ^3.0.1. - Updated
intlto ^0.20.3. - Updated
build_web_compilersto ^4.8.0.
- Added
3.0.16 #
-
UILayoutEvaluator:- Fixed a null-check crash when a layout expression referenced an unresolvable element or
thistarget (e.g.#missing.center.x)._evalMemberExpressionImpland_evalThisImplnow returnnullinstead of force-unwrapping a null resolved expression, soprocessLayoutcorrectly falls back to itsdefaultValue.
- Fixed a null-check crash when a layout expression referenced an unresolvable element or
-
lib/src/component/capture.dart:UICapture.getInputFile: hardened against a nullHTMLInputElement.files, returningnullinstead of throwing (matching the null-safe handling already used in_readFile).
-
Tests:
- Added
test/capture_test.dartcovering theUICapturedata-format conversion matrix (arrayBuffer/base64/string/dataUrlBase64), field value round-trips,nullclearing andlatin1encoding. - Expanded
test/layout_expression_test.dartwith unit arithmetic, fallback-unit application, mixed-unit rejection and the unresolvable-element fallback (regression test for the fix above).
- Added
3.0.15 #
-
lib/src/component/capture.dart:- Reformatted capture component constructors and methods with trailing commas.
_CapturedData.data: casts with toString() for safer conversions
-
pubspec.yaml:- Updated SDK constraint to
>=3.10.0 <4.0.0. - Updated dependencies:
intl_messages: ^3.0.1dom_builder: ^3.0.9archive: ^4.0.9test: ^1.31.1test_api: ^0.7.12test_core: ^0.6.18build_web_compilers: ^4.4.19build_runner: ^2.15.0dependency_validator: ^5.0.5
- Updated SDK constraint to
3.0.14 #
-
UIComponent:- Updated rendering logic to mark
renderingZonewiththis[UIComponent] if the rendered result is aDOMNodewith future elements or an iterable containing such nodes. - Renamed
_renderedUIRootsto_renderedUIRootComponentsand updated related methods and fields accordingly. - Updated
_markRenderTime,_scheduleCheckFinishedRendered, and_purgeUImethods to useUIRootComponentinstead ofUIRoot. - Improved render finish notification and purge logic to handle
UIRootComponentinstances.
- Updated rendering logic to mark
-
Dependencies:
- Updated
dom_builderfrom ^3.0.7 to ^3.0.8. - Updated
build_web_compilersfrom ^4.4.13 to ^4.4.14.
- Updated
3.0.13 #
UINavigator:_callNavigateTo:- Fix null-pointer: updated to handle null
routeby assigning an empty string before checking navigables and calling_navigateTo.
- Fix null-pointer: updated to handle null
3.0.12 #
-
ConfigDocument:getPath: fixed traversal logic to correctly handle nested maps by checking type and updating value at each key.
-
UITestChain:logDocument: renamed local variable to avoid shadowing and correctly encode compressed data length in log message.
-
Internal utility:
_equalsParameters: refactored parameter comparison logic for clarity and correctness, ensuring full match checks for extra keys.
-
bones_ui_utils.dart:stackTraceSafe: improved error message when failing to get current stack trace.
-
Dependencies:
- Updated
dom_builderto ^3.0.7. - Updated
testto ^1.30.0,test_apito ^0.7.10, andtest_coreto ^0.6.16.
- Updated
3.0.11 #
-
UIComponent:clear: fixed_renderedElementsnullification to occur after element removal.ensureRendered: updated to callcallRender(clear: true)ifisDisposedis true or locale changed._dispose:- Fix issue: removed redundant
clear(force: true)and_rendered = falseassignments.
- Fix issue: removed redundant
-
UIRootComponent:purgeRoot: added optionaldisposePurgedComponentsparameter to dispose purged components after purge.
-
UIRoot:close: updated to callpurgeRoot(disposePurgedComponents: true)before refreshing UI and emitting close events.close: updatedrefreshcalls to includeclearPreservedRender: trueflag.
3.0.10 #
-
UIComponent:clear:- Prevent clearing when
preserveRenderis true and any async content is loading, to avoid breaking async content attachment. - Added
_renderedElements = nullafter removing elements.
- Prevent clearing when
dispose:- Added call to
clear(force: true)before resetting_renderedand clearing rendered state fields.
- Added call to
-
_UIDOMTreeReferenceMap:isValidEntry:- Components with loading async content are always valid to keep them alive.
- Components with
preserveRenderare always valid even if outside the DOM. - Components not disposed and still in initial rendering phase are considered valid.
- Default validation falls back to superclass
isValidEntry.
3.0.9 #
UIComponent:clear:- Added check to prevent clearing when
preserveRenderis true and there are loading or rendered async contents.
- Added check to prevent clearing when
render:- Reset
_renderedAsyncContentsto null when not preserving render.
- Reset
_UIDOMTreeReferenceMap:isValidEntry:- Added condition to always consider entries valid if their component's
preserveRenderis true.
- Added condition to always consider entries valid if their component's
3.0.8 #
-
UIEventHandler:- Renamed base class to
_EventHandlerPrivate. - Added event listener tracking methods:
addTrackedEventListener,trackRegisteredEventListener,trackAllRegisteredEventListeners,untrackRegisteredEventListener,cancelRegisteredEventListeners.
- Updated event listener registration methods to use new internal implementations.
- Renamed base class to
-
_EventHandlerPrivate:- Added support for tracked event listeners with automatic unregistering.
- Added internal management of
_registeredEventListeners.
-
UIDeviceOrientation:- Updated to extend
_EventHandlerPrivate. - Updated event listener registration to use
_addEventListener.
- Updated to extend
-
UIComponent:- Improved
resolveParentUIComponentlogic to handle recursive resolution more robustly. - Added
hasUIComponentClassstatic method to check for 'ui-component' CSS class. - Updated style and refresh methods to support
clearPreservedRenderparameter. - Enhanced rendering zone management with
_releaseRenderingZoneUIComponent. - Changed rendering stack from
QueuetoListfor_renderingUIComponent. - Improved
parentRenderingUIComponentto check async rendering zones. - Updated
_callRenderImpland_doRenderto support clearing preserved render. - Improved
_doRenderto reset_renderedElementswhen not preserving render. - Added
_ensureAllElementsRenderedhelper to recursively ensure rendering of nested elements. - Updated event listener registration in
_parseAction,_parseOnEventKeyPress,_parseOnEventClickto use tracked event listeners. - Added
cancelRegisteredEventListenerscall indisposeto unregister all tracked listeners. - Added static
handledElementAttributeslist for attributes that trigger event handling. - Improved
_getUIComponentto search allUIRootComponentinstances. - Updated
_getUIComponentByChildand related methods to use new logic.
- Improved
-
UIDOMGenerator:- Refactored
isMappableto use iterative stack-based traversal. - Added detection of handled element attributes and event listeners to determine mappability.
- Added
_isNoEventDOMElementhelper to exclude certain tags from event handling.
- Refactored
-
UIRoot:- Updated
callRenderto supportclearPreservedRenderparameter.
- Updated
-
UIButtonBase:- Updated event listener registration to use tracked event listeners.
- Added
disposeoverride inUIButtonLoaderto clear internal fields.
-
UICapture:- Updated event listener registration to use tracked event listeners.
-
URLFileReader:- Added tracked event listeners for
FileReaderevents with automatic unregistering on load/error.
- Added tracked event listeners for
-
UIButtonCapturePhoto:- Updated event listener registration to use tracked event listeners.
-
InputConfig:- Updated event listener registration in input elements to use tracked event listeners.
-
UIInputTable:- Updated event listener registration to use tracked event listeners for focus, change, keyUp, and complete events.
-
UISVG:- Added
_onLoadContenthandler to refresh component on resource load.
- Added
-
Dependency updates:
js_interop_utils: ^1.0.11web_utils: ^1.0.23dom_builder: ^3.0.6swiss_knife: ^3.3.14build_web_compilers: ^4.4.13
3.0.7 #
-
UIComponent:- Rollback: avoid
WeakReferenceissues with WASM on Chrome/Android.- Replaced
DualWeakMap<UIElement, UIComponent>withExpando<WeakReference<UIComponent>>for_contentsUIComponents. - Updated
_setContentand_recycleto storeWeakReference(this)in_contentsUIComponents. - Updated
getContentUIComponentto retrieve the target from the weak reference. - Removed
_contentsUIComponents.purge()call frompurgeGlobals.
- Replaced
- Rollback: avoid
-
Dependencies:
- Updated
dom_builderfrom ^3.0.4 to ^3.0.5. - Updated
swiss_knifefrom ^3.3.7 to ^3.3.9.
- Updated
3.0.6 #
-
UIComponent:getContentUIComponent: replaced direct map access withDualWeakMap.getNoPurgefor_contentsUIComponents.
-
UIDOMGenerator:- Added override for
isMappablemethod to excludeTextNodeand certainDOMElementtags (br,p) from being mappable.
- Added override for
-
Dependencies:
- Updated
dom_builderfrom ^3.0.2 to ^3.0.4. - Updated
swiss_knifefrom ^3.3.5 to ^3.3.7.
- Updated
3.0.5 #
-
UIComponent:toRenderableList:- Changed return type from
List<dynamic>?toList<Object>?. - Simplified list conversion logic; now accepts
List<Object>,Iterable<Object?>, andMapwith renderable keys/values.
- Changed return type from
_toContentElementsImpl:- Replaced
_normalizeRenderListValueusage for HTML string rendering with direct$htmlcall and DOM node building.
- Replaced
_normalizeRenderListValue:- Added null check returning null immediately.
- Reordered and refined type checks for better clarity and correctness.
- Removed redundant
UIComponentcheck duplication.
_buildRenderList:- Added null check after normalization to skip null values.
-
Dependency updates:
dom_builder: ^3.0.2
3.0.4 #
UIComponent:_notifyFinishRendered: updated to prevent concurrent executions by caching a future and resetting it on completion._notifyFinishRenderedImpl: refactored to async method called by_notifyFinishRendered._onPurge: added early return if_subComponentistrueto skip purging for subcomponents.
3.0.3 #
- Dependency updates in
pubspec.yaml:- Updated
dom_builderfrom ^3.0.0 to ^3.0.1. - Updated
build_web_compilersfrom ^4.4.11 to ^4.4.12.
- Updated
3.0.2 #
-
UIComponent:- Added private
_subComponentflag to distinguish subcomponents. - Refactored constructors:
- Added private named constructor
UIComponent._to centralize initialization. - Added public mirror constructor
UIComponentwith detailed documentation on parameters controlling rendering, styling, and structure. - Added new constructor
UIComponent.subComponentfor creating components attached to an existingparentComponent, sharing its DOM mapping context.
- Added private named constructor
- Updated
disposemethod to avoid disposing shareddomTreeMapwhen the component is a subcomponent.
- Added private
-
UIButton(button.dart):- Extended
$uiButtonLoaderfunction to support additional attributes for loaded text styling and content:- Added parameters:
loadedTextClass,loadedTextStyle,loadedTextErrorClass,loadedTextErrorStyle,loadedTextOK,loadedTextError. - Added corresponding attributes to the returned DOM element for these new parameters.
- Added parameters:
- Extended
3.0.1 #
-
UIComponent:- Updated
renderto notify UI roots finish render before purging UI components and roots asynchronously after a 300ms delay. - Added private async method
_purgeUIto purge components and roots with yielding. - Replaced synchronous
_onFinishRenderwith async_onPurgethat purges DOM tree map and yields. - Made
purgeGlobalsasync and added yields between purge calls.
- Updated
-
UIRootComponent:- Modified
notifyFinishRenderto only emit event without purging. - Made
purgeRootasync, purging UI components tree and DOM tree map with yields, and awaitingUIComponent.purgeGlobals.
- Modified
-
bones_ui_utils.dart:- Added
yeldutility function to yield to event loop for at least 1 millisecond.
- Added
-
UICapture:- Replaced all internal
_yeldcalls withyeldfrombones_ui_utils.dartfor consistent async yielding.
- Replaced all internal
3.0.0 #
-
Release v3.0.0
-
Dependencies:
- Updated
dom_toolsfrom^3.0.0-beta.19to^3.0.0. - Updated
dom_builderfrom^3.0.0-beta.11to^3.0.0. - intl_messages: ^3.0.0
- Updated
3.0.0-beta.20 #
-
UIEventHandler:- Added
unregisterEventListenerandclearEventListenersmethods.
- Added
-
EventHandlerPrivate:- Changed
_eventListenersto nullable and lazily initialized. - Added
_unregisterEventListenerand_clearEventListenersimplementations.
- Changed
-
ElementProviderandCSSProvider:- Updated calls to
buildDOMto includetreeMapandsetTreeMapRootparameters.
- Updated calls to
-
UIComponent:- Replaced
ExpandowithDualWeakMapfor static field_asyncRenderingZoneComponent. - Added
_domTreeMapfield anddomTreeMapgetter for lazy DOM tree mapping. - Added
domTreeMapIfInitializedgetter and staticdomTreeMapDummy. - Replaced
ExpandowithDualWeakMapfor_contentsUIComponents. - Updated parent setting methods to use named parameter
addToParent. - Added
_resolveParentFromParentUIComponentto better resolve_parent. - Updated many list conversions from
.toList()to.asListViewFixedfor performance. - Added
_onRenderand_onChangelazy event streams. - Added
_renderedUIRootsand_renderedUIComponentssets to track rendering. - Improved
_markRenderTimeand rendering finish notification logic. - Added
disposeand_recyclemethods for lifecycle management. - Added static
purgeGlobalsto clear global UI state. - Updated rendering and async content handling to use nullable collections.
- Updated event listener attachment to use
addEventListenerTyped.
- Replaced
-
bones_ui_extension.dart:- Added
ElementStreamExtensionandStreamSubscriptionExtensionto track subscriptions inDOMTreeMap.
- Added
-
UIDOMGenerator:- Updated
addExternalElementToElementandtoElementsto accepttreeMapandcontextparameters. - Updated calls to
buildDOMto passtreeMapandsetTreeMapRoot.
- Updated
-
UIRootComponent:- Changed
_uiComponentsTreeto nullable and lazily initialized. - Added
_onPurgedUIComponentscallback to dispose purged components. - Updated methods to safely handle nullable
_uiComponentsTree. - Added
purgeRootmethod to purge tree and global UI state.
- Changed
-
Added
_UIDOMTreeReferenceMapsubclass to prevent premature purging of components not fully initialized or disposed. -
UIButtonBaseandUIButtonLoader:- Updated event listener attachment to use
addEventListenerTyped. - Fixed null safety and type checks for button elements.
- Updated event listener attachment to use
-
UICapture:- Added new
CaptureDataFormat.urlOrBlobUrlformat. - Added
selectedFileDataAsURLOrDataURLBase64getter. - Updated
_readFileand_filterCapturedDatato support new format and improved async flow with_yeldhelper. - Updated
_CapturedDataclass to store optional MIME type and support new format. - Improved data format conversions to preserve MIME type.
- Added helper
_yeldfunction for async yielding.
- Added new
-
UIDialogBase:- Fixed background color style to use
rgbwhen alpha is 1.0.
- Fixed background color style to use
-
_CanvasEditImage:- Added delayed
_configurecall after construction. - Updated
_updateCanvasDimensionto return bool indicating if dimension changed. - Improved zoom and translate setters to avoid unnecessary renders.
- Added delayed
-
InputConfig:- Added optional
parentparameter to rendering methods. - Updated DOM building calls to pass
treeMapandsetTreeMapRoot. - Updated
_resolveValueTextto useparentfor intl message resolution.
- Added optional
-
UIInputTable:- Updated rendering of inputs and labels to pass
domTreeMapandsetTreeMapRoot.
- Updated rendering of inputs and labels to pass
-
UILoading:- Updated
asDIVElementbuildDOM calls to passtreeMapandsetTreeMapRoot.
- Updated
-
MasonryItemand_MasonryRenderItem:- Updated DOM generation calls to pass
treeMapandsetTreeMapRoot.
- Updated DOM generation calls to pass
-
UITemplateElementGenerator:- Updated DOM generation calls to pass
treeMap,context, andsetTreeMapRoot. - Updated template building to use
dsxResolutionenum instead of boolean flags.
- Updated DOM generation calls to pass
-
pubspec.yaml:- Updated dependencies:
web_utils: ^1.0.21dom_tools: ^3.0.0-beta.19dom_builder: ^3.0.0-beta.11swiss_knife: ^3.3.5statistics: ^1.2.1test: ^1.29.0test_api: ^0.7.9test_core: ^0.6.15build_web_compilers: ^4.4.11build_runner: ^2.11.1dependency_validator: ^5.0.4
- Updated dependencies:
3.0.0-beta.19 #
- dom_tools: ^3.0.0-beta.13
- dom_builder: ^3.0.0-beta.7
- web_utils: ^1.0.19
3.0.0-beta.18 #
-
UIDOMGenerator:toElements:- Fix resolution of
UIComponent, callingUIComponent.ensureRenderedbefore returnUIComponent.content.
- Fix resolution of
-
dom_builder: ^3.0.0-beta.6
3.0.0-beta.17 #
-
UIComponent:getFieldElementTyped: useasElementOfNullable.
-
web_utils: ^1.0.18
3.0.0-beta.16 #
-
UIDOMGenerator:addExternalElementToElement: improve external element resolution.attachFutureElement: improve element resolution.
-
js_interop_utils: ^1.0.9
-
web_utils: ^1.0.17
-
dom_tools: ^3.0.0-beta.12
-
dom_builder: ^3.0.0-beta.5
-
expressions: ^0.2.5+3
-
collection: ^1.19.1
-
test: ^1.28.0
-
test_api: ^0.7.8
-
test_core: ^0.6.14
-
build_web_compilers: ^4.4.3
-
build_runner: ^2.10.4
-
dependency_validator: ^5.0.3
3.0.0-beta.15 #
- Merge 2.5.21
InputConfig:- Added field
precision. - Added support for type
decimal.
- Added field
3.0.0-beta.14 #
- Merge 2.5.20:
UIComponent:- Optimize
findChildDeepwith a BFS queue.
- Optimize
3.0.0-beta.13 #
-
Merge 2.5.19:
UIComponent:_getContentChildrenImpl,_findInContentChildDeepImpl,_findChildrenDeepImpl,_listFieldsEntriesInContentDeepImpl: Switched to iterative breadth-first search for up to 10× faster element lookup in deep UI trees.getFields,getFieldElementByValue,getElementFieldName,getFieldsElementsMap,parseChildElementValue:- added parameter
resolveUIComponents = true.
- added parameter
-
test: ^1.26.3
-
test_api: ^0.7.7
-
test_core: ^0.6.12
3.0.0-beta.12 #
-
Merge 2.5.17:
UIDialog:- Added properties
autoScrollYandautoScrollX.
- Added properties
-
dom_tools: ^3.0.0-beta.11
-
swiss_knife: ^3.3.1
-
build_web_compilers: ^4.2.0
-
build_runner: ^2.5.4
3.0.0-beta.11 #
- Merge 2.5.16:
UIComponent:-
Optimized
subUIComponentsDeeplyandgetRenderedUIComponents- Both now return
Iterable<UIComponent>. subUIComponentsDeeplyis optimized as a lazysync*generator and recursively callssubElem.subUIComponentsDeeply.
- Both now return
-
Improve
_resolveUIRootComponent. -
_callRenderImpl: fix issue whenparentis passed on constructor but it's already appended in a sub-element. -
test: ^1.26.2
-
test_api: ^0.7.6
-
test_core: ^0.6.11
-
dependency_validator: ^5.0.2
-
3.0.0-beta.10 #
-
UISVG:- replace
createHTMLwithcreateElementfor SVG element creation.
- replace
-
UIComponent:- replace
appendwithappendChildfor DOM consistency.
- replace
-
js_interop_utils: ^1.0.8
-
web_utils: ^1.0.15
-
dom_tools: ^3.0.0-beta.10
-
archive: ^4.0.7
-
test: ^1.26.2
-
test_api: ^0.7.6
-
test_core: ^0.6.11
-
build_web_compilers: ^4.1.5
3.0.0-beta.9 #
-
Merge v2.5.15
UIComponent:- Added
renderedElementsAsync.
- Added
UIDialogBase:- Added
configureButtonsto configure the buttonsonClick. posRenderandposAsyncRendercallsconfigureButtons.
- Added
-
js_interop_utils: ^1.0.7
-
web_utils: ^1.0.14
-
dom_tools: ^3.0.0-beta.9
-
dom_builder: ^3.0.0-beta.4
-
archive: ^4.0.5
3.0.0-beta.8 #
-
web_utils: ^1.0.12
-
dom_tools: ^3.0.0-beta.8
-
project_template: ^1.1.1
-
archive: ^4.0.4
-
dependency_validator: ^5.0.2
3.0.0-beta.7 #
✨♻️ refactor(bones_ui_test_tools):
-
Standardize
selectNonTypedand rename it toselect. -
Standardize
selectNonTypedAll/selectAllNonTypedand rename it toselectAll. -
Ensure that
selectTypedexists wherequerySelectorTypedexists. -
web_utils: ^1.0.11
3.0.0-beta.6 #
-
Avoids using
identicalwithElement(JSObject) to avoid inconsistencies in Wasm. -
dom_tools: ^3.0.0-beta.7
-
dom_builder: ^3.0.0-beta.3
-
web: ^1.1.1
-
mercury_client: ^2.3.0
3.0.0-beta.5 #
- web_utils: ^1.0.9
- intl_messages: ^3.0.0-beta.1
- dom_tools: ^3.0.0-beta.5
- swiss_knife: ^3.3.0
- statistics: ^1.2.0
- resource_portable: ^3.1.2
- intl: ^0.20.2
3.0.0-beta.4 #
- js_interop_utils: ^1.0.6
3.0.0-beta.3 #
- web_utils: ^1.0.7
- mercury_client: ^2.2.5
3.0.0-beta.2 #
- web_utils: ^1.0.6
- dom_tools: ^3.0.0-beta.4
- dom_builder: ^3.0.0-beta.2
3.0.0-beta.1 #
-
CI: test with
dart2jsanddart2wasm(on Chrome). -
sdk: '>=3.6.0 <4.0.0'
-
js_interop_utils: ^1.0.5
-
web_utils: ^1.0.5
-
dom_tools: ^3.0.0-beta.3
-
dom_builder: ^3.0.0-beta.1
-
web: ^1.1.0
-
collection: ^1.19.0
-
test: ^1.25.15
-
stream_channel: ^2.1.4
-
lints: ^5.1.1
-
build_web_compilers: ^4.1.1
-
build_runner: ^2.4.15
2.5.21 #
InputConfig:- Added field
precision. - Added support for type
decimal.
- Added field
2.5.20 #
UIComponent:- Optimize
findChildDeepwith a BFS queue.
- Optimize
2.5.19 #
-
UIComponent:_getContentChildrenImpl,_findInContentChildDeepImpl,_findChildrenDeepImpl,_listFieldsEntriesInContentDeepImpl: Switched to iterative breadth-first search for up to 10× faster element lookup in deep UI trees.getFields,getFieldElementByValue,getElementFieldName,getFieldsElementsMap,parseChildElementValue:- added parameter
resolveUIComponents = true.
- added parameter
-
test: ^1.26.3
-
test_api: ^0.7.7
-
test_core: ^0.6.12
2.5.18 #
UIDialog:- Added properties
autoScrollYandautoScrollX.
- Added properties
2.5.17 #
-
Migrate to
archive: ^4.0.7. -
project_template: ^1.1.1
-
archive: ^4.0.7
2.5.16 #
-
UIComponent:- Optimized
subUIComponentsDeeplyandgetRenderedUIComponents- Both now return
Iterable<UIComponent>. subUIComponentsDeeplyis optimized as a lazysync*generator and recursively callssubElem.subUIComponentsDeeply.
- Both now return
- Improve
_resolveUIRootComponent. _callRenderImpl: fix issue whenparentis passed on constructor but it's already appended in a sub-element.
- Optimized
-
test: ^1.26.2
-
test_api: ^0.7.6
-
test_core: ^0.6.11
-
dependency_validator: ^5.0.2
2.5.15 #
-
UIComponent:- Added
renderedElementsAsync.
- Added
-
UIDialogBase:- Added
configureButtonsto configure the buttonsonClick. posRenderandposAsyncRendercallsconfigureButtons.
- Added
-
args: ^2.7.0
-
dependency_validator: ^4.1.3
2.5.14 #
-
bones_ui_test_tools.dart:_testUISleepUntilImpl: default timeout change from 1000 ms to 3000 ms.
-
sdk: '>=3.6.0 <4.0.0'
-
intl_messages: ^2.3.5
-
mercury_client: ^2.2.5
-
resource_portable: ^3.1.2
-
collection: ^1.19.0
-
test: ^1.25.15
-
stream_channel: ^2.1.4
-
build_web_compilers: ^4.1.1
-
build_runner: ^2.4.15
-
lints: ^5.1.1
2.5.13 #
UIComponent:requestRefresh: added optional parameterdelay.
2.5.12 #
-
UIComponent:- Optimize
parseClasses,configureClasses,appendClassesandappendStyle. _callRenderImpl: optimize check if parent contains content._normalizeRenderListValue: optimize type check order.- Improve null-safe code.
- Optimize
-
bones_ui_layout: optimize. -
dom_tools: ^2.3.2
-
dom_builder: ^2.2.7
-
swiss_knife: ^3.2.3
-
yaml: ^3.1.3
-
test: ^1.25.14
-
stream_channel: ^2.1.3
-
stack_trace: ^1.12.1
2.5.11 #
UIComponent:- Optimize
_notifyRendered. - Optimize
_scheduleCheckFinishedRendered.
- Optimize
2.5.10 #
-
sdk: '>=3.5.0 <4.0.0'
-
intl_messages: ^2.3.4
-
dom_builder: ^2.2.6
-
swiss_knife: ^3.2.2
-
statistics: ^1.1.3
-
mercury_client: ^2.2.4
-
extended_type: ^2.1.1
-
expressions: ^0.2.5+2
-
args: ^2.6.0
-
logging: ^1.3.0
-
path: ^1.9.1
-
test: ^1.25.13
-
test_api: ^0.7.4
-
test_core: ^0.6.8
-
stack_trace: ^1.12.0
-
build_web_compilers: ^4.1.0
-
build_runner: ^2.4.14
2.5.9 #
-
UIRootComponent:- Constructor:
- register at
_rootComponentInstances, usingWeakReference.
- register at
- Added
getInstances.
- Constructor:
-
UIComponent:_getUIComponentByContent,_getUIComponentByChild:- Search first through
UIRoot.getInstance()and also throughUIRootComponent.getInstances().
- Search first through
2.5.8 #
-
sdk: '>=3.4.0 <4.0.0'
-
intl_messages: ^2.3.1
-
statistics: ^1.1.1
-
extended_type: ^2.1.0
2.5.7 #
-
UIElementExtension:setValue: handleSelectElement.
-
dom_tools: ^2.3.1
-
archive: ^3.6.1
-
test: ^1.25.8
-
test_api: ^0.7.3
-
test_core: ^0.6.5
2.5.6 #
-
ElementExtension:resolveElementValue: optimize forInputElement.- Added
resolveInputElementValue.
-
UIComponent:- Added
selectElementsValues
- Added
-
dom_builder: ^2.2.5
-
test: ^1.25.7
-
test_api: ^0.7.2
-
test_core: ^0.6.4
2.5.5 #
-
New
UIRootComponent:- Implemented by
UIRootandUIDialogBase
- Implemented by
-
UIComponent:- Extends
UIRootComponent. - Added getter
uiRootComponent. - Added
renderingUIComponent: returns the current rendering component in the stack, - Added
parentRenderingUIComponent: can resolve asynchronous parent renderer. _construct: improved parentUIComponentresolution.resolveTextIntl: improve resolution ofuiRootand call tointlMessageResolver.
- Extends
-
UIDialogBaseextendsUIRootComponent:getRenderedUIComponentById,getRenderedUIComponents: fix resolution of childUIComponents.
-
UIInputTable:- Added field
scrollToInvalidElement.
- Added field
-
InputConfig:- Added field
labelVerticalAlign
- Added field
-
dom_builder: ^2.2.3
-
archive: ^3.5.1
-
args: ^2.5.0
-
test: ^1.25.5
-
test_core: ^0.6.2
2.5.4 #
-
New
UIComponentDOMContext. -
UIDOMGenerator:- Optimize
attachFutureElementusingUIComponentDOMContext.uiComponentto resolveparentComponent.
- Optimize
-
mercury_client: ^2.2.2
-
test: ^1.25.3
-
test_api: ^0.7.1
-
test_core: ^0.6.1
-
build_web_compilers: ^4.0.10
-
build_runner: ^2.4.9
2.5.3 #
-
testUI:- Fix
tearDownAll, declared beforesetUpAll(before call tospawnHybridUri).
- Fix
-
SpawnHybrid: added fieldfinalizer.
2.5.2 #
UIElementExtension:- Fix
setValueforcheckbox.
- Fix
2.5.1 #
bones_ui_web:setValue: Update handling ofCheckboxInputElement.
2.5.0 #
-
sdk: '>=3.3.0 <4.0.0'
-
intl_messages: ^2.3.0
-
dom_tools: ^2.3.0
-
json_render: ^2.1.0
-
swiss_knife: ^3.2.0
-
statistics: ^1.1.0
-
project_template: ^1.1.0
-
intl: ^0.19.0
-
test: ^1.25.2
-
test_api: ^0.7.0
-
test_core: ^0.6.0
-
build_web_compilers: ^4.0.9
-
build_runner: ^2.4.8
2.4.1 #
-
UIDialog:- Added
getAllDialogsandremoveAllDialogs.
- Added
-
mercury_client: ^2.2.1
-
swiss_knife: ^3.1.6
-
archive: ^3.4.10
-
build_web_compilers: ^4.0.8
2.4.0 #
-
New
bones_ui_web.dart:- Avoid imports to
dart:htmlin preparation to use ofdart:webor other alternatives. - New typedef
UINodeandUIElement.
- Avoid imports to
-
Replace usage of
ElementtoUIElementandNodetoUINode. -
UIComponent:- Constructor:
- parameter
parentnow acceptsElementorUIComponent.
- parameter
toContentElements: changed to named parameters.
- Constructor:
-
intl_messages: ^2.2.3
-
dom_tools: ^2.2.0
2.3.3 #
-
UIComponent:- Optimize:
getFields,parseChildElementValueandgetFieldExtended.
- Optimize:
-
ElementExtension:- Optimize:
resolveElementValue
- Optimize:
-
intl_messages: ^2.2.2
-
path: ^1.9.0
2.3.2 #
UIDialogBase,UIDialog:- Added
onClickListenOnlyForDialogButtonClassto constructor.
- Added
2.3.1 #
UITestChain- Added
selectUntil
- Added
2.3.0 #
-
selectFirstWhereUntil:
- Removed parameter
expected. - Throw exception when can't select element.
- Removed parameter
-
sdk: '>=3.2.0 <4.0.0'
-
intl_messages: ^2.2.1
-
archive: ^3.4.9
2.2.8 #
UITestChainNode:- Added:
selectWhere,selectFirstWhere,selectWhereUntil,selectFirstWhereUntil.
- Added:
2.2.7 #
- statistics: ^1.0.26
- expressions: ^0.2.5+1
- archive: ^3.4.7
- test: ^1.24.9
- test_core: ^0.5.9
- build_web_compilers: ^4.0.6
2.2.6 #
UINavigableContent: addedstyleto constructor.- Fix
UIMasonry. - Fix
$uiSVG. UINavigator:clearDetachedNavigables: added parameterignore.
- dom_builder: ^2.2.2
2.2.5 #
- dom_builder: ^2.2.1
- archive: ^3.4.2
- dependency_validator: ^3.2.3
2.2.4 #
-
Bones_UI CLI:
- Added options
--enable-deferred-librariesand--disable-deferred-libraries.
- Added options
-
BonesUITestRunner: added fieldenableDeferredLibraries. -
Fix typos.
-
archive: ^3.3.8
2.2.3 #
-
UIDialogBase:- Execute the
onClicklisteners of the buttons asynchronously (to allow custom listeners to be executed 1st).
- Execute the
-
dom_builder: ^2.2.0
2.2.2 #
-
UIComponent:- Added
selectElementandselectElements: aliases toquerySelectorandquerySelectorAll. getField: add parameterdef.- Added
getFieldAs. - Added
getFieldsGroupEntriesByPrefix,getFieldsGroupListByPrefix,getFieldsGroupByPrefix. - Added
getFieldsGroupKeysByPrefix,getFieldsGroupValuesByPrefix. - Added
getFieldsGroupChecks,getFieldsGroupCheckedKeys.
- Added
-
Dart CI: update and optimize jobs.
-
intl_messages: ^2.2.0
-
statistics: ^1.0.25
-
test: ^1.24.6
-
test_core: ^0.5.6
2.2.1 #
-
SelectElementExtension: addedselectedOptionsSafe. -
ElementExtension.resolveElementValue:- Handle bug on
SelectElement.selectedOptionscallingselectedOptionsSafe.
- Handle bug on
-
intl_messages: ^2.1.15
-
resource_portable: ^3.1.0
2.2.0 #
-
UIComponent:- Expose
getContentUIComponent addTo,insertTo,setParent: new parameterparentUIComponent.- New static function
resolveParentUIComponent.
- Expose
-
UIDOMGenerator:- New
_resolveParentUIComponent.
- New
-
UIInputTable:_addTableRowCell: callUIComponent.resolveParentUIComponentfor child elements.
-
sdk: '>=3.0.0 <4.0.0'
-
intl_messages: ^2.1.14
-
dom_builder: ^2.1.9
-
collection: ^1.17.2
-
args: ^2.4.2
-
logging: ^1.2.0
-
test: ^1.24.4
-
test_api: ^0.6.1
-
test_core: ^0.5.4
-
stream_channel: ^2.1.2
-
stack_trace: ^1.11.1
-
build_web_compilers: ^4.0.4
-
build_runner: ^2.4.6
-
lints: ^2.1.1
2.1.25 #
- dom_tools: ^2.1.17
- dom_builder: ^2.1.8
2.1.24 #
UIComponent:- Added
requestRefresh.
- Added
UIButtonandUIButtonLoader:- Changed
texttobuttonContent textgetter/setter now is anStringalias tobuttonContent.
- Changed
UICalendar,UIColorPicker,UIMasonry,UIMultiSelection:- Call
requestRefreshwhen possible
- Call
UIMultiSelection:- Constructor: added parameter
selectionsfor initial selections. - Added field
autoInputFontShrink.
- Constructor: added parameter
- intl_messages: ^2.1.6
- dom_tools: ^2.1.16
2.1.23 #
- New
UIDialogEditImage. UICapture:- Added field
photoEditorandeditCapture.
- Added field
- intl_messages: ^2.1.5
- intl: ^0.18.1
2.1.22 #
- Allow nullable
parentin components:UIButtonCapture,UIInfosTable,UIMasonry,UIMenu,BUIManifestRender.
- Fix
toContentElementsandtoRenderableList:- Ensure that always return a casted
List<dynamic>.
- Ensure that always return a casted
- intl_messages: ^2.1.4
- dom_tools: ^2.1.15
- yaml: ^3.1.2
- args: ^2.4.1
- test: ^1.24.2
- test_api: ^0.5.2
- test_core: ^0.5.2
2.1.21 #
- swiss_knife: ^3.1.5
- intl_messages: ^2.0.7
- dom_tools: ^2.1.14
- dom_builder: ^2.1.7
- archive: ^3.3.7
- resource_portable: ^3.0.2
2.1.20 #
InputConfig:- Added field
labelStyle.
- Added field
UIInputTable:- Added field
tableClasses,tableStyle.
- Added field
- dom_builder: ^2.1.6
2.1.19 #
UIDialog:- Tag
ui-dialog:- added attribute
remove-on-hide.
- added attribute
- Tag
- dom_builder: ^2.1.5
- swiss_knife: ^3.1.4
2.1.18 #
InputConfig:textare: width: 100%select: max-width: 100%
- dom_builder: ^2.1.4
2.1.17 #
Navigation:- Added
encodeParameters,encodeRouteAndParametersandrouteAndParameters.
- Added
2.1.16 #
UIComponent:- Added static getter
domContext.
- Added static getter
- dom_tools: ^2.1.13
- dom_builder: ^2.1.3
- archive: ^3.3.6
- args: ^2.4.0
- logging: ^1.1.1
2.1.15 #
BonesUITestRunner:_processJsonReportFile:- Allow suites with paths ending with
.dart, not only_test.dart.
- Allow suites with paths ending with
- intl_messages: ^2.0.6
2.1.14 #
UITestChain:- Added
checkbox.
- Added
2.1.13 #
UIRoot:- Added field
name.
- Added field
bones_ui_test_tools.dart:- Added
testMultipleUI. testUISleepUntilRoute,sleepUntilRoute:- Added
parametersandpartialParameters.
- Added
UITestContext:- Added
setTestWindowTitle.
- Added
testUI:- Now updates the
window.top.titlefor eachtest(...).
- Now updates the
- Added
bones_ui_test_cli.dart:- Compatibility with
testMultipleUIand saving oflogDocumentto the log directory.
- Compatibility with
- test: ^1.23.1
- test_core: ^0.4.24
2.1.12 #
bones_ui_test_tools.dart:- Using
Chain.capturefor betterStackTrace.
- Using
- Added linter rules:
avoid_dynamic_calls.avoid_type_to_string.no_runtimeType_toString.no_adjacent_strings_in_list.
- dom_tools: ^2.1.11
- stack_trace: ^1.11.0
2.1.11 #
- Test Tools:
testUISleepUntilandsleepUntil:- Now accepts
FutureOr<bool>return in thereadyfunction.
- Now accepts
testUISleepUntilElement,sleepUntilElementandexpectElement:- Added
mapperparameter.
- Added
bones_ui_test:- Show
doneevent at the end of the tests if--log-directoryis passed.
- Show
2.1.10 #
bones_ui_test_tools.dart:UITestChainwithIterableelement:- Added
elementsLengthexpectElementsLength,elementAt,first,firstOr
- Added
- Moved from extension to
UITestChain:click,setValueandselectIndex.
_mergeStackStraces:- Remove some bottom lines from
stack1(afterTestFutureExtension.thenWithStackTrace).
- Remove some bottom lines from
bones_ui_test_cli.dart:_DocumentLog:- Now appending to the document
<title>the loggingid.
- Now appending to the document
2.1.9 #
ElementExtension:- added
dispatchChangeEvent.
- added
- Added
SelectElementExtension:selectIndex.
BonesUITestRunner:- Fix copy of
builddirectory when it's already populated. - Improved console logging.
- Fix copy of
UITestChain:- Added
selectIndex,where.
- Added
UITestChainNode:- Added
elementAs.
- Added
- Added
TestNodeExtension(ondart:html.Node):simplify.
2.1.8 #
UITestChain:- added
logDocument.
- added
BonesUITestRunner- Added
logDirectory.
- Added
2.1.7 #
UIField:- Added
setFieldValue.
- Added
UIComponent:- Added
click.
- Added
UIRoot:- Added
isTest.
- Added
bones_ui_test_tools.dart:- Added
testUIandUITestContext. - Added
SpawnHybrid. - Added
UITestChaintools.
- Added
- dom_tools: ^2.1.10
- test: ^1.22.2
- test_api: ^0.4.18
- test_core: ^0.4.22
- stream_channel: ^2.1.1
2.1.6 #
bones_ui_test(cli):- Added selected tests path to the arguments passed to the
testrunner.
- Added selected tests path to the arguments passed to the
2.1.5 #
InputConfig:- Fix
getInputConfigwhen field was not found.
- Fix
- expressions: ^0.2.5
- mercury_client: ^2.1.8
- dom_tools: ^2.1.9
- json_object_mapper: ^2.0.1
2.1.4 #
UIRoot:- Added
close,closeOperations,renderClosed,isClosed.
- Added
UIComponent:refresh: added parameterforceRender.clear: added parametersforceandremoveFromParent.
2.1.3 #
- swiss_knife: ^3.1.3
- intl_messages: ^2.0.5
- json_render: ^2.0.5
- intl: ^0.18.0
- resource_portable: ^3.0.1
- build_runner: ^2.3.3
2.1.2 #
bones_uiCLI:- Command
test:- Now calls
dart run bones_ui:bones_ui_testexecutable to run the tests.
- Now calls
- Command
2.1.1 #
bones_ui_test_cli:- Use absolute paths to resolve directories and files.
2.1.0 #
bones_uiCLI:- Added
testcommand, for Bones_UI unit tests.
- Added
- Added libraries:
bones_ui_testto import the Bones_UI Test tools.bones_ui_test_clitto import the Bones_UI Test CLI (used bytestcommand).
UIComponent- Added
waiteRender,callRenderAndWait,querySelector,querySelectorAll.- These methods can be useful in unit tests.
- Added
ElementExtension:- Fix
UINavigatorbehavior whenfindNavigablecan't find aUINavigableComponentfor the route. - intl_messages: ^2.0.4
- dom_tools: ^2.1.8
- archive: ^3.3.5
- test: ^1.22.0
- test_api: ^0.4.17
- test_core: ^0.4.21
- path: ^1.8.3
2.0.27 #
UIInputTable:- Exposing
onChangeTriggerDelayin the constructor. - Fix
onChangebased onInteractionCompleter: wasn't notifying to theInputConfig.onChangeListener.
- Exposing
- Added pre-defined filed validators:
FieldLengthValidator,fieldEmailValidator,fieldURLValidator,fieldURLDataBase64Validator.
- Added filed normalized:
fieldNormalizerTrim.
- Added
FieldNormalizerGroupandFieldValidatorGroup. - extended_type: ^2.0.1
2.0.26 #
UICapture:- Added
captureAspectRatio.
- Added
- test: ^1.22.0
2.0.25 #
UICapture:- Added
CaptureDataFormat.url. - Field
_selectedFileDatais now an internal_CapturedDatacapable to handle different interchangeable data formats. - Added field
captureMaxWidthandcaptureMaxHeightfor maximum captured image size. - Added field
photoScaleMimeTypeandphotoScaleQualityfor scale operations.
- Added
UIComponent:- Optimized
configureClasses. - Show error message when trying to render an
InputConfig.
- Optimized
- swiss_knife: ^3.1.2
- mercury_client: ^2.1.7
- archive: ^3.3.4
2.0.24 #
UIDialogBase:- Added
selectDialogButtonsandisDialogButtonfor better dialog button definition.
- Added
UIDialog:dialogContentnow can benullandrenderContentshould be overwritten.
2.0.23 #
InputConfig: added fieldchecked.UIDialog: added parameteridto constructor.- dom_builder: ^2.1.2
2.0.22 #
UIRoot:- Expose parameter
super.clearParent. - Added
readyTimeout: allows personalization ofisReadytimeout.
- Expose parameter
- dom_tools: ^2.1.7
2.0.21 #
InputConfig:- Added
onActionListener: triggered when the element is clicked or ENTER is pressed.
- Added
- dom_tools: ^2.1.6
- archive: ^3.3.2
- collection: ^1.17.0
- logging: ^1.1.0
- build_web_compilers: ^3.2.7
- build_runner: ^2.3.2
- lints: ^2.0.1
- sdk: '>=2.18.0 <3.0.0'
2.0.20 #
- Improve logging.
- Integrate with package
logging. - logging: ^1.0.2
2.0.19 #
UIDialogBase: added parameterremoveFromDomOnHide.UIComponent: addedfocusField.- dom_builder: ^2.1.1
2.0.18 #
InputConfig:inputRender: Added support to renderDOMElement.
- archive: ^3.3.1
- test: ^1.21.6
- path: ^1.8.2
- build_web_compilers: ^3.2.6
- build_runner: ^2.2.1
- sdk: '>=2.17.0 <3.0.0'
2.0.17 #
UICapture:- Added constructor parameter
selectedFileData. - Added setter
selectedFileData.
- Added constructor parameter
InputConfig:_renderSelect: selected element can also match theoptionskey frominputValue.
2.0.16 #
- Renamed
findInContentFieldComponentDeeptofindChildDeep. - Added
findChildrenDeep. - Added
getFieldElementsandgetFieldElementByValue.
2.0.15 #
UIButtonLoader:- Now resolves
intlmessages forokMessageanderrorMessage.
- Now resolves
UIComponent:- Added
resolveTextIntl.
- Added
2.0.14 #
- Added
UIComponentsDOMElementhelpers:$uiButton,$uiDialog,$uiSVG.
- dom_builder: ^2.1.0
- expressions: ^0.2.4
- lints: ^2.0.0
- dependency_validator: ^3.2.2
- test: ^1.21.4
2.0.13 #
UIField:- Added
String get fieldName. getFieldValuecan now return types other thanString.
- Added
UIDialog:- Added
blockScrollTraversing.
- Added
- New components
UICalendarandUICalendarPopup. InputConfig:- Now supports
IntlMessagesin texts.
- Now supports
- Improved example.
- mercury_client: ^2.1.6
- intl_messages: ^2.0.3
- dom_tools: ^2.1.3
- dom_builder: ^2.0.10
- mercury_client: ^2.1.6
- build_runner: ^2.1.11
- yaml: ^3.1.1
- args: ^2.3.1
2.0.12 #
- Improve
UIColorPickerInputandUIInputTable. InputConfig:- Added support for
IntlMessageskeys for select options. - Added
onChangeListener.
- Added support for
UIRoot:- Add default call to
initializeDateFormattingwhile callinginitializeLocale.
- Add default call to
- dom_tools: ^2.1.2
2.0.11 #
- Improved GitHub CI.
- swiss_knife: ^3.1.1
- mercury_client: ^2.1.5
- intl_messages: ^2.0.2
- json_render: ^2.0.4
- archive: ^3.3.0
2.0.10 #
- Added extensions:
ElementExtension,IterableElementExtensionandIterableUIComponentExtension. - Improved resolution of
UIComponentfrom anElement. UINavigator:- Added
equalsToCurrentRouteandequalsToCurrentRouteParameters.
- Added
- dom_tools: ^2.1.1
- dom_builder: ^2.0.9
2.0.9 #
UIComponent:- New
uiRootgetter. - Improve
parentUIComponentresolution.
- New
UIRoot.renderLoadingnow is the default render for loading childrenUIComponents.- dependency_validator: ^3.1.0
2.0.8 #
- Dart
2.16:- Organize imports.
- Fix new lints.
- sdk: '>=2.15.0 <3.0.0'
- json_render: ^2.0.2
- dom_tools: ^2.1.0
- mercury_client: ^2.1.3
- args: ^2.3.0
2.0.7 #
- dom_builder: ^2.0.8
2.0.6 #
- Added helper
$uiLoading. - Improved
Elementfield name resolution: now also accepts thenameattribute for<input>elements. - mercury_client: ^2.1.1
- dom_builder: ^2.0.7
2.0.5 #
- Updated
bones_ui_app_template.tar.gz.
2.0.4 #
- Added CLI
bones_ui.- Added
Bones_UI Apptemplate.
- Added
- Re-factor.
- Files structure.
- Change from package
pedantictolints.
- Improve example.
2.0.3 #
ui-template:- Allow DOM elements in template.
DSXintegration.- Better resolution of variables and blocks.
- Allow simple variables outside
ui-template.
ui-button:- Added attributes:
loaded-text-class,loaded-text-error-class,loaded-text-error-classes,button-class
- Added attributes:
- New registered tag:
ui-svg - dom_builder: ^2.0.6
- swiss_knife: ^3.0.8
2.0.2 #
- swiss_knife: ^3.0.7
- mercury_client: ^2.0.3
- sdk: '>=2.13.0 <3.0.0'
2.0.1 #
- Sound null safety compatibility.
- dynamic_call: ^2.0.1
- mercury_client: ^2.0.1
- intl_messages: ^2.0.1
- dom_tools: ^2.0.1
- json_render: ^2.0.1
- html_unescape: ^2.0.0
- enum_to_string: ^2.0.1
- collection: ^1.15.0
2.0.0-nullsafety.0 #
- Initial compatibility with Null Safety.
- Better render of async content.
dom_buildercompatibility.- removed PWA support (waiting null safety of package
service_worker).
1.2.0 #
UIComponent:- Optimized performance of
rendercall tree. - Support to
rendervalues of typeFuture.- Methods
renderLoadingandrenderErrorforFuturevalues.
- Methods
- Improved
getFieldsandparseElementValue(addedparseChildElementValue). - New fields:
preserveRender,subUIComponents,subUIComponentsDeeply,refreshOnNavigate.
- New methods:
getRenderedElementById,getRenderedUIComponentById,getRenderedUIComponentsByIds,getRenderedUIComponentByType,getRenderedUIComponents.isAnyComponentRendering.
- Optimized performance of
UIRoot:- Adde
renderAlertandalert. - New
DOMTreeReferenceMapto control handling ofUIRoottree of components andcontentelements.
- Adde
UINavigator:- Added
navigateToMainRouteandnavigableRoutesAndNames.
- Added
UIComponentAsync:- Added field
cacheRenderAsync.
- Added field
UIAsyncContent:- Added
errorfield. - Now accepts
Functionas content.
- Added
UILoadingConfig: improve constructors.UIButtonLoader:- Added properties:
buttonClassesandbuttonStyle.
- Added properties:
- Helper:
$ui_button_loader. UIButtonCapturePhoto:- New fields
buttonContent,selectedImageClasses,selectedImageStyleandonlyShowSelectedImageInButton. - Changed to call code moved to
dom_tools.
- New fields
- swiss_knife: ^2.5.24
- dynamic_call: ^1.0.16
- mercury_client: ^1.1.16
- intl_messages: ^1.1.13
- dom_tools: ^1.3.20
- dom_builder: ^1.0.24
- json_render: ^1.3.8
- enum_to_string: ^1.0.14
1.1.1 #
- Improved
BUIRender:- Added support for
IntlMessageskeys in the BUI Code:{{intl:keyX}} - Improve route support.
- Added support for
- Improved
UILoadingConfig. UIButtonLoader: using all properties ofUILoadingConfig.UIDialogBase.show: ensure that is in DOM.UITemplateElementGenerator: support tointl.UIDOMActionExecutor: implementation ofcallLocale.UINavigableComponent: check changed route to notify also when rendering.- swiss_knife: ^2.5.18
- dynamic_call: ^1.0.14
- mercury_client: ^1.1.13
- intl_messages: ^1.1.12
- dom_tools: ^1.3.15
- dom_builder: ^1.0.22
1.1.0 #
- Added
UIButtonLoader. - Added
UIMasonry. - Added
UIDocument. - Added
UILoadingand loading elements. - Added
UIDialogInput. - Added
htmlAsSvgContent. UIMultiSelection: added attributemulti-selection.- Added
BUIRender: render framework ofbuifiles andbui-manifesttree. - Improved
UIDialogandUIDialogBase. - swiss_knife: ^2.5.16
- dom_tools: ^1.3.14
- dom_builder: ^1.0.20
- json_render: ^1.3.7
- json_object_mapper: ^1.1.3
- Added dependency: archive: ^2.0.13
- Removed dependency
mustache_template. Usingdom_buildertemplates.
1.0.20 #
- Changed library:
bones_ui: exports onlybones_uicomponents and base classes.bones_ui_kit: exportsbones_uiand other packages likeswiss_knife,dom_builder,dom_toolsandmercury_client
1.0.19 #
UIInputTable:actionListenerComponentandactionListener.- mercury_client: ^1.1.12
1.0.18 #
- Better behavior of
UINavigableComponentwhenUIRootmakes the 1st render, and the route is not accessible and redirected to another route. - Fixed navigation to a route not registered yet (when
UIRootdoes the 1st render). - Avoid 'loop' of navigations to the same route.
- swiss_knife: ^2.5.13
1.0.17 #
- Added support to
DataSourceintoUIComponent. - Added
UIMenuandUIPopupMenu: Creates a top menu with popups and icons. - Added
UISVG: Renders SVG links or tags. - Added
UIDataSource: Connects aDataSourcetoUIComponent. - Added
UIColorPickerInput: A simple and compact color picker component. - Added placeholder support into
InputConfig. UIInfosTable:headerColumnsNames,headerColor,rowsStyles,cellsStyles.- swiss_knife: ^2.5.12
- dynamic_call: ^1.0.12
- mercury_client: ^1.1.10
- intl_messages: ^1.1.10
- dom_tools: ^1.3.9
- dom_builder: ^1.0.17
- json_render: ^1.3.5
- json_object_mapper: ^1.1.2
- mustache_template: ^1.0.0+1
1.0.16 #
UIDialog: handle closing/cancel buttons.UIMultiSelection: fix when selecting all entries and showing an unnecessary<hr>._allowInputValuenow triggersonChange.- swiss_knife: ^2.5.7
- mercury_client: ^1.1.9
- dom_tools: ^1.3.5
1.0.15 #
- dartanalyzer.
1.0.14 #
- Refactor: move components implementations to directory
components. - Added
UIControlledComponentsetupControllersOnChange. UIMultiSelection: mutable options; options panel with scroll bars.- Usage of
IntlBasicDictionaryfor some messages. - dartfmt.
- swiss_knife: ^2.5.6
- intl_messages: ^1.1.9
1.0.13 #
- Renamed
UIButtontoUIButtonBase. - Renamed
UISimpleButtontoUIButton. UIDialog: improved implementation.UICapture: Added generic file support.- dartfmt.
- swiss_knife: ^2.5.5
- dom_tools: ^1.3.4
- dom_builder: ^1.0.13
- json_render: ^1.3.4
- mercury_client: ^1.1.8
1.0.12 #
- Removed UICodeHighlight.
- dom_tools: ^1.3.2
- json_render: ^1.3.3
1.0.11 #
- Remove debugging code: UIConsole.enable();
1.0.10 #
- dom_builder: ^1.0.7
- Update README.md to indicate
bones_ui_bootstrap.
1.0.9 #
- Fix README LICENSE title.
1.0.8 #
- dartfmt.
- Fix typos.
1.0.7 #
- Added API Documentation.
- Updated LICENSE.
- UISimpleButton
- UIButtonCapturePhoto
- UICapture: now handles loaded data and converts to a CaptureDataFormat type.
- UIExplorer: modelType catalog.
- UIComponent: better automatic resolution of parentUIComponent
- UIComponent: fields are views now. Removed UIComponent._fields Map.
- InputConfig: now renders the components (moved from UIInputTable).
- getLanguageByExtension(): fixed markdown extension.
- json_render: ^1.3.2
- dom_tools: ^1.3.1
- dom_builder: ^1.0.6
- intl_messages: ^1.1.8
- mercury_client: ^1.1.7
- swiss_knife: ^2.5.2
1.0.6 #
- UIRoot with better load of locales.
- UIComponent._parentUIComponent better populated.
- UIComponent.isShowing
- UIComponent.isRendered() -> UIComponent.isRendered
- UIAsyncContent doesn't accept anymore as sub content another UIAsyncContent (throws StateError).
- UIInputTable now when re-rendering respects previous set values.
- UIRoot.buildAppStatusBar()
- getLanguageByExtension()
- mercury_client: ^1.1.4
- swiss_knife: ^2.3.9
- intl_messages: ^1.1.6
- dom_tools: ^1.2.7
- json_render: ^1.2.7
- yaml: ^2.2.0
1.0.5 #
- UIComponent: accepts null parent (will be set when rendered by parent).
- UIComponent.onChange: should be called every time a component status changes or interactive event happens.
- UIAsyncContent.equalsProperties() now makes deep check.
- UIControlledComponent
- UIComponentAsync
- swiss_knife: ^2.3.8
1.0.4 #
- UIComponent.isRendering
- UIMultiSelection: fix options panel position on window resize. onTouchEnter/onTouchLeave
- UINavigableComponent: alerts/exception for empty route.
- dom_tools: ^1.2.6
- swiss_knife: ^2.3.7
- intl_messages: ^1.1.5
1.0.3 #
- UIComponent.parentUIComponent
- UIComponent.onChildRendered()
- Navigation.parameterAsInt/parameterAsNum/parameterAsBool
- Navigation.parameterAsStringList/parameterAsIntList/parameterAsNumList/parameterAsBoolList
- UINavigator._encodeRouteParameters(): Comma ',' won't be encoded as %2C
- swiss_knife: ^2.3.5
1.0.2 #
- of prefix 'ui-' for css.
1.0.1 #
- UIAsyncContent.isValid(properties]): properties optional.
- Declaration of UIRoot.renderMenu() optional.
1.0.0 #
- Initial version, created by Graciliano M. P. (Jan 2019)