@oxyhq/bloom 0.22.0 → 0.24.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/content-panel/index.js +12 -6
- package/lib/commonjs/content-panel/index.js.map +1 -1
- package/lib/commonjs/content-panel/index.web.js +31 -21
- package/lib/commonjs/content-panel/index.web.js.map +1 -1
- package/lib/commonjs/content-panel/nesting-context.js +39 -0
- package/lib/commonjs/content-panel/nesting-context.js.map +1 -0
- package/lib/commonjs/index.js +20 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +20 -12
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/link-preview/LinkPreviewCard.js +133 -0
- package/lib/commonjs/link-preview/LinkPreviewCard.js.map +1 -0
- package/lib/commonjs/link-preview/index.js +13 -0
- package/lib/commonjs/link-preview/index.js.map +1 -0
- package/lib/commonjs/link-preview/types.js +6 -0
- package/lib/commonjs/link-preview/types.js.map +1 -0
- package/lib/module/content-panel/index.js +12 -6
- package/lib/module/content-panel/index.js.map +1 -1
- package/lib/module/content-panel/index.web.js +31 -21
- package/lib/module/content-panel/index.web.js.map +1 -1
- package/lib/module/content-panel/nesting-context.js +35 -0
- package/lib/module/content-panel/nesting-context.js.map +1 -0
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +1 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/link-preview/LinkPreviewCard.js +127 -0
- package/lib/module/link-preview/LinkPreviewCard.js.map +1 -0
- package/lib/module/link-preview/index.js +4 -0
- package/lib/module/link-preview/index.js.map +1 -0
- package/lib/module/link-preview/types.js +4 -0
- package/lib/module/link-preview/types.js.map +1 -0
- package/lib/typescript/commonjs/content-panel/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/nesting-context.d.ts +24 -0
- package/lib/typescript/commonjs/content-panel/nesting-context.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +2 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +2 -0
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/link-preview/LinkPreviewCard.d.ts +24 -0
- package/lib/typescript/commonjs/link-preview/LinkPreviewCard.d.ts.map +1 -0
- package/lib/typescript/commonjs/link-preview/index.d.ts +3 -0
- package/lib/typescript/commonjs/link-preview/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/link-preview/types.d.ts +32 -0
- package/lib/typescript/commonjs/link-preview/types.d.ts.map +1 -0
- package/lib/typescript/module/content-panel/index.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/index.web.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/nesting-context.d.ts +24 -0
- package/lib/typescript/module/content-panel/nesting-context.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +2 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +2 -0
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/lib/typescript/module/link-preview/LinkPreviewCard.d.ts +24 -0
- package/lib/typescript/module/link-preview/LinkPreviewCard.d.ts.map +1 -0
- package/lib/typescript/module/link-preview/index.d.ts +3 -0
- package/lib/typescript/module/link-preview/index.d.ts.map +1 -0
- package/lib/typescript/module/link-preview/types.d.ts +32 -0
- package/lib/typescript/module/link-preview/types.d.ts.map +1 -0
- package/package.json +18 -1
- package/src/__tests__/ContentPanelNesting.test.tsx +52 -0
- package/src/__tests__/LinkPreviewCard.test.tsx +60 -0
- package/src/content-panel/index.tsx +18 -8
- package/src/content-panel/index.web.tsx +40 -29
- package/src/content-panel/nesting-context.ts +35 -0
- package/src/index.ts +2 -0
- package/src/index.web.ts +2 -0
- package/src/link-preview/LinkPreviewCard.tsx +156 -0
- package/src/link-preview/index.ts +2 -0
- package/src/link-preview/types.ts +32 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
/**
|
|
3
|
+
* Props for {@link LinkPreviewCard}.
|
|
4
|
+
*
|
|
5
|
+
* Structural by design — Bloom does NOT depend on `@oxyhq/contracts`. The shape
|
|
6
|
+
* mirrors the subset of the Oxy SDK's `LinkPreview` DTO (`@oxyhq/core`
|
|
7
|
+
* `getLinkPreview` / `getLinkPreviews`) that is needed to render a preview, so a
|
|
8
|
+
* consumer can spread an SDK `LinkPreview` straight onto this component.
|
|
9
|
+
*/
|
|
10
|
+
export interface LinkPreviewCardProps {
|
|
11
|
+
/** The previewed URL. Opened via `Linking.openURL` when `onPress` is omitted. */
|
|
12
|
+
url: string;
|
|
13
|
+
/** OpenGraph / page title. Falls back to the URL hostname when absent. */
|
|
14
|
+
title?: string;
|
|
15
|
+
/** OpenGraph / meta description. */
|
|
16
|
+
description?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Absolute cover-image URL (e.g. a `cloud.oxy.so` OG image). Rendered directly
|
|
19
|
+
* with the RN `Image` primitive — NOT through `ImageResolver` / `Avatar`, which
|
|
20
|
+
* are for bare Oxy file IDs.
|
|
21
|
+
*/
|
|
22
|
+
image?: string;
|
|
23
|
+
/** Site / brand name shown above the title. Falls back to the URL hostname. */
|
|
24
|
+
siteName?: string;
|
|
25
|
+
/** Press handler. When omitted, the card opens `url` via `Linking.openURL`. */
|
|
26
|
+
onPress?: () => void;
|
|
27
|
+
/** Extra NativeWind utilities merged onto the card surface. */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Extra style merged onto the card surface. */
|
|
30
|
+
style?: StyleProp<ViewStyle>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/link-preview/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/content-panel/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAe,MAAM,OAAO,CAAC;AACpC,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/content-panel/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAe,MAAM,OAAO,CAAC;AACpC,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAOpE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,wDAAwD;AACxD,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD,eAAO,MAAM,YAAY,+CAA8B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../src/content-panel/index.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAe,MAAM,OAAO,CAAC;AACpC,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../../src/content-panel/index.web.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAe,MAAM,OAAO,CAAC;AACpC,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAQpE,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,6DAA6D;AAC7D,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,4DAA4D;IAC5D,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,qEAAqE;IACrE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgFD,eAAO,MAAM,YAAY,+CAA8B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks whether the current subtree is already inside a `ContentPanel`.
|
|
3
|
+
*
|
|
4
|
+
* Every `ContentPanel` variant (web + native) wraps its rendered tree in
|
|
5
|
+
* `<ContentPanelNestingContext.Provider value={true}>`, so any DESCENDANT
|
|
6
|
+
* `ContentPanel` reads `true` here and can reject the invalid nesting. Context
|
|
7
|
+
* only flows downward, so side-by-side sibling panels each read the default
|
|
8
|
+
* `false` at their own level — siblings are valid, only true parent→child
|
|
9
|
+
* nesting trips the guard.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ContentPanelNestingContext: import("react").Context<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Dev-only invariant: a `ContentPanel` must NEVER be rendered inside another
|
|
14
|
+
* `ContentPanel`. Nesting two content surfaces is meaningless and breaks the
|
|
15
|
+
* sticky / 100dvh framed frame. Call this unconditionally at the top of every
|
|
16
|
+
* `ContentPanel` variant — before any early return — so the hook order stays
|
|
17
|
+
* stable (rules of hooks).
|
|
18
|
+
*
|
|
19
|
+
* The throw is guarded by `process.env.NODE_ENV !== 'production'`, so bundlers
|
|
20
|
+
* (Metro on RN, Vite/Rolldown on web) statically strip the check from
|
|
21
|
+
* production builds for zero runtime overhead.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useContentPanelNestingGuard(): void;
|
|
24
|
+
//# sourceMappingURL=nesting-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nesting-context.d.ts","sourceRoot":"","sources":["../../../../src/content-panel/nesting-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,kCAAgC,CAAC;AAGxE;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
|
|
@@ -61,6 +61,8 @@ export * from './chip';
|
|
|
61
61
|
export * from './tabs';
|
|
62
62
|
export * from './checkbox';
|
|
63
63
|
export * from './accordion';
|
|
64
|
+
export { LinkPreviewCard } from './link-preview';
|
|
65
|
+
export type { LinkPreviewCardProps } from './link-preview';
|
|
64
66
|
export * from './settings-list';
|
|
65
67
|
export { Item } from './item';
|
|
66
68
|
export type { ItemProps } from './item';
|
|
@@ -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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"}
|
|
@@ -61,6 +61,8 @@ export * from './chip';
|
|
|
61
61
|
export * from './tabs';
|
|
62
62
|
export * from './checkbox';
|
|
63
63
|
export * from './accordion';
|
|
64
|
+
export { LinkPreviewCard } from './link-preview';
|
|
65
|
+
export type { LinkPreviewCardProps } from './link-preview';
|
|
64
66
|
export * from './settings-list';
|
|
65
67
|
export { Item } from './item';
|
|
66
68
|
export type { ItemProps } from './item';
|
|
@@ -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,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `LinkPreviewCard` — the canonical Oxy link-preview surface.
|
|
3
|
+
*
|
|
4
|
+
* One component renders the OpenGraph-style "cover image + site name + title +
|
|
5
|
+
* description" card across every Oxy app. It consumes the link-preview DATA
|
|
6
|
+
* produced by the Oxy SDK (`@oxyhq/core` `getLinkPreview` / `getLinkPreviews`,
|
|
7
|
+
* DTO `LinkPreview`) but takes a structural prop shape so Bloom never depends on
|
|
8
|
+
* `@oxyhq/contracts`.
|
|
9
|
+
*
|
|
10
|
+
* Styling is NativeWind-className-first (semantic Bloom utilities like
|
|
11
|
+
* `bg-card`, `border-border`, `text-foreground`, `text-muted-foreground`) with
|
|
12
|
+
* `useTheme()` Bloom tokens for the runtime-color and numeric-geometry values
|
|
13
|
+
* that have no clean utility — mirroring the `ContentPanel` idiom. The literal
|
|
14
|
+
* class strings must stay literal so a consumer's Tailwind content-scan over
|
|
15
|
+
* `lib/**` (and the native `src/**`) picks them up.
|
|
16
|
+
*
|
|
17
|
+
* The `image` prop is a plain absolute URL (e.g. a `cloud.oxy.so` OG image) and
|
|
18
|
+
* is rendered directly with the RN `Image` primitive — NOT through
|
|
19
|
+
* `ImageResolver` / `Avatar`, which resolve bare Oxy file IDs.
|
|
20
|
+
*/
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import type { LinkPreviewCardProps } from './types';
|
|
23
|
+
export declare const LinkPreviewCard: React.NamedExoticComponent<LinkPreviewCardProps>;
|
|
24
|
+
//# sourceMappingURL=LinkPreviewCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkPreviewCard.d.ts","sourceRoot":"","sources":["../../../../src/link-preview/LinkPreviewCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAqC,MAAM,OAAO,CAAC;AAY1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AA0HpD,eAAO,MAAM,eAAe,kDAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/link-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
/**
|
|
3
|
+
* Props for {@link LinkPreviewCard}.
|
|
4
|
+
*
|
|
5
|
+
* Structural by design — Bloom does NOT depend on `@oxyhq/contracts`. The shape
|
|
6
|
+
* mirrors the subset of the Oxy SDK's `LinkPreview` DTO (`@oxyhq/core`
|
|
7
|
+
* `getLinkPreview` / `getLinkPreviews`) that is needed to render a preview, so a
|
|
8
|
+
* consumer can spread an SDK `LinkPreview` straight onto this component.
|
|
9
|
+
*/
|
|
10
|
+
export interface LinkPreviewCardProps {
|
|
11
|
+
/** The previewed URL. Opened via `Linking.openURL` when `onPress` is omitted. */
|
|
12
|
+
url: string;
|
|
13
|
+
/** OpenGraph / page title. Falls back to the URL hostname when absent. */
|
|
14
|
+
title?: string;
|
|
15
|
+
/** OpenGraph / meta description. */
|
|
16
|
+
description?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Absolute cover-image URL (e.g. a `cloud.oxy.so` OG image). Rendered directly
|
|
19
|
+
* with the RN `Image` primitive — NOT through `ImageResolver` / `Avatar`, which
|
|
20
|
+
* are for bare Oxy file IDs.
|
|
21
|
+
*/
|
|
22
|
+
image?: string;
|
|
23
|
+
/** Site / brand name shown above the title. Falls back to the URL hostname. */
|
|
24
|
+
siteName?: string;
|
|
25
|
+
/** Press handler. When omitted, the card opens `url` via `Linking.openURL`. */
|
|
26
|
+
onPress?: () => void;
|
|
27
|
+
/** Extra NativeWind utilities merged onto the card surface. */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Extra style merged onto the card surface. */
|
|
30
|
+
style?: StyleProp<ViewStyle>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/link-preview/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/bloom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.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",
|
|
@@ -735,6 +735,17 @@
|
|
|
735
735
|
"default": "./lib/commonjs/settings-list/index.js"
|
|
736
736
|
}
|
|
737
737
|
},
|
|
738
|
+
"./link-preview": {
|
|
739
|
+
"react-native": "./src/link-preview/index.ts",
|
|
740
|
+
"import": {
|
|
741
|
+
"types": "./lib/typescript/module/link-preview/index.d.ts",
|
|
742
|
+
"default": "./lib/module/link-preview/index.js"
|
|
743
|
+
},
|
|
744
|
+
"require": {
|
|
745
|
+
"types": "./lib/typescript/commonjs/link-preview/index.d.ts",
|
|
746
|
+
"default": "./lib/commonjs/link-preview/index.js"
|
|
747
|
+
}
|
|
748
|
+
},
|
|
738
749
|
"./code": {
|
|
739
750
|
"react-native": "./src/code/index.ts",
|
|
740
751
|
"import": {
|
|
@@ -984,5 +995,11 @@
|
|
|
984
995
|
"nanoid": "^5.1.5",
|
|
985
996
|
"react-native-css": "3.0.7",
|
|
986
997
|
"react-remove-scroll-bar": "^2.3.8"
|
|
998
|
+
},
|
|
999
|
+
"overrides": {
|
|
1000
|
+
"basic-ftp": "5.2.2",
|
|
1001
|
+
"defu": "6.1.7",
|
|
1002
|
+
"handlebars": "4.7.9",
|
|
1003
|
+
"lodash": "4.18.1"
|
|
987
1004
|
}
|
|
988
1005
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text } from 'react-native';
|
|
3
|
+
import { render } from '@testing-library/react-native';
|
|
4
|
+
|
|
5
|
+
import { ContentPanel } from '../content-panel';
|
|
6
|
+
|
|
7
|
+
// Jest resolves `../content-panel` to the native variant (`index.tsx`), which
|
|
8
|
+
// does not read the theme — so these render without a BloomThemeProvider. The
|
|
9
|
+
// nesting guard lives in the shared `nesting-context` module exercised by both
|
|
10
|
+
// variants.
|
|
11
|
+
describe('ContentPanel nesting guard', () => {
|
|
12
|
+
it('renders a single (non-nested) panel', () => {
|
|
13
|
+
const { getByText } = render(
|
|
14
|
+
<ContentPanel framed>
|
|
15
|
+
<Text>content</Text>
|
|
16
|
+
</ContentPanel>,
|
|
17
|
+
);
|
|
18
|
+
expect(getByText('content')).toBeTruthy();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('renders side-by-side sibling panels without tripping the guard', () => {
|
|
22
|
+
const { getByText } = render(
|
|
23
|
+
<React.Fragment>
|
|
24
|
+
<ContentPanel framed>
|
|
25
|
+
<Text>left</Text>
|
|
26
|
+
</ContentPanel>
|
|
27
|
+
<ContentPanel framed>
|
|
28
|
+
<Text>right</Text>
|
|
29
|
+
</ContentPanel>
|
|
30
|
+
</React.Fragment>,
|
|
31
|
+
);
|
|
32
|
+
expect(getByText('left')).toBeTruthy();
|
|
33
|
+
expect(getByText('right')).toBeTruthy();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('throws when a ContentPanel is nested inside another ContentPanel', () => {
|
|
37
|
+
const consoleError = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
38
|
+
expect(() =>
|
|
39
|
+
render(
|
|
40
|
+
<ContentPanel framed>
|
|
41
|
+
<ContentPanel framed>
|
|
42
|
+
<Text>nested</Text>
|
|
43
|
+
</ContentPanel>
|
|
44
|
+
</ContentPanel>,
|
|
45
|
+
),
|
|
46
|
+
).toThrow(
|
|
47
|
+
'ContentPanel cannot be nested inside another ContentPanel. ' +
|
|
48
|
+
'Render panels as siblings (e.g. side-by-side columns), not nested.',
|
|
49
|
+
);
|
|
50
|
+
consoleError.mockRestore();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Linking } from 'react-native';
|
|
3
|
+
import { render, fireEvent } from '@testing-library/react-native';
|
|
4
|
+
|
|
5
|
+
import { BloomThemeProvider } from '../theme/BloomThemeProvider';
|
|
6
|
+
import { LinkPreviewCard } from '../link-preview';
|
|
7
|
+
|
|
8
|
+
function renderWithTheme(ui: React.ReactElement) {
|
|
9
|
+
return render(
|
|
10
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
11
|
+
{ui}
|
|
12
|
+
</BloomThemeProvider>,
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('LinkPreviewCard', () => {
|
|
17
|
+
it('renders the site name, title and description', () => {
|
|
18
|
+
const { getByText } = renderWithTheme(
|
|
19
|
+
<LinkPreviewCard
|
|
20
|
+
url="https://example.com/article"
|
|
21
|
+
siteName="Example"
|
|
22
|
+
title="A great article"
|
|
23
|
+
description="The summary of the article."
|
|
24
|
+
/>,
|
|
25
|
+
);
|
|
26
|
+
expect(getByText('Example')).toBeTruthy();
|
|
27
|
+
expect(getByText('A great article')).toBeTruthy();
|
|
28
|
+
expect(getByText('The summary of the article.')).toBeTruthy();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('falls back to the URL hostname for the title and site name', () => {
|
|
32
|
+
const { getAllByText } = renderWithTheme(
|
|
33
|
+
<LinkPreviewCard url="https://www.example.com/path" />,
|
|
34
|
+
);
|
|
35
|
+
// `www.` is stripped; the bare hostname is used for both the site name line
|
|
36
|
+
// and the title fallback.
|
|
37
|
+
expect(getAllByText('example.com').length).toBe(2);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('calls the supplied onPress handler', () => {
|
|
41
|
+
const onPress = jest.fn();
|
|
42
|
+
const { getByLabelText } = renderWithTheme(
|
|
43
|
+
<LinkPreviewCard url="https://example.com" title="Pressable" onPress={onPress} />,
|
|
44
|
+
);
|
|
45
|
+
fireEvent.press(getByLabelText('Pressable'));
|
|
46
|
+
expect(onPress).toHaveBeenCalledTimes(1);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('opens the URL via Linking when no onPress is supplied', () => {
|
|
50
|
+
const openURL = jest
|
|
51
|
+
.spyOn(Linking, 'openURL')
|
|
52
|
+
.mockResolvedValue(undefined);
|
|
53
|
+
const { getByLabelText } = renderWithTheme(
|
|
54
|
+
<LinkPreviewCard url="https://example.com/open" title="Open me" />,
|
|
55
|
+
);
|
|
56
|
+
fireEvent.press(getByLabelText('Open me'));
|
|
57
|
+
expect(openURL).toHaveBeenCalledWith('https://example.com/open');
|
|
58
|
+
openURL.mockRestore();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
import React, { memo } from 'react';
|
|
24
24
|
import { View, type StyleProp, type ViewStyle } from 'react-native';
|
|
25
25
|
|
|
26
|
+
import {
|
|
27
|
+
ContentPanelNestingContext,
|
|
28
|
+
useContentPanelNestingGuard,
|
|
29
|
+
} from './nesting-context';
|
|
30
|
+
|
|
26
31
|
/**
|
|
27
32
|
* Width (in px) of the WEB sticky gutter-mask box-shadow ring. Exported for
|
|
28
33
|
* cross-platform API parity (it has no effect on native).
|
|
@@ -65,6 +70,9 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
65
70
|
contentClassName,
|
|
66
71
|
contentStyle,
|
|
67
72
|
}) => {
|
|
73
|
+
// Dev-only invariant — a ContentPanel must never be nested inside another.
|
|
74
|
+
useContentPanelNestingGuard();
|
|
75
|
+
|
|
68
76
|
const surfaceClass = [
|
|
69
77
|
'flex-1',
|
|
70
78
|
'rounded-radius-28',
|
|
@@ -74,17 +82,19 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
74
82
|
const contentClass = ['flex-1', contentClassName].filter(Boolean).join(' ');
|
|
75
83
|
|
|
76
84
|
return (
|
|
77
|
-
<
|
|
78
|
-
{...({ className: surfaceClass } as Record<string, string>)}
|
|
79
|
-
style={surfaceStyle}
|
|
80
|
-
>
|
|
85
|
+
<ContentPanelNestingContext.Provider value={true}>
|
|
81
86
|
<View
|
|
82
|
-
{...({ className:
|
|
83
|
-
style={
|
|
87
|
+
{...({ className: surfaceClass } as Record<string, string>)}
|
|
88
|
+
style={surfaceStyle}
|
|
84
89
|
>
|
|
85
|
-
|
|
90
|
+
<View
|
|
91
|
+
{...({ className: contentClass } as Record<string, string>)}
|
|
92
|
+
style={contentStyle}
|
|
93
|
+
>
|
|
94
|
+
{children}
|
|
95
|
+
</View>
|
|
86
96
|
</View>
|
|
87
|
-
</
|
|
97
|
+
</ContentPanelNestingContext.Provider>
|
|
88
98
|
);
|
|
89
99
|
};
|
|
90
100
|
|
|
@@ -38,6 +38,10 @@ import React, { memo } from 'react';
|
|
|
38
38
|
import { View, type StyleProp, type ViewStyle } from 'react-native';
|
|
39
39
|
|
|
40
40
|
import { useTheme } from '../theme/use-theme';
|
|
41
|
+
import {
|
|
42
|
+
ContentPanelNestingContext,
|
|
43
|
+
useContentPanelNestingGuard,
|
|
44
|
+
} from './nesting-context';
|
|
41
45
|
|
|
42
46
|
/** Width (in px) of the sticky gutter-mask box-shadow ring. */
|
|
43
47
|
export const GUTTER_MASK_SPREAD = 40;
|
|
@@ -79,6 +83,9 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
79
83
|
showStickyFrame,
|
|
80
84
|
maskColor,
|
|
81
85
|
}) => {
|
|
86
|
+
// Dev-only invariant — must run unconditionally before the early `!framed`
|
|
87
|
+
// return so the hook order stays stable across renders (rules of hooks).
|
|
88
|
+
useContentPanelNestingGuard();
|
|
82
89
|
const { colors } = useTheme();
|
|
83
90
|
|
|
84
91
|
if (!framed) {
|
|
@@ -91,12 +98,14 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
91
98
|
.filter(Boolean)
|
|
92
99
|
.join(' ');
|
|
93
100
|
return (
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
<ContentPanelNestingContext.Provider value={true}>
|
|
102
|
+
<View
|
|
103
|
+
{...({ className: fullBleedClass } as Record<string, string>)}
|
|
104
|
+
style={[surfaceStyle, contentStyle]}
|
|
105
|
+
>
|
|
106
|
+
{children}
|
|
107
|
+
</View>
|
|
108
|
+
</ContentPanelNestingContext.Provider>
|
|
100
109
|
);
|
|
101
110
|
}
|
|
102
111
|
|
|
@@ -106,37 +115,39 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
106
115
|
.join(' ');
|
|
107
116
|
|
|
108
117
|
return (
|
|
109
|
-
<
|
|
110
|
-
{...({ className: surfaceClass } as Record<string, string>)}
|
|
111
|
-
style={surfaceStyle}
|
|
112
|
-
>
|
|
113
|
-
{/* (1) Bleed-mask overlay — gutter box-shadow ring, below chrome. */}
|
|
118
|
+
<ContentPanelNestingContext.Provider value={true}>
|
|
114
119
|
<View
|
|
115
|
-
|
|
116
|
-
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
} as Record<string, string>)}
|
|
120
|
-
style={{ boxShadow: `0 0 0 ${GUTTER_MASK_SPREAD}px ${maskColor ?? colors.background}` }}
|
|
121
|
-
/>
|
|
122
|
-
{/* (2) Border-frame overlay — one continuous rounded border, above all. */}
|
|
123
|
-
{showStickyFrame !== false && (
|
|
120
|
+
{...({ className: surfaceClass } as Record<string, string>)}
|
|
121
|
+
style={surfaceStyle}
|
|
122
|
+
>
|
|
123
|
+
{/* (1) Bleed-mask overlay — gutter box-shadow ring, below chrome. */}
|
|
124
124
|
<View
|
|
125
125
|
pointerEvents="none"
|
|
126
126
|
{...({
|
|
127
127
|
className:
|
|
128
|
-
'web:sticky web:top-2 z-
|
|
128
|
+
'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius-28 web:[margin-bottom:calc(-100dvh+16px)] web:[clip-path:inset(-12px)]',
|
|
129
129
|
} as Record<string, string>)}
|
|
130
|
+
style={{ boxShadow: `0 0 0 ${GUTTER_MASK_SPREAD}px ${maskColor ?? colors.background}` }}
|
|
130
131
|
/>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
{/* (2) Border-frame overlay — one continuous rounded border, above all. */}
|
|
133
|
+
{showStickyFrame !== false && (
|
|
134
|
+
<View
|
|
135
|
+
pointerEvents="none"
|
|
136
|
+
{...({
|
|
137
|
+
className:
|
|
138
|
+
'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border web:[margin-bottom:calc(-100dvh+16px)]',
|
|
139
|
+
} as Record<string, string>)}
|
|
140
|
+
/>
|
|
141
|
+
)}
|
|
142
|
+
{/* Content wrapper — clipped to the rounded panel shape on web. */}
|
|
143
|
+
<View
|
|
144
|
+
{...({ className: contentClass } as Record<string, string>)}
|
|
145
|
+
style={contentStyle}
|
|
146
|
+
>
|
|
147
|
+
{children}
|
|
148
|
+
</View>
|
|
138
149
|
</View>
|
|
139
|
-
</
|
|
150
|
+
</ContentPanelNestingContext.Provider>
|
|
140
151
|
);
|
|
141
152
|
};
|
|
142
153
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tracks whether the current subtree is already inside a `ContentPanel`.
|
|
5
|
+
*
|
|
6
|
+
* Every `ContentPanel` variant (web + native) wraps its rendered tree in
|
|
7
|
+
* `<ContentPanelNestingContext.Provider value={true}>`, so any DESCENDANT
|
|
8
|
+
* `ContentPanel` reads `true` here and can reject the invalid nesting. Context
|
|
9
|
+
* only flows downward, so side-by-side sibling panels each read the default
|
|
10
|
+
* `false` at their own level — siblings are valid, only true parent→child
|
|
11
|
+
* nesting trips the guard.
|
|
12
|
+
*/
|
|
13
|
+
export const ContentPanelNestingContext = createContext<boolean>(false);
|
|
14
|
+
ContentPanelNestingContext.displayName = 'BloomContentPanelNestingContext';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Dev-only invariant: a `ContentPanel` must NEVER be rendered inside another
|
|
18
|
+
* `ContentPanel`. Nesting two content surfaces is meaningless and breaks the
|
|
19
|
+
* sticky / 100dvh framed frame. Call this unconditionally at the top of every
|
|
20
|
+
* `ContentPanel` variant — before any early return — so the hook order stays
|
|
21
|
+
* stable (rules of hooks).
|
|
22
|
+
*
|
|
23
|
+
* The throw is guarded by `process.env.NODE_ENV !== 'production'`, so bundlers
|
|
24
|
+
* (Metro on RN, Vite/Rolldown on web) statically strip the check from
|
|
25
|
+
* production builds for zero runtime overhead.
|
|
26
|
+
*/
|
|
27
|
+
export function useContentPanelNestingGuard(): void {
|
|
28
|
+
const isNested = useContext(ContentPanelNestingContext);
|
|
29
|
+
if (process.env.NODE_ENV !== 'production' && isNested) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
'ContentPanel cannot be nested inside another ContentPanel. ' +
|
|
32
|
+
'Render panels as siblings (e.g. side-by-side columns), not nested.',
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -129,6 +129,8 @@ export * from './chip';
|
|
|
129
129
|
export * from './tabs';
|
|
130
130
|
export * from './checkbox';
|
|
131
131
|
export * from './accordion';
|
|
132
|
+
export { LinkPreviewCard } from './link-preview';
|
|
133
|
+
export type { LinkPreviewCardProps } from './link-preview';
|
|
132
134
|
|
|
133
135
|
// Settings / Grouped list
|
|
134
136
|
export * from './settings-list';
|
package/src/index.web.ts
CHANGED
|
@@ -134,6 +134,8 @@ export * from './chip';
|
|
|
134
134
|
export * from './tabs';
|
|
135
135
|
export * from './checkbox';
|
|
136
136
|
export * from './accordion';
|
|
137
|
+
export { LinkPreviewCard } from './link-preview';
|
|
138
|
+
export type { LinkPreviewCardProps } from './link-preview';
|
|
137
139
|
|
|
138
140
|
// Settings / Grouped list
|
|
139
141
|
export * from './settings-list';
|