@agility/plenum-ui 2.0.0-rc9 → 2.0.1

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 (97) hide show
  1. package/README.md +104 -31
  2. package/build.js +30 -25
  3. package/dist/index.d.ts +103 -79
  4. package/dist/index.js +1 -6295
  5. package/dist/index.js.map +4 -4
  6. package/dist/{lib/tailwind.css → tailwind.css} +3754 -8120
  7. package/dist/types/stories/atoms/buttons/Button/Alternative/Alternative.stories.d.ts +1 -0
  8. package/dist/types/stories/atoms/buttons/Button/Button.d.ts +3 -7
  9. package/dist/types/stories/atoms/buttons/Button/Danger/Danger.stories.d.ts +1 -0
  10. package/dist/types/stories/atoms/buttons/Button/Primary/Primary.stories.d.ts +1 -0
  11. package/dist/types/stories/atoms/buttons/Button/Secondary/Secondary.stories.d.ts +1 -0
  12. package/dist/types/stories/atoms/buttons/Capsule/Capsule.d.ts +1 -1
  13. package/dist/types/stories/atoms/icons/DynamicIcon.d.ts +2 -2
  14. package/dist/types/stories/atoms/icons/TablerIcon.d.ts +1 -1
  15. package/dist/types/stories/index.d.ts +4 -4
  16. package/dist/types/stories/molecules/inputs/InputField/InputField.d.ts +7 -7
  17. package/dist/types/stories/molecules/inputs/TextInput/TextInput.d.ts +1 -1
  18. package/dist/types/stories/molecules/inputs/checkbox/Checkbox.d.ts +2 -0
  19. package/dist/types/stories/molecules/inputs/select/Select.d.ts +4 -2
  20. package/dist/types/stories/molecules/inputs/textArea/TextArea.d.ts +5 -1
  21. package/dist/types/stories/molecules/inputs/toggleSwitch/ToggleSwitch.d.ts +10 -7
  22. package/dist/types/stories/organisms/AnimatedLabelInput/AnimatedLabelInput.d.ts +5 -5
  23. package/dist/types/stories/organisms/AnimatedLabelInput/index.d.ts +1 -1
  24. package/dist/types/stories/organisms/AnimatedLabelTextArea/AnimatedLabelTextArea.d.ts +12 -0
  25. package/dist/types/stories/organisms/AnimatedLabelTextArea/index.d.ts +3 -0
  26. package/dist/types/stories/organisms/ButtonDropdown/ButtonDropdown.d.ts +1 -0
  27. package/dist/types/stories/organisms/DropdownComponent/DropdownComponent.d.ts +24 -13
  28. package/dist/types/stories/organisms/DropdownComponent/index.d.ts +2 -2
  29. package/dist/types/stories/organisms/EmptySectionPlaceholder/index.d.ts +1 -1
  30. package/dist/types/stories/organisms/index.d.ts +4 -3
  31. package/local.sh +100 -0
  32. package/package.json +35 -18
  33. package/rollup.config.mjs +42 -0
  34. package/stories/atoms/badges/Badge.tsx +1 -1
  35. package/stories/atoms/buttons/Button/Alternative/Alternative.stories.ts +10 -0
  36. package/stories/atoms/buttons/Button/Button.tsx +111 -25
  37. package/stories/atoms/buttons/Button/Danger/Danger.stories.ts +14 -2
  38. package/stories/atoms/buttons/Button/Primary/Primary.stories.ts +14 -2
  39. package/stories/atoms/buttons/Button/Secondary/Secondary.stories.ts +13 -1
  40. package/stories/atoms/buttons/Button/defaultArgs.ts +1 -1
  41. package/stories/atoms/buttons/Capsule/Capsule.tsx +2 -1
  42. package/stories/atoms/icons/DynamicIcon.stories.ts +1 -1
  43. package/stories/atoms/icons/DynamicIcon.tsx +7 -7
  44. package/stories/atoms/icons/IconWithShadow.stories.ts +3 -3
  45. package/stories/atoms/icons/TablerIcon.tsx +1 -1
  46. package/stories/atoms/loaders/Loader.tsx +12 -6
  47. package/stories/atoms/loaders/NProgress/RadialProgress.tsx +0 -2
  48. package/stories/index.ts +8 -4
  49. package/stories/molecules/inputs/InputCounter/InputCounter.tsx +2 -2
  50. package/stories/molecules/inputs/InputField/InputField.tsx +31 -29
  51. package/stories/molecules/inputs/InputLabel/InputLabel.tsx +6 -6
  52. package/stories/molecules/inputs/TextInput/TextInput.stories.tsx +31 -1
  53. package/stories/molecules/inputs/TextInput/TextInput.tsx +15 -7
  54. package/stories/molecules/inputs/checkbox/Checkbox.stories.ts +1 -1
  55. package/stories/molecules/inputs/checkbox/Checkbox.tsx +7 -4
  56. package/stories/molecules/inputs/combobox/ComboBox.tsx +126 -135
  57. package/stories/molecules/inputs/radio/Radio.stories.ts +2 -2
  58. package/stories/molecules/inputs/select/Select.stories.tsx +53 -0
  59. package/stories/molecules/inputs/select/Select.tsx +11 -3
  60. package/stories/molecules/inputs/textArea/{TextArea.stories.ts → TextArea.stories.tsx} +25 -2
  61. package/stories/molecules/inputs/textArea/TextArea.tsx +58 -28
  62. package/stories/molecules/inputs/toggleSwitch/ToggleSwitch.stories.tsx +15 -16
  63. package/stories/molecules/inputs/toggleSwitch/ToggleSwitch.tsx +63 -57
  64. package/stories/molecules/tabs/index.tsx +2 -3
  65. package/stories/organisms/AnimatedLabelInput/AnimatedLabelInput.stories.tsx +32 -2
  66. package/stories/organisms/AnimatedLabelInput/AnimatedLabelInput.tsx +66 -37
  67. package/stories/organisms/AnimatedLabelInput/index.tsx +1 -1
  68. package/stories/organisms/AnimatedLabelTextArea/AnimatedLabelTextArea.stories.tsx +26 -0
  69. package/stories/organisms/AnimatedLabelTextArea/AnimatedLabelTextArea.tsx +61 -0
  70. package/stories/organisms/AnimatedLabelTextArea/index.tsx +3 -0
  71. package/stories/organisms/ButtonDropdown/ButtonDropdown.stories.tsx +59 -59
  72. package/stories/organisms/ButtonDropdown/ButtonDropdown.tsx +42 -30
  73. package/stories/organisms/DropdownComponent/Dropdown.stories.tsx +26 -2
  74. package/stories/organisms/DropdownComponent/DropdownComponent.tsx +232 -180
  75. package/stories/organisms/DropdownComponent/dropdownItems.ts +30 -9
  76. package/stories/organisms/DropdownComponent/index.ts +2 -2
  77. package/stories/organisms/EmptySectionPlaceholder/EmptySectionPlaceholder.stories.tsx +3 -3
  78. package/stories/organisms/EmptySectionPlaceholder/index.tsx +2 -1
  79. package/stories/organisms/FormInputWithAddons/FormInputWithAddons.stories.tsx +1 -1
  80. package/stories/organisms/FormInputWithAddons/FormInputWithAddons.tsx +7 -2
  81. package/stories/organisms/index.ts +12 -3
  82. package/tailwind.config.js +139 -38
  83. package/tsconfig.lib.json +13 -6
  84. package/watch.js +49 -0
  85. package/.yarnrc.yml +0 -1
  86. package/dist/types/stories/layouts/index.d.ts +0 -0
  87. package/dist/types/stories/molecules/inputs/select/Select.stories.d.ts +0 -6
  88. package/dist/types/stories/molecules/inputs/textArea/TextArea.stories.d.ts +0 -6
  89. package/stories/layouts/CardLayout/CardLayout.stories.tsx +0 -18
  90. package/stories/layouts/CardLayout/CardLayout.tsx +0 -22
  91. package/stories/layouts/CardLayout/index.tsx +0 -3
  92. package/stories/layouts/ModalLayout/ModalLayout.stories.tsx +0 -18
  93. package/stories/layouts/ModalLayout/ModalLayout.tsx +0 -22
  94. package/stories/layouts/ModalLayout/index.tsx +0 -3
  95. package/stories/layouts/index.ts +0 -0
  96. package/stories/molecules/inputs/select/Select.stories.ts +0 -23
  97. package/stories/organisms/DropdownComponent/Dropdown.test.tsx +0 -0
