@aggc/ui 0.5.1 → 0.7.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.
Files changed (51) hide show
  1. package/dist/chunks/{UiSkeleton.vue_vue_type_script_setup_true_lang-Lghyrtms.js → UiSkeleton.vue_vue_type_script_setup_true_lang-Dg-HzSqj.js} +286 -286
  2. package/dist/chunks/{pageHeader-CcJrPX_8.js → pageHeader-DhPY_hNA.js} +204 -146
  3. package/dist/components/StatusBadge.styles.d.ts +5 -0
  4. package/dist/components/StatusBadge.vue.d.ts +2 -2
  5. package/dist/components/UiButton.styles.d.ts +31 -12
  6. package/dist/components/UiButton.vue.d.ts +4 -0
  7. package/dist/components/UiCheckbox.styles.d.ts +2 -4
  8. package/dist/components/UiSegmentedControl.styles.d.ts +5 -1
  9. package/dist/components/UiSelect.styles.d.ts +10 -3
  10. package/dist/components/UiSkeleton.styles.d.ts +1 -33
  11. package/dist/components.js +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/styles/recipes/badge.recipe.d.ts +5 -0
  14. package/dist/styles/recipes/button.recipe.d.ts +31 -12
  15. package/dist/styles/recipes/card.recipe.d.ts +23 -12
  16. package/dist/styles/recipes/dropdown.recipe.d.ts +6 -6
  17. package/dist/styles/recipes/input.recipe.d.ts +0 -3
  18. package/dist/styles.js +118 -92
  19. package/dist/tokens/colors.d.ts +30 -0
  20. package/dist/tokens/core-colors.d.ts +30 -0
  21. package/dist/tokens/motion.d.ts +20 -0
  22. package/dist/tokens/radius.d.ts +9 -0
  23. package/dist/tokens-core.js +21 -5
  24. package/dist/ui.css +306 -228
  25. package/package.json +1 -1
  26. package/src/components/ResultPanel.styles.ts +7 -2
  27. package/src/components/SectionCard.styles.ts +1 -1
  28. package/src/components/SectionCard.vue +1 -1
  29. package/src/components/StatusBadge.styles.ts +10 -8
  30. package/src/components/StatusBadge.vue +1 -1
  31. package/src/components/UiButton.vue +5 -1
  32. package/src/components/UiCheckbox.styles.ts +7 -11
  33. package/src/components/UiField.styles.ts +2 -2
  34. package/src/components/UiLoadingState.styles.ts +2 -2
  35. package/src/components/UiSegmentedControl.styles.ts +14 -4
  36. package/src/components/UiSelect.styles.ts +24 -10
  37. package/src/components/UiSkeleton.styles.ts +7 -36
  38. package/src/css/base.css +44 -9
  39. package/src/styles/layouts/page.ts +5 -0
  40. package/src/styles/primitives/feedback.ts +1 -0
  41. package/src/styles/primitives/fields.ts +21 -11
  42. package/src/styles/primitives/surfaces.ts +13 -26
  43. package/src/styles/primitives/typography.ts +5 -4
  44. package/src/styles/recipes/badge.recipe.ts +5 -5
  45. package/src/styles/recipes/button.recipe.ts +86 -25
  46. package/src/styles/recipes/card.recipe.ts +24 -13
  47. package/src/styles/recipes/dropdown.recipe.ts +11 -8
  48. package/src/styles/recipes/input.recipe.ts +10 -6
  49. package/src/tokens/core-colors.ts +5 -0
  50. package/src/tokens/motion.ts +8 -0
  51. package/src/tokens/radius.ts +3 -0
@@ -20,5 +20,10 @@ export declare const statusBadgeClass: import("../../styled-system/types").Recip
20
20
  color: "badge.neutralText";
21
21
  borderColor: "badge.neutralBorder";
22
22
  };
23
+ danger: {
24
+ bg: "badge.dangerBg";
25
+ color: "badge.dangerText";
26
+ borderColor: "badge.dangerBorder";
27
+ };
23
28
  };
