@codename/deck 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +96 -2
- package/dist/deck.bundle.mjs +114 -0
- package/dist/deck.bundle.mjs.map +7 -0
- package/dist/deck.css +164 -0
- package/dist/deck.js +275 -0
- package/dist/deck.js.map +7 -0
- package/dist/deck.mjs +50 -0
- package/dist/deck.mjs.map +7 -0
- package/docs/findings.md +57 -0
- package/docs/format.md +70 -0
- package/docs/host.md +49 -0
- package/docs/kits.md +76 -0
- package/package.json +54 -4
- package/src/blocks.js +99 -0
- package/src/css.d.ts +5 -0
- package/src/deck.css +164 -0
- package/src/deck.js +356 -0
- package/src/file.js +74 -0
- package/src/index.js +12 -0
- package/src/kit.js +185 -0
- package/src/look.js +124 -0
- package/src/parse.js +180 -0
- package/src/pictures.js +47 -0
- package/src/pptx.js +310 -0
- package/src/render.js +242 -0
- package/src/repair.js +51 -0
- package/src/standalone.js +89 -0
- package/src/strings.js +10 -0
- package/src/version.js +2 -0
- package/src/yaml.js +137 -0
package/dist/deck.css
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/* deck: a slide is a 16:9 box, a size container, whose canvas sizes its type and space with the
|
|
2
|
+
slide's width (cqi), so it wraps the same at any size; its colours and faces are the look's tokens as custom properties; logical properties
|
|
3
|
+
only, so a deck in Arabic mirrors. The others are laid out behind the one shown, unseen. */
|
|
4
|
+
.deck { --deck-paper: #fffdf8; --deck-ink: #1d1b16; --deck-muted: #6b675e; --deck-line: #e4e0d6; --deck-primary: #8a6100; --deck-fill: #f7c531; --deck-on-fill: #1d1b16; --deck-soft: #fdf1c9;
|
|
5
|
+
--deck-heading: system-ui, sans-serif; --deck-body: system-ui, sans-serif; --deck-radius: 10px;
|
|
6
|
+
position: relative; display: grid; gap: 0.5rem; color: var(--deck-ink); font-family: var(--deck-body); }
|
|
7
|
+
.deck *, .deck *::before, .deck *::after { box-sizing: border-box; }
|
|
8
|
+
.deck-stage { position: relative; view-transition-name: deck-stage; }
|
|
9
|
+
.deck-slide {
|
|
10
|
+
container-type: inline-size; position: relative; aspect-ratio: 16 / 9; overflow: hidden; inline-size: 100%;
|
|
11
|
+
background: var(--deck-paper); color: var(--deck-ink); border-radius: var(--deck-radius); box-shadow: 0 0 0 1px var(--deck-line);
|
|
12
|
+
}
|
|
13
|
+
.deck-canvas { position: absolute; inset: 0; display: grid; padding: 6cqi 7cqi 7cqi; gap: 0 4cqi; font-size: 2.6cqi; line-height: 1.4; }
|
|
14
|
+
.deck-slide:not(.is-shown) { position: absolute; inset-block-start: 0; inset-inline-start: 0; visibility: hidden; }
|
|
15
|
+
.deck-slot { --deck-fit: 1; min-block-size: 0; min-inline-size: 0; display: flex; flex-direction: column; justify-content: flex-start; font-size: calc(1em * var(--deck-fit)); overflow: hidden; }
|
|
16
|
+
.deck-slot > :first-child { margin-block-start: 0; }
|
|
17
|
+
.deck-slot > :last-child { margin-block-end: 0; }
|
|
18
|
+
.deck-slide :is(h1, h2, h3, h4, .deck-h) { font-family: var(--deck-heading); font-weight: 700; line-height: 1.15; margin: 0 0 0.55em; text-wrap: balance; letter-spacing: -0.01em; }
|
|
19
|
+
.deck-slide :is(h1, .deck-h1) { font-size: 2.1em; }
|
|
20
|
+
.deck-slide :is(h2, .deck-h2) { font-size: 1.6em; }
|
|
21
|
+
.deck-slide :is(h3, .deck-h3) { font-size: 1.25em; color: var(--deck-primary); }
|
|
22
|
+
.deck-slide :is(p, ul, ol, blockquote, pre, .deck-table, .deck-block) { margin-block: 0 0.7em; }
|
|
23
|
+
.deck-slide :is(ul, ol) { padding-inline-start: 1.2em; }
|
|
24
|
+
.deck-slide li { margin-block-end: 0.3em; }
|
|
25
|
+
.deck-slide li::marker { color: var(--deck-primary); }
|
|
26
|
+
.deck-slide .deck-tasks { list-style: none; padding-inline-start: 0; }
|
|
27
|
+
.deck-slide .deck-tasks input { font-size: inherit; inline-size: 0.8em; block-size: 0.8em; margin: 0; margin-inline-end: 0.5em; vertical-align: -0.05em; accent-color: var(--deck-primary); }
|
|
28
|
+
.deck-slide strong { color: var(--deck-primary); }
|
|
29
|
+
.deck-slide a { color: var(--deck-primary); }
|
|
30
|
+
.deck-slide code { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 0.85em; background: var(--deck-soft); padding: 0.05em 0.3em; border-radius: 0.2em; }
|
|
31
|
+
.deck-slide pre { background: color-mix(in srgb, var(--deck-ink) 6%, var(--deck-paper)); padding: 0.8em 1em; border-radius: calc(var(--deck-radius) * 0.6); overflow: hidden; font-size: 0.75em; line-height: 1.45; text-align: start; }
|
|
32
|
+
.deck-slide pre code { background: none; padding: 0; font-size: 1em; }
|
|
33
|
+
.deck-slide pre.has-marks .deck-line:not(.is-marked) { opacity: 0.45; }
|
|
34
|
+
.deck-slide blockquote { border-inline-start: 0.25em solid var(--deck-fill); padding-inline-start: 0.9em; margin-inline: 0; font-style: italic; }
|
|
35
|
+
.deck-slide img { max-inline-size: 100%; max-block-size: 100%; object-fit: contain; }
|
|
36
|
+
.deck-slide .deck-picture { flex: 1; min-block-size: 0; display: grid; place-items: center; }
|
|
37
|
+
.deck-slide .deck-picture img { block-size: 100%; }
|
|
38
|
+
.deck-table { overflow: hidden; }
|
|
39
|
+
.deck-slide table { border-collapse: collapse; inline-size: 100%; font-size: 0.85em; }
|
|
40
|
+
.deck-slide :is(th, td) { padding: 0.35em 0.7em; border-block-end: 1px solid var(--deck-line); text-align: start; }
|
|
41
|
+
.deck-slide th { border-block-end: 2px solid var(--deck-primary); font-weight: 700; }
|
|
42
|
+
.deck-slide [data-align="right"] { text-align: end; font-variant-numeric: tabular-nums; }
|
|
43
|
+
.deck-slide [data-align="center"] { text-align: center; }
|
|
44
|
+
.deck-block { position: relative; flex: 1 1 auto; min-block-size: 12cqi; overflow: hidden; }
|
|
45
|
+
.deck-block .deck-chart, .deck-block .deck-diagram { position: absolute; inset: 0; display: grid; place-items: center; }
|
|
46
|
+
.deck-block .deck-diagram img { max-inline-size: 100%; max-block-size: 100%; }
|
|
47
|
+
.deck-block .deck-block-source { display: none; }
|
|
48
|
+
.deck-block.is-failed .deck-block-source { display: block; }
|
|
49
|
+
.deck-number { position: absolute; inset-block-end: 2.6cqi; inset-inline-end: 3cqi; font-size: 1.5cqi; color: var(--deck-muted); font-variant-numeric: tabular-nums; }
|
|
50
|
+
|
|
51
|
+
/* Layouts from their kit's definition: the paper they are on, where their words sit, how big their heading is. */
|
|
52
|
+
.deck-slide[data-paper="fill"] { background: var(--deck-fill); color: var(--deck-on-fill); }
|
|
53
|
+
.deck-slide[data-paper="ink"] { background: var(--deck-ink); color: var(--deck-paper); }
|
|
54
|
+
.deck-slide[data-paper="soft"] { background: var(--deck-soft); }
|
|
55
|
+
.deck-slide:is([data-paper="fill"], [data-paper="ink"]) :is(strong, a, h3, .deck-h3) { color: inherit; }
|
|
56
|
+
.deck-slide[data-justify="center"] .deck-slot { justify-content: center; }
|
|
57
|
+
.deck-slide[data-justify="end"] .deck-slot { justify-content: flex-end; }
|
|
58
|
+
.deck-slide[data-align="center"] .deck-slot { align-items: center; text-align: center; }
|
|
59
|
+
.deck-slide[data-align="end"] .deck-slot { align-items: flex-end; text-align: end; }
|
|
60
|
+
.deck-slide[data-title="large"] :is(h1, h2, .deck-h1, .deck-h2) { font-size: 2.4em; }
|
|
61
|
+
.deck-slide[data-title="huge"] :is(h1, .deck-h1) { font-size: 2.9em; }
|
|
62
|
+
.deck-slide[data-title="huge"] :is(h2, .deck-h2) { font-size: 2.4em; }
|
|
63
|
+
/* What the usual layouts add to their definition: Slidev's looks for them. */
|
|
64
|
+
.deck-layout-section .deck-slot::before { content: ""; display: block; inline-size: 3em; block-size: 0.3em; background: var(--deck-fill); margin-block-end: 0.8em; border-radius: 0.15em; }
|
|
65
|
+
.deck-layout-statement :is(h1, h2, p, .deck-h1, .deck-h2) { font-size: 2.4em; font-family: var(--deck-heading); font-weight: 700; line-height: 1.2; }
|
|
66
|
+
.deck-slide.deck-layout-fact :is(h1, .deck-h1) { font-size: 5em; color: var(--deck-primary); margin-block-end: 0.15em; }
|
|
67
|
+
.deck-layout-quote blockquote { font-size: 1.7em; border: 0; padding: 0; font-family: var(--deck-heading); }
|
|
68
|
+
/* Scripts without italics keep their upright letters. */
|
|
69
|
+
.deck :is(blockquote, em):is(:lang(ar), :lang(fa), :lang(ur), :lang(he), :lang(ja), :lang(zh), :lang(ko), :lang(hi), :lang(th)) { font-style: normal; }
|
|
70
|
+
.deck-layout-quote blockquote::before { content: "\201C"; display: block; font-size: 2.4em; line-height: 0.6; color: var(--deck-primary); }
|
|
71
|
+
.deck-layout-full .deck-canvas { padding: 0; }
|
|
72
|
+
.deck-slide.has-image .deck-image { background: var(--deck-image) center / cover no-repeat, var(--deck-soft); }
|
|
73
|
+
.deck-layout-image-left.has-image .deck-canvas, .deck-layout-image-right.has-image .deck-canvas { padding: 0; grid-template: "image s-default" 1fr / 1fr 1fr !important; gap: 0; }
|
|
74
|
+
.deck-layout-image-right.has-image .deck-canvas { grid-template-areas: "s-default image" !important; }
|
|
75
|
+
:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-image { grid-area: image; }
|
|
76
|
+
:is(.deck-layout-image-left, .deck-layout-image-right).has-image .deck-slot { padding: 6cqi 5cqi; justify-content: center; }
|
|
77
|
+
:is(.deck-layout-image, .deck-layout-cover).has-image .deck-image { position: absolute; inset: 0; }
|
|
78
|
+
:is(.deck-layout-image, .deck-layout-cover).has-image .deck-slot { position: relative; color: #fff; text-shadow: 0 0.05em 0.4em rgb(0 0 0 / 0.6); }
|
|
79
|
+
.deck-layout-cover.has-image .deck-image::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgb(0 0 0 / 0.65), rgb(0 0 0 / 0.1)); }
|
|
80
|
+
.deck-class-invert { background: var(--deck-ink); color: var(--deck-paper); }
|
|
81
|
+
.deck-class-text-center .deck-slot { text-align: center; align-items: center; }
|
|
82
|
+
|
|
83
|
+
/* Steps: what a click shows next, there but unseen until then. */
|
|
84
|
+
.deck-step { transition: opacity 0.3s, translate 0.3s; }
|
|
85
|
+
.deck-step:not(.is-on) { opacity: 0; visibility: hidden; translate: 0 0.3em; }
|
|
86
|
+
.deck.is-editing .deck-step:not(.is-on), .deck.is-overview .deck-step:not(.is-on), .deck-print .deck-step { opacity: 1; visibility: visible; translate: none; }
|
|
87
|
+
|
|
88
|
+
/* Its bar. */
|
|
89
|
+
.deck-bar { display: flex; align-items: center; gap: 0.25rem; font: 0.85rem/1 system-ui, sans-serif; color: var(--deck-muted); }
|
|
90
|
+
.deck-bar button { display: inline-grid; place-items: center; min-inline-size: 2.25rem; min-block-size: 2.25rem; padding: 0 0.5rem; border: 0; border-radius: 0.5rem; background: none; color: var(--deck-ink); font: inherit; cursor: pointer; }
|
|
91
|
+
.deck-bar button:hover { background: color-mix(in srgb, var(--deck-ink) 8%, transparent); }
|
|
92
|
+
.deck-bar button:focus-visible { outline: 2px solid var(--deck-primary); outline-offset: 1px; }
|
|
93
|
+
.deck-bar button:disabled { opacity: 0.35; cursor: default; }
|
|
94
|
+
.deck-bar button[aria-pressed="true"] { background: color-mix(in srgb, var(--deck-primary) 18%, transparent); }
|
|
95
|
+
.deck-bar svg { inline-size: 1.15rem; block-size: 1.15rem; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
|
|
96
|
+
.deck-bar [dir="rtl"] .deck-flip, .deck[dir="rtl"] .deck-flip { scale: -1 1; }
|
|
97
|
+
.deck-where { font-variant-numeric: tabular-nums; min-inline-size: 4.5em; text-align: center; }
|
|
98
|
+
.deck-bar .deck-gap { flex: 1; }
|
|
99
|
+
|
|
100
|
+
/* Presented: the stage fills the screen, black around it. */
|
|
101
|
+
.deck-stage:fullscreen { display: grid; place-items: center; background: #000; }
|
|
102
|
+
.deck-stage:fullscreen .deck-slide { inline-size: min(100vw, 100vh * 16 / 9); border-radius: 0; box-shadow: none; }
|
|
103
|
+
.deck-stage:fullscreen .deck-slide:not(.is-shown) { inset-block-start: 50%; translate: 0 -50%; }
|
|
104
|
+
|
|
105
|
+
/* The presenter's view: this slide, the next, the notes and the time. */
|
|
106
|
+
.deck-presenter { display: none; }
|
|
107
|
+
.deck.is-presenting { grid-template: "stage next" auto "stage notes" 1fr "bar bar" auto / 3fr 2fr; min-block-size: 70vh; }
|
|
108
|
+
.deck.is-presenting .deck-stage { grid-area: stage; align-self: start; }
|
|
109
|
+
.deck.is-presenting .deck-presenter { display: contents; }
|
|
110
|
+
.deck.is-presenting .deck-bar { grid-area: bar; }
|
|
111
|
+
.deck-next { grid-area: next; display: grid; gap: 0.3rem; font: 0.8rem system-ui, sans-serif; color: var(--deck-muted); }
|
|
112
|
+
.deck-next .deck-slide { position: relative; visibility: visible; }
|
|
113
|
+
.deck-notes { grid-area: notes; overflow: auto; padding: 0.8rem 1rem; border-radius: 0.6rem; background: color-mix(in srgb, var(--deck-ink) 5%, transparent); font: 1.1rem/1.5 system-ui, sans-serif; white-space: pre-wrap; }
|
|
114
|
+
.deck-clock { font-variant-numeric: tabular-nums; font-size: 1.2rem; color: var(--deck-ink); }
|
|
115
|
+
|
|
116
|
+
/* All the slides at once. */
|
|
117
|
+
.deck.is-overview .deck-stage { display: grid; grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr)); gap: 0.8rem; view-transition-name: none; }
|
|
118
|
+
.deck.is-overview .deck-slide { position: relative; visibility: visible; cursor: pointer; }
|
|
119
|
+
.deck.is-overview .deck-slide.is-shown { box-shadow: 0 0 0 3px var(--deck-primary); }
|
|
120
|
+
|
|
121
|
+
/* Changed by hand: the Markdown beside the slides, and words changed on a slide in place. */
|
|
122
|
+
.deck.is-editing { grid-template: "source stage" auto "source bar" 1fr / minmax(18rem, 2fr) 3fr; align-items: start; }
|
|
123
|
+
.deck.is-editing .deck-stage { grid-area: stage; }
|
|
124
|
+
.deck.is-editing .deck-bar { grid-area: bar; }
|
|
125
|
+
.deck-source { display: none; }
|
|
126
|
+
.deck.is-editing .deck-source { display: block; grid-area: source; inline-size: 100%; block-size: min(80vh, 48rem); resize: vertical; padding: 0.8rem; border: 1px solid var(--deck-line); border-radius: 0.6rem; background: var(--deck-paper); color: var(--deck-ink); font: 0.85rem/1.55 ui-monospace, Menlo, Consolas, monospace; tab-size: 2; }
|
|
127
|
+
.deck.is-editing [data-edit] { cursor: text; border-radius: 0.15em; }
|
|
128
|
+
.deck.is-editing [data-edit]:hover { box-shadow: 0 0 0 0.12em color-mix(in srgb, var(--deck-primary) 45%, transparent); }
|
|
129
|
+
.deck [data-edit][contenteditable] { outline: 0.12em solid var(--deck-primary); outline-offset: 0.1em; }
|
|
130
|
+
.deck-slide[data-overflow] { box-shadow: 0 0 0 3px #c92a2a; }
|
|
131
|
+
@media (max-width: 52rem) { .deck.is-editing, .deck.is-presenting { grid-template: none; display: grid; } .deck.is-editing .deck-source { block-size: 40vh; } .deck.is-presenting .deck-presenter { display: grid; } }
|
|
132
|
+
|
|
133
|
+
/* Transitions between slides, as Slidev names them; none for those who'd rather not. */
|
|
134
|
+
::view-transition-group(deck-stage) { animation-duration: 0.45s; animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1); }
|
|
135
|
+
html[data-deck-transition~="fade"]::view-transition-old(deck-stage) { animation: 0.35s ease both deck-out-fade; }
|
|
136
|
+
html[data-deck-transition~="fade"]::view-transition-new(deck-stage) { animation: 0.35s ease both deck-in-fade; }
|
|
137
|
+
html[data-deck-transition~="slide-left"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-start; }
|
|
138
|
+
html[data-deck-transition~="slide-left"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-end; }
|
|
139
|
+
html[data-deck-transition~="slide-right"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-end; }
|
|
140
|
+
html[data-deck-transition~="slide-right"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-start; }
|
|
141
|
+
html[data-deck-transition~="slide-up"]::view-transition-old(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-out-up; }
|
|
142
|
+
html[data-deck-transition~="slide-up"]::view-transition-new(deck-stage) { animation: 0.45s cubic-bezier(0.2, 0.8, 0.2, 1) both deck-in-up; }
|
|
143
|
+
html[data-deck-transition~="morph"]::view-transition-old(deck-stage) { animation: 0.3s ease both deck-out-fade; }
|
|
144
|
+
html[data-deck-transition~="morph"]::view-transition-new(deck-stage) { animation: 0.3s ease both deck-in-fade; }
|
|
145
|
+
html[data-deck-transition~="morph"]::view-transition-group(*) { animation-duration: 0.6s; }
|
|
146
|
+
@keyframes deck-out-fade { to { opacity: 0; } }
|
|
147
|
+
@keyframes deck-in-fade { from { opacity: 0; } }
|
|
148
|
+
@keyframes deck-out-start { to { translate: -30% 0; opacity: 0; } }
|
|
149
|
+
@keyframes deck-in-end { from { translate: 30% 0; opacity: 0; } }
|
|
150
|
+
@keyframes deck-out-end { to { translate: 30% 0; opacity: 0; } }
|
|
151
|
+
@keyframes deck-in-start { from { translate: -30% 0; opacity: 0; } }
|
|
152
|
+
@keyframes deck-out-up { to { translate: 0 -20%; opacity: 0; } }
|
|
153
|
+
@keyframes deck-in-up { from { translate: 0 20%; opacity: 0; } }
|
|
154
|
+
@media (prefers-reduced-motion: reduce) { ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; } .deck-step { transition: none; } }
|
|
155
|
+
@media (forced-colors: active) { .deck-slide { border: 1px solid CanvasText; } .deck-step:not(.is-on) { visibility: hidden; } }
|
|
156
|
+
|
|
157
|
+
/* On paper: every slide, one a page, every step shown, no bar. */
|
|
158
|
+
@media print {
|
|
159
|
+
@page { size: 13.333in 7.5in; margin: 0; }
|
|
160
|
+
.deck-bar, .deck-source, .deck-presenter { display: none !important; }
|
|
161
|
+
.deck, .deck.is-editing, .deck.is-presenting { display: block; }
|
|
162
|
+
.deck-slide, .deck-slide:not(.is-shown) { position: relative; visibility: visible; break-after: page; border-radius: 0; box-shadow: none; inline-size: 100vw; }
|
|
163
|
+
.deck-step:not(.is-on) { opacity: 1; visibility: visible; translate: none; }
|
|
164
|
+
}
|