strokes-js 0.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.
Files changed (148) hide show
  1. package/README.md +211 -0
  2. package/dist/glyphs/digits/digit-0.d.ts +3 -0
  3. package/dist/glyphs/digits/digit-0.js +9 -0
  4. package/dist/glyphs/digits/digit-1.d.ts +3 -0
  5. package/dist/glyphs/digits/digit-1.js +9 -0
  6. package/dist/glyphs/digits/digit-2.d.ts +3 -0
  7. package/dist/glyphs/digits/digit-2.js +9 -0
  8. package/dist/glyphs/digits/digit-3.d.ts +3 -0
  9. package/dist/glyphs/digits/digit-3.js +9 -0
  10. package/dist/glyphs/digits/digit-4.d.ts +3 -0
  11. package/dist/glyphs/digits/digit-4.js +9 -0
  12. package/dist/glyphs/digits/digit-5.d.ts +3 -0
  13. package/dist/glyphs/digits/digit-5.js +9 -0
  14. package/dist/glyphs/digits/digit-6.d.ts +3 -0
  15. package/dist/glyphs/digits/digit-6.js +9 -0
  16. package/dist/glyphs/digits/digit-7.d.ts +3 -0
  17. package/dist/glyphs/digits/digit-7.js +9 -0
  18. package/dist/glyphs/digits/digit-8.d.ts +3 -0
  19. package/dist/glyphs/digits/digit-8.js +9 -0
  20. package/dist/glyphs/digits/digit-9.d.ts +3 -0
  21. package/dist/glyphs/digits/digit-9.js +9 -0
  22. package/dist/glyphs/glyphs.d.ts +3 -0
  23. package/dist/glyphs/glyphs.js +138 -0
  24. package/dist/glyphs/letters/letter-a-upper.d.ts +3 -0
  25. package/dist/glyphs/letters/letter-a-upper.js +9 -0
  26. package/dist/glyphs/letters/letter-a.d.ts +3 -0
  27. package/dist/glyphs/letters/letter-a.js +9 -0
  28. package/dist/glyphs/letters/letter-b-upper.d.ts +3 -0
  29. package/dist/glyphs/letters/letter-b-upper.js +9 -0
  30. package/dist/glyphs/letters/letter-b.d.ts +3 -0
  31. package/dist/glyphs/letters/letter-b.js +9 -0
  32. package/dist/glyphs/letters/letter-c-upper.d.ts +3 -0
  33. package/dist/glyphs/letters/letter-c-upper.js +9 -0
  34. package/dist/glyphs/letters/letter-c.d.ts +3 -0
  35. package/dist/glyphs/letters/letter-c.js +9 -0
  36. package/dist/glyphs/letters/letter-d-upper.d.ts +3 -0
  37. package/dist/glyphs/letters/letter-d-upper.js +9 -0
  38. package/dist/glyphs/letters/letter-d.d.ts +3 -0
  39. package/dist/glyphs/letters/letter-d.js +9 -0
  40. package/dist/glyphs/letters/letter-e-upper.d.ts +3 -0
  41. package/dist/glyphs/letters/letter-e-upper.js +9 -0
  42. package/dist/glyphs/letters/letter-e.d.ts +3 -0
  43. package/dist/glyphs/letters/letter-e.js +9 -0
  44. package/dist/glyphs/letters/letter-f-upper.d.ts +3 -0
  45. package/dist/glyphs/letters/letter-f-upper.js +9 -0
  46. package/dist/glyphs/letters/letter-f.d.ts +3 -0
  47. package/dist/glyphs/letters/letter-f.js +9 -0
  48. package/dist/glyphs/letters/letter-g-upper.d.ts +3 -0
  49. package/dist/glyphs/letters/letter-g-upper.js +9 -0
  50. package/dist/glyphs/letters/letter-g.d.ts +3 -0
  51. package/dist/glyphs/letters/letter-g.js +9 -0
  52. package/dist/glyphs/letters/letter-h-upper.d.ts +3 -0
  53. package/dist/glyphs/letters/letter-h-upper.js +9 -0
  54. package/dist/glyphs/letters/letter-h.d.ts +3 -0
  55. package/dist/glyphs/letters/letter-h.js +9 -0
  56. package/dist/glyphs/letters/letter-i-upper.d.ts +3 -0
  57. package/dist/glyphs/letters/letter-i-upper.js +9 -0
  58. package/dist/glyphs/letters/letter-i.d.ts +3 -0
  59. package/dist/glyphs/letters/letter-i.js +9 -0
  60. package/dist/glyphs/letters/letter-j-upper.d.ts +3 -0
  61. package/dist/glyphs/letters/letter-j-upper.js +9 -0
  62. package/dist/glyphs/letters/letter-j.d.ts +3 -0
  63. package/dist/glyphs/letters/letter-j.js +9 -0
  64. package/dist/glyphs/letters/letter-k-upper.d.ts +3 -0
  65. package/dist/glyphs/letters/letter-k-upper.js +9 -0
  66. package/dist/glyphs/letters/letter-k.d.ts +3 -0
  67. package/dist/glyphs/letters/letter-k.js +9 -0
  68. package/dist/glyphs/letters/letter-l-upper.d.ts +3 -0
  69. package/dist/glyphs/letters/letter-l-upper.js +9 -0
  70. package/dist/glyphs/letters/letter-l.d.ts +3 -0
  71. package/dist/glyphs/letters/letter-l.js +9 -0
  72. package/dist/glyphs/letters/letter-m-upper.d.ts +3 -0
  73. package/dist/glyphs/letters/letter-m-upper.js +9 -0
  74. package/dist/glyphs/letters/letter-m.d.ts +3 -0
  75. package/dist/glyphs/letters/letter-m.js +9 -0
  76. package/dist/glyphs/letters/letter-n-upper.d.ts +3 -0
  77. package/dist/glyphs/letters/letter-n-upper.js +9 -0
  78. package/dist/glyphs/letters/letter-n.d.ts +3 -0
  79. package/dist/glyphs/letters/letter-n.js +9 -0
  80. package/dist/glyphs/letters/letter-o-upper.d.ts +3 -0
  81. package/dist/glyphs/letters/letter-o-upper.js +9 -0
  82. package/dist/glyphs/letters/letter-o.d.ts +3 -0
  83. package/dist/glyphs/letters/letter-o.js +9 -0
  84. package/dist/glyphs/letters/letter-p-upper.d.ts +3 -0
  85. package/dist/glyphs/letters/letter-p-upper.js +9 -0
  86. package/dist/glyphs/letters/letter-p.d.ts +3 -0
  87. package/dist/glyphs/letters/letter-p.js +9 -0
  88. package/dist/glyphs/letters/letter-q-upper.d.ts +3 -0
  89. package/dist/glyphs/letters/letter-q-upper.js +9 -0
  90. package/dist/glyphs/letters/letter-q.d.ts +3 -0
  91. package/dist/glyphs/letters/letter-q.js +9 -0
  92. package/dist/glyphs/letters/letter-r-upper.d.ts +3 -0
  93. package/dist/glyphs/letters/letter-r-upper.js +9 -0
  94. package/dist/glyphs/letters/letter-r.d.ts +3 -0
  95. package/dist/glyphs/letters/letter-r.js +9 -0
  96. package/dist/glyphs/letters/letter-s-upper.d.ts +3 -0
  97. package/dist/glyphs/letters/letter-s-upper.js +9 -0
  98. package/dist/glyphs/letters/letter-s.d.ts +3 -0
  99. package/dist/glyphs/letters/letter-s.js +9 -0
  100. package/dist/glyphs/letters/letter-t-upper.d.ts +3 -0
  101. package/dist/glyphs/letters/letter-t-upper.js +9 -0
  102. package/dist/glyphs/letters/letter-t.d.ts +3 -0
  103. package/dist/glyphs/letters/letter-t.js +9 -0
  104. package/dist/glyphs/letters/letter-u-upper.d.ts +3 -0
  105. package/dist/glyphs/letters/letter-u-upper.js +9 -0
  106. package/dist/glyphs/letters/letter-u.d.ts +3 -0
  107. package/dist/glyphs/letters/letter-u.js +9 -0
  108. package/dist/glyphs/letters/letter-v-upper.d.ts +3 -0
  109. package/dist/glyphs/letters/letter-v-upper.js +9 -0
  110. package/dist/glyphs/letters/letter-v.d.ts +3 -0
  111. package/dist/glyphs/letters/letter-v.js +9 -0
  112. package/dist/glyphs/letters/letter-w-upper.d.ts +3 -0
  113. package/dist/glyphs/letters/letter-w-upper.js +9 -0
  114. package/dist/glyphs/letters/letter-w.d.ts +3 -0
  115. package/dist/glyphs/letters/letter-w.js +9 -0
  116. package/dist/glyphs/letters/letter-x-upper.d.ts +3 -0
  117. package/dist/glyphs/letters/letter-x-upper.js +9 -0
  118. package/dist/glyphs/letters/letter-x.d.ts +3 -0
  119. package/dist/glyphs/letters/letter-x.js +9 -0
  120. package/dist/glyphs/letters/letter-y-upper.d.ts +3 -0
  121. package/dist/glyphs/letters/letter-y-upper.js +9 -0
  122. package/dist/glyphs/letters/letter-y.d.ts +3 -0
  123. package/dist/glyphs/letters/letter-y.js +9 -0
  124. package/dist/glyphs/letters/letter-z-upper.d.ts +3 -0
  125. package/dist/glyphs/letters/letter-z-upper.js +9 -0
  126. package/dist/glyphs/letters/letter-z.d.ts +3 -0
  127. package/dist/glyphs/letters/letter-z.js +9 -0
  128. package/dist/glyphs/punctuation/punct-apostrophe.d.ts +3 -0
  129. package/dist/glyphs/punctuation/punct-apostrophe.js +9 -0
  130. package/dist/glyphs/punctuation/punct-comma.d.ts +3 -0
  131. package/dist/glyphs/punctuation/punct-comma.js +9 -0
  132. package/dist/glyphs/punctuation/punct-exclamation.d.ts +3 -0
  133. package/dist/glyphs/punctuation/punct-exclamation.js +9 -0
  134. package/dist/glyphs/punctuation/punct-hyphen.d.ts +3 -0
  135. package/dist/glyphs/punctuation/punct-hyphen.js +9 -0
  136. package/dist/glyphs/punctuation/punct-period.d.ts +3 -0
  137. package/dist/glyphs/punctuation/punct-period.js +9 -0
  138. package/dist/glyphs/punctuation/punct-question.d.ts +3 -0
  139. package/dist/glyphs/punctuation/punct-question.js +9 -0
  140. package/dist/glyphs/types.d.ts +5 -0
  141. package/dist/glyphs/types.js +1 -0
  142. package/dist/index.d.ts +11 -0
  143. package/dist/index.js +16 -0
  144. package/dist/observer.d.ts +8 -0
  145. package/dist/observer.js +17 -0
  146. package/dist/renderer.d.ts +12 -0
  147. package/dist/renderer.js +98 -0
  148. package/package.json +41 -0
