@heyramzi/ui 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/package.json +7 -8
  2. package/scripts/sync-shadcn.mjs +3 -4
  3. package/src/agents/agent-avatar.svelte +604 -575
  4. package/src/agents/agent-cast.svelte +179 -183
  5. package/src/agents/demo.svelte +125 -113
  6. package/src/agents/helpers.ts +23 -17
  7. package/src/agents/index.ts +4 -4
  8. package/src/agents/page-state.ts +6 -6
  9. package/src/agents/types.ts +6 -6
  10. package/src/ai/ai-button/AiButton.svelte +4 -12
  11. package/src/ai/generation-progress/GenerationProgress.svelte +10 -3
  12. package/src/ai/prompt-input/PromptInputTextarea.svelte +1 -2
  13. package/src/ai/response/Response.css +2 -3
  14. package/src/animations/avatar-group-hover.css +2 -16
  15. package/src/animations/card-tilt.css +3 -6
  16. package/src/animations/digit-pop-in.css +2 -15
  17. package/src/animations/dropdown.css +4 -17
  18. package/src/animations/input-clear-dissolve.css +5 -18
  19. package/src/animations/input-shake.css +9 -41
  20. package/src/animations/learn-more-hover.css +17 -9
  21. package/src/animations/like-button.css +2 -4
  22. package/src/animations/page-side-by-side.css +2 -10
  23. package/src/animations/plus-menu-morph.css +2 -5
  24. package/src/animations/shimmer-text.css +5 -18
  25. package/src/animations/spinning-counter.css +2 -6
  26. package/src/animations/success-check.css +2 -15
  27. package/src/animations/thinking-states.css +2 -7
  28. package/src/brand/brand.test.ts +21 -5
  29. package/src/brand/index.ts +4 -10
  30. package/src/canvas/card/card-frame.svelte +43 -39
  31. package/src/canvas/card/resize-handles.svelte +89 -80
  32. package/src/canvas/chrome/chrome-zoom.svelte +101 -100
  33. package/src/canvas/chrome/lock-badge.svelte +8 -8
  34. package/src/canvas/chrome/side-handles.svelte +24 -19
  35. package/src/canvas/chrome/size-chip.svelte +30 -30
  36. package/src/canvas/chrome/snap-guides.svelte +20 -20
  37. package/src/canvas/components/icons/ToolIcon.svelte +8 -8
  38. package/src/canvas/components/shared/svg/PreviewSvg.svelte +19 -19
  39. package/src/canvas/components/shared/svg/ShapeOutline.svelte +71 -48
  40. package/src/canvas/components/shared/svg/StrokeNode.svelte +21 -27
  41. package/src/canvas/components/shared/svg/TextRule.svelte +25 -17
  42. package/src/canvas/edges/bend-handle.svelte +46 -46
  43. package/src/canvas/edges/edge-gradient.svelte +10 -10
  44. package/src/canvas/edges/gradient-edge.svelte +45 -29
  45. package/src/canvas/editor/lock.test.ts +6 -1
  46. package/src/canvas/editor/style.ts +7 -1
  47. package/src/canvas/headless/svg-figure.test.ts +5 -1
  48. package/src/canvas/lod/lod-switch.svelte +111 -106
  49. package/src/canvas/pen/PenField.svelte +87 -81
  50. package/src/canvas/pen/PenOverlay.svelte +127 -127
  51. package/src/canvas/pen/ShapeNode.svelte +31 -32
  52. package/src/canvas/pen/TextNode.svelte +54 -53
  53. package/src/canvas/pen/host-field.test.svelte +7 -7
  54. package/src/canvas/pen/shapes.ts +7 -1
  55. package/src/canvas/screen/GlyphIcon.svelte +22 -17
  56. package/src/canvas/screen/PartView.svelte +138 -72
  57. package/src/canvas/screen/ScreenBody.svelte +81 -60
  58. package/src/canvas/screen/ScreenCard.svelte +20 -20
  59. package/src/canvas/ui/CanvasToolbar.svelte +173 -85
  60. package/src/canvas/ui/FrameLayer.svelte +59 -59
  61. package/src/canvas/ui/PenLayer.svelte +39 -30
  62. package/src/canvas/ui/StylePanel.svelte +119 -102
  63. package/src/canvas/ui/canvas-grid.svelte +137 -129
  64. package/src/charts/animated-value.svelte +1 -1
  65. package/src/charts/area-chart.css +2 -5
  66. package/src/charts/area-chart.svelte +1 -1
  67. package/src/charts/bar-chart.css +2 -3
  68. package/src/charts/bar-chart.svelte +1 -1
  69. package/src/charts/charts.css +5 -17
  70. package/src/charts/crosshair.svelte +1 -1
  71. package/src/charts/dashboard/dashboard-empty.svelte +25 -25
  72. package/src/charts/dashboard/dashboard-section.svelte +24 -24
  73. package/src/charts/dashboard/data-panel.svelte +50 -50
  74. package/src/charts/dashboard/data-sort-head.svelte +56 -56
  75. package/src/charts/dashboard/data-table.svelte +138 -138
  76. package/src/charts/dashboard/panel-grid.svelte +30 -30
  77. package/src/charts/dashboard/period-filter.svelte +25 -25
  78. package/src/charts/dashboard/rating-chip.svelte +19 -19
  79. package/src/charts/dashboard/stat-band.svelte +32 -32
  80. package/src/charts/dashboard/stat-tile.svelte +106 -99
  81. package/src/charts/donut-chart.svelte +1 -1
  82. package/src/charts/edge-fade.svelte +1 -1
  83. package/src/charts/figure.svelte +1 -1
  84. package/src/charts/gauge-chart.css +4 -7
  85. package/src/charts/gauge-chart.svelte +1 -1
  86. package/src/charts/hover-focus.svelte +1 -1
  87. package/src/charts/legend.css +1 -3
  88. package/src/charts/legend.svelte +1 -1
  89. package/src/charts/line-chart.svelte +1 -1
  90. package/src/charts/number-chart.css +6 -9
  91. package/src/charts/number-chart.svelte +1 -1
  92. package/src/charts/reference-line.svelte +19 -19
  93. package/src/charts/reveal.svelte +1 -1
  94. package/src/charts/ring-chart.css +2 -4
  95. package/src/charts/ring-chart.svelte +1 -1
  96. package/src/charts/sparkline.svelte +5 -2
  97. package/src/charts/stat-card.svelte +1 -1
  98. package/src/charts/time-series-chart.css +2 -5
  99. package/src/charts/trend-pill.css +2 -4
  100. package/src/charts/trend-pill.svelte +1 -1
  101. package/src/components/copy/copy-button.svelte +93 -98
  102. package/src/components/copy/copy-button.test.ts +10 -2
  103. package/src/components/data-table/infinite-scroll.svelte +42 -42
  104. package/src/components/data-table/pagination.svelte +34 -22
  105. package/src/components/data-table/row-arrow.svelte +19 -16
  106. package/src/components/data-table/row-context-menu.svelte +52 -52
  107. package/src/components/data-table/sortable-head.svelte +25 -25
  108. package/src/components/data-table/table-skeleton.svelte +41 -36
  109. package/src/components/docs/doc-page.svelte +18 -9
  110. package/src/components/docs/on-this-page.svelte +16 -3
  111. package/src/components/docs/scroll-spy.svelte.ts +2 -3
  112. package/src/components/field-row/field-row.svelte +10 -8
  113. package/src/components/hold-to-confirm/hold-to-confirm.svelte +5 -1
  114. package/src/components/icon/icon.svelte +14 -14
  115. package/src/components/language-flag/language-flag.svelte +3 -1
  116. package/src/components/list-page/detail-empty.svelte +34 -34
  117. package/src/components/list-page/detail-header.svelte +55 -47
  118. package/src/components/list-page/detail-panel.svelte +51 -59
  119. package/src/components/list-page/detail-row.svelte +19 -19
  120. package/src/components/list-page/detail-stack.svelte +21 -21
  121. package/src/components/list-page/empty-state.svelte +30 -30
  122. package/src/components/list-page/filter-item.svelte +20 -20
  123. package/src/components/list-page/filter-popover.svelte +60 -55
  124. package/src/components/list-page/grouped-list.svelte +4 -2
  125. package/src/components/list-page/index.ts +5 -1
  126. package/src/components/list-page/list-page-shell.svelte +2 -5
  127. package/src/components/list-page/master-detail.svelte +87 -88
  128. package/src/components/list-page/notice-bar.svelte +38 -38
  129. package/src/components/list-page/prev-next.svelte +63 -63
  130. package/src/components/list-page/rail-body.svelte +18 -18
  131. package/src/components/list-page/rail-empty.svelte +23 -30
  132. package/src/components/list-page/rail-head.svelte +24 -24
  133. package/src/components/list-page/rail-row.svelte +77 -73
  134. package/src/components/list-page/section-host.ts +2 -3
  135. package/src/components/locale-switch/locale-switch.svelte +41 -41
  136. package/src/components/mark/mark.svelte +34 -38
  137. package/src/components/open-in/index.ts +1 -5
  138. package/src/components/open-in/open-in.svelte +40 -40
  139. package/src/components/picker/mark-picker.svelte +49 -49
  140. package/src/components/picker/picker.svelte +5 -3
  141. package/src/components/section-header/section-header.test.ts +7 -1
  142. package/src/components/section-header/section-label.svelte +20 -20
  143. package/src/components/segmented/animated-tabs.svelte +31 -2
  144. package/src/components/segmented/collapse.test.ts +2 -1
  145. package/src/components/segmented/index.ts +2 -0
  146. package/src/components/segmented/segment.svelte +52 -49
  147. package/src/components/segmented/segmented-filter.svelte +79 -80
  148. package/src/components/segmented/segmented-nav.svelte +34 -40
  149. package/src/components/segmented/segmented-overflow.svelte +53 -50
  150. package/src/components/segmented/segmented-track.svelte +62 -46
  151. package/src/components/segmented/segmented.ts +2 -3
  152. package/src/components/star-rating-input/star-rating-input.svelte +103 -103
  153. package/src/components/svg/svg.svelte +4 -4
  154. package/src/components/table-view/table-view.svelte +17 -2
  155. package/src/components/table-view/table-view.test.ts +7 -1
  156. package/src/components/table-view/types.ts +11 -11
  157. package/src/components/tags-input/index.ts +13 -0
  158. package/src/components/tags-input/tags-input.svelte +305 -0
  159. package/src/components/tags-input/tags.test.ts +64 -0
  160. package/src/components/tags-input/tags.ts +142 -0
  161. package/src/components/theme/index.ts +2 -4
  162. package/src/components/theme/theme-provider.svelte +1 -3
  163. package/src/components/toolbar/toolbar-search.svelte +25 -25
  164. package/src/components/toolbar/toolbar.svelte +11 -7
  165. package/src/components/toolbar/toolbar.test.ts +10 -1
  166. package/src/design/index.css +21 -78
  167. package/src/design/polish.css +26 -35
  168. package/src/editor/editor-toolbar.svelte +104 -99
  169. package/src/editor/editor.svelte +296 -266
  170. package/src/editor/image-toolbar.svelte +20 -22
  171. package/src/editor/index.ts +1 -4
  172. package/src/editor/inline-editor.svelte +280 -238
  173. package/src/editor/markdown.ts +15 -15
  174. package/src/editor/renderer.svelte +71 -71
  175. package/src/editor/slash-menu.svelte +24 -27
  176. package/src/effects/animated-beam/diagrams/BeamSvg.svelte +1 -1
  177. package/src/effects/image-comparison/ImageComparison.svelte +11 -1
  178. package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +59 -46
  179. package/src/effects/magic-card/MagicCard.css +14 -7
  180. package/src/effects/marquee/Marquee.svelte +3 -5
  181. package/src/effects/reveal/observe.ts +0 -3
  182. package/src/effects/spotlight/Spotlight.svelte +1 -1
  183. package/src/effects/theme-toggle/ThemeToggle.css +25 -22
  184. package/src/effects/theme-toggle/ThemeToggle.svelte +6 -7
  185. package/src/gallery.test.ts +14 -4
  186. package/src/inbox/README.md +1 -3
  187. package/src/inbox/inbox.test.ts +181 -138
  188. package/src/inbox/index.ts +20 -20
  189. package/src/inbox/logic.ts +114 -111
  190. package/src/inbox/thread-inbox.svelte +227 -151
  191. package/src/inbox/types.ts +130 -108
  192. package/src/lib/theme-transition.ts +2 -4
  193. package/src/lib/tone.ts +2 -4
  194. package/src/lib/utils.ts +2 -2
  195. package/src/modules.test.ts +79 -69
  196. package/src/onboarding/define-tours.test.ts +55 -40
  197. package/src/onboarding/define-tours.ts +23 -23
  198. package/src/onboarding/demo.svelte +24 -5
  199. package/src/onboarding/index.ts +1 -8
  200. package/src/onboarding/onboarding-provider.svelte +19 -7
  201. package/src/onboarding/onboarding.svelte.ts +16 -16
  202. package/src/onboarding/pick.test.ts +61 -52
  203. package/src/onboarding/pick.ts +16 -13
  204. package/src/onboarding/stores.test.ts +80 -80
  205. package/src/onboarding/stores.ts +41 -39
  206. package/src/onboarding/tour-card.svelte +30 -5
  207. package/src/onboarding/tour-runner.svelte +12 -3
  208. package/src/onboarding/types.ts +20 -12
  209. package/src/onboarding/wait.ts +22 -22
  210. package/src/panel/side-panel.svelte +94 -93
  211. package/src/record/demo-data.ts +291 -225
  212. package/src/record/field-section.svelte +38 -34
  213. package/src/record/fields.ts +148 -96
  214. package/src/record/format.ts +63 -56
  215. package/src/record/index.ts +49 -35
  216. package/src/record/info-list.svelte +145 -114
  217. package/src/record/kinds.ts +31 -31
  218. package/src/record/logic.ts +216 -214
  219. package/src/record/next-up.svelte +45 -34
  220. package/src/record/project-list.svelte +56 -50
  221. package/src/record/record-demo.svelte +130 -110
  222. package/src/record/record-header.svelte +37 -28
  223. package/src/record/record-shell.svelte +54 -54
  224. package/src/record/record-stats.svelte +25 -25
  225. package/src/record/record-timeline.svelte +134 -114
  226. package/src/record/record.test.ts +430 -309
  227. package/src/record/steps-rail.svelte +225 -216
  228. package/src/record/types.ts +234 -215
  229. package/src/record/where-we-are.svelte +62 -58
  230. package/src/shadcn/button/button.svelte +1 -1
  231. package/src/shadcn/card/card-title.svelte +1 -5
  232. package/src/shadcn/hooks/use-highlighted-code.svelte.ts +2 -13
  233. package/src/shadcn/sheet/sheet-content.svelte +2 -4
  234. package/src/shadcn/table/table-cell.svelte +2 -3
  235. package/src/shadcn/utilities.css +3 -8
  236. package/src/slides/Controls.svelte +150 -124
  237. package/src/slides/Deck.svelte +243 -238
  238. package/src/slides/Fragment.svelte +64 -57
  239. package/src/slides/Overview.svelte +106 -101
  240. package/src/slides/Presenter.svelte +300 -266
  241. package/src/slides/Slide.svelte +185 -170
  242. package/src/slides/SlideList.svelte +16 -12
  243. package/src/slides/ambient.d.ts +1 -1
  244. package/src/slides/bridges.ts +42 -23
  245. package/src/slides/deck-controller.svelte.ts +47 -35
  246. package/src/slides/demo-slides.svelte +330 -306
  247. package/src/slides/demo.svelte +164 -160
  248. package/src/slides/export/capture.ts +20 -16
  249. package/src/slides/export/ffmpeg.ts +43 -38
  250. package/src/slides/export/index.ts +5 -5
  251. package/src/slides/export/launch.ts +3 -1
  252. package/src/slides/export/pdf.ts +30 -27
  253. package/src/slides/export/types.ts +10 -8
  254. package/src/slides/index.ts +11 -11
  255. package/src/slides/labels.ts +22 -19
  256. package/src/slides/layout.ts +9 -2
  257. package/src/slides/model.ts +4 -4
  258. package/src/slides/navigation.ts +43 -31
  259. package/src/slides/theme.css +5 -7
  260. package/src/slides/types.ts +9 -10
  261. package/src/status/define-statuses.ts +17 -24
  262. package/src/status/index.ts +5 -5
  263. package/src/status/status-badge.svelte +3 -1
  264. package/src/status/status-dot.svelte +1 -3
  265. package/src/status/status-icon.svelte +1 -1
  266. package/src/status/status-types.ts +21 -21
  267. package/src/tasks/board-order.ts +2 -4
  268. package/src/tasks/demo.svelte +189 -31
  269. package/src/tasks/detail/detail-demo.svelte +73 -13
  270. package/src/tasks/detail/detail-types.ts +45 -45
  271. package/src/tasks/detail/task-detail.svelte +40 -10
  272. package/src/tasks/detail/task-property.svelte +8 -2
  273. package/src/tasks/detail/task-thread.svelte +53 -12
  274. package/src/tasks/gantt/gantt-bar.svelte +17 -6
  275. package/src/tasks/gantt/gantt-grid.svelte +40 -9
  276. package/src/tasks/gantt/gantt-group-row.svelte +8 -2
  277. package/src/tasks/gantt/gantt-header.svelte +9 -3
  278. package/src/tasks/gantt/gantt-task-row.svelte +26 -6
  279. package/src/tasks/gantt/gantt.css +2 -1
  280. package/src/tasks/gantt/gantt.test.ts +3 -1
  281. package/src/tasks/gantt/logic.test.ts +110 -20
  282. package/src/tasks/gantt/logic.ts +42 -6
  283. package/src/tasks/inbox/inbox-card.svelte +13 -5
  284. package/src/tasks/inbox/inbox-draft.svelte +1 -1
  285. package/src/tasks/inbox/inbox-logic.ts +6 -40
  286. package/src/tasks/inbox/inbox-statuses.ts +23 -23
  287. package/src/tasks/inbox/inbox-trace.svelte +9 -3
  288. package/src/tasks/inbox/inbox-types.ts +54 -58
  289. package/src/tasks/inbox/index.ts +22 -21
  290. package/src/tasks/index.ts +49 -52
  291. package/src/tasks/kanban-board.svelte +16 -12
  292. package/src/tasks/kanban-types.ts +2 -3
  293. package/src/tasks/presets/sales.ts +6 -6
  294. package/src/tasks/task-gantt.svelte +28 -8
  295. package/src/tasks/task-list.svelte +41 -17
  296. package/src/tasks/time/duration.ts +40 -40
  297. package/src/tasks/time/time-chip.svelte +9 -2
  298. package/src/tasks/time/time-dot.svelte +1 -1
  299. package/src/tasks/time/time-ring.svelte +11 -3
  300. package/src/tasks/time/time-tracker.svelte +57 -15
  301. package/src/tasks/time/time-types.ts +57 -57
  302. package/src/tasks/use-kanban-dnd.svelte.ts +2 -3
  303. package/src/thread/index.ts +7 -7
  304. package/src/thread/logic.ts +36 -33
  305. package/src/thread/thread.svelte +82 -16
  306. package/src/thread/thread.test.ts +58 -47
  307. package/src/thread/types.ts +68 -68
  308. package/src/tokens/craft.css +17 -53
  309. package/src/tokens/index.css +3 -13
  310. package/src/tokens/palette.css +13 -11
  311. package/src/tokens/primitives.css +10 -23
  312. package/src/tasks/inbox/inbox.svelte +0 -203