24
29
  }>;
@@ -1,12 +1,12 @@
1
1
  type __VLS_Props = {
2
- tone?: "success" | "warning" | "info" | "neutral";
2
+ tone?: "success" | "warning" | "info" | "danger" | "neutral";
3
3
  };
4
4
  declare var __VLS_1: {};
5
5
  type __VLS_Slots = {} & {
6
6
  default?: (props: typeof __VLS_1) => any;
7
7
  };
8
8
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
9
- tone: "success" | "warning" | "info" | "neutral";
9
+ tone: "success" | "warning" | "info" | "danger" | "neutral";
10
10
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
11
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
12
12
  declare const _default: typeof __VLS_export;
@@ -1,15 +1,12 @@
1
1
  export declare const uiButtonClass: import("../../styled-system/types").RecipeRuntimeFn<{
2
2
  variant: {
3
3
  solid: {
4
- bg: "linear-gradient(135deg, rgba(31,67,182,0.96) 0%, rgba(49,94,255,0.92) 100%)";
4
+ bg: "text.accent";
5
5
  color: "text.inverse";
6
6
  borderWidth: "1px";
7
- borderColor: "rgba(255,255,255,0.18)";
8
- boxShadow: "0 22px 36px -24px rgba(49,94,255,0.78), inset 0 1px 0 rgba(255,255,255,0.24)";
7
+ borderColor: "transparent";
9
8
  _dark: {
10
- color: "#f7f9fd";
11
- borderColor: "rgba(255,255,255,0.06)";
12
- boxShadow: "0 22px 40px -24px rgba(71,121,255,0.55), inset 0 1px 0 rgba(255,255,255,0.18)";
9
+ color: "text.inverse";
13
10
  };
14
11
  };
15
12
  outline: {
@@ -17,19 +14,41 @@ export declare const uiButtonClass: import("../../styled-system/types").RecipeRu
17
14
  color: "text.secondary";
18
15
  borderWidth: "1px";
19
16
  borderColor: "border.default";
20
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.18)";
21
- _dark: {
22
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.04)";
23
- };
24
17
  };
25
18
  subtle: {
26
19
  bg: "bg.accentSoft";
27
20
  color: "text.accent";
28
21
  borderWidth: "1px";
29
22
  borderColor: "badge.infoBorder";
30
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.22)";
23
+ };
24
+ };
25
+ size: {
26
+ sm: {
27
+ px: "3";
28
+ py: "1.5";
29
+ fontSize: "xs";
30
+ borderRadius: "md";
31
+ };
32
+ md: {
33
+ px: "4";
34
+ py: "2.5";
35
+ };
36
+ lg: {
37
+ px: "5";
38
+ py: "3";
39
+ fontSize: "md";
40
+ borderRadius: "xl";
41
+ };
42
+ };
43
+ tone: {
44
+ default: {};
45
+ danger: {
46
+ bg: "text.error";
47
+ color: "text.inverse";
48
+ borderWidth: "1px";
49
+ borderColor: "transparent";
31
50
  _dark: {
32
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.04)";
51
+ color: "text.inverse";
33
52
  };
34
53
  };
35
54
  };
@@ -1,5 +1,7 @@
1
1
  type __VLS_Props = {
2
2
  variant?: "solid" | "outline" | "subtle";
3
+ size?: "sm" | "md" | "lg";
4
+ tone?: "default" | "danger";
3
5
  loading?: boolean;
4
6
  loadingLabel?: string;
5
7
  disabled?: boolean;
@@ -11,7 +13,9 @@ type __VLS_Slots = {} & {
11
13
  default?: (props: typeof __VLS_1) => any;
12
14
  };
13
15
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
16
+ size: "sm" | "md" | "lg";
14
17
  variant: "solid" | "outline" | "subtle";
18
+ tone: "default" | "danger";
15
19
  disabled: boolean;
16
20
  loading: boolean;
17
21
  type: "button" | "submit";
@@ -3,12 +3,10 @@ export declare const uiCheckboxRootClass: import("../../styled-system/types").Re
3
3
  true: {
4
4
  borderColor: "border.accent";
5
5
  bg: "bg.selected";
6
- boxShadow: "0 18px 40px -30px rgba(49,94,255,0.56)";
7
6
  };
8
7
  false: {
9
8
  borderColor: "border.default";
10
9
  bg: "bg.input";
11
- boxShadow: "0 14px 32px -30px rgba(15,23,42,0.42)";
12
10
  };
13
11
  };
