Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
488b018
New design prototype
MarcinZiabek Oct 12, 2026
abd85e7
Remove outdated homepage components: `HomePageFeatures`, `HomePageOve…
MarcinZiabek Oct 13, 2026
7539b2f
Replace `HomePageShowcaseCard` with new homepage components: `HomePag…
MarcinZiabek Oct 13, 2026
eea82e3
Add detailed documentation for CTA card visual assets, brainstorms, p…
MarcinZiabek Oct 14, 2026
7b48133
Modularize `HomePageAgentDemo` logic into `agentSession.ts`. Refactor…
MarcinZiabek Oct 14, 2026
b2d47e4
Modularize `HomePageAgentDemo` logic into `agentSession.ts`. Refactor…
MarcinZiabek Oct 14, 2026
a8a2ee0
Adjust font sizes for `.tag` and `.fa-star` in `PricingTiers.vue` for…
MarcinZiabek Oct 15, 2026
11b3b11
Modularize homepage multiplatform components into the `companion` dir…
MarcinZiabek Oct 15, 2026
1a17cf5
Modularize homepage license components into dedicated files: `License…
MarcinZiabek Oct 15, 2026
a34f591
Modularize FAQ components into dedicated files `FaqLab.vue`, `FaqQues…
MarcinZiabek Oct 15, 2026
f1c2f71
Update footer links in `LayoutFooter.vue`: replace "Invoice tutorial"…
MarcinZiabek Oct 15, 2026
2d40b44
Remove outdated documentation files related to CTA card visuals (`ass…
MarcinZiabek Oct 15, 2026
cb18c41
Remove unused components and assets (`HomePageGettingStarted.vue`, `H…
MarcinZiabek Oct 15, 2026
62e145f
Streamline and optimize layouts: remove redundant texture utilities a…
MarcinZiabek Oct 15, 2026
309042f
Refactor `FeaturesOverview.vue` for improved clarity and iterate over…
MarcinZiabek Oct 15, 2026
6995da7
Refactor `CustomPages.css` to centralize gradient definitions with re…
MarcinZiabek Oct 15, 2026
741b216
Modularize feature categories into `features.ts` and improve `Feature…
MarcinZiabek Oct 15, 2026
562b79d
Remove unused `createCodeHighlighter.ts` and improve shared style mod…
MarcinZiabek Oct 15, 2026
0775f53
Remove unused `HomePageHighlightedCode.vue` and `PaddleIntegration.vu…
MarcinZiabek Oct 16, 2026
f37d912
Remove the unused foundations and group classes from HomePageTrust.vue
MarcinZiabek Oct 16, 2026
fb34ea4
Drop the unused id field from the legal documents loader
MarcinZiabek Oct 16, 2026
6ef0358
Remove declarations that repeat the shared text styles
MarcinZiabek Oct 16, 2026
88cf956
Remove declarations that never take effect
MarcinZiabek Oct 16, 2026
a840224
Let the build add the -webkit- prefixes for mask and background-clip
MarcinZiabek Oct 16, 2026
d3f2a39
Flatten the nested CSS in LicenseIndex.vue and HomePageCtaDeckVisual.vue
MarcinZiabek Oct 16, 2026
81ca493
Remove two wrapper elements on the homepage
MarcinZiabek Oct 16, 2026
9c0cf50
Remove four comments that only restate the code
MarcinZiabek Oct 16, 2026
e719bc3
Say why the navbar title's min-width is reset
MarcinZiabek Oct 16, 2026
478d593
Merge the two :root blocks in VitepressAdjustments.css
MarcinZiabek Oct 16, 2026
9ad8a7d
Drop the professional pricing card's border-radius: the panel base se…
MarcinZiabek Oct 16, 2026
f2f76ec
Centre the CTA model with inset: 0 and margin: auto
MarcinZiabek Oct 16, 2026
183e61d
Stack the composer's sweep band with isolation instead of raising its…
MarcinZiabek Oct 16, 2026
050836a
Write the statistic tile's two theme colours with light-dark()
MarcinZiabek Oct 16, 2026
5e9d25d
Revert "Centre the CTA model with inset: 0 and margin: auto"
MarcinZiabek Oct 16, 2026
0409019
Define and apply `--custom-page-gutter` for consistent padding, repla…
MarcinZiabek Oct 16, 2026
65aafee
Remove the container wrappers that no stylesheet targets
MarcinZiabek Oct 16, 2026
3a72df9
Scope the link colours to running text and name the properties that t…
MarcinZiabek Oct 16, 2026
862b6ce
Drive the CTA thumbnails from data, read the chevron state from ARIA,…
MarcinZiabek Oct 16, 2026
902a842
Remove four comments that restate the code or went stale
MarcinZiabek Oct 16, 2026
9df1762
Remove platform SVGs, use Font Awesome icons, and embed feature categ…
MarcinZiabek Oct 17, 2026
a5bb6d2
Refine agent card glow with distinct light and dark mode gradients.
MarcinZiabek Oct 17, 2026
e8e4f40
Replace obsolete SVG assets with a streamlined code and layout design…
MarcinZiabek Oct 18, 2026
0a23134
Update homepage content for clarity and precision
MarcinZiabek Oct 19, 2026
fedcad0
**Refactor Quick Start session builder and rendering logic for improv…
MarcinZiabek Oct 19, 2026
2ee3921
Simplify and standardize background glows, colors, and gradients; imp…
MarcinZiabek Oct 27, 2026
3196181
**Unify canvas glow styles, improve homepage layout, and enhance icon…
MarcinZiabek Oct 27, 2026
aaaf9be
Remove unused icons from statistics, simplify layout, and improve ali…
MarcinZiabek Oct 27, 2026
b01e2f8
Adjust spacing, font weights, and icon sizes for consistency across s…
MarcinZiabek Oct 29, 2026
523b950
Standardize canvas glows, refine composer visuals, and enhance layout…
MarcinZiabek Oct 29, 2026
4d43e81
"Refine typography, button styles, and layout responsiveness; update …
MarcinZiabek Oct 29, 2026
3c117b7
"Remove redundant comments from homepage and theme components for cle…
MarcinZiabek Oct 29, 2026
a3e8d9a
Adjust CTA visuals for improved scaling, spacing, and element alignment.
MarcinZiabek Oct 29, 2026
b5b3b8f
Refine pricing page layout and typography
MarcinZiabek Oct 29, 2026
7dea5f4
Refactor homepage visuals: replace companion tour logic with static c…
MarcinZiabek Oct 29, 2026
9240b64
Simplify document layout, enhance metadata styles, and clean up unuse…
MarcinZiabek Oct 29, 2026
173aab9
Refactor license template layout and styling for improved clarity and…
MarcinZiabek Oct 29, 2026
79681b4
Remove `grain.png`, update background grain logic, and clean up prici…
MarcinZiabek Oct 29, 2026
5c589d8
Adjust CTA card padding for improved spacing and alignment.
MarcinZiabek Oct 30, 2026
70e2618
Enhance CTA card visuals and interactions: remove compact thumbnail l…
MarcinZiabek Nov 2, 2026
cc7cc24
Update docs: replace PNG assets with WEBP for optimization, fix copyr…
MarcinZiabek Nov 2, 2026
6df91ee
Remove unused static image assets from documentation folder to optimi…
MarcinZiabek Nov 2, 2026
a949d04
Update tsconfig and improve VitePress configuration: enable TS extens…
MarcinZiabek Nov 2, 2026
a4c093d
Replace Font Awesome kit with typed imports for improved control and …
MarcinZiabek Nov 2, 2026
773fa85
Expand feature icons in documentation by using fully typed imports fr…
MarcinZiabek Nov 2, 2026
0b0a650
Expand feature icons in documentation by using fully typed imports fr…
MarcinZiabek Nov 3, 2026
0241714
Update icons in features.ts: replace imports with Font Awesome Pro, a…
MarcinZiabek Nov 3, 2026
3d18c54
"Refine LicenseConfirmation UI: simplify title text, adjust spacing, …
MarcinZiabek Nov 3, 2026
f8a121a
Adjust icon styling across homepage components: replace `line-height`…
MarcinZiabek Nov 3, 2026
723dd52
Replace placeholder visuals in homepage CTAs with interim designs: ad…
MarcinZiabek Nov 3, 2026
a5421e6
Refine PricingFAQ styles: implement light-dark theming for FAQ accent…
MarcinZiabek Nov 3, 2026
f4ff3c6
Merge remote-tracking branch 'origin/main' into theme-redesign-experi…
MarcinZiabek Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_AUTH_TOKEN}
24 changes: 18 additions & 6 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {readFileSync} from 'node:fs'
import {defineConfig, HeadConfig} from 'vitepress'
import {defineConfig, type DefaultTheme, HeadConfig} from 'vitepress'
import llmstxt from 'vitepress-plugin-llms'
import imageSizePlugin from "./markdownit-imagesize-plugin";
import imageSizePlugin from "./markdownit-imagesize-plugin.ts";

