@andrilla/mado-ui 1.0.0
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/README.md +196 -0
- package/dist/client.cjs +9163 -0
- package/dist/client.esm.js +9045 -0
- package/dist/components/button.d.ts +83 -0
- package/dist/components/checkbox.d.ts +22 -0
- package/dist/components/details.d.ts +16 -0
- package/dist/components/drop-down.d.ts +32 -0
- package/dist/components/fieldset.d.ts +18 -0
- package/dist/components/form.d.ts +3 -0
- package/dist/components/ghost.d.ts +3 -0
- package/dist/components/heading.d.ts +19 -0
- package/dist/components/human-verification.d.ts +14 -0
- package/dist/components/iframe.d.ts +15 -0
- package/dist/components/index.d.ts +18 -0
- package/dist/components/input.d.ts +35 -0
- package/dist/components/link.d.ts +116 -0
- package/dist/components/modal.d.ts +18 -0
- package/dist/components/select.d.ts +80 -0
- package/dist/components/submit-button.d.ts +49 -0
- package/dist/components/textarea.d.ts +37 -0
- package/dist/components/time.d.ts +32 -0
- package/dist/components/tooltip.d.ts +54 -0
- package/dist/components/video.d.ts +30 -0
- package/dist/css/index.css +4551 -0
- package/dist/graphics/index.d.ts +1 -0
- package/dist/graphics/social-media/facebook-logo.d.ts +32 -0
- package/dist/graphics/social-media/google-logo.d.ts +12 -0
- package/dist/graphics/social-media/index.d.ts +7 -0
- package/dist/graphics/social-media/instagram-logo.d.ts +12 -0
- package/dist/graphics/social-media/linkedin-logo.d.ts +25 -0
- package/dist/graphics/social-media/tiktok-logo.d.ts +25 -0
- package/dist/graphics/social-media/x-logo.d.ts +5 -0
- package/dist/graphics/social-media/youtube-logo.d.ts +25 -0
- package/dist/hooks/create-fast-context.d.ts +10 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/use-form-status.d.ts +10 -0
- package/dist/hooks/use-pointer-movement.d.ts +15 -0
- package/dist/icons/rectangle-triangle-up.d.ts +2 -0
- package/dist/index.cjs +9162 -0
- package/dist/index.d.ts +5 -0
- package/dist/mado-ui.esm.js +9044 -0
- package/dist/symbols/10.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/10.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/15.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/15.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/30.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/30.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/45.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/45.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/5.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/5.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/60.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/60.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/75.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/75.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/90.arrow.trianglehead.clockwise.d.ts +3 -0
- package/dist/symbols/90.arrow.trianglehead.counterclockwise.d.ts +3 -0
- package/dist/symbols/arrow.down.backward.and.arrow.up.forward.rectangle.d.ts +3 -0
- package/dist/symbols/arrow.down.backward.and.arrow.up.forward.rectangle.fill.d.ts +3 -0
- package/dist/symbols/arrow.down.forward.topleading.rectangle.fill.d.ts +3 -0
- package/dist/symbols/arrow.up.forward.and.arrow.down.backward.rectangle.d.ts +3 -0
- package/dist/symbols/calendar.d.ts +3 -0
- package/dist/symbols/checkmark.d.ts +3 -0
- package/dist/symbols/chevron.down.d.ts +3 -0
- package/dist/symbols/chevron.forward.d.ts +3 -0
- package/dist/symbols/chevron.up.chevron.down.d.ts +3 -0
- package/dist/symbols/circle.fill.d.ts +3 -0
- package/dist/symbols/clock.d.ts +3 -0
- package/dist/symbols/exclamationmark.octagon.d.ts +3 -0
- package/dist/symbols/gearshape.fill.d.ts +3 -0
- package/dist/symbols/pause.fill.d.ts +3 -0
- package/dist/symbols/photo.badge.arrow.down.fill.d.ts +3 -0
- package/dist/symbols/play.fill.d.ts +3 -0
- package/dist/symbols/plus.d.ts +3 -0
- package/dist/symbols/rectangle.fill.d.ts +3 -0
- package/dist/symbols/speaker.minus.fill.d.ts +3 -0
- package/dist/symbols/speaker.plus.fill.d.ts +3 -0
- package/dist/symbols/types.d.ts +5 -0
- package/dist/symbols/xmark.d.ts +3 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/utils/class-management.d.ts +29 -0
- package/dist/utils/custom-tailwind-merge.d.ts +4 -0
- package/dist/utils/get-date.d.ts +170 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/math.d.ts +1 -0
- package/dist/utils/regex.d.ts +12 -0
- package/dist/utils/string-manipulation.d.ts +74 -0
- package/package.json +66 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { ElementType, JSX } from 'react';
|
|
2
|
+
import type { AnyElementProps, ColorTheme, OneOf } from '../types';
|
|
3
|
+
type LinkOrOther<TTag extends ElementType = typeof HeadlessButton> = OneOf<[
|
|
4
|
+
AnyElementProps<TTag>,
|
|
5
|
+
AnyElementProps<typeof Anchor>
|
|
6
|
+
]>;
|
|
7
|
+
export type ButtonPadding = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
8
|
+
export type ButtonBorderRadius = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
9
|
+
export type ButtonProps<TTag extends ElementType = typeof HeadlessButton> = LinkOrOther<TTag> & ColorTheme & {
|
|
10
|
+
/** Customizes the theme color to a sensible gradient. */
|
|
11
|
+
gradient?: boolean;
|
|
12
|
+
/** The size of the element based on padding. */
|
|
13
|
+
padding?: ButtonPadding;
|
|
14
|
+
/** The size of the border radius. */
|
|
15
|
+
rounded?: ButtonBorderRadius;
|
|
16
|
+
};
|
|
17
|
+
export type ExtendedButtonConfig = {
|
|
18
|
+
/** Modifies the default(s) for what element is rendered. The `as` prop on the component still overrides the default(s) set here. */
|
|
19
|
+
as?: ElementType | {
|
|
20
|
+
/** Modifies the base link element when `href` is present. */
|
|
21
|
+
link?: ElementType;
|
|
22
|
+
/** Modifies the base button element. */
|
|
23
|
+
default?: ElementType;
|
|
24
|
+
};
|
|
25
|
+
/** Adds default classes. */
|
|
26
|
+
className?: string;
|
|
27
|
+
defaultTheme?: ColorTheme['theme'] | string;
|
|
28
|
+
/** Sets the default for the `gradient` prop. */
|
|
29
|
+
gradient?: boolean;
|
|
30
|
+
/** Sets the default for the `padding` prop. */
|
|
31
|
+
padding?: ButtonPadding;
|
|
32
|
+
/** Sets the default for the `rounded` prop. */
|
|
33
|
+
rounded?: ButtonBorderRadius;
|
|
34
|
+
/** Add more theme options. */
|
|
35
|
+
theme?: {
|
|
36
|
+
[themeName: string]: {
|
|
37
|
+
/** Custom theme configuration */
|
|
38
|
+
customTheme: NonNullable<ColorTheme['customTheme']>;
|
|
39
|
+
/** Additional CSS classes to apply */
|
|
40
|
+
className?: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
type ExtendedThemeNames<T extends ExtendedButtonConfig> = T['theme'] extends Record<PropertyKey, never> ? keyof T['theme'] : never;
|
|
45
|
+
export type ExtendedButtonProps<TExtendedConfig extends ExtendedButtonConfig, TTag extends ElementType = typeof HeadlessButton> = Omit<ButtonProps<TTag>, 'theme' | 'customTheme'> & {
|
|
46
|
+
theme?: ButtonProps<TTag>['theme'] | ExtendedThemeNames<TExtendedConfig>;
|
|
47
|
+
customTheme?: ButtonProps<TTag>['customTheme'];
|
|
48
|
+
};
|
|
49
|
+
import { Anchor } from './link';
|
|
50
|
+
import { Button as HeadlessButton } from '@headlessui/react';
|
|
51
|
+
/**
|
|
52
|
+
* # Button
|
|
53
|
+
* - A pre-styled button with utility props for easy customization depending on use case.
|
|
54
|
+
*/
|
|
55
|
+
export declare function Button<TTag extends ElementType = typeof HeadlessButton>({ className, customTheme, gradient, padding, rounded, theme, ...props }: ButtonProps<TTag>): JSX.Element;
|
|
56
|
+
/**
|
|
57
|
+
* # createButton
|
|
58
|
+
* Creates an extended Button component with additional theme options.
|
|
59
|
+
*
|
|
60
|
+
* @param extendedThemes - Configuration object defining new themes
|
|
61
|
+
* @returns A new Button component with extended theme support
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```tsx
|
|
65
|
+
* const MyButton = createButton({
|
|
66
|
+
* as: {
|
|
67
|
+
* default: 'div',
|
|
68
|
+
* link: NextLink
|
|
69
|
+
* },
|
|
70
|
+
* className: 'min-w-64',
|
|
71
|
+
* padding: 'sm',
|
|
72
|
+
* rounded: 'full',
|
|
73
|
+
* theme: {
|
|
74
|
+
* primary: {
|
|
75
|
+
* customTheme: { themeColor: '[--theme-color:var(--color-primary-500)]' },
|
|
76
|
+
* className: 'text-white'
|
|
77
|
+
* }
|
|
78
|
+
* }
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function createButton<TExtendedConfig extends ExtendedButtonConfig>(config: TExtendedConfig): <TTag extends ElementType = typeof HeadlessButton>({ theme, className, customTheme, gradient, padding, rounded, as, ...props }: ExtendedButtonProps<TExtendedConfig, TTag>) => JSX.Element;
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type CheckboxProps = Omit<HeadlessCheckboxProps, 'children'> & {
|
|
2
|
+
checkmark?: ReactNode;
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
description?: DescriptionProps['children'];
|
|
5
|
+
descriptionProps?: Omit<DescriptionProps, 'children'> & {
|
|
6
|
+
/** @deprecated use `description` prop instead */
|
|
7
|
+
children?: never;
|
|
8
|
+
};
|
|
9
|
+
fieldProps?: Omit<FieldProps, 'children'> & {
|
|
10
|
+
/** @deprecated use `children` prop instead */
|
|
11
|
+
children?: never;
|
|
12
|
+
};
|
|
13
|
+
labelProps?: Omit<LabelProps, 'children'> & {
|
|
14
|
+
/** @deprecated use `children` prop instead */
|
|
15
|
+
children?: never;
|
|
16
|
+
};
|
|
17
|
+
inputContainerProps?: ComponentPropsWithRef<'div'>;
|
|
18
|
+
required?: boolean;
|
|
19
|
+
};
|
|
20
|
+
import { type ComponentPropsWithRef, type JSX, type ReactNode } from 'react';
|
|
21
|
+
import { type CheckboxProps as HeadlessCheckboxProps, type DescriptionProps, type FieldProps, type LabelProps } from '@headlessui/react';
|
|
22
|
+
export declare function Checkbox({ checkmark, children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps }, fieldProps: { className: fieldClassName, ...fieldProps }, labelProps: { className: labelClassName, ...labelProps }, inputContainerProps: { className: inputContainerClassName, ...inputContainerProps }, onChange, required, value, ...props }: CheckboxProps): JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ElementType, type JSX, type ReactNode } from 'react';
|
|
2
|
+
export type DetailsBodyProps<TTag extends ElementType = 'div'> = Omit<DisclosurePanelProps<TTag>, 'className'> & {
|
|
3
|
+
className?: string;
|
|
4
|
+
};
|
|
5
|
+
export type DetailsProps<TTag extends ElementType = 'div'> = Omit<DisclosureProps<TTag>, 'className' | 'role'> & {
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
export type DetailsSummaryProps<TTag extends ElementType = typeof Button<typeof HeadlessButton>> = Omit<DisclosureButtonProps<TTag>, 'as' | 'className' | 'role'> & {
|
|
9
|
+
arrow?: boolean | ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
};
|
|
12
|
+
import { type Button as HeadlessButton, type DisclosureButtonProps, type DisclosurePanelProps, type DisclosureProps } from '@headlessui/react';
|
|
13
|
+
import { Button } from './button';
|
|
14
|
+
export declare function DetailsSummary<TTag extends ElementType = typeof Button>({ arrow, children, className, onClick, ...props }: DetailsSummaryProps<TTag>): JSX.Element;
|
|
15
|
+
export declare function DetailsBody<TTag extends ElementType = 'div'>({ children, className, ...props }: DetailsBodyProps<TTag>): JSX.Element;
|
|
16
|
+
export declare function Details<TTag extends ElementType = 'div'>({ as, className, ...props }: DetailsProps<TTag>): JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AnyElementProps } from '../types';
|
|
2
|
+
import type { ElementType, JSX, ReactNode } from 'react';
|
|
3
|
+
export type DropDownButtonProps<TTag extends ElementType = 'button'> = Omit<MenuButtonProps<TTag>, 'as' | 'className'> & {
|
|
4
|
+
arrow?: boolean | ReactNode;
|
|
5
|
+
as?: TTag | ElementType;
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
export type DropDownItemProps<TTag extends ElementType = 'div'> = Omit<MenuItemProps<TTag>, 'as'> & AnyElementProps<TTag>;
|
|
9
|
+
export type DropDownItemsProps = Omit<MenuItemsProps, 'className' | 'transition'> & {
|
|
10
|
+
className?: string;
|
|
11
|
+
containerClassName?: string;
|
|
12
|
+
};
|
|
13
|
+
export type DropDownProps = MenuProps;
|
|
14
|
+
export type DropDownSectionProps = MenuSectionProps & {
|
|
15
|
+
label?: ReactNode;
|
|
16
|
+
labelProps?: Omit<MenuHeadingProps, 'children'> & {
|
|
17
|
+
/** @deprecated Use `label` instead. */
|
|
18
|
+
children?: never;
|
|
19
|
+
};
|
|
20
|
+
separatorAbove?: boolean;
|
|
21
|
+
separatorBelow?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type DropDownSeparatorProps<TTag extends ElementType = 'div'> = Omit<MenuSeparatorProps<TTag>, 'as'> & AnyElementProps<TTag> & {
|
|
24
|
+
className?: MenuSeparatorProps['className'];
|
|
25
|
+
};
|
|
26
|
+
import { type MenuButtonProps, type MenuHeadingProps, type MenuItemProps, type MenuItemsProps, type MenuProps, type MenuSectionProps, type MenuSeparatorProps } from '@headlessui/react';
|
|
27
|
+
export declare function DropDownButton<TTag extends ElementType = 'button'>({ arrow, as, children, className, ...props }: DropDownButtonProps<TTag>): JSX.Element;
|
|
28
|
+
export declare function DropDownItem<TTag extends ElementType = 'div'>({ as, ...props }: DropDownItemProps<TTag>): JSX.Element;
|
|
29
|
+
export declare function DropDownItems({ anchor, children, className, containerClassName, style, ...props }: DropDownItemsProps): JSX.Element;
|
|
30
|
+
export declare function DropDownSection({ children, label, labelProps, separatorAbove, separatorBelow, ...props }: DropDownSectionProps): JSX.Element;
|
|
31
|
+
export declare function DropDownSeparator<TTag extends ElementType = 'div'>({ as, className, ...props }: DropDownSeparatorProps<TTag>): JSX.Element;
|
|
32
|
+
export declare function DropDown(props: DropDownProps): JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { OneOf } from '../types';
|
|
2
|
+
import type { JSX } from 'react';
|
|
3
|
+
type NameOrLegend = OneOf<[
|
|
4
|
+
{
|
|
5
|
+
legend: string;
|
|
6
|
+
legendProps?: Omit<LegendProps, 'children'> & {
|
|
7
|
+
/** @deprecated Use the `legend` prop instead. */
|
|
8
|
+
children?: never;
|
|
9
|
+
};
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: string;
|
|
13
|
+
}
|
|
14
|
+
]>;
|
|
15
|
+
export type FieldsetProps = Omit<HeadlessFieldsetProps, 'name'> & NameOrLegend;
|
|
16
|
+
import { type FieldsetProps as HeadlessFieldsetProps, type LegendProps } from '@headlessui/react';
|
|
17
|
+
export declare function Fieldset({ children, className, legend, legendProps, name, ...props }: FieldsetProps): JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type HeadingProps = ComponentPropsWithRef<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'> & {
|
|
2
|
+
as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
3
|
+
customize?: Partial<{
|
|
4
|
+
h1: string;
|
|
5
|
+
h2: string;
|
|
6
|
+
h3: string;
|
|
7
|
+
h4: string;
|
|
8
|
+
h5: string;
|
|
9
|
+
h6: string;
|
|
10
|
+
}>;
|
|
11
|
+
ref?: RefObject<HTMLHeadingElement | null>;
|
|
12
|
+
};
|
|
13
|
+
import { type ComponentPropsWithRef, type JSX, type RefObject } from 'react';
|
|
14
|
+
/**
|
|
15
|
+
* # Heading
|
|
16
|
+
* A heading component that renders HTML heading elements (h1-h6) with appropriate styling.
|
|
17
|
+
* Automatically generates an ID for the heading based on its content if none is provided.
|
|
18
|
+
*/
|
|
19
|
+
export declare function Heading({ as, children, customize, className, id, ref, ...props }: HeadingProps): JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OneOf } from '../types';
|
|
2
|
+
type HumanVerificationProps = {
|
|
3
|
+
children?: string;
|
|
4
|
+
className?: string;
|
|
5
|
+
};
|
|
6
|
+
import { type JSX } from 'react';
|
|
7
|
+
export declare function validateHuman(token: string): OneOf<[{
|
|
8
|
+
success: true;
|
|
9
|
+
}, {
|
|
10
|
+
error: string;
|
|
11
|
+
}]>;
|
|
12
|
+
export declare function generateHumanValidationToken(): string;
|
|
13
|
+
export declare function HumanVerification({ children, className, }: HumanVerificationProps): JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ComponentPropsWithRef, JSX } from 'react';
|
|
2
|
+
export type IFrameAllowAttribute = 'accelerometer' | 'ambient-light-sensor' | 'attribution-reporting' | 'autoplay' | 'bluetooth' | 'camera' | 'captured-surface-control' | 'compute-pressure' | 'cross-origin-isolated' | 'deferred-fetch' | 'deferred-fetch-minimal' | 'display-capture' | 'encrypted-media' | 'fullscreen' | 'gamepad' | 'geolocation' | 'gyroscope' | 'hid' | 'identity-credentials-get' | 'idle-detection' | 'language-detector' | 'local-fonts' | 'magnetometer' | 'microphone' | 'midi' | 'otp-credentials' | 'payment' | 'picture-in-picture' | 'publickey-credentials-get' | 'screen-wake-lock' | 'serial' | 'speaker-selection' | 'storage-access' | 'translator' | 'summarizer' | 'usb' | 'web-share' | 'window-management' | 'xr-spatial-tracking';
|
|
3
|
+
export type IFrameReferrerPolicyAttribute = 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
|
|
4
|
+
export type IFrameSandboxAttribute = 'allow-downloads' | 'allow-forms' | 'allow-modals' | 'allow-orientation-lock' | 'allow-pointer-lock' | 'allow-popups' | 'allow-popups-to-escape-sandbox' | 'allow-presentation' | 'allow-same-origin' | 'allow-scripts' | 'allow-storage-access-by-user-activation' | 'allow-top-navigation' | 'allow-top-navigation-by-user-activation' | 'allow-top-navigation-to-custom-protocols';
|
|
5
|
+
export type IFrameProps = Omit<ComponentPropsWithRef<'iframe'>, 'allow' | 'children' | 'referrerPolicy' | 'sandbox' | 'title'> & {
|
|
6
|
+
allow?: (IFrameAllowAttribute | Record<IFrameAllowAttribute, string[] | boolean>)[] | 'allow-all';
|
|
7
|
+
referrerPolicy?: IFrameReferrerPolicyAttribute;
|
|
8
|
+
sandbox?: IFrameSandboxAttribute[];
|
|
9
|
+
title: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* # iFrame
|
|
13
|
+
* - An `<iframe/>` with preset classes, backup, and required title for SEO.
|
|
14
|
+
*/
|
|
15
|
+
export declare function IFrame({ allow, className, referrerPolicy, sandbox, ...props }: IFrameProps): JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './button';
|
|
2
|
+
export * from './checkbox';
|
|
3
|
+
export * from './details';
|
|
4
|
+
export * from './drop-down';
|
|
5
|
+
export * from './fieldset';
|
|
6
|
+
export * from './form';
|
|
7
|
+
export * from './ghost';
|
|
8
|
+
export * from './heading';
|
|
9
|
+
export * from './human-verification';
|
|
10
|
+
export * from './iframe';
|
|
11
|
+
export * from './input';
|
|
12
|
+
export * from './link';
|
|
13
|
+
export * from './modal';
|
|
14
|
+
export * from './select';
|
|
15
|
+
export * from './submit-button';
|
|
16
|
+
export * from './textarea';
|
|
17
|
+
export * from './time';
|
|
18
|
+
export * from './tooltip';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { JSX, ReactNode } from 'react';
|
|
2
|
+
export type InputProps = HeadlessInputProps & {
|
|
3
|
+
/** Ideal for tooltips. Wrapped within the same div that wraps the input. */
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
description?: DescriptionProps['children'];
|
|
6
|
+
descriptionProps?: Omit<DescriptionProps, 'children'> & {
|
|
7
|
+
/** @deprecated use `description` prop instead */
|
|
8
|
+
children?: never;
|
|
9
|
+
};
|
|
10
|
+
fieldProps?: Omit<FieldProps, 'children'> & {
|
|
11
|
+
/** @deprecated use `children` prop instead */
|
|
12
|
+
children?: never;
|
|
13
|
+
};
|
|
14
|
+
label?: LabelProps['children'];
|
|
15
|
+
labelProps?: Omit<LabelProps, 'children'> & {
|
|
16
|
+
/** @deprecated use `label` prop instead */
|
|
17
|
+
children?: never;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
import { type DescriptionProps, type FieldProps, type InputProps as HeadlessInputProps, type LabelProps } from '@headlessui/react';
|
|
21
|
+
/**
|
|
22
|
+
* # Input
|
|
23
|
+
*
|
|
24
|
+
* A layer on top of Headless UI's Input component with built in validation styles, required by default, plus wrapped in a Field component with a customizable label and description.
|
|
25
|
+
*
|
|
26
|
+
* @prop label - The label for the select component.
|
|
27
|
+
* @prop description - The description for the select component.
|
|
28
|
+
* @prop placeholder - The placeholder for the select component.
|
|
29
|
+
* @prop required - (default: true) Whether the select component is required.
|
|
30
|
+
* @prop invalid - Whether the select component is invalid.
|
|
31
|
+
* @prop fieldProps - The props to be passed to the parent field component.
|
|
32
|
+
* @prop labelProps - The props to be passed to the label component.
|
|
33
|
+
* @prop descriptionProps - The props to be passed to the description component.
|
|
34
|
+
*/
|
|
35
|
+
export declare function Input({ children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps }, fieldProps: { className: fieldClassName, ...fieldProps }, label, labelProps: { className: labelClassName, ...labelProps }, required, ...props }: InputProps): JSX.Element;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { AnyElementProps, ColorTheme, OneOf } from '../types';
|
|
2
|
+
import type { ElementType, JSX } from 'react';
|
|
3
|
+
export type AnchorProps<TTag extends ElementType = 'a'> = AnyElementProps<TTag> & {
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function Anchor<TTag extends ElementType = 'a'>({ as, className, disabled, href, onClick, target, rel, ...props }: AnchorProps<TTag>): JSX.Element;
|
|
7
|
+
type ThemeColorOrClasses = OneOf<[
|
|
8
|
+
{
|
|
9
|
+
/**
|
|
10
|
+
* - Fill Example: `'after:[--theme-color:var(--color-blue-500)]'`
|
|
11
|
+
* - Multiline Fill Example: `'[--theme-color:var(--color-blue-500)]'`
|
|
12
|
+
*/
|
|
13
|
+
themeColor: string;
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
/** This doesn't use any preset color theme classes. */
|
|
17
|
+
classes: string;
|
|
18
|
+
}
|
|
19
|
+
]>;
|
|
20
|
+
export type LinkProps<TTag extends ElementType = typeof Anchor> = AnyElementProps<TTag, OneOf<[
|
|
21
|
+
{
|
|
22
|
+
type?: 'center' | 'lift' | 'ltr' | 'multiline' | 'multiline-center' | 'multiline-lift' | 'multiline-ltr' | 'multiline-rtl' | 'multiline-static' | 'normal' | 'rtl' | 'static';
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
type?: 'fill' | 'fill-lift' | 'fill-ltr' | 'fill-rtl' | 'multiline-fill' | 'multiline-fill-center' | 'multiline-fill-ltr' | 'multiline-fill-lift' | 'multiline-fill-rtl';
|
|
26
|
+
} & ColorTheme
|
|
27
|
+
]>>;
|
|
28
|
+
export declare function getLinkClasses({ customTheme, theme, type, }: Pick<LinkProps, 'customTheme' | 'theme' | 'type'>): string;
|
|
29
|
+
/**
|
|
30
|
+
* # Link
|
|
31
|
+
*
|
|
32
|
+
* - A component for rendering links with various styles and options.
|
|
33
|
+
* - Utilizes the Next.js `Link` component and provides additional functionality.
|
|
34
|
+
*
|
|
35
|
+
* ---
|
|
36
|
+
*
|
|
37
|
+
* ## Styles
|
|
38
|
+
*
|
|
39
|
+
* This component includes various classes to style the link. The styles are divided into two types:
|
|
40
|
+
*
|
|
41
|
+
* - Line styles: These styles add a line underneath the link, and include variations for different positions and orientations.
|
|
42
|
+
* - Fill styles: These styles add a background color behind the link, and include variations for different positions and orientations.
|
|
43
|
+
* - Multiline styles: These styles seek to accomplish the same as the line and fill styles, while offering multiline support.
|
|
44
|
+
*
|
|
45
|
+
* ---
|
|
46
|
+
*
|
|
47
|
+
* ## Examples
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* <Link href='/about' type='ltr' title='About Us'>Learn more about our company</Link>
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* <Link href='/about' type='fill-ltr' title='About Us'>Learn more about our company</Link>
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* <Link href='/about' type='fill-ltr' theme='red' title='About Us'>Learn more about our company</Link>
|
|
57
|
+
*/
|
|
58
|
+
export declare function Link<TTag extends ElementType = typeof Anchor>({ as, className, customTheme, theme, type, ...props }: LinkProps<TTag>): JSX.Element;
|
|
59
|
+
export type ExtendedLinkConfig = {
|
|
60
|
+
/** Modifies the default element that is rendered. The `as` prop on the component still overrides the default set here. */
|
|
61
|
+
as?: ElementType;
|
|
62
|
+
/** Adds default classes. */
|
|
63
|
+
className?: string;
|
|
64
|
+
/** Sets the default theme. */
|
|
65
|
+
defaultTheme?: ColorTheme['theme'] | string;
|
|
66
|
+
/** Sets the default for the `type` prop. */
|
|
67
|
+
type?: LinkProps['type'];
|
|
68
|
+
/** Add more theme options. */
|
|
69
|
+
theme?: {
|
|
70
|
+
[themeName: string]: {
|
|
71
|
+
/** Custom theme configuration - supports both multiline and regular link theme formats */
|
|
72
|
+
customTheme: Omit<ThemeColorOrClasses, 'themeColor'> & {
|
|
73
|
+
themeColor?: {
|
|
74
|
+
/** Example: `'after:[--theme-color:var(--color-blue-500)]'` */
|
|
75
|
+
fill: string;
|
|
76
|
+
/** Example: `'[--theme-color:var(--color-blue-500)]'` */
|
|
77
|
+
multilineFill: string;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/** Additional CSS classes to apply */
|
|
81
|
+
className?: string;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
type ExtendedThemeNames<T extends ExtendedLinkConfig> = T['theme'] extends Record<string, unknown> ? keyof T['theme'] : never;
|
|
86
|
+
export type ExtendedLinkProps<TExtendedConfig extends ExtendedLinkConfig, TTag extends ElementType = typeof Anchor> = Omit<LinkProps<TTag>, 'theme' | 'customTheme'> & {
|
|
87
|
+
theme?: LinkProps<TTag>['theme'] | ExtendedThemeNames<TExtendedConfig>;
|
|
88
|
+
customTheme?: LinkProps<TTag>['customTheme'];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* # createLink
|
|
92
|
+
* Creates an extended Link component with additional theme options.
|
|
93
|
+
*
|
|
94
|
+
* @param config - Configuration object defining new themes and defaults
|
|
95
|
+
* @returns A new Link component with extended theme support
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```tsx
|
|
99
|
+
* const MyLink = createLink({
|
|
100
|
+
* as: NextLink,
|
|
101
|
+
* className: 'font-bold',
|
|
102
|
+
* type: 'fill',
|
|
103
|
+
* theme: {
|
|
104
|
+
* primary: {
|
|
105
|
+
* customTheme: {
|
|
106
|
+
* fill: 'after:[--theme-color:var(--color-primary-500)]',
|
|
107
|
+
* multilineFill: '[--theme-color:var(--color-primary-500)]'
|
|
108
|
+
* },
|
|
109
|
+
* className: 'text-white'
|
|
110
|
+
* }
|
|
111
|
+
* }
|
|
112
|
+
* })
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function createLink<TExtendedConfig extends ExtendedLinkConfig>(config: TExtendedConfig): <TTag extends ElementType = typeof Anchor>({ theme, className, customTheme, type, as, ...props }: ExtendedLinkProps<TExtendedConfig, TTag>) => JSX.Element;
|
|
116
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AnyElementProps } from '../types';
|
|
2
|
+
export type ModalProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
3
|
+
children: ReactNode | (({ openModal, closeModal, }: {
|
|
4
|
+
openModal: () => void;
|
|
5
|
+
closeModal: () => void;
|
|
6
|
+
}) => ReactNode);
|
|
7
|
+
dragToClose?: boolean;
|
|
8
|
+
onClose?: () => void;
|
|
9
|
+
onOpen?: () => void;
|
|
10
|
+
place?: 'center' | 'bottom';
|
|
11
|
+
};
|
|
12
|
+
import { type ElementType, type HTMLAttributes, type JSX, type ReactNode } from 'react';
|
|
13
|
+
import { Button as HeadlessButton, type DialogTitleProps } from '@headlessui/react';
|
|
14
|
+
export declare function ModalTrigger<TTag extends ElementType = typeof HeadlessButton>({ as, onClick, ...props }: AnyElementProps<TTag>): JSX.Element;
|
|
15
|
+
export declare function ModalTitle(props: DialogTitleProps): JSX.Element;
|
|
16
|
+
export declare function ModalDialog(props: HTMLAttributes<HTMLDivElement>): JSX.Element;
|
|
17
|
+
export declare function ModalClose<T extends ElementType = typeof HeadlessButton>({ as, ...props }: AnyElementProps<T>): JSX.Element;
|
|
18
|
+
export declare function Modal(props: ModalProps): JSX.Element;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type SelectProps = Omit<ListboxProps, 'children' | 'defaultValue' | 'multiple' | 'onChange'> & {
|
|
2
|
+
buttonProps?: Omit<ListboxButtonProps, 'className'> & {
|
|
3
|
+
/** @deprecated use `className` prop instead */
|
|
4
|
+
className?: never;
|
|
5
|
+
};
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
className?: ListboxButtonProps['className'];
|
|
8
|
+
description?: DescriptionProps['children'];
|
|
9
|
+
descriptionProps?: Omit<DescriptionProps, 'children'> & {
|
|
10
|
+
/** @deprecated use `description` prop instead */
|
|
11
|
+
children?: never;
|
|
12
|
+
};
|
|
13
|
+
fieldProps?: Omit<FieldProps, 'children'> & {
|
|
14
|
+
/** @deprecated use `children` prop instead */
|
|
15
|
+
children?: never;
|
|
16
|
+
};
|
|
17
|
+
label?: LabelProps['children'];
|
|
18
|
+
labelProps?: Omit<LabelProps, 'children'> & {
|
|
19
|
+
/** @deprecated use `label` prop instead */
|
|
20
|
+
children?: never;
|
|
21
|
+
};
|
|
22
|
+
optionsProps?: ListboxOptionsProps;
|
|
23
|
+
placeholder?: ListboxSelectedOptionProps['placeholder'];
|
|
24
|
+
required?: boolean;
|
|
25
|
+
selectedOptionProps?: Omit<ListboxSelectedOptionProps, 'options' | 'placeholder'> & {
|
|
26
|
+
/** @deprecated use `placeholder` prop instead */
|
|
27
|
+
placeholder?: never;
|
|
28
|
+
};
|
|
29
|
+
} & ({
|
|
30
|
+
defaultValue?: string;
|
|
31
|
+
multiple?: false | never;
|
|
32
|
+
onChange?: (selected: string) => void;
|
|
33
|
+
} | {
|
|
34
|
+
defaultValue?: string[];
|
|
35
|
+
multiple?: true;
|
|
36
|
+
onChange?: (selected: string[]) => void;
|
|
37
|
+
});
|
|
38
|
+
export type SelectOptionProps = Omit<ListboxOptionProps, 'className'> & {
|
|
39
|
+
className?: string;
|
|
40
|
+
name: string;
|
|
41
|
+
};
|
|
42
|
+
import { type ComponentPropsWithRef, type JSX, type ReactNode } from 'react';
|
|
43
|
+
import { type DescriptionProps, type FieldProps, type LabelProps, type ListboxButtonProps, type ListboxOptionProps, type ListboxOptionsProps, type ListboxProps, type ListboxSelectedOptionProps } from '@headlessui/react';
|
|
44
|
+
/**
|
|
45
|
+
* ## Select Section Title
|
|
46
|
+
*
|
|
47
|
+
* Displays a simple title.
|
|
48
|
+
*/
|
|
49
|
+
export declare function SelectSectionTitle({ className, ...props }: ComponentPropsWithRef<'div'>): JSX.Element;
|
|
50
|
+
/**
|
|
51
|
+
* ## SelectOption
|
|
52
|
+
*
|
|
53
|
+
* @prop children - This is what is displayed in the drop down menu
|
|
54
|
+
* @prop name - This is displayed in the trigger button
|
|
55
|
+
* @prop value - This is used for FormData
|
|
56
|
+
*/
|
|
57
|
+
export declare function SelectOption({ children, className, name, ...props }: SelectOptionProps): JSX.Element;
|
|
58
|
+
/**
|
|
59
|
+
* # Select
|
|
60
|
+
*
|
|
61
|
+
* A customizable select component intended to work very similar to HTML's `<select>` element.
|
|
62
|
+
*
|
|
63
|
+
* Use the `SelectOption` component to define the options.
|
|
64
|
+
*
|
|
65
|
+
* Use the `SelectSectionTitle` component to define titles.
|
|
66
|
+
*
|
|
67
|
+
* @prop label - The label for the select component.
|
|
68
|
+
* @prop description - The description for the select component.
|
|
69
|
+
* @prop placeholder - The placeholder for the select component.
|
|
70
|
+
* @prop required - Whether the select component is required.
|
|
71
|
+
* @prop invalid - Whether the select component is invalid.
|
|
72
|
+
* @prop multiple - Whether the select component allows multiple selections.
|
|
73
|
+
* @prop optionsProps - The props to be passed to each SelectOption component.
|
|
74
|
+
* @prop selectedOptionProps - The props to be passed to the selected option component.
|
|
75
|
+
* @prop fieldProps - The props to be passed to the parent field component.
|
|
76
|
+
* @prop labelProps - The props to be passed to the label component.
|
|
77
|
+
* @prop descriptionProps - The props to be passed to the description component.
|
|
78
|
+
* @prop anchor - The anchor point for the drop down menu.
|
|
79
|
+
*/
|
|
80
|
+
export declare function Select({ buttonProps, children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps }, fieldProps: { className: fieldClassName, ...fieldProps }, invalid, label, labelProps: { className: labelClassName, ...labelProps }, onChange, optionsProps: { anchor, className: optionsClassName, transition, ...optionsProps }, placeholder, required, selectedOptionProps: { ...selectedOptionProps }, ...props }: SelectProps): JSX.Element;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { JSX, ReactNode } from 'react';
|
|
2
|
+
export type SubmitButtonProps = Omit<ButtonProps, 'as' | 'customTheme' | 'href' | 'theme'> & {
|
|
3
|
+
/** This doesn't do much by default, because we use built-in colors for different form states. You'll have to modify a good bit to make this do anything. */
|
|
4
|
+
customTheme?: {
|
|
5
|
+
/** Example: `'[--theme-color:var(--color-blue-500)]'` */
|
|
6
|
+
themeColor: string;
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated Only `themeColor` is available.
|
|
9
|
+
*
|
|
10
|
+
* ~~This doesn't use any preset color theme classes.~~
|
|
11
|
+
*/
|
|
12
|
+
classes?: never;
|
|
13
|
+
};
|
|
14
|
+
/** The message to display when the form status is "error" */
|
|
15
|
+
error?: ReactNode;
|
|
16
|
+
formStatus?: 'error' | 'incomplete' | 'loading' | 'readonly' | 'ready' | 'success';
|
|
17
|
+
/** The message to display when the form status is "incomplete" */
|
|
18
|
+
incomplete?: ReactNode;
|
|
19
|
+
/** The message to display when the form status is "loading" */
|
|
20
|
+
loading?: ReactNode;
|
|
21
|
+
/** The message to display when the form status is "readonly" */
|
|
22
|
+
readonly?: ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated Use `children` instead.
|
|
25
|
+
*
|
|
26
|
+
* ~~The message to display when the form status is "ready"~~
|
|
27
|
+
*/
|
|
28
|
+
ready?: never;
|
|
29
|
+
/** The message to display when the form status is "success" */
|
|
30
|
+
success?: ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated Use `customTheme.themeColor` instead.
|
|
33
|
+
*
|
|
34
|
+
* ~~Color theme.~~
|
|
35
|
+
*/
|
|
36
|
+
theme?: never;
|
|
37
|
+
};
|
|
38
|
+
import { type ButtonProps } from './button';
|
|
39
|
+
/**
|
|
40
|
+
* # Submit Button
|
|
41
|
+
*
|
|
42
|
+
* @prop formStatus - (default: 'ready') When you supply a form status, the button has built-in color changes, animations, and user feedback
|
|
43
|
+
* @prop error - The children to display when `formStatus === 'error'`
|
|
44
|
+
* @prop incomplete - The children to display when `formStatus === 'incomplete'`
|
|
45
|
+
* @prop loading - The children to display when `formStatus === 'loading'`
|
|
46
|
+
* @prop success - The children to display when `formStatus === 'success'`
|
|
47
|
+
* @prop readonly - The children to display when `formStatus === 'readonly'`
|
|
48
|
+
*/
|
|
49
|
+
export declare function SubmitButton({ children, className, customTheme, error, formStatus, incomplete, loading, readonly, success, type, ...props }: SubmitButtonProps): JSX.Element;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { JSX, ReactNode } from 'react';
|
|
2
|
+
export type TextareaProps = HeadlessTextareaProps & {
|
|
3
|
+
/** Ideal for tooltips. Wrapped within the same div that wraps the input. */
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
description?: DescriptionProps['children'];
|
|
6
|
+
descriptionProps?: Omit<DescriptionProps, 'children'> & {
|
|
7
|
+
/** @deprecated use `description` prop instead */
|
|
8
|
+
children?: never;
|
|
9
|
+
};
|
|
10
|
+
fieldProps?: Omit<FieldProps, 'children'> & {
|
|
11
|
+
/** @deprecated use `children` prop instead */
|
|
12
|
+
children?: never;
|
|
13
|
+
};
|
|
14
|
+
label?: LabelProps['children'];
|
|
15
|
+
labelProps?: Omit<LabelProps, 'children'> & {
|
|
16
|
+
/** @deprecated use `label` prop instead */
|
|
17
|
+
children?: never;
|
|
18
|
+
};
|
|
19
|
+
resize?: boolean | 'content' | 'x' | 'y' | ('content' | 'x' | 'y')[];
|
|
20
|
+
};
|
|
21
|
+
import { type DescriptionProps, type FieldProps, type LabelProps, type TextareaProps as HeadlessTextareaProps } from '@headlessui/react';
|
|
22
|
+
/**
|
|
23
|
+
* # Textarea
|
|
24
|
+
*
|
|
25
|
+
* A layer on top of Headless UI's Textarea component with built in validation styles, required by default, plus wrapped in a Field component with a customizable label and description.
|
|
26
|
+
*
|
|
27
|
+
* @prop label - The label for the select component.
|
|
28
|
+
* @prop description - The description for the select component.
|
|
29
|
+
* @prop placeholder - The placeholder for the select component.
|
|
30
|
+
* @prop required - (default: true) Whether the select component is required.
|
|
31
|
+
* @prop invalid - Whether the select component is invalid.
|
|
32
|
+
* @prop fieldProps - The props to be passed to the parent field component.
|
|
33
|
+
* @prop labelProps - The props to be passed to the label component.
|
|
34
|
+
* @prop descriptionProps - The props to be passed to the description component.
|
|
35
|
+
* @prop resize - Makes adding the various resize CSS properties easier.
|
|
36
|
+
*/
|
|
37
|
+
export declare function Textarea({ children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps }, fieldProps: { className: fieldClassName, ...fieldProps }, label, labelProps: { className: labelClassName, ...labelProps }, required, resize, ...props }: TextareaProps): JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type TimeProps = HTMLAttributes<HTMLTimeElement> & Partial<{
|
|
2
|
+
dateObject: Date;
|
|
3
|
+
dateTime: string;
|
|
4
|
+
day: boolean;
|
|
5
|
+
hours: boolean;
|
|
6
|
+
milliseconds: boolean;
|
|
7
|
+
minutes: boolean;
|
|
8
|
+
month: boolean;
|
|
9
|
+
seconds: boolean;
|
|
10
|
+
year: boolean;
|
|
11
|
+
}> & {
|
|
12
|
+
ref?: RefObject<HTMLTimeElement | null>;
|
|
13
|
+
};
|
|
14
|
+
import { type HTMLAttributes, type JSX, type RefObject } from 'react';
|
|
15
|
+
/**
|
|
16
|
+
* # Time
|
|
17
|
+
*
|
|
18
|
+
* Display date and time how you want. By default, the date is set to the current date.
|
|
19
|
+
*
|
|
20
|
+
* @prop children - Overwrite the generated display.
|
|
21
|
+
* @prop dateObject - Set the dateTime value with a Date object.
|
|
22
|
+
* @prop dateTime - Set the dateTime itself.
|
|
23
|
+
* @prop day - Include the day of the month in the display.
|
|
24
|
+
* @prop hours - Include the hours in the display.
|
|
25
|
+
* @prop milliseconds - Include the milliseconds in the display.
|
|
26
|
+
* @prop minutes - Include the minutes in the display.
|
|
27
|
+
* @prop month - Include the month in the display.
|
|
28
|
+
* @prop seconds - Include the seconds in the display.
|
|
29
|
+
* @prop year - Include the year in the display.
|
|
30
|
+
*/
|
|
31
|
+
export declare function Time({ children, dateObject, dateTime, day, hours, milliseconds, minutes, month, seconds, year, ref, ...props }: TimeProps): JSX.Element;
|
|
32
|
+
export {};
|