@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.
- package/CHANGELOG.md +106 -0
- package/LICENSE +201 -0
- package/README.md +16 -0
- package/dist/index.d.ts +1726 -0
- package/dist/index.es.js +6923 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +118 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +75 -0
- package/src/lib/components/atoms/badge/Badge.tsx +37 -0
- package/src/lib/components/atoms/badge/badge.classes.ts +33 -0
- package/src/lib/components/atoms/badge/badge.enums.ts +11 -0
- package/src/lib/components/atoms/badge/index.ts +6 -0
- package/src/lib/components/atoms/button/Button.tsx +99 -0
- package/src/lib/components/atoms/button/button-variants/ButtonPill.tsx +23 -0
- package/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx +27 -0
- package/src/lib/components/atoms/button/button-variants/buttonVariants.types.ts +11 -0
- package/src/lib/components/atoms/button/button-variants/index.ts +5 -0
- package/src/lib/components/atoms/button/button.classes.ts +53 -0
- package/src/lib/components/atoms/button/button.enums.ts +21 -0
- package/src/lib/components/atoms/button/index.ts +7 -0
- package/src/lib/components/atoms/button-segment/ButtonSegment.tsx +98 -0
- package/src/lib/components/atoms/button-segment/buttonSegment.classes.ts +45 -0
- package/src/lib/components/atoms/button-segment/buttonSegment.enums.ts +7 -0
- package/src/lib/components/atoms/button-segment/index.ts +5 -0
- package/src/lib/components/atoms/checkbox/Checkbox.tsx +114 -0
- package/src/lib/components/atoms/checkbox/index.ts +4 -0
- package/src/lib/components/atoms/divider/Divider.tsx +48 -0
- package/src/lib/components/atoms/divider/divider.classes.ts +11 -0
- package/src/lib/components/atoms/divider/divider.enums.ts +7 -0
- package/src/lib/components/atoms/divider/index.ts +6 -0
- package/src/lib/components/atoms/header/Header.tsx +73 -0
- package/src/lib/components/atoms/header/index.ts +4 -0
- package/src/lib/components/atoms/index.ts +23 -0
- package/src/lib/components/atoms/info-box/InfoBox.tsx +74 -0
- package/src/lib/components/atoms/info-box/index.ts +5 -0
- package/src/lib/components/atoms/info-box/infoBox.classes.ts +19 -0
- package/src/lib/components/atoms/info-box/infoBox.enums.ts +14 -0
- package/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx +157 -0
- package/src/lib/components/atoms/key-value-info/index.ts +6 -0
- package/src/lib/components/atoms/key-value-info/keyValue.enums.ts +7 -0
- package/src/lib/components/atoms/label-text/LabelText.tsx +94 -0
- package/src/lib/components/atoms/label-text/index.ts +5 -0
- package/src/lib/components/atoms/label-text/labelText.classes.ts +22 -0
- package/src/lib/components/atoms/label-text/labelText.enums.ts +8 -0
- package/src/lib/components/atoms/list-item/ListItem.tsx +89 -0
- package/src/lib/components/atoms/list-item/index.ts +4 -0
- package/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx +38 -0
- package/src/lib/components/atoms/loading-indicator/index.ts +4 -0
- package/src/lib/components/atoms/panel/Panel.tsx +30 -0
- package/src/lib/components/atoms/panel/index.ts +4 -0
- package/src/lib/components/atoms/placeholder/Placeholder.tsx +27 -0
- package/src/lib/components/atoms/placeholder/index.ts +4 -0
- package/src/lib/components/atoms/radio-button/RadioButton.tsx +68 -0
- package/src/lib/components/atoms/radio-button/index.ts +4 -0
- package/src/lib/components/atoms/secondary-text/SecondaryText.tsx +28 -0
- package/src/lib/components/atoms/secondary-text/index.ts +4 -0
- package/src/lib/components/atoms/skeleton/Skeleton.tsx +47 -0
- package/src/lib/components/atoms/skeleton/index.ts +4 -0
- package/src/lib/components/atoms/snackbar/Snackbar.tsx +69 -0
- package/src/lib/components/atoms/snackbar/index.ts +5 -0
- package/src/lib/components/atoms/snackbar/snackbar.classes.ts +18 -0
- package/src/lib/components/atoms/snackbar/snackbar.enums.tsx +9 -0
- package/src/lib/components/atoms/toggle/Toggle.tsx +140 -0
- package/src/lib/components/atoms/toggle/index.ts +6 -0
- package/src/lib/components/atoms/toggle/toggle.classes.ts +41 -0
- package/src/lib/components/atoms/toggle/toggle.enums.ts +12 -0
- package/src/lib/components/atoms/tooltip/Tooltip.tsx +138 -0
- package/src/lib/components/atoms/tooltip/index.ts +5 -0
- package/src/lib/components/atoms/tooltip/tooltip.classes.ts +11 -0
- package/src/lib/components/atoms/tooltip/tooltip.enums.ts +9 -0
- package/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx +101 -0
- package/src/lib/components/atoms/visual-asset-card/index.ts +5 -0
- package/src/lib/components/atoms/visual-asset-card/visualAssetCard.enums.ts +7 -0
- package/src/lib/components/index.ts +8 -0
- package/src/lib/components/molecules/account/Account.tsx +192 -0
- package/src/lib/components/molecules/account/index.ts +4 -0
- package/src/lib/components/molecules/address/Address.tsx +101 -0
- package/src/lib/components/molecules/address/index.ts +4 -0
- package/src/lib/components/molecules/card/Card.tsx +70 -0
- package/src/lib/components/molecules/card/CardAction.tsx +80 -0
- package/src/lib/components/molecules/card/CardBody.tsx +72 -0
- package/src/lib/components/molecules/card/CardImage.tsx +43 -0
- package/src/lib/components/molecules/card/CardImagePlaceholder.tsx +146 -0
- package/src/lib/components/molecules/card/card.classes.ts +27 -0
- package/src/lib/components/molecules/card/card.enums.ts +26 -0
- package/src/lib/components/molecules/card/index.ts +8 -0
- package/src/lib/components/molecules/chip/Chip.tsx +105 -0
- package/src/lib/components/molecules/chip/chip.classes.ts +32 -0
- package/src/lib/components/molecules/chip/chip.enums.ts +7 -0
- package/src/lib/components/molecules/chip/index.ts +4 -0
- package/src/lib/components/molecules/display-stats/DisplayStats.tsx +142 -0
- package/src/lib/components/molecules/display-stats/displayStats.classes.ts +36 -0
- package/src/lib/components/molecules/display-stats/displayStats.enums.ts +13 -0
- package/src/lib/components/molecules/display-stats/index.ts +5 -0
- package/src/lib/components/molecules/dropdown/Dropdown.tsx +10 -0
- package/src/lib/components/molecules/dropdown/dropdownPosition.enums.ts +7 -0
- package/src/lib/components/molecules/dropdown/index.ts +5 -0
- package/src/lib/components/molecules/index.ts +17 -0
- package/src/lib/components/molecules/input/Input.tsx +246 -0
- package/src/lib/components/molecules/input/InputWrapper.tsx +97 -0
- package/src/lib/components/molecules/input/TextArea.tsx +150 -0
- package/src/lib/components/molecules/input/index.ts +8 -0
- package/src/lib/components/molecules/input/input.classes.ts +14 -0
- package/src/lib/components/molecules/input/input.enums.ts +14 -0
- package/src/lib/components/molecules/input/input.types.ts +29 -0
- package/src/lib/components/molecules/navbar-item/NavbarItem.tsx +48 -0
- package/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx +65 -0
- package/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx +54 -0
- package/src/lib/components/molecules/navbar-item/index.ts +5 -0
- package/src/lib/components/molecules/navbar-item/navbarItem.classes.ts +16 -0
- package/src/lib/components/molecules/navbar-item/navbarItem.enums.ts +7 -0
- package/src/lib/components/molecules/search/Search.tsx +216 -0
- package/src/lib/components/molecules/search/index.ts +5 -0
- package/src/lib/components/molecules/search/search.classes.ts +20 -0
- package/src/lib/components/molecules/search/search.enums.ts +7 -0
- package/src/lib/components/molecules/segmented-button/SegmentedButton.tsx +38 -0
- package/src/lib/components/molecules/segmented-button/index.ts +6 -0
- package/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts +12 -0
- package/src/lib/components/molecules/segmented-button/segmentedButton.enums.ts +8 -0
- package/src/lib/components/molecules/select/Select.tsx +222 -0
- package/src/lib/components/molecules/select/index.ts +5 -0
- package/src/lib/components/molecules/select/select.enums.ts +7 -0
- package/src/lib/components/molecules/table-cell/TableCell.tsx +62 -0
- package/src/lib/components/molecules/table-cell/index.ts +4 -0
- package/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx +140 -0
- package/src/lib/components/molecules/table-header-cell/index.ts +5 -0
- package/src/lib/components/molecules/table-header-cell/tableHeaderCell.enums.ts +7 -0
- package/src/lib/components/molecules/title/Title.tsx +78 -0
- package/src/lib/components/molecules/title/index.ts +5 -0
- package/src/lib/components/molecules/title/titleClasses.constants.ts +14 -0
- package/src/lib/components/molecules/title/titleSize.enums.ts +7 -0
- package/src/lib/components/organisms/accordion/Accordion.tsx +109 -0
- package/src/lib/components/organisms/accordion/accordion.classes.ts +4 -0
- package/src/lib/components/organisms/accordion/index.ts +4 -0
- package/src/lib/components/organisms/dialog/Dialog.tsx +142 -0
- package/src/lib/components/organisms/dialog/dialog.enums.ts +7 -0
- package/src/lib/components/organisms/dialog/index.ts +5 -0
- package/src/lib/components/organisms/index.ts +7 -0
- package/src/lib/components/organisms/navbar/Navbar.tsx +101 -0
- package/src/lib/components/organisms/navbar/NavbarSlideout.tsx +59 -0
- package/src/lib/components/organisms/navbar/index.ts +5 -0
- package/src/lib/components/organisms/table/Table.tsx +234 -0
- package/src/lib/components/organisms/table/TableContext.tsx +56 -0
- package/src/lib/components/organisms/table/index.ts +4 -0
- package/src/lib/constants/colors.constants.ts +133 -0
- package/src/lib/constants/index.ts +4 -0
- package/src/lib/enums/index.ts +4 -0
- package/src/lib/enums/screenSize.enums.ts +9 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/styles/fonts.css +5 -0
- package/src/lib/styles/index.css +149 -0
- package/src/lib/tailwind/base.presets.ts +49 -0
- package/src/lib/tailwind/constants/fontSizes.constants.ts +201 -0
- package/src/lib/tailwind/constants/index.ts +6 -0
- package/src/lib/tailwind/constants/scaling.constants.ts +41 -0
- package/src/lib/tailwind/constants/variableSpacing.constants.ts +66 -0
- package/src/lib/tailwind/helpers.ts +20 -0
- package/src/lib/tailwind/index.ts +5 -0
- package/src/lib/tailwind/plugins.ts +8 -0
- package/src/lib/tailwind/responsive.presets.ts +36 -0
- package/src/lib/tailwind/static.presets.ts +25 -0
- package/src/lib/tailwind/types.ts +6 -0
- package/src/lib/utils/format.ts +8 -0
- package/src/lib/utils/index.ts +4 -0
- package/src/storybook/blocks/Showcase.tsx +20 -0
- package/src/storybook/blocks/TypeSet.tsx +34 -0
- package/src/storybook/blocks/TypeSetItem.tsx +74 -0
- package/src/storybook/blocks/index.ts +6 -0
- package/src/storybook/constants/index.ts +5 -0
- package/src/storybook/constants/typeset.constants.ts +39 -0
- package/src/storybook/constants/variableSpacing.constants.ts +6 -0
- package/src/storybook/helpers/getFontSizeLabel.ts +15 -0
- package/src/storybook/helpers/index.ts +4 -0
- package/src/storybook/stories/atoms/Badge.stories.tsx +32 -0
- package/src/storybook/stories/atoms/Button.stories.tsx +45 -0
- package/src/storybook/stories/atoms/ButtonSegment.stories.tsx +45 -0
- package/src/storybook/stories/atoms/Checkbox.stories.tsx +34 -0
- package/src/storybook/stories/atoms/CustomScrollbar.stories.tsx +22 -0
- package/src/storybook/stories/atoms/Divider.stories.tsx +41 -0
- package/src/storybook/stories/atoms/Header.stories.tsx +58 -0
- package/src/storybook/stories/atoms/InfoBox.stories.tsx +67 -0
- package/src/storybook/stories/atoms/KeyValueInfo.stories.tsx +59 -0
- package/src/storybook/stories/atoms/LabelText.stories.tsx +55 -0
- package/src/storybook/stories/atoms/ListItem.stories.tsx +41 -0
- package/src/storybook/stories/atoms/LoadingIndicator.stories.tsx +32 -0
- package/src/storybook/stories/atoms/Panel.stories.tsx +36 -0
- package/src/storybook/stories/atoms/Placeholder.stories.tsx +33 -0
- package/src/storybook/stories/atoms/RadioButton.stories.tsx +51 -0
- package/src/storybook/stories/atoms/Skeleton.stories.tsx +33 -0
- package/src/storybook/stories/atoms/Snackbar.stories.tsx +43 -0
- package/src/storybook/stories/atoms/Toggle.stories.tsx +59 -0
- package/src/storybook/stories/atoms/Tooltip.stories.tsx +57 -0
- package/src/storybook/stories/atoms/VisualAssetCard.stories.tsx +56 -0
- package/src/storybook/stories/components/VariableSpacingShowcase.tsx +46 -0
- package/src/storybook/stories/components/index.ts +4 -0
- package/src/storybook/stories/design-tokens/colors.stories.mdx +23 -0
- package/src/storybook/stories/design-tokens/icons.stories.mdx +17 -0
- package/src/storybook/stories/design-tokens/typeset.stories.mdx +15 -0
- package/src/storybook/stories/design-tokens/variable-spacing.stories.mdx +10 -0
- package/src/storybook/stories/molecules/Account.stories.tsx +69 -0
- package/src/storybook/stories/molecules/Address.stories.tsx +39 -0
- package/src/storybook/stories/molecules/Card.stories.tsx +112 -0
- package/src/storybook/stories/molecules/Chip.stories.tsx +122 -0
- package/src/storybook/stories/molecules/DisplayStats.stories.tsx +63 -0
- package/src/storybook/stories/molecules/Dropdown.stories.tsx +38 -0
- package/src/storybook/stories/molecules/Input.stories.tsx +162 -0
- package/src/storybook/stories/molecules/NavbarItem.stories.tsx +45 -0
- package/src/storybook/stories/molecules/Search.stories.tsx +101 -0
- package/src/storybook/stories/molecules/SegmentedButton.stories.tsx +108 -0
- package/src/storybook/stories/molecules/Select.stories.tsx +103 -0
- package/src/storybook/stories/molecules/TableCell.stories.tsx +46 -0
- package/src/storybook/stories/molecules/TableHeaderCell.stories.tsx +34 -0
- package/src/storybook/stories/molecules/TextArea.stories.tsx +80 -0
- package/src/storybook/stories/molecules/Title.stories.tsx +76 -0
- package/src/storybook/stories/organisms/Accordion.stories.tsx +70 -0
- package/src/storybook/stories/organisms/Dialog.stories.tsx +103 -0
- package/src/storybook/stories/organisms/Navbar.stories.tsx +78 -0
- package/src/storybook/stories/organisms/Table.stories.tsx +154 -0
|
@@ -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,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,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,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,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,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,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,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,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,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,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
|
+
);
|