@@ -13,7 +13,7 @@ export const DefaultToggleSwitch: Story = {
13
13
  args: {
14
14
  isChecked: false,
15
15
  onChange: (v: boolean) => {
16
- console.log(v, "v")
16
+
17
17
  },
18
18
  label: {
19
19
  text: "label me",
@@ -53,21 +53,20 @@ export const Checked: Story = {
53
53
  },
54
54
  }
55
55
  export const WithIcon: Story = {
56
- args: {
57
- ...DefaultToggleSwitch.args,
58
- label: {
59
- text: "label me three",
60
- className: "text-lg text-gray-400",
61
- xPosition: "left",
62
- },
63
- withIcon: {
64
- name: "IconCheck",
65
- type: "solid",
66
- },
67
- variant: "base",
68
- id: "toggle-switch-4",
69
- name: "toggle four",
70
- },
56
+ args: {
57
+ ...DefaultToggleSwitch.args,
58
+ label: {
59
+ text: "label me three",
60
+ className: "text-lg text-gray-400",
61
+ xPosition: "left"
62
+ },
63
+ withIcon: {
64
+ icon: "IconCheck"
65
+ },
66
+ variant: "base",
67
+ id: "toggle-switch-4",
68
+ name: "toggle four"
69
+ }
71
70
  }
72
71
  export const NoLabel: Story = {
73
72
  args: {
@@ -2,74 +2,80 @@ import React, { useEffect, useState } from "react"
2
2
  import { default as cn } from "classnames"
3
3
  import { Switch } from "@headlessui/react"
4
4
  import { DynamicIcon, IDynamicIconProps } from "@/stories/atoms"
5
+
6
+ interface ToggleSwitchLabel {
7
+ text: string | JSX.Element
8
+ className?: string
9
+ xPosition?: "left" | "right"
10
+ }
11
+
5
12
  export interface IToggleSwitchProps {
6
13
  isChecked: boolean
7
14
  onChange: (isChecked: boolean) => void
8
- label?: {
9
- text: string | JSX.Element
10
- className?: string
11
- xPosition?: "left" | "right"
12
- }
13
- screenReaderLabel: string
15
+ label?: ToggleSwitchLabel
16
+ screenReaderLabel?: string
14
17
  name: string
15
18
  id: string
16
- variant: "base" | "short"
19
+ variant?: "base" | "short"
17
20
  withIcon?: IDynamicIconProps
21
+ disabled?: boolean,
22
+ groupClassName?: string
18
23
  }
19
24
 
20
25
  const ToggleSwitch: React.FC<IToggleSwitchProps> = ({
21
- isChecked,
22
- onChange,
23
- label,
24
- screenReaderLabel,
25
- name,
26
- id,
27
- variant = "base",
28
- withIcon,
26
+ isChecked,
27
+ onChange,
28
+ label,
29
+ screenReaderLabel,
30
+ name,
31
+ id,
32
+ variant = "base",
33
+ withIcon,
34
+ disabled,
35
+ groupClassName,
29
36
  }) => {
30
- const [checked, setChecked] = useState<boolean>(isChecked)
31
- useEffect(() => setChecked(isChecked), [isChecked])
37
+ const [checked, setChecked] = useState<boolean>(isChecked)
38
+ useEffect(() => setChecked(isChecked), [isChecked])
32
39
 
33
- return (
34
- <Switch.Group as={"div"} className={"flex items-center gap-2"}>
35
- {label && label.xPosition === "left" && (
36
- <Switch.Label className={label.className}>{label.text}</Switch.Label>
37
- )}
38
- <Switch
39
- name={name}
40
- id={id}
41
- checked={checked}
42
- onChange={(v: boolean) => {
43
- onChange(v)
44
- setChecked(v)
45
- }}
46
- className={cn(
47
- { "w-9 h-4": variant === "short", " h-6 w-11": variant === "base" },
48
- checked ? "bg-purple-600" : "bg-gray-200",
49
- "relative inline-flex items-center rounded-full focus-visible:ring-2 focus-visible:ring-purple-600 focus-visible:ring-offset-2 focus-within:ring-2 focus-within:ring-purple-600 focus-within:ring-offset-2 focus:ring-2 focus:ring-purple-600 focus:ring-offset-2 active:ring-2 active:ring-purple-600 active:ring-offset-2"
50
- )}
51
- >
52
- <span className="sr-only">{screenReaderLabel}</span>
53
- <span
54
- className={cn(
55
- checked ? "translate-x-[22px]" : "translate-x-[2px]",
56
- {
57
- "border border-gray-200 translate-x-0": variant === "short",
58
- "!translate-x-[22px]": checked && variant === "short",
59
- },
60
- " h-5 w-5 transform rounded-full bg-white transition shadow-sm drop-shadow flex items-center justify-center"
61
- )}
62
- >
63
- {withIcon && (
64
- <DynamicIcon {...withIcon} className={"text-gray-400 m-[2px]"} />
65
- )}
66
- </span>
67
- </Switch>
68
- {label && label.xPosition === "right" && (
69
- <Switch.Label className={label.className}>{label.text}</Switch.Label>
70
- )}
71
- </Switch.Group>
72
- )
40
+ return (
41
+ <Switch.Group as={"div"} className={cn("flex items-center gap-2", groupClassName)}>
42
+ {label && (label.xPosition === "left" || !label?.xPosition) && (
43
+ <Switch.Label className={label.className}>{label.text}</Switch.Label>
44
+ )}
45
+ <Switch
46
+ name={name}
47
+ id={id}
48
+ checked={checked}
49
+ onChange={(v: boolean) => {
50
+ onChange(v)
51
+ setChecked(v)
52
+ }}
53
+ className={cn(
54
+ { "w-9 h-4 transition-all": variant === "short", " h-6 w-11": variant === "base" },
55
+ checked && disabled ? "bg-purple-200" : checked ? "bg-purple-600" : "bg-gray-200",
56
+ "relative inline-flex items-center rounded-full focus-visible:ring-2 focus-visible:ring-purple-600 focus-visible:ring-offset-2 focus-within:ring-2 focus-within:ring-purple-600 focus-within:ring-offset-2 focus:ring-2 focus:ring-purple-600 focus:ring-offset-2 active:ring-2 active:ring-purple-600 active:ring-offset-2"
57
+ )}
58
+ disabled={disabled}
59
+ >
60
+ {screenReaderLabel && <span className="sr-only">{screenReaderLabel}</span>}
61
+ <span
62
+ className={cn(
63
+ checked ? "translate-x-[22px]" : "translate-x-[2px]",
64
+ {
65
+ "border border-gray-200 translate-x-0": variant === "short",
66
+ "!translate-x-[22px]": checked && variant === "short"
67
+ },
68
+ " h-5 w-5 transform rounded-full bg-white transition shadow-sm drop-shadow flex items-center justify-center"
69
+ )}
70
+ >
71
+ {withIcon && <DynamicIcon {...withIcon} className={"text-gray-400 m-[2px]"} />}
72
+ </span>
73
+ </Switch>
74
+ {label && label.xPosition === "right" && (
75
+ <Switch.Label className={label.className}>{label.text}</Switch.Label>
76
+ )}
77
+ </Switch.Group>
78
+ )
73
79
  }
74
80
 
75
81
  export default ToggleSwitch
@@ -1,3 +1,2 @@
1
-
2
- export { default } from './Tabs';
3
- export * from './Tabs';
1
+ export * from "./Tabs"
2
+ export { default } from "./Tabs"
@@ -5,17 +5,47 @@ const meta: Meta<typeof AnimatedLabelInput> = {
5
5
  title: "Design System/organisms/Animated Label Input",
6
6
  component: AnimatedLabelInput,
7
7
  tags: ["autodocs"],
8
- argTypes: {}
8
+ argTypes: {},
9
+ decorators: [
10
+ (Story, context) => {
11
+ if (context.name === "Default Animated Label Inputs Dark BG Story") {
12
+ return (
13
+ <div className="bg-transparent-black-03 p-6">
14
+ <Story />
15
+ </div>
16
+ )
17
+ }
18
+ return <Story />
19
+ }
20
+ ]
9
21
  }
10
22
 
11
23
  export default meta
12
24
  type Story = StoryObj<typeof AnimatedLabelInput>
13
25
  export const DefaultAnimatedLabelInputsStory: Story = {
26
+ args: {
27
+ id: "test",
28
+ label: {
29
+ display: "Label"
30
+ }
31
+ } as IAnimatedLabelInputProps
32
+ }
33
+ export const DefaultAnimatedLabelInputsDarkBGStory: Story = {
34
+ args: {
35
+ id: "test",
36
+ label: {
37
+ display: "Label with Dark BG"
38
+ },
39
+ value: "Value"
40
+ } as IAnimatedLabelInputProps
41
+ }
42
+
43
+ export const DefaultAnimatedLabelInputsStoryWithPlaceHolder: Story = {
14
44
  args: {
15
45
  id: "test",
16
46
  label: {
17
47
  display: "Label"
18
48
  },
19
- input: {}
49
+ placeholder: "Placeholder"
20
50
  } as IAnimatedLabelInputProps
21
51
  }
@@ -1,59 +1,88 @@
1
1
  import React from "react"
2
2
  import { default as cn } from "classnames"
3
3
  import InputField, { IInputFieldProps } from "@/stories/molecules/inputs/InputField"
4
- import Textarea, { ITextareaProps } from "@/stories/molecules/inputs/textArea/TextArea"
4
+ import InputCounter from "@/stories/molecules/inputs/InputCounter"
5
5
 
6
- interface ILabelProps extends React.ComponentPropsWithoutRef<"label"> {
6
+ interface ILabelProps extends React.DetailedHTMLProps<React.LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement> {
7
7
  display: string
8
8
  }
9
9
 
10
- export interface IAnimatedLabelInputProps {
10
+ export interface IAnimatedLabelInputProps extends Omit<IInputFieldProps, "handleChange"> {
11
11
  id: string
12
12
  containerStyles?: string
13
13
  message?: string
14
- input?: IInputFieldProps
15
- textarea?: ITextareaProps
16
14
  required?: boolean
17
15
  isError?: boolean
16
+ isShowCounter?: boolean
17
+ maxLength?: number
18
18
  label: ILabelProps
19
+ handleChange: (value: string) => void
19
20
  }
20
21
 
21
- const AnimatedLabelInput: React.FC<IAnimatedLabelInputProps> = ({
22
- id,
23
- label,
24
- input,
25
- message,
26
- textarea,
27
- required,
28
- isError,
29
- containerStyles
30
- }) => {
22
+ const AnimatedLabelInput: React.FC<IAnimatedLabelInputProps> = (props: IAnimatedLabelInputProps) => {
23
+ const {
24
+ id,
25
+ containerStyles,
26
+ message,
27
+ required,
28
+ isError,
29
+ label,
30
+ value,
31
+ isShowCounter,
32
+ maxLength,
33
+ handleChange,
34
+ ...input
35
+ } = props
36
+
37
+ const [hasValue, setHasValue] = React.useState<boolean>(!!value)
38
+ const [valueLength, setValueLength] = React.useState<number>(0)
39
+
31
40
  return (
32
- <div className={cn("group relative", containerStyles ? containerStyles : "")}>
33
- {input && <InputField isError={isError} {...input} />}
34
- {textarea && <Textarea isError={isError} {...textarea} />}
35
- <label
36
- className={cn(
37
- "absolute left-1 z-10 ml-[.172rem] inline-block bg-white px-1 text-xs transition-all peer-placeholder-shown:top-2 peer-placeholder-shown:text-sm peer-placeholder-shown:text-gray-600",
38
- "-top-[9px] group-focus-within:!-top-[12px] group-focus-within:!left-1 group-focus-within:!ml-[.172rem] group-focus-within:!text-xs",
39
- isError && "!text-red-600"
40
- )}
41
- htmlFor={id}
42
- >
43
- {label.display}
44
- {required && <span className="text-red-600">*</span>}
45
- </label>
46
-
47
- <div className="flex flex-row space-x-3">
48
- <div className="grow transition-all">
49
- {message && (
50
- <span className={cn("mt-1 block text-sm", isError ? "text-red-500" : "text-gray-500")}>
51
- {message}
52
- </span>
41
+ <>
42
+ <div className={cn("group relative", containerStyles ? containerStyles : "")}>
43
+ <InputField
44
+ id={id}
45
+ isError={isError}
46
+ value={value}
47
+ handleChange={(v) => {
48
+ setHasValue(!!v)
49
+ setValueLength(v.length)
50
+ if (handleChange) handleChange(v)
51
+ }}
52
+ {...input}
53
+ />
54
+ <div
55
+ className={cn(
56
+ "absolute z-10 ml-[3px] inline-block bg-label-gradient-idle text-sm transition-all text-gray-500 left-1 px-1",
57
+ hasValue ? "!-top-[8px] !ml-[.172rem] !text-xs text-gray-600" : "top-[9px]",
58
+ "peer-placeholder-shown:!-top-[8px] peer-placeholder-shown:!ml-[.172rem] peer-placeholder-shown:!text-xs peer-placeholder-shown:text-gray-600",
59
+ "group-focus-within:!-top-[8px] group-focus-within:!bg-label-gradient-focus group-focus-within:!ml-[.172rem] group-focus-within:!text-xs group-focus-within:text-gray-600",
60
+
61
+ isError && "!text-red-600"
62
+ )}
63
+ >
64
+ <label htmlFor={id}>
65
+ {label.display}
66
+ {required && <span className="text-red-600 ml-1">*</span>}
67
+ </label>
68
+ </div>
69
+
70
+ <div className="flex flex-row space-x-3">
71
+ <div className="grow">
72
+ {message && (
73
+ <span className={cn("mt-1 block text-sm", isError ? "text-red-500" : "text-gray-500")}>
74
+ {message}
75
+ </span>
76
+ )}
77
+ </div>
78
+ {isShowCounter && (
79
+ <div className="shrink-0">
80
+ <InputCounter current={Number(valueLength)} limit={maxLength ?? 150} />
81
+ </div>
53
82
  )}
54
83
  </div>
55
84
  </div>
56
- </div>
85
+ </>
57
86
  )
58
87
  }
59
88
 
@@ -1,3 +1,3 @@
1
1
  import AnimatedLabelInput, { IAnimatedLabelInputProps } from "./AnimatedLabelInput"
2
- export default AnimatedLabelInput
3
2
  export type { IAnimatedLabelInputProps }
3
+ export default AnimatedLabelInput
@@ -0,0 +1,26 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import AnimatedLabelTextArea, { IAnimatedLabelTextAreaProps } from "./AnimatedLabelTextArea"
3
+
4
+ const meta: Meta<typeof AnimatedLabelTextArea> = {
5
+ title: "Design System/organisms/Animated Label Text Area",
6
+ component: AnimatedLabelTextArea,
7
+ tags: ["autodocs"],
8
+ argTypes: {}
9
+ }
10
+
11
+ export default meta
12
+ type Story = StoryObj<typeof AnimatedLabelTextArea>
13
+ export const DefaultAnimatedLabelTextAreasStory: Story = {
14
+ args: {
15
+ id: "test",
16
+ label: "Label"
17
+ } as IAnimatedLabelTextAreaProps
18
+ }
19
+
20
+ export const DefaultAnimatedLabelTextAreasStoryWithPlaceholder: Story = {
21
+ args: {
22
+ id: "test",
23
+ label: "Label",
24
+ placeholder: "Placeholder"
25
+ } as IAnimatedLabelTextAreaProps
26
+ }
@@ -0,0 +1,61 @@
1
+ import React from "react"
2
+ import { default as cn } from "classnames"
3
+
4
+ import TextArea, { ITextareaProps } from "@/stories/molecules/inputs/textArea"
5
+
6
+ export interface IAnimatedLabelTextAreaProps extends ITextareaProps {
7
+ id: string
8
+ containerStyles?: string
9
+ message?: string
10
+ required?: boolean
11
+ isError?: boolean
12
+ handleChange: (value: string) => void
13
+ }
14
+
15
+ const AnimatedLabelTextArea: React.FC<IAnimatedLabelTextAreaProps> = (props: IAnimatedLabelTextAreaProps) => {
16
+ const { id, containerStyles, message, required, isError, label, value, handleChange, onChange, ...input } = props
17
+
18
+ const [hasValue, setHasValue] = React.useState<boolean>(!!value)
19
+
20
+ return (
21
+ <div className={cn("group relative", containerStyles ? containerStyles : "")}>
22
+ <TextArea
23
+ id={id}
24
+ isError={isError}
25
+ value={value}
26
+ {...input}
27
+ onChange={(v) => {
28
+ setHasValue(!!v)
29
+ if (handleChange) handleChange(v)
30
+ }}
31
+ label={undefined}
32
+ />
33
+ <label
34
+ className={cn(
35
+ "absolute z-10 ml-[3px] inline-block bg-white text-sm transition-all text-gray-500 left-1 px-1",
36
+ hasValue ? "!-top-[8px] !ml-[.172rem] !text-xs text-gray-600" : "top-[9px]",
37
+ "peer-placeholder-shown:!-top-[8px] peer-placeholder-shown:!ml-[.172rem] peer-placeholder-shown:!text-xs peer-placeholder-shown:text-gray-600",
38
+ "group-focus-within:!-top-[8px] group-focus-within:!ml-[.172rem] group-focus-within:!text-xs group-focus-within:text-gray-600",
39
+
40
+ isError && "!text-red-600"
41
+ )}
42
+ htmlFor={label?.htmlFor || id}
43
+ >
44
+ {label?.display}
45
+ {required && <span className="text-red-600 ml-1">*</span>}
46
+ </label>
47
+
48
+ <div className="flex flex-row space-x-3">
49
+ <div className="grow transition-all">
50
+ {message && (
51
+ <span className={cn("mt-1 block text-sm", isError ? "text-red-500" : "text-gray-500")}>
52
+ {message}
53
+ </span>
54
+ )}
55
+ </div>
56
+ </div>
57
+ </div>
58
+ )
59
+ }
60
+
61
+ export default AnimatedLabelTextArea
@@ -0,0 +1,3 @@
1
+ import AnimatedLabelTextArea, { IAnimatedLabelTextAreaProps } from "./AnimatedLabelTextArea"
2
+ export type { IAnimatedLabelTextAreaProps }
3
+ export default AnimatedLabelTextArea
@@ -2,74 +2,74 @@ import type { Meta, StoryObj } from "@storybook/react"
2
2
  import ButtonDropdown from "."
3
3
  import { IItemProp } from "../DropdownComponent"
4
4
 
5
-
6
5
  const meta: Meta<typeof ButtonDropdown> = {
7
6
  title: "Design System/Organisms/Button Dropdown",
8
7
  component: ButtonDropdown,
9
8
  tags: ["autodocs"],
10
9
  argTypes: {}
11
10
  }
12
- const dropdownDataWithIcons: IItemProp[][] = [
13
- [
14
- {
15
- icon: {
16
- name: "IconClipboardCopy",
17
- pos: "leading",
18
- className: "h-5 w-5",
19
- outline: false
20
- },
21
- key: "Copy",
22
- label: "Copy",
23
- onClick: () => {
24
- console.log("Copy action")
25
- }
26
- }
27
- ],
28
- [
29
- {
30
- icon: {
31
- name: "IconFolderPlus",
32
- pos: "leading",
33
- className: "h-5 w-5",
34
- outline: false
35
- },
36
- key: "Add to Batch",
37
- label: "Add to Batch",
38
- onClick: () => {
39
- console.log("Add to Batch action")
40
- }
11
+ const dropdownDataWithIcons: IItemProp[][] = [
12
+ [
13
+ {
14
+ icon: {
15
+ icon: "IconCopy"
16
+
17
+ // className: "h-5 w-5",
18
+ // outline: false
41
19
  },
42
- {
43
- icon: {
44
- name: "IconEye",
45
- pos: "leading",
46
- className: "h-5 w-5",
47
- outline: false
48
- },
49
- key: "View Batch",
50
- label: "View Batch",
51
- onClick: () => {
52
- console.log("View Batch action")
53
- }
20
+ iconPosition: "leading",
21
+ key: "Copy",
22
+ label: "Copy The Thing",
23
+ onClick: () => {}
24
+ }
25
+ ],
26
+ [
27
+ {
28
+ icon: {
29
+ icon: "IconFolderPlus"
30
+ // name: "IconFolderPlus",
31
+ // className: "h-5 w-5",
32
+ // outline: false
33
+ },
34
+ key: "Add to Batch",
35
+ label: "Add to Batch",
36
+ onClick: () => {
37
+ console.log("Add to Batch action")
54
38
  }
55
- ],
56
- [
57
- {
58
- icon: {
59
- name: "IconTrash",
60
- pos: "leading",
61
- className: "h-5 w-5",
62
- outline: false
63
- },
64
- key: "Delete",
65
- label: "Delete",
66
- onClick: () => {
67
- console.log("Delete action")
68
- },
69
- isEmphasized: true
39
+ },
40
+ {
41
+ icon: {
42
+ icon: "IconEye",
43
+ //pos: "leading",
44
+ className: "h-5 w-5",
45
+ outline: false
46
+ },
47
+ iconPosition: "leading",
48
+ key: "View Batch",
49
+ label: "View Batch",
50
+ onClick: () => {
51
+ console.log("View Batch action")
70
52
  }
71
- ]
72
- ]
53
+ }
54
+ ],
55
+ [
56
+ {
57
+ icon: {
58
+ icon: "IconTrash"
59
+
60
+ // pos: "leading",
61
+ // className: "h-5 w-5",
62
+ // outline: false
63
+ },
64
+ key: "Delete",
65
+ label: "Delete",
66
+ onClick: () => {
67
+ console.log("Delete action")
68
+ },
69
+ isEmphasized: true
70
+ }
71
+ ]
72
+ ]
73
73
 
74
74
  export default meta
75
75
  type Story = StoryObj<typeof ButtonDropdown>