Repository navigation
Releases
0.6.9
Fixed
- The session watch reads a submitted form's
methodandtargetcontent
attributes, so a form that holds a control namedtargetormethod
no longer throwstarget.toLowerCase is not a functionon submit, and
the watch still tells whether the form loads the next document in its
tab (#660).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.8
Fixed
- Hovering a day of the date range picker repaints the range's preview on
the days drawn, where it drew both months again. The day that holds the
keyboard focus keeps it while the pointer moves, and a control a test or
an assistive technology holds stays the same element (#650). - A tab that signs out lands on the signed-out page when the session
watch's read answers401during the sign-out. The watch no longer
sends a page whose own form is already loading the next document to the
expired sign-in page; it tells the other tabs, which still leave for
sign-in with their own address asreturn(#654).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.7
Changed
- The live regions of the copy button, the code editor's status line, the
identifier, the top bar's search, the decision dock, the upload field and
Your preferences' saved mark are<output>elements; the code box, the
self-description, the document pane's raw text, a refusal's evidence and
the decision dock are named<section>elements; the user menu's
separator is an<hr>. Each keeps the role the ARIA attribute gave it,
and draws as before. A console script or test that selected one by
[role="status"],[role="region"]or[role="separator"]selects it by
its element (#624). fui-unitandfui-nowrapkeep their text whole from the stylesheet's
utilitieslayer, which comes after every component rule, in place of
!important, so a console's own unlayered rule can now override them. The
menu sheet's title, the lockup's accent word and the phone's Keyboard tab
hold by the cascade alone, and draw as before (#626).- The pager's range, the filter's count, the countdown's set points, the
topology's zoom level, the busy spinner and skeleton lines and the date
pickers' status lines are<output>elements; the data table's,
compare's, line diff's and root matrix's scroll boxes are named
<section>elements, and the reading pane's<section>drops its
redundant role; the action menu's and the filter menu's separators are
<hr>elements. Each keeps its role and draws as before. A console
script or test that selected one by[role="status"],[role="region"]
or[role="separator"]selects it by its element, and
scripts/checks/markup-rules.sh(M6) refuses a new such role unless a
NOTE:beside it says why the element keeps it (#639).
Fixed
- The top bar's typeahead shows its unreadable-answer sentence for an OK
reply it cannot read (anullanswer,groupsthat is not a list, a
group with no list of hits), where it said "The search did not answer
(undefined)." or stopped at "Searching…" (#633).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.6
Added
view::line_diff::line_diff(locale, file, diff)draws one file's unified diff (B11) in the code viewer's box: each line with its numbers before and after, a removed line marked "−" on the bad tone's ground and an added line "+" on the ok tone's, each with its word for a screen reader, the hunk heads as muted rows, and long lines scrolling sideways inside the box (#598).table::change::plain_change(locale, before, after)writes a history row's change in prose, as the design draws it (R22): the value before struck through as adelafter "−" and the word "was", the value after as aninsafter "+" and "now", and a side that isNoneleft out (#602).
Changed
table::change::change_table(locale, caption, key, changes)takes its key column's heading askey,Nonekeeping the library's "Setting", andchange_table_keyedis gone: a console callschange_tablewithSome(heading), such as "File" for a revision's changed files (#598).
Fixed
- A date picker moves the focus to the chosen day at once when it draws its grid again, so a key pressed right after a day is clicked, such as Escape, reaches the picker and no longer falls to the page (#599).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.5
Changed
- A component's form is an argument of its one function or a field of what it draws, and the drawn HTML is unchanged.
table::view::DataTablecarries itsshape(aShape) and is built withDataTable::new(caption, columns, body),.with_sortingand.with_shape;KeyedComboboxcarries itsremotesearch.title_cell(level, href, name, sub)takes anOption<u32>level,view::dialog::confirm_dialog(locale, confirmation, stakes, form, confirm)itsStakesand an optionalConfirmForm,info_dialog(locale, explanation, body, width)aWidth,view::compare::compare(locale, table, presentation)aPresentation,view::side_panel::side_panel(panel, shortcut),view::shortcuts::shortcut_legend(locale, groups, go_to)andview::secret::secret_state(locale, state, id)anOption,calendar::Moment::parse(text, with_time, order)aDateOrderandtable::model::Paging::write(query, sizes)the console'sSizes.docs/consoles.mdlists each call (#579). tabledraws with the view primitives and no module ofviewimportstable, so four parts moved and each console moves its imports at its next pin:view::change,view::mappingandview::versionsaretable::change,table::mappingandtable::versions;view::browser::browser_findistable::filter::browser_find;table::filter::FilterMenu,FilterChoice,MenuFormandfilter_menuare inview::filter_menu; andtable::model::PAGE_KEY,SIZE_KEY,SORT_KEYandORDER_KEYare inquery. The drawn HTML is unchanged (#580).view::flow,view::chart,view::topology,view::tree,view::dateandcalendarare module folders with one file per concern, so no library file is over 800 lines, and eight chart and six tree items moved, each console moving its imports at its next pin:view::chart::has_gapsandline_svgare inview::chart::line,tick_labelandvalue_labelinview::chart::scale,FiguresWordsandfiguresinview::chart::figures, andLegendEntryandlegendinview::chart::legend;view::tree::Shown,in_sight,path_key,path_keys,Moveandmovedare inview::tree::path. Every other item keeps its path, and the drawn HTML is unchanged (#581).view::dialog::Modaltakesstakes: Stakesin place ofdanger: bool, the same choice the confirmation dialog takes, so each console writesstakes: Stakes::DangerorStakes::Plainat its next pin. The drawn HTML is unchanged (#587).- The layouts have one owner,
view::layout:view::surface::splitisview::layout::split, the grids, the cluster and the Add row areview::layout::Arrangement, andview::surface::Containerdraws the surfaces only (Card,PanelBody,PanelSections,Well). Each console moves its calls at its next pin; the drawn HTML is unchanged (#588).
Removed
- The component functions that only fixed an argument of another are gone; each console calls the general function with the argument at its next pin.
view::surface::stack: callview::layout::stack_at(Gap::Loose, children).view::surface::grid,grid_start,stat_grid,clusterandadd_row: callwrapon theview::layout::Arrangementof the same name.view::surface::panel,panel_body,panel_sectionsandwell: callwrapon theview::surface::Containerof the same name (Container::Card.wrap(body)forpanel).table::view::data_table_wideanddata_table_unstacked: calldata_tableon a tablewith_shape(Shape::Wide)orShape::Unstacked.table::view::title_cell_at: calltitle_cell(Some(level), ..).view::dialog::danger_dialoganddanger_form_dialog: callconfirm_dialogwithStakes::Dangerand the form.view::compare::compare_stackedandcompare_pair: callcomparewithPresentation::Stacked { shown }orPresentation::Pair { shown }.view::combobox::searched_combobox: callkeyed_comboboxwithKeyedCombobox::remoteset.view::side_panel::side_panel_with_shortcut: callside_panel(panel, Some(shortcut)).view::shortcuts::shortcut_legend_with_go_to: callshortcut_legend(locale, groups, Some(go_to)).view::empty::spinner: callbusy(label, Busy::Inline).view::form::keyed_check: callcheck, which takes the id as&str.calendar::Moment::parse_in: callMoment::parse.table::model::Paging::write_within: callPaging::write.i18n::Locale::english: callLocale::default(), which is English.view::action::ActionGroup::none: callActionGroup::default()(#579). - Four public functions no console called are gone:
view::search::answer_idandhit_id,i18n::message_idsandview::surface::wide_card(#580).
Fixed
- The combobox's input is not spell-checked, like every other text input the library draws, so the browser no longer underlines a choice such as "SNOMED CT" as a misspelling (#596).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.4
Fixed
- A mapping row's relationship words wrap inside their cell below 40 rem,
the arrow on their first line, so the longest words ("narrower than the
target") no longer draw past their box on a 320 px screen (WCAG 2.2 SC
1.4.10) (#569). - The top bar's search submit drops its word from the layout below 40 rem
and in a squeezed search, where it was clipped into a 1 px box that its
word ran past on a 320 px screen; the button keeps its name in
aria-label(WCAG 2.2 SC 1.4.10) (#570).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of November 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.3
Added
table::view::title_cell_at(level, href, name, sub)draws a row's title
celllevellevels down a hierarchy, astitle_celldraws it with the
fui-depth-Nclass on its<th>, so a console indents a row under its
parent (a template's earlier releases under the newest) without writing
the row header itself. On a phone the stacked card's heading keeps the
level, one default space per level; past the eighth level the step holds (#559).view::change::change_table_keyed(locale, caption, key, changes)draws a
change table whose key column the console names from its own catalog (a
path, a field), for a comparison of something other than a configuration.
change_tablekeeps its "Setting" header and draws as before (#560).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of October 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.2
Added
- The loader marks an element
data-fui-ready(script::READY) once every
module itsdata-fuinames has enhanced it, so a console's journey can
wait for a component whose module changes nothing it can see before it
drives it by the keyboard;html[data-fui-script]is written before any
module arrives (#523). - The
keysmodule binds every key a control announces in
aria-keyshortcuts, from 40 rem up: a chord such as Ctrl Enter
(view::transform::Run::shortcut) or Ctrl S (view::dock::Decision::shortcut)
presses its control from inside a field too, the one in the focused
field's form first, and a single key such aslor]presses its
control, or focuses a field such as the dock's reason
(view::dock::DockField::shortcut), outside a field alone. The dock's
and Run's keys load it themselves, and so does the shortcut legend; a
console's own control writesdata-fui="keys"(view::shortcuts::KEYS_JOB)
on a page with no legend (#526). view::shortcuts::shortcut_legend_with_go_tolists a console's go-to
pairs (GoTowith its first key and eachGoToPairof a letter and a
link of the navigation) in their own group, each as the link thekeys
module follows on the pair's keys;GoTo::groupgives them as a
ShortcutGroupfor a console's own shortcuts page (#526).view::preferences::typed_preferencedraws a console's own typed
preference, a text or a number field (Typed::Textwith its length
bounds,Typed::Numberwith itsmin,maxandstep) with its
placeholder, in the same plain form asselect_preference: its Save
button posts it with no script, and once thepreferencemodule runs it
posts when the field changes and the row just saved gives the field the
focus back. The module sends one post when Enter both changes and
submits a field (#527).view::side_panel::side_panel_with_shortcutdraws a side panel whose
opener announces its keys, such aso: in a work-list row thekeys
module opens the focused row's panel on that key, and the browser
returns the focus to the row when the panel closes (#530).- A form that answers on its page can answer in place: mark it with
view::answer::Answer::new(region)and theanswermodule posts it with
fetchto its own action and moves the answer region of the page that
route draws into the same region here, the focus kept and the answer
announced by the region's polite live region.with_settle(ms)also
posts once a field rests from typing, for a check on the server as you
type, and an answer to an older request is dropped. With the modules
refused, or on an answer that is no HTML page holding the region, the
form posts and the whole page answers as before. It is the thirdfetch
wire, indocs/consoles.md§ Answered in place (#546).
Changed
- The script modules take a phrase's words, a number's digit groups and a
new element from one module,shared.js, and the JSON and XML
highlighting after an edit moves fromhighlight.jsto its own module,
rehighlight.js. A console that serves the modules from
script::MODULESserves both with no change (#541). - The script budget measures what a reader pays: 16 KiB a module as
before, 144 KiB for the modules any one page loads (the loader, the
page's jobs and their imports), and 72 KiB for every module compressed,
in place of 160 KiB for every module raw. The caps, their measurements
on the gallery's pages and their reasons are in
.claude/rules/console-ui.md§12 (#547).
Fixed
- A long identifier in a
<code>of a stacked table cell wraps inside the
cell at 320 px, so the page no longer scrolls sideways (WCAG 2.2 SC
1.4.10). A stacked cell's value is held to its column, where before it
took the code's whole length (#525). - A select in a dense options row keeps to its field below 40 rem, its
chosen value ending in an ellipsis, so a select whose longest option is
wider than the phone no longer scrolls the page sideways at 320 px (WCAG
2.2 SC 1.4.10) (#528). - A link in a stacked table's group row wraps inside the row below 40 rem,
so a name longer than the card no longer scrolls the page sideways at
320 px (WCAG 2.2 SC 1.4.10) (#529). - The code editor highlights a JSON or XML document again only from the
first line a key changes, up to the line where the highlighting is the
same as before, where before it highlighted the whole text on every key.
The stylesheet's rules for a focused work-list row and for a field row
with a help line select the same elements as before, written so Chrome
no longer restyles the editor's whole layer on every key. A key typed
into a 20 kB JSON or XML document now costs 1 to 2 ms at the median,
script, style and layout together, where it cost 5 to 8 ms, so typing an
openEHR composition into the editor no longer slows with its length (#531). - A work-list row keeps its actions, a glance opener beside the row menu,
on its one line, where since a row's own key (#530) the menu's…
wrapped under the opener and every row stood twice as tall. In the row
a glance opener with a glyph shows the glyph alone, its words kept as
its accessible name, so the record names keep their line with wider
fonts too. The side panel's opener writes its words in
span.fui-side-panel-words. A side panel opened from a table cell
starts and wraps its text, where it took the cell's end alignment (#540). - On a phone, a stacked work-list row whose actions hold a glance opener
keeps them in the first line's flow, where the opener drew over the
second record's name (#540). - A key that changes a line of the code editor updates that line's
element in place, so the browser no longer counts every line number
again, and the caret's line and column are read without walking the
text before the caret. A key typed at the end of a 20 kB XML document
costs the same as one in a short document, and in a 20 kB JSON document
in the operations page it costs about 1.8 ms, where it cost 2.6 to 3.8 ms
on the same machine (#541). - The stylesheet no longer looks for a decision bar, a toast, a work-list
foot or an open menu sheet anywhere in the page with:has(), which made
Chrome weigh the whole page again on every key typed into the code
editor. Each rule now looks only where the shell draws what it looks
for: the decision bar as the last part of the main area or of its
column, the work-list's card in the column at most two levels down, the
toast region beside the body, the menu sheets in the top bar and in a
transform pane's head, and the editor as a transform pane's own child.
A code editor with an error mark carriesis-invalid, which draws its
red edge. A key typed at the end of a 20 kB XML document costs 0.2 ms at
the median where it cost 0.7 to 1.4 ms, and in a 20 kB JSON document 0.5
to 0.6 ms where it cost 0.9 to 1.0 ms, on the same machine (#544). - The script modules answer as the library's Rust does where both decide:
they trim white space as Rust'sstr::trimdoes (a typed date, the
editor's grammar and empty state, the typeahead's words, a menu's typed
letter, the filter), a date picker at the calendar's first or last month
keeps its weeks to the calendar's days, the session watch reads a count
between tabs as au32, and the upload field compares a file's extension
in ASCII case alone. A parity test now feeds each rule written in both
languages the same inputs and fails on any difference;docs/consoles.md
lists every pair (#548).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of October 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.6.0
Added
- The combobox answers a
fui:chooseevent on its root, which puts it on a
listed value, or on none, without a change event. A pick-or-type field's
back control uses it: back puts the picker on the listed option chosen
before the another option, or on its first, for a select and a combobox
picker alike (#517).
Changed
- Breaking: the library renders server-side HTML from Askama templates
and depends on no Leptos crate. Every component is a function or a
struct that returnsHtml, which a console's own Askama template writes
unescaped with{{ part }}; a component that needs words takes the
request's&Locale. The shell writes the whole document, and the
interactive behaviour comes from small plain ES modules under
/ferrohealth-ui/<version>/, which the one loaderfui.jsimports for
each element that asks for one withdata-fui. Every page works with the
modules refused.serve::axum_router::router()(the defaultaxumfeature) serves
the stylesheet, the brand themes and the modules.docs/migration-0.6.md
maps every removed item to its successor (#510). - The date picker's months view draws an up chevron after its year title,
as the design draws it, beside the down chevron of the days view's month
title. Both are hidden from assistive technology (#518).
Removed
- Breaking: the
islandandwidgetmodules, whose components now
live underviewbeside their script modules, and with them the
hydration layer:widget::hydration,widget::prefetch,
widget::submit, the answer mode ofwidget::actionand the
data-ferroui-hydratedmark. A link is a link and a form posts as the
browser posts it (#510).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of October 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
0.5.8
Added
view::dialog::danger_action_dialogdraws a danger confirmation with fields
inside the<ActionForm>a console draws for its server action (class
view::dialog::DIALOG_FORM): once the page has hydrated, its confirm runs the
action in the page and the dialog closes when the console'sdonesignal turns
true; with no WebAssembly the form posts to the server function's address as
a plain form.danger_form_dialogkeeps posting to a plain route (#500).
Changed
- Every menu item that is not destructive or disabled draws a visible bar under
the pointer and the keyboard focus, in the new--surface-hovertoken: a
neutral tint a little darker than the panel in light and a little lighter in
dark (1.37:1 and 1.53:1 against it, the most muted text on it allows at
4.5:1). Danger items keep--bad-ground, a pressed or current item and a
chosen listbox option keep--accent-tintunder the pointer, and a disabled
item draws no bar. The combobox and listbox options and the tree rows hover
with the same token (#498).
Fixed
- A form can mark any number of secret fields:
widget::action::secret_mark
names each mark after the field it marks (ferroui_secret_and the
name's bytes in hexadecimal), so a hydrated<ActionForm>with two marks
no longer fails onserde_qsrefusing a name posted twice. The plain post
still keeps every marked value out of the answered page, and a mark named
ferroui_secretalone, as 0.5.7 drew it, is still read (#503).
Support period
Only the newest release is supported: there are no maintenance branches, no long-term-support line and no backports, and upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of October 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.