14
12
  disabled: {
@@ -27,13 +25,13 @@ export declare const uiCheckboxIndicatorClass: import("../../styled-system/types
27
25
  borderColor: "border.accent";
28
26
  bg: "bg.accentStrong";
29
27
  color: "text.inverse";
30
- boxShadow: "0 12px 24px -16px rgba(49,94,255,0.7)";
28
+ transform: "scale(1)";
31
29
  };
32
30
  false: {
33
31
  borderColor: "border.default";
34
32
  bg: "bg.buttonOutline";
35
33
  color: "transparent";
36
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.32)";
34
+ transform: "scale(1)";
37
35
  };
38
36
  };
39
37
  }>;
@@ -5,10 +5,14 @@ export declare const segmentedControlOptionClass: import("../../styled-system/ty
5
5
  borderColor: "border.accent";
6
6
  bg: "bg.accentStrong";
7
7
  color: "text.inverse";
8
- boxShadow: "0 14px 26px -16px rgba(49,94,255,0.68)";
9
8
  _hover: {
10
9
  bg: "bg.accentStrong";
11
10
  };
11
+ _dark: {
12
+ bg: "rgba(138, 180, 255, 0.2)";
13
+ color: "text.accent";
14
+ borderColor: "border.accent";
15
+ };
12
16
  };
13
17
  false: {
14
18
  borderColor: "transparent";
@@ -27,12 +27,14 @@ export declare const uiSelectTriggerClass: import("../../styled-system/types").R
27
27
  true: {
28
28
  borderColor: "border.accent";
29
29
  bg: "bg.cardStrong";
30
- boxShadow: "0 18px 42px -28px rgba(49,94,255,0.42)";
30
+ _dark: {
31
+ borderColor: "border.accent";
32
+ bg: "bg.input";
33
+ };
31
34
  };
32
35
  false: {
33
36
  borderColor: "border.default";
34
37
  bg: "bg.input";
35
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.22)";
36
38
  };
37
39
  };
38
40
  selected: {
@@ -50,6 +52,11 @@ export declare const uiSelectTriggerClass: import("../../styled-system/types").R
50
52
  };
51
53
  false: {
52
54
  cursor: "pointer";
55
+ _focusVisible: {
56
+ outline: "2px solid";
57
+ outlineColor: "text.accent";
58
+ outlineOffset: "2px";
59
+ };
53
60
  };
54
61
  };
55
62
  }>;
@@ -73,7 +80,7 @@ export declare const uiSelectOptionClass: import("../../styled-system/types").Re
73
80
  py: "2.5";
74
81
  };
75
82
  md: {
76
- py: "3";
83
+ py: "2.5";
77
84
  };
78
85
  };