package/README.md ADDED
@@ -0,0 +1,211 @@
1
+ # strokes-js
2
+
3
+ Renders text as animated hand-drawn SVG. Each letter is a real monoline glyph path (not a font), drawn in with a stroke animation as its word scrolls into view — with per-letter randomness (rotation, baseline drift, scale, and multiple hand-drawn variants per character) so the same word never renders identically twice.
4
+
5
+ - Zero dependencies, ESM, TypeScript strict, ~small
6
+ - Full a–z, A–Z, 0–9, and punctuation (`. , ! ? ' -`) coverage
7
+ - Scroll-triggered draw-in animation via `IntersectionObserver`, or static fully-drawn output
8
+ - Styleable with one CSS custom property (`--hw-color`)
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install strokes-js
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ### Quick start — `write()`
19
+
20
+ The simplest way to use the library: one call renders the text and wires up the animation.
21
+
22
+ ```html
23
+ <div id="hello"></div>
24
+ <script type="module">
25
+ import { write } from "strokes-js";
26
+
27
+ write("#hello", "Hello, world!");
28
+ </script>
29
+ ```
30
+
31
+ `write()` accepts a CSS selector string or an `HTMLElement` directly:
32
+
33
+ ```js
34
+ write(document.getElementById("hello"), "Hello, world!");
35
+ ```
36
+
37
+ By default, letters draw themselves in when the target element scrolls into view. Pass `{ animate: false }` for static, fully-drawn output with no scroll observer:
38
+
39
+ ```js
40
+ write("#hello", "Static text", { animate: false });
41
+ ```
42
+
43
+ ### Manual control — `renderText()` + `attach()`
44
+
45
+ For cases where you want the markup without the library touching the DOM directly (e.g. server-side rendering, or inserting the HTML yourself), use the two lower-level pieces `write()` is built from:
46
+
47
+ ```js
48
+ import { renderText, attach } from "strokes-js";
49
+
50
+ const el = document.getElementById("hello");
51
+ el.innerHTML = renderText("Hello, world!"); // animate: true by default
52
+ attach(el); // wires the scroll-triggered draw-in
53
+ ```
54
+
55
+ `renderText()` returns a plain HTML string, so it also works outside the browser (no `document` access needed) — only `attach()` and `animateWriting()` touch the DOM.
56
+
57
+ ### Triggering the animation manually
58
+
59
+ If you don't want scroll-triggering at all — e.g. you want the animation to start on a button click, a timer, or a route transition — skip `attach()` and call `animateWriting()` yourself on each rendered word:
60
+
61
+ ```js
62
+ import { renderText, animateWriting } from "strokes-js";
63
+
64
+ el.innerHTML = renderText("Hello, world!");
65
+ button.addEventListener("click", () => {
66
+ for (const word of el.querySelectorAll(".hw-word")) {
67
+ animateWriting(word);
68
+ }
69
+ });
70
+ ```
71
+
72
+ ### Styling color
73
+
74
+ Stroke color is controlled entirely through the `--hw-color` CSS custom property (falls back to `#000`):
75
+
76
+ ```css
77
+ #hello {
78
+ --hw-color: #c0392b;
79
+ }
80
+ ```
81
+
82
+ or per-render from JS:
83
+
84
+ ```js
85
+ el.style.setProperty("--hw-color", "#c0392b");
86
+ ```
87
+
88
+ ## API
89
+
90
+ ### `write(target, text, options?)`
91
+
92
+ One-call entry point: renders `text` into `target` and (unless `animate: false`) wires up the scroll-triggered draw-in animation.
93
+
94
+ | Param | Type | Description |
95
+ | --------- | ----------------------- | ------------------------------------------------------------------------------------------- |
96
+ | `target` | `HTMLElement \| string` | Element to render into, or a CSS selector. No-ops silently if the selector matches nothing. |
97
+ | `text` | `string` | Text to render. |
98
+ | `options` | `WriteOptions` | See below. |
99
+
100
+ `WriteOptions` = `RenderTextOptions & AttachOptions` (all fields optional, documented below).
101
+
102
+ ### `renderText(text, options?)`
103
+
104
+ Returns an HTML string: a `<span class="hw-sentence">` wrapping one `<svg class="hw-word">` per word. Pure string output — safe to call without a `document` (e.g. during SSR).
105
+
106
+ **`RenderTextOptions`**
107
+
108
+ | Option | Type | Default | Description |
109
+ | --------- | --------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
110
+ | `animate` | `boolean` | `true` | When `true`, each letter's path is rendered with `stroke-dasharray/dashoffset` primed for the draw-in transition (invisible until `animateWriting()` runs on it). When `false`, letters render fully drawn immediately, with no transition styling. |
111
+
112
+ ### `attach(el, options?)`
113
+
114
+ Wires an `IntersectionObserver` to `el` so that when it scrolls into view, every `.hw-word` inside it is passed to `animateWriting()`.
115
+
116
+ **`AttachOptions`** (a subset of standard `IntersectionObserverInit`, plus `once`)
117
+
118
+ | Option | Type | Default | Description |
119
+ | ------------ | -------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
120
+ | `root` | `Element \| null` | `null` (viewport) | Passed through to `IntersectionObserver`. |
121
+ | `rootMargin` | `string` | `"0px"` | Passed through to `IntersectionObserver`. |
122
+ | `threshold` | `number \| number[]` | `0` | Passed through to `IntersectionObserver`. |
123
+ | `once` | `boolean` | `true` | If `true`, stops observing `el` after the first time it intersects (animation fires once). Set `false` to re-trigger every time it re-enters the viewport (combine with re-rendering if you want fresh variants each time). |
124
+
125
+ ### `animateWriting(el)`
126
+
127
+ Starts the draw-in transition immediately on a rendered `.hw-word` element (or any element containing `.hw-letter` paths): adds the `hw-visible` class and sets each letter path's `stroke-dashoffset` to `0`. This is what `attach()` calls automatically on intersection — call it directly if you're driving the animation from something other than scroll (see [Triggering the animation manually](#triggering-the-animation-manually)).
128
+
129
+ ## How the animation works
130
+
131
+ Each letter is an SVG `<path>` with `pathLength="1"`, `stroke-dasharray:1`, and `stroke-dashoffset:1` — the path is drawn but entirely hidden behind its own dash gap. `animateWriting()` sets `stroke-dashoffset` to `0`, and a CSS `transition` (declared inline per-path, staggered by letter index) animates the stroke drawing in left to right, letter by letter, word by word. Stagger and stroke duration are fixed internally (60ms per letter offset, 400ms draw per letter) — not currently configurable via options.
132
+
133
+ ## Handwriting randomness
134
+
135
+ Two independent layers of randomness make repeated text look hand-written rather than stamped:
136
+
137
+ 1. **Variant selection** — most glyphs ship with multiple (typically 3) hand-drawn path variants. Each time a character is rendered, a variant is picked at random, with one rule: it never repeats the same variant used the previous time that character was rendered (tracked per-character, process-wide), so runs of the same letter don't look identical back to back.
138
+ 2. **Per-instance jitter** — independent of variant, every rendered letter gets a small random `rotate` (±7°), baseline `dy` drift (±1 unit), and `scale` (±10%), applied via an SVG transform pivoted around the letter's own center (so jitter never shifts later letters in a word out of position). This is freshly randomized on every render — it is not seeded or reproducible.
139
+
140
+ Both layers use `Math.random()` directly and are **not deterministic** — re-rendering the same text will look slightly different each time. This is intentional (it's what makes it read as handwriting rather than a font).
141
+
142
+ ## Styling & class names
143
+
144
+ | Class | Applied to | Purpose |
145
+ | ------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
146
+ | `hw-sentence` | outer `<span>` | Wraps all words for one `renderText()` call; carries `aria-label` with the original text. |
147
+ | `hw-word` | one `<svg>` per word | The unit `attach()`/`animateWriting()` operate on. |
148
+ | `hw-letter` | one `<path>` per letter | Individual glyph stroke. |
149
+ | `hw-visible` | added to `hw-word` elements | Set by `animateWriting()` once triggered; useful as a CSS hook if you want to react to "this word has started drawing." |
150
+
151
+ Color is the one themeable value, via the `--hw-color` custom property (see [Styling color](#styling-color)). Stroke width (`2`) and letter height (`24` units, viewBox-relative) are currently fixed, not configurable.
152
+
153
+ ## Accessibility
154
+
155
+ - The outer `hw-sentence` span carries `aria-label="<original text>"` (HTML-escaped), so screen readers announce the real text rather than trying to parse decorative SVG paths.
156
+ - Every `hw-word` SVG has `aria-hidden="true"`, removing the decorative glyph paths from the accessibility tree.
157
+
158
+ ## Glyph coverage
159
+
160
+ | Set | Characters |
161
+ | ----------- | ----------------------- |
162
+ | Lowercase | `a`–`z` |
163
+ | Uppercase | `A`–`Z` |
164
+ | Digits | `0`–`9` |
165
+ | Punctuation | `.` `,` `!` `?` `'` `-` |
166
+
167
+ Characters outside this set (other punctuation, whitespace beyond the plain space used to split words, non-Latin scripts, emoji) are silently skipped — they contribute no path and no width. Unsupported _uppercase_ input falls back to the lowercase glyph if one exists (e.g. an accidental extra capital); punctuation is matched exactly, with no case folding.
168
+
169
+ ## Project structure
170
+
171
+ ```
172
+ src/
173
+ index.ts — write(), public exports
174
+ renderer.ts — renderText(), animateWriting(), jitter/variant logic
175
+ observer.ts — attach(), IntersectionObserver wiring
176
+ glyphs/
177
+ types.ts — GlyphEntry / GlyphDatabase types
178
+ glyphs.ts — aggregates every glyph module into one lookup table
179
+ letters/letter-<x>.ts — one file per lowercase letter (width + variant paths)
180
+ letters/letter-<x>-upper.ts — one file per uppercase letter
181
+ digits/digit-<n>.ts — one file per digit
182
+ punctuation/punct-<name>.ts — one file per punctuation glyph
183
+ scripts/
184
+ extract-glyphs.ts — stub, not implemented
185
+ demo/
186
+ index.html — live playground + full glyph gallery
187
+ ```
188
+
189
+ Each glyph file exports a single `GlyphEntry`:
190
+
191
+ ```ts
192
+ export interface GlyphEntry {
193
+ width: number; // advance width, in the same units as the 24-unit-tall viewBox
194
+ variants: string[]; // one or more monoline SVG path `d` strings, hand-drawn within 0 0 width 24
195
+ }
196
+ ```
197
+
198
+ Adding or editing a glyph means editing its own file under `glyphs/letters`, `glyphs/digits`, or `glyphs/punctuation` — no other file needs to change except `glyphs.ts`'s import/lookup if you're adding a brand-new character.
199
+
200
+ ## Demo
201
+
202
+ `demo/index.html` is a static page (loads `../dist/index.js`, so run `npm run build` first) with:
203
+
204
+ - a live playground — type any text, change stroke color, toggle animate on/off, replay
205
+ - the full glyph gallery — every supported letter, digit, and punctuation mark, animated on scroll
206
+
207
+ Open it with any static file server, e.g. `npx serve .` then visit `/demo/`.
208
+
209
+ ## License
210
+
211
+ ISC
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "0", 3 wobble variants. */
3
+ export declare const digit0: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "0", 3 wobble variants. */
2
+ export const digit0 = {
3
+ width: 11,
4
+ variants: [
5
+ "M9.5 12 C 9.5 6.5 7.3 4 5 4 C 2.5 4 0.5 6.5 0.5 12 C 0.5 17.5 2.5 20.5 5 20.5 C 7.3 20.5 9.5 17.5 9.5 12",
6
+ "M9.6 11.8 C 9.5 6.6 7.1 3.8 5.0 3.8 C 2.7 3.8 0.6 6.4 0.7 11.8 C 0.5 17.6 2.4 20.3 4.9 20.4 C 7.1 20.3 9.6 17.6 9.5 12.1",
7
+ "M9.4 11.9 C 9.5 6.4 7.4 4.0 4.9 3.9 C 2.4 4.1 0.5 6.4 0.6 12.1 C 0.5 17.4 2.7 20.4 5.2 20.5 C 7.1 20.3 9.4 17.6 9.5 11.8",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "1", 3 wobble variants. */
3
+ export declare const digit1: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "1", 3 wobble variants. */
2
+ export const digit1 = {
3
+ width: 10,
4
+ variants: [
5
+ "M2 7 L5.5 4 L5.5 20 M2.5 20 L8.5 20",
6
+ "M1.8 6.9 L5.3 4.0 L5.5 19.9 M2.5 20.1 L8.6 20.0",
7
+ "M2.1 6.9 L5.6 4.1 L5.3 20.0 M2.6 19.9 L8.3 19.9",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "2", 3 wobble variants. */
3
+ export declare const digit2: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "2", 3 wobble variants. */
2
+ export const digit2 = {
3
+ width: 11,
4
+ variants: [
5
+ "M1.5 8 C 1.5 5 4 4 6 4 C 8.5 4 10 6 10 8.5 C 10 12.5 5.5 15 1.5 19.5 L10 19.5",
6
+ "M1.7 7.9 C 1.6 5.1 3.8 3.9 5.9 4.2 C 8.6 4.1 10.1 6.1 9.9 8.6 C 10.1 12.6 5.4 15.0 1.6 19.5 L10.1 19.4",
7
+ "M1.3 7.9 C 1.7 4.9 3.9 3.9 6.2 3.9 C 8.5 4.1 9.9 6.0 9.9 8.6 C 9.8 12.5 5.6 14.9 1.3 19.4 L10.0 19.7",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "3", 3 wobble variants. */
3
+ export declare const digit3: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "3", 3 wobble variants. */
2
+ export const digit3 = {
3
+ width: 11,
4
+ variants: [
5
+ "M1.5 6 C 3 4.3 8.5 3.8 9 7.5 C 9.3 10 7 11.5 5 12 C 7.5 12.3 9.8 13.8 9.5 16.5 C 9.2 19.5 4 20.8 1.3 18.3",
6
+ "M1.3 5.9 C 2.8 4.3 8.4 4.0 8.8 7.7 C 9.3 9.9 6.9 11.6 4.9 12.2 C 7.3 12.2 10.0 13.8 9.4 16.7 C 9.4 19.5 3.9 21.0 1.4 18.2",
7
+ "M1.7 6.0 C 3.0 4.5 8.3 3.7 9.2 7.4 C 9.1 9.9 7.2 11.3 5.1 12.2 C 7.4 12.2 9.6 13.9 9.6 16.3 C 9.3 19.5 3.8 20.8 1.1 18.4",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "4", 3 wobble variants. */
3
+ export declare const digit4: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "4", 3 wobble variants. */
2
+ export const digit4 = {
3
+ width: 11,
4
+ variants: [
5
+ "M8 4 L1 15 L10.5 15 M8 4 L8 20",
6
+ "M7.9 4.1 L0.8 15.0 L10.6 14.9 M8.0 3.9 L7.9 20.1",
7
+ "M8.2 3.9 L0.9 14.8 L10.4 14.9 M8.0 3.9 L7.9 20.1",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "5", 3 wobble variants. */
3
+ export declare const digit5: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "5", 3 wobble variants. */
2
+ export const digit5 = {
3
+ width: 11,
4
+ variants: [
5
+ "M9 4 L2 4 L1.5 10.5 C 3 9 8.5 9.3 9.3 13.3 C 10 17 6.5 20.5 2 18.5",
6
+ "M9.1 3.9 L1.9 4.0 L1.5 10.5 C 3.0 8.8 8.5 9.2 9.3 13.2 C 9.8 16.9 6.3 20.5 1.8 18.5",
7
+ "M9.0 4.2 L2.2 4.0 L1.3 10.3 C 3.0 9.0 8.6 9.2 9.5 13.3 C 10.0 17.0 6.4 20.7 1.9 18.4",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "6", 3 wobble variants. */
3
+ export declare const digit6: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "6", 3 wobble variants. */
2
+ export const digit6 = {
3
+ width: 11,
4
+ variants: [
5
+ "M9 5 C 5.5 4 1.5 7 1.5 13 C 1.5 18 4 20.7 6.3 20.5 C 9 20.3 10 17.5 9.8 15 C 9.5 12 6.5 11 4 12 C 2 12.8 1.5 15 1.5 15",
6
+ "M9.1 4.9 C 5.6 3.9 1.4 7.1 1.3 13.1 C 1.7 18.2 4.0 20.7 6.4 20.7 C 8.8 20.1 9.9 17.3 9.8 15.1 C 9.6 12.1 6.3 11.1 3.9 12.1 C 2.1 12.9 1.3 15.0 1.6 14.9",
7
+ "M8.8 4.9 C 5.3 4.1 1.3 7.0 1.7 12.8 C 1.3 18.2 3.9 20.6 6.3 20.6 C 9.2 20.5 10.2 17.4 10.0 15.2 C 9.5 12.0 6.5 11.0 4.0 12.1 C 1.9 12.9 1.6 15.1 1.6 15.0",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "7", 3 wobble variants. */
3
+ export declare const digit7: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "7", 3 wobble variants. */
2
+ export const digit7 = {
3
+ width: 11,
4
+ variants: [
5
+ "M1.5 4 L10 4 L4 20",
6
+ "M1.6 3.8 L10.0 4.1 L4.2 20.1",
7
+ "M1.6 4.0 L10.0 3.8 L3.8 19.8",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "8", 3 wobble variants. */
3
+ export declare const digit8: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "8", 3 wobble variants. */
2
+ export const digit8 = {
3
+ width: 12,
4
+ variants: [
5
+ "M5.5 4 C 8 4 9 5.8 9 7.3 C 9 9.5 6.5 11 5.5 11.5 C 4.5 11 2 9.5 2 7.3 C 2 5.8 3 4 5.5 4 M5.5 11.5 C 3.5 12 1 13.8 1 16.5 C 1 19 3 20.7 5.5 20.7 C 8 20.7 10 19 10 16.5 C 10 13.8 7.5 12 5.5 11.5",
6
+ "M5.3 4.0 C 7.9 4.2 8.9 5.8 8.9 7.2 C 9.1 9.7 6.4 10.8 5.3 11.7 C 4.6 10.8 1.9 9.7 1.9 7.5 C 1.9 5.8 3.0 3.8 5.4 4.0 M5.5 11.7 C 3.4 12.1 0.8 13.7 1.2 16.3 C 0.8 19.2 2.8 20.8 5.4 20.7 C 7.8 20.9 9.8 19.0 9.8 16.4 C 10.2 13.8 7.5 12.0 5.3 11.7",
7
+ "M5.3 3.9 C 7.8 3.8 9.0 5.8 9.0 7.1 C 8.9 9.7 6.6 11.1 5.4 11.6 C 4.5 11.1 2.1 9.4 1.9 7.3 C 2.0 5.7 3.1 4.0 5.6 3.9 M5.5 11.7 C 3.5 12.0 1.2 13.9 1.2 16.5 C 1.1 19.1 3.1 20.6 5.3 20.6 C 8.1 20.8 9.9 18.8 9.8 16.7 C 10.1 13.6 7.5 11.9 5.5 11.5",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline digit "9", 3 wobble variants. */
3
+ export declare const digit9: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline digit "9", 3 wobble variants. */
2
+ export const digit9 = {
3
+ width: 11,
4
+ variants: [
5
+ "M9.5 13 C 9.5 8 7 5.3 4.7 5.5 C 2 5.7 1 8.5 1.2 11 C 1.5 14 4.5 15 7 14 C 9 13.2 9.5 11 9.5 11 C 9.5 11 9.7 16 8 18.5 C 6.7 20.3 3.5 20.5 1.5 19",
6
+ "M9.5 12.9 C 9.7 8.0 7.1 5.1 4.9 5.6 C 2.0 5.6 1.0 8.3 1.2 11.2 C 1.5 14.0 4.6 14.9 7.2 14.1 C 8.9 13.1 9.6 11.0 9.6 11.0 C 9.3 11.2 9.5 16.2 8.1 18.5 C 6.9 20.3 3.7 20.5 1.4 19.0",
7
+ "M9.3 13.2 C 9.6 7.8 7.2 5.1 4.8 5.3 C 2.0 5.8 1.1 8.6 1.0 11.2 C 1.4 13.8 4.5 15.1 7.0 14.0 C 8.9 13.1 9.6 11.1 9.6 10.8 C 9.3 10.8 9.8 16.2 7.9 18.4 C 6.6 20.3 3.6 20.4 1.5 19.1",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphDatabase } from "./types.js";
2
+ export type { GlyphEntry, GlyphDatabase } from "./types.js";
3
+ export declare const glyphs: GlyphDatabase;
@@ -0,0 +1,138 @@
1
+ import { letterA } from "./letters/letter-a.js";
2
+ import { letterAUpper } from "./letters/letter-a-upper.js";
3
+ import { letterB } from "./letters/letter-b.js";
4
+ import { letterBUpper } from "./letters/letter-b-upper.js";
5
+ import { letterC } from "./letters/letter-c.js";
6
+ import { letterCUpper } from "./letters/letter-c-upper.js";
7
+ import { letterD } from "./letters/letter-d.js";
8
+ import { letterDUpper } from "./letters/letter-d-upper.js";
9
+ import { letterE } from "./letters/letter-e.js";
10
+ import { letterEUpper } from "./letters/letter-e-upper.js";
11
+ import { letterF } from "./letters/letter-f.js";
12
+ import { letterFUpper } from "./letters/letter-f-upper.js";
13
+ import { letterG } from "./letters/letter-g.js";
14
+ import { letterGUpper } from "./letters/letter-g-upper.js";
15
+ import { letterH } from "./letters/letter-h.js";
16
+ import { letterHUpper } from "./letters/letter-h-upper.js";
17
+ import { letterI } from "./letters/letter-i.js";
18
+ import { letterIUpper } from "./letters/letter-i-upper.js";
19
+ import { letterJ } from "./letters/letter-j.js";
20
+ import { letterJUpper } from "./letters/letter-j-upper.js";
21
+ import { letterK } from "./letters/letter-k.js";
22
+ import { letterKUpper } from "./letters/letter-k-upper.js";
23
+ import { letterL } from "./letters/letter-l.js";
24
+ import { letterLUpper } from "./letters/letter-l-upper.js";
25
+ import { letterM } from "./letters/letter-m.js";
26
+ import { letterMUpper } from "./letters/letter-m-upper.js";
27
+ import { letterN } from "./letters/letter-n.js";
28
+ import { letterNUpper } from "./letters/letter-n-upper.js";
29
+ import { letterO } from "./letters/letter-o.js";
30
+ import { letterOUpper } from "./letters/letter-o-upper.js";
31
+ import { letterP } from "./letters/letter-p.js";
32
+ import { letterPUpper } from "./letters/letter-p-upper.js";
33
+ import { letterQ } from "./letters/letter-q.js";
34
+ import { letterQUpper } from "./letters/letter-q-upper.js";
35
+ import { letterR } from "./letters/letter-r.js";
36
+ import { letterRUpper } from "./letters/letter-r-upper.js";
37
+ import { letterS } from "./letters/letter-s.js";
38
+ import { letterSUpper } from "./letters/letter-s-upper.js";
39
+ import { letterT } from "./letters/letter-t.js";
40
+ import { letterTUpper } from "./letters/letter-t-upper.js";
41
+ import { letterU } from "./letters/letter-u.js";
42
+ import { letterUUpper } from "./letters/letter-u-upper.js";
43
+ import { letterV } from "./letters/letter-v.js";
44
+ import { letterVUpper } from "./letters/letter-v-upper.js";
45
+ import { letterW } from "./letters/letter-w.js";
46
+ import { letterWUpper } from "./letters/letter-w-upper.js";
47
+ import { letterX } from "./letters/letter-x.js";
48
+ import { letterXUpper } from "./letters/letter-x-upper.js";
49
+ import { letterY } from "./letters/letter-y.js";
50
+ import { letterYUpper } from "./letters/letter-y-upper.js";
51
+ import { letterZ } from "./letters/letter-z.js";
52
+ import { letterZUpper } from "./letters/letter-z-upper.js";
53
+ import { digit0 } from "./digits/digit-0.js";
54
+ import { digit1 } from "./digits/digit-1.js";
55
+ import { digit2 } from "./digits/digit-2.js";
56
+ import { digit3 } from "./digits/digit-3.js";
57
+ import { digit4 } from "./digits/digit-4.js";
58
+ import { digit5 } from "./digits/digit-5.js";
59
+ import { digit6 } from "./digits/digit-6.js";
60
+ import { digit7 } from "./digits/digit-7.js";
61
+ import { digit8 } from "./digits/digit-8.js";
62
+ import { digit9 } from "./digits/digit-9.js";
63
+ import { punctPeriod } from "./punctuation/punct-period.js";
64
+ import { punctComma } from "./punctuation/punct-comma.js";
65
+ import { punctExclamation } from "./punctuation/punct-exclamation.js";
66
+ import { punctQuestion } from "./punctuation/punct-question.js";
67
+ import { punctApostrophe } from "./punctuation/punct-apostrophe.js";
68
+ import { punctHyphen } from "./punctuation/punct-hyphen.js";
69
+ export const glyphs = {
70
+ "A": letterAUpper,
71
+ "a": letterA,
72
+ "B": letterBUpper,
73
+ "b": letterB,
74
+ "C": letterCUpper,
75
+ "c": letterC,
76
+ "D": letterDUpper,
77
+ "d": letterD,
78
+ "E": letterEUpper,
79
+ "e": letterE,
80
+ "F": letterFUpper,
81
+ "f": letterF,
82
+ "G": letterGUpper,
83
+ "g": letterG,
84
+ "H": letterHUpper,
85
+ "h": letterH,
86
+ "I": letterIUpper,
87
+ "i": letterI,
88
+ "J": letterJUpper,
89
+ "j": letterJ,
90
+ "K": letterKUpper,
91
+ "k": letterK,
92
+ "L": letterLUpper,
93
+ "l": letterL,
94
+ "M": letterMUpper,
95
+ "m": letterM,
96
+ "N": letterNUpper,
97
+ "n": letterN,
98
+ "O": letterOUpper,
99
+ "o": letterO,
100
+ "P": letterPUpper,
101
+ "p": letterP,
102
+ "Q": letterQUpper,
103
+ "q": letterQ,
104
+ "R": letterRUpper,
105
+ "r": letterR,
106
+ "S": letterSUpper,
107
+ "s": letterS,
108
+ "T": letterTUpper,
109
+ "t": letterT,
110
+ "U": letterUUpper,
111
+ "u": letterU,
112
+ "V": letterVUpper,
113
+ "v": letterV,
114
+ "W": letterWUpper,
115
+ "w": letterW,
116
+ "X": letterXUpper,
117
+ "x": letterX,
118
+ "Y": letterYUpper,
119
+ "y": letterY,
120
+ "Z": letterZUpper,
121
+ "z": letterZ,
122
+ "0": digit0,
123
+ "1": digit1,
124
+ "2": digit2,
125
+ "3": digit3,
126
+ "4": digit4,
127
+ "5": digit5,
128
+ "6": digit6,
129
+ "7": digit7,
130
+ "8": digit8,
131
+ "9": digit9,
132
+ ".": punctPeriod,
133
+ ",": punctComma,
134
+ "!": punctExclamation,
135
+ "?": punctQuestion,
136
+ "'": punctApostrophe,
137
+ "-": punctHyphen,
138
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: two legs meeting at an apex, plus a crossbar. */
3
+ export declare const letterAUpper: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: two legs meeting at an apex, plus a crossbar. */
2
+ export const letterAUpper = {
3
+ width: 16,
4
+ variants: [
5
+ "M1 20 L8 5 L15 20 M3.8 14 L12.2 14",
6
+ "M0.8 19.8 L8.2 4.8 L15.2 19.9 M3.9 14.2 L12.4 13.9",
7
+ "M1.2 20.1 L7.8 5.2 L14.8 20.2 M3.6 13.8 L12.0 14.1",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: bowl + stem sharing one connecting point (single-story "a"). */
3
+ export declare const letterA: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: bowl + stem sharing one connecting point (single-story "a"). */
2
+ export const letterA = {
3
+ width: 13,
4
+ variants: [
5
+ "M11 9 C 9 6.5 5 6.5 3 9.5 C 1.5 12 1.5 16 4 18.5 C 6 20.5 9.5 20 11 17.5 L 11 9 L 11 20",
6
+ "M10.8 8.8 C 8.6 6.3 4.9 6.7 3.1 9.7 C 1.6 12.2 1.7 16.1 4.2 18.6 C 6.1 20.4 9.4 19.9 10.9 17.4 L 10.8 8.8 L 11.1 20.1",
7
+ "M11.2 9.3 C 9.4 6.7 5.1 6.4 3.0 9.4 C 1.4 11.9 1.9 15.9 4.3 18.4 C 6.0 20.3 9.6 20.2 11.1 17.7 L 11.2 9.3 L 10.9 19.8",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "B" (uppercase), 3 wobble variants. */
3
+ export declare const letterBUpper: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline "B" (uppercase), 3 wobble variants. */
2
+ export const letterBUpper = {
3
+ width: 12,
4
+ variants: [
5
+ "M2 4 L2 20 M2 4 C 7 4 8.5 6.3 8.5 8.3 C 8.5 10.3 7 12 2 12 M2 12 C 8.3 12 10 14.8 10 16.8 C 10 18.8 8.3 20 2 20",
6
+ "M2.1 3.9 L1.9 19.9 M1.8 3.9 C 7.1 4.1 8.3 6.1 8.5 8.4 C 8.3 10.1 7.0 12.0 2.0 12.1 M2.0 12.1 C 8.1 12.2 10.0 14.8 10.1 16.6 C 10.0 18.7 8.1 19.9 2.0 20.1",
7
+ "M1.9 4.2 L1.8 20.0 M2.1 4.1 C 7.2 4.0 8.6 6.3 8.6 8.4 C 8.5 10.3 7.2 12.0 2.1 12.0 M1.8 12.2 C 8.1 12.0 10.2 15.0 10.2 16.9 C 10.2 18.8 8.5 20.0 2.1 19.8",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "b", 3 wobble variants. */
3
+ export declare const letterB: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline "b", 3 wobble variants. */
2
+ export const letterB = {
3
+ width: 12,
4
+ variants: [
5
+ "M2 3 L2 20 M2 12 C 6 10 10.5 12.5 10.5 16 C 10.5 19.5 6 21 2 19",
6
+ "M1.8 2.8 L2.2 19.9 M1.9 11.8 C 6.1 10.2 10.7 12.3 10.4 15.8 C 10.6 19.5 5.8 21.2 2.1 19.2",
7
+ "M2.0 3.2 L2.2 20.0 M1.9 11.8 C 6.2 10.0 10.6 12.6 10.3 15.9 C 10.7 19.3 5.9 20.9 1.9 19.1",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "C" (uppercase), 3 wobble variants. */
3
+ export declare const letterCUpper: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline "C" (uppercase), 3 wobble variants. */
2
+ export const letterCUpper = {
3
+ width: 12,
4
+ variants: [
5
+ "M10.5 8 C 8.5 5 3.5 5 1.5 8.5 C 0 11.5 0 15.5 1.5 18.5 C 3.5 21.2 8.5 21 10.5 18",
6
+ "M10.3 8.1 C 8.3 4.8 3.7 4.9 1.4 8.6 C -0.1 11.7 0.0 15.4 1.6 18.4 C 3.3 21.1 8.5 21.2 10.4 18.0",
7
+ "M10.5 8.0 C 8.7 4.9 3.4 4.9 1.7 8.3 C 0.1 11.4 -0.2 15.7 1.5 18.5 C 3.4 21.2 8.6 21.2 10.7 18.0",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "c", 3 wobble variants. */
3
+ export declare const letterC: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline "c", 3 wobble variants. */
2
+ export const letterC = {
3
+ width: 11,
4
+ variants: [
5
+ "M9 9 C 6.5 6.5 2.5 7 1 10.5 C -0.2 13.5 0.3 17 3 19 C 5.5 20.7 8.5 20 9.5 17.5",
6
+ "M9.2 8.9 C 6.7 6.5 2.3 7.1 0.8 10.7 C 0.0 13.3 0.4 17.1 3.1 19.0 C 5.5 20.6 8.4 20.0 9.7 17.3",
7
+ "M9.1 9.0 C 6.4 6.7 2.3 7.2 1.2 10.4 C -0.0 13.3 0.2 17.2 3.1 18.8 C 5.4 20.9 8.7 19.9 9.6 17.6",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "D" (uppercase), 3 wobble variants. */
3
+ export declare const letterDUpper: GlyphEntry;
@@ -0,0 +1,9 @@
1
+ /** Real hand-drawn glyph: monoline "D" (uppercase), 3 wobble variants. */
2
+ export const letterDUpper = {
3
+ width: 13,
4
+ variants: [
5
+ "M2 4 L2 20 M2 4 C 8 4 11 8 11 12 C 11 16 8 20 2 20",
6
+ "M2.1 3.9 L2.0 19.9 M2.1 4.1 C 7.9 4.2 11.0 8.0 11.0 12.2 C 10.9 15.9 8.1 20.2 2.0 19.9",
7
+ "M1.9 4.1 L1.9 19.9 M1.9 4.1 C 7.9 4.1 11.0 8.1 11.2 11.8 C 10.9 16.0 8.2 19.9 2.0 20.1",
8
+ ],
9
+ };
@@ -0,0 +1,3 @@
1
+ import type { GlyphEntry } from "../types.js";
2
+ /** Real hand-drawn glyph: monoline "d", 3 wobble variants. */
3
+ export declare const letterD: GlyphEntry;