@iota/apps-ui-kit 0.0.0-dev-20251015065834

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 (243) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/LICENSE +201 -0
  3. package/README.md +16 -0
  4. package/dist/index.d.ts +1911 -0
  5. package/dist/index.es.js +6486 -0
  6. package/dist/index.es.js.map +1 -0
  7. package/dist/index.umd.js +66 -0
  8. package/dist/index.umd.js.map +1 -0
  9. package/dist/style.css +1 -0
  10. package/package.json +80 -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 +110 -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 +24 -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 +124 -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/image/Image.tsx +32 -0
  36. package/src/lib/components/atoms/image/index.ts +4 -0
  37. package/src/lib/components/atoms/index.ts +26 -0
  38. package/src/lib/components/atoms/info-box/InfoBox.tsx +68 -0
  39. package/src/lib/components/atoms/info-box/index.ts +5 -0
  40. package/src/lib/components/atoms/info-box/infoBox.classes.ts +18 -0
  41. package/src/lib/components/atoms/info-box/infoBox.enums.ts +14 -0
  42. package/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx +157 -0
  43. package/src/lib/components/atoms/key-value-info/index.ts +6 -0
  44. package/src/lib/components/atoms/key-value-info/keyValue.enums.ts +7 -0
  45. package/src/lib/components/atoms/label-text/LabelText.tsx +92 -0
  46. package/src/lib/components/atoms/label-text/index.ts +5 -0
  47. package/src/lib/components/atoms/label-text/labelText.classes.ts +22 -0
  48. package/src/lib/components/atoms/label-text/labelText.enums.ts +8 -0
  49. package/src/lib/components/atoms/list-item/ListItem.tsx +88 -0
  50. package/src/lib/components/atoms/list-item/index.ts +4 -0
  51. package/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx +38 -0
  52. package/src/lib/components/atoms/loading-indicator/index.ts +4 -0
  53. package/src/lib/components/atoms/media-fallback/MediaFallback.tsx +12 -0
  54. package/src/lib/components/atoms/media-fallback/index.ts +4 -0
  55. package/src/lib/components/atoms/panel/Panel.tsx +28 -0
  56. package/src/lib/components/atoms/panel/index.ts +4 -0
  57. package/src/lib/components/atoms/placeholder/Placeholder.tsx +27 -0
  58. package/src/lib/components/atoms/placeholder/index.ts +4 -0
  59. package/src/lib/components/atoms/radio-button/RadioButton.tsx +64 -0
  60. package/src/lib/components/atoms/radio-button/index.ts +4 -0
  61. package/src/lib/components/atoms/secondary-text/SecondaryText.tsx +29 -0
  62. package/src/lib/components/atoms/secondary-text/index.ts +4 -0
  63. package/src/lib/components/atoms/skeleton/Skeleton.tsx +30 -0
  64. package/src/lib/components/atoms/skeleton/index.ts +4 -0
  65. package/src/lib/components/atoms/snackbar/Snackbar.tsx +69 -0
  66. package/src/lib/components/atoms/snackbar/index.ts +5 -0
  67. package/src/lib/components/atoms/snackbar/snackbar.classes.ts +18 -0
  68. package/src/lib/components/atoms/snackbar/snackbar.enums.tsx +9 -0
  69. package/src/lib/components/atoms/toggle/Toggle.tsx +140 -0
  70. package/src/lib/components/atoms/toggle/index.ts +6 -0
  71. package/src/lib/components/atoms/toggle/toggle.classes.ts +41 -0
  72. package/src/lib/components/atoms/toggle/toggle.enums.ts +12 -0
  73. package/src/lib/components/atoms/tooltip/Tooltip.tsx +139 -0
  74. package/src/lib/components/atoms/tooltip/index.ts +5 -0
  75. package/src/lib/components/atoms/tooltip/tooltip.classes.ts +11 -0
  76. package/src/lib/components/atoms/tooltip/tooltip.enums.ts +9 -0
  77. package/src/lib/components/atoms/video/Video.tsx +33 -0
  78. package/src/lib/components/atoms/video/index.ts +4 -0
  79. package/src/lib/components/atoms/video/video.constants.ts +31 -0
  80. package/src/lib/components/index.ts +6 -0
  81. package/src/lib/components/molecules/account/Account.tsx +195 -0
  82. package/src/lib/components/molecules/account/index.ts +4 -0
  83. package/src/lib/components/molecules/address/Address.tsx +101 -0
  84. package/src/lib/components/molecules/address/index.ts +4 -0
  85. package/src/lib/components/molecules/asset-media-renderer/AssetMediaRenderer.tsx +50 -0
  86. package/src/lib/components/molecules/asset-media-renderer/index.ts +4 -0
  87. package/src/lib/components/molecules/card/Card.tsx +70 -0
  88. package/src/lib/components/molecules/card/CardAction.tsx +78 -0
  89. package/src/lib/components/molecules/card/CardBody.tsx +73 -0
  90. package/src/lib/components/molecules/card/CardImage.tsx +43 -0
  91. package/src/lib/components/molecules/card/CardImagePlaceholder.tsx +146 -0
  92. package/src/lib/components/molecules/card/card.classes.ts +27 -0
  93. package/src/lib/components/molecules/card/card.enums.ts +26 -0
  94. package/src/lib/components/molecules/card/index.ts +8 -0
  95. package/src/lib/components/molecules/chip/Chip.tsx +146 -0
  96. package/src/lib/components/molecules/chip/chip.classes.ts +54 -0
  97. package/src/lib/components/molecules/chip/chip.enums.ts +15 -0
  98. package/src/lib/components/molecules/chip/index.ts +5 -0
  99. package/src/lib/components/molecules/display-stats/DisplayStats.tsx +142 -0
  100. package/src/lib/components/molecules/display-stats/displayStats.classes.ts +36 -0
  101. package/src/lib/components/molecules/display-stats/displayStats.enums.ts +13 -0
  102. package/src/lib/components/molecules/display-stats/index.ts +5 -0
  103. package/src/lib/components/molecules/dropdown/Dropdown.tsx +10 -0
  104. package/src/lib/components/molecules/dropdown/dropdownPosition.enums.ts +7 -0
  105. package/src/lib/components/molecules/dropdown/index.ts +5 -0
  106. package/src/lib/components/molecules/index.ts +19 -0
  107. package/src/lib/components/molecules/input/Input.tsx +261 -0
  108. package/src/lib/components/molecules/input/InputWrapper.tsx +97 -0
  109. package/src/lib/components/molecules/input/TextArea.tsx +148 -0
  110. package/src/lib/components/molecules/input/index.ts +8 -0
  111. package/src/lib/components/molecules/input/input.classes.ts +13 -0
  112. package/src/lib/components/molecules/input/input.enums.ts +14 -0
  113. package/src/lib/components/molecules/input/input.types.ts +29 -0
  114. package/src/lib/components/molecules/navbar-item/NavbarItem.tsx +47 -0
  115. package/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx +65 -0
  116. package/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx +54 -0
  117. package/src/lib/components/molecules/navbar-item/index.ts +5 -0
  118. package/src/lib/components/molecules/navbar-item/navbarItem.classes.ts +16 -0
  119. package/src/lib/components/molecules/navbar-item/navbarItem.enums.ts +7 -0
  120. package/src/lib/components/molecules/search/Search.tsx +219 -0
  121. package/src/lib/components/molecules/search/index.ts +5 -0
  122. package/src/lib/components/molecules/search/search.classes.ts +20 -0
  123. package/src/lib/components/molecules/search/search.enums.ts +7 -0
  124. package/src/lib/components/molecules/segmented-button/SegmentedButton.tsx +38 -0
  125. package/src/lib/components/molecules/segmented-button/index.ts +6 -0
  126. package/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts +12 -0
  127. package/src/lib/components/molecules/segmented-button/segmentedButton.enums.ts +8 -0
  128. package/src/lib/components/molecules/select/Select.tsx +235 -0
  129. package/src/lib/components/molecules/select/index.ts +5 -0
  130. package/src/lib/components/molecules/select/select.enums.ts +7 -0
  131. package/src/lib/components/molecules/table-cell/TableCell.tsx +62 -0
  132. package/src/lib/components/molecules/table-cell/index.ts +4 -0
  133. package/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx +140 -0
  134. package/src/lib/components/molecules/table-header-cell/index.ts +5 -0
  135. package/src/lib/components/molecules/table-header-cell/tableHeaderCell.enums.ts +7 -0
  136. package/src/lib/components/molecules/title/Title.tsx +78 -0
  137. package/src/lib/components/molecules/title/index.ts +5 -0
  138. package/src/lib/components/molecules/title/titleClasses.constants.ts +14 -0
  139. package/src/lib/components/molecules/title/titleSize.enums.ts +7 -0
  140. package/src/lib/components/molecules/visual-asset-card/VisualAssetCard.tsx +89 -0
  141. package/src/lib/components/molecules/visual-asset-card/index.ts +5 -0
  142. package/src/lib/components/molecules/visual-asset-card/visualAssetCard.enums.ts +7 -0
  143. package/src/lib/components/organisms/accordion/Accordion.tsx +108 -0
  144. package/src/lib/components/organisms/accordion/accordion.classes.ts +4 -0
  145. package/src/lib/components/organisms/accordion/index.ts +4 -0
  146. package/src/lib/components/organisms/dialog/Dialog.tsx +157 -0
  147. package/src/lib/components/organisms/dialog/dialog.enums.ts +7 -0
  148. package/src/lib/components/organisms/dialog/index.ts +5 -0
  149. package/src/lib/components/organisms/index.ts +7 -0
  150. package/src/lib/components/organisms/navbar/Navbar.tsx +101 -0
  151. package/src/lib/components/organisms/navbar/NavbarSlideout.tsx +59 -0
  152. package/src/lib/components/organisms/navbar/index.ts +5 -0
  153. package/src/lib/components/organisms/table/Table.tsx +234 -0
  154. package/src/lib/components/organisms/table/TableContext.tsx +56 -0
  155. package/src/lib/components/organisms/table/index.ts +4 -0
  156. package/src/lib/constants/colors.constants.ts +239 -0
  157. package/src/lib/constants/index.ts +4 -0
  158. package/src/lib/enums/index.ts +5 -0
  159. package/src/lib/enums/screenSize.enums.ts +9 -0
  160. package/src/lib/enums/theme.enums.ts +8 -0
  161. package/src/lib/index.ts +10 -0
  162. package/src/lib/styles/base.css +144 -0
  163. package/src/lib/styles/components.css +735 -0
  164. package/src/lib/styles/fonts.css +7 -0
  165. package/src/lib/styles/index.css +18 -0
  166. package/src/lib/styles/utilities.css +61 -0
  167. package/src/lib/styles/variables/dark-variables.css +262 -0
  168. package/src/lib/styles/variables/general-variables.css +9 -0
  169. package/src/lib/styles/variables/light-variables.css +276 -0
  170. package/src/lib/styles/variables/names-variables.css +270 -0
  171. package/src/lib/tailwind/base.presets.ts +58 -0
  172. package/src/lib/tailwind/constants/customColors.constants.ts +13 -0
  173. package/src/lib/tailwind/constants/fontFamily.constants.ts +8 -0
  174. package/src/lib/tailwind/constants/fontSizes.constants.ts +201 -0
  175. package/src/lib/tailwind/constants/gradients.constants.ts +6 -0
  176. package/src/lib/tailwind/constants/index.ts +7 -0
  177. package/src/lib/tailwind/constants/scaling.constants.ts +41 -0
  178. package/src/lib/tailwind/constants/variableSpacing.constants.ts +66 -0
  179. package/src/lib/tailwind/helpers.ts +20 -0
  180. package/src/lib/tailwind/index.ts +5 -0
  181. package/src/lib/tailwind/plugins.ts +12 -0
  182. package/src/lib/tailwind/responsive.presets.ts +36 -0
  183. package/src/lib/tailwind/static.presets.ts +25 -0
  184. package/src/lib/tailwind/types.ts +6 -0
  185. package/src/lib/utils/format.ts +8 -0
  186. package/src/lib/utils/index.ts +4 -0
  187. package/src/storybook/blocks/Showcase.tsx +20 -0
  188. package/src/storybook/blocks/TypeSet.tsx +34 -0
  189. package/src/storybook/blocks/TypeSetItem.tsx +74 -0
  190. package/src/storybook/blocks/index.ts +6 -0
  191. package/src/storybook/constants/gradients.constants.ts +8 -0
  192. package/src/storybook/constants/index.ts +5 -0
  193. package/src/storybook/constants/typeset.constants.ts +39 -0
  194. package/src/storybook/constants/variableSpacing.constants.ts +6 -0
  195. package/src/storybook/helpers/formatGradientNames.ts +15 -0
  196. package/src/storybook/helpers/getFontSizeLabel.ts +15 -0
  197. package/src/storybook/helpers/index.ts +4 -0
  198. package/src/storybook/stories/atoms/Badge.stories.tsx +32 -0
  199. package/src/storybook/stories/atoms/Button.stories.tsx +45 -0
  200. package/src/storybook/stories/atoms/ButtonSegment.stories.tsx +45 -0
  201. package/src/storybook/stories/atoms/Checkbox.stories.tsx +34 -0
  202. package/src/storybook/stories/atoms/CustomScrollbar.stories.tsx +22 -0
  203. package/src/storybook/stories/atoms/Divider.stories.tsx +41 -0
  204. package/src/storybook/stories/atoms/Header.stories.tsx +58 -0
  205. package/src/storybook/stories/atoms/InfoBox.stories.tsx +67 -0
  206. package/src/storybook/stories/atoms/KeyValueInfo.stories.tsx +59 -0
  207. package/src/storybook/stories/atoms/LabelText.stories.tsx +55 -0
  208. package/src/storybook/stories/atoms/ListItem.stories.tsx +41 -0
  209. package/src/storybook/stories/atoms/LoadingIndicator.stories.tsx +32 -0
  210. package/src/storybook/stories/atoms/Panel.stories.tsx +36 -0
  211. package/src/storybook/stories/atoms/Placeholder.stories.tsx +33 -0
  212. package/src/storybook/stories/atoms/RadioButton.stories.tsx +51 -0
  213. package/src/storybook/stories/atoms/Skeleton.stories.tsx +33 -0
  214. package/src/storybook/stories/atoms/Snackbar.stories.tsx +43 -0
  215. package/src/storybook/stories/atoms/Toggle.stories.tsx +59 -0
  216. package/src/storybook/stories/atoms/Tooltip.stories.tsx +59 -0
  217. package/src/storybook/stories/atoms/VisualAssetCard.stories.tsx +57 -0
  218. package/src/storybook/stories/components/DocsSyncTheme.tsx +20 -0
  219. package/src/storybook/stories/components/VariableSpacingShowcase.tsx +46 -0
  220. package/src/storybook/stories/components/index.ts +5 -0
  221. package/src/storybook/stories/design-tokens/colors.stories.mdx +44 -0
  222. package/src/storybook/stories/design-tokens/icons.stories.mdx +19 -0
  223. package/src/storybook/stories/design-tokens/typeset.stories.mdx +17 -0
  224. package/src/storybook/stories/design-tokens/variable-spacing.stories.mdx +11 -0
  225. package/src/storybook/stories/molecules/Account.stories.tsx +71 -0
  226. package/src/storybook/stories/molecules/Address.stories.tsx +39 -0
  227. package/src/storybook/stories/molecules/Card.stories.tsx +112 -0
  228. package/src/storybook/stories/molecules/Chip.stories.tsx +127 -0
  229. package/src/storybook/stories/molecules/DisplayStats.stories.tsx +63 -0
  230. package/src/storybook/stories/molecules/Dropdown.stories.tsx +38 -0
  231. package/src/storybook/stories/molecules/Input.stories.tsx +239 -0
  232. package/src/storybook/stories/molecules/NavbarItem.stories.tsx +45 -0
  233. package/src/storybook/stories/molecules/Search.stories.tsx +101 -0
  234. package/src/storybook/stories/molecules/SegmentedButton.stories.tsx +108 -0
  235. package/src/storybook/stories/molecules/Select.stories.tsx +103 -0
  236. package/src/storybook/stories/molecules/TableCell.stories.tsx +46 -0
  237. package/src/storybook/stories/molecules/TableHeaderCell.stories.tsx +34 -0
  238. package/src/storybook/stories/molecules/TextArea.stories.tsx +80 -0
  239. package/src/storybook/stories/molecules/Title.stories.tsx +76 -0
  240. package/src/storybook/stories/organisms/Accordion.stories.tsx +70 -0
  241. package/src/storybook/stories/organisms/Dialog.stories.tsx +129 -0
  242. package/src/storybook/stories/organisms/Navbar.stories.tsx +78 -0
  243. package/src/storybook/stories/organisms/Table.stories.tsx +154 -0
