- From: Shane Stephens <shans@google.com>
- Date: Thu, 08 Oct 2015 22:29:09 +0000
- To: Brian Kardell <bkardell@gmail.com>
- Cc: "public-houdini@w3.org" <public-houdini@w3.org>
- Message-ID: <CAGTfzwS_0fmcBB+=DM6-LxYTJjsKQ1t29ZdgCYBML5jB=jP-GQ@mail.gmail.com>
I think a polyfill is a great idea! I wonder if it would be possible to
check it into the houdini github repository alongside the spec?
Thoughts?
Cheers,
-Shane
On Fri, Oct 9, 2015 at 8:44 AM Brian Kardell <bkardell@gmail.com> wrote:
> On Sun, Aug 9, 2015 at 9:05 PM, Shane Stephens <shans@google.com> wrote:
> > Hi houdiños,
> >
> > Being able to describe the type of CSS values has been an important part
> of
> > the custom properties proposals that we've talked about in this group.
> >
> > I'd like to explore whether we can extend this notion to JavaScript -
> i.e.
> > provide typed JS objects rather than strings when accessing custom CSS
> > values. I'd also like to see whether we can retrofit the existing CSSOM
> with
> > this idea. These ideas were discussed in the January f2f but I don't
> think
> > we've talked about it much on list since.
> >
> > My reasons are basically those provided in Sydney: converting CSS
> strings to
> > values is tedious, error-prone, and a source of performance problems.
> >
> > So to get the ball rolling - here's a partial proposal that only covers
> > numbers and lengths. Obviously we'll eventually want to expose the rest
> of
> > the types too, but we need to start somewhere :) Bikeshed away!
> >
> > (1) Access to typed CSSOM
> > A new OM can't just start to replace existing CSSOM functionality with
> typed
> > versions because this will break lots of things. Instead we should
> create a
> > new interface, StylePropertyMap, that is accessible alongside the old
> > methods:
> >
> > interface StyleValue {
> > boolean isInitial();
> > boolean isInherit();
> > boolean isDefault();
> > boolean isUnset();
> > attribute DOMString cssString;
> > }
> >
> > interface StylePropertyMap {
> > StyleValue get(DOMString property);
> > sequence<StyleValue> getAll(DOMString property);
> > void set(DOMString property, StyleValue or sequence<StyleValue> or
> > DOMString value);
> > void append(DOMString property, StyleValue or sequence<StyleValue> or
> > DOMString value);
> > iterable<DOMString, StyleValue or DOMString>;
> > stringifier;
> > };
> >
> > interface ComputedStylePropertyMap : StylePropertyMap {
> > };
> >
> > interface SpecifiedStylePropertyMap : StylePropertyMap {
> > boolean has(DOMString property);
> > sequence<DOMString> getProperties();
> > }
> >
> > partial interface Element {
> > readonly attribute SpecifiedStylePropertyMap styleMap;
> > };
> >
> > partial interface Document {
> > ComputedStylePropertyMap getComputedStyleMap(Element element);
> > };
> >
> > partial interface CSSStyleRule {
> > readonly attribute SpecifiedStylePropertyMap styleMap;
> > };
> >
> > (2) Numbers
> >
> > Number properties like z-index or opacity should have a very simple
> > wrapping:
> >
> > interface NumberValue : StyleValue {
> > double value;
> > }
> >
> > An open question: where and when does validation happen? What happens if
> I
> > try to set an out-of-range number to opacity? Will this be consistent
> across
> > all properties?
> >
> > (3) Lengths
> >
> > Usually, lengths are simple single-unit values (e.g. 50px or 30em).
> However,
> > it is possible for calc values to be used instead. The following API
> tries
> > to capture common use-cases without allowing web devs to accidentally
> write
> > code that will break when calc values are fed in:
> >
> > enum LengthType {
> > "px", "percent", "em", // ...
> > }
> >
> > interface Length : StyleValue {
> > Length add(Length value); // can throw
> > Length subtract(Length value); // can throw
> > Length multiply(double value); // can throw
> > Length divide(double value); // can throw
> > static Length parse(DOMString cssString);
> > static Length fromValue(double value, LengthType type);
> > static Length fromDictionary({...});
> > }
> >
> > [Constructor(DOMString cssString),
> > Constructor(Length),
> > Constructor({
> > // … all the props.
> > })]
> > interface CalcLength : Length {
> > attribute double? px;
> > attribute double? percent;
> > attribute double? em;
> > attribute double? ex;
> > attribute double? ch;
> > attribute double? rem;
> > attribute double? vw;
> > attribute double? vh;
> > attribute double? vmin;
> > attribute double? vmax;
> > attribute double? cm;
> > attribute double? mm;
> > attribute double? q;
> > attribute double? in;
> > attribute double? pc;
> > attribute double? pt;
> > }
> >
> > // lengths that are *just* keywords don't become SimpleLengths or
> > CalcLengths.
> > interface SimpleLength : Length {
> > attribute double value;
> > readonly attribute LengthType type;
> > }
> >
> > In particular, lengths can be manipulated using the Length API without
> > knowing whether they're simple or calc expressions. One downside is that
> > developers need to check whether a Length is a SimpleLength before
> > extracting the Length value - but then again, in practice they should be
> > doing this anyway.
> >
> > (4) Everything else
> >
> > I realize that there are lots of details missing! Hopefully there's
> enough
> > here to kick off a conversation, though - is this a direction we want to
> go
> > in, and does the API sketched out above look like it could work?
> >
> > Ideally, I'd like to either start incorporating some of this stuff in the
> > CSS Properties and Values specification, or alternatively begin a new ED
> > (CSSOM Level 2?) WDYT?
> >
> > Cheers,
> > -Shane
>
>
> I think this seems pretty interesting, we've said we need a way to let
> developers deal with strings and this seems like a really good start
> at it. The one thing I'd like to propose though is that we build an
> official prollyfill (experimental reference implementation) that real
> developers can use in order to get real work done. Having something
> that developers can touch and use is way more likely to garner
> feedback and I think we want that feedback as soon as possible so we
> wind up with something that people actually will use. Even for people
> reading, I feel like you can only evaluate it so much on paper without
> touching it.
>
>
>
>
>
> --
> Brian Kardell :: @briankardell :: hitchjs.com
>
Received on Thursday, 8 October 2015 22:29:53 UTC