@@ -1,358 +1,382 @@
1
1
  <script lang="ts" module>
2
- /** The demo's type pairing. A deck sets these two variables and every slide follows. */
3
- export const demoStyle =
4
- "--deck-font:'Schibsted Grotesk',ui-sans-serif,system-ui,sans-serif;--deck-font-display:'Bricolage Grotesque','Schibsted Grotesk',ui-sans-serif,sans-serif;";
2
+ /** The demo's type pairing. A deck sets these two variables and every slide follows. */
3
+ export const demoStyle =
4
+ "--deck-font:'Schibsted Grotesk',ui-sans-serif,system-ui,sans-serif;--deck-font-display:'Bricolage Grotesque','Schibsted Grotesk',ui-sans-serif,sans-serif;";
5
5
  </script>
6
6
 
7
7
  <script lang="ts">
8
- import Fragment from './Fragment.svelte';
9
- import Slide from './Slide.svelte';
8
+ import Fragment from "./Fragment.svelte";
9
+ import Slide from "./Slide.svelte";
10
10
 
11
- const keys = [
12
- { does: 'Next', keys: ['→', 'Space', 'PgDn'] },
13
- { does: 'Back', keys: ['←', 'Shift Space', 'PgUp'] },
14
- { does: 'First or last', keys: ['Home', 'End'] },
15
- { does: 'Overview', keys: ['O'] },
16
- { does: 'Fullscreen', keys: ['F'] },
17
- { does: 'Presenter', keys: ['P'] },
18
- ];
11
+ const keys = [
12
+ { does: "Next", keys: ["→", "Space", "PgDn"] },
13
+ { does: "Back", keys: ["←", "Shift Space", "PgUp"] },
14
+ { does: "First or last", keys: ["Home", "End"] },
15
+ { does: "Overview", keys: ["O"] },
16
+ { does: "Fullscreen", keys: ["F"] },
17
+ { does: "Presenter", keys: ["P"] },
18
+ ];
19
19
  </script>
