glideshow 0.1.2__py3-none-any.whl
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.
- glideshow/__init__.py +15 -0
- glideshow/__main__.py +3 -0
- glideshow/agent.py +681 -0
- glideshow/build.py +54 -0
- glideshow/cli.py +320 -0
- glideshow/comments.py +35 -0
- glideshow/decks.py +230 -0
- glideshow/docs/agents.md +223 -0
- glideshow/docs/deck-format.md +125 -0
- glideshow/editor/.assetsignore +5 -0
- glideshow/editor/apple-touch-icon.png +0 -0
- glideshow/editor/data/font-metrics.json +1 -0
- glideshow/editor/data/fonts.json +1 -0
- glideshow/editor/data/icons.json +1 -0
- glideshow/editor/data/symbols.js +42 -0
- glideshow/editor/data/themes.js +15 -0
- glideshow/editor/deck/base.css +92 -0
- glideshow/editor/deck/present.js +222 -0
- glideshow/editor/deck/shapes.js +377 -0
- glideshow/editor/deck/template.html +37 -0
- glideshow/editor/editor.css +657 -0
- glideshow/editor/glideshow-1024.png +0 -0
- glideshow/editor/glideshow.svg +10 -0
- glideshow/editor/globals.d.ts +21 -0
- glideshow/editor/home.html +358 -0
- glideshow/editor/index.html +386 -0
- glideshow/editor/js/arrange.js +122 -0
- glideshow/editor/js/boot.js +66 -0
- glideshow/editor/js/boxes.js +25 -0
- glideshow/editor/js/comments.js +85 -0
- glideshow/editor/js/context-menus.js +93 -0
- glideshow/editor/js/dialogs.js +168 -0
- glideshow/editor/js/dock.js +22 -0
- glideshow/editor/js/draw.js +107 -0
- glideshow/editor/js/file.js +318 -0
- glideshow/editor/js/find.js +72 -0
- glideshow/editor/js/format-panel.js +101 -0
- glideshow/editor/js/geometry.js +153 -0
- glideshow/editor/js/guides.js +37 -0
- glideshow/editor/js/insert.js +73 -0
- glideshow/editor/js/keyboard.js +256 -0
- glideshow/editor/js/live.js +48 -0
- glideshow/editor/js/menubar.js +290 -0
- glideshow/editor/js/menus.js +93 -0
- glideshow/editor/js/motion.js +148 -0
- glideshow/editor/js/notes.js +63 -0
- glideshow/editor/js/objects.js +202 -0
- glideshow/editor/js/people.js +73 -0
- glideshow/editor/js/phone-comments.js +43 -0
- glideshow/editor/js/phone-edit.js +253 -0
- glideshow/editor/js/phone-home.js +51 -0
- glideshow/editor/js/phone-mode.js +73 -0
- glideshow/editor/js/phone-sheets.js +153 -0
- glideshow/editor/js/phone-touch.js +145 -0
- glideshow/editor/js/phone-view.js +150 -0
- glideshow/editor/js/pointer.js +407 -0
- glideshow/editor/js/render.js +353 -0
- glideshow/editor/js/shortcuts.js +67 -0
- glideshow/editor/js/slides.js +120 -0
- glideshow/editor/js/spacing.js +23 -0
- glideshow/editor/js/state.js +58 -0
- glideshow/editor/js/storage.js +250 -0
- glideshow/editor/js/text.js +366 -0
- glideshow/editor/js/theme-toggle.js +41 -0
- glideshow/editor/js/theme.js +173 -0
- glideshow/editor/js/toolbar-groups.js +109 -0
- glideshow/editor/js/toolbar.js +372 -0
- glideshow/editor/lib/browser-db.js +47 -0
- glideshow/editor/lib/library.js +612 -0
- glideshow/editor/lib/merge.js +174 -0
- glideshow/editor/lib/move-local.js +51 -0
- glideshow/editor/lib/onefile.js +108 -0
- glideshow/editor/lib/store-browser.js +75 -0
- glideshow/editor/lib/store-folder.js +109 -0
- glideshow/editor/local/sw.js +66 -0
- glideshow/editor/local/tsconfig.json +5 -0
- glideshow/editor/looks/glider.svg +9 -0
- glideshow/editor/looks/thermal-phone.css +144 -0
- glideshow/editor/looks/thermal.css +268 -0
- glideshow/editor/manifest.json +23 -0
- glideshow/editor/phone.css +345 -0
- glideshow/editor/share/share.css +124 -0
- glideshow/editor/share/share.js +256 -0
- glideshow/editor/share/speaker.html +88 -0
- glideshow/editor/tsconfig.json +6 -0
- glideshow/figure.py +33 -0
- glideshow/fonts.py +63 -0
- glideshow/gslides.py +1065 -0
- glideshow/history.py +210 -0
- glideshow/merge.py +210 -0
- glideshow/osutil.py +44 -0
- glideshow/pptx_export.py +207 -0
- glideshow/pptx_import.py +115 -0
- glideshow/publish.py +106 -0
- glideshow/render.py +288 -0
- glideshow/server.py +549 -0
- glideshow/service.py +65 -0
- glideshow/skills/glideshow/SKILL.md +85 -0
- glideshow-0.1.2.dist-info/METADATA +69 -0
- glideshow-0.1.2.dist-info/RECORD +103 -0
- glideshow-0.1.2.dist-info/WHEEL +4 -0
- glideshow-0.1.2.dist-info/entry_points.txt +2 -0
- glideshow-0.1.2.dist-info/licenses/LICENSE +662 -0
glideshow/docs/agents.md
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Writing slides as an agent
|
|
2
|
+
|
|
3
|
+
A deck is one folder: `deck.html` (reveal.js) plus `assets/`. Every slide is a `<section>` inside `<div class="slides">`;
|
|
4
|
+
everything on it is an absolutely positioned `<div class="box">` whose inline `left / top / width / height` are px on a
|
|
5
|
+
1920 × 1080 canvas (192 px = 1 in, 1 pt = 2.667 px). The full attribute reference is `glideshow docs reference` (the
|
|
6
|
+
**Deck format** section of AGENTS.md).
|
|
7
|
+
|
|
8
|
+
`deck.html` also carries about 180 KB of inlined CSS and JS: don't read it. Read a deck with `glideshow slides <deck>
|
|
9
|
+
--outline` (one line per slide: its layout, title, and each box's id and first words), then `glideshow slides <deck> N`
|
|
10
|
+
for the slides you change. Write slides with `glideshow put` (below): it sends only the `<section>`, checks it, and
|
|
11
|
+
writes `deck.html` in one go; the editor reloads it live and keeps what you write.
|
|
12
|
+
|
|
13
|
+
**Slide numbers.** N is a slide's number in the file (1, 2, 3 …, a stack's sub-slides counted in order). The editor
|
|
14
|
+
numbers a stack's sub-slides 8.1, 8.2; every command takes that form too (`glideshow slides <deck> 8.1`), and the
|
|
15
|
+
outline and `check` show both where they differ (`9 = 8.1`).
|
|
16
|
+
|
|
17
|
+
## The commands you need
|
|
18
|
+
|
|
19
|
+
| command | what it does |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `glideshow new "Title" --no-open` | makes `~/decks/<slug>-<date>/` from the template and prints the folder; the user's editor is left alone |
|
|
22
|
+
| `glideshow find <words>` | prints the folder of the deck that best matches; nothing is opened |
|
|
23
|
+
| `glideshow slides <deck> --outline` | one line per slide: its number, layout, title, each box's id and first words, notes for you in full |
|
|
24
|
+
| `glideshow slides <deck> [N …]` | those slides' HTML (numbered, with their line in `deck.html`) |
|
|
25
|
+
| `glideshow put <deck> N` | replaces slide N with the `<section>`s on stdin; `--after N` inserts (0: first), `--delete N …` removes, `--all` replaces every slide |
|
|
26
|
+
| `glideshow layout [NAME]` | the layouts' exact placeholder boxes; with a name, a slide in that layout to fill in |
|
|
27
|
+
| `glideshow check <deck> [N …]` | only the problems, in about two seconds; exit status 1 when there are any |
|
|
28
|
+
| `glideshow render <deck> [N …]` | each slide as a 960 × 540 PNG (one path per line; `--full`: 1920 × 1080), then the problems |
|
|
29
|
+
| `glideshow render <deck> --sheet` | nine slides to a picture, each labelled with its number: a whole deck in a few pictures |
|
|
30
|
+
| `glideshow figure add <deck> <png> --slide N` | places a picture (or `--replace <id>` swaps one in place), recording `--source "<command>"` |
|
|
31
|
+
| `glideshow figure size <deck> --slide N` | the figure size that fits that space exactly, a script to start from, and the deck's `deck.mplstyle` |
|
|
32
|
+
| `glideshow figure refresh <deck> [id …]` | re-runs each figure's recorded command and puts the new picture in place |
|
|
33
|
+
| `glideshow selection` | what the user is looking at and has selected in the editor (exit 1 if no editor window reports) |
|
|
34
|
+
| `glideshow comments <deck>` | the open comments, each on the slide it's on now |
|
|
35
|
+
| `glideshow stop` | stops the background server |
|
|
36
|
+
|
|
37
|
+
`render` and `check` show each slide as it looks after its last build step (transitions and Morph off), and report: text
|
|
38
|
+
spilling out of its box, code cut off, boxes reaching off the slide, text overlapping other text (a label inside a shape
|
|
39
|
+
with words of its own too), text partly over a picture or crossed by a line, text under 24 px or hard to see against its
|
|
40
|
+
background, pictures that didn't load, lack alt text or are squeezed into a box of another shape, boxes without ids or
|
|
41
|
+
with duplicate ids, lines attached to boxes that aren't there (or to a side that isn't t/r/b/l), Morph pairings with no
|
|
42
|
+
partner, notes for the AI still on a slide, and broken structure (a `<div>` or `<section>` left open or closed twice).
|
|
43
|
+
Inside a figure saved with `glideshow.figure.save` they also report labels that overlap or are cut off at its edge, text
|
|
44
|
+
under 24 px on the slide and characters its font lacks. Fix what they report, then look: `render <deck> --sheet` for the
|
|
45
|
+
whole deck (balance, alignment), single slides only for the ones you changed.
|
|
46
|
+
|
|
47
|
+
**Versions.** `glideshow new --no-open`, `slides`, `put` and `figure add / refresh` start the background server if it isn't
|
|
48
|
+
running (nothing opens). It commits every change you make to a deck as its own version, a few seconds after you stop
|
|
49
|
+
writing, so nothing you do is lost and the user can step back through it.
|
|
50
|
+
|
|
51
|
+
## Working beside the open editor
|
|
52
|
+
|
|
53
|
+
- **"This", "here", "the selected box":** run `glideshow selection` (`--json` for the raw form). It prints the deck the
|
|
54
|
+
editor has open, the slide on show (1-based, stacks counted as slides), how long ago the editor reported it, and each
|
|
55
|
+
selected box: its `id`, its place among the slide's boxes, geometry and text, plus any text selected while editing.
|
|
56
|
+
Change that box (find it by `id`), not a guess. Nothing selected means the whole slide. If it exits 1, no editor window
|
|
57
|
+
is open: ask the user which slide they mean.
|
|
58
|
+
- **Your edit shows up at once:** the editor reloads, goes to the first changed slide (if the one on show didn't change),
|
|
59
|
+
flashes the changed slides in the filmstrip and outlines the changed boxes. `put` writes the whole file in one go; if you
|
|
60
|
+
write `deck.html` yourself, do the same (a temporary file renamed over it), not piece by piece.
|
|
61
|
+
- **The user can take it back:** your edit is one undo step in the editor (⌘Z), and the server commits it as its own
|
|
62
|
+
version (`outside the editor: slide 3: …`) a few seconds after you stop writing, apart from the user's own changes.
|
|
63
|
+
- **The user's unsaved change:** the editor saves when its window loses focus, so what the user just did is on disk
|
|
64
|
+
before you start. If you both change the deck at once, the editor keeps both when they touched different slides.
|
|
65
|
+
- **Comments:** people the deck was shared with (glideshow.org), and the user, leave comments in `comments.json` beside
|
|
66
|
+
`deck.html`: `{"comments": [{"id", "slide", "sid", "box", "quote", "text", "by", "resolved", "replies": [...]}]}`.
|
|
67
|
+
`sid` is the slide's `data-sid` (it finds the slide however slides have moved since), `slide` its number when the
|
|
68
|
+
comment was left, `box` the id it was left on. `glideshow comments <deck>` lists the open ones on the slides they're on
|
|
69
|
+
now. To answer one, make the change, then add a reply and, when it's done, set `"resolved": true` (leave its `slide` and
|
|
70
|
+
`sid` as they are):
|
|
71
|
+
```json
|
|
72
|
+
{"id": "r7k2m9qa", "text": "Added the citation as a footnote on slide 4.", "by": {"n": "Claude"}, "at": "2026-10-15T14:30:00Z"}
|
|
73
|
+
```
|
|
74
|
+
(`id`: 8 random lowercase letters and digits; `at`: ISO 8601 UTC.)
|
|
75
|
+
- **Notes for the AI:** the user can leave a yellow sticky on a slide for you. It is a box with the class `note`:
|
|
76
|
+
```html
|
|
77
|
+
<div class="box note" id="note-1" data-time="2026-10-15T14:02" style="left: 1400px; top: 60px; width: 420px; height: 200px;"><div class="content">Make this plot bigger and drop the legend</div></div>
|
|
78
|
+
```
|
|
79
|
+
Do what each note says, then delete it. `check` lists any left over; the slideshow never shows them.
|
|
80
|
+
|
|
81
|
+
## Layouts
|
|
82
|
+
|
|
83
|
+
Every slide has a layout (`data-layout` on its `<section>`), and the layout's text lives in **placeholder boxes**
|
|
84
|
+
(`data-placeholder` + `data-role` title / sub / body) at exactly these places. Use them for titles and body text, so the
|
|
85
|
+
deck stays consistent and the editor's Layout menu works; put figures, diagrams and other free boxes anywhere else.
|
|
86
|
+
Text sizes come from the theme (`--th-title-size`, `--th-body-size`); don't override them unless you mean to.
|
|
87
|
+
|
|
88
|
+
{{LAYOUTS}}
|
|
89
|
+
|
|
90
|
+
`glideshow layout title-body --prefix results` prints a whole slide in that layout, ready to fill in and `put`, its ids starting
|
|
91
|
+
`results-` (ids must be unique in the whole deck; with `--deck <deck>` it also avoids ids the deck already uses, and
|
|
92
|
+
follows a theme that edits its layouts). Replace each placeholder's text, keep its box, and give every box you add its
|
|
93
|
+
own unique id.
|
|
94
|
+
|
|
95
|
+
**A deck imported from Google Slides** (or any deck whose slides set their own fonts, sizes and colours) doesn't follow
|
|
96
|
+
the theme: its boxes carry their styles inline. To add a slide that matches it, take a layout's places and the deck's
|
|
97
|
+
look from a slide you name: `glideshow layout title-body --prefix summary --deck <deck> --like 4` copies slide 4's title
|
|
98
|
+
and body text styles (font, size, colour, line spacing) into the new placeholders.
|
|
99
|
+
|
|
100
|
+
**Colours.** The default theme (Simple Light) uses titles `#000000`, text `#595959` and a white background; text you add
|
|
101
|
+
inherits them. Accents that sit well with it: blue `#1a73e8` (fill `#e8f0fe`), red `#d93025` (fill `#fce8e6`), green
|
|
102
|
+
`#188038` (fill `#e6f4ea`), yellow `#f9ab00` (fill `#fef7e0`), grey rules `#dadce0`. Shapes take `--fill`, `--stroke`,
|
|
103
|
+
`--sw` (outline width, px).
|
|
104
|
+
|
|
105
|
+
**Sizes.** Keep body text at 24 px (9 pt) or more, at most about six lines of it per slide, one idea per slide.
|
|
106
|
+
|
|
107
|
+
## Recipes
|
|
108
|
+
|
|
109
|
+
**Title and bullets** (from `glideshow layout title-body --prefix results`), added after slide 3:
|
|
110
|
+
```sh
|
|
111
|
+
glideshow put <deck> --after 3 <<'EOF'
|
|
112
|
+
<section data-background-color="#ffffff" data-layout="title-body">
|
|
113
|
+
<div class="box" id="results-title" data-placeholder="Click to add title" data-role="title" data-valign="top" style="left: 65px; top: 93px; width: 1790px; height: 122px;"><div class="content" style="font-size: calc(var(--th-title-size, 74.67px) * 1); text-align: left; padding: 9.6px 19.2px;">Results</div></div>
|
|
114
|
+
<div class="box" id="results-body" data-placeholder="Click to add text" data-role="body" data-valign="top" style="left: 65px; top: 242px; width: 1790px; height: 721px;"><div class="content" style="font-size: calc(var(--th-body-size, 48px) * 1); text-align: left; padding: 9.6px 19.2px;">
|
|
115
|
+
<ul><li>Agents learn the task in 2 k steps</li><li>Transfer holds across seeds</li></ul></div></div>
|
|
116
|
+
</section>
|
|
117
|
+
EOF
|
|
118
|
+
```
|
|
119
|
+
`put` prints the new slide's outline line and the `check` to run. To change a slide, `glideshow slides <deck> N`, edit
|
|
120
|
+
that, and `glideshow put <deck> N` it back (its `data-sid` is kept). It refuses, writing nothing, when a `<div>` isn't
|
|
121
|
+
closed, an id is already used elsewhere in the deck, or a slide carries another slide's `data-sid`. A script that builds
|
|
122
|
+
the whole deck prints its `<section>`s and pipes them into `glideshow put <deck> --all`; don't let it rewrite `deck.html`
|
|
123
|
+
(a pattern that cuts the file at the wrong `</div>` leaves slides outside the deck).
|
|
124
|
+
|
|
125
|
+
**Boxes in a row, a column or a grid** (no pixels to work out): give the boxes the same `data-flow` and leave out their
|
|
126
|
+
`left / top / width / height`; `put` lays them out in the slide's body area, equal sizes 40 px apart, and writes their
|
|
127
|
+
pixels. `data-flow="row"`, `"column"` or `"grid 3"` (3 to a row), then optionally an area (`body`, or `x,y,w,h`) and a
|
|
128
|
+
gap: `data-flow="row 65,400,1790,240 gap 120"`. Boxes with another `data-flow` value form another group. Lines attached
|
|
129
|
+
with `data-from` / `data-to` need no place either.
|
|
130
|
+
```html
|
|
131
|
+
<div class="box" id="p-collect" data-shape="roundrect" data-flow="row 65,400,1790,240 gap 120" style="--fill: #e8f0fe;"><div class="content" style="font-size: 40px;">Collect</div></div>
|
|
132
|
+
<div class="box" id="p-train" data-shape="roundrect" data-flow="row 65,400,1790,240 gap 120" style="--fill: #e8f0fe;"><div class="content" style="font-size: 40px;">Train</div></div>
|
|
133
|
+
<div class="box" id="p-arrow" data-shape="line" data-end="fill-arrow" data-from="p-collect:r" data-to="p-train:l" style="--stroke: #5f6368; --sw: 5px;"><div class="content"></div></div>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Two columns:** `glideshow layout two-columns --prefix compare` (two body placeholders, `compare-body` and `compare-body-2`).
|
|
137
|
+
|
|
138
|
+
**A diagram: nodes and arrows.** Give nodes ids and attach each arrow with `data-from` / `data-to` = `"id:t|r|b|l"` (the
|
|
139
|
+
middle of that side). Attached lines are fitted to their nodes whenever the deck loads, in the editor and the slideshow,
|
|
140
|
+
so move a node and its arrows follow; the geometry you write for the line only matters if an end isn't attached.
|
|
141
|
+
```html
|
|
142
|
+
<div class="box" id="env" data-shape="roundrect" style="left: 160px; top: 440px; width: 400px; height: 200px; --fill: #e8f0fe; --stroke: #1a73e8; --sw: 3px;"><div class="content" style="font-size: 44px;">Environment</div></div>
|
|
143
|
+
<div class="box" id="agent" data-shape="roundrect" style="left: 1360px; top: 440px; width: 400px; height: 200px; --fill: #fce8e6; --stroke: #d93025; --sw: 3px;"><div class="content" style="font-size: 44px;">Agent</div></div>
|
|
144
|
+
<div class="box" id="env-to-agent" data-shape="line" data-end="fill-arrow" data-from="env:r" data-to="agent:l" style="left: 560px; top: 540px; width: 800px; height: 0px; --stroke: #5f6368; --sw: 4px;"><div class="content"></div></div>
|
|
145
|
+
```
|
|
146
|
+
A step-shaped connector is `data-shape="elbow"` (`data-bend` 0..1 slides its middle segment). **A feedback edge** under a
|
|
147
|
+
pipeline (from the bottom of the last node back to the bottom of the first) is an elbow with both ends on the same side:
|
|
148
|
+
it draws a U that runs `data-out` px (default 60) below the lower of them. Write it in the direction it means, from →
|
|
149
|
+
to with the head on `data-end`; Glideshow keeps the left end as `data-from` when it loads the deck, swapping the ends and
|
|
150
|
+
their heads for you:
|
|
151
|
+
```html
|
|
152
|
+
<div class="box" id="sync" data-shape="elbow" data-end="fill-arrow" data-from="learner:b" data-to="actors:b" data-out="80" style="left: 0px; top: 0px; width: 0px; height: 0px; --stroke: #5f6368; --sw: 4px;"><div class="content"></div></div>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**A plot from a script.** Size the figure for its space, save it into the deck's `assets/`, and place it with the command
|
|
156
|
+
that made it, so it can be remade when the data changes:
|
|
157
|
+
```sh
|
|
158
|
+
glideshow figure size <deck> --slide 4 # the figsize that fits the body area exactly, and a script to start from
|
|
159
|
+
uv run src/plot.py --out assets/curves.png # your script (in the deck's folder), from that start
|
|
160
|
+
glideshow figure add <deck> assets/curves.png --slide 4 --id curves --alt "Return over training, 10 seeds" \
|
|
161
|
+
--source "uv run src/plot.py --out {out}"
|
|
162
|
+
glideshow figure refresh <deck> curves # later: new data → re-run, new picture in the same place
|
|
163
|
+
glideshow figure add <deck> other.png --replace curves # or swap in a different picture, keeping the box's place
|
|
164
|
+
```
|
|
165
|
+
The script it starts you on declares its own dependencies (`matplotlib` and `glideshow`, so `uv run` needs no setup),
|
|
166
|
+
uses the deck's `deck.mplstyle` (`figure size` writes it: the theme's font and colours, accents that suit it, sizes that
|
|
167
|
+
read on a slide, and KaTeX's maths font) and saves with `glideshow.figure.save(fig, out)`. That writes the picture at 2×
|
|
168
|
+
the slide's pixels and, beside it, where each piece of its text is (`curves.png.json`), so `check` can see inside it.
|
|
169
|
+
`figure add` keeps the file's name, gives the box an id and alt text, fits the picture into the slide's body area (or
|
|
170
|
+
`--at x,y,w,h`), and records `data-source` (`{out}` stands for the picture's path) and `data-made`. `figure refresh` says
|
|
171
|
+
when a picture came out the same (and leaves the deck alone) and when its font lacks a character. In matplotlib, a
|
|
172
|
+
figure 1 in wide fills 192 px of slide, so a point in the figure is a point on the slide: labels at 12–16 pt read well.
|
|
173
|
+
|
|
174
|
+
**An equation.** Any box: `<div class="content" style="font-size: 48px; text-align: center;">$$\mathcal{L} = -\sum_t \log \pi_\theta(a_t \mid h_{<t})$$</div>`.
|
|
175
|
+
The deck keeps the LaTeX; KaTeX typesets it.
|
|
176
|
+
|
|
177
|
+
**Code.** `<pre><code class="language-python">…</code></pre>` in a box. Code doesn't wrap: make the box wide enough, or the
|
|
178
|
+
lines short or the font smaller (`check` reports code that is cut off).
|
|
179
|
+
|
|
180
|
+
**A callout on an image.** A picture box, then a shape after it (later boxes sit on top), e.g. a `roundcallout` whose tail
|
|
181
|
+
(`data-adj` / `data-adj2`, 0..1 of the box, may be negative) points at the feature, or an `ellipse` with
|
|
182
|
+
`--fill: transparent; --stroke: #d93025; --sw: 6px` around it.
|
|
183
|
+
|
|
184
|
+
**Building a diagram up step by step (Morph).** One slide per step. Each step's boxes have ids unique in the whole deck,
|
|
185
|
+
and each step after the first has `data-auto-animate` and pairs every box that carries over with `data-morph="<its id on
|
|
186
|
+
the slide before>"`; a box with no partner fades in. The first step has no `data-auto-animate`.
|
|
187
|
+
```html
|
|
188
|
+
<section data-layout="title-only">
|
|
189
|
+
<div class="box" id="s1-title" data-placeholder="Click to add title" data-role="title" data-valign="top" style="left: 65px; top: 93px; width: 1790px; height: 122px;"><div class="content" style="font-size: calc(var(--th-title-size, 74.67px) * 1); text-align: left; padding: 9.6px 19.2px;">The pipeline</div></div>
|
|
190
|
+
<div class="box" id="s1-actors" data-shape="roundrect" style="left: 160px; top: 500px; width: 400px; height: 200px;"><div class="content">Actors</div></div>
|
|
191
|
+
</section>
|
|
192
|
+
<section data-layout="title-only" data-auto-animate>
|
|
193
|
+
<div class="box" id="s2-title" data-morph="s1-title" data-placeholder="Click to add title" data-role="title" data-valign="top" style="left: 65px; top: 93px; width: 1790px; height: 122px;"><div class="content" style="font-size: calc(var(--th-title-size, 74.67px) * 1); text-align: left; padding: 9.6px 19.2px;">The pipeline</div></div>
|
|
194
|
+
<div class="box" id="s2-actors" data-morph="s1-actors" data-shape="roundrect" style="left: 160px; top: 500px; width: 400px; height: 200px;"><div class="content">Actors</div></div>
|
|
195
|
+
<div class="box" id="s2-learner" data-shape="roundrect" style="left: 1360px; top: 500px; width: 400px; height: 200px;"><div class="content">Learner</div></div>
|
|
196
|
+
</section>
|
|
197
|
+
```
|
|
198
|
+
A third step pairs with the second's ids (`data-morph="s2-actors"`), and so on. `check` reports pairings with no partner;
|
|
199
|
+
`glideshow render <deck> --morph` lists each step's pairs (what moves, resizes, recolours, fades in or out) and saves a
|
|
200
|
+
picture halfway through each animation.
|
|
201
|
+
|
|
202
|
+
**A table that doesn't fit.** A `.box.table` grows with its rows. Imported tables carry Google's cell padding
|
|
203
|
+
(`padding: 19.2px` on each `<td>`) and font sizes: to make one fit, lower the padding on its cells (a rule in the slide's
|
|
204
|
+
own `<style class="slide-css" media="not all">`, such as `.box.table td { padding: 6px 12px; }`, does every cell at once)
|
|
205
|
+
and its font size, then set the box's height to what `check` says it needs. A table that runs off the bottom of the
|
|
206
|
+
slide (`check`: "runs … off the bottom of the slide") must lose rows or size; a taller box won't help.
|
|
207
|
+
|
|
208
|
+
**A footnote or citation.** A small text box at the foot of the slide, not a superscript in the body (one makes its line
|
|
209
|
+
taller): `<div class="box" id="s4-cite" style="left: 65px; top: 1000px; width: 1790px; height: 50px;"><div class="content" style="font-size: 24px; color: #5f6368;">Tenenbaum et al., 2011</div></div>`.
|
|
210
|
+
Mark the claim with a short `[1]` in the text if there are several.
|
|
211
|
+
|
|
212
|
+
**Speaker notes:** `<aside class="notes">…</aside>` inside the section, after its boxes.
|
|
213
|
+
|
|
214
|
+
## Conventions
|
|
215
|
+
|
|
216
|
+
- Name the deck in `<title>` without a date, and put the date in `<meta name="date" content="YYYY-MM-DD">` (new decks
|
|
217
|
+
get today's).
|
|
218
|
+
- Every box has a unique `id` (`check` reports any without one); ids starting with `ed-` are reserved for the editor.
|
|
219
|
+
- Don't write SVG or `--tx-*` / `--sh*` style variables: they are derived when the deck loads.
|
|
220
|
+
- The editor commits every save to git when the deck is in a repo, so `git log` / `git diff` show what the person
|
|
221
|
+
changed. Don't commit yourself.
|
|
222
|
+
- Your own test library, apart from the user's: `GLIDESHOW_HOME=/tmp/x/decks GLIDESHOW_CACHE=/tmp/x/cache
|
|
223
|
+
GLIDESHOW_PORT=48900 glideshow …` (a server on its own port never finds or replaces the user's).
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
## Deck format
|
|
2
|
+
|
|
3
|
+
The deck's name is its `<title>` and its date (the talk's or meeting's) is `<meta name="date" content="YYYY-MM-DD">` in
|
|
4
|
+
the `<head>`; keep the date out of the title (the home screen shows and sorts by the date).
|
|
5
|
+
|
|
6
|
+
`deck.html` is a normal reveal.js file. Every slide is a 1920×1080 `<section>` whose children are absolutely positioned
|
|
7
|
+
boxes:
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<section data-background-color="#ffffff">
|
|
11
|
+
<div class="box" id="fits-title" style="left: 65px; top: 93px; width: 1790px; height: 122px;">
|
|
12
|
+
<div class="content" style="font-size: 74.67px;">Model fits</div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="box image" id="fits-fig" style="left: 120px; top: 260px; width: 900px; height: 700px;">
|
|
15
|
+
<div class="content"><img src="assets/fits.png" alt="Model fits per condition"></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="box" id="callout" data-shape="roundrect" style="left: 1100px; top: 300px; width: 700px; height: 300px; --fill: #fce8e6; --stroke: #d93025; --sw: 2px;">
|
|
18
|
+
<div class="content" style="font-size: 36px;">Fit is worse for <i>β</i> > 0.5</div>
|
|
19
|
+
</div>
|
|
20
|
+
<aside class="notes">Speaker notes go here.</aside>
|
|
21
|
+
</section>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Rules:
|
|
25
|
+
- Geometry lives only in a box's inline `left/top/width/height` (in px on the 1920×1080 canvas). Rotation is an inline `transform: rotate(Ndeg)` about the box centre (absent when 0).
|
|
26
|
+
- Inside `.content`, anything goes: HTML, lists, `<pre><code>` blocks, tables, iframes.
|
|
27
|
+
- Guides: `data-guides="v960 h540"` on the `.slides` element (vertical/horizontal, px); editor only, never drawn when presenting.
|
|
28
|
+
- Cropped pictures: `data-crop="top right bottom left"` on a `.box.image`, each the share (0–1) of the picture cut off that side; the box is the visible part.
|
|
29
|
+
- Videos: `<div class="box video" style="…"><div class="content"><video src="assets/clip.mp4" poster="assets/clip.jpg" controls playsinline></video></div></div>`;
|
|
30
|
+
add `data-autoplay` (reveal.js plays it when the slide appears), `muted` and/or `loop` on the `<video>`. Trim with a media fragment: `src="assets/clip.mp4#t=5,12"`.
|
|
31
|
+
- Groups: `<div class="box group" style="left/top/width/height">` holding member `.box`es whose geometry is relative to the group's top-left; the group can be rotated/flipped like any box and has no `.content`. Groups can nest. The editor keeps a group's box hugging its members.
|
|
32
|
+
- Theme: a block in `<style id="deck-theme">` between `/* slides-theme {…} */` and `/* end slides-theme */` (written by the Themes panel) sets the deck font, text and title colours, and `--th-title-size` / `--th-body-size`; text without its own font or colour inherits it, layout placeholders size from it, and the rest of that style is left as you wrote it.
|
|
33
|
+
- Edited layouts live in the theme JSON (`"layouts": {"title-body": [[role, x, y, w, h, pt, valign, align], …]}`, sizes relative to 28 / 18 pt titles / bodies).
|
|
34
|
+
- Layouts and placeholders: `data-layout` on a `<section>` names its layout (title, section, title-body, two-columns, title-only, one-column,
|
|
35
|
+
main-point, section-description, caption, big-number, blank); a box with `data-placeholder="Click to add title"` (and `data-role` title / sub / body)
|
|
36
|
+
shows that prompt in the editor while empty, survives being left empty, and is hidden in the deck until it has text.
|
|
37
|
+
- Slide ids: the editor gives each `<section>` a `data-sid` (how edits made in two places merge, slide by slide). Keep it when you change a slide; a slide you add may leave it out (it gets one), but never copy one slide's `data-sid` onto another.
|
|
38
|
+
- Vertical stacks (reveal.js sub-slides): wrap slides in an outer `<section>`: `<section><section>main</section><section>below</section></section>`.
|
|
39
|
+
The first is the main slide, the rest sit below it (presenting: ↓ / ↑). Numbering follows reveal: main slide 3, its sub-slides 3.1, 3.2
|
|
40
|
+
(filmstrip, the slideshow pill and its slide picker). The filmstrip draws a stack as a tree (sub-slides smaller, under a rail; ▾ / ▸ on the
|
|
41
|
+
main slide folds them, showing "+2", remembered per deck); grid view keeps one cell per main slide, with a stack's sub-slides in that cell under it.
|
|
42
|
+
|
|
43
|
+
- Slide background (Slide → Change background): `data-background-color` on the `<section>`, plus optional `data-background-image="assets/….png"` (any URL or data URI), drawn to cover the slide.
|
|
44
|
+
- Shapes: `data-shape` = `rect | roundrect | ellipse | triangle | diamond | parallelogram | trapezoid | pentagon | hexagon | octagon | star | plus | minus | multiply | divide | equal | notequal | brackets | braces | leftbracket | rightbracket | leftbrace | rightbrace | cloud | arrow | leftarrow | uparrow | downarrow | leftrightarrow | updownarrow | quadarrow | bentarrow | uturnarrow | notchedarrow | curvedarrow | curvedleftarrow | curveduparrow | curveddownarrow | leftrightuparrow | leftuparrow | bentuparrow | stripedarrow | homeplate | rightarrowcallout | leftarrowcallout | uparrowcallout | downarrowcallout | leftrightarrowcallout | quadarrowcallout | circulararrow | chevron | callout | roundcallout | ovalcallout | cloudcallout | explosion1 | explosion2 | star4 | star6 | star7 | star8 | star10 | star12 | star16 | star24 | star32 | ribbonup | ribbon | curvedribbonup | curvedribbon | vscroll | hscroll | wave | doublewave | snip1rect | snip2samerect | snip2diagrect | sniproundrect | round1rect | round2samerect | round2diagrect | rttriangle | heptagon | decagon | dodecagon | pie | arc | teardrop | chord | frame | halfframe | corner | diagstripe | cross | plaque | can | cube | bevel | donut | nosmoking | blockarc | foldedcorner | smileyface | heart | lightningbolt | sun | moon | flow-process … flow-display (Slides' 28 flowchart shapes: flow- + the OOXML name after flowChart, lowercased) | wordart | line | arrowline | elbow | curve`,
|
|
45
|
+
styled with `--fill`, `--stroke`, `--sw`; `data-dash="dot|dash|dashdot|longdash|longdashdot"` dashes the outline (text boxes too). Lines take
|
|
46
|
+
`data-start` / `data-end` = `none | arrow | fill-arrow | circle | square | diamond | open-arrow | open-circle | open-square | open-diamond`
|
|
47
|
+
(`arrowline` is a line whose end defaults to `fill-arrow`). Ends grow with the line weight as in Slides (an arrow is ~9.4× the weight long).
|
|
48
|
+
`elbow` and `curve` are connectors drawn corner to corner like lines,
|
|
49
|
+
leaving and arriving horizontally (a right-angle step, or an S-curve).
|
|
50
|
+
`wordart` draws the box's text as one line of letters stretched to the box (fill `--fill`, outline `--stroke` / `--sw`; font from `.content`).
|
|
51
|
+
A line, arrow or connector can be attached to shapes with `data-from` / `data-to` = `"boxId:t|r|b|l"` (the middle of a side; `from` is
|
|
52
|
+
the left end): whenever the deck loads (editor and slideshow), an attached line is fitted to those points, so it follows the shapes
|
|
53
|
+
however they moved; with one end attached the whole line moves with that shape. The editor writes the fitted geometry back.
|
|
54
|
+
An elbow connector (`data-shape="elbow"`) routes from its ends' sides: two horizontal (l/r, or unattached) or two vertical (t/b) ends give
|
|
55
|
+
three segments with the middle one at `data-bend` (0..1 of the span, default 0.5; the yellow handle; right-click → Reroute connector resets it),
|
|
56
|
+
one of each gives a single bend, and two ends on the same side (`b` and `b`, or `r` and `r`, …) give a U that runs `data-out` px
|
|
57
|
+
(default 60; the yellow handle) past the further end: a feedback edge. A curved connector (`curve`) routes the same way, its S bending at `data-bend` (handle on the curve); with one bend it is OOXML's curvedConnector2, a gentle arc whose controls sit at the midpoints of the two legs.
|
|
58
|
+
`data-shape="path"` with `data-path="M0,0 C… L…"` is a freehand stroke (Curve, Polyline, Scribble): SVG path commands in 0..1 units of the box, so it scales with it.
|
|
59
|
+
Shapes are drawn from the OOXML preset geometry Google Slides uses (ECMA-376 `presetShapeDefinitions`), including where text sits.
|
|
60
|
+
`data-adj`, `data-adj2`, … are the preset's adj1, adj2, … scaled 0–1 (e.g. `arrow` = rightArrow: adj1 shaft thickness of the height,
|
|
61
|
+
adj2 head length of the shorter side, both 0.5 by default; `roundrect`: corner radius of the shorter side, 0.1667); the editor's yellow handles set them.
|
|
62
|
+
Outlines are centred on the shape's edge, as in Slides. Lines run corner to corner (`data-dir="up"` flips them);
|
|
63
|
+
height 0 gives a horizontal line. Don't write SVG; it's drawn at load time.
|
|
64
|
+
- Line spacing: the editor's Single / 1.15 / 1.5 / Double mean what they mean in Slides (multiples of the font's natural line height, about 1.15), written as CSS `line-height` 1.15 / 1.323 / 1.725 / 2.3; a `.content` without one keeps 1.3.
|
|
65
|
+
- Page size: `<div class="slides" data-size="1920x1440">` makes every slide 1920 × 1440 (4:3; 192 px = 1 in); absent means 1920 × 1080. shapes.js sizes the sections and tells reveal.js. File → Page setup sets it (16:9, 16:10, 4:3 or W x H inches); objects keep their positions.
|
|
66
|
+
- Fonts: `font-family` on `.content` (or a `<span>`), e.g. `style="font-family: 'Roboto Slab', serif"`. A Google Fonts family also needs
|
|
67
|
+
`<link id="deck-fonts" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap">` in the head
|
|
68
|
+
(one link, `family=` repeated per font); the font menu writes it. Web-safe fonts (Arial, Georgia, …) need nothing.
|
|
69
|
+
A font file of your own goes in `assets/fonts/` with an `@font-face` in `#deck-theme`, e.g.
|
|
70
|
+
`@font-face { font-family: 'My Font'; src: url('assets/fonts/My-Font.ttf'); font-display: swap; }`; the font menu's Your fonts tab
|
|
71
|
+
(fonts in `~/Library/Fonts` and `/Library/Fonts`) and dropping a .ttf / .otf / .woff / .woff2 on the slide write both.
|
|
72
|
+
- Equations: LaTeX between `$…$` / `\(…\)` (inline) or `$$…$$` / `\[…\]` (display) in any box is typeset by KaTeX (shapes.js loads it
|
|
73
|
+
from jsDelivr; `--build` vendors it). The deck keeps the source; Insert → Equation adds one, double-click shows the source to edit.
|
|
74
|
+
- Tables: `<div class="box table" data-valign="top" …><div class="content" style="padding: 0px"><table><tr><td>…</td></tr></table></div></div>`;
|
|
75
|
+
the table fills the box with 1pt black rules (base.css). Insert → Table picks the size; while editing, Tab / ⇧Tab move between
|
|
76
|
+
cells (Tab in the last cell adds a row) and right-click inserts or deletes rows and columns.
|
|
77
|
+
- Web embeds: `<div class="box embed" …><div class="content"><iframe src="https://…" allowfullscreen></iframe></div></div>` shows a live page
|
|
78
|
+
(or a YouTube / Vimeo player: Insert → Video → By URL converts the page address). The editor shows it but doesn't pass clicks
|
|
79
|
+
to it; the slideshow does.
|
|
80
|
+
- Live boxes (Insert → Live box): a box running a page of its own, for a demo, a simulation or a plot you can hover:
|
|
81
|
+
`<div class="box live" …><div class="content"><iframe src="assets/demo.html" sandbox="allow-scripts allow-pointer-lock"></iframe></div></div>`.
|
|
82
|
+
Write the page as an ordinary HTML file in `assets/` (its own `<script>`, sized to the window: the box's size). It runs in a
|
|
83
|
+
sandbox: it can draw, animate and take the mouse and keys, and load things from the web, but can't reach the deck, other
|
|
84
|
+
files or anyone's accounts. Keep the `sandbox` attribute exactly so. The editor shows it running; double-clicking it edits the page.
|
|
85
|
+
- Code: `<pre><code class="language-python">…</code></pre>` inside a box's `.content` is coloured by highlight.js (reveal.js' highlight
|
|
86
|
+
plugin, loaded by shapes.js beside reveal.js); any highlight.js language name works. Insert → Code block picks the language,
|
|
87
|
+
right-click → Code language changes it; Enter inside a code block adds a line.
|
|
88
|
+
- Icons: `<div class="box" data-shape="icon" data-icon="lightbulb" style="…; --fill: #202124">` draws that Material Symbols glyph
|
|
89
|
+
(any name from fonts.google.com/icons) filling the box, coloured by `--fill`. The deck needs
|
|
90
|
+
`<link id="deck-icons" rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&icon_names=lightbulb&display=block">`
|
|
91
|
+
(every icon used, comma-separated and sorted); Insert → Icon writes both.
|
|
92
|
+
- Letter spacing: CSS `letter-spacing` on `.content` (whole box) or on a `<span>` (selected text); Format → Text → Letter spacing writes -0.05em / -0.025em / normal / 0.05em / 0.1em. Capitalization (lowercase / UPPERCASE / Title Case) rewrites the characters themselves, so it needs no attribute.
|
|
93
|
+
- Paragraph spacing: `--space-before` / `--space-after` on `.content` (e.g. `style="--space-after: 26.67px"`, 10pt) become top / bottom margins on each paragraph (every block child and list item). The line-spacing menu's Add / Remove space before / after paragraph toggles 10pt.
|
|
94
|
+
- Text insets: the editor writes Slides' defaults on new boxes (`padding: 9.6px 19.2px` on `.content`, i.e. 0.05 in / 0.1 in); a `.content` without its own padding gets 8 px / 16 px.
|
|
95
|
+
- Text boxes can also take `--fill`, `--stroke`, `--sw`. A translucent fill is just a colour with alpha (`--fill: #4a86e880`); an image's opacity is an inline `opacity` on its `<img>`. `data-valign="top|bottom"` changes vertical alignment.
|
|
96
|
+
- Optional box attributes (Format → Format options): `data-flip="h|v|hv"` mirrors the box (text stays readable),
|
|
97
|
+
`data-shadow` adds a drop shadow (tuned by `data-shadow-color` `#rrggbb`, `-opacity` 0–1, `-angle` deg with 90 = down, `-distance` and `-blur` px; defaults #000000, 0.3, 90, 6, 8), `data-lock="aspect"` keeps proportions when resizing,
|
|
98
|
+
`data-autofit="none|shrink|resize"`: no fitting, shrink the text to fit the box (done at load by `#deck-shapes`), or grow the box to fit the text (the default for text boxes).
|
|
99
|
+
- Text boxes grow to fit their text while editing. `data-minh` is the height the user dragged; the editor never shrinks a box below it (optional; defaults to the current height).
|
|
100
|
+
- Slide transitions: `data-transition` on the `<section>` = `fade` (Dissolve) | `fade-in fade-out` (Fade) | `slide` | `sl-left` | `convex` (Flip) | `concave` (Cube) | `zoom` (Gallery), optional `data-transition-speed="slow|fast"`.
|
|
101
|
+
- Morph (Keynote's Magic Move, reveal's Auto-Animate): `data-auto-animate` on a `<section>` (instead of `data-transition`)
|
|
102
|
+
animates from the slide before: each box that has a partner there moves, resizes and recolours into place, and the rest fade.
|
|
103
|
+
A box's partner is the box on the slide before whose `id` equals this box's `data-morph` (or, without one, its own `id`);
|
|
104
|
+
ids stay unique in the deck, so a copied box gets a new id and `data-morph` names the one it continues. In the editor:
|
|
105
|
+
duplicate the slide (Duplicate slide sets `data-morph` on each copy), change the copy, and give it `data-auto-animate`. By
|
|
106
|
+
hand, see "Building a diagram up step by step" above. Optional `data-auto-animate-duration` in seconds (0.5 fast, 1.4 slow).
|
|
107
|
+
- Object animations are reveal fragments on the box: `class="box fragment fade-in"` (or `appear`, `fade-right` = fly in from left, `fade-left`, `fade-up`, `fade-down`, `zoom-in`), ordered by `data-fragment-index` (`data-with-previous` marks one that plays with the one before it, sharing its index). Alt text: the image's `alt`, or `aria-label` on the box.
|
|
108
|
+
More effects: `fade-out`, `semi-fade-out` (dim), `fade-in-then-out`, `fade-in-then-semi-out` (fade in, then dim when the
|
|
109
|
+
next step comes: walking through bullets), `highlight-current-blue` (coloured while it is the current step), `grow`, `shrink`,
|
|
110
|
+
`strike`. `data-build="paragraph"` on an animated text box makes each paragraph or bullet its own step with the box's effect.
|
|
111
|
+
Pictures that replace each other in one place (a plot that updates): stack them at the same position, the first
|
|
112
|
+
`fade-out` with the second's step, each middle one `fade-in-then-out`, the last `fade-in` (Arrange → Stack as a sequence).
|
|
113
|
+
- Backgrounds beyond colour and image (reveal's own): `data-background-video="assets/clip.mp4"` (with `data-background-video-loop`
|
|
114
|
+
and `data-background-video-muted`) or `data-background-iframe="https://…"` (a live web page) on the `<section>`.
|
|
115
|
+
- A slide's own style: `<style class="slide-css" media="not all">` inside the `<section>`, holding ordinary CSS rules
|
|
116
|
+
(`.box > .content { … }`) that apply to that slide only. `media="not all"` keeps it from applying to anything else; the
|
|
117
|
+
editor and the slideshow scope it to its slide (Slide → Slide style).
|
|
118
|
+
- Any deck reads as a scrolling page with `?view=scroll` (reveal's scroll view; narrow phone screens get it by themselves).
|
|
119
|
+
- Figures: a `.box.image` may carry `data-source` (the command that makes its picture; `{out}` is the picture's path, run in the
|
|
120
|
+
deck's folder by `glideshow figure refresh`) and `data-made` (when it was last made, ISO time). Both are optional.
|
|
121
|
+
- Give every box a unique `id`. Ids starting with `ed-` are reserved for the editor's own interface. Put deck-specific CSS in `<style id="deck-theme">`.
|
|
122
|
+
- Don't edit `#deck-base`, `#deck-shapes` or `#deck-present`. The editor overwrites them from `editor/` on every save.
|
|
123
|
+
|
|
124
|
+
The editor watches `deck.html`: edits made on disk appear within a second. Saves are tied to the
|
|
125
|
+
file's mtime, so if the file changed underneath the editor, it reloads instead of overwriting it.
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"ABeeZee":0.329,"Abel":0.3423,"Abhaya Libre":0.25,"Abril Fatface":0.3835,"Acme":0.326,"Actor":0.3395,"Advent Pro":0.366,"Alata":0.41,"Albert Sans":0.35,"Alegreya":0.3355,"Alegreya Sans":0.3,"Aleo":0.305,"Alex Brush":0.2,"Alexandria":0.3585,"Alfa Slab One":0.3515,"Allura":0.175,"Almarai":0.347,"Amaranth":0.37,"Amatic SC":0.3855,"Amiri":0.245,"Andada Pro":0.3535,"Andika":0.415,"Anek Telugu":0.15,"Antic Slab":0.345,"Anton":0.4236,"Antonio":0.5078,"Architects Daughter":0.2915,"Archivo":0.334,"Archivo Black":0.334,"Archivo Narrow":0.3615,"Arial":0.3467,"Arimo":0.3467,"Arsenal":0.373,"Arvo":0.3569,"Asap":0.361,"Asap Condensed":0.361,"Assistant":0.367,"Atkinson Hyperlegible":0.33,"Atkinson Hyperlegible Next":0.334,"Audiowide":0.3523,"BIZ UDPGothic":0.3799,"Bai Jamjuree":0.375,"Baloo 2":0.277,"Balsamiq Sans":0.3,"Bangers":0.351,"Barlow":0.4,"Barlow Condensed":0.4,"Barlow Semi Condensed":0.4,"Baskervville":0.3515,"Be Vietnam Pro":0.3675,"Bebas Neue":0.3,"Belleza":0.352,"Berkshire Swash":0.3589,"Besley":0.4125,"Biryani":0.2265,"Bitter":0.335,"Black Han Sans":0.29,"Black Ops One":0.2886,"Blinker":0.36,"Bodoni Moda":0.3625,"Bree Serif":0.398,"Bricolage Grotesque":0.33,"Bungee":0.36,"Cabin":0.3575,"Cairo":0.366,"Cantarell":0.3857,"Cardo":0.3132,"Carlito":0.3418,"Catamaran":0.28,"Caveat":0.33,"Chakra Petch":0.342,"Changa":0.307,"Changa One":0.351,"Chelsea Market":0.3687,"Chivo":0.345,"Cinzel":0.302,"Cinzel Decorative":0.302,"Comfortaa":0.3235,"Comic Neue":0.325,"Comic Sans MS":0.4053,"Commissioner":0.4055,"Concert One":0.3894,"Cookie":0.2345,"Cormorant":0.3185,"Cormorant Garamond":0.3185,"Cormorant Infant":0.3185,"Courgette":0.3516,"Courier New":0.2661,"Courier Prime":0.2197,"Creepster":0.3667,"Crete Round":0.352,"Crimson Pro":0.3408,"Crimson Text":0.2993,"Cuprum":0.3175,"Cutive Mono":0.2781,"DM Mono":0.341,"DM Sans":0.341,"DM Serif Display":0.3505,"DM Serif Text":0.3505,"Damion":0.3228,"Dancing Script":0.32,"Dela Gothic One":0.436,"Delius":0.358,"Didact Gothic":0.3905,"Domine":0.33,"Doppio One":0.3809,"Dosis":0.395,"EB Garamond":0.3545,"Eczar":0.2545,"El Messiri":0.2375,"Encode Sans":0.405,"Encode Sans Condensed":0.405,"Epilogue":0.2775,"Exo":0.3375,"Exo 2":0.399,"Faustina":0.413,"Figtree":0.35,"Fira Code":0.334,"Fira Mono":0.335,"Fira Sans":0.335,"Fira Sans Condensed":0.335,"Fjalla One":0.3804,"Forum":0.304,"Francois One":0.38,"Frank Ruhl Libre":0.3115,"Fraunces":0.3615,"Fredoka":0.369,"Fugaz One":0.312,"Fustat":0.29,"GFS Didot":0.335,"Gabarito":0.34,"Geist":0.355,"Geist Mono":0.355,"Gelasio":0.293,"Geologica":0.35,"Georgia":0.3489,"Gilda Display":0.3035,"Gloria Hallelujah":0.4141,"Goldman":0.3,"Golos Text":0.38,"Google Sans":0.34,"Google Sans Code":0.34,"Google Sans Flex":0.34,"Gothic A1":0.2979,"Gravitas One":0.3098,"Great Vibes":0.225,"Gruppo":0.3171,"Hammersmith One":0.2754,"Handlee":0.2665,"Hanken Grotesk":0.3485,"Heebo":0.3135,"Hind":0.2545,"Hind Guntur":0.171,"Hind Madurai":0.292,"Hind Siliguri":0.3075,"Homemade Apple":0.2251,"Host Grotesk":0.35,"IBM Plex Mono":0.375,"IBM Plex Sans":0.375,"IBM Plex Sans Arabic":0.335,"IBM Plex Sans Condensed":0.375,"IBM Plex Sans Thai":0.291,"IBM Plex Serif":0.375,"Impact":0.3989,"Inconsolata":0.3345,"Indie Flower":0.2412,"Instrument Sans":0.36,"Instrument Serif":0.34,"Inter":0.3638,"Inter Tight":0.3638,"Istok Web":0.2866,"Italianno":0.175,"JetBrains Mono":0.36,"Josefin Sans":0.25,"Josefin Slab":0.25,"Jost":0.3475,"Jua":0.3,"Kalam":0.266,"Kanit":0.3525,"Karla":0.3325,"Kaushan Script":0.3585,"Khand":0.2855,"Kosugi Maru":0.3799,"Krub":0.357,"Kumbh Sans":0.3662,"LINE Seed JP":0.382,"Lalezar":0.1955,"Lato":0.387,"League Gothic":0.3675,"League Spartan":0.24,"Leckerli One":0.3595,"Lexend":0.375,"Lexend Deca":0.375,"Lexend Giga":0.375,"Libre Barcode 39":0.1,"Libre Baskerville":0.35,"Libre Bodoni":0.299,"Libre Caslon Text":0.355,"Libre Franklin":0.36,"Lilita One":0.3515,"Literata":0.4345,"Lobster":0.375,"Lobster Two":0.375,"Lora":0.366,"Luckiest Guy":0.2031,"Lusitana":0.3075,"Lustria":0.314,"M PLUS 1":0.436,"M PLUS 1p":0.3775,"M PLUS Rounded 1c":0.3775,"Manrope":0.383,"Marcellus":0.3472,"Martel":0.2815,"Maven Pro":0.3775,"Merienda":0.38,"Merriweather":0.3555,"Merriweather Sans":0.3555,"Michroma":0.4453,"Mitr":0.365,"Monda":0.3872,"Monoton":0.377,"Montagu Slab":0.341,"Montserrat":0.3585,"Montserrat Alternates":0.3585,"Mrs Saint Delafield":0.1435,"Mukta":0.299,"Mulish":0.3775,"Nanum Gothic":0.344,"Nanum Gothic Coding":0.3,"Nanum Myeongjo":0.2998,"Nanum Pen Script":0.3,"Neuton":0.3958,"News Cycle":0.4346,"Newsreader":0.235,"Nothing You Could Do":0.2695,"Noticia Text":0.3928,"Noto Color Emoji":0.3418,"Noto Kufi Arabic":0.3335,"Noto Naskh Arabic":0.2175,"Noto Nastaliq Urdu":0.654,"Noto Sans":0.388,"Noto Sans Arabic":0.318,"Noto Sans Bengali":0.2545,"Noto Sans Devanagari":0.244,"Noto Sans Display":0.388,"Noto Sans HK":0.436,"Noto Sans Hebrew":0.388,"Noto Sans JP":0.436,"Noto Sans KR":0.436,"Noto Sans Khmer":0.388,"Noto Sans Malayalam":0.2405,"Noto Sans Mono":0.388,"Noto Sans SC":0.436,"Noto Sans TC":0.436,"Noto Sans Tamil":0.25,"Noto Sans Telugu":0.193,"Noto Sans Thai":0.3055,"Noto Serif":0.388,"Noto Serif Display":0.388,"Noto Serif JP":0.4325,"Noto Serif KR":0.4325,"Noto Serif SC":0.4325,"Noto Serif TC":0.4325,"Nunito":0.329,"Nunito Sans":0.329,"Old Standard TT":0.262,"Oleo Script":0.3125,"Onest":0.3325,"Open Sans":0.3879,"Orbitron":0.384,"Oswald":0.452,"Outfit":0.37,"Overpass":0.25,"Oxanium":0.29,"Oxygen":0.3955,"PT Mono":0.325,"PT Sans":0.371,"PT Sans Caption":0.371,"PT Sans Narrow":0.371,"PT Serif":0.3765,"Pacifico":0.425,"Palanquin Dark":0.4145,"Pangolin":0.3125,"Parisienne":0.2344,"Passion One":0.2845,"Pathway Gothic One":0.378,"Patrick Hand":0.365,"Patua One":0.3625,"Paytone One":0.415,"Permanent Marker":0.396,"Petrona":0.294,"Philosopher":0.34,"Pinyon Script":0.2395,"Pirata One":0.3635,"Play":0.3585,"Playball":0.325,"Playfair":0.2855,"Playfair Display":0.4155,"Playfair Display SC":0.4155,"Plus Jakarta Sans":0.408,"Poiret One":0.377,"Poppins":0.35,"Prata":0.3155,"Press Start 2P":0.5,"Prompt":0.334,"Public Sans":0.3625,"Quantico":0.348,"Quattrocento":0.294,"Quattrocento Sans":0.294,"Questrial":0.305,"Quicksand":0.375,"Racing Sans One":0.346,"Radio Canada":0.345,"Radio Canada Big":0.345,"Rajdhani":0.292,"Raleway":0.353,"Ramabhadra":0.3777,"Rammetto One":0.3455,"Readex Pro":0.375,"Red Hat Display":0.3565,"Red Hat Text":0.3565,"Reddit Sans":0.3604,"Reenie Beanie":0.25,"Rethink Sans":0.341,"Righteous":0.364,"Roboto":0.3418,"Roboto Condensed":0.3418,"Roboto Flex":0.3418,"Roboto Mono":0.3884,"Roboto Serif":0.3415,"Roboto Slab":0.3884,"Rock Salt":0.4077,"Rokkitt":0.2485,"Rowdies":0.376,"Rubik":0.3425,"Rubik Mono One":0.313,"Russo One":0.3235,"STIX Two Text":0.262,"Sacramento":0.2004,"Saira":0.348,"Saira Condensed":0.348,"Saira Extra Condensed":0.348,"Saira Semi Condensed":0.348,"Sanchez":0.365,"Sarabun":0.418,"Satisfy":0.2227,"Sawarabi Gothic":0.419,"Sawarabi Mincho":0.3755,"Schibsted Grotesk":0.3594,"Sen":0.3379,"Shadows Into Light":0.3716,"Share Tech":0.3215,"Share Tech Mono":0.3215,"Shippori Mincho":0.436,"Signika":0.324,"Signika Negative":0.324,"Slabo 13px":0.3077,"Slabo 27px":0.3148,"Smooch Sans":0.3,"Sofia Sans":0.3,"Sofia Sans Condensed":0.3,"Sofia Sans Extra Condensed":0.3,"Sora":0.34,"Sorts Mill Goudy":0.241,"Source Code Pro":0.3555,"Source Sans 3":0.312,"Source Serif 4":0.3505,"Space Grotesk":0.346,"Space Mono":0.3795,"Special Elite":0.2031,"Spectral":0.298,"Staatliches":0.325,"Syncopate":0.2759,"Syne":0.325,"Tahoma":0.397,"Tajawal":0.143,"Tangerine":0.25,"Teko":0.2415,"Tenor Sans":0.335,"Times New Roman":0.3374,"Tinos":0.3374,"Titan One":0.3975,"Titillium Web":0.3725,"Trebuchet MS":0.3584,"Ubuntu":0.3715,"Ubuntu Condensed":0.3715,"Ubuntu Mono":0.33,"Unbounded":0.375,"Unica One":0.326,"Unna":0.307,"Urbanist":0.35,"VT323":0.3,"Varela Round":0.316,"Vazirmatn":0.2441,"Verdana":0.3977,"Vidaloka":0.3337,"Viga":0.343,"Volkhov":0.326,"Vollkorn":0.2555,"Work Sans":0.3435,"Yanone Kaffeesatz":0.2675,"Yantramanav":0.2905,"Yellowtail":0.3352,"Yeseva One":0.3375,"Zen Kaku Gothic New":0.436,"Zen Maru Gothic":0.436,"Zen Old Mincho":0.436,"Zeyada":0.124,"Zilla Slab":0.344}
|