@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.
Files changed (71) hide show
  1. package/lib/commonjs/content-panel/index.js +12 -6
  2. package/lib/commonjs/content-panel/index.js.map +1 -1
  3. package/lib/commonjs/content-panel/index.web.js +31 -21
  4. package/lib/commonjs/content-panel/index.web.js.map +1 -1
  5. package/lib/commonjs/content-panel/nesting-context.js +39 -0
  6. package/lib/commonjs/content-panel/nesting-context.js.map +1 -0
  7. package/lib/commonjs/index.js +20 -12
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/index.web.js +20 -12
  10. package/lib/commonjs/index.web.js.map +1 -1
  11. package/lib/commonjs/link-preview/LinkPreviewCard.js +133 -0
  12. package/lib/commonjs/link-preview/LinkPreviewCard.js.map +1 -0
  13. package/lib/commonjs/link-preview/index.js +13 -0
  14. package/lib/commonjs/link-preview/index.js.map +1 -0
  15. package/lib/commonjs/link-preview/types.js +6 -0
  16. package/lib/commonjs/link-preview/types.js.map +1 -0
  17. package/lib/module/content-panel/index.js +12 -6
  18. package/lib/module/content-panel/index.js.map +1 -1
  19. package/lib/module/content-panel/index.web.js +31 -21
  20. package/lib/module/content-panel/index.web.js.map +1 -1
  21. package/lib/module/content-panel/nesting-context.js +35 -0
  22. package/lib/module/content-panel/nesting-context.js.map +1 -0
  23. package/lib/module/index.js +1 -1
  24. package/lib/module/index.js.map +1 -1
  25. package/lib/module/index.web.js +1 -1
  26. package/lib/module/index.web.js.map +1 -1
  27. package/lib/module/link-preview/LinkPreviewCard.js +127 -0
  28. package/lib/module/link-preview/LinkPreviewCard.js.map +1 -0
  29. package/lib/module/link-preview/index.js +4 -0
  30. package/lib/module/link-preview/index.js.map +1 -0
  31. package/lib/module/link-preview/types.js +4 -0
  32. package/lib/module/link-preview/types.js.map +1 -0
  33. package/lib/typescript/commonjs/content-panel/index.d.ts.map +1 -1
  34. package/lib/typescript/commonjs/content-panel/index.web.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/content-panel/nesting-context.d.ts +24 -0
  36. package/lib/typescript/commonjs/content-panel/nesting-context.d.ts.map +1 -0
  37. package/lib/typescript/commonjs/index.d.ts +2 -0
  38. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  39. package/lib/typescript/commonjs/index.web.d.ts +2 -0
  40. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  41. package/lib/typescript/commonjs/link-preview/LinkPreviewCard.d.ts +24 -0
  42. package/lib/typescript/commonjs/link-preview/LinkPreviewCard.d.ts.map +1 -0
  43. package/lib/typescript/commonjs/link-preview/index.d.ts +3 -0
  44. package/lib/typescript/commonjs/link-preview/index.d.ts.map +1 -0
  45. package/lib/typescript/commonjs/link-preview/types.d.ts +32 -0
  46. package/lib/typescript/commonjs/link-preview/types.d.ts.map +1 -0
  47. package/lib/typescript/module/content-panel/index.d.ts.map +1 -1
  48. package/lib/typescript/module/content-panel/index.web.d.ts.map +1 -1
  49. package/lib/typescript/module/content-panel/nesting-context.d.ts +24 -0
  50. package/lib/typescript/module/content-panel/nesting-context.d.ts.map +1 -0
  51. package/lib/typescript/module/index.d.ts +2 -0
  52. package/lib/typescript/module/index.d.ts.map +1 -1
  53. package/lib/typescript/module/index.web.d.ts +2 -0
  54. package/lib/typescript/module/index.web.d.ts.map +1 -1
  55. package/lib/typescript/module/link-preview/LinkPreviewCard.d.ts +24 -0
  56. package/lib/typescript/module/link-preview/LinkPreviewCard.d.ts.map +1 -0
  57. package/lib/typescript/module/link-preview/index.d.ts +3 -0
  58. package/lib/typescript/module/link-preview/index.d.ts.map +1 -0
  59. package/lib/typescript/module/link-preview/types.d.ts +32 -0
  60. package/lib/typescript/module/link-preview/types.d.ts.map +1 -0
  61. package/package.json +18 -1
  62. package/src/__tests__/ContentPanelNesting.test.tsx +52 -0
  63. package/src/__tests__/LinkPreviewCard.test.tsx +60 -0
  64. package/src/content-panel/index.tsx +18 -8
  65. package/src/content-panel/index.web.tsx +40 -29
  66. package/src/content-panel/nesting-context.ts +35 -0
  67. package/src/index.ts +2 -0
  68. package/src/index.web.ts +2 -0
  69. package/src/link-preview/LinkPreviewCard.tsx +156 -0
  70. package/src/link-preview/index.ts +2 -0
  71. 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;AAEpE;;;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;AAgCD,eAAO,MAAM,YAAY,+CAA8B,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;AAIpE,+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;AAyED,eAAO,MAAM,YAAY,+CAA8B,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,3 @@
1
+ export { LinkPreviewCard } from './LinkPreviewCard';
2
+ export type { LinkPreviewCardProps } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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.22.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
- <View
78
- {...({ className: surfaceClass } as Record<string, string>)}
79
- style={surfaceStyle}
80
- >
85
+ <ContentPanelNestingContext.Provider value={true}>
81
86
  <View
82
- {...({ className: contentClass } as Record<string, string>)}
83
- style={contentStyle}
87
+ {...({ className: surfaceClass } as Record<string, string>)}
88
+ style={surfaceStyle}
84
89
  >
85
- {children}
90
+ <View
91
+ {...({ className: contentClass } as Record<string, string>)}
92
+ style={contentStyle}
93
+ >
94
+ {children}
95
+ </View>
86
96
  </View>
87
- </View>
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
- <View
95
- {...({ className: fullBleedClass } as Record<string, string>)}
96
- style={[surfaceStyle, contentStyle]}
97
- >
98
- {children}
99
- </View>
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
- <View
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
- pointerEvents="none"
116
- {...({
117
- className:
118
- '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)]',
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-[120] h-[calc(100dvh-16px)] w-full rounded-radius-28 border border-border web:[margin-bottom:calc(-100dvh+16px)]',
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
- {/* Content wrapper clipped to the rounded panel shape on web. */}
133
- <View
134
- {...({ className: contentClass } as Record<string, string>)}
135
- style={contentStyle}
136
- >
137
- {children}
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
- </View>
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';