const isProd = process.env.NODE_ENV === 'production';
const llmsTxtTemplate = readFileSync(new URL('./llms-txt-template.md', import.meta.url), 'utf-8').trimEnd();
Expand All @@ -17,6 +17,13 @@ function getPlausibleScript() : HeadConfig[] {
}


/* llms.txt lists documentation pages only; an external sidebar link (GitHub releases) has no markdown source */
function withoutExternalLinks(items: DefaultTheme.SidebarItem[]): DefaultTheme.SidebarItem[] {
return items
.filter(item => !item.link || !/^https?:\/\//.test(item.link))
.map(item => item.items ? { ...item, items: withoutExternalLinks(item.items) } : item);
}

export default defineConfig({
lang: 'en-US',
title: 'QuestPDF',
Expand All @@ -26,6 +33,7 @@ export default defineConfig({

vite: {
plugins: [llmstxt({
sidebar: sidebar => Array.isArray(sidebar) ? withoutExternalLinks(sidebar) : sidebar,
domain: 'https://www.questpdf.com',
customLLMsTxtTemplate: llmsTxtTemplate,
ignoreFiles: [
Expand All @@ -48,16 +56,20 @@ export default defineConfig({
},

head: [
['link', { rel: 'icon', href: '/logo.png', type: 'image/png' }],
['script', { src: 'https://kit.fontawesome.com/294da38298.js', crossorigin: 'anonymous', async: "" }],
['link', { rel: 'icon', href: '/favicon.png', type: 'image/png', sizes: '64x64' }],
...getPlausibleScript(),
['meta', { name: "title", content: "C# PDF Generation Library | QuestPDF for .NET" }],
['meta', { name: "description", content: "Generate and edit PDF documents in your C# applications using the QuestPDF library and its C# Fluent API. Build invoices, reports and data exports with ease." }],
['meta', { name: "keywords", content: "PDF, C#, csharp, dotnet, .NET, ASP.NET, PDF generation, open-source, nuget, html to pdf" }],
],

themeConfig: {
logo: '/logo.webp',
logo: {
light: '/questpdf-logo-nav-light.webp',
dark: '/questpdf-logo-nav-dark.webp',
alt: 'QuestPDF'
},
siteTitle: false,
search: {
provider: 'algolia',
options: {
Expand All @@ -68,7 +80,7 @@ export default defineConfig({
}
},
nav: [
{ text: 'Documentation', link: '/quick-start' },
{ text: 'Documentation', link: '/quick-start', activeMatch: '^/(quick-start|invoice-tutorial|roadmap|acknowledgements|document-previewer|license/configuration|companion/|concepts/|api-reference/|examples/)' },
{ text: 'Features', link: '/features-overview' },
{ text: 'Pricing', link: '/pricing' },
{ text: 'GitHub', link: 'https://github.com/QuestPDF/QuestPDF', noIcon: true },
Expand Down
3 changes: 3 additions & 0 deletions docs/.vitepress/markdownit-imagesize-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ const imageSizePlugin: PluginWithOptions = (md) => {
applyImageDimensions(token, imagePath)
}

if (!token.attrGet('loading'))
token.attrSet('loading', 'lazy')

return defaultRenderer(tokens, idx, options, env, self)
}
}
Expand Down
189 changes: 141 additions & 48 deletions docs/.vitepress/theme/Contact.vue
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
<script setup lang="ts">
import type { IconDefinition } from "@fortawesome/fontawesome-common-types";
import { faCreditCard, faEnvelope, faIdCard, faUserGroup } from "@fortawesome/pro-regular-svg-icons";
import { faHeart } from "@fortawesome/pro-solid-svg-icons";
import Icon from "./Icon.vue";
interface Link {
href: string;
label: string;
}

interface ContactInformation {
icon: string;
title: string;
description: string;
links: Link[];
icon: IconDefinition;
title: string;
description: string;
links: Link[];
}

const contacts: ContactInformation[] = [
{
icon: "fa-duotone fa-user-group",
icon: faUserGroup,
title: "Community Support",
description: "Encountering an issue or have a feature idea? Join our community on GitHub. It is the best place to report bugs, discuss improvements, and share your insights with other developers.",
links: [
Expand All @@ -24,7 +28,7 @@ const contacts: ContactInformation[] = [
]
},
{
icon: "fa-duotone fa-id-card",
icon: faIdCard,
title: "Customer Portal",
description: "Access your subscription details, download invoices, update payment methods, or manage your license. Our customer portal provides a convenient way to handle all your account needs in one place.",
links: [
Expand All @@ -35,7 +39,7 @@ const contacts: ContactInformation[] = [
]
},
{
icon: "fa-duotone fa-credit-card",
icon: faCreditCard,
title: "Payment Support",
description: "We partner with Paddle to guarantee secure payments and global tax compliance. Please reach out to their team directly for assistance with invoices, billing inquiries, or returns.",
links: [
Expand All @@ -50,7 +54,7 @@ const contacts: ContactInformation[] = [
]
},
{
icon: "fa-duotone fa-envelope",
icon: faEnvelope,
title: "Get in Touch",
description: "Have a question about licensing, or just want to share feedback? Send us an email. We value your input and are always happy to help with non-technical inquiries or dedicated support.",
links: [
Expand All @@ -64,69 +68,158 @@ const contacts: ContactInformation[] = [
</script>

<template>
<div class="custom-page">
<div class="container reverse-background">
<div class="content">

<section class="contacts">
<template v-for="contact of contacts" :key="contact">
<article class="card">
<i class="fa-2xl" :class="[contact.icon]"></i>
<h3>{{ contact.title }}</h3>
<p>{{ contact.description }}</p>

<div class="links">
<a v-for="link in contact.links" class="action" :href="link.href" target="_blank">{{ link.label }}</a>
</div>
</article>
</template>

<article class="card business-details">
<i class="love-icon fa-duotone fa-heart fa-swap-opacity fa-2xl"></i>
<h3>QuestPDF is owned and proudly developed by:</h3>
<p>Marcin Ziąbek CodeFlint</p>
<p>Chrzanowska 29<br>32-551 Mętków<br>Poland</p>
<p>contact@questpdf.com<br>VAT: PL6282275649</p>
</article>
</section>

</div>
<div class="custom-page contact-page texture-dots">
<div class="content">
<header class="section-header contact-header">
<h1>Contact us</h1>
</header>

<section class="contacts">
<article v-for="contact of contacts" :key="contact.title" class="panel contact-card">
<div class="icon-tile">
<Icon :icon="contact.icon" />
</div>

<h3 class="card-title">{{ contact.title }}</h3>
<p class="card-description">{{ contact.description }}</p>

<div class="links">
<a v-for="link in contact.links" :key="link.href" class="action" :href="link.href" :target="link.href.startsWith('http') ? '_blank' : undefined">{{ link.label }}</a>
</div>
</article>

<div class="dotted-divider"></div>

<article class="panel business-details">
<div class="business-owner">
<div class="icon-tile">
<Icon class="love-icon" :icon="faHeart" />
</div>

<div>
<p class="business-intro">QuestPDF is owned and proudly developed by</p>
<h3 class="business-name">Marcin Ziąbek CodeFlint</h3>
</div>
</div>

<dl class="business-facts">
<div>
<dt>Address</dt>
<dd>Chrzanowska 29<br>32-551 Mętków<br>Poland</dd>
</div>

<div>
<dt>Email</dt>
<dd>contact@questpdf.com</dd>
</div>

<div>
<dt>VAT</dt>
<dd>PL6282275649</dd>
</div>
</dl>
</article>
</section>
</div>
</div>
</template>

<style scoped>

.contact-header {
margin-bottom: 48px;
}

.contacts {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 32px;
}

@media screen and (max-width: 750px) {
.contacts {
grid-template-columns: 1fr;
gap: 32px;
grid-template-columns: minmax(0, 1fr);
}
}

.contact-card {
display: flex;
flex-direction: column;
align-items: flex-start;
}

.contact-card .icon-tile {
margin-bottom: 16px;
}

.links {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: end;
place-self: end;
gap: 16px;
margin-top: 24px;
gap: 12px;
margin-top: auto;
padding-top: 24px;
}

.business-details {
grid-column: 1 / -1;

display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
gap: 32px 48px;
align-items: center;
}

.business-owner {
display: flex;
align-items: center;
gap: 20px;
}

.business-intro {
font-size: 0.9375rem;
}

.business-name {
margin: 4px 0 0;
line-height: 1.75rem;
}

.love-icon {
background-color: #F4433622 !important;
color: #F44336BB !important;
.business-facts {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 10.5rem), 1fr));
gap: 24px;
}

.business-facts dt {
margin-bottom: 6px;
font-size: 0.75rem;
line-height: 1rem;
font-weight: 600;
letter-spacing: 0.5px;
text-transform: uppercase;
color: var(--vp-c-text-3);
}

.business-facts dd {
font-size: 0.9375rem;
line-height: 1.5rem;
color: var(--vp-c-text-1);
}

@media screen and (max-width: 1180px) {
.business-details {
grid-template-columns: minmax(0, 1fr);
}
}

@media screen and (max-width: 600px) {
.business-facts {
gap: 16px;
}
}

.business-details p {
padding-top: 8px;
.icon-tile .love-icon {
color: #F44336;
}

</style>
Loading
Loading