@dfosco/storyboard-react 4.2.0-beta.0 → 4.2.0-beta.17

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 (48) hide show
  1. package/package.json +5 -4
  2. package/src/AuthModal/AuthModal.jsx +6 -2
  3. package/src/BranchBar/BranchBar.jsx +17 -5
  4. package/src/BranchBar/BranchBar.module.css +11 -2
  5. package/src/CommandPalette/CommandPalette.jsx +267 -164
  6. package/src/CommandPalette/command-palette.css +130 -78
  7. package/src/Icon.jsx +112 -48
  8. package/src/Viewfinder.jsx +511 -61
  9. package/src/Viewfinder.module.css +414 -2
  10. package/src/canvas/CanvasPage.bridge.test.jsx +14 -6
  11. package/src/canvas/CanvasPage.dragdrop.test.jsx +10 -6
  12. package/src/canvas/CanvasPage.jsx +157 -174
  13. package/src/canvas/CanvasPage.module.css +0 -15
  14. package/src/canvas/CanvasPage.multiselect.test.jsx +10 -6
  15. package/src/canvas/ConnectorLayer.jsx +5 -5
  16. package/src/canvas/PageSelector.test.jsx +15 -6
  17. package/src/canvas/useCanvas.js +1 -1
  18. package/src/canvas/widgets/ActionWidget.jsx +200 -0
  19. package/src/canvas/widgets/ActionWidget.module.css +122 -0
  20. package/src/canvas/widgets/FigmaEmbed.jsx +97 -29
  21. package/src/canvas/widgets/FigmaEmbed.module.css +61 -0
  22. package/src/canvas/widgets/ImageWidget.jsx +1 -1
  23. package/src/canvas/widgets/LinkPreview.jsx +64 -5
  24. package/src/canvas/widgets/LinkPreview.module.css +127 -0
  25. package/src/canvas/widgets/MarkdownBlock.jsx +39 -17
  26. package/src/canvas/widgets/MarkdownBlock.module.css +123 -0
  27. package/src/canvas/widgets/PrototypeEmbed.jsx +183 -20
  28. package/src/canvas/widgets/PrototypeEmbed.module.css +117 -0
  29. package/src/canvas/widgets/PrototypeEmbed.test.jsx +2 -2
  30. package/src/canvas/widgets/SplitExpandModal.jsx +234 -0
  31. package/src/canvas/widgets/SplitExpandModal.module.css +335 -0
  32. package/src/canvas/widgets/SplitScreenTopBar.jsx +30 -0
  33. package/src/canvas/widgets/SplitScreenTopBar.module.css +58 -0
  34. package/src/canvas/widgets/StoryWidget.jsx +7 -4
  35. package/src/canvas/widgets/TerminalReadWidget.jsx +140 -0
  36. package/src/canvas/widgets/TerminalReadWidget.module.css +92 -0
  37. package/src/canvas/widgets/TerminalWidget.jsx +299 -49
  38. package/src/canvas/widgets/TerminalWidget.module.css +155 -1
  39. package/src/canvas/widgets/WidgetChrome.jsx +19 -14
  40. package/src/canvas/widgets/WidgetChrome.module.css +10 -0
  41. package/src/canvas/widgets/embedInteraction.test.jsx +24 -26
  42. package/src/canvas/widgets/expandUtils.js +188 -0
  43. package/src/canvas/widgets/index.js +5 -0
  44. package/src/canvas/widgets/snapshotDisplay.test.jsx +23 -71
  45. package/src/canvas/widgets/widgetConfig.js +19 -1
  46. package/src/hooks/useConfig.js +14 -0
  47. package/src/index.js +4 -0
  48. package/src/vite/data-plugin.js +264 -14
package/package.json CHANGED
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "name": "@dfosco/storyboard-react",
3
- "version": "4.2.0-beta.0",
3
+ "version": "4.2.0-beta.17",
4
4
  "type": "module",
5
5
  "dependencies": {
6
6
  "@base-ui/react": "^1.4.0",
7
- "@dfosco/storyboard-core": "4.2.0-beta.0",
8
- "@dfosco/tiny-canvas": "4.2.0-beta.0",
7
+ "@dfosco/storyboard-core": "4.2.0-beta.17",
8
+ "@dfosco/tiny-canvas": "4.2.0-beta.17",
9
9
  "@neodrag/react": "^2.3.1",
10
+ "ansi-to-html": "^0.7.2",
11
+ "ghostty-web": "^0.4.0",
10
12
  "glob": "^11.0.0",
11
13
  "jsonc-parser": "^3.3.1",
12
14
  "remark": "^15.0.1",
13
15
  "remark-gfm": "^4.0.1",
14
- "react-cmdk": "^1.3.9",
15
16
  "remark-html": "^16.0.1"
16
17
  },
17
18
  "license": "MIT",
