tailprint 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +160 -2
- package/dist/config/env.d.ts +77 -0
- package/dist/config/env.js +38 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/plans.d.ts +15 -0
- package/dist/config/plans.js +104 -0
- package/dist/config/plans.js.map +1 -0
- package/dist/config/templates.d.ts +10 -0
- package/dist/config/templates.js +746 -0
- package/dist/config/templates.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.js +897 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +2 -0
- package/dist/mcp/stdio.js +27 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/routes/dashboard.d.ts +2 -0
- package/dist/routes/dashboard.js +454 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/mcp.d.ts +2 -0
- package/dist/routes/mcp.js +329 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/render.d.ts +2 -0
- package/dist/routes/render.js +444 -0
- package/dist/routes/render.js.map +1 -0
- package/dist/routes/scrape.d.ts +2 -0
- package/dist/routes/scrape.js +132 -0
- package/dist/routes/scrape.js.map +1 -0
- package/dist/routes/templates.d.ts +2 -0
- package/dist/routes/templates.js +2449 -0
- package/dist/routes/templates.js.map +1 -0
- package/dist/routes/usage.d.ts +31 -0
- package/dist/routes/usage.js +73 -0
- package/dist/routes/usage.js.map +1 -0
- package/dist/routes/webhooks.d.ts +2 -0
- package/dist/routes/webhooks.js +227 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/schemas/render.d.ts +422 -0
- package/dist/schemas/render.js +91 -0
- package/dist/schemas/render.js.map +1 -0
- package/dist/schemas/scrape.d.ts +65 -0
- package/dist/schemas/scrape.js +24 -0
- package/dist/schemas/scrape.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +206 -0
- package/dist/server.js.map +1 -0
- package/dist/services/browser.d.ts +21 -0
- package/dist/services/browser.js +299 -0
- package/dist/services/browser.js.map +1 -0
- package/dist/services/carousel.d.ts +43 -0
- package/dist/services/carousel.js +300 -0
- package/dist/services/carousel.js.map +1 -0
- package/dist/services/chart.d.ts +29 -0
- package/dist/services/chart.js +129 -0
- package/dist/services/chart.js.map +1 -0
- package/dist/services/eInvoice.d.ts +62 -0
- package/dist/services/eInvoice.js +413 -0
- package/dist/services/eInvoice.js.map +1 -0
- package/dist/services/email.d.ts +24 -0
- package/dist/services/email.js +177 -0
- package/dist/services/email.js.map +1 -0
- package/dist/services/mockup.d.ts +14 -0
- package/dist/services/mockup.js +130 -0
- package/dist/services/mockup.js.map +1 -0
- package/dist/services/pdfStamper.d.ts +16 -0
- package/dist/services/pdfStamper.js +47 -0
- package/dist/services/pdfStamper.js.map +1 -0
- package/dist/services/qr.d.ts +20 -0
- package/dist/services/qr.js +44 -0
- package/dist/services/qr.js.map +1 -0
- package/dist/services/redis.d.ts +65 -0
- package/dist/services/redis.js +318 -0
- package/dist/services/redis.js.map +1 -0
- package/dist/services/scraper.d.ts +16 -0
- package/dist/services/scraper.js +138 -0
- package/dist/services/scraper.js.map +1 -0
- package/dist/services/storage.d.ts +38 -0
- package/dist/services/storage.js +123 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/stripe.d.ts +32 -0
- package/dist/services/stripe.js +229 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/services/visualDiff.d.ts +33 -0
- package/dist/services/visualDiff.js +218 -0
- package/dist/services/visualDiff.js.map +1 -0
- package/package.json +74 -4
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
export const TEMPLATES = [
|
|
2
|
+
{
|
|
3
|
+
id: 'invoice',
|
|
4
|
+
title: 'Professional Invoice',
|
|
5
|
+
category: 'Billing & Accounting',
|
|
6
|
+
description: 'Production-ready invoice template with line items, tax breakdown, and banking details.',
|
|
7
|
+
format: 'A4',
|
|
8
|
+
landscape: false,
|
|
9
|
+
html: `<div class="max-w-4xl mx-auto p-12 bg-white text-slate-800 font-sans">
|
|
10
|
+
<!-- Header -->
|
|
11
|
+
<div class="flex justify-between items-start border-b border-slate-200 pb-8">
|
|
12
|
+
<div>
|
|
13
|
+
<div class="flex items-center space-x-3">
|
|
14
|
+
<div class="w-10 h-10 bg-indigo-600 rounded-lg flex items-center justify-center text-white font-bold text-xl">R</div>
|
|
15
|
+
<span class="text-2xl font-black text-slate-900 tracking-tight">RenderCorp Inc.</span>
|
|
16
|
+
</div>
|
|
17
|
+
<p class="text-sm text-slate-500 mt-2">548 Market Street, Suite 3400<br>San Francisco, CA 94104<br>Tax ID: US-9428512</p>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="text-right">
|
|
20
|
+
<h1 class="text-3xl font-black text-slate-900 uppercase tracking-wide">INVOICE</h1>
|
|
21
|
+
<p class="text-sm font-semibold text-indigo-600 mt-1">#INV-2026-042</p>
|
|
22
|
+
<div class="mt-4 text-xs text-slate-500 space-y-1">
|
|
23
|
+
<p><span class="font-medium text-slate-700">Invoice Date:</span> November 10, 2026</p>
|
|
24
|
+
<p><span class="font-medium text-slate-700">Due Date:</span> November 24, 2026</p>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<!-- Billed To -->
|
|
30
|
+
<div class="mt-8 grid grid-cols-2 gap-8 text-sm">
|
|
31
|
+
<div>
|
|
32
|
+
<p class="text-xs uppercase font-bold text-slate-400 tracking-wider">Billed To</p>
|
|
33
|
+
<p class="font-bold text-slate-900 mt-1 text-base">Acme Corporation</p>
|
|
34
|
+
<p class="text-slate-600 mt-1">Attn: Sebastian Viste<br>100 Montgomery St, Fl 18<br>San Francisco, CA 94104<br>VAT: 987654321</p>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="bg-slate-50 p-4 rounded-xl border border-slate-100 flex flex-col justify-between">
|
|
37
|
+
<span class="text-xs uppercase font-bold text-slate-400">Payment Status</span>
|
|
38
|
+
<div class="flex items-center space-x-2 mt-2">
|
|
39
|
+
<span class="inline-block w-2.5 h-2.5 rounded-full bg-emerald-500"></span>
|
|
40
|
+
<span class="font-bold text-emerald-700 text-sm">Paid via Stripe</span>
|
|
41
|
+
</div>
|
|
42
|
+
<p class="text-xs text-slate-500 mt-2">Transaction: ch_3N4xLm2eZvKYlo2C0pY5</p>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Items Table -->
|
|
47
|
+
<div class="mt-10 overflow-hidden rounded-xl border border-slate-200">
|
|
48
|
+
<table class="w-full text-left border-collapse text-sm">
|
|
49
|
+
<thead>
|
|
50
|
+
<tr class="bg-slate-100 text-slate-700 font-semibold text-xs uppercase tracking-wider">
|
|
51
|
+
<th class="py-3 px-4">Description</th>
|
|
52
|
+
<th class="py-3 px-4 text-center">Qty</th>
|
|
53
|
+
<th class="py-3 px-4 text-right">Unit Price</th>
|
|
54
|
+
<th class="py-3 px-4 text-right">Amount (USD)</th>
|
|
55
|
+
</tr>
|
|
56
|
+
</thead>
|
|
57
|
+
<tbody class="divide-y divide-slate-100 text-slate-700">
|
|
58
|
+
<tr>
|
|
59
|
+
<td class="py-3.5 px-4 font-medium text-slate-900">Tailwind Render Engine - Pro Subscription</td>
|
|
60
|
+
<td class="py-3.5 px-4 text-center">1</td>
|
|
61
|
+
<td class="py-3.5 px-4 text-right">$39.00</td>
|
|
62
|
+
<td class="py-3.5 px-4 text-right font-medium">$39.00</td>
|
|
63
|
+
</tr>
|
|
64
|
+
<tr>
|
|
65
|
+
<td class="py-3.5 px-4 font-medium text-slate-900">Dedicated Playwright Concurrency Pool (5 workers)</td>
|
|
66
|
+
<td class="py-3.5 px-4 text-center">1</td>
|
|
67
|
+
<td class="py-3.5 px-4 text-right">$150.00</td>
|
|
68
|
+
<td class="py-3.5 px-4 text-right font-medium">$150.00</td>
|
|
69
|
+
</tr>
|
|
70
|
+
<tr>
|
|
71
|
+
<td class="py-3.5 px-4 font-medium text-slate-900">Upstash Redis Global L2 Cache Replication</td>
|
|
72
|
+
<td class="py-3.5 px-4 text-center">1</td>
|
|
73
|
+
<td class="py-3.5 px-4 text-right">$40.00</td>
|
|
74
|
+
<td class="py-3.5 px-4 text-right font-medium">$40.00</td>
|
|
75
|
+
</tr>
|
|
76
|
+
</tbody>
|
|
77
|
+
</table>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<!-- Totals -->
|
|
81
|
+
<div class="mt-6 flex justify-end">
|
|
82
|
+
<div class="w-64 space-y-2 text-sm text-slate-600">
|
|
83
|
+
<div class="flex justify-between py-1">
|
|
84
|
+
<span>Subtotal</span>
|
|
85
|
+
<span class="font-medium text-slate-900">$229.00</span>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="flex justify-between py-1">
|
|
88
|
+
<span>Tax (8.25%)</span>
|
|
89
|
+
<span class="font-medium text-slate-900">$18.89</span>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="border-t border-slate-300 pt-2 flex justify-between text-base font-bold text-slate-900">
|
|
92
|
+
<span>Total Paid</span>
|
|
93
|
+
<span class="text-indigo-600">$247.89</span>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<!-- Footer -->
|
|
99
|
+
<div class="mt-16 pt-8 border-t border-slate-200 text-center text-xs text-slate-400">
|
|
100
|
+
<p>Thank you for choosing Tailprint. Questions? Contact support@tailprint.com</p>
|
|
101
|
+
</div>
|
|
102
|
+
</div>`,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'certificate',
|
|
106
|
+
title: 'Course Certificate of Completion',
|
|
107
|
+
category: 'Education & HR',
|
|
108
|
+
description: 'An elegant award certificate featuring gold border ornamentation, custom typography, and verification stamp.',
|
|
109
|
+
format: 'A4',
|
|
110
|
+
landscape: true,
|
|
111
|
+
html: `<div class="w-full h-full p-10 bg-slate-900 flex items-center justify-center font-serif">
|
|
112
|
+
<div class="w-full h-full p-8 border-4 border-amber-400/80 rounded-2xl bg-gradient-to-br from-slate-950 via-slate-900 to-indigo-950 text-center relative overflow-hidden flex flex-col justify-between shadow-2xl">
|
|
113
|
+
|
|
114
|
+
<!-- Background Glows -->
|
|
115
|
+
<div class="absolute -top-12 -right-12 w-48 h-48 bg-amber-500/10 rounded-full blur-2xl"></div>
|
|
116
|
+
<div class="absolute -bottom-12 -left-12 w-48 h-48 bg-indigo-500/10 rounded-full blur-2xl"></div>
|
|
117
|
+
|
|
118
|
+
<!-- Header -->
|
|
119
|
+
<div class="mt-2">
|
|
120
|
+
<p class="text-amber-400 uppercase tracking-widest text-xs font-sans font-bold">Global Academy of Advanced Engineering</p>
|
|
121
|
+
<h1 class="text-4xl font-normal text-white mt-3 tracking-wide">CERTIFICATE OF ACHIEVEMENT</h1>
|
|
122
|
+
<div class="w-24 h-0.5 bg-amber-400 mx-auto mt-4"></div>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<!-- Recipient -->
|
|
126
|
+
<div class="my-6">
|
|
127
|
+
<p class="text-slate-400 text-sm italic font-sans">This is proudly presented to</p>
|
|
128
|
+
<h2 class="text-4xl font-bold text-amber-200 mt-2 tracking-wide font-sans">Sebastian Viste</h2>
|
|
129
|
+
<p class="text-slate-300 text-sm max-w-xl mx-auto mt-4 font-sans leading-relaxed">
|
|
130
|
+
for successfully completing the rigorous industry training in
|
|
131
|
+
<span class="text-white font-semibold">"Modern Cloud Architecture, Fastify Microservices & High-Performance Headless Automation"</span>
|
|
132
|
+
</p>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<!-- Signatures & Date -->
|
|
136
|
+
<div class="grid grid-cols-3 gap-6 items-end pb-4 font-sans text-xs">
|
|
137
|
+
<div>
|
|
138
|
+
<p class="text-slate-400">November 10, 2026</p>
|
|
139
|
+
<div class="border-t border-slate-700 mt-2 pt-1 text-slate-500">Date of Issuance</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div class="flex justify-center">
|
|
143
|
+
<div class="w-16 h-16 rounded-full border-2 border-amber-400/60 bg-amber-400/10 flex items-center justify-center text-amber-300 font-bold text-[10px] tracking-wider uppercase shadow-inner">
|
|
144
|
+
VERIFIED
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div>
|
|
149
|
+
<p class="text-white font-signature text-base italic">Dr. Christian Lind</p>
|
|
150
|
+
<div class="border-t border-slate-700 mt-2 pt-1 text-slate-500">Program Director & Dean</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
</div>
|
|
155
|
+
</div>`,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: 'report',
|
|
159
|
+
title: 'Weekly Executive Performance Report',
|
|
160
|
+
category: 'Business & Analytics',
|
|
161
|
+
description: 'Data-dense executive dashboard featuring KPI metric widgets, progress trackers, and system SLA overview.',
|
|
162
|
+
format: 'A4',
|
|
163
|
+
landscape: false,
|
|
164
|
+
html: `<div class="max-w-4xl mx-auto p-10 bg-slate-50 text-slate-800 font-sans">
|
|
165
|
+
<!-- Top Bar -->
|
|
166
|
+
<div class="flex justify-between items-center border-b border-slate-200 pb-5">
|
|
167
|
+
<div>
|
|
168
|
+
<span class="text-xs font-bold uppercase tracking-wider text-indigo-600 bg-indigo-50 px-2.5 py-1 rounded-md">Week 46, 2026</span>
|
|
169
|
+
<h1 class="text-2xl font-black text-slate-900 mt-2">Executive Weekly Dashboard</h1>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="text-right text-xs text-slate-500">
|
|
172
|
+
<p>Generated: Nov 10, 2026, 21:00 UTC</p>
|
|
173
|
+
<p class="font-medium text-slate-700">Team: Platform & EaaS</p>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
<!-- KPI Cards -->
|
|
178
|
+
<div class="grid grid-cols-3 gap-4 mt-6">
|
|
179
|
+
<div class="bg-white p-5 rounded-xl border border-slate-200 shadow-sm">
|
|
180
|
+
<p class="text-xs font-semibold text-slate-500 uppercase">Documents Rendered</p>
|
|
181
|
+
<h3 class="text-2xl font-black text-slate-900 mt-1">142,850</h3>
|
|
182
|
+
<div class="flex items-center text-xs text-emerald-600 font-bold mt-2">
|
|
183
|
+
<span>▲ +18.4%</span>
|
|
184
|
+
<span class="text-slate-400 font-normal ml-1.5">vs. last week</span>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div class="bg-white p-5 rounded-xl border border-slate-200 shadow-sm">
|
|
189
|
+
<p class="text-xs font-semibold text-slate-500 uppercase">Avg Response Time</p>
|
|
190
|
+
<h3 class="text-2xl font-black text-slate-900 mt-1">428 ms</h3>
|
|
191
|
+
<div class="flex items-center text-xs text-emerald-600 font-bold mt-2">
|
|
192
|
+
<span>▼ -42 ms</span>
|
|
193
|
+
<span class="text-slate-400 font-normal ml-1.5">pool optimization</span>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<div class="bg-white p-5 rounded-xl border border-slate-200 shadow-sm">
|
|
198
|
+
<p class="text-xs font-semibold text-slate-500 uppercase">Cache Hit Rate (SHA-256)</p>
|
|
199
|
+
<h3 class="text-2xl font-black text-indigo-600 mt-1">87.2%</h3>
|
|
200
|
+
<div class="flex items-center text-xs text-slate-500 mt-2">
|
|
201
|
+
<span>Upstash Redis L2 Cache</span>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<!-- Sprint Objectives & Progress -->
|
|
207
|
+
<div class="mt-8 bg-white p-6 rounded-xl border border-slate-200 shadow-sm">
|
|
208
|
+
<h2 class="text-base font-bold text-slate-900">Sprint Milestones & Deliverables</h2>
|
|
209
|
+
<div class="space-y-4 mt-4">
|
|
210
|
+
<div>
|
|
211
|
+
<div class="flex justify-between text-xs font-semibold text-slate-700 mb-1">
|
|
212
|
+
<span>Stripe Webhooks & Automated Key Provisioning</span>
|
|
213
|
+
<span class="text-emerald-600 font-bold">100%</span>
|
|
214
|
+
</div>
|
|
215
|
+
<div class="w-full bg-slate-100 rounded-full h-2">
|
|
216
|
+
<div class="bg-emerald-500 h-2 rounded-full w-full"></div>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
<div>
|
|
221
|
+
<div class="flex justify-between text-xs font-semibold text-slate-700 mb-1">
|
|
222
|
+
<span>Tailwind Play CDN JIT & Font Engine</span>
|
|
223
|
+
<span class="text-emerald-600 font-bold">100%</span>
|
|
224
|
+
</div>
|
|
225
|
+
<div class="w-full bg-slate-100 rounded-full h-2">
|
|
226
|
+
<div class="bg-emerald-500 h-2 rounded-full w-full"></div>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<div>
|
|
231
|
+
<div class="flex justify-between text-xs font-semibold text-slate-700 mb-1">
|
|
232
|
+
<span>OpenAPI 3.1 & Scalar Reference in Dark Mode</span>
|
|
233
|
+
<span class="text-emerald-600 font-bold">100%</span>
|
|
234
|
+
</div>
|
|
235
|
+
<div class="w-full bg-slate-100 rounded-full h-2">
|
|
236
|
+
<div class="bg-emerald-500 h-2 rounded-full w-full"></div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
<!-- Infrastructure Table -->
|
|
243
|
+
<div class="mt-8">
|
|
244
|
+
<h2 class="text-base font-bold text-slate-900 mb-3">System Resources & Uptime</h2>
|
|
245
|
+
<div class="overflow-hidden rounded-xl border border-slate-200 bg-white">
|
|
246
|
+
<table class="w-full text-left border-collapse text-xs">
|
|
247
|
+
<thead>
|
|
248
|
+
<tr class="bg-slate-100 text-slate-700 font-semibold uppercase">
|
|
249
|
+
<th class="py-2.5 px-4">Environment</th>
|
|
250
|
+
<th class="py-2.5 px-4">Node Runtime</th>
|
|
251
|
+
<th class="py-2.5 px-4">Concurrency Pool</th>
|
|
252
|
+
<th class="py-2.5 px-4">Uptime</th>
|
|
253
|
+
<th class="py-2.5 px-4 text-right">Status</th>
|
|
254
|
+
</tr>
|
|
255
|
+
</thead>
|
|
256
|
+
<tbody class="divide-y divide-slate-100 text-slate-700">
|
|
257
|
+
<tr>
|
|
258
|
+
<td class="py-3 px-4 font-semibold text-slate-900">Render Engine Prod (Docker)</td>
|
|
259
|
+
<td class="py-3 px-4">Node.js v22 LTS</td>
|
|
260
|
+
<td class="py-3 px-4">5 workers (p-limit)</td>
|
|
261
|
+
<td class="py-3 px-4">99.98%</td>
|
|
262
|
+
<td class="py-3 px-4 text-right"><span class="px-2 py-0.5 rounded-full bg-emerald-100 text-emerald-800 font-bold text-[10px]">OPERATIONAL</span></td>
|
|
263
|
+
</tr>
|
|
264
|
+
<tr>
|
|
265
|
+
<td class="py-3 px-4 font-semibold text-slate-900">Upstash Redis Cluster</td>
|
|
266
|
+
<td class="py-3 px-4">Serverless REST</td>
|
|
267
|
+
<td class="py-3 px-4">Global Replication</td>
|
|
268
|
+
<td class="py-3 px-4">100.0%</td>
|
|
269
|
+
<td class="py-3 px-4 text-right"><span class="px-2 py-0.5 rounded-full bg-emerald-100 text-emerald-800 font-bold text-[10px]">OPERATIONAL</span></td>
|
|
270
|
+
</tr>
|
|
271
|
+
</tbody>
|
|
272
|
+
</table>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
</div>`,
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
id: 'resume',
|
|
280
|
+
title: 'Modern Tech Resume / CV',
|
|
281
|
+
category: 'Career & HR',
|
|
282
|
+
description: 'Clean two-column technical CV layout with timeline experience, skill tags, and contact links.',
|
|
283
|
+
format: 'A4',
|
|
284
|
+
landscape: false,
|
|
285
|
+
html: `<div class="max-w-4xl mx-auto p-10 bg-white text-slate-800 font-sans">
|
|
286
|
+
<!-- Top Profile Header -->
|
|
287
|
+
<div class="flex justify-between items-center border-b border-slate-200 pb-8">
|
|
288
|
+
<div>
|
|
289
|
+
<h1 class="text-4xl font-extrabold text-slate-900 tracking-tight">Sebastian Viste</h1>
|
|
290
|
+
<p class="text-lg font-semibold text-indigo-600 mt-1">Lead Backend & Distributed Systems Engineer</p>
|
|
291
|
+
<p class="text-sm text-slate-500 mt-2 max-w-xl leading-relaxed">
|
|
292
|
+
Specializing in high-throughput Node.js microservices, headless browser automation at scale, and serverless edge caching architectures.
|
|
293
|
+
</p>
|
|
294
|
+
</div>
|
|
295
|
+
<div class="text-right text-xs text-slate-500 space-y-1.5">
|
|
296
|
+
<p class="font-medium text-slate-700">📍 Copenhagen, Denmark</p>
|
|
297
|
+
<p>✉️ sebastian@example.com</p>
|
|
298
|
+
<p>🔗 github.com/sebastianviste</p>
|
|
299
|
+
<p>📱 +45 20 30 40 50</p>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
302
|
+
|
|
303
|
+
<!-- Two Column Grid -->
|
|
304
|
+
<div class="grid grid-cols-12 gap-8 mt-8">
|
|
305
|
+
<!-- Left Column (Experience) -->
|
|
306
|
+
<div class="col-span-8 space-y-6">
|
|
307
|
+
<div>
|
|
308
|
+
<h2 class="text-sm font-black uppercase tracking-wider text-slate-400 mb-4">Professional Experience</h2>
|
|
309
|
+
|
|
310
|
+
<div class="space-y-6">
|
|
311
|
+
<div class="relative pl-6 border-l-2 border-indigo-200">
|
|
312
|
+
<span class="absolute -left-1.5 top-1.5 w-3 h-3 rounded-full bg-indigo-600 border-2 border-white"></span>
|
|
313
|
+
<div class="flex justify-between items-baseline">
|
|
314
|
+
<h3 class="text-base font-bold text-slate-900">Principal Engineer & Co-Founder</h3>
|
|
315
|
+
<span class="text-xs font-semibold text-slate-400">2024 — Present</span>
|
|
316
|
+
</div>
|
|
317
|
+
<p class="text-xs font-semibold text-indigo-600">Tailprint</p>
|
|
318
|
+
<p class="text-xs text-slate-600 mt-2 leading-relaxed">
|
|
319
|
+
Architected a sub-500ms PDF & Open Graph rendering platform handling 15M+ requests monthly. Implemented Playwright Chromium browser pooling and Upstash Redis L2 cache deduplication.
|
|
320
|
+
</p>
|
|
321
|
+
</div>
|
|
322
|
+
|
|
323
|
+
<div class="relative pl-6 border-l-2 border-slate-200">
|
|
324
|
+
<span class="absolute -left-1.5 top-1.5 w-3 h-3 rounded-full bg-slate-300 border-2 border-white"></span>
|
|
325
|
+
<div class="flex justify-between items-baseline">
|
|
326
|
+
<h3 class="text-base font-bold text-slate-900">Senior Backend Engineer</h3>
|
|
327
|
+
<span class="text-xs font-semibold text-slate-400">2021 — 2024</span>
|
|
328
|
+
</div>
|
|
329
|
+
<p class="text-xs font-semibold text-slate-600">Nordic Cloud Platforms</p>
|
|
330
|
+
<p class="text-xs text-slate-600 mt-2 leading-relaxed">
|
|
331
|
+
Led the migration from legacy monolith to TypeScript/Fastify microservices. Reduced p99 latency by 64% and decreased container infrastructure costs by 40%.
|
|
332
|
+
</p>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
|
|
337
|
+
<div>
|
|
338
|
+
<h2 class="text-sm font-black uppercase tracking-wider text-slate-400 mb-3">Key Projects</h2>
|
|
339
|
+
<div class="p-4 rounded-xl bg-slate-50 border border-slate-200">
|
|
340
|
+
<h4 class="text-xs font-bold text-slate-900">Tailwind Standalone Render Worker</h4>
|
|
341
|
+
<p class="text-xs text-slate-600 mt-1">Automated injection of Tailwind JIT compiler in headless Chromium contexts with zero pre-build compilation overhead.</p>
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
</div>
|
|
345
|
+
|
|
346
|
+
<!-- Right Column (Skills & Education) -->
|
|
347
|
+
<div class="col-span-4 space-y-6">
|
|
348
|
+
<div>
|
|
349
|
+
<h2 class="text-sm font-black uppercase tracking-wider text-slate-400 mb-3">Core Technical Skills</h2>
|
|
350
|
+
<div class="flex flex-wrap gap-1.5">
|
|
351
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">TypeScript</span>
|
|
352
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Node.js LTS</span>
|
|
353
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Fastify</span>
|
|
354
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Playwright</span>
|
|
355
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Chromium Pool</span>
|
|
356
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Docker</span>
|
|
357
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Upstash Redis</span>
|
|
358
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">OpenAPI 3.1</span>
|
|
359
|
+
<span class="px-2.5 py-1 rounded-md bg-slate-100 text-slate-800 text-xs font-semibold">Stripe SDK</span>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
|
|
363
|
+
<div>
|
|
364
|
+
<h2 class="text-sm font-black uppercase tracking-wider text-slate-400 mb-3">Education</h2>
|
|
365
|
+
<div class="text-xs space-y-1">
|
|
366
|
+
<p class="font-bold text-slate-900">M.Sc. Computer Science</p>
|
|
367
|
+
<p class="text-slate-600">Technical University of Denmark</p>
|
|
368
|
+
<p class="text-slate-400">2019 — 2021</p>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
<div>
|
|
373
|
+
<h2 class="text-sm font-black uppercase tracking-wider text-slate-400 mb-3">Certifications</h2>
|
|
374
|
+
<div class="text-xs space-y-2">
|
|
375
|
+
<p class="font-semibold text-slate-800">✓ AWS Certified Solutions Architect</p>
|
|
376
|
+
<p class="font-semibold text-slate-800">✓ Kubernetes CKA Professional</p>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
</div>
|
|
380
|
+
</div>
|
|
381
|
+
</div>`,
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
id: 'og-card',
|
|
385
|
+
title: 'Dynamic Open Graph Banner',
|
|
386
|
+
category: 'Social Media & Marketing',
|
|
387
|
+
description: 'High-contrast 1200x630 social sharing card optimized for Twitter, LinkedIn, and Slack preview links.',
|
|
388
|
+
format: 'Letter',
|
|
389
|
+
landscape: true,
|
|
390
|
+
html: `<div class="w-[1200px] h-[630px] p-16 bg-gradient-to-br from-slate-950 via-indigo-950 to-slate-900 text-white flex flex-col justify-between font-sans relative overflow-hidden">
|
|
391
|
+
<!-- Glowing Background Accents -->
|
|
392
|
+
<div class="absolute -top-24 -right-24 w-96 h-96 bg-indigo-500/20 rounded-full blur-3xl"></div>
|
|
393
|
+
<div class="absolute -bottom-24 -left-24 w-96 h-96 bg-purple-500/20 rounded-full blur-3xl"></div>
|
|
394
|
+
|
|
395
|
+
<!-- Header -->
|
|
396
|
+
<div class="flex justify-between items-center relative z-10">
|
|
397
|
+
<div class="flex items-center space-x-3">
|
|
398
|
+
<div class="w-12 h-12 rounded-xl bg-indigo-600 flex items-center justify-center font-black text-2xl shadow-lg shadow-indigo-500/40">
|
|
399
|
+
⚡
|
|
400
|
+
</div>
|
|
401
|
+
<span class="text-2xl font-black tracking-tight text-white">tailprint.com</span>
|
|
402
|
+
</div>
|
|
403
|
+
<span class="px-4 py-1.5 rounded-full bg-indigo-500/20 border border-indigo-400/30 text-indigo-300 text-sm font-bold tracking-wide">
|
|
404
|
+
DEVELOPER INSIGHTS
|
|
405
|
+
</span>
|
|
406
|
+
</div>
|
|
407
|
+
|
|
408
|
+
<!-- Main Headline -->
|
|
409
|
+
<div class="relative z-10 my-auto">
|
|
410
|
+
<div class="flex items-center space-x-2 text-emerald-400 text-sm font-bold uppercase tracking-wider mb-4">
|
|
411
|
+
<span>● Deep Dive</span>
|
|
412
|
+
<span class="text-slate-500">•</span>
|
|
413
|
+
<span class="text-slate-400 font-normal">8 min read</span>
|
|
414
|
+
</div>
|
|
415
|
+
<h1 class="text-5xl font-black leading-tight text-white tracking-tight">
|
|
416
|
+
How We Scaled Chromium to 15 Million PDF Renders at <500ms Latency
|
|
417
|
+
</h1>
|
|
418
|
+
<p class="text-slate-300 text-lg mt-4 max-w-2xl leading-relaxed">
|
|
419
|
+
Learn how concurrency pooling with Playwright, Tailwind JIT on-the-fly injection, and Upstash Redis transformed our microservice economics.
|
|
420
|
+
</p>
|
|
421
|
+
</div>
|
|
422
|
+
|
|
423
|
+
<!-- Author & Metrics Footer -->
|
|
424
|
+
<div class="flex justify-between items-center pt-8 border-t border-slate-800/80 relative z-10">
|
|
425
|
+
<div class="flex items-center space-x-4">
|
|
426
|
+
<div class="w-12 h-12 rounded-full bg-gradient-to-tr from-indigo-500 to-purple-500 flex items-center justify-center font-bold text-lg text-white">
|
|
427
|
+
SV
|
|
428
|
+
</div>
|
|
429
|
+
<div>
|
|
430
|
+
<p class="font-bold text-white text-base">Sebastian Viste</p>
|
|
431
|
+
<p class="text-xs text-slate-400">Founder & Systems Architect</p>
|
|
432
|
+
</div>
|
|
433
|
+
</div>
|
|
434
|
+
|
|
435
|
+
<div class="flex items-center space-x-6 text-sm text-slate-400">
|
|
436
|
+
<span class="flex items-center space-x-1.5">
|
|
437
|
+
<span class="text-emerald-400 font-bold">✓</span>
|
|
438
|
+
<span>Verified Playwright Engine</span>
|
|
439
|
+
</span>
|
|
440
|
+
<span class="px-3 py-1 rounded-md bg-slate-800/80 text-slate-300 text-xs font-mono font-semibold">
|
|
441
|
+
POST /v1/render/image
|
|
442
|
+
</span>
|
|
443
|
+
</div>
|
|
444
|
+
</div>
|
|
445
|
+
</div>`,
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
id: 'shipping-label',
|
|
449
|
+
title: 'E-Commerce Packing Slip & Shipping Label',
|
|
450
|
+
category: 'Logistics & Retail',
|
|
451
|
+
description: 'Clean dispatch order note with customer delivery details, package weight, SKU checklist, and return instructions.',
|
|
452
|
+
format: 'A4',
|
|
453
|
+
landscape: false,
|
|
454
|
+
html: `<div class="max-w-4xl mx-auto p-10 bg-white text-slate-900 font-sans">
|
|
455
|
+
<!-- Top Bar & Barcode Header -->
|
|
456
|
+
<div class="flex justify-between items-start border-b-2 border-slate-900 pb-6">
|
|
457
|
+
<div>
|
|
458
|
+
<h1 class="text-2xl font-black tracking-tight uppercase">PACKING SLIP / DISPATCH NOTE</h1>
|
|
459
|
+
<p class="text-xs text-slate-500 mt-1">Order #ORD-849201 • Fulfillment Center: EU-NORTH-1</p>
|
|
460
|
+
</div>
|
|
461
|
+
<!-- Visual Simulated Barcode -->
|
|
462
|
+
<div class="text-right">
|
|
463
|
+
<div class="inline-flex space-x-0.5 items-end h-10 bg-white p-1">
|
|
464
|
+
<div class="w-1 h-full bg-black"></div>
|
|
465
|
+
<div class="w-2 h-full bg-black"></div>
|
|
466
|
+
<div class="w-0.5 h-full bg-black"></div>
|
|
467
|
+
<div class="w-1.5 h-full bg-black"></div>
|
|
468
|
+
<div class="w-0.5 h-full bg-black"></div>
|
|
469
|
+
<div class="w-2 h-full bg-black"></div>
|
|
470
|
+
<div class="w-1 h-full bg-black"></div>
|
|
471
|
+
<div class="w-3 h-full bg-black"></div>
|
|
472
|
+
<div class="w-0.5 h-full bg-black"></div>
|
|
473
|
+
<div class="w-1.5 h-full bg-black"></div>
|
|
474
|
+
<div class="w-1 h-full bg-black"></div>
|
|
475
|
+
<div class="w-2 h-full bg-black"></div>
|
|
476
|
+
</div>
|
|
477
|
+
<p class="text-[10px] font-mono tracking-widest text-slate-700 mt-0.5">TRK-9821-4402-DK</p>
|
|
478
|
+
</div>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<!-- Shipping Addresses Grid -->
|
|
482
|
+
<div class="grid grid-cols-2 gap-8 my-8 text-xs">
|
|
483
|
+
<div class="p-4 rounded-xl border border-slate-200 bg-slate-50">
|
|
484
|
+
<p class="font-black text-slate-400 uppercase tracking-wider text-[10px]">SHIP TO (RECIPIENT)</p>
|
|
485
|
+
<p class="font-extrabold text-slate-900 text-sm mt-1">Sebastian Viste</p>
|
|
486
|
+
<p class="text-slate-600 mt-1 leading-relaxed">
|
|
487
|
+
Strandboulevarden 42<br>
|
|
488
|
+
2100 Copenhagen<br>
|
|
489
|
+
Denmark<br>
|
|
490
|
+
Tel: +45 20 30 40 50
|
|
491
|
+
</p>
|
|
492
|
+
</div>
|
|
493
|
+
|
|
494
|
+
<div class="p-4 rounded-xl border border-slate-200">
|
|
495
|
+
<p class="font-black text-slate-400 uppercase tracking-wider text-[10px]">SHIP FROM (RETURN SENDER)</p>
|
|
496
|
+
<p class="font-extrabold text-slate-900 text-sm mt-1">Nordic Logistics Fulfillment ApS</p>
|
|
497
|
+
<p class="text-slate-600 mt-1 leading-relaxed">
|
|
498
|
+
Terminalvej 8, Port 14<br>
|
|
499
|
+
2770 Kastrup<br>
|
|
500
|
+
Denmark<br>
|
|
501
|
+
Email: logistics@renderengine.io
|
|
502
|
+
</p>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
|
|
506
|
+
<!-- Items Table -->
|
|
507
|
+
<div class="overflow-hidden rounded-xl border border-slate-200">
|
|
508
|
+
<table class="w-full text-left text-xs border-collapse">
|
|
509
|
+
<thead>
|
|
510
|
+
<tr class="bg-slate-100 text-slate-700 font-bold uppercase">
|
|
511
|
+
<th class="py-2.5 px-4 w-12 text-center">Status</th>
|
|
512
|
+
<th class="py-2.5 px-4">SKU / Item Description</th>
|
|
513
|
+
<th class="py-2.5 px-4 text-center">Qty</th>
|
|
514
|
+
<th class="py-2.5 px-4 text-right">Location</th>
|
|
515
|
+
</tr>
|
|
516
|
+
</thead>
|
|
517
|
+
<tbody class="divide-y divide-slate-100 text-slate-700">
|
|
518
|
+
<tr>
|
|
519
|
+
<td class="py-3 px-4 text-center font-bold text-emerald-600">✓</td>
|
|
520
|
+
<td class="py-3 px-4 font-semibold text-slate-900">
|
|
521
|
+
Wireless Mechanical Keyboard (Nordic ISO / Brown Switch)
|
|
522
|
+
<span class="block text-[10px] text-slate-400 font-normal">SKU: KEYB-ISO-BRN-01</span>
|
|
523
|
+
</td>
|
|
524
|
+
<td class="py-3 px-4 text-center font-bold">1</td>
|
|
525
|
+
<td class="py-3 px-4 text-right font-mono text-slate-500">BIN-A-04</td>
|
|
526
|
+
</tr>
|
|
527
|
+
<tr>
|
|
528
|
+
<td class="py-3 px-4 text-center font-bold text-emerald-600">✓</td>
|
|
529
|
+
<td class="py-3 px-4 font-semibold text-slate-900">
|
|
530
|
+
Ergonomic Desk Mat (900x400mm - Slate Grey)
|
|
531
|
+
<span class="block text-[10px] text-slate-400 font-normal">SKU: MAT-XL-GRY-09</span>
|
|
532
|
+
</td>
|
|
533
|
+
<td class="py-3 px-4 text-center font-bold">1</td>
|
|
534
|
+
<td class="py-3 px-4 text-right font-mono text-slate-500">BIN-C-12</td>
|
|
535
|
+
</tr>
|
|
536
|
+
</tbody>
|
|
537
|
+
</table>
|
|
538
|
+
</div>
|
|
539
|
+
|
|
540
|
+
<!-- Package Specs & Return Policy -->
|
|
541
|
+
<div class="mt-8 grid grid-cols-3 gap-4 text-xs">
|
|
542
|
+
<div class="p-3.5 rounded-lg bg-slate-50 border border-slate-200">
|
|
543
|
+
<span class="text-slate-400 font-bold block text-[10px] uppercase">Total Weight</span>
|
|
544
|
+
<span class="font-extrabold text-slate-900 text-sm mt-0.5 block">1.42 kg</span>
|
|
545
|
+
</div>
|
|
546
|
+
<div class="p-3.5 rounded-lg bg-slate-50 border border-slate-200">
|
|
547
|
+
<span class="text-slate-400 font-bold block text-[10px] uppercase">Service Level</span>
|
|
548
|
+
<span class="font-extrabold text-slate-900 text-sm mt-0.5 block">Express Air Priority</span>
|
|
549
|
+
</div>
|
|
550
|
+
<div class="p-3.5 rounded-lg bg-slate-50 border border-slate-200">
|
|
551
|
+
<span class="text-slate-400 font-bold block text-[10px] uppercase">Inspected By</span>
|
|
552
|
+
<span class="font-extrabold text-slate-900 text-sm mt-0.5 block">QC Inspector #44</span>
|
|
553
|
+
</div>
|
|
554
|
+
</div>
|
|
555
|
+
|
|
556
|
+
<div class="mt-12 pt-6 border-t border-slate-200 text-center text-[11px] text-slate-400">
|
|
557
|
+
<p>Need to initiate a return? Visit <span class="text-indigo-600 font-semibold">returns.renderengine.io</span> within 30 days of receipt.</p>
|
|
558
|
+
</div>
|
|
559
|
+
</div>`,
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
id: 'ticket',
|
|
563
|
+
title: 'VIP Event Pass & Boarding Ticket',
|
|
564
|
+
category: 'Events & Ticketing',
|
|
565
|
+
description: 'High-contrast event ticket with perforated tear-line styling, barcode, seat tier badge, and speaker lineup.',
|
|
566
|
+
format: 'A4',
|
|
567
|
+
landscape: true,
|
|
568
|
+
html: `<div class="max-w-4xl mx-auto p-12 bg-slate-950 text-slate-100 font-sans">
|
|
569
|
+
<div class="relative bg-slate-900 border border-slate-800 rounded-3xl overflow-hidden shadow-2xl flex flex-col md:flex-row">
|
|
570
|
+
<!-- Main Ticket Body -->
|
|
571
|
+
<div class="p-8 flex-1 flex flex-col justify-between border-b md:border-b-0 md:border-r border-dashed border-slate-700/80 relative">
|
|
572
|
+
<!-- Cutout notches for ticket effect -->
|
|
573
|
+
<div class="hidden md:block absolute -top-4 -right-4 w-8 h-8 rounded-full bg-slate-950 border border-slate-800"></div>
|
|
574
|
+
<div class="hidden md:block absolute -bottom-4 -right-4 w-8 h-8 rounded-full bg-slate-950 border border-slate-800"></div>
|
|
575
|
+
|
|
576
|
+
<div>
|
|
577
|
+
<div class="flex items-center justify-between">
|
|
578
|
+
<div class="flex items-center space-x-3">
|
|
579
|
+
<div class="w-8 h-8 rounded-lg bg-indigo-500 flex items-center justify-center font-black text-white text-sm">TP</div>
|
|
580
|
+
<span class="font-extrabold tracking-tight text-white text-lg">TAILPRINT CONF 2026</span>
|
|
581
|
+
</div>
|
|
582
|
+
<span class="px-3 py-1 rounded-full text-xs font-bold uppercase tracking-wider bg-amber-500/20 text-amber-300 border border-amber-500/30">
|
|
583
|
+
VIP All-Access Pass
|
|
584
|
+
</span>
|
|
585
|
+
</div>
|
|
586
|
+
|
|
587
|
+
<div class="mt-8">
|
|
588
|
+
<p class="text-xs font-semibold text-slate-400 uppercase tracking-widest">Attendee Name</p>
|
|
589
|
+
<h2 class="text-3xl font-black text-white mt-1">Sebastian Viste</h2>
|
|
590
|
+
<p class="text-sm text-indigo-400 font-medium mt-0.5">Founder & Lead Architect @ Cohero</p>
|
|
591
|
+
</div>
|
|
592
|
+
|
|
593
|
+
<div class="mt-8 grid grid-cols-3 gap-6">
|
|
594
|
+
<div>
|
|
595
|
+
<p class="text-[11px] font-bold uppercase tracking-wider text-slate-400">Date & Time</p>
|
|
596
|
+
<p class="text-sm font-bold text-white mt-1">Nov 18, 2026</p>
|
|
597
|
+
<p class="text-xs text-slate-400">09:00 AM CET</p>
|
|
598
|
+
</div>
|
|
599
|
+
<div>
|
|
600
|
+
<p class="text-[11px] font-bold uppercase tracking-wider text-slate-400">Location</p>
|
|
601
|
+
<p class="text-sm font-bold text-white mt-1">KB Hallen</p>
|
|
602
|
+
<p class="text-xs text-slate-400">Copenhagen, DK</p>
|
|
603
|
+
</div>
|
|
604
|
+
<div>
|
|
605
|
+
<p class="text-[11px] font-bold uppercase tracking-wider text-slate-400">Seat / Tier</p>
|
|
606
|
+
<p class="text-sm font-bold text-indigo-300 mt-1">Front Row • A14</p>
|
|
607
|
+
<p class="text-xs text-slate-400">Stage Access</p>
|
|
608
|
+
</div>
|
|
609
|
+
</div>
|
|
610
|
+
</div>
|
|
611
|
+
|
|
612
|
+
<div class="mt-10 pt-6 border-t border-slate-800/80 flex items-center justify-between text-xs text-slate-400">
|
|
613
|
+
<p>Order ID: #TP-98214-X</p>
|
|
614
|
+
<p class="text-slate-400">Includes Keynote, Workshop & Afterparty</p>
|
|
615
|
+
</div>
|
|
616
|
+
</div>
|
|
617
|
+
|
|
618
|
+
<!-- Stub / Barcode Sidebar -->
|
|
619
|
+
<div class="p-8 w-full md:w-64 bg-slate-900/60 flex flex-col justify-between items-center text-center">
|
|
620
|
+
<div class="w-full">
|
|
621
|
+
<span class="text-[11px] font-bold text-slate-400 uppercase tracking-widest">Security Token</span>
|
|
622
|
+
<div class="mt-3 p-3 bg-white rounded-xl inline-block shadow-inner">
|
|
623
|
+
<!-- Visual QR Pattern -->
|
|
624
|
+
<div class="w-28 h-28 bg-slate-950 flex flex-col justify-between p-2 rounded">
|
|
625
|
+
<div class="flex justify-between">
|
|
626
|
+
<div class="w-6 h-6 border-2 border-white flex items-center justify-center"><div class="w-2 h-2 bg-white"></div></div>
|
|
627
|
+
<div class="w-6 h-6 border-2 border-white flex items-center justify-center"><div class="w-2 h-2 bg-white"></div></div>
|
|
628
|
+
</div>
|
|
629
|
+
<div class="flex items-center justify-center space-x-1">
|
|
630
|
+
<div class="w-1.5 h-1.5 bg-white"></div>
|
|
631
|
+
<div class="w-2 h-2 bg-white"></div>
|
|
632
|
+
<div class="w-1.5 h-1.5 bg-white"></div>
|
|
633
|
+
</div>
|
|
634
|
+
<div class="flex justify-between">
|
|
635
|
+
<div class="w-6 h-6 border-2 border-white flex items-center justify-center"><div class="w-2 h-2 bg-white"></div></div>
|
|
636
|
+
<div class="w-4 h-4 bg-white"></div>
|
|
637
|
+
</div>
|
|
638
|
+
</div>
|
|
639
|
+
</div>
|
|
640
|
+
<p class="text-[11px] font-mono text-slate-400 mt-3 tracking-widest">GATE-A // SCAN</p>
|
|
641
|
+
</div>
|
|
642
|
+
|
|
643
|
+
<div class="w-full mt-6 pt-4 border-t border-slate-800 text-[10px] text-slate-400">
|
|
644
|
+
Non-transferable. Must present government photo ID at check-in.
|
|
645
|
+
</div>
|
|
646
|
+
</div>
|
|
647
|
+
</div>
|
|
648
|
+
</div>`,
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
id: 'receipt',
|
|
652
|
+
title: 'POS Thermal Retail Receipt',
|
|
653
|
+
category: 'Retail & Commerce',
|
|
654
|
+
description: 'Compact thermal printer styled receipt with item breakdown, tax details, payment method, and dashed tear line.',
|
|
655
|
+
format: 'A4',
|
|
656
|
+
landscape: false,
|
|
657
|
+
html: `<div class="max-w-md mx-auto p-8 bg-neutral-100 font-mono text-neutral-800 text-xs antialiased">
|
|
658
|
+
<div class="bg-white p-6 rounded-lg shadow-sm border border-neutral-300">
|
|
659
|
+
<!-- Header -->
|
|
660
|
+
<div class="text-center pb-4 border-b border-dashed border-neutral-400">
|
|
661
|
+
<h1 class="text-base font-black tracking-wider uppercase">COPENHAGEN COFFEE LAB</h1>
|
|
662
|
+
<p class="text-[11px] text-neutral-500 mt-0.5">Strandgade 14, 1401 Copenhagen</p>
|
|
663
|
+
<p class="text-[11px] text-neutral-500">CVR: 38294102 • Tlf: +45 33 12 40 00</p>
|
|
664
|
+
<div class="mt-2 text-[10px] text-neutral-400">
|
|
665
|
+
<span>Receipt: #REC-48291</span> • <span>Station: Register 2</span>
|
|
666
|
+
</div>
|
|
667
|
+
</div>
|
|
668
|
+
|
|
669
|
+
<!-- Date & Server -->
|
|
670
|
+
<div class="py-3 border-b border-dashed border-neutral-400 flex justify-between text-[11px]">
|
|
671
|
+
<span>Date: 2026-11-11 14:23</span>
|
|
672
|
+
<span>Cashier: Mikkel K.</span>
|
|
673
|
+
</div>
|
|
674
|
+
|
|
675
|
+
<!-- Items -->
|
|
676
|
+
<div class="py-4 space-y-2.5">
|
|
677
|
+
<div class="flex justify-between font-medium">
|
|
678
|
+
<span>2x Flat White (Oat Milk)</span>
|
|
679
|
+
<span>96.00 DKK</span>
|
|
680
|
+
</div>
|
|
681
|
+
<div class="text-[10px] text-neutral-400 pl-4 -mt-1.5">
|
|
682
|
+
@ 48.00 DKK (incl. 25% VAT)
|
|
683
|
+
</div>
|
|
684
|
+
|
|
685
|
+
<div class="flex justify-between font-medium">
|
|
686
|
+
<span>1x Cardamom Bun</span>
|
|
687
|
+
<span>38.00 DKK</span>
|
|
688
|
+
</div>
|
|
689
|
+
|
|
690
|
+
<div class="flex justify-between font-medium">
|
|
691
|
+
<span>1x Ethiopian Pour-Over (Single Origin)</span>
|
|
692
|
+
<span>52.00 DKK</span>
|
|
693
|
+
</div>
|
|
694
|
+
</div>
|
|
695
|
+
|
|
696
|
+
<!-- Summary -->
|
|
697
|
+
<div class="pt-3 border-t-2 border-neutral-900 space-y-1.5">
|
|
698
|
+
<div class="flex justify-between text-neutral-600">
|
|
699
|
+
<span>Subtotal (Net)</span>
|
|
700
|
+
<span>148.80 DKK</span>
|
|
701
|
+
</div>
|
|
702
|
+
<div class="flex justify-between text-neutral-600">
|
|
703
|
+
<span>Moms / VAT (25%)</span>
|
|
704
|
+
<span>37.20 DKK</span>
|
|
705
|
+
</div>
|
|
706
|
+
<div class="flex justify-between text-base font-black text-neutral-900 pt-2 border-t border-dashed border-neutral-300">
|
|
707
|
+
<span>TOTAL DUE</span>
|
|
708
|
+
<span>186.00 DKK</span>
|
|
709
|
+
</div>
|
|
710
|
+
</div>
|
|
711
|
+
|
|
712
|
+
<!-- Payment info -->
|
|
713
|
+
<div class="mt-5 pt-3 border-t border-dashed border-neutral-400 space-y-1 text-[11px] text-neutral-600">
|
|
714
|
+
<div class="flex justify-between">
|
|
715
|
+
<span>Paid via Apple Pay (Visa **** 4028)</span>
|
|
716
|
+
<span class="font-bold text-neutral-900">APPROVED</span>
|
|
717
|
+
</div>
|
|
718
|
+
<div class="flex justify-between text-[10px] text-neutral-400">
|
|
719
|
+
<span>Auth Code: 894102</span>
|
|
720
|
+
<span>Seq: 004819</span>
|
|
721
|
+
</div>
|
|
722
|
+
</div>
|
|
723
|
+
|
|
724
|
+
<!-- Footer Barcode & Thank You -->
|
|
725
|
+
<div class="mt-6 pt-4 border-t border-dashed border-neutral-400 text-center">
|
|
726
|
+
<!-- Simulated 1D Barcode -->
|
|
727
|
+
<div class="inline-flex space-x-0.5 items-end h-8 bg-white p-1">
|
|
728
|
+
<div class="w-1 h-full bg-neutral-900"></div>
|
|
729
|
+
<div class="w-2 h-full bg-neutral-900"></div>
|
|
730
|
+
<div class="w-0.5 h-full bg-neutral-900"></div>
|
|
731
|
+
<div class="w-1.5 h-full bg-neutral-900"></div>
|
|
732
|
+
<div class="w-0.5 h-full bg-neutral-900"></div>
|
|
733
|
+
<div class="w-2 h-full bg-neutral-900"></div>
|
|
734
|
+
<div class="w-1 h-full bg-neutral-900"></div>
|
|
735
|
+
<div class="w-3 h-full bg-neutral-900"></div>
|
|
736
|
+
<div class="w-0.5 h-full bg-neutral-900"></div>
|
|
737
|
+
<div class="w-2 h-full bg-neutral-900"></div>
|
|
738
|
+
</div>
|
|
739
|
+
<p class="text-[10px] text-neutral-400 mt-1">Thank you for visiting Copenhagen Coffee Lab!</p>
|
|
740
|
+
<p class="text-[9px] text-neutral-400">Retain receipt for 14-day exchange</p>
|
|
741
|
+
</div>
|
|
742
|
+
</div>
|
|
743
|
+
</div>`,
|
|
744
|
+
},
|
|
745
|
+
];
|
|
746
|
+
//# sourceMappingURL=templates.js.map
|