@cenk1cenk2/md-printer 2.21.0 → 3.1.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/README.md +333 -48
- package/bin/dev.js +0 -2
- package/bin/run.js +0 -1
- package/dist/_virtual/_@oxc-project_runtime@0.153.0/helpers/esm/decorate.mjs +1 -2
- package/dist/_virtual/_@oxc-project_runtime@0.153.0/helpers/esm/decorateMetadata.mjs +1 -2
- package/dist/_virtual/_@oxc-project_runtime@0.153.0/helpers/esm/decorateParam.mjs +8 -0
- package/dist/commands/index.mjs +32 -345
- package/dist/components/Date.svelte +1 -0
- package/dist/components/Markdown.svelte +20 -0
- package/dist/components/Nodes.svelte +32 -0
- package/dist/components/Page.svelte +20 -0
- package/dist/components/PageBreak.svelte +5 -0
- package/dist/components/PageNumber.svelte +1 -0
- package/dist/components/SignatureBlock.svelte +56 -0
- package/dist/components/Title.svelte +1 -0
- package/dist/components/TotalPages.svelte +1 -0
- package/dist/components/index.ts +8 -0
- package/dist/constants/file.constants.mjs +1 -8
- package/dist/constants/index.mjs +5 -4
- package/dist/constants/preview.constants.mjs +9 -0
- package/dist/constants/signature.constants.mjs +7 -0
- package/dist/constants/template.constants.mjs +48 -10
- package/dist/interfaces/commands/index.mjs +1 -1
- package/dist/interfaces/commands/run.interface.mjs +1 -1
- package/dist/interfaces/index.mjs +1 -1
- package/dist/interfaces/markdown.interface.mjs +1 -0
- package/dist/interfaces/renderer.interface.mjs +1 -0
- package/dist/interfaces/session.interface.mjs +1 -0
- package/dist/interfaces/signature.interface.mjs +1 -1
- package/dist/interfaces/template.interface.mjs +1 -0
- package/dist/modules/md-printer/md-printer.handler.mjs +113 -0
- package/dist/modules/md-printer/md-printer.module.mjs +21 -0
- package/dist/modules/md-printer/md-printer.schema.mjs +50 -0
- package/dist/services/i18n.service.mjs +12 -15
- package/dist/services/index.mjs +9 -2
- package/dist/services/loopback.mjs +18 -0
- package/dist/services/markdown.service.mjs +123 -0
- package/dist/services/printer.module.mjs +39 -0
- package/dist/services/printer.service.mjs +171 -0
- package/dist/services/renderer/browser.mjs +41 -0
- package/dist/services/renderer/browser.service.mjs +56 -0
- package/dist/services/renderer/renderer.service.mjs +198 -0
- package/dist/services/session/Preview.svelte +238 -0
- package/dist/services/session/preview.service.mjs +187 -0
- package/dist/services/session/session.service.mjs +115 -0
- package/dist/services/signature/adapters/a-trust.adapter.mjs +32 -36
- package/dist/services/signature/index.mjs +1 -2
- package/dist/services/signature/signature.adapter.mjs +1 -2
- package/dist/services/signature/signature.service.mjs +6 -10
- package/dist/services/template/Document.svelte +21 -0
- package/dist/services/template/Margin.svelte +15 -0
- package/dist/services/template/assets.mjs +127 -0
- package/dist/services/template/render.entry.ts +32 -0
- package/dist/services/template/svelte.plugin.mjs +66 -0
- package/dist/services/template/template.service.mjs +211 -0
- package/oclif.manifest.json +49 -36
- package/package.json +69 -35
- package/templates/default/Template.svelte +83 -0
- package/templates/default/settings.json +1 -3
- package/templates/invoice/Template.svelte +247 -0
- package/templates/invoice/components/Client.svelte +42 -0
- package/templates/invoice/components/Company.svelte +41 -0
- package/templates/invoice/components/Items.svelte +66 -0
- package/templates/invoice/components/Notes.svelte +21 -0
- package/templates/invoice/components/Payment.svelte +25 -0
- package/templates/invoice/components/Signature.svelte +34 -0
- package/templates/invoice/components/Totals.svelte +47 -0
- package/templates/invoice/round.js +2 -0
- package/templates/invoice/settings.json +1 -4
- package/templates/kilic.dev/Template.svelte +102 -0
- package/templates/kilic.dev/settings.json +1 -3
- package/templates/mail/Template.svelte +166 -0
- package/templates/mail/settings.json +1 -3
- package/dist/hooks/not-found.hook.mjs +0 -7
- package/dist/hooks/update-notifier.hook.mjs +0 -7
- package/dist/interfaces/pupeteer.mjs +0 -1
- package/templates/default/main.css +0 -73
- package/templates/invoice/.gitignore +0 -1
- package/templates/invoice/footer.html +0 -18
- package/templates/invoice/tailwind.css +0 -164
- package/templates/invoice/template.html.j2 +0 -226
- package/templates/kilic.dev/footer.html +0 -26
- package/templates/kilic.dev/header.html +0 -16
- package/templates/kilic.dev/main.css +0 -74
- package/templates/mail/.gitignore +0 -1
- package/templates/mail/tailwind.css +0 -145
- package/templates/mail/template.html.j2 +0 -14
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Recipient details and the date/id table of the invoice.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
/**
|
|
7
|
+
* @type {{
|
|
8
|
+
* client: { name?: string, tax_number?: string, address?: string },
|
|
9
|
+
* date: string,
|
|
10
|
+
* id: string | number,
|
|
11
|
+
* t: (key: string) => string
|
|
12
|
+
* }}
|
|
13
|
+
*/
|
|
14
|
+
let { client, date, id, t } = $props()
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<div class="col-span-1 flex flex-col justify-center text-lg font-extrabold text-gray-100">
|
|
18
|
+
<p class="text-vertical">{t('sections.to')}</p>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="col-span-5 flex flex-col justify-start p-4">
|
|
21
|
+
<h2>{client.name}</h2>
|
|
22
|
+
{#if client.tax_number}
|
|
23
|
+
<h3>{client.tax_number}</h3>
|
|
24
|
+
{/if}
|
|
25
|
+
<address>{(client.address ?? '').trim()}</address>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="col-span-6 flex items-center justify-center text-xs py-4 pl-4 pr-16">
|
|
28
|
+
<div class="w-full overflow-hidden rounded-xl border-y-2 shadow-md shadow-gray-300 border-gray-900!">
|
|
29
|
+
<table class="w-full table-auto my-0!">
|
|
30
|
+
<tbody>
|
|
31
|
+
<tr>
|
|
32
|
+
<td class="w-[30%] text-left align-middle font-bold">{t('fields.date')}</td>
|
|
33
|
+
<td class="w-[70%] text-right align-middle font-semibold">{date}</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td class="w-[30%] text-left align-middle font-bold border-t! border-t-gray-100/30!">{t('fields.id')}</td>
|
|
37
|
+
<td class="w-[70%] text-right align-middle font-semibold border-t! border-t-gray-100/30!">{id}</td>
|
|
38
|
+
</tr>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Logo, sender details and invoice title cells of the invoice header.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
/**
|
|
7
|
+
* @type {{
|
|
8
|
+
* company: { name?: string, tax_number?: string, address?: string, phone?: string, email?: string, website?: string },
|
|
9
|
+
* t: (key: string) => string
|
|
10
|
+
* }}
|
|
11
|
+
*/
|
|
12
|
+
let { company, t } = $props()
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<img
|
|
16
|
+
src="https://main.s3.kilic.dev/html/icon.png"
|
|
17
|
+
alt="logo"
|
|
18
|
+
class="absolute h-40 top-1/2 left-1/2 -translate-x-1/2 -translate-y-[62%] drop-shadow-lg drop-shadow-gray-900 z-10"
|
|
19
|
+
/>
|
|
20
|
+
<div class="col-span-1 flex flex-col justify-center text-lg font-extrabold text-gray-100">
|
|
21
|
+
<p class="text-vertical">{t('sections.from')}</p>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="col-start-2 col-span-5 flex flex-col justify-start p-4 pt-10 mr-12">
|
|
24
|
+
<h1>{company.name}</h1>
|
|
25
|
+
<h3>{company.tax_number}</h3>
|
|
26
|
+
<address>{(company.address ?? '').trim()}</address>
|
|
27
|
+
<div class="flex flex-col text-sm">
|
|
28
|
+
{#if company.phone}
|
|
29
|
+
<a href="tel:{company.phone}">{company.phone}</a>
|
|
30
|
+
{/if}
|
|
31
|
+
{#if company.email}
|
|
32
|
+
<a href="mailto:{company.email}">{company.email}</a>
|
|
33
|
+
{/if}
|
|
34
|
+
{#if company.website}
|
|
35
|
+
<a href={company.website}>{company.website}</a>
|
|
36
|
+
{/if}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="col-span-6 bg-gray-900 rounded-bl-4xl flex flex-col justify-center text-center">
|
|
40
|
+
<p class="p-4 font-bold text-white text-6xl">{t('invoice')}</p>
|
|
41
|
+
</div>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Table of invoice line items with their subtotal, tax and total.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
import { round } from '../round.js'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @type {{
|
|
10
|
+
* rows: { item: { description?: string, quantity: number, unit?: string, price: number, tax: number }, subtotal: number, tax: number, total: number }[],
|
|
11
|
+
* currency: string,
|
|
12
|
+
* t: (key: string) => string
|
|
13
|
+
* }}
|
|
14
|
+
*/
|
|
15
|
+
let { rows, currency, t } = $props()
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<div class="col-span-12 px-16 py-4">
|
|
19
|
+
<div class="overflow-hidden rounded-xl border-y-2 shadow-md shadow-gray-300 border-gray-900!">
|
|
20
|
+
<table class="striped w-full table-auto my-0!">
|
|
21
|
+
<thead class="border-b-1 border-b-gray-900! border-x-2 border-x-gray-900!">
|
|
22
|
+
<tr>
|
|
23
|
+
<th scope="col" class="w-md text-center">
|
|
24
|
+
{t('table.description')}
|
|
25
|
+
</th>
|
|
26
|
+
<th scope="col" class="w-[10%] text-center">
|
|
27
|
+
{t('table.quantity')}
|
|
28
|
+
</th>
|
|
29
|
+
<th scope="col" class="w-[10%] text-center">
|
|
30
|
+
{t('table.price')}
|
|
31
|
+
</th>
|
|
32
|
+
<th scope="col" class="w-[10%] text-center">
|
|
33
|
+
{t('table.subtotal')}
|
|
34
|
+
</th>
|
|
35
|
+
<th scope="col" class="w-[10%] text-center">
|
|
36
|
+
{t('table.tax')}
|
|
37
|
+
</th>
|
|
38
|
+
<th scope="col" class="w-[14%] font-semibold text-center">
|
|
39
|
+
{t('table.total')}
|
|
40
|
+
</th>
|
|
41
|
+
</tr>
|
|
42
|
+
</thead>
|
|
43
|
+
<tbody>
|
|
44
|
+
{#each rows as row, index (index)}
|
|
45
|
+
<tr>
|
|
46
|
+
<td class="text-left align-middle">{row.item.description}</td>
|
|
47
|
+
<td class="text-center align-middle">{row.item.quantity} {row.item.unit}</td>
|
|
48
|
+
<td class="text-center align-middle">{row.item.price}{currency}</td>
|
|
49
|
+
<td class="text-center align-middle">{round(row.subtotal)}{currency}</td>
|
|
50
|
+
<td class="text-center align-middle">
|
|
51
|
+
{#if row.tax > 0}
|
|
52
|
+
<div class="flex flex-row items-center">
|
|
53
|
+
<span class="w-8 shrink-0 mr-1 py-px rounded-full text-center text-[0.50rem] font-semibold bg-gray-700 text-white">{row.item.tax}%</span>
|
|
54
|
+
<span>{round(row.tax)}{currency}</span>
|
|
55
|
+
</div>
|
|
56
|
+
{:else}
|
|
57
|
+
<span class="font-semibold">—</span>
|
|
58
|
+
{/if}
|
|
59
|
+
</td>
|
|
60
|
+
<td class="font-semibold text-right align-middle">{round(row.total)}{currency}</td>
|
|
61
|
+
</tr>
|
|
62
|
+
{/each}
|
|
63
|
+
</tbody>
|
|
64
|
+
</table>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Rendered markdown body of the document as the invoice notes.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
/**
|
|
7
|
+
* @type {{
|
|
8
|
+
* content: string,
|
|
9
|
+
* t: (key: string) => string
|
|
10
|
+
* }}
|
|
11
|
+
*/
|
|
12
|
+
let { content, t } = $props()
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<div class="col-span-1 flex flex-col justify-center text-lg font-extrabold text-gray-100">
|
|
16
|
+
<p class="text-vertical">{t('sections.notes')}</p>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="col-span-5 flex flex-col p-4 text-sm leading-tight prose">
|
|
19
|
+
<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown input is trusted, same as the document itself -->
|
|
20
|
+
{@html content}<br />
|
|
21
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Bank details of the payee, shown beside the totals.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
/**
|
|
7
|
+
* @type {{
|
|
8
|
+
* payment: { bank?: string, address?: string, bic?: string, routing?: string, name?: string, iban?: string },
|
|
9
|
+
* t: (key: string) => string
|
|
10
|
+
* }}
|
|
11
|
+
*/
|
|
12
|
+
let { payment, t } = $props()
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<div class="col-span-1 flex flex-col justify-center text-lg font-extrabold text-gray-100 bg-gray-900">
|
|
16
|
+
<p class="text-vertical">{t('sections.payment')}</p>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="col-span-5 flex flex-col p-4 ml-[-1px] pl-5 justify-center bg-gray-700 rounded-r-4xl text-white">
|
|
19
|
+
<span>{payment.bank}</span>
|
|
20
|
+
<address>{(payment.address ?? '').trim()}</address>
|
|
21
|
+
<span>{payment.bic}</span>
|
|
22
|
+
<span>{payment.routing}</span>
|
|
23
|
+
<span class="mt-4 font-semibold">{payment.name}</span>
|
|
24
|
+
<span class="font-semibold">{payment.iban}</span>
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Signature block of the invoice: the digital signature when signing is enabled, an empty box otherwise.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
import { SignatureBlock } from '@cenk1cenk2/md-printer/components'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @type {{
|
|
10
|
+
* signature?: { date: string, name?: string, issuer?: string, serial?: string },
|
|
11
|
+
* t: (key: string) => string
|
|
12
|
+
* }}
|
|
13
|
+
*/
|
|
14
|
+
let { signature, t } = $props()
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#if signature}
|
|
18
|
+
<div class="col-span-5 flex flex-col justify-center m-8 mr-16">
|
|
19
|
+
<SignatureBlock
|
|
20
|
+
{signature}
|
|
21
|
+
labels={{
|
|
22
|
+
title: t('signed.title'),
|
|
23
|
+
by: t('signed.by'),
|
|
24
|
+
date: t('signed.date'),
|
|
25
|
+
issuer: t('signed.issuer'),
|
|
26
|
+
verify: t('signed.verify')
|
|
27
|
+
}}
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
{:else}
|
|
31
|
+
<div class="col-span-5 flex flex-col justify-end text-center m-8 mr-16 p-4 pb-0 border-2 border-gray-50! rounded-xl text-xs text-gray-100 h-36">
|
|
32
|
+
<p>{t('signature')}</p>
|
|
33
|
+
</div>
|
|
34
|
+
{/if}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Subtotal, tax and total summary of the invoice.
|
|
4
|
+
-->
|
|
5
|
+
<script>
|
|
6
|
+
import { round } from '../round.js'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @type {{
|
|
10
|
+
* subtotal: number,
|
|
11
|
+
* tax: number,
|
|
12
|
+
* total: number,
|
|
13
|
+
* currency: string,
|
|
14
|
+
* t: (key: string) => string
|
|
15
|
+
* }}
|
|
16
|
+
*/
|
|
17
|
+
let { subtotal, tax, total, currency, t } = $props()
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<div class="col-span-5 flex flex-col justify-center m-8 mr-16">
|
|
21
|
+
<div class="w-full overflow-hidden rounded-xl border-y-2 shadow-md shadow-gray-300 border-gray-900!">
|
|
22
|
+
<table class="w-full table-auto my-0!">
|
|
23
|
+
<tbody>
|
|
24
|
+
<tr>
|
|
25
|
+
<td class="w-[55%] text-left align-middle font-semibold">{t('summary.subtotal')}</td>
|
|
26
|
+
<td class="w-[45%] text-right align-middle font-semibold">{round(subtotal)}{currency}</td>
|
|
27
|
+
</tr>
|
|
28
|
+
<tr>
|
|
29
|
+
<td class="w-[55%] text-left align-middle font-semibold border-t! border-t-gray-100/30!">{t('summary.tax')}</td>
|
|
30
|
+
<td class="w-[45%] text-right align-middle font-semibold border-t! border-t-gray-100/30!">
|
|
31
|
+
{#if tax > 0}
|
|
32
|
+
{round(tax)}{currency}
|
|
33
|
+
{:else}
|
|
34
|
+
—
|
|
35
|
+
{/if}
|
|
36
|
+
</td>
|
|
37
|
+
</tr>
|
|
38
|
+
<tr>
|
|
39
|
+
<td class="w-[55%] text-left align-middle font-bold text-primary-500 border-t-2! border-t-primary-500!">{t('summary.total')}</td>
|
|
40
|
+
<td class="w-[45%] text-right align-middle font-bold text-primary-500 border-t-2! border-t-primary-500!">
|
|
41
|
+
{round(total)}{currency}
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
</tbody>
|
|
45
|
+
</table>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"body_class": [],
|
|
3
|
-
"document_title": "{{ date }} - Invoice from {{ company.name }}{% if company.tax_number %} ({{ company.tax_number }}){% endif %} to {{ client.name }}{% if client.tax_number %} ({{ client.tax_number }}){% endif %} - #{{ id }}",
|
|
4
|
-
"highlight_style": "atom-one-dark",
|
|
5
2
|
"i18n": {
|
|
6
3
|
"language": "en",
|
|
7
4
|
"fallback": "en"
|
|
8
5
|
},
|
|
9
|
-
"
|
|
6
|
+
"pdfOptions": {
|
|
10
7
|
"format": "A4",
|
|
11
8
|
"margin": "0mm 0mm 12mm 0mm",
|
|
12
9
|
"printBackground": true
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { Markdown, Page, PageNumber, Title, TotalPages } from '@cenk1cenk2/md-printer/components'
|
|
3
|
+
|
|
4
|
+
let { data } = $props()
|
|
5
|
+
|
|
6
|
+
const logo = 'https://main.s3.kilic.dev/html/icon.png'
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<svelte:head>
|
|
10
|
+
{#if data.documentTitle}
|
|
11
|
+
<title>{data.documentTitle}</title>
|
|
12
|
+
{/if}
|
|
13
|
+
</svelte:head>
|
|
14
|
+
|
|
15
|
+
<Page>
|
|
16
|
+
{#snippet header()}
|
|
17
|
+
<header style="margin: 0 auto; text-align: center; font-family: monospace; color: #242424">
|
|
18
|
+
<img height="24" src={logo} alt="logo" />
|
|
19
|
+
</header>
|
|
20
|
+
{/snippet}
|
|
21
|
+
|
|
22
|
+
{#snippet footer()}
|
|
23
|
+
<footer style="margin: 0 auto; text-align: center; font-size: 8px; color: #38404b; width: 100%; border-top: 1px solid #efefef; padding-top: 8px">
|
|
24
|
+
<img height="8" src={logo} alt="logo" />
|
|
25
|
+
<span>kilic.dev</span>
|
|
26
|
+
-
|
|
27
|
+
<Title />
|
|
28
|
+
-
|
|
29
|
+
<PageNumber />/<TotalPages />
|
|
30
|
+
</footer>
|
|
31
|
+
{/snippet}
|
|
32
|
+
|
|
33
|
+
<Markdown />
|
|
34
|
+
</Page>
|
|
35
|
+
|
|
36
|
+
<style lang="postcss">
|
|
37
|
+
@import 'github-markdown-css/github-markdown-light.css';
|
|
38
|
+
@import '@fontsource/montserrat/latin-400.css';
|
|
39
|
+
@import '@fontsource/montserrat/latin-ext-400.css';
|
|
40
|
+
@import '@fontsource/montserrat/latin-700.css';
|
|
41
|
+
@import '@fontsource/montserrat/latin-ext-700.css';
|
|
42
|
+
@import '@fontsource/montserrat/latin-800.css';
|
|
43
|
+
@import '@fontsource/montserrat/latin-ext-800.css';
|
|
44
|
+
|
|
45
|
+
.markdown-body {
|
|
46
|
+
font-size: 11px;
|
|
47
|
+
font-family: 'Montserrat', sans-serif;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.markdown-body h1,
|
|
51
|
+
.markdown-body h2 {
|
|
52
|
+
font-weight: 800;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.markdown-body h3,
|
|
56
|
+
.markdown-body h4,
|
|
57
|
+
.markdown-body h5,
|
|
58
|
+
.markdown-body h6,
|
|
59
|
+
.markdown-body strong,
|
|
60
|
+
.markdown-body b {
|
|
61
|
+
font-weight: 700;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.markdown-body pre > code {
|
|
65
|
+
white-space: pre-wrap;
|
|
66
|
+
padding: 0;
|
|
67
|
+
margin: 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.markdown-body .document-title-header {
|
|
71
|
+
height: 500px;
|
|
72
|
+
margin: auto auto;
|
|
73
|
+
padding-top: 50%;
|
|
74
|
+
break-after: page;
|
|
75
|
+
border-bottom: 0;
|
|
76
|
+
font-size: 2.5em;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.markdown-body pre {
|
|
80
|
+
padding: 12px 8px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.markdown-body output pre {
|
|
84
|
+
margin-top: -36px;
|
|
85
|
+
border-top-left-radius: 0;
|
|
86
|
+
border-top-right-radius: 0;
|
|
87
|
+
border-top: 2px solid #d1d9e0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.markdown-body output::before {
|
|
91
|
+
padding: 4px 16px;
|
|
92
|
+
position: relative;
|
|
93
|
+
top: -24px;
|
|
94
|
+
border-top-left-radius: 4px;
|
|
95
|
+
border-top-right-radius: 4px;
|
|
96
|
+
border-top: 2px solid #d1d9e0;
|
|
97
|
+
color: #59636e;
|
|
98
|
+
background-color: #f6f8fa;
|
|
99
|
+
content: '> output';
|
|
100
|
+
font-size: 0.85em;
|
|
101
|
+
}
|
|
102
|
+
</style>
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { Page } from '@cenk1cenk2/md-printer/components'
|
|
3
|
+
|
|
4
|
+
let { content } = $props()
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<svelte:head>
|
|
8
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
9
|
+
<meta charset="UTF-8" />
|
|
10
|
+
</svelte:head>
|
|
11
|
+
|
|
12
|
+
<Page>
|
|
13
|
+
<!-- eslint-disable-next-line svelte/no-at-html-tags -- markdown input is trusted, same as the document itself -->
|
|
14
|
+
<div class="leading-tight prose">{@html content}</div>
|
|
15
|
+
</Page>
|
|
16
|
+
|
|
17
|
+
<style lang="postcss">
|
|
18
|
+
@import '@fontsource/montserrat/latin-400.css';
|
|
19
|
+
@import '@fontsource/montserrat/latin-ext-400.css';
|
|
20
|
+
@import '@fontsource/montserrat/latin-700.css';
|
|
21
|
+
@import '@fontsource/montserrat/latin-ext-700.css';
|
|
22
|
+
|
|
23
|
+
@import 'tailwindcss';
|
|
24
|
+
@plugin '@tailwindcss/typography';
|
|
25
|
+
|
|
26
|
+
@theme {
|
|
27
|
+
--font-sans: 'Montserrat';
|
|
28
|
+
--font-serif: 'Montserrat';
|
|
29
|
+
--font-weight-semibold: 700;
|
|
30
|
+
--font-weight-bold: 800;
|
|
31
|
+
--font-weight-extrabold: 900;
|
|
32
|
+
--color-primary-500: #cd0043;
|
|
33
|
+
--color-gray-50: oklch(98.5% 0.002 247.839);
|
|
34
|
+
--color-gray-100: #abb2bf;
|
|
35
|
+
--color-gray-200: #979eab;
|
|
36
|
+
--color-gray-300: #7c8a9d;
|
|
37
|
+
--color-gray-400: #5c6370;
|
|
38
|
+
--color-gray-500: #4b5263;
|
|
39
|
+
--color-gray-600: #2c333d;
|
|
40
|
+
--color-gray-700: #22282f;
|
|
41
|
+
--color-gray-800: #1e2127;
|
|
42
|
+
--color-gray-900: #17191e;
|
|
43
|
+
--color-gray-950: oklch(13% 0.028 261.692);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
*,
|
|
47
|
+
::after,
|
|
48
|
+
::before,
|
|
49
|
+
::backdrop,
|
|
50
|
+
::file-selector-button {
|
|
51
|
+
border-color: var(--color-gray-200, currentcolor);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
body {
|
|
55
|
+
font-family: var(--font-sans);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
address {
|
|
59
|
+
@apply text-sm;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Typography styles converted from config */
|
|
63
|
+
.prose a {
|
|
64
|
+
text-decoration: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.prose h1 {
|
|
68
|
+
font-weight: 800;
|
|
69
|
+
padding-top: 0.1875rem;
|
|
70
|
+
/* 0.75 * 0.25rem */
|
|
71
|
+
padding-bottom: 0.1875rem;
|
|
72
|
+
margin-bottom: 0;
|
|
73
|
+
margin-top: 0;
|
|
74
|
+
border-width: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.prose h2 {
|
|
78
|
+
font-weight: 800;
|
|
79
|
+
padding-top: 0.125rem;
|
|
80
|
+
/* 0.5 * 0.25rem */
|
|
81
|
+
padding-bottom: 0.125rem;
|
|
82
|
+
margin-bottom: 0;
|
|
83
|
+
margin-top: 0;
|
|
84
|
+
border-width: 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.prose h3 {
|
|
88
|
+
font-weight: 700;
|
|
89
|
+
padding-top: 0.0625rem;
|
|
90
|
+
/* 0.25 * 0.25rem */
|
|
91
|
+
padding-bottom: 0.0625rem;
|
|
92
|
+
margin-bottom: 0;
|
|
93
|
+
margin-top: 0;
|
|
94
|
+
border-width: 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
p {
|
|
98
|
+
margin: 0.1em 0em;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.prose blockquote {
|
|
102
|
+
font-weight: 400;
|
|
103
|
+
color: var(--color-gray-600);
|
|
104
|
+
font-style: normal;
|
|
105
|
+
quotes: '\201C' '\201D' '\2018' '\2019';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.prose blockquote p:first-of-type::before {
|
|
109
|
+
content: '';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.prose blockquote p:last-of-type::after {
|
|
113
|
+
content: '';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.prose ul > li {
|
|
117
|
+
padding-left: 1em;
|
|
118
|
+
text-align: left;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.prose ol > li {
|
|
122
|
+
padding-left: 1em;
|
|
123
|
+
text-align: left;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.prose ol > li::before {
|
|
127
|
+
top: calc(0.875em - 0.1em);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.prose ul > li::before {
|
|
131
|
+
top: calc(0.875em - 0.1em);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
html {
|
|
135
|
+
font-size: 12px;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.page-break {
|
|
139
|
+
page-break-after: always;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.text-vertical {
|
|
143
|
+
text-orientation: upright;
|
|
144
|
+
writing-mode: vertical-lr;
|
|
145
|
+
display: flex;
|
|
146
|
+
flex-direction: column;
|
|
147
|
+
justify-content: center;
|
|
148
|
+
@apply p-4;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
table th {
|
|
152
|
+
@apply bg-gray-700 text-white;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
table tr {
|
|
156
|
+
border-top: 0;
|
|
157
|
+
@apply even:bg-gray-50;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
table th,
|
|
161
|
+
table td,
|
|
162
|
+
table tr {
|
|
163
|
+
border: 0;
|
|
164
|
+
padding: 0.5em 0.5em;
|
|
165
|
+
}
|
|
166
|
+
</style>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
@import url(https://unpkg.com/github-markdown-css/github-markdown-light.css);
|
|
2
|
-
@import url('https://fonts.bunny.net/css?family=montserrat:100,200,300,400,500,600,700,800,900&display=swap');
|
|
3
|
-
@import url(https://fonts.googleapis.com/css2?family=Roboto+Mono);
|
|
4
|
-
|
|
5
|
-
.markdown-body {
|
|
6
|
-
font-size: 11px;
|
|
7
|
-
font-family: 'Montserrat', sans-serif;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
.markdown-body h1,
|
|
11
|
-
.markdown-body h2 {
|
|
12
|
-
font-weight: 800;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.markdown-body h3,
|
|
16
|
-
.markdown-body h4,
|
|
17
|
-
.markdown-body h5,
|
|
18
|
-
.markdown-body h6,
|
|
19
|
-
.markdown-body strong,
|
|
20
|
-
.markdown-body b {
|
|
21
|
-
font-weight: 700;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.page-break {
|
|
25
|
-
page-break-after: always;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.markdown-body pre > code {
|
|
29
|
-
white-space: pre-wrap;
|
|
30
|
-
padding: 0;
|
|
31
|
-
margin: 0;
|
|
32
|
-
|
|
33
|
-
font-family: 'Roboto Mono', monospace;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.markdown-body .document-title-header {
|
|
37
|
-
height: 500px;
|
|
38
|
-
margin: auto auto;
|
|
39
|
-
padding-top: 50%;
|
|
40
|
-
page-break-after: always;
|
|
41
|
-
border-bottom: 0;
|
|
42
|
-
font-size: 2.5em;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.markdown-body pre {
|
|
46
|
-
background-color: #1e2127;
|
|
47
|
-
padding: 12px 8px;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.markdown-body output pre {
|
|
51
|
-
margin-top: -36px;
|
|
52
|
-
background-color: #1e2127;
|
|
53
|
-
border-top-left-radius: 0;
|
|
54
|
-
border-top-right-radius: 0;
|
|
55
|
-
border-top-color: #38404b;
|
|
56
|
-
border-top-width: 2px;
|
|
57
|
-
border-top-style: solid;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.markdown-body output::before {
|
|
61
|
-
padding: 4px 16px;
|
|
62
|
-
position: relative;
|
|
63
|
-
top: -24px;
|
|
64
|
-
border-top-left-radius: 4px;
|
|
65
|
-
border-top-right-radius: 4px;
|
|
66
|
-
color: #a0a0a0;
|
|
67
|
-
background-color: #1e2127;
|
|
68
|
-
content: '> output';
|
|
69
|
-
font-size: 0.85em;
|
|
70
|
-
border-top-color: #38404b;
|
|
71
|
-
border-top-width: 2px;
|
|
72
|
-
border-top-style: solid;
|
|
73
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/main.css
|