20
20
 
21
21
  <svelte:head>
22
- <link rel="preconnect" href="https://fonts.googleapis.com" />
23
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
24
- <link
25
- rel="stylesheet"
26
- href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,800&family=Schibsted+Grotesk:wght@400;500;600&display=swap"
27
- />
22
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
23
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
24
+ <link
25
+ rel="stylesheet"
26
+ href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,800&family=Schibsted+Grotesk:wght@400;500;600&display=swap"
27
+ />
28
28
  </svelte:head>
29
29
 
30
30
  <Slide
31
- align="bare"
32
- label="Cover"
33
- notes="Open with the promise: design once at 960 by 540 and it fits anything. Resize the window while you say it, the slide keeps its shape."
31
+ align="bare"
32
+ label="Cover"
33
+ notes="Open with the promise: design once at 960 by 540 and it fits anything. Resize the window while you say it, the slide keeps its shape."
34
34
  >
35
- <div class="cover">
36
- <div class="cover__text">
37
- <p class="deck-label">@heyramzi/ui/slides</p>
38
- <h1 class="deck-display">One canvas, any screen.</h1>
39
- <p class="deck-lead">Design in 960 by 540 pixels. The deck scales to fit a phone, a laptop or a projector.</p>
40
- </div>
41
- <svg class="cover__fit" viewBox="0 0 280 204" role="img" aria-label="The same slide fitted into a phone, a wide window and a screen">
42
- <rect x="6" y="6" width="96" height="190" rx="14" class="frame" />
43
- <rect x="12" y="75" width="84" height="47.25" rx="3" class="slide-shape" />
44
- <rect x="126" y="6" width="148" height="83.25" rx="8" class="frame" />
45
- <rect x="131" y="11" width="138" height="73.25" rx="3" class="slide-shape" />
46
- <rect x="126" y="126" width="148" height="70" rx="8" class="frame" />
47
- <rect x="151.6" y="131" width="96.8" height="60" rx="3" class="slide-shape" />
48
- </svg>
49
- <p class="deck-caption cover__hint">Right arrow or space to go on.</p>
50
- </div>
35
+ <div class="cover">
36
+ <div class="cover__text">
37
+ <p class="deck-label">@heyramzi/ui/slides</p>
38
+ <h1 class="deck-display">One canvas, any screen.</h1>
39
+ <p class="deck-lead">
40
+ Design in 960 by 540 pixels. The deck scales to fit a phone, a laptop or a projector.
41
+ </p>
42
+ </div>
43
+ <svg
44
+ class="cover__fit"
45
+ viewBox="0 0 280 204"
46
+ role="img"
47
+ aria-label="The same slide fitted into a phone, a wide window and a screen"
48
+ >
49
+ <rect x="6" y="6" width="96" height="190" rx="14" class="frame" />
50
+ <rect x="12" y="75" width="84" height="47.25" rx="3" class="slide-shape" />
51
+ <rect x="126" y="6" width="148" height="83.25" rx="8" class="frame" />
52
+ <rect x="131" y="11" width="138" height="73.25" rx="3" class="slide-shape" />
53
+ <rect x="126" y="126" width="148" height="70" rx="8" class="frame" />
54
+ <rect x="151.6" y="131" width="96.8" height="60" rx="3" class="slide-shape" />
55
+ </svg>
56
+ <p class="deck-caption cover__hint">Right arrow or space to go on.</p>
57
+ </div>
51
58
  </Slide>
