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.
Files changed (190) hide show
  1. package/README.md +54 -3
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +2205 -541
  4. package/bin/github-app-manifest.json.license +2 -0
  5. package/bin/hooks/session-start.mjs +4 -5
  6. package/bin/registry.mjs +20 -0
  7. package/bin/tui.mjs +172 -96
  8. package/commands/adopt.md +433 -0
  9. package/commands/analytics.md +2 -0
  10. package/commands/audit-agents.md +2 -0
  11. package/commands/audit.md +2 -0
  12. package/commands/autopilot.md +77 -0
  13. package/commands/changelog.md +354 -0
  14. package/commands/cleanup.md +2 -0
  15. package/commands/compat-audit.md +330 -0
  16. package/commands/deploy-info.md +6 -5
  17. package/commands/design-bench.md +176 -0
  18. package/commands/design-render-critique-loop.md +103 -0
  19. package/commands/design.md +259 -0
  20. package/commands/diagnose.md +483 -0
  21. package/commands/explain.md +349 -0
  22. package/commands/forge-stats.md +2 -0
  23. package/commands/forgedock-init.md +2 -0
  24. package/commands/geo-audit.md +2 -0
  25. package/commands/incident-response.md +2 -0
  26. package/commands/issue.md +9 -3
  27. package/commands/milestone.md +2 -0
  28. package/commands/optimize.md +411 -0
  29. package/commands/orchestrate.md +239 -0
  30. package/commands/pipeline-health.md +60 -1
  31. package/commands/qa-sweep.md +39 -2
  32. package/commands/quality-gate.md +67 -0
  33. package/commands/replay.md +263 -0
  34. package/commands/resume.md +264 -0
  35. package/commands/review-pr-agents.md +5 -1
  36. package/commands/review-pr-staging.md +160 -2
  37. package/commands/review-pr.md +85 -3
  38. package/commands/rollback.md +2 -0
  39. package/commands/scope.md +280 -0
  40. package/commands/security-audit.md +2 -0
  41. package/commands/status.md +262 -0
  42. package/commands/sync-ecosystem.md +2 -0
  43. package/commands/test-gate.md +929 -0
  44. package/commands/validate.md +2 -0
  45. package/commands/work-on/build/architect.md +128 -18
  46. package/commands/work-on/build/context.md +130 -17
  47. package/commands/work-on/build/implement.md +7 -3
  48. package/commands/work-on/build/validate.md +2 -0
  49. package/commands/work-on/build.md +32 -7
  50. package/commands/work-on/close.md +85 -0
  51. package/commands/work-on/decompose.md +2 -0
  52. package/commands/work-on/investigate.md +30 -3
  53. package/commands/work-on/review.md +13 -1
  54. package/commands/work-on-monolithic.md +2 -0
  55. package/commands/work-on.md +676 -38
  56. package/docs/BRAND.md +51 -0
  57. package/docs/CI.md +177 -0
  58. package/docs/CONFIG.md +94 -0
  59. package/docs/FORGE-PROTOCOL.md +324 -0
  60. package/docs/articles/b-vs-c-baseline.md +210 -0
  61. package/docs/articles/full-abc-benchmark.md +205 -0
  62. package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
  63. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  64. package/docs/claude-breakpoints.json +47 -0
  65. package/docs/design/abc-benchmark.md +195 -0
  66. package/docs/design/design-architect-rationale.md +123 -0
  67. package/docs/design/design-memory.md +61 -0
  68. package/docs/design/design-spec-schema.md +248 -0
  69. package/docs/design/design-system-lint.md +150 -0
  70. package/docs/design/divergent-generation.md +106 -0
  71. package/docs/design/effects-appropriateness.md +133 -0
  72. package/docs/design/fixtures/briefs/README.md +47 -0
  73. package/docs/design/fixtures/briefs/cadence.md +39 -0
  74. package/docs/design/fixtures/briefs/plume.md +39 -0
  75. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  76. package/docs/design/fixtures/briefs/tender.md +39 -0
  77. package/docs/design/fixtures/briefs/voltage.md +39 -0
  78. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  79. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  80. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  81. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  82. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  83. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  84. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  85. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  86. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  87. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  88. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  89. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  90. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  91. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  92. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  93. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  94. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  95. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  96. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  97. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  98. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  99. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  100. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  101. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  102. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  103. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  104. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  105. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  106. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  107. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  108. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  109. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  110. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  111. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  112. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  113. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  114. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  115. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  116. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  117. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  118. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  119. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  120. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  121. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  122. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  123. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  124. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  125. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  126. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  127. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  128. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  129. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  130. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  131. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  132. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  133. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  134. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  135. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  136. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  137. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  138. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  139. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  140. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  141. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  142. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  143. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  144. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  145. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  146. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  147. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  148. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  149. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  150. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  151. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  152. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  153. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  154. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  155. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  156. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  157. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  158. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  159. package/docs/design/foundations/brutalist.css +294 -0
  160. package/docs/design/foundations/editorial.css +300 -0
  161. package/docs/design/foundations/minimal-luxury.css +295 -0
  162. package/docs/design/foundations/technical.css +293 -0
  163. package/docs/design/foundations/warm-photo.css +299 -0
  164. package/docs/design/reference-corpus.md +1726 -0
  165. package/docs/design/render-critique-loop.md +57 -0
  166. package/docs/site/getting-started.md +21 -0
  167. package/docs/spec-graph-schema.md +397 -0
  168. package/package.json +3 -3
  169. package/scripts/bench-scorecard.mjs +239 -0
  170. package/scripts/build-spec-graph.mjs +509 -0
  171. package/scripts/classify-lane.sh +138 -0
  172. package/scripts/design-system-lint.mjs +993 -0
  173. package/scripts/graph-query.sh +486 -0
  174. package/scripts/transition-label.sh +169 -0
  175. package/scripts/validate-pr-target.sh +30 -0
  176. package/scripts/validate-spec-graph.sh +423 -0
  177. package/templates/devdocs/README.md +72 -0
  178. package/templates/devdocs/agent/using-forgedock.md +3 -0
  179. package/templates/devdocs/agent/using-github.md +3 -0
  180. package/templates/devdocs/index.yaml +162 -0
  181. package/templates/devdocs/project/architecture.md +3 -0
  182. package/templates/devdocs/project/conventions.md +3 -0
  183. package/templates/devdocs/project/custom-instructions.md +3 -0
  184. package/templates/devdocs/project/glossary.md +3 -0
  185. package/templates/devdocs/project/stack.md +3 -0
  186. package/templates/devdocs/templates/commit-convention.md +3 -0
  187. package/templates/devdocs/templates/issue.md +3 -0
  188. package/templates/devdocs/templates/pull-request.md +3 -0
  189. package/templates/devdocs/templates/review-finding.md +3 -0
  190. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,660 @@
