@adonis-agora/payments 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/assets/spa/assets/index-BQtKssQN.js +10 -0
  3. package/dist/assets/spa/assets/index-BQtKssQN.js.map +1 -0
  4. package/dist/assets/spa/assets/index-BqeSOw2s.css +2 -0
  5. package/dist/assets/spa/index.html +8 -2
  6. package/dist/providers/dashboard_provider.d.ts +12 -3
  7. package/dist/providers/dashboard_provider.d.ts.map +1 -1
  8. package/dist/providers/dashboard_provider.js +96 -13
  9. package/dist/providers/dashboard_provider.js.map +1 -1
  10. package/dist/src/dashboard/access_denied_page.d.ts +102 -0
  11. package/dist/src/dashboard/access_denied_page.d.ts.map +1 -0
  12. package/dist/src/dashboard/access_denied_page.js +266 -0
  13. package/dist/src/dashboard/access_denied_page.js.map +1 -0
  14. package/dist/src/dashboard/define_config.d.ts +26 -0
  15. package/dist/src/dashboard/define_config.d.ts.map +1 -1
  16. package/dist/src/dashboard/define_config.js +1 -0
  17. package/dist/src/dashboard/define_config.js.map +1 -1
  18. package/dist/src/dashboard/index.d.ts +5 -2
  19. package/dist/src/dashboard/index.d.ts.map +1 -1
  20. package/dist/src/dashboard/index.js +3 -1
  21. package/dist/src/dashboard/index.js.map +1 -1
  22. package/dist/src/dashboard/login_page.d.ts +22 -9
  23. package/dist/src/dashboard/login_page.d.ts.map +1 -1
  24. package/dist/src/dashboard/login_page.js +29 -41
  25. package/dist/src/dashboard/login_page.js.map +1 -1
  26. package/dist/src/dashboard/spa.d.ts +37 -7
  27. package/dist/src/dashboard/spa.d.ts.map +1 -1
  28. package/dist/src/dashboard/spa.js +28 -15
  29. package/dist/src/dashboard/spa.js.map +1 -1
  30. package/package.json +2 -2
  31. package/dist/assets/spa/assets/index-B7rU8eIL.css +0 -2
  32. package/dist/assets/spa/assets/index-BcM2VH5k.js +0 -10
  33. package/dist/assets/spa/assets/index-BcM2VH5k.js.map +0 -1
@@ -10,15 +10,45 @@ export declare const BASE_PLACEHOLDER = "/__PAYMENTS_DASHBOARD__/";
10
10
  export declare const CONTENT_TYPES: Record<string, string>;
11
11
  /** Content type for a served asset filename, defaulting to octet-stream. */
12
12
  export declare function contentTypeFor(file: string): string;