@@ -43,8 +43,12 @@ export default function AuthModal() {
43
43
  try { localStorage.setItem(COMMENTS_TOKEN_KEY, trimmed) } catch { /* ignore */ }
44
44
 
45
45
  try {
46
- import('@dfosco/storyboard-core/comments').then(({ setToken }) => {
46
+ import('@dfosco/storyboard-core/comments').then(({ setToken, validateToken }) => {
47
47
  setToken(trimmed)
48
+ // Validate to cache user info (login + avatar), then notify Viewfinder
49
+ validateToken(trimmed)
50
+ .then(() => document.dispatchEvent(new CustomEvent('storyboard:auth-changed')))
51
+ .catch(() => document.dispatchEvent(new CustomEvent('storyboard:auth-changed')))
48
52
  }).catch(() => {})
49
53
  } catch { /* comments module may not be initialized */ }
50
54
 
@@ -64,7 +68,7 @@ export default function AuthModal() {
64
68
  <Dialog.Backdrop className={css.backdrop} />
65
69
  <div className={css.popupWrap}>
66
70
  <Dialog.Popup className={css.popup}>
67
- <Dialog.Title className={css.title}>Sign in for comments</Dialog.Title>
71
+ <Dialog.Title className={css.title}>Sign in with GitHub</Dialog.Title>
68
72
  <Dialog.Description className={css.desc}>
69
73
  Leave comments for other users to see and respond, and react to! Storyboard
70
74
  comments use Discussions as a back-end and require a GitHub PAT to be enabled.
@@ -1,13 +1,20 @@
1
1
  /**
2
- * BranchBar — dark top bar showing current branch on non-main routes.
2
+ * BranchBar — blue accent bar showing current branch and local dev status.
3
3
  *
4
- * Dev: shows branch name as a static label (use CLI to switch branches).
5
- * Prod: same label (dropdown switching deferred to ViewfinderNew).
4
+ * Dev: always visible (main or branch). Shows "Local development" label.
5
+ * Prod: shows on non-main branches only.
6
6
  */
7
7
  import { useState, useEffect, useMemo } from 'react'
8
8
  import { GitBranchIcon } from '@primer/octicons-react'
9
9
  import css from './BranchBar.module.css'
10
10
 
11
+ /** Check if we're in local dev mode (respects ?prodMode simulation). */
12
+ function checkLocalDev() {
13
+ if (typeof window === 'undefined') return false
14
+ if (new URLSearchParams(window.location.search).has('prodMode')) return false
15
+ return window.__SB_LOCAL_DEV__ === true
16
+ }
17
+
11
18
  export default function BranchBar({ basePath }) {
12
19
  const [hidden, setHidden] = useState(false)
13
20
 
@@ -22,6 +29,7 @@ export default function BranchBar({ basePath }) {
22
29
  return m ? m[1] : 'main'
23
30
  }, [basePath])
24
31
 
32
+ const isLocalDev = checkLocalDev()
25
33
  const isOnBranch = currentBranch !== 'main'
26
34
 
27
35
  useEffect(() => {
@@ -32,7 +40,7 @@ export default function BranchBar({ basePath }) {
32
40
  return () => observer.disconnect()
33
41
  }, [])
34
42
 
35
- if (!isOnBranch || hidden || isHiddenByParam) return null
43
+ if ((!isOnBranch && !isLocalDev) || hidden || isHiddenByParam) return null
36
44
 
37
45
  function hideChrome() {
38
46
  window.dispatchEvent(new KeyboardEvent('keydown', {
@@ -42,10 +50,14 @@ export default function BranchBar({ basePath }) {
42
50
 
43
51
  return (
44
52
  <div className={css.bar} data-branch-bar>
45
- <div className={css.barInner}>
53
+ <div className={`${css.barInner}${isLocalDev ? '' : ` ${css.barProd}`}`}>
46
54
  <span className={css.barLabel}>
47
55
  <GitBranchIcon size={12} />
48
56
  <span className={css.barBranchName}>{currentBranch}</span>
57
+ {isLocalDev && <>
58
+ <span className={css.barSeparator}>·</span>
59
+ <span>Local development</span>
60
+ </>}
49
61
  </span>
50
62
  <div className={css.barActions}>
51
63
  <button className={css.barAction} onClick={hideChrome}>Hide</button>
@@ -16,12 +16,16 @@
16
16
  justify-content: center;
17
17
  gap: 8px;
18
18
  height: 32px;
19
- background: var(--bgColor-emphasis, #1a1a1a);
20
- color: var(--fgColor-onEmphasis, #ccc);
19
+ background: hsl(212, 92%, 45%);
20
+ color: #fff;
21
21
  padding: 4px 12px;
22
22
  position: relative;
23
23
  }
24
24
 
25
+ .barProd {
26
+ background: #1c2128;
27
+ }
28
+
25
29
  .barTrigger {
26
30
  display: flex;
27
31
  align-items: center;
@@ -68,6 +72,11 @@
68
72
  white-space: nowrap;
69
73
  }
70
74
 
75
+ .barSeparator {
76
+ opacity: 0.6;
77
+ margin: 0 2px;
78
+ }
79
+
71
80
  .barAction {
72
81
  background: none;
73
82
  border: none;