W3C home > Mailing lists > Public > www-style@w3.org > May 2011

Re: [css3-regions][css3-content] Explicit/Implicit, Named/Anonymous Regions

From: Vincent Hardy <vhardy@adobe.com>
Date: Thu, 19 May 2011 18:08:35 -0700
To: Christoph Päper <christoph.paeper@crissov.de>, W3C style mailing list <www-style@w3.org>
Message-ID: <C9FB06F9.28C0%vhardy@adobe.com>
Hi Christoph,

On 5/17/11 12:39 AM, "Christoph Päper" <christoph.paeper@crissov.de> wrote:

>I think we must distinguish different concepts and decide which one or
>ones we want in CSS. Several related modules should follow the same
>design.
>
>The first approach, ³A², is a combination of sources and targets where
>the former push their contents away into named flows (possibly each into
>more than one) and the latter pull in as much content from one or more
>flows as they can handle. Neither needs to know the name or selector of
>the other. Both can exist in a random number, i.e. it is an n:m
>relationship.
>
>The second approach, ³B², is an association of source element with target
>region, i.e. the former ³knows² the latter, but not vice versa, because
>it is a n:1 model.
>
>Step 1
>======
>
>The first thing we need to do in both cases is to find some source
>elements with existing selectors to fill with their children/content
>[A] (at least) one arbitrarily named flow or
>[B] an implicit named region that is created, if not already existing.
>This is not DOM tree manipulation, although we are copying or moving
>contents from a node to the flow, which is not anchored yet within the
>(rendering) tree.
>
>I can think of two reasonable variants for how a source element ³foo²
>pushes its content away into ³bar² which is [A] a named flow or [B] a
>target region. One variant uses the new, proposed Œflow¹ property that
>takes a string, i.e. an identifier, as its value
>
>  foo {        /* ³foo² is a source element */
>    flow: bar; /* ³bar² is [A] a named flow or [B] a target region */
>  }
>
>and the other variant uses the existing Œcontent¹ property with a new
>pseudo-function value
>
>  foo {
>    content: to(bar);
>  }
>
>If you need multiple targets ­ more on how those would be handled later ­
>you simply add them separated by commas, e.g.
>
>  flow: bar, baz, quuz;
>  content: to(bar, baz, quuz);
>
>It would be possible and desirable to distinguish between moving and
>cloning (e.g. pull quotes) the content. In the Œcontent¹ variant this
>would be done either by using two different pseudo functions or by
>introducing a second (optional) parameter:
>
>  content: to(bar, keep);    or  copy(bar);  or  clone(bar);
>  content: to(bar, remove);  or  cut(bar);   or  move(bar);
>
>The unified function of course works worse than the alternative if you
>want to support more than one target:
>
>  content: to(bar, baz, quuz, keep);
>
>With the Œflow¹ variant you could actually employ the content property
>
>  flow: bar; content: contents; /* copy */
>  flow: bar; content: none;     /* move */

I will add an issue to the draft asking if we want to have the ability to
copy the content to the flow instead of moving it to the flow. I think it
complicates styling significantly because if content is copied, then there
are multiple 'views' of the same element and that is novel.

