@drawnagency/primitives 0.1.111 → 0.1.112

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 (185) hide show
  1. package/dist/{chunk-3GAG6ZXB.js → chunk-3SZNUCXI.js} +8 -4
  2. package/dist/chunk-4I5OO5UB.js +785 -0
  3. package/dist/{chunk-ALMEC3XN.js → chunk-5KNXTMUC.js} +22 -18
  4. package/dist/{chunk-OUYB2GCW.js → chunk-BR4MIPTM.js} +1 -57
  5. package/dist/chunk-CXZ5YJG4.js +85 -0
  6. package/dist/{chunk-RA5IOFPY.js → chunk-DNY72JZN.js} +16 -38
  7. package/dist/{chunk-7MI3HCOF.js → chunk-EPWBPIV6.js} +10 -6
  8. package/dist/chunk-FV7JQRCN.js +94 -0
  9. package/dist/{chunk-UVIYI4J6.js → chunk-HSXMOS5Q.js} +15 -2
  10. package/dist/chunk-IIDKW7AV.js +41 -0
  11. package/dist/chunk-IINIZBQB.js +204 -0
  12. package/dist/chunk-MM7KZS5C.js +30 -0
  13. package/dist/{chunk-VCCNKTFD.js → chunk-OGGZ5AXT.js} +3 -31
  14. package/dist/{chunk-XQMDWXD6.js → chunk-P3ZNCHW7.js} +1 -1
  15. package/dist/chunk-QQ3S3P5P.js +38 -0
  16. package/dist/{chunk-ELQ4C677.js → chunk-TALRVOGO.js} +9 -44
  17. package/dist/chunk-VAYZJKVR.js +209 -0
  18. package/dist/{chunk-OTDA6KWL.js → chunk-VLPELTPI.js} +1 -1
  19. package/dist/{chunk-7WQJ57XG.js → chunk-VT3PYGVW.js} +68 -260
  20. package/dist/chunk-WUJ3XNFI.js +62 -0
  21. package/dist/{chunk-NXGIHSL5.js → chunk-Z2LO4PSQ.js} +11 -91
  22. package/dist/collab/rebase.js +1 -1
  23. package/dist/components/chat/ChatComposer.d.ts +25 -0
  24. package/dist/components/chat/ChatComposer.d.ts.map +1 -0
  25. package/dist/components/chat/ChatPanel.d.ts +5 -4
  26. package/dist/components/chat/ChatPanel.d.ts.map +1 -1
  27. package/dist/components/chat/markdown.d.ts +14 -0
  28. package/dist/components/chat/markdown.d.ts.map +1 -0
  29. package/dist/components/editor/index.js +16 -11
  30. package/dist/components/primitives/EditablePlainText.d.ts.map +1 -1
  31. package/dist/components/primitives/index.js +15 -10
  32. package/dist/components/sections/brand-guide.js +11 -9
  33. package/dist/components/sections/register-schemas.js +19 -14
  34. package/dist/components/sections/register.js +19 -14
  35. package/dist/components/shell/AudienceChips.d.ts +10 -0
  36. package/dist/components/shell/AudienceChips.d.ts.map +1 -0
  37. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  38. package/dist/components/shell/SiteSettingsChatbot.d.ts.map +1 -1
  39. package/dist/components/shell/SiteSettingsDecks.d.ts +13 -0
  40. package/dist/components/shell/SiteSettingsDecks.d.ts.map +1 -0
  41. package/dist/components/shell/SiteSettingsModal.d.ts.map +1 -1
  42. package/dist/deck/DeckComponentView.d.ts +13 -0
  43. package/dist/deck/DeckComponentView.d.ts.map +1 -0
  44. package/dist/deck/DeckPlayer.d.ts +26 -0
  45. package/dist/deck/DeckPlayer.d.ts.map +1 -0
  46. package/dist/deck/DeckSlideView.d.ts +17 -0
  47. package/dist/deck/DeckSlideView.d.ts.map +1 -0
  48. package/dist/deck/DeckStage.d.ts +16 -0
  49. package/dist/deck/DeckStage.d.ts.map +1 -0
  50. package/dist/deck/components/DeckImage.d.ts +14 -0
  51. package/dist/deck/components/DeckImage.d.ts.map +1 -0
  52. package/dist/deck/components/DeckImageGrid.d.ts +27 -0
  53. package/dist/deck/components/DeckImageGrid.d.ts.map +1 -0
  54. package/dist/deck/components/DeckRichText.d.ts +22 -0
  55. package/dist/deck/components/DeckRichText.d.ts.map +1 -0
  56. package/dist/deck/components/DeckVideo.d.ts +15 -0
  57. package/dist/deck/components/DeckVideo.d.ts.map +1 -0
  58. package/dist/deck/editing.d.ts +50 -0
  59. package/dist/deck/editing.d.ts.map +1 -0
  60. package/dist/deck/flip.d.ts +11 -0
  61. package/dist/deck/flip.d.ts.map +1 -0
  62. package/dist/deck/index.d.ts +24 -0
  63. package/dist/deck/index.d.ts.map +1 -0
  64. package/dist/deck/index.js +53 -0
  65. package/dist/deck/layouts/CenteredTextLayout.d.ts +12 -0
  66. package/dist/deck/layouts/CenteredTextLayout.d.ts.map +1 -0
  67. package/dist/deck/layouts/ColumnSplitLayout.d.ts +14 -0
  68. package/dist/deck/layouts/ColumnSplitLayout.d.ts.map +1 -0
  69. package/dist/deck/layouts/FullBleedImageLayout.d.ts +14 -0
  70. package/dist/deck/layouts/FullBleedImageLayout.d.ts.map +1 -0
  71. package/dist/deck/media.d.ts +33 -0
  72. package/dist/deck/media.d.ts.map +1 -0
  73. package/dist/deck/tokens.d.ts +22 -0
  74. package/dist/deck/tokens.d.ts.map +1 -0
  75. package/dist/deck/useStageScale.d.ts +10 -0
  76. package/dist/deck/useStageScale.d.ts.map +1 -0
  77. package/dist/deck-builder/DeckBuilderApp.d.ts +30 -0
  78. package/dist/deck-builder/DeckBuilderApp.d.ts.map +1 -0
  79. package/dist/deck-builder/DeckBuilderTopBar.d.ts +24 -0
  80. package/dist/deck-builder/DeckBuilderTopBar.d.ts.map +1 -0
  81. package/dist/deck-builder/DeckChatPanel.d.ts +45 -0
  82. package/dist/deck-builder/DeckChatPanel.d.ts.map +1 -0
  83. package/dist/deck-builder/DeckEditor.d.ts +37 -0
  84. package/dist/deck-builder/DeckEditor.d.ts.map +1 -0
  85. package/dist/deck-builder/DeckLibrary.d.ts +22 -0
  86. package/dist/deck-builder/DeckLibrary.d.ts.map +1 -0
  87. package/dist/deck-builder/DeckSlideSurface.d.ts +31 -0
  88. package/dist/deck-builder/DeckSlideSurface.d.ts.map +1 -0
  89. package/dist/deck-builder/deck-api.d.ts +76 -0
  90. package/dist/deck-builder/deck-api.d.ts.map +1 -0
  91. package/dist/deck-builder/deck-chat-client.d.ts +44 -0
  92. package/dist/deck-builder/deck-chat-client.d.ts.map +1 -0
  93. package/dist/deck-builder/deck-chat-history.d.ts +10 -0
  94. package/dist/deck-builder/deck-chat-history.d.ts.map +1 -0
  95. package/dist/deck-builder/index.d.ts +13 -0
  96. package/dist/deck-builder/index.d.ts.map +1 -0
  97. package/dist/deck-builder/index.js +1505 -0
  98. package/dist/deck-builder/starter-deck.d.ts +23 -0
  99. package/dist/deck-builder/starter-deck.d.ts.map +1 -0
  100. package/dist/deck-builder/types.d.ts +29 -0
  101. package/dist/deck-builder/types.d.ts.map +1 -0
  102. package/dist/deck-builder/useSortableSlide.d.ts +29 -0
  103. package/dist/deck-builder/useSortableSlide.d.ts.map +1 -0
  104. package/dist/index.js +70 -63
  105. package/dist/lib/deck-access.d.ts +86 -0
  106. package/dist/lib/deck-access.d.ts.map +1 -0
  107. package/dist/lib/deck-access.js +58 -0
  108. package/dist/lib/deck-dexie.d.ts +88 -0
  109. package/dist/lib/deck-dexie.d.ts.map +1 -0
  110. package/dist/lib/deck-dexie.js +22 -0
  111. package/dist/lib/deck-edit.d.ts +67 -0
  112. package/dist/lib/deck-edit.d.ts.map +1 -0
  113. package/dist/lib/deck-media-assets.d.ts +27 -0
  114. package/dist/lib/deck-media-assets.d.ts.map +1 -0
  115. package/dist/lib/deck-media-assets.js +25 -0
  116. package/dist/lib/deck-media-refs.d.ts +35 -0
  117. package/dist/lib/deck-media-refs.d.ts.map +1 -0
  118. package/dist/lib/deck-media-refs.js +36 -0
  119. package/dist/lib/deck-tool.d.ts +25 -0
  120. package/dist/lib/deck-tool.d.ts.map +1 -0
  121. package/dist/lib/deck-tool.js +58 -0
  122. package/dist/lib/index-ops.js +2 -2
  123. package/dist/lib/index.js +17 -12
  124. package/dist/lib/nav.d.ts.map +1 -1
  125. package/dist/media/index.js +3 -3
  126. package/dist/schemas/deck-meta.d.ts +85 -0
  127. package/dist/schemas/deck-meta.d.ts.map +1 -0
  128. package/dist/schemas/deck-meta.js +64 -0
  129. package/dist/schemas/deck.d.ts +954 -0
  130. package/dist/schemas/deck.d.ts.map +1 -0
  131. package/dist/schemas/deck.js +65 -0
  132. package/dist/schemas/index.js +39 -37
  133. package/dist/schemas/site-config.d.ts +13 -1
  134. package/dist/schemas/site-config.d.ts.map +1 -1
  135. package/package.json +37 -1
  136. package/src/components/chat/ChatComposer.tsx +100 -0
  137. package/src/components/chat/ChatPanel.tsx +20 -69
  138. package/src/components/chat/markdown.ts +32 -0
  139. package/src/components/primitives/EditablePlainText.tsx +11 -1
  140. package/src/components/shell/AudienceChips.tsx +30 -0
  141. package/src/components/shell/EditorShell.tsx +12 -0
  142. package/src/components/shell/SiteSettingsChatbot.tsx +1 -18
  143. package/src/components/shell/SiteSettingsDecks.tsx +41 -0
  144. package/src/components/shell/SiteSettingsModal.tsx +11 -0
  145. package/src/deck/DeckComponentView.tsx +28 -0
  146. package/src/deck/DeckPlayer.tsx +166 -0
  147. package/src/deck/DeckSlideView.tsx +38 -0
  148. package/src/deck/DeckStage.tsx +39 -0
  149. package/src/deck/components/DeckImage.tsx +38 -0
  150. package/src/deck/components/DeckImageGrid.tsx +254 -0
  151. package/src/deck/components/DeckRichText.tsx +111 -0
  152. package/src/deck/components/DeckVideo.tsx +81 -0
  153. package/src/deck/editing.tsx +201 -0
  154. package/src/deck/flip.ts +70 -0
  155. package/src/deck/index.ts +30 -0
  156. package/src/deck/layouts/CenteredTextLayout.tsx +29 -0
  157. package/src/deck/layouts/ColumnSplitLayout.tsx +69 -0
  158. package/src/deck/layouts/FullBleedImageLayout.tsx +58 -0
  159. package/src/deck/media.tsx +46 -0
  160. package/src/deck/tokens.ts +57 -0
  161. package/src/deck/useStageScale.ts +44 -0
  162. package/src/deck-builder/DeckBuilderApp.tsx +572 -0
  163. package/src/deck-builder/DeckBuilderTopBar.tsx +62 -0
  164. package/src/deck-builder/DeckChatPanel.tsx +334 -0
  165. package/src/deck-builder/DeckEditor.tsx +258 -0
  166. package/src/deck-builder/DeckLibrary.tsx +195 -0
  167. package/src/deck-builder/DeckSlideSurface.tsx +55 -0
  168. package/src/deck-builder/deck-api.ts +177 -0
  169. package/src/deck-builder/deck-chat-client.ts +129 -0
  170. package/src/deck-builder/deck-chat-history.ts +62 -0
  171. package/src/deck-builder/index.ts +12 -0
  172. package/src/deck-builder/starter-deck.ts +86 -0
  173. package/src/deck-builder/types.ts +24 -0
  174. package/src/deck-builder/useSortableSlide.ts +102 -0
  175. package/src/lib/deck-access.ts +132 -0
  176. package/src/lib/deck-dexie.ts +190 -0
  177. package/src/lib/deck-edit.ts +196 -0
  178. package/src/lib/deck-media-assets.ts +57 -0
  179. package/src/lib/deck-media-refs.ts +67 -0
  180. package/src/lib/deck-tool.ts +95 -0
  181. package/src/lib/nav.ts +21 -1
  182. package/src/schemas/deck-meta.ts +88 -0
  183. package/src/schemas/deck.ts +478 -0
  184. package/src/schemas/index.ts +4 -0
  185. package/src/schemas/site-config.ts +24 -1
