@orianatech/pire 1.0.0 → 1.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"icon-data.generated.d.ts","sourceRoot":"","sources":["../../../src/components/core/icon-data.generated.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2I9C,CAAC"}
1
+ {"version":3,"file":"icon-data.generated.d.ts","sourceRoot":"","sources":["../../../src/components/core/icon-data.generated.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4I9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"icon-map.d.ts","sourceRoot":"","sources":["../../../src/components/core/icon-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuD7C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAAkD,CAAC"}
1
+ {"version":3,"file":"icon-map.d.ts","sourceRoot":"","sources":["../../../src/components/core/icon-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0D7C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAAkD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AASpC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;AAEnE,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,GAAG;IACrE,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,oEAAoE;IACpE,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IAClD;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC7C,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IAC1D,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,oGAAoG;IACpG,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,iBAAiB,CAAC;IACzC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7C,6DAA6D;IAC7D,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iGAAiG;IACjG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2FAA2F;IAC3F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;2FAC2F;AAC3F,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAmB,EAC/F,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAmB,EAC7F,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EACpD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,qBAsI9F"}
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -6,6 +6,14 @@ export interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, '
6
6
  monogram?: string;
7
7
  /** Current app or object title. */
8
8
  title?: React.ReactNode;
9
+ /**
10
+ * The leftmost cell of the bar — pass an `AppLauncher`.
11
+ *
12
+ * A slot rather than launcher props of its own: the bar's job is placement, and the catalogue,
13
+ * its search and its open state all belong to the launcher. It renders before `onMenu`, sized to
14
+ * `--rail-w` and pulled through the bar's padding, so it sits directly above `ShellRail`.
15
+ */
16
+ launcher?: React.ReactNode;
9
17
  onMenu?: () => void;
10
18
  onSearch?: () => void;
11
19
  /** Accessible name for the menu button. Defaults to English, and the bar has no access to the app's
@@ -33,4 +41,4 @@ export interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, '
33
41
  userMenuLabel?: string;
34
42
  }
35
43
  /** Fixed 48px application chrome. One per page, always the first landmark. */
36
- export declare function ShellBar({ product, monogram, title, onMenu, onSearch, menuLabel, searchLabel, actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps): React.JSX.Element;
44
+ export declare function ShellBar({ launcher, product, monogram, title, onMenu, onSearch, menuLabel, searchLabel, actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps): React.JSX.Element;
@@ -6,6 +6,14 @@ export interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, '
6
6
  monogram?: string;
7
7
  /** Current app or object title. */
8
8
  title?: React.ReactNode;
9
+ /**
10
+ * The leftmost cell of the bar — pass an `AppLauncher`.
11
+ *
12
+ * A slot rather than launcher props of its own: the bar's job is placement, and the catalogue,
13
+ * its search and its open state all belong to the launcher. It renders before `onMenu`, sized to
14
+ * `--rail-w` and pulled through the bar's padding, so it sits directly above `ShellRail`.
15
+ */
16
+ launcher?: React.ReactNode;
9
17
  onMenu?: () => void;
10
18
  onSearch?: () => void;
11
19
  /** Accessible name for the menu button. Defaults to English, and the bar has no access to the app's
@@ -33,5 +41,5 @@ export interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, '
33
41
  userMenuLabel?: string;
34
42
  }
35
43
  /** Fixed 48px application chrome. One per page, always the first landmark. */
36
- export declare function ShellBar({ product, monogram, title, onMenu, onSearch, menuLabel, searchLabel, actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps): React.JSX.Element;
44
+ export declare function ShellBar({ launcher, product, monogram, title, onMenu, onSearch, menuLabel, searchLabel, actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps): React.JSX.Element;
37
45
  //# sourceMappingURL=ShellBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShellBar.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/ShellBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAMpC,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IACrF,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;kGAC8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;oEAEgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;mGAC+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAA6B,EAClG,WAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,qBA2BpG"}
1
+ {"version":3,"file":"ShellBar.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/ShellBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAMpC,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IACrF,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;kGAC8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;oEAEgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;mGAC+F;IAC/F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAA6B,EAC5G,WAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,aAAa,qBA4BpG"}
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+ /** One application, or one company-wide destination. `icon` is required, not optional: the rail has
3
+ * no room for a label, so an entry without a glyph would render as an empty 48px gap. */
4
+ export interface ShellRailItem {
5
+ /** Passed back to `onChange`. Unique across every group. */
6
+ id: string;
7
+ /** The tooltip, and the entry's accessible name. Never drawn as text. */
8
+ label: string;
9
+ /** Icon slug, same vocabulary as `Button.icon`. */
10
+ icon: string;
11
+ }
12
+ export interface ShellRailGroup {
13
+ items: ShellRailItem[];
14
+ /**
15
+ * Marks the zone that absorbs overflow, so the zones around it stay pinned while this one
16
+ * scrolls. An ERP rail is a short pinned head, a long list of apps, and a short pinned tail; with
17
+ * no group marked the rail scrolls as a whole and the tail scrolls off with everything else.
18
+ *
19
+ * Only one group should carry it. A second is not an error, but two flexible zones divide the
20
+ * space between them and neither ends up the length it looks like it should be.
21
+ */
22
+ isScrollable?: boolean;
23
+ }
24
+ export interface ShellRailProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {
25
+ /** Zones, in order, separated by a hairline rule. */
26
+ groups: ShellRailGroup[];
27
+ /** Id of the open application. */
28
+ value?: string;
29
+ /** Fires with the chosen item's id — not a DOM change event. */
30
+ onChange?: (id: string) => void;
31
+ }
32
+ /**
33
+ * The first of two navigation levels: which **application** is open. `SideNav` is the second — which
34
+ * page is open inside it — and the two are independent, so an app with a single page renders a rail
35
+ * and no nav, and a single-app product renders a nav and no rail.
36
+ *
37
+ * Icon-only by construction. Each entry is a React Aria `Button` carrying its label as
38
+ * `aria-label` and wrapped in a right-placed `Tooltip`, which is the same pairing a collapsed
39
+ * `SideNav` row uses and for the same reason: React Aria wires a tooltip up as `aria-describedby`,
40
+ * and a description is not a name — without the `aria-label` a screen reader announces eleven
41
+ * unlabelled buttons.
42
+ *
43
+ * Two things worth knowing:
44
+ *
45
+ * - **The selected entry is marked `aria-current="true"`, not `"page"`.** It names the current
46
+ * application, and the current *page* is the `SideNav` leaf inside it. Both levels claiming
47
+ * `page` would announce two current pages on one screen.
48
+ * - **The selection is a fill plus a ring, and needs both.** The fill is a tint at 1.64:1 against
49
+ * the rail; `--border-rail-selected` is what clears the 3:1 WCAG 1.4.11 asks of a state
50
+ * indicator. Restyling the tile without the ring makes selection invisible to anyone who cannot
51
+ * separate two close blues.
52
+ */
53
+ export declare function ShellRail({ groups, value, onChange, className, ...rest }: ShellRailProps): React.JSX.Element;
@@ -0,0 +1,54 @@
1
+ import * as React from 'react';
2
+ /** One application, or one company-wide destination. `icon` is required, not optional: the rail has
3
+ * no room for a label, so an entry without a glyph would render as an empty 48px gap. */
4
+ export interface ShellRailItem {
5
+ /** Passed back to `onChange`. Unique across every group. */
6
+ id: string;
7
+ /** The tooltip, and the entry's accessible name. Never drawn as text. */
8
+ label: string;
9
+ /** Icon slug, same vocabulary as `Button.icon`. */
10
+ icon: string;
11
+ }
12
+ export interface ShellRailGroup {
13
+ items: ShellRailItem[];
14
+ /**
15
+ * Marks the zone that absorbs overflow, so the zones around it stay pinned while this one
16
+ * scrolls. An ERP rail is a short pinned head, a long list of apps, and a short pinned tail; with
17
+ * no group marked the rail scrolls as a whole and the tail scrolls off with everything else.
18
+ *
19
+ * Only one group should carry it. A second is not an error, but two flexible zones divide the
20
+ * space between them and neither ends up the length it looks like it should be.
21
+ */
22
+ isScrollable?: boolean;
23
+ }
24
+ export interface ShellRailProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {
25
+ /** Zones, in order, separated by a hairline rule. */
26
+ groups: ShellRailGroup[];
27
+ /** Id of the open application. */
28
+ value?: string;
29
+ /** Fires with the chosen item's id — not a DOM change event. */
30
+ onChange?: (id: string) => void;
31
+ }
32
+ /**
33
+ * The first of two navigation levels: which **application** is open. `SideNav` is the second — which
34
+ * page is open inside it — and the two are independent, so an app with a single page renders a rail
35
+ * and no nav, and a single-app product renders a nav and no rail.
36
+ *
37
+ * Icon-only by construction. Each entry is a React Aria `Button` carrying its label as
38
+ * `aria-label` and wrapped in a right-placed `Tooltip`, which is the same pairing a collapsed
39
+ * `SideNav` row uses and for the same reason: React Aria wires a tooltip up as `aria-describedby`,
40
+ * and a description is not a name — without the `aria-label` a screen reader announces eleven
41
+ * unlabelled buttons.
42
+ *
43
+ * Two things worth knowing:
44
+ *
45
+ * - **The selected entry is marked `aria-current="true"`, not `"page"`.** It names the current
46
+ * application, and the current *page* is the `SideNav` leaf inside it. Both levels claiming
47
+ * `page` would announce two current pages on one screen.
48
+ * - **The selection is a fill plus a ring, and needs both.** The fill is a tint at 1.64:1 against
49
+ * the rail; `--border-rail-selected` is what clears the 3:1 WCAG 1.4.11 asks of a state
50
+ * indicator. Restyling the tile without the ring makes selection invisible to anyone who cannot
51
+ * separate two close blues.
52
+ */
53
+ export declare function ShellRail({ groups, value, onChange, className, ...rest }: ShellRailProps): React.JSX.Element;
54
+ //# sourceMappingURL=ShellRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellRail.d.ts","sourceRoot":"","sources":["../../../src/components/navigation/ShellRail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B;0FAC0F;AAC1F,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IACzF,qDAAqD;IACrD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,qBAyBxF"}
@@ -0,0 +1,90 @@
1
+ import * as React from 'react';
2
+ export interface AppLauncherItem {
3
+ /** Passed back to `onAction`. Unique across every section. */
4
+ id: string;
5
+ label: string;
6
+ /** Second line, in a `tile` section. Ignored by `compact`, which has no room for it. */
7
+ description?: string;
8
+ /** Icon slug, same vocabulary as `Button.icon`. */
9
+ icon?: string;
10
+ /**
11
+ * Extra terms this entry should match on, beyond its label and description — the English name of
12
+ * a Spanish app, the abbreviation people actually type, the old name it was renamed from.
13
+ *
14
+ * Matched against, never announced: the accessible name stays the label alone. Named to match
15
+ * `CommandPaletteItem.keywords`, which does the same job in the same way.
16
+ */
17
+ keywords?: string;
18
+ }
19
+ export interface AppLauncherSection {
20
+ /** Heading above the block. Omit for a single unlabelled grid. */
21
+ label?: string;
22
+ items: AppLauncherItem[];
23
+ /**
24
+ * `tile` (the default) is a destination worth describing: an accent plate, the name, and
25
+ * `description` underneath. `compact` is a link that only needs naming, and drops to a muted
26
+ * 16px glyph on one line.
27
+ *
28
+ * The distinction is not decoration. An ERP's app catalogue and its company-wide functions are
29
+ * different kinds of thing, and drawing them at equal weight makes eleven equal choices out of
30
+ * what is really seven plus four.
31
+ */
32
+ variant?: 'tile' | 'compact';
33
+ }
34
+ export interface AppLauncherProps {
35
+ /** The catalogue, in the order it should read. */
36
+ sections: AppLauncherSection[];
37
+ /** Fires with the chosen item's id. The panel closes itself first. */
38
+ onAction?: (id: string) => void;
39
+ /** Id of the open application, marked `aria-current` and highlighted. */
40
+ value?: string;
41
+ /** Heading inside the panel. Defaults to the dictionary's `appLauncherTitle`. */
42
+ title?: React.ReactNode;
43
+ /** Secondary text beside the heading — "7 applications · 4 company functions". */
44
+ meta?: React.ReactNode;
45
+ /** Drops the search box. Worth keeping until a catalogue is genuinely short. */
46
+ isSearchable?: boolean;
47
+ /**
48
+ * The query on every keystroke. **Debounce before calling the server.**
49
+ *
50
+ * On its own this only observes; it does not change how `sections` is treated. Pair it with
51
+ * `isFilteredExternally` to actually hand filtering over.
52
+ */
53
+ onSearchChange?: (query: string) => void;
54
+ /**
55
+ * `sections` is the final list and the launcher filters nothing locally. Required for
56
+ * server-backed catalogues: fuzzy matches, synonyms and code-to-description hits do not survive
57
+ * a second local "contains" pass.
58
+ *
59
+ * Named to match `ComboBox` and `ValueHelpDialog`, deliberately — one concept under two names is
60
+ * worse than either name.
61
+ */
62
+ isFilteredExternally?: boolean;
63
+ /** Shows a status row rather than "nothing found" while a request is in flight. */
64
+ isLoading?: boolean;
65
+ /** Overrides the dictionary's `appLauncherEmpty`. */
66
+ emptyLabel?: React.ReactNode;
67
+ /** Overrides the dictionary's `appLauncherSearch`, which is both placeholder and field label. */
68
+ searchPlaceholder?: string;
69
+ /** Accessible name of the trigger *and* the panel. Defaults to the dictionary's `appLauncherLabel`. */
70
+ 'aria-label'?: string;
71
+ /** Trigger glyph. `grid-2x2` is the launcher convention; override for a product mark. */
72
+ icon?: string;
73
+ className?: string;
74
+ }
75
+ /**
76
+ * The shell's application switcher: the full catalogue, one press from anywhere.
77
+ *
78
+ * Trigger and panel are one component rather than two exports, so nothing in the product has to
79
+ * hold the open state or line the popover up with the button. The trigger is sized to `--rail-w`
80
+ * and pulled through the shell bar's padding, which puts it directly above `ShellRail` — pass it to
81
+ * `ShellBar`'s `launcher` slot and the two columns align on their own.
82
+ *
83
+ * The rail carries the apps a user works in every day; this carries all of them. That is the whole
84
+ * division of labour, and it is why the launcher is not simply a longer rail.
85
+ *
86
+ * Filtering is local by default, over label, description and `keywords`, accent- and
87
+ * case-insensitively — "compras" has to find "Compras" and "periodo" has to find "Período", or the
88
+ * box feels broken in Spanish. Hand it to a server with `isFilteredExternally`.
89
+ */
90
+ export declare function AppLauncher({ sections, onAction, value, title, meta, isSearchable, onSearchChange, isFilteredExternally, isLoading, emptyLabel, searchPlaceholder, 'aria-label': ariaLabel, icon, className }: AppLauncherProps): React.JSX.Element;
@@ -0,0 +1,91 @@
1
+ import * as React from 'react';
2
+ export interface AppLauncherItem {
3
+ /** Passed back to `onAction`. Unique across every section. */
4
+ id: string;
5
+ label: string;
6
+ /** Second line, in a `tile` section. Ignored by `compact`, which has no room for it. */
7
+ description?: string;
8
+ /** Icon slug, same vocabulary as `Button.icon`. */
9
+ icon?: string;
10
+ /**
11
+ * Extra terms this entry should match on, beyond its label and description — the English name of
12
+ * a Spanish app, the abbreviation people actually type, the old name it was renamed from.
13
+ *
14
+ * Matched against, never announced: the accessible name stays the label alone. Named to match
15
+ * `CommandPaletteItem.keywords`, which does the same job in the same way.
16
+ */
17
+ keywords?: string;
18
+ }
19
+ export interface AppLauncherSection {
20
+ /** Heading above the block. Omit for a single unlabelled grid. */
21
+ label?: string;
22
+ items: AppLauncherItem[];
23
+ /**
24
+ * `tile` (the default) is a destination worth describing: an accent plate, the name, and
25
+ * `description` underneath. `compact` is a link that only needs naming, and drops to a muted
26
+ * 16px glyph on one line.
27
+ *
28
+ * The distinction is not decoration. An ERP's app catalogue and its company-wide functions are
29
+ * different kinds of thing, and drawing them at equal weight makes eleven equal choices out of
30
+ * what is really seven plus four.
31
+ */
32
+ variant?: 'tile' | 'compact';
33
+ }
34
+ export interface AppLauncherProps {
35
+ /** The catalogue, in the order it should read. */
36
+ sections: AppLauncherSection[];
37
+ /** Fires with the chosen item's id. The panel closes itself first. */
38
+ onAction?: (id: string) => void;
39
+ /** Id of the open application, marked `aria-current` and highlighted. */
40
+ value?: string;
41
+ /** Heading inside the panel. Defaults to the dictionary's `appLauncherTitle`. */
42
+ title?: React.ReactNode;
43
+ /** Secondary text beside the heading — "7 applications · 4 company functions". */
44
+ meta?: React.ReactNode;
45
+ /** Drops the search box. Worth keeping until a catalogue is genuinely short. */
46
+ isSearchable?: boolean;
47
+ /**
48
+ * The query on every keystroke. **Debounce before calling the server.**
49
+ *
50
+ * On its own this only observes; it does not change how `sections` is treated. Pair it with
51
+ * `isFilteredExternally` to actually hand filtering over.
52
+ */
53
+ onSearchChange?: (query: string) => void;
54
+ /**
55
+ * `sections` is the final list and the launcher filters nothing locally. Required for
56
+ * server-backed catalogues: fuzzy matches, synonyms and code-to-description hits do not survive
57
+ * a second local "contains" pass.
58
+ *
59
+ * Named to match `ComboBox` and `ValueHelpDialog`, deliberately — one concept under two names is
60
+ * worse than either name.
61
+ */
62
+ isFilteredExternally?: boolean;
63
+ /** Shows a status row rather than "nothing found" while a request is in flight. */
64
+ isLoading?: boolean;
65
+ /** Overrides the dictionary's `appLauncherEmpty`. */
66
+ emptyLabel?: React.ReactNode;
67
+ /** Overrides the dictionary's `appLauncherSearch`, which is both placeholder and field label. */
68
+ searchPlaceholder?: string;
69
+ /** Accessible name of the trigger *and* the panel. Defaults to the dictionary's `appLauncherLabel`. */
70
+ 'aria-label'?: string;
71
+ /** Trigger glyph. `grid-2x2` is the launcher convention; override for a product mark. */
72
+ icon?: string;
73
+ className?: string;
74
+ }
75
+ /**
76
+ * The shell's application switcher: the full catalogue, one press from anywhere.
77
+ *
78
+ * Trigger and panel are one component rather than two exports, so nothing in the product has to
79
+ * hold the open state or line the popover up with the button. The trigger is sized to `--rail-w`
80
+ * and pulled through the shell bar's padding, which puts it directly above `ShellRail` — pass it to
81
+ * `ShellBar`'s `launcher` slot and the two columns align on their own.
82
+ *
83
+ * The rail carries the apps a user works in every day; this carries all of them. That is the whole
84
+ * division of labour, and it is why the launcher is not simply a longer rail.
85
+ *
86
+ * Filtering is local by default, over label, description and `keywords`, accent- and
87
+ * case-insensitively — "compras" has to find "Compras" and "periodo" has to find "Período", or the
88
+ * box feels broken in Spanish. Hand it to a server with `isFilteredExternally`.
89
+ */
90
+ export declare function AppLauncher({ sections, onAction, value, title, meta, isSearchable, onSearchChange, isFilteredExternally, isLoading, emptyLabel, searchPlaceholder, 'aria-label': ariaLabel, icon, className }: AppLauncherProps): React.JSX.Element;
91
+ //# sourceMappingURL=AppLauncher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppLauncher.d.ts","sourceRoot":"","sources":["../../../src/components/patterns/AppLauncher.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,kFAAkF;IAClF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uGAAuG;IACvG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAmB,EACvF,cAAc,EAAE,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAC9E,YAAY,EAAE,SAAS,EAAE,IAAiB,EAAE,SAAS,EAAE,EAAE,gBAAgB,qBA2F1E"}
@@ -12,8 +12,17 @@
12
12
  migrating off Tailwind has to skip, and a skipped reset must not take part of the class
13
13
  contract with it. `styles.css.test.ts` enforces that. */
14
14
  /* Announced but not drawn. Clip rather than display:none or visibility:hidden, both of which
15
- remove the node from the accessibility tree along with the pixels. */
16
- .pire-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
15
+ remove the node from the accessibility tree along with the pixels.
16
+ Every declaration is `!important` because this is a utility, not a component: its whole
17
+ contract is "this takes up no room", and a one-class utility declared near the top of the file
18
+ loses every tie to a one-class component rule declared below it. That is not theoretical —
19
+ `DataTable`'s hidden column header carried `.pire-th-inner` too, took its `width:100%` while
20
+ staying `position:absolute`, and stretched the document ~870px past the viewport with nothing
21
+ on screen to show for it. Bootstrap's `.visually-hidden` is marked the same way, for the same
22
+ reason. */
23
+ /* biome-ignore-start lint/complexity/noImportantStyles: order-independence is the point — see above. */
24
+ .pire-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip-path:inset(50%)!important;white-space:nowrap!important;border:0!important}
25
+ /* biome-ignore-end lint/complexity/noImportantStyles: order-independence is the point — see above. */
17
26
  .pire-numeric{font:var(--type-numeric);letter-spacing:var(--ls-numeric);font-variant-numeric:tabular-nums}
18
27
  .pire-eyebrow{font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--text-secondary)}
19
28
  @keyframes pire-toast-in{from{opacity:0;transform:translate(var(--pire-toast-tx,-50%),8px)}to{opacity:1}}
@@ -260,6 +269,67 @@
260
269
  .pire-sidenav-subitem{height:var(--row-h-condensed);padding-left:calc(var(--sp-4) + var(--sp-4) + var(--sp-3))}
261
270
  .pire-sidenav-footer{margin-top:auto;padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--border-subtle)}
262
271
 
272
+ /* ---- ShellRail ------------------------------------------------------- */
273
+ /* The application rail: the *first* of two navigation levels, picking which app is open while
274
+ SideNav picks the page inside it. Icon-only and permanently dark, so it reads as chrome
275
+ continuing down from the shell bar rather than as a second sidebar. */
276
+ .pire-shellrail{display:flex;flex-direction:column;width:var(--rail-w);flex:0 0 var(--rail-w);min-height:0;background:var(--surface-rail);color:var(--text-inverse-secondary)}
277
+ /* A zone: home, the apps, the company-wide functions. Only the one marked `data-scroll` absorbs
278
+ overflow, which is what keeps the pinned zones pinned while 30 apps scroll between them. `flex:0 0
279
+ auto` on the rest stops them being squeezed by a long middle zone instead of scrolling it. */
280
+ .pire-shellrail-group{display:flex;flex-direction:column;flex:0 0 auto}
281
+ .pire-shellrail-group[data-scroll="true"]{flex:1 1 auto;min-height:0;overflow-y:auto}
282
+ .pire-shellrail-divider{flex:0 0 auto;height:1px;margin:var(--sp-1) var(--sp-2);background:var(--border-rail)}
283
+ .pire-shellrail-item{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:100%;height:var(--row-h-comfortable);padding:0;border:0;background:transparent;color:inherit;cursor:pointer;transition:var(--transition-control)}
284
+ .pire-shellrail-item[data-hovered]{color:var(--text-inverse)}
285
+ .pire-shellrail-item[data-focus-visible]{outline:var(--focus-w) solid var(--text-inverse);outline-offset:-3px}
286
+ .pire-shellrail-item[data-selected="true"]{color:var(--text-inverse)}
287
+ /* The tile inside the row, not the row itself: a full-width fill would butt against the rail's
288
+ edges and lose its shape, and the 36px square is what makes the selection read as a chip. */
289
+ .pire-shellrail-tile{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--radius-1);transition:var(--transition-control)}
290
+ .pire-shellrail-item[data-hovered] .pire-shellrail-tile{background:var(--surface-rail-hover)}
291
+ /* Fill *and* ring. The fill is 1.64:1 against the rail — a tint, not an indicator — so the inset
292
+ ring is the half that satisfies WCAG 1.4.11, and tokens.contrast.test.ts asserts it at 3:1. */
293
+ .pire-shellrail-item[data-selected="true"] .pire-shellrail-tile{background:var(--surface-rail-selected);box-shadow:inset 0 0 0 1px var(--border-rail-selected)}
294
+
295
+ /* ---- AppLauncher ----------------------------------------------------- */
296
+ /* The trigger is the shell bar's leftmost cell, sized to the rail and pulled through the bar's own
297
+ padding so the two columns line up. Without the negative margin the launcher sits 12px in and the
298
+ rail below it does not, which reads as a misprint at every viewport. */
299
+ .pire-launcher-trigger{display:flex;align-items:center;justify-content:center;flex:0 0 var(--rail-w);width:var(--rail-w);height:var(--shell-header-h);margin-left:calc(-1 * var(--sp-3));padding:0;border:0;background:var(--surface-rail-hover);color:var(--text-inverse);cursor:pointer;transition:var(--transition-control)}
300
+ .pire-launcher-trigger[data-hovered]{background:var(--surface-rail-selected)}
301
+ .pire-launcher-trigger[data-pressed],.pire-launcher-trigger[aria-expanded="true"]{background:var(--surface-rail-selected)}
302
+ .pire-launcher-trigger[data-focus-visible]{outline:var(--focus-w) solid var(--text-inverse);outline-offset:-3px}
303
+ /* Its own popover shell rather than `.pire-popover`, which caps at 320px tall and sizes itself from
304
+ the trigger — correct for a menu hanging off a field, wrong for a 560px catalogue hanging off a
305
+ 56px button. Same surface, border, shadow and entrance, so the two still read as one family. */
306
+ .pire-launcher-popover{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-2);box-shadow:var(--shadow-2);max-height:calc(100vh - var(--shell-header-h) - var(--sp-6));overflow:auto;animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
307
+ .pire-launcher{display:flex;flex-direction:column;gap:var(--sp-3);width:560px;max-width:calc(100vw - var(--sp-6));padding:var(--sp-4);outline:none}
308
+ .pire-launcher-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3)}
309
+ .pire-launcher-title{font:var(--type-h4)}
310
+ .pire-launcher-meta{font:var(--type-caption);color:var(--text-secondary)}
311
+ .pire-launcher-section{display:flex;flex-direction:column;gap:var(--sp-2)}
312
+ /* A rule above every section but the first, so the company-wide block reads as a different kind of
313
+ destination from the apps — the artboard's separation, without a divider element to render. */
314
+ .pire-launcher-section + .pire-launcher-section{padding-top:var(--sp-3);border-top:1px solid var(--border-subtle)}
315
+ /* Two columns, because an app catalogue is a grid of peers and a single column of eleven turns the
316
+ panel into a menu. Collapses below the breakpoint rather than shrinking the tiles past legibility. */
317
+ .pire-launcher-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-0h)}
318
+ @media (max-width:600px){.pire-launcher-grid{grid-template-columns:1fr}}
319
+ .pire-launcher-item{display:flex;align-items:center;gap:var(--sp-3);width:100%;padding:var(--sp-2);border:0;border-radius:var(--radius-1);background:transparent;color:var(--text-primary);font:var(--type-body);text-align:left;cursor:pointer;transition:var(--transition-control)}
320
+ .pire-launcher-item[data-hovered]{background:var(--surface-hover)}
321
+ .pire-launcher-item[data-pressed]{background:var(--surface-active)}
322
+ .pire-launcher-item[data-selected="true"]{background:var(--surface-selected);color:var(--accent-subtle-fg)}
323
+ /* The two densities. `tile` is a destination worth describing; `compact` is a link that only needs
324
+ naming, so its glyph steps down to 16px and loses the accent plate rather than shouting equally. */
325
+ .pire-launcher-item-icon{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:32px;height:32px;border-radius:var(--radius-1);background:var(--accent-subtle-bg);color:var(--accent-subtle-fg)}
326
+ .pire-launcher-grid[data-variant="compact"] .pire-launcher-item-icon{width:24px;height:24px;background:transparent;color:var(--text-secondary)}
327
+ .pire-launcher-item-text{display:flex;flex-direction:column;gap:1px;min-width:0}
328
+ .pire-launcher-item-label{font:var(--type-body-strong)}
329
+ .pire-launcher-grid[data-variant="compact"] .pire-launcher-item-label{font:var(--type-body)}
330
+ .pire-launcher-item-desc{font:var(--type-caption);color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
331
+ .pire-launcher-empty{padding:var(--sp-4) var(--sp-2);font:var(--type-body);color:var(--text-secondary);text-align:center}
332
+
263
333
  /* ---- Feedback -------------------------------------------------------- */
264
334
  .pire-modal-overlay{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:var(--sp-6);background:var(--surface-overlay);animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
265
335
  .pire-modal{display:flex;flex-direction:column;width:100%;max-height:calc(100vh - var(--sp-16));background:var(--surface-raised);border-radius:var(--radius-2);box-shadow:var(--shadow-3);animation:pire-dialog-in var(--dur-base) var(--ease-entrance);outline:none}
@@ -82,6 +82,19 @@ export interface PireMessages {
82
82
  paginationRowsPerPage: string;
83
83
  /** Landmark name of the main SideNav. Override it when a screen has more than one nav. */
84
84
  sideNavLabel: string;
85
+ /** ShellRail's landmark name. Distinct from `sideNavLabel`: the two navs are on screen together,
86
+ * and one of them has to say which level it is. */
87
+ shellRailLabel: string;
88
+ /** Accessible name of AppLauncher's trigger, and of the panel it opens. */
89
+ appLauncherLabel: string;
90
+ /** Heading inside the launcher panel. */
91
+ appLauncherTitle: string;
92
+ /** The launcher search box's label and placeholder. */
93
+ appLauncherSearch: string;
94
+ /** Shown when the search matches nothing. */
95
+ appLauncherEmpty: string;
96
+ /** Announced while a server-backed catalogue is loading. */
97
+ appLauncherLoading: string;
85
98
  /** Names SplitPane's list column. */
86
99
  splitPaneList: string;
87
100
  /** Names SplitPane's detail column. */
@@ -82,6 +82,19 @@ export interface PireMessages {
82
82
  paginationRowsPerPage: string;
83
83
  /** Landmark name of the main SideNav. Override it when a screen has more than one nav. */
84
84
  sideNavLabel: string;
85
+ /** ShellRail's landmark name. Distinct from `sideNavLabel`: the two navs are on screen together,
86
+ * and one of them has to say which level it is. */
87
+ shellRailLabel: string;
88
+ /** Accessible name of AppLauncher's trigger, and of the panel it opens. */
89
+ appLauncherLabel: string;
90
+ /** Heading inside the launcher panel. */
91
+ appLauncherTitle: string;
92
+ /** The launcher search box's label and placeholder. */
93
+ appLauncherSearch: string;
94
+ /** Shown when the search matches nothing. */
95
+ appLauncherEmpty: string;
96
+ /** Announced while a server-backed catalogue is loading. */
97
+ appLauncherLoading: string;
85
98
  /** Names SplitPane's list column. */
86
99
  splitPaneList: string;
87
100
  /** Names SplitPane's detail column. */
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,CAAC;IACzB,6FAA6F;IAC7F,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IAEvB,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IAEvB,6DAA6D;IAC7D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IAEzB,kEAAkE;IAClE;oGACgG;IAChG,WAAW,EAAE,MAAM,CAAC;IAEpB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IAExB,qEAAqE;IACrE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,qBAAqB,EAAE,MAAM,CAAC;IAE9B,oDAAoD;IACpD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAE5B,kEAAkE;IAClE,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IAEnB,yEAAyE;IACzE,yBAAyB,EAAE,MAAM,CAAC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,uBAAuB,EAAE,MAAM,CAAC;IAChC,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,gCAAgC,EAAE,MAAM,CAAC;IACzC,6CAA6C;IAC7C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,qBAAqB,EAAE,MAAM,CAAC;IAE9B,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAE9B,0FAA0F;IAC1F,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,kBAAkB,EAAE,MAAM,CAAC;IAE3B,kGAAkG;IAClG,gBAAgB,EAAE,MAAM,CAAC;IAEzB,wCAAwC;IACxC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,yBAAyB,EAAE,MAAM,CAAC;IAClC,0CAA0C;IAC1C,yBAAyB,EAAE,MAAM,CAAC;IAClC,iDAAiD;IACjD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,+CAA+C;IAC/C,0BAA0B,EAAE,MAAM,CAAC;IACnC,0CAA0C;IAC1C,wBAAwB,EAAE,MAAM,CAAC;IACjC,wCAAwC;IACxC,uBAAuB,EAAE,MAAM,CAAC;IAEhC,8DAA8D;IAC9D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qGAAqG;IACrG,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,YA0ExB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,YA0ExB,CAAC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}