13
+ /**
14
+ * Which `dashboardAuth` surface(s) this deployment has — `null` when it has none. Carried to the
15
+ * SPA so it can tell "there is a session to end" from "there is no `/logout` route at all": on a
16
+ * deployment without `dashboardAuth` the provider registers no auth routes, and a Sign out link
17
+ * there was a 404 waiting to be clicked.
18
+ */
19
+ export type InjectedAuth = {
20
+ modes: readonly string[];
21
+ } | null;
22
+ /** `id` of the JSON data block `renderIndexHtml` injects; `src/client/payments-client.ts` reads it. */
23
+ export declare const CONFIG_ELEMENT_ID = "payments-dashboard-config";
24
+ /** What the page tells the SPA about the deployment it is mounted in. */
25
+ export interface InjectedConfig {
26
+ /** UI mount base (`/payments`; `''` for a root mount). */
27
+ base: string;
28
+ /** JSON API base (`/payments/api`). */
29
+ api: string;
30
+ /** ISO 4217 display currency. */
31
+ currency: string;
32
+ auth: InjectedAuth;
33
+ }
13
34
  /**
14
35
  * Rewrite the built `index.html` for serving: point Vite's placeholder base at the configured mount
15
- * path, and inject the globals `src/client/payments-client.ts` reads
16
- * (`window.__PAYMENTS_BASE__`/`window.__PAYMENTS_API__`) plus the display currency
17
- * (`window.__PAYMENTS_CURRENCY__`) the SPA formats cents with.
36
+ * path, and hand the SPA its deployment config — the mount base and API base
37
+ * `src/client/payments-client.ts` builds URLs from, the display currency it formats cents with, and
38
+ * the auth surface (see {@link InjectedAuth}).
39
+ *
40
+ * The config goes in as a JSON DATA BLOCK (`<script type="application/json">`), not as an inline
41
+ * script assigning `window.__PAYMENTS_*__` globals. A data block is never executed, so no
42
+ * Content-Security-Policy can refuse it; an inline script IS, and a host with
43
+ * `script-src 'self' 'nonce-…'` — `@adonisjs/shield`'s `@nonce`, which is the recommended setup —
44
+ * silently dropped ours. The globals were then undefined, the SPA fell back to its default mount
45
+ * (`/payments-dashboard/api`), and EVERY request from a console that had rendered perfectly well
46
+ * answered 404. The module script Vite emits is a same-origin file, which is why the page itself
47
+ * kept loading and made the failure look like a routing bug rather than a policy one.
18
48
  *
19
- * The currency is the one addition over durable's two-global version: money is integer cents on the
20
- * wire and formatted only at render, so the renderer has to be told which currency to render in —
21
- * and the config file, not the bundle, is where that belongs.
49
+ * The currency is the one addition over durable's version: money is integer cents on the wire
50
+ * and formatted only at render, so the renderer has to be told which currency to render in — and
51
+ * the config file, not the bundle, is where that belongs.
22
52
  */
23
- export declare function renderIndexHtml(html: string, basePath: string, apiBasePath: string, currency: string): string;
53
+ export declare function renderIndexHtml(html: string, basePath: string, apiBasePath: string, currency: string, auth?: InjectedAuth): string;
24
54
  //# sourceMappingURL=spa.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spa.d.ts","sourceRoot":"","sources":["../../../src/dashboard/spa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;4GAC4G;AAC5G,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAchD,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,MAAM,CAWR"}
