forgedock 1.0.17 → 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 +34 -1
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +229 -17
- package/commands/autopilot.md +77 -0
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/issue.md +7 -3
- package/commands/orchestrate.md +121 -0
- package/commands/qa-sweep.md +37 -2
- package/commands/quality-gate.md +30 -0
- package/commands/review-pr-staging.md +158 -2
- package/commands/test-gate.md +929 -0
- package/commands/work-on/build/implement.md +5 -3
- package/commands/work-on.md +53 -3
- package/docs/CI.md +177 -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/selective-spec-loading-token-savings.md +140 -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/spec-graph-schema.md +397 -0
- package/package.json +1 -1
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/classify-lane.sh +0 -7
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +10 -2
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,711 @@
|
|
|
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 — The Financial Backbone for Internet Business</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=Instrument+Sans:wght@400;500;600;700&family=JetBrains+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: #faf8f5;
|
|
14
|
+
--bg-warm: #f3efe9;
|
|
15
|
+
--surface: #ffffff;
|
|
16
|
+
--ink: #1a1815;
|
|
17
|
+
--ink-mid: #4a4540;
|
|
18
|
+
--ink-light: #8a8478;
|
|
19
|
+
--ink-faint: #c5bfb5;
|
|
20
|
+
--rule: #ddd8cf;
|
|
21
|
+
--accent: #c4501a;
|
|
22
|
+
--accent-light: #c4501a15;
|
|
23
|
+
--serif: 'DM Serif Display', serif;
|
|
24
|
+
--sans: 'Instrument Sans', sans-serif;
|
|
25
|
+
--mono: 'JetBrains Mono', monospace;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
html { font-size: 16px; background: var(--bg); color: var(--ink); }
|
|
29
|
+
body { font-family: var(--sans); line-height: 1.55; -webkit-font-smoothing: antialiased; }
|
|
30
|
+
|
|
31
|
+
/* Utility */
|
|
32
|
+
.container { max-width: 1200px; margin: 0 auto; padding: 0 32px; }
|
|
33
|
+
|
|
34
|
+
/* Nav */
|
|
35
|
+
header {
|
|
36
|
+
padding: 20px 32px;
|
|
37
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
38
|
+
border-bottom: 1px solid var(--rule);
|
|
39
|
+
max-width: 1200px; margin: 0 auto;
|
|
40
|
+
}
|
|
41
|
+
.wordmark {
|
|
42
|
+
font-family: var(--serif); font-size: 22px; letter-spacing: -0.5px;
|
|
43
|
+
}
|
|
44
|
+
header nav { display: flex; gap: 32px; align-items: center; }
|
|
45
|
+
header nav a {
|
|
46
|
+
font-size: 14px; color: var(--ink-mid); text-decoration: none;
|
|
47
|
+
font-weight: 500;
|
|
48
|
+
}
|
|
49
|
+
header nav a:hover { color: var(--ink); }
|
|
50
|
+
.header-cta {
|
|
51
|
+
font-family: var(--sans); font-size: 13px; font-weight: 600;
|
|
52
|
+
background: var(--ink); color: var(--bg); border: none;
|
|
53
|
+
padding: 9px 20px; cursor: pointer;
|
|
54
|
+
letter-spacing: 0.2px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Hero — editorial asymmetric layout (Signature Move: Ledger aesthetic) */
|
|
58
|
+
.hero {
|
|
59
|
+
display: grid; grid-template-columns: 7fr 5fr;
|
|
60
|
+
gap: 0; min-height: 80vh;
|
|
61
|
+
border-bottom: 1px solid var(--rule);
|
|
62
|
+
}
|
|
63
|
+
.hero-editorial {
|
|
64
|
+
padding: 100px 64px 100px 32px;
|
|
65
|
+
display: flex; flex-direction: column; justify-content: center;
|
|
66
|
+
}
|
|
67
|
+
.hero-editorial .edition {
|
|
68
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-light);
|
|
69
|
+
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 32px;
|
|
70
|
+
}
|
|
71
|
+
.hero-editorial h1 {
|
|
72
|
+
font-family: var(--serif); font-size: clamp(42px, 5vw, 68px);
|
|
73
|
+
font-weight: 400; line-height: 1.05; letter-spacing: -1.5px;
|
|
74
|
+
margin-bottom: 28px;
|
|
75
|
+
}
|
|
76
|
+
.hero-editorial h1 em {
|
|
77
|
+
font-style: italic; color: var(--accent);
|
|
78
|
+
}
|
|
79
|
+
.hero-editorial .lede {
|
|
80
|
+
font-size: 17px; color: var(--ink-mid); max-width: 480px;
|
|
81
|
+
line-height: 1.7; margin-bottom: 40px;
|
|
82
|
+
}
|
|
83
|
+
.hero-actions { display: flex; gap: 16px; align-items: center; }
|
|
84
|
+
.btn-dark {
|
|
85
|
+
font-family: var(--sans); font-size: 14px; font-weight: 600;
|
|
86
|
+
background: var(--ink); color: var(--bg); border: none;
|
|
87
|
+
padding: 14px 28px; cursor: pointer; text-decoration: none;
|
|
88
|
+
display: inline-block;
|
|
89
|
+
}
|
|
90
|
+
.btn-outline {
|
|
91
|
+
font-family: var(--sans); font-size: 14px; font-weight: 500;
|
|
92
|
+
color: var(--ink-mid); background: none; border: 1px solid var(--rule);
|
|
93
|
+
padding: 13px 28px; cursor: pointer; text-decoration: none;
|
|
94
|
+
}
|
|
95
|
+
.btn-outline:hover { border-color: var(--ink-mid); }
|
|
96
|
+
|
|
97
|
+
/* Hero right — Financial Ledger (Signature Move) */
|
|
98
|
+
.hero-ledger {
|
|
99
|
+
background: var(--bg-warm);
|
|
100
|
+
border-left: 1px solid var(--rule);
|
|
101
|
+
padding: 48px 32px;
|
|
102
|
+
display: flex; flex-direction: column; justify-content: center;
|
|
103
|
+
}
|
|
104
|
+
.ledger {
|
|
105
|
+
font-family: var(--mono); font-size: 12px; line-height: 1;
|
|
106
|
+
}
|
|
107
|
+
.ledger-title {
|
|
108
|
+
font-family: var(--serif); font-size: 16px; color: var(--ink-light);
|
|
109
|
+
margin-bottom: 24px; font-weight: 400;
|
|
110
|
+
}
|
|
111
|
+
.ledger-row {
|
|
112
|
+
display: grid; grid-template-columns: 80px 1fr 90px 90px;
|
|
113
|
+
padding: 11px 0;
|
|
114
|
+
border-bottom: 1px solid var(--rule);
|
|
115
|
+
align-items: baseline;
|
|
116
|
+
}
|
|
117
|
+
.ledger-row.header {
|
|
118
|
+
font-size: 10px; text-transform: uppercase; letter-spacing: 1.5px;
|
|
119
|
+
color: var(--ink-light); border-bottom: 2px solid var(--ink);
|
|
120
|
+
padding-bottom: 8px; margin-bottom: 4px;
|
|
121
|
+
}
|
|
122
|
+
.ledger-date { color: var(--ink-light); }
|
|
123
|
+
.ledger-desc { color: var(--ink-mid); font-family: var(--sans); font-size: 13px; }
|
|
124
|
+
.ledger-debit { text-align: right; color: var(--ink); }
|
|
125
|
+
.ledger-credit { text-align: right; color: var(--accent); }
|
|
126
|
+
.ledger-total {
|
|
127
|
+
display: grid; grid-template-columns: 80px 1fr 90px 90px;
|
|
128
|
+
padding: 12px 0; border-top: 2px solid var(--ink);
|
|
129
|
+
margin-top: 4px; font-weight: 700;
|
|
130
|
+
}
|
|
131
|
+
.ledger-total .ledger-desc { font-family: var(--mono); font-weight: 700; }
|
|
132
|
+
.ledger-stamp {
|
|
133
|
+
margin-top: 20px; font-family: var(--mono); font-size: 10px;
|
|
134
|
+
color: var(--ink-faint); text-transform: uppercase; letter-spacing: 1px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Pull quote */
|
|
138
|
+
.pull-quote {
|
|
139
|
+
padding: 64px 32px;
|
|
140
|
+
border-bottom: 1px solid var(--rule);
|
|
141
|
+
max-width: 1200px; margin: 0 auto;
|
|
142
|
+
display: grid; grid-template-columns: 1fr 3fr;
|
|
143
|
+
gap: 48px; align-items: baseline;
|
|
144
|
+
}
|
|
145
|
+
.pull-quote .attribution {
|
|
146
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-light);
|
|
147
|
+
text-transform: uppercase; letter-spacing: 1px;
|
|
148
|
+
text-align: right; padding-top: 8px;
|
|
149
|
+
}
|
|
150
|
+
.pull-quote blockquote {
|
|
151
|
+
font-family: var(--serif); font-size: 28px; font-weight: 400;
|
|
152
|
+
line-height: 1.4; letter-spacing: -0.5px; color: var(--ink-mid);
|
|
153
|
+
}
|
|
154
|
+
.pull-quote blockquote em { color: var(--accent); font-style: italic; }
|
|
155
|
+
|
|
156
|
+
/* Three-column editorial features */
|
|
157
|
+
.editorial-features {
|
|
158
|
+
padding: 80px 32px;
|
|
159
|
+
border-bottom: 1px solid var(--rule);
|
|
160
|
+
max-width: 1200px; margin: 0 auto;
|
|
161
|
+
}
|
|
162
|
+
.editorial-features .section-label {
|
|
163
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-light);
|
|
164
|
+
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 48px;
|
|
165
|
+
padding-bottom: 12px; border-bottom: 1px solid var(--rule);
|
|
166
|
+
}
|
|
167
|
+
.feat-columns {
|
|
168
|
+
display: grid; grid-template-columns: 1fr 1fr 1fr;
|
|
169
|
+
gap: 48px;
|
|
170
|
+
}
|
|
171
|
+
.feat-col {
|
|
172
|
+
border-left: 2px solid var(--ink);
|
|
173
|
+
padding-left: 20px;
|
|
174
|
+
}
|
|
175
|
+
.feat-col .num {
|
|
176
|
+
font-family: var(--serif); font-size: 36px; color: var(--ink-faint);
|
|
177
|
+
margin-bottom: 12px;
|
|
178
|
+
}
|
|
179
|
+
.feat-col h3 {
|
|
180
|
+
font-family: var(--serif); font-size: 22px; font-weight: 400;
|
|
181
|
+
margin-bottom: 12px; letter-spacing: -0.3px;
|
|
182
|
+
}
|
|
183
|
+
.feat-col p {
|
|
184
|
+
font-size: 14px; color: var(--ink-mid); line-height: 1.7;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Code spread — asymmetric two-column */
|
|
188
|
+
.code-spread {
|
|
189
|
+
display: grid; grid-template-columns: 5fr 7fr;
|
|
190
|
+
border-bottom: 1px solid var(--rule);
|
|
191
|
+
max-width: 1200px; margin: 0 auto;
|
|
192
|
+
}
|
|
193
|
+
.code-context {
|
|
194
|
+
padding: 80px 48px 80px 32px;
|
|
195
|
+
border-right: 1px solid var(--rule);
|
|
196
|
+
display: flex; flex-direction: column; justify-content: center;
|
|
197
|
+
}
|
|
198
|
+
.code-context .section-label {
|
|
199
|
+
font-family: var(--mono); font-size: 11px; color: var(--accent);
|
|
200
|
+
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 20px;
|
|
201
|
+
}
|
|
202
|
+
.code-context h2 {
|
|
203
|
+
font-family: var(--serif); font-size: 36px; font-weight: 400;
|
|
204
|
+
line-height: 1.15; letter-spacing: -1px; margin-bottom: 16px;
|
|
205
|
+
}
|
|
206
|
+
.code-context p {
|
|
207
|
+
font-size: 14px; color: var(--ink-mid); line-height: 1.7;
|
|
208
|
+
margin-bottom: 20px;
|
|
209
|
+
}
|
|
210
|
+
.code-context .doc-link {
|
|
211
|
+
font-family: var(--mono); font-size: 12px; color: var(--accent);
|
|
212
|
+
text-decoration: none; border-bottom: 1px solid var(--accent);
|
|
213
|
+
padding-bottom: 2px;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.code-block-area { padding: 48px 32px; background: var(--bg-warm); }
|
|
217
|
+
pre.editorial-code {
|
|
218
|
+
background: var(--surface); border: 1px solid var(--rule);
|
|
219
|
+
padding: 24px; font-family: var(--mono); font-size: 12.5px;
|
|
220
|
+
line-height: 1.9; overflow-x: auto; color: var(--ink-mid);
|
|
221
|
+
}
|
|
222
|
+
pre.editorial-code .kw { color: var(--accent); font-weight: 500; }
|
|
223
|
+
pre.editorial-code .str { color: #2a7d4f; }
|
|
224
|
+
pre.editorial-code .num { color: #9a5b13; }
|
|
225
|
+
pre.editorial-code .comment { color: var(--ink-faint); }
|
|
226
|
+
|
|
227
|
+
.response-label {
|
|
228
|
+
font-family: var(--mono); font-size: 10px; color: var(--ink-light);
|
|
229
|
+
text-transform: uppercase; letter-spacing: 1.5px;
|
|
230
|
+
margin: 24px 0 12px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Deep feature sections */
|
|
234
|
+
.deep-features {
|
|
235
|
+
padding: 80px 32px;
|
|
236
|
+
max-width: 1200px; margin: 0 auto;
|
|
237
|
+
border-bottom: 1px solid var(--rule);
|
|
238
|
+
}
|
|
239
|
+
.deep-features .section-label {
|
|
240
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-light);
|
|
241
|
+
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 48px;
|
|
242
|
+
padding-bottom: 12px; border-bottom: 1px solid var(--rule);
|
|
243
|
+
}
|
|
244
|
+
.deep-grid {
|
|
245
|
+
display: grid; grid-template-columns: 1fr 1fr;
|
|
246
|
+
gap: 0;
|
|
247
|
+
}
|
|
248
|
+
.deep-cell {
|
|
249
|
+
padding: 32px;
|
|
250
|
+
border-bottom: 1px solid var(--rule);
|
|
251
|
+
border-right: 1px solid var(--rule);
|
|
252
|
+
}
|
|
253
|
+
.deep-cell:nth-child(even) { border-right: none; }
|
|
254
|
+
.deep-cell:nth-last-child(-n+2) { border-bottom: none; }
|
|
255
|
+
.deep-cell .tag {
|
|
256
|
+
font-family: var(--mono); font-size: 10px; color: var(--accent);
|
|
257
|
+
text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 10px;
|
|
258
|
+
}
|
|
259
|
+
.deep-cell h4 {
|
|
260
|
+
font-family: var(--serif); font-size: 20px; font-weight: 400;
|
|
261
|
+
margin-bottom: 8px; letter-spacing: -0.3px;
|
|
262
|
+
}
|
|
263
|
+
.deep-cell p {
|
|
264
|
+
font-size: 13px; color: var(--ink-mid); line-height: 1.7;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Compliance strip */
|
|
268
|
+
.compliance-strip {
|
|
269
|
+
padding: 48px 32px;
|
|
270
|
+
max-width: 1200px; margin: 0 auto;
|
|
271
|
+
border-bottom: 1px solid var(--rule);
|
|
272
|
+
display: grid; grid-template-columns: 2fr 3fr;
|
|
273
|
+
gap: 48px; align-items: center;
|
|
274
|
+
}
|
|
275
|
+
.compliance-strip h2 {
|
|
276
|
+
font-family: var(--serif); font-size: 32px; font-weight: 400;
|
|
277
|
+
letter-spacing: -0.5px; line-height: 1.2;
|
|
278
|
+
}
|
|
279
|
+
.cert-list {
|
|
280
|
+
display: flex; gap: 0; flex-wrap: wrap;
|
|
281
|
+
}
|
|
282
|
+
.cert-badge {
|
|
283
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-mid);
|
|
284
|
+
padding: 10px 20px; border: 1px solid var(--rule);
|
|
285
|
+
border-right: none; white-space: nowrap;
|
|
286
|
+
}
|
|
287
|
+
.cert-badge:last-child { border-right: 1px solid var(--rule); }
|
|
288
|
+
|
|
289
|
+
/* Global methods */
|
|
290
|
+
.global-section {
|
|
291
|
+
padding: 80px 32px;
|
|
292
|
+
max-width: 1200px; margin: 0 auto;
|
|
293
|
+
border-bottom: 1px solid var(--rule);
|
|
294
|
+
}
|
|
295
|
+
.global-section .section-label {
|
|
296
|
+
font-family: var(--mono); font-size: 11px; color: var(--ink-light);
|
|
297
|
+
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 16px;
|
|
298
|
+
}
|
|
299
|
+
.global-section h2 {
|
|
300
|
+
font-family: var(--serif); font-size: 36px; font-weight: 400;
|
|
301
|
+
letter-spacing: -1px; margin-bottom: 48px;
|
|
302
|
+
}
|
|
303
|
+
.methods-table {
|
|
304
|
+
width: 100%; border-collapse: collapse;
|
|
305
|
+
font-size: 13px;
|
|
306
|
+
}
|
|
307
|
+
.methods-table th {
|
|
308
|
+
font-family: var(--mono); font-size: 10px; color: var(--ink-light);
|
|
309
|
+
text-transform: uppercase; letter-spacing: 1.5px;
|
|
310
|
+
text-align: left; padding: 8px 16px;
|
|
311
|
+
border-bottom: 2px solid var(--ink);
|
|
312
|
+
}
|
|
313
|
+
.methods-table td {
|
|
314
|
+
padding: 12px 16px; border-bottom: 1px solid var(--rule);
|
|
315
|
+
color: var(--ink-mid); vertical-align: top;
|
|
316
|
+
}
|
|
317
|
+
.methods-table td:first-child {
|
|
318
|
+
font-family: var(--mono); font-size: 12px; color: var(--accent);
|
|
319
|
+
font-weight: 500; white-space: nowrap;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* CTA section */
|
|
323
|
+
.cta-section {
|
|
324
|
+
padding: 100px 32px;
|
|
325
|
+
max-width: 1200px; margin: 0 auto;
|
|
326
|
+
text-align: left;
|
|
327
|
+
display: grid; grid-template-columns: 3fr 2fr;
|
|
328
|
+
gap: 48px; align-items: end;
|
|
329
|
+
border-bottom: 1px solid var(--rule);
|
|
330
|
+
}
|
|
331
|
+
.cta-section h2 {
|
|
332
|
+
font-family: var(--serif); font-size: 48px; font-weight: 400;
|
|
333
|
+
letter-spacing: -1.5px; line-height: 1.1; margin-bottom: 20px;
|
|
334
|
+
}
|
|
335
|
+
.cta-section p {
|
|
336
|
+
font-size: 15px; color: var(--ink-mid); line-height: 1.7;
|
|
337
|
+
margin-bottom: 32px; max-width: 480px;
|
|
338
|
+
}
|
|
339
|
+
.cta-right {
|
|
340
|
+
display: flex; flex-direction: column; align-items: flex-end; gap: 12px;
|
|
341
|
+
}
|
|
342
|
+
.cta-right .install-cmd {
|
|
343
|
+
font-family: var(--mono); font-size: 13px; color: var(--ink-mid);
|
|
344
|
+
background: var(--bg-warm); border: 1px solid var(--rule);
|
|
345
|
+
padding: 14px 24px; width: 100%; max-width: 360px;
|
|
346
|
+
}
|
|
347
|
+
.cta-right .install-cmd span { color: var(--accent); }
|
|
348
|
+
|
|
349
|
+
/* Footer */
|
|
350
|
+
footer {
|
|
351
|
+
padding: 48px 32px;
|
|
352
|
+
max-width: 1200px; margin: 0 auto;
|
|
353
|
+
display: grid; grid-template-columns: 3fr 1fr 1fr 1fr;
|
|
354
|
+
gap: 48px;
|
|
355
|
+
}
|
|
356
|
+
footer .brand {
|
|
357
|
+
font-family: var(--serif); font-size: 18px; margin-bottom: 8px;
|
|
358
|
+
}
|
|
359
|
+
footer .sub { font-size: 13px; color: var(--ink-light); }
|
|
360
|
+
footer h5 {
|
|
361
|
+
font-family: var(--mono); font-size: 10px; color: var(--ink-light);
|
|
362
|
+
text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 16px;
|
|
363
|
+
}
|
|
364
|
+
footer ul { list-style: none; }
|
|
365
|
+
footer ul li { margin-bottom: 8px; }
|
|
366
|
+
footer ul li a { color: var(--ink-mid); text-decoration: none; font-size: 13px; }
|
|
367
|
+
footer ul li a:hover { color: var(--ink); }
|
|
368
|
+
|
|
369
|
+
/* Mobile */
|
|
370
|
+
@media (max-width: 900px) {
|
|
371
|
+
.hero { grid-template-columns: 1fr; }
|
|
372
|
+
.hero-ledger { border-left: none; border-top: 1px solid var(--rule); }
|
|
373
|
+
.hero-editorial { padding: 64px 32px; }
|
|
374
|
+
.pull-quote { grid-template-columns: 1fr; gap: 16px; }
|
|
375
|
+
.pull-quote .attribution { text-align: left; }
|
|
376
|
+
.feat-columns { grid-template-columns: 1fr; gap: 32px; }
|
|
377
|
+
.code-spread { grid-template-columns: 1fr; }
|
|
378
|
+
.code-context { border-right: none; border-bottom: 1px solid var(--rule); padding: 48px 32px; }
|
|
379
|
+
.deep-grid { grid-template-columns: 1fr; }
|
|
380
|
+
.deep-cell { border-right: none; }
|
|
381
|
+
.compliance-strip { grid-template-columns: 1fr; }
|
|
382
|
+
.cert-list { flex-wrap: wrap; }
|
|
383
|
+
.cta-section { grid-template-columns: 1fr; }
|
|
384
|
+
.cta-right { align-items: flex-start; }
|
|
385
|
+
footer { grid-template-columns: 1fr 1fr; }
|
|
386
|
+
.ledger-row { grid-template-columns: 60px 1fr 70px 70px; font-size: 11px; }
|
|
387
|
+
header nav { gap: 16px; }
|
|
388
|
+
}
|
|
389
|
+
@media (max-width: 560px) {
|
|
390
|
+
header nav a:not(:first-child) { display: none; }
|
|
391
|
+
footer { grid-template-columns: 1fr; }
|
|
392
|
+
.ledger-row { grid-template-columns: 1fr 70px 70px; }
|
|
393
|
+
.ledger-date { display: none; }
|
|
394
|
+
.methods-table { font-size: 12px; }
|
|
395
|
+
.methods-table td, .methods-table th { padding: 8px; }
|
|
396
|
+
}
|
|
397
|
+
</style>
|
|
398
|
+
</head>
|
|
399
|
+
<body>
|
|
400
|
+
|
|
401
|
+
<header>
|
|
402
|
+
<div class="wordmark">Tender</div>
|
|
403
|
+
<nav>
|
|
404
|
+
<a href="#">Products</a>
|
|
405
|
+
<a href="#">Documentation</a>
|
|
406
|
+
<a href="#">Pricing</a>
|
|
407
|
+
<a href="#">Company</a>
|
|
408
|
+
<button class="header-cta">Start integrating</button>
|
|
409
|
+
</nav>
|
|
410
|
+
</header>
|
|
411
|
+
|
|
412
|
+
<!-- HERO -->
|
|
413
|
+
<section class="hero">
|
|
414
|
+
<div class="hero-editorial">
|
|
415
|
+
<div class="edition">Vol. I — Payments Infrastructure</div>
|
|
416
|
+
<h1>The financial backbone your internet business <em>deserves</em></h1>
|
|
417
|
+
<p class="lede">One integration for payments, payouts, and billing across 135+ currencies. Tender absorbs the regulatory weight — PCI, SCA, local licensing — so your engineers build product and your finance team sleeps.</p>
|
|
418
|
+
<div class="hero-actions">
|
|
419
|
+
<a href="#" class="btn-dark">Start integrating</a>
|
|
420
|
+
<a href="#" class="btn-outline">Read the docs</a>
|
|
421
|
+
</div>
|
|
422
|
+
</div>
|
|
423
|
+
<div class="hero-ledger">
|
|
424
|
+
<div class="ledger-title">General Ledger — June 2026</div>
|
|
425
|
+
<div class="ledger">
|
|
426
|
+
<div class="ledger-row header">
|
|
427
|
+
<span>Date</span>
|
|
428
|
+
<span>Description</span>
|
|
429
|
+
<span style="text-align:right">Debit</span>
|
|
430
|
+
<span style="text-align:right">Credit</span>
|
|
431
|
+
</div>
|
|
432
|
+
<div class="ledger-row">
|
|
433
|
+
<span class="ledger-date">Jun 01</span>
|
|
434
|
+
<span class="ledger-desc">Opening balance carried forward</span>
|
|
435
|
+
<span class="ledger-debit"></span>
|
|
436
|
+
<span class="ledger-credit"></span>
|
|
437
|
+
</div>
|
|
438
|
+
<div class="ledger-row">
|
|
439
|
+
<span class="ledger-date">Jun 03</span>
|
|
440
|
+
<span class="ledger-desc">Acme Corp — SaaS annual renewal</span>
|
|
441
|
+
<span class="ledger-debit">$48,000.00</span>
|
|
442
|
+
<span class="ledger-credit"></span>
|
|
443
|
+
</div>
|
|
444
|
+
<div class="ledger-row">
|
|
445
|
+
<span class="ledger-date">Jun 05</span>
|
|
446
|
+
<span class="ledger-desc">Marketplace payout — 142 sellers</span>
|
|
447
|
+
<span class="ledger-debit"></span>
|
|
448
|
+
<span class="ledger-credit">$31,240.00</span>
|
|
449
|
+
</div>
|
|
450
|
+
<div class="ledger-row">
|
|
451
|
+
<span class="ledger-date">Jun 08</span>
|
|
452
|
+
<span class="ledger-desc">Subscription billing run — 2,847 invoices</span>
|
|
453
|
+
<span class="ledger-debit">$284,700.00</span>
|
|
454
|
+
<span class="ledger-credit"></span>
|
|
455
|
+
</div>
|
|
456
|
+
<div class="ledger-row">
|
|
457
|
+
<span class="ledger-date">Jun 12</span>
|
|
458
|
+
<span class="ledger-desc">Currency settlement EUR → USD</span>
|
|
459
|
+
<span class="ledger-debit">$67,430.00</span>
|
|
460
|
+
<span class="ledger-credit"></span>
|
|
461
|
+
</div>
|
|
462
|
+
<div class="ledger-row">
|
|
463
|
+
<span class="ledger-date">Jun 15</span>
|
|
464
|
+
<span class="ledger-desc">Refunds processed — 23 transactions</span>
|
|
465
|
+
<span class="ledger-debit"></span>
|
|
466
|
+
<span class="ledger-credit">$4,180.00</span>
|
|
467
|
+
</div>
|
|
468
|
+
<div class="ledger-row">
|
|
469
|
+
<span class="ledger-date">Jun 18</span>
|
|
470
|
+
<span class="ledger-desc">Platform fees collected</span>
|
|
471
|
+
<span class="ledger-debit">$12,840.00</span>
|
|
472
|
+
<span class="ledger-credit"></span>
|
|
473
|
+
</div>
|
|
474
|
+
<div class="ledger-row">
|
|
475
|
+
<span class="ledger-date">Jun 22</span>
|
|
476
|
+
<span class="ledger-desc">Weekly payout — operating account</span>
|
|
477
|
+
<span class="ledger-debit"></span>
|
|
478
|
+
<span class="ledger-credit">$156,000.00</span>
|
|
479
|
+
</div>
|
|
480
|
+
<div class="ledger-total">
|
|
481
|
+
<span class="ledger-date"></span>
|
|
482
|
+
<span class="ledger-desc">Period total</span>
|
|
483
|
+
<span class="ledger-debit" style="text-align:right">$412,970.00</span>
|
|
484
|
+
<span class="ledger-credit" style="text-align:right">$191,420.00</span>
|
|
485
|
+
</div>
|
|
486
|
+
</div>
|
|
487
|
+
<div class="ledger-stamp">Reconciled · Automated · Auditable</div>
|
|
488
|
+
</div>
|
|
489
|
+
</section>
|
|
490
|
+
|
|
491
|
+
<!-- PULL QUOTE -->
|
|
492
|
+
<section class="pull-quote">
|
|
493
|
+
<div class="attribution">On building<br>with Tender</div>
|
|
494
|
+
<blockquote>“We replaced four payment vendors, a billing system, and a fraud provider with a single Tender integration. Our payments team went from <em>twelve engineers</em> to <em>three</em>.”</blockquote>
|
|
495
|
+
</section>
|
|
496
|
+
|
|
497
|
+
<!-- THREE PILLARS -->
|
|
498
|
+
<section class="editorial-features">
|
|
499
|
+
<div class="section-label">What Tender replaces</div>
|
|
500
|
+
<div class="feat-columns">
|
|
501
|
+
<div class="feat-col">
|
|
502
|
+
<div class="num">01</div>
|
|
503
|
+
<h3>Payment gateway + processor</h3>
|
|
504
|
+
<p>Accept cards, wallets, bank transfers, and 50+ local methods through one API. Intelligent routing optimizes for authorization rate and cost. Automatic 3D Secure for SCA markets. Retry logic that recovers revenue silently.</p>
|
|
505
|
+
</div>
|
|
506
|
+
<div class="feat-col">
|
|
507
|
+
<div class="num">02</div>
|
|
508
|
+
<h3>Billing and invoicing engine</h3>
|
|
509
|
+
<p>Flat-rate, per-seat, tiered, and metered models. Proration to the second on plan changes. Automated dunning with configurable retry cadence. Tax-ready invoices with line-item detail. Revenue recognition schedules for your controller.</p>
|
|
510
|
+
</div>
|
|
511
|
+
<div class="feat-col">
|
|
512
|
+
<div class="num">03</div>
|
|
513
|
+
<h3>Fraud and compliance stack</h3>
|
|
514
|
+
<p>ML-powered risk scoring on every transaction. Custom rules engine for business-specific signals. PCI DSS Level 1 and SOC 2 Type II certified. PSD2 SCA compliance handled automatically. You never touch raw card data.</p>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
</section>
|
|
518
|
+
|
|
519
|
+
<!-- CODE -->
|
|
520
|
+
<section class="code-spread">
|
|
521
|
+
<div class="code-context">
|
|
522
|
+
<div class="section-label">Developer experience</div>
|
|
523
|
+
<h2>Seven lines to your first payment</h2>
|
|
524
|
+
<p>Tender's API is designed for engineers who read documentation. Predictable REST endpoints, idempotency keys on every write, typed SDKs for every major language, and webhook signatures you can verify in one line.</p>
|
|
525
|
+
<a href="#" class="doc-link">Read the API reference →</a>
|
|
526
|
+
</div>
|
|
527
|
+
<div class="code-block-area">
|
|
528
|
+
<pre class="editorial-code"><span class="comment"># Create a subscription with metered billing</span>
|
|
529
|
+
<span class="kw">import</span> tender
|
|
530
|
+
|
|
531
|
+
subscription = tender.Subscription.create(
|
|
532
|
+
customer=<span class="str">"cus_acme_corp"</span>,
|
|
533
|
+
items=[{
|
|
534
|
+
<span class="str">"price"</span>: <span class="str">"price_pro_monthly"</span>,
|
|
535
|
+
<span class="str">"quantity"</span>: <span class="num">5</span>, <span class="comment"># 5 seats</span>
|
|
536
|
+
}, {
|
|
537
|
+
<span class="str">"price"</span>: <span class="str">"price_api_metered"</span>,
|
|
538
|
+
<span class="comment"># Usage reported separately</span>
|
|
539
|
+
}],
|
|
540
|
+
payment_behavior=<span class="str">"default_incomplete"</span>,
|
|
541
|
+
proration_behavior=<span class="str">"create_prorations"</span>,
|
|
542
|
+
expand=[<span class="str">"latest_invoice.payment_intent"</span>],
|
|
543
|
+
)</pre>
|
|
544
|
+
<div class="response-label">Response · 201 Created · 52ms</div>
|
|
545
|
+
<pre class="editorial-code">{
|
|
546
|
+
<span class="str">"id"</span>: <span class="str">"sub_1Qx4kL9v"</span>,
|
|
547
|
+
<span class="str">"status"</span>: <span class="str">"active"</span>,
|
|
548
|
+
<span class="str">"current_period_end"</span>: <span class="num">1753228800</span>,
|
|
549
|
+
<span class="str">"items"</span>: {
|
|
550
|
+
<span class="str">"data"</span>: [
|
|
551
|
+
{ <span class="str">"price"</span>: <span class="str">"price_pro_monthly"</span>, <span class="str">"quantity"</span>: <span class="num">5</span> },
|
|
552
|
+
{ <span class="str">"price"</span>: <span class="str">"price_api_metered"</span>, <span class="str">"quantity"</span>: <span class="num">0</span> }
|
|
553
|
+
]
|
|
554
|
+
},
|
|
555
|
+
<span class="str">"latest_invoice"</span>: {
|
|
556
|
+
<span class="str">"amount_due"</span>: <span class="num">49500</span>,
|
|
557
|
+
<span class="str">"payment_intent"</span>: {
|
|
558
|
+
<span class="str">"status"</span>: <span class="str">"succeeded"</span>,
|
|
559
|
+
<span class="str">"client_secret"</span>: <span class="str">"pi_...secret_..."</span>
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}</pre>
|
|
563
|
+
</div>
|
|
564
|
+
</section>
|
|
565
|
+
|
|
566
|
+
<!-- DEEP FEATURES -->
|
|
567
|
+
<section class="deep-features">
|
|
568
|
+
<div class="section-label">Capabilities in depth</div>
|
|
569
|
+
<div class="deep-grid">
|
|
570
|
+
<div class="deep-cell">
|
|
571
|
+
<div class="tag">Payouts</div>
|
|
572
|
+
<h4>Move money to anyone, anywhere</h4>
|
|
573
|
+
<p>Send funds to bank accounts in 45+ countries. Split payments across marketplace participants. Real-time tracking via webhooks. Automatic currency conversion at competitive FX rates.</p>
|
|
574
|
+
</div>
|
|
575
|
+
<div class="deep-cell">
|
|
576
|
+
<div class="tag">Dashboard</div>
|
|
577
|
+
<h4>Finance team command center</h4>
|
|
578
|
+
<p>Search any transaction in milliseconds. Drill down from aggregate to individual payment. Export reports to your ERP. Role-based access for operators, analysts, and executives.</p>
|
|
579
|
+
</div>
|
|
580
|
+
<div class="deep-cell">
|
|
581
|
+
<div class="tag">Platform</div>
|
|
582
|
+
<h4>Multi-party money flows</h4>
|
|
583
|
+
<p>Connected accounts with KYC onboarding. Delayed settlements and custom fee structures. 1099-K and VAT reporting. Build a marketplace without the money transmitter license.</p>
|
|
584
|
+
</div>
|
|
585
|
+
<div class="deep-cell">
|
|
586
|
+
<div class="tag">Webhooks</div>
|
|
587
|
+
<h4>Event-driven, not polling</h4>
|
|
588
|
+
<p>200+ event types with at-least-once delivery. Cryptographic signatures. Automatic retries with exponential backoff. Event replay for disaster recovery. Test mode for development.</p>
|
|
589
|
+
</div>
|
|
590
|
+
<div class="deep-cell">
|
|
591
|
+
<div class="tag">Smart Routing</div>
|
|
592
|
+
<h4>Maximize authorization rates</h4>
|
|
593
|
+
<p>ML-optimized routing across acquiring banks. Automatic retry on soft declines. Network tokenization for higher approval rates. Regional routing to reduce cross-border fees.</p>
|
|
594
|
+
</div>
|
|
595
|
+
<div class="deep-cell">
|
|
596
|
+
<div class="tag">SDKs</div>
|
|
597
|
+
<h4>Your language, typed</h4>
|
|
598
|
+
<p>First-party libraries for Node, Python, Go, Ruby, PHP, Java, .NET. Auto-generated from our OpenAPI spec. Fully typed. Semantic versioning. Drop-in client initialization.</p>
|
|
599
|
+
</div>
|
|
600
|
+
</div>
|
|
601
|
+
</section>
|
|
602
|
+
|
|
603
|
+
<!-- COMPLIANCE -->
|
|
604
|
+
<section class="compliance-strip">
|
|
605
|
+
<h2>Compliance is our problem,<br>not yours</h2>
|
|
606
|
+
<div class="cert-list">
|
|
607
|
+
<div class="cert-badge">PCI DSS L1</div>
|
|
608
|
+
<div class="cert-badge">SOC 2 Type II</div>
|
|
609
|
+
<div class="cert-badge">PSD2 / SCA</div>
|
|
610
|
+
<div class="cert-badge">GDPR</div>
|
|
611
|
+
<div class="cert-badge">ISO 27001</div>
|
|
612
|
+
<div class="cert-badge">SOX Ready</div>
|
|
613
|
+
</div>
|
|
614
|
+
</section>
|
|
615
|
+
|
|
616
|
+
<!-- GLOBAL -->
|
|
617
|
+
<section class="global-section">
|
|
618
|
+
<div class="section-label">Global reach</div>
|
|
619
|
+
<h2>Local payment methods, worldwide</h2>
|
|
620
|
+
<table class="methods-table">
|
|
621
|
+
<thead>
|
|
622
|
+
<tr>
|
|
623
|
+
<th>Region</th>
|
|
624
|
+
<th>Payment methods</th>
|
|
625
|
+
<th>Currencies</th>
|
|
626
|
+
</tr>
|
|
627
|
+
</thead>
|
|
628
|
+
<tbody>
|
|
629
|
+
<tr>
|
|
630
|
+
<td>North America</td>
|
|
631
|
+
<td>Visa, Mastercard, Amex, Discover, ACH, Apple Pay, Google Pay</td>
|
|
632
|
+
<td>USD, CAD</td>
|
|
633
|
+
</tr>
|
|
634
|
+
<tr>
|
|
635
|
+
<td>Europe</td>
|
|
636
|
+
<td>SEPA DD, iDEAL, Bancontact, Sofort, Klarna, Giropay, Przelewy24</td>
|
|
637
|
+
<td>EUR, GBP, SEK, NOK, DKK, CHF, PLN, CZK</td>
|
|
638
|
+
</tr>
|
|
639
|
+
<tr>
|
|
640
|
+
<td>Asia-Pacific</td>
|
|
641
|
+
<td>Alipay, WeChat Pay, Konbini, UPI, GrabPay, GCash, PayNow</td>
|
|
642
|
+
<td>JPY, CNY, INR, SGD, AUD, HKD, THB</td>
|
|
643
|
+
</tr>
|
|
644
|
+
<tr>
|
|
645
|
+
<td>Latin America</td>
|
|
646
|
+
<td>PIX, Boleto, OXXO, SPEI, Mercado Pago, PSE</td>
|
|
647
|
+
<td>BRL, MXN, COP, ARS, CLP</td>
|
|
648
|
+
</tr>
|
|
649
|
+
<tr>
|
|
650
|
+
<td>Africa / MENA</td>
|
|
651
|
+
<td>M-Pesa, Flutterwave, KNET, Mada, Fawry, Paystack</td>
|
|
652
|
+
<td>NGN, KES, ZAR, AED, SAR, EGP</td>
|
|
653
|
+
</tr>
|
|
654
|
+
</tbody>
|
|
655
|
+
</table>
|
|
656
|
+
</section>
|
|
657
|
+
|
|
658
|
+
<!-- CTA -->
|
|
659
|
+
<section class="cta-section">
|
|
660
|
+
<div>
|
|
661
|
+
<h2>Ready to simplify your money infrastructure?</h2>
|
|
662
|
+
<p>Get from zero to first payment in under an hour. Tender's test mode mirrors production exactly — no surprises at launch.</p>
|
|
663
|
+
<div class="hero-actions">
|
|
664
|
+
<a href="#" class="btn-dark">Create your account</a>
|
|
665
|
+
<a href="#" class="btn-outline">View documentation</a>
|
|
666
|
+
</div>
|
|
667
|
+
</div>
|
|
668
|
+
<div class="cta-right">
|
|
669
|
+
<div class="install-cmd"><span>$</span> pip install tender</div>
|
|
670
|
+
<div class="install-cmd"><span>$</span> npm install @tender/node</div>
|
|
671
|
+
<div class="install-cmd"><span>$</span> go get tender.io/go/v2</div>
|
|
672
|
+
</div>
|
|
673
|
+
</section>
|
|
674
|
+
|
|
675
|
+
<!-- FOOTER -->
|
|
676
|
+
<footer>
|
|
677
|
+
<div>
|
|
678
|
+
<div class="brand">Tender</div>
|
|
679
|
+
<div class="sub">Payments infrastructure for the internet economy.</div>
|
|
680
|
+
</div>
|
|
681
|
+
<div>
|
|
682
|
+
<h5>Product</h5>
|
|
683
|
+
<ul>
|
|
684
|
+
<li><a href="#">Payments</a></li>
|
|
685
|
+
<li><a href="#">Billing</a></li>
|
|
686
|
+
<li><a href="#">Payouts</a></li>
|
|
687
|
+
<li><a href="#">Fraud</a></li>
|
|
688
|
+
</ul>
|
|
689
|
+
</div>
|
|
690
|
+
<div>
|
|
691
|
+
<h5>Developers</h5>
|
|
692
|
+
<ul>
|
|
693
|
+
<li><a href="#">Docs</a></li>
|
|
694
|
+
<li><a href="#">API Reference</a></li>
|
|
695
|
+
<li><a href="#">SDKs</a></li>
|
|
696
|
+
<li><a href="#">Status</a></li>
|
|
697
|
+
</ul>
|
|
698
|
+
</div>
|
|
699
|
+
<div>
|
|
700
|
+
<h5>Company</h5>
|
|
701
|
+
<ul>
|
|
702
|
+
<li><a href="#">About</a></li>
|
|
703
|
+
<li><a href="#">Careers</a></li>
|
|
704
|
+
<li><a href="#">Security</a></li>
|
|
705
|
+
<li><a href="#">Contact</a></li>
|
|
706
|
+
</ul>
|
|
707
|
+
</div>
|
|
708
|
+
</footer>
|
|
709
|
+
|
|
710
|
+
</body>
|
|
711
|
+
</html>
|