@@ -0,0 +1,46 @@
1
+ import { createContext, useContext, type ReactNode } from "react";
2
+ import { cn } from "../lib/cn";
3
+ import type { DeckMediaAsset, DeckMediaRef, DeckMediaResolver } from "../schemas/deck";
4
+
5
+ /**
6
+ * The runtime's media seam.
7
+ *
8
+ * Deck JSON stores references, never URLs (ADR 0001), so something outside the
9
+ * runtime has to turn `{ kind: "portal", id }` into bytes. That something is a
10
+ * resolver injected through context: the Deck Builder passes the manifest-backed
11
+ * one, the dev preview route passes placeholders, and the components below never
12
+ * learn which. Absent a provider every reference resolves to `null`, which is
13
+ * also what a deleted asset resolves to — one path, one rendering.
14
+ */
15
+
16
+ export type { DeckMediaAsset, DeckMediaResolver } from "../schemas/deck";
17
+
18
+ const NO_MEDIA: DeckMediaResolver = () => null;
19
+
20
+ const DeckMediaContext = createContext<DeckMediaResolver>(NO_MEDIA);
21
+
22
+ export function DeckMediaProvider({ resolve, children }: { resolve: DeckMediaResolver; children: ReactNode }) {
23
+ return <DeckMediaContext.Provider value={resolve}>{children}</DeckMediaContext.Provider>;
24
+ }
25
+
26
+ export function useDeckMedia(ref: DeckMediaRef): DeckMediaAsset | null {
27
+ return useContext(DeckMediaContext)(ref);
28
+ }
29
+
30
+ /**
31
+ * The resolver itself, for a component that has to resolve a whole set before
32
+ * it can lay any of it out — the image grid packs its masonry columns from
33
+ * every tile's aspect ratio, which it cannot learn one `useDeckMedia` at a time.
34
+ */
35
+ export function useDeckMediaResolver(): DeckMediaResolver {
36
+ return useContext(DeckMediaContext);
37
+ }
38
+
39
+ /**
40
+ * What an unresolvable reference renders. A published deck can outlive the
41
+ * media it points at (ADR 0002 flags the GC hazard), and a torn alt string over
42
+ * a presentation is worse than a quiet gap.
43
+ */
44
+ export function DeckMissingMedia({ className }: { className?: string }) {
45
+ return <span data-deck-media="missing" aria-hidden="true" className={cn("block size-full bg-base-200", className)} />;
46
+ }
@@ -0,0 +1,57 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { DeckSurface } from "../schemas/deck";
3
+
4
+ export type { DeckSurface } from "../schemas/deck";
5
+
6
+ /**
7
+ * Deck ink is indirected through three custom properties so a Deck Component
8
+ * never has to know what it is sitting on: a Layout declares the palette for
9
+ * its surface, components read `--deck-ink` / `--deck-ink-muted` /
10
+ * `--deck-accent`. Every value resolves to a portal brand token — nothing in
11
+ * the deck runtime carries a literal color.
12
+ */
13
+ const SURFACE_INK: Record<DeckSurface, CSSProperties> = {
14
+ base: {
15
+ "--deck-ink": "var(--color-base-contrast)",
16
+ "--deck-ink-muted": "var(--color-base-contrast-light)",
17
+ "--deck-accent": "var(--color-primary)",
18
+ } as CSSProperties,
19
+ brand: {
20
+ "--deck-ink": "var(--color-on-primary)",
21
+ "--deck-ink-muted": "color-mix(in srgb, var(--color-on-primary) 72%, transparent)",
22
+ "--deck-accent": "var(--color-primary-contrast)",
23
+ } as CSSProperties,
24
+ };
25
+
26
+ export function surfaceInk(surface: DeckSurface): CSSProperties {
27
+ return SURFACE_INK[surface];
28
+ }
29
+
30
+ /** Tailwind background utility for a surface — both are brand tokens. */
31
+ export const SURFACE_BACKGROUND: Record<DeckSurface, string> = {
32
+ base: "bg-base-accent",
33
+ brand: "bg-primary",
34
+ };
35
+
36
+ /**
37
+ * Alignment travels the same way the ink does: a Layout declares how its slot
38
+ * reads, components resolve `--deck-align` (an `align-self` value). Without it
39
+ * a component would have to know whether it sits on a centered title card or in
40
+ * a left-aligned column, which is precisely what the indirection prevents.
41
+ */
42
+ export type DeckAlign = "center" | "start";
43
+
44
+ export function deckAlign(align: DeckAlign): CSSProperties {
45
+ return { "--deck-align": align } as CSSProperties;
46
+ }
47
+
48
+ /**
49
+ * Elevation for media that lifts off the slide — grid tiles on hover, the video
50
+ * play affordance. Declared as `--deck-*` custom properties rather than as
51
+ * arbitrary Tailwind values so the shadow can be mixed from the site's ink
52
+ * token instead of a literal rgba, and so a hover variant can reference it.
53
+ */
54
+ export const DECK_ELEVATION: CSSProperties = {
55
+ "--deck-lift": "0 26px 46px -18px color-mix(in srgb, var(--color-base-contrast) 45%, transparent)",
56
+ "--deck-lift-strong": "0 30px 60px -22px color-mix(in srgb, var(--color-base-contrast) 58%, transparent)",
57
+ } as CSSProperties;
@@ -0,0 +1,44 @@
1
+ import { useEffect, useLayoutEffect, useState, type RefObject } from "react";
2
+ import { DECK_STAGE_HEIGHT, DECK_STAGE_WIDTH } from "../schemas/deck";
3
+
4
+ /**
5
+ * The first measurement has to happen before paint or the stage shows one frame
6
+ * unscaled — a full-bleed 1600x900 flash on a laptop viewport. useLayoutEffect
7
+ * warns when React renders on the server (Astro SSRs this island), and there is
8
+ * nothing to measure there anyway, so fall back to useEffect off the browser.
9
+ */
10
+ const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
11
+
12
+ /**
13
+ * The factor that fits the fixed 1600x900 stage inside `fitRef`'s box.
14
+ *
15
+ * `null` until the box has been measured — an unmeasured box (SSR, jsdom, a
16
+ * hidden ancestor) reports 0x0, and scaling the stage to 0 would blank it. The
17
+ * caller renders the stage unscaled until a real measurement arrives.
18
+ */
19
+ export function useStageScale(fitRef: RefObject<HTMLElement | null>): number | null {
20
+ const [scale, setScale] = useState<number | null>(null);
21
+
22
+ useIsomorphicLayoutEffect(() => {
23
+ const el = fitRef.current;
24
+ if (!el) return;
25
+
26
+ const measure = () => {
27
+ const { clientWidth, clientHeight } = el;
28
+ if (!clientWidth || !clientHeight) return;
29
+ setScale(Math.min(clientWidth / DECK_STAGE_WIDTH, clientHeight / DECK_STAGE_HEIGHT));
30
+ };
31
+
32
+ measure();
33
+
34
+ if (typeof ResizeObserver === "undefined") {
35
+ window.addEventListener("resize", measure);
36
+ return () => window.removeEventListener("resize", measure);
37
+ }
38
+ const observer = new ResizeObserver(measure);
39
+ observer.observe(el);
40
+ return () => observer.disconnect();
41
+ }, [fitRef]);
42
+
43
+ return scale;
44
+ }