79
86
  active: {
@@ -3,65 +3,33 @@ export declare const skeletonClass: import("../../styled-system/types").RecipeRu
3
3
  text: {
4
4
  width: "100%";
5
5
  height: "0.875rem";
6
- borderRadius: "md";
7
- bg: "rgba(127, 146, 184, 0.14)";
8
- _dark: {
9
- bg: "rgba(210, 220, 240, 0.09)";
10
- };
11
6
  };
12
7
  title: {
13
8
  width: "100%";
14
9
  height: "1.75rem";
15
- borderRadius: "xl";
16
- bg: "rgba(127, 146, 184, 0.14)";
17
- _dark: {
18
- bg: "rgba(210, 220, 240, 0.09)";
19
- };
10
+ borderRadius: "md";
20
11
  };
21
12
  rect: {
22
13
  width: "100%";
23
14
  height: "5rem";
24
- borderRadius: "xl";
25
- bg: "rgba(127, 146, 184, 0.14)";
26
- _dark: {
27
- bg: "rgba(210, 220, 240, 0.09)";
28
- };
29
15
  };
30
16
  pill: {
31
17
  width: "5rem";
32
18
  height: "1.75rem";
33
19
  borderRadius: "999px";
34
- bg: "rgba(127, 146, 184, 0.14)";
35
- _dark: {
36
- bg: "rgba(210, 220, 240, 0.09)";
37
- };
38
20
  };
39
21
  circle: {
40
22
  width: "2.75rem";
41
23
  height: "2.75rem";
42
24
  borderRadius: "999px";
43
- bg: "rgba(127, 146, 184, 0.14)";
44
- _dark: {
45
- bg: "rgba(210, 220, 240, 0.09)";
46
- };
47
25
  };
48
26
  stat: {
49
27
  width: "100%";
50
28
  height: "4.75rem";
51
- borderRadius: "xl";
52
- bg: "rgba(117, 138, 178, 0.16)";
53
- _dark: {
54
- bg: "rgba(210, 220, 240, 0.11)";
55
- };
56
29
  };
57
30
  action: {
58
31
  width: "100%";
59
32
  height: "2.75rem";
60
- borderRadius: "xl";
61
- bg: "rgba(127, 146, 184, 0.14)";
62
- _dark: {
63
- bg: "rgba(210, 220, 240, 0.09)";
64
- };
65
33
  };
66
34
  };
67
35
  }>;
@@ -1,4 +1,4 @@
1
- import { _ as s, a as t, b as i, c as o, d as n, e as S, f as U, g as d, h as l, i as c, j as g } from "./chunks/UiSkeleton.vue_vue_type_script_setup_true_lang-Lghyrtms.js";
1
+ import { _ as s, a as t, b as i, c as o, d as n, e as S, f as U, g as d, h as l, i as c, j as g } from "./chunks/UiSkeleton.vue_vue_type_script_setup_true_lang-Dg-HzSqj.js";
2
2
  export {
3
3
  s as PageSurface,
4
4
  t as ResultPanel,
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { _ as a, a as l, b as o, c as t, d as i, e as n, f as r, g as C, h as c, i as p, j as d } from "./chunks/UiSkeleton.vue_vue_type_script_setup_true_lang-Lghyrtms.js";
1
+ import { _ as a, a as l, b as o, c as t, d as i, e as n, f as r, g as C, h as c, i as p, j as d } from "./chunks/UiSkeleton.vue_vue_type_script_setup_true_lang-Dg-HzSqj.js";
2
2
  import { actionToolbarClass as u, badgeRecipe as f, cardRecipe as m, centeredEmptyStatePanelClass as k, clusterLayout as R, emptyStatePanelClass as T, errorTextClass as S, fieldControlClass as x, fieldControlSmClass as b, fieldTextareaClass as P, focusRingClass as y, infoPanelClass as U, inputRecipe as L, loadingRegionClass as h, metricGridPattern as B, mutedTextClass as D, resultRegionClass as H, resultSkeletonPanelClass as j, selectableDetailClass as w, selectableListClass as v, selectableListDetailRootClass as A, splitLayout as E, stackLayout as F } from "./styles.js";
3
- import { b as V, c as _, d as q, e as z, a as I, h as J, i as K, m as M, p as N, f as O, g as Q, j as W, k as X, s as Y, l as Z, n as $ } from "./chunks/pageHeader-CcJrPX_8.js";
3
+ import { b as V, c as _, d as q, e as z, a as I, h as J, i as K, m as M, p as N, f as O, g as Q, j as W, k as X, s as Y, l as Z, n as $ } from "./chunks/pageHeader-DhPY_hNA.js";
4
4
  import { colorTokens as es } from "./tokens.js";
5
5
  import { coreColorTokens as ls, motionTokens as os, radiusTokens as ts, spacingTokens as is, typographyTokens as ns } from "./tokens-core.js";
6
6
  import { desktopColorTokens as Cs } from "./tokens-desktop.js";
@@ -20,6 +20,11 @@ export declare const badgeRecipe: import("../../../styled-system/types").RecipeR
20
20
  bg: "badge.warningBg";
21
21
  color: "badge.warningText";
22
22
  };