>
>Step 2
>======
>
>In the second step we must either
>[A] generate and style explicit regions that pull their content from
>flows or
>[B] style implicit regions whether anonymous or named.
>
>Step 2 for anonymous regions
>----------------------------
>
>There are three variants for dealing with anonymous regions.
>
>A first variant uses existing properties Œdisplay¹ (or Œposition¹) and,
>optionally, Œcontent¹ to transform a DOM node (marked up or using a
>pseudo-element) that is selected by traditional means into a region and
>pull contents from a named flow. Normal styling is possible for the node
>and its anonymous region, but it is impossible to select a paragraph that
>is (completely) in that region.
>
>  baz /* a normal selector */ {
>    display: <region>; /* some Œdisplay¹ values make ³baz² an anonymous
>region */
>    content: from(bar); /* anonymous regions must pull their content from
>named flows */
>    width: 50%;
>    color: blue;
>  }
>
>It would, however, be possible to style all content that belongs to a
>named flow (as opposed to an anonymous region):
>
>  @flow bar {
>    p {
>      color: green;
>    }
>  }
>
>Another variant uses special region selectors, possibly pseudo-elements.
>Note, though, that pseudo-elements should be used to match stuff that is
>already in the document, just not marked up explicitly, like a first
>line, and not for arbitrary regions (or grids or Š) which are created by
>the styling language.
>
>The region selector creates an anonymous region, which at first does not
>make this variant more attractive than the first, but using a new
>pseudo-class that works similar to proposed Œ:matches()¹ one can select
>nodes that are flowed into a certain anonymous region, maybe this would
>even work for individual parts (i.e. lines) of theses nodes.
>
>  <quuz> /* a region selector */ {
>    content: from(bar); /* anonymous regions must pull their content from
>named flows */
>    width: 50%;
>    color: blue;
>  }
>  p:in(<quuz>) /* a paragraph that is (completely) in the anonymous
>region created by ³<quuz>² */ {
>    color: green;
>  }
>
>A final variant makes use of a new at-rule that has more flexible content
>between its braces than normal rulesets, i.e. we don¹t need the
>pseudo-class from the previous variant.
>
>  @region {
>    content: from(bar); /* anonymous regions must pull their content from
>named flows */
>    width: 50%;
>    color: blue;
>    p /* a paragraph that is (completely) in this anonymous region */ {
>      color: green;
>    }
>  }
>
>The pseudo-function Œfrom()¹ used in all three variants could support
>multiple flow sources in specified order
>
>  content: from(bar, baz, quuz);
>
>This conflicts, however, with the desire to control whether it amends or
>replaces existing content
>
>  content: from(bar, add);
>  content: from(bar, replace);
>
>but that could be dealt with by Œcontent¹ conventions: mutually exclusive
>alternatives (i.e. fallbacks) are in a comma-separated list, combinations
>are space separated.
>
>  content: contents from(bar);  /* add */
>  content: from(bar), contents; /* replace */
>
>This method could also be used for (and combined with) multiple sources.
>
>  content: from(bar) from(baz) from(quuz);   /* cumulative */
>  content: from(bar), from(baz), from(quuz); /* exclusive */
>
>Step 2 for named regions
>------------------------
>
>Named regions automatically include the content of the flow of the same
>name, i.e. there¹s no need for the Œcontent¹ property with a Œfrom()¹
>pseudo-function. Still, we can do this in two variants.
>
>The first variant is actually close to the last variant for anonymous
>regions, we just include a name with the at-rule. This model would make
>the concept of flows unnecessary.
>
>  @region bar {/* ³bar² is a named region */
>    width: 50%;
>    color: blue;
>    p /* a paragraph that is (completely) in this named region */ {
>      color: green;
>    }
>  }
>
>Alternatively we can keep the distinction between named flow and named
>region, by using two at-rules where the first styles the region and the
>second styles content that is moved into the flow, i.e. it works similar
>to Œ@media¹. I think this is a cleaner design.
>
>  @region bar {/* ³bar² is a named region */
>    width: 50%;
>    color: blue;
>  }
>  @flow bar {/* ³bar² is a named flow */
>    p {color: green;}
>  }
>
>Sub-variants of both main variants for named regions don¹t require nested
>selectors, but make use of the name in pseudo-selectors that are simpler
>than the Œ:matches()¹-like approach above. This actually may work on
>parts.
>
>  p:in(bar) /* a paragraph that is (completely) in region ³bar² */ {
>    color: green;
>  }
>  p::in(bar) /* all parts (i.e. lines) of a paragraph that flow into
>region ³bar² */ {
>    color: red;
>  }
>
>Since many authors fail to grasp the difference between pseudo-elements
>and pseudo-classes a different name for one of them would be wise.
>
>  p::lines(bar) {
>    color: red;
>  }
>
>One could also distinguish regions and flows.
>
>  p:in-flow(bar) /* a paragraph that is (completely) in flow ³bar² */ {
>    color: orange;
>  }
>  p:in-region(bar) /* a paragraph that is (completely) in region ³bar² */
>{
>    color: green;
>  }

I responded to Tab's follow up on the styling questions.
Cheers,
Vincent
Received on Friday, 20 May 2011 01:09:05 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:40 GMT