forgedock 1.0.16 → 1.0.18
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/README.md +54 -3
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +2205 -541
- package/bin/github-app-manifest.json.license +2 -0
- package/bin/hooks/session-start.mjs +4 -5
- package/bin/registry.mjs +20 -0
- package/bin/tui.mjs +172 -96
- package/commands/adopt.md +433 -0
- package/commands/analytics.md +2 -0
- package/commands/audit-agents.md +2 -0
- package/commands/audit.md +2 -0
- package/commands/autopilot.md +77 -0
- package/commands/changelog.md +354 -0
- package/commands/cleanup.md +2 -0
- package/commands/compat-audit.md +330 -0
- package/commands/deploy-info.md +6 -5
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/diagnose.md +483 -0
- package/commands/explain.md +349 -0
- package/commands/forge-stats.md +2 -0
- package/commands/forgedock-init.md +2 -0
- package/commands/geo-audit.md +2 -0
- package/commands/incident-response.md +2 -0
- package/commands/issue.md +9 -3
- package/commands/milestone.md +2 -0
- package/commands/optimize.md +411 -0
- package/commands/orchestrate.md +239 -0
- package/commands/pipeline-health.md +60 -1
- package/commands/qa-sweep.md +39 -2
- package/commands/quality-gate.md +67 -0
- package/commands/replay.md +263 -0
- package/commands/resume.md +264 -0
- package/commands/review-pr-agents.md +5 -1
- package/commands/review-pr-staging.md +160 -2
- package/commands/review-pr.md +85 -3
- package/commands/rollback.md +2 -0
- package/commands/scope.md +280 -0
- package/commands/security-audit.md +2 -0
- package/commands/status.md +262 -0
- package/commands/sync-ecosystem.md +2 -0
- package/commands/test-gate.md +929 -0
- package/commands/validate.md +2 -0
- package/commands/work-on/build/architect.md +128 -18
- package/commands/work-on/build/context.md +130 -17
- package/commands/work-on/build/implement.md +7 -3
- package/commands/work-on/build/validate.md +2 -0
- package/commands/work-on/build.md +32 -7
- package/commands/work-on/close.md +85 -0
- package/commands/work-on/decompose.md +2 -0
- package/commands/work-on/investigate.md +30 -3
- package/commands/work-on/review.md +13 -1
- package/commands/work-on-monolithic.md +2 -0
- package/commands/work-on.md +676 -38
- package/docs/BRAND.md +51 -0
- package/docs/CI.md +177 -0
- package/docs/CONFIG.md +94 -0
- package/docs/FORGE-PROTOCOL.md +324 -0
- package/docs/articles/b-vs-c-baseline.md +210 -0
- package/docs/articles/full-abc-benchmark.md +205 -0
- package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/claude-breakpoints.json +47 -0
- package/docs/design/abc-benchmark.md +195 -0
- package/docs/design/design-architect-rationale.md +123 -0
- package/docs/design/design-memory.md +61 -0
- package/docs/design/design-spec-schema.md +248 -0
- package/docs/design/design-system-lint.md +150 -0
- package/docs/design/divergent-generation.md +106 -0
- package/docs/design/effects-appropriateness.md +133 -0
- package/docs/design/fixtures/briefs/README.md +47 -0
- package/docs/design/fixtures/briefs/cadence.md +39 -0
- package/docs/design/fixtures/briefs/plume.md +39 -0
- package/docs/design/fixtures/briefs/slipstream.md +39 -0
- package/docs/design/fixtures/briefs/tender.md +39 -0
- package/docs/design/fixtures/briefs/voltage.md +39 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
- package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
- package/docs/design/foundations/brutalist.css +294 -0
- package/docs/design/foundations/editorial.css +300 -0
- package/docs/design/foundations/minimal-luxury.css +295 -0
- package/docs/design/foundations/technical.css +293 -0
- package/docs/design/foundations/warm-photo.css +299 -0
- package/docs/design/reference-corpus.md +1726 -0
- package/docs/design/render-critique-loop.md +57 -0
- package/docs/site/getting-started.md +21 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +3 -3
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/classify-lane.sh +138 -0
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +169 -0
- package/scripts/validate-pr-target.sh +30 -0
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/devdocs/README.md +72 -0
- package/templates/devdocs/agent/using-forgedock.md +3 -0
- package/templates/devdocs/agent/using-github.md +3 -0
- package/templates/devdocs/index.yaml +162 -0
- package/templates/devdocs/project/architecture.md +3 -0
- package/templates/devdocs/project/conventions.md +3 -0
- package/templates/devdocs/project/custom-instructions.md +3 -0
- package/templates/devdocs/project/glossary.md +3 -0
- package/templates/devdocs/project/stack.md +3 -0
- package/templates/devdocs/templates/commit-convention.md +3 -0
- package/templates/devdocs/templates/issue.md +3 -0
- package/templates/devdocs/templates/pull-request.md +3 -0
- package/templates/devdocs/templates/review-finding.md +3 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,721 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Tender — Payments, Simplified</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
9
|
+
<style>
|
|
10
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
11
|
+
|
|
12
|
+
:root {
|
|
13
|
+
--bg: #fcfcfc;
|
|
14
|
+
--surface: #f6f6f6;
|
|
15
|
+
--ink: #111111;
|
|
16
|
+
--ink-50: #555555;
|
|
17
|
+
--ink-30: #999999;
|
|
18
|
+
--ink-15: #cccccc;
|
|
19
|
+
--ink-08: #e5e5e5;
|
|
20
|
+
--ink-04: #f0f0f0;
|
|
21
|
+
--accent: #1a6bff;
|
|
22
|
+
--accent-soft: #1a6bff0c;
|
|
23
|
+
--font: 'Plus Jakarta Sans', sans-serif;
|
|
24
|
+
--mono: 'IBM Plex Mono', monospace;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
html { font-size: 16px; background: var(--bg); color: var(--ink); }
|
|
28
|
+
body { font-family: var(--font); -webkit-font-smoothing: antialiased; line-height: 1.5; }
|
|
29
|
+
|
|
30
|
+
/* Nav */
|
|
31
|
+
nav {
|
|
32
|
+
max-width: 1120px; margin: 0 auto;
|
|
33
|
+
padding: 24px 40px;
|
|
34
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
35
|
+
}
|
|
36
|
+
.logo { font-size: 20px; font-weight: 800; letter-spacing: -0.8px; }
|
|
37
|
+
nav .links { display: flex; gap: 36px; align-items: center; }
|
|
38
|
+
nav .links a {
|
|
39
|
+
font-size: 14px; font-weight: 500; color: var(--ink-50);
|
|
40
|
+
text-decoration: none; transition: color 0.15s;
|
|
41
|
+
}
|
|
42
|
+
nav .links a:hover { color: var(--ink); }
|
|
43
|
+
.nav-btn {
|
|
44
|
+
font-family: var(--font); font-size: 13px; font-weight: 600;
|
|
45
|
+
background: var(--ink); color: #fff; border: none;
|
|
46
|
+
padding: 10px 22px; cursor: pointer; letter-spacing: -0.2px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Hero — extreme whitespace, left-aligned */
|
|
50
|
+
.hero {
|
|
51
|
+
max-width: 1120px; margin: 0 auto;
|
|
52
|
+
padding: 120px 40px 100px;
|
|
53
|
+
}
|
|
54
|
+
.hero-label {
|
|
55
|
+
font-family: var(--mono); font-size: 12px; font-weight: 500;
|
|
56
|
+
color: var(--accent); letter-spacing: 0.5px; margin-bottom: 28px;
|
|
57
|
+
}
|
|
58
|
+
.hero h1 {
|
|
59
|
+
font-size: clamp(48px, 6vw, 80px);
|
|
60
|
+
font-weight: 800; line-height: 1.0;
|
|
61
|
+
letter-spacing: -3px; margin-bottom: 32px;
|
|
62
|
+
max-width: 700px;
|
|
63
|
+
}
|
|
64
|
+
.hero h1 .thin { font-weight: 300; color: var(--ink-50); }
|
|
65
|
+
.hero .sub {
|
|
66
|
+
font-size: 18px; font-weight: 400; color: var(--ink-50);
|
|
67
|
+
max-width: 520px; line-height: 1.7; margin-bottom: 48px;
|
|
68
|
+
}
|
|
69
|
+
.hero-actions { display: flex; gap: 16px; align-items: center; }
|
|
70
|
+
.btn-primary {
|
|
71
|
+
font-family: var(--font); font-size: 15px; font-weight: 600;
|
|
72
|
+
background: var(--ink); color: #fff; border: none;
|
|
73
|
+
padding: 16px 32px; cursor: pointer; text-decoration: none;
|
|
74
|
+
display: inline-block; letter-spacing: -0.3px;
|
|
75
|
+
}
|
|
76
|
+
.btn-ghost {
|
|
77
|
+
font-family: var(--font); font-size: 15px; font-weight: 500;
|
|
78
|
+
color: var(--ink-50); background: none; border: 1px solid var(--ink-08);
|
|
79
|
+
padding: 15px 32px; cursor: pointer; text-decoration: none;
|
|
80
|
+
}
|
|
81
|
+
.btn-ghost:hover { border-color: var(--ink-30); }
|
|
82
|
+
|
|
83
|
+
/* Signature Move: Split-screen code/result */
|
|
84
|
+
.split-demo {
|
|
85
|
+
max-width: 1120px; margin: 0 auto;
|
|
86
|
+
padding: 0 40px 100px;
|
|
87
|
+
}
|
|
88
|
+
.split-container {
|
|
89
|
+
display: grid; grid-template-columns: 1fr 1fr;
|
|
90
|
+
border: 1px solid var(--ink-08);
|
|
91
|
+
overflow: hidden;
|
|
92
|
+
}
|
|
93
|
+
.split-left {
|
|
94
|
+
padding: 0;
|
|
95
|
+
border-right: 1px solid var(--ink-08);
|
|
96
|
+
position: relative;
|
|
97
|
+
}
|
|
98
|
+
.split-right {
|
|
99
|
+
padding: 0;
|
|
100
|
+
background: var(--ink);
|
|
101
|
+
color: #e0e0e0;
|
|
102
|
+
}
|
|
103
|
+
.split-tab-bar {
|
|
104
|
+
display: flex; border-bottom: 1px solid var(--ink-08);
|
|
105
|
+
}
|
|
106
|
+
.split-tab {
|
|
107
|
+
font-family: var(--mono); font-size: 11px; font-weight: 500;
|
|
108
|
+
padding: 12px 20px; color: var(--ink-30);
|
|
109
|
+
border-right: 1px solid var(--ink-08);
|
|
110
|
+
cursor: pointer; background: var(--ink-04);
|
|
111
|
+
}
|
|
112
|
+
.split-tab.active { color: var(--ink); background: var(--bg); }
|
|
113
|
+
.split-tab-bar-dark {
|
|
114
|
+
display: flex; border-bottom: 1px solid #222;
|
|
115
|
+
}
|
|
116
|
+
.split-tab-dark {
|
|
117
|
+
font-family: var(--mono); font-size: 11px; font-weight: 500;
|
|
118
|
+
padding: 12px 20px; color: #666;
|
|
119
|
+
border-right: 1px solid #222;
|
|
120
|
+
cursor: pointer; background: #0a0a0a;
|
|
121
|
+
}
|
|
122
|
+
.split-tab-dark.active { color: #aaa; background: var(--ink); }
|
|
123
|
+
|
|
124
|
+
.split-code {
|
|
125
|
+
padding: 24px; font-family: var(--mono); font-size: 13px;
|
|
126
|
+
line-height: 2; overflow-x: auto; min-height: 380px;
|
|
127
|
+
}
|
|
128
|
+
.split-code .kw { color: var(--accent); }
|
|
129
|
+
.split-code .str { color: #16803c; }
|
|
130
|
+
.split-code .num { color: #b35309; }
|
|
131
|
+
.split-code .cm { color: var(--ink-30); }
|
|
132
|
+
.split-code-dark {
|
|
133
|
+
padding: 24px; font-family: var(--mono); font-size: 13px;
|
|
134
|
+
line-height: 2; overflow-x: auto; color: #888; min-height: 380px;
|
|
135
|
+
}
|
|
136
|
+
.split-code-dark .kw { color: #6ea8fe; }
|
|
137
|
+
.split-code-dark .str { color: #63e6a0; }
|
|
138
|
+
.split-code-dark .num { color: #f5a623; }
|
|
139
|
+
.split-code-dark .cm { color: #444; }
|
|
140
|
+
.split-code-dark .key { color: #aaa; }
|
|
141
|
+
|
|
142
|
+
.split-label {
|
|
143
|
+
position: absolute; top: 16px; right: 16px;
|
|
144
|
+
font-family: var(--mono); font-size: 10px; font-weight: 500;
|
|
145
|
+
color: var(--ink-30); text-transform: uppercase; letter-spacing: 1px;
|
|
146
|
+
}
|
|
147
|
+
.split-meta {
|
|
148
|
+
position: absolute; bottom: 0; left: 0; right: 0;
|
|
149
|
+
padding: 10px 24px;
|
|
150
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-30);
|
|
151
|
+
border-top: 1px solid var(--ink-08);
|
|
152
|
+
background: var(--ink-04);
|
|
153
|
+
display: flex; justify-content: space-between;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Numbers strip */
|
|
157
|
+
.numbers {
|
|
158
|
+
max-width: 1120px; margin: 0 auto;
|
|
159
|
+
padding: 0 40px 100px;
|
|
160
|
+
display: grid; grid-template-columns: repeat(4, 1fr); gap: 40px;
|
|
161
|
+
}
|
|
162
|
+
.num-block {}
|
|
163
|
+
.num-block .value {
|
|
164
|
+
font-size: 48px; font-weight: 800; letter-spacing: -2px;
|
|
165
|
+
line-height: 1;
|
|
166
|
+
}
|
|
167
|
+
.num-block .value .unit { font-weight: 300; color: var(--ink-30); }
|
|
168
|
+
.num-block .label {
|
|
169
|
+
font-size: 13px; color: var(--ink-50); margin-top: 8px;
|
|
170
|
+
font-weight: 500;
|
|
171
|
+
}
|
|
172
|
+
.num-divider {
|
|
173
|
+
height: 2px; background: var(--ink-08); margin-bottom: 20px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Features — stacked horizontal bands */
|
|
177
|
+
.feature-bands {
|
|
178
|
+
max-width: 1120px; margin: 0 auto;
|
|
179
|
+
padding: 0 40px 80px;
|
|
180
|
+
}
|
|
181
|
+
.band-header {
|
|
182
|
+
font-family: var(--mono); font-size: 11px; font-weight: 500;
|
|
183
|
+
color: var(--ink-30); text-transform: uppercase; letter-spacing: 1.5px;
|
|
184
|
+
padding-bottom: 16px; border-bottom: 1px solid var(--ink-08);
|
|
185
|
+
margin-bottom: 0;
|
|
186
|
+
}
|
|
187
|
+
.band {
|
|
188
|
+
display: grid; grid-template-columns: 240px 1fr;
|
|
189
|
+
gap: 0;
|
|
190
|
+
border-bottom: 1px solid var(--ink-08);
|
|
191
|
+
padding: 32px 0;
|
|
192
|
+
align-items: start;
|
|
193
|
+
}
|
|
194
|
+
.band-title {
|
|
195
|
+
font-size: 18px; font-weight: 700; letter-spacing: -0.5px;
|
|
196
|
+
padding-right: 40px;
|
|
197
|
+
}
|
|
198
|
+
.band-body {
|
|
199
|
+
display: grid; grid-template-columns: 1fr 1fr;
|
|
200
|
+
gap: 20px;
|
|
201
|
+
}
|
|
202
|
+
.band-body p {
|
|
203
|
+
font-size: 14px; color: var(--ink-50); line-height: 1.7;
|
|
204
|
+
}
|
|
205
|
+
.band-body .highlight {
|
|
206
|
+
font-family: var(--mono); font-size: 12px; color: var(--accent);
|
|
207
|
+
margin-top: 4px; display: block;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* Dashboard preview */
|
|
211
|
+
.dash-preview {
|
|
212
|
+
max-width: 1120px; margin: 0 auto;
|
|
213
|
+
padding: 0 40px 100px;
|
|
214
|
+
}
|
|
215
|
+
.dash-preview-header {
|
|
216
|
+
display: flex; justify-content: space-between; align-items: baseline;
|
|
217
|
+
margin-bottom: 40px;
|
|
218
|
+
}
|
|
219
|
+
.dash-preview-header h2 {
|
|
220
|
+
font-size: 36px; font-weight: 800; letter-spacing: -1.5px;
|
|
221
|
+
}
|
|
222
|
+
.dash-preview-header p {
|
|
223
|
+
font-size: 14px; color: var(--ink-50); max-width: 360px;
|
|
224
|
+
text-align: right; line-height: 1.6;
|
|
225
|
+
}
|
|
226
|
+
.dash-frame {
|
|
227
|
+
border: 1px solid var(--ink-08);
|
|
228
|
+
background: var(--bg);
|
|
229
|
+
}
|
|
230
|
+
.dash-top {
|
|
231
|
+
display: flex; align-items: center; gap: 8px;
|
|
232
|
+
padding: 10px 16px; border-bottom: 1px solid var(--ink-08);
|
|
233
|
+
}
|
|
234
|
+
.dash-dot {
|
|
235
|
+
width: 8px; height: 8px; border-radius: 50%;
|
|
236
|
+
background: var(--ink-08);
|
|
237
|
+
}
|
|
238
|
+
.dash-url {
|
|
239
|
+
flex: 1; font-family: var(--mono); font-size: 11px;
|
|
240
|
+
color: var(--ink-30); margin-left: 8px;
|
|
241
|
+
}
|
|
242
|
+
.dash-content {
|
|
243
|
+
display: grid; grid-template-columns: 180px 1fr;
|
|
244
|
+
}
|
|
245
|
+
.dash-sidebar {
|
|
246
|
+
border-right: 1px solid var(--ink-08);
|
|
247
|
+
padding: 16px 0;
|
|
248
|
+
}
|
|
249
|
+
.dash-nav-item {
|
|
250
|
+
font-size: 13px; font-weight: 500; padding: 8px 20px;
|
|
251
|
+
color: var(--ink-30); cursor: pointer;
|
|
252
|
+
}
|
|
253
|
+
.dash-nav-item.active { color: var(--ink); background: var(--ink-04); border-left: 2px solid var(--accent); }
|
|
254
|
+
.dash-main { padding: 24px; }
|
|
255
|
+
.dash-kpis {
|
|
256
|
+
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
|
|
257
|
+
margin-bottom: 24px;
|
|
258
|
+
}
|
|
259
|
+
.kpi {
|
|
260
|
+
padding: 16px; border: 1px solid var(--ink-08);
|
|
261
|
+
}
|
|
262
|
+
.kpi .kpi-val { font-size: 28px; font-weight: 800; letter-spacing: -1px; }
|
|
263
|
+
.kpi .kpi-label { font-size: 11px; color: var(--ink-30); font-weight: 500; margin-top: 2px; }
|
|
264
|
+
.kpi .kpi-delta { font-family: var(--mono); font-size: 11px; color: var(--accent); margin-top: 4px; }
|
|
265
|
+
|
|
266
|
+
.dash-table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
|
267
|
+
.dash-table th {
|
|
268
|
+
font-family: var(--mono); font-size: 10px; font-weight: 500;
|
|
269
|
+
color: var(--ink-30); text-transform: uppercase; letter-spacing: 1px;
|
|
270
|
+
text-align: left; padding: 8px 12px;
|
|
271
|
+
border-bottom: 1px solid var(--ink-08);
|
|
272
|
+
}
|
|
273
|
+
.dash-table td {
|
|
274
|
+
padding: 10px 12px; border-bottom: 1px solid var(--ink-04);
|
|
275
|
+
color: var(--ink-50);
|
|
276
|
+
}
|
|
277
|
+
.dash-table td:first-child { font-family: var(--mono); font-size: 12px; color: var(--ink-30); }
|
|
278
|
+
.dash-table .amount { text-align: right; font-weight: 600; color: var(--ink); font-family: var(--mono); font-size: 12px; }
|
|
279
|
+
.dash-table .status-ok { color: #16803c; font-family: var(--mono); font-size: 11px; }
|
|
280
|
+
.dash-table .status-pend { color: var(--ink-30); font-family: var(--mono); font-size: 11px; }
|
|
281
|
+
|
|
282
|
+
/* Two-column feature highlight */
|
|
283
|
+
.feature-highlight {
|
|
284
|
+
max-width: 1120px; margin: 0 auto;
|
|
285
|
+
padding: 0 40px 100px;
|
|
286
|
+
display: grid; grid-template-columns: 1fr 1fr;
|
|
287
|
+
gap: 80px;
|
|
288
|
+
}
|
|
289
|
+
.fh-block h3 {
|
|
290
|
+
font-size: 28px; font-weight: 800; letter-spacing: -1px;
|
|
291
|
+
margin-bottom: 16px; line-height: 1.15;
|
|
292
|
+
}
|
|
293
|
+
.fh-block p {
|
|
294
|
+
font-size: 14px; color: var(--ink-50); line-height: 1.7;
|
|
295
|
+
margin-bottom: 16px;
|
|
296
|
+
}
|
|
297
|
+
.fh-list {
|
|
298
|
+
list-style: none; display: flex; flex-direction: column; gap: 8px;
|
|
299
|
+
}
|
|
300
|
+
.fh-list li {
|
|
301
|
+
font-size: 13px; color: var(--ink-50);
|
|
302
|
+
padding-left: 20px; position: relative;
|
|
303
|
+
}
|
|
304
|
+
.fh-list li::before {
|
|
305
|
+
content: '';
|
|
306
|
+
position: absolute; left: 0; top: 7px;
|
|
307
|
+
width: 8px; height: 1px; background: var(--accent);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* Install strip */
|
|
311
|
+
.install-strip {
|
|
312
|
+
max-width: 1120px; margin: 0 auto;
|
|
313
|
+
padding: 0 40px 100px;
|
|
314
|
+
}
|
|
315
|
+
.install-grid {
|
|
316
|
+
display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px;
|
|
317
|
+
background: var(--ink-08);
|
|
318
|
+
}
|
|
319
|
+
.install-cell {
|
|
320
|
+
background: var(--bg); padding: 24px;
|
|
321
|
+
}
|
|
322
|
+
.install-cell .lang {
|
|
323
|
+
font-family: var(--mono); font-size: 11px; font-weight: 500;
|
|
324
|
+
color: var(--ink-30); text-transform: uppercase; letter-spacing: 1px;
|
|
325
|
+
margin-bottom: 12px;
|
|
326
|
+
}
|
|
327
|
+
.install-cell .cmd {
|
|
328
|
+
font-family: var(--mono); font-size: 12px; color: var(--ink-50);
|
|
329
|
+
background: var(--ink-04); padding: 10px 14px;
|
|
330
|
+
}
|
|
331
|
+
.install-cell .cmd span { color: var(--accent); }
|
|
332
|
+
|
|
333
|
+
/* CTA */
|
|
334
|
+
.cta {
|
|
335
|
+
max-width: 1120px; margin: 0 auto;
|
|
336
|
+
padding: 100px 40px;
|
|
337
|
+
border-top: 2px solid var(--ink);
|
|
338
|
+
}
|
|
339
|
+
.cta h2 {
|
|
340
|
+
font-size: 44px; font-weight: 800; letter-spacing: -2px;
|
|
341
|
+
margin-bottom: 16px; max-width: 600px; line-height: 1.05;
|
|
342
|
+
}
|
|
343
|
+
.cta p {
|
|
344
|
+
font-size: 15px; color: var(--ink-50); margin-bottom: 36px;
|
|
345
|
+
max-width: 480px; line-height: 1.7;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* Footer */
|
|
349
|
+
footer {
|
|
350
|
+
max-width: 1120px; margin: 0 auto;
|
|
351
|
+
padding: 40px;
|
|
352
|
+
border-top: 1px solid var(--ink-08);
|
|
353
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
354
|
+
}
|
|
355
|
+
footer .f-brand { font-weight: 800; font-size: 15px; }
|
|
356
|
+
footer .f-links { display: flex; gap: 28px; }
|
|
357
|
+
footer .f-links a {
|
|
358
|
+
font-size: 13px; color: var(--ink-30); text-decoration: none;
|
|
359
|
+
font-weight: 500;
|
|
360
|
+
}
|
|
361
|
+
footer .f-links a:hover { color: var(--ink); }
|
|
362
|
+
footer .f-copy { font-size: 12px; color: var(--ink-30); }
|
|
363
|
+
|
|
364
|
+
/* Mobile */
|
|
365
|
+
@media (max-width: 900px) {
|
|
366
|
+
.hero { padding: 80px 24px 60px; }
|
|
367
|
+
.hero h1 { font-size: 48px; letter-spacing: -2px; }
|
|
368
|
+
.split-container { grid-template-columns: 1fr; }
|
|
369
|
+
.split-left { border-right: none; border-bottom: 1px solid var(--ink-08); }
|
|
370
|
+
.numbers { grid-template-columns: repeat(2, 1fr); gap: 24px; }
|
|
371
|
+
.band { grid-template-columns: 1fr; gap: 12px; }
|
|
372
|
+
.band-body { grid-template-columns: 1fr; }
|
|
373
|
+
.dash-content { grid-template-columns: 1fr; }
|
|
374
|
+
.dash-sidebar { display: none; }
|
|
375
|
+
.dash-kpis { grid-template-columns: 1fr; }
|
|
376
|
+
.feature-highlight { grid-template-columns: 1fr; gap: 48px; }
|
|
377
|
+
.install-grid { grid-template-columns: 1fr 1fr; }
|
|
378
|
+
.dash-preview-header { flex-direction: column; gap: 16px; }
|
|
379
|
+
.dash-preview-header p { text-align: left; }
|
|
380
|
+
nav .links a:not(:last-child) { display: none; }
|
|
381
|
+
.split-meta { position: static; }
|
|
382
|
+
.split-left { position: static; }
|
|
383
|
+
}
|
|
384
|
+
@media (max-width: 560px) {
|
|
385
|
+
nav { padding: 16px 20px; }
|
|
386
|
+
.hero { padding: 60px 20px 48px; }
|
|
387
|
+
.hero h1 { font-size: 36px; letter-spacing: -1.5px; }
|
|
388
|
+
.numbers { grid-template-columns: 1fr; }
|
|
389
|
+
.num-block .value { font-size: 36px; }
|
|
390
|
+
.install-grid { grid-template-columns: 1fr; }
|
|
391
|
+
.cta h2 { font-size: 32px; }
|
|
392
|
+
footer { flex-direction: column; gap: 16px; align-items: flex-start; }
|
|
393
|
+
}
|
|
394
|
+
</style>
|
|
395
|
+
</head>
|
|
396
|
+
<body>
|
|
397
|
+
|
|
398
|
+
<nav>
|
|
399
|
+
<div class="logo">Tender</div>
|
|
400
|
+
<div class="links">
|
|
401
|
+
<a href="#">Products</a>
|
|
402
|
+
<a href="#">Docs</a>
|
|
403
|
+
<a href="#">Pricing</a>
|
|
404
|
+
<button class="nav-btn">Get started</button>
|
|
405
|
+
</div>
|
|
406
|
+
</nav>
|
|
407
|
+
|
|
408
|
+
<!-- HERO -->
|
|
409
|
+
<section class="hero">
|
|
410
|
+
<div class="hero-label">Payments infrastructure</div>
|
|
411
|
+
<h1>Accept payments.<br><span class="thin">Handle everything else.</span></h1>
|
|
412
|
+
<p class="sub">A single API for charges, subscriptions, payouts, and fraud. Tender manages the financial complexity so your team focuses on the product your customers actually see.</p>
|
|
413
|
+
<div class="hero-actions">
|
|
414
|
+
<a href="#" class="btn-primary">Start integrating</a>
|
|
415
|
+
<a href="#" class="btn-ghost">View documentation</a>
|
|
416
|
+
</div>
|
|
417
|
+
</section>
|
|
418
|
+
|
|
419
|
+
<!-- SPLIT DEMO (Signature Move) -->
|
|
420
|
+
<section class="split-demo">
|
|
421
|
+
<div class="split-container">
|
|
422
|
+
<div class="split-left">
|
|
423
|
+
<div class="split-tab-bar">
|
|
424
|
+
<div class="split-tab active">payment.js</div>
|
|
425
|
+
<div class="split-tab">subscription.js</div>
|
|
426
|
+
<div class="split-tab">payout.js</div>
|
|
427
|
+
</div>
|
|
428
|
+
<div class="split-code">
|
|
429
|
+
<span class="cm">// Charge a customer</span>
|
|
430
|
+
<span class="kw">const</span> tender = require(<span class="str">'@tender/node'</span>)(
|
|
431
|
+
process.env.TENDER_SECRET_KEY
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
<span class="kw">const</span> payment = <span class="kw">await</span> tender.payments.create({
|
|
435
|
+
amount: <span class="num">9900</span>,
|
|
436
|
+
currency: <span class="str">'usd'</span>,
|
|
437
|
+
customer: <span class="str">'cus_4f8a2b'</span>,
|
|
438
|
+
payment_method: <span class="str">'pm_card_visa'</span>,
|
|
439
|
+
description: <span class="str">'Pro plan upgrade'</span>,
|
|
440
|
+
metadata: {
|
|
441
|
+
order_id: <span class="str">'ord_7721'</span>,
|
|
442
|
+
campaign: <span class="str">'q2_launch'</span>,
|
|
443
|
+
},
|
|
444
|
+
fraud_check: <span class="kw">true</span>,
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
console.log(payment.status);
|
|
448
|
+
<span class="cm">// => "succeeded"</span>
|
|
449
|
+
</div>
|
|
450
|
+
<div class="split-meta">
|
|
451
|
+
<span>Node.js · @tender/node v4.12.0</span>
|
|
452
|
+
<span>17 lines</span>
|
|
453
|
+
</div>
|
|
454
|
+
</div>
|
|
455
|
+
<div class="split-right">
|
|
456
|
+
<div class="split-tab-bar-dark">
|
|
457
|
+
<div class="split-tab-dark active">Response</div>
|
|
458
|
+
<div class="split-tab-dark">Webhook</div>
|
|
459
|
+
</div>
|
|
460
|
+
<div class="split-code-dark">
|
|
461
|
+
<span class="cm">// 200 OK · 38ms</span>
|
|
462
|
+
{
|
|
463
|
+
<span class="key">"id"</span>: <span class="str">"pay_8Nq2xR4v"</span>,
|
|
464
|
+
<span class="key">"object"</span>: <span class="str">"payment"</span>,
|
|
465
|
+
<span class="key">"amount"</span>: <span class="num">9900</span>,
|
|
466
|
+
<span class="key">"currency"</span>: <span class="str">"usd"</span>,
|
|
467
|
+
<span class="key">"status"</span>: <span class="str">"succeeded"</span>,
|
|
468
|
+
<span class="key">"fraud_score"</span>: <span class="num">0.01</span>,
|
|
469
|
+
<span class="key">"fraud_decision"</span>: <span class="str">"allow"</span>,
|
|
470
|
+
<span class="key">"payment_method"</span>: {
|
|
471
|
+
<span class="key">"type"</span>: <span class="str">"card"</span>,
|
|
472
|
+
<span class="key">"brand"</span>: <span class="str">"visa"</span>,
|
|
473
|
+
<span class="key">"last4"</span>: <span class="str">"4242"</span>,
|
|
474
|
+
<span class="key">"exp_month"</span>: <span class="num">12</span>,
|
|
475
|
+
<span class="key">"exp_year"</span>: <span class="num">2028</span>
|
|
476
|
+
},
|
|
477
|
+
<span class="key">"receipt_url"</span>: <span class="str">"https://tender.io/r/pay_8Nq2xR4v"</span>,
|
|
478
|
+
<span class="key">"created"</span>: <span class="num">1750608000</span>
|
|
479
|
+
}
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
</div>
|
|
483
|
+
</section>
|
|
484
|
+
|
|
485
|
+
<!-- NUMBERS -->
|
|
486
|
+
<section class="numbers">
|
|
487
|
+
<div class="num-block">
|
|
488
|
+
<div class="num-divider"></div>
|
|
489
|
+
<div class="value">99.997<span class="unit">%</span></div>
|
|
490
|
+
<div class="label">API uptime, trailing 90 days</div>
|
|
491
|
+
</div>
|
|
492
|
+
<div class="num-block">
|
|
493
|
+
<div class="num-divider"></div>
|
|
494
|
+
<div class="value">135<span class="unit">+</span></div>
|
|
495
|
+
<div class="label">Currencies accepted</div>
|
|
496
|
+
</div>
|
|
497
|
+
<div class="num-block">
|
|
498
|
+
<div class="num-divider"></div>
|
|
499
|
+
<div class="value">38<span class="unit">ms</span></div>
|
|
500
|
+
<div class="label">Median API response</div>
|
|
501
|
+
</div>
|
|
502
|
+
<div class="num-block">
|
|
503
|
+
<div class="num-divider"></div>
|
|
504
|
+
<div class="value">$410<span class="unit">B</span></div>
|
|
505
|
+
<div class="label">Processed per year</div>
|
|
506
|
+
</div>
|
|
507
|
+
</section>
|
|
508
|
+
|
|
509
|
+
<!-- FEATURE BANDS -->
|
|
510
|
+
<section class="feature-bands">
|
|
511
|
+
<div class="band-header">Capabilities</div>
|
|
512
|
+
|
|
513
|
+
<div class="band">
|
|
514
|
+
<div class="band-title">Payments</div>
|
|
515
|
+
<div class="band-body">
|
|
516
|
+
<p>Accept cards, wallets, bank debits, BNPL, and 50+ local methods through a single integration. Intelligent routing picks the cheapest acquirer with the highest authorization rate.</p>
|
|
517
|
+
<p>Automatic 3D Secure for SCA-regulated markets. Network tokenization for returning customers. Retry logic on soft declines that recovers revenue without customer friction.
|
|
518
|
+
<span class="highlight">50+ payment methods, 1 API</span>
|
|
519
|
+
</p>
|
|
520
|
+
</div>
|
|
521
|
+
</div>
|
|
522
|
+
|
|
523
|
+
<div class="band">
|
|
524
|
+
<div class="band-title">Subscriptions</div>
|
|
525
|
+
<div class="band-body">
|
|
526
|
+
<p>Flat-rate, per-seat, tiered, and usage-based models. Proration calculated to the second on mid-cycle plan changes. Automated dunning with configurable retry schedules and grace periods.</p>
|
|
527
|
+
<p>Generate tax-compliant invoices with line-item detail. Revenue recognition schedules for your finance team. Trial periods, coupons, and add-ons without custom code.
|
|
528
|
+
<span class="highlight">Billing that scales with your pricing model</span>
|
|
529
|
+
</p>
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
|
|
533
|
+
<div class="band">
|
|
534
|
+
<div class="band-title">Payouts</div>
|
|
535
|
+
<div class="band-body">
|
|
536
|
+
<p>Send funds to bank accounts in 45+ countries. Marketplace split payments distribute revenue to sellers automatically. Real-time payout tracking with webhook notifications at every stage.</p>
|
|
537
|
+
<p>Automatic currency conversion at competitive FX rates. Batch payouts for high-volume platforms. Configurable payout schedules: daily, weekly, monthly, or manual.
|
|
538
|
+
<span class="highlight">45+ countries, local rails</span>
|
|
539
|
+
</p>
|
|
540
|
+
</div>
|
|
541
|
+
</div>
|
|
542
|
+
|
|
543
|
+
<div class="band">
|
|
544
|
+
<div class="band-title">Fraud</div>
|
|
545
|
+
<div class="band-body">
|
|
546
|
+
<p>Machine-learned risk scoring on every transaction using network-wide behavioral signals. Custom rules engine for business-specific fraud patterns. Adaptive 3D Secure triggered only when needed.</p>
|
|
547
|
+
<p>Chargeback management with automated evidence submission. Dispute analytics to identify fraud vectors. Radar updates continuously with data from the entire Tender network.
|
|
548
|
+
<span class="highlight">ML-powered, real-time, adaptive</span>
|
|
549
|
+
</p>
|
|
550
|
+
</div>
|
|
551
|
+
</div>
|
|
552
|
+
</section>
|
|
553
|
+
|
|
554
|
+
<!-- DASHBOARD -->
|
|
555
|
+
<section class="dash-preview">
|
|
556
|
+
<div class="dash-preview-header">
|
|
557
|
+
<h2>Built for finance teams too</h2>
|
|
558
|
+
<p>Real-time visibility into every transaction, payout, and dispute. Role-based access. Export to your ERP.</p>
|
|
559
|
+
</div>
|
|
560
|
+
<div class="dash-frame">
|
|
561
|
+
<div class="dash-top">
|
|
562
|
+
<div class="dash-dot"></div>
|
|
563
|
+
<div class="dash-dot"></div>
|
|
564
|
+
<div class="dash-dot"></div>
|
|
565
|
+
<div class="dash-url">dashboard.tender.io/payments</div>
|
|
566
|
+
</div>
|
|
567
|
+
<div class="dash-content">
|
|
568
|
+
<div class="dash-sidebar">
|
|
569
|
+
<div class="dash-nav-item active">Payments</div>
|
|
570
|
+
<div class="dash-nav-item">Subscriptions</div>
|
|
571
|
+
<div class="dash-nav-item">Payouts</div>
|
|
572
|
+
<div class="dash-nav-item">Customers</div>
|
|
573
|
+
<div class="dash-nav-item">Disputes</div>
|
|
574
|
+
<div class="dash-nav-item">Reports</div>
|
|
575
|
+
</div>
|
|
576
|
+
<div class="dash-main">
|
|
577
|
+
<div class="dash-kpis">
|
|
578
|
+
<div class="kpi">
|
|
579
|
+
<div class="kpi-val">$1.82M</div>
|
|
580
|
+
<div class="kpi-label">Gross volume (MTD)</div>
|
|
581
|
+
<div class="kpi-delta">+14.2% vs last month</div>
|
|
582
|
+
</div>
|
|
583
|
+
<div class="kpi">
|
|
584
|
+
<div class="kpi-val">97.3%</div>
|
|
585
|
+
<div class="kpi-label">Authorization rate</div>
|
|
586
|
+
<div class="kpi-delta">+0.8pp vs last month</div>
|
|
587
|
+
</div>
|
|
588
|
+
<div class="kpi">
|
|
589
|
+
<div class="kpi-val">0.03%</div>
|
|
590
|
+
<div class="kpi-label">Dispute rate</div>
|
|
591
|
+
<div class="kpi-delta">-0.02pp vs last month</div>
|
|
592
|
+
</div>
|
|
593
|
+
</div>
|
|
594
|
+
<table class="dash-table">
|
|
595
|
+
<thead>
|
|
596
|
+
<tr>
|
|
597
|
+
<th>ID</th>
|
|
598
|
+
<th>Customer</th>
|
|
599
|
+
<th>Description</th>
|
|
600
|
+
<th>Status</th>
|
|
601
|
+
<th style="text-align:right">Amount</th>
|
|
602
|
+
</tr>
|
|
603
|
+
</thead>
|
|
604
|
+
<tbody>
|
|
605
|
+
<tr>
|
|
606
|
+
<td>pay_9xK2m</td>
|
|
607
|
+
<td>Acme Corp</td>
|
|
608
|
+
<td>Enterprise annual</td>
|
|
609
|
+
<td><span class="status-ok">succeeded</span></td>
|
|
610
|
+
<td class="amount">$48,000.00</td>
|
|
611
|
+
</tr>
|
|
612
|
+
<tr>
|
|
613
|
+
<td>pay_8wJ1n</td>
|
|
614
|
+
<td>DataFlow Inc</td>
|
|
615
|
+
<td>Usage billing</td>
|
|
616
|
+
<td><span class="status-ok">succeeded</span></td>
|
|
617
|
+
<td class="amount">$2,847.63</td>
|
|
618
|
+
</tr>
|
|
619
|
+
<tr>
|
|
620
|
+
<td>pay_7vH0p</td>
|
|
621
|
+
<td>ShipFast</td>
|
|
622
|
+
<td>Marketplace fee</td>
|
|
623
|
+
<td><span class="status-ok">succeeded</span></td>
|
|
624
|
+
<td class="amount">$1,240.00</td>
|
|
625
|
+
</tr>
|
|
626
|
+
<tr>
|
|
627
|
+
<td>pay_6uG9q</td>
|
|
628
|
+
<td>Nomad Labs</td>
|
|
629
|
+
<td>Pro monthly</td>
|
|
630
|
+
<td><span class="status-pend">processing</span></td>
|
|
631
|
+
<td class="amount">$99.00</td>
|
|
632
|
+
</tr>
|
|
633
|
+
<tr>
|
|
634
|
+
<td>pay_5tF8r</td>
|
|
635
|
+
<td>Kai Studios</td>
|
|
636
|
+
<td>Team upgrade</td>
|
|
637
|
+
<td><span class="status-ok">succeeded</span></td>
|
|
638
|
+
<td class="amount">$4,500.00</td>
|
|
639
|
+
</tr>
|
|
640
|
+
</tbody>
|
|
641
|
+
</table>
|
|
642
|
+
</div>
|
|
643
|
+
</div>
|
|
644
|
+
</div>
|
|
645
|
+
</section>
|
|
646
|
+
|
|
647
|
+
<!-- TWO-COLUMN HIGHLIGHTS -->
|
|
648
|
+
<section class="feature-highlight">
|
|
649
|
+
<div class="fh-block">
|
|
650
|
+
<h3>Platform and marketplace tools</h3>
|
|
651
|
+
<p>Build multi-sided platforms without becoming a money transmitter. Connected accounts handle KYC. Split payments, delayed settlements, and platform fees built in.</p>
|
|
652
|
+
<ul class="fh-list">
|
|
653
|
+
<li>Connected account onboarding with KYC/KYB</li>
|
|
654
|
+
<li>Configurable fee structures and revenue splits</li>
|
|
655
|
+
<li>1099-K and VAT reporting automation</li>
|
|
656
|
+
<li>Delayed payouts for quality assurance windows</li>
|
|
657
|
+
<li>Per-account dashboard access for sellers</li>
|
|
658
|
+
</ul>
|
|
659
|
+
</div>
|
|
660
|
+
<div class="fh-block">
|
|
661
|
+
<h3>Compliance you inherit, not build</h3>
|
|
662
|
+
<p>Tender holds the certifications. You inherit the compliance posture through our API without touching raw card data or managing audit cycles.</p>
|
|
663
|
+
<ul class="fh-list">
|
|
664
|
+
<li>PCI DSS Level 1 certified</li>
|
|
665
|
+
<li>SOC 2 Type II audited annually</li>
|
|
666
|
+
<li>PSD2 SCA handled automatically</li>
|
|
667
|
+
<li>GDPR-compliant data handling</li>
|
|
668
|
+
<li>ISO 27001 information security</li>
|
|
669
|
+
<li>SOX-ready reporting exports</li>
|
|
670
|
+
</ul>
|
|
671
|
+
</div>
|
|
672
|
+
</section>
|
|
673
|
+
|
|
674
|
+
<!-- INSTALL -->
|
|
675
|
+
<section class="install-strip">
|
|
676
|
+
<div class="install-grid">
|
|
677
|
+
<div class="install-cell">
|
|
678
|
+
<div class="lang">Node.js</div>
|
|
679
|
+
<div class="cmd"><span>$</span> npm install @tender/node</div>
|
|
680
|
+
</div>
|
|
681
|
+
<div class="install-cell">
|
|
682
|
+
<div class="lang">Python</div>
|
|
683
|
+
<div class="cmd"><span>$</span> pip install tender</div>
|
|
684
|
+
</div>
|
|
685
|
+
<div class="install-cell">
|
|
686
|
+
<div class="lang">Go</div>
|
|
687
|
+
<div class="cmd"><span>$</span> go get tender.io/go/v2</div>
|
|
688
|
+
</div>
|
|
689
|
+
<div class="install-cell">
|
|
690
|
+
<div class="lang">Ruby</div>
|
|
691
|
+
<div class="cmd"><span>$</span> gem install tender</div>
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
</section>
|
|
695
|
+
|
|
696
|
+
<!-- CTA -->
|
|
697
|
+
<section class="cta">
|
|
698
|
+
<h2>Your first payment in under an hour</h2>
|
|
699
|
+
<p>Tender's test mode mirrors production exactly. No sandbox surprises. Move to live when you're ready with a single key swap.</p>
|
|
700
|
+
<div class="hero-actions">
|
|
701
|
+
<a href="#" class="btn-primary">Create your account</a>
|
|
702
|
+
<a href="#" class="btn-ghost">Read the quickstart</a>
|
|
703
|
+
</div>
|
|
704
|
+
</section>
|
|
705
|
+
|
|
706
|
+
<!-- FOOTER -->
|
|
707
|
+
<footer>
|
|
708
|
+
<div class="f-brand">Tender</div>
|
|
709
|
+
<div class="f-links">
|
|
710
|
+
<a href="#">Products</a>
|
|
711
|
+
<a href="#">Docs</a>
|
|
712
|
+
<a href="#">Pricing</a>
|
|
713
|
+
<a href="#">Status</a>
|
|
714
|
+
<a href="#">Security</a>
|
|
715
|
+
<a href="#">Careers</a>
|
|
716
|
+
</div>
|
|
717
|
+
<div class="f-copy">© 2026 Tender Inc.</div>
|
|
718
|
+
</footer>
|
|
719
|
+
|
|
720
|
+
</body>
|
|
721
|
+
</html>
|