@a-type/ui 0.6.7 → 0.6.9
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/dist/cjs/components/actions/ActionBar.js +2 -2
- package/dist/cjs/components/actions/ActionBar.js.map +1 -1
- package/dist/cjs/components/actions/ActionButton.js +2 -2
- package/dist/cjs/components/actions/ActionButton.js.map +1 -1
- package/dist/cjs/components/avatar/Avatar.js +2 -2
- package/dist/cjs/components/avatar/Avatar.js.map +1 -1
- package/dist/cjs/components/avatar/AvatarList.js +2 -2
- package/dist/cjs/components/avatar/AvatarList.js.map +1 -1
- package/dist/cjs/components/button/Button.js +2 -2
- package/dist/cjs/components/button/Button.js.map +1 -1
- package/dist/cjs/components/button/classes.js +2 -2
- package/dist/cjs/components/button/classes.js.map +1 -1
- package/dist/cjs/components/camera/Camera.js +2 -2
- package/dist/cjs/components/camera/Camera.js.map +1 -1
- package/dist/cjs/components/card/Card.js +2 -2
- package/dist/cjs/components/card/Card.js.map +1 -1
- package/dist/cjs/components/checkbox/Checkbox.d.ts +1 -1
- package/dist/cjs/components/checkbox/Checkbox.js +3 -3
- package/dist/cjs/components/checkbox/Checkbox.js.map +1 -1
- package/dist/cjs/components/chip/Chip.js +2 -2
- package/dist/cjs/components/chip/Chip.js.map +1 -1
- package/dist/cjs/components/colorPicker/ColorPicker.js +2 -2
- package/dist/cjs/components/colorPicker/ColorPicker.js.map +1 -1
- package/dist/cjs/components/contextMenu/contextMenu.d.ts +1 -1
- package/dist/cjs/components/contextMenu/contextMenu.js +2 -2
- package/dist/cjs/components/contextMenu/contextMenu.js.map +1 -1
- package/dist/cjs/components/datePicker/DatePicker.js +3 -3
- package/dist/cjs/components/datePicker/DatePicker.js.map +1 -1
- package/dist/cjs/components/dialog/Dialog.d.ts +3 -3
- package/dist/cjs/components/dialog/Dialog.js +5 -5
- package/dist/cjs/components/dialog/Dialog.js.map +1 -1
- package/dist/cjs/components/divider/Divider.js +2 -2
- package/dist/cjs/components/divider/Divider.js.map +1 -1
- package/dist/cjs/components/dropdownMenu/DropdownMenu.js +2 -2
- package/dist/cjs/components/dropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/cjs/components/forms/Form.d.ts +1 -1
- package/dist/cjs/components/forms/TextField.js.map +1 -1
- package/dist/cjs/components/icon/Icon.js +2 -2
- package/dist/cjs/components/icon/Icon.js.map +1 -1
- package/dist/cjs/components/imageUploader/ImageUploader.js +2 -2
- package/dist/cjs/components/imageUploader/ImageUploader.js.map +1 -1
- package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +2 -2
- package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
- package/dist/cjs/components/input/Input.js +3 -3
- package/dist/cjs/components/input/Input.js.map +1 -1
- package/dist/cjs/components/layouts/PageContent.js +2 -2
- package/dist/cjs/components/layouts/PageContent.js.map +1 -1
- package/dist/cjs/components/layouts/PageFixedArea.js +2 -2
- package/dist/cjs/components/layouts/PageFixedArea.js.map +1 -1
- package/dist/cjs/components/layouts/PageNav.js +2 -2
- package/dist/cjs/components/layouts/PageNav.js.map +1 -1
- package/dist/cjs/components/layouts/PageNowPlaying.js +2 -2
- package/dist/cjs/components/layouts/PageNowPlaying.js.map +1 -1
- package/dist/cjs/components/layouts/PageRoot.js +2 -2
- package/dist/cjs/components/layouts/PageRoot.js.map +1 -1
- package/dist/cjs/components/layouts/PageSection.js +2 -2
- package/dist/cjs/components/layouts/PageSection.js.map +1 -1
- package/dist/cjs/components/navBar/NavBar.js +3 -3
- package/dist/cjs/components/navBar/NavBar.js.map +1 -1
- package/dist/cjs/components/note/Note.js +2 -2
- package/dist/cjs/components/note/Note.js.map +1 -1
- package/dist/cjs/components/numberStepper/NumberStepper.js +2 -2
- package/dist/cjs/components/numberStepper/NumberStepper.js.map +1 -1
- package/dist/cjs/components/peek/Peek.js +2 -2
- package/dist/cjs/components/peek/Peek.js.map +1 -1
- package/dist/cjs/components/popover/Popover.d.ts +1 -1
- package/dist/cjs/components/popover/Popover.js +2 -2
- package/dist/cjs/components/popover/Popover.js.map +1 -1
- package/dist/cjs/components/richEditor/RichEditor.js +2 -2
- package/dist/cjs/components/richEditor/RichEditor.js.map +1 -1
- package/dist/cjs/components/select/Select.js +4 -4
- package/dist/cjs/components/select/Select.js.map +1 -1
- package/dist/cjs/components/skeletons/skeletons.js +2 -2
- package/dist/cjs/components/skeletons/skeletons.js.map +1 -1
- package/dist/cjs/components/spinner/Spinner.js +2 -2
- package/dist/cjs/components/spinner/Spinner.js.map +1 -1
- package/dist/cjs/components/textArea/TextArea.js +2 -2
- package/dist/cjs/components/textArea/TextArea.js.map +1 -1
- package/dist/cjs/components/tooltip/Tooltip.js +2 -2
- package/dist/cjs/components/tooltip/Tooltip.js.map +1 -1
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.js +2 -0
- package/dist/cjs/hooks/index.js.map +1 -1
- package/dist/cjs/hooks/useAnimationFrame.d.ts +1 -0
- package/dist/cjs/hooks/useAnimationFrame.js +25 -0
- package/dist/cjs/hooks/useAnimationFrame.js.map +1 -0
- package/dist/cjs/hooks/useLongPress.d.ts +11 -0
- package/dist/cjs/hooks/useLongPress.js +117 -0
- package/dist/cjs/hooks/useLongPress.js.map +1 -0
- package/dist/cjs/hooks/withClassName.d.ts +1 -1
- package/dist/cjs/hooks/withClassName.js +2 -2
- package/dist/cjs/hooks/withClassName.js.map +1 -1
- package/dist/esm/components/actions/ActionBar.js +1 -1
- package/dist/esm/components/actions/ActionBar.js.map +1 -1
- package/dist/esm/components/actions/ActionButton.js +1 -1
- package/dist/esm/components/actions/ActionButton.js.map +1 -1
- package/dist/esm/components/avatar/Avatar.js +1 -1
- package/dist/esm/components/avatar/Avatar.js.map +1 -1
- package/dist/esm/components/avatar/AvatarList.js +1 -1
- package/dist/esm/components/avatar/AvatarList.js.map +1 -1
- package/dist/esm/components/button/Button.js +1 -1
- package/dist/esm/components/button/Button.js.map +1 -1
- package/dist/esm/components/button/classes.js +1 -1
- package/dist/esm/components/button/classes.js.map +1 -1
- package/dist/esm/components/camera/Camera.js +1 -1
- package/dist/esm/components/camera/Camera.js.map +1 -1
- package/dist/esm/components/card/Card.js +1 -1
- package/dist/esm/components/card/Card.js.map +1 -1
- package/dist/esm/components/checkbox/Checkbox.d.ts +1 -1
- package/dist/esm/components/checkbox/Checkbox.js +1 -1
- package/dist/esm/components/checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/chip/Chip.js +1 -1
- package/dist/esm/components/chip/Chip.js.map +1 -1
- package/dist/esm/components/colorPicker/ColorPicker.js +1 -1
- package/dist/esm/components/colorPicker/ColorPicker.js.map +1 -1
- package/dist/esm/components/contextMenu/contextMenu.d.ts +1 -1
- package/dist/esm/components/contextMenu/contextMenu.js +1 -1
- package/dist/esm/components/contextMenu/contextMenu.js.map +1 -1
- package/dist/esm/components/datePicker/DatePicker.js +1 -1
- package/dist/esm/components/datePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/dialog/Dialog.d.ts +3 -3
- package/dist/esm/components/dialog/Dialog.js +1 -1
- package/dist/esm/components/dialog/Dialog.js.map +1 -1
- package/dist/esm/components/divider/Divider.js +1 -1
- package/dist/esm/components/divider/Divider.js.map +1 -1
- package/dist/esm/components/dropdownMenu/DropdownMenu.js +1 -1
- package/dist/esm/components/dropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/esm/components/forms/Form.d.ts +1 -1
- package/dist/esm/components/forms/TextField.js.map +1 -1
- package/dist/esm/components/icon/Icon.js +1 -1
- package/dist/esm/components/icon/Icon.js.map +1 -1
- package/dist/esm/components/imageUploader/ImageUploader.js +1 -1
- package/dist/esm/components/imageUploader/ImageUploader.js.map +1 -1
- package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +1 -1
- package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
- package/dist/esm/components/input/Input.js +1 -1
- package/dist/esm/components/input/Input.js.map +1 -1
- package/dist/esm/components/layouts/PageContent.js +1 -1
- package/dist/esm/components/layouts/PageContent.js.map +1 -1
- package/dist/esm/components/layouts/PageFixedArea.js +1 -1
- package/dist/esm/components/layouts/PageFixedArea.js.map +1 -1
- package/dist/esm/components/layouts/PageNav.js +1 -1
- package/dist/esm/components/layouts/PageNav.js.map +1 -1
- package/dist/esm/components/layouts/PageNowPlaying.js +1 -1
- package/dist/esm/components/layouts/PageNowPlaying.js.map +1 -1
- package/dist/esm/components/layouts/PageRoot.js +1 -1
- package/dist/esm/components/layouts/PageRoot.js.map +1 -1
- package/dist/esm/components/layouts/PageSection.js +1 -1
- package/dist/esm/components/layouts/PageSection.js.map +1 -1
- package/dist/esm/components/navBar/NavBar.js +1 -1
- package/dist/esm/components/navBar/NavBar.js.map +1 -1
- package/dist/esm/components/note/Note.js +1 -1
- package/dist/esm/components/note/Note.js.map +1 -1
- package/dist/esm/components/numberStepper/NumberStepper.js +1 -1
- package/dist/esm/components/numberStepper/NumberStepper.js.map +1 -1
- package/dist/esm/components/peek/Peek.js +1 -1
- package/dist/esm/components/peek/Peek.js.map +1 -1
- package/dist/esm/components/popover/Popover.d.ts +1 -1
- package/dist/esm/components/popover/Popover.js +1 -1
- package/dist/esm/components/popover/Popover.js.map +1 -1
- package/dist/esm/components/richEditor/RichEditor.js +1 -1
- package/dist/esm/components/richEditor/RichEditor.js.map +1 -1
- package/dist/esm/components/select/Select.js +1 -1
- package/dist/esm/components/select/Select.js.map +1 -1
- package/dist/esm/components/skeletons/skeletons.js +1 -1
- package/dist/esm/components/skeletons/skeletons.js.map +1 -1
- package/dist/esm/components/spinner/Spinner.js +1 -1
- package/dist/esm/components/spinner/Spinner.js.map +1 -1
- package/dist/esm/components/textArea/TextArea.js +1 -1
- package/dist/esm/components/textArea/TextArea.js.map +1 -1
- package/dist/esm/components/tooltip/Tooltip.js +1 -1
- package/dist/esm/components/tooltip/Tooltip.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/useAnimationFrame.d.ts +1 -0
- package/dist/esm/hooks/useAnimationFrame.js +21 -0
- package/dist/esm/hooks/useAnimationFrame.js.map +1 -0
- package/dist/esm/hooks/useLongPress.d.ts +11 -0
- package/dist/esm/hooks/useLongPress.js +113 -0
- package/dist/esm/hooks/useLongPress.js.map +1 -0
- package/dist/esm/hooks/withClassName.d.ts +1 -1
- package/dist/esm/hooks/withClassName.js +1 -1
- package/dist/esm/hooks/withClassName.js.map +1 -1
- package/package.json +3 -3
- package/src/components/actions/ActionBar.tsx +1 -1
- package/src/components/actions/ActionButton.tsx +1 -1
- package/src/components/avatar/Avatar.tsx +1 -1
- package/src/components/avatar/AvatarList.tsx +1 -1
- package/src/components/button/Button.tsx +1 -1
- package/src/components/button/classes.tsx +1 -1
- package/src/components/camera/Camera.tsx +1 -1
- package/src/components/card/Card.tsx +1 -1
- package/src/components/checkbox/Checkbox.tsx +1 -1
- package/src/components/chip/Chip.tsx +1 -1
- package/src/components/colorPicker/ColorPicker.tsx +1 -1
- package/src/components/contextMenu/contextMenu.tsx +1 -1
- package/src/components/datePicker/DatePicker.tsx +1 -1
- package/src/components/dialog/Dialog.tsx +1 -1
- package/src/components/divider/Divider.tsx +1 -1
- package/src/components/dropdownMenu/DropdownMenu.tsx +1 -1
- package/src/components/forms/TextField.tsx +81 -81
- package/src/components/icon/Icon.tsx +1 -1
- package/src/components/imageUploader/ImageUploader.tsx +1 -1
- package/src/components/infiniteLoadTrigger/InfiniteLoadTrigger.tsx +1 -1
- package/src/components/input/Input.tsx +1 -1
- package/src/components/layouts/PageContent.tsx +1 -1
- package/src/components/layouts/PageFixedArea.tsx +1 -1
- package/src/components/layouts/PageNav.tsx +1 -1
- package/src/components/layouts/PageNowPlaying.tsx +1 -1
- package/src/components/layouts/PageRoot.tsx +1 -1
- package/src/components/layouts/PageSection.tsx +1 -1
- package/src/components/navBar/NavBar.tsx +1 -1
- package/src/components/note/Note.tsx +1 -1
- package/src/components/numberStepper/NumberStepper.tsx +1 -1
- package/src/components/peek/Peek.tsx +60 -60
- package/src/components/popover/Popover.tsx +1 -1
- package/src/components/richEditor/RichEditor.tsx +1 -1
- package/src/components/select/Select.tsx +1 -1
- package/src/components/skeletons/skeletons.tsx +1 -1
- package/src/components/spinner/Spinner.tsx +1 -1
- package/src/components/textArea/TextArea.tsx +1 -1
- package/src/components/tooltip/Tooltip.tsx +1 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnimationFrame.ts +23 -0
- package/src/hooks/useLongPress.ts +135 -0
- package/src/hooks/withClassName.tsx +1 -1
|
@@ -2,111 +2,111 @@
|
|
|
2
2
|
|
|
3
3
|
import { useField } from 'formik';
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
ComponentProps,
|
|
6
|
+
InputHTMLAttributes,
|
|
7
|
+
useEffect,
|
|
8
|
+
useRef,
|
|
9
|
+
Ref,
|
|
10
|
+
forwardRef,
|
|
11
11
|
} from 'react';
|
|
12
12
|
import useMergedRef from '../../hooks/useMergedRef.js';
|
|
13
|
-
import classNames from '
|
|
13
|
+
import classNames from 'clsx';
|
|
14
14
|
import { Input } from '../input/Input.js';
|
|
15
15
|
import { TextArea, TextAreaProps } from '../textArea/TextArea.js';
|
|
16
16
|
import { withClassName } from '../../hooks.js';
|
|
17
17
|
|
|
18
18
|
export type TextFieldProps = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
name: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
type?: InputHTMLAttributes<HTMLInputElement>['type'];
|
|
23
|
+
className?: string;
|
|
24
|
+
placeholder?: string;
|
|
25
|
+
autoComplete?: InputHTMLAttributes<HTMLInputElement>['autoComplete'];
|
|
26
|
+
autoFocus?: InputHTMLAttributes<HTMLInputElement>['autoFocus'];
|
|
27
|
+
autoFocusDelay?: number;
|
|
28
|
+
inputRef?: Ref<HTMLInputElement>;
|
|
29
29
|
} & ComponentProps<typeof Input>;
|
|
30
30
|
|
|
31
31
|
const emptyRef = (() => {}) as any;
|
|
32
32
|
|
|
33
33
|
export const TextField = forwardRef<HTMLDivElement, TextFieldProps>(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
34
|
+
function TextField(
|
|
35
|
+
{
|
|
36
|
+
name,
|
|
37
|
+
label,
|
|
38
|
+
className,
|
|
39
|
+
autoFocusDelay,
|
|
40
|
+
autoFocus,
|
|
41
|
+
inputRef,
|
|
42
|
+
onChange,
|
|
43
|
+
onFocus,
|
|
44
|
+
onBlur,
|
|
45
|
+
...rest
|
|
46
|
+
},
|
|
47
|
+
ref,
|
|
48
|
+
) {
|
|
49
|
+
const [props] = useField({
|
|
50
|
+
name,
|
|
51
|
+
onChange,
|
|
52
|
+
onFocus,
|
|
53
|
+
onBlur,
|
|
54
|
+
});
|
|
55
|
+
const innerInputRef = useRef<HTMLInputElement>(null);
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (autoFocusDelay) {
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
if (innerInputRef.current) innerInputRef.current.focus();
|
|
61
|
+
}, autoFocusDelay);
|
|
62
|
+
}
|
|
63
|
+
}, [autoFocusDelay]);
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
65
|
+
return (
|
|
66
|
+
<FieldRoot className={className} ref={ref}>
|
|
67
|
+
{label && <FieldLabel>{label}</FieldLabel>}
|
|
68
|
+
<Input
|
|
69
|
+
{...props}
|
|
70
|
+
{...rest}
|
|
71
|
+
autoFocus={autoFocus}
|
|
72
|
+
ref={useMergedRef(innerInputRef, inputRef || emptyRef)}
|
|
73
|
+
/>
|
|
74
|
+
</FieldRoot>
|
|
75
|
+
);
|
|
76
|
+
},
|
|
77
77
|
);
|
|
78
78
|
|
|
79
79
|
export type TextAreaFieldProps = {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
name: string;
|
|
81
|
+
label?: string;
|
|
82
|
+
required?: boolean;
|
|
83
|
+
rows?: number;
|
|
84
|
+
disabled?: boolean;
|
|
85
|
+
className?: string;
|
|
86
|
+
inputRef?: Ref<HTMLTextAreaElement>;
|
|
87
87
|
} & TextAreaProps;
|
|
88
88
|
|
|
89
89
|
export function TextAreaField({
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
name,
|
|
91
|
+
label,
|
|
92
|
+
className,
|
|
93
|
+
inputRef,
|
|
94
|
+
...rest
|
|
95
95
|
}: TextAreaFieldProps) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
const [props] = useField(name);
|
|
97
|
+
return (
|
|
98
|
+
<FieldRoot className={className}>
|
|
99
|
+
{label && <FieldLabel>{label}</FieldLabel>}
|
|
100
|
+
<TextArea ref={inputRef} {...props} {...rest} />
|
|
101
|
+
</FieldRoot>
|
|
102
|
+
);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const FieldRoot = withClassName(
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
'div',
|
|
107
|
+
'flex flex-col items-stretch gap-1 self-stretch',
|
|
108
108
|
);
|
|
109
109
|
const FieldLabel = withClassName(
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
'label',
|
|
111
|
+
'inline-flex flex-col gap-1 text-sm font-bold text-dark-blend mb-1',
|
|
112
112
|
);
|
|
@@ -1,74 +1,74 @@
|
|
|
1
1
|
import { debounce } from '@a-type/utils';
|
|
2
|
-
import classNames from '
|
|
2
|
+
import classNames from 'clsx';
|
|
3
3
|
import { ReactNode, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { useSize } from '../../hooks/useSize.js';
|
|
5
5
|
import { useToggle } from '../../hooks/useToggle.js';
|
|
6
6
|
|
|
7
7
|
export interface PeekProps {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
peekHeight?: number;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
className?: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export function Peek({ peekHeight = 120, children, className }: PeekProps) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
15
|
+
const [isPeekable, setIsPeekable] = useState(false);
|
|
16
|
+
const contentRef = useSize<HTMLDivElement>(
|
|
17
|
+
useMemo(
|
|
18
|
+
() =>
|
|
19
|
+
debounce(({ height }) => {
|
|
20
|
+
setIsPeekable(height > peekHeight);
|
|
21
|
+
if (containerRef.current) {
|
|
22
|
+
containerRef.current.style.setProperty(
|
|
23
|
+
'--collapsible-height',
|
|
24
|
+
`${height}px`,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
}, 300),
|
|
28
|
+
[],
|
|
29
|
+
),
|
|
30
|
+
);
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const [open, toggle] = useToggle(false);
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (containerRef.current) {
|
|
36
|
+
containerRef.current.style.setProperty(
|
|
37
|
+
'--peek-height',
|
|
38
|
+
`${peekHeight}px`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}, [peekHeight]);
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
const id = useId();
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
45
|
+
return (
|
|
46
|
+
<div
|
|
47
|
+
className={classNames(
|
|
48
|
+
'relative animate-ease-default animate-forwards overflow-hidden [&[data-state=closed]]:(animate-keyframes-peek-close animate-duration-300 max-h-[var(--peek-height,120px)]) [&[data-state=open]]:(animate-keyframes-peek-open animate-duration-600)',
|
|
49
|
+
className,
|
|
50
|
+
)}
|
|
51
|
+
ref={containerRef}
|
|
52
|
+
data-state={isPeekable ? (open ? 'open' : 'closed') : undefined}
|
|
53
|
+
>
|
|
54
|
+
<div ref={contentRef} id={id}>
|
|
55
|
+
{children}
|
|
56
|
+
</div>
|
|
57
|
+
{isPeekable && (
|
|
58
|
+
<button
|
|
59
|
+
data-state={open ? 'open' : 'closed'}
|
|
60
|
+
className={classNames(
|
|
61
|
+
'h-80px absolute bottom-0 z-1 bg-transparent border-none w-full cursor-pointer border-b border-solid border-white',
|
|
62
|
+
'focus-visible:(outline-none bg-gradient-to-b from-transparent to-primary-wash border-b border-solid border-primary',
|
|
63
|
+
'after:(content-["-_tap_to_expand_-"] p-3 color-gray9 text-xs flex flex-col justify-end items-center absolute inset-0 top-auto h-80px bg-gradient-to-b from-transparent to-white)',
|
|
64
|
+
'after:[&[data-state=open]]:content-["-_tap_to_collapse_-"]',
|
|
65
|
+
)}
|
|
66
|
+
onClick={toggle}
|
|
67
|
+
aria-label="Toggle show description"
|
|
68
|
+
aria-expanded={open}
|
|
69
|
+
aria-controls={id}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
</div>
|
|
73
|
+
);
|
|
74
74
|
}
|
|
@@ -4,7 +4,7 @@ import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
|
4
4
|
import { ComponentPropsWithoutRef, forwardRef } from 'react';
|
|
5
5
|
|
|
6
6
|
import { withClassName } from '../../hooks/withClassName.js';
|
|
7
|
-
import classNames from '
|
|
7
|
+
import classNames from 'clsx';
|
|
8
8
|
|
|
9
9
|
const StyledContent = withClassName(
|
|
10
10
|
PopoverPrimitive.Content,
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useStableCallback } from './useStableCallback.js';
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
export function useAnimationFrame<Context>(
|
|
5
|
+
callback: (deltaTime: number, context: Context) => void,
|
|
6
|
+
initialContext?: Context,
|
|
7
|
+
) {
|
|
8
|
+
const requestRef = useRef<number>();
|
|
9
|
+
const previousTimeRef = useRef<number>();
|
|
10
|
+
const contextRef = useRef<Context>(initialContext!);
|
|
11
|
+
const animate = useStableCallback((time: number) => {
|
|
12
|
+
if (previousTimeRef.current !== undefined) {
|
|
13
|
+
const deltaTime = time - previousTimeRef.current;
|
|
14
|
+
callback(deltaTime, contextRef.current);
|
|
15
|
+
}
|
|
16
|
+
previousTimeRef.current = time;
|
|
17
|
+
requestRef.current = requestAnimationFrame(animate);
|
|
18
|
+
});
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
requestRef.current = requestAnimationFrame(animate);
|
|
21
|
+
return () => cancelAnimationFrame(requestRef.current!);
|
|
22
|
+
}, [animate]);
|
|
23
|
+
}
|