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.
Files changed (131) hide show
  1. package/README.md +34 -1
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +229 -17
  4. package/commands/autopilot.md +77 -0
  5. package/commands/design-bench.md +176 -0
  6. package/commands/design-render-critique-loop.md +103 -0
  7. package/commands/design.md +259 -0
  8. package/commands/issue.md +7 -3
  9. package/commands/orchestrate.md +121 -0
  10. package/commands/qa-sweep.md +37 -2
  11. package/commands/quality-gate.md +30 -0
  12. package/commands/review-pr-staging.md +158 -2
  13. package/commands/test-gate.md +929 -0
  14. package/commands/work-on/build/implement.md +5 -3
  15. package/commands/work-on.md +53 -3
  16. package/docs/CI.md +177 -0
  17. package/docs/FORGE-PROTOCOL.md +324 -0
  18. package/docs/articles/b-vs-c-baseline.md +210 -0
  19. package/docs/articles/full-abc-benchmark.md +205 -0
  20. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  21. package/docs/design/abc-benchmark.md +195 -0
  22. package/docs/design/design-architect-rationale.md +123 -0
  23. package/docs/design/design-memory.md +61 -0
  24. package/docs/design/design-spec-schema.md +248 -0
  25. package/docs/design/design-system-lint.md +150 -0
  26. package/docs/design/divergent-generation.md +106 -0
  27. package/docs/design/effects-appropriateness.md +133 -0
  28. package/docs/design/fixtures/briefs/README.md +47 -0
  29. package/docs/design/fixtures/briefs/cadence.md +39 -0
  30. package/docs/design/fixtures/briefs/plume.md +39 -0
  31. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  32. package/docs/design/fixtures/briefs/tender.md +39 -0
  33. package/docs/design/fixtures/briefs/voltage.md +39 -0
  34. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  35. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  36. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  37. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  38. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  39. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  40. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  41. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  42. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  43. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  44. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  45. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  46. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  47. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  48. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  49. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  50. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  51. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  52. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  53. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  54. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  55. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  56. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  57. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  58. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  59. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  60. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  61. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  62. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  63. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  64. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  65. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  66. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  67. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  68. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  69. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  70. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  71. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  72. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  73. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  74. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  75. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  76. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  77. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  78. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  79. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  80. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  81. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  82. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  83. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  84. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  85. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  86. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  87. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  88. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  89. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  90. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  91. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  92. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  93. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  94. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  95. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  96. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  97. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  98. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  99. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  100. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  101. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  102. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  103. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  104. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  105. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  106. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  107. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  108. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  109. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  110. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  111. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  112. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  113. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  114. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  115. package/docs/design/foundations/brutalist.css +294 -0
  116. package/docs/design/foundations/editorial.css +300 -0
  117. package/docs/design/foundations/minimal-luxury.css +295 -0
  118. package/docs/design/foundations/technical.css +293 -0
  119. package/docs/design/foundations/warm-photo.css +299 -0
  120. package/docs/design/reference-corpus.md +1726 -0
  121. package/docs/design/render-critique-loop.md +57 -0
  122. package/docs/spec-graph-schema.md +397 -0
  123. package/package.json +1 -1
  124. package/scripts/bench-scorecard.mjs +239 -0
  125. package/scripts/build-spec-graph.mjs +509 -0
  126. package/scripts/classify-lane.sh +0 -7
  127. package/scripts/design-system-lint.mjs +993 -0
  128. package/scripts/graph-query.sh +486 -0
  129. package/scripts/transition-label.sh +10 -2
  130. package/scripts/validate-spec-graph.sh +423 -0
  131. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,366 @@
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 - Financial infrastructure for platforms</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
8
+ <style>
9
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
10
+ body { font-family: 'Space Grotesk', sans-serif; color: #1a1a2e; background: #fafaf9; -webkit-font-smoothing: antialiased; }
11
+
12
+ /* NAV */
13
+ nav { background: #1a1a2e; color: #fff; }
14
+ nav .wrap { max-width: 1280px; margin: 0 auto; padding: 0 48px; height: 60px; display: flex; align-items: center; justify-content: space-between; }
15
+ .mark { font-size: 20px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; }
16
+ .mark span { color: #e8b931; }
17
+ .nav-r { display: flex; gap: 24px; align-items: center; }
18
+ .nav-r a { color: #9ca3af; font-size: 13px; text-decoration: none; font-weight: 500; letter-spacing: 0.3px; }
19
+ .nav-r a:hover { color: #fff; }
20
+ .cta-sm { background: #e8b931; color: #1a1a2e !important; padding: 8px 18px; border-radius: 6px; font-weight: 600; font-size: 13px; }
21
+ .cta-sm:hover { background: #d4a72a; }
22
+
23
+ /* HERO - full width dark band */
24
+ .hero-band { background: #1a1a2e; padding: 80px 0 0; overflow: hidden; }
25
+ .hero-wrap { max-width: 1280px; margin: 0 auto; padding: 0 48px; display: grid; grid-template-columns: 1fr 1fr; gap: 48px; }
26
+ .hero-left { padding-bottom: 80px; display: flex; flex-direction: column; justify-content: center; }
27
+ .hero-eyebrow { display: inline-flex; align-items: center; gap: 8px; color: #e8b931; font-size: 12px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 24px; }
28
+ .hero-eyebrow::before { content: ''; display: block; width: 24px; height: 2px; background: #e8b931; }
29
+ .hero-left h1 { font-size: 54px; font-weight: 700; line-height: 1.08; letter-spacing: -1.5px; color: #fff; margin-bottom: 24px; }
30
+ .hero-left p { font-size: 17px; color: #9ca3af; line-height: 1.7; margin-bottom: 36px; max-width: 440px; }
31
+ .hero-btns { display: flex; gap: 12px; }
32
+ .btn-gold { background: #e8b931; color: #1a1a2e; font-weight: 600; font-size: 15px; padding: 14px 28px; border-radius: 8px; text-decoration: none; display: inline-block; transition: background 0.15s; }
33
+ .btn-gold:hover { background: #d4a72a; }
34
+ .btn-dark-outline { border: 1.5px solid #374151; color: #d1d5db; font-weight: 600; font-size: 15px; padding: 13px 28px; border-radius: 8px; text-decoration: none; display: inline-block; transition: border-color 0.15s; }
35
+ .btn-dark-outline:hover { border-color: #e8b931; color: #e8b931; }
36
+ .hero-right { position: relative; }
37
+ .hero-card-stack { position: relative; height: 100%; min-height: 460px; }
38
+ .h-card { position: absolute; background: #232342; border: 1px solid #2d2d52; border-radius: 14px; padding: 28px; color: #fff; }
39
+ .h-card.card-1 { top: 20px; left: 0; right: 40px; z-index: 3; }
40
+ .h-card.card-2 { top: 100px; left: 40px; right: 0; z-index: 2; }
41
+ .h-card.card-3 { top: 180px; left: 20px; right: 20px; z-index: 1; }
42
+ .h-card .h-label { font-size: 11px; text-transform: uppercase; letter-spacing: 1.5px; color: #6b7280; font-weight: 600; margin-bottom: 8px; }
43
+ .h-card .h-value { font-size: 32px; font-weight: 700; color: #e8b931; }
44
+ .h-card .h-sub { font-size: 13px; color: #6b7280; margin-top: 4px; }
45
+ .h-card .h-row { display: flex; justify-content: space-between; align-items: center; }
46
+ .h-card .status-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; display: inline-block; margin-right: 6px; }
47
+ .h-card .status-text { font-size: 13px; color: #22c55e; font-weight: 500; }
48
+
49
+ /* TRUST BAR */
50
+ .trust-bar { background: #fff; border-bottom: 1px solid #e5e5e5; padding: 32px 0; }
51
+ .trust-bar .wrap { max-width: 1280px; margin: 0 auto; padding: 0 48px; display: flex; justify-content: space-between; align-items: center; }
52
+ .trust-item { text-align: center; }
53
+ .trust-item .t-val { font-size: 28px; font-weight: 700; color: #1a1a2e; }
54
+ .trust-item .t-lab { font-size: 12px; color: #6b7280; margin-top: 2px; font-weight: 500; text-transform: uppercase; letter-spacing: 1px; }
55
+
56
+ /* TABBED FEATURES */
57
+ .tabs-section { max-width: 1280px; margin: 0 auto; padding: 100px 48px; }
58
+ .tabs-header { text-align: center; margin-bottom: 56px; }
59
+ .tabs-header h2 { font-size: 40px; font-weight: 700; letter-spacing: -1px; margin-bottom: 12px; }
60
+ .tabs-header p { font-size: 17px; color: #6b7280; max-width: 520px; margin: 0 auto; }
61
+ .tab-nav { display: flex; justify-content: center; gap: 8px; margin-bottom: 48px; }
62
+ .tab-btn { background: transparent; border: 1.5px solid #e5e5e5; color: #6b7280; font-family: inherit; font-size: 14px; font-weight: 600; padding: 10px 24px; border-radius: 8px; cursor: pointer; transition: all 0.15s; }
63
+ .tab-btn.active { background: #1a1a2e; border-color: #1a1a2e; color: #fff; }
64
+ .tab-panel { display: none; }
65
+ .tab-panel.active { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
66
+ .tab-text h3 { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; margin-bottom: 16px; }
67
+ .tab-text p { font-size: 15px; color: #6b7280; line-height: 1.7; margin-bottom: 20px; }
68
+ .tab-text ul { list-style: none; }
69
+ .tab-text ul li { font-size: 14px; color: #374151; padding: 6px 0 6px 24px; position: relative; font-weight: 500; }
70
+ .tab-text ul li::before { content: ''; position: absolute; left: 0; top: 12px; width: 12px; height: 12px; border-radius: 3px; background: #e8b931; }
71
+ .tab-code { background: #1a1a2e; border-radius: 12px; padding: 28px; overflow-x: auto; }
72
+ .tab-code pre { font-family: 'IBM Plex Mono', monospace; font-size: 13px; line-height: 1.75; color: #d1d5db; }
73
+ .tab-code .kw { color: #c084fc; }
74
+ .tab-code .fn { color: #60a5fa; }
75
+ .tab-code .st { color: #e8b931; }
76
+ .tab-code .cm { color: #4b5563; }
77
+ .tab-code .nb { color: #34d399; }
78
+
79
+ /* AUDIENCE SPLIT */
80
+ .audience { max-width: 1280px; margin: 0 auto; padding: 0 48px 100px; display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
81
+ .audience-card { background: #fff; border: 1px solid #e5e5e5; border-radius: 14px; padding: 48px; transition: box-shadow 0.2s; }
82
+ .audience-card:hover { box-shadow: 0 12px 40px rgba(0,0,0,0.06); }
83
+ .audience-card .a-tag { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 16px; }
84
+ .audience-card:first-child .a-tag { color: #e8b931; }
85
+ .audience-card:last-child .a-tag { color: #6366f1; }
86
+ .audience-card h3 { font-size: 24px; font-weight: 700; margin-bottom: 12px; letter-spacing: -0.3px; }
87
+ .audience-card p { font-size: 15px; color: #6b7280; line-height: 1.65; margin-bottom: 20px; }
88
+ .audience-card .a-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }
89
+ .audience-card .a-list li { font-size: 14px; color: #374151; font-weight: 500; display: flex; align-items: center; gap: 10px; }
90
+ .audience-card .a-list li::before { content: ''; width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
91
+ .audience-card:first-child .a-list li::before { background: #e8b931; }
92
+ .audience-card:last-child .a-list li::before { background: #6366f1; }
93
+
94
+ /* COMPLIANCE BAND */
95
+ .compliance { background: #1a1a2e; color: #fff; padding: 64px 0; }
96
+ .compliance .wrap { max-width: 1280px; margin: 0 auto; padding: 0 48px; text-align: center; }
97
+ .compliance h2 { font-size: 28px; font-weight: 700; margin-bottom: 12px; }
98
+ .compliance p { font-size: 15px; color: #9ca3af; max-width: 600px; margin: 0 auto 36px; }
99
+ .badge-row { display: flex; justify-content: center; gap: 24px; flex-wrap: wrap; }
100
+ .c-badge { background: #232342; border: 1px solid #2d2d52; border-radius: 10px; padding: 16px 28px; }
101
+ .c-badge .b-title { font-size: 16px; font-weight: 700; color: #e8b931; }
102
+ .c-badge .b-desc { font-size: 12px; color: #6b7280; margin-top: 2px; }
103
+
104
+ /* CTA */
105
+ .final-cta { padding: 100px 48px; text-align: center; }
106
+ .final-cta h2 { font-size: 44px; font-weight: 700; letter-spacing: -1px; margin-bottom: 14px; }
107
+ .final-cta p { font-size: 17px; color: #6b7280; margin-bottom: 36px; max-width: 480px; margin-left: auto; margin-right: auto; }
108
+ .final-cta .cta-row { display: flex; gap: 14px; justify-content: center; }
109
+ .btn-dark { background: #1a1a2e; color: #fff; font-weight: 600; font-size: 15px; padding: 14px 28px; border-radius: 8px; text-decoration: none; display: inline-block; transition: background 0.15s; }
110
+ .btn-dark:hover { background: #2d2d52; }
111
+ .btn-light-outline { border: 1.5px solid #d1d5db; color: #1a1a2e; font-weight: 600; font-size: 15px; padding: 13px 28px; border-radius: 8px; text-decoration: none; display: inline-block; }
112
+ .btn-light-outline:hover { border-color: #1a1a2e; }
113
+
114
+ /* FOOTER */
115
+ footer { border-top: 1px solid #e5e5e5; padding: 40px 0; }
116
+ footer .wrap { max-width: 1280px; margin: 0 auto; padding: 0 48px; display: flex; justify-content: space-between; align-items: center; }
117
+ footer p { font-size: 13px; color: #9ca3af; }
118
+ footer .fl { display: flex; gap: 24px; }
119
+ footer .fl a { font-size: 13px; color: #9ca3af; text-decoration: none; }
120
+ footer .fl a:hover { color: #1a1a2e; }
121
+ </style>
122
+ </head>
123
+ <body>
124
+
125
+ <nav>
126
+ <div class="wrap">
127
+ <div class="mark">T<span>E</span>NDER</div>
128
+ <div class="nav-r">
129
+ <a href="#">Platform</a>
130
+ <a href="#">Docs</a>
131
+ <a href="#">Pricing</a>
132
+ <a href="#">Blog</a>
133
+ <a href="#">Login</a>
134
+ <a href="#" class="cta-sm">Get started</a>
135
+ </div>
136
+ </div>
137
+ </nav>
138
+
139
+ <section class="hero-band">
140
+ <div class="hero-wrap">
141
+ <div class="hero-left">
142
+ <div class="hero-eyebrow">Financial infrastructure</div>
143
+ <h1>One integration. Every way money moves.</h1>
144
+ <p>Tender gives platforms and marketplaces a single API for payments, subscriptions, and payouts across 47 countries. We handle fraud, compliance, and FX so your engineers don't have to.</p>
145
+ <div class="hero-btns">
146
+ <a href="#" class="btn-gold">View the docs</a>
147
+ <a href="#" class="btn-dark-outline">Talk to sales</a>
148
+ </div>
149
+ </div>
150
+ <div class="hero-right">
151
+ <div class="hero-card-stack">
152
+ <div class="h-card card-1">
153
+ <div class="h-label">Today's Volume</div>
154
+ <div class="h-row">
155
+ <div class="h-value">$4.2M</div>
156
+ <div><span class="status-dot"></span><span class="status-text">All systems operational</span></div>
157
+ </div>
158
+ <div class="h-sub">+18% vs. same day last week</div>
159
+ </div>
160
+ <div class="h-card card-2">
161
+ <div class="h-label">Fraud Blocked (24h)</div>
162
+ <div class="h-row">
163
+ <div class="h-value" style="font-size:24px; color:#ef4444;">$31,420</div>
164
+ </div>
165
+ <div class="h-sub">47 transactions blocked, 0 false positives</div>
166
+ </div>
167
+ <div class="h-card card-3">
168
+ <div class="h-label">Payout Batch #8291</div>
169
+ <div class="h-row">
170
+ <div class="h-value" style="font-size:24px; color:#22c55e;">$892,100</div>
171
+ </div>
172
+ <div class="h-sub">1,203 recipients across 12 countries &middot; T+1 settlement</div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </section>
178
+
179
+ <section class="trust-bar">
180
+ <div class="wrap">
181
+ <div class="trust-item"><div class="t-val">$84B+</div><div class="t-lab">Annual volume</div></div>
182
+ <div class="trust-item"><div class="t-val">99.999%</div><div class="t-lab">Uptime</div></div>
183
+ <div class="trust-item"><div class="t-val">135</div><div class="t-lab">Currencies</div></div>
184
+ <div class="trust-item"><div class="t-val">60+</div><div class="t-lab">Payment methods</div></div>
185
+ <div class="trust-item"><div class="t-val">47</div><div class="t-lab">Countries</div></div>
186
+ </div>
187
+ </section>
188
+
189
+ <section class="tabs-section">
190
+ <div class="tabs-header">
191
+ <h2>One API for everything payments</h2>
192
+ <p>Whether you're charging a card or splitting marketplace revenue across continents, the integration looks the same.</p>
193
+ </div>
194
+
195
+ <div class="tab-nav">
196
+ <button class="tab-btn active" onclick="showTab(0)">Payments</button>
197
+ <button class="tab-btn" onclick="showTab(1)">Billing</button>
198
+ <button class="tab-btn" onclick="showTab(2)">Payouts</button>
199
+ </div>
200
+
201
+ <div class="tab-panel active" id="tab-0">
202
+ <div class="tab-text">
203
+ <h3>Accept payments everywhere customers are</h3>
204
+ <p>A single endpoint handles cards, wallets, bank transfers, and local payment methods. Tender routes each transaction to the optimal processor and handles retries, 3DS, and currency conversion automatically.</p>
205
+ <ul>
206
+ <li>Smart routing increases auth rates by 8-12%</li>
207
+ <li>Automatic 3D Secure with risk-based exemptions</li>
208
+ <li>Present prices in 135 local currencies</li>
209
+ <li>Pre-built checkout UI or fully custom via Elements SDK</li>
210
+ </ul>
211
+ </div>
212
+ <div class="tab-code">
213
+ <pre><span class="cm">// Charge a customer</span>
214
+ <span class="kw">const</span> payment = <span class="kw">await</span> tender.<span class="fn">payments</span>.<span class="fn">create</span>({
215
+ <span class="fn">amount</span>: <span class="nb">9900</span>,
216
+ <span class="fn">currency</span>: <span class="st">'eur'</span>,
217
+ <span class="fn">payment_method</span>: <span class="st">'pm_card_visa'</span>,
218
+ <span class="fn">customer</span>: <span class="st">'cus_Lk92mN'</span>,
219
+ <span class="fn">idempotency_key</span>: <span class="st">'ord_28491'</span>,
220
+ });
221
+
222
+ <span class="cm">// Response</span>
223
+ {
224
+ <span class="fn">id</span>: <span class="st">"pay_3Rf8kL2..."</span>,
225
+ <span class="fn">status</span>: <span class="st">"succeeded"</span>,
226
+ <span class="fn">amount</span>: <span class="nb">9900</span>,
227
+ <span class="fn">fraud_score</span>: <span class="nb">0.01</span>,
228
+ <span class="fn">fee</span>: <span class="nb">317</span>,
229
+ <span class="fn">net</span>: <span class="nb">9583</span>
230
+ }</pre>
231
+ </div>
232
+ </div>
233
+
234
+ <div class="tab-panel" id="tab-1">
235
+ <div class="tab-text">
236
+ <h3>Billing that scales with your pricing model</h3>
237
+ <p>Flat-rate, per-seat, metered, or any combination. Define pricing in the API or dashboard, and Tender calculates proration, generates invoices, retries failed payments, and sends receipts.</p>
238
+ <ul>
239
+ <li>Usage-based billing with real-time metering API</li>
240
+ <li>Automatic proration on plan changes</li>
241
+ <li>Smart dunning reduces involuntary churn by 25%</li>
242
+ <li>Revenue recognition-ready invoice data</li>
243
+ </ul>
244
+ </div>
245
+ <div class="tab-code">
246
+ <pre><span class="cm">// Create a metered subscription</span>
247
+ <span class="kw">const</span> sub = <span class="kw">await</span> tender.<span class="fn">subscriptions</span>.<span class="fn">create</span>({
248
+ <span class="fn">customer</span>: <span class="st">'cus_Lk92mN'</span>,
249
+ <span class="fn">items</span>: [{
250
+ <span class="fn">price</span>: <span class="st">'price_api_calls'</span>,
251
+ <span class="fn">billing_scheme</span>: <span class="st">'metered'</span>,
252
+ }],
253
+ <span class="fn">billing_cycle_anchor</span>: <span class="st">'now'</span>,
254
+ });
255
+
256
+ <span class="cm">// Report usage</span>
257
+ <span class="kw">await</span> tender.<span class="fn">usage</span>.<span class="fn">record</span>({
258
+ <span class="fn">subscription_item</span>: sub.items[<span class="nb">0</span>].id,
259
+ <span class="fn">quantity</span>: <span class="nb">14200</span>,
260
+ });</pre>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="tab-panel" id="tab-2">
265
+ <div class="tab-text">
266
+ <h3>Payouts to anyone, anywhere</h3>
267
+ <p>Send funds to marketplace sellers, gig workers, or SaaS affiliates. Tender manages KYC, tax form collection, currency conversion, and compliance across 47 countries.</p>
268
+ <ul>
269
+ <li>Automatic revenue splitting at payment time</li>
270
+ <li>1099 / tax form generation for US recipients</li>
271
+ <li>Configurable payout schedules (daily, weekly, manual)</li>
272
+ <li>Local settlement in 28 currencies</li>
273
+ </ul>
274
+ </div>
275
+ <div class="tab-code">
276
+ <pre><span class="cm">// Split a payment between platform and seller</span>
277
+ <span class="kw">const</span> payment = <span class="kw">await</span> tender.<span class="fn">payments</span>.<span class="fn">create</span>({
278
+ <span class="fn">amount</span>: <span class="nb">10000</span>,
279
+ <span class="fn">currency</span>: <span class="st">'usd'</span>,
280
+ <span class="fn">payment_method</span>: <span class="st">'pm_card_visa'</span>,
281
+ <span class="fn">transfer_data</span>: {
282
+ <span class="fn">destination</span>: <span class="st">'acct_seller_8kL2'</span>,
283
+ <span class="fn">amount</span>: <span class="nb">8500</span>, <span class="cm">// seller gets $85</span>
284
+ },
285
+ <span class="cm">// platform keeps $15</span>
286
+ });</pre>
287
+ </div>
288
+ </div>
289
+ </section>
290
+
291
+ <div class="audience">
292
+ <div class="audience-card">
293
+ <div class="a-tag">For engineers</div>
294
+ <h3>An API you'll actually enjoy</h3>
295
+ <p>RESTful, consistent, and exhaustively documented. SDKs for every major language, webhooks for every event, and an idempotency model that makes retries safe.</p>
296
+ <ul class="a-list">
297
+ <li>SDKs: Node, Python, Ruby, Go, Java, PHP, .NET</li>
298
+ <li>Typed webhook payloads with replay &amp; filtering</li>
299
+ <li>Test mode with deterministic card numbers</li>
300
+ <li>OpenAPI spec and Postman collection</li>
301
+ <li>CLI for local development and debugging</li>
302
+ </ul>
303
+ </div>
304
+ <div class="audience-card">
305
+ <div class="a-tag">For finance &amp; ops</div>
306
+ <h3>Visibility without engineering tickets</h3>
307
+ <p>A dashboard built for finance teams who need to understand revenue, resolve disputes, and close books without writing SQL or asking an engineer.</p>
308
+ <ul class="a-list">
309
+ <li>Real-time revenue, MRR, and cohort dashboards</li>
310
+ <li>Dispute management with evidence auto-fill</li>
311
+ <li>Exportable reports (CSV, PDF, QuickBooks sync)</li>
312
+ <li>Role-based access with SSO and audit logs</li>
313
+ <li>Custom alerts for volume spikes, fraud, and failures</li>
314
+ </ul>
315
+ </div>
316
+ </div>
317
+
318
+ <section class="compliance">
319
+ <div class="wrap">
320
+ <h2>The regulated parts are our problem</h2>
321
+ <p>Tender holds the licenses, passes the audits, and manages the complexity of global money movement so your team stays focused on product.</p>
322
+ <div class="badge-row">
323
+ <div class="c-badge"><div class="b-title">PCI DSS L1</div><div class="b-desc">Highest card security tier</div></div>
324
+ <div class="c-badge"><div class="b-title">SOC 2 Type II</div><div class="b-desc">Audited controls</div></div>
325
+ <div class="c-badge"><div class="b-title">PSD2 / SCA</div><div class="b-desc">European strong auth</div></div>
326
+ <div class="c-badge"><div class="b-title">MTLs</div><div class="b-desc">Licensed in all operating markets</div></div>
327
+ <div class="c-badge"><div class="b-title">GDPR</div><div class="b-desc">Data residency &amp; DPA</div></div>
328
+ </div>
329
+ </div>
330
+ </section>
331
+
332
+ <section class="final-cta">
333
+ <h2>Start moving money today</h2>
334
+ <p>Create a free account, get your API keys, and process your first test payment in under five minutes.</p>
335
+ <div class="cta-row">
336
+ <a href="#" class="btn-dark">Start integrating</a>
337
+ <a href="#" class="btn-light-outline">Read documentation</a>
338
+ </div>
339
+ </section>
340
+
341
+ <footer>
342
+ <div class="wrap">
343
+ <p>&copy; 2026 Tender, Inc. All rights reserved.</p>
344
+ <div class="fl">
345
+ <a href="#">Privacy</a>
346
+ <a href="#">Terms</a>
347
+ <a href="#">Security</a>
348
+ <a href="#">Status</a>
349
+ <a href="#">Careers</a>
350
+ </div>
351
+ </div>
352
+ </footer>
353
+
354
+ <script>
355
+ function showTab(idx) {
356
+ document.querySelectorAll('.tab-panel').forEach((p, i) => {
357
+ p.classList.toggle('active', i === idx);
358
+ });
359
+ document.querySelectorAll('.tab-btn').forEach((b, i) => {
360
+ b.classList.toggle('active', i === idx);
361
+ });
362
+ }
363
+ </script>
364
+
365
+ </body>
366
+ </html>