@kaio-xyz/design-system 1.0.26 → 1.0.27

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.
@@ -1,4 +1,4 @@
1
- import { AnchorHTMLAttributes, ButtonHTMLAttributes } from "react";
1
+ import { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';
2
2
  export type CommonButtonProps = {
3
3
  variant?: "primary" | "secondary" | "info" | "warning" | "danger" | "success";
4
4
  fullWidth?: boolean;
@@ -0,0 +1 @@
1
+ export { Loader } from "./loader";
@@ -0,0 +1,8 @@
1
+ import { PropsWithChildren } from 'react';
2
+ type LoaderProps = PropsWithChildren<{
3
+ fullPage?: boolean;
4
+ text?: string;
5
+ isLightOverlay?: boolean;
6
+ }>;
7
+ export declare const Loader: ({ text, fullPage, isLightOverlay, children }: LoaderProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,38 @@
1
+ import type { StoryObj } from "@storybook/react";
2
+ declare const meta: {
3
+ title: string;
4
+ component: ({ text, fullPage, isLightOverlay, children }: {
5
+ fullPage?: boolean;
6
+ text?: string;
7
+ isLightOverlay?: boolean;
8
+ } & {
9
+ children?: import("react").ReactNode | undefined;
10
+ }) => import("react/jsx-runtime").JSX.Element;
11
+ tags: string[];
12
+ parameters: {
13
+ layout: string;
14
+ };
15
+ argTypes: {
16
+ fullPage: {
17
+ description: string;
18
+ };
19
+ text: {
20
+ description: string;
21
+ };
22
+ isLightOverlay: {
23
+ description: string;
24
+ };
25
+ children: {
26
+ description: string;
27
+ };
28
+ };
29
+ };
30
+ export default meta;
31
+ type Story = StoryObj<typeof meta>;
32
+ export declare const Default: Story;
33
+ export declare const WithText: Story;
34
+ export declare const FullPage: Story;
35
+ export declare const ContentArea: Story;
36
+ export declare const LightOverlay: Story;
37
+ export declare const LightOverlayContentArea: Story;
38
+ export declare const WithChildren: Story;
@@ -0,0 +1 @@
1
+ export { Spinner } from "./spinner";
@@ -0,0 +1,7 @@
1
+ type SpinnerProps = {
2
+ size?: number;
3
+ duration?: number;
4
+ className?: string;
5
+ };
6
+ export declare const Spinner: ({ size, duration, className, ...rest }: SpinnerProps) => import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,35 @@
1
+ import type { StoryObj } from "@storybook/react";
2
+ declare const meta: {
3
+ title: string;
4
+ component: ({ size, duration, className, ...rest }: {
5
+ size?: number;
6
+ duration?: number;
7
+ className?: string;
8
+ }) => import("react/jsx-runtime").JSX.Element;
9
+ tags: string[];
10
+ argTypes: {
11
+ size: {
12
+ description: string;
13
+ control: {
14
+ type: "number";
15
+ };
16
+ };
17
+ duration: {
18
+ description: string;
19
+ control: {
20
+ type: "number";
21
+ };
22
+ };
23
+ className: {
24
+ description: string;
25
+ };
26
+ };
27
+ };
28
+ export default meta;
29
+ type Story = StoryObj<typeof meta>;
30
+ export declare const Default: Story;
31
+ export declare const Small: Story;
32
+ export declare const Medium: Story;
33
+ export declare const Large: Story;
34
+ export declare const Slow: Story;
35
+ export declare const Fast: Story;
package/dist/index.cjs.js CHANGED
@@ -214,16 +214,16 @@ var SvgChevronGrabber = function SvgChevronGrabber(props) {
214
214
  })));
215
215
  };
216
216
 
217
- var style$9 = {"root":"stack-module__root__AqSLk"};
217
+ var style$b = {"root":"stack-module__root__AqSLk"};
218
218
 
