generated from nl-design-system/example
-
Notifications
You must be signed in to change notification settings - Fork 4
Inventarisatie Bold web components
Robbert edited this page Aug 14, 2023
·
2 revisions
Web component, afgeleid van een CSS bestand, als je begint met het formulier invullen van Opgaaf zonnepaneelhouders.
Gecheckt in versie assets/bold/bldc-components/2.42.3/dist
- Waarschijnlijk vergelijkbaar met Utrecht backdrop component
- heeft standaard
6px
blur effect met de CSSbackdrop-filter: blur(6px)
- web component zonder shadow root
- CSS animation voor backdrop fade in
- A11y: geen rekening gehouden met
prefers-reduced-motion
- ik zie geen code voor
::backdrop
- er lijkt net een iets andere implementatie te zijn voor de CSS component
.bldc-backdrop
- web component met shadow DOM
- heeft geen slot, alleen attributes:
value
enmax-value
- rendert een
<span>
, geen<data>
- Gebruikt
aria-roledescription="badge"
. Dit kan een accessibility probleem zijn. - Gebruikt
role="status"
, waardoor die altijd politely wordt aangekondigd door screen readers. 🧐 - Vergelijkbaar met de Utrecht counter badge, behalve dat die (nog) niet standaard
role="status"
krijgt omdat het overwhelming kan zijn bij gebruik. With great power comes great responsibility... - Heeft een
max-value=""
property die voor mijn gevoel een off-by-one-error heeft:<bldc-badge max-value="999" value="1234"></bldc-badge>
- Misschien moet de
max-value
property een minimum waarde krijgen van1
:
- web component met shadow root
- rendert standaard een
<nav>
element, die moet wel een goed label krijgen natuurlijk - rendert standaard een
aria-label="breadcrumb1"
, die lijkt niet configurable 🧐 ook een manier om een unieke landmark label te hebben 😂 - rendert een
<ol>
voor de breadcrumb items
- rendert
role="listitem"
op de host element, zodat er de<ol>
uitbldc-breadcrumb
direct een listitem child heeft. Rendert geen<li>
in de shadow DOM, maar een<div>
- rendert standaard
href="none"
, wat niet een bestaande URL is - rendert standaard een icon (
delta_rechts
) met de hardcoded kleur$donkerblauw-vol
- heeft text overflow CSS:
max-width: 15.625rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap
. Is dit een accessibility issue? - heeft een
href
attribute die wordt gekopieerd naar de<a>
- heeft een
target
attribute die wordt gekopieerd naar de<a>
. - je kunt met
type="currentPage"
de huidige pagina aangeven - er is speciale support voor de alignment van slotted icons met
<bldc-icon>
, ik vraag me af in welke situaties je een icon zou gebruiken. Home?
<bldc-button class="bldc-html-component hydrated" id="F_1100" elem-id="F_1100" elem-title="Volgende" type="primary" size="regular" icon-only="false" icon="volgende" icon-pos="right" icon-title="Volgende" href="" target="_self" html-type="button" disabled="false" aria-label="" data-events="{"bldcClick":"leapNextPage","bldcFocus":"","bldcBlur":""}" data-fields-to-display="" data-fields-to-display-on-error="" data-fields-to-hide="" data-add-data-to="" data-fields-to-set-required="" data-fields-to-unset-required="" data-select-page="" validation-role="status"></bldc-button>
- manier om
aria-label
te zetten - focus event
- blur event
- click event
- lijkt één icon te supporten
-
type
:primary
/secondary
/tertiary
/...? - primary button is minder opvallend dan secondary button in forced colors mode:
- Lijkt op Utrecht button group component
- Optie voor backgroundColor
- Optie voor disable padding / margin
- Hardcoded viewport media query voor full width buttons bij kleine viewports
- Slots voor
left
,center
enright
- Heeft een
renderWrappedView
om te herkennen dat buttons op een tweede regel terecht zijn gekomen (offsetTop > firstButton.offsetTop), voegt dan dewrapped
class name toe aan die buttons
- Lijkt op de Utrecht checkbox form field component, is composite van form field, form field label en checkbox
- Label is de default slot, bijvoorbeeld:
<bldc-checkbox>Ik ga akkoord met de voorwaarden</bldc-checkbox>
- Checkbox zit in shadow root
- Er is een slot voor een form field description op de regel erna, bijvoorbeeld
<bldc-checkbox>Ik ga akkoord met de voorwaarden<p slot="after-label">Lorem ipsum</p></bldc-checkbox>
- Heeft
pristine
,untouched
envalid
state attributes. -
name
property wordt doorgezet naar de<input>
element, maar die zit alsnog wel in shadow dom dus niet duidelijk of het nuttig is - Gebruikt
<bldc-icon name="check">
voor de checkmark - Heeft een active state om van unchecked naar checked te gaan, maar niet voor checked naar unchecked
- Zoom animatie voor checkmark bij checked naar unchecked
- Heeft hover effect voor checked en unchecked
- web component met shadow DOM
- wordt standaard gerendered met
<button>
(niet<button type="button">
🧐) - heeft
aria-roledescription="chip"
. Dat kan een toegankelijkheidsprobleem zijn, omdatchip
niet gelocalised wordt, en omdat niet de verwachtingen van de mogelijkheden van "button" worden gewekt, zoals kunnen activeren met bepaalde toetsen. Zie artikel: Léonie Watson - Using the aria-roledescription attribute
- rendert alleen een
<div>
, geenrole="group"
en geen list ofzo - web component met shadow root
- hardcoded margins
- Dit is de date input zoals Sergei Maertens die heeft gemaakt op basis van Utrecht componenten voor Open Formulieren
- Input group date input
- Belastingdienst screenshot:
- Open Forms SDK Storybook:
- Niet duidelijk in forced colors mode:
- Lijkt op de React component voor de date picker van Utrecht
- Dagnummers uit vorige maand en volgende maand zijn niet aanwezig, waarschijnlijk vanwege contrast issues
- Support voor arrow keys
- Support voor PageUp / Page Down
- Lijkt geen support te hebben voor Home/End
- Lijkt geen support te hebben voor Enter/Space
- Buttons hebben target size die voldoende groot is 46x46px en 48x48px
- Heeft
class="selected"
maar nietaria-selected
- Heeft
<a href="javascript:;">
als buttons - Heeft naam van de maand als table cell, niet als table caption
- Heeft alleen afkortingen als table column headers, niet de volledige naam van de dag van de week in aria-label ofzo
- als
readonly="true"
is gebruikt, dan wordt wel een<fieldset>
gerendered, maar geen<input>
elementen. De formatted date komt in een<bldc-paragraph>
te staan, waardoor die niet focusable is en mogelijk wordt gemist bij het controleren van de invoer van een formulier als je door de readonly inputs heen tabt.
- Net als de Utrecht heading component
- Heeft een extra
<div>
eromheen, for reasons unknown - Heeft hyphenation CSS:
-ms-hyphens:auto;hyphens:auto;-webkit-hyphens:auto
- Heeft opties om een typescale uit te kiezen, om een h1 eruit te laten zien als een h2 bijvoorbeeld. Het heet "typescale".
- Opties voor
not-bold
enno-margin
-
disableMargin
property -
size
property:xxxl
,xxl
,xl
,l
,m
,s
,xs
- Dit is de details/summary button voor het vraagtekentje bij formulier velden. Deze bestaat nog niet bij Utrecht.
- Vermoedelijk is dit een
aria-controls
voor debldc-explanation-text
. - Heeft
aria-haspop
enaria-expaneded
. - Heeft een
title
attribuut, raden wij af - Is wel erg kleine target size, 18x18px
- heeft
aria-hidden="true"
metrole="img"
, lijkt me dat die role onnodig is - heeft
title=""
... zinloos? - blijkbaar kun je
<bldc-icon aria-hidden="false">
doen, die waarde wordt gekopieerd naar de icon waardoor het label wordt voorgelezen -
aria-label
wordt ook gekopieerd, maar dan heb je een label op een custom element die zinloos is - support
fill
zodat nested SVG wordt gestyled - een of andere berekening met computedStyle om de icon size in
rem
te kunnen zetten, maar die relatief is ten opzichte van de<body>
in plaats van de<html>
ofzo?? - lijkt niet mogelijk te zijn om relative font-size icons te hebben, die aanpassen aan de omliggende tekst
-
title
attribute wordt gezet met de waarde vanaria-label
, die zorgt voor een onhandige tooltip. Lijkt me onnodig - houdt de hardcoded kleur in forced colors mode, daarom niet goed zichtbaar:
- focus ring is niet de ideale kleur in forced colors mode
<bldc-input class="bldc-html-component bdfd-store hydrated" id="F_3100" readonly="true" alignment="" amount-unit="false" bldc-value="R BROERSMA " currency="€" decimals="" elem-id="F_3100" element-disabled="false" explanation-text="" help-button="false" include-mask="false" input-type="text" label="Uw naam" mask="" max-width="" number-unit="" placeholder="" required="false" matomo-event-help="disabled" data-events="{"bldcValueChange":"leapStoreValue","bldcFocus":"","bldcBlur":"leapStoreValue"}" data-field-to-display="" data-field-to-hide="" data-set-bold-property="" validation-role="status" pristine="" untouched="" valid=""><div slot="help-text"> </div> </bldc-input>
- Lijkt op textbox form field component van Utrecht
- events:
bldcValueChange
bldcFocus
bldcBlur
- state attributes:
valid
pristine
untouched
-
<input>
element:-
autocapitalize="off"
is altijd ingesteld -
autocomplete="off"
is altijd ingesteld -
spellcheck="off"
is altijd ingesteld -
spellcheck="off"
is
-
- heeft code voor input masks — is dat toegankelijk?
- heeft code voor validatie
- onder ander voor datums
- onder andere voor URLs
- onder andere voor Nederlandse postcodes
-
label
property -
input-type
voortype
: bestaat op Utrecht textbox -
readOnly
property: bestaat op Utrecht textbox -
required
property: bestaat op Utrecht textbox -
placeholder
property: bestaat op Utrecht textbox -
element-disabled
:disabled
van Utrecht -
currency
property: bestaat niet bij Utrecht, RVO heeft hier wel iets voor gedaan, een input prefix -
decimals
property: ? -
include-mask
property: ? -
amount-unit
property: ? maar misschien zoals RVO suffix -
alignment
: misschien voor align right van numeric input? bijvoorbeeld in numeric table columns? - Slot voor
help-text
, mogelijk is dat voor de form field description, maar misschien ook wel voor debldc-help-button
. - Lijkt ingebouwde support te hebben voor help button summary/details met
help-button="true"
. -
explanaition-text="..."
. De explanation text, zou dat dan per se een string moeten zijn, of kan het ook rich text zijn? Dit is de form field description in Utrecht components. - is niet zichtbaar (geen border) in forced colors mode:
- web component met shadow DOM
- ondersteunt geen slotted content
- syntax lijkt niet heel erg op het
<a>
element uit HTML <bldc-link url="https://example.com/" elem-text="example.com" type="inline"></bldc-link>
-
url
attribute in plaats van href -
type="inline"
rendert<a class="inline" aria-label="label"><div class="inline"><span class="nowrap">label</span></div></a>
- zonder
type="inline"
rendert 'ie geen<div>
:<a class="block" aria-label="label">label</a>
- de span lijkt er te zijn zodat de underline alleen op de span gezet kan worden (en misschien niet op een icon?)
- heeft
elem-title="foo"
om<a title="...">
in te stellen, maar dat raden we af bij NL Design System - heeft
black-text="true"
voorcolor: rgb(0, 0, 0);
🧐 - heeft een
size="xs"
attribute omclass="typescale-${size}"
in te stellen - heeft een
aria-label
attribuut die wordt gekopieerd naar het<a>
element, maar dat betekent dat er een<bldc-link aria-label="foo">
in de DOM staat, en je moet nietaria-label
instellen op elementen waarvan de role niet appropriate is (zoalsrole="none"
vanbldc-link
)
- Lijkt standaard een
<a href="#">
te renderen, niet nodig - De linktekst is "Logo Belastingdienst, link naar startpagina" - dat het een logo is hoeft niet in de linktekst, "link naar" hoeft niet in een linktekst, en de link gaat niet naar de startpagina in dit geval
- Het logo werkt niet in forced colors mode:
- Lijkt op de Alert component van Utrecht:
- Heeft standaard
role="alert"
- Heeft standaard een
aria-describedby
met de tekst"Storing melding"
in een screen reader only div - Heeft een slot voor een heading
- Heeft altijd een icon
-
type
:"error"
/"warning"
/information
/success
/suggestion
? - optie voor
compact="true"
- optie voor
disableMargin
- optie voor
disableIcon
- optie voor
elem-title="foo"
die maakt eenbldc-heading
in deheading
slot. De level is hardcoded, 3 of 4 afhankelijk van of 'ie compact is. Niet toegankelijk dus. Lijkt me logischer dat deze heading is gekoppeld viaaria-labelledby
. - Alle content is
role="alert"
, er is niet een slot voor actions die nietaria-live
is
- Lijkt op in eerste instantie op paragraph component van Utrecht, maar bij nader inzien is het meer een container voor rich text
- heeft
disable-margin="true"
attribute
- web component met shadow dom
- label is in te stellen via de slot
- radio button is niet duidelijk in forced colors mode, niet zichtbaar of 'ie checked is
- label is grijs wanneer de radio button disabled is, de after-label heeft geen andere stijling
- rendert
role="radio" aria-checked="false"
op de host element, onduidelijk waarom. Host element is niet focusable namelijk 🧐 - rendert
<input type="radio">
in de shadow dom -
name
attribuut wordt gekopieerd naar<input>
-
value
attribuut wordt gekopieerd<input>
-
bldc-value="true"
is omchecked
te zetten,bldc-value="false"
is om nietchecked
te zijn. - zou
aria-checked="true"
op de host element gebruikt worden om CSS state selectors te maken als alternatief op:checked
? Bijv:bldc-radiobutton[aria-checked="true"]
? -
aria-disabled
wordt gerendered naastdisabled
, onduidelijk wat de toegevoegde waarde is - events: change / focus / blur
- heeft net als checkbox een slot voor de form field description
- lijkt iets te zijn om translation keys toe te passen
- waarschijnlijk om een dictionary met translation keys in te laden, misschien met JSON
- debug component:
<bldc-version show-on-screen="true"></bldc-version>
- ben benieuwd hoe deze wordt gemaakt in de pipeline: hoe wordt het versienummer in de build opgenomen?
Overige opmerkingen:
- de CSS van de componenten lijkt vaak CSS te bevatten van andere componenten
- de CSS van de componenten lijkt vaak CSS te bevatten met theme informatie. De theme werkt dan out of the box, maar hij wordt ook wel onnodig vaak gedownload. Lijkt me handiger de theme buiten de shadow DOM te definieren, want custom properties can pierce the shadow DOM.
- mogelijkheden om een eigen thema in te stellen zijn heel beperkt, lijkt me behoorlijk lastig om bijvoorbeeld dark mode te ondersteunen
Vragen:
- Hebben jullie al plannen voor Bold 3.0, welke breaking changes zijn ben je van plan?
- Raad je aan om
<input>
elementen in de Shadow root te hebben, of zou je dat anders aanpakken? - Iconen namen zijn soms Nederlands (
volgende
) en soms Engels (check
), werkt dat prettig?