@slotted/angular 0.1.0-beta.3 → 0.1.0-beta.5

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.
Files changed (120) hide show
  1. package/docs/AGENTS.snippet.md +2 -0
  2. package/docs/app-shell.examples.md +1 -1
  3. package/docs/app-shell.json +4 -4
  4. package/docs/app-shell.md +2 -2
  5. package/docs/calendar.json +7 -0
  6. package/docs/calendar.md +1 -0
  7. package/docs/date-field.json +8 -1
  8. package/docs/date-field.md +2 -1
  9. package/docs/date-picker.examples.md +36 -0
  10. package/docs/date-picker.json +20 -5
  11. package/docs/date-picker.md +5 -4
  12. package/docs/guidelines/README.md +2 -2
  13. package/docs/guidelines/composition.md +10 -0
  14. package/docs/guidelines/index.md +3 -1
  15. package/docs/guidelines/list-pages.md +12 -1
  16. package/docs/guidelines/own-elements.md +1 -1
  17. package/docs/page-header.json +1 -0
  18. package/docs/page-header.md +1 -1
  19. package/docs/page.json +1 -0
  20. package/docs/page.md +1 -0
  21. package/docs/skills/build-own-element/SKILL.md +6 -6
  22. package/docs/skills/compose-screen/SKILL.md +13 -6
  23. package/docs/skills/review-screen/SKILL.md +6 -6
  24. package/docs/skills/theme-app/SKILL.md +1 -1
  25. package/docs/skills/waiting-states/SKILL.md +2 -2
  26. package/docs/table.json +13 -0
  27. package/docs/table.md +3 -1
  28. package/docs/tabs.json +13 -3
  29. package/docs/tabs.md +3 -2
  30. package/docs/text-field.json +1 -1
  31. package/docs/text-field.md +1 -1
  32. package/fesm2022/slotted-angular-app-shell.mjs +15 -9
  33. package/fesm2022/slotted-angular-app-shell.mjs.map +1 -1
  34. package/fesm2022/slotted-angular-calendar.mjs +158 -33
  35. package/fesm2022/slotted-angular-calendar.mjs.map +1 -1
  36. package/fesm2022/slotted-angular-cascader.mjs +7 -1
  37. package/fesm2022/slotted-angular-cascader.mjs.map +1 -1
  38. package/fesm2022/slotted-angular-chart.mjs +13 -3
  39. package/fesm2022/slotted-angular-chart.mjs.map +1 -1
  40. package/fesm2022/slotted-angular-combobox.mjs +25 -4
  41. package/fesm2022/slotted-angular-combobox.mjs.map +1 -1
  42. package/fesm2022/slotted-angular-data-grid.mjs +2 -2
  43. package/fesm2022/slotted-angular-data-grid.mjs.map +1 -1
  44. package/fesm2022/slotted-angular-date-field.mjs +35 -12
  45. package/fesm2022/slotted-angular-date-field.mjs.map +1 -1
  46. package/fesm2022/slotted-angular-date-picker.mjs +95 -33
  47. package/fesm2022/slotted-angular-date-picker.mjs.map +1 -1
  48. package/fesm2022/slotted-angular-date-range-picker.mjs +5 -7
  49. package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -1
  50. package/fesm2022/slotted-angular-datetime-picker.mjs +5 -7
  51. package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -1
  52. package/fesm2022/slotted-angular-datetime-range-picker.mjs +5 -7
  53. package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -1
  54. package/fesm2022/slotted-angular-entity-picker.mjs +7 -1
  55. package/fesm2022/slotted-angular-entity-picker.mjs.map +1 -1
  56. package/fesm2022/slotted-angular-filter-bar.mjs +1 -1
  57. package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -1
  58. package/fesm2022/slotted-angular-import-export-center.mjs +1 -1
  59. package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -1
  60. package/fesm2022/slotted-angular-multi-select.mjs +24 -3
  61. package/fesm2022/slotted-angular-multi-select.mjs.map +1 -1
  62. package/fesm2022/slotted-angular-page-header.mjs +2 -2
  63. package/fesm2022/slotted-angular-page-header.mjs.map +1 -1
  64. package/fesm2022/slotted-angular-page.mjs +20 -1
  65. package/fesm2022/slotted-angular-page.mjs.map +1 -1
  66. package/fesm2022/slotted-angular-popover.mjs +7 -1
  67. package/fesm2022/slotted-angular-popover.mjs.map +1 -1
  68. package/fesm2022/slotted-angular-scroll-area.mjs +6 -2
  69. package/fesm2022/slotted-angular-scroll-area.mjs.map +1 -1
  70. package/fesm2022/slotted-angular-select.mjs +49 -17
  71. package/fesm2022/slotted-angular-select.mjs.map +1 -1
  72. package/fesm2022/slotted-angular-stat-card.mjs +2 -2
  73. package/fesm2022/slotted-angular-stat-card.mjs.map +1 -1
  74. package/fesm2022/slotted-angular-table.mjs +24 -6
  75. package/fesm2022/slotted-angular-table.mjs.map +1 -1
  76. package/fesm2022/slotted-angular-tabs.mjs +13 -6
  77. package/fesm2022/slotted-angular-tabs.mjs.map +1 -1
  78. package/fesm2022/slotted-angular-time-picker.mjs +4 -6
  79. package/fesm2022/slotted-angular-time-picker.mjs.map +1 -1
  80. package/fesm2022/slotted-angular-time-range-picker.mjs +4 -6
  81. package/fesm2022/slotted-angular-time-range-picker.mjs.map +1 -1
  82. package/fesm2022/slotted-angular-tooltip.mjs +7 -1
  83. package/fesm2022/slotted-angular-tooltip.mjs.map +1 -1
  84. package/package.json +3 -3
  85. package/types/slotted-angular-app-shell.d.ts +5 -3
  86. package/types/slotted-angular-app-shell.d.ts.map +1 -1
  87. package/types/slotted-angular-calendar.d.ts +28 -2
  88. package/types/slotted-angular-calendar.d.ts.map +1 -1
  89. package/types/slotted-angular-cascader.d.ts.map +1 -1
  90. package/types/slotted-angular-chart.d.ts +1 -0
  91. package/types/slotted-angular-chart.d.ts.map +1 -1
  92. package/types/slotted-angular-combobox.d.ts +4 -0
  93. package/types/slotted-angular-combobox.d.ts.map +1 -1
  94. package/types/slotted-angular-date-field.d.ts +11 -1
  95. package/types/slotted-angular-date-field.d.ts.map +1 -1
  96. package/types/slotted-angular-date-picker.d.ts +38 -12
  97. package/types/slotted-angular-date-picker.d.ts.map +1 -1
  98. package/types/slotted-angular-date-range-picker.d.ts +0 -1
  99. package/types/slotted-angular-date-range-picker.d.ts.map +1 -1
  100. package/types/slotted-angular-datetime-picker.d.ts +0 -1
  101. package/types/slotted-angular-datetime-picker.d.ts.map +1 -1
  102. package/types/slotted-angular-datetime-range-picker.d.ts +0 -1
  103. package/types/slotted-angular-datetime-range-picker.d.ts.map +1 -1
  104. package/types/slotted-angular-entity-picker.d.ts.map +1 -1
  105. package/types/slotted-angular-multi-select.d.ts +4 -0
  106. package/types/slotted-angular-multi-select.d.ts.map +1 -1
  107. package/types/slotted-angular-page.d.ts.map +1 -1
  108. package/types/slotted-angular-popover.d.ts.map +1 -1
  109. package/types/slotted-angular-scroll-area.d.ts.map +1 -1
  110. package/types/slotted-angular-select.d.ts +12 -2
  111. package/types/slotted-angular-select.d.ts.map +1 -1
  112. package/types/slotted-angular-table.d.ts +17 -2
  113. package/types/slotted-angular-table.d.ts.map +1 -1
  114. package/types/slotted-angular-tabs.d.ts +3 -4
  115. package/types/slotted-angular-tabs.d.ts.map +1 -1
  116. package/types/slotted-angular-time-picker.d.ts +0 -1
  117. package/types/slotted-angular-time-picker.d.ts.map +1 -1
  118. package/types/slotted-angular-time-range-picker.d.ts +0 -1
  119. package/types/slotted-angular-time-range-picker.d.ts.map +1 -1
  120. package/types/slotted-angular-tooltip.d.ts.map +1 -1
