@mitodl/smoot-design 0.0.0-preview215f7ae3fa
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/LICENSE +28 -0
- package/README.md +27 -0
- package/dist/bundles/aiChat.es.js +24812 -0
- package/dist/bundles/aiChat.umd.js +161 -0
- package/dist/cjs/ai.d.ts +2 -0
- package/dist/cjs/ai.js +5 -0
- package/dist/cjs/bundles/aiChat.d.ts +6 -0
- package/dist/cjs/bundles/aiChat.js +13 -0
- package/dist/cjs/components/AiChat/AiChat.d.ts +5 -0
- package/dist/cjs/components/AiChat/AiChat.js +150 -0
- package/dist/cjs/components/AiChat/AiChat.stories.d.ts +11 -0
- package/dist/cjs/components/AiChat/AiChat.stories.js +76 -0
- package/dist/cjs/components/AiChat/AiChat.test.d.ts +1 -0
- package/dist/cjs/components/AiChat/AiChat.test.js +130 -0
- package/dist/cjs/components/AiChat/story-utils.d.ts +3 -0
- package/dist/cjs/components/AiChat/story-utils.js +100 -0
- package/dist/cjs/components/AiChat/types.d.ts +45 -0
- package/dist/cjs/components/AiChat/types.js +3 -0
- package/dist/cjs/components/AiChat/utils.d.ts +9 -0
- package/dist/cjs/components/AiChat/utils.js +31 -0
- package/dist/cjs/components/Button/ActionButton.d.ts +30 -0
- package/dist/cjs/components/Button/ActionButton.js +73 -0
- package/dist/cjs/components/Button/ActionButton.stories.d.ts +15 -0
- package/dist/cjs/components/Button/ActionButton.stories.js +116 -0
- package/dist/cjs/components/Button/Button.d.ts +56 -0
- package/dist/cjs/components/Button/Button.js +273 -0
- package/dist/cjs/components/Button/Button.stories.d.ts +17 -0
- package/dist/cjs/components/Button/Button.stories.js +138 -0
- package/dist/cjs/components/Button/Button.test.d.ts +1 -0
- package/dist/cjs/components/Button/Button.test.js +46 -0
- package/dist/cjs/components/Input/Input.d.ts +115 -0
- package/dist/cjs/components/Input/Input.js +219 -0
- package/dist/cjs/components/Input/Input.stories.d.ts +19 -0
- package/dist/cjs/components/Input/Input.stories.js +134 -0
- package/dist/cjs/components/Input/Input.test.d.ts +1 -0
- package/dist/cjs/components/Input/Input.test.js +32 -0
- package/dist/cjs/components/LinkAdapter/LinkAdapter.d.ts +23 -0
- package/dist/cjs/components/LinkAdapter/LinkAdapter.js +34 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.d.ts +19 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.js +59 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
- package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.js +43 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.js +43 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.js +44 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
- package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.js +62 -0
- package/dist/cjs/components/TextField/TextField.d.ts +29 -0
- package/dist/cjs/components/TextField/TextField.js +33 -0
- package/dist/cjs/components/TextField/TextField.stories.d.ts +10 -0
- package/dist/cjs/components/TextField/TextField.stories.js +135 -0
- package/dist/cjs/components/TextField/TextField.test.d.ts +1 -0
- package/dist/cjs/components/TextField/TextField.test.js +77 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.d.ts +23 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.js +90 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.d.ts +58 -0
- package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.js +97 -0
- package/dist/cjs/components/ThemeProvider/Typography.stories.d.ts +39 -0
- package/dist/cjs/components/ThemeProvider/Typography.stories.js +65 -0
- package/dist/cjs/components/ThemeProvider/breakpoints.d.ts +4 -0
- package/dist/cjs/components/ThemeProvider/breakpoints.js +20 -0
- package/dist/cjs/components/ThemeProvider/buttons.d.ts +7 -0
- package/dist/cjs/components/ThemeProvider/buttons.js +20 -0
- package/dist/cjs/components/ThemeProvider/chips.d.ts +3 -0
- package/dist/cjs/components/ThemeProvider/chips.js +154 -0
- package/dist/cjs/components/ThemeProvider/colors.d.ts +32 -0
- package/dist/cjs/components/ThemeProvider/colors.js +35 -0
- package/dist/cjs/components/ThemeProvider/typography.d.ts +18 -0
- package/dist/cjs/components/ThemeProvider/typography.js +174 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.js +33 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
- package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.js +13 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.js +78 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
- package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.js +93 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/jest-setup.d.ts +1 -0
- package/dist/cjs/jest-setup.js +18 -0
- package/dist/cjs/jsdom-extended.d.ts +6 -0
- package/dist/cjs/jsdom-extended.js +14 -0
- package/dist/cjs/story-utils/index.d.ts +6 -0
- package/dist/cjs/story-utils/index.js +17 -0
- package/dist/cjs/utils/composeRefs.d.ts +7 -0
- package/dist/cjs/utils/composeRefs.js +20 -0
- package/dist/cjs/utils/composeRefs.test.d.ts +1 -0
- package/dist/cjs/utils/composeRefs.test.js +19 -0
- package/dist/cjs/utils/useDevCheckStable.d.ts +8 -0
- package/dist/cjs/utils/useDevCheckStable.js +29 -0
- package/dist/cjs/utils/useInterval.d.ts +7 -0
- package/dist/cjs/utils/useInterval.js +25 -0
- package/dist/esm/ai.d.ts +2 -0
- package/dist/esm/ai.js +1 -0
- package/dist/esm/bundles/aiChat.d.ts +6 -0
- package/dist/esm/bundles/aiChat.js +10 -0
- package/dist/esm/components/AiChat/AiChat.d.ts +5 -0
- package/dist/esm/components/AiChat/AiChat.js +147 -0
- package/dist/esm/components/AiChat/AiChat.stories.d.ts +11 -0
- package/dist/esm/components/AiChat/AiChat.stories.js +73 -0
- package/dist/esm/components/AiChat/AiChat.test.d.ts +1 -0
- package/dist/esm/components/AiChat/AiChat.test.js +128 -0
- package/dist/esm/components/AiChat/story-utils.d.ts +3 -0
- package/dist/esm/components/AiChat/story-utils.js +96 -0
- package/dist/esm/components/AiChat/types.d.ts +45 -0
- package/dist/esm/components/AiChat/types.js +2 -0
- package/dist/esm/components/AiChat/utils.d.ts +9 -0
- package/dist/esm/components/AiChat/utils.js +28 -0
- package/dist/esm/components/Button/ActionButton.d.ts +30 -0
- package/dist/esm/components/Button/ActionButton.js +68 -0
- package/dist/esm/components/Button/ActionButton.stories.d.ts +15 -0
- package/dist/esm/components/Button/ActionButton.stories.js +113 -0
- package/dist/esm/components/Button/Button.d.ts +56 -0
- package/dist/esm/components/Button/Button.js +265 -0
- package/dist/esm/components/Button/Button.stories.d.ts +17 -0
- package/dist/esm/components/Button/Button.stories.js +135 -0
- package/dist/esm/components/Button/Button.test.d.ts +1 -0
- package/dist/esm/components/Button/Button.test.js +44 -0
- package/dist/esm/components/Input/Input.d.ts +115 -0
- package/dist/esm/components/Input/Input.js +214 -0
- package/dist/esm/components/Input/Input.stories.d.ts +19 -0
- package/dist/esm/components/Input/Input.stories.js +131 -0
- package/dist/esm/components/Input/Input.test.d.ts +1 -0
- package/dist/esm/components/Input/Input.test.js +30 -0
- package/dist/esm/components/LinkAdapter/LinkAdapter.d.ts +23 -0
- package/dist/esm/components/LinkAdapter/LinkAdapter.js +31 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.d.ts +19 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.js +56 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
- package/dist/esm/components/ScrollSnap/ScrollSnap.stories.js +40 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.js +40 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.js +41 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
- package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.js +60 -0
- package/dist/esm/components/TextField/TextField.d.ts +29 -0
- package/dist/esm/components/TextField/TextField.js +30 -0
- package/dist/esm/components/TextField/TextField.stories.d.ts +10 -0
- package/dist/esm/components/TextField/TextField.stories.js +132 -0
- package/dist/esm/components/TextField/TextField.test.d.ts +1 -0
- package/dist/esm/components/TextField/TextField.test.js +75 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.d.ts +23 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.js +86 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.stories.d.ts +58 -0
- package/dist/esm/components/ThemeProvider/ThemeProvider.stories.js +94 -0
- package/dist/esm/components/ThemeProvider/Typography.stories.d.ts +39 -0
- package/dist/esm/components/ThemeProvider/Typography.stories.js +62 -0
- package/dist/esm/components/ThemeProvider/breakpoints.d.ts +4 -0
- package/dist/esm/components/ThemeProvider/breakpoints.js +16 -0
- package/dist/esm/components/ThemeProvider/buttons.d.ts +7 -0
- package/dist/esm/components/ThemeProvider/buttons.js +17 -0
- package/dist/esm/components/ThemeProvider/chips.d.ts +3 -0
- package/dist/esm/components/ThemeProvider/chips.js +151 -0
- package/dist/esm/components/ThemeProvider/colors.d.ts +32 -0
- package/dist/esm/components/ThemeProvider/colors.js +32 -0
- package/dist/esm/components/ThemeProvider/typography.d.ts +18 -0
- package/dist/esm/components/ThemeProvider/typography.js +168 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.js +30 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
- package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.js +10 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.js +73 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
- package/dist/esm/components/internal/FormHelpers/FormHelpers.test.js +91 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/jest-setup.d.ts +1 -0
- package/dist/esm/jest-setup.js +16 -0
- package/dist/esm/jsdom-extended.d.ts +6 -0
- package/dist/esm/jsdom-extended.js +12 -0
- package/dist/esm/story-utils/index.d.ts +6 -0
- package/dist/esm/story-utils/index.js +13 -0
- package/dist/esm/utils/composeRefs.d.ts +7 -0
- package/dist/esm/utils/composeRefs.js +17 -0
- package/dist/esm/utils/composeRefs.test.d.ts +1 -0
- package/dist/esm/utils/composeRefs.test.js +17 -0
- package/dist/esm/utils/useDevCheckStable.d.ts +8 -0
- package/dist/esm/utils/useDevCheckStable.js +26 -0
- package/dist/esm/utils/useInterval.d.ts +7 -0
- package/dist/esm/utils/useInterval.js +22 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/type-augmentation/TypescriptDocs.mdx +17 -0
- package/dist/type-augmentation/index.d.ts +2 -0
- package/dist/type-augmentation/theme.d.ts +103 -0
- package/dist/type-augmentation/typography.d.ts +54 -0
- package/package.json +141 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const React = require("react");
|
|
13
|
+
const react_1 = require("@testing-library/react");
|
|
14
|
+
const user_event_1 = require("@testing-library/user-event");
|
|
15
|
+
const Input_1 = require("./Input");
|
|
16
|
+
const ThemeProvider_1 = require("../ThemeProvider/ThemeProvider");
|
|
17
|
+
describe("AdornmentButton", () => {
|
|
18
|
+
it("Does not steal focus from input when clicked", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const onClick = jest.fn();
|
|
20
|
+
(0, react_1.render)(React.createElement(Input_1.Input, { endAdornment: React.createElement(Input_1.AdornmentButton, { onClick: onClick }, "Test") }), { wrapper: ThemeProvider_1.ThemeProvider });
|
|
21
|
+
const input = react_1.screen.getByRole("textbox");
|
|
22
|
+
const button = react_1.screen.getByRole("button", { name: "Test" });
|
|
23
|
+
yield user_event_1.default.click(input);
|
|
24
|
+
expect(input).toHaveFocus();
|
|
25
|
+
yield user_event_1.default.click(button);
|
|
26
|
+
expect(input).toHaveFocus();
|
|
27
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
28
|
+
// But it should still be focusable via keyboard
|
|
29
|
+
yield user_event_1.default.tab();
|
|
30
|
+
expect(button).toHaveFocus();
|
|
31
|
+
}));
|
|
32
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* LinkAdapterPropsOverrides can be used with module augmentation to provide
|
|
4
|
+
* extra props to ButtonLink.
|
|
5
|
+
*
|
|
6
|
+
* For example, in a NextJS App, you might set `next/link` as your default
|
|
7
|
+
* Link implementation, and use LinkAdapterPropsOverrides to provide
|
|
8
|
+
* `next/link`-specific props.
|
|
9
|
+
*/
|
|
10
|
+
interface LinkAdapterPropsOverrides {
|
|
11
|
+
}
|
|
12
|
+
type LinkAdapterProps = React.ComponentProps<"a"> & {
|
|
13
|
+
Component?: React.ElementType;
|
|
14
|
+
} & LinkAdapterPropsOverrides;
|
|
15
|
+
/**
|
|
16
|
+
* Overrideable link component.
|
|
17
|
+
* - If `Component` is provided, renders as `Component`
|
|
18
|
+
* - else, if `theme.custom.LinkAdapter` is provided, renders as `theme.custom.LinkAdapter`
|
|
19
|
+
* - else, renders as `a` tag
|
|
20
|
+
*/
|
|
21
|
+
declare const LinkAdapter: React.ForwardRefExoticComponent<Omit<LinkAdapterProps, "ref"> & React.RefAttributes<HTMLAnchorElement>>;
|
|
22
|
+
export { LinkAdapter };
|
|
23
|
+
export type { LinkAdapterPropsOverrides };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.LinkAdapter = void 0;
|
|
15
|
+
const React = require("react");
|
|
16
|
+
const react_1 = require("@emotion/react");
|
|
17
|
+
const styled_1 = require("@emotion/styled");
|
|
18
|
+
const PlainLink = styled_1.default.a({
|
|
19
|
+
color: "inherit",
|
|
20
|
+
textDecoration: "none",
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Overrideable link component.
|
|
24
|
+
* - If `Component` is provided, renders as `Component`
|
|
25
|
+
* - else, if `theme.custom.LinkAdapter` is provided, renders as `theme.custom.LinkAdapter`
|
|
26
|
+
* - else, renders as `a` tag
|
|
27
|
+
*/
|
|
28
|
+
const LinkAdapter = React.forwardRef(function LinkAdapter(_a, ref) {
|
|
29
|
+
var { Component } = _a, props = __rest(_a, ["Component"]);
|
|
30
|
+
const theme = (0, react_1.useTheme)();
|
|
31
|
+
const LinkComponent = Component !== null && Component !== void 0 ? Component : theme.custom.LinkAdapter;
|
|
32
|
+
return React.createElement(PlainLink, Object.assign({ as: LinkComponent, ref: ref }, props));
|
|
33
|
+
});
|
|
34
|
+
exports.LinkAdapter = LinkAdapter;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type ScrollSnapProps = {
|
|
3
|
+
/**
|
|
4
|
+
* Tolerance within which scroll will be considered "at the bottom" of the element.
|
|
5
|
+
*/
|
|
6
|
+
threshold?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Content to be displayed
|
|
9
|
+
*/
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Component that automatically scrolls to the bottom of the element when new
|
|
15
|
+
* content is added, unless the user has scrolled up.
|
|
16
|
+
*/
|
|
17
|
+
declare const ScrollSnap: React.ForwardRefExoticComponent<ScrollSnapProps & React.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
export { ScrollSnap };
|
|
19
|
+
export type { ScrollSnapProps };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScrollSnap = void 0;
|
|
4
|
+
const composeRefs_1 = require("../../utils/composeRefs");
|
|
5
|
+
const styled_1 = require("@emotion/styled");
|
|
6
|
+
const React = require("react");
|
|
7
|
+
/**
|
|
8
|
+
* Returns the distance between visible content and the bottom of the element.
|
|
9
|
+
*/
|
|
10
|
+
const distanceFromBottom = (el) => {
|
|
11
|
+
return el.scrollHeight - el.clientHeight - el.scrollTop;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Scrolls to the bottom of the element.
|
|
15
|
+
*/
|
|
16
|
+
const scrollToBottom = (el) => {
|
|
17
|
+
el.scrollTop = el.scrollHeight;
|
|
18
|
+
};
|
|
19
|
+
const Scroller = styled_1.default.div({
|
|
20
|
+
overflow: "auto",
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Component that automatically scrolls to the bottom of the element when new
|
|
24
|
+
* content is added, unless the user has scrolled up.
|
|
25
|
+
*/
|
|
26
|
+
const ScrollSnap = React.forwardRef(function ScrollSnap({ children, threshold = 2, className }, ref) {
|
|
27
|
+
const el = React.useRef();
|
|
28
|
+
// `content` a delayed version of children to allow measuring scroll position
|
|
29
|
+
// using the old children.
|
|
30
|
+
const [content, setContent] = React.useState(children);
|
|
31
|
+
const wasAtBottom = React.useRef(null);
|
|
32
|
+
/**
|
|
33
|
+
* The next two effects:
|
|
34
|
+
* 1. Check if the element is at the bottom.
|
|
35
|
+
* 2. Then set children -> content
|
|
36
|
+
* 3. Then scroll to bottom (if needed)
|
|
37
|
+
*
|
|
38
|
+
* In this way, we can measure the scroll position before the new content is set.
|
|
39
|
+
*
|
|
40
|
+
* In React 19, this started requiring useLayoutEffect.
|
|
41
|
+
*/
|
|
42
|
+
React.useLayoutEffect(() => {
|
|
43
|
+
if (!el.current)
|
|
44
|
+
return;
|
|
45
|
+
wasAtBottom.current = distanceFromBottom(el.current) < threshold;
|
|
46
|
+
setContent(children);
|
|
47
|
+
}, [children, threshold]);
|
|
48
|
+
React.useLayoutEffect(() => {
|
|
49
|
+
if (!el.current)
|
|
50
|
+
return;
|
|
51
|
+
const atBottom = distanceFromBottom(el.current) < threshold;
|
|
52
|
+
if (wasAtBottom.current && !atBottom) {
|
|
53
|
+
scrollToBottom(el.current);
|
|
54
|
+
wasAtBottom.current = null;
|
|
55
|
+
}
|
|
56
|
+
}, [content, threshold]);
|
|
57
|
+
return (React.createElement(Scroller, { className: className, ref: (0, composeRefs_1.composeRefs)(el, ref) }, content));
|
|
58
|
+
});
|
|
59
|
+
exports.ScrollSnap = ScrollSnap;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Chat = void 0;
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const ScrollSnap_1 = require("./ScrollSnap");
|
|
6
|
+
const styled_1 = require("@emotion/styled");
|
|
7
|
+
const en_1 = require("@faker-js/faker/locale/en");
|
|
8
|
+
const useInterval_1 = require("../../utils/useInterval");
|
|
9
|
+
const Slider_1 = require("@mui/material/Slider");
|
|
10
|
+
const Stack_1 = require("@mui/material/Stack");
|
|
11
|
+
const Typography_1 = require("@mui/material/Typography");
|
|
12
|
+
const Button_1 = require("../Button/Button");
|
|
13
|
+
const Scroller = (0, styled_1.default)(ScrollSnap_1.ScrollSnap)({
|
|
14
|
+
width: "200px",
|
|
15
|
+
height: "350px",
|
|
16
|
+
border: "1pt solid black",
|
|
17
|
+
});
|
|
18
|
+
const meta = {
|
|
19
|
+
title: "smoot-design/ScrollSnap",
|
|
20
|
+
component: ScrollSnap_1.ScrollSnap,
|
|
21
|
+
render: function Render(args) {
|
|
22
|
+
const MAX = 3000;
|
|
23
|
+
const [updateInterval, setUpdateInterval] = React.useState(MAX);
|
|
24
|
+
const [children, setChildren] = React.useState(en_1.faker.lorem.sentence());
|
|
25
|
+
const appendText = () => setChildren((current) => {
|
|
26
|
+
return `${current} ${en_1.faker.lorem.sentence()}`;
|
|
27
|
+
});
|
|
28
|
+
(0, useInterval_1.useInterval)(() => {
|
|
29
|
+
appendText();
|
|
30
|
+
}, updateInterval === MAX ? null : updateInterval);
|
|
31
|
+
return (React.createElement(Stack_1.default, { gap: "12px", alignItems: "start" },
|
|
32
|
+
React.createElement(Typography_1.default, null, "Update interval (ms)"),
|
|
33
|
+
React.createElement(Slider_1.default, { sx: { width: "350px" }, marks: [
|
|
34
|
+
{ value: 100, label: "0.1s" },
|
|
35
|
+
{ value: 2000, label: "2s" },
|
|
36
|
+
{ value: MAX, label: "off" },
|
|
37
|
+
], value: updateInterval, min: 100, max: MAX, onChange: (_e, val) => setUpdateInterval(val) }),
|
|
38
|
+
React.createElement(Scroller, Object.assign({}, args), children),
|
|
39
|
+
React.createElement(Button_1.Button, { onClick: appendText }, "Append Sentence")));
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
exports.default = meta;
|
|
43
|
+
exports.Chat = {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type SrAnnouncerProps = {
|
|
3
|
+
/**
|
|
4
|
+
* Message text to be read to user.
|
|
5
|
+
*
|
|
6
|
+
* Cannot contain HTML elements—only text.
|
|
7
|
+
*/
|
|
8
|
+
message: string;
|
|
9
|
+
/**
|
|
10
|
+
* Messages to display while the component is in a loading state.
|
|
11
|
+
*
|
|
12
|
+
* Identical consecutive messages may not be read on some screen readers.
|
|
13
|
+
*/
|
|
14
|
+
loadingMessages?: {
|
|
15
|
+
delay: number;
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isLoading: boolean;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A component that announces messages to screen readers as they come in.
|
|
22
|
+
*/
|
|
23
|
+
declare const SrAnnouncer: React.FC<SrAnnouncerProps>;
|
|
24
|
+
export { SrAnnouncer };
|
|
25
|
+
export type { SrAnnouncerProps };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SrAnnouncer = void 0;
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const VisuallyHidden_1 = require("../VisuallyHidden/VisuallyHidden");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const useDevCheckStable_1 = require("../../utils/useDevCheckStable");
|
|
8
|
+
const DEFAULT_PROPS = {
|
|
9
|
+
loadingMessages: [
|
|
10
|
+
{ delay: 1500, text: "Loading" },
|
|
11
|
+
{ delay: 4000, text: "Still loading" },
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* A component that announces messages to screen readers as they come in.
|
|
16
|
+
*/
|
|
17
|
+
const SrAnnouncer = ({ message, isLoading, loadingMessages = DEFAULT_PROPS.loadingMessages, }) => {
|
|
18
|
+
var _a;
|
|
19
|
+
const [loadingMsgIndex, setLoadingMsgIndex] = React.useState(-1);
|
|
20
|
+
/**
|
|
21
|
+
* If loadingMessages changes, the timeouts are reset.
|
|
22
|
+
* Desirable if the change is real, undesirable if it's a mistake (e.g., by
|
|
23
|
+
* passing an array literal as a prop).
|
|
24
|
+
*/
|
|
25
|
+
(0, useDevCheckStable_1.useDevCheckStable)(loadingMessages, "SrAnnouncer: loadingMessages changed (by ===) unexpectedly. This may interfere with loading message visibility");
|
|
26
|
+
(0, react_1.useEffect)(() => {
|
|
27
|
+
setLoadingMsgIndex(-1);
|
|
28
|
+
}, [isLoading, loadingMessages]);
|
|
29
|
+
(0, react_1.useEffect)(() => {
|
|
30
|
+
const next = loadingMessages[loadingMsgIndex + 1];
|
|
31
|
+
if (!isLoading || !next)
|
|
32
|
+
return () => { };
|
|
33
|
+
const id = setTimeout(() => {
|
|
34
|
+
setLoadingMsgIndex(loadingMsgIndex + 1);
|
|
35
|
+
}, next.delay);
|
|
36
|
+
return () => {
|
|
37
|
+
clearTimeout(id);
|
|
38
|
+
};
|
|
39
|
+
}, [isLoading, loadingMsgIndex, loadingMessages]);
|
|
40
|
+
const loadingTxt = (_a = loadingMessages[loadingMsgIndex]) === null || _a === void 0 ? void 0 : _a.text;
|
|
41
|
+
return (React.createElement(VisuallyHidden_1.VisuallyHidden, { "aria-atomic": "true", "aria-live": "polite" }, isLoading ? loadingTxt : message));
|
|
42
|
+
};
|
|
43
|
+
exports.SrAnnouncer = SrAnnouncer;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { SrAnnouncer } from "./SrAnnouncer";
|
|
3
|
+
declare const meta: Meta<typeof SrAnnouncer>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof SrAnnouncer>;
|
|
6
|
+
export declare const ScreenreaderAnnouncements: Story;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScreenreaderAnnouncements = void 0;
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const SrAnnouncer_1 = require("./SrAnnouncer");
|
|
6
|
+
const styled_1 = require("@emotion/styled");
|
|
7
|
+
const Container = styled_1.default.div(({ forceVisible }) => [
|
|
8
|
+
forceVisible && {
|
|
9
|
+
width: "100% !important",
|
|
10
|
+
height: "100px !important",
|
|
11
|
+
"& > *:first-of-type": {
|
|
12
|
+
width: "unset !important",
|
|
13
|
+
height: "unset !important",
|
|
14
|
+
clipPath: "none !important",
|
|
15
|
+
clip: "unset !important",
|
|
16
|
+
position: "unset !important",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
]);
|
|
20
|
+
const meta = {
|
|
21
|
+
title: "smoot-design/ScreenreaderAnnouncer",
|
|
22
|
+
component: SrAnnouncer_1.SrAnnouncer,
|
|
23
|
+
decorators: function Decorator(Story) {
|
|
24
|
+
const [forceVisible, setForceVisible] = React.useState(true);
|
|
25
|
+
return (React.createElement(React.Fragment, null,
|
|
26
|
+
React.createElement("label", null,
|
|
27
|
+
"Force Visible:",
|
|
28
|
+
React.createElement("input", { type: "checkbox", checked: forceVisible, onChange: (e) => setForceVisible(e.target.checked) }),
|
|
29
|
+
React.createElement("p", null, "By default, the content of this story is visually hidden.")),
|
|
30
|
+
React.createElement("hr", null),
|
|
31
|
+
React.createElement(Container, { forceVisible: forceVisible },
|
|
32
|
+
React.createElement(Story, null))));
|
|
33
|
+
},
|
|
34
|
+
args: {
|
|
35
|
+
message: "A message to read to user",
|
|
36
|
+
isLoading: true,
|
|
37
|
+
loadingMessages: [
|
|
38
|
+
{ delay: 1000, text: "Loading" },
|
|
39
|
+
{ delay: 3000, text: "Still loading" },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
exports.default = meta;
|
|
44
|
+
exports.ScreenreaderAnnouncements = {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const React = require("react");
|
|
13
|
+
const react_1 = require("@testing-library/react");
|
|
14
|
+
const SrAnnouncer_1 = require("./SrAnnouncer");
|
|
15
|
+
const sleep = (ms) => {
|
|
16
|
+
(0, react_1.act)(() => {
|
|
17
|
+
jest.advanceTimersByTime(ms);
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
describe("SrAnnouncer", () => {
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
jest.useFakeTimers();
|
|
23
|
+
jest.clearAllTimers();
|
|
24
|
+
});
|
|
25
|
+
test("Renders a message when not loading", () => {
|
|
26
|
+
const { container } = (0, react_1.render)(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", isLoading: false }));
|
|
27
|
+
expect(container.textContent).toBe("Hello, world!");
|
|
28
|
+
});
|
|
29
|
+
test("Renders a loading message when loading", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
+
const loadingMessages = [
|
|
31
|
+
{ delay: 100, text: "Loading 1" },
|
|
32
|
+
{ delay: 200, text: "Loading 2" },
|
|
33
|
+
];
|
|
34
|
+
const { container, rerender } = (0, react_1.render)(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", loadingMessages: loadingMessages, isLoading: true }));
|
|
35
|
+
expect(container.textContent).toBe("");
|
|
36
|
+
sleep(100);
|
|
37
|
+
expect(container.textContent).toBe("Loading 1");
|
|
38
|
+
sleep(100);
|
|
39
|
+
expect(container.textContent).toBe("Loading 1");
|
|
40
|
+
sleep(100);
|
|
41
|
+
expect(container.textContent).toBe("Loading 2");
|
|
42
|
+
sleep(1000);
|
|
43
|
+
expect(container.textContent).toBe("Loading 2");
|
|
44
|
+
rerender(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", loadingMessages: loadingMessages, isLoading: false }));
|
|
45
|
+
expect(container.textContent).toBe("Hello, world!");
|
|
46
|
+
rerender(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", loadingMessages: loadingMessages, isLoading: true }));
|
|
47
|
+
expect(container.textContent).toBe("");
|
|
48
|
+
sleep(100);
|
|
49
|
+
expect(container.textContent).toBe("Loading 1");
|
|
50
|
+
sleep(100);
|
|
51
|
+
expect(container.textContent).toBe("Loading 1");
|
|
52
|
+
sleep(100);
|
|
53
|
+
expect(container.textContent).toBe("Loading 2");
|
|
54
|
+
}));
|
|
55
|
+
test("Warns if loadingMessages changes unexpectedly", () => {
|
|
56
|
+
const error = jest.spyOn(console, "error").mockImplementation(() => { });
|
|
57
|
+
const { rerender } = (0, react_1.render)(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", isLoading: true }));
|
|
58
|
+
rerender(React.createElement(SrAnnouncer_1.SrAnnouncer, { message: "Hello, world!", isLoading: true, loadingMessages: [{ delay: 100, text: "Loading" }] }));
|
|
59
|
+
expect(error).toHaveBeenCalled();
|
|
60
|
+
error.mockRestore();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { InputProps } from "../Input/Input";
|
|
3
|
+
import type { FormFieldWrapperProps } from "../internal/FormHelpers/FormHelpers";
|
|
4
|
+
type TextFieldProps = Omit<FormFieldWrapperProps, "children"> & {
|
|
5
|
+
name: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
value?: string | null;
|
|
8
|
+
size?: InputProps["size"];
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
onChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
11
|
+
onBlur?: React.FocusEventHandler<HTMLInputElement>;
|
|
12
|
+
fullWidth?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Props forwarded to root of `<Input />`
|
|
15
|
+
*/
|
|
16
|
+
InputProps?: InputProps;
|
|
17
|
+
} & Pick<InputProps, "type" | "startAdornment" | "endAdornment" | "multiline" | "required" | "minRows" | "inputProps">;
|
|
18
|
+
/**
|
|
19
|
+
* A form field for text input. Supports labels, help text, error text, and
|
|
20
|
+
* start/end adornments. Add `multiline` for a text area.
|
|
21
|
+
*
|
|
22
|
+
* - [TextField Documentation](https://mitodl.github.io/smoot-design/https://mitodl.github.io/smoot-design/)
|
|
23
|
+
*
|
|
24
|
+
* **Note:** This component shares a name a purpose with MUI's TextField, but
|
|
25
|
+
* does not share its entire API.
|
|
26
|
+
*/
|
|
27
|
+
declare const TextField: React.FC<TextFieldProps>;
|
|
28
|
+
export { TextField };
|
|
29
|
+
export type { TextFieldProps };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TextField = void 0;
|
|
15
|
+
const React = require("react");
|
|
16
|
+
const Input_1 = require("../Input/Input");
|
|
17
|
+
const FormHelpers_1 = require("../internal/FormHelpers/FormHelpers");
|
|
18
|
+
/**
|
|
19
|
+
* A form field for text input. Supports labels, help text, error text, and
|
|
20
|
+
* start/end adornments. Add `multiline` for a text area.
|
|
21
|
+
*
|
|
22
|
+
* - [TextField Documentation](https://mitodl.github.io/smoot-design/https://mitodl.github.io/smoot-design/)
|
|
23
|
+
*
|
|
24
|
+
* **Note:** This component shares a name a purpose with MUI's TextField, but
|
|
25
|
+
* does not share its entire API.
|
|
26
|
+
*/
|
|
27
|
+
const TextField = ({ label, size, value, name, placeholder, helpText, errorText, error, required, disabled, onChange, onBlur, multiline, type, startAdornment, endAdornment, minRows, className, id, InputProps, inputProps, fullWidth, }) => {
|
|
28
|
+
return (React.createElement(FormHelpers_1.FormFieldWrapper, { id: id, label: label, required: required, helpText: helpText, error: error, errorText: errorText, className: className, fullWidth: fullWidth }, (_a) => {
|
|
29
|
+
var { labelId } = _a, childProps = __rest(_a, ["labelId"]);
|
|
30
|
+
return (React.createElement(Input_1.Input, Object.assign({ size: size, value: value, name: name, placeholder: placeholder, onChange: onChange, onBlur: onBlur, multiline: multiline, type: type, startAdornment: startAdornment, endAdornment: endAdornment, minRows: minRows, disabled: disabled, inputProps: inputProps }, InputProps, childProps)));
|
|
31
|
+
}));
|
|
32
|
+
};
|
|
33
|
+
exports.TextField = TextField;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { TextField } from "./TextField";
|
|
3
|
+
declare const meta: Meta<typeof TextField>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof TextField>;
|
|
6
|
+
export declare const Simple: Story;
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const Widths: Story;
|
|
9
|
+
export declare const Adornments: Story;
|
|
10
|
+
export declare const States: Story;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.States = exports.Adornments = exports.Widths = exports.Sizes = exports.Simple = void 0;
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const TextField_1 = require("./TextField");
|
|
6
|
+
const Input_1 = require("../Input/Input");
|
|
7
|
+
const Stack_1 = require("@mui/material/Stack");
|
|
8
|
+
const Grid_1 = require("@mui/material/Grid");
|
|
9
|
+
const react_1 = require("@remixicon/react");
|
|
10
|
+
const test_1 = require("@storybook/test");
|
|
11
|
+
const story_utils_1 = require("../../story-utils");
|
|
12
|
+
const SIZES = (0, story_utils_1.enumValues)({
|
|
13
|
+
small: true,
|
|
14
|
+
medium: true,
|
|
15
|
+
large: true,
|
|
16
|
+
hero: true,
|
|
17
|
+
});
|
|
18
|
+
const ADORNMENTS = {
|
|
19
|
+
None: undefined,
|
|
20
|
+
SearchIcon: (React.createElement(Input_1.AdornmentButton, null,
|
|
21
|
+
React.createElement(react_1.RiSearchLine, null))),
|
|
22
|
+
CalendarTodayIcon: (React.createElement(Input_1.AdornmentButton, null,
|
|
23
|
+
React.createElement(react_1.RiCalendarLine, null))),
|
|
24
|
+
CloseIcon: (React.createElement(Input_1.AdornmentButton, null,
|
|
25
|
+
React.createElement(react_1.RiCloseLine, null))),
|
|
26
|
+
"Close and Calendar": (React.createElement(React.Fragment, null,
|
|
27
|
+
React.createElement(Input_1.AdornmentButton, null,
|
|
28
|
+
React.createElement(react_1.RiCloseLine, null)),
|
|
29
|
+
React.createElement(Input_1.AdornmentButton, null,
|
|
30
|
+
React.createElement(react_1.RiCalendarLine, null)))),
|
|
31
|
+
};
|
|
32
|
+
const meta = {
|
|
33
|
+
title: "smoot-design/TextField",
|
|
34
|
+
component: TextField_1.TextField,
|
|
35
|
+
argTypes: {
|
|
36
|
+
size: {
|
|
37
|
+
options: SIZES,
|
|
38
|
+
control: { type: "select" },
|
|
39
|
+
},
|
|
40
|
+
startAdornment: {
|
|
41
|
+
options: Object.keys(ADORNMENTS),
|
|
42
|
+
mapping: ADORNMENTS,
|
|
43
|
+
control: { type: "select" },
|
|
44
|
+
},
|
|
45
|
+
endAdornment: {
|
|
46
|
+
options: Object.keys(ADORNMENTS),
|
|
47
|
+
mapping: ADORNMENTS,
|
|
48
|
+
control: { type: "select" },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
args: {
|
|
52
|
+
onChange: (0, test_1.fn)(),
|
|
53
|
+
multiline: false,
|
|
54
|
+
disabled: false,
|
|
55
|
+
value: "some value",
|
|
56
|
+
placeholder: "placeholder",
|
|
57
|
+
label: "Label",
|
|
58
|
+
helpText: "Help text the quick brown fox jumps over the lazy dog",
|
|
59
|
+
errorText: "Error text the quick brown fox jumps over the lazy dog",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
exports.default = meta;
|
|
63
|
+
exports.Simple = {
|
|
64
|
+
render: (args) => {
|
|
65
|
+
return React.createElement(TextField_1.TextField, Object.assign({}, args));
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
exports.Sizes = {
|
|
69
|
+
render: (args) => {
|
|
70
|
+
return (React.createElement(Stack_1.default, { direction: "row", gap: 1 },
|
|
71
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { size: "small" })),
|
|
72
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { size: "medium" })),
|
|
73
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { size: "large" })),
|
|
74
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { size: "hero" }))));
|
|
75
|
+
},
|
|
76
|
+
argTypes: { size: { table: { disable: true } } },
|
|
77
|
+
};
|
|
78
|
+
exports.Widths = {
|
|
79
|
+
render: (args) => {
|
|
80
|
+
return (React.createElement(Stack_1.default, { direction: "column", gap: 1 },
|
|
81
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { label: "default" })),
|
|
82
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { label: "fullWidth", fullWidth: true }))));
|
|
83
|
+
},
|
|
84
|
+
argTypes: { fullWidth: { table: { disable: true } } },
|
|
85
|
+
};
|
|
86
|
+
exports.Adornments = {
|
|
87
|
+
render: (args) => {
|
|
88
|
+
const adornments = [
|
|
89
|
+
{ startAdornment: ADORNMENTS.SearchIcon },
|
|
90
|
+
{ endAdornment: ADORNMENTS.CloseIcon },
|
|
91
|
+
{
|
|
92
|
+
startAdornment: ADORNMENTS.SearchIcon,
|
|
93
|
+
endAdornment: ADORNMENTS["Close and Calendar"],
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
return (React.createElement(Grid_1.default, { container: true, maxWidth: "600px", spacing: 2 }, Object.values(adornments).flatMap((props, i) => SIZES.map((size) => {
|
|
97
|
+
return (React.createElement(Grid_1.default, { item: true, xs: 6, key: `${i}-${size}` },
|
|
98
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { size: size }, props))));
|
|
99
|
+
}))));
|
|
100
|
+
},
|
|
101
|
+
argTypes: {
|
|
102
|
+
startAdornment: { table: { disable: true } },
|
|
103
|
+
endAdornment: { table: { disable: true } },
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
exports.States = {
|
|
107
|
+
render: (args) => {
|
|
108
|
+
return (React.createElement(Grid_1.default, { container: true, spacing: 2, alignItems: "top", maxWidth: "400px" },
|
|
109
|
+
React.createElement(Grid_1.default, { item: true, xs: 4 }, "Placeholder"),
|
|
110
|
+
React.createElement(Grid_1.default, { item: true, xs: 8 },
|
|
111
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { value: "" }))),
|
|
112
|
+
React.createElement(Grid_1.default, { item: true, xs: 4 }, "Default"),
|
|
113
|
+
React.createElement(Grid_1.default, { item: true, xs: 8 },
|
|
114
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args))),
|
|
115
|
+
React.createElement(Grid_1.default, { item: true, xs: 4 }, "Required"),
|
|
116
|
+
React.createElement(Grid_1.default, { item: true, xs: 8 },
|
|
117
|
+
React.createElement(TextField_1.TextField, Object.assign({ required: true }, args))),
|
|
118
|
+
React.createElement(Grid_1.default, { item: true, xs: 4 }, "Error"),
|
|
119
|
+
React.createElement(Grid_1.default, { item: true, xs: 8 },
|
|
120
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { error: true }))),
|
|
121
|
+
React.createElement(Grid_1.default, { item: true, xs: 4 }, "Disabled"),
|
|
122
|
+
React.createElement(Grid_1.default, { item: true, xs: 8 },
|
|
123
|
+
React.createElement(TextField_1.TextField, Object.assign({}, args, { disabled: true })))));
|
|
124
|
+
},
|
|
125
|
+
args: {
|
|
126
|
+
placeholder: "This is placeholder text.",
|
|
127
|
+
value: "Some value",
|
|
128
|
+
},
|
|
129
|
+
argTypes: {
|
|
130
|
+
placeholder: { table: { disable: true } },
|
|
131
|
+
value: { table: { disable: true } },
|
|
132
|
+
error: { table: { disable: true } },
|
|
133
|
+
disabled: { table: { disable: true } },
|
|
134
|
+
},
|
|
135
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|