219
219
  var Stack = function (_a) {
220
220
  var children = _a.children, _b = _a.space, space = _b === void 0 ? "s" : _b, className = _a.className, _c = _a.position, position = _c === void 0 ? "vertical" : _c, _d = _a.fullHeight, fullHeight = _d === void 0 ? false : _d, _e = _a.fullWidth, fullWidth = _e === void 0 ? false : _e, dataTest = _a.dataTest, dataAlignItems = _a.dataAlignItems, dataCapitalize = _a.dataCapitalize, dataMarginTop = _a.dataMarginTop, dataMarginBottom = _a.dataMarginBottom, dataMarginLeft = _a.dataMarginLeft, dataPaddingBottom = _a.dataPaddingBottom, rest = __rest(_a, ["children", "space", "className", "position", "fullHeight", "fullWidth", "dataTest", "dataAlignItems", "dataCapitalize", "dataMarginTop", "dataMarginBottom", "dataMarginLeft", "dataPaddingBottom"]);
221
- return (jsxRuntime.jsx("div", __assign({ className: clsx(style$9.root, className), "data-space": space, "data-position": position, "data-full-width": fullWidth, "data-full-height": fullHeight, "data-test": dataTest, "data-align-items": dataAlignItems, "data-capitalize": dataCapitalize, "data-margin-top": dataMarginTop, "data-margin-bottom": dataMarginBottom, "data-margin-left": dataMarginLeft, "data-padding-bottom": dataPaddingBottom }, rest, { children: children })));
221
+ return (jsxRuntime.jsx("div", __assign({ className: clsx(style$b.root, className), "data-space": space, "data-position": position, "data-full-width": fullWidth, "data-full-height": fullHeight, "data-test": dataTest, "data-align-items": dataAlignItems, "data-capitalize": dataCapitalize, "data-margin-top": dataMarginTop, "data-margin-bottom": dataMarginBottom, "data-margin-left": dataMarginLeft, "data-padding-bottom": dataPaddingBottom }, rest, { children: children })));
222
222
  };
223
223
 
224
224
  var baseStyle = {"root":"badge-base-module__root__oUZlm"};
225
225
 
226
- var style$8 = {"root":"badge-module__root__rXpaz"};
226
+ var style$a = {"root":"badge-module__root__rXpaz"};
227
227
 
228
228
  var BadgeStatuses = {
229
229
  success: "success",
@@ -242,31 +242,42 @@ var Badge = function (_a) {
242
242
  default: return jsxRuntime.jsx(SvgCircleDashed, {});
243
243
  }
244
244
  }, [status]);
245
- return (jsxRuntime.jsx("label", __assign({ className: clsx(baseStyle.root, style$8.root), title: text, "data-status": status, "data-full-width": fullWidth, "data-test": dataTest, "data-reverted": reverted, "data-size": size }, props, { children: jsxRuntime.jsxs(Stack, { position: "horizontal", children: [hasIcon && icon, text] }) })));
245
+ return (jsxRuntime.jsx("label", __assign({ className: clsx(baseStyle.root, style$a.root), title: text, "data-status": status, "data-full-width": fullWidth, "data-test": dataTest, "data-reverted": reverted, "data-size": size }, props, { children: jsxRuntime.jsxs(Stack, { position: "horizontal", children: [hasIcon && icon, text] }) })));
246
246
  };
247
247
 
248
- var style$7 = {"root":"button-module__root__CDCDX"};
248
+ var style$9 = {"root":"button-module__root__CDCDX"};
249
+
250
+ var style$8 = {"spinner":"spinner-module__spinner__VzZj2"};
251
+
252
+ var Spinner = function (_a) {
253
+ var _b = _a.size, size = _b === void 0 ? 22 : _b, _c = _a.duration, duration = _c === void 0 ? 1 : _c, _d = _a.className, className = _d === void 0 ? '' : _d, rest = __rest(_a, ["size", "duration", "className"]);
254
+ return (jsxRuntime.jsx("div", { className: clsx(style$8.spinner, className), style: {
255
+ width: size,
256
+ height: size,
257
+ animationDuration: "".concat(duration, "s"),
258
+ }, children: jsxRuntime.jsx(SvgLoader, __assign({ width: size, height: size }, rest)) }));
259
+ };
249
260
 
250
261
  var isAnchor = function (props) { return props.href !== undefined; };
