kang-components 0.9.3 → 0.9.6
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/tile-palette.d.ts +30 -0
- package/dist/tile-palette.d.ts.map +1 -0
- package/dist/tile-palette.js +42 -0
- package/dist/tile-palette.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';
|
|
@@ -31,6 +33,8 @@ export { buildTheme, theme, hexToRgb } from './theme.js';
|
|
|
31
33
|
export type { ThemeType } from './theme.js';
|
|
32
34
|
export { lightPalette, darkPalette } from './palettes.js';
|
|
33
35
|
export type { ModeColorPalette } from './palettes.js';
|
|
36
|
+
export { tilePalette, tileColorIndex, tileColorForKey } from './tile-palette.js';
|
|
37
|
+
export type { TileColor } from './tile-palette.js';
|
|
34
38
|
export type { DynamicLanguage, CharacterPreference, StaticLanguage, } from './language.js';
|
|
35
39
|
export { ListItem, UnorderedListItemContainer } from './list-item.js';
|
|
36
40
|
export type { ListItemProps, ListItemIconName, ListItemActionName, } from './list-item.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,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,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":"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,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,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,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,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,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,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"}
|
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';
|
|
@@ -16,5 +17,6 @@ export { SearchField } from './search-field.js';
|
|
|
16
17
|
export { SearchBar } from './search-bar.js';
|
|
17
18
|
export { buildTheme, theme, hexToRgb } from './theme.js';
|
|
18
19
|
export { lightPalette, darkPalette } from './palettes.js';
|
|
20
|
+
export { tilePalette, tileColorIndex, tileColorForKey } from './tile-palette.js';
|
|
19
21
|
export { ListItem, UnorderedListItemContainer } from './list-item.js';
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
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,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;
|
|
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;AAG1D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASjF,OAAO,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Word-tile palette — the airy pastel fills used behind tappable word tiles,
|
|
3
|
+
* flashcards, browse-grid cells and celebratory confetti.
|
|
4
|
+
*
|
|
5
|
+
* These eight pastels are **mode-independent**: they read on both light and
|
|
6
|
+
* dark surfaces and always pair with near-black text, so they live here as a
|
|
7
|
+
* standalone constant rather than inside `ModeColorPalette` (which is per-mode).
|
|
8
|
+
*
|
|
9
|
+
* This is the single source of truth. It was previously copy-pasted across six
|
|
10
|
+
* xunzi surfaces; consumers should import `tilePalette` / `tileColorForKey`
|
|
11
|
+
* instead of redeclaring the hex values or the hashing logic. An app that needs
|
|
12
|
+
* a different look should compose an explicit override, not fork the palette.
|
|
13
|
+
*/
|
|
14
|
+
/** A tile fill paired with the text color that stays legible on it. */
|
|
15
|
+
export interface TileColor {
|
|
16
|
+
bg: string;
|
|
17
|
+
text: string;
|
|
18
|
+
}
|
|
19
|
+
/** The eight airy pastels, in stable order (index is part of the contract). */
|
|
20
|
+
export declare const tilePalette: readonly TileColor[];
|
|
21
|
+
/**
|
|
22
|
+
* Deterministic index into {@link tilePalette} for an arbitrary key — the same
|
|
23
|
+
* key always maps to the same color, so a given word keeps its tile color
|
|
24
|
+
* everywhere it appears. Preserves the historical
|
|
25
|
+
* `(hash + charCodeAt) * 31` algorithm the xunzi copies used.
|
|
26
|
+
*/
|
|
27
|
+
export declare function tileColorIndex(key: string): number;
|
|
28
|
+
/** Deterministic tile color for a key (see {@link tileColorIndex}). */
|
|
29
|
+
export declare function tileColorForKey(key: string): TileColor;
|
|
30
|
+
//# sourceMappingURL=tile-palette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tile-palette.d.ts","sourceRoot":"","sources":["../src/tile-palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACb;AAED,+EAA+E;AAC/E,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAS3C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAEtD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Word-tile palette — the airy pastel fills used behind tappable word tiles,
|
|
3
|
+
* flashcards, browse-grid cells and celebratory confetti.
|
|
4
|
+
*
|
|
5
|
+
* These eight pastels are **mode-independent**: they read on both light and
|
|
6
|
+
* dark surfaces and always pair with near-black text, so they live here as a
|
|
7
|
+
* standalone constant rather than inside `ModeColorPalette` (which is per-mode).
|
|
8
|
+
*
|
|
9
|
+
* This is the single source of truth. It was previously copy-pasted across six
|
|
10
|
+
* xunzi surfaces; consumers should import `tilePalette` / `tileColorForKey`
|
|
11
|
+
* instead of redeclaring the hex values or the hashing logic. An app that needs
|
|
12
|
+
* a different look should compose an explicit override, not fork the palette.
|
|
13
|
+
*/
|
|
14
|
+
/** The eight airy pastels, in stable order (index is part of the contract). */
|
|
15
|
+
export const tilePalette = [
|
|
16
|
+
{ bg: '#90CAF9', text: '#1A1A1A' }, // Soft blue
|
|
17
|
+
{ bg: '#A5D6A7', text: '#1A1A1A' }, // Mint
|
|
18
|
+
{ bg: '#CE93D8', text: '#1A1A1A' }, // Lavender
|
|
19
|
+
{ bg: '#FFAB91', text: '#1A1A1A' }, // Peach
|
|
20
|
+
{ bg: '#80DEEA', text: '#1A1A1A' }, // Light teal
|
|
21
|
+
{ bg: '#FFF59D', text: '#1A1A1A' }, // Butter
|
|
22
|
+
{ bg: '#B39DDB', text: '#1A1A1A' }, // Wisteria
|
|
23
|
+
{ bg: '#81D4FA', text: '#1A1A1A' }, // Sky
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Deterministic index into {@link tilePalette} for an arbitrary key — the same
|
|
27
|
+
* key always maps to the same color, so a given word keeps its tile color
|
|
28
|
+
* everywhere it appears. Preserves the historical
|
|
29
|
+
* `(hash + charCodeAt) * 31` algorithm the xunzi copies used.
|
|
30
|
+
*/
|
|
31
|
+
export function tileColorIndex(key) {
|
|
32
|
+
let hash = 0;
|
|
33
|
+
for (let i = 0; i < key.length; i++) {
|
|
34
|
+
hash = (hash + key.charCodeAt(i)) * 31;
|
|
35
|
+
}
|
|
36
|
+
return Math.abs(hash) % tilePalette.length;
|
|
37
|
+
}
|
|
38
|
+
/** Deterministic tile color for a key (see {@link tileColorIndex}). */
|
|
39
|
+
export function tileColorForKey(key) {
|
|
40
|
+
return tilePalette[tileColorIndex(key)];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=tile-palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tile-palette.js","sourceRoot":"","sources":["../src/tile-palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,WAAW,GAAyB;IAChD,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY;IAChD,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO;IAC3C,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW;IAC/C,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,QAAQ;IAC5C,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,aAAa;IACjD,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS;IAC7C,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW;IAC/C,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM;CAC1C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,OAAO,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kang-components",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
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",
|