@oxyhq/bloom 0.8.6 → 0.9.0
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/lib/commonjs/avatar-group/AvatarGroup.js +26 -0
- package/lib/commonjs/avatar-group/AvatarGroup.js.map +1 -0
- package/lib/commonjs/avatar-group/AvatarGroup.web.js +116 -0
- package/lib/commonjs/avatar-group/AvatarGroup.web.js.map +1 -0
- package/lib/commonjs/avatar-group/AvatarGroupBase.js +184 -0
- package/lib/commonjs/avatar-group/AvatarGroupBase.js.map +1 -0
- package/lib/commonjs/avatar-group/index.js +13 -0
- package/lib/commonjs/avatar-group/index.js.map +1 -0
- package/lib/commonjs/avatar-group/index.web.js +13 -0
- package/lib/commonjs/avatar-group/index.web.js.map +1 -0
- package/lib/commonjs/avatar-group/types.js +6 -0
- package/lib/commonjs/avatar-group/types.js.map +1 -0
- package/lib/commonjs/index.js +60 -44
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +74 -58
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/user-hover-card/UserHoverCard.js +193 -0
- package/lib/commonjs/user-hover-card/UserHoverCard.js.map +1 -0
- package/lib/commonjs/user-hover-card/index.js +13 -0
- package/lib/commonjs/user-hover-card/index.js.map +1 -0
- package/lib/commonjs/user-hover-card/types.js +6 -0
- package/lib/commonjs/user-hover-card/types.js.map +1 -0
- package/lib/module/avatar-group/AvatarGroup.js +21 -0
- package/lib/module/avatar-group/AvatarGroup.js.map +1 -0
- package/lib/module/avatar-group/AvatarGroup.web.js +111 -0
- package/lib/module/avatar-group/AvatarGroup.web.js.map +1 -0
- package/lib/module/avatar-group/AvatarGroupBase.js +179 -0
- package/lib/module/avatar-group/AvatarGroupBase.js.map +1 -0
- package/lib/module/avatar-group/index.js +4 -0
- package/lib/module/avatar-group/index.js.map +1 -0
- package/lib/module/avatar-group/index.web.js +4 -0
- package/lib/module/avatar-group/index.web.js.map +1 -0
- package/lib/module/avatar-group/types.js +4 -0
- package/lib/module/avatar-group/types.js.map +1 -0
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +2 -0
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/user-hover-card/UserHoverCard.js +188 -0
- package/lib/module/user-hover-card/UserHoverCard.js.map +1 -0
- package/lib/module/user-hover-card/index.js +4 -0
- package/lib/module/user-hover-card/index.js.map +1 -0
- package/lib/module/user-hover-card/types.js +4 -0
- package/lib/module/user-hover-card/types.js.map +1 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroup.d.ts +4 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroup.web.d.ts +4 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroup.web.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroupBase.d.ts +16 -0
- package/lib/typescript/commonjs/avatar-group/AvatarGroupBase.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar-group/index.d.ts +3 -0
- package/lib/typescript/commonjs/avatar-group/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar-group/index.web.d.ts +3 -0
- package/lib/typescript/commonjs/avatar-group/index.web.d.ts.map +1 -0
- package/lib/typescript/commonjs/avatar-group/types.d.ts +63 -0
- package/lib/typescript/commonjs/avatar-group/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +4 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +4 -0
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/user-hover-card/UserHoverCard.d.ts +4 -0
- package/lib/typescript/commonjs/user-hover-card/UserHoverCard.d.ts.map +1 -0
- package/lib/typescript/commonjs/user-hover-card/index.d.ts +3 -0
- package/lib/typescript/commonjs/user-hover-card/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/user-hover-card/types.d.ts +37 -0
- package/lib/typescript/commonjs/user-hover-card/types.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/AvatarGroup.d.ts +4 -0
- package/lib/typescript/module/avatar-group/AvatarGroup.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/AvatarGroup.web.d.ts +4 -0
- package/lib/typescript/module/avatar-group/AvatarGroup.web.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/AvatarGroupBase.d.ts +16 -0
- package/lib/typescript/module/avatar-group/AvatarGroupBase.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/index.d.ts +3 -0
- package/lib/typescript/module/avatar-group/index.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/index.web.d.ts +3 -0
- package/lib/typescript/module/avatar-group/index.web.d.ts.map +1 -0
- package/lib/typescript/module/avatar-group/types.d.ts +63 -0
- package/lib/typescript/module/avatar-group/types.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +4 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +4 -0
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/lib/typescript/module/user-hover-card/UserHoverCard.d.ts +4 -0
- package/lib/typescript/module/user-hover-card/UserHoverCard.d.ts.map +1 -0
- package/lib/typescript/module/user-hover-card/index.d.ts +3 -0
- package/lib/typescript/module/user-hover-card/index.d.ts.map +1 -0
- package/lib/typescript/module/user-hover-card/types.d.ts +37 -0
- package/lib/typescript/module/user-hover-card/types.d.ts.map +1 -0
- package/package.json +30 -1
- package/src/avatar-group/AvatarGroup.stories.tsx +135 -0
- package/src/avatar-group/AvatarGroup.tsx +19 -0
- package/src/avatar-group/AvatarGroup.web.tsx +145 -0
- package/src/avatar-group/AvatarGroupBase.tsx +249 -0
- package/src/avatar-group/index.ts +2 -0
- package/src/avatar-group/index.web.tsx +2 -0
- package/src/avatar-group/types.ts +64 -0
- package/src/index.ts +4 -0
- package/src/index.web.ts +4 -0
- package/src/user-hover-card/UserHoverCard.stories.tsx +113 -0
- package/src/user-hover-card/UserHoverCard.tsx +204 -0
- package/src/user-hover-card/index.ts +2 -0
- package/src/user-hover-card/types.ts +38 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
/**
|
|
4
|
+
* A single member of an {@link AvatarGroup}. Mirrors the minimal shape needed to
|
|
5
|
+
* render an {@link Avatar} plus drive the optional hover card. `uri` is the
|
|
6
|
+
* avatar image URL; `name`/`displayName` feed Avatar's deterministic
|
|
7
|
+
* name-based placeholder when no image resolves.
|
|
8
|
+
*/
|
|
9
|
+
export interface AvatarGroupItem {
|
|
10
|
+
/** Stable identity used as a React key and passed back to handlers. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Avatar image URL (null/undefined → name-based placeholder). */
|
|
13
|
+
uri?: string | null;
|
|
14
|
+
/** Fallback name used for the avatar placeholder when `displayName` is absent. */
|
|
15
|
+
name?: string;
|
|
16
|
+
/** Canonical, already-resolved display name (preferred over `name`). */
|
|
17
|
+
displayName?: string;
|
|
18
|
+
/** Handle without the leading `@`. */
|
|
19
|
+
username?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AvatarGroupProps {
|
|
22
|
+
/** Members to render, in stacking order (first item sits on top). */
|
|
23
|
+
items: AvatarGroupItem[];
|
|
24
|
+
/** Diameter of each avatar in pixels. */
|
|
25
|
+
size?: number;
|
|
26
|
+
/** Maximum number of avatars to render before collapsing into the overflow chip. */
|
|
27
|
+
max?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Real total count of members. When provided and larger than the number of
|
|
30
|
+
* rendered avatars, the overflow chip shows `+ (total - shown)`. When omitted,
|
|
31
|
+
* overflow is derived from `items.length - shown`.
|
|
32
|
+
*/
|
|
33
|
+
total?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Horizontal overlap between adjacent avatars in pixels. Defaults to ~35% of
|
|
36
|
+
* `size`. Larger values pull avatars closer together.
|
|
37
|
+
*/
|
|
38
|
+
overlap?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Color of the ring/border drawn around each avatar so they separate cleanly.
|
|
41
|
+
* Defaults to the theme `card` surface color.
|
|
42
|
+
*/
|
|
43
|
+
ringColor?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Per-avatar press handler. When provided, each avatar (and the overflow chip)
|
|
46
|
+
* becomes pressable. When omitted, the group is purely presentational.
|
|
47
|
+
*/
|
|
48
|
+
onPressItem?: (item: AvatarGroupItem, index: number) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Enables the hover card on web. Hovering an avatar reveals a
|
|
51
|
+
* {@link UserHoverCard} for that item. No-op on native.
|
|
52
|
+
*/
|
|
53
|
+
hoverCard?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Per-item action slot rendered inside the hover card — typically the app's
|
|
56
|
+
* SDK FollowButton. Only used when `hoverCard` is enabled (web).
|
|
57
|
+
*/
|
|
58
|
+
renderItemAction?: (item: AvatarGroupItem, index: number) => ReactNode;
|
|
59
|
+
/** Container style override. */
|
|
60
|
+
style?: StyleProp<ViewStyle>;
|
|
61
|
+
testID?: string;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/avatar-group/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACvE,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -19,6 +19,10 @@ export * from './collapsible';
|
|
|
19
19
|
export { ErrorBoundary } from './error-boundary';
|
|
20
20
|
export type { ErrorBoundaryProps, ErrorBoundaryFallback, ErrorBoundaryFallbackContext, } from './error-boundary';
|
|
21
21
|
export * from './avatar';
|
|
22
|
+
export { AvatarGroup } from './avatar-group';
|
|
23
|
+
export type { AvatarGroupProps, AvatarGroupItem } from './avatar-group';
|
|
24
|
+
export { UserHoverCard } from './user-hover-card';
|
|
25
|
+
export type { UserHoverCardProps, UserHoverCardStat } from './user-hover-card';
|
|
22
26
|
export * from './loading';
|
|
23
27
|
export * as PromptInput from './prompt-input';
|
|
24
28
|
export * from './switch';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,10 @@ export * from './collapsible';
|
|
|
19
19
|
export { ErrorBoundary } from './error-boundary';
|
|
20
20
|
export type { ErrorBoundaryProps, ErrorBoundaryFallback, ErrorBoundaryFallbackContext, } from './error-boundary';
|
|
21
21
|
export * from './avatar';
|
|
22
|
+
export { AvatarGroup } from './avatar-group/index.web';
|
|
23
|
+
export type { AvatarGroupProps, AvatarGroupItem } from './avatar-group/index.web';
|
|
24
|
+
export { UserHoverCard } from './user-hover-card';
|
|
25
|
+
export type { UserHoverCardProps, UserHoverCardStat } from './user-hover-card';
|
|
22
26
|
export * from './loading/index.web';
|
|
23
27
|
export * as PromptInput from './prompt-input';
|
|
24
28
|
export * from './switch';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../src/index.web.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../src/index.web.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserHoverCard.d.ts","sourceRoot":"","sources":["../../../../src/user-hover-card/UserHoverCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAc7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA4LlD,eAAO,MAAM,aAAa,gDAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/user-hover-card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
+
/** A single labeled metric rendered in the {@link UserHoverCardProps.stats} row. */
|
|
4
|
+
export interface UserHoverCardStat {
|
|
5
|
+
/** Human-readable label, e.g. `"Followers"`. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Pre-formatted value, e.g. `"1.2K"` or `42`. */
|
|
8
|
+
value: string | number;
|
|
9
|
+
}
|
|
10
|
+
export interface UserHoverCardProps {
|
|
11
|
+
/**
|
|
12
|
+
* Avatar image source — a URL string, or null/undefined to fall back to the
|
|
13
|
+
* deterministic name-based placeholder rendered by {@link Avatar}.
|
|
14
|
+
*/
|
|
15
|
+
avatar?: string | null;
|
|
16
|
+
/** Canonical, already-resolved display name (an API contract — render directly). */
|
|
17
|
+
displayName: string;
|
|
18
|
+
/** Handle without the leading `@` (the component prefixes it). */
|
|
19
|
+
username?: string;
|
|
20
|
+
/** Optional short biography; truncated to a few lines. */
|
|
21
|
+
bio?: string;
|
|
22
|
+
/** Optional metrics row (e.g. Following / Followers). */
|
|
23
|
+
stats?: UserHoverCardStat[];
|
|
24
|
+
/** Whether to show the verified badge next to the display name. */
|
|
25
|
+
verified?: boolean;
|
|
26
|
+
/** Makes the identity area (avatar + name + handle) pressable. */
|
|
27
|
+
onPressProfile?: () => void;
|
|
28
|
+
/**
|
|
29
|
+
* Slot for a consumer-injected action — typically the app's SDK FollowButton.
|
|
30
|
+
* Bloom does NOT implement follow logic; it only renders the card.
|
|
31
|
+
*/
|
|
32
|
+
action?: ReactNode;
|
|
33
|
+
/** Container style override. */
|
|
34
|
+
style?: StyleProp<ViewStyle>;
|
|
35
|
+
testID?: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/user-hover-card/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/bloom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -170,6 +170,33 @@
|
|
|
170
170
|
"default": "./lib/commonjs/avatar/index.js"
|
|
171
171
|
}
|
|
172
172
|
},
|
|
173
|
+
"./avatar-group": {
|
|
174
|
+
"react-native": "./src/avatar-group/index.ts",
|
|
175
|
+
"browser": {
|
|
176
|
+
"types": "./lib/typescript/module/avatar-group/index.web.d.ts",
|
|
177
|
+
"import": "./lib/module/avatar-group/index.web.js",
|
|
178
|
+
"require": "./lib/commonjs/avatar-group/index.web.js"
|
|
179
|
+
},
|
|
180
|
+
"import": {
|
|
181
|
+
"types": "./lib/typescript/module/avatar-group/index.d.ts",
|
|
182
|
+
"default": "./lib/module/avatar-group/index.js"
|
|
183
|
+
},
|
|
184
|
+
"require": {
|
|
185
|
+
"types": "./lib/typescript/commonjs/avatar-group/index.d.ts",
|
|
186
|
+
"default": "./lib/commonjs/avatar-group/index.js"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"./user-hover-card": {
|
|
190
|
+
"react-native": "./src/user-hover-card/index.ts",
|
|
191
|
+
"import": {
|
|
192
|
+
"types": "./lib/typescript/module/user-hover-card/index.d.ts",
|
|
193
|
+
"default": "./lib/module/user-hover-card/index.js"
|
|
194
|
+
},
|
|
195
|
+
"require": {
|
|
196
|
+
"types": "./lib/typescript/commonjs/user-hover-card/index.d.ts",
|
|
197
|
+
"default": "./lib/commonjs/user-hover-card/index.js"
|
|
198
|
+
}
|
|
199
|
+
},
|
|
173
200
|
"./loading": {
|
|
174
201
|
"react-native": "./src/loading/index.ts",
|
|
175
202
|
"browser": {
|
|
@@ -698,6 +725,8 @@
|
|
|
698
725
|
"button",
|
|
699
726
|
"theme",
|
|
700
727
|
"avatar",
|
|
728
|
+
"avatar-group",
|
|
729
|
+
"user-hover-card",
|
|
701
730
|
"loading",
|
|
702
731
|
"divider",
|
|
703
732
|
"collapsible",
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text, View } from 'react-native';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
4
|
+
|
|
5
|
+
import { AvatarGroup } from './AvatarGroup';
|
|
6
|
+
import type { AvatarGroupItem } from './types';
|
|
7
|
+
|
|
8
|
+
const ITEMS: AvatarGroupItem[] = [
|
|
9
|
+
{ id: '1', displayName: 'Ada Lovelace', username: 'ada' },
|
|
10
|
+
{ id: '2', displayName: 'Grace Hopper', username: 'grace' },
|
|
11
|
+
{ id: '3', displayName: 'Alan Turing', username: 'alan' },
|
|
12
|
+
{ id: '4', displayName: 'Linus Torvalds', username: 'linus' },
|
|
13
|
+
{ id: '5', displayName: 'Margaret Hamilton', username: 'margaret' },
|
|
14
|
+
{ id: '6', displayName: 'Katherine Johnson', username: 'katherine' },
|
|
15
|
+
{ id: '7', displayName: 'Dennis Ritchie', username: 'dennis' },
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
const WITH_PHOTOS: AvatarGroupItem[] = [
|
|
19
|
+
{
|
|
20
|
+
id: '1',
|
|
21
|
+
displayName: 'Nate Isern',
|
|
22
|
+
username: 'nate',
|
|
23
|
+
uri: 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=200&h=200&fit=crop',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: '2',
|
|
27
|
+
displayName: 'Jordan Lee',
|
|
28
|
+
username: 'jordan',
|
|
29
|
+
uri: 'https://images.unsplash.com/photo-1502685104226-ee32379fefbe?w=200&h=200&fit=crop',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: '3',
|
|
33
|
+
displayName: 'Sam Rivera',
|
|
34
|
+
username: 'sam',
|
|
35
|
+
uri: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=200&h=200&fit=crop',
|
|
36
|
+
},
|
|
37
|
+
{ id: '4', displayName: 'Priya Patel', username: 'priya' },
|
|
38
|
+
{ id: '5', displayName: 'Chris Doe', username: 'chris' },
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const meta: Meta<typeof AvatarGroup> = {
|
|
42
|
+
title: 'Components/AvatarGroup',
|
|
43
|
+
component: AvatarGroup,
|
|
44
|
+
argTypes: {
|
|
45
|
+
size: { control: { type: 'number', min: 16, max: 96, step: 4 } },
|
|
46
|
+
max: { control: { type: 'number', min: 1, max: 10, step: 1 } },
|
|
47
|
+
overlap: { control: { type: 'number', min: 0, max: 48, step: 1 } },
|
|
48
|
+
hoverCard: { control: 'boolean' },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export default meta;
|
|
53
|
+
|
|
54
|
+
type Story = StoryObj<typeof AvatarGroup>;
|
|
55
|
+
|
|
56
|
+
/** Header / starter-pack use-case: purely presentational, no interaction. */
|
|
57
|
+
export const Presentational: Story = {
|
|
58
|
+
args: { items: ITEMS, size: 32, max: 5 },
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const WithPhotos: Story = {
|
|
62
|
+
args: { items: WITH_PHOTOS, size: 40, max: 5 },
|
|
63
|
+
name: 'With photos',
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** Overflow chip showing `+N` derived from `total`. */
|
|
67
|
+
export const WithTotal: Story = {
|
|
68
|
+
args: { items: ITEMS, size: 36, max: 4, total: 128 },
|
|
69
|
+
name: 'With explicit total',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** Each avatar is pressable — the consumer navigates to the profile. */
|
|
73
|
+
export const Pressable: Story = {
|
|
74
|
+
render: (args) => (
|
|
75
|
+
<View style={{ gap: 12 }}>
|
|
76
|
+
<AvatarGroup
|
|
77
|
+
{...args}
|
|
78
|
+
items={ITEMS}
|
|
79
|
+
size={40}
|
|
80
|
+
max={5}
|
|
81
|
+
onPressItem={(item) => {
|
|
82
|
+
// eslint-disable-next-line no-alert
|
|
83
|
+
if (typeof window !== 'undefined') window.alert(`@${item.username}`);
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
<Text>Tap an avatar to fire onPressItem.</Text>
|
|
87
|
+
</View>
|
|
88
|
+
),
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** Web-only: hovering an avatar reveals the UserHoverCard. */
|
|
92
|
+
export const HoverCard: Story = {
|
|
93
|
+
render: (args) => (
|
|
94
|
+
<View style={{ gap: 12, minHeight: 240 }}>
|
|
95
|
+
<AvatarGroup
|
|
96
|
+
{...args}
|
|
97
|
+
items={WITH_PHOTOS}
|
|
98
|
+
size={44}
|
|
99
|
+
max={5}
|
|
100
|
+
hoverCard
|
|
101
|
+
onPressItem={(item) => {
|
|
102
|
+
// eslint-disable-next-line no-alert
|
|
103
|
+
if (typeof window !== 'undefined') window.alert(`@${item.username}`);
|
|
104
|
+
}}
|
|
105
|
+
renderItemAction={(item) => (
|
|
106
|
+
<View
|
|
107
|
+
style={{
|
|
108
|
+
paddingHorizontal: 12,
|
|
109
|
+
paddingVertical: 6,
|
|
110
|
+
borderRadius: 999,
|
|
111
|
+
backgroundColor: '#1A73E8',
|
|
112
|
+
}}
|
|
113
|
+
>
|
|
114
|
+
<Text style={{ color: '#fff', fontWeight: '600', fontSize: 13 }}>
|
|
115
|
+
Follow
|
|
116
|
+
</Text>
|
|
117
|
+
</View>
|
|
118
|
+
)}
|
|
119
|
+
/>
|
|
120
|
+
<Text>Hover an avatar (web) to see the card with an injected action.</Text>
|
|
121
|
+
</View>
|
|
122
|
+
),
|
|
123
|
+
name: 'Hover card (web)',
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export const Sizes: Story = {
|
|
127
|
+
render: () => (
|
|
128
|
+
<View style={{ gap: 16 }}>
|
|
129
|
+
<AvatarGroup items={ITEMS} size={24} max={5} />
|
|
130
|
+
<AvatarGroup items={ITEMS} size={32} max={5} />
|
|
131
|
+
<AvatarGroup items={ITEMS} size={48} max={5} />
|
|
132
|
+
<AvatarGroup items={ITEMS} size={64} max={5} />
|
|
133
|
+
</View>
|
|
134
|
+
),
|
|
135
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React, { memo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { AvatarGroupBase } from './AvatarGroupBase';
|
|
4
|
+
import type { AvatarGroupProps } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Native `AvatarGroup` — an overlapping, ringed stack of {@link Avatar}s with a
|
|
8
|
+
* trailing `+N` overflow chip.
|
|
9
|
+
*
|
|
10
|
+
* Hover behavior is web-only; on native the `hoverCard` / `renderItemAction`
|
|
11
|
+
* props are accepted for API parity but intentionally do nothing (no hover on
|
|
12
|
+
* touch devices). The web fork (`AvatarGroup.web.tsx`) wires up the hover card.
|
|
13
|
+
*/
|
|
14
|
+
const AvatarGroupComponent: React.FC<AvatarGroupProps> = (props) => {
|
|
15
|
+
return <AvatarGroupBase {...props} />;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const AvatarGroup = memo(AvatarGroupComponent);
|
|
19
|
+
AvatarGroup.displayName = 'AvatarGroup';
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import React, { memo, useCallback, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Pressable, StyleSheet, View } from 'react-native';
|
|
3
|
+
|
|
4
|
+
import { Portal } from '../portal';
|
|
5
|
+
import { Z_INDEX } from '../styles/z-index';
|
|
6
|
+
import { UserHoverCard } from '../user-hover-card';
|
|
7
|
+
import {
|
|
8
|
+
AvatarGroupBase,
|
|
9
|
+
type AvatarGroupCellHoverHandlers,
|
|
10
|
+
} from './AvatarGroupBase';
|
|
11
|
+
import type { AvatarGroupItem, AvatarGroupProps } from './types';
|
|
12
|
+
|
|
13
|
+
/** Delay before dismissing the card so the cursor can travel into it. */
|
|
14
|
+
const CLOSE_DELAY_MS = 120;
|
|
15
|
+
/** Gap between the anchored avatar and the floating card. */
|
|
16
|
+
const CARD_GAP = 8;
|
|
17
|
+
const CARD_WIDTH = 280;
|
|
18
|
+
|
|
19
|
+
interface HoverState {
|
|
20
|
+
item: AvatarGroupItem;
|
|
21
|
+
index: number;
|
|
22
|
+
top: number;
|
|
23
|
+
left: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getItemName(item: AvatarGroupItem): string {
|
|
27
|
+
return item.displayName ?? item.name ?? item.username ?? '';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Web `AvatarGroup`. Identical stack rendering to native via
|
|
32
|
+
* {@link AvatarGroupBase}, plus an optional hover card: when `hoverCard` is
|
|
33
|
+
* enabled, hovering an avatar reveals a {@link UserHoverCard} positioned beneath
|
|
34
|
+
* it. The card receives the per-item `renderItemAction` slot so the app can drop
|
|
35
|
+
* its SDK FollowButton inside.
|
|
36
|
+
*/
|
|
37
|
+
const AvatarGroupWebComponent: React.FC<AvatarGroupProps> = (props) => {
|
|
38
|
+
const { hoverCard, renderItemAction, onPressItem } = props;
|
|
39
|
+
const [hover, setHover] = useState<HoverState | null>(null);
|
|
40
|
+
const cellRefs = useRef<Map<number, View>>(new Map());
|
|
41
|
+
const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
42
|
+
|
|
43
|
+
const cancelClose = useCallback(() => {
|
|
44
|
+
if (closeTimer.current) {
|
|
45
|
+
clearTimeout(closeTimer.current);
|
|
46
|
+
closeTimer.current = null;
|
|
47
|
+
}
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
const scheduleClose = useCallback(() => {
|
|
51
|
+
cancelClose();
|
|
52
|
+
closeTimer.current = setTimeout(() => setHover(null), CLOSE_DELAY_MS);
|
|
53
|
+
}, [cancelClose]);
|
|
54
|
+
|
|
55
|
+
const registerCellRef = useCallback((index: number, node: View | null) => {
|
|
56
|
+
if (node) cellRefs.current.set(index, node);
|
|
57
|
+
else cellRefs.current.delete(index);
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
const handleHoverIn = useCallback(
|
|
61
|
+
(item: AvatarGroupItem, index: number) => {
|
|
62
|
+
cancelClose();
|
|
63
|
+
const node = cellRefs.current.get(index);
|
|
64
|
+
if (!node) return;
|
|
65
|
+
node.measureInWindow((x, y, width, height) => {
|
|
66
|
+
// Center the card under the avatar, clamped to the viewport.
|
|
67
|
+
const viewportWidth =
|
|
68
|
+
typeof window !== 'undefined' ? window.innerWidth : CARD_WIDTH;
|
|
69
|
+
let left = x + width / 2 - CARD_WIDTH / 2;
|
|
70
|
+
left = Math.max(
|
|
71
|
+
CARD_GAP,
|
|
72
|
+
Math.min(left, viewportWidth - CARD_WIDTH - CARD_GAP),
|
|
73
|
+
);
|
|
74
|
+
setHover({
|
|
75
|
+
item,
|
|
76
|
+
index,
|
|
77
|
+
top: y + height + CARD_GAP,
|
|
78
|
+
left,
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
[cancelClose],
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const hoverHandlers = useMemo<AvatarGroupCellHoverHandlers | undefined>(() => {
|
|
86
|
+
if (!hoverCard) return undefined;
|
|
87
|
+
return {
|
|
88
|
+
onHoverIn: handleHoverIn,
|
|
89
|
+
onHoverOut: scheduleClose,
|
|
90
|
+
registerCellRef,
|
|
91
|
+
};
|
|
92
|
+
}, [hoverCard, handleHoverIn, scheduleClose, registerCellRef]);
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<>
|
|
96
|
+
<AvatarGroupBase {...props} hoverHandlers={hoverHandlers} />
|
|
97
|
+
{hoverCard && hover && (
|
|
98
|
+
<Portal>
|
|
99
|
+
{/*
|
|
100
|
+
A Pressable hosts the hover-bridge: `onHoverIn`/`onHoverOut` are
|
|
101
|
+
typed in React Native (and map to mouseenter/mouseleave on
|
|
102
|
+
react-native-web), so the card stays open while the cursor is over
|
|
103
|
+
it without any web-only DOM-prop type suppression.
|
|
104
|
+
*/}
|
|
105
|
+
<Pressable
|
|
106
|
+
onHoverIn={cancelClose}
|
|
107
|
+
onHoverOut={scheduleClose}
|
|
108
|
+
accessibilityRole="none"
|
|
109
|
+
pointerEvents="auto"
|
|
110
|
+
style={[
|
|
111
|
+
webStyles.floating,
|
|
112
|
+
{ top: hover.top, left: hover.left, width: CARD_WIDTH },
|
|
113
|
+
]}
|
|
114
|
+
>
|
|
115
|
+
<UserHoverCard
|
|
116
|
+
avatar={hover.item.uri ?? undefined}
|
|
117
|
+
displayName={getItemName(hover.item)}
|
|
118
|
+
username={hover.item.username}
|
|
119
|
+
onPressProfile={
|
|
120
|
+
onPressItem
|
|
121
|
+
? () => onPressItem(hover.item, hover.index)
|
|
122
|
+
: undefined
|
|
123
|
+
}
|
|
124
|
+
action={renderItemAction?.(hover.item, hover.index)}
|
|
125
|
+
style={webStyles.card}
|
|
126
|
+
/>
|
|
127
|
+
</Pressable>
|
|
128
|
+
</Portal>
|
|
129
|
+
)}
|
|
130
|
+
</>
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const webStyles = StyleSheet.create({
|
|
135
|
+
floating: {
|
|
136
|
+
position: 'fixed' as 'absolute',
|
|
137
|
+
zIndex: Z_INDEX.tooltip,
|
|
138
|
+
},
|
|
139
|
+
card: {
|
|
140
|
+
width: CARD_WIDTH,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
export const AvatarGroup = memo(AvatarGroupWebComponent);
|
|
145
|
+
AvatarGroup.displayName = 'AvatarGroup';
|