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.
- package/README.md +211 -0
- package/dist/glyphs/digits/digit-0.d.ts +3 -0
- package/dist/glyphs/digits/digit-0.js +9 -0
- package/dist/glyphs/digits/digit-1.d.ts +3 -0
- package/dist/glyphs/digits/digit-1.js +9 -0
- package/dist/glyphs/digits/digit-2.d.ts +3 -0
- package/dist/glyphs/digits/digit-2.js +9 -0
- package/dist/glyphs/digits/digit-3.d.ts +3 -0
- package/dist/glyphs/digits/digit-3.js +9 -0
- package/dist/glyphs/digits/digit-4.d.ts +3 -0
- package/dist/glyphs/digits/digit-4.js +9 -0
- package/dist/glyphs/digits/digit-5.d.ts +3 -0
- package/dist/glyphs/digits/digit-5.js +9 -0
- package/dist/glyphs/digits/digit-6.d.ts +3 -0
- package/dist/glyphs/digits/digit-6.js +9 -0
- package/dist/glyphs/digits/digit-7.d.ts +3 -0
- package/dist/glyphs/digits/digit-7.js +9 -0
- package/dist/glyphs/digits/digit-8.d.ts +3 -0
- package/dist/glyphs/digits/digit-8.js +9 -0
- package/dist/glyphs/digits/digit-9.d.ts +3 -0
- package/dist/glyphs/digits/digit-9.js +9 -0
- package/dist/glyphs/glyphs.d.ts +3 -0
- package/dist/glyphs/glyphs.js +138 -0
- package/dist/glyphs/letters/letter-a-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-a-upper.js +9 -0
- package/dist/glyphs/letters/letter-a.d.ts +3 -0
- package/dist/glyphs/letters/letter-a.js +9 -0
- package/dist/glyphs/letters/letter-b-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-b-upper.js +9 -0
- package/dist/glyphs/letters/letter-b.d.ts +3 -0
- package/dist/glyphs/letters/letter-b.js +9 -0
- package/dist/glyphs/letters/letter-c-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-c-upper.js +9 -0
- package/dist/glyphs/letters/letter-c.d.ts +3 -0
- package/dist/glyphs/letters/letter-c.js +9 -0
- package/dist/glyphs/letters/letter-d-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-d-upper.js +9 -0
- package/dist/glyphs/letters/letter-d.d.ts +3 -0
- package/dist/glyphs/letters/letter-d.js +9 -0
- package/dist/glyphs/letters/letter-e-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-e-upper.js +9 -0
- package/dist/glyphs/letters/letter-e.d.ts +3 -0
- package/dist/glyphs/letters/letter-e.js +9 -0
- package/dist/glyphs/letters/letter-f-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-f-upper.js +9 -0
- package/dist/glyphs/letters/letter-f.d.ts +3 -0
- package/dist/glyphs/letters/letter-f.js +9 -0
- package/dist/glyphs/letters/letter-g-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-g-upper.js +9 -0
- package/dist/glyphs/letters/letter-g.d.ts +3 -0
- package/dist/glyphs/letters/letter-g.js +9 -0
- package/dist/glyphs/letters/letter-h-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-h-upper.js +9 -0
- package/dist/glyphs/letters/letter-h.d.ts +3 -0
- package/dist/glyphs/letters/letter-h.js +9 -0
- package/dist/glyphs/letters/letter-i-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-i-upper.js +9 -0
- package/dist/glyphs/letters/letter-i.d.ts +3 -0
- package/dist/glyphs/letters/letter-i.js +9 -0
- package/dist/glyphs/letters/letter-j-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-j-upper.js +9 -0
- package/dist/glyphs/letters/letter-j.d.ts +3 -0
- package/dist/glyphs/letters/letter-j.js +9 -0
- package/dist/glyphs/letters/letter-k-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-k-upper.js +9 -0
- package/dist/glyphs/letters/letter-k.d.ts +3 -0
- package/dist/glyphs/letters/letter-k.js +9 -0
- package/dist/glyphs/letters/letter-l-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-l-upper.js +9 -0
- package/dist/glyphs/letters/letter-l.d.ts +3 -0
- package/dist/glyphs/letters/letter-l.js +9 -0
- package/dist/glyphs/letters/letter-m-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-m-upper.js +9 -0
- package/dist/glyphs/letters/letter-m.d.ts +3 -0
- package/dist/glyphs/letters/letter-m.js +9 -0
- package/dist/glyphs/letters/letter-n-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-n-upper.js +9 -0
- package/dist/glyphs/letters/letter-n.d.ts +3 -0
- package/dist/glyphs/letters/letter-n.js +9 -0
- package/dist/glyphs/letters/letter-o-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-o-upper.js +9 -0
- package/dist/glyphs/letters/letter-o.d.ts +3 -0
- package/dist/glyphs/letters/letter-o.js +9 -0
- package/dist/glyphs/letters/letter-p-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-p-upper.js +9 -0
- package/dist/glyphs/letters/letter-p.d.ts +3 -0
- package/dist/glyphs/letters/letter-p.js +9 -0
- package/dist/glyphs/letters/letter-q-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-q-upper.js +9 -0
- package/dist/glyphs/letters/letter-q.d.ts +3 -0
- package/dist/glyphs/letters/letter-q.js +9 -0
- package/dist/glyphs/letters/letter-r-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-r-upper.js +9 -0
- package/dist/glyphs/letters/letter-r.d.ts +3 -0
- package/dist/glyphs/letters/letter-r.js +9 -0
- package/dist/glyphs/letters/letter-s-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-s-upper.js +9 -0
- package/dist/glyphs/letters/letter-s.d.ts +3 -0
- package/dist/glyphs/letters/letter-s.js +9 -0
- package/dist/glyphs/letters/letter-t-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-t-upper.js +9 -0
- package/dist/glyphs/letters/letter-t.d.ts +3 -0
- package/dist/glyphs/letters/letter-t.js +9 -0
- package/dist/glyphs/letters/letter-u-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-u-upper.js +9 -0
- package/dist/glyphs/letters/letter-u.d.ts +3 -0
- package/dist/glyphs/letters/letter-u.js +9 -0
- package/dist/glyphs/letters/letter-v-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-v-upper.js +9 -0
- package/dist/glyphs/letters/letter-v.d.ts +3 -0
- package/dist/glyphs/letters/letter-v.js +9 -0
- package/dist/glyphs/letters/letter-w-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-w-upper.js +9 -0
- package/dist/glyphs/letters/letter-w.d.ts +3 -0
- package/dist/glyphs/letters/letter-w.js +9 -0
- package/dist/glyphs/letters/letter-x-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-x-upper.js +9 -0
- package/dist/glyphs/letters/letter-x.d.ts +3 -0
- package/dist/glyphs/letters/letter-x.js +9 -0
- package/dist/glyphs/letters/letter-y-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-y-upper.js +9 -0
- package/dist/glyphs/letters/letter-y.d.ts +3 -0
- package/dist/glyphs/letters/letter-y.js +9 -0
- package/dist/glyphs/letters/letter-z-upper.d.ts +3 -0
- package/dist/glyphs/letters/letter-z-upper.js +9 -0
- package/dist/glyphs/letters/letter-z.d.ts +3 -0
- package/dist/glyphs/letters/letter-z.js +9 -0
- package/dist/glyphs/punctuation/punct-apostrophe.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-apostrophe.js +9 -0
- package/dist/glyphs/punctuation/punct-comma.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-comma.js +9 -0
- package/dist/glyphs/punctuation/punct-exclamation.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-exclamation.js +9 -0
- package/dist/glyphs/punctuation/punct-hyphen.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-hyphen.js +9 -0
- package/dist/glyphs/punctuation/punct-period.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-period.js +9 -0
- package/dist/glyphs/punctuation/punct-question.d.ts +3 -0
- package/dist/glyphs/punctuation/punct-question.js +9 -0
- package/dist/glyphs/types.d.ts +5 -0
- package/dist/glyphs/types.js +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +16 -0
- package/dist/observer.d.ts +8 -0
- package/dist/observer.js +17 -0
- package/dist/renderer.d.ts +12 -0
- package/dist/renderer.js +98 -0
- 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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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
|
+
};
|