23
+ danger: {
24
+ borderColor: "badge.dangerBorder";
25
+ bg: "badge.dangerBg";
26
+ color: "badge.dangerText";
27
+ };
23
28
  };
24
29
  size: {
25
30
  sm: {
@@ -1,15 +1,12 @@
1
1
  export declare const buttonRecipe: import("../../../styled-system/types").RecipeRuntimeFn<{
2
2
  variant: {
3
3
  solid: {
4
- bg: "linear-gradient(135deg, rgba(31,67,182,0.96) 0%, rgba(49,94,255,0.92) 100%)";
4
+ bg: "text.accent";
5
5
  color: "text.inverse";
6
6
  borderWidth: "1px";
7
- borderColor: "rgba(255,255,255,0.18)";
8
- boxShadow: "0 22px 36px -24px rgba(49,94,255,0.78), inset 0 1px 0 rgba(255,255,255,0.24)";
7
+ borderColor: "transparent";
9
8
  _dark: {
10
- color: "#f7f9fd";
11
- borderColor: "rgba(255,255,255,0.06)";
12
- boxShadow: "0 22px 40px -24px rgba(71,121,255,0.55), inset 0 1px 0 rgba(255,255,255,0.18)";
9
+ color: "text.inverse";
13
10
  };
14
11
  };
15
12
  outline: {
@@ -17,19 +14,41 @@ export declare const buttonRecipe: import("../../../styled-system/types").Recipe
17
14
  color: "text.secondary";
18
15
  borderWidth: "1px";
19
16
  borderColor: "border.default";
20
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.18)";
21
- _dark: {
22
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.04)";
23
- };
24
17
  };
25
18
  subtle: {
26
19
  bg: "bg.accentSoft";
27
20
  color: "text.accent";
28
21
  borderWidth: "1px";
29
22
  borderColor: "badge.infoBorder";
30
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.22)";
23
+ };
24
+ };
25
+ size: {
26
+ sm: {
27
+ px: "3";
28
+ py: "1.5";
29
+ fontSize: "xs";
30
+ borderRadius: "md";
31
+ };
32
+ md: {
33
+ px: "4";
34
+ py: "2.5";
35
+ };
36
+ lg: {
37
+ px: "5";
38
+ py: "3";
39
+ fontSize: "md";
40
+ borderRadius: "xl";
41
+ };
42
+ };
43
+ tone: {
44
+ default: {};
45
+ danger: {
46
+ bg: "text.error";
47
+ color: "text.inverse";
48
+ borderWidth: "1px";
49
+ borderColor: "transparent";
31
50
  _dark: {
32
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.04)";
51
+ color: "text.inverse";
33
52
  };
34
53
  };
35
54
  };
@@ -2,36 +2,47 @@ export declare const cardRecipe: import("../../../styled-system/types").RecipeRu
2
2
  variant: {
3
3
  surface: {
4
4
  position: "relative";
5
- overflow: "hidden";
6
- borderRadius: "3xl";
5
+ borderRadius: "xl";
7
6
  borderColor: "border.subtle";
8
7
  bg: "bg.card";
9
- backdropFilter: "blur(28px) saturate(155%)";
10
- boxShadow: "0 25px 30px -35px rgba(15,23,42,0.42)";
8
+ boxShadow: "0 1px 2px 0 rgba(15,23,42,0.04), 0 1px 3px 0 rgba(15,23,42,0.06)";
9
+ _dark: {
10
+ borderColor: "border.default";
11
+ boxShadow: "0 1px 2px 0 rgba(0,0,0,0.2), 0 1px 3px 0 rgba(0,0,0,0.24)";
12
+ };
11
13
  };
12
14
  inset: {
13
- borderRadius: "2xl";
15
+ borderRadius: "lg";
14
16
  borderColor: "border.soft";
15
17
  bg: "bg.cardAlt";
16
- backdropFilter: "blur(24px) saturate(145%)";
17
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.22)";
18
+ _dark: {
19
+ borderColor: "border.subtle";
20
+ };
18
21
  };
