@westpac/ui 1.13.1 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/component-type.json +1 -1
  3. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.component.d.ts +5 -0
  4. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.component.js +39 -0
  5. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.styles.d.ts +34 -0
  6. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.styles.js +16 -0
  7. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.types.d.ts +30 -0
  8. package/dist/components/flyout/components/flyout-backdrop/flyout-backdrop.types.js +1 -0
  9. package/dist/components/flyout/components/flyout-backdrop/index.d.ts +2 -0
  10. package/dist/components/flyout/components/flyout-backdrop/index.js +1 -0
  11. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.component.d.ts +5 -0
  12. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.component.js +67 -0
  13. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.styles.d.ts +82 -0
  14. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.styles.js +66 -0
  15. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.types.d.ts +40 -0
  16. package/dist/components/flyout/components/flyout-dialog/flyout-dialog.types.js +1 -0
  17. package/dist/components/flyout/components/flyout-dialog/index.d.ts +2 -0
  18. package/dist/components/flyout/components/flyout-dialog/index.js +1 -0
  19. package/dist/components/flyout/components/index.d.ts +2 -0
  20. package/dist/components/flyout/components/index.js +2 -0
  21. package/dist/components/flyout/flyout.component.d.ts +2 -0
  22. package/dist/components/flyout/flyout.component.js +26 -0
  23. package/dist/components/flyout/flyout.types.d.ts +7 -0
  24. package/dist/components/flyout/flyout.types.js +1 -0
  25. package/dist/components/flyout/index.d.ts +2 -0
  26. package/dist/components/flyout/index.js +1 -0
  27. package/dist/components/index.d.ts +1 -0
  28. package/dist/components/index.js +1 -0
  29. package/dist/components/input-group/input-group.component.js +2 -1
  30. package/dist/components/pass-code/pass-code.component.js +10 -0
  31. package/dist/css/westpac-ui.css +43 -0
  32. package/dist/css/westpac-ui.min.css +43 -0
  33. package/package.json +4 -1
  34. package/src/components/flyout/components/flyout-backdrop/flyout-backdrop.component.tsx +49 -0
  35. package/src/components/flyout/components/flyout-backdrop/flyout-backdrop.styles.ts +17 -0
  36. package/src/components/flyout/components/flyout-backdrop/flyout-backdrop.types.ts +32 -0
  37. package/src/components/flyout/components/flyout-backdrop/index.ts +2 -0
  38. package/src/components/flyout/components/flyout-dialog/flyout-dialog.component.tsx +86 -0
  39. package/src/components/flyout/components/flyout-dialog/flyout-dialog.styles.ts +59 -0
  40. package/src/components/flyout/components/flyout-dialog/flyout-dialog.types.ts +44 -0
  41. package/src/components/flyout/components/flyout-dialog/index.ts +2 -0
  42. package/src/components/flyout/components/index.ts +2 -0
  43. package/src/components/flyout/flyout.component.tsx +53 -0
  44. package/src/components/flyout/flyout.types.ts +9 -0
  45. package/src/components/flyout/index.ts +2 -0
  46. package/src/components/index.ts +1 -0
  47. package/src/components/input-group/input-group.component.tsx +3 -2
  48. package/src/components/pass-code/pass-code.component.tsx +10 -0
