@iota/apps-ui-kit 0.0.0-experimental-20250613144451

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 (220) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/LICENSE +201 -0
  3. package/README.md +16 -0
  4. package/dist/index.d.ts +1726 -0
  5. package/dist/index.es.js +6923 -0
  6. package/dist/index.es.js.map +1 -0
  7. package/dist/index.umd.js +118 -0
  8. package/dist/index.umd.js.map +1 -0
  9. package/dist/style.css +1 -0
  10. package/package.json +75 -0
  11. package/src/lib/components/atoms/badge/Badge.tsx +37 -0
  12. package/src/lib/components/atoms/badge/badge.classes.ts +33 -0
  13. package/src/lib/components/atoms/badge/badge.enums.ts +11 -0
  14. package/src/lib/components/atoms/badge/index.ts +6 -0
  15. package/src/lib/components/atoms/button/Button.tsx +99 -0
  16. package/src/lib/components/atoms/button/button-variants/ButtonPill.tsx +23 -0
  17. package/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx +27 -0
  18. package/src/lib/components/atoms/button/button-variants/buttonVariants.types.ts +11 -0
  19. package/src/lib/components/atoms/button/button-variants/index.ts +5 -0
  20. package/src/lib/components/atoms/button/button.classes.ts +53 -0
  21. package/src/lib/components/atoms/button/button.enums.ts +21 -0
  22. package/src/lib/components/atoms/button/index.ts +7 -0
  23. package/src/lib/components/atoms/button-segment/ButtonSegment.tsx +98 -0
  24. package/src/lib/components/atoms/button-segment/buttonSegment.classes.ts +45 -0
  25. package/src/lib/components/atoms/button-segment/buttonSegment.enums.ts +7 -0
  26. package/src/lib/components/atoms/button-segment/index.ts +5 -0
  27. package/src/lib/components/atoms/checkbox/Checkbox.tsx +114 -0
  28. package/src/lib/components/atoms/checkbox/index.ts +4 -0
  29. package/src/lib/components/atoms/divider/Divider.tsx +48 -0
  30. package/src/lib/components/atoms/divider/divider.classes.ts +11 -0
  31. package/src/lib/components/atoms/divider/divider.enums.ts +7 -0
  32. package/src/lib/components/atoms/divider/index.ts +6 -0
  33. package/src/lib/components/atoms/header/Header.tsx +73 -0
  34. package/src/lib/components/atoms/header/index.ts +4 -0
  35. package/src/lib/components/atoms/index.ts +23 -0
  36. package/src/lib/components/atoms/info-box/InfoBox.tsx +74 -0
  37. package/src/lib/components/atoms/info-box/index.ts +5 -0
  38. package/src/lib/components/atoms/info-box/infoBox.classes.ts +19 -0
  39. package/src/lib/components/atoms/info-box/infoBox.enums.ts +14 -0
  40. package/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx +157 -0
  41. package/src/lib/components/atoms/key-value-info/index.ts +6 -0
  42. package/src/lib/components/atoms/key-value-info/keyValue.enums.ts +7 -0
  43. package/src/lib/components/atoms/label-text/LabelText.tsx +94 -0
  44. package/src/lib/components/atoms/label-text/index.ts +5 -0
  45. package/src/lib/components/atoms/label-text/labelText.classes.ts +22 -0
  46. package/src/lib/components/atoms/label-text/labelText.enums.ts +8 -0
  47. package/src/lib/components/atoms/list-item/ListItem.tsx +89 -0
  48. package/src/lib/components/atoms/list-item/index.ts +4 -0
  49. package/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx +38 -0
  50. package/src/lib/components/atoms/loading-indicator/index.ts +4 -0
  51. package/src/lib/components/atoms/panel/Panel.tsx +30 -0
  52. package/src/lib/components/atoms/panel/index.ts +4 -0
  53. package/src/lib/components/atoms/placeholder/Placeholder.tsx +27 -0
  54. package/src/lib/components/atoms/placeholder/index.ts +4 -0
  55. package/src/lib/components/atoms/radio-button/RadioButton.tsx +68 -0
  56. package/src/lib/components/atoms/radio-button/index.ts +4 -0
  57. package/src/lib/components/atoms/secondary-text/SecondaryText.tsx +28 -0
  58. package/src/lib/components/atoms/secondary-text/index.ts +4 -0
  59. package/src/lib/components/atoms/skeleton/Skeleton.tsx +47 -0
  60. package/src/lib/components/atoms/skeleton/index.ts +4 -0
  61. package/src/lib/components/atoms/snackbar/Snackbar.tsx +69 -0
  62. package/src/lib/components/atoms/snackbar/index.ts +5 -0
  63. package/src/lib/components/atoms/snackbar/snackbar.classes.ts +18 -0
  64. package/src/lib/components/atoms/snackbar/snackbar.enums.tsx +9 -0
  65. package/src/lib/components/atoms/toggle/Toggle.tsx +140 -0
  66. package/src/lib/components/atoms/toggle/index.ts +6 -0
  67. package/src/lib/components/atoms/toggle/toggle.classes.ts +41 -0
  68. package/src/lib/components/atoms/toggle/toggle.enums.ts +12 -0
  69. package/src/lib/components/atoms/tooltip/Tooltip.tsx +138 -0
  70. package/src/lib/components/atoms/tooltip/index.ts +5 -0
  71. package/src/lib/components/atoms/tooltip/tooltip.classes.ts +11 -0
  72. package/src/lib/components/atoms/tooltip/tooltip.enums.ts +9 -0
  73. package/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx +101 -0
  74. package/src/lib/components/atoms/visual-asset-card/index.ts +5 -0
  75. package/src/lib/components/atoms/visual-asset-card/visualAssetCard.enums.ts +7 -0
  76. package/src/lib/components/index.ts +8 -0
  77. package/src/lib/components/molecules/account/Account.tsx +192 -0
  78. package/src/lib/components/molecules/account/index.ts +4 -0
  79. package/src/lib/components/molecules/address/Address.tsx +101 -0
  80. package/src/lib/components/molecules/address/index.ts +4 -0
  81. package/src/lib/components/molecules/card/Card.tsx +70 -0
  82. package/src/lib/components/molecules/card/CardAction.tsx +80 -0
  83. package/src/lib/components/molecules/card/CardBody.tsx +72 -0
  84. package/src/lib/components/molecules/card/CardImage.tsx +43 -0
  85. package/src/lib/components/molecules/card/CardImagePlaceholder.tsx +146 -0
  86. package/src/lib/components/molecules/card/card.classes.ts +27 -0
  87. package/src/lib/components/molecules/card/card.enums.ts +26 -0
  88. package/src/lib/components/molecules/card/index.ts +8 -0
  89. package/src/lib/components/molecules/chip/Chip.tsx +105 -0
  90. package/src/lib/components/molecules/chip/chip.classes.ts +32 -0
  91. package/src/lib/components/molecules/chip/chip.enums.ts +7 -0
  92. package/src/lib/components/molecules/chip/index.ts +4 -0
  93. package/src/lib/components/molecules/display-stats/DisplayStats.tsx +142 -0
  94. package/src/lib/components/molecules/display-stats/displayStats.classes.ts +36 -0
  95. package/src/lib/components/molecules/display-stats/displayStats.enums.ts +13 -0
  96. package/src/lib/components/molecules/display-stats/index.ts +5 -0
  97. package/src/lib/components/molecules/dropdown/Dropdown.tsx +10 -0
  98. package/src/lib/components/molecules/dropdown/dropdownPosition.enums.ts +7 -0
  99. package/src/lib/components/molecules/dropdown/index.ts +5 -0
  100. package/src/lib/components/molecules/index.ts +17 -0
  101. package/src/lib/components/molecules/input/Input.tsx +246 -0
  102. package/src/lib/components/molecules/input/InputWrapper.tsx +97 -0
  103. package/src/lib/components/molecules/input/TextArea.tsx +150 -0
  104. package/src/lib/components/molecules/input/index.ts +8 -0
  105. package/src/lib/components/molecules/input/input.classes.ts +14 -0
  106. package/src/lib/components/molecules/input/input.enums.ts +14 -0
  107. package/src/lib/components/molecules/input/input.types.ts +29 -0
  108. package/src/lib/components/molecules/navbar-item/NavbarItem.tsx +48 -0
  109. package/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx +65 -0
  110. package/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx +54 -0
  111. package/src/lib/components/molecules/navbar-item/index.ts +5 -0
  112. package/src/lib/components/molecules/navbar-item/navbarItem.classes.ts +16 -0
  113. package/src/lib/components/molecules/navbar-item/navbarItem.enums.ts +7 -0
  114. package/src/lib/components/molecules/search/Search.tsx +216 -0
  115. package/src/lib/components/molecules/search/index.ts +5 -0
  116. package/src/lib/components/molecules/search/search.classes.ts +20 -0
  117. package/src/lib/components/molecules/search/search.enums.ts +7 -0
  118. package/src/lib/components/molecules/segmented-button/SegmentedButton.tsx +38 -0
  119. package/src/lib/components/molecules/segmented-button/index.ts +6 -0
  120. package/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts +12 -0
  121. package/src/lib/components/molecules/segmented-button/segmentedButton.enums.ts +8 -0
  122. package/src/lib/components/molecules/select/Select.tsx +222 -0
  123. package/src/lib/components/molecules/select/index.ts +5 -0
  124. package/src/lib/components/molecules/select/select.enums.ts +7 -0
  125. package/src/lib/components/molecules/table-cell/TableCell.tsx +62 -0
  126. package/src/lib/components/molecules/table-cell/index.ts +4 -0
  127. package/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx +140 -0
  128. package/src/lib/components/molecules/table-header-cell/index.ts +5 -0
  129. package/src/lib/components/molecules/table-header-cell/tableHeaderCell.enums.ts +7 -0
  130. package/src/lib/components/molecules/title/Title.tsx +78 -0
  131. package/src/lib/components/molecules/title/index.ts +5 -0
  132. package/src/lib/components/molecules/title/titleClasses.constants.ts +14 -0
  133. package/src/lib/components/molecules/title/titleSize.enums.ts +7 -0
  134. package/src/lib/components/organisms/accordion/Accordion.tsx +109 -0
  135. package/src/lib/components/organisms/accordion/accordion.classes.ts +4 -0
  136. package/src/lib/components/organisms/accordion/index.ts +4 -0
  137. package/src/lib/components/organisms/dialog/Dialog.tsx +142 -0
  138. package/src/lib/components/organisms/dialog/dialog.enums.ts +7 -0
  139. package/src/lib/components/organisms/dialog/index.ts +5 -0
  140. package/src/lib/components/organisms/index.ts +7 -0
  141. package/src/lib/components/organisms/navbar/Navbar.tsx +101 -0
  142. package/src/lib/components/organisms/navbar/NavbarSlideout.tsx +59 -0
  143. package/src/lib/components/organisms/navbar/index.ts +5 -0
  144. package/src/lib/components/organisms/table/Table.tsx +234 -0
  145. package/src/lib/components/organisms/table/TableContext.tsx +56 -0
  146. package/src/lib/components/organisms/table/index.ts +4 -0
  147. package/src/lib/constants/colors.constants.ts +133 -0
  148. package/src/lib/constants/index.ts +4 -0
  149. package/src/lib/enums/index.ts +4 -0
  150. package/src/lib/enums/screenSize.enums.ts +9 -0
  151. package/src/lib/index.ts +8 -0
  152. package/src/lib/styles/fonts.css +5 -0
  153. package/src/lib/styles/index.css +149 -0
  154. package/src/lib/tailwind/base.presets.ts +49 -0
  155. package/src/lib/tailwind/constants/fontSizes.constants.ts +201 -0
  156. package/src/lib/tailwind/constants/index.ts +6 -0
  157. package/src/lib/tailwind/constants/scaling.constants.ts +41 -0
  158. package/src/lib/tailwind/constants/variableSpacing.constants.ts +66 -0
  159. package/src/lib/tailwind/helpers.ts +20 -0
  160. package/src/lib/tailwind/index.ts +5 -0
  161. package/src/lib/tailwind/plugins.ts +8 -0
  162. package/src/lib/tailwind/responsive.presets.ts +36 -0
  163. package/src/lib/tailwind/static.presets.ts +25 -0
  164. package/src/lib/tailwind/types.ts +6 -0
  165. package/src/lib/utils/format.ts +8 -0
  166. package/src/lib/utils/index.ts +4 -0
  167. package/src/storybook/blocks/Showcase.tsx +20 -0
  168. package/src/storybook/blocks/TypeSet.tsx +34 -0
  169. package/src/storybook/blocks/TypeSetItem.tsx +74 -0
  170. package/src/storybook/blocks/index.ts +6 -0
  171. package/src/storybook/constants/index.ts +5 -0
  172. package/src/storybook/constants/typeset.constants.ts +39 -0
  173. package/src/storybook/constants/variableSpacing.constants.ts +6 -0
  174. package/src/storybook/helpers/getFontSizeLabel.ts +15 -0
  175. package/src/storybook/helpers/index.ts +4 -0
  176. package/src/storybook/stories/atoms/Badge.stories.tsx +32 -0
  177. package/src/storybook/stories/atoms/Button.stories.tsx +45 -0
  178. package/src/storybook/stories/atoms/ButtonSegment.stories.tsx +45 -0
  179. package/src/storybook/stories/atoms/Checkbox.stories.tsx +34 -0
  180. package/src/storybook/stories/atoms/CustomScrollbar.stories.tsx +22 -0
  181. package/src/storybook/stories/atoms/Divider.stories.tsx +41 -0
  182. package/src/storybook/stories/atoms/Header.stories.tsx +58 -0
  183. package/src/storybook/stories/atoms/InfoBox.stories.tsx +67 -0
  184. package/src/storybook/stories/atoms/KeyValueInfo.stories.tsx +59 -0
  185. package/src/storybook/stories/atoms/LabelText.stories.tsx +55 -0
  186. package/src/storybook/stories/atoms/ListItem.stories.tsx +41 -0
  187. package/src/storybook/stories/atoms/LoadingIndicator.stories.tsx +32 -0
  188. package/src/storybook/stories/atoms/Panel.stories.tsx +36 -0
  189. package/src/storybook/stories/atoms/Placeholder.stories.tsx +33 -0
  190. package/src/storybook/stories/atoms/RadioButton.stories.tsx +51 -0
  191. package/src/storybook/stories/atoms/Skeleton.stories.tsx +33 -0
  192. package/src/storybook/stories/atoms/Snackbar.stories.tsx +43 -0
  193. package/src/storybook/stories/atoms/Toggle.stories.tsx +59 -0
  194. package/src/storybook/stories/atoms/Tooltip.stories.tsx +57 -0
  195. package/src/storybook/stories/atoms/VisualAssetCard.stories.tsx +56 -0
  196. package/src/storybook/stories/components/VariableSpacingShowcase.tsx +46 -0
  197. package/src/storybook/stories/components/index.ts +4 -0
  198. package/src/storybook/stories/design-tokens/colors.stories.mdx +23 -0
  199. package/src/storybook/stories/design-tokens/icons.stories.mdx +17 -0
  200. package/src/storybook/stories/design-tokens/typeset.stories.mdx +15 -0
  201. package/src/storybook/stories/design-tokens/variable-spacing.stories.mdx +10 -0
  202. package/src/storybook/stories/molecules/Account.stories.tsx +69 -0
  203. package/src/storybook/stories/molecules/Address.stories.tsx +39 -0
  204. package/src/storybook/stories/molecules/Card.stories.tsx +112 -0
  205. package/src/storybook/stories/molecules/Chip.stories.tsx +122 -0
  206. package/src/storybook/stories/molecules/DisplayStats.stories.tsx +63 -0
  207. package/src/storybook/stories/molecules/Dropdown.stories.tsx +38 -0
  208. package/src/storybook/stories/molecules/Input.stories.tsx +162 -0
  209. package/src/storybook/stories/molecules/NavbarItem.stories.tsx +45 -0
  210. package/src/storybook/stories/molecules/Search.stories.tsx +101 -0
  211. package/src/storybook/stories/molecules/SegmentedButton.stories.tsx +108 -0
  212. package/src/storybook/stories/molecules/Select.stories.tsx +103 -0
  213. package/src/storybook/stories/molecules/TableCell.stories.tsx +46 -0
  214. package/src/storybook/stories/molecules/TableHeaderCell.stories.tsx +34 -0
  215. package/src/storybook/stories/molecules/TextArea.stories.tsx +80 -0
  216. package/src/storybook/stories/molecules/Title.stories.tsx +76 -0
  217. package/src/storybook/stories/organisms/Accordion.stories.tsx +70 -0
  218. package/src/storybook/stories/organisms/Dialog.stories.tsx +103 -0
  219. package/src/storybook/stories/organisms/Navbar.stories.tsx +78 -0
  220. package/src/storybook/stories/organisms/Table.stories.tsx +154 -0
