@heliosgraphics/ui 2.0.0-alpha.95 → 2.0.0-alpha.97
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/components/Alert/Alert.tsx +2 -0
- package/components/Breadcrumb/Breadcrumb.tsx +17 -1
- package/components/Browser/Browser.tsx +2 -0
- package/components/Button/Button.tsx +7 -3
- package/components/ButtonGroup/ButtonGroup.tsx +2 -0
- package/components/Checkbox/Checkbox.tsx +66 -55
- package/components/Clock/Clock.tsx +23 -19
- package/components/Column/Column.tsx +2 -0
- package/components/Confirm/Confirm.tsx +2 -0
- package/components/DatePicker/DatePicker.meta.ts +12 -5
- package/components/DatePicker/DatePicker.module.css +70 -1
- package/components/DatePicker/DatePicker.tsx +116 -4
- package/components/DatePicker/DatePicker.types.ts +6 -1
- package/components/DatePicker/DatePicker.utils.ts +53 -0
- package/components/Debug/Debug.tsx +2 -0
- package/components/Details/Details.tsx +2 -0
- package/components/Dialog/Dialog.module.css +4 -6
- package/components/Dialog/Dialog.tsx +33 -24
- package/components/Donut/Donut.tsx +2 -0
- package/components/Dot/Dot.tsx +2 -0
- package/components/Dropdown/Dropdown.module.css +5 -0
- package/components/Dropdown/Dropdown.tsx +21 -26
- package/components/Fieldset/Fieldset.tsx +2 -0
- package/components/Flex/Flex.meta.ts +1 -0
- package/components/Flex/Flex.tsx +22 -2
- package/components/Flex/Flex.types.ts +1 -0
- package/components/Flex/Flex.utils.spec.ts +4 -1
- package/components/Flex/Flex.utils.ts +4 -1
- package/components/Grid/Grid.tsx +2 -0
- package/components/Heading/Heading.meta.ts +5 -0
- package/components/Heading/Heading.tsx +15 -9
- package/components/Heading/Heading.types.ts +1 -0
- package/components/Heading/components/H0/H0.tsx +2 -0
- package/components/Heading/components/H1/H1.tsx +2 -0
- package/components/Heading/components/H2/H2.tsx +2 -0
- package/components/Heading/components/H3/H3.tsx +2 -0
- package/components/Heading/components/H4/H4.tsx +2 -0
- package/components/Heading/components/H5/H5.tsx +2 -0
- package/components/Heading/components/H6/H6.tsx +2 -0
- package/components/Icon/Icon.tsx +2 -0
- package/components/Input/Input.tsx +103 -95
- package/components/Layout/Layout.tsx +2 -0
- package/components/Layout/components/LayoutAside/LayoutAside.tsx +2 -0
- package/components/Layout/components/LayoutAside/components/LayoutAsideContent/LayoutAsideContent.tsx +2 -0
- package/components/Layout/components/LayoutAside/components/LayoutAsideFooter/LayoutAsideFooter.tsx +2 -0
- package/components/Layout/components/LayoutAside/components/LayoutAsideToggle/LayoutAsideToggle.tsx +2 -0
- package/components/Layout/components/LayoutMain/LayoutMain.tsx +2 -0
- package/components/Layout/components/LayoutMain/components/LayoutMainContent/LayoutMainContent.tsx +2 -0
- package/components/Layout/components/LayoutNavigation/LayoutNavigation.tsx +2 -0
- package/components/Layout/components/LayoutSubNavigation/LayoutSubNavigation.tsx +2 -0
- package/components/Loading/Loading.tsx +2 -0
- package/components/Markdown/Markdown.tsx +2 -0
- package/components/Masonry/Masonry.tsx +5 -1
- package/components/Menu/Menu.tsx +2 -0
- package/components/Menu/components/MenuCategory/MenuCategory.tsx +2 -0
- package/components/Menu/components/MenuFilter/MenuFilter.tsx +2 -0
- package/components/Menu/components/MenuItem/MenuItem.tsx +2 -0
- package/components/Overlay/Overlay.tsx +18 -2
- package/components/Pie/Pie.tsx +2 -0
- package/components/Pill/Pill.meta.ts +9 -1
- package/components/Pill/Pill.module.css +11 -0
- package/components/Pill/Pill.tsx +28 -3
- package/components/Pill/Pill.types.ts +2 -0
- package/components/Placeholder/Placeholder.tsx +2 -0
- package/components/Progress/Progress.tsx +2 -0
- package/components/Radio/Radio.tsx +2 -0
- package/components/Range/Range.tsx +2 -0
- package/components/Segments/Segments.context.ts +19 -0
- package/components/Segments/Segments.meta.ts +4 -0
- package/components/Segments/Segments.tsx +34 -42
- package/components/Segments/Segments.types.ts +1 -0
- package/components/Segments/components/SegmentButton/SegmentButton.meta.ts +0 -4
- package/components/Segments/components/SegmentButton/SegmentButton.tsx +28 -3
- package/components/Segments/components/SegmentButton/SegmentButton.types.ts +0 -2
- package/components/Select/Select.tsx +40 -43
- package/components/Separator/Separator.tsx +2 -0
- package/components/Separator/components/HRMarkup/HRMarkup.tsx +2 -0
- package/components/Separator/components/HorizontalSeparator/HorizontalSeparator.tsx +2 -0
- package/components/Separator/components/VerticalSeparator/VerticalSeparator.tsx +2 -0
- package/components/Setup/Setup.tsx +3 -0
- package/components/Shimmer/Shimmer.tsx +2 -0
- package/components/Slider/Slider.tsx +2 -0
- package/components/Spacer/Spacer.tsx +2 -0
- package/components/Table/Table.tsx +2 -0
- package/components/Tabs/Tabs.meta.ts +12 -12
- package/components/Tabs/Tabs.module.css +25 -9
- package/components/Tabs/Tabs.tsx +49 -53
- package/components/Tabs/Tabs.types.ts +10 -3
- package/components/Text/Text.tsx +2 -0
- package/components/Text/components/Div/Div.tsx +2 -0
- package/components/Text/components/Micro/Micro.tsx +2 -0
- package/components/Text/components/P/P.tsx +2 -0
- package/components/Text/components/Small/Small.tsx +2 -0
- package/components/Text/components/Tiny/Tiny.tsx +2 -0
- package/components/Textarea/Textarea.tsx +14 -13
- package/components/Tile/Tile.tsx +2 -0
- package/components/Timestamp/Timestamp.tsx +2 -0
- package/components/Toggle/Toggle.tsx +2 -0
- package/components/Tooltip/Tooltip.tsx +17 -9
- package/components/Tooltip/Tooltip.types.ts +0 -1
- package/components/Tooltip/components/TooltipContent/TooltipContent.tsx +2 -0
- package/components/Tooltip/components/TooltipTrigger/TooltipTrigger.tsx +4 -2
- package/components/shared/InputLabel/InputLabel.tsx +2 -0
- package/components/shared/ResultList/ResultList.tsx +6 -4
- package/contexts/LayoutContext/LayoutContext.tsx +15 -34
- package/contexts/LayoutContext/LayoutContext.types.ts +0 -1
- package/hooks/useLayoutContext.tsx +0 -1
- package/hooks/useResizeObserver.tsx +2 -2
- package/index.ts +5 -0
- package/package.json +1 -1
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
import { getClasses } from "@heliosgraphics/utils"
|
|
4
4
|
import { Text } from "../Text"
|
|
5
|
-
import { useId, useRef, useEffect } from "react"
|
|
5
|
+
import { useId, useRef, useEffect, useImperativeHandle, forwardRef } from "react"
|
|
6
6
|
import { InputLabel } from "../shared/InputLabel"
|
|
7
7
|
import styles from "./Textarea.module.css"
|
|
8
|
-
import type { FC } from "react"
|
|
9
8
|
import type { TextareaProps } from "./Textarea.types"
|
|
10
9
|
|
|
11
|
-
export const Textarea
|
|
12
|
-
const
|
|
10
|
+
export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>((props, ref) => {
|
|
11
|
+
const internalRef = useRef<HTMLTextAreaElement | null>(null)
|
|
13
12
|
const { autoComplete: _autoComplete, helperText: _helperText, isDisabled, isLabelHidden, ...goodProps } = props
|
|
14
13
|
|
|
14
|
+
useImperativeHandle(ref, () => internalRef.current as HTMLTextAreaElement)
|
|
15
|
+
|
|
15
16
|
const htmlFor: string = useId()
|
|
16
17
|
const helperId: string = `${htmlFor}-helper`
|
|
17
18
|
const textareaClasses: string = getClasses(styles.textarea, "flex flex-column", {
|
|
@@ -19,16 +20,14 @@ export const Textarea: FC<TextareaProps> = (props) => {
|
|
|
19
20
|
})
|
|
20
21
|
|
|
21
22
|
const onInput = (): void => {
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
if (!internalRef.current) return
|
|
24
|
+
|
|
25
|
+
internalRef.current.style.height = "auto"
|
|
26
|
+
internalRef.current.style.height = internalRef.current.scrollHeight + "px"
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
useEffect(() => {
|
|
29
|
-
|
|
30
|
-
onInput()
|
|
31
|
-
}
|
|
30
|
+
onInput()
|
|
32
31
|
|
|
33
32
|
const timer: ReturnType<typeof setTimeout> = setTimeout(() => onInput(), 100)
|
|
34
33
|
|
|
@@ -49,7 +48,7 @@ export const Textarea: FC<TextareaProps> = (props) => {
|
|
|
49
48
|
)}
|
|
50
49
|
<textarea
|
|
51
50
|
{...goodProps}
|
|
52
|
-
ref={
|
|
51
|
+
ref={internalRef}
|
|
53
52
|
id={htmlFor}
|
|
54
53
|
rows={goodProps.rows ?? 4}
|
|
55
54
|
onInput={onInput}
|
|
@@ -64,4 +63,6 @@ export const Textarea: FC<TextareaProps> = (props) => {
|
|
|
64
63
|
)}
|
|
65
64
|
</div>
|
|
66
65
|
)
|
|
67
|
-
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
Textarea.displayName = "Textarea"
|
package/components/Tile/Tile.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
|
|
3
|
-
import { useRef, useEffect, useMemo,
|
|
3
|
+
import { useRef, useEffect, useMemo, useId, type FC } from "react"
|
|
4
4
|
import { getClasses } from "@heliosgraphics/utils"
|
|
5
5
|
import styles from "./Tooltip.module.css"
|
|
6
6
|
import type { TooltipProps, TooltipComposition, TooltipContextType } from "./Tooltip.types"
|
|
@@ -20,7 +20,6 @@ const POSITION_CLASS_MAP = {
|
|
|
20
20
|
} as const satisfies Record<NonNullable<TooltipProps["position"]>, string | undefined>
|
|
21
21
|
|
|
22
22
|
const TooltipComponent: FC<TooltipProps> = ({ children = null, position = "bottom-center", isVisible = false }) => {
|
|
23
|
-
const [isOpen, setIsOpen] = useState<boolean>(isVisible)
|
|
24
23
|
const triggerRef = useRef<HTMLDivElement | null>(null)
|
|
25
24
|
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
26
25
|
const id: string = useId()
|
|
@@ -45,27 +44,35 @@ const TooltipComponent: FC<TooltipProps> = ({ children = null, position = "botto
|
|
|
45
44
|
return
|
|
46
45
|
}
|
|
47
46
|
|
|
47
|
+
const setAriaDescribedBy = (isOpen: boolean): void => {
|
|
48
|
+
if (isOpen) {
|
|
49
|
+
trigger.setAttribute("aria-describedby", tooltipId)
|
|
50
|
+
} else {
|
|
51
|
+
trigger.removeAttribute("aria-describedby")
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
48
55
|
if (isVisible) {
|
|
49
56
|
popover.showPopover()
|
|
50
|
-
|
|
57
|
+
setAriaDescribedBy(true)
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
const handleMouseEnter = (): void => {
|
|
54
61
|
popover.showPopover()
|
|
55
|
-
|
|
62
|
+
setAriaDescribedBy(true)
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
const handleMouseLeave = (): void => {
|
|
59
66
|
if (!isVisible) {
|
|
60
67
|
popover.hidePopover()
|
|
61
|
-
|
|
68
|
+
setAriaDescribedBy(false)
|
|
62
69
|
}
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
const handleKeyDown = (event: KeyboardEvent): void => {
|
|
66
73
|
if (event.key === "Escape") {
|
|
67
74
|
popover.hidePopover()
|
|
68
|
-
|
|
75
|
+
setAriaDescribedBy(false)
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
|
|
@@ -78,7 +85,7 @@ const TooltipComponent: FC<TooltipProps> = ({ children = null, position = "botto
|
|
|
78
85
|
trigger.removeEventListener("mouseleave", handleMouseLeave)
|
|
79
86
|
trigger.removeEventListener("keydown", handleKeyDown)
|
|
80
87
|
}
|
|
81
|
-
}, [isVisible])
|
|
88
|
+
}, [isVisible, tooltipId])
|
|
82
89
|
|
|
83
90
|
const contextValue: TooltipContextType = useMemo(
|
|
84
91
|
() => ({
|
|
@@ -87,9 +94,8 @@ const TooltipComponent: FC<TooltipProps> = ({ children = null, position = "botto
|
|
|
87
94
|
tooltipClasses,
|
|
88
95
|
anchorName,
|
|
89
96
|
tooltipId,
|
|
90
|
-
isOpen,
|
|
91
97
|
}),
|
|
92
|
-
[tooltipClasses, anchorName, tooltipId
|
|
98
|
+
[tooltipClasses, anchorName, tooltipId],
|
|
93
99
|
)
|
|
94
100
|
|
|
95
101
|
return (
|
|
@@ -105,3 +111,5 @@ export const Tooltip: FC<TooltipProps> & TooltipComposition = Object.assign(Tool
|
|
|
105
111
|
Trigger: TooltipTrigger,
|
|
106
112
|
Content: TooltipContent,
|
|
107
113
|
})
|
|
114
|
+
|
|
115
|
+
Tooltip.displayName = "Tooltip"
|
|
@@ -5,13 +5,15 @@ import { useTooltipContext } from "../../Tooltip.utils"
|
|
|
5
5
|
import type { CSSProperties, FC } from "react"
|
|
6
6
|
|
|
7
7
|
export const TooltipTrigger: FC<TooltipTriggerProps> = ({ children }) => {
|
|
8
|
-
const { triggerRef, anchorName
|
|
8
|
+
const { triggerRef, anchorName } = useTooltipContext()
|
|
9
9
|
|
|
10
10
|
const triggerStyle: CSSProperties = { anchorName } as CSSProperties
|
|
11
11
|
|
|
12
12
|
return (
|
|
13
|
-
<div ref={triggerRef} style={triggerStyle}
|
|
13
|
+
<div ref={triggerRef} style={triggerStyle}>
|
|
14
14
|
{children}
|
|
15
15
|
</div>
|
|
16
16
|
)
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
TooltipTrigger.displayName = "TooltipTrigger"
|
|
@@ -4,7 +4,7 @@ import { Flex } from "../../Flex"
|
|
|
4
4
|
import { Icon } from "../../Icon"
|
|
5
5
|
import { Text } from "../../Text"
|
|
6
6
|
import styles from "./ResultList.module.css"
|
|
7
|
-
import type {
|
|
7
|
+
import type { ChangeEventHandler, FC } from "react"
|
|
8
8
|
import type { ResultListProps } from "./ResultList.types"
|
|
9
9
|
|
|
10
10
|
export const ResultList: FC<ResultListProps> = ({ items, isHidden, ref }) => {
|
|
@@ -24,9 +24,9 @@ export const ResultList: FC<ResultListProps> = ({ items, isHidden, ref }) => {
|
|
|
24
24
|
if (item.type === "separator") return <li key={itemKey} className={styles.resultList__separator} />
|
|
25
25
|
|
|
26
26
|
if (item.type === "checkbox") {
|
|
27
|
-
const onCheck
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const onCheck: ChangeEventHandler<HTMLInputElement> = (): void => {
|
|
28
|
+
item.onClick?.({} as React.MouseEvent)
|
|
29
|
+
}
|
|
30
30
|
|
|
31
31
|
return (
|
|
32
32
|
<li key={itemKey} onClick={item.onClick} className={itemClasses}>
|
|
@@ -63,3 +63,5 @@ export const ResultList: FC<ResultListProps> = ({ items, isHidden, ref }) => {
|
|
|
63
63
|
</ol>
|
|
64
64
|
)
|
|
65
65
|
}
|
|
66
|
+
|
|
67
|
+
ResultList.displayName = "ResultList"
|
|
@@ -15,44 +15,37 @@ type LayoutProviderProps = PropsWithChildren<LayoutProviderBaseProps>
|
|
|
15
15
|
|
|
16
16
|
const LayoutProvider: FC<LayoutProviderProps> = ({ children, breakpoint = 960 }) => {
|
|
17
17
|
const [isMenuVisible, setIsMenuVisible] = useState<boolean>(false)
|
|
18
|
-
const [
|
|
18
|
+
const [isWideEnough, setIsWideEnough] = useState<boolean>(false)
|
|
19
19
|
const [hasMounted, setHasMounted] = useState<boolean>(false)
|
|
20
20
|
const asideRef = useRef<HTMLElement | null>(null)
|
|
21
21
|
const isMenuVisibleRef = useRef<boolean>(false)
|
|
22
|
-
const windowWidthRef = useRef<number>(0)
|
|
23
|
-
const resizeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
24
22
|
|
|
25
23
|
useEffect(() => {
|
|
26
24
|
isMenuVisibleRef.current = isMenuVisible
|
|
27
25
|
}, [isMenuVisible])
|
|
28
26
|
|
|
29
27
|
useEffect(() => {
|
|
30
|
-
const initialWidth = globalThis.innerWidth
|
|
31
|
-
|
|
32
28
|
setHasMounted(true)
|
|
33
|
-
setWindowWidth(initialWidth)
|
|
34
|
-
windowWidthRef.current = initialWidth
|
|
35
|
-
|
|
36
|
-
const initialMenuVisible = initialWidth >= breakpoint
|
|
37
29
|
|
|
38
|
-
|
|
39
|
-
isMenuVisibleRef.current = initialMenuVisible
|
|
30
|
+
const mql = globalThis.matchMedia(`(min-width: ${breakpoint}px)`)
|
|
40
31
|
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const wasWideEnough: boolean = windowWidthRef.current >= breakpoint
|
|
44
|
-
const isNowWideEnough: boolean = newWidth >= breakpoint
|
|
32
|
+
const handleChange = (event: MediaQueryListEvent | MediaQueryList): void => {
|
|
33
|
+
const matches = event.matches
|
|
45
34
|
|
|
46
|
-
|
|
47
|
-
windowWidthRef.current = newWidth
|
|
35
|
+
setIsWideEnough(matches)
|
|
48
36
|
|
|
49
|
-
if (
|
|
37
|
+
if (matches) {
|
|
50
38
|
setIsMenuVisible(true)
|
|
51
|
-
} else
|
|
39
|
+
} else {
|
|
52
40
|
setIsMenuVisible(false)
|
|
53
41
|
}
|
|
54
42
|
}
|
|
55
43
|
|
|
44
|
+
// Set initial state
|
|
45
|
+
handleChange(mql)
|
|
46
|
+
|
|
47
|
+
mql.addEventListener("change", handleChange)
|
|
48
|
+
|
|
56
49
|
const handleClickOutside = (event: MouseEvent): void => {
|
|
57
50
|
if (asideRef?.current?.contains(event.target as Node)) return
|
|
58
51
|
|
|
@@ -60,7 +53,7 @@ const LayoutProvider: FC<LayoutProviderProps> = ({ children, breakpoint = 960 })
|
|
|
60
53
|
const shouldIgnore: Element | null = clickedElement?.closest(`[${IGNORE_DATA_ATTRIBUTE}]`)
|
|
61
54
|
|
|
62
55
|
if (!shouldIgnore) {
|
|
63
|
-
const currentIsWideEnough: boolean =
|
|
56
|
+
const currentIsWideEnough: boolean = mql.matches
|
|
64
57
|
|
|
65
58
|
if (!currentIsWideEnough && isMenuVisibleRef.current) {
|
|
66
59
|
setIsMenuVisible(false)
|
|
@@ -68,25 +61,14 @@ const LayoutProvider: FC<LayoutProviderProps> = ({ children, breakpoint = 960 })
|
|
|
68
61
|
}
|
|
69
62
|
}
|
|
70
63
|
|
|
71
|
-
const throttledResize = (): void => {
|
|
72
|
-
if (resizeTimerRef.current) return
|
|
73
|
-
resizeTimerRef.current = setTimeout(() => {
|
|
74
|
-
handleResize()
|
|
75
|
-
resizeTimerRef.current = null
|
|
76
|
-
}, 150)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
globalThis.addEventListener("resize", throttledResize)
|
|
80
64
|
globalThis.document.addEventListener("mousedown", handleClickOutside)
|
|
81
65
|
|
|
82
66
|
return (): void => {
|
|
83
|
-
|
|
84
|
-
globalThis.removeEventListener("resize", throttledResize)
|
|
67
|
+
mql.removeEventListener("change", handleChange)
|
|
85
68
|
globalThis.document.removeEventListener("mousedown", handleClickOutside)
|
|
86
69
|
}
|
|
87
70
|
}, [breakpoint])
|
|
88
71
|
|
|
89
|
-
const isWideEnough: boolean = hasMounted ? windowWidth >= breakpoint : false
|
|
90
72
|
const shouldShowNavigation: boolean = isWideEnough || isMenuVisible
|
|
91
73
|
|
|
92
74
|
const onNavigationToggle = useCallback((): void => setIsMenuVisible((prev) => !prev), [])
|
|
@@ -101,9 +83,8 @@ const LayoutProvider: FC<LayoutProviderProps> = ({ children, breakpoint = 960 })
|
|
|
101
83
|
onAsideClose,
|
|
102
84
|
onNavigationToggle,
|
|
103
85
|
shouldShowNavigation,
|
|
104
|
-
windowWidth,
|
|
105
86
|
}),
|
|
106
|
-
[hasMounted, isMenuVisible, isWideEnough, shouldShowNavigation, onAsideClose, onNavigationToggle
|
|
87
|
+
[hasMounted, isMenuVisible, isWideEnough, shouldShowNavigation, onAsideClose, onNavigationToggle],
|
|
107
88
|
)
|
|
108
89
|
|
|
109
90
|
return <LayoutContext.Provider value={contextValue}>{children}</LayoutContext.Provider>
|
|
@@ -20,8 +20,8 @@ export const useResizeObserver = (): readonly [(element: HTMLDivElement | null)
|
|
|
20
20
|
if (element) {
|
|
21
21
|
resizeObserverRef.current = new ResizeObserver((entries) => {
|
|
22
22
|
if (entries[0]) {
|
|
23
|
-
const
|
|
24
|
-
setWidth(
|
|
23
|
+
const entryWidth = entries[0].contentRect.width
|
|
24
|
+
setWidth(entryWidth)
|
|
25
25
|
}
|
|
26
26
|
})
|
|
27
27
|
|
package/index.ts
CHANGED
|
@@ -65,10 +65,15 @@ export type { ResultItem } from "./components/shared/ResultList"
|
|
|
65
65
|
export type { SelectItem } from "./components/Select"
|
|
66
66
|
export type { TextBaseProps, TextProps } from "./components/Text"
|
|
67
67
|
|
|
68
|
+
export { useChatScroll } from "./hooks/useChatScroll"
|
|
69
|
+
export { useDebounce } from "./hooks/useDebounce"
|
|
68
70
|
export { useIntersection } from "./hooks/useIntersection"
|
|
71
|
+
export { useInterval } from "./hooks/useInterval"
|
|
72
|
+
export { useKeyPress } from "./hooks/useKeyPress"
|
|
69
73
|
export { useLayoutContext } from "./hooks/useLayoutContext"
|
|
70
74
|
export { usePrevious } from "./hooks/usePrevious"
|
|
71
75
|
export { usePrint } from "./hooks/usePrint"
|
|
76
|
+
export { useResizeObserver } from "./hooks/useResizeObserver"
|
|
72
77
|
export { useTheme } from "./hooks/useTheme"
|
|
73
78
|
|
|
74
79
|
export type { HeliosAppearanceType, HeliosColorType } from "./types/colors"
|