@fusion.dev/helix 0.103.1 → 0.103.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.103.1",
4
+ "version": "0.103.3",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -47,13 +47,13 @@
47
47
  },
48
48
  "bugs": "https://github.com/project-fusion/fusion/issues",
49
49
  "dependencies": {
50
- "@fusion.dev/helix-core": "0.103.1",
51
- "@fusion.dev/helix-headless": "0.103.1",
52
- "@fusion.dev/helix-styles": "0.103.1"
50
+ "@fusion.dev/helix-core": "0.103.3",
51
+ "@fusion.dev/helix-headless": "0.103.3",
52
+ "@fusion.dev/helix-styles": "0.103.3"
53
53
  },
54
54
  "devDependencies": {
55
- "@fusion.dev/helix-cem": "0.103.1",
56
- "@fusion.dev/helix-testing": "0.103.1",
55
+ "@fusion.dev/helix-cem": "0.103.3",
56
+ "@fusion.dev/helix-testing": "0.103.3",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -11510,56 +11510,48 @@ export type HelixMapHelixMapZoomElementEvent =
11510
11510
  HelixMapElementEvent<HelixMapZoomEvent>;
11511
11511
 
11512
11512
  export type HelixMapProps = {
11513
- /** Which of the controls this frame draws, as a list of what to keep.
11514
-
11515
- **A list rather than a switch, because the overlap is not symmetric.**
11516
- Every map library draws zoom controls and none of them draws pan buttons:
11517
- MapLibre's navigation control is zoom and a compass, Leaflet's is zoom,
11518
- Google's is zoom. So a consumer slotting one of those has our zoom twice
11519
- over and our pan pad not at all, and a single switch would make them choose
11520
- between a duplicate and nothing.
11521
-
11522
- `none` draws none of them, which is the right answer where the slotted map
11523
- already has controls a reader can find: what this family argues for is that
11524
- *a* findable control exists, never that it is ours. The methods stay public
11525
- either way, so a consumer drawing their own chrome can still drive the
11526
- frame.
11527
-
11528
- Absent is all three, which is this library's rule that a resting value is an
11529
- attribute's absence, and it is what the stylesheet asks about: the layout
11530
- rules are written against `[controls]:not([controls~="zoom"])` rather than
11531
- the bare negation, or a frame that named no list at all would be laid out as
11532
- though it had dropped everything. */
11513
+ /** Which of the controls this surface draws, as a list of what to keep.
11514
+
11515
+ **A list rather than a switch, because the overlap is not symmetric.** A
11516
+ surface a consumer brings often has zoom controls of its own and almost
11517
+ never has pan buttons, so a single switch would make them choose between
11518
+ a duplicate and nothing.
11519
+
11520
+ `none` draws none of them, which is the right answer where what was
11521
+ slotted already has controls a reader can find: what this argues for is
11522
+ that *a* findable control exists, never that it is ours. The methods stay
11523
+ public either way, so a consumer drawing their own chrome can still drive
11524
+ the surface.
11525
+
11526
+ Absent is all three, which is this library's rule that a resting value is
11527
+ an attribute's absence, and it is what the stylesheet asks about: the
11528
+ layout rules are written against `[controls]:not([controls~="zoom"])`
11529
+ rather than the bare negation, or a surface that named no list at all
11530
+ would be laid out as though it had dropped everything. */
11533
11531
  controls?: (HelixMap["controls"]) | undefined;
11534
11532
  /** Which corner the controls sit in.
11535
11533
 
11536
- **Configurable because there is no safe default**, and this is a collision
11537
- rather than a taste: MapLibre puts its own controls at the top end, Leaflet
11538
- and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
11539
- corner this took would land on somebody's, which is why every one of those
11540
- libraries made it a setting too.
11534
+ **Configurable because there is no safe default**, which is a collision
11535
+ rather than a taste: whatever a consumer slots may put its own controls
11536
+ in any corner, and every library that draws some made this a setting for
11537
+ the same reason.
11541
11538
 
11542
11539
  Logical corners rather than left and right, so a right-to-left page moves
11543
- them without a consumer writing a second rule.
11544
-
11545
- Absent is the top end, which is this library's rule that a resting value is
11546
- an attribute's absence: a default that reflected would write an attribute
11547
- onto every host that no server sent and nobody asked for. */
11540
+ them without a consumer writing a second rule. Absent is the top end, a
11541
+ resting value being an attribute's absence: a default that reflected
11542
+ would write an attribute onto every host that no server sent. */
11548
11543
  "controls-placement"?: (HelixMap["controlsPlacement"]) | undefined;
11549
11544
  /** Which corner the controls sit in.
11550
11545
 
11551
- **Configurable because there is no safe default**, and this is a collision
11552
- rather than a taste: MapLibre puts its own controls at the top end, Leaflet
11553
- and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
11554
- corner this took would land on somebody's, which is why every one of those
11555
- libraries made it a setting too.
11546
+ **Configurable because there is no safe default**, which is a collision
11547
+ rather than a taste: whatever a consumer slots may put its own controls
11548
+ in any corner, and every library that draws some made this a setting for
11549
+ the same reason.
11556
11550
 
11557
11551
  Logical corners rather than left and right, so a right-to-left page moves
11558
- them without a consumer writing a second rule.
11559
-
11560
- Absent is the top end, which is this library's rule that a resting value is
11561
- an attribute's absence: a default that reflected would write an attribute
11562
- onto every host that no server sent and nobody asked for. */
11552
+ them without a consumer writing a second rule. Absent is the top end, a
11553
+ resting value being an attribute's absence: a default that reflected
11554
+ would write an attribute onto every host that no server sent. */
11563
11555
  controlsPlacement?: (HelixMap["controlsPlacement"]) | undefined;
11564
11556
  /** What the control that fills the screen is called. */
11565
11557
  "fullscreen-label"?: (HelixMap["fullscreenLabel"]) | undefined;
@@ -11567,48 +11559,55 @@ onto every host that no server sent and nobody asked for. */
11567
11559
  fullscreenLabel?: (HelixMap["fullscreenLabel"]) | undefined;
11568
11560
  /** How long the reader may be still before the chrome hides, in milliseconds.
11569
11561
 
11570
- Zero keeps it up, which is the default: a map's controls are how a keyboard
11571
- reader operates it, and chrome that hides itself by default would be this
11572
- component undoing its own argument. Set it for a display map nobody drives. */
11562
+ Zero keeps it up, which is the default: these controls are how a keyboard
11563
+ reader operates the surface, and chrome that hid itself by default would
11564
+ be the component undoing its own argument. Set it for a display nobody
11565
+ drives. */
11573
11566
  "idle-delay"?: (HelixMap["idleDelay"] | `${number}`) | undefined;
11574
11567
  /** How long the reader may be still before the chrome hides, in milliseconds.
11575
11568
 
11576
- Zero keeps it up, which is the default: a map's controls are how a keyboard
11577
- reader operates it, and chrome that hides itself by default would be this
11578
- component undoing its own argument. Set it for a display map nobody drives. */
11569
+ Zero keeps it up, which is the default: these controls are how a keyboard
11570
+ reader operates the surface, and chrome that hid itself by default would
11571
+ be the component undoing its own argument. Set it for a display nobody
11572
+ drives. */
11579
11573
  idleDelay?: (HelixMap["idleDelay"]) | undefined;
11580
- /** Accessible name for the map, which is the one thing a consumer must write.
11581
-
11582
- There is no sensible default. "Map" names the widget rather than the place,
11583
- and a reader meeting three of them on a page learns nothing from hearing the
11584
- same word three times. */
11585
- label?: (HelixMap["label"]) | undefined;
11586
- /** What the controls are called, for a page not in English. */
11574
+ /** What one pan control is called, with `{way}` filled in. */
11587
11575
  "pan-label"?: (HelixMap["panLabel"]) | undefined;
11588
- /** What the controls are called, for a page not in English. */
11576
+ /** What one pan control is called, with `{way}` filled in. */
11589
11577
  panLabel?: (HelixMap["panLabel"]) | undefined;
11590
- /** How far one press moves the map, as a fraction of what is on screen.
11578
+ /** How far one press moves the view, as a fraction of what is on screen.
11591
11579
 
11592
- A fraction rather than a distance, because this frame does not know the
11593
- scale of what is inside it: a quarter of the viewport is the same gesture at
11594
- street level and at country level, and a consumer who wants metres can
11595
- multiply by their own. */
11580
+ A fraction rather than a distance, because this surface does not know the
11581
+ scale of what is inside it: a quarter of the viewport is the same gesture
11582
+ at any zoom, and a consumer who wants their own units multiplies by them. */
11596
11583
  "pan-step"?: (HelixMap["panStep"] | `${number}`) | undefined;
11597
- /** How far one press moves the map, as a fraction of what is on screen.
11584
+ /** How far one press moves the view, as a fraction of what is on screen.
11598
11585
 
11599
- A fraction rather than a distance, because this frame does not know the
11600
- scale of what is inside it: a quarter of the viewport is the same gesture at
11601
- street level and at country level, and a consumer who wants metres can
11602
- multiply by their own. */
11586
+ A fraction rather than a distance, because this surface does not know the
11587
+ scale of what is inside it: a quarter of the viewport is the same gesture
11588
+ at any zoom, and a consumer who wants their own units multiplies by them. */
11603
11589
  panStep?: (HelixMap["panStep"]) | undefined;
11604
- /** What the zoom controls are called. */
11590
+ /** What the control that zooms in is called. */
11605
11591
  "zoom-in-label"?: (HelixMap["zoomInLabel"]) | undefined;
11606
- /** What the zoom controls are called. */
11592
+ /** What the control that zooms in is called. */
11607
11593
  zoomInLabel?: (HelixMap["zoomInLabel"]) | undefined;
11608
- /** What the zoom control that goes the other way is called. */
11594
+ /** What the control that zooms out is called. */
11609
11595
  "zoom-out-label"?: (HelixMap["zoomOutLabel"]) | undefined;
11610
- /** What the zoom control that goes the other way is called. */
11596
+ /** What the control that zooms out is called. */
11611
11597
  zoomOutLabel?: (HelixMap["zoomOutLabel"]) | undefined;
11598
+ /** Accessible name for the map, which is the one thing a consumer must write.
11599
+
11600
+ There is no sensible default. "Map" names the widget rather than the place,
11601
+ and a reader meeting three of them on a page learns nothing from hearing the
11602
+ same word three times.
11603
+
11604
+ **The region is a tab stop**, so the keys are reachable however the controls
11605
+ are configured: the listener is on the region, and without a stop of its own
11606
+ a frame at `controls="none"` around a map with nothing focusable in it had
11607
+ arrow keys no reader could ever press. `aria-keyshortcuts` says which keys
11608
+ rather than spelling them into the name, which would otherwise be read out
11609
+ at every encounter. */
11610
+ label?: (HelixMap["label"]) | undefined;
11612
11611
 
11613
11612
  /** The reader asked the map to move. Answer it against your own map. */
11614
11613
  "onhelix-map-pan"?: ((e: HelixMapHelixMapPanElementEvent) => void) | undefined;
@@ -11617,56 +11616,48 @@ multiply by their own. */
11617
11616
  };
11618
11617
 
11619
11618
  export type HelixMapSolidJsProps = {
11620
- /** Which of the controls this frame draws, as a list of what to keep.
11621
-
11622
- **A list rather than a switch, because the overlap is not symmetric.**
11623
- Every map library draws zoom controls and none of them draws pan buttons:
11624
- MapLibre's navigation control is zoom and a compass, Leaflet's is zoom,
11625
- Google's is zoom. So a consumer slotting one of those has our zoom twice
11626
- over and our pan pad not at all, and a single switch would make them choose
11627
- between a duplicate and nothing.
11628
-
11629
- `none` draws none of them, which is the right answer where the slotted map
11630
- already has controls a reader can find: what this family argues for is that
11631
- *a* findable control exists, never that it is ours. The methods stay public
11632
- either way, so a consumer drawing their own chrome can still drive the
11633
- frame.
11634
-
11635
- Absent is all three, which is this library's rule that a resting value is an
11636
- attribute's absence, and it is what the stylesheet asks about: the layout
11637
- rules are written against `[controls]:not([controls~="zoom"])` rather than
11638
- the bare negation, or a frame that named no list at all would be laid out as
11639
- though it had dropped everything. */
11619
+ /** Which of the controls this surface draws, as a list of what to keep.
11620
+
11621
+ **A list rather than a switch, because the overlap is not symmetric.** A
11622
+ surface a consumer brings often has zoom controls of its own and almost
11623
+ never has pan buttons, so a single switch would make them choose between
11624
+ a duplicate and nothing.
11625
+
11626
+ `none` draws none of them, which is the right answer where what was
11627
+ slotted already has controls a reader can find: what this argues for is
11628
+ that *a* findable control exists, never that it is ours. The methods stay
11629
+ public either way, so a consumer drawing their own chrome can still drive
11630
+ the surface.
11631
+
11632
+ Absent is all three, which is this library's rule that a resting value is
11633
+ an attribute's absence, and it is what the stylesheet asks about: the
11634
+ layout rules are written against `[controls]:not([controls~="zoom"])`
11635
+ rather than the bare negation, or a surface that named no list at all
11636
+ would be laid out as though it had dropped everything. */
11640
11637
  "prop:controls"?: (HelixMap["controls"]) | undefined;
11641
11638
  /** Which corner the controls sit in.
11642
11639
 
11643
- **Configurable because there is no safe default**, and this is a collision
11644
- rather than a taste: MapLibre puts its own controls at the top end, Leaflet
11645
- and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
11646
- corner this took would land on somebody's, which is why every one of those
11647
- libraries made it a setting too.
11640
+ **Configurable because there is no safe default**, which is a collision
11641
+ rather than a taste: whatever a consumer slots may put its own controls
11642
+ in any corner, and every library that draws some made this a setting for
11643
+ the same reason.
11648
11644
 
11649
11645
  Logical corners rather than left and right, so a right-to-left page moves
11650
- them without a consumer writing a second rule.
11651
-
11652
- Absent is the top end, which is this library's rule that a resting value is
11653
- an attribute's absence: a default that reflected would write an attribute
11654
- onto every host that no server sent and nobody asked for. */
11646
+ them without a consumer writing a second rule. Absent is the top end, a
11647
+ resting value being an attribute's absence: a default that reflected
11648
+ would write an attribute onto every host that no server sent. */
11655
11649
  "attr:controls-placement"?: (HelixMap["controlsPlacement"]) | undefined;
11656
11650
  /** Which corner the controls sit in.
11657
11651
 
11658
- **Configurable because there is no safe default**, and this is a collision
11659
- rather than a taste: MapLibre puts its own controls at the top end, Leaflet
11660
- and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
11661
- corner this took would land on somebody's, which is why every one of those
11662
- libraries made it a setting too.
11652
+ **Configurable because there is no safe default**, which is a collision
11653
+ rather than a taste: whatever a consumer slots may put its own controls
11654
+ in any corner, and every library that draws some made this a setting for
11655
+ the same reason.
11663
11656
 
11664
11657
  Logical corners rather than left and right, so a right-to-left page moves
11665
- them without a consumer writing a second rule.
11666
-
11667
- Absent is the top end, which is this library's rule that a resting value is
11668
- an attribute's absence: a default that reflected would write an attribute
11669
- onto every host that no server sent and nobody asked for. */
11658
+ them without a consumer writing a second rule. Absent is the top end, a
11659
+ resting value being an attribute's absence: a default that reflected
11660
+ would write an attribute onto every host that no server sent. */
11670
11661
  "prop:controlsPlacement"?: (HelixMap["controlsPlacement"]) | undefined;
11671
11662
  /** What the control that fills the screen is called. */
11672
11663
  "attr:fullscreen-label"?: (HelixMap["fullscreenLabel"]) | undefined;
@@ -11674,48 +11665,55 @@ onto every host that no server sent and nobody asked for. */
11674
11665
  "prop:fullscreenLabel"?: (HelixMap["fullscreenLabel"]) | undefined;
11675
11666
  /** How long the reader may be still before the chrome hides, in milliseconds.
11676
11667
 
11677
- Zero keeps it up, which is the default: a map's controls are how a keyboard
11678
- reader operates it, and chrome that hides itself by default would be this
11679
- component undoing its own argument. Set it for a display map nobody drives. */
11668
+ Zero keeps it up, which is the default: these controls are how a keyboard
11669
+ reader operates the surface, and chrome that hid itself by default would
11670
+ be the component undoing its own argument. Set it for a display nobody
11671
+ drives. */
11680
11672
  "attr:idle-delay"?: (HelixMap["idleDelay"] | `${number}`) | undefined;
11681
11673
  /** How long the reader may be still before the chrome hides, in milliseconds.
11682
11674
 
11683
- Zero keeps it up, which is the default: a map's controls are how a keyboard
11684
- reader operates it, and chrome that hides itself by default would be this
11685
- component undoing its own argument. Set it for a display map nobody drives. */
11675
+ Zero keeps it up, which is the default: these controls are how a keyboard
11676
+ reader operates the surface, and chrome that hid itself by default would
11677
+ be the component undoing its own argument. Set it for a display nobody
11678
+ drives. */
11686
11679
  "prop:idleDelay"?: (HelixMap["idleDelay"]) | undefined;
11687
- /** Accessible name for the map, which is the one thing a consumer must write.
11688
-
11689
- There is no sensible default. "Map" names the widget rather than the place,
11690
- and a reader meeting three of them on a page learns nothing from hearing the
11691
- same word three times. */
11692
- "prop:label"?: (HelixMap["label"]) | undefined;
11693
- /** What the controls are called, for a page not in English. */
11680
+ /** What one pan control is called, with `{way}` filled in. */
11694
11681
  "attr:pan-label"?: (HelixMap["panLabel"]) | undefined;
11695
- /** What the controls are called, for a page not in English. */
11682
+ /** What one pan control is called, with `{way}` filled in. */
11696
11683
  "prop:panLabel"?: (HelixMap["panLabel"]) | undefined;
11697
- /** How far one press moves the map, as a fraction of what is on screen.
11684
+ /** How far one press moves the view, as a fraction of what is on screen.
11698
11685
 
11699
- A fraction rather than a distance, because this frame does not know the
11700
- scale of what is inside it: a quarter of the viewport is the same gesture at
11701
- street level and at country level, and a consumer who wants metres can
11702
- multiply by their own. */
11686
+ A fraction rather than a distance, because this surface does not know the
11687
+ scale of what is inside it: a quarter of the viewport is the same gesture
11688
+ at any zoom, and a consumer who wants their own units multiplies by them. */
11703
11689
  "attr:pan-step"?: (HelixMap["panStep"] | `${number}`) | undefined;
11704
- /** How far one press moves the map, as a fraction of what is on screen.
11690
+ /** How far one press moves the view, as a fraction of what is on screen.
11705
11691
 
11706
- A fraction rather than a distance, because this frame does not know the
11707
- scale of what is inside it: a quarter of the viewport is the same gesture at
11708
- street level and at country level, and a consumer who wants metres can
11709
- multiply by their own. */
11692
+ A fraction rather than a distance, because this surface does not know the
11693
+ scale of what is inside it: a quarter of the viewport is the same gesture
11694
+ at any zoom, and a consumer who wants their own units multiplies by them. */
11710
11695
  "prop:panStep"?: (HelixMap["panStep"]) | undefined;
11711
- /** What the zoom controls are called. */
11696
+ /** What the control that zooms in is called. */
11712
11697
  "attr:zoom-in-label"?: (HelixMap["zoomInLabel"]) | undefined;
11713
- /** What the zoom controls are called. */
11698
+ /** What the control that zooms in is called. */
11714
11699
  "prop:zoomInLabel"?: (HelixMap["zoomInLabel"]) | undefined;
11715
- /** What the zoom control that goes the other way is called. */
11700
+ /** What the control that zooms out is called. */
11716
11701
  "attr:zoom-out-label"?: (HelixMap["zoomOutLabel"]) | undefined;
11717
- /** What the zoom control that goes the other way is called. */
11702
+ /** What the control that zooms out is called. */
11718
11703
  "prop:zoomOutLabel"?: (HelixMap["zoomOutLabel"]) | undefined;
11704
+ /** Accessible name for the map, which is the one thing a consumer must write.
11705
+
11706
+ There is no sensible default. "Map" names the widget rather than the place,
11707
+ and a reader meeting three of them on a page learns nothing from hearing the
11708
+ same word three times.
11709
+
11710
+ **The region is a tab stop**, so the keys are reachable however the controls
11711
+ are configured: the listener is on the region, and without a stop of its own
11712
+ a frame at `controls="none"` around a map with nothing focusable in it had
11713
+ arrow keys no reader could ever press. `aria-keyshortcuts` says which keys
11714
+ rather than spelling them into the name, which would otherwise be read out
11715
+ at every encounter. */
11716
+ "prop:label"?: (HelixMap["label"]) | undefined;
11719
11717
  /** The reader asked the map to move. Answer it against your own map. */
11720
11718
  "on:helix-map-pan"?: ((e: HelixMapHelixMapPanElementEvent) => void) | undefined;
11721
11719
  /** The reader asked the map to zoom, by a direction rather than to a level. */
@@ -31873,60 +31871,62 @@ export type CustomElements = {
31873
31871
  *
31874
31872
  * Component attributes and properties that can be applied to the element or by using JavaScript.
31875
31873
  *
31876
- * - `controls`: Which of the controls this frame draws, as a list of what to keep.
31874
+ * - `controls`: Which of the controls this surface draws, as a list of what to keep.
31877
31875
  *
31878
- * **A list rather than a switch, because the overlap is not symmetric.**
31879
- * Every map library draws zoom controls and none of them draws pan buttons:
31880
- * MapLibre's navigation control is zoom and a compass, Leaflet's is zoom,
31881
- * Google's is zoom. So a consumer slotting one of those has our zoom twice
31882
- * over and our pan pad not at all, and a single switch would make them choose
31883
- * between a duplicate and nothing.
31876
+ * **A list rather than a switch, because the overlap is not symmetric.** A
31877
+ * surface a consumer brings often has zoom controls of its own and almost
31878
+ * never has pan buttons, so a single switch would make them choose between
31879
+ * a duplicate and nothing.
31884
31880
  *
31885
- * `none` draws none of them, which is the right answer where the slotted map
31886
- * already has controls a reader can find: what this family argues for is that
31887
- * *a* findable control exists, never that it is ours. The methods stay public
31888
- * either way, so a consumer drawing their own chrome can still drive the
31889
- * frame.
31881
+ * `none` draws none of them, which is the right answer where what was
31882
+ * slotted already has controls a reader can find: what this argues for is
31883
+ * that *a* findable control exists, never that it is ours. The methods stay
31884
+ * public either way, so a consumer drawing their own chrome can still drive
31885
+ * the surface.
31890
31886
  *
31891
- * Absent is all three, which is this library's rule that a resting value is an
31892
- * attribute's absence, and it is what the stylesheet asks about: the layout
31893
- * rules are written against `[controls]:not([controls~="zoom"])` rather than
31894
- * the bare negation, or a frame that named no list at all would be laid out as
31895
- * though it had dropped everything.
31887
+ * Absent is all three, which is this library's rule that a resting value is
31888
+ * an attribute's absence, and it is what the stylesheet asks about: the
31889
+ * layout rules are written against `[controls]:not([controls~="zoom"])`
31890
+ * rather than the bare negation, or a surface that named no list at all
31891
+ * would be laid out as though it had dropped everything.
31896
31892
  * - `controls-placement`/`controlsPlacement`: Which corner the controls sit in.
31897
31893
  *
31898
- * **Configurable because there is no safe default**, and this is a collision
31899
- * rather than a taste: MapLibre puts its own controls at the top end, Leaflet
31900
- * and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
31901
- * corner this took would land on somebody's, which is why every one of those
31902
- * libraries made it a setting too.
31894
+ * **Configurable because there is no safe default**, which is a collision
31895
+ * rather than a taste: whatever a consumer slots may put its own controls
31896
+ * in any corner, and every library that draws some made this a setting for
31897
+ * the same reason.
31903
31898
  *
31904
31899
  * Logical corners rather than left and right, so a right-to-left page moves
31905
- * them without a consumer writing a second rule.
31906
- *
31907
- * Absent is the top end, which is this library's rule that a resting value is
31908
- * an attribute's absence: a default that reflected would write an attribute
31909
- * onto every host that no server sent and nobody asked for.
31900
+ * them without a consumer writing a second rule. Absent is the top end, a
31901
+ * resting value being an attribute's absence: a default that reflected
31902
+ * would write an attribute onto every host that no server sent.
31910
31903
  * - `fullscreen-label`/`fullscreenLabel`: What the control that fills the screen is called.
31911
31904
  * - `idle-delay`/`idleDelay`: How long the reader may be still before the chrome hides, in milliseconds.
31912
31905
  *
31913
- * Zero keeps it up, which is the default: a map's controls are how a keyboard
31914
- * reader operates it, and chrome that hides itself by default would be this
31915
- * component undoing its own argument. Set it for a display map nobody drives.
31906
+ * Zero keeps it up, which is the default: these controls are how a keyboard
31907
+ * reader operates the surface, and chrome that hid itself by default would
31908
+ * be the component undoing its own argument. Set it for a display nobody
31909
+ * drives.
31910
+ * - `pan-label`/`panLabel`: What one pan control is called, with `{way}` filled in.
31911
+ * - `pan-step`/`panStep`: How far one press moves the view, as a fraction of what is on screen.
31912
+ *
31913
+ * A fraction rather than a distance, because this surface does not know the
31914
+ * scale of what is inside it: a quarter of the viewport is the same gesture
31915
+ * at any zoom, and a consumer who wants their own units multiplies by them.
31916
+ * - `zoom-in-label`/`zoomInLabel`: What the control that zooms in is called.
31917
+ * - `zoom-out-label`/`zoomOutLabel`: What the control that zooms out is called.
31916
31918
  * - `label`: Accessible name for the map, which is the one thing a consumer must write.
31917
31919
  *
31918
31920
  * There is no sensible default. "Map" names the widget rather than the place,
31919
31921
  * and a reader meeting three of them on a page learns nothing from hearing the
31920
31922
  * same word three times.
31921
- * - `pan-label`/`panLabel`: What the controls are called, for a page not in English.
31922
- * - `pan-step`/`panStep`: How far one press moves the map, as a fraction of what is on screen.
31923
31923
  *
31924
- * A fraction rather than a distance, because this frame does not know the
31925
- * scale of what is inside it: a quarter of the viewport is the same gesture at
31926
- * street level and at country level, and a consumer who wants metres can
31927
- * multiply by their own.
31928
- * - `zoom-in-label`/`zoomInLabel`: What the zoom controls are called.
31929
- * - `zoom-out-label`/`zoomOutLabel`: What the zoom control that goes the other way is called.
31924
+ * **The region is a tab stop**, so the keys are reachable however the controls
31925
+ * are configured: the listener is on the region, and without a stop of its own
31926
+ * a frame at `controls="none"` around a map with nothing focusable in it had
31927
+ * arrow keys no reader could ever press. `aria-keyshortcuts` says which keys
31928
+ * rather than spelling them into the name, which would otherwise be read out
31929
+ * at every encounter.
31930
31930
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
31931
31931
  *
31932
31932
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -31968,9 +31968,9 @@ export type CustomElements = {
31968
31968
  *
31969
31969
  * Methods that can be called to access component functionality.
31970
31970
  *
31971
- * - `toggleFullscreen() => void`: Fills the screen with the frame, or comes back.
31972
- * - `pan(to: Way) => void`: Asks for the map to move, which the consumer answers.
31973
- * - `zoom(by: number) => void`: Asks for the map to zoom, `1` in and `-1` out.
31971
+ * - `pan(to: ViewportWay) => void`: Asks for the view to move, which the consumer answers.
31972
+ * - `zoom(by: number) => void`: Asks for the view to zoom, `1` in and `-1` out.
31973
+ * - `toggleFullscreen() => void`: Fills the screen with the surface, or comes back.
31974
31974
  *
31975
31975
  * ## CSS Custom Properties
31976
31976
  *
@@ -52109,60 +52109,62 @@ export type CustomElementsSolidJs = {
52109
52109
  *
52110
52110
  * Component attributes and properties that can be applied to the element or by using JavaScript.
52111
52111
  *
52112
- * - `controls`: Which of the controls this frame draws, as a list of what to keep.
52112
+ * - `controls`: Which of the controls this surface draws, as a list of what to keep.
52113
52113
  *
52114
- * **A list rather than a switch, because the overlap is not symmetric.**
52115
- * Every map library draws zoom controls and none of them draws pan buttons:
52116
- * MapLibre's navigation control is zoom and a compass, Leaflet's is zoom,
52117
- * Google's is zoom. So a consumer slotting one of those has our zoom twice
52118
- * over and our pan pad not at all, and a single switch would make them choose
52119
- * between a duplicate and nothing.
52114
+ * **A list rather than a switch, because the overlap is not symmetric.** A
52115
+ * surface a consumer brings often has zoom controls of its own and almost
52116
+ * never has pan buttons, so a single switch would make them choose between
52117
+ * a duplicate and nothing.
52120
52118
  *
52121
- * `none` draws none of them, which is the right answer where the slotted map
52122
- * already has controls a reader can find: what this family argues for is that
52123
- * *a* findable control exists, never that it is ours. The methods stay public
52124
- * either way, so a consumer drawing their own chrome can still drive the
52125
- * frame.
52119
+ * `none` draws none of them, which is the right answer where what was
52120
+ * slotted already has controls a reader can find: what this argues for is
52121
+ * that *a* findable control exists, never that it is ours. The methods stay
52122
+ * public either way, so a consumer drawing their own chrome can still drive
52123
+ * the surface.
52126
52124
  *
52127
- * Absent is all three, which is this library's rule that a resting value is an
52128
- * attribute's absence, and it is what the stylesheet asks about: the layout
52129
- * rules are written against `[controls]:not([controls~="zoom"])` rather than
52130
- * the bare negation, or a frame that named no list at all would be laid out as
52131
- * though it had dropped everything.
52125
+ * Absent is all three, which is this library's rule that a resting value is
52126
+ * an attribute's absence, and it is what the stylesheet asks about: the
52127
+ * layout rules are written against `[controls]:not([controls~="zoom"])`
52128
+ * rather than the bare negation, or a surface that named no list at all
52129
+ * would be laid out as though it had dropped everything.
52132
52130
  * - `controls-placement`/`controlsPlacement`: Which corner the controls sit in.
52133
52131
  *
52134
- * **Configurable because there is no safe default**, and this is a collision
52135
- * rather than a taste: MapLibre puts its own controls at the top end, Leaflet
52136
- * and OpenLayers at the top start, Google's zoom at the bottom end. Whichever
52137
- * corner this took would land on somebody's, which is why every one of those
52138
- * libraries made it a setting too.
52132
+ * **Configurable because there is no safe default**, which is a collision
52133
+ * rather than a taste: whatever a consumer slots may put its own controls
52134
+ * in any corner, and every library that draws some made this a setting for
52135
+ * the same reason.
52139
52136
  *
52140
52137
  * Logical corners rather than left and right, so a right-to-left page moves
52141
- * them without a consumer writing a second rule.
52142
- *
52143
- * Absent is the top end, which is this library's rule that a resting value is
52144
- * an attribute's absence: a default that reflected would write an attribute
52145
- * onto every host that no server sent and nobody asked for.
52138
+ * them without a consumer writing a second rule. Absent is the top end, a
52139
+ * resting value being an attribute's absence: a default that reflected
52140
+ * would write an attribute onto every host that no server sent.
52146
52141
  * - `fullscreen-label`/`fullscreenLabel`: What the control that fills the screen is called.
52147
52142
  * - `idle-delay`/`idleDelay`: How long the reader may be still before the chrome hides, in milliseconds.
52148
52143
  *
52149
- * Zero keeps it up, which is the default: a map's controls are how a keyboard
52150
- * reader operates it, and chrome that hides itself by default would be this
52151
- * component undoing its own argument. Set it for a display map nobody drives.
52144
+ * Zero keeps it up, which is the default: these controls are how a keyboard
52145
+ * reader operates the surface, and chrome that hid itself by default would
52146
+ * be the component undoing its own argument. Set it for a display nobody
52147
+ * drives.
52148
+ * - `pan-label`/`panLabel`: What one pan control is called, with `{way}` filled in.
52149
+ * - `pan-step`/`panStep`: How far one press moves the view, as a fraction of what is on screen.
52150
+ *
52151
+ * A fraction rather than a distance, because this surface does not know the
52152
+ * scale of what is inside it: a quarter of the viewport is the same gesture
52153
+ * at any zoom, and a consumer who wants their own units multiplies by them.
52154
+ * - `zoom-in-label`/`zoomInLabel`: What the control that zooms in is called.
52155
+ * - `zoom-out-label`/`zoomOutLabel`: What the control that zooms out is called.
52152
52156
  * - `label`: Accessible name for the map, which is the one thing a consumer must write.
52153
52157
  *
52154
52158
  * There is no sensible default. "Map" names the widget rather than the place,
52155
52159
  * and a reader meeting three of them on a page learns nothing from hearing the
52156
52160
  * same word three times.
52157
- * - `pan-label`/`panLabel`: What the controls are called, for a page not in English.
52158
- * - `pan-step`/`panStep`: How far one press moves the map, as a fraction of what is on screen.
52159
52161
  *
52160
- * A fraction rather than a distance, because this frame does not know the
52161
- * scale of what is inside it: a quarter of the viewport is the same gesture at
52162
- * street level and at country level, and a consumer who wants metres can
52163
- * multiply by their own.
52164
- * - `zoom-in-label`/`zoomInLabel`: What the zoom controls are called.
52165
- * - `zoom-out-label`/`zoomOutLabel`: What the zoom control that goes the other way is called.
52162
+ * **The region is a tab stop**, so the keys are reachable however the controls
52163
+ * are configured: the listener is on the region, and without a stop of its own
52164
+ * a frame at `controls="none"` around a map with nothing focusable in it had
52165
+ * arrow keys no reader could ever press. `aria-keyshortcuts` says which keys
52166
+ * rather than spelling them into the name, which would otherwise be read out
52167
+ * at every encounter.
52166
52168
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
52167
52169
  *
52168
52170
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -52204,9 +52206,9 @@ export type CustomElementsSolidJs = {
52204
52206
  *
52205
52207
  * Methods that can be called to access component functionality.
52206
52208
  *
52207
- * - `toggleFullscreen() => void`: Fills the screen with the frame, or comes back.
52208
- * - `pan(to: Way) => void`: Asks for the map to move, which the consumer answers.
52209
- * - `zoom(by: number) => void`: Asks for the map to zoom, `1` in and `-1` out.
52209
+ * - `pan(to: ViewportWay) => void`: Asks for the view to move, which the consumer answers.
52210
+ * - `zoom(by: number) => void`: Asks for the view to zoom, `1` in and `-1` out.
52211
+ * - `toggleFullscreen() => void`: Fills the screen with the surface, or comes back.
52210
52212
  *
52211
52213
  * ## CSS Custom Properties
52212
52214
  *