@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.
- package/CHANGELOG.md +57 -0
- package/dist/assets/spa/assets/index-BQtKssQN.js +10 -0
- package/dist/assets/spa/assets/index-BQtKssQN.js.map +1 -0
- package/dist/assets/spa/assets/index-BqeSOw2s.css +2 -0
- package/dist/assets/spa/index.html +8 -2
- package/dist/providers/dashboard_provider.d.ts +12 -3
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +96 -13
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/src/dashboard/access_denied_page.d.ts +102 -0
- package/dist/src/dashboard/access_denied_page.d.ts.map +1 -0
- package/dist/src/dashboard/access_denied_page.js +266 -0
- package/dist/src/dashboard/access_denied_page.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +26 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -1
- package/dist/src/dashboard/define_config.js +1 -0
- package/dist/src/dashboard/define_config.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +5 -2
- package/dist/src/dashboard/index.d.ts.map +1 -1
- package/dist/src/dashboard/index.js +3 -1
- package/dist/src/dashboard/index.js.map +1 -1
- package/dist/src/dashboard/login_page.d.ts +22 -9
- package/dist/src/dashboard/login_page.d.ts.map +1 -1
- package/dist/src/dashboard/login_page.js +29 -41
- package/dist/src/dashboard/login_page.js.map +1 -1
- package/dist/src/dashboard/spa.d.ts +37 -7
- package/dist/src/dashboard/spa.d.ts.map +1 -1
- package/dist/src/dashboard/spa.js +28 -15
- package/dist/src/dashboard/spa.js.map +1 -1
- package/package.json +2 -2
- package/dist/assets/spa/assets/index-B7rU8eIL.css +0 -2
- package/dist/assets/spa/assets/index-BcM2VH5k.js +0 -10
- 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
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
|
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
|
|
33
|
-
*
|
|
34
|
-
*
|
|
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
|
|
37
|
-
*
|
|
38
|
-
*
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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;
|
|
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.
|
|
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.
|
|
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}
|