52
59
 
53
60
  <Slide
54
- align="bare"
55
- label="Reveals"
56
- notes="Press the arrow slowly and let each row land. The last step has two rows, so you can see them arrive one after the other."
61
+ align="bare"
62
+ label="Reveals"
63
+ notes="Press the arrow slowly and let each row land. The last step has two rows, so you can see them arrive one after the other."
57
64
  >
58
- <div class="split split--rows">
59
- <div class="split__head">
60
- <p class="deck-label">Reveals</p>
61
- <h2 class="deck-title">Press once and one thing appears.</h2>
62
- </div>
63
- <ol class="rows">
64
- <Fragment as="li" step={1} class="row">
65
- <h3 class="deck-heading">Walk it by hand</h3>
66
- <p class="deck-body">An arrow press shows one step. After the last, the next slide.</p>
67
- </Fragment>
68
- <Fragment as="li" step={2} class="row">
69
- <h3 class="deck-heading">Back undoes a step</h3>
70
- <p class="deck-body">Going back lands on the earlier slide fully shown.</p>
71
- </Fragment>
72
- <Fragment as="li" step={3} class="row">
73
- <h3 class="deck-heading">Shared steps stagger</h3>
74
- <p class="deck-body">Rows that share a step arrive one after another.</p>
75
- </Fragment>
76
- <Fragment as="li" step={3} class="row">
77
- <h3 class="deck-heading">Print shows them all</h3>
78
- <p class="deck-body">A PDF has no keyboard. It shows every step.</p>
79
- </Fragment>
80
- </ol>
81
- </div>
65
+ <div class="split split--rows">
66
+ <div class="split__head">
67
+ <p class="deck-label">Reveals</p>
68
+ <h2 class="deck-title">Press once and one thing appears.</h2>
69
+ </div>
70
+ <ol class="rows">
71
+ <Fragment as="li" step={1} class="row">
72
+ <h3 class="deck-heading">Walk it by hand</h3>
73
+ <p class="deck-body">An arrow press shows one step. After the last, the next slide.</p>
74
+ </Fragment>
75
+ <Fragment as="li" step={2} class="row">
76
+ <h3 class="deck-heading">Back undoes a step</h3>
77
+ <p class="deck-body">Going back lands on the earlier slide fully shown.</p>
78
+ </Fragment>
79
+ <Fragment as="li" step={3} class="row">
80
+ <h3 class="deck-heading">Shared steps stagger</h3>
81
+ <p class="deck-body">Rows that share a step arrive one after another.</p>
82
+ </Fragment>
83
+ <Fragment as="li" step={3} class="row">
84
+ <h3 class="deck-heading">Print shows them all</h3>
85
+ <p class="deck-body">A PDF has no keyboard. It shows every step.</p>
86
+ </Fragment>
87
+ </ol>
88
+ </div>
82
89
  </Slide>
