|
7 | 7 | import PartnerBannerRailway from '$lib/components/partners/PartnerBannerRailway.svelte'; |
8 | 8 | import PartnerBannerWise from '$lib/components/partners/PartnerBannerWise.svelte'; |
9 | 9 | import SiteFooter from '$lib/components/layout/SiteFooter.svelte'; |
| 10 | + import StructuredData from '$lib/components/seo/StructuredData.svelte'; |
| 11 | + import { breadcrumbList, personCreator } from '$lib/seo/structured-data.js'; |
| 12 | + import { SITE_AUTHOR_URL } from '$lib/brand.js'; |
10 | 13 | import { settingsStore } from '$lib/state/settings.svelte.js'; |
11 | 14 |
|
12 | 15 | const TITLE = 'About'; |
13 | 16 | const DISPLAY_NAME = 'Word Aligner'; |
| 17 | + const SEO_TITLE = 'About Word Aligner — Free Word Alignment & Gloss Tool'; |
14 | 18 | const DESCRIPTION = |
15 | 19 | 'Word Aligner: multi-line word alignment, interlinear glosses and IPA, RTL scripts, word-splitting rules, per-line typography, exports (PNG, SVG, PDF, HTML), and shareable URLs — for learners, teachers, and linguists.'; |
16 | 20 |
|
17 | 21 | const canonical = $derived(page.url.origin + page.url.pathname); |
18 | 22 | const ogImage = $derived(`${page.url.origin}/api/og`); |
19 | 23 |
|
| 24 | + const structuredData = [ |
| 25 | + breadcrumbList([ |
| 26 | + { name: DISPLAY_NAME, path: '/' }, |
| 27 | + { name: TITLE, path: '/about' } |
| 28 | + ]), |
| 29 | + personCreator() |
| 30 | + ]; |
| 31 | +
|
20 | 32 | const siteTheme = $derived(settingsStore.settings.theme); |
21 | 33 | const themeIconBtn = |
22 | 34 | 'box-border m-0 inline-flex h-9 w-9 shrink-0 items-center justify-center border-0 transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500 dark:focus-visible:outline-gray-400'; |
|
132 | 144 | </script> |
133 | 145 |
|
134 | 146 | <svelte:head> |
135 | | - <title>{TITLE} · {DISPLAY_NAME}</title> |
| 147 | + <title>{SEO_TITLE}</title> |
136 | 148 | <meta name="description" content={DESCRIPTION} /> |
137 | 149 | <link rel="canonical" href={canonical} /> |
138 | 150 | <meta name="robots" content="index,follow" /> |
139 | 151 | <meta property="og:type" content="website" /> |
140 | | - <meta property="og:title" content={`${TITLE} · ${DISPLAY_NAME}`} /> |
| 152 | + <meta property="og:title" content={SEO_TITLE} /> |
141 | 153 | <meta property="og:description" content={DESCRIPTION} /> |
142 | 154 | <meta property="og:url" content={canonical} /> |
143 | 155 | <meta property="og:image" content={ogImage} /> |
|
147 | 159 | <meta property="og:image:height" content="630" /> |
148 | 160 | <meta property="og:image:alt" content={`${TITLE} — ${DISPLAY_NAME}`} /> |
149 | 161 | <meta name="twitter:card" content="summary_large_image" /> |
150 | | - <meta name="twitter:title" content={`${TITLE} · ${DISPLAY_NAME}`} /> |
| 162 | + <meta name="twitter:title" content={SEO_TITLE} /> |
151 | 163 | <meta name="twitter:description" content={DESCRIPTION} /> |
152 | 164 | <meta name="twitter:image" content={ogImage} /> |
153 | 165 | <meta name="twitter:image:alt" content={`${TITLE} — ${DISPLAY_NAME}`} /> |
154 | 166 | </svelte:head> |
155 | 167 |
|
| 168 | +<StructuredData data={structuredData} /> |
| 169 | + |
156 | 170 | <main |
157 | 171 | class="mx-auto w-full max-w-3xl min-w-0 px-4 pt-4 pb-16 leading-relaxed text-gray-700 sm:px-6 md:pt-6 md:pb-20 dark:text-gray-300" |
158 | 172 | > |
|
246 | 260 | <li><a href="#doc-export-share" class={tocLinkClass}>Export and share</a></li> |
247 | 261 | <li><a href="#doc-examples" class={tocLinkClass}>Examples and motion demos</a></li> |
248 | 262 | <li><a href="#doc-partners" class={tocLinkClass}>Partner links</a></li> |
| 263 | + <li><a href="#doc-creator" class={tocLinkClass}>About the creator</a></li> |
249 | 264 | <li><a href="#doc-contact" class={tocLinkClass}>Contact</a></li> |
250 | 265 | <li><a href="#doc-privacy" class={tocLinkClass}>Privacy</a></li> |
251 | 266 | </ul> |
|
449 | 464 | <PartnerBannerWise /> |
450 | 465 | </div> |
451 | 466 |
|
| 467 | + <h2 id="doc-creator" class={headingClass}>About the creator</h2> |
| 468 | + <p class="mt-3"> |
| 469 | + {DISPLAY_NAME} is built by Dani Polani — a fantasy author, the creator of the constructed language |
| 470 | + Lemu Teloku, and a maker of tools for conlangers and linguists. A psychologist and linguist by training |
| 471 | + and a self-taught developer, Dani builds small, focused tools and likes automating the tedious parts. |
| 472 | + </p> |
| 473 | + <p class="mt-3"> |
| 474 | + The same attention to interlinear glosses and Leipzig-style conventions that goes into |
| 475 | + documenting a constructed language shaped this tool. Alongside the language work there is a |
| 476 | + wider creative world — drawings, an encyclopedia of Lemu Teloku and its setting, and other |
| 477 | + handmade art projects. Offline, Dani is fond of literature, nineteenth-century technology, cats, |
| 478 | + and seals. |
| 479 | + </p> |
| 480 | + <p class="mt-3"> |
| 481 | + More of Dani's work and tools: |
| 482 | + <a href={SITE_AUTHOR_URL} class={linkClass} target="_blank" rel="noopener noreferrer"> |
| 483 | + danipolani.github.io |
| 484 | + </a>. |
| 485 | + </p> |
| 486 | + |
452 | 487 | <h2 id="doc-contact" class={headingClass}>Contact</h2> |
453 | 488 | <p class="mt-3"> |
454 | 489 | Questions or feedback about {DISPLAY_NAME}: |
|
0 commit comments