251
262
  var Button = React.forwardRef(function (_a, ref) {
252
263
  var _b = _a.fullWidth, fullWidth = _b === void 0 ? false : _b, _c = _a.variant, variant = _c === void 0 ? "primary" : _c, _d = _a.size, size = _d === void 0 ? "normal" : _d, _e = _a.isInverted, isInverted = _e === void 0 ? false : _e, _f = _a.isLoading, isLoading = _f === void 0 ? false : _f, _g = _a.iconSize, iconSize = _g === void 0 ? 22 : _g, Icon = _a.icon, props = __rest(_a, ["fullWidth", "variant", "size", "isInverted", "isLoading", "iconSize", "icon"]);
253
264
  var iconProps = { width: iconSize, height: iconSize, "aria-hidden": "true" };
254
265
  var baseIcon = Icon && jsxRuntime.jsx(Icon, __assign({}, iconProps));
255
- var loadingIcon = isLoading && jsxRuntime.jsx(SvgLoader, __assign({}, iconProps));
266
+ var loadingIcon = isLoading && jsxRuntime.jsx(Spinner, __assign({ size: iconSize }, iconProps));
256
267
  var iconChild = loadingIcon || baseIcon || null;
257
- var classes = clsx(style$7.root, props.className);
268
+ var classes = clsx(style$9.root, props.className);
258
269
  return (isAnchor(props) ? (jsxRuntime.jsx("a", __assign({ "aria-disabled": props.disabled, ref: ref }, props, { className: classes, children: props.children }))) : (jsxRuntime.jsx("button", __assign({ "aria-disabled": props.disabled, ref: ref, type: "button" }, props, { className: classes, "data-type": variant, "data-size": size, "data-full-width": fullWidth, "data-inverted": isInverted, disabled: props.disabled || isLoading, "data-is-loading": isLoading, children: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [iconChild, isLoading ? "Loading" : props.children] }) }))));
259
270
  });
260
271
  Button.displayName = "Button";
261
272
 
262
- var style$6 = {"hint":"hint-module__hint__0cpje","children":"hint-module__children__GSZxg"};
273
+ var style$7 = {"hint":"hint-module__hint__0cpje","children":"hint-module__children__GSZxg"};
263
274
 
264
275
  var Hint = function (_a) {
265
276
  var children = _a.children, className = _a.className, _b = _a.kind, kind = _b === void 0 ? "info" : _b, attributes = __rest(_a, ["children", "className", "kind"]);
266
- return (jsxRuntime.jsxs(Stack, __assign({ space: "xs", position: "horizontal", className: clsx(style$6.hint, className), "data-type": kind }, attributes, { children: [jsxRuntime.jsx(SvgInfo, {}), jsxRuntime.jsx("span", { className: style$6.children, children: children })] })));
277
+ return (jsxRuntime.jsxs(Stack, __assign({ space: "xs", position: "horizontal", className: clsx(style$7.hint, className), "data-type": kind }, attributes, { children: [jsxRuntime.jsx(SvgInfo, {}), jsxRuntime.jsx("span", { className: style$7.children, children: children })] })));
267
278
  };
268
279
 
269
- var style$5 = {"field":"text-field-module__field__iZ0TF","label":"text-field-module__label__ClJkz","container":"text-field-module__container__IKtNZ","fieldWrapper":"text-field-module__fieldWrapper__nQ7l8","textField":"text-field-module__textField__756eR","hint":"text-field-module__hint__Ad6VA"};
280
+ var style$6 = {"field":"text-field-module__field__iZ0TF","label":"text-field-module__label__ClJkz","container":"text-field-module__container__IKtNZ","fieldWrapper":"text-field-module__fieldWrapper__nQ7l8","textField":"text-field-module__textField__756eR","hint":"text-field-module__hint__Ad6VA"};
270
281
 
