@nulogy/components 16.0.2 → 16.0.4

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 (152) hide show
  1. package/dist/main.js +1 -0
  2. package/dist/main.js.map +1 -1
  3. package/dist/main.module.js +1 -0
  4. package/dist/main.module.js.map +1 -1
  5. package/dist/src/Alert/Alert.story.d.ts +1 -1
  6. package/dist/src/Alert/Alert.story.js +11 -0
  7. package/dist/src/AppTag/stories/AppTag.story.d.ts +2 -2
  8. package/dist/src/AppTag/stories/AppTag.story.js +6 -4
  9. package/dist/src/AppTag/stories/AppTag.usecases.story.d.ts +13 -10
  10. package/dist/src/AppTag/stories/AppTag.usecases.story.js +71 -51
  11. package/dist/src/AsyncSelect/AsyncSelect.graphql.story.js +4 -3
  12. package/dist/src/AsyncSelect/AsyncSelect.story.d.ts +17 -13
  13. package/dist/src/AsyncSelect/AsyncSelect.story.js +46 -23
  14. package/dist/src/BottomSheet/stories/BottomSheet.actions.story.d.ts +8 -1
  15. package/dist/src/BottomSheet/stories/BottomSheet.actions.story.js +22 -3
  16. package/dist/src/BottomSheet/stories/BottomSheet.features.story.d.ts +9 -2
  17. package/dist/src/BottomSheet/stories/BottomSheet.features.story.js +27 -12
  18. package/dist/src/BottomSheet/stories/BottomSheet.story.d.ts +7 -1
  19. package/dist/src/BottomSheet/stories/BottomSheet.story.js +20 -3
  20. package/dist/src/Box/Box.story.d.ts +22 -44
  21. package/dist/src/Box/Box.story.js +30 -30
  22. package/dist/src/BrandedNavBar/NavBar.story.d.ts +16 -28
  23. package/dist/src/BrandedNavBar/NavBar.story.js +41 -35
  24. package/dist/src/BrandedNavBar/SmallNavBar.story.d.ts +1 -1
  25. package/dist/src/Breadcrumbs/Breadcrumbs.story.d.ts +4 -8
  26. package/dist/src/Breadcrumbs/Breadcrumbs.story.js +4 -4
  27. package/dist/src/Button/Button.story.d.ts +14 -28
  28. package/dist/src/Button/Button.story.js +14 -14
  29. package/dist/src/Button/ControlIcon.story.js +1 -1
  30. package/dist/src/Button/IconicButton.story.d.ts +23 -45
  31. package/dist/src/Button/IconicButton.story.js +27 -25
  32. package/dist/src/ButtonGroup/ButtonGroup.story.d.ts +13 -23
  33. package/dist/src/ButtonGroup/ButtonGroup.story.js +10 -10
  34. package/dist/src/Card/Card.story.d.ts +3 -5
  35. package/dist/src/Card/Card.story.js +9 -7
  36. package/dist/src/Checkbox/Checkbox.story.d.ts +18 -34
  37. package/dist/src/Checkbox/Checkbox.story.js +28 -24
  38. package/dist/src/Checkbox/CheckboxGroup.story.d.ts +10 -20
  39. package/dist/src/Checkbox/CheckboxGroup.story.js +10 -10
  40. package/dist/src/DatePickers/stories/DatePicker.story.d.ts +9 -2
  41. package/dist/src/DatePickers/stories/DatePicker.story.js +43 -2
  42. package/dist/src/DatePickers/stories/MonthPicker.story.d.ts +8 -1
  43. package/dist/src/DatePickers/stories/MonthPicker.story.js +21 -2
  44. package/dist/src/DatePickers/stories/WeekPicker.story.d.ts +32 -4
  45. package/dist/src/DatePickers/stories/WeekPicker.story.js +57 -8
  46. package/dist/src/DateRange/DateRange.story.d.ts +16 -2
  47. package/dist/src/DateRange/DateRange.story.js +41 -3
  48. package/dist/src/DescriptionList/stories/DescriptionList.column.story.d.ts +1 -1
  49. package/dist/src/DescriptionList/stories/DescriptionList.column.story.js +10 -8
  50. package/dist/src/DescriptionList/stories/DescriptionList.group-min-width.story.d.ts +1 -1
  51. package/dist/src/DescriptionList/stories/DescriptionList.layout.story.d.ts +1 -1
  52. package/dist/src/DescriptionList/stories/DescriptionList.layout.story.js +12 -10
  53. package/dist/src/DescriptionList/stories/DescriptionList.playground.story.d.ts +1 -1
  54. package/dist/src/DescriptionList/stories/DescriptionList.story.d.ts +1 -0
  55. package/dist/src/DescriptionList/stories/DescriptionList.story.js +3 -0
  56. package/dist/src/DropdownMenu/DropdownMenu.story.d.ts +32 -32
  57. package/dist/src/DropdownMenu/DropdownMenu.story.js +58 -16
  58. package/dist/src/FieldLabel/FieldLabel.story.d.ts +2 -4
  59. package/dist/src/FieldLabel/FieldLabel.story.js +2 -2
  60. package/dist/src/Flex/Flex.story.d.ts +34 -68
  61. package/dist/src/Flex/Flex.story.js +36 -36
  62. package/dist/src/Form/Form.story.d.ts +8 -16
  63. package/dist/src/Form/Form.story.js +8 -8
  64. package/dist/src/Icon/Icon.story.d.ts +12 -24
  65. package/dist/src/Icon/Icon.story.js +15 -15
  66. package/dist/src/Input/Input.story.d.ts +16 -32
  67. package/dist/src/Input/Input.story.js +23 -23
  68. package/dist/src/Layout/Page.applicationFrame.story.d.ts +1 -1
  69. package/dist/src/Layout/Page.story.d.ts +1 -1
  70. package/dist/src/Layout/Sidebar.story.d.ts +1 -1
  71. package/dist/src/Link/Link.story.d.ts +16 -32
  72. package/dist/src/Link/Link.story.js +16 -17
  73. package/dist/src/List/List.story.d.ts +8 -16
  74. package/dist/src/List/List.story.js +8 -8
  75. package/dist/src/LoadingAnimation/LoadingAnimation.story.d.ts +4 -8
  76. package/dist/src/LoadingAnimation/LoadingAnimation.story.js +4 -4
  77. package/dist/src/MaybeTooltip/MaybeTooltip.story.d.ts +1 -1
  78. package/dist/src/Modal/Modal.story.d.ts +1 -1
  79. package/dist/src/Navigation/stories/Navigation.appSwitcher.story.d.ts +8 -1
  80. package/dist/src/Navigation/stories/Navigation.appSwitcher.story.js +19 -1
  81. package/dist/src/Navigation/stories/Navigation.logos.story.d.ts +2 -4
  82. package/dist/src/Navigation/stories/Navigation.logos.story.js +4 -4
  83. package/dist/src/Navigation/stories/Navigation.story.d.ts +7 -1
  84. package/dist/src/Navigation/stories/Navigation.story.js +145 -136
  85. package/dist/src/Navigation/stories/Navigation.userMenu.story.d.ts +8 -1
  86. package/dist/src/Navigation/stories/Navigation.userMenu.story.js +22 -1
  87. package/dist/src/Overlay/Overlay.story.d.ts +2 -4
  88. package/dist/src/Overlay/Overlay.story.js +2 -2
  89. package/dist/src/Pagination/Pagination.story.d.ts +14 -13
  90. package/dist/src/Pagination/Pagination.story.js +32 -11
  91. package/dist/src/Radio/Radio.story.d.ts +1 -1
  92. package/dist/src/Radio/Radio.story.js +44 -1
  93. package/dist/src/Radio/RadioGroup.story.d.ts +29 -21
  94. package/dist/src/Radio/RadioGroup.story.js +67 -14
  95. package/dist/src/RangeContainer/RangeContainer.story.d.ts +2 -4
  96. package/dist/src/RangeContainer/RangeContainer.story.js +2 -2
  97. package/dist/src/Select/Select.story.d.ts +37 -65
  98. package/dist/src/Select/Select.story.js +93 -49
  99. package/dist/src/StatusIndicator/StatusIndicator.story.d.ts +4 -8
  100. package/dist/src/StatusIndicator/StatusIndicator.story.js +4 -4
  101. package/dist/src/Switcher/Switcher.story.d.ts +8 -1
  102. package/dist/src/Switcher/Switcher.story.js +13 -1
  103. package/dist/src/Table/stories/BaseTable.story.d.ts +1 -1
  104. package/dist/src/Table/stories/BaseTable.story.js +1 -1
  105. package/dist/src/Table/stories/CustomContent.story.js +1 -1
  106. package/dist/src/Table/stories/Density.story.d.ts +4 -8
  107. package/dist/src/Table/stories/Density.story.js +4 -4
  108. package/dist/src/Table/stories/SortingColumnHeader.story.d.ts +1 -1
  109. package/dist/src/Table/stories/SortingColumnHeader.story.js +1 -1
  110. package/dist/src/Table/stories/Table.story.d.ts +1 -1
  111. package/dist/src/Table/stories/Table.story.js +37 -1
  112. package/dist/src/Table/stories/TableWithCustomSorting.story.d.ts +2 -4
  113. package/dist/src/Table/stories/TableWithCustomSorting.story.js +2 -2
  114. package/dist/src/Table/stories/TableWithExpandableRows.story.d.ts +4 -8
  115. package/dist/src/Table/stories/TableWithExpandableRows.story.js +5 -5
  116. package/dist/src/Table/stories/TableWithFiltering.story.d.ts +8 -8
  117. package/dist/src/Table/stories/TableWithFiltering.story.js +15 -4
  118. package/dist/src/Table/stories/TableWithSelectableRows.story.d.ts +8 -8
  119. package/dist/src/Table/stories/TableWithSelectableRows.story.js +22 -5
  120. package/dist/src/Table/stories/TableWithServerSidePagination.story.d.ts +2 -4
  121. package/dist/src/Table/stories/TableWithServerSidePagination.story.js +2 -2
  122. package/dist/src/Tabs/Tabs.story.d.ts +33 -33
  123. package/dist/src/Tabs/Tabs.story.js +52 -16
  124. package/dist/src/Textarea/Textarea.story.js +1 -1
  125. package/dist/src/TimePicker/TimePicker.js +2 -0
  126. package/dist/src/TimePicker/TimePicker.story.d.ts +24 -40
  127. package/dist/src/TimePicker/TimePicker.story.js +40 -27
  128. package/dist/src/TimeRange/TimeRange.story.d.ts +14 -20
  129. package/dist/src/TimeRange/TimeRange.story.js +34 -20
  130. package/dist/src/Toast/Toast.story.d.ts +24 -25
  131. package/dist/src/Toast/Toast.story.js +170 -142
  132. package/dist/src/ToastContainer/ToastContainer.story.d.ts +8 -1
  133. package/dist/src/ToastContainer/ToastContainer.story.js +13 -1
  134. package/dist/src/Toggle/Toggle.story.d.ts +25 -15
  135. package/dist/src/Toggle/Toggle.story.js +77 -43
  136. package/dist/src/Tooltip/Tooltip.story.d.ts +1 -1
  137. package/dist/src/Tooltip/Tooltip.story.js +16 -0
  138. package/dist/src/TopBar/stories/TopBar.story.d.ts +7 -1
  139. package/dist/src/TopBar/stories/TopBar.story.js +18 -1
  140. package/dist/src/TruncatedText/TruncatedText.story.d.ts +29 -34
  141. package/dist/src/TruncatedText/TruncatedText.story.js +46 -19
  142. package/dist/src/Type/Text.story.d.ts +10 -20
  143. package/dist/src/Type/Text.story.js +10 -10
  144. package/dist/src/Validation/InlineValidation.story.d.ts +6 -12
  145. package/dist/src/Validation/InlineValidation.story.js +6 -6
  146. package/dist/src/VisualTests/Select.story.d.ts +12 -24
  147. package/dist/src/VisualTests/Select.story.js +19 -19
  148. package/dist/src/pages/ErrorPage.story.d.ts +3 -5
  149. package/dist/src/pages/ErrorPage.story.js +10 -10
  150. package/dist/src/pages/LoginPage.story.d.ts +8 -16
  151. package/dist/src/pages/LoginPage.story.js +8 -8
  152. package/package.json +16 -24
