@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.
Files changed (66) hide show
  1. package/dist/cjs/bundle.css +158 -42
  2. package/dist/cjs/bundle.js +4 -4
  3. package/dist/cjs/bundle.js.map +1 -1
  4. package/dist/cjs/types/components/Dropdown/Dropdown.stories.d.ts +3 -0
  5. package/dist/cjs/types/components/InputFilter/InputFilter.stories.d.ts +3 -0
  6. package/dist/cjs/types/components/MaskedTextInput/MaskedTextInput.d.ts +3 -0
  7. package/dist/cjs/types/components/MaskedTextInput/MaskedTextInput.stories.d.ts +6 -0
  8. package/dist/cjs/types/components/PasswordInput/PasswordInput.stories.d.ts +3 -0
  9. package/dist/cjs/types/components/Search/Search.stories.d.ts +3 -0
  10. package/dist/cjs/types/components/Switch/Switch.d.ts +3 -1
  11. package/dist/cjs/types/components/Switch/Switch.stories.d.ts +12 -4
  12. package/dist/cjs/types/components/Switch/Switch.styles.d.ts +7 -0
  13. package/dist/cjs/types/components/TextInput/TextInput.d.ts +6 -0
  14. package/dist/cjs/types/components/TextInput/TextInput.stories.d.ts +9 -0
  15. package/dist/cjs/types/components/TextInput/TextInput.styles.d.ts +4 -0
  16. package/dist/cjs/types/components/Toast/Toast.d.ts +1 -0
  17. package/dist/cjs/types/components/Toast/Toast.stories.d.ts +14 -0
  18. package/dist/cjs/types/components/Toast/Toast.styles.d.ts +1 -0
  19. package/dist/components/PasswordInput/PasswordInput.js +2 -2
  20. package/dist/components/PasswordInput/PasswordInput.stories.js +1 -1
  21. package/dist/components/Switch/Switch.js +4 -17
  22. package/dist/components/Switch/Switch.stories.js +12 -2
  23. package/dist/components/Switch/Switch.styles.js +39 -0
  24. package/dist/components/TextInput/TextInput.js +28 -7
  25. package/dist/components/TextInput/TextInput.stories.js +13 -0
  26. package/dist/components/TextInput/TextInput.styles.js +26 -4
  27. package/dist/components/Toast/Toast.js +5 -5
  28. package/dist/components/Toast/Toast.stories.js +11 -2
  29. package/dist/components/Toast/Toast.styles.js +38 -6
  30. package/dist/components/Toast/Toaster.js +17 -1
  31. package/dist/esm/bundle.css +158 -42
  32. package/dist/esm/bundle.js +4 -4
  33. package/dist/esm/bundle.js.map +1 -1
  34. package/dist/esm/types/components/Dropdown/Dropdown.stories.d.ts +3 -0
  35. package/dist/esm/types/components/InputFilter/InputFilter.stories.d.ts +3 -0
  36. package/dist/esm/types/components/MaskedTextInput/MaskedTextInput.d.ts +3 -0
  37. package/dist/esm/types/components/MaskedTextInput/MaskedTextInput.stories.d.ts +6 -0
  38. package/dist/esm/types/components/PasswordInput/PasswordInput.stories.d.ts +3 -0
  39. package/dist/esm/types/components/Search/Search.stories.d.ts +3 -0
  40. package/dist/esm/types/components/Switch/Switch.d.ts +3 -1
  41. package/dist/esm/types/components/Switch/Switch.stories.d.ts +12 -4
  42. package/dist/esm/types/components/Switch/Switch.styles.d.ts +7 -0
  43. package/dist/esm/types/components/TextInput/TextInput.d.ts +6 -0
  44. package/dist/esm/types/components/TextInput/TextInput.stories.d.ts +9 -0
  45. package/dist/esm/types/components/TextInput/TextInput.styles.d.ts +4 -0
  46. package/dist/esm/types/components/Toast/Toast.d.ts +1 -0
  47. package/dist/esm/types/components/Toast/Toast.stories.d.ts +14 -0
  48. package/dist/esm/types/components/Toast/Toast.styles.d.ts +1 -0
  49. package/dist/index.d.ts +13 -1
  50. package/dist/src/theme/global.css +208 -89
  51. package/package.json +1 -1
  52. package/src/components/PasswordInput/PasswordInput.stories.tsx +1 -1
  53. package/src/components/PasswordInput/PasswordInput.tsx +2 -2
  54. package/src/components/Switch/Switch.stories.tsx +33 -2
  55. package/src/components/Switch/Switch.styles.ts +48 -0
  56. package/src/components/Switch/Switch.tsx +68 -45
  57. package/src/components/TextInput/TextInput.stories.tsx +82 -0
  58. package/src/components/TextInput/TextInput.styles.ts +36 -17
  59. package/src/components/TextInput/TextInput.tsx +40 -11
  60. package/src/components/Toast/Toast.stories.tsx +12 -2
  61. package/src/components/Toast/Toast.styles.tsx +38 -6
  62. package/src/components/Toast/Toast.tsx +7 -7
  63. package/src/components/Toast/Toaster.tsx +26 -4
  64. package/src/theme/themes/xspector/baseline.css +0 -1
  65. package/src/theme/tokens/components/switch.css +10 -11
  66. 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"> & React.RefAttributes<HTMLButtonElement>>;
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"> & React.RefAttributes<HTMLButtonElement>>;
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: boolean;
298
- disabled: boolean;
300
+ checked: false;
301
+ disabled: false;
299
302
  };
300
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
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 stroke-input-default-stroke hover:stroke-input-active-stroke", "aria-label": "Hide password" })
32
- : hideIcon !== null && hideIcon !== void 0 ? hideIcon : _jsx(Icon, { name: "eye-closed", type: "lucide", size: "inherit", className: "size-full stroke-input-default-stroke hover:stroke-input-active-stroke", "aria-label": "Show password" });
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-[rgb(var(--base-bg-2))]", children: _jsx(Story, {}) })),
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
- const switchBaseClasses = "group inline-flex h-3 w-[32px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors";
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(switchBaseClasses, switchStateClasses.unchecked, switchStateClasses.checked, switchStateClasses.disabled, className) }, props, { ref: ref, children: _jsx(SwitchPrimitives.Thumb, { className: cn(thumbBaseClasses, thumbStateClasses.unchecked, thumbStateClasses.checked, thumbStateClasses.hover, thumbStateClasses.hoverColor, thumbStateClasses.disabled) }) })));
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: "*" }))] })] }), (errorMessage || helperText || keepFooterSpace) && (_jsxs("span", { className: helperTextClassname, children: [(errorMessage || helperText) && (_jsx("span", { className: "h-full shrink-0", children: _jsx(CircleAlert, { width: 14, height: 14, className: cn("fill-none", error ? "stroke-input-error" : "stroke-input-filled-text") }) })), keepFooterSpace && !error && !helperText && (_jsx("span", { className: "block min-h-[14px]", "aria-hidden": true })), (error ? errorMessage : helperText) || ''] }))] }));
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
+ };