@slotted/angular 0.1.0-beta.2 → 0.1.0-beta.4
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/docs/app-shell.json +1 -1
- package/docs/button-group.json +1 -0
- package/docs/button-group.md +1 -1
- package/docs/button.json +45 -11
- package/docs/button.md +10 -6
- package/docs/calendar.json +7 -0
- package/docs/calendar.md +1 -0
- package/docs/chart.json +7 -0
- package/docs/chart.md +1 -0
- package/docs/currency-field.json +32 -1
- package/docs/currency-field.md +4 -1
- package/docs/date-field.json +8 -1
- package/docs/date-field.md +2 -1
- package/docs/date-picker.examples.md +36 -0
- package/docs/date-picker.json +20 -5
- package/docs/date-picker.md +5 -4
- package/docs/dialog.examples.md +20 -0
- package/docs/dialog.json +14 -2
- package/docs/dialog.md +1 -1
- package/docs/guidelines/composition.md +10 -0
- package/docs/guidelines/index.md +2 -0
- package/docs/guidelines/list-pages.md +12 -1
- package/docs/list.json +19 -1
- package/docs/list.md +3 -1
- package/docs/page.json +1 -0
- package/docs/page.md +1 -0
- package/docs/popover.json +1 -1
- package/docs/segmented-control.json +29 -1
- package/docs/segmented-control.md +17 -1
- package/docs/skills/compose-screen/SKILL.md +7 -0
- package/docs/skills/theme-app/SKILL.md +5 -0
- package/docs/split-button.json +1 -0
- package/docs/split-button.md +1 -1
- package/docs/stat-card.json +1 -0
- package/docs/stat-card.md +1 -1
- package/docs/table.examples.md +1 -1
- package/docs/table.json +83 -1
- package/docs/table.md +12 -1
- package/docs/text-field.json +1 -1
- package/docs/text-field.md +1 -1
- package/docs/toggle-group.json +14 -3
- package/docs/toggle-group.md +3 -3
- package/docs/toggle.json +12 -3
- package/docs/toggle.md +3 -3
- package/docs/tokens.md +25 -1
- package/docs/tour.json +1 -1
- package/fesm2022/slotted-angular-app-shell.mjs +48 -16
- package/fesm2022/slotted-angular-app-shell.mjs.map +1 -1
- package/fesm2022/slotted-angular-button-group.mjs +4 -4
- package/fesm2022/slotted-angular-button-group.mjs.map +1 -1
- package/fesm2022/slotted-angular-button.mjs +51 -19
- package/fesm2022/slotted-angular-button.mjs.map +1 -1
- package/fesm2022/slotted-angular-calendar.mjs +158 -33
- package/fesm2022/slotted-angular-calendar.mjs.map +1 -1
- package/fesm2022/slotted-angular-cascader.mjs +1 -1
- package/fesm2022/slotted-angular-cascader.mjs.map +1 -1
- package/fesm2022/slotted-angular-chart.mjs +41 -20
- package/fesm2022/slotted-angular-chart.mjs.map +1 -1
- package/fesm2022/slotted-angular-column-manager.mjs +1 -1
- package/fesm2022/slotted-angular-column-manager.mjs.map +1 -1
- package/fesm2022/slotted-angular-combobox.mjs +25 -4
- package/fesm2022/slotted-angular-combobox.mjs.map +1 -1
- package/fesm2022/slotted-angular-currency-field.mjs +59 -8
- package/fesm2022/slotted-angular-currency-field.mjs.map +1 -1
- package/fesm2022/slotted-angular-dashboard-grid.mjs +1 -1
- package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -1
- package/fesm2022/slotted-angular-data-grid.mjs +4 -4
- package/fesm2022/slotted-angular-data-grid.mjs.map +1 -1
- package/fesm2022/slotted-angular-data-list.mjs +2 -2
- package/fesm2022/slotted-angular-data-list.mjs.map +1 -1
- package/fesm2022/slotted-angular-date-field.mjs +35 -12
- package/fesm2022/slotted-angular-date-field.mjs.map +1 -1
- package/fesm2022/slotted-angular-date-picker.mjs +91 -27
- package/fesm2022/slotted-angular-date-picker.mjs.map +1 -1
- package/fesm2022/slotted-angular-date-range-picker.mjs +1 -1
- package/fesm2022/slotted-angular-date-range-picker.mjs.map +1 -1
- package/fesm2022/slotted-angular-datetime-picker.mjs +1 -1
- package/fesm2022/slotted-angular-datetime-picker.mjs.map +1 -1
- package/fesm2022/slotted-angular-datetime-range-picker.mjs +1 -1
- package/fesm2022/slotted-angular-datetime-range-picker.mjs.map +1 -1
- package/fesm2022/slotted-angular-dialog.mjs +4 -4
- package/fesm2022/slotted-angular-dialog.mjs.map +1 -1
- package/fesm2022/slotted-angular-event-calendar.mjs +1 -1
- package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -1
- package/fesm2022/slotted-angular-filter-bar.mjs +9 -9
- package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -1
- package/fesm2022/slotted-angular-import-export-center.mjs +1 -1
- package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -1
- package/fesm2022/slotted-angular-list.mjs +28 -17
- package/fesm2022/slotted-angular-list.mjs.map +1 -1
- package/fesm2022/slotted-angular-markdown.mjs +1 -1
- package/fesm2022/slotted-angular-markdown.mjs.map +1 -1
- package/fesm2022/slotted-angular-multi-select.mjs +24 -3
- package/fesm2022/slotted-angular-multi-select.mjs.map +1 -1
- package/fesm2022/slotted-angular-notification-center.mjs +1 -1
- package/fesm2022/slotted-angular-notification-center.mjs.map +1 -1
- package/fesm2022/slotted-angular-page.mjs +20 -1
- package/fesm2022/slotted-angular-page.mjs.map +1 -1
- package/fesm2022/slotted-angular-saved-views.mjs +1 -1
- package/fesm2022/slotted-angular-saved-views.mjs.map +1 -1
- package/fesm2022/slotted-angular-segmented-control.mjs +25 -5
- package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -1
- package/fesm2022/slotted-angular-split-button.mjs +4 -4
- package/fesm2022/slotted-angular-split-button.mjs.map +1 -1
- package/fesm2022/slotted-angular-stat-card.mjs +2 -2
- package/fesm2022/slotted-angular-stat-card.mjs.map +1 -1
- package/fesm2022/slotted-angular-table.mjs +107 -9
- package/fesm2022/slotted-angular-table.mjs.map +1 -1
- package/fesm2022/slotted-angular-toggle-group.mjs +17 -4
- package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -1
- package/fesm2022/slotted-angular-toggle.mjs +2 -2
- package/fesm2022/slotted-angular-toggle.mjs.map +1 -1
- package/fesm2022/slotted-angular-tour.mjs +1 -1
- package/fesm2022/slotted-angular-tour.mjs.map +1 -1
- package/fesm2022/slotted-angular-transfer.mjs +1 -1
- package/fesm2022/slotted-angular-transfer.mjs.map +1 -1
- package/fesm2022/slotted-angular-wizard.mjs +1 -1
- package/fesm2022/slotted-angular-wizard.mjs.map +1 -1
- package/package.json +3 -3
- package/types/slotted-angular-app-shell.d.ts +6 -0
- package/types/slotted-angular-app-shell.d.ts.map +1 -1
- package/types/slotted-angular-button-group.d.ts +1 -1
- package/types/slotted-angular-button.d.ts +33 -13
- package/types/slotted-angular-button.d.ts.map +1 -1
- package/types/slotted-angular-calendar.d.ts +28 -2
- package/types/slotted-angular-calendar.d.ts.map +1 -1
- package/types/slotted-angular-chart.d.ts +9 -0
- package/types/slotted-angular-chart.d.ts.map +1 -1
- package/types/slotted-angular-combobox.d.ts +4 -0
- package/types/slotted-angular-combobox.d.ts.map +1 -1
- package/types/slotted-angular-currency-field.d.ts +25 -3
- package/types/slotted-angular-currency-field.d.ts.map +1 -1
- package/types/slotted-angular-date-field.d.ts +11 -1
- package/types/slotted-angular-date-field.d.ts.map +1 -1
- package/types/slotted-angular-date-picker.d.ts +38 -11
- package/types/slotted-angular-date-picker.d.ts.map +1 -1
- package/types/slotted-angular-list.d.ts +42 -27
- package/types/slotted-angular-list.d.ts.map +1 -1
- package/types/slotted-angular-multi-select.d.ts +4 -0
- package/types/slotted-angular-multi-select.d.ts.map +1 -1
- package/types/slotted-angular-page.d.ts.map +1 -1
- package/types/slotted-angular-segmented-control.d.ts +15 -2
- package/types/slotted-angular-segmented-control.d.ts.map +1 -1
- package/types/slotted-angular-split-button.d.ts +2 -2
- package/types/slotted-angular-table.d.ts +59 -5
- package/types/slotted-angular-table.d.ts.map +1 -1
- package/types/slotted-angular-toggle-group.d.ts +8 -2
- package/types/slotted-angular-toggle-group.d.ts.map +1 -1
- package/types/slotted-angular-toggle.d.ts +1 -1
- package/types/slotted-angular-toggle.d.ts.map +1 -1
package/docs/date-picker.json
CHANGED
|
@@ -134,14 +134,14 @@
|
|
|
134
134
|
"api": [
|
|
135
135
|
{
|
|
136
136
|
"name": "value",
|
|
137
|
-
"type": "PlainDate | DateRange | PlainDate[] | null",
|
|
137
|
+
"type": "PlainDate | DateRange | PlainDate[] | PlainYearMonth | null",
|
|
138
138
|
"defaultValue": "—",
|
|
139
139
|
"appliesTo": "SlDatePicker",
|
|
140
|
-
"description": "The selected value, whose shape follows selectionMode. Binding it makes the value controlled."
|
|
140
|
+
"description": "The selected value, whose shape follows selectionMode. Binding it makes the value controlled. PlainDate is exported by @slotted/core/date. parseISODate(text) returns a PlainDate or null, toISODate(date) returns 'YYYY-MM-DD', and isPlainDate(value) narrows the CalendarValue (valueChange) reports."
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
"name": "defaultValue",
|
|
144
|
-
"type": "PlainDate | DateRange | PlainDate[] | null",
|
|
144
|
+
"type": "PlainDate | DateRange | PlainDate[] | PlainYearMonth | null",
|
|
145
145
|
"defaultValue": "—",
|
|
146
146
|
"appliesTo": "SlDatePicker",
|
|
147
147
|
"description": "The starting value of an uncontrolled date picker. Read once, when the date picker initializes."
|
|
@@ -162,14 +162,14 @@
|
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
164
|
"name": "min",
|
|
165
|
-
"type": "PlainDate",
|
|
165
|
+
"type": "PlainDate | PlainYearMonth",
|
|
166
166
|
"defaultValue": "—",
|
|
167
167
|
"appliesTo": "SlDatePicker",
|
|
168
168
|
"description": "The earliest date the field and the calendar accept. Earlier days are disabled in the calendar, an earlier typed date marks the date picker invalid, and a form reports slottedDateRange."
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"name": "max",
|
|
172
|
-
"type": "PlainDate",
|
|
172
|
+
"type": "PlainDate | PlainYearMonth",
|
|
173
173
|
"defaultValue": "—",
|
|
174
174
|
"appliesTo": "SlDatePicker",
|
|
175
175
|
"description": "The latest date the field and the calendar accept. Later days are disabled in the calendar, a later typed date marks the date picker invalid, and a form reports slottedDateRange."
|
|
@@ -181,6 +181,13 @@
|
|
|
181
181
|
"appliesTo": "SlDatePicker",
|
|
182
182
|
"description": "Returns true for a date the reader cannot choose. The calendar disables it, a typed unavailable date marks the date picker invalid, and a form reports slottedDateUnavailable."
|
|
183
183
|
},
|
|
184
|
+
{
|
|
185
|
+
"name": "granularity",
|
|
186
|
+
"type": "'day' | 'month'",
|
|
187
|
+
"defaultValue": "day",
|
|
188
|
+
"appliesTo": "SlDatePicker",
|
|
189
|
+
"description": "What a choice is. month opens the calendar on the months of a year and chooses a month cell; the field shows the month and the year segments; value, defaultValue, min and max are PlainYearMonth from @slotted/core/date ({ year, month }), (valueChange) reports one, and name submits YYYY-MM. parseISOYearMonth and toISOYearMonth convert to and from that text. selectionMode, months, isDateUnavailable and the week inputs do not apply."
|
|
190
|
+
},
|
|
184
191
|
{
|
|
185
192
|
"name": "selectionMode",
|
|
186
193
|
"type": "'single' | 'range' | 'multiple'",
|
|
@@ -636,6 +643,14 @@
|
|
|
636
643
|
"source": "import { Component, computed, signal } from '@angular/core';\nimport type { CalendarValue } from '@slotted/angular/calendar';\nimport { SlDatePicker } from '@slotted/angular/date-picker';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { SlSelect, SlSelectItem, type SelectSelection } from '@slotted/angular/select';\nimport { SlStack } from '@slotted/angular/stack';\nimport {\n addDays,\n createDateFormat,\n isPlainDate,\n plainDate,\n type PlainDate,\n} from '@slotted/core/date';\n\nconst TERMS = [\n { value: 'receipt', label: 'Due on receipt', days: 0 },\n { value: 'net-15', label: 'Net 15', days: 15 },\n { value: 'net-30', label: 'Net 30', days: 30 },\n { value: 'net-60', label: 'Net 60', days: 60 },\n];\nconst words = createDateFormat({ locale: 'en-US' });\n\n@Component({\n selector: 'app-date-picker-invoice-due',\n imports: [\n SlDatePicker,\n SlField,\n SlFieldDescription,\n SlFieldLabel,\n SlSelect,\n SlSelectItem,\n SlStack,\n ],\n template: `\n <div slStack [gap]=\"5\">\n <div slField required>\n <label slFieldLabel>Invoice date</label>\n <div slDatePicker [value]=\"issued()\" (valueChange)=\"setIssued($event.value)\"></div>\n </div>\n <div slField>\n <label slFieldLabel>Payment terms</label>\n <sl-select [items]=\"terms\" [(value)]=\"term\">\n @for (option of terms; track option.value) {\n <sl-select-item [value]=\"option.value\">{{ option.label }}</sl-select-item>\n }\n </sl-select>\n </div>\n <div slField readOnly>\n <label slFieldLabel>Due date</label>\n <div slDatePicker [value]=\"due()\"></div>\n <span slFieldDescription>{{ summary() }}</span>\n </div>\n </div>\n `,\n})\nexport class DatePickerInvoiceDue {\n protected readonly terms = TERMS;\n protected readonly issued = signal<PlainDate | null>(plainDate(2026, 9, 30));\n protected readonly term = signal<SelectSelection>('net-30');\n protected readonly due = computed(() => {\n const issued = this.issued();\n const days = TERMS.find((option) => option.value === this.term())?.days ?? 0;\n return issued === null ? null : addDays(issued, days);\n });\n protected readonly summary = computed(() => {\n const due = this.due();\n return due === null ? 'Set the invoice date first.' : `Payment is due ${words.describe(due)}.`;\n });\n\n protected setIssued(value: CalendarValue): void {\n this.issued.set(isPlainDate(value) ? value : null);\n }\n}\n",
|
|
637
644
|
"verdict": "example"
|
|
638
645
|
},
|
|
646
|
+
{
|
|
647
|
+
"id": "iso-date",
|
|
648
|
+
"title": "iso-date.ts",
|
|
649
|
+
"note": null,
|
|
650
|
+
"language": "ts",
|
|
651
|
+
"source": "import { Component, computed, signal } from '@angular/core';\nimport type { CalendarValue } from '@slotted/angular/calendar';\nimport { SlDatePicker } from '@slotted/angular/date-picker';\nimport { SlField, SlFieldDescription, SlFieldLabel } from '@slotted/angular/field';\nimport { isPlainDate, parseISODate, toISODate } from '@slotted/core/date';\n\n@Component({\n selector: 'app-date-picker-iso-date',\n imports: [SlDatePicker, SlField, SlFieldDescription, SlFieldLabel],\n template: `\n <div slField>\n <label slFieldLabel>Statement date</label>\n <div slDatePicker [value]=\"date()\" (valueChange)=\"set($event.value)\"></div>\n <span slFieldDescription>{{ summary() }}</span>\n </div>\n `,\n})\nexport class DatePickerIsoDate {\n /* The API carries the date as text; the picker holds a PlainDate. */\n protected readonly iso = signal('2026-10-19');\n protected readonly date = computed(() => parseISODate(this.iso()));\n protected readonly summary = computed(() =>\n this.iso() === '' ? 'No date sent.' : `The API receives ${this.iso()}.`,\n );\n\n protected set(value: CalendarValue): void {\n this.iso.set(isPlainDate(value) ? toISODate(value) : '');\n }\n}\n",
|
|
652
|
+
"verdict": "example"
|
|
653
|
+
},
|
|
639
654
|
{
|
|
640
655
|
"id": "locale",
|
|
641
656
|
"title": "locale.ts",
|
package/docs/date-picker.md
CHANGED
|
@@ -50,13 +50,14 @@ export class DatePickerBasic {}
|
|
|
50
50
|
|
|
51
51
|
| Name | Type | Default | Applies to | Description |
|
|
52
52
|
| --- | --- | --- | --- | --- |
|
|
53
|
-
| `value` | `PlainDate \| DateRange \| PlainDate[] \| null` | — | SlDatePicker | The selected value, whose shape follows selectionMode. Binding it makes the value controlled. |
|
|
54
|
-
| `defaultValue` | `PlainDate \| DateRange \| PlainDate[] \| null` | — | SlDatePicker | The starting value of an uncontrolled date picker. Read once, when the date picker initializes. |
|
|
53
|
+
| `value` | `PlainDate \| DateRange \| PlainDate[] \| PlainYearMonth \| null` | — | SlDatePicker | The selected value, whose shape follows selectionMode. Binding it makes the value controlled. PlainDate is exported by @slotted/core/date. parseISODate(text) returns a PlainDate or null, toISODate(date) returns 'YYYY-MM-DD', and isPlainDate(value) narrows the CalendarValue (valueChange) reports. |
|
|
54
|
+
| `defaultValue` | `PlainDate \| DateRange \| PlainDate[] \| PlainYearMonth \| null` | — | SlDatePicker | The starting value of an uncontrolled date picker. Read once, when the date picker initializes. |
|
|
55
55
|
| `open` | `boolean` | — | SlDatePicker | Whether the calendar is showing. Binding it makes the open state controlled. |
|
|
56
56
|
| `defaultOpen` | `boolean` | false | SlDatePicker | Whether the calendar shows when the date picker initializes. Focus does not move into it. |
|
|
57
|
-
| `min` | `PlainDate` | — | SlDatePicker | The earliest date the field and the calendar accept. Earlier days are disabled in the calendar, an earlier typed date marks the date picker invalid, and a form reports slottedDateRange. |
|
|
58
|
-
| `max` | `PlainDate` | — | SlDatePicker | The latest date the field and the calendar accept. Later days are disabled in the calendar, a later typed date marks the date picker invalid, and a form reports slottedDateRange. |
|
|
57
|
+
| `min` | `PlainDate \| PlainYearMonth` | — | SlDatePicker | The earliest date the field and the calendar accept. Earlier days are disabled in the calendar, an earlier typed date marks the date picker invalid, and a form reports slottedDateRange. |
|
|
58
|
+
| `max` | `PlainDate \| PlainYearMonth` | — | SlDatePicker | The latest date the field and the calendar accept. Later days are disabled in the calendar, a later typed date marks the date picker invalid, and a form reports slottedDateRange. |
|
|
59
59
|
| `isDateUnavailable` | `(date: PlainDate) => boolean` | — | SlDatePicker | Returns true for a date the reader cannot choose. The calendar disables it, a typed unavailable date marks the date picker invalid, and a form reports slottedDateUnavailable. |
|
|
60
|
+
| `granularity` | `'day' \| 'month'` | day | SlDatePicker | What a choice is. month opens the calendar on the months of a year and chooses a month cell; the field shows the month and the year segments; value, defaultValue, min and max are PlainYearMonth from @slotted/core/date ({ year, month }), (valueChange) reports one, and name submits YYYY-MM. parseISOYearMonth and toISOYearMonth convert to and from that text. selectionMode, months, isDateUnavailable and the week inputs do not apply. |
|
|
60
61
|
| `selectionMode` | `'single' \| 'range' \| 'multiple'` | single | SlDatePicker | How many dates the calendar selects, and so the shape of the value. The field shows a single date only; for a start and an end, use slDateRangePicker. |
|
|
61
62
|
| `months` | `number` | 1 | SlDatePicker | How many months the calendar draws side by side. |
|
|
62
63
|
| `defaultView` | `'day' \| 'month' \| 'year'` | day | SlDatePicker | The grid the calendar opens on. |
|
package/docs/dialog.examples.md
CHANGED
|
@@ -622,6 +622,26 @@ Excerpt — not a complete module
|
|
|
622
622
|
<button slButton variant="outline" [slDialogTrigger]="d">Edit project</button>
|
|
623
623
|
```
|
|
624
624
|
|
|
625
|
+
### A layout of its own
|
|
626
|
+
|
|
627
|
+
The panel draws no padding: the header, the body and the footer carry the inset. A layout of its own — one field, a preview, a footer — reads --slotted-dialog-inset-inline and --slotted-dialog-inset-block, so it stands in the column the parts stand in.
|
|
628
|
+
|
|
629
|
+
Excerpt — not a complete module
|
|
630
|
+
|
|
631
|
+
```html
|
|
632
|
+
<sl-dialog #d="slDialog">
|
|
633
|
+
<div class="rename">
|
|
634
|
+
<h2 slDialogTitle>Rename file</h2>
|
|
635
|
+
<input slTextField aria-label="Name" value="report-q3.pdf" />
|
|
636
|
+
<img alt="First page of report-q3.pdf" [src]="preview" />
|
|
637
|
+
</div>
|
|
638
|
+
<footer slDialogFooter><button slButton size="sm">Rename</button></footer>
|
|
639
|
+
</sl-dialog>
|
|
640
|
+
<!-- .rename { display: grid; gap: var(--slotted-space-5);
|
|
641
|
+
padding-block: var(--slotted-dialog-inset-block);
|
|
642
|
+
padding-inline: var(--slotted-dialog-inset-inline); } -->
|
|
643
|
+
```
|
|
644
|
+
|
|
625
645
|
### Deciding once for the application
|
|
626
646
|
|
|
627
647
|
Eight decisions an application takes once instead of eight props on every dialog in a product. Angular Material is the only surveyed library with an equivalent, and a dialog that states one itself still wins.
|
package/docs/dialog.json
CHANGED
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
"part": "content",
|
|
209
209
|
"element": "div",
|
|
210
210
|
"required": true,
|
|
211
|
-
"purpose": "The panel. It carries role=\"dialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long."
|
|
211
|
+
"purpose": "The panel. It carries role=\"dialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long. It draws no padding: slDialogHeader, slDialogBody and slDialogFooter carry the panel inset. A layout that skips them reads --slotted-dialog-inset-inline and --slotted-dialog-inset-block, which the panel states, and a theme sets the inset with --slotted-dialog-padding-inline and --slotted-dialog-padding-block."
|
|
212
212
|
},
|
|
213
213
|
{
|
|
214
214
|
"part": "header",
|
|
@@ -497,7 +497,7 @@
|
|
|
497
497
|
"part": "content",
|
|
498
498
|
"element": "div",
|
|
499
499
|
"required": true,
|
|
500
|
-
"purpose": "The panel. It carries role=\"alertdialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long."
|
|
500
|
+
"purpose": "The panel. It carries role=\"alertdialog\" and, while modal, aria-modal=\"true\". It is a grid of three rows, header, body and footer, and only the body row shrinks, so the actions stay on screen when the body is long. It draws no padding: slDialogHeader, slDialogBody and slDialogFooter carry the panel inset. A layout that skips them reads --slotted-dialog-inset-inline and --slotted-dialog-inset-block, which the panel states, and a theme sets the inset with --slotted-dialog-padding-inline and --slotted-dialog-padding-block."
|
|
501
501
|
},
|
|
502
502
|
{
|
|
503
503
|
"part": "header",
|
|
@@ -769,6 +769,10 @@
|
|
|
769
769
|
"--slotted-dialog-description-color",
|
|
770
770
|
"--slotted-dialog-footer-surface",
|
|
771
771
|
"--slotted-dialog-measure",
|
|
772
|
+
"--slotted-dialog-padding-block",
|
|
773
|
+
"--slotted-dialog-padding-block-sm",
|
|
774
|
+
"--slotted-dialog-padding-inline",
|
|
775
|
+
"--slotted-dialog-padding-inline-sm",
|
|
772
776
|
"--slotted-dialog-radius",
|
|
773
777
|
"--slotted-dialog-rule-color",
|
|
774
778
|
"--slotted-dialog-scrim",
|
|
@@ -921,6 +925,14 @@
|
|
|
921
925
|
"source": "<button slButton variant=\"outline\" [slDialogTrigger]=\"d\">Edit project</button>\n",
|
|
922
926
|
"verdict": "excerpt"
|
|
923
927
|
},
|
|
928
|
+
{
|
|
929
|
+
"id": "layout",
|
|
930
|
+
"title": "A layout of its own",
|
|
931
|
+
"note": "The panel draws no padding: the header, the body and the footer carry the inset. A layout of its own — one field, a preview, a footer — reads --slotted-dialog-inset-inline and --slotted-dialog-inset-block, so it stands in the column the parts stand in.",
|
|
932
|
+
"language": "html",
|
|
933
|
+
"source": "<sl-dialog #d=\"slDialog\">\n <div class=\"rename\">\n <h2 slDialogTitle>Rename file</h2>\n <input slTextField aria-label=\"Name\" value=\"report-q3.pdf\" />\n <img alt=\"First page of report-q3.pdf\" [src]=\"preview\" />\n </div>\n <footer slDialogFooter><button slButton size=\"sm\">Rename</button></footer>\n</sl-dialog>\n<!-- .rename { display: grid; gap: var(--slotted-space-5);\n padding-block: var(--slotted-dialog-inset-block);\n padding-inline: var(--slotted-dialog-inset-inline); } -->\n",
|
|
934
|
+
"verdict": "excerpt"
|
|
935
|
+
},
|
|
924
936
|
{
|
|
925
937
|
"id": "defaults",
|
|
926
938
|
"title": "Deciding once for the application",
|
package/docs/dialog.md
CHANGED
|
@@ -210,7 +210,7 @@ See [dialog.props.md](./dialog.props.md).
|
|
|
210
210
|
|
|
211
211
|
## Tokens
|
|
212
212
|
|
|
213
|
-
`--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-lg`, `--slotted-control-inner-size-lg`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-dialog-body-color`, `--slotted-dialog-border-color`, `--slotted-dialog-close-active-background`, `--slotted-dialog-close-color`, `--slotted-dialog-close-hover-background`, `--slotted-dialog-color`, `--slotted-dialog-description-color`, `--slotted-dialog-footer-surface`, `--slotted-dialog-measure`, `--slotted-dialog-radius`, `--slotted-dialog-rule-color`, `--slotted-dialog-scrim`, `--slotted-dialog-surface`, `--slotted-dialog-title-color`, `--slotted-dialog-title-font-family`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-md`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`, `--slotted-z-index-overlay`
|
|
213
|
+
`--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-border-width-thin`, `--slotted-control-font-family`, `--slotted-control-icon-size-lg`, `--slotted-control-inner-size-lg`, `--slotted-control-radius`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-dialog-body-color`, `--slotted-dialog-border-color`, `--slotted-dialog-close-active-background`, `--slotted-dialog-close-color`, `--slotted-dialog-close-hover-background`, `--slotted-dialog-color`, `--slotted-dialog-description-color`, `--slotted-dialog-footer-surface`, `--slotted-dialog-measure`, `--slotted-dialog-padding-block`, `--slotted-dialog-padding-block-sm`, `--slotted-dialog-padding-inline`, `--slotted-dialog-padding-inline-sm`, `--slotted-dialog-radius`, `--slotted-dialog-rule-color`, `--slotted-dialog-scrim`, `--slotted-dialog-surface`, `--slotted-dialog-title-color`, `--slotted-dialog-title-font-family`, `--slotted-duration-long`, `--slotted-duration-medium`, `--slotted-duration-short`, `--slotted-easing-exit`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-family-heading`, `--slotted-font-family-sans`, `--slotted-font-size-lg`, `--slotted-font-size-md`, `--slotted-font-size-xl`, `--slotted-font-weight-semibold`, `--slotted-line-height-md`, `--slotted-radius-lg`, `--slotted-radius-sm`, `--slotted-scrim`, `--slotted-shadow-lg`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`, `--slotted-z-index-overlay`
|
|
214
214
|
|
|
215
215
|
## Examples
|
|
216
216
|
|
|
@@ -127,3 +127,13 @@ Why: The line beside Reply and Internal note was longer in one mode and wrapped
|
|
|
127
127
|
Do: Give the varying text `flex: 1 1 0`, `min-inline-size: 0` and a one-line cut, write the two texts to similar lengths, and keep a control's label set fixed across modes.
|
|
128
128
|
Don't: Let a mode add or remove a line, a hint or a control that changes the region's height, or let a row wrap differently in one mode than in the other.
|
|
129
129
|
Check: At 1280, 570 and 390 pixels, switch the mode and read the bounding box of each box in the region: every top and height is the same in both modes.
|
|
130
|
+
|
|
131
|
+
### CP-09 · A control that switches a region does not render the region in its own frame
|
|
132
|
+
|
|
133
|
+
Level: MUST
|
|
134
|
+
Applies to: tabs, a segmented control, a route link or a filter whose change mounts a region holding tables, grids, charts or forms
|
|
135
|
+
Rule: The control's own state — the selected tab, the pressed segment — updates in the interaction's frame; the region renders from a deferred value (in React, useDeferredValue or startTransition) and states aria-busy while the shown value lags the selected one.
|
|
136
|
+
Why: Mounting a region of families in the click's task blocks the next paint, and Interaction to Next Paint above 200 ms is "needs improvement" and above 500 ms "poor": a table of a hundred rows of twenty cells measured 160 ms in one task in a development build, and a 4× CPU throttle takes its 93 ms in a production build past the first threshold.
|
|
137
|
+
Do: Keep the selection state urgent and hand the region the deferred value; mount only the selected panel, with mount active.
|
|
138
|
+
Don't: Set the selection and the region from one state update inside the click handler, or mount every panel to make switching look instant.
|
|
139
|
+
Check: Switch the control with the CPU throttled 4× in Chrome: the selection marker moves in the next frame, and the Performance panel shows no long task between the click and that paint.
|
package/docs/guidelines/index.md
CHANGED
|
@@ -29,6 +29,7 @@ Every active rule, one line each. Load this first; load a topic file when the ta
|
|
|
29
29
|
| CP-06 | SHOULD | A screen states a state once. Where the family has a state for it, the screen sets that state and adds nothing louder beside it. | `composition.md` |
|
|
30
30
|
| CP-07 | SHOULD | A list page is `bleed` with `fill`; a record, a dashboard and an overview keep the default `wide`; a create or edit form is `content`; a page of preferences read as prose is `measure`. | `composition.md` |
|
|
31
31
|
| CP-08 | MUST | Switching the mode changes the words and the values in the region, never the size, the line count or the position of any box in it or around it; text whose length differs between modes stands on one line, cut with an ellipsis and read whole from its title. | `composition.md` |
|
|
32
|
+
| CP-09 | MUST | The control's own state — the selected tab, the pressed segment — updates in the interaction's frame; the region renders from a deferred value (in React, useDeferredValue or startTransition) and states aria-busy while the shown value lags the selected one. | `composition.md` |
|
|
32
33
|
| CV-01 | MUST | From 600 pixels the conversation fills its region and scrolls on its own with the composer under it, and the record's context scrolls on its own beside it or behind a tab of the header; below 600 pixels the page scrolls, the composer is stuck to the bottom of the screen, and the record opens on its last message. | `conversations.md` |
|
|
33
34
|
| CV-02 | SHOULD | A running clock says the business time left and the hour it falls due in the organization's zone, a passed one by how much and when it was due, a paused one that it is stopped and why; a queue's row says the span alone, and no clock is ever said in raw minutes. | `conversations.md` |
|
|
34
35
|
| CV-03 | SHOULD | Each queue is a view of the list's `filter-bar`, a tree of the bar's own fields, labelled with the count of the rows it opens on; choosing it writes its pills, and editing a pill leaves a view the bar marks as changed. | `conversations.md` |
|
|
@@ -72,6 +73,7 @@ Every active rule, one line each. Load this first; load a topic file when the ta
|
|
|
72
73
|
| LP-11 | SHOULD | Where the primary input is a touch screen, the list tools leave out the row density: the theme raises every density's rows to the touch target, and the tools keep the sort, the views and the columns on one line. | `list-pages.md` |
|
|
73
74
|
| LP-12 | MUST | From 600 pixels of the page's width the listing takes the height the bar and the messages leave and scrolls its own rows while the page does not scroll; below 600 the page's `fill` does not apply, the listing is as tall as its rows and the page scrolls. | `list-pages.md` |
|
|
74
75
|
| LP-13 | SHOULD | The mark takes the `sm` `size`; the default `md` belongs to a record's header and to a region with room around it. | `list-pages.md` |
|
|
76
|
+
| LP-14 | MUST | A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto`; `table` is for sets the page bounds, such as a statement's lines or a record's related rows. | `list-pages.md` |
|
|
75
77
|
| OV-01 | SHOULD | The figure leads to the list page of the records it counts, and that list opens with the figure's condition applied as the bar's own pills, which the reader removes like any other. | `overviews.md` |
|
|
76
78
|
| OV-02 | SHOULD | Below 600 pixels the figures are one `list` of rows that are destinations — label, comparison, number — followed by the records to act on, the work in flight, the charts, and the history last. | `overviews.md` |
|
|
77
79
|
| OV-03 | SHOULD | Where the reader's scope holds one category, the chart is not drawn and one sentence states the numbers it would have compared. | `overviews.md` |
|
|
@@ -27,7 +27,8 @@ triggers:
|
|
|
27
27
|
badge,
|
|
28
28
|
tag,
|
|
29
29
|
]
|
|
30
|
-
families:
|
|
30
|
+
families:
|
|
31
|
+
[data-grid, table, filter-bar, action-bar, pagination, page, page-header, link, badge, tag]
|
|
31
32
|
---
|
|
32
33
|
|
|
33
34
|
# List pages
|
|
@@ -163,3 +164,13 @@ Why: A row sets its text at the small type step, 13 pixels in a 34-pixel row; an
|
|
|
163
164
|
Do: Give every mark a cell holds — a state, a flag, a warning — the `sm` `size`: 12-pixel words in a 19-pixel box.
|
|
164
165
|
Don't: Leave a cell's mark at the family's default, or size it up to make a state stand out; a tone says that.
|
|
165
166
|
Check: On every list, every `badge` and `tag` inside a cell of a `data-grid` or a `table` carries the `sm` `size`.
|
|
167
|
+
|
|
168
|
+
### LP-14 · A list that can pass a hundred rows is a data-grid
|
|
169
|
+
|
|
170
|
+
Level: MUST
|
|
171
|
+
Applies to: a list of records whose count the reader does not bound — transactions, postings, imports
|
|
172
|
+
Rule: A list that can hold more than a hundred rows, or more than twenty columns, is a `data-grid`, which windows rows and middle columns under its default `virtualize` of `auto`; `table` is for sets the page bounds, such as a statement's lines or a record's related rows.
|
|
173
|
+
Why: `table` mounts every cell: a hundred rows of twenty columns measured 93 ms in one task with a production build of React in Chrome and 160 ms with a development build, and the count of rows the store returns sets that cost.
|
|
174
|
+
Do: Give the store's list a `data-grid` with its query, and keep `table` for the bounded sets inside a record or a document.
|
|
175
|
+
Don't: Render an unbounded store into a `table`, or page a `table` to keep it under a hundred rows where the grid's window would have kept the whole set reachable.
|
|
176
|
+
Check: Every list over an unbounded store is a `data-grid`; every `table` on a page renders a set the page bounds.
|
package/docs/list.json
CHANGED
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"root",
|
|
52
52
|
"section",
|
|
53
53
|
"section-label",
|
|
54
|
+
"section-end",
|
|
54
55
|
"section-list",
|
|
55
56
|
"empty"
|
|
56
57
|
]
|
|
@@ -80,7 +81,13 @@
|
|
|
80
81
|
"part": "section-label",
|
|
81
82
|
"element": "h1 to h6, or a div",
|
|
82
83
|
"required": false,
|
|
83
|
-
"purpose": "The group name. It carries the id the nested list names itself by,
|
|
84
|
+
"purpose": "The group name. It carries the id the nested list names itself by, data-sticky when it has to hold still while its own rows scroll past, and data-variant: caption, the small muted name, or ruled, the name in the text colour over a rule with no ground behind it."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"part": "section-end",
|
|
88
|
+
"element": "span",
|
|
89
|
+
"required": false,
|
|
90
|
+
"purpose": "What stands at the end of the heading, on the line of the name: a day balance, a count. Set in tabular figures. It is the element inside the heading marked slListSectionEnd."
|
|
84
91
|
},
|
|
85
92
|
{
|
|
86
93
|
"part": "section-list",
|
|
@@ -152,6 +159,13 @@
|
|
|
152
159
|
"appliesTo": "slListSectionLabel",
|
|
153
160
|
"description": "Keeps a group name in place while its own rows scroll past it"
|
|
154
161
|
},
|
|
162
|
+
{
|
|
163
|
+
"name": "variant",
|
|
164
|
+
"type": "'caption' | 'ruled'",
|
|
165
|
+
"defaultValue": "caption",
|
|
166
|
+
"appliesTo": "slListSectionLabel",
|
|
167
|
+
"description": "How the group heading is drawn: the small muted name, or the name over a rule with no ground; an element inside it marked slListSectionEnd stands at the end, in tabular figures"
|
|
168
|
+
},
|
|
155
169
|
{
|
|
156
170
|
"name": "id",
|
|
157
171
|
"type": "string",
|
|
@@ -209,6 +223,7 @@
|
|
|
209
223
|
"--slotted-control-padding-inline-md",
|
|
210
224
|
"--slotted-control-padding-inline-sm",
|
|
211
225
|
"--slotted-font-size-xs",
|
|
226
|
+
"--slotted-font-weight-medium",
|
|
212
227
|
"--slotted-font-weight-semibold",
|
|
213
228
|
"--slotted-line-height-sm",
|
|
214
229
|
"--slotted-list-background",
|
|
@@ -232,6 +247,8 @@
|
|
|
232
247
|
"--slotted-list-section-padding-block",
|
|
233
248
|
"--slotted-list-section-padding-block-lg",
|
|
234
249
|
"--slotted-list-section-padding-block-sm",
|
|
250
|
+
"--slotted-list-section-rule-color",
|
|
251
|
+
"--slotted-list-section-ruled-color",
|
|
235
252
|
"--slotted-radius-md",
|
|
236
253
|
"--slotted-space-2",
|
|
237
254
|
"--slotted-space-3",
|
|
@@ -241,6 +258,7 @@
|
|
|
241
258
|
"--slotted-space-8",
|
|
242
259
|
"--slotted-space-9",
|
|
243
260
|
"--slotted-surface",
|
|
261
|
+
"--slotted-text",
|
|
244
262
|
"--slotted-text-muted",
|
|
245
263
|
"--slotted-z-index-sticky"
|
|
246
264
|
],
|
package/docs/list.md
CHANGED
|
@@ -33,6 +33,7 @@ Excerpt — not a complete module
|
|
|
33
33
|
| `root` | ul or ol, or the element render returns | yes |
|
|
34
34
|
| `section` | li | no |
|
|
35
35
|
| `section-label` | h1 to h6, or a div | no |
|
|
36
|
+
| `section-end` | span | no |
|
|
36
37
|
| `section-list` | ul or ol | no |
|
|
37
38
|
| `empty` | li | no |
|
|
38
39
|
|
|
@@ -48,6 +49,7 @@ Excerpt — not a complete module
|
|
|
48
49
|
| `loading` | `boolean` | false | slList | Writes aria-busy on the set. What stands in for the rows is slSkeleton, composed by the page |
|
|
49
50
|
| `level` | `'none' \| '1' \| '2' \| '3' \| '4' \| '5' \| '6'` | 3 | the element | Not an input: slListSectionLabel goes on the heading the page wrote, at whatever level the document needs |
|
|
50
51
|
| `sticky` | `boolean` | false | slListSectionLabel | Keeps a group name in place while its own rows scroll past it |
|
|
52
|
+
| `variant` | `'caption' \| 'ruled'` | caption | slListSectionLabel | How the group heading is drawn: the small muted name, or the name over a rule with no ground; an element inside it marked slListSectionEnd stands at the end, in tabular figures |
|
|
51
53
|
| `id` | `string` | — | slListSectionLabel | The heading own id, which the nested list is named by. Generated when the page wrote none |
|
|
52
54
|
| `exportAs` | `slList \| slListSection \| slListSectionLabel \| slListSectionList \| slListEmpty` | — | every directive | Reaches the instance from a template |
|
|
53
55
|
| `aria-label / aria-labelledby` | `string` | — | slList | The set own name, written on the element. The family adds no label of its own |
|
|
@@ -75,7 +77,7 @@ Excerpt — not a complete module
|
|
|
75
77
|
|
|
76
78
|
## Tokens
|
|
77
79
|
|
|
78
|
-
`--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-padding-inline-lg`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-font-size-xs`, `--slotted-font-weight-semibold`, `--slotted-line-height-sm`, `--slotted-list-background`, `--slotted-list-border-color`, `--slotted-list-border-width`, `--slotted-list-empty-color`, `--slotted-list-empty-padding`, `--slotted-list-empty-padding-lg`, `--slotted-list-empty-padding-sm`, `--slotted-list-gap`, `--slotted-list-gap-lg`, `--slotted-list-gap-sm`, `--slotted-list-padding-inline`, `--slotted-list-padding-inline-lg`, `--slotted-list-padding-inline-sm`, `--slotted-list-radius`, `--slotted-list-section-color`, `--slotted-list-section-font-size`, `--slotted-list-section-font-weight`, `--slotted-list-section-letter-spacing`, `--slotted-list-section-padding-block`, `--slotted-list-section-padding-block-lg`, `--slotted-list-section-padding-block-sm`, `--slotted-radius-md`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface`, `--slotted-text-muted`, `--slotted-z-index-sticky`
|
|
80
|
+
`--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-padding-inline-lg`, `--slotted-control-padding-inline-md`, `--slotted-control-padding-inline-sm`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-line-height-sm`, `--slotted-list-background`, `--slotted-list-border-color`, `--slotted-list-border-width`, `--slotted-list-empty-color`, `--slotted-list-empty-padding`, `--slotted-list-empty-padding-lg`, `--slotted-list-empty-padding-sm`, `--slotted-list-gap`, `--slotted-list-gap-lg`, `--slotted-list-gap-sm`, `--slotted-list-padding-inline`, `--slotted-list-padding-inline-lg`, `--slotted-list-padding-inline-sm`, `--slotted-list-radius`, `--slotted-list-section-color`, `--slotted-list-section-font-size`, `--slotted-list-section-font-weight`, `--slotted-list-section-letter-spacing`, `--slotted-list-section-padding-block`, `--slotted-list-section-padding-block-lg`, `--slotted-list-section-padding-block-sm`, `--slotted-list-section-rule-color`, `--slotted-list-section-ruled-color`, `--slotted-radius-md`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-surface`, `--slotted-text`, `--slotted-text-muted`, `--slotted-z-index-sticky`
|
|
79
81
|
|
|
80
82
|
## Examples
|
|
81
83
|
|
package/docs/page.json
CHANGED
|
@@ -221,6 +221,7 @@
|
|
|
221
221
|
"accessibility": [
|
|
222
222
|
"The practice is the WAI-ARIA APG’s Landmark Regions (w3.org/WAI/ARIA/apg/practices/landmark-regions/): each page should have one main landmark, and the page is it. Write it on a main element and the directive adds nothing; on any other element it writes role=\"main\", unless landmark=\"none\" says the document already has one.",
|
|
223
223
|
"The footer is a footer element inside main, which is not a contentinfo landmark, so it is named: the catalog’s footer message by default, an aria-label the consumer writes otherwise — read with HostAttributeToken, so the consumer’s word is never written over.",
|
|
224
|
+
"Content outside slPageBody receives no inset: the inset lives on the body, so content written straight into slPage is drawn against the viewport edges. In development, slPage warns once when it holds content and no slPageBody.",
|
|
224
225
|
"The outline is typography’s. slHeadingLevel is a host directive of the body, so a section written directly in it takes h2 under the header’s h1 and a section inside that takes h3 — without either family reading the other, and without a skip the HTML Standard forbids.",
|
|
225
226
|
"The body carries aria-busy while loading, which is what tells a screen reader the region is not ready. The page draws no placeholder: the header stands skeleton text of the title’s own width, and each family inside stands its own.",
|
|
226
227
|
"Scrolling is the platform’s. The page never writes a scroll position, and under scroll=\"self\" the scroll part is an ordinary scrolling box a keyboard reaches with the arrow keys once something inside it has focus."
|
package/docs/page.md
CHANGED
|
@@ -67,6 +67,7 @@ Excerpt — not a complete module
|
|
|
67
67
|
|
|
68
68
|
- The practice is the WAI-ARIA APG’s Landmark Regions (w3.org/WAI/ARIA/apg/practices/landmark-regions/): each page should have one main landmark, and the page is it. Write it on a main element and the directive adds nothing; on any other element it writes role="main", unless landmark="none" says the document already has one.
|
|
69
69
|
- The footer is a footer element inside main, which is not a contentinfo landmark, so it is named: the catalog’s footer message by default, an aria-label the consumer writes otherwise — read with HostAttributeToken, so the consumer’s word is never written over.
|
|
70
|
+
- Content outside slPageBody receives no inset: the inset lives on the body, so content written straight into slPage is drawn against the viewport edges. In development, slPage warns once when it holds content and no slPageBody.
|
|
70
71
|
- The outline is typography’s. slHeadingLevel is a host directive of the body, so a section written directly in it takes h2 under the header’s h1 and a section inside that takes h3 — without either family reading the other, and without a skip the HTML Standard forbids.
|
|
71
72
|
- The body carries aria-busy while loading, which is what tells a screen reader the region is not ready. The page draws no placeholder: the header stands skeleton text of the title’s own width, and each family inside stands its own.
|
|
72
73
|
- Scrolling is the platform’s. The page never writes a scroll position, and under scroll="self" the scroll part is an ordinary scrolling box a keyboard reaches with the arrow keys once something inside it has focus.
|
package/docs/popover.json
CHANGED
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"part": "content",
|
|
147
147
|
"element": "the element carrying slPopoverContent",
|
|
148
148
|
"required": true,
|
|
149
|
-
"purpose": "The panel, with role=\"dialog\" and tabindex=\"-1\". It is named by its title and described by its description when those parts are present. aria-modal is never written, because the popover is not modal."
|
|
149
|
+
"purpose": "The panel, with role=\"dialog\" and tabindex=\"-1\". It is named by its title and described by its description when those parts are present. aria-modal is never written, because the popover is not modal. It draws no padding: slPopoverHeader, slPopoverBody and slPopoverFooter carry the panel inset, set by --slotted-popover-padding-inline and --slotted-popover-padding-block."
|
|
150
150
|
},
|
|
151
151
|
{
|
|
152
152
|
"part": "header",
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
"condense": [
|
|
20
20
|
"none",
|
|
21
21
|
"icons"
|
|
22
|
+
],
|
|
23
|
+
"variant": [
|
|
24
|
+
"track",
|
|
25
|
+
"underline"
|
|
22
26
|
]
|
|
23
27
|
},
|
|
24
28
|
"members": {
|
|
@@ -29,7 +33,8 @@
|
|
|
29
33
|
"orientation": "horizontal",
|
|
30
34
|
"condense": "none",
|
|
31
35
|
"fullWidth": false,
|
|
32
|
-
"disabled": false
|
|
36
|
+
"disabled": false,
|
|
37
|
+
"variant": "track"
|
|
33
38
|
},
|
|
34
39
|
"capabilities": [
|
|
35
40
|
"selection",
|
|
@@ -145,6 +150,13 @@
|
|
|
145
150
|
"appliesTo": "slSegmentedControl",
|
|
146
151
|
"description": "How the segments flow and which way the thumb travels. A horizontal set writes aria-orientation, because radiogroup already implies vertical"
|
|
147
152
|
},
|
|
153
|
+
{
|
|
154
|
+
"name": "variant",
|
|
155
|
+
"type": "'track' | 'underline'",
|
|
156
|
+
"defaultValue": "track",
|
|
157
|
+
"appliesTo": "slSegmentedControl",
|
|
158
|
+
"description": "How the choice is drawn: a track with a thumb, or the words alone with the chosen one underlined"
|
|
159
|
+
},
|
|
148
160
|
{
|
|
149
161
|
"name": "condense",
|
|
150
162
|
"type": "'none' | 'icons'",
|
|
@@ -263,6 +275,7 @@
|
|
|
263
275
|
},
|
|
264
276
|
"tokens": [
|
|
265
277
|
"--slotted-border-subtle",
|
|
278
|
+
"--slotted-border-width-thick",
|
|
266
279
|
"--slotted-control-border-color",
|
|
267
280
|
"--slotted-control-border-width",
|
|
268
281
|
"--slotted-control-font-family",
|
|
@@ -298,7 +311,9 @@
|
|
|
298
311
|
"--slotted-easing-standard",
|
|
299
312
|
"--slotted-focus-ring-color",
|
|
300
313
|
"--slotted-focus-ring-color-invalid",
|
|
314
|
+
"--slotted-focus-ring-offset",
|
|
301
315
|
"--slotted-focus-ring-width",
|
|
316
|
+
"--slotted-font-weight-medium",
|
|
302
317
|
"--slotted-radius-xs",
|
|
303
318
|
"--slotted-segmented-control-active-background",
|
|
304
319
|
"--slotted-segmented-control-background",
|
|
@@ -318,9 +333,14 @@
|
|
|
318
333
|
"--slotted-segmented-control-invalid-focus-ring-color",
|
|
319
334
|
"--slotted-segmented-control-radius",
|
|
320
335
|
"--slotted-segmented-control-shadow",
|
|
336
|
+
"--slotted-segmented-control-underline-checked-color",
|
|
337
|
+
"--slotted-segmented-control-underline-color",
|
|
338
|
+
"--slotted-segmented-control-underline-gap",
|
|
321
339
|
"--slotted-space-1",
|
|
340
|
+
"--slotted-space-6",
|
|
322
341
|
"--slotted-target-min",
|
|
323
342
|
"--slotted-text",
|
|
343
|
+
"--slotted-text-muted",
|
|
324
344
|
"--slotted-tone-accent-border",
|
|
325
345
|
"--slotted-tone-accent-subtle-active",
|
|
326
346
|
"--slotted-tone-accent-text",
|
|
@@ -369,6 +389,14 @@
|
|
|
369
389
|
"source": "<div slSegmentedControl aria-label=\"Alinhamento\" defaultValue=\"center\">\n <label slSegment value=\"start\" aria-label=\"Início\">\n <ng-icon slSegmentIcon name=\"lucideAlignLeft\" />\n </label>\n</div>\n",
|
|
370
390
|
"verdict": "excerpt"
|
|
371
391
|
},
|
|
392
|
+
{
|
|
393
|
+
"id": "variants",
|
|
394
|
+
"title": "A track, or the words alone",
|
|
395
|
+
"note": "underline draws the same radio group as words: each as wide as itself, the chosen one in the text colour and underlined, the others muted. One tab stop, the arrows move the value, and inside a field the label names the set.",
|
|
396
|
+
"language": "html",
|
|
397
|
+
"source": "<div slSegmentedControl aria-label=\"Período\" defaultValue=\"month\" variant=\"underline\">\n <label slSegment value=\"day\">Dia</label>\n <label slSegment value=\"week\">Semana</label>\n <label slSegment value=\"month\">Mês</label>\n</div>\n",
|
|
398
|
+
"verdict": "excerpt"
|
|
399
|
+
},
|
|
372
400
|
{
|
|
373
401
|
"id": "condense",
|
|
374
402
|
"title": "Narrower than its words",
|
|
@@ -48,6 +48,7 @@ Excerpt — not a complete module
|
|
|
48
48
|
| `name` | `string` | — | slSegmentedControl | The submission name the segments share, and the reason the platform treats them as one radio group. Generated when none is written, from an application-scoped factory so the server and the client agree |
|
|
49
49
|
| `size` | `'sm' \| 'md' \| 'lg'` | md | slSegmentedControl | The control step. The track measures its segments back from it, so the whole control is exactly as tall as the field beside it |
|
|
50
50
|
| `orientation` | `'horizontal' \| 'vertical'` | horizontal | slSegmentedControl | How the segments flow and which way the thumb travels. A horizontal set writes aria-orientation, because radiogroup already implies vertical |
|
|
51
|
+
| `variant` | `'track' \| 'underline'` | track | slSegmentedControl | How the choice is drawn: a track with a thumb, or the words alone with the chosen one underlined |
|
|
51
52
|
| `condense` | `'none' \| 'icons'` | none | slSegmentedControl | What the control does when it is narrower than its labels need. icons keeps the marks and hides the words, and makes the control take its parent’s width so there is a width to ask a question about |
|
|
52
53
|
| `fullWidth` | `boolean` | false | slSegmentedControl | Whether the equal columns spread across the whole line. Left alone every column is the widest label’s |
|
|
53
54
|
| `disabled` | `boolean` | false | slSegmentedControl | Unstated rather than false, so the control defers to the field around it and to a form that disables it. Stated, it reaches every radio as the native attribute |
|
|
@@ -76,6 +77,7 @@ Excerpt — not a complete module
|
|
|
76
77
|
| `size` | `sm`, `md`, `lg` | `md` |
|
|
77
78
|
| `orientation` | `horizontal`, `vertical` | `horizontal` |
|
|
78
79
|
| `condense` | `none`, `icons` | `none` |
|
|
80
|
+
| `variant` | `track`, `underline` | `track` |
|
|
79
81
|
|
|
80
82
|
## Rules
|
|
81
83
|
|
|
@@ -88,7 +90,7 @@ Excerpt — not a complete module
|
|
|
88
90
|
|
|
89
91
|
## Tokens
|
|
90
92
|
|
|
91
|
-
`--slotted-border-subtle`, `--slotted-control-border-color`, `--slotted-control-border-width`, `--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-invalid-edge-width`, `--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-shadow`, `--slotted-control-surface`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-background`, `--slotted-disabled-border`, `--slotted-disabled-foreground`, `--slotted-duration-instant`, `--slotted-duration-medium`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-color-invalid`, `--slotted-focus-ring-width`, `--slotted-radius-xs`, `--slotted-segmented-control-active-background`, `--slotted-segmented-control-background`, `--slotted-segmented-control-border-color`, `--slotted-segmented-control-checked-color`, `--slotted-segmented-control-color`, `--slotted-segmented-control-disabled-border-color`, `--slotted-segmented-control-disabled-color`, `--slotted-segmented-control-disabled-indicator-background`, `--slotted-segmented-control-divider-color`, `--slotted-segmented-control-hover-background`, `--slotted-segmented-control-indicator-background`, `--slotted-segmented-control-indicator-border-color`, `--slotted-segmented-control-inset`, `--slotted-segmented-control-invalid-border-color`, `--slotted-segmented-control-invalid-edge-width`, `--slotted-segmented-control-invalid-focus-ring-color`, `--slotted-segmented-control-radius`, `--slotted-segmented-control-shadow`, `--slotted-space-1`, `--slotted-target-min`, `--slotted-text`, `--slotted-tone-accent-border`, `--slotted-tone-accent-subtle-active`, `--slotted-tone-accent-text`, `--slotted-tone-danger-border`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`
|
|
93
|
+
`--slotted-border-subtle`, `--slotted-border-width-thick`, `--slotted-control-border-color`, `--slotted-control-border-width`, `--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-invalid-edge-width`, `--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-shadow`, `--slotted-control-surface`, `--slotted-control-transition-duration`, `--slotted-control-transition-easing`, `--slotted-disabled-background`, `--slotted-disabled-border`, `--slotted-disabled-foreground`, `--slotted-duration-instant`, `--slotted-duration-medium`, `--slotted-easing-standard`, `--slotted-focus-ring-color`, `--slotted-focus-ring-color-invalid`, `--slotted-focus-ring-offset`, `--slotted-focus-ring-width`, `--slotted-font-weight-medium`, `--slotted-radius-xs`, `--slotted-segmented-control-active-background`, `--slotted-segmented-control-background`, `--slotted-segmented-control-border-color`, `--slotted-segmented-control-checked-color`, `--slotted-segmented-control-color`, `--slotted-segmented-control-disabled-border-color`, `--slotted-segmented-control-disabled-color`, `--slotted-segmented-control-disabled-indicator-background`, `--slotted-segmented-control-divider-color`, `--slotted-segmented-control-hover-background`, `--slotted-segmented-control-indicator-background`, `--slotted-segmented-control-indicator-border-color`, `--slotted-segmented-control-inset`, `--slotted-segmented-control-invalid-border-color`, `--slotted-segmented-control-invalid-edge-width`, `--slotted-segmented-control-invalid-focus-ring-color`, `--slotted-segmented-control-radius`, `--slotted-segmented-control-shadow`, `--slotted-segmented-control-underline-checked-color`, `--slotted-segmented-control-underline-color`, `--slotted-segmented-control-underline-gap`, `--slotted-space-1`, `--slotted-space-6`, `--slotted-target-min`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-border`, `--slotted-tone-accent-subtle-active`, `--slotted-tone-accent-text`, `--slotted-tone-danger-border`, `--slotted-tone-secondary-subtle-active`, `--slotted-tone-secondary-subtle-hover`
|
|
92
94
|
|
|
93
95
|
## Examples
|
|
94
96
|
|
|
@@ -145,6 +147,20 @@ Excerpt — not a complete module
|
|
|
145
147
|
</div>
|
|
146
148
|
```
|
|
147
149
|
|
|
150
|
+
### A track, or the words alone
|
|
151
|
+
|
|
152
|
+
underline draws the same radio group as words: each as wide as itself, the chosen one in the text colour and underlined, the others muted. One tab stop, the arrows move the value, and inside a field the label names the set.
|
|
153
|
+
|
|
154
|
+
Excerpt — not a complete module
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<div slSegmentedControl aria-label="Período" defaultValue="month" variant="underline">
|
|
158
|
+
<label slSegment value="day">Dia</label>
|
|
159
|
+
<label slSegment value="week">Semana</label>
|
|
160
|
+
<label slSegment value="month">Mês</label>
|
|
161
|
+
</div>
|
|
162
|
+
```
|
|
163
|
+
|
|
148
164
|
### Narrower than its words
|
|
149
165
|
|
|
150
166
|
Below the width its labels need, a control told to condense keeps its marks and hides its words — hidden, never removed, so every segment is announced the same at every width.
|
|
@@ -59,6 +59,10 @@ element stands in that slot.
|
|
|
59
59
|
nothing louder beside it (CP-06).
|
|
60
60
|
- A control that switches what a region holds changes words and values, never
|
|
61
61
|
the size or the position of a box (CP-08).
|
|
62
|
+
- A control that switches a region — tabs, a route, a filter — updates its
|
|
63
|
+
own state at once and renders the region from a deferred value (in React,
|
|
64
|
+
useDeferredValue or startTransition) (CP-09). A list longer than a hundred
|
|
65
|
+
rows is a `data-grid`, which windows its rows (LP-14).
|
|
62
66
|
- Where no anatomy answers the problem, the screen writes an element of its
|
|
63
67
|
own instead of bending a family into a shape it does not have (CP-04). That
|
|
64
68
|
element is built with `node_modules/@slotted/angular/docs/skills/build-own-element/SKILL.md`.
|
|
@@ -74,3 +78,6 @@ Every region filled by a request and every control that starts one follow
|
|
|
74
78
|
2. Each `SHOULD` rule not followed is listed with its reason.
|
|
75
79
|
3. No CSS of the screen's own targets a family's parts; a family's appearance
|
|
76
80
|
changes through its axes.
|
|
81
|
+
4. In a browser with the CPU throttled 4×, each control that switches a region
|
|
82
|
+
paints its new state in the next frame, with no long task between the input
|
|
83
|
+
and that paint.
|
|
@@ -55,6 +55,11 @@ new seed keeps the ratios of every scheme. A colour of the `tone`, `surface`,
|
|
|
55
55
|
3. A colour the reader picks at runtime: write the seed property on the element
|
|
56
56
|
that carries `data-slotted-theme`, with `seedStyle` from
|
|
57
57
|
`@slotted/theme/seeds`, which leaves the token contract out of the bundle.
|
|
58
|
+
4. A bar of the application's own that floats over scrolling content — a phone
|
|
59
|
+
tab bar, a sticky banner — is a material: its background reads
|
|
60
|
+
`--slotted-surface-material` and its backdrop filter reads
|
|
61
|
+
`--slotted-material-backdrop`. The theme makes both opaque under reduced
|
|
62
|
+
transparency and forced colours.
|
|
58
63
|
|
|
59
64
|
## 4. Restyle a control
|
|
60
65
|
|
package/docs/split-button.json
CHANGED
package/docs/split-button.md
CHANGED
|
@@ -83,7 +83,7 @@ Excerpt — not a complete module
|
|
|
83
83
|
|
|
84
84
|
| Axis | Values | Default |
|
|
85
85
|
| --- | --- | --- |
|
|
86
|
-
| `tone` | `accent`, `secondary`, `success`, `warning`, `danger` | `accent` |
|
|
86
|
+
| `tone` | `accent`, `secondary`, `neutral`, `success`, `warning`, `danger` | `accent` |
|
|
87
87
|
| `variant` | `solid`, `outline`, `ghost` | `solid` |
|
|
88
88
|
| `size` | `sm`, `md`, `lg` | `md` |
|
|
89
89
|
|
package/docs/stat-card.json
CHANGED
package/docs/stat-card.md
CHANGED
|
@@ -110,7 +110,7 @@ Excerpt — not a complete module
|
|
|
110
110
|
|
|
111
111
|
## Tokens
|
|
112
112
|
|
|
113
|
-
`--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-font-family-sans`, `--slotted-font-size-2xl`, `--slotted-font-size-3xl`, `--slotted-font-size-4xl`, `--slotted-font-size-md`, `--slotted-font-size-sm`, `--slotted-font-size-xl`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-line-height-2xl`, `--slotted-line-height-3xl`, `--slotted-line-height-4xl`, `--slotted-line-height-md`, `--slotted-line-height-sm`, `--slotted-line-height-xl`, `--slotted-line-height-xs`, `--slotted-radius-lg`, `--slotted-radius-none`, `--slotted-shadow-md`, `--slotted-space-1`, `--slotted-space-11`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-sparkline-block-size`, `--slotted-sparkline-block-size-lg`, `--slotted-sparkline-block-size-sm`, `--slotted-stat-card-background`, `--slotted-stat-card-background-subtle`, `--slotted-stat-card-border-color`, `--slotted-stat-card-border-width`, `--slotted-stat-card-color`, `--slotted-stat-card-color-muted`, `--slotted-stat-card-delta-font-size`, `--slotted-stat-card-delta-font-size-lg`, `--slotted-stat-card-delta-font-size-sm`, `--slotted-stat-card-indicator-size`, `--slotted-stat-card-indicator-size-lg`, `--slotted-stat-card-label-font-size`, `--slotted-stat-card-label-font-size-lg`, `--slotted-stat-card-label-font-size-sm`, `--slotted-stat-card-label-line-height`, `--slotted-stat-card-label-line-height-lg`, `--slotted-stat-card-label-line-height-sm`, `--slotted-stat-card-min-inline-size`, `--slotted-stat-card-padding-block`, `--slotted-stat-card-padding-block-lg`, `--slotted-stat-card-padding-block-sm`, `--slotted-stat-card-padding-inline`, `--slotted-stat-card-padding-inline-lg`, `--slotted-stat-card-padding-inline-sm`, `--slotted-stat-card-prose-font-size`, `--slotted-stat-card-prose-font-size-lg`, `--slotted-stat-card-prose-line-height`, `--slotted-stat-card-prose-line-height-lg`, `--slotted-stat-card-radius`, `--slotted-stat-card-region-gap`, `--slotted-stat-card-region-gap-lg`, `--slotted-stat-card-region-gap-sm`, `--slotted-stat-card-shadow`, `--slotted-stat-card-shadow-elevated`, `--slotted-stat-card-trend-gap`, `--slotted-stat-card-trend-gap-lg`, `--slotted-stat-card-trend-gap-sm`, `--slotted-stat-card-trend-inline-size`, `--slotted-stat-card-trend-inline-size-lg`, `--slotted-stat-card-trend-inline-size-sm`, `--slotted-stat-card-value-font-size`, `--slotted-stat-card-value-font-size-lg`, `--slotted-stat-card-value-font-size-sm`, `--slotted-stat-card-value-line-height`, `--slotted-stat-card-value-line-height-lg`, `--slotted-stat-card-value-line-height-sm`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`
|
|
113
|
+
`--slotted-border-subtle`, `--slotted-border-width-thin`, `--slotted-control-icon-size-md`, `--slotted-control-icon-size-sm`, `--slotted-font-family-sans`, `--slotted-font-size-2xl`, `--slotted-font-size-3xl`, `--slotted-font-size-4xl`, `--slotted-font-size-md`, `--slotted-font-size-sm`, `--slotted-font-size-xl`, `--slotted-font-size-xs`, `--slotted-font-weight-medium`, `--slotted-font-weight-semibold`, `--slotted-letter-spacing-tighter`, `--slotted-line-height-2xl`, `--slotted-line-height-3xl`, `--slotted-line-height-4xl`, `--slotted-line-height-md`, `--slotted-line-height-sm`, `--slotted-line-height-xl`, `--slotted-line-height-xs`, `--slotted-radius-lg`, `--slotted-radius-none`, `--slotted-shadow-md`, `--slotted-space-1`, `--slotted-space-11`, `--slotted-space-12`, `--slotted-space-2`, `--slotted-space-3`, `--slotted-space-4`, `--slotted-space-5`, `--slotted-space-6`, `--slotted-space-7`, `--slotted-space-8`, `--slotted-space-9`, `--slotted-sparkline-block-size`, `--slotted-sparkline-block-size-lg`, `--slotted-sparkline-block-size-sm`, `--slotted-stat-card-background`, `--slotted-stat-card-background-subtle`, `--slotted-stat-card-border-color`, `--slotted-stat-card-border-width`, `--slotted-stat-card-color`, `--slotted-stat-card-color-muted`, `--slotted-stat-card-delta-font-size`, `--slotted-stat-card-delta-font-size-lg`, `--slotted-stat-card-delta-font-size-sm`, `--slotted-stat-card-indicator-size`, `--slotted-stat-card-indicator-size-lg`, `--slotted-stat-card-label-font-size`, `--slotted-stat-card-label-font-size-lg`, `--slotted-stat-card-label-font-size-sm`, `--slotted-stat-card-label-line-height`, `--slotted-stat-card-label-line-height-lg`, `--slotted-stat-card-label-line-height-sm`, `--slotted-stat-card-min-inline-size`, `--slotted-stat-card-padding-block`, `--slotted-stat-card-padding-block-lg`, `--slotted-stat-card-padding-block-sm`, `--slotted-stat-card-padding-inline`, `--slotted-stat-card-padding-inline-lg`, `--slotted-stat-card-padding-inline-sm`, `--slotted-stat-card-prose-font-size`, `--slotted-stat-card-prose-font-size-lg`, `--slotted-stat-card-prose-line-height`, `--slotted-stat-card-prose-line-height-lg`, `--slotted-stat-card-radius`, `--slotted-stat-card-region-gap`, `--slotted-stat-card-region-gap-lg`, `--slotted-stat-card-region-gap-sm`, `--slotted-stat-card-shadow`, `--slotted-stat-card-shadow-elevated`, `--slotted-stat-card-trend-gap`, `--slotted-stat-card-trend-gap-lg`, `--slotted-stat-card-trend-gap-sm`, `--slotted-stat-card-trend-inline-size`, `--slotted-stat-card-trend-inline-size-lg`, `--slotted-stat-card-trend-inline-size-sm`, `--slotted-stat-card-value-font-size`, `--slotted-stat-card-value-font-size-lg`, `--slotted-stat-card-value-font-size-sm`, `--slotted-stat-card-value-line-height`, `--slotted-stat-card-value-line-height-lg`, `--slotted-stat-card-value-line-height-sm`, `--slotted-surface-raised`, `--slotted-surface-sunken`, `--slotted-target-comfortable`, `--slotted-text`, `--slotted-text-muted`, `--slotted-tone-accent-text`, `--slotted-tone-danger-text`, `--slotted-tone-secondary-text`, `--slotted-tone-success-text`, `--slotted-tone-warning-text`
|
|
114
114
|
|
|
115
115
|
## Examples
|
|
116
116
|
|
package/docs/table.examples.md
CHANGED
|
@@ -742,7 +742,7 @@ export class TableExpansion {
|
|
|
742
742
|
|
|
743
743
|
### A header, a summary and a column that stay
|
|
744
744
|
|
|
745
|
-
stickyHeader holds the head against the top of the scroller and stickyFooter holds the summary against the bottom of it, so the total is on screen at the first row and the last. stickyTo says which box that is: this table own scroller, or whatever scrolls outside it. A pinned column darkens its edge exactly while something is hidden under it, and all of it mirrors in a right-to-left document.
|
|
745
|
+
stickyHeader holds the head against the top of the scroller and stickyFooter holds the summary against the bottom of it, so the total is on screen at the first row and the last. stickyTo says which box that is: this table own scroller, or whatever scrolls outside it. Under stickyTo="page" the head stops at --slotted-table-sticky-offset, which a page binds to its own chrome; a table inside a scrolling box of its own sets that token to 0 on the box. A pinned column darkens its edge exactly while something is hidden under it, and all of it mirrors in a right-to-left document.
|
|
746
746
|
|
|
747
747
|
Example
|
|
748
748
|
|