flutter_html_css_border
A flutter_html extension that renders the CSS
border longhands. flutter_html 3.0.0 parses five border properties, all
shorthands: border, border-top, border-right, border-bottom and border-left. It
drops the other 39 property names, and there is no error and no warning. It
rewrites the longhands into those five shorthands before flutter_html parses the style.
List it after a utility-class extension and before CssBorderRadiusHtmlExtension.
Contents
Features
- At the
preStylingstep the extension resolves the cascade of every border declaration in the inline style, removes them all, and appends the result as the five shorthands.flutter_htmlthen renders the border itself; nothing here paints. Declarations it does not consume keep their text and their order. - It reads 39 property names:
border-width,border-style,border-color, the twelve per-side longhands and every logical form, listed in doc/properties.md. - It reads the five shorthands too, so
border: 1px solid red; border-top-width: 6pxgives a six-pixel top side and one-pixel sides elsewhere. dashed,dotted,double,groove,ridge,insetandoutsetrender as one solid line. Flutter'sBorderSide.stylehassolidandnoneonly.- A side with no colour uses the element's own inline
color. With none, it renders black; acoloron an ancestor is not visible at this step. There is no error and no warning. - An element whose inline style carries no border longhand gets no change.
Getting started
dependencies:
flutter_html: ^3.0.0
flutter_html_css_border: ^0.2.0
Usage
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html_css_border/flutter_html_css_border.dart';
Html(
data: '''
<div style="border-width: 2px; border-style: solid; border-color: #0d6efd;
padding: 12px;">
Two pixels of blue.
</div>
''',
extensions: const [CssBorderHtmlExtension()],
);
Before you register it
This extension matches on the inline style, never on the tag name. It cannot make
flutter_html render a tag that has no renderer. A TagExtension does that.
A utility-class extension, this extension and CssBorderRadiusHtmlExtension all write
to the same style attribute at the preStyling step. flutter_html runs them in
registration order. Use this one:
// Also needs flutter_html_bootstrap and
// flutter_html_css_border_radius.
Html(
data: '<div class="p-3" '
'style="border-radius: 8px; border-width: 2px; border-style: solid;">'
'Card</div>',
extensions: const [
BootstrapUtilitiesHtmlExtension(), // renders `p-3`
CssBorderHtmlExtension(), // resolves the border
CssBorderRadiusHtmlExtension(), // rounds and clips
],
);
Listed before the utility-class extension, this extension reads the style attribute
before those classes expand into it. It misses the longhands they add, and flutter_html
drops them. There is no error and no warning.
Listed after CssBorderRadiusHtmlExtension, it never sees the border. That extension
strips every border declaration that is not a radius, and it reads no border-style:
Html(
data: '<div style="border-radius: 12px; border-width: 2px; border-style: none;">'
'Card</div>',
extensions: const [
CssBorderRadiusHtmlExtension(), // renders a 2px border; CSS renders none
CssBorderHtmlExtension(),
],
);
The order matrix has all four arrangements measured.
Released flutter_html_bootstrap 0.1.1 and
flutter_html_vuetify 0.1.0 do not recognise CssBorderHtmlExtension. Both
therefore still suppress the classes this extension could render. Write the border into
an inline style attribute until a release of theirs lists it.
Limitations
border-widthon its own renders nothing, as in CSS, whereborder-stylestarts atnone. Declareborder-stylebeside the width.hiddenrenders nothing too.- Next to
CssBorderRadiusHtmlExtension, a rounded element renders only the side that occurs most often. That extension reads thebordershorthand and no per-side declaration. There is no error and no warning. flutter_htmlrenders a border only for a list item, or a block or inline-block element with children. A plain<span>or an empty<div>renders none, with this extension and without it. There is no error and no warning.- A
TagExtensionbuilds its own widget and never reads aStyle, so an element it builds has no border. Use aTagWrapExtensioninstead. - Widths follow
flutter_html's arithmetic.thin,mediumandthickare 2, 4 and 6 pixels, where a browser uses 1, 3 and 5. Every length unit is read as its bare number, so0.5remis half a pixel. The rounded border thatflutter_html_css_border_radiusdraws resolves the same0.5remagainst a root font size of 14, so it is 7 pixels there.flutter_html_css_font_sizewill close this gap. - An eight-digit
#rrggbbaacolour renders with its channels transposed.flutter_htmlreads it as#aarrggbb. There is no error and no warning. - The extension does not read
border-image,border-collapse,border-spacingorborder-radius. - The extension reads the inline style only. It does not read
<style>blocks or stylesheets.
The full reasoning for each one is on the symbol that implements it.
Additional information
Issues and merge requests go to the
GitLab repository.
Rounding the same element's corners is
flutter_html_css_border_radius's
job.
CI, publishing and Renovate are described in CONTRIBUTING.md.