19
22
  elevated: {
20
- borderRadius: "2xl";
23
+ borderRadius: "lg";
21
24
  borderColor: "border.default";
22
25
  bg: "bg.cardStrong";
23
- backdropFilter: "blur(24px) saturate(145%)";
24
- boxShadow: "0 16px 32px -28px rgba(15,23,42,0.42)";
26
+ boxShadow: "0 1px 2px 0 rgba(15,23,42,0.04), 0 4px 12px -4px rgba(15,23,42,0.1)";
27
+ _dark: {
28
+ borderColor: "border.strong";
29
+ boxShadow: "0 1px 2px 0 rgba(0,0,0,0.24), 0 4px 12px -4px rgba(0,0,0,0.4)";
30
+ };
25
31
  };
26
32
  selectable: {
27
- borderRadius: "2xl";
33
+ borderRadius: "lg";
28
34
  borderColor: "border.default";
29
35
  bg: "bg.cardAlt";
30
36
  cursor: "pointer";
31
37
  _hover: {
32
38
  borderColor: "border.strong";
33
39
  bg: "bg.card";
34
- transform: "translateY(-1px)";
40
+ };
41
+ _dark: {
42
+ borderColor: "border.strong";
43
+ _hover: {
44
+ borderColor: "border.accent";
45
+ };
35
46
  };
36
47
  };
37
48
  };
@@ -2,7 +2,7 @@ export declare const dropdownRecipe: import("../../../styled-system/types").Reci
2
2
  placement: {
3
3
  anchored: {
4
4
  position: "absolute";
5
- top: "calc(100% + 10px)";
5
+ top: "calc(100% + 6px)";
6
6
  left: "0";
7
7
  right: "0";
8
8
  };
@@ -12,14 +12,14 @@ export declare const dropdownRecipe: import("../../../styled-system/types").Reci
12
12
  };
13
13
  density: {
14
14
  cozy: {
15
- borderRadius: "2xl";
16
- p: "2";
17
- gap: "1";
18
- };
19
- compact: {
20
15
  borderRadius: "xl";
21
16
  p: "1.5";
22
17
  gap: "0.5";
23
18
  };
19
+ compact: {
20
+ borderRadius: "lg";
21
+ p: "1";
22
+ gap: "0.5";
23
+ };
24
24
  };
25
25
  }>;
@@ -6,7 +6,6 @@ export declare const inputRecipe: import("../../../styled-system/types").RecipeR
6
6
  px: "3";
7
7
  py: "2.5";
8
8
  lineHeight: "1.45";
9
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.2)";
10
9
  };
11
10
  md: {
12
11
  minHeight: "48px";
@@ -14,7 +13,6 @@ export declare const inputRecipe: import("../../../styled-system/types").RecipeR
14
13
  px: "4";
15
14
  py: "3";
16
15
  lineHeight: "1.5";
17
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.24), 0 14px 28px -28px rgba(15,23,42,0.42)";
18
16
  };
19
17
  };
20
18
  kind: {
@@ -26,7 +24,6 @@ export declare const inputRecipe: import("../../../styled-system/types").RecipeR
26
24
  py: "4";
27
25
  lineHeight: "1.6";
28
26
  fontFamily: "mono";
29
- boxShadow: "inset 0 1px 0 rgba(255,255,255,0.24), 0 18px 36px -32px rgba(15,23,42,0.42)";
30
27
  };
31
28
  };
32
29
  }>;