@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.
Files changed (227) hide show
  1. package/dist/cjs/components/actions/ActionBar.js +2 -2
  2. package/dist/cjs/components/actions/ActionBar.js.map +1 -1
  3. package/dist/cjs/components/actions/ActionButton.js +2 -2
  4. package/dist/cjs/components/actions/ActionButton.js.map +1 -1
  5. package/dist/cjs/components/avatar/Avatar.js +2 -2
  6. package/dist/cjs/components/avatar/Avatar.js.map +1 -1
  7. package/dist/cjs/components/avatar/AvatarList.js +2 -2
  8. package/dist/cjs/components/avatar/AvatarList.js.map +1 -1
  9. package/dist/cjs/components/button/Button.js +2 -2
  10. package/dist/cjs/components/button/Button.js.map +1 -1
  11. package/dist/cjs/components/button/classes.js +2 -2
  12. package/dist/cjs/components/button/classes.js.map +1 -1
  13. package/dist/cjs/components/camera/Camera.js +2 -2
  14. package/dist/cjs/components/camera/Camera.js.map +1 -1
  15. package/dist/cjs/components/card/Card.js +2 -2
  16. package/dist/cjs/components/card/Card.js.map +1 -1
  17. package/dist/cjs/components/checkbox/Checkbox.d.ts +1 -1
  18. package/dist/cjs/components/checkbox/Checkbox.js +3 -3
  19. package/dist/cjs/components/checkbox/Checkbox.js.map +1 -1
  20. package/dist/cjs/components/chip/Chip.js +2 -2
  21. package/dist/cjs/components/chip/Chip.js.map +1 -1
  22. package/dist/cjs/components/colorPicker/ColorPicker.js +2 -2
  23. package/dist/cjs/components/colorPicker/ColorPicker.js.map +1 -1
  24. package/dist/cjs/components/contextMenu/contextMenu.d.ts +1 -1
  25. package/dist/cjs/components/contextMenu/contextMenu.js +2 -2
  26. package/dist/cjs/components/contextMenu/contextMenu.js.map +1 -1
  27. package/dist/cjs/components/datePicker/DatePicker.js +3 -3
  28. package/dist/cjs/components/datePicker/DatePicker.js.map +1 -1
  29. package/dist/cjs/components/dialog/Dialog.d.ts +3 -3
  30. package/dist/cjs/components/dialog/Dialog.js +5 -5
  31. package/dist/cjs/components/dialog/Dialog.js.map +1 -1
  32. package/dist/cjs/components/divider/Divider.js +2 -2
  33. package/dist/cjs/components/divider/Divider.js.map +1 -1
  34. package/dist/cjs/components/dropdownMenu/DropdownMenu.js +2 -2
  35. package/dist/cjs/components/dropdownMenu/DropdownMenu.js.map +1 -1
  36. package/dist/cjs/components/forms/Form.d.ts +1 -1
  37. package/dist/cjs/components/forms/TextField.js.map +1 -1
  38. package/dist/cjs/components/icon/Icon.js +2 -2
  39. package/dist/cjs/components/icon/Icon.js.map +1 -1
  40. package/dist/cjs/components/imageUploader/ImageUploader.js +2 -2
  41. package/dist/cjs/components/imageUploader/ImageUploader.js.map +1 -1
  42. package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +2 -2
  43. package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
  44. package/dist/cjs/components/input/Input.js +3 -3
  45. package/dist/cjs/components/input/Input.js.map +1 -1
  46. package/dist/cjs/components/layouts/PageContent.js +2 -2
  47. package/dist/cjs/components/layouts/PageContent.js.map +1 -1
  48. package/dist/cjs/components/layouts/PageFixedArea.js +2 -2
  49. package/dist/cjs/components/layouts/PageFixedArea.js.map +1 -1
  50. package/dist/cjs/components/layouts/PageNav.js +2 -2
  51. package/dist/cjs/components/layouts/PageNav.js.map +1 -1
  52. package/dist/cjs/components/layouts/PageNowPlaying.js +2 -2
  53. package/dist/cjs/components/layouts/PageNowPlaying.js.map +1 -1
  54. package/dist/cjs/components/layouts/PageRoot.js +2 -2
  55. package/dist/cjs/components/layouts/PageRoot.js.map +1 -1
  56. package/dist/cjs/components/layouts/PageSection.js +2 -2
  57. package/dist/cjs/components/layouts/PageSection.js.map +1 -1
  58. package/dist/cjs/components/navBar/NavBar.js +3 -3
  59. package/dist/cjs/components/navBar/NavBar.js.map +1 -1
  60. package/dist/cjs/components/note/Note.js +2 -2
  61. package/dist/cjs/components/note/Note.js.map +1 -1
  62. package/dist/cjs/components/numberStepper/NumberStepper.js +2 -2
  63. package/dist/cjs/components/numberStepper/NumberStepper.js.map +1 -1
  64. package/dist/cjs/components/peek/Peek.js +2 -2
  65. package/dist/cjs/components/peek/Peek.js.map +1 -1
  66. package/dist/cjs/components/popover/Popover.d.ts +1 -1
  67. package/dist/cjs/components/popover/Popover.js +2 -2
  68. package/dist/cjs/components/popover/Popover.js.map +1 -1
  69. package/dist/cjs/components/richEditor/RichEditor.js +2 -2
  70. package/dist/cjs/components/richEditor/RichEditor.js.map +1 -1
  71. package/dist/cjs/components/select/Select.js +4 -4
  72. package/dist/cjs/components/select/Select.js.map +1 -1
  73. package/dist/cjs/components/skeletons/skeletons.js +2 -2
  74. package/dist/cjs/components/skeletons/skeletons.js.map +1 -1
  75. package/dist/cjs/components/spinner/Spinner.js +2 -2
  76. package/dist/cjs/components/spinner/Spinner.js.map +1 -1
  77. package/dist/cjs/components/textArea/TextArea.js +2 -2
  78. package/dist/cjs/components/textArea/TextArea.js.map +1 -1
  79. package/dist/cjs/components/tooltip/Tooltip.js +2 -2
  80. package/dist/cjs/components/tooltip/Tooltip.js.map +1 -1
  81. package/dist/cjs/hooks/index.d.ts +2 -0
  82. package/dist/cjs/hooks/index.js +2 -0
  83. package/dist/cjs/hooks/index.js.map +1 -1
  84. package/dist/cjs/hooks/useAnimationFrame.d.ts +1 -0
  85. package/dist/cjs/hooks/useAnimationFrame.js +25 -0
  86. package/dist/cjs/hooks/useAnimationFrame.js.map +1 -0
  87. package/dist/cjs/hooks/useLongPress.d.ts +11 -0
  88. package/dist/cjs/hooks/useLongPress.js +117 -0
  89. package/dist/cjs/hooks/useLongPress.js.map +1 -0
  90. package/dist/cjs/hooks/withClassName.d.ts +1 -1
  91. package/dist/cjs/hooks/withClassName.js +2 -2
  92. package/dist/cjs/hooks/withClassName.js.map +1 -1
  93. package/dist/esm/components/actions/ActionBar.js +1 -1
  94. package/dist/esm/components/actions/ActionBar.js.map +1 -1
  95. package/dist/esm/components/actions/ActionButton.js +1 -1
  96. package/dist/esm/components/actions/ActionButton.js.map +1 -1
  97. package/dist/esm/components/avatar/Avatar.js +1 -1
  98. package/dist/esm/components/avatar/Avatar.js.map +1 -1
  99. package/dist/esm/components/avatar/AvatarList.js +1 -1
  100. package/dist/esm/components/avatar/AvatarList.js.map +1 -1
  101. package/dist/esm/components/button/Button.js +1 -1
  102. package/dist/esm/components/button/Button.js.map +1 -1
  103. package/dist/esm/components/button/classes.js +1 -1
  104. package/dist/esm/components/button/classes.js.map +1 -1
  105. package/dist/esm/components/camera/Camera.js +1 -1
  106. package/dist/esm/components/camera/Camera.js.map +1 -1
  107. package/dist/esm/components/card/Card.js +1 -1
  108. package/dist/esm/components/card/Card.js.map +1 -1
  109. package/dist/esm/components/checkbox/Checkbox.d.ts +1 -1
  110. package/dist/esm/components/checkbox/Checkbox.js +1 -1
  111. package/dist/esm/components/checkbox/Checkbox.js.map +1 -1
  112. package/dist/esm/components/chip/Chip.js +1 -1
  113. package/dist/esm/components/chip/Chip.js.map +1 -1
  114. package/dist/esm/components/colorPicker/ColorPicker.js +1 -1
  115. package/dist/esm/components/colorPicker/ColorPicker.js.map +1 -1
  116. package/dist/esm/components/contextMenu/contextMenu.d.ts +1 -1
  117. package/dist/esm/components/contextMenu/contextMenu.js +1 -1
  118. package/dist/esm/components/contextMenu/contextMenu.js.map +1 -1
  119. package/dist/esm/components/datePicker/DatePicker.js +1 -1
  120. package/dist/esm/components/datePicker/DatePicker.js.map +1 -1
  121. package/dist/esm/components/dialog/Dialog.d.ts +3 -3
  122. package/dist/esm/components/dialog/Dialog.js +1 -1
  123. package/dist/esm/components/dialog/Dialog.js.map +1 -1
  124. package/dist/esm/components/divider/Divider.js +1 -1
  125. package/dist/esm/components/divider/Divider.js.map +1 -1
  126. package/dist/esm/components/dropdownMenu/DropdownMenu.js +1 -1
  127. package/dist/esm/components/dropdownMenu/DropdownMenu.js.map +1 -1
  128. package/dist/esm/components/forms/Form.d.ts +1 -1
  129. package/dist/esm/components/forms/TextField.js.map +1 -1
  130. package/dist/esm/components/icon/Icon.js +1 -1
  131. package/dist/esm/components/icon/Icon.js.map +1 -1
  132. package/dist/esm/components/imageUploader/ImageUploader.js +1 -1
  133. package/dist/esm/components/imageUploader/ImageUploader.js.map +1 -1
  134. package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +1 -1
  135. package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
  136. package/dist/esm/components/input/Input.js +1 -1
  137. package/dist/esm/components/input/Input.js.map +1 -1
  138. package/dist/esm/components/layouts/PageContent.js +1 -1
  139. package/dist/esm/components/layouts/PageContent.js.map +1 -1
  140. package/dist/esm/components/layouts/PageFixedArea.js +1 -1
  141. package/dist/esm/components/layouts/PageFixedArea.js.map +1 -1
  142. package/dist/esm/components/layouts/PageNav.js +1 -1
  143. package/dist/esm/components/layouts/PageNav.js.map +1 -1
  144. package/dist/esm/components/layouts/PageNowPlaying.js +1 -1
  145. package/dist/esm/components/layouts/PageNowPlaying.js.map +1 -1
  146. package/dist/esm/components/layouts/PageRoot.js +1 -1
  147. package/dist/esm/components/layouts/PageRoot.js.map +1 -1
  148. package/dist/esm/components/layouts/PageSection.js +1 -1
  149. package/dist/esm/components/layouts/PageSection.js.map +1 -1
  150. package/dist/esm/components/navBar/NavBar.js +1 -1
  151. package/dist/esm/components/navBar/NavBar.js.map +1 -1
  152. package/dist/esm/components/note/Note.js +1 -1
  153. package/dist/esm/components/note/Note.js.map +1 -1
  154. package/dist/esm/components/numberStepper/NumberStepper.js +1 -1
  155. package/dist/esm/components/numberStepper/NumberStepper.js.map +1 -1
  156. package/dist/esm/components/peek/Peek.js +1 -1
  157. package/dist/esm/components/peek/Peek.js.map +1 -1
  158. package/dist/esm/components/popover/Popover.d.ts +1 -1
  159. package/dist/esm/components/popover/Popover.js +1 -1
  160. package/dist/esm/components/popover/Popover.js.map +1 -1
  161. package/dist/esm/components/richEditor/RichEditor.js +1 -1
  162. package/dist/esm/components/richEditor/RichEditor.js.map +1 -1
  163. package/dist/esm/components/select/Select.js +1 -1
  164. package/dist/esm/components/select/Select.js.map +1 -1
  165. package/dist/esm/components/skeletons/skeletons.js +1 -1
  166. package/dist/esm/components/skeletons/skeletons.js.map +1 -1
  167. package/dist/esm/components/spinner/Spinner.js +1 -1
  168. package/dist/esm/components/spinner/Spinner.js.map +1 -1
  169. package/dist/esm/components/textArea/TextArea.js +1 -1
  170. package/dist/esm/components/textArea/TextArea.js.map +1 -1
  171. package/dist/esm/components/tooltip/Tooltip.js +1 -1
  172. package/dist/esm/components/tooltip/Tooltip.js.map +1 -1
  173. package/dist/esm/hooks/index.d.ts +2 -0
  174. package/dist/esm/hooks/index.js +2 -0
  175. package/dist/esm/hooks/index.js.map +1 -1
  176. package/dist/esm/hooks/useAnimationFrame.d.ts +1 -0
  177. package/dist/esm/hooks/useAnimationFrame.js +21 -0
  178. package/dist/esm/hooks/useAnimationFrame.js.map +1 -0
  179. package/dist/esm/hooks/useLongPress.d.ts +11 -0
  180. package/dist/esm/hooks/useLongPress.js +113 -0
  181. package/dist/esm/hooks/useLongPress.js.map +1 -0
  182. package/dist/esm/hooks/withClassName.d.ts +1 -1
  183. package/dist/esm/hooks/withClassName.js +1 -1
  184. package/dist/esm/hooks/withClassName.js.map +1 -1
  185. package/package.json +3 -3
  186. package/src/components/actions/ActionBar.tsx +1 -1
  187. package/src/components/actions/ActionButton.tsx +1 -1
  188. package/src/components/avatar/Avatar.tsx +1 -1
  189. package/src/components/avatar/AvatarList.tsx +1 -1
  190. package/src/components/button/Button.tsx +1 -1
  191. package/src/components/button/classes.tsx +1 -1
  192. package/src/components/camera/Camera.tsx +1 -1
  193. package/src/components/card/Card.tsx +1 -1
  194. package/src/components/checkbox/Checkbox.tsx +1 -1
  195. package/src/components/chip/Chip.tsx +1 -1
  196. package/src/components/colorPicker/ColorPicker.tsx +1 -1
  197. package/src/components/contextMenu/contextMenu.tsx +1 -1
  198. package/src/components/datePicker/DatePicker.tsx +1 -1
  199. package/src/components/dialog/Dialog.tsx +1 -1
  200. package/src/components/divider/Divider.tsx +1 -1
  201. package/src/components/dropdownMenu/DropdownMenu.tsx +1 -1
  202. package/src/components/forms/TextField.tsx +81 -81
  203. package/src/components/icon/Icon.tsx +1 -1
  204. package/src/components/imageUploader/ImageUploader.tsx +1 -1
  205. package/src/components/infiniteLoadTrigger/InfiniteLoadTrigger.tsx +1 -1
  206. package/src/components/input/Input.tsx +1 -1
  207. package/src/components/layouts/PageContent.tsx +1 -1
  208. package/src/components/layouts/PageFixedArea.tsx +1 -1
  209. package/src/components/layouts/PageNav.tsx +1 -1
  210. package/src/components/layouts/PageNowPlaying.tsx +1 -1
  211. package/src/components/layouts/PageRoot.tsx +1 -1
  212. package/src/components/layouts/PageSection.tsx +1 -1
  213. package/src/components/navBar/NavBar.tsx +1 -1
  214. package/src/components/note/Note.tsx +1 -1
  215. package/src/components/numberStepper/NumberStepper.tsx +1 -1
  216. package/src/components/peek/Peek.tsx +60 -60
  217. package/src/components/popover/Popover.tsx +1 -1
  218. package/src/components/richEditor/RichEditor.tsx +1 -1
  219. package/src/components/select/Select.tsx +1 -1
  220. package/src/components/skeletons/skeletons.tsx +1 -1
  221. package/src/components/spinner/Spinner.tsx +1 -1
  222. package/src/components/textArea/TextArea.tsx +1 -1
  223. package/src/components/tooltip/Tooltip.tsx +1 -1
  224. package/src/hooks/index.ts +2 -0
  225. package/src/hooks/useAnimationFrame.ts +23 -0
  226. package/src/hooks/useLongPress.ts +135 -0
  227. package/src/hooks/withClassName.tsx +1 -1
