@rovela-ai/sdk 0.3.27 → 0.3.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +20 -6
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/setup-guide.d.ts.map +1 -1
- package/dist/admin/api/setup-guide.js +24 -7
- package/dist/admin/api/setup-guide.js.map +1 -1
- package/dist/admin/components/ProductTable.js +1 -1
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/styles/admin-theme.css +35 -0
- package/dist/cart/store.d.ts +27 -0
- package/dist/cart/store.d.ts.map +1 -1
- package/dist/cart/store.js +59 -2
- package/dist/cart/store.js.map +1 -1
- package/dist/checkout/server/coupons.d.ts +91 -0
- package/dist/checkout/server/coupons.d.ts.map +1 -0
- package/dist/checkout/server/coupons.js +192 -0
- package/dist/checkout/server/coupons.js.map +1 -0
- package/dist/checkout/server/index.d.ts +2 -0
- package/dist/checkout/server/index.d.ts.map +1 -1
- package/dist/checkout/server/index.js +1 -0
- package/dist/checkout/server/index.js.map +1 -1
- package/dist/core/cookie-consent/CookieBanner.d.ts.map +1 -1
- package/dist/core/cookie-consent/CookieBanner.js +51 -15
- package/dist/core/cookie-consent/CookieBanner.js.map +1 -1
- package/dist/core/db/queries.d.ts +93 -15
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +147 -5
- package/dist/core/db/queries.js.map +1 -1
- package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -1
- package/dist/media/components/ImageGalleryUpload.js +9 -2
- package/dist/media/components/ImageGalleryUpload.js.map +1 -1
- package/dist/products/components/ProductCard.d.ts.map +1 -1
- package/dist/products/components/ProductCard.js +8 -1
- package/dist/products/components/ProductCard.js.map +1 -1
- package/dist/products/components/ProductGallery.d.ts.map +1 -1
- package/dist/products/components/ProductGallery.js +14 -3
- package/dist/products/components/ProductGallery.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/server/coupons
|
|
3
|
+
*
|
|
4
|
+
* Thin wrappers around Stripe Coupons + PromotionCodes APIs.
|
|
5
|
+
*
|
|
6
|
+
* Used by feature cards that need to issue discount codes:
|
|
7
|
+
* - M4 birthday discount automation
|
|
8
|
+
* - M5 win-back campaign
|
|
9
|
+
* - M7 bulk coupon generator
|
|
10
|
+
* - M10 spinner wheel reward
|
|
11
|
+
*
|
|
12
|
+
* Stripe model:
|
|
13
|
+
* Coupon (the discount itself: e.g. "10% off") → 1
|
|
14
|
+
* PromotionCode (a unique code like "BIRTHDAY-AB12") → 1..N per coupon
|
|
15
|
+
*
|
|
16
|
+
* Single-use codes: max_redemptions: 1 (default for these helpers).
|
|
17
|
+
* Bulk codes: each gets its own PromotionCode bound to a single shared
|
|
18
|
+
* coupon. 200ms throttle between PromotionCode creates respects Stripe's
|
|
19
|
+
* 25-req/s rate limit on this endpoint with comfortable headroom.
|
|
20
|
+
*
|
|
21
|
+
* NOTE: Coupons + PromotionCodes are platform-level (live on the Rovela
|
|
22
|
+
* Stripe account, NOT on the merchant's connected account). They apply
|
|
23
|
+
* via the existing Stripe Checkout Session flow when `allow_promotion_codes`
|
|
24
|
+
* is enabled. See checkout-session creation for that wiring.
|
|
25
|
+
*/
|
|
26
|
+
export interface CreateCouponWithCodeOptions {
|
|
27
|
+
/** Discount in cents (e.g. 1000 = $10 off). Mutually exclusive with `percentOff`. */
|
|
28
|
+
amountOff?: number;
|
|
29
|
+
/** Discount percentage (1–100). Mutually exclusive with `amountOff`. */
|
|
30
|
+
percentOff?: number;
|
|
31
|
+
/** ISO currency code (required when `amountOff` is set). */
|
|
32
|
+
currency?: string;
|
|
33
|
+
/** The promotion code string (e.g. "BIRTHDAY-AB12"). Auto-generated if omitted. */
|
|
34
|
+
code?: string;
|
|
35
|
+
/** Whether the coupon applies once or repeats. Defaults to 'once'. */
|
|
36
|
+
duration?: 'once' | 'forever';
|
|
37
|
+
/** Max redemptions for the PromotionCode. Defaults to 1 (single-use). */
|
|
38
|
+
maxRedemptions?: number;
|
|
39
|
+
/** Code expiration. Defaults to 30 days from creation. */
|
|
40
|
+
expiresAt?: Date;
|
|
41
|
+
/** Optional metadata attached to the coupon (Stripe limit: 50 keys / 500 chars). */
|
|
42
|
+
metadata?: Record<string, string>;
|
|
43
|
+
/** Human-readable name for Stripe dashboard. Optional. */
|
|
44
|
+
name?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface CreateCouponResult {
|
|
47
|
+
couponId: string;
|
|
48
|
+
promotionCodeId: string;
|
|
49
|
+
/** The actual code string customers enter at checkout. */
|
|
50
|
+
code: string;
|
|
51
|
+
}
|
|
52
|
+
export interface CreateBulkPromotionCodesOptions {
|
|
53
|
+
/** Discount in cents. Mutually exclusive with `percentOff`. */
|
|
54
|
+
amountOff?: number;
|
|
55
|
+
/** Discount percentage (1–100). */
|
|
56
|
+
percentOff?: number;
|
|
57
|
+
currency?: string;
|
|
58
|
+
/** Optional code prefix (e.g. "BFCM2026" → codes look like "BFCM2026-XYZ123"). */
|
|
59
|
+
prefix?: string;
|
|
60
|
+
/** Number of codes to create. Hard cap: 1000. */
|
|
61
|
+
count: number;
|
|
62
|
+
expiresAt?: Date;
|
|
63
|
+
metadata?: Record<string, string>;
|
|
64
|
+
name?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface CreateBulkResult {
|
|
67
|
+
couponId: string;
|
|
68
|
+
codes: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create a Stripe Coupon and a single PromotionCode bound to it.
|
|
72
|
+
*
|
|
73
|
+
* Use for one-off rewards: birthday code, win-back code, spinner-wheel win.
|
|
74
|
+
* For bulk distribution (1000 codes for an email blast), use
|
|
75
|
+
* `createBulkPromotionCodes` instead — it shares one coupon across all codes
|
|
76
|
+
* for cleaner Stripe dashboard accounting.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createCouponWithCode(options: CreateCouponWithCodeOptions): Promise<CreateCouponResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Create one Stripe Coupon and N PromotionCodes bound to it.
|
|
81
|
+
*
|
|
82
|
+
* Used for bulk-code campaigns (M7 coupon generator). All codes share the
|
|
83
|
+
* same coupon, so Stripe dashboard shows a single discount entry with a
|
|
84
|
+
* tally of redemptions — cleaner than N separate coupons.
|
|
85
|
+
*
|
|
86
|
+
* Hard cap: 1000 codes per call (Stripe rate-limits PromotionCode creation).
|
|
87
|
+
* Codes are created sequentially with a 200ms throttle (yields ~5/s, well
|
|
88
|
+
* under Stripe's 25/s limit on this endpoint).
|
|
89
|
+
*/
|
|
90
|
+
export declare function createBulkPromotionCodes(options: CreateBulkPromotionCodesOptions): Promise<CreateBulkResult>;
|
|
91
|
+
//# sourceMappingURL=coupons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupons.d.ts","sourceRoot":"","sources":["../../../src/checkout/server/coupons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,MAAM,WAAW,2BAA2B;IAC1C,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,+BAA+B;IAC9C,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAuDD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAgD7B;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,gBAAgB,CAAC,CA+F3B"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/checkout/server/coupons
|
|
3
|
+
*
|
|
4
|
+
* Thin wrappers around Stripe Coupons + PromotionCodes APIs.
|
|
5
|
+
*
|
|
6
|
+
* Used by feature cards that need to issue discount codes:
|
|
7
|
+
* - M4 birthday discount automation
|
|
8
|
+
* - M5 win-back campaign
|
|
9
|
+
* - M7 bulk coupon generator
|
|
10
|
+
* - M10 spinner wheel reward
|
|
11
|
+
*
|
|
12
|
+
* Stripe model:
|
|
13
|
+
* Coupon (the discount itself: e.g. "10% off") → 1
|
|
14
|
+
* PromotionCode (a unique code like "BIRTHDAY-AB12") → 1..N per coupon
|
|
15
|
+
*
|
|
16
|
+
* Single-use codes: max_redemptions: 1 (default for these helpers).
|
|
17
|
+
* Bulk codes: each gets its own PromotionCode bound to a single shared
|
|
18
|
+
* coupon. 200ms throttle between PromotionCode creates respects Stripe's
|
|
19
|
+
* 25-req/s rate limit on this endpoint with comfortable headroom.
|
|
20
|
+
*
|
|
21
|
+
* NOTE: Coupons + PromotionCodes are platform-level (live on the Rovela
|
|
22
|
+
* Stripe account, NOT on the merchant's connected account). They apply
|
|
23
|
+
* via the existing Stripe Checkout Session flow when `allow_promotion_codes`
|
|
24
|
+
* is enabled. See checkout-session creation for that wiring.
|
|
25
|
+
*/
|
|
26
|
+
import { nanoid } from 'nanoid';
|
|
27
|
+
import { getStripe } from '../stripe/client';
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Hard caps (DO NOT lift without re-reviewing Stripe rate limits)
|
|
30
|
+
// =============================================================================
|
|
31
|
+
const MAX_BULK_CODES = 1000;
|
|
32
|
+
const BULK_THROTTLE_MS = 200;
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Helpers
|
|
35
|
+
// =============================================================================
|
|
36
|
+
function generateCodeSegment(length = 6) {
|
|
37
|
+
// Crockford-base32-ish (skip ambiguous 0/O/1/I/L) — easier for humans to type.
|
|
38
|
+
const alphabet = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
|
|
39
|
+
return nanoid(length).replace(/[^A-Z0-9]/gi, () => alphabet[Math.floor(Math.random() * alphabet.length)]).toUpperCase().slice(0, length);
|
|
40
|
+
}
|
|
41
|
+
function buildCode(prefix) {
|
|
42
|
+
const segment = generateCodeSegment(8);
|
|
43
|
+
return prefix ? `${prefix}-${segment}` : segment;
|
|
44
|
+
}
|
|
45
|
+
function sleep(ms) {
|
|
46
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
47
|
+
}
|
|
48
|
+
function validateDiscountInputs(amountOff, percentOff, currency) {
|
|
49
|
+
const hasAmount = typeof amountOff === 'number' && amountOff > 0;
|
|
50
|
+
const hasPercent = typeof percentOff === 'number' && percentOff > 0;
|
|
51
|
+
if (hasAmount === hasPercent) {
|
|
52
|
+
throw new Error('createCoupon: provide exactly one of `amountOff` or `percentOff`.');
|
|
53
|
+
}
|
|
54
|
+
if (hasAmount && !currency) {
|
|
55
|
+
throw new Error('createCoupon: `currency` is required when using `amountOff`.');
|
|
56
|
+
}
|
|
57
|
+
if (hasPercent && (percentOff < 1 || percentOff > 100)) {
|
|
58
|
+
throw new Error('createCoupon: `percentOff` must be between 1 and 100.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Single coupon + code (1:1)
|
|
63
|
+
// =============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Create a Stripe Coupon and a single PromotionCode bound to it.
|
|
66
|
+
*
|
|
67
|
+
* Use for one-off rewards: birthday code, win-back code, spinner-wheel win.
|
|
68
|
+
* For bulk distribution (1000 codes for an email blast), use
|
|
69
|
+
* `createBulkPromotionCodes` instead — it shares one coupon across all codes
|
|
70
|
+
* for cleaner Stripe dashboard accounting.
|
|
71
|
+
*/
|
|
72
|
+
export async function createCouponWithCode(options) {
|
|
73
|
+
const { amountOff, percentOff, currency, code, duration = 'once', maxRedemptions = 1, expiresAt, metadata, name, } = options;
|
|
74
|
+
validateDiscountInputs(amountOff, percentOff, currency);
|
|
75
|
+
const stripe = getStripe();
|
|
76
|
+
// Default expiration: 30 days from now
|
|
77
|
+
const expires = expiresAt ?? new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
|
|
78
|
+
const redeemBy = Math.floor(expires.getTime() / 1000);
|
|
79
|
+
const coupon = await stripe.coupons.create({
|
|
80
|
+
duration,
|
|
81
|
+
...(amountOff && currency
|
|
82
|
+
? { amount_off: amountOff, currency }
|
|
83
|
+
: { percent_off: percentOff }),
|
|
84
|
+
redeem_by: redeemBy,
|
|
85
|
+
max_redemptions: maxRedemptions,
|
|
86
|
+
...(name && { name }),
|
|
87
|
+
...(metadata && { metadata }),
|
|
88
|
+
});
|
|
89
|
+
const finalCode = code ?? buildCode();
|
|
90
|
+
const promotionCode = await stripe.promotionCodes.create({
|
|
91
|
+
promotion: { type: 'coupon', coupon: coupon.id },
|
|
92
|
+
code: finalCode,
|
|
93
|
+
max_redemptions: maxRedemptions,
|
|
94
|
+
expires_at: redeemBy,
|
|
95
|
+
...(metadata && { metadata }),
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
couponId: coupon.id,
|
|
99
|
+
promotionCodeId: promotionCode.id,
|
|
100
|
+
code: finalCode,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// Bulk: one coupon, N codes (1:N)
|
|
105
|
+
// =============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Create one Stripe Coupon and N PromotionCodes bound to it.
|
|
108
|
+
*
|
|
109
|
+
* Used for bulk-code campaigns (M7 coupon generator). All codes share the
|
|
110
|
+
* same coupon, so Stripe dashboard shows a single discount entry with a
|
|
111
|
+
* tally of redemptions — cleaner than N separate coupons.
|
|
112
|
+
*
|
|
113
|
+
* Hard cap: 1000 codes per call (Stripe rate-limits PromotionCode creation).
|
|
114
|
+
* Codes are created sequentially with a 200ms throttle (yields ~5/s, well
|
|
115
|
+
* under Stripe's 25/s limit on this endpoint).
|
|
116
|
+
*/
|
|
117
|
+
export async function createBulkPromotionCodes(options) {
|
|
118
|
+
const { amountOff, percentOff, currency, prefix, count, expiresAt, metadata, name, } = options;
|
|
119
|
+
if (!Number.isInteger(count) || count < 1) {
|
|
120
|
+
throw new Error('createBulkPromotionCodes: `count` must be a positive integer.');
|
|
121
|
+
}
|
|
122
|
+
if (count > MAX_BULK_CODES) {
|
|
123
|
+
throw new Error(`createBulkPromotionCodes: maximum ${MAX_BULK_CODES} codes per call (got ${count}).`);
|
|
124
|
+
}
|
|
125
|
+
validateDiscountInputs(amountOff, percentOff, currency);
|
|
126
|
+
const stripe = getStripe();
|
|
127
|
+
const expires = expiresAt ?? new Date(Date.now() + 90 * 24 * 60 * 60 * 1000);
|
|
128
|
+
const redeemBy = Math.floor(expires.getTime() / 1000);
|
|
129
|
+
// Create the shared coupon once.
|
|
130
|
+
const coupon = await stripe.coupons.create({
|
|
131
|
+
duration: 'once',
|
|
132
|
+
...(amountOff && currency
|
|
133
|
+
? { amount_off: amountOff, currency }
|
|
134
|
+
: { percent_off: percentOff }),
|
|
135
|
+
redeem_by: redeemBy,
|
|
136
|
+
max_redemptions: count,
|
|
137
|
+
...(name && { name }),
|
|
138
|
+
...(metadata && { metadata }),
|
|
139
|
+
});
|
|
140
|
+
const codes = [];
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
for (let i = 0; i < count; i++) {
|
|
143
|
+
// Avoid collisions in case nanoid yields a dupe (extremely rare).
|
|
144
|
+
let candidate = buildCode(prefix);
|
|
145
|
+
let attempts = 0;
|
|
146
|
+
while (seen.has(candidate) && attempts < 5) {
|
|
147
|
+
candidate = buildCode(prefix);
|
|
148
|
+
attempts++;
|
|
149
|
+
}
|
|
150
|
+
seen.add(candidate);
|
|
151
|
+
try {
|
|
152
|
+
await stripe.promotionCodes.create({
|
|
153
|
+
promotion: { type: 'coupon', coupon: coupon.id },
|
|
154
|
+
code: candidate,
|
|
155
|
+
max_redemptions: 1,
|
|
156
|
+
expires_at: redeemBy,
|
|
157
|
+
...(metadata && { metadata }),
|
|
158
|
+
});
|
|
159
|
+
codes.push(candidate);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
// Rare: code collision on Stripe side. Try one more nanoid before
|
|
163
|
+
// giving up the slot. Don't fail the whole batch.
|
|
164
|
+
const retry = buildCode(prefix);
|
|
165
|
+
try {
|
|
166
|
+
await stripe.promotionCodes.create({
|
|
167
|
+
promotion: { type: 'coupon', coupon: coupon.id },
|
|
168
|
+
code: retry,
|
|
169
|
+
max_redemptions: 1,
|
|
170
|
+
expires_at: redeemBy,
|
|
171
|
+
...(metadata && { metadata }),
|
|
172
|
+
});
|
|
173
|
+
codes.push(retry);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Surface the original error so the caller can decide whether to
|
|
177
|
+
// continue with a partial batch or abort.
|
|
178
|
+
const remaining = count - codes.length;
|
|
179
|
+
throw new Error(`createBulkPromotionCodes: failed at code ${codes.length + 1} of ${count} (${remaining} remaining). ` +
|
|
180
|
+
`Original error: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Throttle every code except the last.
|
|
184
|
+
if (i < count - 1)
|
|
185
|
+
await sleep(BULK_THROTTLE_MS);
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
couponId: coupon.id,
|
|
189
|
+
codes,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=coupons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupons.js","sourceRoot":"","sources":["../../../src/checkout/server/coupons.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,4 +7,6 @@ export { createCheckoutSession, getCheckoutSession, deserializeItemsFromMetadata
|
|
|
7
7
|
export type { CreateCheckoutSessionOptions } from './create-checkout-session';
|
|
8
8
|
export { handleStripeWebhook } from './handle-webhook';
|
|
9
9
|
export { createOrderFromCheckout, extractOrderParamsFromSession, handleRefund, } from './order-service';
|
|
10
|
+
export { createCouponWithCode, createBulkPromotionCodes, } from './coupons';
|
|
11
|
+
export type { CreateCouponWithCodeOptions, CreateCouponResult, CreateBulkPromotionCodesOptions, CreateBulkResult, } from './coupons';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checkout/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA;AAElC,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,GACb,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checkout/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA;AAElC,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,GACb,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,2BAA2B,EAC3B,kBAAkB,EAClB,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,WAAW,CAAA"}
|
|
@@ -6,4 +6,5 @@
|
|
|
6
6
|
export { createCheckoutSession, getCheckoutSession, deserializeItemsFromMetadata, } from './create-checkout-session';
|
|
7
7
|
export { handleStripeWebhook } from './handle-webhook';
|
|
8
8
|
export { createOrderFromCheckout, extractOrderParamsFromSession, handleRefund, } from './order-service';
|
|
9
|
+
export { createCouponWithCode, createBulkPromotionCodes, } from './coupons';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checkout/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA;AAIlC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,GACb,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checkout/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA;AAIlC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,GACb,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,WAAW,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieBanner.d.ts","sourceRoot":"","sources":["../../../src/core/cookie-consent/CookieBanner.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"CookieBanner.d.ts","sourceRoot":"","sources":["../../../src/core/cookie-consent/CookieBanner.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,YAAY,mDAwG3B"}
|
|
@@ -72,13 +72,21 @@ export function CookieBanner() {
|
|
|
72
72
|
};
|
|
73
73
|
return (_jsxs("div", { role: "dialog", "aria-modal": "false", "aria-label": "Cookie consent", "aria-live": "polite", className: "rovela-cookie-banner", style: {
|
|
74
74
|
position: 'fixed',
|
|
75
|
-
bottom: '1rem',
|
|
76
|
-
left: '1rem',
|
|
77
75
|
zIndex: 2147483000,
|
|
78
|
-
// Anchor
|
|
79
|
-
//
|
|
80
|
-
//
|
|
76
|
+
// Anchor with iOS safe-area awareness — covers the home-indicator
|
|
77
|
+
// gesture area on iPhone X+ devices. `env()` falls back to `1rem`
|
|
78
|
+
// on browsers that don't support safe-area insets.
|
|
79
|
+
bottom: 'max(1rem, env(safe-area-inset-bottom, 1rem))',
|
|
80
|
+
left: 'max(1rem, env(safe-area-inset-left, 1rem))',
|
|
81
|
+
// `maxWidth` sizes the card; the absence of `right` + `margin: 0 auto`
|
|
82
|
+
// stops the browser from centering it via equal left/right insets.
|
|
83
|
+
// `maxHeight` + `overflowY: auto` is load-bearing — without it the
|
|
84
|
+
// banner can extend off-screen on landscape phones / foldables /
|
|
85
|
+
// short viewports (e.g. Layer 2 ~310px tall on iPhone SE landscape
|
|
86
|
+
// 568×320 → top of card off-screen, close button unreachable).
|
|
81
87
|
maxWidth: `min(${showPreferences ? '28rem' : '26rem'}, calc(100vw - 2rem))`,
|
|
88
|
+
maxHeight: 'calc(100vh - 2rem)',
|
|
89
|
+
overflowY: 'auto',
|
|
82
90
|
background: 'hsl(var(--card, 0 0% 100%))',
|
|
83
91
|
border: '1px solid hsl(var(--border, 220 13% 91%))',
|
|
84
92
|
borderRadius: '0.75rem',
|
|
@@ -109,7 +117,7 @@ function Layer2({ analytics, marketing, onAnalyticsChange, onMarketingChange, on
|
|
|
109
117
|
gap: '0.5rem',
|
|
110
118
|
marginTop: '1rem',
|
|
111
119
|
justifyContent: 'space-between',
|
|
112
|
-
}, children: [_jsxs("div", { style: { display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }, children: [_jsx("button", { type: "button", onClick: onAcceptAll, style: tertiaryButtonStyle, children: "Accept all" }), _jsx("button", { type: "button", onClick: onRejectAll, style: tertiaryButtonStyle, children: "Reject all" })] }), _jsx("button", { type: "button", onClick: onSave, style: primaryButtonStyle, children: "Save preferences" })] })] }));
|
|
120
|
+
}, children: [_jsxs("div", { style: { display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }, children: [_jsx("button", { type: "button", onClick: onAcceptAll, style: tertiaryButtonStyle, children: "Accept all" }), _jsx("button", { type: "button", onClick: onRejectAll, style: tertiaryButtonStyle, children: "Reject all" })] }), _jsx("button", { type: "button", onClick: onSave, style: { ...primaryButtonStyle, flex: '0 1 auto' }, children: "Save preferences" })] })] }));
|
|
113
121
|
}
|
|
114
122
|
function CategoryRow({ title, description, checked, onChange, locked, }) {
|
|
115
123
|
return (_jsxs("div", { style: {
|
|
@@ -126,18 +134,36 @@ function CategoryRow({ title, description, checked, onChange, locked, }) {
|
|
|
126
134
|
lineHeight: 1.45,
|
|
127
135
|
color: 'hsl(var(--muted-foreground, 215 16% 47%))',
|
|
128
136
|
}, children: description })] }), _jsx("label", { style: {
|
|
137
|
+
// 44×44 hit area meets WCAG / Apple HIG / Material guidance.
|
|
138
|
+
// Negative margin cancels the parent CategoryRow's padding so
|
|
139
|
+
// the visual layout is unchanged — only the underlying tap
|
|
140
|
+
// area expands. flexShrink: 0 protects the checkbox from being
|
|
141
|
+
// squeezed when localized title/description text is long.
|
|
129
142
|
display: 'inline-flex',
|
|
130
143
|
alignItems: 'center',
|
|
131
|
-
|
|
144
|
+
justifyContent: 'center',
|
|
145
|
+
width: '2.75rem',
|
|
146
|
+
height: '2.75rem',
|
|
147
|
+
margin: '-0.75rem',
|
|
148
|
+
flexShrink: 0,
|
|
132
149
|
cursor: locked ? 'not-allowed' : 'pointer',
|
|
133
150
|
opacity: locked ? 0.6 : 1,
|
|
134
|
-
}, children: _jsx("input", { type: "checkbox", checked: checked, disabled: locked, onChange: (e) => onChange?.(e.target.checked), "aria-label": `Allow ${title.toLowerCase()} cookies`, style: {
|
|
151
|
+
}, children: _jsx("input", { type: "checkbox", checked: checked, disabled: locked, onChange: (e) => onChange?.(e.target.checked), "aria-label": `Allow ${title.toLowerCase()} cookies`, style: {
|
|
152
|
+
width: '1.125rem',
|
|
153
|
+
height: '1.125rem',
|
|
154
|
+
accentColor: 'hsl(var(--accent, 142 71% 45%))',
|
|
155
|
+
cursor: locked ? 'not-allowed' : 'pointer',
|
|
156
|
+
} }) })] }));
|
|
135
157
|
}
|
|
136
158
|
// =============================================================================
|
|
137
159
|
// Inline styles — kept together so CSS-reset strips can't wreck them
|
|
138
160
|
// =============================================================================
|
|
139
161
|
const titleStyle = {
|
|
140
162
|
margin: 0,
|
|
163
|
+
// Right padding clears space for the close button (now positioned
|
|
164
|
+
// inside the card at top-right with a 44×44 hit area), so the title
|
|
165
|
+
// never bleeds underneath it.
|
|
166
|
+
paddingRight: '2.5rem',
|
|
141
167
|
fontSize: '1rem',
|
|
142
168
|
fontWeight: 600,
|
|
143
169
|
lineHeight: 1.3,
|
|
@@ -176,7 +202,11 @@ const secondaryButtonStyle = {
|
|
|
176
202
|
cursor: 'pointer',
|
|
177
203
|
};
|
|
178
204
|
const tertiaryButtonStyle = {
|
|
179
|
-
flex:
|
|
205
|
+
// `flex: 1 1 auto` (was 0 1 auto) so wrapped buttons grow to fill their
|
|
206
|
+
// row at narrow widths instead of leaving an awkward half-empty line.
|
|
207
|
+
// At wide widths flex-wrap doesn't trigger so behavior is identical
|
|
208
|
+
// to before.
|
|
209
|
+
flex: '1 1 auto',
|
|
180
210
|
padding: '0.5rem 1rem',
|
|
181
211
|
fontSize: '0.875rem',
|
|
182
212
|
fontWeight: 500,
|
|
@@ -188,20 +218,26 @@ const tertiaryButtonStyle = {
|
|
|
188
218
|
};
|
|
189
219
|
const closeButtonStyle = {
|
|
190
220
|
position: 'absolute',
|
|
191
|
-
top:
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
221
|
+
// Moved INSIDE the card (was top/right: -0.25rem outside the corner).
|
|
222
|
+
// The previous outside-position meant the close button was the first
|
|
223
|
+
// thing clipped when the card extended to the viewport edge — making
|
|
224
|
+
// the banner undismissable on short viewports.
|
|
225
|
+
top: '0.5rem',
|
|
226
|
+
right: '0.5rem',
|
|
227
|
+
// 44×44 hit area meets WCAG/Apple HIG/Material guidance. The visible
|
|
228
|
+
// × glyph is sized via fontSize; the surrounding tap area is the box.
|
|
229
|
+
width: '2.75rem',
|
|
230
|
+
height: '2.75rem',
|
|
195
231
|
display: 'flex',
|
|
196
232
|
alignItems: 'center',
|
|
197
233
|
justifyContent: 'center',
|
|
198
234
|
padding: 0,
|
|
199
|
-
fontSize: '1.
|
|
235
|
+
fontSize: '1.5rem',
|
|
200
236
|
lineHeight: 1,
|
|
201
237
|
color: 'hsl(var(--muted-foreground, 215 16% 47%))',
|
|
202
238
|
background: 'transparent',
|
|
203
239
|
border: 'none',
|
|
204
|
-
borderRadius: '0.
|
|
240
|
+
borderRadius: '0.375rem',
|
|
205
241
|
cursor: 'pointer',
|
|
206
242
|
};
|
|
207
243
|
//# sourceMappingURL=CookieBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieBanner.js","sourceRoot":"","sources":["../../../src/core/cookie-consent/CookieBanner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,UAAU,YAAY;IAC1B,MAAM,EACJ,OAAO,EACP,UAAU,EACV,cAAc,EACd,eAAe,EACf,MAAM,EACN,gBAAgB,GACjB,GAAG,iBAAiB,EAAE,CAAA;IAEvB,8DAA8D;IAC9D,oDAAoD;IACpD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,kEAAkE;IAClE,gEAAgE;IAChE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,eAAe,IAAI,UAAU,EAAE,CAAC;YAClC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YACtC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IAEvE,gBAAgB;IAChB,IAAI,cAAc;QAAE,OAAO,IAAI,CAAA;IAE/B,MAAM,UAAU,GAAG,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,CAAA;IACjE,MAAM,eAAe,GAAG,UAAU,IAAI,eAAe,CAAA;IAErD,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAA;IAEhD,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,gBAAgB,EAAE,CAAA;IACpB,CAAC,CAAA;IACD,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,gBAAgB,EAAE,CAAA;IACpB,CAAC,CAAA;IACD,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,MAAM,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;QACpE,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,gBAAgB,EAAE,CAAA;IACpB,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,qDAAqD;QACrD,eAAe,EAAE,CAAA;IACnB,CAAC,CAAA;IAED,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,gBACF,OAAO,gBACP,gBAAgB,eACjB,QAAQ,EAClB,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"CookieBanner.js","sourceRoot":"","sources":["../../../src/core/cookie-consent/CookieBanner.tsx"],"names":[],"mappings":"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"}
|