@emporix/component-library 1.3.3 → 1.4.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 CHANGED
@@ -93,6 +93,86 @@ import { PrimaryButton } from '@emporix/component-library'
93
93
  | className | string | - | Additional CSS class |
94
94
  | data-testid | string | - | Test ID for testing |
95
95
 
96
+ ### InputText
97
+
98
+ A text input with optional label and tooltip. Hover and focus styles match the Dropdown component.
99
+
100
+ ```tsx
101
+ import { InputText } from '@emporix/component-library'
102
+
103
+ // With label and info tooltip
104
+ <InputText
105
+ label="Id"
106
+ tooltip="Unique identifier for this record"
107
+ placeholder="Enter id"
108
+ />
109
+
110
+ // Required field
111
+ <InputText label="Name" required placeholder="Enter name" />
112
+
113
+ // Disabled
114
+ <InputText label="Id" placeholder="Enter id" disabled />
115
+ ```
116
+
117
+ #### Props
118
+
119
+ | Prop | Type | Default | Description |
120
+ | ----------- | --------- | ------- | -------------------------------------------- |
121
+ | label | ReactNode | - | Label text above the input |
122
+ | tooltip | string | - | If set, shows info icon with this tooltip |
123
+ | required | boolean | false | Shows asterisk on label |
124
+ | inputId | string | - | id for the input (for label association) |
125
+ | disabled | boolean | false | Whether the input is disabled |
126
+ | className | string | - | Additional CSS class for the root |
127
+ | data-testid | string | - | Test ID for root and input (suffix `-input`) |
128
+
129
+ All standard HTML input attributes (placeholder, value, onChange, etc.) are supported.
130
+
131
+ ### SelectButton
132
+
133
+ Choose single or multiple options using buttons. API inspired by [PrimeReact SelectButton](https://primereact.org/selectbutton/). Selected state uses project primary colors.
134
+
135
+ ```tsx
136
+ import { SelectButton } from '@emporix/component-library'
137
+
138
+ const options = [
139
+ { label: 'Off', value: 'off' },
140
+ { label: 'On', value: 'on' },
141
+ ]
142
+
143
+ // Single selection
144
+ <SelectButton
145
+ value={value}
146
+ onChange={(e) => setValue(e.value)}
147
+ options={options}
148
+ />
149
+
150
+ // Multiple selection
151
+ <SelectButton
152
+ value={selected}
153
+ onChange={(e) => setSelected(e.value)}
154
+ options={options}
155
+ multiple
156
+ />
157
+ ```
158
+
159
+ #### Props
160
+
161
+ | Prop | Type | Default | Description |
162
+ | -------------- | ------------------------ | ------- | --------------------------------------- |
163
+ | value | unknown | - | Selected value (or array when multiple) |
164
+ | onChange | (e: ChangeEvent) => void | - | Callback when selection changes |
165
+ | options | T[] | - | Array of options |
166
+ | optionLabel | string | "label" | Property name for option label |
167
+ | optionValue | string | "value" | Property name for option value |
168
+ | optionDisabled | string | - | Property name for disabled flag |
169
+ | multiple | boolean | false | Allow multiple selection |
170
+ | itemTemplate | (option) => ReactNode | - | Custom render for each option |
171
+ | disabled | boolean | false | Disable the whole component |
172
+ | invalid | boolean | false | Validation invalid state |
173
+ | className | string | - | Additional CSS class |
174
+ | data-testid | string | - | Test ID for root and option buttons |
175
+
96
176
  ### Tabs
97
177
 
98
178
  A flexible tabs component for organizing content into multiple panels.
@@ -194,6 +274,14 @@ The component library provides a minimal set of CSS variables that are actually
194
274
  --color-border-light: #e9ecef;
195
275
  ```
196
276
 
277
+ #### Focus Ring
278
+
279
+ Reusable focus outline for inputs, dropdowns, SelectButton, etc. Override to change focus appearance globally.
280
+
281
+ ```css
282
+ --focus-ring-box-shadow: 0 0 0 2px rgba(38, 101, 183, 0.35);
283
+ ```
284
+
197
285
  #### Spacing
198
286
 
199
287
  ```css
@@ -217,7 +305,7 @@ The component library provides a minimal set of CSS variables that are actually
217
305
 
218
306
  ```css
219
307
  --font-size-sm: 0.875rem; /* 14px */
220
- --font-size-base: 1rem; /* 16px */
308
+ --font-size-base: 0.875rem; /* 14px */
221
309
  --font-size-lg: 1.125rem; /* 18px */
222
310
  ```
223
311
 
@@ -8,6 +8,13 @@ export interface DropdownChangeEvent {
8
8
  value: DropdownOption['value'] | null;
9
9
  originalEvent: React.SyntheticEvent;
10
10
  }
11
+ export interface DropdownEditEndEvent {
12
+ /** Trimmed value that was in the input when Enter was pressed */
13
+ value: string;
14
+ /** Selected option value if a matching option was found and selected; null otherwise */
15
+ selectedValue: DropdownOption['value'] | null;
16
+ originalEvent: React.KeyboardEvent;
17
+ }
11
18
  export interface DropdownProps<T = DropdownOption> {
12
19
  /**
13
20
  * Selected value (controlled). Must match optionValue of the selected option.
@@ -44,6 +51,17 @@ export interface DropdownProps<T = DropdownOption> {
44
51
  * Enable filter (search) in the overlay
45
52
  */
46
53
  filter?: boolean;
54
+ /**
55
+ * When true, the trigger is an editable input: user can type to filter options
56
+ * and select from the list. Matches PrimeReact Dropdown editable behavior.
57
+ * @see https://primereact.org/dropdown/#editable
58
+ */
59
+ editable?: boolean;
60
+ /**
61
+ * Called when the user ends editing by pressing Enter in the editable input.
62
+ * Fires with the trimmed input value and the selected option value (if a match was found).
63
+ */
64
+ onEditEnd?: (e: DropdownEditEndEvent) => void;
47
65
  /**
48
66
  * Whether the dropdown is disabled
49
67
  */
@@ -68,10 +86,22 @@ export interface DropdownProps<T = DropdownOption> {
68
86
  * Additional CSS class name for the overlay panel
69
87
  */
70
88
  panelClassName?: string;
89
+ /**
90
+ * Template for the selected value displayed in the trigger.
91
+ * Receives the selected option object or null when no value is selected.
92
+ * @see https://primereact.org/dropdown/#template
93
+ */
94
+ valueTemplate?: (option: T | null) => React.ReactNode;
95
+ /**
96
+ * Template for each option in the dropdown list.
97
+ * Receives the option object.
98
+ * @see https://primereact.org/dropdown/#template
99
+ */
100
+ itemTemplate?: (option: T) => React.ReactNode;
71
101
  /**
72
102
  * Test ID for testing
73
103
  */
74
104
  'data-testid'?: string;
75
105
  }
76
- export declare const Dropdown: <T extends Record<string, unknown>>({ value, onChange, options, optionLabel, optionValue, optionDisabled, placeholder, filter, disabled, required, label, inputId, className, panelClassName, "data-testid": testId, }: DropdownProps<T>) => import("react/jsx-runtime").JSX.Element;
106
+ export declare const Dropdown: <T extends Record<string, unknown>>({ value, onChange, onEditEnd, options, optionLabel, optionValue, optionDisabled, placeholder, filter, editable, disabled, required, label, inputId, className, panelClassName, valueTemplate, itemTemplate, "data-testid": testId, }: DropdownProps<T>) => import("react/jsx-runtime").JSX.Element;
77
107
  //# sourceMappingURL=Dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAI1D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAA;CACpC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,cAAc;IAC/C;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA4BD,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,oLAgBzD,aAAa,CAAC,CAAC,CAAC,4CAyRlB,CAAA"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown/Dropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAI1D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAA;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,wFAAwF;IACxF,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC7C,aAAa,EAAE,KAAK,CAAC,aAAa,CAAA;CACnC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,cAAc;IAC/C;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,SAAS,CAAA;IACrD;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IAC7C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA4BD,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sOAoBzD,aAAa,CAAC,CAAC,CAAC,4CAgYlB,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { default as React } from 'react';
2
+ export interface InputTextProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'className'> {
3
+ /**
4
+ * Label text displayed above the input
5
+ */
6
+ label?: React.ReactNode;
7
+ /**
8
+ * When set, an info icon is shown next to the label with this string as tooltip
9
+ */
10
+ tooltip?: string;
11
+ /**
12
+ * Whether the field is required (shows asterisk on label)
13
+ */
14
+ required?: boolean;
15
+ /**
16
+ * Input element id for label association
17
+ */
18
+ inputId?: string;
19
+ /**
20
+ * Additional CSS class name for the root
21
+ */
22
+ className?: string;
23
+ /**
24
+ * Test ID for testing
25
+ */
26
+ 'data-testid'?: string;
27
+ }
28
+ export declare const InputText: ({ label, tooltip, required, inputId: inputIdProp, className, "data-testid": testId, disabled, ...inputProps }: InputTextProps) => import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=InputText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputText.d.ts","sourceRoot":"","sources":["../../../src/components/input/InputText.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,MAAM,WAAW,cACf,SAAQ,IAAI,CACV,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,MAAM,GAAG,WAAW,CACrB;IACD;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,SAAS,GAAI,+GASvB,cAAc,4CA2DhB,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { default as React } from 'react';
2
+ export interface SelectButtonOption {
3
+ label?: string;
4
+ value?: string;
5
+ [key: string]: unknown;
6
+ }
7
+ export interface SelectButtonChangeEvent {
8
+ value: SelectButtonOption['value'] | SelectButtonOption['value'][] | null;
9
+ originalEvent: React.SyntheticEvent;
10
+ }
11
+ export interface SelectButtonProps<T = SelectButtonOption> {
12
+ /**
13
+ * Selected value (controlled). Single value or array when multiple.
14
+ */
15
+ value?: unknown;
16
+ /**
17
+ * Callback when selection changes
18
+ */
19
+ onChange?: (e: SelectButtonChangeEvent) => void;
20
+ /**
21
+ * Array of options
22
+ */
23
+ options: T[];
24
+ /**
25
+ * Property name for the option label (default: "label")
26
+ */
27
+ optionLabel?: keyof T | string;
28
+ /**
29
+ * Property name for the option value (default: "value")
30
+ */
31
+ optionValue?: keyof T | string;
32
+ /**
33
+ * Name of the property that indicates whether an option is disabled.
34
+ * @see https://primereact.org/selectbutton/
35
+ */
36
+ optionDisabled?: keyof T | string;
37
+ /**
38
+ * When true, allows multiple selection (value is an array).
39
+ */
40
+ multiple?: boolean;
41
+ /**
42
+ * Template for each option. Receives the option object.
43
+ */
44
+ itemTemplate?: (option: T) => React.ReactNode;
45
+ /**
46
+ * Whether the component is disabled
47
+ */
48
+ disabled?: boolean;
49
+ /**
50
+ * Invalid state for validation styling
51
+ */
52
+ invalid?: boolean;
53
+ /**
54
+ * Additional CSS class name for the root
55
+ */
56
+ className?: string;
57
+ /**
58
+ * Test ID for testing
59
+ */
60
+ 'data-testid'?: string;
61
+ }
62
+ export declare const SelectButton: <T extends Record<string, unknown>>({ value, onChange, options, optionLabel, optionValue, optionDisabled, multiple, itemTemplate, disabled, invalid, className, "data-testid": testId, }: SelectButtonProps<T>) => import("react/jsx-runtime").JSX.Element;
63
+ //# sourceMappingURL=SelectButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectButton.d.ts","sourceRoot":"","sources":["../../../src/components/selectbutton/SelectButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAA;IACzE,aAAa,EAAE,KAAK,CAAC,cAAc,CAAA;CACpC;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,kBAAkB;IACvD;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAAA;IAC/C;;OAEG;IACH,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAC9B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA4BD,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sJAa7D,iBAAiB,CAAC,CAAC,CAAC,4CAyFtB,CAAA"}
package/dist/index.d.ts CHANGED
@@ -15,5 +15,9 @@ export type { SecondaryButtonProps } from './components/buttons/SecondaryButton'
15
15
  export { Tabs } from './components/tabs/Tabs';
16
16
  export type { TabsProps, TabItem } from './components/tabs/Tabs';
17
17
  export { Dropdown } from './components/dropdown/Dropdown';
18
- export type { DropdownProps, DropdownOption, DropdownChangeEvent, } from './components/dropdown/Dropdown';
18
+ export type { DropdownProps, DropdownOption, DropdownChangeEvent, DropdownEditEndEvent, } from './components/dropdown/Dropdown';
19
+ export { InputText } from './components/input/InputText';
20
+ export type { InputTextProps } from './components/input/InputText';
21
+ export { SelectButton } from './components/selectbutton/SelectButton';
22
+ export type { SelectButtonProps, SelectButtonOption, SelectButtonChangeEvent, } from './components/selectbutton/SelectButton';
19
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AACzD,YAAY,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,gCAAgC,CAAA;AAGvC,OAAO,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AACzD,YAAY,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,wCAAwC,CAAA;AAG/C,OAAO,qBAAqB,CAAA"}