@lifecorner/angular-ui-kit 3.35.0 → 3.37.0
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/README.md +1 -0
- package/fesm2022/lifecorner-angular-ui-kit-button.mjs +6 -6
- package/fesm2022/lifecorner-angular-ui-kit-button.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-card.mjs +82 -16
- package/fesm2022/lifecorner-angular-ui-kit-card.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-combobox.mjs +18 -2
- package/fesm2022/lifecorner-angular-ui-kit-combobox.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs +43 -5
- package/fesm2022/lifecorner-angular-ui-kit-description-list.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-header.mjs +45 -8
- package/fesm2022/lifecorner-angular-ui-kit-header.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-hero.mjs +78 -5
- package/fesm2022/lifecorner-angular-ui-kit-hero.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-internal-chart.mjs +2 -2
- package/fesm2022/lifecorner-angular-ui-kit-internal-chart.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-list.mjs +30 -6
- package/fesm2022/lifecorner-angular-ui-kit-list.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-select.mjs +15 -10
- package/fesm2022/lifecorner-angular-ui-kit-select.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-stacked-bar-chart.mjs +47 -5
- package/fesm2022/lifecorner-angular-ui-kit-stacked-bar-chart.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-state-strip.mjs +226 -0
- package/fesm2022/lifecorner-angular-ui-kit-state-strip.mjs.map +1 -0
- package/fesm2022/lifecorner-angular-ui-kit-table.mjs +25 -4
- package/fesm2022/lifecorner-angular-ui-kit-table.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit.mjs +1 -0
- package/package.json +5 -1
- package/src/styles/_theme-light.scss +8 -1
- package/src/styles/theme-contrast.spec.ts +116 -0
- package/src/styles/theme-modes.spec.ts +20 -5
- package/types/lifecorner-angular-ui-kit-button.d.ts +7 -3
- package/types/lifecorner-angular-ui-kit-card.d.ts +51 -3
- package/types/lifecorner-angular-ui-kit-combobox.d.ts +15 -0
- package/types/lifecorner-angular-ui-kit-description-list.d.ts +40 -0
- package/types/lifecorner-angular-ui-kit-header.d.ts +44 -2
- package/types/lifecorner-angular-ui-kit-hero.d.ts +50 -1
- package/types/lifecorner-angular-ui-kit-internal-chart.d.ts +6 -0
- package/types/lifecorner-angular-ui-kit-list.d.ts +27 -0
- package/types/lifecorner-angular-ui-kit-select.d.ts +13 -1
- package/types/lifecorner-angular-ui-kit-stacked-bar-chart.d.ts +36 -0
- package/types/lifecorner-angular-ui-kit-state-strip.d.ts +125 -0
- package/types/lifecorner-angular-ui-kit-table.d.ts +46 -1
- package/types/lifecorner-angular-ui-kit.d.ts +1 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { compile } from 'sass';
|
|
2
2
|
import { readFileSync, readdirSync } from 'fs';
|
|
3
3
|
import { resolve } from 'path';
|
|
4
|
+
import { CHART_PALETTE } from '../lib/internal/chart/chart-palette';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Contrast contract of the semantic color tokens, measured on the compiled
|
|
@@ -1960,3 +1961,118 @@ describe('Component pairings of 3.30 (request 047)', () => {
|
|
|
1960
1961
|
expect(Math.min(got.textOnFill, got.textOnHoverFill)).toBeGreaterThanOrEqual(4.5);
|
|
1961
1962
|
});
|
|
1962
1963
|
});
|
|
1964
|
+
|
|
1965
|
+
/**
|
|
1966
|
+
* Request 056 (3.36, design 056 §5): the state strip's marks, ring and
|
|
1967
|
+
* caption, the ledger rules of the description-list total and the table
|
|
1968
|
+
* footer, and the band story's parts. Minima over the page, the surfaces and
|
|
1969
|
+
* a hovered row (translucent fills composited over the surface).
|
|
1970
|
+
*/
|
|
1971
|
+
describe('Component pairings of 3.36 (request 056)', () => {
|
|
1972
|
+
const lib = (path: string) => resolve(__dirname, '../lib', path);
|
|
1973
|
+
const sheets = {
|
|
1974
|
+
strip: compile(lib('state-strip/state-strip.component.scss')).css,
|
|
1975
|
+
dl: compile(lib('description-list/description-list.component.scss')).css,
|
|
1976
|
+
table: compile(lib('table/table.component.scss')).css,
|
|
1977
|
+
};
|
|
1978
|
+
const body = (sheet: keyof typeof sheets, selector: string) => {
|
|
1979
|
+
const css = sheets[sheet];
|
|
1980
|
+
const at = css.indexOf(`\n${selector} {`);
|
|
1981
|
+
expect([selector, at > -1]).toEqual([selector, true]);
|
|
1982
|
+
return css.slice(at, css.indexOf('}', at));
|
|
1983
|
+
};
|
|
1984
|
+
const floor = (n: number) => Math.floor(n * 100) / 100;
|
|
1985
|
+
const grounds = ['--color-background', '--color-surface', '--color-surface-2', '--color-surface-hover', '--color-surface-sunken'];
|
|
1986
|
+
|
|
1987
|
+
it('AC-4, AC-12, AC-19: the rules pair these tokens', () => {
|
|
1988
|
+
expect(body('strip', '.lc-state-strip__mark--success')).toContain('background-color: var(--color-text-success)');
|
|
1989
|
+
expect(body('strip', '.lc-state-strip__mark--warning')).toContain('background-color: var(--color-text-warning)');
|
|
1990
|
+
expect(body('strip', '.lc-state-strip__mark--error')).toContain('background-color: var(--color-text-error)');
|
|
1991
|
+
expect(body('strip', '.lc-state-strip__mark--neutral')).toContain('background-color: var(--color-field-border)');
|
|
1992
|
+
expect(body('strip', '.lc-state-strip__cell:focus-visible')).toContain('outline: 2px solid var(--color-primary-500)');
|
|
1993
|
+
const caption = body('strip', '.lc-state-strip__caption');
|
|
1994
|
+
expect(caption).toContain('background-color: var(--color-text-primary)');
|
|
1995
|
+
expect(caption).toContain('color: var(--color-surface)');
|
|
1996
|
+
expect(body('dl', '.lc-dl .lc-dl__row--total')).toContain('border-top: 1px solid var(--color-field-border)');
|
|
1997
|
+
expect(body('table', '.lc-table tfoot tr')).toContain('border-bottom: 3px double var(--color-field-border)');
|
|
1998
|
+
});
|
|
1999
|
+
|
|
2000
|
+
// [light, dark], floored; design 056 §5 quotes the rounded values (warning
|
|
2001
|
+
// 5.48 / 6.35, error 11.44, ring 3.97 / 7.58, caption 17.74 / 15.85).
|
|
2002
|
+
const expected = {
|
|
2003
|
+
success: [4.81, 6.97],
|
|
2004
|
+
warning: [5.47, 6.34],
|
|
2005
|
+
error: [11.43, 7.21],
|
|
2006
|
+
neutral: [4.39, 5.56],
|
|
2007
|
+
ring: [3.96, 7.57],
|
|
2008
|
+
caption: [17.73, 15.85],
|
|
2009
|
+
};
|
|
2010
|
+
|
|
2011
|
+
it.each(palettes.map(([name, tokens], i) => [name, tokens, i] as const))('AC-4, AC-12: %s palette: the design 056 §5 ratios', (_palette, tokens, i) => {
|
|
2012
|
+
const c = (name: string) => color(tokens, name);
|
|
2013
|
+
const surface = c('--color-surface');
|
|
2014
|
+
const ground = (name: string) => over(c(name), surface);
|
|
2015
|
+
const worst = (ink: string) => floor(Math.min(...grounds.map((g) => ratio(over(c(ink), ground(g)), ground(g)))));
|
|
2016
|
+
const got = {
|
|
2017
|
+
success: worst('--color-text-success'),
|
|
2018
|
+
warning: worst('--color-text-warning'),
|
|
2019
|
+
error: worst('--color-text-error'),
|
|
2020
|
+
neutral: worst('--color-field-border'),
|
|
2021
|
+
ring: worst('--color-primary-500'),
|
|
2022
|
+
caption: floor(ratio(c('--color-surface'), c('--color-text-primary'))),
|
|
2023
|
+
};
|
|
2024
|
+
expect(got).toEqual(Object.fromEntries(Object.entries(expected).map(([key, pair]) => [key, pair[i]])));
|
|
2025
|
+
// Marks, ring and rules: 3:1 (WCAG 1.4.11); the caption is text: 4.5:1.
|
|
2026
|
+
for (const key of ['success', 'warning', 'error', 'neutral', 'ring'] as const) expect(got[key]).toBeGreaterThanOrEqual(3);
|
|
2027
|
+
expect(got.caption).toBeGreaterThanOrEqual(4.5);
|
|
2028
|
+
});
|
|
2029
|
+
|
|
2030
|
+
it.each(palettes)('AC-16: %s palette: the band story\'s five part colours keep 3:1 on the surface', (_palette, tokens) => {
|
|
2031
|
+
const surface = color(tokens, '--color-surface');
|
|
2032
|
+
const parts = ['--color-primary-700', '--color-primary-500', '--color-info-default', '--color-secondary-700', '--color-neutral-500'];
|
|
2033
|
+
for (const part of parts) expect([part, ratio(over(color(tokens, part), surface), surface) >= 3]).toEqual([part, true]);
|
|
2034
|
+
});
|
|
2035
|
+
});
|
|
2036
|
+
|
|
2037
|
+
/**
|
|
2038
|
+
* 3.37 (request 057, 056 F-1, design D-8, AC-20): the chart family's default
|
|
2039
|
+
* palette is a graphical object (WCAG 1.4.11): every entry keeps 3:1 against
|
|
2040
|
+
* the page and the surface in both themes. Entries 3 and 4 moved from the
|
|
2041
|
+
* status fills to the status inks.
|
|
2042
|
+
*/
|
|
2043
|
+
describe('Component pairings of 3.37 (request 057)', () => {
|
|
2044
|
+
const PALETTE: readonly string[] = CHART_PALETTE;
|
|
2045
|
+
const floor = (n: number) => Math.floor(n * 100) / 100;
|
|
2046
|
+
const pages = ['--color-background', '--color-surface'];
|
|
2047
|
+
|
|
2048
|
+
it('AC-20: the palette reads tokens only; entries 3 and 4 are the success and warning inks', () => {
|
|
2049
|
+
expect(PALETTE).toHaveLength(8);
|
|
2050
|
+
expect(PALETTE.every((entry) => /^var\(--color-[\w-]+\)$/.test(entry))).toBe(true);
|
|
2051
|
+
expect(PALETTE[2]).toBe('var(--color-text-success)');
|
|
2052
|
+
expect(PALETTE[3]).toBe('var(--color-text-warning)');
|
|
2053
|
+
});
|
|
2054
|
+
|
|
2055
|
+
// [light, dark], the minimum over page and surface, floored; design 057 §5
|
|
2056
|
+
// quotes them rounded (5.30 and 6.03 light).
|
|
2057
|
+
const expected: Record<string, [number, number]> = {
|
|
2058
|
+
'--color-text-success': [5.29, 8.4],
|
|
2059
|
+
'--color-text-warning': [6.02, 7.65],
|
|
2060
|
+
};
|
|
2061
|
+
|
|
2062
|
+
it.each(palettes.map(([name, tokens], i) => [name, tokens, i] as const))('AC-20: %s palette: all 8 entries reach 3:1 on the page and the surface', (_palette, tokens, i) => {
|
|
2063
|
+
const lowest = (name: string) =>
|
|
2064
|
+
floor(Math.min(...pages.map((page) => ratio(over(color(tokens, name), color(tokens, page)), color(tokens, page)))));
|
|
2065
|
+
for (const entry of PALETTE) {
|
|
2066
|
+
const name = (entry.match(/^var\((--[\w-]+)\)$/) as RegExpMatchArray)[1];
|
|
2067
|
+
expect([name, lowest(name) >= 3]).toEqual([name, true]);
|
|
2068
|
+
if (expected[name]) expect([name, lowest(name)]).toEqual([name, expected[name][i]]);
|
|
2069
|
+
}
|
|
2070
|
+
});
|
|
2071
|
+
|
|
2072
|
+
it('why: the 3.36 entries 3 and 4 stay below 3:1 on the light page and surface', () => {
|
|
2073
|
+
const light = palettes[0][1];
|
|
2074
|
+
for (const old of ['--color-success-default', '--color-warning-default']) {
|
|
2075
|
+
for (const page of pages) expect([old, page, ratio(color(light, old), color(light, page)) < 3]).toEqual([old, page, true]);
|
|
2076
|
+
}
|
|
2077
|
+
});
|
|
2078
|
+
});
|
|
@@ -111,7 +111,10 @@ describe('Theme scope of a themed sidenav rail badge (request 051)', () => {
|
|
|
111
111
|
const COLOUR = /^--(color-|gradient-|shadow-|elevation-|accent-line$|app-background-image$)/;
|
|
112
112
|
const colours = (tokens: Record<string, string>) =>
|
|
113
113
|
Object.fromEntries(Object.entries(tokens).filter(([name]) => COLOUR.test(name)));
|
|
114
|
-
|
|
114
|
+
// 3.37 (request 057, design D-5): the light rule's selector list also takes
|
|
115
|
+
// `lc-hero lc-badge` (badges on the hero's fixed bands), so the light rule
|
|
116
|
+
// ends in it; the declarations are the same single block.
|
|
117
|
+
const LIGHT_RAIL = '.lc-sidenav-container--light .lc-sidenav__nav-badge,\nlc-hero lc-badge {';
|
|
115
118
|
const DARK_RAIL = '.lc-sidenav-container--dark .lc-sidenav__nav-badge {';
|
|
116
119
|
|
|
117
120
|
it('AC-3/AC-4: the light rail badge declares exactly the colour tokens of the light root (172), with the same values', () => {
|
|
@@ -136,9 +139,21 @@ describe('Theme scope of a themed sidenav rail badge (request 051)', () => {
|
|
|
136
139
|
});
|
|
137
140
|
|
|
138
141
|
it('scopes the badge host only, not the rail or its label tooltip', () => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
// Whole selector lists, the text before each `{` (3.37: the light one spans two lines).
|
|
143
|
+
const selectorLists = (css: string) =>
|
|
144
|
+
css
|
|
145
|
+
.replace(/\/\*[^]*?\*\//g, '')
|
|
146
|
+
.split('{')
|
|
147
|
+
.slice(0, -1)
|
|
148
|
+
.map((chunk) => chunk.slice(chunk.lastIndexOf('}') + 1).trim());
|
|
149
|
+
expect(selectorLists(light).filter((s) => s.includes('lc-sidenav'))).toEqual([
|
|
150
|
+
'.lc-sidenav-container--light .lc-sidenav__nav-badge,\nlc-hero lc-badge',
|
|
151
|
+
]);
|
|
152
|
+
expect(selectorLists(dark).filter((s) => s.includes('lc-sidenav'))).toEqual(['.lc-sidenav-container--dark .lc-sidenav__nav-badge']);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('3.37: badges in lc-hero take the light palette in both themes, from the light file only', () => {
|
|
156
|
+
expect(light.match(/lc-hero lc-badge/g)).toHaveLength(1);
|
|
157
|
+
expect(dark.includes('lc-hero')).toBe(false);
|
|
143
158
|
});
|
|
144
159
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import { ElementRef } from "@angular/core";
|
|
3
|
-
export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'link' | 'danger' | 'warning' | 'info' | 'inverse';
|
|
3
|
+
export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'link' | 'danger' | 'warning' | 'info' | 'inverse' | 'inverse-outline';
|
|
4
4
|
export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
5
5
|
export type ButtonType = 'button' | 'submit' | 'reset';
|
|
6
6
|
/**
|
|
@@ -15,7 +15,9 @@ export declare class ButtonComponent {
|
|
|
15
15
|
* such as the default `lc-hero` bands (primary, neutral, info, accent-purple,
|
|
16
16
|
* accent-violet). It looks the same in both themes. Not for light backgrounds
|
|
17
17
|
* or `variant="light"` heroes. CSS hook `--lc-button-inverse-fg` (default
|
|
18
|
-
* `#0d353d`) sets its ink; keep 4.5:1 on white.
|
|
18
|
+
* `#0d353d`) sets its ink; keep 4.5:1 on white. `inverse-outline` (3.36) is
|
|
19
|
+
* the quieter action beside it on the same bands: white text and keyline on
|
|
20
|
+
* a dark translucent fill, the same sizes, height, icon slots and states.
|
|
19
21
|
* @default 'primary'
|
|
20
22
|
*/
|
|
21
23
|
readonly variant: import("@angular/core").InputSignal<ButtonVariant>;
|
|
@@ -239,7 +241,9 @@ export declare class ButtonLinkComponent {
|
|
|
239
241
|
* such as the default `lc-hero` bands (primary, neutral, info, accent-purple,
|
|
240
242
|
* accent-violet). It looks the same in both themes. Not for light backgrounds
|
|
241
243
|
* or `variant="light"` heroes. CSS hook `--lc-button-inverse-fg` (default
|
|
242
|
-
* `#0d353d`) sets its ink; keep 4.5:1 on white.
|
|
244
|
+
* `#0d353d`) sets its ink; keep 4.5:1 on white. `inverse-outline` (3.36) is
|
|
245
|
+
* the quieter link beside it on the same bands: white text and keyline on a
|
|
246
|
+
* dark translucent fill, the same sizes and height.
|
|
243
247
|
* @default 'primary'
|
|
244
248
|
*/
|
|
245
249
|
readonly variant: import("@angular/core").InputSignal<ButtonVariant>;
|
|
@@ -19,6 +19,8 @@ export type CardFooterLayout = 'default' | 'equal';
|
|
|
19
19
|
* the title stays a heading
|
|
20
20
|
* - Equal footer (3.29): `footerLayout="equal"` gives two answers of equal
|
|
21
21
|
* weight in the `[card-footer]` slot the same width
|
|
22
|
+
* - Collapsible (3.36): `collapsible` with `[(expanded)]` turns the head into
|
|
23
|
+
* one toggle that opens and closes the body and footer
|
|
22
24
|
*
|
|
23
25
|
* @example
|
|
24
26
|
* ```html
|
|
@@ -181,23 +183,58 @@ export declare class CardComponent {
|
|
|
181
183
|
* @default 'default'
|
|
182
184
|
*/
|
|
183
185
|
footerLayout: import("@angular/core").InputSignal<CardFooterLayout>;
|
|
186
|
+
/**
|
|
187
|
+
* The card can close (3.36, regeln row 1): the head (icon, title, subtitle)
|
|
188
|
+
* becomes one toggle, a button inside the title's heading with
|
|
189
|
+
* `aria-expanded` and `aria-controls`, whose hit area is the whole head (at
|
|
190
|
+
* least 44 px high); Enter, Space or a click open and close the body and the
|
|
191
|
+
* `[card-footer]`. A chevron at the end of the head shows the state.
|
|
192
|
+
* `[card-header-action]` stays a separate control beside it. Needs the
|
|
193
|
+
* built-in `title` (otherwise ignored); wins over `clickable`, `href` and
|
|
194
|
+
* `route`, which are then ignored; ignored on `dashed`. Bind `[(expanded)]`.
|
|
195
|
+
* @default false
|
|
196
|
+
*/
|
|
197
|
+
collapsible: import("@angular/core").InputSignal<boolean>;
|
|
198
|
+
/**
|
|
199
|
+
* Open state of a `collapsible` card (3.36), two-way: `[(expanded)]`. Open
|
|
200
|
+
* by default, so a plain `collapsible` hides nothing; set `false` for a card
|
|
201
|
+
* that starts closed (also in prerendered HTML). Closed, only the head
|
|
202
|
+
* shows: the body is `hidden` and the footer is not displayed.
|
|
203
|
+
* @default true
|
|
204
|
+
*/
|
|
205
|
+
readonly expanded: import("@angular/core").ModelSignal<boolean>;
|
|
184
206
|
/**
|
|
185
207
|
* Emitted when a `clickable` card is clicked or activated with Enter or
|
|
186
208
|
* Space. Not emitted on a link card (`href`/`route`): the link navigates by
|
|
187
209
|
* itself (one navigation); bind the native `(click)` for analytics.
|
|
188
210
|
*/
|
|
189
211
|
readonly cardClick: import("@angular/core").OutputEmitterRef<MouseEvent>;
|
|
212
|
+
/** Generated id prefix (3.36): creation order, so prerendered HTML is the same in every build. */
|
|
213
|
+
private readonly uid;
|
|
214
|
+
/** Id of the body a collapsible card's toggle controls. */
|
|
215
|
+
protected readonly bodyId: string;
|
|
216
|
+
/** Id of the subtitle that describes a collapsible card's toggle. */
|
|
217
|
+
protected readonly subtitleId: string;
|
|
218
|
+
/**
|
|
219
|
+
* Whether the card collapses (3.36): `collapsible` with a built-in title,
|
|
220
|
+
* except for the dashed tile.
|
|
221
|
+
*/
|
|
222
|
+
protected readonly isCollapsible: import("@angular/core").Signal<boolean>;
|
|
190
223
|
/**
|
|
191
224
|
* How the card links (3.24): `href` wins over `route`; `''`/`null` routes
|
|
192
|
-
* are no link, and the dashed "coming soon" tile never links.
|
|
225
|
+
* are no link, and the dashed "coming soon" tile never links. A
|
|
226
|
+
* collapsible card (3.36) never links.
|
|
193
227
|
*/
|
|
194
228
|
protected readonly linkMode: import("@angular/core").Signal<"href" | "route" | null>;
|
|
195
229
|
/**
|
|
196
230
|
* Whether the card acts as a button: `clickable`, except for the dashed
|
|
197
|
-
* "coming soon" tile, which is never interactive,
|
|
198
|
-
* anchor is the only interactive element.
|
|
231
|
+
* "coming soon" tile, which is never interactive, a link card, whose
|
|
232
|
+
* anchor is the only interactive element, and a collapsible card (3.36),
|
|
233
|
+
* whose toggle is.
|
|
199
234
|
*/
|
|
200
235
|
protected isClickable: import("@angular/core").Signal<boolean>;
|
|
236
|
+
/** Opens or closes a collapsible card; `expandedChange` emits the new state. */
|
|
237
|
+
protected toggle(): void;
|
|
201
238
|
/** `ariaLabel` on the card; on a link card it names the anchor instead. */
|
|
202
239
|
protected readonly cardAriaLabel: import("@angular/core").Signal<string | undefined>;
|
|
203
240
|
constructor();
|
|
@@ -309,7 +346,18 @@ export declare class CardComponent {
|
|
|
309
346
|
"required": false;
|
|
310
347
|
"isSignal": true;
|
|
311
348
|
};
|
|
349
|
+
"collapsible": {
|
|
350
|
+
"alias": "collapsible";
|
|
351
|
+
"required": false;
|
|
352
|
+
"isSignal": true;
|
|
353
|
+
};
|
|
354
|
+
"expanded": {
|
|
355
|
+
"alias": "expanded";
|
|
356
|
+
"required": false;
|
|
357
|
+
"isSignal": true;
|
|
358
|
+
};
|
|
312
359
|
}, {
|
|
360
|
+
"expanded": "expandedChange";
|
|
313
361
|
"cardClick": "cardClick";
|
|
314
362
|
}, never, ["[card-badge]", "[card-header-action]", "[card-header]", "*", "[card-footer]"], true, never>;
|
|
315
363
|
}
|
|
@@ -66,6 +66,16 @@ export declare class ComboboxComponent implements ControlValueAccessor {
|
|
|
66
66
|
readonly helperText: import("@angular/core").InputSignal<string | undefined>;
|
|
67
67
|
/** Error message */
|
|
68
68
|
readonly error: import("@angular/core").InputSignal<string | undefined>;
|
|
69
|
+
/**
|
|
70
|
+
* Announce the error message the moment it appears (`role="alert"` on the
|
|
71
|
+
* message), as `lc-textarea`. Set `false` when an `lc-alert` error summary
|
|
72
|
+
* already announces the errors, e.g. a page that moves focus to this field
|
|
73
|
+
* after a failed submit (422): the error is then read once, with the field,
|
|
74
|
+
* not twice (alert and description). The message stays visible, stays linked
|
|
75
|
+
* through `aria-describedby`, and the input keeps `aria-invalid`.
|
|
76
|
+
* @default true
|
|
77
|
+
*/
|
|
78
|
+
readonly announceError: import("@angular/core").InputSignal<boolean>;
|
|
69
79
|
/** Disabled state */
|
|
70
80
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
71
81
|
/** Allow multiple selections */
|
|
@@ -268,6 +278,11 @@ export declare class ComboboxComponent implements ControlValueAccessor {
|
|
|
268
278
|
"required": false;
|
|
269
279
|
"isSignal": true;
|
|
270
280
|
};
|
|
281
|
+
"announceError": {
|
|
282
|
+
"alias": "announceError";
|
|
283
|
+
"required": false;
|
|
284
|
+
"isSignal": true;
|
|
285
|
+
};
|
|
271
286
|
"disabled": {
|
|
272
287
|
"alias": "disabled";
|
|
273
288
|
"required": false;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BadgeVariant } from "@lifecorner/angular-ui-kit/badge";
|
|
1
2
|
import * as i0 from "@angular/core";
|
|
2
3
|
/**
|
|
3
4
|
* Emphasis treatment applied to a row's value.
|
|
@@ -26,6 +27,24 @@ export interface DescriptionListItem {
|
|
|
26
27
|
datetime?: string;
|
|
27
28
|
/** Optional visual emphasis for the value. @default 'default' */
|
|
28
29
|
emphasis?: DescriptionListEmphasis;
|
|
30
|
+
/**
|
|
31
|
+
* Shows the value as an `lc-badge` (3.36, quellen row 2): rounded, `sm` in
|
|
32
|
+
* an md list, `xs` in an sm list. A `value` that is empty or the same word
|
|
33
|
+
* (trimmed, any case) is not shown; another value stays as text before the
|
|
34
|
+
* badge („1“ [Freigegeben]), and `href` or `datetime` wrap that text only.
|
|
35
|
+
* Term and value stay one `dt`/`dd` pair, read as „term, badge“.
|
|
36
|
+
*/
|
|
37
|
+
badge?: string;
|
|
38
|
+
/** Variant of the `badge`, as `lc-badge`. @default 'default' */
|
|
39
|
+
badgeVariant?: BadgeVariant;
|
|
40
|
+
/**
|
|
41
|
+
* The sum item (3.36, app-shell row 2): a rule above and a double rule
|
|
42
|
+
* below (`--color-field-border`), term and value semibold with tabular
|
|
43
|
+
* figures; its `emphasis` is ignored. `totalAriaLabel` is read before its
|
|
44
|
+
* term. Usually the last item.
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
total?: boolean;
|
|
29
48
|
/** Optional opaque payload echoed back in `itemClick`. */
|
|
30
49
|
id?: string;
|
|
31
50
|
}
|
|
@@ -55,6 +74,8 @@ export type DescriptionListSeparator = 'line' | 'divider' | 'none';
|
|
|
55
74
|
* - Semantic markup (`<dl>`/`<dt>`/`<dd>`) for accessibility; `clickable`
|
|
56
75
|
* rows hold a native button (named by term and value) that the keyboard
|
|
57
76
|
* reaches, and the `dl` keeps its term and value pairs.
|
|
77
|
+
* - 3.36: an item's value as a badge (`badge`, `badgeVariant`), and a sum
|
|
78
|
+
* item (`total`) with ledger rules, announced with `totalAriaLabel`.
|
|
58
79
|
*
|
|
59
80
|
* @example
|
|
60
81
|
* ```html
|
|
@@ -99,8 +120,22 @@ export declare class DescriptionListComponent {
|
|
|
99
120
|
* @default false
|
|
100
121
|
*/
|
|
101
122
|
readonly clickable: import("@angular/core").InputSignal<boolean>;
|
|
123
|
+
/**
|
|
124
|
+
* Read before the term of a `total` item and not shown (3.36, app-shell
|
|
125
|
+
* row 2): „Summe“ makes a screen reader read „Summe, Gesamtkosten Ist,
|
|
126
|
+
* 522.530,00 €“. Empty adds nothing.
|
|
127
|
+
* @default ''
|
|
128
|
+
*/
|
|
129
|
+
readonly totalAriaLabel: import("@angular/core").InputSignal<string>;
|
|
102
130
|
/** Emitted when a row is clicked (or activated via keyboard when `clickable`). */
|
|
103
131
|
readonly itemClick: import("@angular/core").OutputEmitterRef<DescriptionListItem>;
|
|
132
|
+
/** The visually hidden start of a total's term: „Summe, “ (3.36). */
|
|
133
|
+
protected readonly totalPrefix: import("@angular/core").Signal<string>;
|
|
134
|
+
/**
|
|
135
|
+
* Whether a badge item also shows its `value` as text (3.36, D-2): not when
|
|
136
|
+
* it is empty or the badge's word.
|
|
137
|
+
*/
|
|
138
|
+
protected badgeShowsValue(item: DescriptionListItem): boolean;
|
|
104
139
|
/** Generated id prefix, taken once per instance, so later ids don't shift. */
|
|
105
140
|
private readonly uid;
|
|
106
141
|
/** Id of row `index`'s term (only rendered when `clickable`). */
|
|
@@ -147,6 +182,11 @@ export declare class DescriptionListComponent {
|
|
|
147
182
|
"required": false;
|
|
148
183
|
"isSignal": true;
|
|
149
184
|
};
|
|
185
|
+
"totalAriaLabel": {
|
|
186
|
+
"alias": "totalAriaLabel";
|
|
187
|
+
"required": false;
|
|
188
|
+
"isSignal": true;
|
|
189
|
+
};
|
|
150
190
|
}, {
|
|
151
191
|
"itemClick": "itemClick";
|
|
152
192
|
}, never, never, true, never>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AvatarColor, AvatarFallback } from "@lifecorner/angular-ui-kit/avatar";
|
|
2
2
|
import { MenuItem } from "@lifecorner/angular-ui-kit/menu";
|
|
3
3
|
import { ThemeService } from "@lifecorner/angular-ui-kit/theme";
|
|
4
|
+
import { BadgeVariant } from "@lifecorner/angular-ui-kit/badge";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
/** A link in the header's main navigation (`navItems`). */
|
|
6
7
|
export interface HeaderNavItem {
|
|
@@ -31,6 +32,18 @@ export type HeaderUserMenuTrigger = 'icon' | 'avatar';
|
|
|
31
32
|
* the title. From 641 px both render it inline.
|
|
32
33
|
*/
|
|
33
34
|
export type HeaderContextPlacement = 'inline' | 'below';
|
|
35
|
+
/**
|
|
36
|
+
* State of the header's context (3.36, `contextBadge`): an `lc-badge`
|
|
37
|
+
* (`sm`, rounded) inside the context button after `contextName`, e.g.
|
|
38
|
+
* `{ label: 'Freigegeben', variant: 'success' }`. Keep the label to one or two
|
|
39
|
+
* words.
|
|
40
|
+
*/
|
|
41
|
+
export interface HeaderContextBadge {
|
|
42
|
+
/** Visible badge text; it ends the button's accessible name. */
|
|
43
|
+
label: string;
|
|
44
|
+
/** Badge variant, as `lc-badge`. @default 'default' */
|
|
45
|
+
variant?: BadgeVariant;
|
|
46
|
+
}
|
|
34
47
|
/**
|
|
35
48
|
* AppHeaderComponent - Global application header for the LifeCorner shell
|
|
36
49
|
*
|
|
@@ -78,6 +91,9 @@ export type HeaderContextPlacement = 'inline' | 'below';
|
|
|
78
91
|
* of being hidden; from 641 px it sits in the end group as before.
|
|
79
92
|
* - `focusContext()` (3.34): moves the focus to the context button after the
|
|
80
93
|
* next render, e.g. after a choice in the sheet it opened (WCAG 2.4.3).
|
|
94
|
+
* - `contextBadge` (3.36): the context's state as a badge inside the context
|
|
95
|
+
* button, part of its accessible name; `hamburgerClick` emits the
|
|
96
|
+
* hamburger's `<button>`, e.g. for `lc-sidenav [returnFocusTo]`.
|
|
81
97
|
* - Every built-in label is an input (`homeAriaLabel`, `hamburgerAriaLabel`,
|
|
82
98
|
* `userMenuAriaLabel`, `navAriaLabel`, `profileLabel`, `logoutLabel`,
|
|
83
99
|
* `themeToDarkAriaLabel`, `themeToLightAriaLabel`, `contextAriaLabel`);
|
|
@@ -222,6 +238,19 @@ export declare class HeaderComponent {
|
|
|
222
238
|
* @default 'inline'
|
|
223
239
|
*/
|
|
224
240
|
readonly contextPlacement: import("@angular/core").InputSignal<HeaderContextPlacement>;
|
|
241
|
+
/**
|
|
242
|
+
* State of the context (3.36, app-shell row 1): an `lc-badge` (`sm`,
|
|
243
|
+
* rounded) inside the context button after `contextName`, e.g.
|
|
244
|
+
* `{ label: 'Freigegeben', variant: 'success' }`, wherever the button shows
|
|
245
|
+
* (`inline` and `below`, every size). Its label ends the button's accessible
|
|
246
|
+
* name („Monatsstand wählen, Monatsstand Oktober 2026 · Fassung 1,
|
|
247
|
+
* Freigegeben“, WCAG 2.5.3) unless `contextAriaLabel` already holds it. With
|
|
248
|
+
* a badge the button may grow to 340 px (220 without); a long name ends with
|
|
249
|
+
* "…" and the badge stays whole. Keep the label to one or two words. Target
|
|
250
|
+
* size, focus ring, `contextClick` and `focusContext()` don't change.
|
|
251
|
+
* @default undefined
|
|
252
|
+
*/
|
|
253
|
+
readonly contextBadge: import("@angular/core").InputSignal<HeaderContextBadge | undefined>;
|
|
225
254
|
readonly menuSize: import("@angular/core").InputSignal<"sm" | "md" | "lg">;
|
|
226
255
|
readonly showProfileMenuItem: import("@angular/core").InputSignal<boolean>;
|
|
227
256
|
/** Render the account menu (avatar trigger with Profile/Logout). */
|
|
@@ -271,12 +300,19 @@ export declare class HeaderComponent {
|
|
|
271
300
|
readonly profileLabel: import("@angular/core").InputSignal<string>;
|
|
272
301
|
/** Label of the Logout entry in the account menu. */
|
|
273
302
|
readonly logoutLabel: import("@angular/core").InputSignal<string>;
|
|
274
|
-
|
|
303
|
+
/**
|
|
304
|
+
* Emitted when the hamburger is clicked. Since 3.36 it carries the
|
|
305
|
+
* hamburger's native `<button>`, the element that has the focus, so a page
|
|
306
|
+
* can hand it to `lc-sidenav`: `(hamburgerClick)="trigger = $event; open = true"`
|
|
307
|
+
* with `[returnFocusTo]="trigger"`. Handlers without `$event` work as before.
|
|
308
|
+
*/
|
|
309
|
+
readonly hamburgerClick: import("@angular/core").OutputEmitterRef<HTMLElement>;
|
|
275
310
|
readonly themeToggleClick: import("@angular/core").OutputEmitterRef<void>;
|
|
276
311
|
readonly logoutClick: import("@angular/core").OutputEmitterRef<void>;
|
|
277
312
|
readonly profileClick: import("@angular/core").OutputEmitterRef<void>;
|
|
278
313
|
readonly contextClick: import("@angular/core").OutputEmitterRef<void>;
|
|
279
314
|
private readonly injector;
|
|
315
|
+
private readonly hostElement;
|
|
280
316
|
private themeServiceInstance;
|
|
281
317
|
/**
|
|
282
318
|
* Resolved on first use, i.e. only when the theme button is shown: creating
|
|
@@ -338,7 +374,8 @@ export declare class HeaderComponent {
|
|
|
338
374
|
*/
|
|
339
375
|
focusContext(): void;
|
|
340
376
|
/**
|
|
341
|
-
* Handle hamburger click
|
|
377
|
+
* Handle hamburger click: emits the hamburger's native `<button>` (3.36).
|
|
378
|
+
* Called without a rendered hamburger, it emits the header's host element.
|
|
342
379
|
*/
|
|
343
380
|
onHamburgerClick(): void;
|
|
344
381
|
/**
|
|
@@ -500,6 +537,11 @@ export declare class HeaderComponent {
|
|
|
500
537
|
"required": false;
|
|
501
538
|
"isSignal": true;
|
|
502
539
|
};
|
|
540
|
+
"contextBadge": {
|
|
541
|
+
"alias": "contextBadge";
|
|
542
|
+
"required": false;
|
|
543
|
+
"isSignal": true;
|
|
544
|
+
};
|
|
503
545
|
"menuSize": {
|
|
504
546
|
"alias": "menuSize";
|
|
505
547
|
"required": false;
|
|
@@ -10,6 +10,8 @@ export type HeroVariant = 'default' | 'slim' | 'light';
|
|
|
10
10
|
* background stays full-bleed
|
|
11
11
|
*/
|
|
12
12
|
export type HeroContentWidth = 'full' | 'lg';
|
|
13
|
+
/** Heading level of `lc-hero`'s title (3.36): `h1`–`h6`, the same look at every level. */
|
|
14
|
+
export type HeroHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
13
15
|
/**
|
|
14
16
|
* Hero component for prominent page headers with gradient backgrounds.
|
|
15
17
|
*
|
|
@@ -22,8 +24,15 @@ export type HeroContentWidth = 'full' | 'lg';
|
|
|
22
24
|
* - Content projection for body and footer sections
|
|
23
25
|
* - Footer slot for metadata, stats, or CTAs
|
|
24
26
|
* - Media slot (`[hero-media]`) for a visual: below the text on small screens,
|
|
25
|
-
* beside it from 1024 px
|
|
27
|
+
* beside it from 1024 px
|
|
28
|
+
* - 3.37: components in the default slot keep full opacity (only the body
|
|
29
|
+
* text is softened, through its colour), and badges in a hero take the light
|
|
30
|
+
* palette in both themes; `fill` takes the height of a stretching grid or
|
|
31
|
+
* flex row
|
|
26
32
|
* - Content width `lg`: a full-bleed band whose text lines up with the page column
|
|
33
|
+
* - `headingLevel` (3.36): the title as `h1`–`h6`, the same look at every level
|
|
34
|
+
* - `focusTitle()` (3.36): moves focus to the title (`tabindex="-1"`, out of the
|
|
35
|
+
* Tab order) after an action replaced the stage (WCAG 2.4.3)
|
|
27
36
|
*
|
|
28
37
|
* @example
|
|
29
38
|
* ```html
|
|
@@ -79,6 +88,36 @@ export declare class HeroComponent {
|
|
|
79
88
|
* @default 'full'
|
|
80
89
|
*/
|
|
81
90
|
contentWidth: import("@angular/core").InputSignal<HeroContentWidth>;
|
|
91
|
+
/**
|
|
92
|
+
* Element of the title (`h1`–`h6`), so the hero fits the page's outline
|
|
93
|
+
* (3.36, cockpit row 1). Only the element changes: size, weight, line height
|
|
94
|
+
* and spacing are the same at every level, `size`, `variant` and breakpoint.
|
|
95
|
+
* Use 2 under an `lc-page-header`, which holds the page's `h1`.
|
|
96
|
+
* @default 1
|
|
97
|
+
*/
|
|
98
|
+
headingLevel: import("@angular/core").InputSignal<HeroHeadingLevel>;
|
|
99
|
+
/**
|
|
100
|
+
* Fill the height the container gives the hero (3.37, cockpit row 1): in a
|
|
101
|
+
* grid or flex row that stretches its items, the band ends at the row's
|
|
102
|
+
* bottom edge; the content stays at the top and `[hero-footer]` sits at the
|
|
103
|
+
* bottom. Without it the hero is as tall as its content.
|
|
104
|
+
* @default false
|
|
105
|
+
*/
|
|
106
|
+
fill: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
107
|
+
private readonly titleEl;
|
|
108
|
+
private readonly labelEl;
|
|
109
|
+
/**
|
|
110
|
+
* Moves the focus to the title (3.36, monatsstand row 1), e.g. after an
|
|
111
|
+
* action replaced the stage and the button that was used is gone, so focus
|
|
112
|
+
* doesn't fall back to the page (WCAG 2.4.3). Gives the title
|
|
113
|
+
* `tabindex="-1"` first: it stays out of the Tab order. With a `label`, the
|
|
114
|
+
* title is named "label title" (`aria-labelledby` on both, ids set at the
|
|
115
|
+
* call), so the label is read before it. Call it after the new state has
|
|
116
|
+
* rendered, e.g. `afterNextRender(() => this.hero().focusTitle(), { injector })`
|
|
117
|
+
* with `hero = viewChild.required(HeroComponent)`, as
|
|
118
|
+
* `lc-next-step-card.focusTitle()`. Without a call nothing changes.
|
|
119
|
+
*/
|
|
120
|
+
focusTitle(): void;
|
|
82
121
|
protected heroClasses: import("@angular/core").Signal<string>;
|
|
83
122
|
static ɵfac: i0.ɵɵFactoryDeclaration<HeroComponent, never>;
|
|
84
123
|
static ɵcmp: i0.ɵɵComponentDeclaration<HeroComponent, "lc-hero", never, {
|
|
@@ -117,5 +156,15 @@ export declare class HeroComponent {
|
|
|
117
156
|
"required": false;
|
|
118
157
|
"isSignal": true;
|
|
119
158
|
};
|
|
159
|
+
"headingLevel": {
|
|
160
|
+
"alias": "headingLevel";
|
|
161
|
+
"required": false;
|
|
162
|
+
"isSignal": true;
|
|
163
|
+
};
|
|
164
|
+
"fill": {
|
|
165
|
+
"alias": "fill";
|
|
166
|
+
"required": false;
|
|
167
|
+
"isSignal": true;
|
|
168
|
+
};
|
|
120
169
|
}, {}, never, ["*", "[hero-media]", "[hero-footer]"], true, never>;
|
|
121
170
|
}
|
|
@@ -26,6 +26,12 @@ export declare function readableInk(fill: string): string | null;
|
|
|
26
26
|
*
|
|
27
27
|
* Charts fall back to this list when a series/segment brings no `color` of its
|
|
28
28
|
* own; per-item colours always win.
|
|
29
|
+
*
|
|
30
|
+
* 3.37 (request 057, 056 F-1, WCAG 1.4.11): entries 3 and 4 are the status
|
|
31
|
+
* inks, not the status fills. `--color-success-default` measured 2.47–2.72:1
|
|
32
|
+
* and `--color-warning-default` 2.05–2.26:1 on light pages; the inks reach
|
|
33
|
+
* 5.30 and 6.03:1 there (8.40 and 7.65:1 dark). Every entry keeps 3:1 against
|
|
34
|
+
* `--color-background` and `--color-surface` in both themes.
|
|
29
35
|
*/
|
|
30
36
|
export declare const CHART_PALETTE: readonly string[];
|
|
31
37
|
/** Palette colour for the series/segment at `index`, wrapping around. */
|
|
@@ -121,6 +121,11 @@ export type ListItemPart = 'row' | 'action';
|
|
|
121
121
|
* - `focusItem(id, part)` (3.34): moves the focus to a row's button or link,
|
|
122
122
|
* or to its action, e.g. when the sheet that action opened closes
|
|
123
123
|
* (WCAG 2.4.3)
|
|
124
|
+
* - `showChevron` (3.36): a decorative chevron at the end of every
|
|
125
|
+
* `clickable` or `href` row
|
|
126
|
+
* - 3.37: a `clickable` row with an `action` holds a native button stretched
|
|
127
|
+
* over the row (named by the row) beside its action, so no control sits
|
|
128
|
+
* inside another (WCAG 4.1.2); one Tab stop for the row, then the action
|
|
124
129
|
*
|
|
125
130
|
* @example
|
|
126
131
|
* ```html
|
|
@@ -168,6 +173,16 @@ export declare class ListComponent {
|
|
|
168
173
|
* @default 'xs'
|
|
169
174
|
*/
|
|
170
175
|
actionSize: import("@angular/core").InputSignal<ButtonSize>;
|
|
176
|
+
/**
|
|
177
|
+
* Ends every row that opens something, a `clickable` row or an `href` row,
|
|
178
|
+
* with the kit's `chevron-right` (20 px, `--color-text-tertiary`) after its
|
|
179
|
+
* badge, metadata and action (3.36, quellen row 3). Decorative: hidden from
|
|
180
|
+
* screen readers. Plain rows get none, and neither do rows drawn by an
|
|
181
|
+
* `lcListItem` template (add the icon to the template there). Row height,
|
|
182
|
+
* target size, focus ring, badge and `actionClick` don't change.
|
|
183
|
+
* @default false
|
|
184
|
+
*/
|
|
185
|
+
showChevron: import("@angular/core").InputSignal<boolean>;
|
|
171
186
|
/** Event emitted when an item is clicked */
|
|
172
187
|
readonly itemClick: import("@angular/core").OutputEmitterRef<ListItem>;
|
|
173
188
|
/** Event emitted when an action button is clicked */
|
|
@@ -199,6 +214,13 @@ export declare class ListComponent {
|
|
|
199
214
|
* @param part Which part of the row gets the focus.
|
|
200
215
|
*/
|
|
201
216
|
focusItem(id: string, part?: ListItemPart): void;
|
|
217
|
+
/** Generated id prefix, taken once per instance (module counter, the same in every prerender). */
|
|
218
|
+
private readonly uid;
|
|
219
|
+
/**
|
|
220
|
+
* Id of row `index` of a `clickable` row with an `action` (3.37): the
|
|
221
|
+
* row's button is named by it (`aria-labelledby`).
|
|
222
|
+
*/
|
|
223
|
+
protected rowId(index: number): string;
|
|
202
224
|
/** Whether a row renders as a link: `href` set and not disabled. */
|
|
203
225
|
protected isLinkRow(item: ListItem): boolean;
|
|
204
226
|
/**
|
|
@@ -276,6 +298,11 @@ export declare class ListComponent {
|
|
|
276
298
|
"required": false;
|
|
277
299
|
"isSignal": true;
|
|
278
300
|
};
|
|
301
|
+
"showChevron": {
|
|
302
|
+
"alias": "showChevron";
|
|
303
|
+
"required": false;
|
|
304
|
+
"isSignal": true;
|
|
305
|
+
};
|
|
279
306
|
}, {
|
|
280
307
|
"itemClick": "itemClick";
|
|
281
308
|
"actionClick": "actionClick";
|
|
@@ -161,8 +161,13 @@ export declare class SelectComponent implements ControlValueAccessor {
|
|
|
161
161
|
/**
|
|
162
162
|
* Close dropdown. Idempotent: the overlay's `detach` re-enters here after
|
|
163
163
|
* `isOpen` flips, and that second call must not emit `closed` again.
|
|
164
|
+
*
|
|
165
|
+
* `returnFocus` (3.37, request 057, services row 2): a single-select choice
|
|
166
|
+
* and `Escape` also hand the focus back to the trigger when it is on `<body>`
|
|
167
|
+
* (a tap on an option, which has no `tabindex`, moves it there). Without it
|
|
168
|
+
* (backdrop click, detach) only focus inside the panel returns, as before.
|
|
164
169
|
*/
|
|
165
|
-
close(): void;
|
|
170
|
+
close(returnFocus?: boolean): void;
|
|
166
171
|
/**
|
|
167
172
|
* Select an option
|
|
168
173
|
*/
|
|
@@ -187,6 +192,13 @@ export declare class SelectComponent implements ControlValueAccessor {
|
|
|
187
192
|
* Handle click outside
|
|
188
193
|
*/
|
|
189
194
|
onClickOutside(): void;
|
|
195
|
+
/**
|
|
196
|
+
* Keys that reach the open overlay while the focus is outside the field and
|
|
197
|
+
* the panel, e.g. on `<body>` after a tap (3.37, request 057): `Escape`
|
|
198
|
+
* closes and returns the focus. It runs before the overlay's own `Escape`
|
|
199
|
+
* detach, which then finds the select closed.
|
|
200
|
+
*/
|
|
201
|
+
onOverlayKeydown(event: KeyboardEvent): void;
|
|
190
202
|
writeValue(value: SelectValue): void;
|
|
191
203
|
registerOnChange(fn: (value: SelectValue) => void): void;
|
|
192
204
|
registerOnTouched(fn: () => void): void;
|