@alfadocs/ui-kit-debug 0.2.0 → 0.2.2

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 (64) hide show
  1. package/dist/_chunks/{chat-input-DOlsB1fm.js → chat-input-Bov-gkwP.js} +40 -38
  2. package/dist/_chunks/{chat-input-DOlsB1fm.js.map → chat-input-Bov-gkwP.js.map} +1 -1
  3. package/dist/_chunks/{combobox-DCNXqbC7.js → combobox-BLWruOxK.js} +74 -75
  4. package/dist/_chunks/combobox-BLWruOxK.js.map +1 -0
  5. package/dist/_chunks/{freemium-paywall-CnvceDav.js → freemium-paywall-CrVefV0M.js} +2 -2
  6. package/dist/_chunks/{freemium-paywall-CnvceDav.js.map → freemium-paywall-CrVefV0M.js.map} +1 -1
  7. package/dist/_chunks/{leo-sidebar-CfEY-xi2.js → leo-sidebar-kHO45M6C.js} +2 -2
  8. package/dist/_chunks/{leo-sidebar-CfEY-xi2.js.map → leo-sidebar-kHO45M6C.js.map} +1 -1
  9. package/dist/_chunks/{link-8QmFjIz2.js → link-BcYW1eNM.js} +48 -32
  10. package/dist/_chunks/link-BcYW1eNM.js.map +1 -0
  11. package/dist/_chunks/{message-card-ChCX9Iv6.js → message-card-DjvsB_3U.js} +12 -12
  12. package/dist/_chunks/message-card-DjvsB_3U.js.map +1 -0
  13. package/dist/_chunks/{message-tray-n8q9ITXI.js → message-tray-BbnAzlLH.js} +23 -23
  14. package/dist/_chunks/{message-tray-n8q9ITXI.js.map → message-tray-BbnAzlLH.js.map} +1 -1
  15. package/dist/_chunks/{notification-card-hBlPN1-c.js → notification-card-uTPEvAQS.js} +21 -21
  16. package/dist/_chunks/notification-card-uTPEvAQS.js.map +1 -0
  17. package/dist/_chunks/{notification-tray-C5cnXbl9.js → notification-tray-PGtMqXbP.js} +56 -56
  18. package/dist/_chunks/{notification-tray-C5cnXbl9.js.map → notification-tray-PGtMqXbP.js.map} +1 -1
  19. package/dist/_chunks/{payment-form-C3vT_npe.js → payment-form-B_BdHwjb.js} +21 -21
  20. package/dist/_chunks/{payment-form-C3vT_npe.js.map → payment-form-B_BdHwjb.js.map} +1 -1
  21. package/dist/_chunks/transaction-chip-DE6DITun.js +196 -0
  22. package/dist/_chunks/transaction-chip-DE6DITun.js.map +1 -0
  23. package/dist/agent-catalog.json +15 -1
  24. package/dist/components/chat-input/chat-input.d.ts.map +1 -1
  25. package/dist/components/chat-input/index.js +1 -1
  26. package/dist/components/combobox/combobox.d.ts.map +1 -1
  27. package/dist/components/combobox/index.js +1 -1
  28. package/dist/components/freemium-paywall/index.js +1 -1
  29. package/dist/components/index.d.ts +1 -0
  30. package/dist/components/index.d.ts.map +1 -1
  31. package/dist/components/link/index.js +1 -1
  32. package/dist/components/link/link.d.ts +1 -0
  33. package/dist/components/link/link.d.ts.map +1 -1
  34. package/dist/components/message-card/index.js +1 -1
  35. package/dist/components/message-card/message-card.d.ts.map +1 -1
  36. package/dist/components/message-tray/index.js +1 -1
  37. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  38. package/dist/components/notification-card/index.js +1 -1
  39. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  40. package/dist/components/notification-tray/index.js +1 -1
  41. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  42. package/dist/components/payment-form/index.js +1 -1
  43. package/dist/components/transaction-chip/index.d.ts +3 -0
  44. package/dist/components/transaction-chip/index.d.ts.map +1 -0
  45. package/dist/components/transaction-chip/index.js +5 -0
  46. package/dist/components/transaction-chip/index.js.map +1 -0
  47. package/dist/components/transaction-chip/transaction-chip.d.ts +30 -0
  48. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -0
  49. package/dist/i18n/config.js +36 -0
  50. package/dist/i18n/config.js.map +1 -1
  51. package/dist/i18n/resources.d.ts +36 -0
  52. package/dist/i18n/resources.d.ts.map +1 -1
  53. package/dist/index.js +34 -32
  54. package/dist/index.js.map +1 -1
  55. package/dist/locales/de.json +12 -0
  56. package/dist/locales/en.json +12 -0
  57. package/dist/locales/it.json +12 -0
  58. package/dist/patterns/leo-assistant/index.js +1 -1
  59. package/dist/tokens.css +1 -1
  60. package/package.json +1 -1
  61. package/dist/_chunks/combobox-DCNXqbC7.js.map +0 -1
  62. package/dist/_chunks/link-8QmFjIz2.js.map +0 -1
  63. package/dist/_chunks/message-card-ChCX9Iv6.js.map +0 -1
  64. package/dist/_chunks/notification-card-hBlPN1-c.js.map +0 -1
@@ -1,14 +1,14 @@
1
1
  import { jsx as o, jsxs as I } from "react/jsx-runtime";
2
- import { forwardRef as $e, useContext as ke, useState as M, useMemo as Q, useRef as v, useLayoutEffect as Oe, useEffect as E, useCallback as Ve } from "react";
2
+ import { forwardRef as $e, useContext as ke, useState as G, useMemo as M, useRef as v, useLayoutEffect as Oe, useEffect as E, useCallback as Ve } from "react";
3
3
  import * as F from "@radix-ui/react-popover";
4
4
  import { R as qe, _ as u, P as Be } from "./index-4xgbg-sn.js";
5
5
  import { c as D } from "./index-D2ZczOXr.js";