@@ -2,111 +2,111 @@
2
2
 
3
3
  import { useField } from 'formik';
4
4
  import {
5
- ComponentProps,
6
- InputHTMLAttributes,
7
- useEffect,
8
- useRef,
9
- Ref,
10
- forwardRef,
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 'classnames';
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
- 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>;
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
- 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);
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
- useEffect(() => {
58
- if (autoFocusDelay) {
59
- setTimeout(() => {
60
- if (innerInputRef.current) innerInputRef.current.focus();
61
- }, autoFocusDelay);
62
- }
63
- }, [autoFocusDelay]);
57
+ useEffect(() => {
58
+ if (autoFocusDelay) {
59
+ setTimeout(() => {
60
+ if (innerInputRef.current) innerInputRef.current.focus();
61
+ }, autoFocusDelay);
62
+ }
63
+ }, [autoFocusDelay]);
64
64
 
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
- },
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
- name: string;
81
- label?: string;
82
- required?: boolean;
83
- rows?: number;
84
- disabled?: boolean;
85
- className?: string;
86
- inputRef?: Ref<HTMLTextAreaElement>;
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
- name,
91
- label,
92
- className,
93
- inputRef,
94
- ...rest
90
+ name,
91
+ label,
92
+ className,
93
+ inputRef,
94
+ ...rest
95
95
  }: TextAreaFieldProps) {
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
- );
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
- 'div',
107
- 'flex flex-col items-stretch gap-1 self-stretch',
106
+ 'div',
107
+ 'flex flex-col items-stretch gap-1 self-stretch',
108
108
  );