1
+ {"version":3,"file":"spa.d.ts","sourceRoot":"","sources":["../../../src/dashboard/spa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;4GAC4G;AAC5G,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAchD,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC;AAE/D,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,YAAmB,GACxB,MAAM,CAaR"}
@@ -27,26 +27,39 @@ export function contentTypeFor(file) {
27
27
  const ext = file.slice(file.lastIndexOf('.'));
28
28
  return CONTENT_TYPES[ext] ?? 'application/octet-stream';
29
29
  }
30
+ /** `id` of the JSON data block `renderIndexHtml` injects; `src/client/payments-client.ts` reads it. */
31
+ export const CONFIG_ELEMENT_ID = 'payments-dashboard-config';
30
32
  /**
31
33
  * Rewrite the built `index.html` for serving: point Vite's placeholder base at the configured mount
32
- * path, and inject the globals `src/client/payments-client.ts` reads
33
- * (`window.__PAYMENTS_BASE__`/`window.__PAYMENTS_API__`) plus the display currency
34
- * (`window.__PAYMENTS_CURRENCY__`) the SPA formats cents with.
34
+ * path, and hand the SPA its deployment config — the mount base and API base
35
+ * `src/client/payments-client.ts` builds URLs from, the display currency it formats cents with, and
36
+ * the auth surface (see {@link InjectedAuth}).
35
37
  *
36
- * The currency is the one addition over durable's two-global version: money is integer cents on the
37
- * wire and formatted only at render, so the renderer has to be told which currency to render in —
38
- * and the config file, not the bundle, is where that belongs.
38
+ * The config goes in as a JSON DATA BLOCK (`<script type="application/json">`), not as an inline
39
+ * script assigning `window.__PAYMENTS_*__` globals. A data block is never executed, so no
40
+ * Content-Security-Policy can refuse it; an inline script IS, and a host with
41
+ * `script-src 'self' 'nonce-…'` — `@adonisjs/shield`'s `@nonce`, which is the recommended setup —
42
+ * silently dropped ours. The globals were then undefined, the SPA fell back to its default mount
43
+ * (`/payments-dashboard/api`), and EVERY request from a console that had rendered perfectly well
44
+ * answered 404. The module script Vite emits is a same-origin file, which is why the page itself
45
+ * kept loading and made the failure look like a routing bug rather than a policy one.
46
+ *
47
+ * The currency is the one addition over durable's version: money is integer cents on the wire
48
+ * and formatted only at render, so the renderer has to be told which currency to render in — and
49
+ * the config file, not the bundle, is where that belongs.
39
50
  */
40
- export function renderIndexHtml(html, basePath, apiBasePath, currency) {
51
+ export function renderIndexHtml(html, basePath, apiBasePath, currency, auth = null) {
41
52
  const based = html.split(BASE_PLACEHOLDER).join(`${basePath}/`);
42
- // JSON.stringify, not concatenation: a config value containing `</script>` must not be able to
43
- // close the tag it is injected into.
44
- const globals = [
45
- `window.__PAYMENTS_BASE__=${JSON.stringify(basePath)};`,
46
- `window.__PAYMENTS_API__=${JSON.stringify(apiBasePath)};`,
47
- `window.__PAYMENTS_CURRENCY__=${JSON.stringify(currency)};`,
48
- ].join('');
49
- const inject = `<script>${globals}</script>`;
53
+ const config = {
54
+ base: basePath,
55
+ api: apiBasePath,
56
+ currency,
57
+ auth: auth === null ? null : { modes: [...auth.modes] },
58
+ };
59
+ // `<` escaped as `\u003c` inside the JSON: a data block ends at the first `</script`, and a
60
+ // config value must not be able to close it early. Valid JSON either way.
61
+ const json = JSON.stringify(config).replace(/</g, '\\u003c');
62
+ const inject = `<script type="application/json" id="${CONFIG_ELEMENT_ID}">${json}</script>`;
50
63
  return based.includes('</head>') ? based.replace('</head>', `${inject}</head>`) : inject + based;
51
64
  }
52
65
  //# sourceMappingURL=spa.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spa.js","sourceRoot":"","sources":["../../../src/dashboard/spa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;4GAC4G;AAC5G,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,gCAAgC;IACxC,MAAM,EAAE,yBAAyB;IACjC,MAAM,EAAE,iCAAiC;IACzC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAC1D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IAChE,+FAA+F;IAC/F,qCAAqC;IACrC,MAAM,OAAO,GAAG;QACd,4BAA4B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;QACvD,2BAA2B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG;QACzD,gCAAgC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;KAC5D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,WAAW,OAAO,WAAW,CAAC;IAC7C,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;AACnG,CAAC"}
1
+ {"version":3,"file":"spa.js","sourceRoot":"","sources":["../../../src/dashboard/spa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;4GAC4G;AAC5G,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,gCAAgC;IACxC,MAAM,EAAE,yBAAyB;IACjC,MAAM,EAAE,iCAAiC;IACzC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAC1D,CAAC;AAUD,uGAAuG;AACvG,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAa7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,QAAgB,EAChB,IAAI,GAAiB,IAAI;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;IAChE,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,WAAW;QAChB,QAAQ;QACR,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;KACxD,CAAC;IACF,4FAA4F;IAC5F,0EAA0E;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,uCAAuC,iBAAiB,KAAK,IAAI,WAAW,CAAC;IAC5F,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;AACnG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/payments",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Billing library for AdonisJS — 18 payment gateways behind one driver contract, with a Cashier-style subscription billing layer: Billable mixin, Lucid stores, idempotent webhook processing and an optional Durable-backed dispatcher. Part of the Agora ecosystem.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -122,7 +122,7 @@
122
122
  }
123
123
  },
124
124
  "devDependencies": {
125
- "@adonis-agora/payments-dashboard": "0.2.1",
125
+ "@adonis-agora/payments-dashboard": "0.3.0",
126
126
  "@adonisjs/assembler": "^8.5.0",
127
127
  "@adonisjs/core": "7.5.0",
128
128
  "@adonisjs/lucid": "^22.4.2",
@@ -1,2 +0,0 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--color-amber-300:oklch(87.9% .169 91.605);--color-emerald-300:oklch(84.5% .143 164.978);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-500:oklch(58.5% .233 277.117);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-800:oklch(27.4% .006 286.033);--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.z-10{z-index:10}.z-50{z-index:50}.order-4{order:4}.order-42{order:42}.order-4102{order:4102}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-4{margin:calc(var(--spacing) * 4)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.min-h-full{min-height:100%}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-md{max-width:var(--container-md)}.min-w-\[3ch\]{min-width:3ch}.min-w-\[16rem\]{min-width:16rem}.flex-1{flex:1}.grow{flex-grow:1}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-bad\/25{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/25{border-color:color-mix(in oklab, var(--bad) 25%, transparent)}}.border-bad\/30{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/30{border-color:color-mix(in oklab, var(--bad) 30%, transparent)}}.border-bad\/40{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/40{border-color:color-mix(in oklab, var(--bad) 40%, transparent)}}.border-bad\/50{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/50{border-color:color-mix(in oklab, var(--bad) 50%, transparent)}}.border-good\/30{border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.border-good\/30{border-color:color-mix(in oklab, var(--good) 30%, transparent)}}.border-good\/40{border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.border-good\/40{border-color:color-mix(in oklab, var(--good) 40%, transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab, red, red)){.border-indigo-500\/30{border-color:color-mix(in oklab, var(--color-indigo-500) 30%, transparent)}}.border-line{border-color:var(--line)}.border-line-soft{border-color:var(--line-soft)}.border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/40{border-color:color-mix(in oklab, var(--color-rose-500) 40%, transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.border-sky-500\/30{border-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.border-transparent{border-color:#0000}.border-warn\/30{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/30{border-color:color-mix(in oklab, var(--warn) 30%, transparent)}}.border-warn\/40{border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--warn) 40%, transparent)}}.bg-bad\/10{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/10{background-color:color-mix(in oklab, var(--bad) 10%, transparent)}}.bg-bad\/15{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/15{background-color:color-mix(in oklab, var(--bad) 15%, transparent)}}.bg-bad\/\[0\.04\]{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/\[0\.04\]{background-color:color-mix(in oklab, var(--bad) 4%, transparent)}}.bg-bad\/\[0\.05\]{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/\[0\.05\]{background-color:color-mix(in oklab, var(--bad) 5%, transparent)}}.bg-bad\/\[0\.06\]{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/\[0\.06\]{background-color:color-mix(in oklab, var(--bad) 6%, transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.bg-black\/70{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.bg-brand\/15{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-brand\/15{background-color:color-mix(in oklab, var(--accent) 15%, transparent)}}.bg-good\/10{background-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.bg-good\/10{background-color:color-mix(in oklab, var(--good) 10%, transparent)}}.bg-good\/\[0\.06\]{background-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.bg-good\/\[0\.06\]{background-color:color-mix(in oklab, var(--good) 6%, transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab, red, red)){.bg-indigo-500\/10{background-color:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.bg-panel{background-color:var(--panel)}.bg-panel-2{background-color:var(--panel-2)}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/10{background-color:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab, red, red)){.bg-sky-500\/10{background-color:color-mix(in oklab, var(--color-sky-500) 10%, transparent)}}.bg-warn\/\[0\.06\]{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/\[0\.06\]{background-color:color-mix(in oklab, var(--warn) 6%, transparent)}}.bg-warn\/\[0\.08\]{background-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/\[0\.08\]{background-color:color-mix(in oklab, var(--warn) 8%, transparent)}}.bg-zinc-800\/40{background-color:#27272a66}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/40{background-color:color-mix(in oklab, var(--color-zinc-800) 40%, transparent)}}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-0{padding-inline:0}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.wrap-break-word{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-brand{color:var(--accent)}.text-emerald-300{color:var(--color-emerald-300)}.text-indigo-300{color:var(--color-indigo-300)}.text-inherit{color:inherit}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-sky-300{color:var(--color-sky-300)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.uppercase{text-transform:uppercase}.opacity-80{opacity:.8}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-zinc-600::placeholder{color:var(--color-zinc-600)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media (hover:hover){.hover\:bg-panel:hover{background-color:var(--panel)}.hover\:bg-panel-2:hover{background-color:var(--panel-2)}.hover\:text-zinc-100:hover{color:var(--color-zinc-100)}.hover\:text-zinc-200:hover{color:var(--color-zinc-200)}}.focus\:border-brand:focus{border-color:var(--accent)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}@media (hover:hover){.enabled\:hover\:bg-bad\/25:enabled:hover{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.enabled\:hover\:bg-bad\/25:enabled:hover{background-color:color-mix(in oklab, var(--bad) 25%, transparent)}}.enabled\:hover\:bg-panel:enabled:hover{background-color:var(--panel)}.enabled\:hover\:bg-panel-2:enabled:hover{background-color:var(--panel-2)}.enabled\:hover\:text-zinc-100:enabled:hover{color:var(--color-zinc-100)}}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}:root{--bg:#09090b;--panel:#0c0c0f;--panel-2:#101017;--line:#1c1c22;--line-soft:#16161a;--text:#e7e7ea;--muted:#76767f;--good:#34d399;--warn:#fbbf24;--bad:#f87171;--live:#60a5fa;--accent:#22d3ee}*{box-sizing:border-box}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:Space Grotesk,ui-sans-serif,system-ui,sans-serif}.app-bg{z-index:0;pointer-events:none;background-image:radial-gradient(900px 400px at 78% -8%, var(--accent), transparent 70%), linear-gradient(to right, var(--line-soft) 1px, transparent 1px), linear-gradient(to bottom, var(--line-soft) 1px, transparent 1px);position:fixed;inset:0}@supports (color:color-mix(in lab, red, red)){.app-bg{background-image:radial-gradient(900px 400px at 78% -8%, color-mix(in srgb, var(--accent) 8%, transparent), transparent 70%), linear-gradient(to right, var(--line-soft) 1px, transparent 1px), linear-gradient(to bottom, var(--line-soft) 1px, transparent 1px)}}.app-bg{opacity:.5;background-size:100% 100%,44px 44px,44px 44px;-webkit-mask-image:linear-gradient(#000,#000 60%,#0000);mask-image:linear-gradient(#000,#000 60%,#0000)}.mono{font-family:JetBrains Mono,ui-monospace,monospace}.tnum{font-variant-numeric:tabular-nums}.s-paid{color:var(--good)}.s-pending{color:#94a3b8}.s-failed{color:var(--bad)}.s-refunded{color:#a78bfa}.s-canceled{color:#71717a}.s-authorized{color:var(--warn)}.s-disputed{color:#fb7185}.s-active{color:var(--good)}.s-trialing{color:var(--live)}.s-past_due{color:var(--bad)}.s-paused,.s-incomplete{color:var(--warn)}.s-ended{color:#71717a}.s-warning{color:var(--warn)}.s-open{color:var(--bad)}.s-under_review{color:var(--live)}.s-won{color:var(--good)}.s-lost,.s-expired{color:#fb7185}.s-received{color:var(--live)}.s-processed{color:var(--good)}.s-unknown{color:var(--muted)}.dot{background:currentColor;border-radius:999px;width:7px;height:7px;box-shadow:0 0 0 3px}@supports (color:color-mix(in lab, red, red)){.dot{box-shadow:0 0 0 3px color-mix(in srgb, currentColor 18%, transparent)}}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.rise{animation:.32s cubic-bezier(.2,.7,.2,1) both rise}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{border:3px solid var(--bg);background:#26262c;border-radius:999px}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}