1
+ <!--
2
+ ARCHETYPE: editorial-typographic
3
+ SIGNATURE MOVE: "The routing diagram" — instead of a product screenshot, the hero contains a
4
+ hand-crafted SVG topology diagram showing a payment flowing from merchant → Tender → fraud
5
+ engine → local method network → bank, with each node labeled in mono type and animated paths
6
+ that trace the flow on load. It treats the API infrastructure as the visual subject matter,
7
+ the way a magazine spread would use an infographic as its hero. This is the non-obvious move:
8
+ the product IS the infrastructure, so we show the infrastructure itself as art.
9
+ EFFECTS PLAN:
10
+ - SVG stroke-dashoffset animation traces payment flow paths on load (CSS, 1.2s sequential)
11
+ - Node dots pulse subtly once the path reaches them (animation-delay chained)
12
+ - Pull-quote rotated slightly (-1.5deg) like a physical clipping pinned to a mood board
13
+ - Section labels in micro caps with generous tracking, used as structural dividers
14
+ - Hover on feature rows: left border grows from 0 to full height via scaleY
15
+ NEGATIVES CHECKED:
16
+ N1: No purple/blue gradient — cream background, deep ink, warm terracotta #C4502A accent
17
+ N2: No Inter — Fraunces (display, variable), Space Grotesk (body), Space Mono (code)
18
+ N3: Not centered — hard left, editorial column grid, pull-quote pinned to right margin
19
+ N4: Not 3 icon cards — routing diagram, numbered capability items, spec comparison columns
20
+ N5: Radius: 0 on borders, 1px on code blocks, full circle on flow nodes
21
+ N6: Not Tailwind palette — terracotta #C4502A, ink #1A1612, ivory #FAF8F4
22
+ N7: Not the skeleton — routing art → pull-quote → numbered capabilities → dev specs → CTA
23
+ N8: No blobs
24
+ N9: No glass
25
+ N10: Extreme hierarchy from display sizes down to 10px mono labels
26
+ N11: Named specifics: 80+ local methods, 0.5% FX spread, 47 countries, $0 setup
27
+ N12: Effects serve meaning — the animated path shows money moving
28
+ -->
29
+ <!DOCTYPE html>
30
+ <html lang="en">
31
+ <head>
32
+ <meta charset="UTF-8" />
33
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
34
+ <title>Tender — Payments API</title>
35
+ <script src="https://cdn.tailwindcss.com"></script>
36
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
37
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
38
+ <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,500;0,9..144,700;1,9..144,300;1,9..144,500&family=Space+Grotesk:wght@300;400;500;600&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet" />
39
+ <script>
40
+ tailwind.config = {
41
+ theme: {
42
+ extend: {
43
+ fontFamily: {
44
+ display: ['Fraunces', 'serif'],
45
+ body: ['Space Grotesk', 'sans-serif'],
46
+ mono: ['Space Mono', 'monospace'],
47
+ },
48
+ colors: {
49
+ ink: '#1A1612',
50
+ ivory: '#FAF8F4',
51
+ cream: '#F0EDE6',
52
+ terra: '#C4502A',
53
+ terraDark: '#8A3519',
54
+ terraLight: '#D97850',
55
+ mist: '#8A8178',
56
+ faint: '#C8C4BC',
57
+ rule: '#DDD9D1',
58
+ }
59
+ }
60
+ }
61
+ }
62
+ </script>
63
+ <style>
64
+ body { font-family: 'Space Grotesk', sans-serif; background: #FAF8F4; color: #1A1612; }
65
+ .font-display { font-family: 'Fraunces', serif; }
66
+ .font-mono { font-family: 'Space Mono', monospace; }
67
+
68
+ /* Flow path animation */
69
+ .flow-path {
70
+ stroke-dasharray: 600;
71
+ stroke-dashoffset: 600;
72
+ }
73
+ .flow-path.animate {
74
+ animation: drawPath 1.2s cubic-bezier(0.4,0,0.2,1) forwards;
75
+ }
76
+ @keyframes drawPath {
77
+ to { stroke-dashoffset: 0; }
78
+ }
79
+
80
+ /* Node pulse */
81
+ .flow-node { opacity: 0; transition: opacity 0.3s; }
82
+ .flow-node.visible { opacity: 1; }
83
+
84
+ @keyframes nodePulse {
85
+ 0%, 100% { r: 5; opacity: 0.9; }
86
+ 50% { r: 7; opacity: 1; }
87
+ }
88
+ .node-dot.pulsing { animation: nodePulse 2s ease-in-out infinite; }
89
+
90
+ /* Feature row hover border */
91
+ .feature-row {
92
+ position: relative;
93
+ padding-left: 20px;
94
+ }
95
+ .feature-row::before {
96
+ content: '';
97
+ position: absolute;
98
+ left: 0;
99
+ top: 0;
100
+ bottom: 0;
101
+ width: 2px;
102
+ background: #C4502A;
103
+ transform: scaleY(0);
104
+ transform-origin: top;
105
+ transition: transform 0.3s cubic-bezier(0.77,0,0.175,1);
106
+ }
107
+ .feature-row:hover::before { transform: scaleY(1); }
108
+
109
+ /* Pull quote pin */
110
+ .pull-quote {
111
+ transform: rotate(-1.5deg);
112
+ transform-origin: top left;
113
+ }
114
+
115
+ /* Micro caps section labels */
116
+ .section-label {
117
+ font-family: 'Space Mono', monospace;
118
+ font-size: 10px;
119
+ letter-spacing: 0.18em;
120
+ text-transform: uppercase;
121
+ color: #C4502A;
122
+ }
123
+
124
+ /* Nav underline */
125
+ .nav-link { position: relative; }
126
+ .nav-link::after {
127
+ content: '';
128
+ position: absolute;
129
+ bottom: -1px;
130
+ left: 0;
131
+ right: 0;
132
+ height: 1px;
133
+ background: #1A1612;
134
+ transform: scaleX(0);
135
+ transition: transform 0.2s ease;
136
+ }
137
+ .nav-link:hover::after { transform: scaleX(1); }
138
+
139
+ /* Editorial column lines */
140
+ .col-rule { border-left: 1px solid #DDD9D1; }
141
+ </style>
142
+ </head>
143
+ <body class="bg-[#FAF8F4]">
144
+
145
+ <!-- NAV — EDITORIAL MASTHEAD -->
146
+ <header class="border-b border-[#DDD9D1]">
147
+ <!-- Top strip -->
148
+ <div class="bg-[#1A1612] text-[#FAF8F4]">
149
+ <div class="max-w-7xl mx-auto px-8 h-8 flex items-center justify-between">
150
+ <span class="font-mono text-[10px] tracking-widest">TENDER PAYMENTS — API PLATFORM</span>
151
+ <div class="flex items-center gap-4">
152
+ <span class="font-mono text-[10px] text-[#8A8178]">PCI DSS L1 · SOC 2 Type II</span>
153
+ <span class="font-mono text-[10px] text-[#C4502A]">● 99.99% uptime</span>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ <!-- Main nav -->
158
+ <nav class="max-w-7xl mx-auto px-8 h-14 flex items-center justify-between">
159
+ <a href="#" class="font-display text-[22px] font-medium tracking-[-0.02em] text-[#1A1612]">
160
+ Tender<span class="text-[#C4502A]">.</span>
161
+ </a>
162
+ <div class="hidden md:flex items-center gap-8">
163
+ <a href="#" class="nav-link font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Products</a>
164
+ <a href="#" class="nav-link font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Pricing</a>
165
+ <a href="#" class="nav-link font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Docs</a>
166
+ <a href="#" class="nav-link font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Changelog</a>
167
+ <a href="#" class="nav-link font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Status</a>
168
+ </div>
169
+ <div class="flex items-center gap-4">
170
+ <a href="#" class="font-body text-[13px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Sign in</a>
171
+ <a href="#" class="font-body text-[13px] font-medium bg-[#C4502A] text-white px-5 py-2 hover:bg-[#8A3519] transition-colors">Start building →</a>
172
+ </div>
173
+ </nav>
174
+ </header>
175
+
176
+ <!-- HERO — ROUTING DIAGRAM + TYPE -->
177
+ <section class="border-b border-[#DDD9D1]">
178
+ <div class="max-w-7xl mx-auto px-8 py-16 grid grid-cols-1 lg:grid-cols-12 gap-12 items-start">
179
+
180
+ <!-- Left: Headline -->
181
+ <div class="lg:col-span-5">
182
+ <div class="section-label mb-6">The payments API</div>
183
+ <h1 class="font-display text-[54px] md:text-[66px] font-medium leading-[1.05] tracking-[-0.02em] text-[#1A1612] mb-6">
184
+ Payments,<br/>
185
+ billing,<br/>
186
+ <em class="font-light text-[#C4502A]">payouts —</em><br/>
187
+ one&nbsp;API.
188
+ </h1>
189
+ <p class="font-body text-[16px] font-light leading-[1.75] text-[#8A8178] max-w-[380px] mb-8">
190
+ Accept cards and 80+ local methods globally, run subscription or usage-based billing, and send marketplace payouts — all through a single integration. Fraud screening and compliance handled for you.
191
+ </p>
192
+ <div class="flex flex-col sm:flex-row gap-3">
193
+ <a href="#" class="font-mono text-[12px] font-bold bg-[#1A1612] text-[#FAF8F4] px-6 py-3 hover:bg-[#C4502A] transition-colors inline-flex items-center gap-2">
194
+ START INTEGRATING →
195
+ </a>
196
+ <a href="#" class="font-mono text-[12px] border border-[#DDD9D1] text-[#1A1612] px-6 py-3 hover:border-[#1A1612] transition-colors inline-flex items-center gap-2">
197
+ VIEW THE DOCS
198
+ </a>
199
+ </div>
200
+
201
+ <!-- Stat row -->
202
+ <div class="mt-10 pt-8 border-t border-[#DDD9D1] grid grid-cols-3 gap-6">
203
+ <div>
204
+ <div class="font-display text-[32px] font-medium text-[#1A1612] leading-none">47</div>
205
+ <div class="font-mono text-[10px] text-[#8A8178] tracking-wider uppercase mt-1">Countries</div>
206
+ </div>
207
+ <div class="col-rule pl-6">
208
+ <div class="font-display text-[32px] font-medium text-[#C4502A] leading-none">47<span class="text-[18px]">ms</span></div>
209
+ <div class="font-mono text-[10px] text-[#8A8178] tracking-wider uppercase mt-1">p99 API</div>
210
+ </div>
211
+ <div class="col-rule pl-6">
212
+ <div class="font-display text-[32px] font-medium text-[#1A1612] leading-none">80<span class="text-[18px]">+</span></div>
213
+ <div class="font-mono text-[10px] text-[#8A8178] tracking-wider uppercase mt-1">Pay methods</div>
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <!-- Right: Routing diagram -->
219
+ <div class="lg:col-span-7">
220
+ <div class="border border-[#DDD9D1] bg-[#F0EDE6] p-8 relative">
221
+ <div class="section-label mb-6">Payment flow — live topology</div>
222
+ <!-- SVG routing diagram -->
223
+ <svg viewBox="0 0 560 340" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-full">
224
+ <!-- Background grid -->
225
+ <defs>
226
+ <pattern id="grid" width="28" height="28" patternUnits="userSpaceOnUse">
227
+ <path d="M 28 0 L 0 0 0 28" fill="none" stroke="#DDD9D1" stroke-width="0.5" opacity="0.5"/>
228
+ </pattern>
229
+ </defs>
230
+ <rect width="560" height="340" fill="url(#grid)" />
231
+
232
+ <!-- NODES -->
233
+ <!-- Merchant (left) -->
234
+ <g class="flow-node visible" id="node-merchant">
235
+ <rect x="20" y="140" width="90" height="52" rx="0" fill="#FAF8F4" stroke="#1A1612" stroke-width="1.2"/>
236
+ <text x="65" y="162" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.08em">MERCHANT</text>
237
+ <text x="65" y="178" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#1A1612" letter-spacing="0.04em">checkout</text>
238
+ <circle cx="110" cy="166" r="4" fill="#1A1612" class="node-dot pulsing"/>
239
+ </g>
240
+
241
+ <!-- Tender hub (center) -->
242
+ <g class="flow-node" id="node-tender">
243
+ <rect x="200" y="120" width="110" height="100" rx="0" fill="#1A1612" stroke="#1A1612" stroke-width="1.2"/>
244
+ <text x="255" y="155" text-anchor="middle" font-family="Space Mono" font-size="9" fill="#C4502A" letter-spacing="0.1em">TENDER</text>
245
+ <text x="255" y="172" text-anchor="middle" font-family="Space Grotesk" font-size="8" fill="#8A8178">route · screen</text>
246
+ <text x="255" y="187" text-anchor="middle" font-family="Space Grotesk" font-size="8" fill="#8A8178">convert · settle</text>
247
+ <circle cx="200" cy="170" r="4" fill="#C4502A" class="node-dot"/>
248
+ <circle cx="310" cy="170" r="4" fill="#C4502A" class="node-dot"/>
249
+ </g>
250
+
251
+ <!-- Fraud engine (top right area) -->
252
+ <g class="flow-node" id="node-fraud">
253
+ <rect x="370" y="30" width="90" height="52" rx="0" fill="#FAF8F4" stroke="#C4502A" stroke-width="1"/>
254
+ <text x="415" y="52" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#C4502A" letter-spacing="0.08em">FRAUD</text>
255
+ <text x="415" y="67" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.04em">ML SCORE</text>
256
+ <circle cx="370" cy="56" r="3.5" fill="#C4502A" class="node-dot"/>
257
+ </g>
258
+
259
+ <!-- Card networks (right mid) -->
260
+ <g class="flow-node" id="node-cards">
261
+ <rect x="370" y="120" width="90" height="52" rx="0" fill="#FAF8F4" stroke="#1A1612" stroke-width="1"/>
262
+ <text x="415" y="142" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.08em">NETWORKS</text>
263
+ <text x="415" y="157" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#1A1612" letter-spacing="0.04em">Visa · MC · UPI</text>
264
+ <circle cx="370" cy="146" r="3.5" fill="#1A1612" class="node-dot"/>
265
+ </g>
266
+
267
+ <!-- Local methods (right lower) -->
268
+ <g class="flow-node" id="node-local">
269
+ <rect x="370" y="210" width="90" height="52" rx="0" fill="#FAF8F4" stroke="#1A1612" stroke-width="1"/>
270
+ <text x="415" y="232" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.08em">LOCAL</text>
271
+ <text x="415" y="247" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#1A1612" letter-spacing="0.04em">SEPA · PIX · UPI</text>
272
+ <circle cx="370" cy="236" r="3.5" fill="#1A1612" class="node-dot"/>
273
+ </g>
274
+
275
+ <!-- Bank (far right) -->
276
+ <g class="flow-node" id="node-bank">
277
+ <rect x="465" y="165" width="80" height="52" rx="0" fill="#FAF8F4" stroke="#1A1612" stroke-width="1.2"/>
278
+ <text x="505" y="187" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.08em">ISSUER</text>
279
+ <text x="505" y="202" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#1A1612" letter-spacing="0.04em">bank settle</text>
280
+ <circle cx="465" cy="191" r="3.5" fill="#1A1612" class="node-dot"/>
281
+ </g>
282
+
283
+ <!-- FX label -->
284
+ <g class="flow-node" id="node-fx">
285
+ <rect x="200" y="255" width="110" height="42" rx="0" fill="#FAF8F4" stroke="#C4502A" stroke-width="1" stroke-dasharray="4 2"/>
286
+ <text x="255" y="272" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#C4502A" letter-spacing="0.08em">FX CONVERT</text>
287
+ <text x="255" y="287" text-anchor="middle" font-family="Space Mono" font-size="8" fill="#8A8178" letter-spacing="0.04em">0.5% spread</text>
288
+ </g>
289
+
290
+ <!-- PATHS -->
291
+ <!-- Merchant → Tender -->
292
+ <path class="flow-path" id="path-1"
293
+ d="M 110 166 L 200 166"
294
+ stroke="#1A1612" stroke-width="1.5" stroke-linecap="round"/>
295
+ <polygon id="arrow-1" points="196,162 204,166 196,170" fill="#1A1612" opacity="0"/>
296
+
297
+ <!-- Tender → Fraud -->
298
+ <path class="flow-path" id="path-2"
299
+ d="M 255 120 L 255 82 L 370 56"
300
+ stroke="#C4502A" stroke-width="1.2" stroke-linecap="round" stroke-dasharray="5 3"/>
301
+ <polygon id="arrow-2" points="366,52 374,56 366,60" fill="#C4502A" opacity="0"/>
302
+
303
+ <!-- Tender → Cards -->
304
+ <path class="flow-path" id="path-3"
305
+ d="M 310 155 L 370 146"
306
+ stroke="#1A1612" stroke-width="1.5" stroke-linecap="round"/>
307
+ <polygon id="arrow-3" points="366,142 374,146 366,150" fill="#1A1612" opacity="0"/>
308
+
309
+ <!-- Tender → Local -->
310
+ <path class="flow-path" id="path-4"
311
+ d="M 310 180 L 370 236"
312
+ stroke="#1A1612" stroke-width="1.5" stroke-linecap="round"/>
313
+ <polygon id="arrow-4" points="366,232 374,236 366,240" fill="#1A1612" opacity="0"/>
314
+
315
+ <!-- Cards → Bank -->
316
+ <path class="flow-path" id="path-5"
317
+ d="M 460 146 L 505 165"
318
+ stroke="#1A1612" stroke-width="1.5" stroke-linecap="round"/>
319
+
320
+ <!-- Local → Bank -->
321
+ <path class="flow-path" id="path-6"
322
+ d="M 460 236 L 505 217"
323
+ stroke="#1A1612" stroke-width="1.5" stroke-linecap="round"/>
324
+
325
+ <!-- Tender ↔ FX (vertical) -->
326
+ <path class="flow-path" id="path-7"
327
+ d="M 255 220 L 255 255"
328
+ stroke="#C4502A" stroke-width="1" stroke-linecap="round" stroke-dasharray="4 2"/>
329
+
330
+ <!-- Path labels -->
331
+ <text x="150" y="158" font-family="Space Mono" font-size="8" fill="#8A8178" class="flow-node">payment intent</text>
332
+ <text x="270" y="100" font-family="Space Mono" font-size="7" fill="#C4502A" class="flow-node">screen</text>
333
+ <text x="328" y="144" font-family="Space Mono" font-size="7" fill="#8A8178" class="flow-node">route →</text>
334
+ <text x="320" y="220" font-family="Space Mono" font-size="7" fill="#8A8178" class="flow-node">route →</text>
335
+ </svg>
336
+ </div>
337
+ <!-- Caption under diagram -->
338
+ <div class="mt-3 flex items-center gap-6">
339
+ <div class="flex items-center gap-2">
340
+ <div class="w-8 border-t border-[#1A1612]"></div>
341
+ <span class="font-mono text-[10px] text-[#8A8178]">payment path</span>
342
+ </div>
343
+ <div class="flex items-center gap-2">
344
+ <div class="w-8 border-t border-dashed border-[#C4502A]"></div>
345
+ <span class="font-mono text-[10px] text-[#8A8178]">fraud & fx signals</span>
346
+ </div>
347
+ <div class="flex items-center gap-2">
348
+ <div class="w-2 h-2 rounded-full bg-[#C4502A]"></div>
349
+ <span class="font-mono text-[10px] text-[#8A8178]">Tender-owned layer</span>
350
+ </div>
351
+ </div>
352
+ </div>
353
+ </div>
354
+ </section>
355
+
356
+ <!-- PULL QUOTE + CAPABILITIES — ASYMMETRIC EDITORIAL -->
357
+ <section class="border-b border-[#DDD9D1]">
358
+ <div class="max-w-7xl mx-auto px-8 py-20 grid grid-cols-1 lg:grid-cols-12 gap-12">
359
+
360
+ <!-- Left: Pull quote -->
361
+ <div class="lg:col-span-4">
362
+ <div class="pull-quote border-l-4 border-[#C4502A] pl-6 py-2">
363
+ <blockquote class="font-display text-[24px] font-light italic leading-[1.4] text-[#1A1612] mb-4">
364
+ "A 47ms p99 isn't a benchmark. It's a constraint every payment flows through."
365
+ </blockquote>
366
+ <div class="font-mono text-[10px] text-[#8A8178] tracking-wider">TENDER ENGINEERING — 2026</div>
367
+ </div>
368
+ <div class="mt-10">
369
+ <div class="section-label mb-4">Trusted by</div>
370
+ <div class="space-y-2">
371
+ <div class="font-body text-[14px] text-[#1A1612] border-b border-[#DDD9D1] pb-2">Cartlane — marketplace</div>
372
+ <div class="font-body text-[14px] text-[#1A1612] border-b border-[#DDD9D1] pb-2">Vesper — SaaS platform</div>
373
+ <div class="font-body text-[14px] text-[#1A1612] border-b border-[#DDD9D1] pb-2">Quorum — fintech</div>
374
+ <div class="font-body text-[14px] text-[#1A1612] border-b border-[#DDD9D1] pb-2">Archway — e-commerce</div>
375
+ <div class="font-body text-[14px] text-[#1A1612]">Northloop — subscriptions</div>
376
+ </div>
377
+ </div>
378
+ </div>
379
+
380
+ <!-- Right: Numbered capabilities -->
381
+ <div class="lg:col-span-8 col-rule lg:pl-12">
382
+ <div class="section-label mb-8">Platform capabilities</div>
383
+ <div class="space-y-0">
384
+
385
+ <div class="feature-row py-7 border-t border-[#DDD9D1]">
386
+ <div class="grid grid-cols-12 gap-6">
387
+ <div class="col-span-1">
388
+ <span class="font-mono text-[11px] text-[#C8C4BC]">01</span>
389
+ </div>
390
+ <div class="col-span-3">
391
+ <h3 class="font-display text-[18px] font-medium leading-tight text-[#1A1612]">Global<br/>Payments</h3>
392
+ </div>
393
+ <div class="col-span-8">
394
+ <p class="font-body text-[14px] font-light leading-relaxed text-[#8A8178] mb-3">
395
+ Visa, Mastercard, Amex, Discover, SEPA Direct Debit, UPI, PIX, GrabPay, iDEAL, Klarna, and 70+ more. A single Checkout element renders the right method per customer region. Automatic currency conversion at mid-market rate plus a transparent 0.5% FX spread.
396
+ </p>
397
+ <div class="flex flex-wrap gap-1.5">
398
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#8A8178] border border-[#DDD9D1] px-2 py-0.5">SEPA</span>
399
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#8A8178] border border-[#DDD9D1] px-2 py-0.5">UPI</span>
400
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#8A8178] border border-[#DDD9D1] px-2 py-0.5">PIX</span>
401
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#8A8178] border border-[#DDD9D1] px-2 py-0.5">GrabPay</span>
402
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#8A8178] border border-[#DDD9D1] px-2 py-0.5">iDEAL</span>
403
+ <span class="font-mono text-[10px] bg-[#F0EDE6] text-[#C4502A] border border-[#C4502A]/30 px-2 py-0.5">+75 local</span>
404
+ </div>
405
+ </div>
406
+ </div>
407
+ </div>
408
+
409
+ <div class="feature-row py-7 border-t border-[#DDD9D1]">
410
+ <div class="grid grid-cols-12 gap-6">
411
+ <div class="col-span-1">
412
+ <span class="font-mono text-[11px] text-[#C8C4BC]">02</span>
413
+ </div>
414
+ <div class="col-span-3">
415
+ <h3 class="font-display text-[18px] font-medium leading-tight text-[#1A1612]">Subscription<br/>&amp; Usage Billing</h3>
416
+ </div>
417
+ <div class="col-span-8">
418
+ <p class="font-body text-[14px] font-light leading-relaxed text-[#8A8178]">
419
+ Flat-rate, tiered, per-seat, metered, and hybrid billing models. Real-time usage meters with sub-second ingestion latency. Automated dunning, configurable retry schedules, prorated upgrades. Tax calculation built in. Invoices emailed and stored automatically.
420
+ </p>
421
+ </div>
422
+ </div>
423
+ </div>
424
+
425
+ <div class="feature-row py-7 border-t border-[#DDD9D1]">
426
+ <div class="grid grid-cols-12 gap-6">
427
+ <div class="col-span-1">
428
+ <span class="font-mono text-[11px] text-[#C8C4BC]">03</span>
429
+ </div>
430
+ <div class="col-span-3">
431
+ <h3 class="font-display text-[18px] font-medium leading-tight text-[#1A1612]">Marketplace<br/>Payouts</h3>
432
+ </div>
433
+ <div class="col-span-8">
434
+ <p class="font-body text-[14px] font-light leading-relaxed text-[#8A8178]">
435
+ Onboard sellers and vendors as connected accounts. Configure split rules — percentage, fixed fee, or tiered by volume. Same-day payouts in USD, EUR, and GBP. Automatic 1099/W-9 collection and IRS filing integration.
436
+ </p>
437
+ </div>
438
+ </div>
439
+ </div>
440
+
441
+ <div class="feature-row py-7 border-t border-[#DDD9D1] border-b border-[#DDD9D1]">
442
+ <div class="grid grid-cols-12 gap-6">
443
+ <div class="col-span-1">
444
+ <span class="font-mono text-[11px] text-[#C8C4BC]">04</span>
445
+ </div>
446
+ <div class="col-span-3">
447
+ <h3 class="font-display text-[18px] font-medium leading-tight text-[#1A1612]">Fraud &amp;<br/>Compliance</h3>
448
+ </div>
449
+ <div class="col-span-8">
450
+ <p class="font-body text-[14px] font-light leading-relaxed text-[#8A8178] mb-3">
451
+ ML fraud scoring fires on every payment intent — median response 8ms. Adaptive 3DS2 challenges high-risk transactions. KYC/AML screening for regulated markets. PCI DSS Level 1: card data never touches your servers or logs.
452
+ </p>
453
+ <div class="flex gap-6">
454
+ <div><span class="font-display text-[18px] font-medium text-[#1A1612]">0.03%</span><span class="font-body text-[12px] text-[#8A8178] ml-1">fraud rate</span></div>
455
+ <div><span class="font-display text-[18px] font-medium text-[#1A1612]">PCI L1</span><span class="font-body text-[12px] text-[#8A8178] ml-1">certified</span></div>
456
+ <div><span class="font-display text-[18px] font-medium text-[#1A1612]">SOC 2</span><span class="font-body text-[12px] text-[#8A8178] ml-1">Type II</span></div>
457
+ </div>
458
+ </div>
459
+ </div>
460
+ </div>
461
+
462
+ </div>
463
+ </div>
464
+ </div>
465
+ </section>
466
+
467
+ <!-- DEV SPECS — TWO COLUMN COMPARISON -->
468
+ <section class="border-b border-[#DDD9D1] bg-[#F0EDE6]">
469
+ <div class="max-w-7xl mx-auto px-8 py-16">
470
+ <div class="section-label mb-10">Developer integration</div>
471
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
472
+ <!-- Quick start -->
473
+ <div class="bg-[#1A1612] p-6">
474
+ <div class="font-mono text-[10px] text-[#8A8178] tracking-wider uppercase mb-4">Quick start · 5 minutes to first payment</div>
475
+ <div class="space-y-1 font-mono text-[12px] leading-relaxed">
476
+ <div><span class="text-[#8A8178]"># Install</span></div>
477
+ <div><span class="text-[#C4502A]">$</span> <span class="text-[#FAF8F4]">npm install @tender/node</span></div>
478
+ <div class="mt-3 text-[#8A8178]">// Create a payment intent</div>
479
+ <div><span class="text-[#8A8178]">const</span> <span class="text-[#FAF8F4]">tender</span> <span class="text-[#8A8178]">=</span> <span class="text-[#C4502A]">require</span><span class="text-[#FAF8F4]">(<span class="text-[#7BA87B]">'@tender/node'</span>)</span><span class="text-[#FAF8F4]">(<span class="text-[#7BA87B]">'sk_live_...'</span>);</span></div>
480
+ <div class="mt-2"><span class="text-[#8A8178]">const</span> <span class="text-[#FAF8F4]">intent</span> <span class="text-[#8A8178]">=</span> <span class="text-[#8A8178]">await</span> <span class="text-[#FAF8F4]">tender</span><span class="text-[#C4502A]">.</span><span class="text-[#C8A870]">paymentIntents</span><span class="text-[#C4502A]">.</span><span class="text-[#C4502A]">create</span><span class="text-[#FAF8F4]">({</span></div>
481
+ <div class="pl-4"><span class="text-[#C8A870]">amount</span><span class="text-[#FAF8F4]">:</span> <span class="text-[#C8A870]">4999</span><span class="text-[#FAF8F4]">,</span></div>
482
+ <div class="pl-4"><span class="text-[#C8A870]">currency</span><span class="text-[#FAF8F4]">:</span> <span class="text-[#7BA87B]">'gbp'</span><span class="text-[#FAF8F4]">,</span></div>
483
+ <div class="pl-4"><span class="text-[#C8A870]">fraud_screen</span><span class="text-[#FAF8F4]">:</span> <span class="text-[#C8A870]">true</span><span class="text-[#FAF8F4]">,</span></div>
484
+ <div><span class="text-[#FAF8F4]">});</span></div>
485
+ </div>
486
+ </div>
487
+ <!-- SDK + features -->
488
+ <div class="space-y-0">
489
+ <div class="section-label mb-4">Available in</div>
490
+ <div class="grid grid-cols-3 gap-2 mb-6">
491
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
492
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">Node</div>
493
+ </div>
494
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
495
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">Python</div>
496
+ </div>
497
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
498
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">Ruby</div>
499
+ </div>
500
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
501
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">Go</div>
502
+ </div>
503
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
504
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">Java</div>
505
+ </div>
506
+ <div class="border border-[#DDD9D1] bg-[#FAF8F4] p-3 text-center">
507
+ <div class="font-mono text-[11px] text-[#1A1612] font-bold">PHP</div>
508
+ </div>
509
+ </div>
510
+ <div class="section-label mb-4">Platform features</div>
511
+ <div class="space-y-3">
512
+ <div class="flex items-start gap-3 py-3 border-t border-[#DDD9D1]">
513
+ <div class="w-4 h-4 flex-shrink-0 mt-0.5 border border-[#C4502A] flex items-center justify-center">
514
+ <div class="w-2 h-2 bg-[#C4502A]"></div>
515
+ </div>
516
+ <div>
517
+ <div class="font-body text-[13px] font-medium text-[#1A1612]">250+ webhook event types</div>
518
+ <div class="font-body text-[12px] text-[#8A8178]">Signed payloads · automatic retry · 72hr delivery window</div>
519
+ </div>
520
+ </div>
521
+ <div class="flex items-start gap-3 py-3 border-t border-[#DDD9D1]">
522
+ <div class="w-4 h-4 flex-shrink-0 mt-0.5 border border-[#C4502A] flex items-center justify-center">
523
+ <div class="w-2 h-2 bg-[#C4502A]"></div>
524
+ </div>
525
+ <div>
526
+ <div class="font-body text-[13px] font-medium text-[#1A1612]">Full test mode</div>
527
+ <div class="font-body text-[12px] text-[#8A8178]">Card fixtures for every failure · fraud simulation · clock control</div>
528
+ </div>
529
+ </div>
530
+ <div class="flex items-start gap-3 py-3 border-t border-[#DDD9D1]">
531
+ <div class="w-4 h-4 flex-shrink-0 mt-0.5 border border-[#C4502A] flex items-center justify-center">
532
+ <div class="w-2 h-2 bg-[#C4502A]"></div>
533
+ </div>
534
+ <div>
535
+ <div class="font-body text-[13px] font-medium text-[#1A1612]">CLI tooling</div>
536
+ <div class="font-body text-[12px] text-[#8A8178]">tender listen · tender trigger · tender logs tail</div>
537
+ </div>
538
+ </div>
539
+ </div>
540
+ </div>
541
+ </div>
542
+ </div>
543
+ </section>
544
+
545
+ <!-- FINAL CTA -->
546
+ <section class="border-b border-[#DDD9D1]">
547
+ <div class="max-w-7xl mx-auto px-8 py-24">
548
+ <div class="grid grid-cols-1 lg:grid-cols-12 items-end gap-12">
549
+ <div class="lg:col-span-7">
550
+ <div class="section-label mb-6">Ready to start</div>
551
+ <h2 class="font-display text-[50px] font-medium leading-[1.08] tracking-[-0.02em] text-[#1A1612]">
552
+ Free to start.<br/>
553
+ No setup fees.<br/>
554
+ <em class="font-light text-[#C4502A]">Ship this weekend.</em>
555
+ </h2>
556
+ </div>
557
+ <div class="lg:col-span-5 col-rule lg:pl-12">
558
+ <p class="font-body text-[15px] font-light leading-relaxed text-[#8A8178] mb-8">
559
+ Create an account, grab your test key, and process your first payment in under five minutes. Full test mode with no time limit. Pricing is transparent and usage-based — no minimums.
560
+ </p>
561
+ <div class="flex flex-col gap-3">
562
+ <a href="#" class="font-mono text-[12px] font-bold bg-[#1A1612] text-[#FAF8F4] px-8 py-4 hover:bg-[#C4502A] transition-colors inline-flex items-center gap-2 w-fit">
563
+ START INTEGRATING →
564
+ </a>
565
+ <a href="#" class="font-mono text-[12px] border border-[#DDD9D1] text-[#8A8178] px-8 py-4 hover:border-[#1A1612] hover:text-[#1A1612] transition-colors inline-flex items-center gap-2 w-fit">
566
+ VIEW THE DOCS
567
+ </a>
568
+ </div>
569
+ </div>
570
+ </div>
571
+ </div>
572
+ </section>
573
+
574
+ <!-- FOOTER -->
575
+ <footer class="max-w-7xl mx-auto px-8 py-12">
576
+ <div class="grid grid-cols-2 md:grid-cols-5 gap-8 mb-10">
577
+ <div class="col-span-2 md:col-span-1">
578
+ <span class="font-display text-[20px] font-medium text-[#1A1612] block mb-3">Tender<span class="text-[#C4502A]">.</span></span>
579
+ <p class="font-body text-[12px] text-[#8A8178] leading-relaxed">Payments API for internet businesses.</p>
580
+ </div>
581
+ <div>
582
+ <div class="section-label mb-3">Products</div>
583
+ <div class="space-y-2">
584
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Payments</a>
585
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Billing</a>
586
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Connect</a>
587
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Fraud</a>
588
+ </div>
589
+ </div>
590
+ <div>
591
+ <div class="section-label mb-3">Developers</div>
592
+ <div class="space-y-2">
593
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">API Reference</a>
594
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">SDKs</a>
595
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Webhooks</a>
596
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Changelog</a>
597
+ </div>
598
+ </div>
599
+ <div>
600
+ <div class="section-label mb-3">Company</div>
601
+ <div class="space-y-2">
602
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">About</a>
603
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Blog</a>
604
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Careers</a>
605
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Status</a>
606
+ </div>
607
+ </div>
608
+ <div>
609
+ <div class="section-label mb-3">Legal</div>
610
+ <div class="space-y-2">
611
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Privacy</a>
612
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">Terms</a>
613
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">PCI Cert</a>
614
+ <a href="#" class="block font-body text-[12px] text-[#8A8178] hover:text-[#1A1612] transition-colors">SOC 2 Report</a>
615
+ </div>
616
+ </div>
617
+ </div>
618
+ <div class="border-t border-[#DDD9D1] pt-6 flex items-center justify-between">
619
+ <span class="font-mono text-[10px] text-[#C8C4BC]">© 2026 Tender Payments Inc.</span>
620
+ <span class="font-mono text-[10px] text-[#C8C4BC]">PCI DSS L1 · SOC 2 Type II · ISO 27001 · GDPR</span>
621
+ </div>
622
+ </footer>
623
+
624
+ <script>
625
+ // Sequential path + node animation on load
626
+ const paths = [
627
+ { path: 'path-1', arrow: 'arrow-1', nodes: ['node-tender'], delay: 300 },
628
+ { path: 'path-2', arrow: 'arrow-2', nodes: ['node-fraud'], delay: 700 },
629
+ { path: 'path-3', arrow: 'arrow-3', nodes: ['node-cards'], delay: 1100 },
630
+ { path: 'path-4', arrow: 'arrow-4', nodes: ['node-local'], delay: 1300 },
631
+ { path: 'path-5', arrow: null, nodes: ['node-bank'], delay: 1600 },
632
+ { path: 'path-6', arrow: null, nodes: [], delay: 1700 },
633
+ { path: 'path-7', arrow: null, nodes: ['node-fx'], delay: 1900 },
634
+ ];
635
+
636
+ paths.forEach(({ path, arrow, nodes, delay }) => {
637
+ setTimeout(() => {
638
+ const el = document.getElementById(path);
639
+ if (el) el.classList.add('animate');
640
+ if (arrow) {
641
+ const a = document.getElementById(arrow);
642
+ if (a) {
643
+ a.style.transition = 'opacity 0.3s';
644
+ a.style.opacity = '1';
645
+ }
646
+ }
647
+ nodes.forEach(nodeId => {
648
+ const n = document.getElementById(nodeId);
649
+ if (n) n.classList.add('visible');
650
+ });
651
+ }, delay);
652
+ });
653
+
654
+ // Add pulsing to nodes that appear
655
+ setTimeout(() => {
656
+ document.querySelectorAll('.node-dot').forEach(dot => dot.classList.add('pulsing'));
657
+ }, 2200);
658
+ </script>
659
+ </body>
660
+ </html>