@@ -1,99 +1,147 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
+ import { expect, screen, userEvent, waitFor, within } from "storybook/test";
3
4
  import { Button, DangerButton, IconicButton, Modal, PrimaryButton, Flex, Toast } from "../index";
4
5
  export default {
5
6
  title: "Components/Toast",
6
7
  };
7
- export const _Toast = () => {
8
- const ToastWithTrigger = () => {
9
- const [triggered, setTriggered] = useState(false);
10
- const triggerToast = () => {
11
- setTriggered(!triggered);
8
+ export const _Toast = {
9
+ render: () => {
10
+ const ToastWithTrigger = () => {
11
+ const [triggered, setTriggered] = useState(false);
12
+ const triggerToast = () => {
13
+ setTriggered(!triggered);
14
+ };
15
+ const onHideHandler = () => {
16
+ setTriggered(false);
17
+ };
18
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, children: "Saved" })] }));
12
19
  };
13
- const onHideHandler = () => {
14
- setTriggered(false);
15
- };
16
- return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, children: "Saved" })] }));
17
- };
18
- return _jsx(ToastWithTrigger, {});
20
+ return _jsx(ToastWithTrigger, {});
21
+ },
22
+ name: "Toast",
23
+ play: async ({ canvasElement, step }) => {
24
+ const canvas = within(canvasElement);
25
+ await step("is hidden by default", async () => {
26
+ await expect(screen.queryByRole("alert")).not.toBeInTheDocument();
27
+ });
28
+ await step("shows toast when triggered", async () => {
29
+ await userEvent.click(canvas.getByText("Save Changes"));
30
+ await waitFor(() => expect(screen.getByRole("alert")).toBeVisible());
31
+ });
32
+ },
19
33
  };
