kang-components 0.9.2 → 0.9.5
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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/search-bar.d.ts +33 -0
- package/dist/search-bar.d.ts.map +1 -0
- package/dist/search-bar.js +65 -0
- package/dist/search-bar.js.map +1 -0
- package/dist/use-hide-on-scroll.d.ts +39 -0
- package/dist/use-hide-on-scroll.d.ts.map +1 -0
- package/dist/use-hide-on-scroll.js +96 -0
- package/dist/use-hide-on-scroll.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export { BOUNCE_CURVE, PRESS_SCALE_PRIMARY, PRESS_SCALE_SUBTLE, pressPrimary, pr
|
|
|
2
2
|
export { useAnimatedAction } from './use-animated-action.js';
|
|
3
3
|
export { useViewportSize } from './use-viewport-size.js';
|
|
4
4
|
export type { ViewportSize } from './use-viewport-size.js';
|
|
5
|
+
export { useHideOnScroll } from './use-hide-on-scroll.js';
|
|
6
|
+
export type { UseHideOnScrollOptions } from './use-hide-on-scroll.js';
|
|
5
7
|
export { actionSheetContainer, actionSheetList, actionSheetRow, } from './action-sheet.js';
|
|
6
8
|
export { Ripple, rippleAnimation, useRipple } from './ripple.js';
|
|
7
9
|
export type { RippleState } from './ripple.js';
|
|
@@ -25,6 +27,8 @@ export { BottomSheet } from './bottom-sheet.js';
|
|
|
25
27
|
export type { BottomSheetProps } from './bottom-sheet.js';
|
|
26
28
|
export { SearchField } from './search-field.js';
|
|
27
29
|
export type { SearchFieldProps } from './search-field.js';
|
|
30
|
+
export { SearchBar } from './search-bar.js';
|
|
31
|
+
export type { SearchBarProps } from './search-bar.js';
|
|
28
32
|
export { buildTheme, theme, hexToRgb } from './theme.js';
|
|
29
33
|
export type { ThemeType } from './theme.js';
|
|
30
34
|
export { lightPalette, darkPalette } from './palettes.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,cAAc,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACN,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,YAAY,EACX,eAAe,EACf,mBAAmB,EACnB,cAAc,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { BOUNCE_CURVE, PRESS_SCALE_PRIMARY, PRESS_SCALE_SUBTLE, pressPrimary, pressSubtle, pressPrimaryScale, pressSubtleScale, } from './press.js';
|
|
2
2
|
export { useAnimatedAction } from './use-animated-action.js';
|
|
3
3
|
export { useViewportSize } from './use-viewport-size.js';
|
|
4
|
+
export { useHideOnScroll } from './use-hide-on-scroll.js';
|
|
4
5
|
export { actionSheetContainer, actionSheetList, actionSheetRow, } from './action-sheet.js';
|
|
5
6
|
export { Ripple, rippleAnimation, useRipple } from './ripple.js';
|
|
6
7
|
export { SPRING_COMFORTABLE, SPRING_COMFORTABLE_SLOW, SPRING_SNAPPY, SPRING_RESPONSIVE, SPRING_STAGGERED, SPRING_INSTANT, SPRING_GENTLE, SPRING_VERY_SLOW, SPRING_LANDING, SPRING_RISING, } from './spring.js';
|
|
@@ -13,6 +14,7 @@ export { default as ToggleSwitch } from './toggle-switch.js';
|
|
|
13
14
|
export { ConfirmDialog } from './confirm-dialog.js';
|
|
14
15
|
export { BottomSheet } from './bottom-sheet.js';
|
|
15
16
|
export { SearchField } from './search-field.js';
|
|
17
|
+
export { SearchBar } from './search-bar.js';
|
|
16
18
|
export { buildTheme, theme, hexToRgb } from './theme.js';
|
|
17
19
|
export { lightPalette, darkPalette } from './palettes.js';
|
|
18
20
|
export { ListItem, UnorderedListItemContainer } from './list-item.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,cAAc,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,EACN,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS1D,OAAO,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,cAAc,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,EACN,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,GACb,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS1D,OAAO,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchBar — a *composite*: a back button + the expanding {@link SearchField} +
|
|
3
|
+
* a slide-in reveal, wired together with their animation as one unit. This is
|
|
4
|
+
* the next tier above kang's primitives — a group of components that must work
|
|
5
|
+
* together — so apps (xunzi's native search, the Hua Wen Reader add-on) mount
|
|
6
|
+
* the same animated search bar rather than re-implementing it.
|
|
7
|
+
*
|
|
8
|
+
* Presentational + domain-free: the host controls `active` (drives the reveal),
|
|
9
|
+
* owns the `value`/`onChange`, and supplies an optional `onBack`. Positioning
|
|
10
|
+
* (e.g. over a shell/backstage) and any decoration (titles, watermarks) stay
|
|
11
|
+
* with the host, which can wrap this or pass a `title` slot.
|
|
12
|
+
*
|
|
13
|
+
* Composes kang's own `BackButton` + `SearchField`; `styled-components`, `react`
|
|
14
|
+
* and `@react-spring/web` are the only things it pulls in.
|
|
15
|
+
*/
|
|
16
|
+
import { type ReactElement, type ReactNode } from 'react';
|
|
17
|
+
export interface SearchBarProps {
|
|
18
|
+
/** Drives the slide-in/out reveal (and whether the field is interactive). */
|
|
19
|
+
active: boolean;
|
|
20
|
+
value: string;
|
|
21
|
+
onChange: (value: string) => void;
|
|
22
|
+
/** Optional back/close button rendered before the field. */
|
|
23
|
+
onBack?: () => void;
|
|
24
|
+
backAriaLabel?: string;
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
ariaLabel?: string;
|
|
27
|
+
/** Optional leading title/label rendered above the field row. */
|
|
28
|
+
title?: ReactNode;
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function SearchBar({ active, value, onChange, onBack, backAriaLabel, placeholder, ariaLabel, title, className, }: SearchBarProps): ReactElement;
|
|
32
|
+
export default SearchBar;
|
|
33
|
+
//# sourceMappingURL=search-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-bar.d.ts","sourceRoot":"","sources":["../src/search-bar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMrE,MAAM,WAAW,cAAc;IAC9B,6EAA6E;IAC7E,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAqBD,wBAAgB,SAAS,CAAC,EACzB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,aAAsB,EACtB,WAAW,EACX,SAAS,EACT,KAAK,EACL,SAAS,GACT,EAAE,cAAc,GAAG,YAAY,CA+C/B;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SearchBar — a *composite*: a back button + the expanding {@link SearchField} +
|
|
4
|
+
* a slide-in reveal, wired together with their animation as one unit. This is
|
|
5
|
+
* the next tier above kang's primitives — a group of components that must work
|
|
6
|
+
* together — so apps (xunzi's native search, the Hua Wen Reader add-on) mount
|
|
7
|
+
* the same animated search bar rather than re-implementing it.
|
|
8
|
+
*
|
|
9
|
+
* Presentational + domain-free: the host controls `active` (drives the reveal),
|
|
10
|
+
* owns the `value`/`onChange`, and supplies an optional `onBack`. Positioning
|
|
11
|
+
* (e.g. over a shell/backstage) and any decoration (titles, watermarks) stay
|
|
12
|
+
* with the host, which can wrap this or pass a `title` slot.
|
|
13
|
+
*
|
|
14
|
+
* Composes kang's own `BackButton` + `SearchField`; `styled-components`, `react`
|
|
15
|
+
* and `@react-spring/web` are the only things it pulls in.
|
|
16
|
+
*/
|
|
17
|
+
import { useEffect } from 'react';
|
|
18
|
+
import { styled } from 'styled-components';
|
|
19
|
+
import { animated, useSpring } from '@react-spring/web';
|
|
20
|
+
import BackButton from './back-button.js';
|
|
21
|
+
import { SearchField } from './search-field.js';
|
|
22
|
+
const Reveal = styled(animated.div) `
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
gap: 0.5rem;
|
|
26
|
+
will-change: transform, opacity;
|
|
27
|
+
`;
|
|
28
|
+
const Row = styled.div `
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
gap: 0.5rem;
|
|
32
|
+
`;
|
|
33
|
+
/** Lets the (explicitly-width-animated) SearchField fill the row beside the back button. */
|
|
34
|
+
const FieldWrap = styled.div `
|
|
35
|
+
flex: 1 1 auto;
|
|
36
|
+
min-width: 0;
|
|
37
|
+
`;
|
|
38
|
+
export function SearchBar({ active, value, onChange, onBack, backAriaLabel = 'Back', placeholder, ariaLabel, title, className, }) {
|
|
39
|
+
const [reveal, revealApi] = useSpring(() => ({
|
|
40
|
+
y: -16,
|
|
41
|
+
opacity: 0,
|
|
42
|
+
display: 'none',
|
|
43
|
+
}));
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const config = { tension: 300, friction: 30 };
|
|
46
|
+
if (active) {
|
|
47
|
+
revealApi.start({ y: 0, opacity: 1, display: 'flex', config });
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
revealApi.start({
|
|
51
|
+
y: -16,
|
|
52
|
+
opacity: 0,
|
|
53
|
+
config,
|
|
54
|
+
onRest: () => revealApi.set({ display: 'none' }),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}, [active, revealApi]);
|
|
58
|
+
return (_jsxs(Reveal, { className: className, style: {
|
|
59
|
+
opacity: reveal.opacity,
|
|
60
|
+
display: reveal.display,
|
|
61
|
+
transform: reveal.y.to((v) => `translateY(${v}px)`),
|
|
62
|
+
}, children: [title, _jsxs(Row, { children: [onBack && _jsx(BackButton, { onClick: onBack, ariaLabel: backAriaLabel }), _jsx(FieldWrap, { children: _jsx(SearchField, { value: value, onChange: onChange, placeholder: placeholder, ariaLabel: ariaLabel, autoExpand: active }, active ? 'open' : 'closed') })] })] }));
|
|
63
|
+
}
|
|
64
|
+
export default SearchBar;
|
|
65
|
+
//# sourceMappingURL=search-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-bar.js","sourceRoot":"","sources":["../src/search-bar.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiBhD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;;;;;CAKlC,CAAC;AAEF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;;;;CAIrB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA;;;CAG3B,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EACzB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,aAAa,GAAG,MAAM,EACtB,WAAW,EACX,SAAS,EACT,KAAK,EACL,SAAS,GACO;IAChB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC,EAAE,CAAC,EAAE;QACN,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,MAAyB;KAClC,CAAC,CAAC,CAAC;IAEJ,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACZ,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACP,SAAS,CAAC,KAAK,CAAC;gBACf,CAAC,EAAE,CAAC,EAAE;gBACN,OAAO,EAAE,CAAC;gBACV,MAAM;gBACN,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAChD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAExB,OAAO,CACN,MAAC,MAAM,IACN,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;SACnD,aAEA,KAAK,EACN,MAAC,GAAG,eACF,MAAM,IAAI,KAAC,UAAU,IAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAI,EACpE,KAAC,SAAS,cAET,KAAC,WAAW,IAEX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,IALb,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAM9B,GACS,IACP,IACE,CACT,CAAC;AACH,CAAC;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface UseHideOnScrollOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Minimum downward movement (px) accumulated since the last direction flip
|
|
4
|
+
* before the chrome hides — and the upward movement before it reveals.
|
|
5
|
+
* Filters out jitter so the bar doesn't flicker. Default 8.
|
|
6
|
+
*/
|
|
7
|
+
threshold?: number;
|
|
8
|
+
/**
|
|
9
|
+
* The chrome always stays visible while the scroll position is within this
|
|
10
|
+
* many px of the top, regardless of direction. Default 16.
|
|
11
|
+
*/
|
|
12
|
+
topOffset?: number;
|
|
13
|
+
/**
|
|
14
|
+
* When false, the hook attaches no listener and always reports visible. Use
|
|
15
|
+
* to disable auto-hide on views where the bar should be pinned. Default true.
|
|
16
|
+
*/
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Optional specific scroll source to observe. When omitted the hook listens
|
|
20
|
+
* on `window` in the capture phase, so it catches scroll from any nested
|
|
21
|
+
* overflow container (scroll events don't bubble, but capture still sees them).
|
|
22
|
+
*/
|
|
23
|
+
target?: Window | HTMLElement | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Auto-hiding chrome on scroll: returns `hidden = true` when the user scrolls
|
|
27
|
+
* down (so a floating header / nav bar can slide out of the way) and `false`
|
|
28
|
+
* when they scroll up or return near the top — a common, usability-friendly
|
|
29
|
+
* pattern that keeps content in view while leaving the chrome one flick away.
|
|
30
|
+
*
|
|
31
|
+
* Source-agnostic: by default it observes scroll globally via the capture phase,
|
|
32
|
+
* so a single instance reacts to whichever overflow container the user is
|
|
33
|
+
* scrolling. Changing scroll source (e.g. navigating to another view's list)
|
|
34
|
+
* re-baselines and reveals, so the chrome never gets stuck hidden across views.
|
|
35
|
+
*
|
|
36
|
+
* @returns `true` when the chrome should be hidden, `false` when visible.
|
|
37
|
+
*/
|
|
38
|
+
export declare function useHideOnScroll(options?: UseHideOnScrollOptions): boolean;
|
|
39
|
+
//# sourceMappingURL=use-hide-on-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hide-on-scroll.d.ts","sourceRoot":"","sources":["../src/use-hide-on-scroll.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACtC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;CACrC;AAwCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CA+D7E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
const isDocumentLevel = (t) =>
|
|
3
|
+
// window / document / null aren't Elements; documentElement & body are
|
|
4
|
+
// Elements but represent page scroll, so fold them in too. Page scroll fires
|
|
5
|
+
// on different targets across browsers (document vs window) — this collapses
|
|
6
|
+
// them all to one identity.
|
|
7
|
+
!(t instanceof Element) || t === document.documentElement || t === document.body;
|
|
8
|
+
/**
|
|
9
|
+
* Collapse the various document-level scroll targets (window / document /
|
|
10
|
+
* documentElement / body — browsers differ on which fires) to a single stable
|
|
11
|
+
* identity so source-change detection doesn't false-positive on the page itself.
|
|
12
|
+
*/
|
|
13
|
+
const normalizeSource = (t) => isDocumentLevel(t) ? document : t;
|
|
14
|
+
const scrollTopOf = (target) => {
|
|
15
|
+
if (!isDocumentLevel(target) && typeof target.scrollTop === 'number') {
|
|
16
|
+
return target.scrollTop;
|
|
17
|
+
}
|
|
18
|
+
return window.scrollY ?? window.pageYOffset ?? 0;
|
|
19
|
+
};
|
|
20
|
+
const readScrollTop = (event) => {
|
|
21
|
+
// Transform/virtualized scrollers can't expose scrollTop, so they carry an
|
|
22
|
+
// explicit logical position on the event detail — prefer it when present.
|
|
23
|
+
const detailTop = event.detail?.scrollTop;
|
|
24
|
+
if (typeof detailTop === 'number')
|
|
25
|
+
return detailTop;
|
|
26
|
+
return scrollTopOf(event.target);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Auto-hiding chrome on scroll: returns `hidden = true` when the user scrolls
|
|
30
|
+
* down (so a floating header / nav bar can slide out of the way) and `false`
|
|
31
|
+
* when they scroll up or return near the top — a common, usability-friendly
|
|
32
|
+
* pattern that keeps content in view while leaving the chrome one flick away.
|
|
33
|
+
*
|
|
34
|
+
* Source-agnostic: by default it observes scroll globally via the capture phase,
|
|
35
|
+
* so a single instance reacts to whichever overflow container the user is
|
|
36
|
+
* scrolling. Changing scroll source (e.g. navigating to another view's list)
|
|
37
|
+
* re-baselines and reveals, so the chrome never gets stuck hidden across views.
|
|
38
|
+
*
|
|
39
|
+
* @returns `true` when the chrome should be hidden, `false` when visible.
|
|
40
|
+
*/
|
|
41
|
+
export function useHideOnScroll(options = {}) {
|
|
42
|
+
const { threshold = 8, topOffset = 16, enabled = true, target } = options;
|
|
43
|
+
const [hidden, setHidden] = useState(false);
|
|
44
|
+
const lastYRef = useRef(0);
|
|
45
|
+
const lastSourceRef = useRef(null);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!enabled || typeof window === 'undefined') {
|
|
48
|
+
setHidden(false);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Seed the baseline at the current document scroll so the first gesture is
|
|
52
|
+
// measured rather than swallowed re-baselining a null source.
|
|
53
|
+
lastSourceRef.current = normalizeSource(target ?? null);
|
|
54
|
+
lastYRef.current = scrollTopOf(target ?? null);
|
|
55
|
+
const handleScroll = (event) => {
|
|
56
|
+
const source = normalizeSource(event.target);
|
|
57
|
+
const y = readScrollTop(event);
|
|
58
|
+
// New scroll source (e.g. a freshly-mounted view's list): re-baseline
|
|
59
|
+
// and reveal rather than carrying the previous view's hidden state over.
|
|
60
|
+
if (source !== lastSourceRef.current) {
|
|
61
|
+
lastSourceRef.current = source;
|
|
62
|
+
lastYRef.current = y;
|
|
63
|
+
setHidden(false);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Near the top → always visible (and keep the baseline current).
|
|
67
|
+
if (y <= topOffset) {
|
|
68
|
+
lastYRef.current = y;
|
|
69
|
+
setHidden(false);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const delta = y - lastYRef.current;
|
|
73
|
+
// Only move the baseline on a committed direction change, so slow
|
|
74
|
+
// scrolls accumulate toward the threshold instead of being swallowed.
|
|
75
|
+
if (delta > threshold) {
|
|
76
|
+
lastYRef.current = y;
|
|
77
|
+
setHidden(true);
|
|
78
|
+
}
|
|
79
|
+
else if (delta < -threshold) {
|
|
80
|
+
lastYRef.current = y;
|
|
81
|
+
setHidden(false);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
// Capture phase + window catches scroll from any nested overflow element,
|
|
85
|
+
// since scroll events don't bubble but do traverse the capture path. When a
|
|
86
|
+
// specific target is given, listen directly on it.
|
|
87
|
+
const listenTarget = target ?? window;
|
|
88
|
+
const useCapture = !target;
|
|
89
|
+
listenTarget.addEventListener('scroll', handleScroll, useCapture);
|
|
90
|
+
return () => {
|
|
91
|
+
listenTarget.removeEventListener('scroll', handleScroll, useCapture);
|
|
92
|
+
};
|
|
93
|
+
}, [enabled, threshold, topOffset, target]);
|
|
94
|
+
return hidden;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=use-hide-on-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hide-on-scroll.js","sourceRoot":"","sources":["../src/use-hide-on-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAmCpD,MAAM,eAAe,GAAG,CAAC,CAAqB,EAAW,EAAE;AAC1D,uEAAuE;AACvE,6EAA6E;AAC7E,6EAA6E;AAC7E,4BAA4B;AAC5B,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,eAAe,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC;AAElF;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,CAAqB,EAAe,EAAE,CAC9D,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC;AAEpC,MAAM,WAAW,GAAG,CAAC,MAA0B,EAAU,EAAE;IAC1D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,OAAQ,MAAsB,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACvF,OAAQ,MAAsB,CAAC,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAY,EAAU,EAAE;IAC9C,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,SAAS,GAAI,KAAmC,CAAC,MAAM,EAAE,SAAS,CAAC;IACzE,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkC,EAAE;IACnE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,aAAa,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,OAAO,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/C,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,OAAO;QACR,CAAC;QAED,2EAA2E;QAC3E,8DAA8D;QAC9D,aAAa,CAAC,OAAO,GAAG,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QACxD,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QAE/C,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAE/B,sEAAsE;YACtE,yEAAyE;YACzE,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE,CAAC;gBACtC,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC/B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO;YACR,CAAC;YAED,iEAAiE;YACjE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;gBACpB,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;YACnC,kEAAkE;YAClE,sEAAsE;YACtE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACvB,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACF,CAAC,CAAC;QAEF,0EAA0E;QAC1E,4EAA4E;QAC5E,mDAAmD;QACnD,MAAM,YAAY,GAAyB,MAAM,IAAI,MAAM,CAAC;QAC5D,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC;QAC3B,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QAElE,OAAO,GAAG,EAAE;YACX,YAAY,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACtE,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kang-components",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.5",
|
|
4
4
|
"description": "Generic, domain-free React UI primitives (CSS-first press feedback, delayed-action hook, spring presets, cross-fading text, circle icon button).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|