@@ -0,0 +1,124 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { forwardRef, useEffect, useRef } from 'react';
5
+ import cx from 'classnames';
6
+ import { Dash, Checkmark } from '@iota/apps-ui-icons';
7
+
8
+ interface CheckboxProps {
9
+ /**
10
+ * The label of the checkbox.
11
+ */
12
+ label?: string | React.ReactNode;
13
+ /**
14
+ * The state of the checkbox.
15
+ */
16
+ isChecked?: boolean;
17
+ /**
18
+ * If true the checkbox will override the styles to show an indeterminate state.
19
+ */
20
+ isIndeterminate?: boolean;
21
+ /**
22
+ * Whether the label should be placed before the checkbox.
23
+ */
24
+ isLabelFirst?: boolean;
25
+ /**
26
+ * If true the checkbox will be disabled.
27
+ */
28
+ isDisabled?: boolean;
29
+ /**
30
+ * The callback to call when the checkbox is clicked.
31
+ */
32
+ onCheckedChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
33
+ /**
34
+ * The name of the checkbox.
35
+ */
36
+ name?: string;
37
+ }
38
+
39
+ export const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
40
+ (
41
+ {
42
+ isChecked,
43
+ isIndeterminate,
44
+ label,
45
+ isLabelFirst,
46
+ isDisabled,
47
+ onCheckedChange,
48
+ name,
49
+ }: CheckboxProps,
50
+ ref,
51
+ ) => {
52
+ const inputRef = useRef<HTMLInputElement | null>(null);
53
+
54
+ useEffect(() => {
55
+ if (inputRef.current) {
56
+ inputRef.current.indeterminate = isIndeterminate ?? false;
57
+ }
58
+ }, [isIndeterminate, inputRef]);
59
+
60
+ const CheckmarkIcon = isIndeterminate ? Dash : Checkmark;
61
+
62
+ function assignRefs(element: HTMLInputElement) {
63
+ if (ref) {
64
+ if (typeof ref === 'function') {
65
+ ref(element);
66
+ } else {
67
+ ref.current = element;
68
+ }
69
+ }
70
+ inputRef.current = element;
71
+ }
72
+
73
+ return (
74
+ <div
75
+ className={cx(
76
+ 'group inline-flex has-[:disabled]:opacity-40',
77
+ isLabelFirst ? 'flex-row-reverse' : 'flex-row',
78
+ {
79
+ disabled: isDisabled,
80
+ 'gap-x-2': label,
81
+ },
82
+ )}
83
+ >
84
+ <input
85
+ id={name}
86
+ name={name}
87
+ type="checkbox"
88
+ className="peer hidden appearance-none"
89
+ checked={isChecked}
90
+ ref={assignRefs}
91
+ disabled={isDisabled}
92
+ onChange={(e) => {
93
+ onCheckedChange?.(e);
94
+ }}
95
+ />
96
+ <span
97
+ onClick={() => inputRef.current?.click()}
98
+ className={cx(
99
+ 'checkbox-base checkbox-state checkbox-icon checkbox-icon-hidden',
100
+ 'checkbox-border-default',
101
+ 'peer-[&:is(:checked,:indeterminate)]:checkbox-border-checked',
102
+ 'peer-[&:is(:checked,:indeterminate)]:checkbox-bg-checked',
103
+ 'peer-[&:is(:checked,:indeterminate)]:checkbox-text-checked',
104
+ 'peer-disabled:peer-[&:not(:checked,:indeterminate)]:checkbox-border-color-disabled',
105
+ 'peer-disabled:peer-[&:is(:checked,:indeterminate)]:checkbox-border-color-disabled-checked',
106
+ 'peer-disabled:peer-[&:is(:checked,:indeterminate)]:checkbox-bg-color-disabled-checked',
107
+ )}
108
+ >
109
+ <CheckmarkIcon />
110
+ </span>
111
+
112
+ <LabelText label={label} name={name} />
113
+ </div>
114
+ );
115
+ },
116
+ );
117
+
118
+ function LabelText({ label, name }: Pick<CheckboxProps, 'label' | 'name'>) {
119
+ return (
120
+ <label htmlFor={name} className="checkbox-label checkbox-label-disabled">
121
+ {label}
122
+ </label>
123
+ );
124
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Checkbox';
@@ -0,0 +1,48 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { DividerType } from './divider.enums';
5
+ import cx from 'classnames';
6
+ import { BACKGROUND_COLORS, DIVIDER_FULL_WIDTH } from './divider.classes';
7
+
8
+ const DEFAULT_LINE_HEIGHT = '1px';
9
+
10
+ interface DividerProps {
11
+ /**
12
+ * The type of the divider
13
+ */
14
+ type?: DividerType;
15
+ /**
16
+ * The width of the divider.
17
+ */
18
+ width?: string;
19
+ /**
20
+ * The height of the divider.
21
+ */
22
+ height?: string;
23
+ /**
24
+ * The line height of the divider.
25
+ */
26
+ lineHeight?: string;
27
+ }
28
+
29
+ export function Divider({
30
+ type = DividerType.Horizontal,
31
+ width,
32
+ height,
33
+ lineHeight = DEFAULT_LINE_HEIGHT,
34
+ }: DividerProps): React.JSX.Element {
35
+ // Set height and width of divider line based on type
36
+ const lineStyle = {
37
+ ...(type === DividerType.Horizontal ? { height: lineHeight } : { width: lineHeight }),
38
+ };
39
+
40
+ let dividerSize = DIVIDER_FULL_WIDTH[type];
41
+ if (width && type === DividerType.Horizontal) {
42
+ dividerSize = width;
43
+ } else if (height && type === DividerType.Vertical) {
44
+ dividerSize = height;
45
+ }
46
+
47
+ return <div className={cx(BACKGROUND_COLORS, dividerSize)} style={lineStyle} />;
48
+ }
@@ -0,0 +1,11 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { DividerType } from './divider.enums';
5
+
6
+ export const BACKGROUND_COLORS = 'divider-bg-color';
7
+
8
+ export const DIVIDER_FULL_WIDTH: Record<DividerType, string> = {
9
+ [DividerType.Horizontal]: 'w-full',
10
+ [DividerType.Vertical]: 'h-full',
11
+ };
@@ -0,0 +1,7 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export enum DividerType {
5
+ Vertical = 'vertical',
6
+ Horizontal = 'horizontal',
7
+ }
@@ -0,0 +1,6 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Divider';
5
+
6
+ export * from './divider.enums';
@@ -0,0 +1,73 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import cx from 'classnames';
5
+ import { Button, ButtonSize, ButtonType } from '../button';
6
+ import { ArrowBack, Close } from '@iota/apps-ui-icons';
7
+
8
+ interface HeaderProps {
9
+ /**
10
+ * Header title.
11
+ */
12
+ title: string;
13
+ /**
14
+ * Title alignment (optional).
15
+ */
16
+ titleCentered?: boolean;
17
+ /**
18
+ * On back click handler (optional). If provided, a back button will be displayed.
19
+ */
20
+ onBack?: () => void;
21
+ /**
22
+ * On close click handler (optional). If provided, a close button will be displayed.
23
+ */
24
+ onClose?: (() => void) | ((e: React.MouseEvent<HTMLElement>) => void);
25
+ /**
26
+ * The 'data-testid' attribute value (used in e2e tests)
27
+ */
28
+ testId?: string;
29
+ }
30
+
31
+ export function Header({
32
+ title,
33
+ titleCentered,
34
+ onBack,
35
+ onClose,
36
+ testId,
37
+ }: HeaderProps): JSX.Element {
38
+ const titleCenteredClasses = titleCentered ? 'text-center' : onBack ? 'ml-1' : '';
39
+ const keepSpaceForIcon = titleCentered && (!onBack || !onClose);
40
+
41
+ return (
42
+ <div className="header-bg-color header-text-color flex min-h-[56px] w-full items-center px-md--rs pb-xs pt-sm [&_svg]:h-5 [&_svg]:w-5">
43
+ {onBack ? (
44
+ <Button
45
+ size={ButtonSize.Small}
46
+ type={ButtonType.Ghost}
47
+ onClick={onBack}
48
+ icon={<ArrowBack />}
49
+ />
50
+ ) : (
51
+ keepSpaceForIcon && <div className="w-9" />
52
+ )}
53
+
54
+ <div className={cx('flex-grow', titleCenteredClasses)}>
55
+ <span className="font-inter text-title-lg" data-testid={testId}>
56
+ {title}
57
+ </span>
58
+ </div>
59
+
60
+ {onClose ? (
61
+ <Button
62
+ size={ButtonSize.Small}
63
+ type={ButtonType.Ghost}
64
+ onClick={onClose}
65
+ icon={<Close />}
66
+ testId={`close-icon`}
67
+ />
68
+ ) : (
69
+ keepSpaceForIcon && <div className="w-9" />
70
+ )}
71
+ </div>
72
+ );
73
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Header';
@@ -0,0 +1,32 @@
1
+ // Copyright (c) 2025 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { forwardRef, useState } from 'react';
5
+ import { MediaFallback } from '../media-fallback';
6
+
7
+ export interface ImageWithFallbackProps extends React.ImgHTMLAttributes<HTMLImageElement> {
8
+ renderFallback?: React.ReactNode;
9
+ }
10
+
11
+ export const ImageWithFallback = forwardRef<HTMLImageElement, ImageWithFallbackProps>(
12
+ ({ onError, renderFallback: fallback, ...imageProps }, ref) => {
13
+ const [imageError, setImageError] = useState(false);
14
+
15
+ function handleImageError(error: React.SyntheticEvent<HTMLImageElement, Event>) {
16
+ setImageError(true);
17
+ onError?.(error);
18
+ }
19
+
20
+ if (imageError || !imageProps.src) {
21
+ return fallback ? fallback : <MediaFallback />;
22
+ }
23
+
24
+ return <Image onError={handleImageError} ref={ref} {...imageProps} />;
25
+ },
26
+ );
27
+
28
+ export const Image = forwardRef<HTMLImageElement, React.ImgHTMLAttributes<HTMLImageElement>>(
29
+ (imageProps, ref) => {
30
+ return <img className="h-full w-full object-cover" ref={ref} {...imageProps} />;
31
+ },
32
+ );
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2025 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './Image';
@@ -0,0 +1,26 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './badge';
5
+ export * from './button';
6
+ export * from './radio-button';
7
+ export * from './button-segment';
8
+ export * from './button';
9
+ export * from './checkbox';
10
+ export * from './divider';
11
+ export * from './key-value-info';
12
+ export * from './label-text';
13
+ export * from './list-item';
14
+ export * from './header';
15
+ export * from './panel';
16
+ export * from './media-fallback';
17
+ export * from './image';
18
+ export * from './tooltip';
19
+ export * from './info-box';
20
+ export * from './snackbar';
21
+ export * from './loading-indicator';
22
+ export * from './placeholder';
23
+ export * from './skeleton';
24
+ export * from './video';
25
+ export * from './toggle';
26
+ export * from './secondary-text';
@@ -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 type { InfoBoxType } from './infoBox.enums';
6
+ import { InfoBoxStyle } from './infoBox.enums';
7
+ import { BACKGROUND_COLORS, ICON_COLORS } from './infoBox.classes';
8
+
9
+ export interface InfoBoxProps {
10
+ /**
11
+ * The icon of the info box (optional).
12
+ */
13
+ icon?: React.ReactNode;
14
+ /**
15
+ * The title of the info box (optional).
16
+ */
17
+ title?: string;
18
+ /**
19
+ * The supporting text of the info box (optional).
20
+ */
21
+ supportingText?: React.ReactNode;
22
+ /**
23
+ * The type of the info box.
24
+ */
25
+ type: InfoBoxType;
26
+ /**
27
+ * The style of the info box.
28
+ */
29
+ style?: InfoBoxStyle;
30
+ }
31
+
32
+ export function InfoBox({
33
+ icon,
34
+ title,
35
+ supportingText,
36
+ type,
37
+ style,
38
+ }: InfoBoxProps): React.JSX.Element {
39
+ const iconColorClass = ICON_COLORS[type];
40
+ const backgroundClass = style === InfoBoxStyle.Elevated ? BACKGROUND_COLORS[type] : '';
41
+ return (
42
+ <div
43
+ className={cx('flex flex-row items-start gap-4 py-xs pr-lg', backgroundClass, {
44
+ 'rounded-lg pl-xs': style === InfoBoxStyle.Elevated,
45
+ })}
46
+ >
47
+ {icon && (
48
+ <span
49
+ className={cx(
50
+ 'flex items-center justify-center rounded-lg [&_svg]:h-4 [&_svg]:w-4',
51
+ iconColorClass,
52
+ {
53
+ 'p-xs': style === InfoBoxStyle.Default,
54
+ },
55
+ )}
56
+ >
57
+ {icon}
58
+ </span>
59
+ )}
60
+ <div className="flex flex-col gap-1">
61
+ {title && <span className="infobox-text-title text-title-sm">{title}</span>}
62
+ {supportingText && (
63
+ <span className="infobox-supporting-text text-body-sm">{supportingText}</span>
64
+ )}
65
+ </div>
66
+ </div>
67
+ );
68
+ }
@@ -0,0 +1,5 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './InfoBox';
5
+ export * from './infoBox.enums';
@@ -0,0 +1,18 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { InfoBoxType } from './infoBox.enums';
5
+
6
+ export const ICON_COLORS: Record<InfoBoxType, string> = {
7
+ [InfoBoxType.Default]: 'bg-default-surface text-on-default',
8
+ [InfoBoxType.Error]: 'bg-error-surface text-on-error',
9
+ [InfoBoxType.Success]: 'bg-success-surface text-on-success',
10
+ [InfoBoxType.Warning]: 'bg-warning-surface text-on-warning',
11
+ };
12
+
13
+ export const BACKGROUND_COLORS: Record<InfoBoxType, string> = {
14
+ [InfoBoxType.Default]: 'bg-default-surface',
15
+ [InfoBoxType.Error]: 'bg-error-surface',
16
+ [InfoBoxType.Success]: 'bg-success-surface',
17
+ [InfoBoxType.Warning]: 'bg-warning-surface',
18
+ };
@@ -0,0 +1,14 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export enum InfoBoxType {
5
+ Default = 'default',
6
+ Error = 'error',
7
+ Success = 'success',
8
+ Warning = 'warning',
9
+ }
10
+
11
+ export enum InfoBoxStyle {
12
+ Default = 'default',
13
+ Elevated = 'elevated',
14
+ }
@@ -0,0 +1,157 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { ReactNode } from 'react';
5
+ import cx from 'classnames';
6
+ import { Copy, Info } from '@iota/apps-ui-icons';
7
+ import { ValueSize } from './keyValue.enums';
8
+ import type { TooltipPosition } from '../tooltip';
9
+ import { Tooltip } from '../tooltip';
10
+ import { ButtonUnstyled } from '../button';
11
+
12
+ interface KeyValueProps {
13
+ /**
14
+ * The key of the KeyValue.
15
+ */
16
+ keyText: string;
17
+ /**
18
+ * The value of the KeyValue.
19
+ */
20
+ value: ReactNode;
21
+ /**
22
+ * The tooltip position.
23
+ */
24
+ tooltipPosition?: TooltipPosition;
25
+ /**
26
+ * The tooltip text.
27
+ */
28
+ tooltipText?: string;
29
+ /**
30
+ * The supporting label of the KeyValue (optional).
31
+ */
32
+ supportingLabel?: string;
33
+ /**
34
+ * The size of the value (optional).
35
+ */
36
+ size?: ValueSize;
37
+ /**
38
+ * The flag to truncate the value text.
39
+ */
40
+ isTruncated?: boolean;
41
+ /**
42
+ * Text that need to be copied (optional).
43
+ */
44
+ copyText?: string;
45
+ /**
46
+ * The onCopySuccess event of the KeyValue (optional).
47
+ */
48
+ onCopySuccess?: (e: React.MouseEvent<HTMLButtonElement>, text: string) => void;
49
+ /**
50
+ * The onCopyError event of the KeyValue (optional).
51
+ */
52
+ onCopyError?: (e: unknown, text: string) => void;
53
+ /**
54
+ * Full width KeyValue (optional).
55
+ */
56
+ fullwidth?: boolean;
57
+ /**
58
+ * Reverse the KeyValue (optional).
59
+ */
60
+ isReverse?: boolean;
61
+ /**
62
+ * Text shown on value hover.
63
+ */
64
+ valueHoverTitle?: string;
65
+ }
66
+
67
+ export function KeyValueInfo({
68
+ keyText,
69
+ value,
70
+ tooltipPosition,
71
+ tooltipText,
72
+ supportingLabel,
73
+ size = ValueSize.Small,
74
+ isTruncated = false,
75
+ copyText,
76
+ onCopySuccess,
77
+ onCopyError,
78
+ fullwidth,
79
+ isReverse = false,
80
+ valueHoverTitle,
81
+ }: KeyValueProps): React.JSX.Element {
82
+ const flexDirectionClass = isReverse ? 'flex-row-reverse' : 'flex-row';
83
+ async function handleCopyClick(event: React.MouseEvent<HTMLButtonElement>) {
84
+ if (!navigator.clipboard) {
85
+ return;
86
+ }
87
+
88
+ if (copyText) {
89
+ try {
90
+ await navigator.clipboard.writeText(copyText);
91
+ onCopySuccess?.(event, copyText);
92
+ } catch (error) {
93
+ console.error('Failed to copy:', error);
94
+ onCopyError?.(error, copyText);
95
+ }
96
+ }
97
+ }
98
+
99
+ return (
100
+ <div
101
+ className={cx(
102
+ 'flex w-full items-baseline gap-xs py-xxs font-inter',
103
+ flexDirectionClass,
104
+ {
105
+ 'justify-between': fullwidth,
106
+ },
107
+ )}
108
+ >
109
+ <div
110
+ className={cx('flex shrink-0 flex-row items-center gap-x-0.5', {
111
+ 'w-1/4': !fullwidth,
112
+ })}
113
+ >
114
+ <span className="key-value-key-text-color text-body-md">{keyText}</span>
115
+ {tooltipText && (
116
+ <Tooltip text={tooltipText} position={tooltipPosition}>
117
+ <Info className="key-supporting-text-color" />
118
+ </Tooltip>
119
+ )}
120
+ </div>
121
+ <div
122
+ className={cx('flex flex-row items-baseline gap-1 break-all', {
123
+ 'w-3/4': !fullwidth,
124
+ truncate: isTruncated,
125
+ })}
126
+ >
127
+ <span
128
+ title={valueHoverTitle}
129
+ className={cx(
130
+ 'key-value-hover-text-color',
131
+ size === ValueSize.Medium ? 'text-body-lg' : 'text-body-md',
132
+ { truncate: isTruncated },
133
+ )}
134
+ >
135
+ {value}
136
+ </span>
137
+ {supportingLabel && (
138
+ <span
139
+ className={cx(
140
+ 'key-supporting-text-color',
141
+ size === ValueSize.Medium ? 'text-body-md' : 'text-body-sm',
142
+ )}
143
+ >
144
+ {supportingLabel}
145
+ </span>
146
+ )}
147
+ <div className="self-center">
148
+ {copyText && (
149
+ <ButtonUnstyled onClick={handleCopyClick}>
150
+ <Copy className="key-supporting-text-color" />
151
+ </ButtonUnstyled>
152
+ )}
153
+ </div>
154
+ </div>
155
+ </div>
156
+ );
157
+ }
@@ -0,0 +1,6 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './KeyValueInfo';
5
+
6
+ export * from './keyValue.enums';
@@ -0,0 +1,7 @@
1
+ // Copyright (c) 2024 IOTA Stiftung
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export enum ValueSize {
5
+ Small = 'small',
6
+ Medium = 'medium',
7
+ }