20
- export const _MultipleToastsExample = () => {
21
- const MultipleToastsExample = () => {
22
- const [currentToast, setCurrentToast] = useState(undefined);
23
- const triggerToast = (toastName) => {
24
- setCurrentToast(toastName);
25
- };
26
- /* Alternate trigger toast fn adds a delay between toasts
27
- const triggerToast = toastName => {
28
- if (!currentToast) {
29
- setCurrentToast(toastName);
30
- } else {
31
- // adds a delay between toasts
32
- setTimeout(() => {
33
- setCurrentToast(toastName);
34
- }, 200);
35
- }
36
- }; */
37
- const onHideHandler = (toastName) => {
38
- if (currentToast === toastName) {
39
- setCurrentToast(undefined);
40
- }
34
+ export const _MultipleToastsExample = {
35
+ render: () => {
36
+ const MultipleToastsExample = () => {
37
+ const [currentToast, setCurrentToast] = useState(undefined);
38
+ const triggerToast = (toastName) => {
39
+ setCurrentToast(toastName);
40
+ };
41
+ /* Alternate trigger toast fn adds a delay between toasts
42
+ const triggerToast = toastName => {
43
+ if (!currentToast) {
44
+ setCurrentToast(toastName);
45
+ } else {
46
+ // adds a delay between toasts
47
+ setTimeout(() => {
48
+ setCurrentToast(toastName);
49
+ }, 200);
50
+ }
51
+ }; */
52
+ const onHideHandler = (toastName) => {
53
+ if (currentToast === toastName) {
54
+ setCurrentToast(undefined);
55
+ }
56
+ };
57
+ const TOAST_ACTIONS = {
58
+ SAVE: "save",
59
+ RESET: "reset",
60
+ DELETE: "delete",
61
+ ERROR: "error",
62
+ };
63
+ const TOASTS = [
64
+ {
65
+ action: TOAST_ACTIONS.SAVE,
66
+ message: "Saved all your changes",
67
+ type: "success",
68
+ },
69
+ {
70
+ action: TOAST_ACTIONS.RESET,
71
+ message: "Reset all your changes",
72
+ type: "success",
73
+ },
74
+ {
75
+ action: TOAST_ACTIONS.DELETE,
76
+ message: "Ok, it's deleted",
77
+ type: "success",
78
+ },
79
+ {
80
+ action: TOAST_ACTIONS.ERROR,
81
+ message: "An error occurred, please retry",
82
+ type: "danger",
83
+ },
84
+ ];
85
+ return (_jsxs(_Fragment, { children: [_jsxs(Flex, { alignItems: "center", children: [_jsx(PrimaryButton, { onClick: () => triggerToast(TOAST_ACTIONS.SAVE), mr: "x2", children: "Save Changes" }), _jsx(Button, { onClick: () => triggerToast(TOAST_ACTIONS.RESET), mr: "x2", children: "Reset" }), _jsx(DangerButton, { onClick: () => triggerToast(TOAST_ACTIONS.ERROR), mr: "x2", children: "Trigger Error" }), _jsx(IconicButton, { icon: "delete", onClick: () => triggerToast(TOAST_ACTIONS.DELETE), children: "Delete" })] }), TOASTS.map((toast) => {
86
+ return (_jsx(Toast, { triggered: currentToast === toast.action, onHide: () => onHideHandler(toast.action), type: toast.type, children: toast.message }, toast.action));
87
+ })] }));
41
88
  };
42
- const TOAST_ACTIONS = {
43
- SAVE: "save",
44
- RESET: "reset",
45
- DELETE: "delete",
46
- ERROR: "error",
47
- };
48
- const TOASTS = [
49
- {
50
- action: TOAST_ACTIONS.SAVE,
51
- message: "Saved all your changes",
52
- type: "success",
53
- },
54
- {
55
- action: TOAST_ACTIONS.RESET,
56
- message: "Reset all your changes",
57
- type: "success",
58
- },
59
- {
60
- action: TOAST_ACTIONS.DELETE,
61
- message: "Ok, it's deleted",
62
- type: "success",
63
- },
64
- {
65
- action: TOAST_ACTIONS.ERROR,
66
- message: "An error occurred, please retry",
67
- type: "danger",
68
- },
69
- ];
70
- return (_jsxs(_Fragment, { children: [_jsxs(Flex, { alignItems: "center", children: [_jsx(PrimaryButton, { onClick: () => triggerToast(TOAST_ACTIONS.SAVE), mr: "x2", children: "Save Changes" }), _jsx(Button, { onClick: () => triggerToast(TOAST_ACTIONS.RESET), mr: "x2", children: "Reset" }), _jsx(DangerButton, { onClick: () => triggerToast(TOAST_ACTIONS.ERROR), mr: "x2", children: "Trigger Error" }), _jsx(IconicButton, { icon: "delete", onClick: () => triggerToast(TOAST_ACTIONS.DELETE), children: "Delete" })] }), TOASTS.map((toast) => {
71
- return (_jsx(Toast, { triggered: currentToast === toast.action, onHide: () => onHideHandler(toast.action), type: toast.type, children: toast.message }, toast.action));
72
- })] }));
73
- };
74
- return _jsx(MultipleToastsExample, {});
75
- };
76
- _MultipleToastsExample.story = {
89
+ return _jsx(MultipleToastsExample, {});
90
+ },
77
91
  name: "multiple toasts example",
78
92
  };
79
- export const CustomizeLengthOfTimeToastIsVisible = () => {
80
- const ToastWithTrigger = () => {
81
- const [triggered, setTriggered] = useState(false);
82
- const triggerToast = () => {
83
- setTriggered(!triggered);
93
+ export const CustomizeLengthOfTimeToastIsVisible = {
94
+ render: () => {
95
+ const ToastWithTrigger = () => {
96
+ const [triggered, setTriggered] = useState(false);
97
+ const triggerToast = () => {
98
+ setTriggered(!triggered);
99
+ };
100
+ const onHideHandler = () => {
101
+ setTriggered(false);
102
+ };
103
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, showDuration: 5000, children: "Saved" })] }));
84
104
  };
85
- const onHideHandler = () => {
86
- setTriggered(false);
105
+ return _jsx(ToastWithTrigger, {});
106
+ },
107
+ name: "customize length of time toast is visible",
108
+ };
109
+ export const WithCloseButton = {
110
+ render: () => {
111
+ const ToastWithTrigger = () => {
112
+ const [triggered, setTriggered] = useState(false);
113
+ const triggerToast = () => {
114
+ setTriggered(!triggered);
115
+ };
116
+ const onHideHandler = () => {
117
+ setTriggered(false);
118
+ };
119
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, isCloseable: true, children: "An error occurred while saving results. Please try again" })] }));
87
120
  };