package/docs/table.json CHANGED
@@ -12,6 +12,10 @@
12
12
  "ruled",
13
13
  "framed"
14
14
  ],
15
+ "edges": [
16
+ "inset",
17
+ "flush"
18
+ ],
15
19
  "striped": [
16
20
  true,
17
21
  false
@@ -71,6 +75,7 @@
71
75
  "nativeElement": "div",
72
76
  "defaults": {
73
77
  "variant": "ruled",
78
+ "edges": "inset",
74
79
  "striped": false,
75
80
  "stickyHeader": false,
76
81
  "stickyTo": "scroll",
@@ -420,6 +425,13 @@
420
425
  "appliesTo": "slTable",
421
426
  "description": "How much of a frame the set is given"
422
427
  },
428
+ {
429
+ "name": "edges",
430
+ "type": "'inset' | 'flush'",
431
+ "defaultValue": "inset",
432
+ "appliesTo": "slTable",
433
+ "description": "Whether the first and the last column keep the cell inset on their outer side. flush lines a plain or ruled table up with the heading around it, leaving the theme’s --slotted-table-edge-inset (0 unless set); a framed table ignores it. Sticky and selection columns keep their own offsets"
434
+ },
423
435
  {
424
436
  "name": "striped",
425
437
  "type": "boolean",
@@ -809,6 +821,7 @@
809
821
  "--slotted-table-color-muted",
810
822
  "--slotted-table-column-actions-size",
811
823
  "--slotted-table-control-radius",
824
+ "--slotted-table-edge-inset",
812
825
  "--slotted-table-font-family",
813
826
  "--slotted-table-font-size",
814
827
  "--slotted-table-gap",
package/docs/table.md CHANGED
@@ -205,6 +205,7 @@ export class TableBasic {
205
205
  | `expanded` | `model<readonly string[]>` | [] | slTable | The rows whose detail is open, two-way |
206
206
  | `defaultExpanded` | `model initial value` | [] | slTable | The details an unbound table starts with |
207
207
  | `variant` | `'plain' \| 'ruled' \| 'framed'` | ruled | slTable | How much of a frame the set is given |
208
+ | `edges` | `'inset' \| 'flush'` | inset | slTable | Whether the first and the last column keep the cell inset on their outer side. flush lines a plain or ruled table up with the heading around it, leaving the theme’s --slotted-table-edge-inset (0 unless set); a framed table ignores it. Sticky and selection columns keep their own offsets |
208
209
  | `striped` | `boolean` | false | slTable | A tinted ground on every second record |
209
210
  | `stickyHeader` | `boolean` | false | slTable | Whether the header stays while the body scrolls |
210
211
  | `stickyFooter` | `boolean` | false | slTable | Whether the summary rows stay while the body scrolls. It pins the tfoot and not the footer bar, which never scrolls. |
@@ -265,6 +266,7 @@ export class TableBasic {
265
266
  | Axis | Values | Default |
266
267
  | --- | --- | --- |
267
268
  | `variant` | `plain`, `ruled`, `framed` | `ruled` |
269
+ | `edges` | `inset`, `flush` | `inset` |
268
270
  | `striped` | `true`, `false` | `false` |
269
271
  | `stickyHeader` | `true`, `false` | `false` |
270
272
  | `stickyFooter` | `true`, `false` | `false` |
@@ -292,7 +294,7 @@ export class TableBasic {
292
294
 
293
295
  ## Tokens
294
296
 
295
- `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-md`, `--slotted-control-gap-md`, `--slotted-control-height-md`, `--slotted-control-icon-size-md`, `--slotted-control-padding-inline-md`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-foreground`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-regular`, `--slotted-font-weight-semibold`, `--slotted-ground`, `--slotted-line-height-md`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-shadow-xs`, `--slotted-space-2`, `--slotted-space-5`, `--slotted-space-9`, `--slotted-surface`, `--slotted-table-border-color`, `--slotted-table-border-color-strong`, `--slotted-table-border-width`, `--slotted-table-cell-padding-block`, `--slotted-table-cell-padding-inline`, `--slotted-table-color`, `--slotted-table-color-muted`, `--slotted-table-column-actions-size`, `--slotted-table-control-radius`, `--slotted-table-font-family`, `--slotted-table-font-size`, `--slotted-table-gap`, `--slotted-table-group-color`, `--slotted-table-group-sticky-offset`, `--slotted-table-group-surface`, `--slotted-table-header-surface`, `--slotted-table-header-surface-hover`, `--slotted-table-icon-size`, `--slotted-table-radius`, `--slotted-table-row-color-selected`, `--slotted-table-row-min-block-size`, `--slotted-table-row-surface-current`, `--slotted-table-row-surface-hover`, `--slotted-table-row-surface-selected`, `--slotted-table-row-surface-selected-hover`, `--slotted-table-row-surface-stripe`, `--slotted-table-selection-size`, `--slotted-table-shadow`, `--slotted-table-sticky-inset`, `--slotted-table-sticky-offset`, `--slotted-table-sticky-offset-end`, `--slotted-table-surface`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-sticky`
297
+ `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-md`, `--slotted-control-gap-md`, `--slotted-control-height-md`, `--slotted-control-icon-size-md`, `--slotted-control-padding-inline-md`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-foreground`, `--slotted-duration-short`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-regular`, `--slotted-font-weight-semibold`, `--slotted-ground`, `--slotted-line-height-md`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-shadow-xs`, `--slotted-space-2`, `--slotted-space-5`, `--slotted-space-9`, `--slotted-surface`, `--slotted-table-border-color`, `--slotted-table-border-color-strong`, `--slotted-table-border-width`, `--slotted-table-cell-padding-block`, `--slotted-table-cell-padding-inline`, `--slotted-table-color`, `--slotted-table-color-muted`, `--slotted-table-column-actions-size`, `--slotted-table-control-radius`, `--slotted-table-edge-inset`, `--slotted-table-font-family`, `--slotted-table-font-size`, `--slotted-table-gap`, `--slotted-table-group-color`, `--slotted-table-group-sticky-offset`, `--slotted-table-group-surface`, `--slotted-table-header-surface`, `--slotted-table-header-surface-hover`, `--slotted-table-icon-size`, `--slotted-table-radius`, `--slotted-table-row-color-selected`, `--slotted-table-row-min-block-size`, `--slotted-table-row-surface-current`, `--slotted-table-row-surface-hover`, `--slotted-table-row-surface-selected`, `--slotted-table-row-surface-selected-hover`, `--slotted-table-row-surface-stripe`, `--slotted-table-selection-size`, `--slotted-table-shadow`, `--slotted-table-sticky-inset`, `--slotted-table-sticky-offset`, `--slotted-table-sticky-offset-end`, `--slotted-table-surface`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-subtle-hover`, `--slotted-tone-accent-surface`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-z-index-sticky`
296
298
 
297
299
  ## Examples
298
300
 
package/docs/tabs.json CHANGED
@@ -78,6 +78,7 @@
78
78
  "label",
79
79
  "end",
80
80
  "dismiss",
81
+ "marker",
81
82
  "panel",
82
83
  "scroll",
83
84
  "actions"
@@ -108,7 +109,7 @@
108
109
  "part": "item",
109
110
  "element": "the slTab host, with role=\"presentation\"",
110
111
  "required": true,
111
- "purpose": "One tab and its optional close button. It exists because a button cannot contain a button, and because the marker spans the tab and its close button together. A class or an attribute written on slTab lands on it."
112
+ "purpose": "One tab and its optional close button. It exists because a button cannot contain a button, and it carries the hover bar under the tab. A class or an attribute written on slTab lands on it."
112
113
  },
113
114
  {
114
115
  "part": "tab",
@@ -140,6 +141,12 @@
140
141
  "required": false,
141
142
  "purpose": "The close button. It has tabindex=\"-1\", so the arrow keys move between tabs only, and it stays in the accessibility tree, so a screen reader can press it. From the keyboard, Delete closes the focused tab, which aria-keyshortcuts on the tab announces."
142
143
  },
144
+ {
145
+ "part": "marker",
146
+ "element": "span, aria-hidden",
147
+ "required": false,
148
+ "purpose": "The bar under the selected tab. The list draws one and slides it between tabs; it spans the tab’s content box, never the close button. --slotted-tabs-marker-size, --slotted-tabs-marker-radius and --slotted-tabs-marker-inset shape it, and the hover bar takes the same geometry at --slotted-tabs-hover-marker-opacity."
149
+ },
143
150
  {
144
151
  "part": "panel",
145
152
  "element": "the element carrying slTabPanel, with role=\"tabpanel\"",
@@ -369,7 +376,7 @@
369
376
  "The paging controls are aria-hidden and outside the Tab sequence, because the arrow keys reach every tab and scroll it into view. Cloudscape’s guidance warns against extra Tab stops between a tab list and its panel.",
370
377
  "A list that starts to overflow scrolls the selected tab into view once its paging controls are drawn, so the selected tab is not left behind the end control.",
371
378
  "Each tab names its panel with aria-controls and each panel names its tab with aria-labelledby. The ids come from the value, with the characters an id cannot hold escaped rather than replaced, so two values that differ only by a space never share a panel.",
372
- "The selected tab is never shown by colour alone: the marker is a bar the width of a thick border, which stays visible in the high-contrast scheme, where the theme paints every surface Canvas and the fill of the contained variant disappears.",
379
+ "The selected tab is never shown by colour alone: the marker is a bar never thinner than a thick border, which stays visible in the high-contrast scheme, where the theme paints every surface Canvas and the fill of the contained variant disappears.",
373
380
  "A panel carries tabindex=\"0\", so the Tab key reaches it from the list. The pattern permits that stop even when the panel’s first content is focusable."
374
381
  ]
375
382
  }
@@ -415,7 +422,6 @@
415
422
  "--slotted-radius-full",
416
423
  "--slotted-radius-md",
417
424
  "--slotted-radius-sm",
418
- "--slotted-radius-xs",
419
425
  "--slotted-shadow-xs",
420
426
  "--slotted-space-1",
421
427
  "--slotted-space-2",
@@ -439,8 +445,12 @@
439
445
  "--slotted-tabs-hover-background",
440
446
  "--slotted-tabs-hover-color",
441
447
  "--slotted-tabs-hover-marker-color",
448
+ "--slotted-tabs-hover-marker-opacity",
442
449
  "--slotted-tabs-list-gap",
443
450
  "--slotted-tabs-marker-color",
451
+ "--slotted-tabs-marker-inset",
452
+ "--slotted-tabs-marker-radius",
453
+ "--slotted-tabs-marker-size",
444
454
  "--slotted-tabs-scroll-color",
445
455
  "--slotted-tabs-selected-color",
446
456
  "--slotted-tabs-track-color",
package/docs/tabs.md CHANGED
@@ -136,6 +136,7 @@ export class TabsBasic {
136
136
  | `label` | span | yes |
137
137
  | `end` | the element carrying slTabEnd | no |
138
138
  | `dismiss` | button | no |
139
+ | `marker` | span, aria-hidden | no |
139
140
  | `panel` | the element carrying slTabPanel, with role="tabpanel" | yes |
140
141
  | `scroll` | button | no |
141
142
  | `actions` | the element carrying slTabActions | no |
@@ -199,12 +200,12 @@ export class TabsBasic {
199
200
  - The paging controls are aria-hidden and outside the Tab sequence, because the arrow keys reach every tab and scroll it into view. Cloudscape’s guidance warns against extra Tab stops between a tab list and its panel.
200
201
  - A list that starts to overflow scrolls the selected tab into view once its paging controls are drawn, so the selected tab is not left behind the end control.
201
202
  - Each tab names its panel with aria-controls and each panel names its tab with aria-labelledby. The ids come from the value, with the characters an id cannot hold escaped rather than replaced, so two values that differ only by a space never share a panel.
202
- - The selected tab is never shown by colour alone: the marker is a bar the width of a thick border, which stays visible in the high-contrast scheme, where the theme paints every surface Canvas and the fill of the contained variant disappears.
203
+ - The selected tab is never shown by colour alone: the marker is a bar never thinner than a thick border, which stays visible in the high-contrast scheme, where the theme paints every surface Canvas and the fill of the contained variant disappears.
203
204
  - A panel carries tabindex="0", so the Tab key reaches it from the list. The pattern permits that stop even when the panel’s first content is focusable.
204
205
 
205
206
  ## Tokens
206
207
 
207
- `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-lg`, `--slotted-control-font-size-md`, `--slotted-control-font-size-sm`, `--slotted-control-font-weight`, `--slotted-control-gap-lg`, `--slotted-control-gap-md`, `--slotted-control-gap-sm`, `--slotted-control-height-lg`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-lg`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-control-inner-size-lg`, `--slotted-control-inner-size-md`, `--slotted-control-inner-size-sm`, `--slotted-control-letter-spacing`, `--slotted-control-line-height`, `--slotted-control-padding-inline-lg`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-background`, `--slotted-disabled-border`, `--slotted-disabled-foreground`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-radius-full`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-radius-xs`, `--slotted-shadow-xs`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-6`, `--slotted-surface`, `--slotted-surface-sunken`, `--slotted-tabs-actions-gap`, `--slotted-tabs-active-background`, `--slotted-tabs-active-marker-color`, `--slotted-tabs-color`, `--slotted-tabs-contained-background`, `--slotted-tabs-contained-selected-background`, `--slotted-tabs-dismiss-active-background`, `--slotted-tabs-dismiss-active-color`, `--slotted-tabs-dismiss-color`, `--slotted-tabs-dismiss-hover-background`, `--slotted-tabs-dismiss-hover-color`, `--slotted-tabs-fade-size`, `--slotted-tabs-gap`, `--slotted-tabs-hover-background`, `--slotted-tabs-hover-color`, `--slotted-tabs-hover-marker-color`, `--slotted-tabs-list-gap`, `--slotted-tabs-marker-color`, `--slotted-tabs-scroll-color`, `--slotted-tabs-selected-color`, `--slotted-tabs-track-color`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-solid`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`
208
+ `--slotted-border-strong`, `--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-font-size-lg`, `--slotted-control-font-size-md`, `--slotted-control-font-size-sm`, `--slotted-control-font-weight`, `--slotted-control-gap-lg`, `--slotted-control-gap-md`, `--slotted-control-gap-sm`, `--slotted-control-height-lg`, `--slotted-control-height-md`, `--slotted-control-height-sm`, `--slotted-control-icon-size-lg`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-control-inner-size-lg`, `--slotted-control-inner-size-md`, `--slotted-control-inner-size-sm`, `--slotted-control-letter-spacing`, `--slotted-control-line-height`, `--slotted-control-padding-inline-lg`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-background`, `--slotted-disabled-border`, `--slotted-disabled-foreground`, `--slotted-duration-short`, `--slotted-easing-enter`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-radius-full`, `--slotted-radius-md`, `--slotted-radius-sm`, `--slotted-shadow-xs`, `--slotted-space-1`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-6`, `--slotted-surface`, `--slotted-surface-sunken`, `--slotted-tabs-actions-gap`, `--slotted-tabs-active-background`, `--slotted-tabs-active-marker-color`, `--slotted-tabs-color`, `--slotted-tabs-contained-background`, `--slotted-tabs-contained-selected-background`, `--slotted-tabs-dismiss-active-background`, `--slotted-tabs-dismiss-active-color`, `--slotted-tabs-dismiss-color`, `--slotted-tabs-dismiss-hover-background`, `--slotted-tabs-dismiss-hover-color`, `--slotted-tabs-fade-size`, `--slotted-tabs-gap`, `--slotted-tabs-hover-background`, `--slotted-tabs-hover-color`, `--slotted-tabs-hover-marker-color`, `--slotted-tabs-hover-marker-opacity`, `--slotted-tabs-list-gap`, `--slotted-tabs-marker-color`, `--slotted-tabs-marker-inset`, `--slotted-tabs-marker-radius`, `--slotted-tabs-marker-size`, `--slotted-tabs-scroll-color`, `--slotted-tabs-selected-color`, `--slotted-tabs-track-color`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-solid`, `--slotted-tone-accent-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`
208
209
 
209
210
  ## Examples
210
211
 
@@ -256,7 +256,7 @@
256
256
  "type": "'text' | 'search' | 'email' | 'url' | 'tel' | 'password'",
257
257
  "defaultValue": "text",
258
258
  "appliesTo": "the input element",
259
- "description": "The input’s own type, written as a static attribute. It is read before the host binding computes, so the reveal toggle can swap it and restore what you wrote."
259
+ "description": "The input’s own type, one of the six listed, written as a static attribute. It is read before the host binding computes, so the reveal toggle can swap it and restore what you wrote. A date, a time, a month or a number is not a text field: use date-picker (forms.md FM-16), time-picker or number-field. Other strings still reach the element for compatibility and are not supported."
260
260
  },
261
261
  {
262
262
  "name": "copyable",
@@ -78,7 +78,7 @@ export class TextFieldBasic {}
78
78
  | `readOnly` | `boolean` | from the field, or false | slTextFieldInput | Unset by default, so the input takes the state of the field around it. It is the native readonly: the input stays focusable and selectable, and its value is submitted. A static readonly attribute you write is read before the binding computes. |
79
79
  | `invalid` | `boolean` | from the field, or false | slTextFieldInput | Unset by default, so the input takes the state of the field around it. It sets aria-invalid on the input and data-invalid on the frame. |
80
80
  | `required` | `boolean` | — | the input element | The input’s own attribute; slTextFieldInput never writes it. A field marks a required value with aria-required instead, because the native attribute turns on browser constraint validation. |
81
- | `type` | `'text' \| 'search' \| 'email' \| 'url' \| 'tel' \| 'password'` | text | the input element | The input’s own type, written as a static attribute. It is read before the host binding computes, so the reveal toggle can swap it and restore what you wrote. |
81
+ | `type` | `'text' \| 'search' \| 'email' \| 'url' \| 'tel' \| 'password'` | text | the input element | The input’s own type, one of the six listed, written as a static attribute. It is read before the host binding computes, so the reveal toggle can swap it and restore what you wrote. A date, a time, a month or a number is not a text field: use date-picker (forms.md FM-16), time-picker or number-field. Other strings still reach the element for compatibility and are not supported. |
82
82
  | `copyable` | `boolean` | false | slTextField | Draws a button that writes the value to the clipboard, shows a check for two seconds and announces the outcome. It is hidden while the value is empty or the input is disabled. |
83
83
  | `loading` | `boolean` | false | slTextField | Draws the shared spinner before the buttons and sets aria-busy on the input; the value stays editable. Once loading is bound, false included, the spinner keeps its place so it can leave with a transition. |
84
84
  | `messages` | `Partial<TextFieldMessages>` | — | slTextField | Replaces words of the active language, key by key. clear, reveal and copy name the buttons; reveal does not change with the state, because aria-pressed carries it. copied and copyFailed announce the outcome of a copy. capsLock is announced once when Caps Lock turns on in a focused password field. |
@@ -1,6 +1,6 @@
1
1
  import { createDismissableLayer } from '@slotted/core/dismissable-layer';
2
2
  import { extentAtPoint, holdResizeGesture, anchorsAtStart, stepAmountFromPixels, EXTENT_LARGE_STEP_PX, EXTENT_STEP_PX, stepExtent } from '@slotted/core/extent';
3
- import { createFocusScope } from '@slotted/core/focus';
3
+ import { createFocusScope, focusTarget } from '@slotted/core/focus';
4
4
  import { appShellMessages } from '@slotted/core/i18n';
5
5
  import { COMPACT_BELOW, clamp, createWidthGate } from '@slotted/core/measure';
6
6
  import { setPortalContainer } from '@slotted/core/portal';
@@ -580,7 +580,8 @@ class SlAppShell {
580
580
  }
581
581
  /** Moves focus into the content region, which is where a skip link sends it. */
582
582
  focusMain() {
583
- this.nodes.main?.focus();
583
+ if (this.nodes.main)
584
+ focusTarget(this.nodes.main);
584
585
  }
585
586
  /**
586
587
  * A click that lands on an `a[href]` inside the region asks to close, in the
@@ -604,7 +605,9 @@ class SlAppShell {
604
605
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SlAppShell, isStandalone: true, selector: "[slAppShell]", inputs: { navOpen: { classPropertyName: "navOpen", publicName: "navOpen", isSignal: true, isRequired: false, transformFunction: null }, asideOpen: { classPropertyName: "asideOpen", publicName: "asideOpen", isSignal: true, isRequired: false, transformFunction: null }, asideExtent: { classPropertyName: "asideExtent", publicName: "asideExtent", isSignal: true, isRequired: false, transformFunction: null }, minAsideExtent: { classPropertyName: "minAsideExtent", publicName: "minAsideExtent", isSignal: true, isRequired: false, transformFunction: null }, maxAsideExtent: { classPropertyName: "maxAsideExtent", publicName: "maxAsideExtent", isSignal: true, isRequired: false, transformFunction: null }, primary: { classPropertyName: "primary", publicName: "primary", isSignal: true, isRequired: false, transformFunction: null }, canvas: { classPropertyName: "canvas", publicName: "canvas", isSignal: true, isRequired: false, transformFunction: null }, navMode: { classPropertyName: "navMode", publicName: "navMode", isSignal: true, isRequired: false, transformFunction: null }, navSide: { classPropertyName: "navSide", publicName: "navSide", isSignal: true, isRequired: false, transformFunction: null }, navSize: { classPropertyName: "navSize", publicName: "navSize", isSignal: true, isRequired: false, transformFunction: null }, asideMode: { classPropertyName: "asideMode", publicName: "asideMode", isSignal: true, isRequired: false, transformFunction: null }, asideSize: { classPropertyName: "asideSize", publicName: "asideSize", isSignal: true, isRequired: false, transformFunction: null }, collapsedTo: { classPropertyName: "collapsedTo", publicName: "collapsedTo", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, separation: { classPropertyName: "separation", publicName: "separation", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, escape: { classPropertyName: "escape", publicName: "escape", isSignal: true, isRequired: false, transformFunction: null }, outsidePress: { classPropertyName: "outsidePress", publicName: "outsidePress", isSignal: true, isRequired: false, transformFunction: null }, back: { classPropertyName: "back", publicName: "back", isSignal: true, isRequired: false, transformFunction: null }, closeOnNavigate: { classPropertyName: "closeOnNavigate", publicName: "closeOnNavigate", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navOpen: "navOpenChange", asideOpen: "asideOpenChange", asideExtent: "asideExtentChange", navOpenChangeRequest: "navOpenChangeRequest", asideOpenChangeRequest: "asideOpenChangeRequest", asideExtentChangeRequest: "asideExtentChangeRequest" }, host: { attributes: { "data-ui": "app-shell", "data-part": "root" }, listeners: { "click": "onClick($event)" }, properties: { "attr.data-primary": "resolvedPrimary()", "attr.data-canvas": "resolvedCanvas()", "attr.data-nav-mode": "resolvedMode()", "attr.data-aside-mode": "resolvedAsideMode()", "attr.data-nav-side": "resolvedNavSide()", "attr.data-nav-size": "resolvedNavSize()", "attr.data-aside-size": "resolvedAsideSize()", "attr.data-collapsed-to": "resolvedCollapsedTo()", "attr.data-scroll": "resolvedScroll()", "attr.data-separation": "resolvedSeparation()", "attr.data-open": "navShownOpen() ? '' : null", "attr.data-dragging": "asideDragging() ? '' : null" } }, viewQueries: [{ propertyName: "veilRef", first: true, predicate: ["scrim"], descendants: true, isSignal: true }], exportAs: ["slAppShell"], ngImport: i0, template: `@if (skipTargets().length > 0) {
605
606
  <div data-part="skip">
606
607
  @for (target of skipTargets(); track target.href) {
607
- <a [href]="'#' + target.href">{{ target.label }}</a>
608
+ <a [href]="'#' + target.href" (click)="target.href === mainId && focusMain()">{{
609
+ target.label
610
+ }}</a>
608
611
  }
609
612
  </div>
610
613
  }
@@ -619,7 +622,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
619
622
  args: [{ selector: '[slAppShell]', standalone: true, exportAs: 'slAppShell', template: `@if (skipTargets().length > 0) {
620
623
  <div data-part="skip">
621
624
  @for (target of skipTargets(); track target.href) {
622
- <a [href]="'#' + target.href">{{ target.label }}</a>
625
+ <a [href]="'#' + target.href" (click)="target.href === mainId && focusMain()">{{
626
+ target.label
627
+ }}</a>
623
628
  }
624
629
  </div>
625
630
  }
@@ -816,9 +821,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
816
821
  /**
817
822
  * The `main` landmark, and the skip link's destination.
818
823
  *
819
- * `tabindex="-1"` is not decoration: a `main` without it takes the scroll and
820
- * leaves the focus behind in Safari and in Firefox, so the link appears to work
821
- * and moves nothing a screen reader follows.
824
+ * It carries no `tabindex` of its own: the skip link and `focusMain()` write
825
+ * `tabindex="-1"` for the one focus they move (`focusTarget`), and the blur or
826
+ * the next pointer press inside removes it. A `main` focusable all the time
827
+ * takes the focus of every click on its text, and the next key draws the ring
828
+ * around the page. A `tabindex` the consumer writes stays.
822
829
  */
823
830
  class SlAppShellMain {
824
831
  shell = attach('main');
@@ -833,7 +840,7 @@ class SlAppShellMain {
833
840
  inject(DestroyRef).onDestroy(remove);
834
841
  }
835
842
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAppShellMain, deps: [], target: i0.ɵɵFactoryTarget.Directive });
836
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlAppShellMain, isStandalone: true, selector: "main[slAppShellMain]", host: { attributes: { "data-part": "main", "tabindex": "-1" }, properties: { "attr.id": "elementId", "attr.aria-busy": "busy()" } }, exportAs: ["slAppShellMain"], ngImport: i0 });
843
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: SlAppShellMain, isStandalone: true, selector: "main[slAppShellMain]", host: { attributes: { "data-part": "main" }, properties: { "attr.id": "elementId", "attr.aria-busy": "busy()" } }, exportAs: ["slAppShellMain"], ngImport: i0 });
837
844
  }
838
845
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SlAppShellMain, decorators: [{
839
846
  type: Directive,
@@ -843,7 +850,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
843
850
  exportAs: 'slAppShellMain',
844
851
  host: {
845
852
  'data-part': 'main',
846
- tabindex: '-1',
847
853
  '[attr.id]': 'elementId',
848
854
  '[attr.aria-busy]': 'busy()',
849
855
  },