271
282
  var TextField = React.forwardRef(function (_a, ref) {
272
283
  var className = _a.className, disabled = _a.disabled, hint = _a.hint, id = _a.id, label = _a.label, onChange = _a.onChange, readOnly = _a.readOnly, invalid = _a.invalid, button = _a.button, _b = _a.fullWidth, fullWidth = _b === void 0 ? false : _b, _c = _a.size, size = _c === void 0 ? "default" : _c, _d = _a.noPadding, noPadding = _d === void 0 ? false : _d, _e = _a.floatingLabel, floatingLabel = _e === void 0 ? true : _e, value = _a.value, defaultValue = _a.defaultValue, onFocus = _a.onFocus, onBlur = _a.onBlur, attributes = __rest(_a, ["className", "disabled", "hint", "id", "label", "onChange", "readOnly", "invalid", "button", "fullWidth", "size", "noPadding", "floatingLabel", "value", "defaultValue", "onFocus", "onBlur"]);
@@ -303,28 +314,28 @@ var TextField = React.forwardRef(function (_a, ref) {
303
314
  setHasValue(e.target.value.length > 0);
304
315
  onChange === null || onChange === void 0 ? void 0 : onChange(e);
305
316
  };
306
- return (jsxRuntime.jsx("fieldset", { "aria-disabled": disabled, disabled: disabled, className: clsx(style$5.textField, className), "data-no-padding": noPadding, "data-full-width": fullWidth, children: jsxRuntime.jsxs("div", { className: style$5.container, "data-has-label": !!label, "data-has-hint": !!hint, "data-has-button": !!button, "data-floating-label": floatingLabel, children: [label && (jsxRuntime.jsx("label", { className: style$5.label, htmlFor: id, "data-floating": floatingLabel, "data-active": isLabelFloating, children: label })), jsxRuntime.jsxs("div", { className: style$5.fieldWrapper, children: [jsxRuntime.jsx("input", __assign({ "aria-readonly": readOnly, className: style$5.field, readOnly: readOnly, "data-type": "single", "data-size": size, "data-floating-label": floatingLabel, id: id, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, "data-invalid": invalid, ref: inputRef, type: "text", value: value, defaultValue: defaultValue }, attributes)), button ? button : null] }), hint && jsxRuntime.jsx(Hint, { kind: "error", className: style$5.hint, children: hint })] }) }));
317
+ return (jsxRuntime.jsx("fieldset", { "aria-disabled": disabled, disabled: disabled, className: clsx(style$6.textField, className), "data-no-padding": noPadding, "data-full-width": fullWidth, children: jsxRuntime.jsxs("div", { className: style$6.container, "data-has-label": !!label, "data-has-hint": !!hint, "data-has-button": !!button, "data-floating-label": floatingLabel, children: [label && (jsxRuntime.jsx("label", { className: style$6.label, htmlFor: id, "data-floating": floatingLabel, "data-active": isLabelFloating, children: label })), jsxRuntime.jsxs("div", { className: style$6.fieldWrapper, children: [jsxRuntime.jsx("input", __assign({ "aria-readonly": readOnly, className: style$6.field, readOnly: readOnly, "data-type": "single", "data-size": size, "data-floating-label": floatingLabel, id: id, onChange: handleChange, onFocus: handleFocus, onBlur: handleBlur, "data-invalid": invalid, ref: inputRef, type: "text", value: value, defaultValue: defaultValue }, attributes)), button ? button : null] }), hint && jsxRuntime.jsx(Hint, { kind: "error", className: style$6.hint, children: hint })] }) }));
307
318
  });
308
319
  TextField.displayName = "TextField";
309
320
 
310
- var style$4 = {"container":"container-module__container__CAxQw"};
321
+ var style$5 = {"container":"container-module__container__CAxQw"};
311
322
 
312
323
  var Container = function (_a) {
313
324
  var children = _a.children, className = _a.className, size = _a.size, noPadding = _a.noPadding, attributes = __rest(_a, ["children", "className", "size", "noPadding"]);
314
- return (jsxRuntime.jsx("div", __assign({ className: clsx(style$4.container, className) }, size ? { "data-size": size } : {}, { "data-nopadding": noPadding }, attributes, { children: children })));
325
+ return (jsxRuntime.jsx("div", __assign({ className: clsx(style$5.container, className) }, size ? { "data-size": size } : {}, { "data-nopadding": noPadding }, attributes, { children: children })));
315
326
  };
316
327
 
317
- var style$3 = {"field":"password-field-module__field__-sFqA","button":"password-field-module__button__FtG9V"};
328
+ var style$4 = {"field":"password-field-module__field__-sFqA","button":"password-field-module__button__FtG9V"};
318
329
 
319
330
  var PasswordField = React.forwardRef(function (_a, ref) {
320
331
  var disabled = _a.disabled, rest = __rest(_a, ["disabled"]);
321
332
  var _b = React.useState(false), isPasswordVisible = _b[0], setIsPasswordVisible = _b[1];
322
- var button = (jsxRuntime.jsx("button", { onClick: function () { return setIsPasswordVisible(function (prev) { return !prev; }); }, type: "button", disabled: disabled, className: style$3.button, children: isPasswordVisible ? jsxRuntime.jsx(SvgEyeOpen, {}) : jsxRuntime.jsx(SvgEyeClosed, {}) }));
323
- return (jsxRuntime.jsx(TextField, __assign({ disabled: disabled }, rest, { ref: ref, type: isPasswordVisible ? "text" : "password", button: button, className: style$3.field })));
333
+ var button = (jsxRuntime.jsx("button", { onClick: function () { return setIsPasswordVisible(function (prev) { return !prev; }); }, type: "button", disabled: disabled, className: style$4.button, children: isPasswordVisible ? jsxRuntime.jsx(SvgEyeOpen, {}) : jsxRuntime.jsx(SvgEyeClosed, {}) }));
334
+ return (jsxRuntime.jsx(TextField, __assign({ disabled: disabled }, rest, { ref: ref, type: isPasswordVisible ? "text" : "password", button: button, className: style$4.field })));
324
335
  });
325
336
  PasswordField.displayName = "PasswordField";
326
337
 
327
- var style$2 = {"validator":"validate-password-field-module__validator__Do-6w"};
338
+ var style$3 = {"validator":"validate-password-field-module__validator__Do-6w"};
328
339
 
329
340
  var rules = {
330
341
  length: /^.{8,}$/,
@@ -349,19 +360,19 @@ var ValidatePasswordField = React.forwardRef(function (_a, ref) {
349
360
  React.useEffect(function () {
350
361
  setIsPasswordValid === null || setIsPasswordValid === void 0 ? void 0 : setIsPasswordValid(isLenghtCheckOk && isCaseCheckOk && isNumberCheckOk && isSpecialCheckOk);
351
362
  }, [isLenghtCheckOk, isCaseCheckOk, isNumberCheckOk, isSpecialCheckOk, setIsPasswordValid]);
352
- var getValidator = function (isCheckOk, label) { return (jsxRuntime.jsxs(Stack, { position: "horizontal", className: style$2.validator, "data-is-valid": isCheckOk, children: [isCheckOk ? jsxRuntime.jsx(SvgCheck, {}) : jsxRuntime.jsx(SvgCircleDashed, {}), jsxRuntime.jsx("p", { children: label })] })); };
363
+ var getValidator = function (isCheckOk, label) { return (jsxRuntime.jsxs(Stack, { position: "horizontal", className: style$3.validator, "data-is-valid": isCheckOk, children: [isCheckOk ? jsxRuntime.jsx(SvgCheck, {}) : jsxRuntime.jsx(SvgCircleDashed, {}), jsxRuntime.jsx("p", { children: label })] })); };
353
364
  return (jsxRuntime.jsxs(Stack, { children: [jsxRuntime.jsx(PasswordField, __assign({ onChange: onHandleChange, ref: ref }, rest)), jsxRuntime.jsxs(Stack, { children: [getValidator(isLenghtCheckOk, "At least 8 characters"), getValidator(isCaseCheckOk, "Include uppercase & lowercase letters"), getValidator(isNumberCheckOk, "Include at least one number"), getValidator(isSpecialCheckOk, "Include at least one special character (allowed: @ $ ! % * ? & _ #)")] })] }));
354
365
  });
355
366
  ValidatePasswordField.displayName = "ValidatePasswordField";
356
367
 
357
- var style$1 = {"root":"label-module__root__34bJr"};
368
+ var style$2 = {"root":"label-module__root__34bJr"};
358
369
 
359
370
  var Label = function (_a) {
360
371
  var id = _a.id, label = _a.label, className = _a.className, _b = _a.hasMargin, hasMargin = _b === void 0 ? true : _b, _c = _a.hasHalfMargin, hasHalfMargin = _c === void 0 ? false : _c, _d = _a.hasCursorPointer, hasCursorPointer = _d === void 0 ? false : _d;
361
- return (jsxRuntime.jsx("label", { className: clsx(style$1.root, className), htmlFor: id, "data-margin-bottom": hasMargin, "data-half-margin-bottom": hasHalfMargin, "data-has-cursor-pointer": hasCursorPointer, children: label }));
372
+ return (jsxRuntime.jsx("label", { className: clsx(style$2.root, className), htmlFor: id, "data-margin-bottom": hasMargin, "data-half-margin-bottom": hasHalfMargin, "data-has-cursor-pointer": hasCursorPointer, children: label }));
362
373
  };
363
374
 
364
- var style = {"label":"select-module__label__EWUYF","selector":"select-module__selector__55oxp","hint":"select-module__hint__SPtu-"};
375
+ var style$1 = {"label":"select-module__label__EWUYF","selector":"select-module__selector__55oxp","hint":"select-module__hint__SPtu-"};
365
376
 
366
377
  var IconAndLabel = function (_a) {
367
378
  var children = _a.children, Icon = _a.icon;
@@ -382,7 +393,7 @@ var CustomSingleValue = function (_a) {
382
393
  };
383
394
  var Select = function (_a) {
384
395
  var id = _a.id, label = _a.label, dataTest = _a.dataTest, isDisabled = _a.isDisabled, className = _a.className, error = _a.error, customComponents = _a.components, rest = __rest(_a, ["id", "label", "dataTest", "isDisabled", "className", "error", "components"]);
385
- return (jsxRuntime.jsxs("div", { className: clsx(style.root, className), children: [label && jsxRuntime.jsx(Label, { id: id, label: label, className: style.label }), jsxRuntime.jsxs("div", { "data-test": dataTest, className: style.selector, "data-error": !!error, children: [jsxRuntime.jsx(ReactSelect, __assign({ id: id, classNamePrefix: "select", components: __assign(__assign({}, customComponents), { IndicatorSeparator: function () { return null; }, Option: CustomOption, SingleValue: CustomSingleValue, DropdownIndicator: CustomDropdownIndicator, MultiValueLabel: CustomMultiValueLabel }) }, rest, { isDisabled: isDisabled })), error && jsxRuntime.jsx(Hint, { kind: "error", className: style.hint, children: error })] })] }));
396
+ return (jsxRuntime.jsxs("div", { className: clsx(style$1.root, className), children: [label && jsxRuntime.jsx(Label, { id: id, label: label, className: style$1.label }), jsxRuntime.jsxs("div", { "data-test": dataTest, className: style$1.selector, "data-error": !!error, children: [jsxRuntime.jsx(ReactSelect, __assign({ id: id, classNamePrefix: "select", components: __assign(__assign({}, customComponents), { IndicatorSeparator: function () { return null; }, Option: CustomOption, SingleValue: CustomSingleValue, DropdownIndicator: CustomDropdownIndicator, MultiValueLabel: CustomMultiValueLabel }) }, rest, { isDisabled: isDisabled })), error && jsxRuntime.jsx(Hint, { kind: "error", className: style$1.hint, children: error })] })] }));
386
397
  };
387
398
  Select.displayName = "Select";
388
399
 
@@ -395,12 +406,21 @@ var FormSelect = function (_a) {
395
406
  };
396
407
  FormSelect.displayName = "FormSelect";
397
408
 
409
+ var style = {"root":"loader-module__root__qnInQ"};
410
+
411
+ var Loader = function (_a) {
412
+ var text = _a.text, _b = _a.fullPage, fullPage = _b === void 0 ? true : _b, _c = _a.isLightOverlay, isLightOverlay = _c === void 0 ? false : _c, children = _a.children;
413
+ return (jsxRuntime.jsx("div", { className: style.root, "data-full-page": fullPage, "data-is-light-overlay": isLightOverlay, children: jsxRuntime.jsxs(Stack, { dataAlignItems: "center", children: [jsxRuntime.jsx(Spinner, { size: 50 }), text && jsxRuntime.jsx("p", { children: text }), children] }) }));
414
+ };
415
+
398
416
  exports.Badge = Badge;
399
417
  exports.Button = Button;
400
418
  exports.Container = Container;
401
419
  exports.FormSelect = FormSelect;
420
+ exports.Loader = Loader;
402
421
  exports.PasswordField = PasswordField;
403
422
  exports.Select = Select;
423
+ exports.Spinner = Spinner;
404
424
  exports.Stack = Stack;
405
425
  exports.TextField = TextField;
406
426
  exports.ValidatePasswordField = ValidatePasswordField;