88
- return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, showDuration: 5000, children: "Saved" })] }));
89
- };
90
- return _jsx(ToastWithTrigger, {});
121
+ return _jsx(ToastWithTrigger, {});
122
+ },
123
+ name: "with close button",
124
+ play: async ({ canvasElement, step }) => {
125
+ const canvas = within(canvasElement);
126
+ await step("is hidden by default", async () => {
127
+ await expect(screen.queryByRole("alert")).not.toBeInTheDocument();
128
+ });
129
+ await step("shows toast when triggered", async () => {
130
+ await userEvent.click(canvas.getByText("Save Changes"));
131
+ await waitFor(() => expect(screen.getByRole("alert")).toBeVisible());
132
+ });
133
+ await step("hides toast when close button is clicked", async () => {
134
+ await userEvent.click(screen.getByLabelText("Close"));
135
+ await waitFor(() => expect(screen.queryByRole("alert")).not.toBeInTheDocument());
136
+ });
137
+ },
91
138
  };
92
- CustomizeLengthOfTimeToastIsVisible.story = {
93
- name: "customize length of time toast is visible",
139
+ export const WithModal = {
140
+ render: () => (_jsxs(_Fragment, { children: [_jsx(Toast, { triggered: true, type: "danger", isCloseable: true, zIndex: 1001, children: "Something went wrong. Try again." }), _jsx(Modal, { title: "Modal Title", onRequestClose: () => { }, maxWidth: "456px", children: "Modal Body" })] })),
141
+ name: "with a modal",
94
142
  };
95
- export const WithCloseButton = () => {
96
- const ToastWithTrigger = () => {
143
+ export const CloseableWithMultiLineMessage = {
144
+ render: () => {
97
145
  const [triggered, setTriggered] = useState(false);
98
146
  const triggerToast = () => {
99
147
  setTriggered(!triggered);
@@ -101,69 +149,49 @@ export const WithCloseButton = () => {
101
149
  const onHideHandler = () => {
102
150
  setTriggered(false);
103
151
  };
104
- return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, isCloseable: true, children: "An error occurred while saving results. Please try again" })] }));
105
- };
106
- return _jsx(ToastWithTrigger, {});
107
- };
108
- WithCloseButton.story = {
109
- name: "with close button",
110
- };
111
- export const WithModal = () => (_jsxs(_Fragment, { children: [_jsx(Toast, { triggered: true, type: "danger", isCloseable: true, zIndex: 1001, children: "Something went wrong. Try again." }), _jsx(Modal, { title: "Modal Title", onRequestClose: () => { }, maxWidth: "456px", children: "Modal Body" })] }));
112
- WithModal.story = {
113
- name: "with a modal",
114
- };
115
- export const CloseableWithMultiLineMessage = () => {
116
- const [triggered, setTriggered] = useState(false);
117
- const triggerToast = () => {
118
- setTriggered(!triggered);
119
- };
120
- const onHideHandler = () => {
121
- setTriggered(false);
122
- };
123
- return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, type: "danger", isCloseable: true, children: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum quidem eveniet, repellat accusamus error reiciendis libero. Totam autem distinctio vo" })] }));
124
- };
125
- CloseableWithMultiLineMessage.story = {
152
+ return (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: triggerToast, children: "Save Changes" }), _jsx(Toast, { triggered: triggered, onHide: onHideHandler, type: "danger", isCloseable: true, children: "Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolorum quidem eveniet, repellat accusamus error reiciendis libero. Totam autem distinctio vo" })] }));
153
+ },
126
154
  name: "closeable with a 150 character long multi-line message",