@@ -0,0 +1,5 @@
1
+ import { type FlyoutBackdropProps } from './flyout-backdrop.types.js';
2
+ /**
3
+ * @private
4
+ */
5
+ export declare function FlyoutBackdrop({ children, className, isDismissable, portalContainer, state, zIndex, ...props }: FlyoutBackdropProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { useExitAnimation } from '@react-aria/utils';
3
+ import React, { useMemo, useRef } from 'react';
4
+ import { Overlay, useModalOverlay } from 'react-aria';
5
+ import { styles as backdropStyles } from './flyout-backdrop.styles.js';
6
+ export function FlyoutBackdrop({ children, className, isDismissable = true, portalContainer, state, zIndex = 100, ...props }) {
7
+ const ref = useRef(null);
8
+ const isExiting = useExitAnimation(ref, state.isOpen);
9
+ const styles = backdropStyles({
10
+ isOpen: state.isOpen
11
+ });
12
+ const { modalProps, underlayProps } = useModalOverlay({
13
+ isDismissable,
14
+ ...props
15
+ }, state, ref);
16
+ const brandContainer = useMemo(()=>{
17
+ if (typeof window !== 'undefined') {
18
+ return document.querySelector('[data-brand]') || document.querySelector('[class^="theme-"], [class*=" theme-"]') || document.body;
19
+ }
20
+ }, []);
21
+ if (!state.isOpen && !isExiting) {
22
+ return null;
23
+ }
24
+ return React.createElement(Overlay, {
25
+ isExiting: isExiting,
26
+ portalContainer: portalContainer || brandContainer
27
+ }, React.createElement("div", {
28
+ className: styles.base({
29
+ className
30
+ }),
31
+ style: {
32
+ zIndex
33
+ },
34
+ ...underlayProps
35
+ }, children({
36
+ flyoutRef: ref,
37
+ modalProps
38
+ })));
39
+ }
@@ -0,0 +1,34 @@
1
+ export declare const styles: import("tailwind-variants").TVReturnType<{
2
+ isOpen: {
3
+ true: {
4
+ base: string;
5
+ };
6
+ false: {
7
+ base: string;
8
+ };
9
+ };
10
+ }, {
11
+ base: string;
12
+ }, undefined, {
13
+ isOpen: {
14
+ true: {
15
+ base: string;
16
+ };
17
+ false: {
18
+ base: string;
19
+ };
20
+ };
21
+ }, {
22
+ base: string;
23
+ }, import("tailwind-variants").TVReturnType<{
24
+ isOpen: {
25
+ true: {
26
+ base: string;
27
+ };
28
+ false: {
29
+ base: string;
30
+ };
31
+ };
32
+ }, {
33
+ base: string;
34
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,16 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const styles = tv({
3
+ slots: {
4
+ base: 'fixed inset-0'
5
+ },
6
+ variants: {
7
+ isOpen: {
8
+ true: {
9
+ base: 'animate-fadeIn bg-black/65'
10
+ },
11
+ false: {
12
+ base: 'pointer-events-none'
13
+ }
14
+ }
15
+ }
16
+ });
@@ -0,0 +1,30 @@
1
+ import { type ReactNode, type RefObject } from 'react';
2
+ import { type AriaModalOverlayProps, type useModalOverlay } from 'react-aria';
3
+ import { type OverlayTriggerState } from 'react-stately';
4
+ export type FlyoutBackdropRenderProps = {
5
+ flyoutRef: RefObject<HTMLDivElement>;
6
+ modalProps: ReturnType<typeof useModalOverlay>['modalProps'];
7
+ };
8
+ export type FlyoutBackdropProps = {
9
+ /**
10
+ * Function that renders the flyout dialog within the backdrop
11
+ */
12
+ children: (props: FlyoutBackdropRenderProps) => ReactNode;
13
+ /**
14
+ * Additional class name for the backdrop
15
+ */
16
+ className?: string;
17
+ /**
18
+ * Element where the backdrop will be rendered
19
+ */
20
+ portalContainer?: Element;
21
+ /**
22
+ * The flyout opening and closing state
23
+ */
24
+ state: OverlayTriggerState;
25
+ /**
26
+ * z-index of the backdrop
27
+ * @default 100
28
+ */
29
+ zIndex?: number;
30
+ } & AriaModalOverlayProps;
@@ -0,0 +1,2 @@
1
+ export { FlyoutBackdrop } from './flyout-backdrop.component.js';
2
+ export { type FlyoutBackdropProps, type FlyoutBackdropRenderProps } from './flyout-backdrop.types.js';
@@ -0,0 +1 @@
1
+ export { FlyoutBackdrop } from './flyout-backdrop.component.js';
@@ -0,0 +1,5 @@
1
+ import { type FlyoutDialogInternalProps } from './flyout-dialog.types.js';
2
+ /**
3
+ * @private
4
+ */
5
+ export declare function FlyoutDialog({ children, className, closeAssistiveText, flyoutRef, heading, headingTag: HeadingTag, isOpen, modalProps, onClose, position, ...props }: FlyoutDialogInternalProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+ import { useEnterAnimation } from '@react-aria/utils';
3
+ import { clsx } from 'clsx';
4
+ import React, { useEffect, useRef, useState } from 'react';
5
+ import { mergeProps, useDialog } from 'react-aria';
6
+ import { Button } from '../../../button/index.js';
7
+ import { CloseIcon } from '../../../icon/index.js';
8
+ import { styles as dialogStyles } from './flyout-dialog.styles.js';
9
+ export function FlyoutDialog({ children, className, closeAssistiveText = 'Close flyout', flyoutRef, heading, headingTag: HeadingTag = 'h2', isOpen, modalProps, onClose, position = 'right', ...props }) {
10
+ const isEntering = useEnterAnimation(flyoutRef);
11
+ const styles = dialogStyles({
12
+ isEntering,
13
+ isOpen,
14
+ position
15
+ });
16
+ const { dialogProps, titleProps } = useDialog(props, flyoutRef);
17
+ const [scrolled, setScrolled] = useState(false);
18
+ const listRef = useRef(null);
19
+ useEffect(()=>{
20
+ var _listRef_current;
21
+ const element = listRef.current;
22
+ if (!element) {
23
+ return;
24
+ }
25
+ const listener = ()=>{
26
+ var _listRef_current;
27
+ const y = ((_listRef_current = listRef.current) === null || _listRef_current === void 0 ? void 0 : _listRef_current.scrollTop) || 0;
28
+ setScrolled(y > 0);
29
+ };
30
+ listRef === null || listRef === void 0 ? void 0 : (_listRef_current = listRef.current) === null || _listRef_current === void 0 ? void 0 : _listRef_current.addEventListener('scroll', listener);
31
+ return ()=>{
32
+ var _listRef_current;
33
+ listRef === null || listRef === void 0 ? void 0 : (_listRef_current = listRef.current) === null || _listRef_current === void 0 ? void 0 : _listRef_current.removeEventListener('scroll', listener);
34
+ };
35
+ }, []);
36
+ return React.createElement("div", {
37
+ ...mergeProps(modalProps, dialogProps, props),
38
+ "aria-hidden": !isOpen || undefined,
39
+ className: styles.base({
40
+ className
41
+ }),
42
+ ref: flyoutRef
43
+ }, React.createElement("div", {
44
+ className: styles.content()
45
+ }, React.createElement("div", {
46
+ className: clsx(styles.header(), {
47
+ 'shadow-[0_2px_5px_rgba(0,0,0,0.3)]': scrolled
48
+ })
49
+ }, heading && React.createElement(HeadingTag, {
50
+ ...titleProps,
51
+ className: styles.heading()
52
+ }, heading), onClose && React.createElement(Button, {
53
+ "aria-label": closeAssistiveText,
54
+ className: styles.button(),
55
+ iconAfter: ()=>React.createElement(CloseIcon, {
56
+ color: "primary",
57
+ size: "medium",
58
+ "aria-hidden": true
59
+ }),
60
+ look: "link",
61
+ onClick: onClose,
62
+ type: "button"
63
+ })), React.createElement("div", {
64
+ className: styles.body(),
65
+ ref: listRef
66
+ }, children)));
67
+ }
@@ -0,0 +1,82 @@
1
+ export declare const styles: import("tailwind-variants").TVReturnType<{
2
+ isEntering: {
3
+ true: {};
4
+ };
5
+ isOpen: {
6
+ true: {
7
+ base: string;
8
+ };
9
+ false: {
10
+ content: string;
11
+ };
12
+ };
13
+ position: {
14
+ left: {
15
+ base: string;
16
+ };
17
+ right: {
18
+ base: string;
19
+ };
20
+ };
21
+ }, {
22
+ base: string;
23
+ body: string;
24
+ button: string;
25
+ content: string;
26
+ header: string;
27
+ heading: string;
28
+ }, undefined, {
29
+ isEntering: {
30
+ true: {};
31
+ };
32
+ isOpen: {
33
+ true: {
34
+ base: string;
35
+ };
36
+ false: {
37
+ content: string;
38
+ };
39
+ };
40
+ position: {
41
+ left: {
42
+ base: string;
43
+ };
44
+ right: {
45
+ base: string;
46
+ };
47
+ };
48
+ }, {
49
+ base: string;
50
+ body: string;
51
+ button: string;
52
+ content: string;
53
+ header: string;
54
+ heading: string;
55
+ }, import("tailwind-variants").TVReturnType<{
56
+ isEntering: {
57
+ true: {};
58
+ };
59
+ isOpen: {
60
+ true: {
61
+ base: string;
62
+ };
63
+ false: {
64
+ content: string;
65
+ };
66
+ };
67
+ position: {
68
+ left: {
69
+ base: string;
70
+ };
71
+ right: {
72
+ base: string;
73
+ };
74
+ };
75
+ }, {
76
+ base: string;
77
+ body: string;
78
+ button: string;
79
+ content: string;
80
+ header: string;
81
+ heading: string;
82
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,66 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const styles = tv({
3
+ slots: {
4
+ base: 'fixed inset-y-0 flex w-50 flex-col bg-background-white transition-transform duration-500 ease-[cubic-bezier(0.23,1,0.32,1)]',
5
+ body: 'min-h-0 flex-1 overflow-auto',
6
+ button: 'ml-auto shrink-0',
7
+ content: 'flex h-full flex-col',
8
+ header: 'flex h-9 w-full shrink-0 items-center pl-2',
9
+ heading: 'min-w-0 typography-body-10 font-bold text-text-body'
10
+ },
11
+ variants: {
12
+ isEntering: {
13
+ true: {}
14
+ },
15
+ isOpen: {
16
+ true: {
17
+ base: 'translate-x-0'
18
+ },
19
+ false: {
20
+ content: 'hidden'
21
+ }
22
+ },
23
+ position: {
24
+ left: {
25
+ base: 'left-0 border-r border-border-muted-soft'
26
+ },
27
+ right: {
28
+ base: 'right-0 border-l border-border-muted-soft'
29
+ }
30
+ }
31
+ },
32
+ compoundSlots: [
33
+ {
34
+ slots: [
35
+ 'base'
36
+ ],
37
+ isOpen: false,
38
+ position: 'left',
39
+ className: '-translate-x-full'
40
+ },
41
+ {
42
+ slots: [
43
+ 'base'
44
+ ],
45
+ isOpen: false,
46
+ position: 'right',
47
+ className: 'translate-x-full'
48
+ },
49
+ {
50
+ slots: [
51
+ 'base'
52
+ ],
53
+ isEntering: true,
54
+ position: 'left',
55
+ className: '-translate-x-full'
56
+ },
57
+ {
58
+ slots: [
59
+ 'base'
60
+ ],
61
+ isEntering: true,
62
+ position: 'right',
63
+ className: 'translate-x-full'
64
+ }
65
+ ]
66
+ });
@@ -0,0 +1,40 @@
1
+ import { type HTMLAttributes, type ReactNode, type RefObject } from 'react';
2
+ import { type AriaDialogProps, type useModalOverlay } from 'react-aria';
3
+ import { type VariantProps } from 'tailwind-variants';
4
+ import { styles } from './flyout-dialog.styles.js';
5
+ type Variants = VariantProps<typeof styles>;
6
+ export type FlyoutDialogProps = {
7
+ /**
8
+ * Flyout content
9
+ */
10
+ children?: ReactNode;
11
+ /**
12
+ * Assistive text for the close button
13
+ * @default Close flyout
14
+ */
15
+ closeAssistiveText?: string;
16
+ /**
17
+ * The heading of the flyout
18
+ */
19
+ heading?: ReactNode;
20
+ /**
21
+ * The flyout heading tag may be overridden for semantic reasons
22
+ * @default h2
23
+ */
24
+ headingTag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
25
+ /**
26
+ * Called when the close button is pressed
27
+ */
28
+ onClose?: () => void;
29
+ /**
30
+ * Side of the page from which the flyout opens
31
+ * @default right
32
+ */
33
+ position?: Variants['position'];
34
+ } & AriaDialogProps & HTMLAttributes<HTMLDivElement>;
35
+ export type FlyoutDialogInternalProps = FlyoutDialogProps & {
36
+ flyoutRef: RefObject<HTMLDivElement>;
37
+ isOpen: boolean;
38
+ modalProps: ReturnType<typeof useModalOverlay>['modalProps'];
39
+ };
40
+ export {};
@@ -0,0 +1,2 @@
1
+ export { FlyoutDialog } from './flyout-dialog.component.js';
2
+ export { type FlyoutDialogProps } from './flyout-dialog.types.js';
@@ -0,0 +1 @@
1
+ export { FlyoutDialog } from './flyout-dialog.component.js';
@@ -0,0 +1,2 @@
1
+ export * from './flyout-backdrop/index.js';
2
+ export * from './flyout-dialog/index.js';
@@ -0,0 +1,2 @@
1
+ export * from './flyout-backdrop/index.js';
2
+ export * from './flyout-dialog/index.js';
@@ -0,0 +1,2 @@
1
+ import { type FlyoutProps } from './flyout.types.js';
2
+ export declare function Flyout({ backdropClassName, children, className, closeAssistiveText, heading, headingTag, isDismissable, isKeyboardDismissDisabled, portalContainer, position, shouldCloseOnInteractOutside, state, zIndex, ...props }: FlyoutProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import React from 'react';
3
+ import { FlyoutBackdrop, FlyoutDialog } from './components/index.js';
4
+ export function Flyout({ backdropClassName, children, className, closeAssistiveText, heading, headingTag, isDismissable = true, isKeyboardDismissDisabled, portalContainer, position = 'right', shouldCloseOnInteractOutside, state, zIndex, ...props }) {
5
+ return React.createElement(FlyoutBackdrop, {
6
+ className: backdropClassName,
7
+ isDismissable: isDismissable,
8
+ isKeyboardDismissDisabled: isKeyboardDismissDisabled,
9
+ portalContainer: portalContainer,
10
+ shouldCloseOnInteractOutside: shouldCloseOnInteractOutside,
11
+ state: state,
12
+ zIndex: zIndex
13
+ }, ({ flyoutRef, modalProps })=>React.createElement(FlyoutDialog, {
14
+ ...props,
15
+ className: className,
16
+ closeAssistiveText: closeAssistiveText,
17
+ flyoutRef: flyoutRef,
18
+ heading: heading,
19
+ headingTag: headingTag,
20
+ isOpen: state.isOpen,
21
+ modalProps: modalProps,
22
+ onClose: isDismissable ? ()=>state.close() : undefined,
23
+ position: position,
24
+ key: position
25
+ }, children));
26
+ }
@@ -0,0 +1,7 @@
1
+ import { type FlyoutBackdropProps, type FlyoutDialogProps } from './components/index.js';
2
+ export type FlyoutProps = Omit<FlyoutBackdropProps, 'children' | 'className'> & Omit<FlyoutDialogProps, 'onClose'> & {
3
+ /**
4
+ * Additional class name for the backdrop
5
+ */
6
+ backdropClassName?: string;
7
+ };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,2 @@
1
+ export { Flyout } from './flyout.component.js';
2
+ export { type FlyoutProps } from './flyout.types.js';
@@ -0,0 +1 @@
1
+ export { Flyout } from './flyout.component.js';
@@ -47,3 +47,4 @@ export * from './progress-indicator/index.js';
47
47
  export * from './header/index.js';
48
48
  export * from './footer/index.js';
49
49
  export * from './multi-select/index.js';
50
+ export * from './flyout/index.js';
@@ -47,3 +47,4 @@ export * from './progress-indicator/index.js';
47
47
  export * from './header/index.js';
48
48
  export * from './footer/index.js';
49
49
  export * from './multi-select/index.js';
50
+ export * from './flyout/index.js';
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import React, { Children, cloneElement, isValidElement, useCallback, useId, useMemo } from 'react';
3
+ import { twMerge } from 'tailwind-merge';
3
4
  import { useBreakpoint } from '../../hook/breakpoints.hook.js';
4
5
  import { resolveResponsiveVariant } from '../../utils/breakpoint.util.js';
5
6
  import { ErrorMessage, Hint, Label } from '../index.js';
@@ -81,7 +82,7 @@ export function InputGroup({ label, hideLabel, size = 'medium', hint, errorMessa
81
82
  'aria-labelledby': ariaLabelledBy,
82
83
  'aria-describedby': ariaDescribedBy || ariaDescribedByValue,
83
84
  'aria-label': ariaLabel,
84
- className: 'focus:z-10',
85
+ className: twMerge('focus:z-10', child.props.className),
85
86
  ...resolvedWidth !== 'full' ? {
86
87
  width: resolvedWidth
87
88
  } : {}
@@ -47,6 +47,9 @@ export const PassCode = forwardRef(({ length, value, onChange, onComplete, onPas
47
47
  if (index + validData.length < length) {
48
48
  var _inputRefs_current_;
49
49
  (_inputRefs_current_ = inputRefs.current[index + validData.length]) === null || _inputRefs_current_ === void 0 ? void 0 : _inputRefs_current_.focus();
50
+ } else {
51
+ var _inputRefs_current_1;
52
+ (_inputRefs_current_1 = inputRefs.current[index + validData.length - 1]) === null || _inputRefs_current_1 === void 0 ? void 0 : _inputRefs_current_1.focus();
50
53
  }
51
54
  if (newPasscode.filter((passcode)=>!passcode).length === 0 && onComplete) {
52
55
  onComplete(newPasscode.join(''));
@@ -80,6 +83,13 @@ export const PassCode = forwardRef(({ length, value, onChange, onComplete, onPas
80
83
  } else {
81
84
  setInternalPasscode(newPasscode);
82
85
  }
86
+ if (index + validData.length < length) {
87
+ var _inputRefs_current_;
88
+ (_inputRefs_current_ = inputRefs.current[index + validData.length]) === null || _inputRefs_current_ === void 0 ? void 0 : _inputRefs_current_.focus();
89
+ } else {
90
+ var _inputRefs_current_1;
91
+ (_inputRefs_current_1 = inputRefs.current[index + validData.length - 1]) === null || _inputRefs_current_1 === void 0 ? void 0 : _inputRefs_current_1.focus();
92
+ }
83
93
  if (newPasscode.filter((passcode)=>!passcode).length === 0) {
84
94
  if (onPasteComplete) {
85
95
  onPasteComplete(newPasscode.join(''));
@@ -769,6 +769,9 @@
769
769
  .h-8 {
770
770
  height: calc(0.375rem * 8);
771
771
  }
772
+ .h-9 {
773
+ height: calc(0.375rem * 9);
774
+ }
772
775
  .h-10 {
773
776
  height: calc(0.375rem * 10);
774
777
  }
@@ -781,6 +784,9 @@
781
784
  .h-30 {
782
785
  height: calc(0.375rem * 30);
783
786
  }
787
+ .h-50 {
788
+ height: calc(0.375rem * 50);
789
+ }
784
790
  .h-\[0\.625rem\] {
785
791
  height: 0.625rem;
786
792
  }
@@ -979,6 +985,12 @@
979
985
  .w-23 {
980
986
  width: calc(0.375rem * 23);
981
987
  }
988
+ .w-50 {
989
+ width: calc(0.375rem * 50);
990
+ }
991
+ .w-70 {
992
+ width: calc(0.375rem * 70);
993
+ }
982
994
  .w-\[1\.81ex\] {
983
995
  width: 1.81ex;
984
996
  }
@@ -1348,6 +1360,14 @@
1348
1360
  .shrink-0 {
1349
1361
  flex-shrink: 0;
1350
1362
  }
1363
+ .-translate-x-full {
1364
+ --tw-translate-x: -100%;
1365
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1366
+ }
1367
+ .translate-x-0 {
1368
+ --tw-translate-x: calc(0.375rem * 0);
1369
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1370
+ }
1351
1371
  .translate-x-\[-2\.5px\] {
1352
1372
  --tw-translate-x: -2.5px;
1353
1373
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -1360,6 +1380,10 @@
1360
1380
  --tw-translate-x: 14px;
1361
1381
  translate: var(--tw-translate-x) var(--tw-translate-y);
1362
1382
  }
1383
+ .translate-x-full {
1384
+ --tw-translate-x: 100%;
1385
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1386
+ }
1363
1387
  .-translate-y-1\/2 {
1364
1388
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
1365
1389
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -1542,6 +1566,13 @@
1542
1566
  margin-inline-end: calc(calc(0.375rem * 1) * calc(1 - var(--tw-space-x-reverse)));
1543
1567
  }
1544
1568
  }
1569
+ .space-x-4 {
1570
+ :where(& > :not(:last-child)) {
1571
+ --tw-space-x-reverse: 0;
1572
+ margin-inline-start: calc(calc(0.375rem * 4) * var(--tw-space-x-reverse));
1573
+ margin-inline-end: calc(calc(0.375rem * 4) * calc(1 - var(--tw-space-x-reverse)));
1574
+ }
1575
+ }
1545
1576
  .divide-y {
1546
1577
  :where(& > :not(:last-child)) {
1547
1578
  --tw-divide-y-reverse: 0;
@@ -3150,6 +3181,10 @@
3150
3181
  --tw-shadow: 0 0.375rem 0.75rem var(--tw-shadow-color, rgba(0,0,0,0.175));
3151
3182
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3152
3183
  }
3184
+ .shadow-\[0_2px_5px_rgba\(0\,0\,0\,0\.3\)\] {
3185
+ --tw-shadow: 0 2px 5px var(--tw-shadow-color, rgba(0,0,0,0.3));
3186
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3187
+ }
3153
3188
  .shadow-\[0_2px_12px_rgba\(0\,0\,0\,0\.2\)\] {
3154
3189
  --tw-shadow: 0 2px 12px var(--tw-shadow-color, rgba(0,0,0,0.2));
3155
3190
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -3309,6 +3344,10 @@
3309
3344
  --tw-duration: 300ms;
3310
3345
  transition-duration: 300ms;
3311
3346
  }
3347
+ .duration-500 {
3348
+ --tw-duration: 500ms;
3349
+ transition-duration: 500ms;
3350
+ }
3312
3351
  .duration-\[\.3s\] {
3313
3352
  --tw-duration: .3s;
3314
3353
  transition-duration: .3s;
@@ -3317,6 +3356,10 @@
3317
3356
  --tw-duration: .6s;
3318
3357
  transition-duration: .6s;
3319
3358
  }
3359
+ .ease-\[cubic-bezier\(0\.23\,1\,0\.32\,1\)\] {
3360
+ --tw-ease: cubic-bezier(0.23,1,0.32,1);
3361
+ transition-timing-function: cubic-bezier(0.23,1,0.32,1);
3362
+ }
3320
3363
  .ease-\[cubic-bezier\(0\.25\,0\.1\,0\.25\,1\)\] {
3321
3364
  --tw-ease: cubic-bezier(0.25,0.1,0.25,1);
3322
3365
  transition-timing-function: cubic-bezier(0.25,0.1,0.25,1);