83
90
 
84
91
  <Slide
85
- align="bare"
86
- label="Keys"
87
- notes="Press O now. The slides zoom out into a grid and you can click one to jump. Escape or O brings you back."
92
+ align="bare"
93
+ label="Keys"
94
+ notes="Press O now. The slides zoom out into a grid and you can click one to jump. Escape or O brings you back."
88
95
  >
89
- <div class="split">
90
- <div class="split__head">
91
- <p class="deck-label">Keys</p>
92
- <h2 class="deck-title">Press <kbd class="key key--big">O</kbd> to see the whole deck.</h2>
93
- <p class="deck-body">Click a slide to jump to it. Escape closes the grid.</p>
94
- </div>
95
- <dl class="keys">
96
- {#each keys as row (row.does)}
97
- <div class="keys__row">
98
- <dt class="deck-body">{row.does}</dt>
99
- <dd>
100
- {#each row.keys as key (key)}<kbd class="key">{key}</kbd>{/each}
101
- </dd>
102
- </div>
103
- {/each}
104
- </dl>
105
- </div>
96
+ <div class="split">
97
+ <div class="split__head">
98
+ <p class="deck-label">Keys</p>
99
+ <h2 class="deck-title">Press <kbd class="key key--big">O</kbd> to see the whole deck.</h2>
100
+ <p class="deck-body">Click a slide to jump to it. Escape closes the grid.</p>
101
+ </div>
102
+ <dl class="keys">
103
+ {#each keys as row (row.does)}
104
+ <div class="keys__row">
105
+ <dt class="deck-body">{row.does}</dt>
106
+ <dd>
107
+ {#each row.keys as key (key)}<kbd class="key">{key}</kbd>{/each}
108
+ </dd>
109
+ </div>
110
+ {/each}
111
+ </dl>
112
+ </div>
106
113
  </Slide>
107
114
 
108
115
  <Slide
109
- align="bare"
110
- label="Themes"
111
- notes="Switch the theme from the toolbar above the deck while this slide is up. Nothing else changes, because every colour is a variable."
116
+ align="bare"
117
+ label="Themes"
118
+ notes="Switch the theme from the toolbar above the deck while this slide is up. Nothing else changes, because every colour is a variable."
112
119
  >
113
- <div class="split">
114
- <div class="split__head">
115
- <p class="deck-label">Themes</p>
116
- <h2 class="deck-title">Retheme with variables.</h2>
117
- <p class="deck-body">Ink, paper or the system setting. The package brings no brand of its own.</p>
118
- </div>
119
- <div class="theme">
120
- <pre class="code"><code>.deck &#123;
120
+ <div class="split">
121
+ <div class="split__head">
122
+ <p class="deck-label">Themes</p>
123
+ <h2 class="deck-title">Retheme with variables.</h2>
124
+ <p class="deck-body">
125
+ Ink, paper or the system setting. The package brings no brand of its own.
126
+ </p>
127
+ </div>
128
+ <div class="theme">
129
+ <pre class="code"><code
130
+ >.deck &#123;
121
131
  --deck-accent: #ff4d8d;
122
132
  --deck-font-display: 'Space Grotesk';
123
133
  --deck-pad: 72px;
124
- &#125;</code></pre>
125
- <div class="swatch" role="img" aria-label="Ground, text and accent in proportion">
126
- <span class="swatch__ground">Ground</span>
127
- <span class="swatch__text">Text</span>
128
- <span class="swatch__accent"></span>
129
- </div>
130
- </div>
131
- </div>
134
+ &#125;</code
135
+ ></pre>
136
+ <div class="swatch" role="img" aria-label="Ground, text and accent in proportion">
137
+ <span class="swatch__ground">Ground</span>
138
+ <span class="swatch__text">Text</span>
139
+ <span class="swatch__accent"></span>
140
+ </div>
141
+ </div>
142
+ </div>
132
143
  </Slide>
133
144
 
134
145
  <Slide
135
- align="bare"
136
- label="Data"
137
- notes="This is the mode the apps use: slides are JSON, and a registry says how each type draws itself. Validation is optional and brings no dependency."
146
+ align="bare"
147
+ label="Data"
148
+ notes="This is the mode the apps use: slides are JSON, and a registry says how each type draws itself. Validation is optional and brings no dependency."
138
149
  >
139
- <div class="split">
140
- <div class="split__head">
141
- <p class="deck-label">Data</p>
142
- <h2 class="deck-title">Or write the deck as data.</h2>
143
- <p class="deck-body">A registry maps each slide type to a layout. Bring your own schema if you want one.</p>
144
- </div>
145
- <div class="theme">
146
- <pre class="code"><code>const cover = defineSlideType(&#123;
150
+ <div class="split">
151
+ <div class="split__head">
152
+ <p class="deck-label">Data</p>
153
+ <h2 class="deck-title">Or write the deck as data.</h2>
154
+ <p class="deck-body">
155
+ A registry maps each slide type to a layout. Bring your own schema if you want one.
156
+ </p>
157
+ </div>
158
+ <div class="theme">
159
+ <pre class="code"><code
160
+ >const cover = defineSlideType(&#123;
147
161
  type: 'cover',
148
162
  label: 'Cover',
149
163
  layout: CoverLayout,
150
164
  &#125;);
151
165
 
152
- &lt;Deck &#123;...deck&#125; &#123;registry&#125; /&gt;</code></pre>
153
- <pre class="code"><code>&#123; "id": "q3", "title": "Q3 review",
166
+ &lt;Deck &#123;...deck&#125; &#123;registry&#125; /&gt;</code
167
+ ></pre>
168
+ <pre class="code"><code
169
+ >&#123; "id": "q3", "title": "Q3 review",
154
170
  "canvas": &#123; "w": 960, "h": 540 &#125;,
155
171
  "slides": [&#123; "id": "a", "type": "cover",
156
- "content": &#123; "title": "Q3" &#125; &#125;] &#125;</code></pre>
157
- </div>
158
- </div>
172
+ "content": &#123; "title": "Q3" &#125; &#125;] &#125;</code
173
+ ></pre>
174
+ </div>
175
+ </div>
159
176
  </Slide>
160
177
 
161
178
  <Slide
162
- align="bare"
163
- label="Presenter"
164
- notes="Open the presenter view from the toolbar. Move on here and watch the other window follow. Then print the page: one canvas per page, every step shown."
179
+ align="bare"
180
+ label="Presenter"
181
+ notes="Open the presenter view from the toolbar. Move on here and watch the other window follow. Then print the page: one canvas per page, every step shown."
165
182
  >
166
- <div class="close">
167
- <p class="deck-label">Presenter view and print</p>
168
- <h2 class="deck-title">Notes in one window, the audience in another.</h2>
169
- <p class="deck-lead">Both windows follow the same slide. Print the page and every canvas gets its own page, steps shown.</p>
170
- </div>
183
+ <div class="close">
184
+ <p class="deck-label">Presenter view and print</p>
185
+ <h2 class="deck-title">Notes in one window, the audience in another.</h2>
186
+ <p class="deck-lead">
187
+ Both windows follow the same slide. Print the page and every canvas gets its own page, steps
188
+ shown.
189
+ </p>
190
+ </div>
171
191
  </Slide>
172
192
 
173
193
  <style>
174
- .cover,
175
- .split,
176
- .close {
177
- position: relative;
178
- box-sizing: border-box;
179
- height: 100%;
180
- padding: var(--deck-pad);
181
- }
194
+ .cover,
195
+ .split,
196
+ .close {
197
+ position: relative;
198
+ box-sizing: border-box;
199
+ height: 100%;
200
+ padding: var(--deck-pad);
201
+ }
182
202
 
183
- /* Cover: copy on the left, the fit diagram on the right. */
184
- .cover {
185
- display: grid;
186
- grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr);
187
- gap: 48px;
188
- align-items: center;
189
- }
190
- .cover__text {
191
- display: grid;
192
- gap: 22px;
193
- justify-items: start;
194
- }
195
- .cover__text .deck-display {
196
- max-width: 9ch;
197
- }
198
- .cover__text .deck-lead {
199
- max-width: 24em;
200
- }
201
- .cover__fit {
202
- width: 100%;
203
- max-height: 100%;
204
- overflow: visible;
205
- }
206
- .frame {
207
- fill: var(--deck-surface);
208
- stroke: var(--deck-line);
209
- stroke-width: 1.5;
210
- }
211
- .slide-shape {
212
- fill: var(--deck-accent);
213
- }
214
- .cover__hint {
215
- position: absolute;
216
- bottom: 40px;
217
- left: var(--deck-pad);
218
- }
203
+ /* Cover: copy on the left, the fit diagram on the right. */
204
+ .cover {
205
+ display: grid;
206
+ grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr);
207
+ gap: 48px;
208
+ align-items: center;
209
+ }
210
+ .cover__text {
211
+ display: grid;
212
+ gap: 22px;
213
+ justify-items: start;
214
+ }
215
+ .cover__text .deck-display {
216
+ max-width: 9ch;
217
+ }
218
+ .cover__text .deck-lead {
219
+ max-width: 24em;
220
+ }
221
+ .cover__fit {
222
+ width: 100%;
223
+ max-height: 100%;
224
+ overflow: visible;
225
+ }
226
+ .frame {
227
+ fill: var(--deck-surface);
228
+ stroke: var(--deck-line);
229
+ stroke-width: 1.5;
230
+ }
231
+ .slide-shape {
232
+ fill: var(--deck-accent);
233
+ }
234
+ .cover__hint {
235
+ position: absolute;
236
+ bottom: 40px;
237
+ left: var(--deck-pad);
238
+ }
219
239
 
220
- /* Split: a heading column and a content column. */
221
- .split {
222
- display: grid;
223
- grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
224
- gap: 56px;
225
- align-items: center;
226
- }
227
- .split--rows {
228
- grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
229
- }
230
- .split__head {
231
- display: grid;
232
- gap: 18px;
233
- justify-items: start;
234
- }
235
- .split__head .deck-title {
236
- max-width: 11ch;
237
- }
238
- .split__head .deck-body {
239
- max-width: 22em;
240
- }
240
+ /* Split: a heading column and a content column. */
241
+ .split {
242
+ display: grid;
243
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
244
+ gap: 56px;
245
+ align-items: center;
246
+ }
247
+ .split--rows {
248
+ grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
249
+ }
250
+ .split__head {
251
+ display: grid;
252
+ gap: 18px;
253
+ justify-items: start;
254
+ }
255
+ .split__head .deck-title {
256
+ max-width: 11ch;
257
+ }
258
+ .split__head .deck-body {
259
+ max-width: 22em;
260
+ }
241
261
 
242
- .rows {
243
- margin: 0;
244
- padding: 0;
245
- list-style: none;
246
- }
247
- .rows :global(.row) {
248
- display: grid;
249
- gap: 4px;
250
- padding: 15px 0;
251
- border-top: 1px solid var(--deck-line);
252
- }
253
- .rows :global(.deck-heading) {
254
- font-size: 23px;
255
- }
256
- .rows :global(.deck-body) {
257
- font-size: 16px;
258
- }
259
- .rows :global(.row:last-child) {
260
- border-bottom: 1px solid var(--deck-line);
261
- }
262
+ .rows {
263
+ margin: 0;
264
+ padding: 0;
265
+ list-style: none;
266
+ }
267
+ .rows :global(.row) {
268
+ display: grid;
269
+ gap: 4px;
270
+ padding: 15px 0;
271
+ border-top: 1px solid var(--deck-line);
272
+ }
273
+ .rows :global(.deck-heading) {
274
+ font-size: 23px;
275
+ }
276
+ .rows :global(.deck-body) {
277
+ font-size: 16px;
278
+ }
279
+ .rows :global(.row:last-child) {
280
+ border-bottom: 1px solid var(--deck-line);
281
+ }
262
282
 
263
- .keys {
264
- margin: 0;
265
- border-top: 1px solid var(--deck-line);
266
- }
267
- .keys__row {
268
- display: flex;
269
- align-items: center;
270
- justify-content: space-between;
271
- padding: 12px 0;
272
- border-bottom: 1px solid var(--deck-line);
273
- }
274
- .keys dd {
275
- display: flex;
276
- gap: 6px;
277
- margin: 0;
278
- }
279
- .key {
280
- display: inline-grid;
281
- place-items: center;
282
- min-width: 30px;
283
- height: 28px;
284
- padding: 0 9px;
285
- font: 600 13px/1 var(--deck-font);
286
- color: var(--deck-fg);
287
- background: var(--deck-surface);
288
- border: 1px solid var(--deck-line);
289
- border-bottom-width: 2px;
290
- border-radius: 7px;
291
- }
292
- .key--big {
293
- min-width: 0;
294
- height: 1.05em;
295
- padding: 0 0.28em;
296
- margin: 0 0.08em;
297
- font: inherit;
298
- font-size: 0.85em;
299
- color: var(--deck-on-accent);
300
- background: var(--deck-accent);
301
- border-color: var(--deck-accent);
302
- vertical-align: 0.04em;
303
- }
283
+ .keys {
284
+ margin: 0;
285
+ border-top: 1px solid var(--deck-line);
286
+ }
287
+ .keys__row {
288
+ display: flex;
289
+ align-items: center;
290
+ justify-content: space-between;
291
+ padding: 12px 0;
292
+ border-bottom: 1px solid var(--deck-line);
293
+ }
294
+ .keys dd {
295
+ display: flex;
296
+ gap: 6px;
297
+ margin: 0;
298
+ }
299
+ .key {
300
+ display: inline-grid;
301
+ place-items: center;
302
+ min-width: 30px;
303
+ height: 28px;
304
+ padding: 0 9px;
305
+ font: 600 13px/1 var(--deck-font);
306
+ color: var(--deck-fg);
307
+ background: var(--deck-surface);
308
+ border: 1px solid var(--deck-line);
309
+ border-bottom-width: 2px;
310
+ border-radius: 7px;
311
+ }
312
+ .key--big {
313
+ min-width: 0;
314
+ height: 1.05em;
315
+ padding: 0 0.28em;
316
+ margin: 0 0.08em;
317
+ font: inherit;
318
+ font-size: 0.85em;
319
+ color: var(--deck-on-accent);
320
+ background: var(--deck-accent);
321
+ border-color: var(--deck-accent);
322
+ vertical-align: 0.04em;
323
+ }
304
324
 
305
- .theme {
306
- display: grid;
307
- gap: 16px;
308
- }
309
- .code {
310
- margin: 0;
311
- padding: 20px 22px;
312
- overflow: hidden;
313
- font: 500 14px/1.6 ui-monospace, 'SF Mono', Menlo, monospace;
314
- color: var(--deck-fg);
315
- background: var(--deck-surface);
316
- border: 1px solid var(--deck-line);
317
- border-radius: 12px;
318
- }
319
- .swatch {
320
- display: grid;
321
- grid-template-columns: 6fr 3fr 1fr;
322
- height: 76px;
323
- overflow: hidden;
324
- font: 600 13px/1 var(--deck-font);
325
- border: 1px solid var(--deck-line);
326
- border-radius: 12px;
327
- }
328
- .swatch span {
329
- display: flex;
330
- align-items: flex-end;
331
- padding: 12px 14px;
332
- }
333
- .swatch__ground {
334
- background: var(--deck-bg);
335
- color: var(--deck-muted);
336
- }
337
- .swatch__text {
338
- background: var(--deck-fg);
339
- color: var(--deck-bg);
340
- }
341
- .swatch__accent {
342
- background: var(--deck-accent);
343
- }
325
+ .theme {
326
+ display: grid;
327
+ gap: 16px;
328
+ }
329
+ .code {
330
+ margin: 0;
331
+ padding: 20px 22px;
332
+ overflow: hidden;
333
+ font:
334
+ 500 14px/1.6 ui-monospace,
335
+ "SF Mono",
336
+ Menlo,
337
+ monospace;
338
+ color: var(--deck-fg);
339
+ background: var(--deck-surface);
340
+ border: 1px solid var(--deck-line);
341
+ border-radius: 12px;
342
+ }
343
+ .swatch {
344
+ display: grid;
345
+ grid-template-columns: 6fr 3fr 1fr;
346
+ height: 76px;
347
+ overflow: hidden;
348
+ font: 600 13px/1 var(--deck-font);
349
+ border: 1px solid var(--deck-line);
350
+ border-radius: 12px;
351
+ }
352
+ .swatch span {
353
+ display: flex;
354
+ align-items: flex-end;
355
+ padding: 12px 14px;
356
+ }
357
+ .swatch__ground {
358
+ background: var(--deck-bg);
359
+ color: var(--deck-muted);
360
+ }
361
+ .swatch__text {
362
+ background: var(--deck-fg);
363
+ color: var(--deck-bg);
364
+ }
365
+ .swatch__accent {
366
+ background: var(--deck-accent);
367
+ }
344
368
 
345
- .close {
346
- display: grid;
347
- align-content: center;
348
- justify-items: start;
349
- gap: 22px;
350
- }
351
- .close .deck-title {
352
- max-width: 14em;
353
- font-size: 60px;
354
- }
355
- .close .deck-lead {
356
- max-width: 26em;
357
- }
369
+ .close {
370
+ display: grid;
371
+ align-content: center;
372
+ justify-items: start;
373
+ gap: 22px;
374
+ }
375
+ .close .deck-title {
376
+ max-width: 14em;
377
+ font-size: 60px;
378
+ }
379
+ .close .deck-lead {
380
+ max-width: 26em;
381
+ }
358
382
  </style>