@@ -0,0 +1,5 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './LabelText';
5
+ export * from './labelText.enums';
@@ -0,0 +1,22 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { LabelTextSize } from './labelText.enums';
5
+
6
+ export const TEXT_SIZE = {
7
+ [LabelTextSize.Small]: 'text-title-sm',
8
+ [LabelTextSize.Medium]: 'text-title-md',
9
+ [LabelTextSize.Large]: 'text-title-lg',
10
+ };
11
+
12
+ export const SUPPORTING_TEXT_SIZE = {
13
+ [LabelTextSize.Small]: 'text-label-md',
14
+ [LabelTextSize.Medium]: 'text-label-md',
15
+ [LabelTextSize.Large]: 'text-label-lg',
16
+ };
17
+
18
+ export const LABEL_TEXT_SIZE = {
19
+ [LabelTextSize.Small]: 'text-label-md',
20
+ [LabelTextSize.Medium]: 'text-label-md',
21
+ [LabelTextSize.Large]: 'text-label-lg',
22
+ };
@@ -0,0 +1,8 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export enum LabelTextSize {
5
+ Small = 'small',
6
+ Medium = 'medium',
7
+ Large = 'large',
8
+ }
@@ -0,0 +1,89 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { PropsWithChildren } from 'react';
5
+ import cx from 'classnames';
6
+ import { ArrowRight } from '@iota/apps-ui-icons';
7
+ import { Button, ButtonSize, ButtonType } from '../button';
8
+
9
+ export interface ListItemProps {
10
+ /**
11
+ * Has right icon (optional).
12
+ */
13
+ showRightIcon?: boolean;
14
+ /**
15
+ * Hide bottom border (optional).
16
+ */
17
+ hideBottomBorder?: boolean;
18
+ /**
19
+ * On click handler (optional).
20
+ */
21
+ onClick?: () => void;
22
+ /**
23
+ * The list item is disabled or not.
24
+ */
25
+ isDisabled?: boolean;
26
+ /**
27
+ * The list item is highlighted.
28
+ */
29
+ isHighlighted?: boolean;
30
+ }
31
+
32
+ export function ListItem({
33
+ showRightIcon,
34
+ hideBottomBorder,
35
+ onClick,
36
+ isDisabled,
37
+ children,
38
+ isHighlighted,
39
+ }: PropsWithChildren<ListItemProps>): React.JSX.Element {
40
+ function handleKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {
41
+ if ((event.key === 'Enter' || event.key === ' ') && !isDisabled && onClick) {
42
+ onClick();
43
+ }
44
+ }
45
+
46
+ function handleClick() {
47
+ if (!isDisabled && onClick) {
48
+ onClick();
49
+ }
50
+ }
51
+
52
+ return (
53
+ <div
54
+ className={cx(
55
+ 'w-full',
56
+ {
57
+ 'border-b border-shader-neutral-light-8 pb-xs dark:border-shader-neutral-dark-8':
58
+ !hideBottomBorder,
59
+ },
60
+ { 'opacity-40': isDisabled },
61
+ )}
62
+ >
63
+ <div
64
+ onClick={handleClick}
65
+ role="button"
66
+ tabIndex={0}
67
+ onKeyDown={handleKeyDown}
68
+ className={cx(
69
+ 'relative flex flex-row items-center justify-between px-md py-sm text-neutral-10 dark:text-neutral-92',
70
+ !isDisabled && onClick ? 'cursor-pointer' : 'cursor-default',
71
+ {
72
+ 'bg-shader-primary-dark-16 dark:bg-shader-inverted-dark-16': isHighlighted,
73
+ 'state-layer': !isDisabled,
74
+ },
75
+ )}
76
+ >
77
+ {children}
78
+ {showRightIcon && (
79
+ <Button
80
+ size={ButtonSize.Small}
81
+ type={ButtonType.Ghost}
82
+ disabled={isDisabled}
83
+ icon={<ArrowRight />}
84
+ />
85
+ )}
86
+ </div>
87
+ </div>
88
+ );
89
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './ListItem';
@@ -0,0 +1,38 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+ import { Loader } from '@iota/apps-ui-icons';
6
+
7
+ export interface LoadingIndicatorProps {
8
+ /**
9
+ * The color of the loading indicator.
10
+ */
11
+ color?: string;
12
+ /**
13
+ * The size of the loading indicator.
14
+ */
15
+ size?: string;
16
+ /**
17
+ * The text to display next to the loading indicator.
18
+ */
19
+ text?: string;
20
+ /**
21
+ * The 'data-testid' attribute value (used in e2e tests)
22
+ */
23
+ testId?: string;
24
+ }
25
+
26
+ export function LoadingIndicator({
27
+ color = 'text-primary-30 dark:text-primary-80',
28
+ size = 'w-5 h-5',
29
+ text,
30
+ testId,
31
+ }: LoadingIndicatorProps): React.JSX.Element {
32
+ return (
33
+ <div className="flex items-center justify-center gap-xs">
34
+ <Loader className={cx('animate-spin', color, size)} data-testid={testId} />
35
+ {text && <span className={cx('text-body-sm', color)}>{text}</span>}
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './LoadingIndicator';
@@ -0,0 +1,30 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+
6
+ interface PanelProps {
7
+ /**
8
+ * Show or hide border around the panel.
9
+ */
10
+ hasBorder?: boolean;
11
+ /**
12
+ * Background color of the panel.
13
+ */
14
+ bgColor?: string;
15
+ }
16
+
17
+ export function Panel({
18
+ children,
19
+ hasBorder,
20
+ bgColor = 'bg-neutral-100 dark:bg-neutral-6',
21
+ }: React.PropsWithChildren<PanelProps>): React.JSX.Element {
22
+ const borderClass = hasBorder
23
+ ? 'border border-shader-neutral-light-8 dark:border-shader-neutral-dark-8'
24
+ : 'border border-transparent';
25
+ return (
26
+ <div className={cx('flex w-full flex-col rounded-xl', bgColor, borderClass)}>
27
+ {children}
28
+ </div>
29
+ );
30
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Panel';
@@ -0,0 +1,27 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+
6
+ interface PlaceholderProps {
7
+ /**
8
+ * The width of the placeholder.
9
+ */
10
+ width?: string;
11
+ /**
12
+ * The height of the placeholder.
13
+ */
14
+ height?: string;
15
+ }
16
+
17
+ export function Placeholder({ width = 'w-full', height = 'h-4' }: PlaceholderProps) {
18
+ return (
19
+ <div
20
+ className={cx(
21
+ 'animate-pulse rounded-md bg-gradient-to-r from-shader-primary-light-8 bg-[length:1000px_100%] dark:from-shader-primary-dark-8',
22
+ width,
23
+ height,
24
+ )}
25
+ />
26
+ );
27
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { Placeholder } from './Placeholder';
@@ -0,0 +1,68 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+ import { RadioOn, RadioOff } from '@iota/apps-ui-icons';
6
+
7
+ interface RadioButtonProps {
8
+ /**
9
+ * The label of the radio button.
10
+ */
11
+ label: string;
12
+ /**
13
+ * The state of the radio button.
14
+ */
15
+ isChecked?: boolean;
16
+ /**
17
+ * If radio button disabled.
18
+ */
19
+ isDisabled?: boolean;
20
+ /**
21
+ * The callback to call when the radio button is clicked.
22
+ */
23
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
24
+ }
25
+
26
+ function RadioButton({
27
+ label,
28
+ isChecked,
29
+ isDisabled,
30
+ onChange,
31
+ }: RadioButtonProps): React.JSX.Element {
32
+ const RadioIcon = isChecked ? RadioOn : RadioOff;
33
+
34
+ return (
35
+ <label
36
+ className={cx('group flex flex-row gap-x-1 text-center', {
37
+ disabled: isDisabled,
38
+ 'cursor-pointer': !isDisabled,
39
+ })}
40
+ >
41
+ <div
42
+ className={cx('relative flex h-10 w-10 items-center justify-center rounded-full', {
43
+ 'state-layer': !isDisabled,
44
+ })}
45
+ >
46
+ <input
47
+ type="radio"
48
+ checked={isChecked}
49
+ onChange={onChange}
50
+ disabled={isDisabled}
51
+ className={cx('peer appearance-none disabled:opacity-40')}
52
+ />
53
+ <span
54
+ className="absolute
55
+ text-neutral-40 peer-checked:text-primary-30 peer-disabled:opacity-40 peer-checked:peer-disabled:text-neutral-40 dark:text-neutral-60 dark:peer-checked:peer-disabled:text-neutral-40 [&_svg]:h-6 [&_svg]:w-6
56
+ "
57
+ >
58
+ <RadioIcon />
59
+ </span>
60
+ </div>
61
+ <span className="inline-flex items-center justify-center text-label-lg text-neutral-40 group-[.disabled]:text-opacity-40 dark:text-neutral-60 group-[.disabled]:dark:text-opacity-40">
62
+ {label}
63
+ </span>
64
+ </label>
65
+ );
66
+ }
67
+
68
+ export { RadioButton };
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './RadioButton';
@@ -0,0 +1,28 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+
6
+ interface SecondaryTextProps {
7
+ /**
8
+ * The children to render.
9
+ */
10
+ children: React.ReactNode;
11
+ /**
12
+ * Should the text have error styles.
13
+ */
14
+ hasErrorStyles?: boolean;
15
+ }
16
+
17
+ export function SecondaryText({ children, hasErrorStyles }: SecondaryTextProps) {
18
+ const ERROR_STYLES = 'group-[.errored]:text-error-30 dark:group-[.errored]:text-error-80';
19
+ return (
20
+ <p
21
+ className={cx('text-label-lg text-neutral-40 dark:text-neutral-60 ', {
22
+ [ERROR_STYLES]: hasErrorStyles,
23
+ })}
24
+ >
25
+ {children}
26
+ </p>
27
+ );
28
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './SecondaryText';
@@ -0,0 +1,47 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+
6
+ interface SkeletonLoaderProps {
7
+ /**
8
+ * Width class for the skeleton div.
9
+ */
10
+ widthClass?: string;
11
+ /**
12
+ * Height class for the skeleton div.
13
+ */
14
+ heightClass?: string;
15
+ /**
16
+ * If true, the skeleton will use darker neutral colors.
17
+ */
18
+ hasSecondaryColors?: boolean;
19
+ /**
20
+ * Whether the class `rounded-full` should be applied. Defaults to true.
21
+ */
22
+ isRounded?: boolean;
23
+ }
24
+
25
+ export function Skeleton({
26
+ children,
27
+ widthClass = 'w-full',
28
+ heightClass = 'h-3',
29
+ hasSecondaryColors,
30
+ isRounded = true,
31
+ }: React.PropsWithChildren<SkeletonLoaderProps>): React.JSX.Element {
32
+ return (
33
+ <div
34
+ className={cx(
35
+ 'animate-pulse rounded-full',
36
+ widthClass,
37
+ heightClass,
38
+ isRounded && 'rounded-full',
39
+ hasSecondaryColors
40
+ ? 'bg-neutral-80 dark:bg-neutral-10'
41
+ : 'bg-neutral-90 dark:bg-neutral-12',
42
+ )}
43
+ >
44
+ {children}
45
+ </div>
46
+ );
47
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Skeleton';
@@ -0,0 +1,69 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { useEffect } from 'react';
5
+ import cx from 'classnames';
6
+ import { Close } from '@iota/apps-ui-icons';
7
+ import { SnackbarType } from './snackbar.enums';
8
+ import { BACKGROUND_COLOR, TEXT_COLOR } from './snackbar.classes';
9
+
10
+ type Renderable = JSX.Element | string | null;
11
+ export interface SnackbarProps {
12
+ /**
13
+ * The message to display in the snackbar.
14
+ */
15
+ text: Renderable;
16
+ /**
17
+ * Type of the snackbar.
18
+ */
19
+ type: SnackbarType;
20
+
21
+ /**
22
+ * Duration in milliseconds for the snackbar to auto close. `0` will make the component not close automatically.
23
+ */
24
+ duration?: number;
25
+
26
+ /**
27
+ * Callback to close the snackbar.
28
+ */
29
+ onClose: () => void;
30
+
31
+ /**
32
+ * Show the close button.
33
+ */
34
+ showClose?: boolean;
35
+ }
36
+
37
+ export function Snackbar({
38
+ text,
39
+ duration = 2000,
40
+ onClose,
41
+ showClose,
42
+ type = SnackbarType.Default,
43
+ }: SnackbarProps) {
44
+ useEffect(() => {
45
+ if (duration) {
46
+ const timer = setTimeout(onClose, duration);
47
+ return () => clearTimeout(timer);
48
+ }
49
+ }, [duration, onClose]);
50
+
51
+ return (
52
+ <div
53
+ className={cx(
54
+ 'transition-all duration-300 ease-out',
55
+ 'z-99 bottom-0',
56
+ 'flex w-full items-center justify-between gap-xxs rounded-md py-sm pl-md pr-sm',
57
+ BACKGROUND_COLOR[type],
58
+ )}
59
+ >
60
+ <div className={cx('w-full text-left text-body-md', TEXT_COLOR[type])}>{text}</div>
61
+ {showClose && (
62
+ <Close
63
+ className={cx('h-5 w-5 cursor-pointer', TEXT_COLOR[type])}
64
+ onClick={onClose}
65
+ />
66
+ )}
67
+ </div>
68
+ );
69
+ }
@@ -0,0 +1,5 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Snackbar';
5
+ export { SnackbarType } from './snackbar.enums';
@@ -0,0 +1,18 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { SnackbarType } from './snackbar.enums';
5
+
6
+ export const TEXT_COLOR: Record<SnackbarType, string> = {
7
+ [SnackbarType.Default]: 'text-neutral-10 dark:text-neutral-92',
8
+ [SnackbarType.Error]: 'text-error-20 dark:text-error-90',
9
+ [SnackbarType.Warning]: 'text-warning-10 dark:text-warning-90',
10
+ [SnackbarType.Success]: 'text-tertiary-20 dark:text-tertiary-90',
11
+ };
12
+
13
+ export const BACKGROUND_COLOR: Record<SnackbarType, string> = {
14
+ [SnackbarType.Default]: 'bg-primary-90 dark:bg-primary-10',
15
+ [SnackbarType.Error]: 'bg-error-90 dark:bg-error-10',
16
+ [SnackbarType.Warning]: 'bg-warning-90 dark:bg-warning-20',
17
+ [SnackbarType.Success]: 'bg-tertiary-90 dark:bg-tertiary-10',
18
+ };
@@ -0,0 +1,9 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export enum SnackbarType {
5
+ Default = 'default',
6
+ Error = 'error',
7
+ Warning = 'warning',
8
+ Success = 'success',
9
+ }
@@ -0,0 +1,140 @@
1
+ // Copyright (c) 2025 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { forwardRef, useRef } from 'react';
5
+ import { ToggleLabelPosition, ToggleSize } from './toggle.enums';
6
+ import {
7
+ TOGGLE,
8
+ TOGGLE_LABEL,
9
+ TOGGLE_SIZE,
10
+ TOGGLE_STATES,
11
+ TOGGLE_THUMB,
12
+ TOGGLE_THUMB_COLOR,
13
+ TOGGLE_THUMB_POSITION,
14
+ TOGGLE_THUMB_SIZE,
15
+ TOGGLE_CONTAINER,
16
+ } from './toggle.classes';
17
+ import cx from 'classnames';
18
+
19
+ interface ToggleProps {
20
+ /**
21
+ * The label for the toggle.
22
+ */
23
+ label?: string | React.ReactNode;
24
+ /**
25
+ * The state of the toggle (on or off).
26
+ */
27
+ isToggled: boolean;
28
+ /**
29
+ * Whether the label should be placed before the toggle.
30
+ */
31
+ labelPosition?: ToggleLabelPosition;
32
+ /**
33
+ * If true, the toggle will be disabled.
34
+ */
35
+ isDisabled?: boolean;
36
+ /**
37
+ * The callback to call when the toggle state changes.
38
+ */
39
+ onChange?: (isToggled: boolean, event: React.ChangeEvent<HTMLInputElement>) => void;
40
+ /**
41
+ * The name and id of the toggle input.
42
+ */
43
+ name?: string;
44
+ /**
45
+ * The size of the toggle.
46
+ */
47
+ size?: ToggleSize;
48
+ /**
49
+ * The 'data-testid' attribute value (used in e2e tests)
50
+ */
51
+ testId?: string;
52
+ }
53
+
54
+ export const Toggle = forwardRef<HTMLInputElement, ToggleProps>(
55
+ (
56
+ {
57
+ label,
58
+ isToggled,
59
+ labelPosition = ToggleLabelPosition.Right,
60
+ isDisabled = false,
61
+ onChange,
62
+ name,
63
+ size = ToggleSize.Default,
64
+ testId,
65
+ }: ToggleProps,
66
+ ref,
67
+ ) => {
68
+ const inputRef = useRef<HTMLInputElement | null>(null);
69
+
70
+ function handleChange(e: React.ChangeEvent<HTMLInputElement>) {
71
+ const newChecked = e.target.checked;
72
+ onChange?.(newChecked, e);
73
+ }
74
+
75
+ function assignRefs(element: HTMLInputElement) {
76
+ if (ref) {
77
+ if (typeof ref === 'function') {
78
+ ref(element);
79
+ } else {
80
+ ref.current = element;
81
+ }
82
+ }
83
+ inputRef.current = element;
84
+ }
85
+
86
+ const toggleClasses = cx(TOGGLE, {
87
+ [TOGGLE_STATES.active]: isToggled && !isDisabled,
88
+ [TOGGLE_STATES.inactive]: !isToggled,
89
+ [TOGGLE_STATES.disabledActive]: isDisabled && isToggled,
90
+ [TOGGLE_STATES.disabled]: isDisabled,
91
+ [TOGGLE_SIZE[size]]: true,
92
+ });
93
+
94
+ const thumbClasses = cx(TOGGLE_THUMB, {
95
+ [TOGGLE_THUMB_POSITION[size].unchecked]: !isToggled,
96
+ [TOGGLE_THUMB_POSITION[size].checked]: isToggled,
97
+ [TOGGLE_THUMB_COLOR.unchecked]: !isToggled,
98
+ [TOGGLE_THUMB_COLOR.checked]: isToggled,
99
+ [TOGGLE_THUMB_SIZE[size]]: true,
100
+ });
101
+
102
+ const containerClasses = cx(TOGGLE_CONTAINER, {
103
+ 'flex-row-reverse': labelPosition === ToggleLabelPosition.Left,
104
+ 'cursor-not-allowed': isDisabled,
105
+ });
106
+ const labelClasses = cx(TOGGLE_LABEL, {
107
+ 'opacity-40': isDisabled && !isToggled,
108
+ });
109
+
110
+ return (
111
+ <div className={containerClasses}>
112
+ <input
113
+ id={name}
114
+ name={name}
115
+ type="checkbox"
116
+ className="sr-only"
117
+ checked={isToggled}
118
+ ref={assignRefs}
119
+ disabled={isDisabled}
120
+ onChange={handleChange}
121
+ data-testid={testId}
122
+ />
123
+
124
+ <span
125
+ role="switch"
126
+ onClick={() => inputRef.current?.click()}
127
+ className={toggleClasses}
128
+ >
129
+ <span className={thumbClasses} />
130
+ </span>
131
+
132
+ {label && (
133
+ <label htmlFor={name} className={labelClasses}>
134
+ {label}
135
+ </label>
136
+ )}
137
+ </div>
138
+ );
139
+ },
140
+ );
@@ -0,0 +1,6 @@
1
+ // Copyright (c) 2025 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { Toggle } from './Toggle';
5
+
6
+ export * from './toggle.enums';