6
6
  import { useTranslation as Ue } from "react-i18next";
7
7
  import { u as He, F as Ge } from "./form-field-context-B3APVHKx.js";
8
8
  import { c as Me } from "./compose-refs-C0k0tdqF.js";
9
- import { n as K } from "./normalize-diacritics-BNGbFNlJ.js";
10
- import { g as Qe } from "./group-options-BvKhQ3xb.js";
11
- import { I as Ke, a as L, d as X, c as Le } from "./input-surface-u4QB0lxe.js";
9
+ import { n as L } from "./normalize-diacritics-BNGbFNlJ.js";
10
+ import { g as Le } from "./group-options-BvKhQ3xb.js";
11
+ import { I as Qe, a as Q, d as K, c as Ke } from "./input-surface-u4QB0lxe.js";
12
12
  import { u as Xe } from "./registry-C9nwlNyL.js";
13
13
  import { X as We } from "./x-CCcI3eJp.js";
14
14
  import { C as Je } from "./check-DPdL_Sm7.js";
@@ -104,16 +104,16 @@ const Ye = {
104
104
  ), et = D(
105
105
  [
106
106
  "ds:group ds:relative ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:w-full",
107
- Le
107
+ Ke
108
108
  ].join(" "),
109
109
  {
110
110
  variants: {
111
111
  size: {
112
- sm: `${L.sm} ${X.sm}`,
113
- md: `${L.md} ${X.md}`,
114
- lg: `${L.lg} ${X.lg}`
112
+ sm: `${Q.sm} ${K.sm}`,
113
+ md: `${Q.md} ${K.md}`,
114
+ lg: `${Q.lg} ${K.lg}`
115
115
  },
116
- tone: Ke
116
+ tone: Qe
117
117
  },
118
118
  defaultVariants: {
119
119
  size: "md",
@@ -132,7 +132,7 @@ const Ye = {
132
132
  "ds:data-[side=top]:slide-in-from-bottom-2",
133
133
  "ds:motion-reduce:animate-none"
134
134
  ].join(" ")
135
- ), re = D(
135
+ ), ae = D(
136
136
  [
137
137
  "ds:relative ds:flex ds:cursor-pointer ds:items-center ds:gap-[var(--spacing-sm)]",
138
138
  "ds:rounded-[var(--radius-sm)]",
@@ -176,7 +176,7 @@ function at({
176
176
  keywords: [],
177
177
  forceMount: !0,
178
178
  onSelect: () => j(s),
179
- className: re({ size: P }),
179
+ className: ae({ size: P }),
180
180
  children: [
181
181
  /* @__PURE__ */ o(
182
182
  "span",
@@ -190,66 +190,66 @@ function at({
190
190
  }
191
191
  );
192
192
  }
193
- const ae = $e(
193
+ const ie = $e(
194
194
  function({
195
195
  options: r,
196
196
  value: y,
197
197
  defaultValue: P,
198
198
  onValueChange: j,
199
- placeholder: W,
199
+ placeholder: X,
200
200
  clearable: A = !1,
201
- disabled: ie,
202
- readOnly: de,
203
- required: le,
204
- name: ce,
201
+ disabled: de,
202
+ readOnly: le,
203
+ required: ce,
204
+ name: ue,
205
205
  id: T,
206
206
  size: x = "md",
207
- tone: ue = "default",
207
+ tone: me = "default",
208
208
  filter: $,
209
- allowCreate: me = !1,
209
+ allowCreate: fe = !1,
210
210
  onCreate: k,
211
- open: J,
211
+ open: W,
212
212
  onOpenChange: m,
213
- emptyMessage: fe,
214
- className: pe,
215
- "aria-label": O
216
- }, be) {
217
- const { t: C } = Ue(), h = He(), N = ke(Ge) !== null, [he, V] = M(
213
+ emptyMessage: pe,
214
+ className: be,
215
+ "aria-label": J
216
+ }, he) {
217
+ const { t: C } = Ue(), h = He(), N = ke(Ge) !== null, [ge, O] = G(
218
218
  y ?? P ?? ""
219
- ), z = y !== void 0, f = z ? y : he, q = Q(
219
+ ), z = y !== void 0, f = z ? y : ge, V = M(
220
220
  () => r.find((e) => e.value === f),
221
221
  [r, f]
222
- ), S = (q == null ? void 0 : q.label) ?? "", [p, i] = M(S), [ge, Y] = M(!1), R = J !== void 0, d = R ? J : ge, w = v(!1), _ = v(null), Z = v(null);
222
+ ), S = (V == null ? void 0 : V.label) ?? "", [p, i] = G(S), [ve, Y] = G(!1), R = W !== void 0, d = R ? W : ve, w = v(!1), _ = v(null), Z = v(null);
223
223
  Oe(() => {
224
224
  var e;
225
225
  (e = _.current) == null || e.setAttribute("aria-expanded", String(d));
226
226
  }), E(() => {
227
227
  d || i(S);
228
228
  }, [S, d]);
229
- const ve = T ?? (N ? h.id : void 0), B = (N ? h.disabled : !1) || !!ie, g = !!de, ye = (N ? h.required : !1) || !!le, ee = N ? h.invalid : !1, xe = ee ? "error" : ue, Ce = N && h.describedBy ? h.describedBy : void 0, Ne = W ?? C("ui.inputs.combobox.placeholder", "Search…"), ze = Q(
229
+ const ye = T ?? (N ? h.id : void 0), q = (N ? h.disabled : !1) || !!de, g = !!le, xe = (N ? h.required : !1) || !!ce, ee = N ? h.invalid : !1, Ce = ee ? "error" : me, Ne = N && h.describedBy ? h.describedBy : void 0, te = X ?? C("ui.inputs.combobox.placeholder", "Search…"), ze = M(
230
230
  () => (e, t, n) => {
231
231
  if (w.current) return 1;
232
- const b = K(e), a = K(t), G = n == null ? void 0 : n.map(K);
232
+ const b = L(e), a = L(t), H = n == null ? void 0 : n.map(L);
233
233
  return $ ? $(b, a) : qe(
234
234
  b,
235
235
  a,
236
- G
236
+ H
237
237
  );
238
238
  },
239
239
  [$]
240
- ), l = j, te = (e) => {
241
- z || V(e), l == null || l(e);
240
+ ), l = j, se = (e) => {
241
+ z || O(e), l == null || l(e);
242
242
  }, c = (e) => {
243
243
  R || Y(e), m == null || m(e);
244
244
  }, Se = (e) => {
245
245
  const t = r.find((n) => n.value === e);
246
- te(e), i((t == null ? void 0 : t.label) ?? ""), c(!1);
246
+ se(e), i((t == null ? void 0 : t.label) ?? ""), c(!1);
247
247
  }, Ie = (e) => {
248
248
  k == null || k(e), c(!1);
249
249
  }, Re = (e) => {
250
250
  g || (i(e), !d && e.length > 0 && !w.current && c(!0));
251
251
  }, we = () => {
252
- !B && !g && c(!0);
252
+ !q && !g && c(!0);
253
253
  }, _e = () => {
254
254
  w.current = !0;
255
255
  }, Ee = () => {
@@ -261,34 +261,34 @@ const ae = $e(
261
261
  e.nativeEvent.isComposing || e.key === "Escape" && d && (e.preventDefault(), c(!1), i(S));
262
262
  }, De = (e) => {
263
263
  var t;
264
- e.preventDefault(), e.stopPropagation(), te(""), i(""), c(!0), (t = _.current) == null || t.focus();
264
+ e.preventDefault(), e.stopPropagation(), se(""), i(""), c(!0), (t = _.current) == null || t.focus();
265
265
  }, Pe = (e) => {
266
266
  g && e || (c(e), e || i(S));
267
- }, se = v(f);
267
+ }, oe = v(f);
268
268
  E(() => {
269
- se.current = f;
269
+ oe.current = f;
270
270
  }, [f]);
271
- const oe = v(p);
271
+ const ne = v(p);
272
272
  E(() => {
273
- oe.current = p;
273
+ ne.current = p;
274
274
  }, [p]);
275
- const ne = v(d);
275
+ const re = v(d);
276
276
  E(() => {
277
- ne.current = d;
277
+ re.current = d;
278
278
  }, [d]);
279
- const U = Ve(
279
+ const B = Ve(
280
280
  (e) => {
281
281
  R || Y(e), m == null || m(e);
282
282
  },
283
283
  [R, m]
284
- ), je = Q(
284
+ ), je = M(
285
285
  () => ({
286
- getValue: () => se.current || null,
287
- getQuery: () => oe.current,
288
- getIsOpen: () => ne.current,
286
+ getValue: () => oe.current || null,
287
+ getQuery: () => ne.current,
288
+ getIsOpen: () => re.current,
289
289
  setValue: (e) => {
290
290
  const t = e ?? "";
291
- z || V(t), l == null || l(t);
291
+ z || O(t), l == null || l(t);
292
292
  const n = r.find((b) => b.value === t);
293
293
  i((n == null ? void 0 : n.label) ?? "");
294
294
  },
@@ -296,22 +296,22 @@ const ae = $e(
296
296
  i(e);
297
297
  },
298
298
  clear: () => {
299
- z || V(""), l == null || l(""), i("");
299
+ z || O(""), l == null || l(""), i("");
300
300
  },
301
- open: () => U(!0),
302
- close: () => U(!1)
301
+ open: () => B(!0),
302
+ close: () => B(!1)
303
303
  }),
304
- [l, z, r, U]
304
+ [l, z, r, B]
305
305
  );
306
306
  Xe(Ye, je, T);
307
- const Ae = A && !!f && !B && !g, Te = Qe(r), H = rt[x];
307
+ const Ae = A && !!f && !q && !g, Te = Le(r), U = rt[x];
308
308
  return /* @__PURE__ */ o(F.Root, { open: d, onOpenChange: Pe, children: /* @__PURE__ */ I(
309
309
  u,
310
310
  {
311
311
  filter: ze,
312
312
  shouldFilter: !0,
313
313
  loop: !0,
314
- label: O,
314
+ label: J ?? te,
315
315
  className: "ds:w-full",
316
316
  children: [
317
317
  /* @__PURE__ */ o(F.Anchor, { asChild: !0, children: /* @__PURE__ */ I(
@@ -320,8 +320,8 @@ const ae = $e(
320
320
  ref: Z,
321
321
  className: et({
322
322
  size: x,
323
- tone: xe,
324
- className: pe
323
+ tone: Ce,
324
+ className: be
325
325
  }),
326
326
  "data-component": "combobox",
327
327
  "data-component-id": T,
@@ -329,17 +329,16 @@ const ae = $e(
329
329
  /* @__PURE__ */ o(
330
330
  u.Input,
331
331
  {
332
- ref: Me(be, _),
332
+ ref: Me(he, _),
333
333
  value: p,
334
334
  onValueChange: Re,
335
- id: ve,
336
- name: ce,
337
- placeholder: Ne,
338
- disabled: B,
335
+ id: ye,
336
+ name: ue,
337
+ placeholder: te,
338
+ disabled: q,
339
339
  readOnly: g,
340
- required: ye,
341
- "aria-label": O,
342
- "aria-describedby": Ce,
340
+ required: xe,
341
+ "aria-describedby": Ne,
343
342
  "aria-invalid": ee || void 0,
344
343
  onFocus: we,
345
344
  onKeyDown: Fe,
@@ -374,7 +373,7 @@ const ae = $e(
374
373
  {
375
374
  forceMount: !0,
376
375
  hidden: !d,
377
- "aria-label": O ?? C("ui.inputs.combobox.popupLabel", "Options"),
376
+ "aria-label": J ?? C("ui.inputs.combobox.popupLabel", "Options"),
378
377
  onOpenAutoFocus: (e) => e.preventDefault(),
379
378
  onCloseAutoFocus: (e) => e.preventDefault(),
380
379
  onInteractOutside: (e) => {
@@ -386,10 +385,10 @@ const ae = $e(
386
385
  align: "start",
387
386
  className: tt(),
388
387
  children: /* @__PURE__ */ I(u.List, { className: ot, children: [
389
- /* @__PURE__ */ o(u.Empty, { className: nt, children: fe ?? C("ui.inputs.combobox.empty", "No results found") }),
388
+ /* @__PURE__ */ o(u.Empty, { className: nt, children: pe ?? C("ui.inputs.combobox.empty", "No results found") }),
390
389
  Te.map(({ group: e, items: t }, n) => {
391
390
  const b = t.map((a) => {
392
- const G = a.value === f;
391
+ const H = a.value === f;
393
392
  return /* @__PURE__ */ I(
394
393
  u.Item,
395
394
  {
@@ -397,14 +396,14 @@ const ae = $e(
397
396
  keywords: [a.label],
398
397
  disabled: a.disabled,
399
398
  onSelect: Se,
400
- className: re({ size: x }),
399
+ className: ae({ size: x }),
401
400
  children: [
402
401
  /* @__PURE__ */ o(
403
402
  "span",
404
403
  {
405
404
  "aria-hidden": "true",
406
- className: `ds:inline-flex ds:items-center ds:justify-center ${H}`,
407
- children: G ? /* @__PURE__ */ o(Je, { className: H }) : null
405
+ className: `ds:inline-flex ds:items-center ds:justify-center ${U}`,
406
+ children: H ? /* @__PURE__ */ o(Je, { className: U }) : null
408
407
  }
409
408
  ),
410
409
  /* @__PURE__ */ o("span", { className: "ds:flex-1 ds:truncate", children: a.label }),
@@ -423,7 +422,7 @@ const ae = $e(
423
422
  `group-${e}`
424
423
  ) : /* @__PURE__ */ o(u.Group, { children: b }, `group-${n}`);
425
424
  }),
426
- me && p.length > 0 ? /* @__PURE__ */ o(
425
+ fe && p.length > 0 ? /* @__PURE__ */ o(
427
426
  at,
428
427
  {
429
428
  search: p,
@@ -434,7 +433,7 @@ const ae = $e(
434
433
  value: p
435
434
  }
436
435
  ),
437
- iconClass: H,
436
+ iconClass: U,
438
437
  size: x,
439
438
  onSelect: Ie
440
439
  }
@@ -447,14 +446,14 @@ const ae = $e(
447
446
  ) });
448
447
  }
449
448
  );
450
- ae.displayName = "Combobox";
451
- const xt = ae;
449
+ ie.displayName = "Combobox";
450
+ const xt = ie;
452
451
  export {
453
452
  xt as C,
454
453
  tt as a,
455
454
  Ze as b,
456
455
  Ye as c,
457
- re as d,
456
+ ae as d,
458
457
  et as e
459
458
  };
460
- //# sourceMappingURL=combobox-DCNXqbC7.js.map
459
+ //# sourceMappingURL=combobox-BLWruOxK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox-BLWruOxK.js","sources":["../../src/components/combobox/combobox.agent.ts","../../src/components/combobox/combobox.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { ComboboxHandle } from './combobox';\n\nexport const comboboxAgent: AgentAdapter<ComboboxHandle> = {\n id: 'combobox',\n capabilities: ['select_single', 'pick', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string | null',\n description:\n 'Currently-selected option value, or null when nothing is selected.',\n read: (handle) => handle.getValue(),\n },\n query: {\n type: 'string',\n description: 'Current filter query in the combobox input.',\n read: (handle) => handle.getQuery(),\n },\n isOpen: {\n type: 'boolean',\n description: 'True when the option list is visible.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n set_value: {\n safety: 'read',\n argsType: '{ value: string | null }',\n description: 'Set the selected value programmatically.',\n invoke: (handle, args: { value: string | null }) => {\n handle.setValue(args.value);\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ query: string }',\n description: 'Set the filter query for the option list.',\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n clear_selection: {\n safety: 'read',\n description: 'Clear the current selection.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n description: 'Open the option list.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n description: 'Close the option list.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'combobox' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description: 'Each option emits its value as data-option-id.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport * as Popover from '@radix-ui/react-popover';\nimport { Command, defaultFilter, useCommandState } from 'cmdk';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, X } from 'lucide-react';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport type { OptionShape } from '../_shared/option';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { normalizeDiacritics } from '../_shared/normalize-diacritics';\nimport { groupOptions } from '../_shared/group-options';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TONE,\n} from '../_shared/input-surface';\nimport { useAgentRegistration } from '../../agent';\nimport { comboboxAgent } from './combobox.agent';\n\nexport type ComboboxOption<T extends string = string> = OptionShape<T>;\n\n// Curated agent-readiness handle — see combobox.agent.ts.\nexport interface ComboboxHandle {\n getValue: () => string | null;\n getQuery: () => string;\n getIsOpen: () => boolean;\n setValue: (value: string | null) => void;\n setQuery: (query: string) => void;\n clear: () => void;\n open: () => void;\n close: () => void;\n}\n\nexport interface ComboboxProps<T extends string = string> {\n options: ComboboxOption<T>[];\n value?: T | '';\n defaultValue?: T;\n onValueChange?: (value: T | '') => void;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n filter?: (value: string, search: string) => number;\n allowCreate?: boolean;\n onCreate?: (value: string) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n emptyMessage?: ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nconst comboboxInputVariants = cva(\n [\n 'ds:peer ds:w-full ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:outline-none ds:border-0',\n 'ds:disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst comboboxWrapperVariants = cva(\n [\n 'ds:group ds:relative ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:w-full',\n INPUT_SURFACE_CHROME,\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ${INPUT_SURFACE_PADDING_X.sm}`,\n md: `${INPUT_SURFACE_HEIGHT.md} ${INPUT_SURFACE_PADDING_X.md}`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ${INPUT_SURFACE_PADDING_X.lg}`,\n },\n tone: INPUT_SURFACE_TONE,\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n },\n },\n);\n\nconst comboboxContentVariants = cva(\n [\n 'ds:z-[var(--z-popover)] ds:overflow-hidden ds:w-[var(--radix-popover-trigger-width)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-background ds:text-foreground',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2',\n 'ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst comboboxItemVariants = cva(\n [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-foreground ds:outline-none ds:select-none',\n 'ds:data-[highlighted]:bg-muted ds:data-[highlighted]:text-foreground',\n 'ds:data-[highlighted]:border-s-2 ds:data-[highlighted]:border-s-primary',\n 'ds:aria-selected:bg-muted',\n 'ds:aria-disabled:pointer-events-none ds:aria-disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-12 ds:ps-4 ds:pe-4 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst comboboxGroupHeadingClasses = [\n 'ds:ps-3 ds:pe-3 ds:py-1.5',\n 'type-eyebrow ds:text-muted-foreground',\n].join(' ');\n\nconst comboboxListClasses =\n 'ds:max-h-[18rem] ds:overflow-y-auto ds:p-[var(--spacing-xs)]';\n\nconst comboboxEmptyClasses =\n 'ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground';\n\nconst iconSizeBySize = {\n sm: 'ds:size-3.5',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n} as const;\n\ninterface CreateRowProps {\n search: string;\n label: string;\n iconClass: string;\n size: 'sm' | 'md' | 'lg';\n onSelect: (value: string) => void;\n}\n\nfunction ComboboxCreateRow({\n search,\n label,\n iconClass,\n size,\n onSelect,\n}: CreateRowProps): ReactElement | null {\n // Only surface the create row when no existing item matches the query.\n const filteredCount = useCommandState((state) => state.filtered.count);\n if (filteredCount > 0) return null;\n return (\n <Command.Item\n value={`__combobox-create__${search}`}\n keywords={[]}\n forceMount\n onSelect={() => onSelect(search)}\n className={comboboxItemVariants({ size })}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconClass}`}\n />\n <span className=\"ds:flex-1 ds:truncate\">{label}</span>\n </Command.Item>\n );\n}\n\nconst ComboboxImpl = forwardRef<HTMLInputElement, ComboboxProps>(\n function Combobox(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder,\n clearable = false,\n disabled,\n readOnly,\n required,\n name,\n id,\n size = 'md',\n tone = 'default',\n filter: externalFilter,\n allowCreate = false,\n onCreate,\n open: openProp,\n onOpenChange,\n emptyMessage,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const [internalValue, setInternalValue] = useState<string>(\n value ?? defaultValue ?? '',\n );\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const selectedOption = useMemo(\n () => options.find((o) => o.value === currentValue),\n [options, currentValue],\n );\n const selectedLabel = selectedOption?.label ?? '';\n\n const [search, setSearch] = useState<string>(selectedLabel);\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpenControlled = openProp !== undefined;\n const open = isOpenControlled ? openProp : internalOpen;\n const composingRef = useRef(false);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n inputRef.current?.setAttribute('aria-expanded', String(open));\n });\n\n useEffect(() => {\n if (!open) {\n setSearch(selectedLabel);\n }\n }, [selectedLabel, open]);\n\n const inputId = id ?? (inFormField ? ctx.id : undefined);\n const effectiveDisabled =\n (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveReadOnly = Boolean(readOnly);\n const effectiveRequired =\n (inFormField ? ctx.required : false) || Boolean(required);\n const effectiveInvalid = inFormField ? ctx.invalid : false;\n const effectiveTone = effectiveInvalid ? 'error' : tone;\n const describedBy =\n inFormField && ctx.describedBy ? ctx.describedBy : undefined;\n\n const resolvedPlaceholder =\n placeholder ?? t('ui.inputs.combobox.placeholder', 'Search…');\n\n const filterFn = useMemo(\n () => (candidate: string, searchStr: string, keywords?: string[]) => {\n if (composingRef.current) return 1;\n const normalizedCandidate = normalizeDiacritics(candidate);\n const normalizedSearch = normalizeDiacritics(searchStr);\n const normalizedKeywords = keywords?.map(normalizeDiacritics);\n if (externalFilter) {\n return externalFilter(normalizedCandidate, normalizedSearch);\n }\n return defaultFilter(\n normalizedCandidate,\n normalizedSearch,\n normalizedKeywords,\n );\n },\n [externalFilter],\n );\n\n const emitValue = onValueChange as ((next: string) => void) | undefined;\n\n const commit = (next: string) => {\n if (!isControlled) setInternalValue(next);\n emitValue?.(next);\n };\n\n const setOpen = (next: boolean) => {\n if (!isOpenControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n const handleSelect = (optValue: string) => {\n const option = options.find((o) => o.value === optValue);\n commit(optValue);\n setSearch(option?.label ?? '');\n setOpen(false);\n };\n\n const handleCreate = (nextValue: string) => {\n onCreate?.(nextValue);\n setOpen(false);\n };\n\n const handleSearchChange = (next: string) => {\n if (effectiveReadOnly) return;\n setSearch(next);\n if (!open && next.length > 0 && !composingRef.current) {\n setOpen(true);\n }\n };\n\n const handleFocus = () => {\n if (!effectiveDisabled && !effectiveReadOnly) setOpen(true);\n };\n\n const handleCompositionStart = () => {\n composingRef.current = true;\n };\n\n const handleCompositionEnd = () => {\n composingRef.current = false;\n if (effectiveReadOnly) return;\n const next = inputRef.current?.value ?? '';\n setSearch(next);\n if (next.length > 0) setOpen(true);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Escape' && open) {\n event.preventDefault();\n setOpen(false);\n setSearch(selectedLabel);\n }\n };\n\n const handleClear = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n commit('');\n setSearch('');\n setOpen(true);\n inputRef.current?.focus();\n };\n\n const handleOpenChange = (next: boolean) => {\n if (effectiveReadOnly && next) return;\n setOpen(next);\n if (!next) setSearch(selectedLabel);\n };\n\n // Agent handle — refs mirror state for fresh reads.\n const valueRef = useRef<string>(currentValue);\n useEffect(() => {\n valueRef.current = currentValue;\n }, [currentValue]);\n const searchRef = useRef<string>(search);\n useEffect(() => {\n searchRef.current = search;\n }, [search]);\n const openRef = useRef<boolean>(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const setOpenStable = useCallback(\n (next: boolean) => {\n if (!isOpenControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isOpenControlled, onOpenChange],\n );\n\n const agentHandle = useMemo<ComboboxHandle>(\n () => ({\n getValue: () => valueRef.current || null,\n getQuery: () => searchRef.current,\n getIsOpen: () => openRef.current,\n setValue: (next) => {\n const v = next ?? '';\n if (!isControlled) setInternalValue(v);\n emitValue?.(v);\n const opt = options.find((o) => o.value === v);\n setSearch(opt?.label ?? '');\n },\n setQuery: (query) => {\n setSearch(query);\n },\n clear: () => {\n if (!isControlled) setInternalValue('');\n emitValue?.('');\n setSearch('');\n },\n open: () => setOpenStable(true),\n close: () => setOpenStable(false),\n }),\n [emitValue, isControlled, options, setOpenStable],\n );\n useAgentRegistration(comboboxAgent, agentHandle, id);\n\n const showClear =\n clearable &&\n Boolean(currentValue) &&\n !effectiveDisabled &&\n !effectiveReadOnly;\n\n const groups = groupOptions(options);\n const iconClass = iconSizeBySize[size];\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange}>\n <Command\n filter={filterFn}\n shouldFilter\n loop\n // cmdk hardcodes `aria-labelledby` on its input to its own hidden\n // `<label cmdk-label>` element. The label's contents come from the\n // Command Root's `label` (or `aria-label`) prop. If we leave it\n // empty, the input has an aria-labelledby pointer to a blank\n // element and axe's `label-title-only` rule fires. Fall back to\n // the placeholder so the input always has an accessible name —\n // when wrapped in a FormField the visible label still associates\n // via the FormField `<label htmlFor>`.\n label={ariaLabel ?? resolvedPlaceholder}\n className=\"ds:w-full\"\n >\n <Popover.Anchor asChild>\n <div\n ref={anchorRef}\n className={comboboxWrapperVariants({\n size,\n tone: effectiveTone,\n className,\n })}\n data-component=\"combobox\"\n data-component-id={id}\n >\n <Command.Input\n ref={composeRefs(ref, inputRef)}\n value={search}\n onValueChange={handleSearchChange}\n id={inputId}\n name={name}\n placeholder={resolvedPlaceholder}\n disabled={effectiveDisabled}\n readOnly={effectiveReadOnly}\n required={effectiveRequired}\n // Note: cmdk's CommandInput hardcodes `aria-labelledby` to\n // its own hidden cmdk-label after spreading user props, so\n // we can't override it from here. We funnel the accessible\n // name through the Command Root's `label` prop above.\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n className={comboboxInputVariants({ size })}\n />\n {showClear ? (\n <button\n type=\"button\"\n aria-label={t('ui.inputs.combobox.clear', 'Clear selection')}\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)]',\n 'ds:text-muted-foreground ds:hover:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:size-4',\n ].join(' ')}\n >\n <X aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </button>\n ) : null}\n </div>\n </Popover.Anchor>\n <Popover.Portal forceMount>\n <Popover.Content\n // `forceMount` keeps the listbox in the DOM while the popover\n // is closed so the input's cmdk-set `aria-controls` always\n // points at a real id (axe's aria-valid-attr-value rule).\n // The CSS visibility / pointer-events is gated by data-state.\n forceMount\n hidden={!open}\n // Radix Popover.Content carries `role=\"dialog\"`; axe's\n // `aria-dialog-name` rule requires a name. Surface the\n // surrounding combobox label so the popover is named after\n // the field it serves (or fall back to the i18n default).\n aria-label={\n ariaLabel ?? t('ui.inputs.combobox.popupLabel', 'Options')\n }\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onInteractOutside={(event) => {\n const target = event.target as Node | null;\n if (target && anchorRef.current?.contains(target)) {\n event.preventDefault();\n }\n }}\n sideOffset={4}\n align=\"start\"\n className={comboboxContentVariants()}\n >\n <Command.List className={comboboxListClasses}>\n <Command.Empty className={comboboxEmptyClasses}>\n {emptyMessage ??\n t('ui.inputs.combobox.empty', 'No results found')}\n </Command.Empty>\n {groups.map(({ group, items }, groupIndex) => {\n const body = items.map((option) => {\n const isSelected = option.value === currentValue;\n return (\n <Command.Item\n key={option.value}\n value={option.value}\n keywords={[option.label]}\n disabled={option.disabled}\n onSelect={handleSelect}\n className={comboboxItemVariants({ size })}\n >\n <span\n aria-hidden=\"true\"\n className={`ds:inline-flex ds:items-center ds:justify-center ${iconClass}`}\n >\n {isSelected ? <Check className={iconClass} /> : null}\n </span>\n <span className=\"ds:flex-1 ds:truncate\">\n {option.label}\n </span>\n {option.description ? (\n <span className=\"type-meta ds:text-muted-foreground\">\n {option.description}\n </span>\n ) : null}\n </Command.Item>\n );\n });\n if (!group) {\n return (\n <Command.Group key={`group-${groupIndex}`}>\n {body}\n </Command.Group>\n );\n }\n return (\n <Command.Group\n key={`group-${group}`}\n heading={\n <span className={comboboxGroupHeadingClasses}>\n {group}\n </span>\n }\n >\n {body}\n </Command.Group>\n );\n })}\n {allowCreate && search.length > 0 ? (\n <ComboboxCreateRow\n search={search}\n label={t(\n 'ui.inputs.combobox.create',\n 'Create \"{{value}}\"',\n {\n value: search,\n },\n )}\n iconClass={iconClass}\n size={size}\n onSelect={handleCreate}\n />\n ) : null}\n </Command.List>\n </Popover.Content>\n </Popover.Portal>\n </Command>\n </Popover.Root>\n );\n },\n);\nComboboxImpl.displayName = 'Combobox';\n\ninterface ComboboxComponent {\n <T extends string = string>(\n props: ComboboxProps<T> & { ref?: Ref<HTMLInputElement> },\n ): ReactElement | null;\n displayName?: string;\n}\n\n// forwardRef erases component-level generics, so we re-widen via a callable\n// interface to preserve the `<T extends string>` signature at the call site.\nexport const Combobox = ComboboxImpl as unknown as ComboboxComponent;\n\nexport {\n comboboxInputVariants,\n comboboxWrapperVariants,\n comboboxContentVariants,\n comboboxItemVariants,\n};\n"],"names":["comboboxAgent","handle","args","comboboxInputVariants","cva","comboboxWrapperVariants","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_PADDING_X","INPUT_SURFACE_TONE","comboboxContentVariants","comboboxItemVariants","comboboxGroupHeadingClasses","comboboxListClasses","comboboxEmptyClasses","iconSizeBySize","ComboboxCreateRow","search","label","iconClass","size","onSelect","useCommandState","state","jsxs","Command","jsx","ComboboxImpl","forwardRef","options","value","defaultValue","onValueChange","placeholder","clearable","disabled","readOnly","required","name","id","tone","externalFilter","allowCreate","onCreate","openProp","onOpenChange","emptyMessage","className","ariaLabel","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","internalValue","setInternalValue","useState","isControlled","currentValue","selectedOption","useMemo","o","selectedLabel","setSearch","internalOpen","setInternalOpen","isOpenControlled","open","composingRef","useRef","inputRef","anchorRef","useLayoutEffect","_a","useEffect","inputId","effectiveDisabled","effectiveReadOnly","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","resolvedPlaceholder","filterFn","candidate","searchStr","keywords","normalizedCandidate","normalizeDiacritics","normalizedSearch","normalizedKeywords","defaultFilter","emitValue","commit","next","setOpen","handleSelect","optValue","option","handleCreate","nextValue","handleSearchChange","handleFocus","handleCompositionStart","handleCompositionEnd","handleKeyDown","event","handleClear","handleOpenChange","valueRef","searchRef","openRef","setOpenStable","useCallback","agentHandle","v","opt","query","useAgentRegistration","showClear","groups","groupOptions","Popover","composeRefs","X","target","group","items","groupIndex","body","isSelected","Check","Combobox"],"mappings":"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"}
@@ -7,7 +7,7 @@ import { useTranslation as Z } from "react-i18next";
7
7
  import { u as $ } from "./registry-C9nwlNyL.js";
8
8
  import { B as j } from "./button-DD_0Xdmr.js";
9
9
  import { P as ee } from "./progress-C11tqhoI.js";
10
- import { f as se } from "./payment-form-C3vT_npe.js";
10
+ import { f as se } from "./payment-form-B_BdHwjb.js";
11
11
  import { T as ae } from "./triangle-alert-CBPUIzQo.js";
12
12
  import { C as re } from "./check-DPdL_Sm7.js";
13
13
  const te = {
@@ -264,4 +264,4 @@ export {
264
264
  de as F,
265
265
  te as f
266
266
  };
267
- //# sourceMappingURL=freemium-paywall-CnvceDav.js.map
267
+ //# sourceMappingURL=freemium-paywall-CrVefV0M.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"freemium-paywall-CnvceDav.js","sources":["../../src/components/freemium-paywall/freemium-paywall.agent.ts","../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — FreemiumPaywall. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { FreemiumPaywallHandle } from './freemium-paywall';\n\nexport const freemiumPaywallAgent: AgentAdapter<FreemiumPaywallHandle> = {\n id: 'freemium-paywall',\n capabilities: ['submit', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.freemiumPaywall.state.isOpen',\n description: 'True when the paywall dialog is open.',\n read: (handle) => handle.isOpen(),\n },\n selectedPlanId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.freemiumPaywall.state.selectedPlanId',\n description: 'Opaque id of the currently-selected plan.',\n read: (handle) => handle.getSelectedPlanId(),\n },\n },\n actions: {\n upgrade: {\n safety: 'write',\n descriptionKey: 'ui.agent.freemiumPaywall.actions.upgrade',\n description: 'Fire onUpgrade with the currently-selected plan id.',\n invoke: (handle) => {\n handle.upgrade();\n },\n },\n dismiss: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.freemiumPaywall.actions.dismiss',\n description:\n 'Dismiss the paywall via the Not Now action. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.dismiss();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'freemium-paywall',\n description: 'Marks the FreemiumPaywall dialog content.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { freemiumPaywallAgent } from './freemium-paywall.agent';\nimport { AlertTriangle, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n 'ds:inset-inline-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact:\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface FreemiumPaywallHandle {\n isOpen: () => boolean;\n getSelectedPlanId: () => string | null;\n upgrade: () => void;\n dismiss: () => void;\n}\n\nexport interface FreemiumPaywallProps extends VariantProps<\n typeof contentVariants\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('ui.paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('ui.paywall.description'). */\n description?: ReactNode;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const titleId = useId();\n const descId = useId();\n\n const isControlled = selectedPlanId !== undefined;\n const [internalSelected, setInternalSelected] = useState<string>(\n defaultSelectedPlanId ?? plans[0]?.id ?? '',\n );\n const currentSelected = isControlled\n ? (selectedPlanId ?? '')\n : internalSelected;\n\n const handleSelectedChange = (next: string) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedPlanChange?.(next);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const openRef = useRef(open);\n openRef.current = open;\n const selectedRef = useRef<string>(currentSelected);\n selectedRef.current = currentSelected;\n\n const contentRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => contentRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<FreemiumPaywallHandle>(\n () => ({\n isOpen: () => openRef.current,\n getSelectedPlanId: () => selectedRef.current || null,\n upgrade: () => handleUpgrade(),\n dismiss: () => handleCancel(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(freemiumPaywallAgent, agentHandle, undefined);\n\n const usagePercent = usage\n ? Math.min(\n 100,\n Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100),\n )\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--foreground)]/40',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={contentRef}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n data-component=\"freemium-paywall\"\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">\n {title ?? t('ui.paywall.title')}\n </h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('ui.paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <AlertTriangle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('ui.paywall.usageFull')\n : t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={\n usageFull\n ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]'\n : ''\n }\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={handleSelectedChange}\n aria-label={t('ui.paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('ui.paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('ui.paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n <div className=\"ds:mt-[var(--spacing-lg)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('ui.paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('ui.paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["freemiumPaywallAgent","handle","contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","isControlled","internalSelected","setInternalSelected","useState","_a","currentSelected","handleSelectedChange","next","handleCancel","handleUpgrade","openRef","useRef","selectedRef","contentRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","AlertTriangle","Progress","RadixRadioGroup","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
1
+ {"version":3,"file":"freemium-paywall-CrVefV0M.js","sources":["../../src/components/freemium-paywall/freemium-paywall.agent.ts","../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — FreemiumPaywall. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { FreemiumPaywallHandle } from './freemium-paywall';\n\nexport const freemiumPaywallAgent: AgentAdapter<FreemiumPaywallHandle> = {\n id: 'freemium-paywall',\n capabilities: ['submit', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.freemiumPaywall.state.isOpen',\n description: 'True when the paywall dialog is open.',\n read: (handle) => handle.isOpen(),\n },\n selectedPlanId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.freemiumPaywall.state.selectedPlanId',\n description: 'Opaque id of the currently-selected plan.',\n read: (handle) => handle.getSelectedPlanId(),\n },\n },\n actions: {\n upgrade: {\n safety: 'write',\n descriptionKey: 'ui.agent.freemiumPaywall.actions.upgrade',\n description: 'Fire onUpgrade with the currently-selected plan id.',\n invoke: (handle) => {\n handle.upgrade();\n },\n },\n dismiss: {\n safety: 'destructive',\n descriptionKey: 'ui.agent.freemiumPaywall.actions.dismiss',\n description:\n 'Dismiss the paywall via the Not Now action. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.dismiss();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'freemium-paywall',\n description: 'Marks the FreemiumPaywall dialog content.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { freemiumPaywallAgent } from './freemium-paywall.agent';\nimport { AlertTriangle, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n 'ds:inset-inline-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact:\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface FreemiumPaywallHandle {\n isOpen: () => boolean;\n getSelectedPlanId: () => string | null;\n upgrade: () => void;\n dismiss: () => void;\n}\n\nexport interface FreemiumPaywallProps extends VariantProps<\n typeof contentVariants\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('ui.paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('ui.paywall.description'). */\n description?: ReactNode;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const titleId = useId();\n const descId = useId();\n\n const isControlled = selectedPlanId !== undefined;\n const [internalSelected, setInternalSelected] = useState<string>(\n defaultSelectedPlanId ?? plans[0]?.id ?? '',\n );\n const currentSelected = isControlled\n ? (selectedPlanId ?? '')\n : internalSelected;\n\n const handleSelectedChange = (next: string) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedPlanChange?.(next);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const openRef = useRef(open);\n openRef.current = open;\n const selectedRef = useRef<string>(currentSelected);\n selectedRef.current = currentSelected;\n\n const contentRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => contentRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<FreemiumPaywallHandle>(\n () => ({\n isOpen: () => openRef.current,\n getSelectedPlanId: () => selectedRef.current || null,\n upgrade: () => handleUpgrade(),\n dismiss: () => handleCancel(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(freemiumPaywallAgent, agentHandle, undefined);\n\n const usagePercent = usage\n ? Math.min(\n 100,\n Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100),\n )\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--foreground)]/40',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n 'ds:[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={contentRef}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n data-component=\"freemium-paywall\"\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">\n {title ?? t('ui.paywall.title')}\n </h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('ui.paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <AlertTriangle\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('ui.paywall.usageFull')\n : t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={\n usageFull\n ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]'\n : ''\n }\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={handleSelectedChange}\n aria-label={t('ui.paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('ui.paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('ui.paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n <div className=\"ds:mt-[var(--spacing-lg)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('ui.paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('ui.paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["freemiumPaywallAgent","handle","contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","isControlled","internalSelected","setInternalSelected","useState","_a","currentSelected","handleSelectedChange","next","handleCancel","handleUpgrade","openRef","useRef","selectedRef","contentRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","AlertTriangle","Progress","RadixRadioGroup","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
@@ -10,7 +10,7 @@ import { A as L } from "./avatar-Dcr6XuDQ.js";
10
10
  import { B as D } from "./button-DD_0Xdmr.js";
11
11
  import { C as ae } from "./chat-container-ClzsWXp2.js";
12
12
  import { C as re } from "./chat-message-DoAhgUTj.js";
13
- import { C as le } from "./chat-input-DOlsB1fm.js";
13
+ import { C as le } from "./chat-input-Bov-gkwP.js";
14
14
  import { S as ie } from "./streaming-text-BgjCTVOw.js";
15
15
  import { a as q, S as O } from "./suggestion-chip-C4Jz0LrM.js";
16
16
  import { T as oe } from "./typing-indicator-BZ5jXZPn.js";
@@ -756,4 +756,4 @@ export {
756
756
  we as b,
757
757
  Ce as c
758
758
  };
759
- //# sourceMappingURL=leo-sidebar-CfEY-xi2.js.map
759
+ //# sourceMappingURL=leo-sidebar-kHO45M6C.js.map