@rovula/ui 0.1.3 → 0.1.5
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/dist/cjs/bundle.css +158 -42
- package/dist/cjs/bundle.js +4 -4
- package/dist/cjs/bundle.js.map +1 -1
- package/dist/cjs/types/components/Dropdown/Dropdown.stories.d.ts +3 -0
- package/dist/cjs/types/components/InputFilter/InputFilter.stories.d.ts +3 -0
- package/dist/cjs/types/components/MaskedTextInput/MaskedTextInput.d.ts +3 -0
- package/dist/cjs/types/components/MaskedTextInput/MaskedTextInput.stories.d.ts +6 -0
- package/dist/cjs/types/components/PasswordInput/PasswordInput.stories.d.ts +3 -0
- package/dist/cjs/types/components/Search/Search.stories.d.ts +3 -0
- package/dist/cjs/types/components/Switch/Switch.d.ts +3 -1
- package/dist/cjs/types/components/Switch/Switch.stories.d.ts +12 -4
- package/dist/cjs/types/components/Switch/Switch.styles.d.ts +7 -0
- package/dist/cjs/types/components/TextInput/TextInput.d.ts +6 -0
- package/dist/cjs/types/components/TextInput/TextInput.stories.d.ts +9 -0
- package/dist/cjs/types/components/TextInput/TextInput.styles.d.ts +4 -0
- package/dist/cjs/types/components/Toast/Toast.d.ts +1 -0
- package/dist/cjs/types/components/Toast/Toast.stories.d.ts +14 -0
- package/dist/cjs/types/components/Toast/Toast.styles.d.ts +1 -0
- package/dist/components/PasswordInput/PasswordInput.js +2 -2
- package/dist/components/PasswordInput/PasswordInput.stories.js +1 -1
- package/dist/components/Switch/Switch.js +4 -17
- package/dist/components/Switch/Switch.stories.js +12 -2
- package/dist/components/Switch/Switch.styles.js +39 -0
- package/dist/components/TextInput/TextInput.js +28 -7
- package/dist/components/TextInput/TextInput.stories.js +13 -0
- package/dist/components/TextInput/TextInput.styles.js +26 -4
- package/dist/components/Toast/Toast.js +5 -5
- package/dist/components/Toast/Toast.stories.js +11 -2
- package/dist/components/Toast/Toast.styles.js +38 -6
- package/dist/components/Toast/Toaster.js +17 -1
- package/dist/esm/bundle.css +158 -42
- package/dist/esm/bundle.js +4 -4
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/types/components/Dropdown/Dropdown.stories.d.ts +3 -0
- package/dist/esm/types/components/InputFilter/InputFilter.stories.d.ts +3 -0
- package/dist/esm/types/components/MaskedTextInput/MaskedTextInput.d.ts +3 -0
- package/dist/esm/types/components/MaskedTextInput/MaskedTextInput.stories.d.ts +6 -0
- package/dist/esm/types/components/PasswordInput/PasswordInput.stories.d.ts +3 -0
- package/dist/esm/types/components/Search/Search.stories.d.ts +3 -0
- package/dist/esm/types/components/Switch/Switch.d.ts +3 -1
- package/dist/esm/types/components/Switch/Switch.stories.d.ts +12 -4
- package/dist/esm/types/components/Switch/Switch.styles.d.ts +7 -0
- package/dist/esm/types/components/TextInput/TextInput.d.ts +6 -0
- package/dist/esm/types/components/TextInput/TextInput.stories.d.ts +9 -0
- package/dist/esm/types/components/TextInput/TextInput.styles.d.ts +4 -0
- package/dist/esm/types/components/Toast/Toast.d.ts +1 -0
- package/dist/esm/types/components/Toast/Toast.stories.d.ts +14 -0
- package/dist/esm/types/components/Toast/Toast.styles.d.ts +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/src/theme/global.css +208 -89
- package/package.json +1 -1
- package/src/components/PasswordInput/PasswordInput.stories.tsx +1 -1
- package/src/components/PasswordInput/PasswordInput.tsx +2 -2
- package/src/components/Switch/Switch.stories.tsx +33 -2
- package/src/components/Switch/Switch.styles.ts +48 -0
- package/src/components/Switch/Switch.tsx +68 -45
- package/src/components/TextInput/TextInput.stories.tsx +82 -0
- package/src/components/TextInput/TextInput.styles.ts +36 -17
- package/src/components/TextInput/TextInput.tsx +40 -11
- package/src/components/Toast/Toast.stories.tsx +12 -2
- package/src/components/Toast/Toast.styles.tsx +38 -6
- package/src/components/Toast/Toast.tsx +7 -7
- package/src/components/Toast/Toaster.tsx +26 -4
- package/src/theme/themes/xspector/baseline.css +0 -1
- package/src/theme/tokens/components/switch.css +10 -11
- package/src/theme/themes/xspector/components/switch.css +0 -30
|
@@ -298,7 +298,9 @@ declare const meta: {
|
|
|
298
298
|
onTransitionEndCapture?: React.TransitionEventHandler<HTMLInputElement> | undefined;
|
|
299
299
|
form?: string | undefined | undefined;
|
|
300
300
|
list?: string | undefined | undefined;
|
|
301
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
301
302
|
step?: number | string | undefined | undefined;
|
|
303
|
+
warning?: boolean | undefined;
|
|
302
304
|
title?: string | undefined | undefined;
|
|
303
305
|
startIcon?: React.ReactNode;
|
|
304
306
|
endIcon?: React.ReactNode;
|
|
@@ -363,6 +365,7 @@ declare const meta: {
|
|
|
363
365
|
readOnly?: boolean | undefined | undefined;
|
|
364
366
|
src?: string | undefined | undefined;
|
|
365
367
|
iconMode?: "flat" | "solid" | undefined;
|
|
368
|
+
warningMessage?: string | undefined;
|
|
366
369
|
keepCloseIconOnValue?: boolean | undefined;
|
|
367
370
|
keepFooterSpace?: boolean | undefined;
|
|
368
371
|
labelClassName?: string | undefined;
|
|
@@ -285,7 +285,9 @@ declare const meta: {
|
|
|
285
285
|
onTransitionEndCapture?: React.TransitionEventHandler<HTMLInputElement> | undefined;
|
|
286
286
|
form?: string | undefined | undefined;
|
|
287
287
|
list?: string | undefined | undefined;
|
|
288
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
288
289
|
step?: number | string | undefined | undefined;
|
|
290
|
+
warning?: boolean | undefined;
|
|
289
291
|
title?: string | undefined | undefined;
|
|
290
292
|
startIcon?: React.ReactNode;
|
|
291
293
|
endIcon?: React.ReactNode;
|
|
@@ -350,6 +352,7 @@ declare const meta: {
|
|
|
350
352
|
readOnly?: boolean | undefined | undefined;
|
|
351
353
|
src?: string | undefined | undefined;
|
|
352
354
|
iconMode?: "flat" | "solid" | undefined;
|
|
355
|
+
warningMessage?: string | undefined;
|
|
353
356
|
keepCloseIconOnValue?: boolean | undefined;
|
|
354
357
|
keepFooterSpace?: boolean | undefined;
|
|
355
358
|
labelClassName?: string | undefined;
|
|
@@ -40,9 +40,12 @@ export declare const MaskedTextInput: React.ForwardRefExoticComponent<{
|
|
|
40
40
|
type?: React.HTMLInputTypeAttribute;
|
|
41
41
|
helperText?: string;
|
|
42
42
|
errorMessage?: string;
|
|
43
|
+
warningMessage?: string;
|
|
44
|
+
status?: "default" | "warning" | "error";
|
|
43
45
|
fullwidth?: boolean;
|
|
44
46
|
disabled?: boolean;
|
|
45
47
|
error?: boolean;
|
|
48
|
+
warning?: boolean;
|
|
46
49
|
required?: boolean;
|
|
47
50
|
isFloatingLabel?: boolean;
|
|
48
51
|
keepCloseIconOnValue?: boolean;
|
|
@@ -11,9 +11,12 @@ declare const meta: {
|
|
|
11
11
|
type?: React.HTMLInputTypeAttribute;
|
|
12
12
|
helperText?: string;
|
|
13
13
|
errorMessage?: string;
|
|
14
|
+
warningMessage?: string;
|
|
15
|
+
status?: "default" | "warning" | "error";
|
|
14
16
|
fullwidth?: boolean;
|
|
15
17
|
disabled?: boolean;
|
|
16
18
|
error?: boolean;
|
|
19
|
+
warning?: boolean;
|
|
17
20
|
required?: boolean;
|
|
18
21
|
isFloatingLabel?: boolean;
|
|
19
22
|
keepCloseIconOnValue?: boolean;
|
|
@@ -58,9 +61,12 @@ declare const meta: {
|
|
|
58
61
|
type?: React.HTMLInputTypeAttribute | undefined;
|
|
59
62
|
helperText?: string | undefined;
|
|
60
63
|
errorMessage?: string | undefined;
|
|
64
|
+
warningMessage?: string | undefined;
|
|
65
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
61
66
|
fullwidth?: boolean | undefined;
|
|
62
67
|
disabled?: boolean | undefined;
|
|
63
68
|
error?: boolean | undefined;
|
|
69
|
+
warning?: boolean | undefined;
|
|
64
70
|
required?: boolean | undefined;
|
|
65
71
|
isFloatingLabel?: boolean | undefined;
|
|
66
72
|
keepCloseIconOnValue?: boolean | undefined;
|
|
@@ -244,7 +244,9 @@ declare const meta: {
|
|
|
244
244
|
onTransitionEndCapture?: React.TransitionEventHandler<HTMLInputElement> | undefined;
|
|
245
245
|
form?: string | undefined | undefined;
|
|
246
246
|
list?: string | undefined | undefined;
|
|
247
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
247
248
|
step?: number | string | undefined | undefined;
|
|
249
|
+
warning?: boolean | undefined;
|
|
248
250
|
error?: boolean | undefined;
|
|
249
251
|
size?: "sm" | "md" | "lg" | undefined;
|
|
250
252
|
disabled?: boolean | undefined;
|
|
@@ -319,6 +321,7 @@ declare const meta: {
|
|
|
319
321
|
iconMode?: "flat" | "solid" | undefined;
|
|
320
322
|
helperText?: string | undefined;
|
|
321
323
|
errorMessage?: string | undefined;
|
|
324
|
+
warningMessage?: string | undefined;
|
|
322
325
|
keepCloseIconOnValue?: boolean | undefined;
|
|
323
326
|
keepFooterSpace?: boolean | undefined;
|
|
324
327
|
labelClassName?: string | undefined;
|
|
@@ -279,7 +279,9 @@ declare const meta: {
|
|
|
279
279
|
onTransitionEndCapture?: React.TransitionEventHandler<HTMLInputElement> | undefined;
|
|
280
280
|
form?: string | undefined | undefined;
|
|
281
281
|
list?: string | undefined | undefined;
|
|
282
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
282
283
|
step?: number | string | undefined | undefined;
|
|
284
|
+
warning?: boolean | undefined;
|
|
283
285
|
title?: string | undefined | undefined;
|
|
284
286
|
startIcon?: React.ReactNode;
|
|
285
287
|
endIcon?: React.ReactNode;
|
|
@@ -344,6 +346,7 @@ declare const meta: {
|
|
|
344
346
|
readOnly?: boolean | undefined | undefined;
|
|
345
347
|
src?: string | undefined | undefined;
|
|
346
348
|
iconMode?: "flat" | "solid" | undefined;
|
|
349
|
+
warningMessage?: string | undefined;
|
|
347
350
|
keepCloseIconOnValue?: boolean | undefined;
|
|
348
351
|
keepFooterSpace?: boolean | undefined;
|
|
349
352
|
labelClassName?: string | undefined;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as SwitchPrimitives from "@radix-ui/react-switch";
|
|
3
|
-
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitives.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> &
|
|
3
|
+
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitives.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
|
|
4
|
+
forceHover?: boolean;
|
|
5
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
4
6
|
export { Switch };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
declare const meta: {
|
|
3
3
|
title: string;
|
|
4
|
-
component: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-switch").SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> &
|
|
4
|
+
component: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-switch").SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
|
|
5
|
+
forceHover?: boolean;
|
|
6
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
5
7
|
tags: string[];
|
|
6
8
|
parameters: {
|
|
7
9
|
layout: string;
|
|
@@ -288,14 +290,20 @@ declare const meta: {
|
|
|
288
290
|
required?: boolean | undefined;
|
|
289
291
|
asChild?: boolean | undefined;
|
|
290
292
|
onCheckedChange?: ((checked: boolean) => void) | undefined;
|
|
293
|
+
forceHover?: boolean | undefined;
|
|
291
294
|
ref?: React.LegacyRef<HTMLButtonElement> | undefined;
|
|
292
295
|
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
293
296
|
};
|
|
294
297
|
export default meta;
|
|
295
298
|
export declare const Default: {
|
|
296
299
|
args: {
|
|
297
|
-
checked:
|
|
298
|
-
disabled:
|
|
300
|
+
checked: false;
|
|
301
|
+
disabled: false;
|
|
299
302
|
};
|
|
300
|
-
render: (args:
|
|
303
|
+
render: (args: Omit<import("@radix-ui/react-switch").SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
|
|
304
|
+
forceHover?: boolean;
|
|
305
|
+
} & React.RefAttributes<HTMLButtonElement>) => import("react/jsx-runtime").JSX.Element;
|
|
306
|
+
};
|
|
307
|
+
export declare const FigmaPreview: {
|
|
308
|
+
render: () => import("react/jsx-runtime").JSX.Element;
|
|
301
309
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const switchRootVariants: (props?: ({
|
|
2
|
+
forceHover?: boolean | null | undefined;
|
|
3
|
+
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
4
|
+
export declare const switchThumbVariants: (props?: ({
|
|
5
|
+
forceHover?: boolean | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
7
|
+
export declare const switchThumbHaloVariants: (props?: import("class-variance-authority/dist/types").ClassProp | undefined) => string;
|
|
@@ -9,9 +9,12 @@ export type InputProps = {
|
|
|
9
9
|
type?: React.HTMLInputTypeAttribute;
|
|
10
10
|
helperText?: string;
|
|
11
11
|
errorMessage?: string;
|
|
12
|
+
warningMessage?: string;
|
|
13
|
+
status?: "default" | "warning" | "error";
|
|
12
14
|
fullwidth?: boolean;
|
|
13
15
|
disabled?: boolean;
|
|
14
16
|
error?: boolean;
|
|
17
|
+
warning?: boolean;
|
|
15
18
|
required?: boolean;
|
|
16
19
|
isFloatingLabel?: boolean;
|
|
17
20
|
keepCloseIconOnValue?: boolean;
|
|
@@ -44,9 +47,12 @@ export declare const TextInput: React.ForwardRefExoticComponent<{
|
|
|
44
47
|
type?: React.HTMLInputTypeAttribute;
|
|
45
48
|
helperText?: string;
|
|
46
49
|
errorMessage?: string;
|
|
50
|
+
warningMessage?: string;
|
|
51
|
+
status?: "default" | "warning" | "error";
|
|
47
52
|
fullwidth?: boolean;
|
|
48
53
|
disabled?: boolean;
|
|
49
54
|
error?: boolean;
|
|
55
|
+
warning?: boolean;
|
|
50
56
|
required?: boolean;
|
|
51
57
|
isFloatingLabel?: boolean;
|
|
52
58
|
keepCloseIconOnValue?: boolean;
|
|
@@ -11,9 +11,12 @@ declare const meta: {
|
|
|
11
11
|
type?: React.HTMLInputTypeAttribute;
|
|
12
12
|
helperText?: string;
|
|
13
13
|
errorMessage?: string;
|
|
14
|
+
warningMessage?: string;
|
|
15
|
+
status?: "default" | "warning" | "error";
|
|
14
16
|
fullwidth?: boolean;
|
|
15
17
|
disabled?: boolean;
|
|
16
18
|
error?: boolean;
|
|
19
|
+
warning?: boolean;
|
|
17
20
|
required?: boolean;
|
|
18
21
|
isFloatingLabel?: boolean;
|
|
19
22
|
keepCloseIconOnValue?: boolean;
|
|
@@ -50,9 +53,12 @@ declare const meta: {
|
|
|
50
53
|
type?: React.HTMLInputTypeAttribute | undefined;
|
|
51
54
|
helperText?: string | undefined;
|
|
52
55
|
errorMessage?: string | undefined;
|
|
56
|
+
warningMessage?: string | undefined;
|
|
57
|
+
status?: "default" | "warning" | "error" | undefined;
|
|
53
58
|
fullwidth?: boolean | undefined;
|
|
54
59
|
disabled?: boolean | undefined;
|
|
55
60
|
error?: boolean | undefined;
|
|
61
|
+
warning?: boolean | undefined;
|
|
56
62
|
required?: boolean | undefined;
|
|
57
63
|
isFloatingLabel?: boolean | undefined;
|
|
58
64
|
keepCloseIconOnValue?: boolean | undefined;
|
|
@@ -406,3 +412,6 @@ export declare const KeepFooterSpace: {
|
|
|
406
412
|
};
|
|
407
413
|
render: () => import("react/jsx-runtime").JSX.Element;
|
|
408
414
|
};
|
|
415
|
+
export declare const FeedbackApiCompatibility: {
|
|
416
|
+
render: () => import("react/jsx-runtime").JSX.Element;
|
|
417
|
+
};
|
|
@@ -5,6 +5,7 @@ export declare const inputVariant: (props?: ({
|
|
|
5
5
|
fullwidth?: boolean | null | undefined;
|
|
6
6
|
disabled?: boolean | null | undefined;
|
|
7
7
|
error?: boolean | null | undefined;
|
|
8
|
+
warning?: boolean | null | undefined;
|
|
8
9
|
hasClearIcon?: boolean | null | undefined;
|
|
9
10
|
hasSearchIcon?: boolean | null | undefined;
|
|
10
11
|
leftSectionIcon?: boolean | null | undefined;
|
|
@@ -22,6 +23,7 @@ export declare const helperTextVariant: (props?: ({
|
|
|
22
23
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
23
24
|
disabled?: boolean | null | undefined;
|
|
24
25
|
error?: boolean | null | undefined;
|
|
26
|
+
warning?: boolean | null | undefined;
|
|
25
27
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
26
28
|
export declare const inlineEndIconWrapperVariant: (props?: ({
|
|
27
29
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
@@ -36,6 +38,7 @@ export declare const segmentedIconWrapperVariant: (props?: ({
|
|
|
36
38
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
37
39
|
rounded?: "none" | "normal" | "full" | null | undefined;
|
|
38
40
|
error?: boolean | null | undefined;
|
|
41
|
+
warning?: boolean | null | undefined;
|
|
39
42
|
position?: "end" | "start" | null | undefined;
|
|
40
43
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
41
44
|
export declare const iconWrapperVariant: (props?: ({
|
|
@@ -51,5 +54,6 @@ export declare const sectionIconWrapperVariant: (props?: ({
|
|
|
51
54
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
52
55
|
rounded?: "none" | "normal" | "full" | null | undefined;
|
|
53
56
|
error?: boolean | null | undefined;
|
|
57
|
+
warning?: boolean | null | undefined;
|
|
54
58
|
position?: "end" | "start" | null | undefined;
|
|
55
59
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
@@ -7,6 +7,7 @@ declare const ToastViewport: React.ForwardRefExoticComponent<Omit<ToastPrimitive
|
|
|
7
7
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLOListElement>>;
|
|
8
8
|
declare const Toast: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastProps & React.RefAttributes<HTMLLIElement>, "ref"> & VariantProps<(props?: ({
|
|
9
9
|
variant?: "default" | "success" | "info" | "warning" | "error" | null | undefined;
|
|
10
|
+
showBorder?: boolean | null | undefined;
|
|
10
11
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLLIElement>>;
|
|
11
12
|
declare const ToastAction: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
12
13
|
declare const ToastClose: React.ForwardRefExoticComponent<Omit<ToastPrimitives.ToastCloseProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -3,10 +3,18 @@ declare const meta: {
|
|
|
3
3
|
title: string;
|
|
4
4
|
component: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-toast").ToastProps & React.RefAttributes<HTMLLIElement>, "ref"> & import("class-variance-authority").VariantProps<(props?: ({
|
|
5
5
|
variant?: "default" | "success" | "info" | "warning" | "error" | null | undefined;
|
|
6
|
+
showBorder?: boolean | null | undefined;
|
|
6
7
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLLIElement>>;
|
|
7
8
|
tags: string[];
|
|
8
9
|
parameters: {
|
|
9
10
|
layout: string;
|
|
11
|
+
backgrounds: {
|
|
12
|
+
default: string;
|
|
13
|
+
values: {
|
|
14
|
+
name: string;
|
|
15
|
+
value: string;
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
10
18
|
};
|
|
11
19
|
decorators: ((Story: import("@storybook/csf").PartialStoryFn<import("@storybook/react").ReactRenderer, {
|
|
12
20
|
suppressHydrationWarning?: boolean | undefined | undefined;
|
|
@@ -323,6 +331,7 @@ declare const meta: {
|
|
|
323
331
|
};
|
|
324
332
|
}>, "currentTarget">) => void) | undefined;
|
|
325
333
|
variant?: "default" | "success" | "info" | "warning" | "error" | null | undefined;
|
|
334
|
+
showBorder?: boolean | null | undefined;
|
|
326
335
|
ref?: React.LegacyRef<HTMLLIElement> | undefined;
|
|
327
336
|
}>) => import("react/jsx-runtime").JSX.Element)[];
|
|
328
337
|
};
|
|
@@ -341,15 +350,20 @@ export declare const Simple: {
|
|
|
341
350
|
control: "select";
|
|
342
351
|
options: string[];
|
|
343
352
|
};
|
|
353
|
+
showBorder: {
|
|
354
|
+
control: "boolean";
|
|
355
|
+
};
|
|
344
356
|
};
|
|
345
357
|
args: {
|
|
346
358
|
variant: "default";
|
|
347
359
|
contentMode: "horizontal";
|
|
348
360
|
position: "top-center";
|
|
361
|
+
showBorder: false;
|
|
349
362
|
};
|
|
350
363
|
render: (args: {
|
|
351
364
|
variant: "default" | "success" | "info" | "warning" | "error" | null | undefined;
|
|
352
365
|
contentMode: "horizontal" | "vertical";
|
|
366
|
+
showBorder: boolean;
|
|
353
367
|
position?: "top-center" | "top-left" | "top-right" | "bottom-center" | "bottom-left" | "bottom-right" | undefined;
|
|
354
368
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
355
369
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const toastVariants: (props?: ({
|
|
2
2
|
variant?: "default" | "success" | "info" | "warning" | "error" | null | undefined;
|
|
3
|
+
showBorder?: boolean | null | undefined;
|
|
3
4
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
4
5
|
export declare const toastViewportVariants: (props?: ({
|
|
5
6
|
position?: "top-center" | "top-left" | "top-right" | "bottom-center" | "bottom-left" | "bottom-right" | null | undefined;
|
|
@@ -28,8 +28,8 @@ export const PasswordInput = forwardRef((_a, ref) => {
|
|
|
28
28
|
onClickEndIcon === null || onClickEndIcon === void 0 ? void 0 : onClickEndIcon();
|
|
29
29
|
};
|
|
30
30
|
const toggleIcon = visible
|
|
31
|
-
? showIcon !== null && showIcon !== void 0 ? showIcon : _jsx(Icon, { name: "eye", type: "lucide", size: "inherit", className: "size-full
|
|
32
|
-
: hideIcon !== null && hideIcon !== void 0 ? hideIcon : _jsx(Icon, { name: "eye-closed", type: "lucide", size: "inherit", className: "size-full
|
|
31
|
+
? showIcon !== null && showIcon !== void 0 ? showIcon : _jsx(Icon, { name: "eye", type: "lucide", size: "inherit", className: "size-full", "aria-label": "Hide password" })
|
|
32
|
+
: hideIcon !== null && hideIcon !== void 0 ? hideIcon : _jsx(Icon, { name: "eye-closed", type: "lucide", size: "inherit", className: "size-full", "aria-label": "Show password" });
|
|
33
33
|
return (_jsx(TextInput, Object.assign({ iconMode: "flat" }, props, { ref: inputRef, type: visible ? "text" : "password", hasClearIcon: hasClearIcon, endIcon: showToggle ? toggleIcon : endIcon, renderEndIcon: renderEndIcon, onClickEndIcon: showToggle ? handleToggleVisibility : onClickEndIcon, autoComplete: (_b = props.autoComplete) !== null && _b !== void 0 ? _b : "current-password" })));
|
|
34
34
|
});
|
|
35
35
|
PasswordInput.displayName = "PasswordInput";
|
|
@@ -8,7 +8,7 @@ const meta = {
|
|
|
8
8
|
layout: "fullscreen",
|
|
9
9
|
},
|
|
10
10
|
decorators: [
|
|
11
|
-
(Story) => (_jsx("div", { className: "p-5 flex w-full bg-
|
|
11
|
+
(Story) => (_jsx("div", { className: "p-5 flex w-full bg-base-bg2", children: _jsx(Story, {}) })),
|
|
12
12
|
],
|
|
13
13
|
};
|
|
14
14
|
export default meta;
|
|
@@ -10,27 +10,14 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
}
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
14
|
import * as React from "react";
|
|
15
15
|
import * as SwitchPrimitives from "@radix-ui/react-switch";
|
|
16
16
|
import { cn } from "@/utils/cn";
|
|
17
|
-
|
|
18
|
-
const switchStateClasses = {
|
|
19
|
-
unchecked: "data-[state=unchecked]:bg-[var(--switch-default-color)] hover:data-[state=unchecked]:bg-[var(--switch-hover-color)]",
|
|
20
|
-
checked: "data-[state=checked]:bg-[var(--switch-active-color)] hover:data-[state=checked]:bg-[var(--switch-active-hover-color)]",
|
|
21
|
-
disabled: "data-[disabled]:cursor-not-allowed data-[disabled]:!bg-[var(--switch-disabled-color)] data-[disabled]:pointer-events-none",
|
|
22
|
-
};
|
|
23
|
-
const thumbBaseClasses = "block size-4 rounded-full shadow-lg transition-transform";
|
|
24
|
-
const thumbStateClasses = {
|
|
25
|
-
unchecked: "data-[state=unchecked]:bg-[var(--switch-thumb-default-color)] data-[state=unchecked]:-translate-x-[2px]",
|
|
26
|
-
checked: "data-[state=checked]:bg-[var(--switch-thumb-active-color)] data-[state=checked]:translate-x-4",
|
|
27
|
-
hover: "group-hover:ring group-hover:data-[state=checked]:ring-[var(--switch-thumb-active-hover-ring)] group-hover:data-[state=unchecked]:ring-[var(--switch-thumb-hover-ring)]",
|
|
28
|
-
hoverColor: "group-hover:data-[state=checked]:bg-[var(--switch-thumb-active-hover-color)] group-hover:data-[state=unchecked]:bg-[var(--switch-thumb-hover-color)]",
|
|
29
|
-
disabled: "group-disabled:!bg-[--switch-thumb-disabled-color]",
|
|
30
|
-
};
|
|
17
|
+
import { switchRootVariants, switchThumbHaloVariants, switchThumbVariants, } from "./Switch.styles";
|
|
31
18
|
const Switch = React.forwardRef((_a, ref) => {
|
|
32
|
-
var { className } = _a, props = __rest(_a, ["className"]);
|
|
33
|
-
return (_jsx(SwitchPrimitives.Root, Object.assign({ className: cn(
|
|
19
|
+
var { className, forceHover = false } = _a, props = __rest(_a, ["className", "forceHover"]);
|
|
20
|
+
return (_jsx(SwitchPrimitives.Root, Object.assign({ className: cn(switchRootVariants({ forceHover }), className) }, props, { ref: ref, children: _jsx(SwitchPrimitives.Thumb, { className: switchThumbVariants({ forceHover }), children: _jsx("span", { "aria-hidden": true, className: switchThumbHaloVariants(), children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "40", height: "40", viewBox: "0 0 40 40", fill: "none", children: [_jsx("g", { filter: "url(#switch-hover-halo-shadow)", children: _jsx("circle", { cx: "20", cy: "18", r: "12", fill: "currentColor", shapeRendering: "crispEdges" }) }), _jsx("defs", { children: _jsxs("filter", { id: "switch-hover-halo-shadow", x: "0", y: "0", width: "40", height: "40", filterUnits: "userSpaceOnUse", colorInterpolationFilters: "sRGB", children: [_jsx("feFlood", { floodOpacity: "0", result: "BackgroundImageFix" }), _jsx("feColorMatrix", { in: "SourceAlpha", type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0", result: "hardAlpha" }), _jsx("feOffset", { dy: "2" }), _jsx("feGaussianBlur", { stdDeviation: "4" }), _jsx("feComposite", { in2: "hardAlpha", operator: "out" }), _jsx("feColorMatrix", { type: "matrix", values: "0 0 0 0 0.568627 0 0 0 0 0.619608 0 0 0 0 0.670588 0 0 0 0.24 0" }), _jsx("feBlend", { mode: "normal", in2: "BackgroundImageFix", result: "effect1_dropShadow" }), _jsx("feBlend", { mode: "normal", in: "SourceGraphic", in2: "effect1_dropShadow", result: "shape" })] }) })] }) }) }) })));
|
|
34
21
|
});
|
|
35
22
|
Switch.displayName = SwitchPrimitives.Root.displayName;
|
|
36
23
|
export { Switch };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Switch } from "./Switch";
|
|
3
3
|
// More on how to set up stories at: https://storybook.js.org/docs/7.0/react/writing-stories/introduction
|
|
4
4
|
const meta = {
|
|
@@ -20,8 +20,18 @@ export const Default = {
|
|
|
20
20
|
disabled: false,
|
|
21
21
|
},
|
|
22
22
|
render: (args) => {
|
|
23
|
-
console.log("args ", args);
|
|
24
23
|
const props = Object.assign({}, args);
|
|
25
24
|
return (_jsx("div", { className: "flex flex-row gap-4 w-full", children: _jsx(Switch, Object.assign({}, props)) }));
|
|
26
25
|
},
|
|
27
26
|
};
|
|
27
|
+
const switchPreviewRows = [
|
|
28
|
+
{ label: "On - Default", checked: true },
|
|
29
|
+
{ label: "On - Hover", checked: true, forceHover: true },
|
|
30
|
+
{ label: "On - Disable", checked: true, disabled: true },
|
|
31
|
+
{ label: "Off - Default", checked: false },
|
|
32
|
+
{ label: "Off - Hover", checked: false, forceHover: true },
|
|
33
|
+
{ label: "Off - Disable", checked: false, disabled: true },
|
|
34
|
+
];
|
|
35
|
+
export const FigmaPreview = {
|
|
36
|
+
render: () => (_jsx("div", { className: "bg-base-bg2 p-8 min-h-screen", children: _jsx("div", { className: "mx-auto flex w-full max-w-[300px] flex-col gap-4 rounded-lg border border-base-bg-stroke1 bg-base-bg1 p-6", children: switchPreviewRows.map((row) => (_jsxs("div", { className: "grid grid-cols-[1fr_40px] items-center gap-6", children: [_jsx("span", { className: "text-sm font-medium text-text-white", children: row.label }), _jsx(Switch, { checked: row.checked, disabled: row.disabled, forceHover: row.forceHover })] }, row.label))) }) })),
|
|
37
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
export const switchRootVariants = cva([
|
|
3
|
+
"group relative inline-flex h-6 w-10 shrink-0 cursor-pointer items-center overflow-visible px-1",
|
|
4
|
+
"before:pointer-events-none before:absolute before:left-1 before:top-1/2 before:h-3 before:w-8 before:-translate-y-1/2 before:rounded-full before:transition-colors",
|
|
5
|
+
"data-[state=unchecked]:before:bg-[var(--switch-default-color)] hover:data-[state=unchecked]:before:bg-[var(--switch-hover-color)]",
|
|
6
|
+
"data-[state=checked]:before:bg-[var(--switch-active-color)] hover:data-[state=checked]:before:bg-[var(--switch-active-hover-color)]",
|
|
7
|
+
"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none data-[disabled]:before:!bg-[var(--switch-disabled-color)]",
|
|
8
|
+
], {
|
|
9
|
+
variants: {
|
|
10
|
+
forceHover: {
|
|
11
|
+
true: "data-[state=unchecked]:before:bg-[var(--switch-hover-color)] data-[state=checked]:before:bg-[var(--switch-active-hover-color)]",
|
|
12
|
+
false: "",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: {
|
|
16
|
+
forceHover: false,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
export const switchThumbVariants = cva([
|
|
20
|
+
"relative isolate block size-4 rounded-full [filter:var(--switch-thumb-filter)] transition-[transform,background-color,color,filter]",
|
|
21
|
+
"data-[state=unchecked]:bg-[var(--switch-thumb-default-color)] data-[state=unchecked]:translate-x-0",
|
|
22
|
+
"data-[state=checked]:bg-[var(--switch-thumb-active-color)] data-[state=checked]:translate-x-4",
|
|
23
|
+
"data-[state=unchecked]:text-[var(--state-color-tertiary-hover-bg)] data-[state=checked]:text-[var(--state-color-primary-hover-bg)]",
|
|
24
|
+
"group-hover:[&_.switch-thumb-halo]:opacity-100 group-hover:data-[state=checked]:bg-[var(--switch-thumb-active-hover-color)] group-hover:data-[state=unchecked]:bg-[var(--switch-thumb-hover-color)]",
|
|
25
|
+
"group-disabled:!bg-[var(--switch-thumb-disabled-color)] group-disabled:[&_.switch-thumb-halo]:opacity-0",
|
|
26
|
+
], {
|
|
27
|
+
variants: {
|
|
28
|
+
forceHover: {
|
|
29
|
+
true: "[&_.switch-thumb-halo]:opacity-100 data-[state=unchecked]:bg-[var(--switch-thumb-hover-color)] data-[state=checked]:bg-[var(--switch-thumb-active-hover-color)]",
|
|
30
|
+
false: "",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
defaultVariants: {
|
|
34
|
+
forceHover: false,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
export const switchThumbHaloVariants = cva([
|
|
38
|
+
"switch-thumb-halo pointer-events-none absolute left-0 top-0.5 -z-10 block size-6 -translate-x-1/2 -translate-y-1/2 opacity-0 transition-opacity",
|
|
39
|
+
]);
|
|
@@ -15,18 +15,32 @@ import { helperTextVariant, iconActionVariant, inlineEndIconWrapperVariant, inli
|
|
|
15
15
|
import { CircleAlert, CircleX, Search, } from "lucide-react";
|
|
16
16
|
import { cn } from "@/utils/cn";
|
|
17
17
|
export const TextInput = forwardRef((_a, ref) => {
|
|
18
|
-
var { id, label, size = "md", rounded = "normal", variant = "outline", type = "text", iconMode = "solid", helperText, errorMessage, fullwidth = true, disabled = false, error = false, required = true, isFloatingLabel = true, keepCloseIconOnValue = false, keepFooterSpace = true, hasClearIcon = true, hasSearchIcon = false, startIcon, endIcon, labelClassName, onClickStartIcon, onClickEndIcon, renderStartIcon, renderEndIcon, classes } = _a, props = __rest(_a, ["id", "label", "size", "rounded", "variant", "type", "iconMode", "helperText", "errorMessage", "fullwidth", "disabled", "error", "required", "isFloatingLabel", "keepCloseIconOnValue", "keepFooterSpace", "hasClearIcon", "hasSearchIcon", "startIcon", "endIcon", "labelClassName", "onClickStartIcon", "onClickEndIcon", "renderStartIcon", "renderEndIcon", "classes"]);
|
|
18
|
+
var { id, label, size = "md", rounded = "normal", variant = "outline", type = "text", iconMode = "solid", helperText, errorMessage, warningMessage, status, fullwidth = true, disabled = false, error = false, warning = false, required = true, isFloatingLabel = true, keepCloseIconOnValue = false, keepFooterSpace = true, hasClearIcon = true, hasSearchIcon = false, startIcon, endIcon, labelClassName, onClickStartIcon, onClickEndIcon, renderStartIcon, renderEndIcon, classes } = _a, props = __rest(_a, ["id", "label", "size", "rounded", "variant", "type", "iconMode", "helperText", "errorMessage", "warningMessage", "status", "fullwidth", "disabled", "error", "warning", "required", "isFloatingLabel", "keepCloseIconOnValue", "keepFooterSpace", "hasClearIcon", "hasSearchIcon", "startIcon", "endIcon", "labelClassName", "onClickStartIcon", "onClickEndIcon", "renderStartIcon", "renderEndIcon", "classes"]);
|
|
19
19
|
const inputRef = useRef(null);
|
|
20
20
|
const _id = id || `${type}-${label}-input`;
|
|
21
21
|
const hasLeftSectionIcon = !!startIcon || !!renderStartIcon;
|
|
22
22
|
const hasRightSectionIcon = !!endIcon || !!renderEndIcon;
|
|
23
|
+
const feedbackStatus = status ||
|
|
24
|
+
(error || !!errorMessage
|
|
25
|
+
? "error"
|
|
26
|
+
: warning || !!warningMessage
|
|
27
|
+
? "warning"
|
|
28
|
+
: "default");
|
|
29
|
+
const isError = feedbackStatus === "error";
|
|
30
|
+
const isWarning = feedbackStatus === "warning";
|
|
31
|
+
const feedbackMessage = feedbackStatus === "error"
|
|
32
|
+
? errorMessage
|
|
33
|
+
: feedbackStatus === "warning"
|
|
34
|
+
? warningMessage
|
|
35
|
+
: helperText;
|
|
23
36
|
const inputClassname = inputVariant({
|
|
24
37
|
size,
|
|
25
38
|
rounded,
|
|
26
39
|
variant,
|
|
27
40
|
fullwidth,
|
|
28
41
|
disabled,
|
|
29
|
-
error,
|
|
42
|
+
error: isError,
|
|
43
|
+
warning: isWarning,
|
|
30
44
|
hasSearchIcon: (iconMode === "flat" && hasLeftSectionIcon) || hasSearchIcon,
|
|
31
45
|
hasClearIcon: (iconMode === "flat" && hasRightSectionIcon) || hasClearIcon,
|
|
32
46
|
leftSectionIcon: iconMode === "solid" ? hasLeftSectionIcon : false,
|
|
@@ -35,14 +49,15 @@ export const TextInput = forwardRef((_a, ref) => {
|
|
|
35
49
|
const labelClassname = labelVariant({
|
|
36
50
|
size,
|
|
37
51
|
disabled,
|
|
38
|
-
error,
|
|
52
|
+
error: isError,
|
|
39
53
|
hasSearchIcon: (iconMode === "flat" && hasLeftSectionIcon) || hasSearchIcon,
|
|
40
54
|
hasLeftSectionIcon: iconMode === "solid" ? hasLeftSectionIcon : false,
|
|
41
55
|
isFloatingLabel,
|
|
42
56
|
});
|
|
43
57
|
const helperTextClassname = helperTextVariant({
|
|
44
58
|
size,
|
|
45
|
-
error,
|
|
59
|
+
error: isError,
|
|
60
|
+
warning: isWarning,
|
|
46
61
|
disabled,
|
|
47
62
|
});
|
|
48
63
|
const inlineEndIconWrapperClassname = inlineEndIconWrapperVariant({ size });
|
|
@@ -54,13 +69,15 @@ export const TextInput = forwardRef((_a, ref) => {
|
|
|
54
69
|
const startSegmentIconWrapperClassname = segmentedIconWrapperVariant({
|
|
55
70
|
size,
|
|
56
71
|
rounded,
|
|
57
|
-
error,
|
|
72
|
+
error: isError,
|
|
73
|
+
warning: isWarning,
|
|
58
74
|
position: "start",
|
|
59
75
|
});
|
|
60
76
|
const endSegmentIconWrapperClassname = segmentedIconWrapperVariant({
|
|
61
77
|
size,
|
|
62
78
|
rounded,
|
|
63
|
-
error,
|
|
79
|
+
error: isError,
|
|
80
|
+
warning: isWarning,
|
|
64
81
|
position: "end",
|
|
65
82
|
});
|
|
66
83
|
useImperativeHandle(ref, () => inputRef === null || inputRef === void 0 ? void 0 : inputRef.current);
|
|
@@ -136,6 +153,10 @@ export const TextInput = forwardRef((_a, ref) => {
|
|
|
136
153
|
// "fill-none stroke-input-default-text hover:stroke-input-filled-text active:stroke-input-filled-text",
|
|
137
154
|
classes === null || classes === void 0 ? void 0 : classes.icon), onMouseDown: handleClearInput }) })), endIconElement, _jsxs("label", { htmlFor: _id, className: cn(labelClassname), children: [label, " ", required && (_jsx("span", { className: cn("text-input-error", {
|
|
138
155
|
"text-input-disable-text": disabled,
|
|
139
|
-
}), children: "*" }))] })] }), (
|
|
156
|
+
}), children: "*" }))] })] }), (feedbackMessage || keepFooterSpace) && (_jsxs("span", { className: helperTextClassname, children: [feedbackMessage && (_jsx("span", { className: "h-full shrink-0", children: _jsx(CircleAlert, { width: 14, height: 14, className: cn("fill-none stroke-current", isError
|
|
157
|
+
? "text-input-error"
|
|
158
|
+
: isWarning
|
|
159
|
+
? "text-warning"
|
|
160
|
+
: "text-input-filled-text") }) })), keepFooterSpace && !feedbackMessage && (_jsx("span", { className: "block min-h-[14px]", "aria-hidden": true })), feedbackMessage || ""] }))] }));
|
|
140
161
|
});
|
|
141
162
|
export default TextInput;
|
|
@@ -88,3 +88,16 @@ export const KeepFooterSpace = {
|
|
|
88
88
|
},
|
|
89
89
|
render: () => _jsx(KeepFooterSpaceDemo, {}),
|
|
90
90
|
};
|
|
91
|
+
const FeedbackApiDemo = () => {
|
|
92
|
+
const [legacyError, setLegacyError] = useState(false);
|
|
93
|
+
const [legacyWarning, setLegacyWarning] = useState(false);
|
|
94
|
+
const [useStatusOverride, setUseStatusOverride] = useState(false);
|
|
95
|
+
return (_jsxs("div", { className: "flex flex-col gap-6 w-full max-w-2xl", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm text-text-grey-dark", children: [_jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: legacyError, onChange: (e) => setLegacyError(e.target.checked) }), "legacy error"] }), _jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: legacyWarning, onChange: (e) => setLegacyWarning(e.target.checked) }), "legacy warning"] }), _jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: useStatusOverride, onChange: (e) => setUseStatusOverride(e.target.checked) }), "status override = warning"] })] }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h4", { className: "text-sm font-medium text-text-grey-dark", children: "Legacy API (error / warning)" }), _jsx(TextInput, { id: "legacy-feedback", label: "Email", helperText: "We will never share your email.", keepFooterSpace: true, error: legacyError, errorMessage: legacyError ? "Invalid email format." : undefined, warning: legacyWarning, warningMessage: legacyWarning ? "Please verify this email." : undefined })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h4", { className: "text-sm font-medium text-text-grey-dark", children: "New API (status + message)" }), _jsx(TextInput, { id: "status-feedback", label: "Email", helperText: "We will never share your email.", keepFooterSpace: true, status: useStatusOverride ? "warning" : "default", error: legacyError, errorMessage: legacyError ? "Invalid email format." : undefined, warning: legacyWarning, warningMessage: useStatusOverride
|
|
96
|
+
? "Status explicitly sets warning."
|
|
97
|
+
: legacyWarning
|
|
98
|
+
? "Please verify this email."
|
|
99
|
+
: undefined })] })] })] }));
|
|
100
|
+
};
|
|
101
|
+
export const FeedbackApiCompatibility = {
|
|
102
|
+
render: () => _jsx(FeedbackApiDemo, {}),
|
|
103
|
+
};
|