@xenition/ui 0.1.0 → 0.1.1

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 (93) hide show
  1. package/dist/native/marketing/AnnouncementBar.d.ts +33 -0
  2. package/dist/native/marketing/AnnouncementBar.d.ts.map +1 -0
  3. package/dist/native/marketing/AnnouncementBar.js +101 -0
  4. package/dist/native/marketing/AnnouncementBar.js.map +1 -0
  5. package/dist/native/marketing/AuroraBackground.d.ts +35 -0
  6. package/dist/native/marketing/AuroraBackground.d.ts.map +1 -0
  7. package/dist/native/marketing/AuroraBackground.js +56 -0
  8. package/dist/native/marketing/AuroraBackground.js.map +1 -0
  9. package/dist/native/marketing/Bento.d.ts +54 -0
  10. package/dist/native/marketing/Bento.d.ts.map +1 -0
  11. package/dist/native/marketing/Bento.js +139 -0
  12. package/dist/native/marketing/Bento.js.map +1 -0
  13. package/dist/native/marketing/Carousel.d.ts +26 -0
  14. package/dist/native/marketing/Carousel.d.ts.map +1 -0
  15. package/dist/native/marketing/Carousel.js +95 -0
  16. package/dist/native/marketing/Carousel.js.map +1 -0
  17. package/dist/native/marketing/ComparisonTable.d.ts +38 -0
  18. package/dist/native/marketing/ComparisonTable.d.ts.map +1 -0
  19. package/dist/native/marketing/ComparisonTable.js +84 -0
  20. package/dist/native/marketing/ComparisonTable.js.map +1 -0
  21. package/dist/native/marketing/Countdown.d.ts +25 -0
  22. package/dist/native/marketing/Countdown.d.ts.map +1 -0
  23. package/dist/native/marketing/Countdown.js +107 -0
  24. package/dist/native/marketing/Countdown.js.map +1 -0
  25. package/dist/native/marketing/CoverGallery.d.ts +38 -0
  26. package/dist/native/marketing/CoverGallery.d.ts.map +1 -0
  27. package/dist/native/marketing/CoverGallery.js +41 -0
  28. package/dist/native/marketing/CoverGallery.js.map +1 -0
  29. package/dist/native/marketing/EditorialGrid.d.ts +73 -0
  30. package/dist/native/marketing/EditorialGrid.d.ts.map +1 -0
  31. package/dist/native/marketing/EditorialGrid.js +34 -0
  32. package/dist/native/marketing/EditorialGrid.js.map +1 -0
  33. package/dist/native/marketing/FeatureSplit.d.ts +29 -0
  34. package/dist/native/marketing/FeatureSplit.d.ts.map +1 -0
  35. package/dist/native/marketing/FeatureSplit.js +37 -0
  36. package/dist/native/marketing/FeatureSplit.js.map +1 -0
  37. package/dist/native/marketing/LocationBlock.d.ts +37 -0
  38. package/dist/native/marketing/LocationBlock.d.ts.map +1 -0
  39. package/dist/native/marketing/LocationBlock.js +49 -0
  40. package/dist/native/marketing/LocationBlock.js.map +1 -0
  41. package/dist/native/marketing/Navbar.d.ts +34 -0
  42. package/dist/native/marketing/Navbar.d.ts.map +1 -0
  43. package/dist/native/marketing/Navbar.js +100 -0
  44. package/dist/native/marketing/Navbar.js.map +1 -0
  45. package/dist/native/marketing/NewsletterSignup.d.ts +33 -0
  46. package/dist/native/marketing/NewsletterSignup.d.ts.map +1 -0
  47. package/dist/native/marketing/NewsletterSignup.js +97 -0
  48. package/dist/native/marketing/NewsletterSignup.js.map +1 -0
  49. package/dist/native/marketing/OrnamentRule.d.ts +23 -0
  50. package/dist/native/marketing/OrnamentRule.d.ts.map +1 -0
  51. package/dist/native/marketing/OrnamentRule.js +43 -0
  52. package/dist/native/marketing/OrnamentRule.js.map +1 -0
  53. package/dist/native/marketing/ParticleField.d.ts +25 -0
  54. package/dist/native/marketing/ParticleField.d.ts.map +1 -0
  55. package/dist/native/marketing/ParticleField.js +92 -0
  56. package/dist/native/marketing/ParticleField.js.map +1 -0
  57. package/dist/native/marketing/PointerHalo.d.ts +22 -0
  58. package/dist/native/marketing/PointerHalo.d.ts.map +1 -0
  59. package/dist/native/marketing/PointerHalo.js +15 -0
  60. package/dist/native/marketing/PointerHalo.js.map +1 -0
  61. package/dist/native/marketing/PriceList.d.ts +30 -0
  62. package/dist/native/marketing/PriceList.d.ts.map +1 -0
  63. package/dist/native/marketing/PriceList.js +42 -0
  64. package/dist/native/marketing/PriceList.js.map +1 -0
  65. package/dist/native/marketing/PricingToggle.d.ts +30 -0
  66. package/dist/native/marketing/PricingToggle.d.ts.map +1 -0
  67. package/dist/native/marketing/PricingToggle.js +55 -0
  68. package/dist/native/marketing/PricingToggle.js.map +1 -0
  69. package/dist/native/marketing/ProcessSteps.d.ts +24 -0
  70. package/dist/native/marketing/ProcessSteps.d.ts.map +1 -0
  71. package/dist/native/marketing/ProcessSteps.js +52 -0
  72. package/dist/native/marketing/ProcessSteps.js.map +1 -0
  73. package/dist/native/marketing/ProductMock.d.ts +47 -0
  74. package/dist/native/marketing/ProductMock.d.ts.map +1 -0
  75. package/dist/native/marketing/ProductMock.js +270 -0
  76. package/dist/native/marketing/ProductMock.js.map +1 -0
  77. package/dist/native/marketing/SectionDivider.d.ts +34 -0
  78. package/dist/native/marketing/SectionDivider.d.ts.map +1 -0
  79. package/dist/native/marketing/SectionDivider.js +41 -0
  80. package/dist/native/marketing/SectionDivider.js.map +1 -0
  81. package/dist/native/marketing/TeamGrid.d.ts +27 -0
  82. package/dist/native/marketing/TeamGrid.d.ts.map +1 -0
  83. package/dist/native/marketing/TeamGrid.js +37 -0
  84. package/dist/native/marketing/TeamGrid.js.map +1 -0
  85. package/dist/native/marketing/VideoEmbed.d.ts +23 -0
  86. package/dist/native/marketing/VideoEmbed.d.ts.map +1 -0
  87. package/dist/native/marketing/VideoEmbed.js +38 -0
  88. package/dist/native/marketing/VideoEmbed.js.map +1 -0
  89. package/dist/native/marketing/index.d.ts +46 -0
  90. package/dist/native/marketing/index.d.ts.map +1 -1
  91. package/dist/native/marketing/index.js +52 -1
  92. package/dist/native/marketing/index.js.map +1 -1
  93. package/package.json +1 -1
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocationBlock = LocationBlock;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const theme_1 = require("../theme");
7
+ /**
8
+ * Contact/location section — the native mirror of the web `LocationBlock`:
9
+ * name, address, opening-hours rows, and contact lines above a map. The web
10
+ * two-column desktop grid is **stacked vertically** on native (phones are
11
+ * narrow). The web embeds an interactive map `<iframe>`; native has no
12
+ * interactive map, so it renders a **static `mapImageUri` image** or a
13
+ * token-styled placeholder. Phone/email are shown as plain text rather than
14
+ * `tel:`/`mailto:` links. Token-only.
15
+ */
16
+ function LocationBlock({ name, address, hours, phone, email, mapImageUri, style, }) {
17
+ const { colors, tokens } = (0, theme_1.useXenitionTheme)();
18
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { testID: "xen-location-block", style: [{ gap: tokens.spacing.xl }, style], children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: { gap: tokens.spacing.md }, children: [name ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: {
19
+ color: colors.onSurface,
20
+ fontSize: tokens.typography.scale['2xl'],
21
+ fontWeight: '700',
22
+ }, children: name })) : null, (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.muted, fontSize: tokens.typography.scale.base }, children: address }), hours && hours.length > 0 ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: { gap: 0 }, children: hours.map((row, i) => ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: {
23
+ flexDirection: 'row',
24
+ justifyContent: 'space-between',
25
+ paddingVertical: tokens.spacing.xs,
26
+ borderBottomWidth: i === hours.length - 1 ? 0 : 1,
27
+ borderBottomColor: colors.border,
28
+ }, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: {
29
+ color: colors.onSurface,
30
+ fontSize: tokens.typography.scale.sm,
31
+ fontWeight: '500',
32
+ }, children: row.label }), (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.muted, fontSize: tokens.typography.scale.sm }, children: row.value })] }, i))) })) : null, phone || email ? ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: { gap: tokens.spacing.xs }, children: [phone ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.primary, fontSize: tokens.typography.scale.sm }, children: phone })) : null, email ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.primary, fontSize: tokens.typography.scale.sm }, children: email })) : null] })) : null] }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: {
33
+ aspectRatio: 16 / 9,
34
+ width: '100%',
35
+ overflow: 'hidden',
36
+ borderRadius: tokens.radius.lg,
37
+ borderWidth: 1,
38
+ borderColor: colors.border,
39
+ backgroundColor: tokens.ramps.neutral[100],
40
+ alignItems: 'center',
41
+ justifyContent: 'center',
42
+ }, children: mapImageUri ? ((0, jsx_runtime_1.jsx)(react_native_1.Image, { source: { uri: mapImageUri }, style: { width: '100%', height: '100%' }, resizeMode: "cover" })) : ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: {
43
+ color: colors.muted,
44
+ fontSize: tokens.typography.scale.sm,
45
+ textAlign: 'center',
46
+ paddingHorizontal: tokens.spacing.md,
47
+ }, children: address })) })] }));
48
+ }
49
+ //# sourceMappingURL=LocationBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocationBlock.js","sourceRoot":"","sources":["../../../src/native/marketing/LocationBlock.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import * as React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ export interface NavbarLink {
4
+ label: string;
5
+ /** Fires on press (RN equivalent of the web link `href`). */
6
+ onPress?: () => void;
7
+ /** Marks the link as the current page (bolder tint). */
8
+ active?: boolean;
9
+ }
10
+ export interface NavbarProps {
11
+ /** Brand slot (logo image, wordmark, …). */
12
+ logo?: React.ReactNode;
13
+ /** Nav links — the web `children` become a data array (idiomatic for RN). */
14
+ links?: NavbarLink[];
15
+ /** Right-side slot (sign-in button, theme toggle, …), rendered as-is. */
16
+ actions?: React.ReactNode;
17
+ /** Accessible label for the mobile menu toggle (default `Menu`). */
18
+ menuLabel?: string;
19
+ style?: StyleProp<ViewStyle>;
20
+ }
21
+ /**
22
+ * Marketing navbar — the native mirror of the web `Navbar`.
23
+ *
24
+ * The web version is a sticky `<header>` that gains a translucent
25
+ * backdrop-blur bar once the page scrolls (a passive `scroll` listener +
26
+ * `color-mix`). React Native has no page-scroll chrome, `backdrop-filter`, or
27
+ * `color-mix`, so native **drops the sticky/scroll-blur behavior** and renders
28
+ * a plain top bar over a translucent `surface` token. Web link `children`
29
+ * become a `links` data array (`href`→`onPress`). On narrow layouts the links
30
+ * collapse behind a disclosure toggle (a `Pressable` flipping a `View`), the
31
+ * native equivalent of the web mobile menu. Token-only.
32
+ */
33
+ export declare function Navbar({ logo, links, actions, menuLabel, style, }: NavbarProps): React.ReactElement;
34
+ //# sourceMappingURL=Navbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navbar.d.ts","sourceRoot":"","sources":["../../../src/native/marketing/Navbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,KAAU,EACV,OAAO,EACP,SAAkB,EAClB,KAAK,GACN,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAsHlC"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Navbar = Navbar;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const React = __importStar(require("react"));
39
+ const react_native_1 = require("react-native");
40
+ const theme_1 = require("../theme");
41
+ const color_1 = require("../primitives/internal/color");
42
+ /**
43
+ * Marketing navbar — the native mirror of the web `Navbar`.
44
+ *
45
+ * The web version is a sticky `<header>` that gains a translucent
46
+ * backdrop-blur bar once the page scrolls (a passive `scroll` listener +
47
+ * `color-mix`). React Native has no page-scroll chrome, `backdrop-filter`, or
48
+ * `color-mix`, so native **drops the sticky/scroll-blur behavior** and renders
49
+ * a plain top bar over a translucent `surface` token. Web link `children`
50
+ * become a `links` data array (`href`→`onPress`). On narrow layouts the links
51
+ * collapse behind a disclosure toggle (a `Pressable` flipping a `View`), the
52
+ * native equivalent of the web mobile menu. Token-only.
53
+ */
54
+ function Navbar({ logo, links = [], actions, menuLabel = 'Menu', style, }) {
55
+ const { colors, tokens } = (0, theme_1.useXenitionTheme)();
56
+ const [open, setOpen] = React.useState(false);
57
+ const renderLink = (link, i) => ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: "link", accessibilityState: { selected: link.active }, onPress: () => {
58
+ setOpen(false);
59
+ link.onPress?.();
60
+ }, style: ({ pressed }) => ({ opacity: pressed ? 0.6 : 1 }), children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: {
61
+ color: link.active ? colors.primary : colors.onSurface,
62
+ fontSize: tokens.typography.scale.sm,
63
+ fontWeight: link.active ? '700' : '500',
64
+ paddingVertical: tokens.spacing.xs,
65
+ }, children: link.label }) }, i));
66
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { testID: "xen-navbar", style: [
67
+ {
68
+ backgroundColor: (0, color_1.withAlpha)(colors.surface, 0.8),
69
+ borderBottomWidth: 1,
70
+ borderBottomColor: (0, color_1.withAlpha)(colors.border, 0.7),
71
+ },
72
+ style,
73
+ ], children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: {
74
+ flexDirection: 'row',
75
+ alignItems: 'center',
76
+ justifyContent: 'space-between',
77
+ gap: tokens.spacing.md,
78
+ paddingHorizontal: tokens.spacing.lg,
79
+ paddingVertical: tokens.spacing.sm,
80
+ }, children: [logo !== undefined ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center' }, children: logo })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, {})), (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: {
81
+ flexDirection: 'row',
82
+ alignItems: 'center',
83
+ gap: tokens.spacing.sm,
84
+ }, children: [actions !== undefined && actions !== null ? actions : null, links.length > 0 ? ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: "button", accessibilityLabel: menuLabel, accessibilityState: { expanded: open }, onPress: () => setOpen((prev) => !prev), style: ({ pressed }) => ({
85
+ width: 36,
86
+ height: 36,
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ borderRadius: tokens.radius.sm,
90
+ opacity: pressed ? 0.6 : 1,
91
+ }), children: open ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.onSurface, fontSize: tokens.typography.scale.lg }, children: "\u2715" })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: { width: 18, gap: 4 }, children: [0, 1, 2].map((i) => ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: { height: 2, borderRadius: 1, backgroundColor: colors.onSurface } }, i))) })) })) : null] })] }), open && links.length > 0 ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { testID: "xen-navbar-menu", style: {
92
+ borderTopWidth: 1,
93
+ borderTopColor: (0, color_1.withAlpha)(colors.border, 0.7),
94
+ backgroundColor: colors.surface,
95
+ paddingHorizontal: tokens.spacing.lg,
96
+ paddingVertical: tokens.spacing.md,
97
+ gap: tokens.spacing.sm,
98
+ }, children: links.map(renderLink) })) : null] }));
99
+ }
100
+ //# sourceMappingURL=Navbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navbar.js","sourceRoot":"","sources":["../../../src/native/marketing/Navbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ export interface NewsletterSignupProps {
4
+ /** Section heading. */
5
+ heading?: string;
6
+ /** Supporting copy under the heading. */
7
+ subtext?: string;
8
+ /**
9
+ * SDK-agnostic submit handler — receives the validated email and may be
10
+ * async. Throw (or reject) to surface the error state.
11
+ */
12
+ onSubmit: (email: string) => void | Promise<void>;
13
+ /** Input placeholder. */
14
+ placeholder?: string;
15
+ /** Submit button label. */
16
+ buttonLabel?: string;
17
+ /** Message shown after a successful submit. */
18
+ successMessage?: string;
19
+ /** Message shown when the email fails validation. */
20
+ invalidMessage?: string;
21
+ /** Fallback message shown when `onSubmit` throws without a message. */
22
+ errorMessage?: string;
23
+ style?: StyleProp<ViewStyle>;
24
+ }
25
+ /**
26
+ * Email-capture block — the native mirror of the web `NewsletterSignup`:
27
+ * heading, subtext, a validated email `Input`, a submit `Button`, and
28
+ * success/error states. The web `<form onSubmit>` becomes an explicit submit
29
+ * handler on the button; the endpoint lives entirely in the caller's async
30
+ * `onSubmit(email)`. Composes the native `Input`/`Button` primitives. Token-only.
31
+ */
32
+ export declare function NewsletterSignup({ heading, subtext, onSubmit, placeholder, buttonLabel, successMessage, invalidMessage, errorMessage, style, }: NewsletterSignupProps): React.ReactElement;
33
+ //# sourceMappingURL=NewsletterSignup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewsletterSignup.d.ts","sourceRoot":"","sources":["../../../src/native/marketing/NewsletterSignup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAU1E,MAAM,WAAW,qBAAqB;IACpC,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAA4B,EAC5B,OAAO,EACP,QAAQ,EACR,WAA+B,EAC/B,WAAyB,EACzB,cAA8C,EAC9C,cAA+C,EAC/C,YAAwD,EACxD,KAAK,GACN,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CA0F5C"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NewsletterSignup = NewsletterSignup;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const React = __importStar(require("react"));
39
+ const react_native_1 = require("react-native");
40
+ const theme_1 = require("../theme");
41
+ const Input_1 = require("../primitives/Input");
42
+ const Button_1 = require("../primitives/Button");
43
+ /** Basic, permissive email shape check (no network, no dependency). */
44
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
45
+ /**
46
+ * Email-capture block — the native mirror of the web `NewsletterSignup`:
47
+ * heading, subtext, a validated email `Input`, a submit `Button`, and
48
+ * success/error states. The web `<form onSubmit>` becomes an explicit submit
49
+ * handler on the button; the endpoint lives entirely in the caller's async
50
+ * `onSubmit(email)`. Composes the native `Input`/`Button` primitives. Token-only.
51
+ */
52
+ function NewsletterSignup({ heading = 'Stay in the loop', subtext, onSubmit, placeholder = 'you@example.com', buttonLabel = 'Subscribe', successMessage = "Thanks — you're subscribed.", invalidMessage = 'Enter a valid email address.', errorMessage = 'Something went wrong. Please try again.', style, }) {
53
+ const { colors, tokens } = (0, theme_1.useXenitionTheme)();
54
+ const [email, setEmail] = React.useState('');
55
+ const [status, setStatus] = React.useState('idle');
56
+ const [message, setMessage] = React.useState(null);
57
+ const handleSubmit = async () => {
58
+ if (!EMAIL_RE.test(email.trim())) {
59
+ setStatus('error');
60
+ setMessage(invalidMessage);
61
+ return;
62
+ }
63
+ setStatus('submitting');
64
+ setMessage(null);
65
+ try {
66
+ await onSubmit(email.trim());
67
+ setStatus('success');
68
+ setMessage(successMessage);
69
+ setEmail('');
70
+ }
71
+ catch (error) {
72
+ setStatus('error');
73
+ setMessage(error instanceof Error && error.message ? error.message : errorMessage);
74
+ }
75
+ };
76
+ const invalid = status === 'error';
77
+ const submitting = status === 'submitting';
78
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { testID: "xen-newsletter", style: [
79
+ {
80
+ gap: tokens.spacing.sm,
81
+ borderRadius: tokens.radius.lg,
82
+ borderWidth: 1,
83
+ borderColor: colors.border,
84
+ backgroundColor: colors.surface,
85
+ padding: tokens.spacing.lg,
86
+ },
87
+ style,
88
+ ], children: [heading !== undefined ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: {
89
+ color: colors.onSurface,
90
+ fontSize: tokens.typography.scale.lg,
91
+ fontWeight: '600',
92
+ }, children: heading })) : null, subtext !== undefined ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: colors.muted, fontSize: tokens.typography.scale.sm }, children: subtext })) : null, (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: { gap: tokens.spacing.sm }, children: [(0, jsx_runtime_1.jsx)(Input_1.Input, { value: email, onChangeText: setEmail, placeholder: placeholder, keyboardType: "email-address", autoCapitalize: "none", autoCorrect: false, accessibilityLabel: "Email address", invalid: invalid, editable: !submitting }), (0, jsx_runtime_1.jsx)(Button_1.Button, { onPress: handleSubmit, loading: submitting, disabled: submitting, children: buttonLabel })] }), message ? ((0, jsx_runtime_1.jsx)(react_native_1.Text, { accessibilityLiveRegion: "polite", style: {
93
+ fontSize: tokens.typography.scale.sm,
94
+ color: status === 'success' ? colors.success : colors.danger,
95
+ }, children: message })) : null] }));
96
+ }
97
+ //# sourceMappingURL=NewsletterSignup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewsletterSignup.js","sourceRoot":"","sources":["../../../src/native/marketing/NewsletterSignup.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ export type OrnamentShape = 'diamond' | 'dot' | 'line' | 'none';
4
+ export type OrnamentTone = 'accent' | 'primary' | 'border';
5
+ export interface OrnamentRuleProps {
6
+ /** Centered ornament: rotated diamond, round dot, short bar, or none (plain rule). */
7
+ ornament?: OrnamentShape;
8
+ /** Token family tinting the rule and ornament (default `accent` — the "brass" look). */
9
+ tone?: OrnamentTone;
10
+ style?: StyleProp<ViewStyle>;
11
+ }
12
+ /**
13
+ * Editorial divider — the native mirror of the web `OrnamentRule`: a 1px rule
14
+ * flanking an optional centered diamond/dot/line ornament. Purely decorative
15
+ * and static, token-tinted via `tone`.
16
+ *
17
+ * The web version fades each half of the rule with a horizontal gradient
18
+ * (`linear-gradient` + `color-mix`). React Native has no CSS gradients here, so
19
+ * the fade is **approximated with a solid low-opacity token border** — the tint
20
+ * always originates from a theme token, so no literal color is introduced.
21
+ */
22
+ export declare function OrnamentRule({ ornament, tone, style, }: OrnamentRuleProps): React.ReactElement;
23
+ //# sourceMappingURL=OrnamentRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrnamentRule.d.ts","sourceRoot":"","sources":["../../../src/native/marketing/OrnamentRule.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAIpE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,wFAAwF;IACxF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAoB,EACpB,IAAe,EACf,KAAK,GACN,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA4CxC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrnamentRule = OrnamentRule;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const theme_1 = require("../theme");
7
+ const color_1 = require("../primitives/internal/color");
8
+ /**
9
+ * Editorial divider — the native mirror of the web `OrnamentRule`: a 1px rule
10
+ * flanking an optional centered diamond/dot/line ornament. Purely decorative
11
+ * and static, token-tinted via `tone`.
12
+ *
13
+ * The web version fades each half of the rule with a horizontal gradient
14
+ * (`linear-gradient` + `color-mix`). React Native has no CSS gradients here, so
15
+ * the fade is **approximated with a solid low-opacity token border** — the tint
16
+ * always originates from a theme token, so no literal color is introduced.
17
+ */
18
+ function OrnamentRule({ ornament = 'diamond', tone = 'accent', style, }) {
19
+ const { colors, tokens } = (0, theme_1.useXenitionTheme)();
20
+ const toneColor = tone === 'accent'
21
+ ? tokens.ramps.accent[400]
22
+ : tone === 'primary'
23
+ ? tokens.ramps.primary[400]
24
+ : colors.border;
25
+ // Solid low-opacity token color approximating the web gradient fade.
26
+ const ruleColor = (0, color_1.withAlpha)(toneColor, 0.4);
27
+ const ornamentStyle = ornament === 'none'
28
+ ? null
29
+ : ornament === 'diamond'
30
+ ? { width: 7, height: 7, transform: [{ rotate: '45deg' }] }
31
+ : ornament === 'dot'
32
+ ? { width: 6, height: 6, borderRadius: 9999 }
33
+ : { width: 24, height: 1 };
34
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { testID: "xen-ornament-rule", accessibilityRole: "none", style: [
35
+ { flexDirection: 'row', alignItems: 'center', justifyContent: 'center' },
36
+ style,
37
+ ], children: [(0, jsx_runtime_1.jsx)(react_native_1.View, { style: { flex: 1, height: 1, backgroundColor: ruleColor } }), ornamentStyle ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: {
38
+ marginHorizontal: tokens.spacing.md,
39
+ backgroundColor: toneColor,
40
+ ...ornamentStyle,
41
+ } })) : null, (0, jsx_runtime_1.jsx)(react_native_1.View, { style: { flex: 1, height: 1, backgroundColor: ruleColor } })] }));
42
+ }
43
+ //# sourceMappingURL=OrnamentRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrnamentRule.js","sourceRoot":"","sources":["../../../src/native/marketing/OrnamentRule.tsx"],"names":[],"mappings":";;AA0BA,oCAgDC;;AAzED,+CAAoE;AACpE,oCAA4C;AAC5C,wDAAyD;AAazD;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAAC,EAC3B,QAAQ,GAAG,SAAS,EACpB,IAAI,GAAG,QAAQ,EACf,KAAK,GACa;IAClB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,wBAAgB,GAAE,CAAC;IAE9C,MAAM,SAAS,GACb,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,CAAC,CAAC,IAAI,KAAK,SAAS;YAClB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAEtB,qEAAqE;IACrE,MAAM,SAAS,GAAG,IAAA,iBAAS,EAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAE5C,MAAM,aAAa,GACjB,QAAQ,KAAK,MAAM;QACjB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,QAAQ,KAAK,SAAS;YACtB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE;YAC3D,CAAC,CAAC,QAAQ,KAAK,KAAK;gBAClB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE;gBAC7C,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEnC,OAAO,CACL,wBAAC,mBAAI,IACH,MAAM,EAAC,mBAAmB,EAC1B,iBAAiB,EAAC,MAAM,EACxB,KAAK,EAAE;YACL,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE;YACxE,KAAK;SACN,aAED,uBAAC,mBAAI,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,GAAI,EAClE,aAAa,CAAC,CAAC,CAAC,CACf,uBAAC,mBAAI,IACH,KAAK,EAAE;oBACL,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;oBACnC,eAAe,EAAE,SAAS;oBAC1B,GAAG,aAAa;iBACjB,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,mBAAI,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,GAAI,IAC9D,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ export type ParticleMood = 'ember' | 'snow' | 'fireflies' | 'sparks';
4
+ export interface ParticleFieldProps {
5
+ /** Particle character: embers, snow, fireflies, or sparks (drives color + size). */
6
+ mood?: ParticleMood;
7
+ /** Particle count (clamped 0–80; default 18). */
8
+ density?: number;
9
+ /** Layout seed — same seed, same scatter (deterministic, no `Math.random`). */
10
+ seed?: number;
11
+ /** Decorative content layered above the scatter (rendered absolute-fill). */
12
+ children?: React.ReactNode;
13
+ style?: StyleProp<ViewStyle>;
14
+ }
15
+ /**
16
+ * Native mirror of the web `ParticleField`. The web version animates each
17
+ * particle on an infinite CSS keyframe path (rise/fall/blink). React Native
18
+ * gets a **static, deterministic scatter** of small fully-rounded token-colored
19
+ * dot Views — no animation loop, so there is nothing to honor for reduced
20
+ * motion (it is already the reduced-motion rest pose). The `mood`/`density`/
21
+ * `seed` props are preserved: `mood` selects the dot color + size range,
22
+ * `density`/`seed` drive the same golden-ratio layout as web. Token-only.
23
+ */
24
+ export declare function ParticleField({ mood, density, seed, children, style, }: ParticleFieldProps): React.ReactElement;
25
+ //# sourceMappingURL=ParticleField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticleField.d.ts","sourceRoot":"","sources":["../../../src/native/marketing/ParticleField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAIhF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAsDD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAc,EACd,OAAY,EACZ,IAAQ,EACR,QAAQ,EACR,KAAK,GACN,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAiCzC"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ParticleField = ParticleField;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const React = __importStar(require("react"));
39
+ const react_native_1 = require("react-native");
40
+ const theme_1 = require("../theme");
41
+ const color_1 = require("../primitives/internal/color");
42
+ const GOLDEN = 0.618033988749895;
43
+ const TUNING = {
44
+ ember: { sizeMin: 3, sizeMax: 8, role: 'primary', step: 400 },
45
+ sparks: { sizeMin: 2, sizeMax: 4.5, role: 'accent', step: 500 },
46
+ snow: { sizeMin: 2.5, sizeMax: 6.5, role: 'neutral', step: 200 },
47
+ fireflies: { sizeMin: 3, sizeMax: 5.5, role: 'accent', step: 400 },
48
+ };
49
+ const clampDensity = (density) => Math.max(0, Math.min(80, Math.round(density)));
50
+ /**
51
+ * Deterministic golden-ratio low-discrepancy scatter — replicated from the web
52
+ * `computeParticles` (its module pulls DOM helpers at import, so we inline the
53
+ * pure math here). Same (mood, density, seed) → same layout on every device.
54
+ */
55
+ function computeNativeParticles(mood, density, seed) {
56
+ const tune = TUNING[mood];
57
+ return Array.from({ length: clampDensity(density) }, (_, i) => {
58
+ const t = ((i + seed) * GOLDEN) % 1;
59
+ const u = ((i + seed + 7) * GOLDEN) % 1;
60
+ const v = ((i + seed + 13) * GOLDEN) % 1;
61
+ return {
62
+ x: `${(t * 100).toFixed(1)}%`,
63
+ y: `${(8 + v * 84).toFixed(1)}%`,
64
+ size: Number((tune.sizeMin + u * (tune.sizeMax - tune.sizeMin)).toFixed(1)),
65
+ opacity: Number((0.35 + t * 0.4).toFixed(2)),
66
+ };
67
+ });
68
+ }
69
+ /**
70
+ * Native mirror of the web `ParticleField`. The web version animates each
71
+ * particle on an infinite CSS keyframe path (rise/fall/blink). React Native
72
+ * gets a **static, deterministic scatter** of small fully-rounded token-colored
73
+ * dot Views — no animation loop, so there is nothing to honor for reduced
74
+ * motion (it is already the reduced-motion rest pose). The `mood`/`density`/
75
+ * `seed` props are preserved: `mood` selects the dot color + size range,
76
+ * `density`/`seed` drive the same golden-ratio layout as web. Token-only.
77
+ */
78
+ function ParticleField({ mood = 'ember', density = 18, seed = 1, children, style, }) {
79
+ const { tokens } = (0, theme_1.useXenitionTheme)();
80
+ const particles = React.useMemo(() => computeNativeParticles(mood, density, seed), [mood, density, seed]);
81
+ const base = tokens.ramps[TUNING[mood].role][TUNING[mood].step];
82
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { testID: "xen-particle-field", pointerEvents: "none", style: [react_native_1.StyleSheet.absoluteFill, { overflow: 'hidden' }, style], children: [particles.map((p, index) => ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: {
83
+ position: 'absolute',
84
+ left: p.x,
85
+ top: p.y,
86
+ width: p.size,
87
+ height: p.size,
88
+ borderRadius: 9999,
89
+ backgroundColor: (0, color_1.withAlpha)(base, p.opacity),
90
+ } }, index))), children !== undefined && children !== null ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: react_native_1.StyleSheet.absoluteFill, children: children })) : null] }));
91
+ }
92
+ //# sourceMappingURL=ParticleField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticleField.js","sourceRoot":"","sources":["../../../src/native/marketing/ParticleField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ export type PointerHaloMode = 'idle' | 'link' | 'grow';
3
+ export interface PointerHaloProps {
4
+ /** Halo diameter at rest, px (web only). */
5
+ size?: number;
6
+ /** Diameter when hovering interactive elements (web only). */
7
+ linkSize?: number;
8
+ /** Diameter over `[data-halo="grow"]` targets (web only). */
9
+ growSize?: number;
10
+ /** Caption shown inside the grown halo (web only). */
11
+ label?: React.ReactNode;
12
+ }
13
+ /**
14
+ * Native mirror of the web `PointerHalo`. The web component renders a custom
15
+ * cursor halo that trails a fine (mouse) pointer. Touch devices have **no
16
+ * cursor**, so on React Native this is a permanent no-op: it always renders
17
+ * `null` — exactly like the web version does under `prefers-reduced-motion` or
18
+ * a coarse pointer. The component and its props are kept only for cross-platform
19
+ * API parity; every prop is **inert** on native.
20
+ */
21
+ export declare function PointerHalo(_props: PointerHaloProps): React.ReactElement | null;
22
+ //# sourceMappingURL=PointerHalo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointerHalo.d.ts","sourceRoot":"","sources":["../../../src/native/marketing/PointerHalo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAE/E"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointerHalo = PointerHalo;
4
+ /**
5
+ * Native mirror of the web `PointerHalo`. The web component renders a custom
6
+ * cursor halo that trails a fine (mouse) pointer. Touch devices have **no
7
+ * cursor**, so on React Native this is a permanent no-op: it always renders
8
+ * `null` — exactly like the web version does under `prefers-reduced-motion` or
9
+ * a coarse pointer. The component and its props are kept only for cross-platform
10
+ * API parity; every prop is **inert** on native.
11
+ */
12
+ function PointerHalo(_props) {
13
+ return null;
14
+ }
15
+ //# sourceMappingURL=PointerHalo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointerHalo.js","sourceRoot":"","sources":["../../../src/native/marketing/PointerHalo.tsx"],"names":[],"mappings":";;AAuBA,kCAEC;AAVD;;;;;;;GAOG;AACH,SAAgB,WAAW,CAAC,MAAwB;IAClD,OAAO,IAAI,CAAC;AACd,CAAC"}