127
155
  };
128
- export const MultipleCloseableToastsExample = () => {
129
- const MultipleToastsExample = () => {
130
- const [currentToasts, setCurrentToasts] = useState([]);
131
- const triggerToast = (toastName) => {
132
- setCurrentToasts([...currentToasts, toastName]);
156
+ export const MultipleCloseableToastsExample = {
157
+ render: () => {
158
+ const MultipleToastsExample = () => {
159
+ const [currentToasts, setCurrentToasts] = useState([]);
160
+ const triggerToast = (toastName) => {
161
+ setCurrentToasts([...currentToasts, toastName]);
162
+ };
163
+ const onHideHandler = (toastName) => {
164
+ setCurrentToasts(currentToasts.filter((toast) => toast !== toastName));
165
+ };
166
+ const TOAST_ACTIONS = {
167
+ SAVE: "save",
168
+ RESET: "reset",
169
+ DELETE: "delete",
170
+ ERROR: "error",
171
+ };
172
+ const TOASTS = [
173
+ {
174
+ action: TOAST_ACTIONS.SAVE,
175
+ message: "Error saving all your changes",
176
+ },
177
+ {
178
+ action: TOAST_ACTIONS.RESET,
179
+ message: "Error: changes were reset",
180
+ },
181
+ {
182
+ action: TOAST_ACTIONS.DELETE,
183
+ message: "An error occurred, could not deleted",
184
+ },
185
+ {
186
+ action: TOAST_ACTIONS.ERROR,
187
+ message: "An error occurred, please retry",
188
+ },
189
+ ];
190
+ return (_jsxs(_Fragment, { children: [_jsxs(Flex, { alignItems: "center", children: [_jsx(PrimaryButton, { onClick: () => triggerToast(TOAST_ACTIONS.SAVE), mr: "x2", children: "Save Changes" }), _jsx(Button, { onClick: () => triggerToast(TOAST_ACTIONS.RESET), mr: "x2", children: "Reset" }), _jsx(DangerButton, { onClick: () => triggerToast(TOAST_ACTIONS.ERROR), mr: "x2", children: "Trigger Error" }), _jsx(IconicButton, { icon: "delete", onClick: () => triggerToast(TOAST_ACTIONS.DELETE), children: "Delete" })] }), TOASTS.map((toast) => {
191
+ return (_jsx(Toast, { triggered: currentToasts.includes(toast.action), onHide: () => onHideHandler(toast.action), type: "danger", isCloseable: true, children: toast.message }, toast.action));
192
+ })] }));
133
193
  };
134
- const onHideHandler = (toastName) => {
135
- setCurrentToasts(currentToasts.filter((toast) => toast !== toastName));
136
- };
137
- const TOAST_ACTIONS = {
138
- SAVE: "save",
139
- RESET: "reset",
140
- DELETE: "delete",
141
- ERROR: "error",
142
- };
143
- const TOASTS = [
144
- {
145
- action: TOAST_ACTIONS.SAVE,
146
- message: "Error saving all your changes",
147
- },
148
- {
149
- action: TOAST_ACTIONS.RESET,
150
- message: "Error: changes were reset",
151
- },
152
- {
153
- action: TOAST_ACTIONS.DELETE,
154
- message: "An error occurred, could not deleted",
155
- },
156
- {
157
- action: TOAST_ACTIONS.ERROR,
158
- message: "An error occurred, please retry",
159
- },
160
- ];
161
- return (_jsxs(_Fragment, { children: [_jsxs(Flex, { alignItems: "center", children: [_jsx(PrimaryButton, { onClick: () => triggerToast(TOAST_ACTIONS.SAVE), mr: "x2", children: "Save Changes" }), _jsx(Button, { onClick: () => triggerToast(TOAST_ACTIONS.RESET), mr: "x2", children: "Reset" }), _jsx(DangerButton, { onClick: () => triggerToast(TOAST_ACTIONS.ERROR), mr: "x2", children: "Trigger Error" }), _jsx(IconicButton, { icon: "delete", onClick: () => triggerToast(TOAST_ACTIONS.DELETE), children: "Delete" })] }), TOASTS.map((toast) => {
162
- return (_jsx(Toast, { triggered: currentToasts.includes(toast.action), onHide: () => onHideHandler(toast.action), type: "danger", isCloseable: true, children: toast.message }, toast.action));
163
- })] }));
164
- };
165
- return _jsx(MultipleToastsExample, {});
166
- };
167
- MultipleCloseableToastsExample.story = {
194
+ return _jsx(MultipleToastsExample, {});
195
+ },
168
196
  name: "multiple closeable toasts example",
169
197
  };
@@ -1,4 +1,11 @@
1
- export declare const WithEverything: () => import("react/jsx-runtime").JSX.Element;
1
+ export declare const WithEverything: {
2
+ render: () => import("react/jsx-runtime").JSX.Element;
3
+ name: string;
4
+ play: ({ canvasElement, step }: {
5
+ canvasElement: any;
6
+ step: any;
7
+ }) => Promise<void>;
8
+ };
2
9
  declare const _default: {
3
10
  title: string;
4
11
  };
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
+ import { expect, screen, userEvent, waitFor, within } from "storybook/test";
3
4
  import { PrimaryButton } from "../Button";
4
5
  import { Input } from "../Input";
5
6
  import { Flex } from "../Flex";
@@ -11,7 +12,7 @@ const getToastFunctionTemplate = ({ isClosable = false, toastType = "informative
11
12
  title: "This is a '${toastType}' type toast title",
12
13
  isCloseable: ${isClosable},
13
14
  })`;
14
- export const WithEverything = () => {
15
+ const WithEverythingComponent = () => {
15
16
  const [behavior, setBehavior] = useState("random");
16
17
  const [position, setPosition] = useState("bottom-center");
17
18
  const [type, setType] = useState("random");
@@ -53,6 +54,17 @@ export const WithEverything = () => {
53
54
  });
54
55
  }, children: "Trigger toast" })] })] }), _jsx(ToastContainer, { position: position, toastOptions: { duration }, maxVisibleToasts: maxVisibleToasts })] })] }));
55
56
  };
57
+ export const WithEverything = {
58
+ render: () => _jsx(WithEverythingComponent, {}),
59
+ name: "With Everything",
60
+ play: async ({ canvasElement, step }) => {
61
+ const canvas = within(canvasElement);
62
+ await step("triggers a toast", async () => {
63
+ await userEvent.click(canvas.getByText("Trigger toast"));
64
+ await waitFor(() => expect(screen.getAllByRole("alert")[0]).toBeVisible());
65
+ });
66
+ },
67
+ };
56
68
  export default {
57
69
  title: "Components/ToastContainer",
58
70
  };
@@ -2,32 +2,42 @@ declare const _default: {
2
2
  title: string;
3
3
  };
4
4
  export default _default;
5
- export declare const _Toggle: () => import("react/jsx-runtime").JSX.Element;
5
+ export declare const _Toggle: {
6
+ render: () => import("react/jsx-runtime").JSX.Element;
7
+ play: ({ canvasElement, step }: {
8
+ canvasElement: any;
9
+ step: any;
10
+ }) => Promise<void>;
11
+ };
6
12
  export declare const ToggleWithAllProps: {
7
- (): import("react/jsx-runtime").JSX.Element;
8
- storyName: string;
13
+ render: () => import("react/jsx-runtime").JSX.Element;
14
+ name: string;
9
15
  };
10
16
  export declare const ToggleSetToDisabled: {
11
- (): import("react/jsx-runtime").JSX.Element;
12
- storyName: string;
17
+ render: () => import("react/jsx-runtime").JSX.Element;
18
+ name: string;
19
+ play: ({ canvasElement, step }: {
20
+ canvasElement: any;
21
+ step: any;
22
+ }) => Promise<void>;
13
23
  };
14
24
  export declare const WithCustomId: {
15
- (): import("react/jsx-runtime").JSX.Element;
16
- storyName: string;
25
+ render: () => import("react/jsx-runtime").JSX.Element;
26
+ name: string;
17
27
  };
18
28
  export declare const WithText: {
19
- (): import("react/jsx-runtime").JSX.Element;
20
- storyName: string;
29
+ render: () => import("react/jsx-runtime").JSX.Element;
30
+ name: string;
21
31
  };
22
32
  export declare const WithLongText: {
23
- (): import("react/jsx-runtime").JSX.Element;
24
- storyName: string;
33
+ render: () => import("react/jsx-runtime").JSX.Element;
34
+ name: string;
25
35
  };
26
36
  export declare const WithContraintWidth: {
27
- (): import("react/jsx-runtime").JSX.Element;
28
- storyName: string;
37
+ render: () => import("react/jsx-runtime").JSX.Element;
38
+ name: string;
29
39
  };
30
40
  export declare const UsingRefToControlFocus: {
31
- (): import("react/jsx-runtime").JSX.Element;
32
- storyName: string;
41
+ render: () => import("react/jsx-runtime").JSX.Element;
42
+ name: string;
33
43
  };
@@ -1,51 +1,85 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef, useState } from "react";
3
- import { action } from "@storybook/addon-actions";
3
+ import { expect, userEvent, within } from "storybook/test";
4
+ import { action } from "storybook/actions";
4
5
  import { Toggle, Button, Box } from "../index";
5
6
  import { dashed } from "../utils/story/dashed";
6
7
  const DashedBox = dashed(Box);
7
8
  export default {
8
9
  title: "Components/Toggle",
9
10
  };
10
- export const _Toggle = () => {
11
- const [toggled, setToggled] = useState(false);
12
- return _jsx(Toggle, { "data-testid": "toggle-example", toggled: toggled, onChange: (e) => setToggled(e.target.checked) });
13
- };
14
- export const ToggleWithAllProps = () => {
15
- const [toggled, setToggled] = useState(true);
16
- return (_jsx(Toggle, { labelText: "Toggle", helpText: "Turns setting on/off", onText: "on", offText: "off", toggled: toggled, required: true, requirementText: "(Required)", onChange: (e) => setToggled(e.target.checked) }));
17
- };
18
- ToggleWithAllProps.storyName = "Toggle with all props";
19
- export const ToggleSetToDisabled = () => {
20
- return (_jsxs(_Fragment, { children: [_jsx(Toggle, { labelText: "Toggle", disabled: true, onText: "on", offText: "off", onChange: action("on change"), "data-testid": "toggle-example" }), _jsx(Toggle, { id: "toggle-2", disabled: true, onText: "on", offText: "off", toggled: true, labelText: "Toggle", onChange: action("on change") })] }));
21
- };
22
- ToggleSetToDisabled.storyName = "Toggle set to disabled";
23
- export const WithCustomId = () => {
24
- const [toggled, setToggled] = useState(true);
25
- return (_jsx(Toggle, { id: "my-custom-id", labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }));
26
- };
27
- WithCustomId.storyName = "With custom id";
28
- export const WithText = () => {
29
- const [toggled, setToggled] = useState(true);
30
- return (_jsx(Toggle, { labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }));
31
- };
32
- WithText.storyName = "With text";
33
- export const WithLongText = () => {
34
- const [toggled, setToggled] = useState(true);
35
- return (_jsx(Toggle, { labelText: "Toggle", toggled: toggled, onText: "this state has a very long text label to explain it's state", offText: "not this one", onChange: (e) => setToggled(e.target.checked) }));
36
- };
37
- WithLongText.storyName = "With long text";
38
- export const WithContraintWidth = () => {
39
- const [toggled, setToggled] = useState(true);
40
- return (_jsx(DashedBox, { width: "200px", padding: "x2", children: _jsx(Toggle, { labelText: "Toggle", onText: "This is a long On label for the toggle component.", offText: "This is a long Off label for the toggle component.", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }) }));
41
- };
42
- WithContraintWidth.storyName = "With constraint width";
43
- export const UsingRefToControlFocus = () => {
44
- const [toggled, setToggled] = useState(true);
45
- const ref = useRef(null);
46
- const handleClick = () => {
47
- ref.current.focus();
48
- };
49
- return (_jsxs(_Fragment, { children: [_jsx(Toggle, { id: "my-custom-id", labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked), ref: ref }), _jsx(Button, { onClick: handleClick, children: "Focus the Toggle" })] }));
50
- };
51
- UsingRefToControlFocus.storyName = "Using ref to control focus";
11
+ export const _Toggle = {
12
+ render: () => {
13
+ const [toggled, setToggled] = useState(false);
14
+ return _jsx(Toggle, { "data-testid": "toggle-example", toggled: toggled, onChange: (e) => setToggled(e.target.checked) });
15
+ },
16
+ play: async ({ canvasElement, step }) => {
17
+ const canvas = within(canvasElement);
18
+ await step("changes the value on click", async () => {
19
+ const input = canvasElement.querySelector("[data-testid='toggle-example'] input");
20
+ await expect(input).not.toBeChecked();
21
+ await userEvent.click(canvas.getByTestId("toggle-example"));
22
+ await expect(input).toBeChecked();
23
+ });
24
+ },
25
+ };
26
+ export const ToggleWithAllProps = {
27
+ render: () => {
28
+ const [toggled, setToggled] = useState(true);
29
+ return (_jsx(Toggle, { labelText: "Toggle", helpText: "Turns setting on/off", onText: "on", offText: "off", toggled: toggled, required: true, requirementText: "(Required)", onChange: (e) => setToggled(e.target.checked) }));
30
+ },
31
+ name: "Toggle with all props",
32
+ };
33
+ export const ToggleSetToDisabled = {
34
+ render: () => {
35
+ return (_jsxs(_Fragment, { children: [_jsx(Toggle, { labelText: "Toggle", disabled: true, onText: "on", offText: "off", onChange: action("on change"), "data-testid": "toggle-example" }), _jsx(Toggle, { id: "toggle-2", disabled: true, onText: "on", offText: "off", toggled: true, labelText: "Toggle", onChange: action("on change") })] }));
36
+ },
37
+ name: "Toggle set to disabled",
38
+ play: async ({ canvasElement, step }) => {
39
+ const canvas = within(canvasElement);
40
+ await step("disabled toggle does not change on click", async () => {
41
+ const input = canvas.getByTestId("toggle-example").querySelector("input");
42
+ await expect(input).toBeDisabled();
43
+ await expect(input).not.toBeChecked();
44
+ });
45
+ },
46
+ };
47
+ export const WithCustomId = {
48
+ render: () => {
49
+ const [toggled, setToggled] = useState(true);
50
+ return (_jsx(Toggle, { id: "my-custom-id", labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }));
51
+ },
52
+ name: "With custom id",
53
+ };
54
+ export const WithText = {
55
+ render: () => {
56
+ const [toggled, setToggled] = useState(true);
57
+ return (_jsx(Toggle, { labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }));
58
+ },
59
+ name: "With text",
60
+ };
61
+ export const WithLongText = {
62
+ render: () => {
63
+ const [toggled, setToggled] = useState(true);
64
+ return (_jsx(Toggle, { labelText: "Toggle", toggled: toggled, onText: "this state has a very long text label to explain it's state", offText: "not this one", onChange: (e) => setToggled(e.target.checked) }));
65
+ },
66
+ name: "With long text",
67
+ };
68
+ export const WithContraintWidth = {
69
+ render: () => {
70
+ const [toggled, setToggled] = useState(true);
71
+ return (_jsx(DashedBox, { width: "200px", padding: "x2", children: _jsx(Toggle, { labelText: "Toggle", onText: "This is a long On label for the toggle component.", offText: "This is a long Off label for the toggle component.", toggled: toggled, onChange: (e) => setToggled(e.target.checked) }) }));
72
+ },
73
+ name: "With constraint width",
74
+ };
75
+ export const UsingRefToControlFocus = {
76
+ render: () => {
77
+ const [toggled, setToggled] = useState(true);
78
+ const ref = useRef(null);
79
+ const handleClick = () => {
80
+ ref.current.focus();
81
+ };
82
+ return (_jsxs(_Fragment, { children: [_jsx(Toggle, { id: "my-custom-id", labelText: "Toggle", onText: "on", offText: "off", toggled: toggled, onChange: (e) => setToggled(e.target.checked), ref: ref }), _jsx(Button, { onClick: handleClick, children: "Focus the Toggle" })] }));
83
+ },
84
+ name: "Using ref to control focus",
85
+ };
@@ -1,4 +1,4 @@
1
- import type { StoryObj } from "@storybook/react";
1
+ import type { StoryObj } from "@storybook/react-vite";
2
2
  import { Tooltip } from "../index";
3
3
  declare const _default: {
4
4
  title: string;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React from "react";
3
+ import { expect, screen, userEvent, waitFor, within } from "storybook/test";
3
4
  import { Box, Button, DescriptionDetails, DescriptionList, DescriptionTerm, Divider, Flex, Icon, Link, StatusIndicator, Text, Tooltip, } from "../index";
4
5
  export default {
5
6
  title: "Components/Tooltip",
@@ -10,6 +11,21 @@ export default {
10
11
  };
11
12
  export const Default = {
12
13
  render: () => (_jsx(Flex, { p: "x8", children: _jsx(Tooltip, { tooltip: "I am a Tooltip!", children: _jsx(Button, { "data-testid": "tooltip-trigger", children: "Button" }) }) })),
14
+ play: async ({ canvasElement, step }) => {
15
+ const canvas = within(canvasElement);
16
+ await step("tooltip is not visible before interaction", async () => {
17
+ await expect(screen.queryByRole("tooltip")).not.toBeInTheDocument();
18
+ });
19
+ await step("shows tooltip text on hover", async () => {
20
+ await userEvent.hover(canvas.getByTestId("tooltip-trigger"));
21
+ // Radix renders the tooltip in a body portal, so use screen (not canvas)
22
+ await waitFor(() => expect(screen.getByRole("tooltip")).toHaveTextContent("I am a Tooltip!"));
23
+ });
24
+ await step("hides tooltip when moving away", async () => {
25
+ await userEvent.unhover(canvas.getByTestId("tooltip-trigger"));
26
+ await waitFor(() => expect(screen.queryByRole("tooltip")).not.toBeInTheDocument());
27
+ });
28
+ },
13
29
  };
14
30
  export const WithWrappedText = {
15
31
  render: () => (_jsx(Flex, { p: "x8", children: _jsx(Tooltip, { placement: "bottom", tooltip: "I am a Tooltip! I have very long text, and my default max-width is 24em (based on 14px font-size), which is equal to 336px, or approximately 45 characters.", defaultOpen: true, children: _jsx(Button, { children: " Button " }) }) })),
@@ -13,6 +13,12 @@ declare const _default: {
13
13
  };
14
14
  };
15
15
  export default _default;
16
- export declare const Default: () => import("react/jsx-runtime").JSX.Element;
16
+ export declare const Default: {
17
+ render: () => import("react/jsx-runtime").JSX.Element;
18
+ play: ({ canvasElement, step }: {
19
+ canvasElement: any;
20
+ step: any;
21
+ }) => Promise<void>;
22
+ };
17
23
  export declare const WithALongTitle: () => import("react/jsx-runtime").JSX.Element;
18
24
  export declare const WithAnApplicationFrame: () => import("react/jsx-runtime").JSX.Element;