109
109
  const FieldLabel = withClassName(
110
- 'label',
111
- 'inline-flex flex-col gap-1 text-sm font-bold text-dark-blend mb-1',
110
+ 'label',
111
+ 'inline-flex flex-col gap-1 text-sm font-bold text-dark-blend mb-1',
112
112
  );
@@ -1,5 +1,5 @@
1
1
  import { forwardRef, HTMLAttributes } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
  import { IconName } from './generated/iconNames.js';
4
4
 
5
5
  export interface IconProps extends HTMLAttributes<SVGSVGElement> {
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import { useCallback, useId, useState } from 'react';
5
5
  import { Icon } from '../icon.js';
6
6
  import { Button } from '../button.js';
@@ -1,5 +1,5 @@
1
1
  import { ReactNode, forwardRef, useEffect, useRef } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
  import useMergedRef from '../../hooks/useMergedRef.js';
4
4
  import { useStableCallback } from '../../hooks.js';
5
5
 
@@ -1,4 +1,4 @@
1
- import classNames from 'classnames';
1
+ import classNames from 'clsx';
2
2
  import { ComponentProps, ComponentPropsWithRef, forwardRef } from 'react';
3
3
 
4
4
  export const inputClassName = classNames(
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
  import { HTMLAttributes } from 'react';
4
4
  import { useBoundsCssVars } from '../../hooks/useSize.js';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
 
4
4
  export function PageFixedArea({
5
5
  className,
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import { HTMLAttributes } from 'react';
5
5
 
6
6
  export function PageNav({
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import { HTMLAttributes } from 'react';
5
5
 
6
6
  export function PageNowPlaying({
@@ -1,4 +1,4 @@
1
- import classNames from 'classnames';
1
+ import classNames from 'clsx';
2
2
  import { forwardRef, ReactNode } from 'react';
3
3
 
4
4
  export const PageRoot = forwardRef<
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
  import { withClassName } from '../../hooks/withClassName.js';
4
4
 
5
5
  export function PageSection({
@@ -1,4 +1,4 @@
1
- import classNames from 'classnames';
1
+ import classNames from 'clsx';
2
2
  import { withClassName } from '../../hooks.js';
3
3
  import { ReactNode, forwardRef } from 'react';
4
4
  import { Slot } from '@radix-ui/react-slot';
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes, ReactNode } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
 
4
4
  export interface NoteProps extends HTMLAttributes<HTMLDivElement> {
5
5
  children?: ReactNode;
@@ -1,6 +1,6 @@
1
1
  import { fractionToText } from '@a-type/utils';
2
2
  import { MinusIcon, PlusIcon } from '@radix-ui/react-icons';
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import { ReactNode } from 'react';
5
5
  import { Button } from '../button.js';
6
6
 
@@ -1,74 +1,74 @@
1
1
  import { debounce } from '@a-type/utils';
2
- import classNames from 'classnames';
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
- peekHeight?: number;
9
- children: ReactNode;
10
- className?: string;
8
+ peekHeight?: number;
9
+ children: ReactNode;
10
+ className?: string;
11
11
  }
12
12
 
13
13
  export function Peek({ peekHeight = 120, children, className }: PeekProps) {
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
- );
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
- const [open, toggle] = useToggle(false);
32
+ const [open, toggle] = useToggle(false);
33
33
 
34
- useEffect(() => {
35
- if (containerRef.current) {
36
- containerRef.current.style.setProperty(
37
- '--peek-height',
38
- `${peekHeight}px`,
39
- );
40
- }
41
- }, [peekHeight]);
34
+ useEffect(() => {
35
+ if (containerRef.current) {
36
+ containerRef.current.style.setProperty(
37
+ '--peek-height',
38
+ `${peekHeight}px`,
39
+ );
40
+ }
41
+ }, [peekHeight]);
42
42
 
43
- const id = useId();
43
+ const id = useId();
44
44
 
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
- );
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 'classnames';
7
+ import classNames from 'clsx';
8
8
 
9
9
  const StyledContent = withClassName(
10
10
  PopoverPrimitive.Content,
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import { forwardRef, lazy } from 'react';
5
5
 
6
6
  const EditorContent = lazy(() => import('./EditorContent.js'));
@@ -16,7 +16,7 @@ import {
16
16
  forwardRef,
17
17
  useContext,
18
18
  } from 'react';
19
- import classNames from 'classnames';
19
+ import classNames from 'clsx';
20
20
  import { withClassName } from '../../hooks/withClassName.js';
21
21
 
22
22
  export const SelectItem = forwardRef<
@@ -1,5 +1,5 @@
1
1
  import { useState } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
 
4
4
  export const TextSkeleton = ({
5
5
  maxLength,
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes, forwardRef } from 'react';
2
- import classNames from 'classnames';
2
+ import classNames from 'clsx';
3
3
 
4
4
  const CIRCLE_SIZE = 44;
5
5
 
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import classNames from 'classnames';
3
+ import classNames from 'clsx';
4
4
  import useMergedRef from '../../hooks/useMergedRef.js';
5
5
  import {
6
6
  ChangeEvent,
@@ -2,7 +2,7 @@
2
2
 
3
3
  import React, { ComponentPropsWithoutRef } from 'react';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
- import classNames from 'classnames';
5
+ import classNames from 'clsx';
6
6
 
7
7
  function Content({
8
8
  children,
@@ -5,3 +5,5 @@ export * from './useToggle.js';
5
5
  export * from './useVisualViewportOffset.js';
6
6
  export * from './useOnUnmount.js';
7
7
  export * from './withClassName.js';
8
+ export * from './useAnimationFrame.js';
9
+ export * from './useLongPress.js';
@@ -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
+ }